diff options
Diffstat (limited to 'camel/providers')
-rw-r--r-- | camel/providers/pop3/camel-pop3-provider.c | 7 | ||||
-rw-r--r-- | camel/providers/smtp/camel-smtp-provider.c | 3 | ||||
-rw-r--r-- | camel/providers/smtp/camel-smtp-transport.c | 43 |
3 files changed, 28 insertions, 25 deletions
diff --git a/camel/providers/pop3/camel-pop3-provider.c b/camel/providers/pop3/camel-pop3-provider.c index 79cd088738..0931f903ed 100644 --- a/camel/providers/pop3/camel-pop3-provider.c +++ b/camel/providers/pop3/camel-pop3-provider.c @@ -70,8 +70,7 @@ CamelServiceAuthType camel_pop3_password_authtype = { "password. This is the only option supported by many POP servers."), "", - TRUE, - FALSE + TRUE }; CamelServiceAuthType camel_pop3_apop_authtype = { @@ -82,8 +81,7 @@ CamelServiceAuthType camel_pop3_apop_authtype = { "even on servers that claim to support it."), "+APOP", - TRUE, - FALSE + TRUE }; #ifdef HAVE_KRB4 @@ -94,7 +92,6 @@ CamelServiceAuthType camel_pop3_kpop_authtype = { "to authenticate to it."), "+KPOP", - FALSE, FALSE }; #endif diff --git a/camel/providers/smtp/camel-smtp-provider.c b/camel/providers/smtp/camel-smtp-provider.c index b84a6a0d83..3bb47b3429 100644 --- a/camel/providers/smtp/camel-smtp-provider.c +++ b/camel/providers/smtp/camel-smtp-provider.c @@ -54,7 +54,8 @@ camel_provider_module_init (CamelSession *session) { smtp_provider.object_types[CAMEL_PROVIDER_TRANSPORT] = camel_smtp_transport_get_type (); - smtp_provider.authtypes = camel_sasl_authtype_list (TRUE); + smtp_provider.authtypes = g_list_append (camel_sasl_authtype_list (TRUE), + camel_sasl_authtype ("LOGIN")); smtp_provider.service_cache = g_hash_table_new (camel_url_hash, camel_url_equal); camel_session_register_provider (session, &smtp_provider); diff --git a/camel/providers/smtp/camel-smtp-transport.c b/camel/providers/smtp/camel-smtp-transport.c index 1c18c154b3..b2331598ae 100644 --- a/camel/providers/smtp/camel-smtp-transport.c +++ b/camel/providers/smtp/camel-smtp-transport.c @@ -220,7 +220,7 @@ get_smtp_error_string (int error) } static gboolean -smtp_connect (CamelService *service, CamelException *ex) +connect_to_server (CamelService *service, CamelException *ex) { CamelSmtpTransport *transport = CAMEL_SMTP_TRANSPORT (service); CamelStream *tcp_stream; @@ -325,6 +325,17 @@ smtp_connect (CamelService *service, CamelException *ex) smtp_helo (transport, ex); } + return TRUE; +} + +static gboolean +smtp_connect (CamelService *service, CamelException *ex) +{ + CamelSmtpTransport *transport = CAMEL_SMTP_TRANSPORT (service); + + if (!connect_to_server (service, ex)) + return FALSE; + /* check to see if AUTH is required, if so...then AUTH ourselves */ if (service->url->authmech) { CamelSession *session = camel_service_get_session (service); @@ -404,8 +415,11 @@ smtp_connect (CamelService *service, CamelException *ex) } } - /* we have to re-EHLO */ - smtp_helo (transport, ex); + /* The spec says we have to re-EHLO, but some servers + * we won't bother to name don't want you to... so ignore + * errors. + */ + smtp_helo (transport, NULL); } return TRUE; @@ -488,10 +502,10 @@ query_auth_types (CamelService *service, CamelException *ex) CamelServiceAuthType *authtype; GList *types, *t, *next; - if (!smtp_connect (service, ex)) + if (!connect_to_server (service, ex)) return NULL; - types = camel_sasl_authtype_list (TRUE); + types = g_list_copy (service->provider->authtypes); for (t = types; t; t = next) { authtype = t->data; next = t->next; @@ -502,6 +516,7 @@ query_auth_types (CamelService *service, CamelException *ex) } } + smtp_disconnect (service, TRUE, NULL); return types; } @@ -696,8 +711,7 @@ smtp_helo (CamelSmtpTransport *transport, CamelException *ex) static gboolean smtp_auth (CamelSmtpTransport *transport, const char *mech, CamelException *ex) { - CamelServiceAuthType *authtype; - gchar *cmdbuf, *respbuf = NULL; + gchar *cmdbuf, *respbuf = NULL, *challenge; CamelSasl *sasl; sasl = camel_sasl_new ("smtp", mech, CAMEL_SERVICE (transport)); @@ -708,15 +722,8 @@ smtp_auth (CamelSmtpTransport *transport, const char *mech, CamelException *ex) return FALSE; } - /* get the authtype object so we know if we can challenge the server */ - authtype = camel_sasl_authtype (mech); - - /* tell the server we want to authenticate... */ - if (authtype && authtype->quick_login) { - /* cool, we can challenge the server in our initial request */ - char *challenge; - - challenge = camel_sasl_challenge_base64 (sasl, NULL, ex); + challenge = camel_sasl_challenge_base64 (sasl, NULL, ex); + if (challenge) { cmdbuf = g_strdup_printf ("AUTH %s %s\r\n", mech, challenge); g_free (challenge); } else @@ -744,13 +751,11 @@ smtp_auth (CamelSmtpTransport *transport, const char *mech, CamelException *ex) } while (!camel_sasl_authenticated (sasl)) { - char *challenge; - if (!respbuf) goto lose; /* eat whtspc */ - for (challenge = respbuf + 4; *challenge && isspace (*challenge); challenge++); + for (challenge = respbuf + 4; isspace (*challenge); challenge++); challenge = camel_sasl_challenge_base64 (sasl, challenge, ex); g_free (respbuf); |