2 * Copyright notice from original mutt:
3 * Copyright (C) 1996-8 Michael R. Elkins <me@mutt.org>
4 * Copyright (C) 1996-9 Brandon Long <blong@fiction.net>
5 * Copyright (C) 1999-2001 Brendan Cully <brendan@kublai.com>
7 * This file is part of mutt-ng, see http://www.muttng.org/.
8 * It's licensed under the GNU General Public License,
9 * please see the file GPL in the top level source directory.
12 /* IMAP login/authentication code */
18 #include <lib-lib/mem.h>
19 #include <lib-lib/debug.h>
21 #include <lib-lib/macros.h>
22 #include <lib-lib/ascii.h>
25 #include "imap_private.h"
28 static imap_auth_t imap_authenticators[] = {
30 {imap_auth_sasl, NULL},
32 {imap_auth_anon, "anonymous"},
35 {imap_auth_gss, "gssapi"},
37 /* SASL includes CRAM-MD5 (and GSSAPI, but that's not enabled by default) */
39 {imap_auth_cram_md5, "cram-md5"},
41 {imap_auth_login, "login"},
46 /* imap_authenticate: Attempt to authenticate using either user-specified
47 * authentication method if specified, or any. */
48 int imap_authenticate (IMAP_DATA * idata)
50 imap_auth_t *authenticator;
56 if (ImapAuthenticators && *ImapAuthenticators) {
57 /* Try user-specified list of authentication methods */
58 methods = m_strdup(ImapAuthenticators);
60 for (method = methods; method; method = delim) {
61 delim = strchr (method, ':');
67 debug_print (2, ("Trying method %s\n", method));
68 authenticator = imap_authenticators;
70 while (authenticator->authenticate) {
71 if (!authenticator->method ||
72 !ascii_strcasecmp (authenticator->method, method))
73 if ((r = authenticator->authenticate (idata, method)) !=
86 /* Fall back to default: any authenticator */
87 debug_print (2, ("Using any available method.\n"));
88 authenticator = imap_authenticators;
90 while (authenticator->authenticate) {
92 authenticator->authenticate (idata, NULL)) != IMAP_AUTH_UNAVAIL)
98 if (r == IMAP_AUTH_UNAVAIL) {
99 mutt_error (_("No authenticators available"));