static int nntpdriver_append_message(mailsession * session, const char * message, size_t size) { int r; do { r = newsnntp_post(get_nntp_session(session), message, size); switch (r) { case NEWSNNTP_ERROR_REQUEST_AUTHORIZATION_USERNAME: r = nntpdriver_authenticate_user(session); if (r != MAIL_NO_ERROR) return r; break; case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_PASSWORD: r = nntpdriver_authenticate_password(session); if (r != MAIL_NO_ERROR) return r; break; default: return nntpdriver_nntp_error_to_mail_error(r); } } while (1); }
int nntpdriver_size(mailsession * session, uint32_t indx, size_t * result) { newsnntp * nntp; struct newsnntp_xover_resp_item * item; int r; int done; nntp = session_get_nntp_session(session); done = FALSE; do { r = newsnntp_xover_single(nntp, indx, &item); switch (r) { case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_USERNAME: r = nntpdriver_authenticate_user(session); if (r != MAIL_NO_ERROR) return r; break; case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_PASSWORD: r = nntpdriver_authenticate_password(session); if (r != MAIL_NO_ERROR) return r; break; case NEWSNNTP_NO_ERROR: done = TRUE; break; default: return nntpdriver_nntp_error_to_mail_error(r); } } while (!done); * result = item->ovr_size; xover_resp_item_free(item); return MAIL_NO_ERROR; }
int nntpdriver_head(mailsession * session, uint32_t indx, char ** result, size_t * result_len) { char * headers; size_t headers_length; int r; int done; done = FALSE; do { r = newsnntp_head(session_get_nntp_session(session), indx, &headers, &headers_length); switch (r) { case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_USERNAME: r = nntpdriver_authenticate_user(session); if (r != MAIL_NO_ERROR) return r; break; case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_PASSWORD: r = nntpdriver_authenticate_password(session); if (r != MAIL_NO_ERROR) return r; break; case NEWSNNTP_NO_ERROR: done = TRUE; break; default: return nntpdriver_nntp_error_to_mail_error(r); } } while (!done); * result = headers; * result_len = headers_length; return MAIL_NO_ERROR; }
int nntpdriver_authenticate_user(mailsession * session) { struct nntp_session_state_data * data; int r; data = session_get_data(session); if (data->nntp_userid == NULL) return MAIL_ERROR_LOGIN; r = newsnntp_authinfo_username(session_get_nntp_session(session), data->nntp_userid); switch (r) { case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_PASSWORD: return nntpdriver_authenticate_password(session); default: return nntpdriver_nntp_error_to_mail_error(r); } }
int nntpdriver_mode_reader(mailsession * session) { int done; int r; done = FALSE; do { r = newsnntp_mode_reader(session_get_nntp_session(session)); switch (r) { case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_USERNAME: r = nntpdriver_authenticate_user(session); if (r != MAIL_NO_ERROR) return r; break; case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_PASSWORD: r = nntpdriver_authenticate_password(session); if (r != MAIL_NO_ERROR) return r; break; case NEWSNNTP_NO_ERROR: done = TRUE; break; default: done = TRUE; break; } } while (!done); return MAIL_NO_ERROR; }
int nntpdriver_select_folder(mailsession * session, const char * mb) { int r; struct newsnntp_group_info * info; newsnntp * nntp_session; struct nntp_session_state_data * data; char * new_name; int done; data = session_get_data(session); if (!data->nntp_mode_reader) { r = nntpdriver_mode_reader(session); if (r != MAIL_NO_ERROR) return r; data->nntp_mode_reader = TRUE; } if (data->nntp_group_name != NULL) if (strcmp(data->nntp_group_name, mb) == 0) return MAIL_NO_ERROR; nntp_session = session_get_nntp_session(session); done = FALSE; do { r = newsnntp_group(nntp_session, mb, &info); switch (r) { case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_USERNAME: r = nntpdriver_authenticate_user(session); if (r != MAIL_NO_ERROR) return r; break; case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_PASSWORD: r = nntpdriver_authenticate_password(session); if (r != MAIL_NO_ERROR) return r; break; case NEWSNNTP_NO_ERROR: done = TRUE; break; default: return nntpdriver_nntp_error_to_mail_error(r); } } while (!done); new_name = strdup(mb); if (new_name == NULL) return MAIL_ERROR_MEMORY; if (data->nntp_group_name != NULL) free(data->nntp_group_name); data->nntp_group_name = new_name; if (data->nntp_group_info != NULL) newsnntp_group_free(data->nntp_group_info); data->nntp_group_info = info; return MAIL_NO_ERROR; }
static int nntpdriver_get_envelopes_list(mailsession * session, struct mailmessage_list * env_list) { newsnntp * nntp; int r; struct nntp_session_state_data * data; clist * list; int done; clistiter * cur; uint32_t first_seq; unsigned int i; nntp = get_nntp_session(session); data = get_data(session); if (data->nntp_group_info == NULL) return MAIL_ERROR_BAD_STATE; first_seq = data->nntp_group_info->grp_first; if (carray_count(env_list->msg_tab) > 0) { mailmessage * msg; msg = carray_get(env_list->msg_tab, 0); first_seq = msg->msg_index; } if (carray_count(env_list->msg_tab) > 0) { i = carray_count(env_list->msg_tab) - 1; while (1) { mailmessage * msg; msg = carray_get(env_list->msg_tab, i); if (msg->msg_fields != NULL) { first_seq = msg->msg_index + 1; break; } if (i == 0) break; i --; } } if (first_seq > data->nntp_group_info->grp_last) { list = NULL; } else { done = FALSE; do { r = newsnntp_xover_range(nntp, first_seq, data->nntp_group_info->grp_last, &list); switch (r) { case NEWSNNTP_ERROR_REQUEST_AUTHORIZATION_USERNAME: r = nntpdriver_authenticate_user(session); if (r != MAIL_NO_ERROR) return r; break; case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_PASSWORD: r = nntpdriver_authenticate_password(session); if (r != MAIL_NO_ERROR) return r; break; case NEWSNNTP_NO_ERROR: done = TRUE; break; default: return nntpdriver_nntp_error_to_mail_error(r); } } while (!done); } #if 0 i = 0; j = 0; if (list != NULL) { for(cur = clist_begin(list) ; cur != NULL ; cur = clist_next(cur)) { struct newsnntp_xover_resp_item * item; struct mailimf_fields * fields; item = clist_content(cur); while (i < carray_count(env_list->msg_tab)) { mailmessage * info; info = carray_get(env_list->msg_tab, i); if (item->ovr_article == info->msg_index) { if (info->fields == NULL) { r = xover_resp_to_fields(item, &fields); if (r == MAIL_NO_ERROR) { info->fields = fields; } info->size = item->ovr_size; carray_set(env_list->msg_tab, j, info); j ++; i ++; break; } else { carray_set(env_list->msg_tab, j, info); j ++; } } else { if (info->fields != NULL) { carray_set(env_list->msg_tab, j, info); j ++; } else { if (info->flags != NULL) { info->flags->flags &= ~MAIL_FLAG_NEW; info->flags->flags |= MAIL_FLAG_SEEN | MAIL_FLAG_DELETED; mailmessage_check(info); } mailmessage_free(info); carray_set(env_list->msg_tab, i, NULL); } } i ++; } } } while (i < carray_count(env_list->msg_tab)) { mailmessage * info; info = carray_get(env_list->msg_tab, i); if (info->fields != NULL) { carray_set(env_list->msg_tab, j, info); j ++; } else { if (info->flags != NULL) { info->flags->flags &= ~MAIL_FLAG_NEW; info->flags->flags |= MAIL_FLAG_SEEN | MAIL_FLAG_DELETED; mailmessage_check(info); } mailmessage_free(info); carray_set(env_list->msg_tab, i, NULL); } i ++; } r = carray_set_size(env_list->msg_tab, j); if (r < 0) { if (list != NULL) newsnntp_xover_resp_list_free(list); return MAIL_ERROR_MEMORY; } #endif i = 0; if (list != NULL) { for(cur = clist_begin(list) ; cur != NULL ; cur = clist_next(cur)) { struct newsnntp_xover_resp_item * item; struct mailimf_fields * fields; item = clist_content(cur); while (i < carray_count(env_list->msg_tab)) { mailmessage * info; info = carray_get(env_list->msg_tab, i); if (item->ovr_article == info->msg_index) { if (info->msg_fields == NULL) { fields = NULL; r = xover_resp_to_fields(item, &fields); if (r == MAIL_NO_ERROR) { info->msg_fields = fields; } info->msg_size = item->ovr_size; i ++; break; } } #if 0 else if ((info->fields == NULL) && (info->flags != NULL)) { info->flags->flags &= ~MAIL_FLAG_NEW; info->flags->flags |= MAIL_FLAG_CANCELLED; mailmessage_check(info); } #endif i ++; } } } #if 0 while (i < env_list->msg_tab->len) { mailmessage * info; info = carray_get(env_list->msg_tab, i); if ((info->fields == NULL) && (info->flags != NULL)) { info->flags->flags &= ~MAIL_FLAG_NEW; info->flags->flags |= MAIL_FLAG_CANCELLED; mailmessage_check(info); } i ++; } #endif if (list != NULL) newsnntp_xover_resp_list_free(list); return MAIL_NO_ERROR; }
static int nntpdriver_list_folders(mailsession * session, const char * mb, struct mail_list ** result) { int r; clist * group_list; newsnntp * nntp; clistiter * cur; char * new_mb; int done; clist * list; struct mail_list * ml; int res; nntp = get_nntp_session(session); new_mb = NULL; if ((mb != NULL) && (*mb != '\0')) { new_mb = malloc(strlen(mb) + 3); if (new_mb == NULL) { res = MAIL_ERROR_MEMORY; goto err; } strcpy(new_mb, mb); strcat(new_mb, ".*"); } done = FALSE; do { if (new_mb != NULL) r = newsnntp_list_active(nntp, new_mb, &group_list); else r = newsnntp_list(nntp, &group_list); switch (r) { case NEWSNNTP_ERROR_REQUEST_AUTHORIZATION_USERNAME: r = nntpdriver_authenticate_user(session); if (r != MAIL_NO_ERROR) { if (new_mb != NULL) free(new_mb); res = r; goto err; } break; case NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_PASSWORD: r = nntpdriver_authenticate_password(session); if (r != MAIL_NO_ERROR) { if (new_mb != NULL) free(new_mb); res = r; goto err; } break; case NEWSNNTP_NO_ERROR: if (new_mb != NULL) free(new_mb); done = TRUE; break; default: if (new_mb != NULL) free(new_mb); return nntpdriver_nntp_error_to_mail_error(r); } } while (!done); list = clist_new(); if (list == NULL) { res = MAIL_ERROR_MEMORY; goto err; } for(cur = clist_begin(group_list) ; cur != NULL ; cur = clist_next(cur)) { struct newsnntp_group_info * info; char * new_name; info = clist_content(cur); new_name = strdup(info->grp_name); if (new_name == NULL) { res = MAIL_ERROR_MEMORY; goto free_list; } r = clist_append(list, new_name); if (r < 0) { free(new_name); res = MAIL_ERROR_MEMORY; goto free_list; } } ml = mail_list_new(list); if (ml == NULL) { res = MAIL_ERROR_MEMORY; goto free_list; } newsnntp_list_free(group_list); * result = ml; return MAIL_NO_ERROR; free_list: clist_foreach(list, (clist_func) free, NULL); clist_free(list); newsnntp_list_free(group_list); err: return res; }