On Sun, Dec 20, 2020 at 07:58:56PM +0100, Martijn van Duren wrote: > Playing around with the filter API I want an easier way to send mail > with authentication instead of doing the transaction manually via > openssl or via bloated mailclients. Turns out we already have all the > plumbing in place and just need to hook it up. > > OK?
ok eric@ > martijn@ > > Index: smtpc.c > =================================================================== > RCS file: /cvs/src/usr.sbin/smtpd/smtpc.c,v > retrieving revision 1.11 > diff -u -p -r1.11 smtpc.c > --- smtpc.c 14 Sep 2020 18:32:11 -0000 1.11 > +++ smtpc.c 20 Dec 2020 18:57:13 -0000 > @@ -56,9 +56,8 @@ usage(void) > { > extern char *__progname; > > - fprintf(stderr, > - "usage: %s [-Chnv] [-F from] [-H helo] [-s server] [-S name] rcpt > ...\n", > - __progname); > + fprintf(stderr, "usage: %s [-Chnv] [-F from] [-H helo] [-a authfile] " > + "[-s server] [-S name] rcpt ...\n", __progname); > exit(1); > } > > @@ -66,8 +65,12 @@ int > main(int argc, char **argv) > { > char hostname[256]; > + FILE *authfile; > int ch, i; > char *server = "localhost"; > + char *authstr = NULL; > + size_t alloc = 0; > + ssize_t len; > struct passwd *pw; > > log_init(1, 0); > @@ -91,7 +94,7 @@ main(int argc, char **argv) > memset(&mail, 0, sizeof(mail)); > mail.from = pw->pw_name; > > - while ((ch = getopt(argc, argv, "CF:H:S:hns:v")) != -1) { > + while ((ch = getopt(argc, argv, "CF:H:S:a:hns:v")) != -1) { > switch (ch) { > case 'C': > params.tls_verify = 0; > @@ -107,6 +110,23 @@ main(int argc, char **argv) > break; > case 'h': > usage(); > + break; > + case 'a': > + if ((authfile = fopen(optarg, "r")) == NULL) > + fatal("%s: open", optarg); > + if ((len = getline(&authstr, &alloc, authfile)) == -1) > + fatal("%s: Failed to read username", optarg); > + if (authstr[len - 1] == '\n') > + authstr[len - 1] = '\0'; > + params.auth_user = authstr; > + authstr = NULL; > + len = 0; > + if ((len = getline(&authstr, &alloc, authfile)) == -1) > + fatal("%s: Failed to read password", optarg); > + if (authstr[len - 1] == '\n') > + authstr[len - 1] = '\0'; > + params.auth_pass = authstr; > + fclose(authfile); > break; > case 'n': > noaction = 1; > Index: smtp.1 > =================================================================== > RCS file: /cvs/src/usr.sbin/smtpd/smtp.1,v > retrieving revision 1.7 > diff -u -p -r1.7 smtp.1 > --- smtp.1 4 Jul 2018 08:23:43 -0000 1.7 > +++ smtp.1 20 Dec 2020 18:57:13 -0000 > @@ -25,6 +25,7 @@ > .Op Fl Chnv > .Op Fl F Ar from > .Op Fl H Ar helo > +.Op Fl a Ar authfile > .Op Fl s Ar server > .Op Ar recipient ... > .Sh DESCRIPTION > @@ -49,6 +50,13 @@ Set the return-path (MAIL FROM) for the > Default to the current username. > .It Fl H Ar helo > Define the hostname to advertise (HELO) when establishing the SMTP session. > +.It Fl a Ar authfile > +Perform a login before sending the message. > +The username and password are read from > +.Ar authfile > +and need to be on the first and second line respectively. > +This option requires a TLS or STARTTLS > +.Ar server . > .It Fl h > Display version and usage. > .It Fl n > > >