NeoMutt  2021-10-29-43-g6b8931
Teaching an old dog new tricks
DOXYGEN
auth_plain.c
Go to the documentation of this file.
1 
30 #include "config.h"
31 #include "private.h"
32 #include "mutt/lib.h"
33 #include "conn/lib.h"
34 #include "adata.h"
35 #include "auth.h"
36 #include "mutt_logging.h"
37 #include "mutt_socket.h"
38 
42 enum ImapAuthRes imap_auth_plain(struct ImapAccountData *adata, const char *method)
43 {
44  int rc = IMAP_RES_CONTINUE;
45  enum ImapAuthRes res = IMAP_AUTH_SUCCESS;
46  static const char auth_plain_cmd[] = "AUTHENTICATE PLAIN";
47  char buf[256] = { 0 };
48 
49  if (mutt_account_getuser(&adata->conn->account) < 0)
50  return IMAP_AUTH_FAILURE;
51  if (mutt_account_getpass(&adata->conn->account) < 0)
52  return IMAP_AUTH_FAILURE;
53 
54  mutt_message(_("Logging in..."));
55 
56  /* Prepare full AUTHENTICATE PLAIN message */
57  mutt_sasl_plain_msg(buf, sizeof(buf), auth_plain_cmd, adata->conn->account.user,
58  adata->conn->account.user, adata->conn->account.pass);
59 
60  if (adata->capabilities & IMAP_CAP_SASL_IR)
61  {
62  imap_cmd_start(adata, buf);
63  }
64  else
65  {
66  /* Split the message so we send AUTHENTICATE PLAIN first, and the
67  * credentials after the first command continuation request */
68  buf[sizeof(auth_plain_cmd) - 1] = '\0';
69  imap_cmd_start(adata, buf);
70  while (rc == IMAP_RES_CONTINUE)
71  {
72  rc = imap_cmd_step(adata);
73  }
74  if (rc == IMAP_RES_RESPOND)
75  {
76  mutt_str_cat(buf + sizeof(auth_plain_cmd),
77  sizeof(buf) - sizeof(auth_plain_cmd), "\r\n");
78  mutt_socket_send(adata->conn, buf + sizeof(auth_plain_cmd));
79  rc = IMAP_RES_CONTINUE;
80  }
81  }
82 
83  while (rc == IMAP_RES_CONTINUE)
84  {
85  rc = imap_cmd_step(adata);
86  }
87 
88  if (rc == IMAP_RES_BAD)
89  {
90  res = IMAP_AUTH_UNAVAIL;
91  }
92  else if (rc == IMAP_RES_NO)
93  {
94  mutt_error(_("Login failed"));
95  res = IMAP_AUTH_FAILURE;
96  }
97 
99  return res;
100 }
IMAP authenticator multiplexor.
ImapAuthRes
Results of IMAP Authentication.
Definition: auth.h:38
@ IMAP_AUTH_FAILURE
Authentication failed.
Definition: auth.h:40
@ IMAP_AUTH_SUCCESS
Authentication successful.
Definition: auth.h:39
@ IMAP_AUTH_UNAVAIL
Authentication method not permitted.
Definition: auth.h:41
enum ImapAuthRes imap_auth_plain(struct ImapAccountData *adata, const char *method)
SASL PLAIN support - Implements ImapAuth::authenticate()
Definition: auth_plain.c:42
Connection Library.
int mutt_account_getpass(struct ConnAccount *cac)
Fetch password into ConnAccount, if necessary.
Definition: connaccount.c:111
int mutt_account_getuser(struct ConnAccount *cac)
Retrieve username into ConnAccount, if necessary.
Definition: connaccount.c:48
#define mutt_error(...)
Definition: logging.h:87
#define mutt_message(...)
Definition: logging.h:86
int imap_cmd_start(struct ImapAccountData *adata, const char *cmdstr)
Given an IMAP command, send it to the server.
Definition: command.c:1070
int imap_cmd_step(struct ImapAccountData *adata)
Reads server responses from an IMAP command.
Definition: command.c:1084
#define IMAP_RES_RESPOND
+
Definition: private.h:58
#define IMAP_RES_NO
<tag> NO ...
Definition: private.h:54
#define IMAP_CAP_SASL_IR
SASL initial response draft.
Definition: private.h:136
#define IMAP_RES_CONTINUE
* ...
Definition: private.h:57
#define IMAP_RES_BAD
<tag> BAD ...
Definition: private.h:55
Convenience wrapper for the library headers.
#define _(a)
Definition: message.h:28
char * mutt_str_cat(char *buf, size_t buflen, const char *s)
Concatenate two strings.
Definition: string.c:196
void mutt_clear_error(void)
Clear the message line (bottom line of screen)
Definition: mutt_logging.c:113
NeoMutt Logging.
NeoMutt connections.
#define mutt_socket_send(conn, buf)
Definition: mutt_socket.h:37
Pop-specific Account data.
size_t mutt_sasl_plain_msg(char *buf, size_t buflen, const char *cmd, const char *authz, const char *user, const char *pass)
Construct a base64 encoded SASL PLAIN message.
Definition: sasl_plain.c:55
GUI display the mailboxes in a side panel.
char user[128]
Username.
Definition: connaccount.h:56
char pass[256]
Password.
Definition: connaccount.h:57
struct ConnAccount account
Account details: username, password, etc.
Definition: connection.h:50
IMAP-specific Account data -.
Definition: adata.h:40
ImapCapFlags capabilities
Capability flags.
Definition: adata.h:55
struct Connection * conn
Connection to IMAP server.
Definition: adata.h:41