isync

mailbox synchronization program
git clone https://git.code.sf.net/p/isync/isync
Log | Files | Refs | README | LICENSE

commit 2f91e22371fb2b7054e1576f6f85bde429cefec5
parent bc51d0206aa72c97f79b21a00173edb059c610dd
Author: Oswald Buddenhagen <ossi@users.sf.net>
Date:   Sat,  3 Dec 2016 20:58:16 +0100

fix LOGIN in SASL builds

if AuthMechs includes more than just LOGIN and the server announces any
AUTH= mechanism, we try SASL. but that can still fail to find any
suitable authentication mechanism, and we must not error out in that
case if we are supposed to fall back to LOGIN.

Diffstat:
Msrc/drv_imap.c | 6++++++
1 file changed, 6 insertions(+), 0 deletions(-)

diff --git a/src/drv_imap.c b/src/drv_imap.c @@ -1992,6 +1992,8 @@ imap_open_store_authenticate2( imap_store_t *ctx ) rc = sasl_client_new( "imap", srvc->sconf.host, NULL, NULL, NULL, 0, &ctx->sasl ); if (rc != SASL_OK) { + if (rc == SASL_NOMECH) + goto notsasl; if (!ctx->sasl) goto saslbail; error( "Error: %s\n", sasl_errdetail( ctx->sasl ) ); @@ -1999,6 +2001,8 @@ imap_open_store_authenticate2( imap_store_t *ctx ) } rc = sasl_client_start( ctx->sasl, saslmechs + 1, &interact, CAP(SASLIR) ? &out : NULL, &out_len, &gotmech ); + if (rc == SASL_NOMECH) + goto notsasl; if (gotmech) info( "Authenticating with SASL mechanism %s...\n", gotmech ); /* Technically, we are supposed to loop over sasl_client_start(), @@ -2017,6 +2021,8 @@ imap_open_store_authenticate2( imap_store_t *ctx ) imap_exec( ctx, cmd, done_sasl_auth, enc ? "AUTHENTICATE %s %s" : "AUTHENTICATE %s", gotmech, enc ); free( enc ); return; + notsasl: + sasl_dispose( &ctx->sasl ); } #endif if (auth_login) {