NeoMutt  2021-02-05-666-ge300cd
Teaching an old dog new tricks
DOXYGEN
auth.c
Go to the documentation of this file.
1 
31 #include "config.h"
32 #include <string.h>
33 #include "private.h"
34 #include "mutt/lib.h"
35 #include "config/lib.h"
36 #include "core/lib.h"
37 #include "auth.h"
38 
42 struct ImapAuth
43 {
50  enum ImapAuthRes (*authenticate)(struct ImapAccountData *adata, const char *method);
51 
52  const char *method;
53 };
55 
59 static const struct ImapAuth imap_authenticators[] = {
60  // clang-format off
61  { imap_auth_oauth, "oauthbearer" },
62  { imap_auth_plain, "plain" },
63 #ifdef USE_SASL
64  { imap_auth_sasl, NULL },
65 #else
66  { imap_auth_anon, "anonymous" },
67 #endif
68 #ifdef USE_GSS
69  { imap_auth_gss, "gssapi" },
70 #endif
71 /* SASL includes CRAM-MD5 (and GSSAPI, but that's not enabled by default) */
72 #ifndef USE_SASL
73  { imap_auth_cram_md5, "cram-md5" },
74 #endif
75  { imap_auth_login, "login" },
76  // clang-format on
77 };
78 
87 bool imap_auth_is_valid(const char *authenticator)
88 {
89  for (size_t i = 0; i < mutt_array_size(imap_authenticators); i++)
90  {
91  const struct ImapAuth *auth = &imap_authenticators[i];
92  if (auth->method && mutt_istr_equal(auth->method, authenticator))
93  return true;
94  }
95 
96  return false;
97 }
98 
108 {
109  int rc = IMAP_AUTH_FAILURE;
110 
111  const struct Slist *c_imap_authenticators =
112  cs_subset_slist(NeoMutt->sub, "imap_authenticators");
113  if (c_imap_authenticators && (c_imap_authenticators->count > 0))
114  {
115  mutt_debug(LL_DEBUG2, "Trying user-defined imap_authenticators\n");
116 
117  /* Try user-specified list of authentication methods */
118  struct ListNode *np = NULL;
119  STAILQ_FOREACH(np, &c_imap_authenticators->head, entries)
120  {
121  mutt_debug(LL_DEBUG2, "Trying method %s\n", np->data);
122 
123  for (size_t i = 0; i < mutt_array_size(imap_authenticators); i++)
124  {
125  const struct ImapAuth *auth = &imap_authenticators[i];
126  if (!auth->method || mutt_istr_equal(auth->method, np->data))
127  {
128  rc = auth->authenticate(adata, np->data);
129  if (rc == IMAP_AUTH_SUCCESS)
130  {
131  return rc;
132  }
133  }
134  }
135  }
136  }
137  else
138  {
139  /* Fall back to default: any authenticator */
140  mutt_debug(LL_DEBUG2, "Trying pre-defined imap_authenticators\n");
141 
142  for (size_t i = 0; i < mutt_array_size(imap_authenticators); i++)
143  {
144  rc = imap_authenticators[i].authenticate(adata, NULL);
145  if (rc == IMAP_AUTH_SUCCESS)
146  return rc;
147  }
148  }
149 
150  mutt_error(_("No authenticators available or wrong credentials"));
151  return rc;
152 }
const char * method
Name of authentication method supported, NULL means variable.
Definition: auth.c:52
#define mutt_error(...)
Definition: logging.h:88
enum ImapAuthRes imap_auth_login(struct ImapAccountData *adata, const char *method)
Plain LOGIN support - Implements ImapAuth::authenticate()
Definition: auth_login.c:44
IMAP authenticator multiplexor.
#define _(a)
Definition: message.h:28
String list.
Definition: slist.h:46
Container for Accounts, Notifications.
Definition: neomutt.h:36
Convenience wrapper for the config headers.
#define mutt_array_size(x)
Definition: memory.h:33
Log at debug level 2.
Definition: logging.h:41
enum ImapAuthRes imap_auth_plain(struct ImapAccountData *adata, const char *method)
SASL PLAIN support - Implements ImapAuth::authenticate()
Definition: auth_plain.c:42
struct ListHead head
Definition: slist.h:48
Convenience wrapper for the core headers.
Authentication failed.
Definition: auth.h:40
Shared constants/structs that are private to IMAP.
enum ImapAuthRes imap_auth_anon(struct ImapAccountData *adata, const char *method)
Authenticate anonymously - Implements ImapAuth::authenticate()
Definition: auth_anon.c:42
bool mutt_istr_equal(const char *a, const char *b)
Compare two strings, ignoring case.
Definition: string.c:916
size_t count
Definition: slist.h:49
enum ImapAuthRes imap_auth_sasl(struct ImapAccountData *adata, const char *method)
Default authenticator if available - Implements ImapAuth::authenticate()
Definition: auth_sasl.c:46
ImapAuthRes
Results of IMAP Authentication.
Definition: auth.h:37
bool imap_auth_is_valid(const char *authenticator)
Check if string is a valid imap authentication method.
Definition: auth.c:87
enum ImapAuthRes(* authenticate)(struct ImapAccountData *adata, const char *method)
Authenticate an IMAP connection.
Definition: auth.c:50
void * adata
Private data (for Mailbox backends)
Definition: account.h:43
#define STAILQ_FOREACH(var, head, field)
Definition: queue.h:352
#define mutt_debug(LEVEL,...)
Definition: logging.h:85
IMAP authentication multiplexor.
Definition: auth.c:42
const struct Slist * cs_subset_slist(const struct ConfigSubset *sub, const char *name)
Get a string-list config item by name.
Definition: helpers.c:268
IMAP-specific Account data -.
Definition: adata.h:39
char * data
String.
Definition: list.h:36
int imap_authenticate(struct ImapAccountData *adata)
Authenticate to an IMAP server.
Definition: auth.c:107
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:39
enum ImapAuthRes imap_auth_oauth(struct ImapAccountData *adata, const char *method)
Authenticate an IMAP connection using OAUTHBEARER - Implements ImapAuth::authenticate() ...
Definition: auth_oauth.c:45
Convenience wrapper for the library headers.
A List node for strings.
Definition: list.h:34
enum ImapAuthRes imap_auth_cram_md5(struct ImapAccountData *adata, const char *method)
Authenticate using CRAM-MD5 - Implements ImapAuth::authenticate()
Definition: auth_cram.c:95
enum ImapAuthRes imap_auth_gss(struct ImapAccountData *adata, const char *method)
GSS Authentication support - Implements ImapAuth::authenticate()
Definition: auth_gss.c:105
Authentication successful.
Definition: auth.h:39