From e5e0149bb66b663bba92c0eb8dd7dfbe6e33d9fa Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 27 Sep 2004 17:41:16 +0000 Subject: Instead of doing a host-lookup ourselves, get it passed in to us as an 2004-09-22 Jeffrey Stedfast * providers/imap/camel-imap-store.c (connect_to_server): Instead of doing a host-lookup ourselves, get it passed in to us as an argument. Also simplified a bit (try_starttls is no longer an option). (connect_to_server_wrapper): Simplified (we no longer have fallback cases for SSL stuff). Also, perform host lookup here. * providers/imap4/camel-imap4-store.c: Same changes as above. * providers/pop3/camel-pop3-store.c: Same. * providers/smtp/camel-smtp-transport.c: Same. Other changes include making the code consistant with the other providers. * providers/nntp/camel-nntp-store.c: Same as pop/imap. svn path=/trunk/; revision=27398 --- camel/providers/nntp/camel-nntp-store.c | 130 +++++++++++++++----------------- 1 file changed, 60 insertions(+), 70 deletions(-) (limited to 'camel/providers/nntp/camel-nntp-store.c') diff --git a/camel/providers/nntp/camel-nntp-store.c b/camel/providers/nntp/camel-nntp-store.c index e1473f1de1..e8d8871674 100644 --- a/camel/providers/nntp/camel-nntp-store.c +++ b/camel/providers/nntp/camel-nntp-store.c @@ -81,12 +81,6 @@ nntp_can_work_offline(CamelDiscoStore *store) return TRUE; } -enum { - USE_SSL_NEVER, - USE_SSL_ALWAYS, - USE_SSL_WHEN_POSSIBLE -}; - static struct { const char *name; int type; @@ -153,8 +147,17 @@ xover_setup(CamelNNTPStore *store, CamelException *ex) return ret; } +enum { + MODE_CLEAR, + MODE_SSL, + MODE_TLS, +}; + +#define SSL_PORT_FLAGS (CAMEL_TCP_STREAM_SSL_ENABLE_SSL2 | CAMEL_TCP_STREAM_SSL_ENABLE_SSL3) +#define STARTTLS_FLAGS (CAMEL_TCP_STREAM_SSL_ENABLE_TLS) + static gboolean -connect_to_server (CamelService *service, int ssl_mode, CamelException *ex) +connect_to_server (CamelService *service, struct addrinfo *ai, int ssl_mode, CamelException *ex) { CamelNNTPStore *store = (CamelNNTPStore *) service; CamelDiscoStore *disco_store = (CamelDiscoStore*) service; @@ -164,8 +167,6 @@ connect_to_server (CamelService *service, int ssl_mode, CamelException *ex) unsigned int len; int ret; char *path; - struct addrinfo *ai, hints = { 0 }; - char *serv; CAMEL_NNTP_STORE_LOCK(store, command_lock); @@ -182,42 +183,34 @@ connect_to_server (CamelService *service, int ssl_mode, CamelException *ex) camel_data_cache_set_expire_age (store->cache, 60*60*24*14); camel_data_cache_set_expire_access (store->cache, 60*60*24*5); } - - if (service->url->port) { - serv = g_alloca(16); - sprintf(serv, "%d", service->url->port); - } else - serv = "nntp"; + if (ssl_mode != MODE_CLEAR) { #ifdef HAVE_SSL - if (ssl_mode != USE_SSL_NEVER) { - if (service->url->port == 0) - serv = "nntps"; - tcp_stream = camel_tcp_stream_ssl_new (service->session, service->url->host, CAMEL_TCP_STREAM_SSL_ENABLE_SSL2 | CAMEL_TCP_STREAM_SSL_ENABLE_SSL3); - } else { - tcp_stream = camel_tcp_stream_raw_new (); - } + if (ssl_mode == MODE_TLS) { + tcp_stream = camel_tcp_stream_ssl_new (service->session, service->url->host, STARTTLS_FLAGS); + } else { + tcp_stream = camel_tcp_stream_ssl_new (service->session, service->url->host, SSL_PORT_FLAGS); + } #else - tcp_stream = camel_tcp_stream_raw_new (); -#endif /* HAVE_SSL */ - - hints.ai_socktype = SOCK_STREAM; - ai = camel_getaddrinfo(service->url->host, serv, &hints, ex); - if (ai == NULL) { - camel_object_unref(tcp_stream); + camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, + _("Could not connect to %s: %s"), + service->url->host, _("SSL unavailable")); + goto fail; +#endif /* HAVE_SSL */ + } else { + tcp_stream = camel_tcp_stream_raw_new (); } - ret = camel_tcp_stream_connect(CAMEL_TCP_STREAM(tcp_stream), ai); - camel_freeaddrinfo(ai); - if (ret == -1) { + if ((ret = camel_tcp_stream_connect ((CamelTcpStream *) tcp_stream, ai)) == -1) { if (errno == EINTR) camel_exception_set (ex, CAMEL_EXCEPTION_USER_CANCEL, _("Connection cancelled")); else camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("Could not connect to %s (port %s): %s"), - service->url->host, serv, g_strerror (errno)); + _("Could not connect to %s: %s"), + service->url->host, + g_strerror (errno)); camel_object_unref (tcp_stream); @@ -279,54 +272,51 @@ connect_to_server (CamelService *service, int ssl_mode, CamelException *ex) static struct { char *value; + char *serv; int mode; } ssl_options[] = { - { "", USE_SSL_ALWAYS }, - { "always", USE_SSL_ALWAYS }, - { "when-possible", USE_SSL_WHEN_POSSIBLE }, - { "never", USE_SSL_NEVER }, - { NULL, USE_SSL_NEVER }, + { "", "nntps", MODE_SSL }, /* really old (1.x) */ + { "always", "nntps", MODE_SSL }, + { "when-possible", "nntp", MODE_TLS }, + { "never", "nntp", MODE_CLEAR }, + { NULL, "nntp", MODE_CLEAR }, }; static gboolean nntp_connect_online (CamelService *service, CamelException *ex) { -#ifdef HAVE_SSL - const char *use_ssl; - int i, ssl_mode; + struct addrinfo hints, *ai; + const char *ssl_mode; + int mode, ret, i; + char *serv; - use_ssl = camel_url_get_param (service->url, "use_ssl"); - if (use_ssl) { + if ((ssl_mode = camel_url_get_param (service->url, "use_ssl"))) { for (i = 0; ssl_options[i].value; i++) - if (!strcmp (ssl_options[i].value, use_ssl)) + if (!strcmp (ssl_options[i].value, ssl_mode)) break; - ssl_mode = ssl_options[i].mode; - } else - ssl_mode = USE_SSL_NEVER; - - if (ssl_mode == USE_SSL_ALWAYS) { - /* Connect via SSL */ - return connect_to_server (service, ssl_mode, ex); - } else if (ssl_mode == USE_SSL_WHEN_POSSIBLE) { - /* If the server supports SSL, use it */ - if (!connect_to_server (service, ssl_mode, ex)) { - if (camel_exception_get_id (ex) == CAMEL_EXCEPTION_SERVICE_UNAVAILABLE) { - /* The ssl port seems to be unavailable, fall back to plain NNTP */ - camel_exception_clear (ex); - return connect_to_server (service, USE_SSL_NEVER, ex); - } else { - return FALSE; - } - } - - return TRUE; + mode = ssl_options[i].mode; + serv = ssl_options[i].serv; } else { - /* User doesn't care about SSL */ - return connect_to_server (service, ssl_mode, ex); + mode = MODE_CLEAR; + serv = "nntp"; } -#else - return connect_to_server (service, USE_SSL_NEVER, ex); -#endif + + if (service->url->port) { + serv = g_alloca (16); + sprintf (serv, "%d", service->url->port); + } + + memset (&hints, 0, sizeof (hints)); + hints.ai_socktype = SOCK_STREAM; + hints.ai_family = PF_UNSPEC; + if (!(ai = camel_getaddrinfo (service->url->host, serv, &hints, ex))) + return FALSE; + + ret = connect_to_server (service, ai, mode, ex); + + camel_freeaddrinfo (ai); + + return ret; } static gboolean -- cgit