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_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_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; }