summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoerg Jung <jung@cvs.openbsd.org>2015-10-27 21:20:12 +0000
committerJoerg Jung <jung@cvs.openbsd.org>2015-10-27 21:20:12 +0000
commit93cd0f55070d3b7ee4a47a809f313f5f04309bf6 (patch)
treee026236c261789dcb5406393ea4bc85d15d17e94
parent75870e0d1943fb67349510366c28e8c5ea52b571 (diff)
add a rcpt-to parameter to be able to use the original (probably expanded)
RCPT TO within LMTP sessions ok gilles eric
-rw-r--r--usr.sbin/smtpd/delivery_lmtp.c9
-rw-r--r--usr.sbin/smtpd/mda.c4
-rw-r--r--usr.sbin/smtpd/parse.y20
-rw-r--r--usr.sbin/smtpd/smtpd.conf.515
4 files changed, 39 insertions, 9 deletions
diff --git a/usr.sbin/smtpd/delivery_lmtp.c b/usr.sbin/smtpd/delivery_lmtp.c
index dfb3be10908..05f86b0a6f8 100644
--- a/usr.sbin/smtpd/delivery_lmtp.c
+++ b/usr.sbin/smtpd/delivery_lmtp.c
@@ -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)
diff --git a/usr.sbin/smtpd/mda.c b/usr.sbin/smtpd/mda.c
index e2989387552..a5b5460a74f 100644
--- a/usr.sbin/smtpd/mda.c
+++ b/usr.sbin/smtpd/mda.c
@@ -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)) {
diff --git a/usr.sbin/smtpd/parse.y b/usr.sbin/smtpd/parse.y
index 19c2ba79a31..3689a581bda 100644
--- a/usr.sbin/smtpd/parse.y
+++ b/usr.sbin/smtpd/parse.y
@@ -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 },
diff --git a/usr.sbin/smtpd/smtpd.conf.5 b/usr.sbin/smtpd/smtpd.conf.5
index 3f7a9bf4205..3626e694bf8 100644
--- a/usr.sbin/smtpd/smtpd.conf.5
+++ b/usr.sbin/smtpd/smtpd.conf.5
@@ -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,