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; }
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; }
static int nntpdriver_initialize(mailsession * session) { struct nntp_session_state_data * data; newsnntp * nntp; nntp = newsnntp_new(0, NULL); if (nntp == NULL) goto err; data = malloc(sizeof(* data)); if (data == NULL) goto free; data->nntp_session = nntp; data->nntp_userid = NULL; data->nntp_password = NULL; data->nntp_group_info = NULL; data->nntp_group_name = NULL; data->nntp_subscribed_list = clist_new(); if (data->nntp_subscribed_list == NULL) goto free_data; data->nntp_max_articles = 0; data->nntp_mode_reader = FALSE; session->sess_data = data; return MAIL_NO_ERROR; free_data: free(data); free: newsnntp_free(nntp); err: return MAIL_ERROR_MEMORY; }