X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=imap%2Fauth_sasl.c;fp=imap%2Fauth_sasl.c;h=0000000000000000000000000000000000000000;hp=a3877580216bcfaedb448579335f6fbfb8038792;hb=b314f6b74b24679a37333d74f49553b0a7577d11;hpb=6cc64ac1d90eed0c8280c3f7b4c2ab514d5224d1 diff --git a/imap/auth_sasl.c b/imap/auth_sasl.c deleted file mode 100644 index a387758..0000000 --- a/imap/auth_sasl.c +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright notice from original mutt: - * Copyright (C) 2000-3 Brendan Cully - * - * This file is part of mutt-ng, see http://www.muttng.org/. - * It's licensed under the GNU General Public License, - * please see the file GPL in the top level source directory. - */ - -/* SASL login/authentication code */ - -#include - -#include "mutt.h" -#include "mutt_sasl.h" -#include "imap_private.h" -#include "auth.h" - -#include -#include - -/* imap_auth_sasl: Default authenticator if available. */ -imap_auth_res_t imap_auth_sasl (IMAP_DATA * idata, const char *method) -{ - sasl_conn_t *saslconn; - sasl_interact_t *interaction = NULL; - int rc, irc; - char buf[HUGE_STRING]; - const char *mech; - - const char *pc = NULL; - unsigned int len, olen; - unsigned char client_start; - - if (mutt_sasl_client_new (idata->conn, &saslconn) < 0) { - return IMAP_AUTH_FAILURE; - } - - rc = SASL_FAIL; - - /* If the user hasn't specified a method, use any available */ - if (!method) { - method = idata->capstr; - - /* hack for SASL ANONYMOUS support: - * 1. Fetch username. If it's "" or "anonymous" then - * 2. attempt sasl_client_start with only "AUTH=ANONYMOUS" capability - * 3. if sasl_client_start fails, fall through... */ - - if (mutt_account_getuser (&idata->conn->account)) - return IMAP_AUTH_FAILURE; - - if (mutt_bit_isset (idata->capabilities, AUTH_ANON) && - (!idata->conn->account.user[0] || - !m_strncmp(idata->conn->account.user, "anonymous", 9))) - rc = sasl_client_start (saslconn, "AUTH=ANONYMOUS", NULL, &pc, &olen, - &mech); - } - - if (rc != SASL_OK && rc != SASL_CONTINUE) - do { - rc = sasl_client_start (saslconn, method, &interaction, - &pc, &olen, &mech); - if (rc == SASL_INTERACT) - mutt_sasl_interact (interaction); - } - while (rc == SASL_INTERACT); - - client_start = (olen > 0); - - if (rc != SASL_OK && rc != SASL_CONTINUE) { - /* SASL doesn't support LOGIN, so fall back */ - return IMAP_AUTH_UNAVAIL; - } - - mutt_message (_("Authenticating (%s)..."), mech); - - snprintf (buf, sizeof (buf), "AUTHENTICATE %s", mech); - imap_cmd_start (idata, buf); - irc = IMAP_CMD_CONTINUE; - - /* looping protocol */ - while (rc == SASL_CONTINUE || olen > 0) { - do - irc = imap_cmd_step (idata); - while (irc == IMAP_CMD_CONTINUE); - - if (method && irc == IMAP_CMD_NO) { - sasl_dispose (&saslconn); - return IMAP_AUTH_UNAVAIL; - } - - if (irc == IMAP_CMD_BAD || irc == IMAP_CMD_NO) - goto bail; - - if (irc == IMAP_CMD_RESPOND) { - if (sasl_decode64(idata->cmd.buf + 2, m_strlen(idata->cmd.buf + 2), buf, - LONG_STRING - 1, &len) != SASL_OK) { - goto bail; - } - } - - /* client-start is only available with the SASL-IR extension, but - * SASL 2.1 seems to want to use it regardless, at least for DIGEST - * fast reauth. Override if the server sent an initial continuation */ - if (!client_start || buf[0]) { - do { - rc = sasl_client_step (saslconn, buf, len, &interaction, &pc, &olen); - if (rc == SASL_INTERACT) - mutt_sasl_interact (interaction); - } - while (rc == SASL_INTERACT); - } - else - client_start = 0; - - /* send out response, or line break if none needed */ - if (olen) { - if (sasl_encode64 (pc, olen, buf, sizeof (buf), &olen) != SASL_OK) { - goto bail; - } - } - - if (irc == IMAP_CMD_RESPOND) { - m_strcpy(buf + olen, sizeof(buf) - olen, "\r\n"); - mutt_socket_write (idata->conn, buf); - } - - /* If SASL has errored out, send an abort string to the server */ - if (rc < 0) { - mutt_socket_write (idata->conn, "*\r\n"); - } - - olen = 0; - } - - while (irc != IMAP_CMD_OK) - if ((irc = imap_cmd_step (idata)) != IMAP_CMD_CONTINUE) - break; - - if (rc != SASL_OK) - goto bail; - - if (imap_code (idata->cmd.buf)) { - mutt_sasl_setup_conn (idata->conn, saslconn); - return IMAP_AUTH_SUCCESS; - } - -bail: - mutt_error _("SASL authentication failed."); - mutt_sleep (2); - sasl_dispose (&saslconn); - - return IMAP_AUTH_FAILURE; -}