NeoMutt  2025-12-11-694-ga89709
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
SMTP Authentication API

Authenticate an SMTP connection. More...

Functions

static int smtp_auth_oauth (struct SmtpAccountData *adata, const char *method)
 Authenticate an SMTP connection using OAUTHBEARER - Implements SmtpAuth::authenticate() -.
 
static int smtp_auth_xoauth2 (struct SmtpAccountData *adata, const char *method)
 Authenticate an SMTP connection using XOAUTH2 - Implements SmtpAuth::authenticate() -.
 
static int smtp_auth_plain (struct SmtpAccountData *adata, const char *method)
 Authenticate using plain text - Implements SmtpAuth::authenticate() -.
 
static int smtp_auth_login (struct SmtpAccountData *adata, const char *method)
 Authenticate using plain text - Implements SmtpAuth::authenticate() -.
 

Detailed Description

Authenticate an SMTP connection.

Parameters
adataSmtp Account data
methodUse this named method, or any available method if NULL
Return values
numResult, e.g. SMTP_AUTH_SUCCESS

Function Documentation

◆ smtp_auth_oauth()

static int smtp_auth_oauth ( struct SmtpAccountData * adata,
const char * method )
static

Authenticate an SMTP connection using OAUTHBEARER - Implements SmtpAuth::authenticate() -.

Parameters
adataSMTP Account data
methodAuthentication method (not used)
Return values
numResult, e.g. SMTP_AUTH_SUCCESS

Definition at line 778 of file smtp.c.

779{
780 return smtp_auth_oauth_xoauth2(adata, method, false);
781}
static int smtp_auth_oauth_xoauth2(struct SmtpAccountData *adata, const char *method, bool xoauth2)
Authenticate an SMTP connection using OAUTHBEARER/XOAUTH2.
Definition smtp.c:740
+ Here is the call graph for this function:

◆ smtp_auth_xoauth2()

static int smtp_auth_xoauth2 ( struct SmtpAccountData * adata,
const char * method )
static

Authenticate an SMTP connection using XOAUTH2 - Implements SmtpAuth::authenticate() -.

Parameters
adataSMTP Account data
methodAuthentication method (not used)
Return values
numResult, e.g. SMTP_AUTH_SUCCESS

Definition at line 789 of file smtp.c.

790{
791 return smtp_auth_oauth_xoauth2(adata, method, true);
792}
+ Here is the call graph for this function:

◆ smtp_auth_plain()

static int smtp_auth_plain ( struct SmtpAccountData * adata,
const char * method )
static

Authenticate using plain text - Implements SmtpAuth::authenticate() -.

Parameters
adataSMTP Account data
methodAuthentication method (not used)
Return values
0Success
<0Error, e.g. SMTP_AUTH_FAIL
Note
method is "PLAIN"

Definition at line 803 of file smtp.c.

804{
805 struct Buffer *buf = NULL;
806 struct ConnAccount *cac = &adata->conn->account;
807 int rc = -1;
808
809 /* Get username and password. Bail out of any can't be retrieved. */
810 if ((mutt_account_getuser(cac) < 0) || (mutt_account_getpass(cac) < 0))
811 goto error;
812
813 /* Build the initial client response. */
814 buf = buf_pool_get();
815 mutt_sasl_plain_msg(buf, "AUTH PLAIN", cac->user, cac->user, cac->pass);
816 buf_add_printf(buf, "\r\n");
817
818 /* Send request, receive response (with a check for OK code). */
819 if ((mutt_socket_send(adata->conn, buf_string(buf)) < 0) || smtp_get_resp(adata))
820 goto error;
821
822 rc = 0; // Auth was successful
823
824error:
825 if (rc != 0)
826 {
827 // L10N: %s is the method name, e.g. Anonymous, CRAM-MD5, GSSAPI, SASL
828 mutt_error(_("%s authentication failed"), "SASL");
829 }
830 buf_pool_release(&buf);
831 return rc;
832}
int buf_add_printf(struct Buffer *buf, const char *fmt,...)
Format a string appending a Buffer.
Definition buffer.c:204
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition buffer.h:96
int mutt_account_getpass(struct ConnAccount *cac)
Fetch password into ConnAccount, if necessary.
int mutt_account_getuser(struct ConnAccount *cac)
Retrieve username into ConnAccount, if necessary.
Definition connaccount.c:51
#define mutt_error(...)
Definition logging2.h:94
#define _(a)
Definition message.h:28
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition pool.c:91
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition pool.c:111
size_t mutt_sasl_plain_msg(struct Buffer *buf, const char *cmd, const char *authz, const char *user, const char *pass)
Construct a base64 encoded SASL PLAIN message.
Definition sasl_plain.c:50
static int smtp_get_resp(struct SmtpAccountData *adata)
Read a command response from the SMTP server.
Definition smtp.c:141
#define mutt_socket_send(conn, buf)
Definition socket.h:56
String manipulation buffer.
Definition buffer.h:36
Login details for a remote server.
Definition connaccount.h:53
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:49
struct Connection * conn
Server Connection.
Definition smtp.c:100
+ Here is the call graph for this function:

◆ smtp_auth_login()

static int smtp_auth_login ( struct SmtpAccountData * adata,
const char * method )
static

Authenticate using plain text - Implements SmtpAuth::authenticate() -.

Parameters
adataSMTP Account data
methodAuthentication method (not used)
Return values
0Success
<0Error, e.g. SMTP_AUTH_FAIL
Note
method is "LOGIN"

Definition at line 843 of file smtp.c.

844{
845 char b64[1024] = { 0 };
846 char buf[1026] = { 0 };
847
848 /* Get username and password. Bail out of any can't be retrieved. */
849 if ((mutt_account_getuser(&adata->conn->account) < 0) ||
850 (mutt_account_getpass(&adata->conn->account) < 0))
851 {
852 goto error;
853 }
854
855 /* Send the AUTH LOGIN request. */
856 if (mutt_socket_send(adata->conn, "AUTH LOGIN\r\n") < 0)
857 {
858 goto error;
859 }
860
861 /* Read the 334 VXNlcm5hbWU6 challenge ("Username:" base64-encoded) */
862 int rc = mutt_socket_readln_d(buf, sizeof(buf), adata->conn, MUTT_SOCK_LOG_FULL);
863 if ((rc < 0) || !mutt_str_equal(buf, "334 VXNlcm5hbWU6"))
864 {
865 goto error;
866 }
867
868 /* Send the username */
869 size_t len = snprintf(buf, sizeof(buf), "%s", adata->conn->account.user);
870 mutt_b64_encode(buf, len, b64, sizeof(b64));
871 snprintf(buf, sizeof(buf), "%s\r\n", b64);
872 if (mutt_socket_send(adata->conn, buf) < 0)
873 {
874 goto error;
875 }
876
877 /* Read the 334 UGFzc3dvcmQ6 challenge ("Password:" base64-encoded) */
878 rc = mutt_socket_readln_d(buf, sizeof(buf), adata->conn, MUTT_SOCK_LOG_FULL);
879 if ((rc < 0) || !mutt_str_equal(buf, "334 UGFzc3dvcmQ6"))
880 {
881 goto error;
882 }
883
884 /* Send the password */
885 len = snprintf(buf, sizeof(buf), "%s", adata->conn->account.pass);
886 mutt_b64_encode(buf, len, b64, sizeof(b64));
887 snprintf(buf, sizeof(buf), "%s\r\n", b64);
888 if (mutt_socket_send(adata->conn, buf) < 0)
889 {
890 goto error;
891 }
892
893 /* Check the final response */
894 if (smtp_get_resp(adata) < 0)
895 {
896 goto error;
897 }
898
899 /* If we got here, auth was successful. */
900 return 0;
901
902error:
903 // L10N: %s is the method name, e.g. Anonymous, CRAM-MD5, GSSAPI, SASL
904 mutt_error(_("%s authentication failed"), "LOGIN");
905 return -1;
906}
size_t mutt_b64_encode(const char *in, size_t inlen, char *out, size_t outlen)
Convert raw bytes to a base64 string.
Definition base64.c:148
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition string.c:665
int mutt_socket_readln_d(char *buf, size_t buflen, struct Connection *conn, int dbg)
Read a line from a socket.
Definition socket.c:238
#define MUTT_SOCK_LOG_FULL
Log everything including full protocol.
Definition socket.h:53
+ Here is the call graph for this function: