Rocco Rutte:
[apps/madmutt.git] / imap / auth.c
1 /*
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>
6  *
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.
10  */
11
12 /* IMAP login/authentication code */
13
14 #if HAVE_CONFIG_H
15 # include "config.h"
16 #endif
17
18 #include "mutt.h"
19 #include "imap_private.h"
20 #include "auth.h"
21
22 static imap_auth_t imap_authenticators[] = {
23 #ifdef USE_SASL
24   {imap_auth_sasl, NULL},
25 #else
26   {imap_auth_anon, "anonymous"},
27 #endif
28 #ifdef USE_GSS
29   {imap_auth_gss, "gssapi"},
30 #endif
31   /* SASL includes CRAM-MD5 (and GSSAPI, but that's not enabled by default) */
32 #ifndef USE_SASL
33   {imap_auth_cram_md5, "cram-md5"},
34 #endif
35   {imap_auth_login, "login"},
36
37   {NULL}
38 };
39
40 /* imap_authenticate: Attempt to authenticate using either user-specified
41  *   authentication method if specified, or any. */
42 int imap_authenticate (IMAP_DATA * idata)
43 {
44   imap_auth_t *authenticator;
45   char *methods;
46   char *method;
47   char *delim;
48   int r = -1;
49
50   if (ImapAuthenticators && *ImapAuthenticators) {
51     /* Try user-specified list of authentication methods */
52     methods = safe_strdup (ImapAuthenticators);
53
54     for (method = methods; method; method = delim) {
55       delim = strchr (method, ':');
56       if (delim)
57         *delim++ = '\0';
58       if (!method[0])
59         continue;
60
61       dprint (2,
62               (debugfile, "imap_authenticate: Trying method %s\n", method));
63       authenticator = imap_authenticators;
64
65       while (authenticator->authenticate) {
66         if (!authenticator->method ||
67             !ascii_strcasecmp (authenticator->method, method))
68           if ((r = authenticator->authenticate (idata, method)) !=
69               IMAP_AUTH_UNAVAIL) {
70             FREE (&methods);
71             return r;
72           }
73
74         authenticator++;
75       }
76     }
77
78     FREE (&methods);
79   }
80   else {
81     /* Fall back to default: any authenticator */
82     dprint (2,
83             (debugfile, "imap_authenticate: Using any available method.\n"));
84     authenticator = imap_authenticators;
85
86     while (authenticator->authenticate) {
87       if ((r =
88            authenticator->authenticate (idata, NULL)) != IMAP_AUTH_UNAVAIL)
89         return r;
90       authenticator++;
91     }
92   }
93
94   if (r == IMAP_AUTH_UNAVAIL) {
95     mutt_error (_("No authenticators available"));
96     mutt_sleep (1);
97   }
98
99   return r;
100 }