diff options
author | 2020-01-08 16:37:29 +0100 | |
---|---|---|
committer | 2020-01-08 16:37:29 +0100 | |
commit | 4c624cc5aed4feb2117a593c0dea0c862ac23e34 (patch) | |
tree | e2e7b538d8788b2457712845f0d530a37781b8b5 /smtpd/mta_session.c | |
parent | sync (diff) | |
download | OpenSMTPD-4c624cc5aed4feb2117a593c0dea0c862ac23e34.tar.xz OpenSMTPD-4c624cc5aed4feb2117a593c0dea0c862ac23e34.zip |
sync
Diffstat (limited to 'smtpd/mta_session.c')
-rw-r--r-- | smtpd/mta_session.c | 30 |
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) |