[prev in list] [next in list] [prev in thread] [next in thread]
List: busybox
Subject: Re: [PATCH] sendmail: support AUTH PLAIN in addition to AUTH LOGIN
From: Denys Vlasenko <vda.linux () googlemail ! com>
Date: 2018-07-31 16:08:39
Message-ID: CAK1hOcPe0OjXiH8THje45husb2k7iXeLucfA2EyawtA20wmyEg () mail ! gmail ! com
[Download RAW message or body]
Applied, with some changes on top. Please verify that current git works.
On Wed, Jun 27, 2018 at 1:17 AM, Raffaello D. Di Napoli
<rafdev@dinapo.li> wrote:
> Implement the -am argument to allow choosing an AUTH method.
> For now only PLAIN and LOGIN are supported, but others can be added
> easily in the future.
>
> AUTH PLAIN required adding a new variant of encode_base64() capable of
> handling NUL characters in the input string; the old function is now a
> wrapper for the newer one.
>
> Signed-off-by: Raffaello D. Di Napoli <rafdev@dinapo.li>
> ---
> mailutils/mail.c | 25 ++++++++++++++-----------
> mailutils/mail.h | 3 +++
> mailutils/sendmail.c | 38 ++++++++++++++++++++++++++++++--------
> 3 files changed, 47 insertions(+), 19 deletions(-)
>
> diff --git a/mailutils/mail.c b/mailutils/mail.c
> index 7af7edd6c..14f90857f 100644
> --- a/mailutils/mail.c
> +++ b/mailutils/mail.c
> @@ -108,6 +108,17 @@ static char* FAST_FUNC parse_url(char *url, char **user, char **pass)
> */
>
> void FAST_FUNC encode_base64(char *fname, const char *text, const char *eol)
> +{
> + size_t len = len;
> + if (text) {
> + // though we do not call uuencode(NULL, NULL) explicitly
> + // still we do not want to break things suddenly
> + len = strlen(text);
> + }
> + encode_n_base64(fname, text, len, eol);
> +}
> +
> +void FAST_FUNC encode_n_base64(char *fname, const char *text, size_t len, const char *eol)
> {
> enum {
> SRC_BUF_SIZE = 57, /* This *MUST* be a multiple of 3 */
> @@ -116,17 +127,12 @@ void FAST_FUNC encode_base64(char *fname, const char *text, const char *eol)
> #define src_buf text
> char src[SRC_BUF_SIZE];
> FILE *fp = fp;
> - ssize_t len = len;
> char dst_buf[DST_BUF_SIZE + 1];
>
> if (fname) {
> fp = (NOT_LONE_DASH(fname)) ? xfopen_for_read(fname) : (FILE *)text;
> src_buf = src;
> - } else if (text) {
> - // though we do not call uuencode(NULL, NULL) explicitly
> - // still we do not want to break things suddenly
> - len = strlen(text);
> - } else
> + } else if (!text)
> return;
>
> while (1) {
> @@ -135,11 +141,8 @@ void FAST_FUNC encode_base64(char *fname, const char *text, const char *eol)
> size = fread((char *)src_buf, 1, SRC_BUF_SIZE, fp);
> if ((ssize_t)size < 0)
> bb_perror_msg_and_die(bb_msg_read_error);
> - } else {
> - size = len;
> - if (len > SRC_BUF_SIZE)
> - size = SRC_BUF_SIZE;
> - }
> + } else
> + size = min(SRC_BUF_SIZE, len);
> if (!size)
> break;
> // encode the buffer we just read in
> diff --git a/mailutils/mail.h b/mailutils/mail.h
> index fa0c5b378..be0cff4c2 100644
> --- a/mailutils/mail.h
> +++ b/mailutils/mail.h
> @@ -7,6 +7,8 @@
> * Licensed under GPLv2, see file LICENSE in this source tree.
> */
>
> +#include <stddef.h>
> +
> struct globals {
> pid_t helper_pid;
> unsigned timeout;
> @@ -35,3 +37,4 @@ void get_cred_or_die(int fd) FAST_FUNC;
> char *send_mail_command(const char *fmt, const char *param) FAST_FUNC;
>
> void encode_base64(char *fname, const char *text, const char *eol) FAST_FUNC;
> +void encode_n_base64(char *fname, const char *text, size_t size, const char *eol) FAST_FUNC;
> diff --git a/mailutils/sendmail.c b/mailutils/sendmail.c
> index 4ca91fad8..804e53a33 100644
> --- a/mailutils/sendmail.c
> +++ b/mailutils/sendmail.c
> @@ -248,6 +248,10 @@ int sendmail_main(int argc UNUSED_PARAM, char **argv)
> OPT_S = 1 << 6, // specify connection string
> OPT_a = 1 << 7, // authentication tokens
> OPT_v = 1 << 8, // verbosity
> + //--- from -am
> + OPT_am_mask = 3 << 14, // AUTH method
> + OPT_am_login = 0 << 14, // AUTH LOGIN (default)
> + OPT_am_plain = 1 << 14, // AUTH PLAIN
> };
>
> // init global variables
> @@ -284,11 +288,14 @@ int sendmail_main(int argc UNUSED_PARAM, char **argv)
> char *a = (char *) llist_pop(&list);
> if ('u' == a[0])
> G.user = xstrdup(a+1);
> - if ('p' == a[0])
> + else if ('p' == a[0])
> G.pass = xstrdup(a+1);
> - // N.B. we support only AUTH LOGIN so far
> - //if ('m' == a[0])
> - // G.method = xstrdup(a+1);
> + else if ('m' == a[0]) {
> + if (strcasecmp("PLAIN", a+1) == 0)
> + opts |= OPT_am_plain;
> + else if (strcasecmp("LOGIN", a+1) != 0)
> + bb_error_msg_and_die("unsupported AUTH method %s", a+1);
> + }
> }
> // N.B. list == NULL here
> //bb_error_msg("OPT[%x] AU[%s], AP[%s], AM[%s], ARGV[%s]", opts, au, ap, am, *argv);
> @@ -348,13 +355,28 @@ int sendmail_main(int argc UNUSED_PARAM, char **argv)
>
> // perform authentication
> if (opts & OPT_a) {
> - smtp_check("AUTH LOGIN", 334);
> // we must read credentials unless they are given via -a[up] options
> if (!G.user || !G.pass)
> get_cred_or_die(4);
> - encode_base64(NULL, G.user, NULL);
> - smtp_check("", 334);
> - encode_base64(NULL, G.pass, NULL);
> + if ((opts & OPT_am_mask) == OPT_am_plain) {
> + char *plain_auth;
> + size_t user_len, pass_len;
> + user_len = strlen(G.user);
> + pass_len = strlen(G.pass);
> + smtp_check("AUTH PLAIN", 334);
> + // use \1 as placeholders for \0 (format string is NUL-terminated)
> + plain_auth = xasprintf("\1%s\1%s", G.user, G.pass);
> + // substitute placeholders
> + plain_auth[0] = '\0';
> + plain_auth[1 + user_len] = '\0';
> + encode_n_base64(NULL, plain_auth, 1 + user_len + 1 + pass_len, NULL);
> + free(plain_auth);
> + } else if ((opts & OPT_am_mask) == OPT_am_login) {
> + smtp_check("AUTH LOGIN", 334);
> + encode_base64(NULL, G.user, NULL);
> + smtp_check("", 334);
> + encode_base64(NULL, G.pass, NULL);
> + }
> smtp_check("", 235);
> }
>
> --
> 2.16.4
>
> _______________________________________________
> busybox mailing list
> busybox@busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic