X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=blobdiff_plain;f=src%2Fetpan%2Fnntp-thread.c;h=84a2f83d761b4527174805cec6047526bb06caf0;hp=64453507fc805b9a8c78ee94c2050a3c16e5049b;hb=b0c17cd08e482dbda407dabdc952dfcf5d8fdb6e;hpb=16f9763a40621ba4a1badfde79c6ea467fdf60ae diff --git a/src/etpan/nntp-thread.c b/src/etpan/nntp-thread.c index 64453507f..84a2f83d7 100644 --- a/src/etpan/nntp-thread.c +++ b/src/etpan/nntp-thread.c @@ -1,6 +1,6 @@ /* * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 2005-2007 DINH Viet Hoa and the Claws Mail team + * Copyright (C) 2005-2012 DINH Viet Hoa and the Claws Mail team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,10 +19,13 @@ #ifdef HAVE_CONFIG_H # include "config.h" +#include "claws-features.h" #endif #ifdef HAVE_LIBETPAN +#include +#include #include "nntp-thread.h" #include "news.h" #include @@ -31,22 +34,25 @@ #include #endif #include +#ifndef G_OS_WIN32 #include #include - +#endif #include #include #include "etpan-thread-manager.h" +#include "etpan-ssl.h" #include "utils.h" #include "mainwindow.h" #include "ssl_certificate.h" #include "socket.h" #include "remotefolder.h" +#include "main.h" +#include "account.h" #define DISABLE_LOG_DURING_LOGIN static struct etpan_thread_manager * thread_manager = NULL; -static chash * courier_workaround_hash = NULL; static chash * nntp_hash = NULL; static chash * session_hash = NULL; static guint thread_manager_signal = 0; @@ -93,12 +99,9 @@ static void nntp_logger(int direction, const char * str, size_t size) static void delete_nntp(Folder *folder, newsnntp *nntp) { chashdatum key; - chashdatum value; key.data = &folder; key.len = sizeof(folder); - value.data = nntp; - value.len = 0; chash_delete(session_hash, &key, NULL); key.data = &nntp; @@ -116,6 +119,13 @@ static gboolean thread_manager_event(GIOChannel * source, GIOCondition condition, gpointer data) { +#ifdef G_OS_WIN32 + gsize bytes_read; + gchar ch; + + if (condition & G_IO_IN) + g_io_channel_read_chars(source, &ch, 1, &bytes_read, NULL); +#endif etpan_thread_manager_loop(thread_manager); return TRUE; @@ -132,13 +142,16 @@ void nntp_main_init(gboolean skip_ssl_cert_check) nntp_hash = chash_new(CHASH_COPYKEY, CHASH_DEFAULTSIZE); session_hash = chash_new(CHASH_COPYKEY, CHASH_DEFAULTSIZE); - courier_workaround_hash = chash_new(CHASH_COPYKEY, CHASH_DEFAULTSIZE); thread_manager = etpan_thread_manager_new(); fd_thread_manager = etpan_thread_manager_get_fd(thread_manager); +#ifndef G_OS_WIN32 io_channel = g_io_channel_unix_new(fd_thread_manager); +#else + io_channel = g_io_channel_win32_new_fd(fd_thread_manager); +#endif thread_manager_signal = g_io_add_watch_full(io_channel, 0, G_IO_IN, thread_manager_event, @@ -146,9 +159,13 @@ void nntp_main_init(gboolean skip_ssl_cert_check) NULL); } -void nntp_main_done(void) +void nntp_main_done(gboolean have_connectivity) { + nntp_disconnect_all(have_connectivity); etpan_thread_manager_stop(thread_manager); +#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) + return; +#endif etpan_thread_manager_join(thread_manager); g_source_remove(thread_manager_signal); @@ -288,6 +305,7 @@ static void threaded_run(Folder * folder, void * param, void * result, struct connect_param { newsnntp * nntp; + PrefsAccount *account; const char * server; int port; }; @@ -356,57 +374,6 @@ int nntp_threaded_connect(Folder * folder, const char * server, int port) return result.error; } -static int etpan_certificate_check(const unsigned char *certificate, int len, void *data) -{ -#ifdef USE_OPENSSL - struct connect_param *param = (struct connect_param *)data; - X509 *cert = NULL; - - if (certificate == NULL || len < 0) { - g_warning("no cert presented.\n"); - return 0; - } - cert = d2i_X509(NULL, (const unsigned char **)&certificate, len); - if (cert == NULL) { - g_warning("nntp: can't get cert\n"); - return 0; - } else if (ssl_certificate_check(cert, NULL, - (gchar *)param->server, (gushort)param->port) == TRUE) { - X509_free(cert); - return 0; - } else { - X509_free(cert); - return -1; - } -#elif USE_GNUTLS - struct connect_param *param = (struct connect_param *)data; - gnutls_x509_crt cert = NULL; - gnutls_datum tmp; - - if (certificate == NULL || len < 0) { - g_warning("no cert presented.\n"); - return 0; - } - - tmp.data = malloc(len); - memcpy(tmp.data, certificate, len); - tmp.size = len; - gnutls_x509_crt_init(&cert); - if (gnutls_x509_crt_import(cert, &tmp, GNUTLS_X509_FMT_DER) < 0) { - g_warning("nntp: can't get cert\n"); - return 0; - } else if (ssl_certificate_check(cert, (guint)-1, NULL, - (gchar *)param->server, (gushort)param->port) == TRUE) { - gnutls_x509_crt_deinit(cert); - return 0; - } else { - gnutls_x509_crt_deinit(cert); - return -1; - } -#endif - return 0; -} - static void connect_ssl_run(struct etpan_thread_op * op) { int r; @@ -418,8 +385,9 @@ static void connect_ssl_run(struct etpan_thread_op * op) CHECK_NNTP(); - r = newsnntp_ssl_connect(param->nntp, - param->server, param->port); + r = newsnntp_ssl_connect_with_callback(param->nntp, + param->server, param->port, + etpan_connect_ssl_context_cb, param->account); result->error = r; } @@ -430,8 +398,6 @@ int nntp_threaded_connect_ssl(Folder * folder, const char * server, int port) chashdatum key; chashdatum value; newsnntp * nntp, * oldnntp; - unsigned char *certificate = NULL; - int cert_len; oldnntp = get_nntp(folder); @@ -451,16 +417,14 @@ int nntp_threaded_connect_ssl(Folder * folder, const char * server, int port) 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) + if (etpan_certificate_check(nntp->nntp_stream, server, port) < 0) return -1; - if (certificate) - free(certificate); } debug_print("connect %d with nntp %p\n", result.error, nntp); @@ -523,8 +487,9 @@ static void login_run(struct etpan_thread_op * op) #endif r = newsnntp_authinfo_username(param->nntp, param->login); - if (r == NEWSNNTP_NO_ERROR || - r == NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_PASSWORD) { + /* libetpan returning NO_ERROR means it received resp.code 281: + in this case auth. is already successful, no password is needed. */ + if (r == NEWSNNTP_WARNING_REQUEST_AUTHORIZATION_PASSWORD) { r = newsnntp_authinfo_password(param->nntp, param->password); } @@ -732,7 +697,7 @@ int nntp_threaded_article(Folder * folder, guint32 num, char **contents, size_t threaded_run(folder, ¶m, &result, article_run); - debug_print("nntp post - end\n"); + debug_print("nntp article - end\n"); return result.error; } @@ -902,8 +867,7 @@ static void xhdr_run(struct etpan_thread_op * op) if (param->beg == param->end) { r = newsnntp_xhdr_single(param->nntp, param->header, param->beg, param->hdrlist); } else { - r = -1; - g_warning("XHDR range not implemented\n"); + r = newsnntp_xhdr_range(param->nntp, param->header, param->beg, param->end, param->hdrlist); } result->error = r; @@ -930,13 +894,18 @@ int nntp_threaded_xhdr(Folder * folder, const char *header, guint32 beg, guint32 return result.error; } +void nntp_main_set_timeout(int sec) +{ + mailstream_network_delay.tv_sec = sec; + mailstream_network_delay.tv_usec = 0; +} #else void nntp_main_init(void) { } -void nntp_main_done(void) +void nntp_main_done(gboolean have_connectivity) { } void nntp_main_set_timeout(int sec)