int nntp_threaded_connect(Folder * folder, const char * server, int port) { struct connect_param param; struct connect_result result; chashdatum key; chashdatum value; newsnntp * nntp, * oldnntp; oldnntp = get_nntp(folder); nntp = newsnntp_new(0, NULL); if (oldnntp) { debug_print("deleting old nntp %p\n", oldnntp); delete_nntp(folder, oldnntp); } key.data = &folder; key.len = sizeof(folder); value.data = nntp; value.len = 0; chash_set(session_hash, &key, &value, NULL); param.nntp = nntp; param.server = server; param.port = port; refresh_resolvers(); threaded_run(folder, ¶m, &result, connect_run); debug_print("connect ok %i with nntp %p\n", result.error, nntp); return result.error; }
void nntp_threaded_cancel(Folder * folder) { newsnntp * nntp; nntp = get_nntp(folder); if (nntp->nntp_stream != NULL) mailstream_cancel(nntp->nntp_stream); }
int nntp_threaded_mode_reader(Folder * folder) { struct mode_reader_param param; struct mode_reader_result result; debug_print("nntp mode_reader - begin\n"); param.nntp = get_nntp(folder); threaded_run(folder, ¶m, &result, mode_reader_run); debug_print("nntp mode_reader - end\n"); return result.error; }
void nntp_threaded_disconnect(Folder * folder) { newsnntp * nntp; nntp = get_nntp(folder); if (nntp == NULL) { debug_print("was disconnected\n"); return; } debug_print("deleting old nntp %p\n", nntp); delete_nntp(folder, nntp); debug_print("disconnect ok\n"); }
int nntp_threaded_list(Folder * folder, clist **grouplist) { struct list_param param; struct list_result result; debug_print("nntp list - begin\n"); param.nntp = get_nntp(folder); param.grouplist = grouplist; threaded_run(folder, ¶m, &result, list_run); debug_print("nntp list - end\n"); return result.error; }
int nntp_threaded_date(Folder * folder, struct tm *lt) { struct date_param param; struct date_result result; debug_print("nntp date - begin\n"); param.nntp = get_nntp(folder); param.lt = lt; threaded_run(folder, ¶m, &result, date_run); debug_print("nntp date - end\n"); return result.error; }
int nntp_threaded_group(Folder * folder, const char *group, struct newsnntp_group_info **info) { struct group_param param; struct group_result result; debug_print("nntp group - begin\n"); param.nntp = get_nntp(folder); param.group = group; param.info = info; threaded_run(folder, ¶m, &result, group_run); debug_print("nntp group - end\n"); return result.error; }
int nntp_threaded_post(Folder * folder, char *contents, size_t len) { struct post_param param; struct post_result result; debug_print("nntp post - begin\n"); param.nntp = get_nntp(folder); param.contents = contents; param.len = len; threaded_run(folder, ¶m, &result, post_run); debug_print("nntp post - end\n"); return result.error; }
int nntp_threaded_login(Folder * folder, const char * login, const char * password) { struct login_param param; struct login_result result; debug_print("nntp login - begin\n"); param.nntp = get_nntp(folder); param.login = login; param.password = password; threaded_run(folder, ¶m, &result, login_run); debug_print("nntp login - end\n"); return result.error; }
int nntp_threaded_article(Folder * folder, guint32 num, char **contents, size_t *len) { struct article_param param; struct article_result result; debug_print("nntp article - begin\n"); param.nntp = get_nntp(folder); param.num = num; param.contents = contents; param.len = len; threaded_run(folder, ¶m, &result, article_run); debug_print("nntp article - end\n"); return result.error; }
int nntp_threaded_connect_ssl(Folder * folder, const char * server, int port) { struct connect_param param; struct connect_result result; chashdatum key; chashdatum value; newsnntp * nntp, * oldnntp; gboolean accept_if_valid = FALSE; oldnntp = get_nntp(folder); nntp = newsnntp_new(0, NULL); if (oldnntp) { debug_print("deleting old nntp %p\n", oldnntp); delete_nntp(folder, oldnntp); } key.data = &folder; key.len = sizeof(folder); value.data = nntp; value.len = 0; chash_set(session_hash, &key, &value, NULL); param.nntp = nntp; param.server = server; param.port = port; param.account = folder->account; if (folder->account) accept_if_valid = folder->account->ssl_certs_auto_accept; refresh_resolvers(); threaded_run(folder, ¶m, &result, connect_ssl_run); if (result.error == NEWSNNTP_NO_ERROR && !etpan_skip_ssl_cert_check) { if (etpan_certificate_check(nntp->nntp_stream, server, port, accept_if_valid) != TRUE) return -1; } debug_print("connect %d with nntp %p\n", result.error, nntp); return result.error; }
int nntp_threaded_connect_ssl(Folder * folder, const char * server, int port) { struct connect_param param; struct connect_result result; chashdatum key; chashdatum value; newsnntp * nntp, * oldnntp; unsigned char *certificate = NULL; int cert_len; oldnntp = get_nntp(folder); nntp = newsnntp_new(0, NULL); if (oldnntp) { debug_print("deleting old nntp %p\n", oldnntp); delete_nntp(folder, oldnntp); } key.data = &folder; key.len = sizeof(folder); value.data = nntp; value.len = 0; chash_set(session_hash, &key, &value, NULL); param.nntp = nntp; param.server = server; param.port = port; param.account = folder->account; refresh_resolvers(); threaded_run(folder, ¶m, &result, connect_ssl_run); if (result.error == NEWSNNTP_NO_ERROR && !etpan_skip_ssl_cert_check) { cert_len = (int)mailstream_ssl_get_certificate(nntp->nntp_stream, &certificate); if (etpan_certificate_check(certificate, cert_len, ¶m) < 0) return -1; if (certificate) free(certificate); } debug_print("connect %d with nntp %p\n", result.error, nntp); return result.error; }
int nntp_threaded_xhdr(Folder * folder, const char *header, guint32 beg, guint32 end, clist **hdrlist) { struct xhdr_param param; struct xhdr_result result; debug_print("nntp xhdr - begin\n"); param.nntp = get_nntp(folder); param.header = header; param.beg = beg; param.end = end; param.hdrlist = hdrlist; threaded_run(folder, ¶m, &result, xhdr_run); debug_print("nntp xhdr - end\n"); return result.error; }
int nntp_threaded_xover(Folder * folder, guint32 beg, guint32 end, struct newsnntp_xover_resp_item **single_result, clist **multiple_result) { struct xover_param param; struct xover_result result; debug_print("nntp xover - begin\n"); param.nntp = get_nntp(folder); param.beg = beg; param.end = end; param.result = single_result; param.msglist = multiple_result; threaded_run(folder, ¶m, &result, xover_run); debug_print("nntp xover - end\n"); return result.error; }
static void threaded_run(Folder * folder, void * param, void * result, void (* func)(struct etpan_thread_op * )) { struct etpan_thread_op * op; struct etpan_thread * thread; nntp_folder_ref(folder); op = etpan_thread_op_new(); op->nntp = get_nntp(folder); op->param = param; op->result = result; op->cancellable = 0; op->run = func; op->callback = generic_cb; op->callback_data = op; op->cleanup = NULL; op->finished = 0; previous_stream_logger = mailstream_logger; mailstream_logger = nntp_logger; thread = get_thread(folder); etpan_thread_op_schedule(thread, op); while (!op->finished) { gtk_main_iteration(); } mailstream_logger = previous_stream_logger; etpan_thread_op_free(op); nntp_folder_unref(folder); }
void nntp(void) { char buf[4096]; int len; while (TRUE) { IsDoing("Waiting"); len = get_nntp(buf, sizeof(buf) -1); if (len < 0) return; if (len == 0) continue; if (strcasestr(buf, (char *)"AUTHINFO PASS") == NULL) { Syslog('n', "< \"%s\"", printable(buf, 0)); } else { Syslog('n', "< \"AUTHINFO PASS ********\""); } if (! check_free()) { send_nntp("400 server closed"); return; } /* * Process received command */ if (strncasecmp(buf, "QUIT", 4) == 0) { send_nntp("205 Goodbye\r\n"); return; } else if (strncasecmp(buf, "AUTHINFO USER", 13) == 0) { auth_user(buf); } else if (strncasecmp(buf, "AUTHINFO PASS", 13) == 0) { auth_pass(buf); } else if (strncasecmp(buf, "ARTICLE", 7) == 0) { if (check_auth(buf)) command_abhs(buf); } else if (strncasecmp(buf, "BODY", 4) == 0) { if (check_auth(buf)) command_abhs(buf); } else if (strncasecmp(buf, "LIST", 4) == 0) { if (check_auth(buf)) command_list(buf); } else if (strncasecmp(buf, "GROUP", 5) == 0) { if (check_auth(buf)) command_group(buf); } else if (strncasecmp(buf, "HEAD", 4) == 0) { if (check_auth(buf)) command_abhs(buf); } else if (strncasecmp(buf, "POST", 4) == 0) { if (check_auth(buf)) command_post(buf); } else if (strncasecmp(buf, "IHAVE", 5) == 0) { send_nntp("435 Article not wanted - do not send it"); } else if (strncasecmp(buf, "NEWGROUPS", 9) == 0) { send_nntp("235 Warning: NEWGROUPS not implemented, returning empty list"); send_nntp("."); } else if (strncasecmp(buf, "NEWNEWS", 7) == 0) { send_nntp("230 Warning: NEWNEWS not implemented, returning empty list"); send_nntp("."); } else if (strncasecmp(buf, "SLAVE", 5) == 0) { send_nntp("202 Slave status noted"); } else if (strncasecmp(buf, "STAT", 4) == 0) { if (check_auth(buf)) command_abhs(buf); } else if (strncasecmp(buf, "MODE READER", 11) == 0) { if (check_auth(buf)) { if (authorized) send_nntp("200 Server ready, posting allowed"); else send_nntp("201 Server ready, no posting allowed"); } } else if (strncasecmp(buf, "XOVER", 5) == 0) { if (check_auth(buf)) command_xover(buf); } else if (strncasecmp(buf, "HELP", 4) == 0) { send_nntp("100 Help text follows"); send_nntp("Recognized commands:"); send_nntp(""); send_nntp("ARTICLE"); send_nntp("AUTHINFO"); send_nntp("BODY"); send_nntp("GROUP"); send_nntp("HEAD"); send_nntp("IHAVE (not implemented, messages are always rejected)"); send_nntp("LIST"); send_nntp("NEWGROUPS (not implemented, always returns an empty list)"); send_nntp("NEWNEWS (not implemented, always returns an empty list)"); send_nntp("POST"); send_nntp("QUIT"); send_nntp("SLAVE (has no effect)"); send_nntp("STAT"); send_nntp("XOVER"); send_nntp(""); send_nntp("FTNNNTP supports most of RFC-977 and also has support for AUTHINFO and"); send_nntp("limited XOVER support (RFC-2980)"); send_nntp("."); } else { send_nntp("500 Unknown command"); } } }