diff options
author | Gilles Chehade <gilles@poolp.org> | 2019-09-20 19:56:25 +0200 |
---|---|---|
committer | Gilles Chehade <gilles@poolp.org> | 2019-09-20 19:56:25 +0200 |
commit | fe8dfb3fb3f31fe91555041d7412aaca71f501d3 (patch) | |
tree | 3d331dcd3748aee5960baa17ef6c2a24340fb6ef /smtpd/mta_session.c | |
parent | sync (diff) | |
download | OpenSMTPD-fe8dfb3fb3f31fe91555041d7412aaca71f501d3.tar.xz OpenSMTPD-fe8dfb3fb3f31fe91555041d7412aaca71f501d3.zip |
sync
Diffstat (limited to 'smtpd/mta_session.c')
-rw-r--r-- | smtpd/mta_session.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/smtpd/mta_session.c b/smtpd/mta_session.c index f5366623..72969e0a 100644 --- a/smtpd/mta_session.c +++ b/smtpd/mta_session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mta_session.c,v 1.121 2019/09/18 11:26:30 eric Exp $ */ +/* $OpenBSD: mta_session.c,v 1.122 2019/09/20 17:46:05 gilles Exp $ */ /* * Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org> @@ -529,8 +529,9 @@ mta_enter_state(struct mta_session *s, int newstate) char ibuf[LINE_MAX]; char obuf[LINE_MAX]; int offset; + const char *srs_sender; - again: +again: oldstate = s->state; log_trace(TRACE_MTA, "mta: %p: %s -> %s", s, @@ -728,6 +729,25 @@ mta_enter_state(struct mta_session *s, int newstate) s->hangon = 0; s->msgtried++; envid_sz = strlen(e->dsn_envid); + + /* SRS-encode if requested for the relay action, AND we're not + * bouncing, AND we have an RCPT which means we are forwarded, + * AND the RCPT has a '@' just for sanity check (will always). + */ + if (env->sc_srs_key != NULL && + s->relay->srs && + strchr(s->task->sender, '@') && + e->rcpt && + strchr(e->rcpt, '@')) { + /* encode and replace task sender with new SRS-sender */ + srs_sender = srs_encode(s->task->sender, + strchr(e->rcpt, '@') + 1); + if (srs_sender) { + free(s->task->sender); + s->task->sender = xstrdup(srs_sender); + } + } + if (s->ext & MTA_EXT_DSN) { mta_send(s, "MAIL FROM:<%s>%s%s%s%s", s->task->sender, |