aboutsummaryrefslogtreecommitdiffstats
path: root/smtpd/mta_session.c
diff options
context:
space:
mode:
authorGilles Chehade <gilles@poolp.org>2020-01-08 16:37:29 +0100
committerGilles Chehade <gilles@poolp.org>2020-01-08 16:37:29 +0100
commit4c624cc5aed4feb2117a593c0dea0c862ac23e34 (patch)
treee2e7b538d8788b2457712845f0d530a37781b8b5 /smtpd/mta_session.c
parentsync (diff)
downloadOpenSMTPD-4c624cc5aed4feb2117a593c0dea0c862ac23e34.tar.xz
OpenSMTPD-4c624cc5aed4feb2117a593c0dea0c862ac23e34.zip
sync
Diffstat (limited to 'smtpd/mta_session.c')
-rw-r--r--smtpd/mta_session.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/smtpd/mta_session.c b/smtpd/mta_session.c
index c38a5ced..3a7535d5 100644
--- a/smtpd/mta_session.c
+++ b/smtpd/mta_session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mta_session.c,v 1.125 2019/12/21 17:43:49 gilles Exp $ */
+/* $OpenBSD: mta_session.c,v 1.129 2020/01/08 00:05:38 gilles Exp $ */
/*
* Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -105,6 +105,8 @@ struct mta_session {
char *helo;
char *mxname;
+ char *username;
+
int flags;
int attempt;
@@ -177,9 +179,7 @@ static void mta_report_link_greeting(struct mta_session *, const char *);
static void mta_report_link_identify(struct mta_session *, const char *, const char *);
static void mta_report_link_tls(struct mta_session *, const char *);
static void mta_report_link_disconnect(struct mta_session *);
-#if 0
static void mta_report_link_auth(struct mta_session *, const char *, const char *);
-#endif
static void mta_report_tx_reset(struct mta_session *, uint32_t);
static void mta_report_tx_begin(struct mta_session *, uint32_t);
static void mta_report_tx_mail(struct mta_session *, uint32_t, const char *, int);
@@ -410,6 +410,7 @@ mta_free(struct mta_session *s)
relay = s->relay;
route = s->route;
+ free(s->username);
free(s->mxname);
free(s);
stat_decrement("mta.session", 1);
@@ -658,6 +659,14 @@ again:
break;
case MTA_AUTH_PLAIN:
+ memset(ibuf, 0, sizeof ibuf);
+ if (base64_decode(s->relay->secret, (unsigned char *)ibuf,
+ sizeof(ibuf)-1) == -1) {
+ log_debug("debug: mta: %p: credentials too large on session", s);
+ mta_error(s, "Credentials too large");
+ break;
+ }
+ s->username = xstrdup(ibuf+1);
mta_send(s, "AUTH PLAIN %s", s->relay->secret);
break;
@@ -673,6 +682,7 @@ again:
mta_error(s, "Credentials too large");
break;
}
+ s->username = xstrdup(ibuf+1);
memset(obuf, 0, sizeof obuf);
base64_encode((unsigned char *)ibuf + 1, strlen(ibuf + 1), obuf, sizeof obuf);
@@ -819,6 +829,7 @@ again:
} else
mta_send(s, "RCPT TO:<%s>", e->dest);
+ mta_report_tx_envelope(s, s->task->msgid, e->id);
s->rcptcount++;
break;
@@ -967,15 +978,18 @@ mta_response(struct mta_session *s, char *line)
case MTA_AUTH_PLAIN:
if (line[0] != '2') {
mta_error(s, "AUTH rejected: %s", line);
+ mta_report_link_auth(s, s->username, "fail");
s->flags |= MTA_FREE;
return;
}
+ mta_report_link_auth(s, s->username, "pass");
mta_enter_state(s, MTA_READY);
break;
case MTA_AUTH_LOGIN:
if (strncmp(line, "334 ", 4) != 0) {
mta_error(s, "AUTH rejected: %s", line);
+ mta_report_link_auth(s, s->username, "fail");
s->flags |= MTA_FREE;
return;
}
@@ -985,6 +999,7 @@ mta_response(struct mta_session *s, char *line)
case MTA_AUTH_LOGIN_USER:
if (strncmp(line, "334 ", 4) != 0) {
mta_error(s, "AUTH rejected: %s", line);
+ mta_report_link_auth(s, s->username, "fail");
s->flags |= MTA_FREE;
return;
}
@@ -994,9 +1009,11 @@ mta_response(struct mta_session *s, char *line)
case MTA_AUTH_LOGIN_PASS:
if (line[0] != '2') {
mta_error(s, "AUTH rejected: %s", line);
+ mta_report_link_auth(s, s->username, "fail");
s->flags |= MTA_FREE;
return;
}
+ mta_report_link_auth(s, s->username, "pass");
mta_enter_state(s, MTA_READY);
break;
@@ -1007,9 +1024,6 @@ mta_response(struct mta_session *s, char *line)
else
delivery = IMSG_MTA_DELIVERY_TEMPFAIL;
- mta_report_tx_mail(s, s->task->msgid, s->task->sender,
- delivery == IMSG_MTA_DELIVERY_TEMPFAIL ? -1 : 0);
-
mta_flush_task(s, delivery, line, 0, 0);
mta_enter_state(s, MTA_RSET);
return;
@@ -1096,8 +1110,6 @@ mta_response(struct mta_session *s, char *line)
case '2':
mta_report_tx_rcpt(s,
s->task->msgid, e->dest, 1);
- mta_report_tx_envelope(s,
- s->task->msgid, e->id);
break;
case '4':
mta_report_tx_rcpt(s,
@@ -1883,7 +1895,6 @@ mta_report_link_disconnect(struct mta_session *s)
report_smtp_link_disconnect("smtp-out", s->id);
}
-#if 0
static void
mta_report_link_auth(struct mta_session *s, const char *user, const char *result)
{
@@ -1892,7 +1903,6 @@ mta_report_link_auth(struct mta_session *s, const char *user, const char *result
report_smtp_link_auth("smtp-out", s->id, user, result);
}
-#endif
static void
mta_report_tx_reset(struct mta_session *s, uint32_t msgid)