add a rcpt-to parameter to be able to use the original (probably expanded)
authorjung <jung@openbsd.org>
Tue, 27 Oct 2015 21:20:11 +0000 (21:20 +0000)
committerjung <jung@openbsd.org>
Tue, 27 Oct 2015 21:20:11 +0000 (21:20 +0000)
RCPT TO within LMTP sessions

ok gilles eric

usr.sbin/smtpd/delivery_lmtp.c
usr.sbin/smtpd/mda.c
usr.sbin/smtpd/parse.y
usr.sbin/smtpd/smtpd.conf.5

index dfb3be1..05f86b0 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: delivery_lmtp.c,v 1.13 2015/10/27 21:11:27 jung Exp $ */
+/* $OpenBSD: delivery_lmtp.c,v 1.14 2015/10/27 21:20:11 jung Exp $ */
 
 /*
  * Copyright (c) 2013 Ashish SHUKLA <ashish.is@lostca.se>
@@ -119,11 +119,13 @@ static void
 lmtp_open(struct deliver *deliver)
 {
        FILE            *fp;
-       char            *buf = NULL, hn[HOST_NAME_MAX+1], *to = deliver->to;
+       char            *buf = NULL, hn[HOST_NAME_MAX + 1],
+                       *rcpt = deliver->to, *to = deliver->to;
        size_t           sz = 0;
        ssize_t          len;
        int              s;
 
+       strsep(&rcpt, " "); 
        s = (to[0] == '/') ? unix_socket(to) : inet_socket(to);
        if ((fp = fdopen(s, "r+")) == NULL)
                err(1, "fdopen");
@@ -143,7 +145,8 @@ lmtp_open(struct deliver *deliver)
        if (lmtp_cmd(&buf, &sz, '2', fp, "MAIL FROM:<%s>", deliver->from) != 0)
                errx(1, "MAIL FROM rejected: %s", buf);
 
-       if (lmtp_cmd(&buf, &sz, '2', fp, "RCPT TO:<%s>", deliver->user) != 0)
+       if (lmtp_cmd(&buf, &sz, '2', fp, "RCPT TO:<%s>",
+           rcpt ? deliver->dest : deliver->user) != 0)
                errx(1, "RCPT TO rejected: %s", buf);
 
        if (lmtp_cmd(&buf, &sz, '3', fp, "DATA") != 0)
index e298938..a5b5460 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mda.c,v 1.111 2015/10/26 09:22:03 jsg Exp $   */
+/*     $OpenBSD: mda.c,v 1.112 2015/10/27 21:20:11 jung Exp $  */
 
 /*
  * Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
@@ -349,6 +349,8 @@ mda_imsg(struct mproc *p, struct imsg *imsg)
                                    sizeof(deliver.user));
                                (void)strlcpy(deliver.from, e->sender,
                                    sizeof(deliver.from));
+                               (void)strlcpy(deliver.dest, e->dest,
+                                   sizeof(deliver.dest));
                                if (strlcpy(deliver.to, e->buffer,
                                        sizeof(deliver.to))
                                    >= sizeof(deliver.to)) {
index 19c2ba7..3689a58 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: parse.y,v 1.154 2015/09/07 15:36:53 gilles Exp $      */
+/*     $OpenBSD: parse.y,v 1.155 2015/10/27 21:20:11 jung Exp $        */
 
 /*
  * Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
@@ -163,7 +163,7 @@ typedef struct {
 
 %token AS QUEUE COMPRESSION ENCRYPTION MAXMESSAGESIZE MAXMTADEFERRED LISTEN ON ANY PORT EXPIRE
 %token TABLE SECURE SMTPS CERTIFICATE DOMAIN BOUNCEWARN LIMIT INET4 INET6 NODSN
-%token  RELAY BACKUP VIA DELIVER TO LMTP MAILDIR MBOX HOSTNAME HOSTNAMES
+%token  RELAY BACKUP VIA DELIVER TO LMTP MAILDIR MBOX RCPTTO HOSTNAME HOSTNAMES
 %token ACCEPT REJECT INCLUDE ERROR MDA FROM FOR SOURCE MTA PKI SCHEDULER
 %token ARROW AUTH TLS LOCAL VIRTUAL TAG TAGGED ALIAS FILTER KEY CA DHPARAMS
 %token AUTH_OPTIONAL TLS_REQUIRE USERBASE SENDER MASK_SOURCE VERIFY FORWARDONLY RECIPIENT
@@ -993,6 +993,21 @@ deliver_action     : DELIVER TO MAILDIR                    {
                                fatal("invalid lmtp destination");
                        free($4);
                }
+               | DELIVER TO LMTP STRING RCPTTO         {
+                       rule->r_action = A_LMTP;
+                       if (strchr($4, ':') || $4[0] == '/') {
+                               if (strlcpy(rule->r_value.buffer, $4,
+                                       sizeof(rule->r_value.buffer))
+                                       >= sizeof(rule->r_value.buffer))
+                                       fatal("lmtp destination too long");
+                               if (strlcat(rule->r_value.buffer, " rcpt-to",
+                                       sizeof(rule->r_value.buffer))
+                                       >= sizeof(rule->r_value.buffer))
+                                       fatal("lmtp recipient too long");
+                       } else
+                               fatal("invalid lmtp destination");
+                       free($4);
+               }
                | DELIVER TO MDA STRING                 {
                        rule->r_action = A_MDA;
                        if (strlcpy(rule->r_value.buffer, $4,
@@ -1306,6 +1321,7 @@ lookup(char *s)
                { "pki",                PKI },
                { "port",               PORT },
                { "queue",              QUEUE },
+               { "rcpt-to",            RCPTTO },
                { "recipient",          RECIPIENT },
                { "reject",             REJECT },
                { "relay",              RELAY },
index 3f7a9bf..3626e69 100644 (file)
@@ -1,4 +1,4 @@
-.\"    $OpenBSD: smtpd.conf.5,v 1.129 2015/09/03 12:23:23 millert Exp $
+.\"    $OpenBSD: smtpd.conf.5,v 1.130 2015/10/27 21:20:11 jung Exp $
 .\"
 .\" Copyright (c) 2008 Janne Johansson <jj@openbsd.org>
 .\" Copyright (c) 2009 Jacek Masiulaniec <jacekm@dobremiasto.net>
@@ -17,7 +17,7 @@
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
 .\"
-.Dd $Mdocdate: September 3 2015 $
+.Dd $Mdocdate: October 27 2015 $
 .Dt SMTPD.CONF 5
 .Os
 .Sh NAME
@@ -275,13 +275,22 @@ function.
 .Pp
 Finally, the method of delivery is specified:
 .Bl -tag -width Ds
-.It Ic deliver to lmtp Op Ar host : Ns Ar port | socket
+.It Xo
+.Ic deliver to lmtp
+.Op Ar host : Ns Ar port | socket
+.Op Ic rcpt-to
+.Xc
 Mail is delivered to
 .Ar host : Ns Ar port ,
 or to the
 .Ux
 .Ar socket
 over LMTP.
+.Pp
+Optionally,
+.Ic rcpt-to
+might be specified to use the recipient email address (after expansion) instead
+of the local user in the LMTP session as RCPT TO.
 .It Ic deliver to maildir Op Ar path
 Mail is added to a maildir.
 Its location,