diff options
-rw-r--r-- | config.c | 5 | ||||
-rw-r--r-- | control.c | 3 | ||||
-rw-r--r-- | filter_api.c | 4 | ||||
-rw-r--r-- | pony.c | 3 | ||||
-rw-r--r-- | smtp.c | 10 | ||||
-rw-r--r-- | smtp_session.c | 161 | ||||
-rw-r--r-- | smtpd.c | 28 | ||||
-rw-r--r-- | smtpd.h | 6 | ||||
-rw-r--r-- | smtpd/Makefile | 4 |
9 files changed, 93 insertions, 131 deletions
@@ -1,4 +1,4 @@ -/* $OpenBSD: config.c,v 1.26 2014/04/04 16:10:41 eric Exp $ */ +/* $OpenBSD: config.c,v 1.27 2014/04/09 18:55:19 eric Exp $ */ /* * Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org> @@ -135,8 +135,6 @@ config_peer(enum smtp_proc_type proc) p_control = p; else if (proc == PROC_LKA) p_lka = p; - else if (proc == PROC_MFA) - p_mfa = p; else if (proc == PROC_PARENT) p_parent = p; else if (proc == PROC_QUEUE) @@ -205,7 +203,6 @@ process_stat_event(int fd, short ev, void *arg) process_stat(p_control); process_stat(p_lka); - process_stat(p_mfa); process_stat(p_parent); process_stat(p_queue); process_stat(p_scheduler); @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.98 2014/04/04 16:10:42 eric Exp $ */ +/* $OpenBSD: control.c,v 1.99 2014/04/09 18:55:19 eric Exp $ */ /* * Copyright (c) 2012 Gilles Chehade <gilles@poolp.org> @@ -283,7 +283,6 @@ control(void) config_peer(PROC_SCHEDULER); config_peer(PROC_QUEUE); - config_peer(PROC_MFA); config_peer(PROC_PARENT); config_peer(PROC_LKA); config_peer(PROC_PONY); diff --git a/filter_api.c b/filter_api.c index 04d869b8..95a72e34 100644 --- a/filter_api.c +++ b/filter_api.c @@ -1,4 +1,4 @@ -/* $OpenBSD: filter_api.c,v 1.12 2013/12/26 17:25:32 eric Exp $ */ +/* $OpenBSD: filter_api.c,v 1.13 2014/04/09 18:55:19 eric Exp $ */ /* * Copyright (c) 2013 Eric Faurot <eric@openbsd.org> @@ -415,7 +415,7 @@ filter_api_init(void) event_init(); memset(&fi, 0, sizeof(fi)); - fi.p.proc = PROC_MFA; + fi.p.proc = PROC_PONY; fi.p.name = "filter"; fi.p.handler = filter_dispatch; fi.uid = pw->pw_uid; @@ -1,4 +1,4 @@ -/* $OpenBSD: pony.c,v 1.1 2014/04/04 16:10:42 eric Exp $ */ +/* $OpenBSD: pony.c,v 1.2 2014/04/09 18:55:19 eric Exp $ */ /* * Copyright (c) 2014 Gilles Chehade <gilles@poolp.org> @@ -211,7 +211,6 @@ pony(void) config_peer(PROC_QUEUE); config_peer(PROC_LKA); config_peer(PROC_CONTROL); - config_peer(PROC_MFA); config_done(); if (event_dispatch() < 0) @@ -1,4 +1,4 @@ -/* $OpenBSD: smtp.c,v 1.134 2014/04/04 16:10:42 eric Exp $ */ +/* $OpenBSD: smtp.c,v 1.135 2014/04/09 18:55:19 eric Exp $ */ /* * Copyright (c) 2008 Gilles Chehade <gilles@poolp.org> @@ -71,14 +71,6 @@ smtp_imsg(struct mproc *p, struct imsg *imsg) } } - if (p->proc == PROC_MFA) { - switch (imsg->hdr.type) { - case IMSG_MFA_SMTP_RESPONSE: - smtp_session_imsg(p, imsg); - return; - } - } - if (p->proc == PROC_QUEUE) { switch (imsg->hdr.type) { case IMSG_SMTP_MESSAGE_COMMIT: diff --git a/smtp_session.c b/smtp_session.c index 199460f0..fbf491eb 100644 --- a/smtp_session.c +++ b/smtp_session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: smtp_session.c,v 1.199 2014/04/09 12:47:23 eric Exp $ */ +/* $OpenBSD: smtp_session.c,v 1.200 2014/04/09 18:55:19 eric Exp $ */ /* * Copyright (c) 2008 Gilles Chehade <gilles@poolp.org> @@ -123,8 +123,6 @@ struct smtp_session { int phase; enum smtp_state state; - enum imsg_type mfa_imsg; /* last send */ - char helo[SMTPD_MAXLINESIZE]; char cmd[SMTPD_MAXLINESIZE]; char username[SMTPD_MAXLOGNAME]; @@ -160,7 +158,7 @@ static void smtp_session_init(void); static int smtp_lookup_servername(struct smtp_session *); static void smtp_connected(struct smtp_session *); static void smtp_send_banner(struct smtp_session *); -static void smtp_mfa_response(struct smtp_session *, int, uint32_t, +static void smtp_mfa_response(struct smtp_session *, int, int, uint32_t, const char *); static void smtp_io(struct io *, int); static void smtp_enter_state(struct smtp_session *, int); @@ -173,7 +171,6 @@ static void smtp_rfc4954_auth_login(struct smtp_session *, char *); static void smtp_message_write(struct smtp_session *, const char *); static void smtp_message_end(struct smtp_session *); static void smtp_message_reset(struct smtp_session *, int); -static void smtp_wait_mfa(struct smtp_session *s, int); static void smtp_free(struct smtp_session *, const char *); static const char *smtp_strstate(int); static int smtp_verify_certificate(struct smtp_session *); @@ -182,6 +179,17 @@ static void smtp_auth_failure_pause(struct smtp_session *); static void smtp_auth_failure_resume(int, short, void *); static int smtp_sni_callback(SSL *, int *, void *); +static void smtp_filter_connect(struct smtp_session *, struct sockaddr *); +static void smtp_filter_rset(struct smtp_session *); +static void smtp_filter_disconnect(struct smtp_session *); +static void smtp_filter_commit(struct smtp_session *); +static void smtp_filter_rollback(struct smtp_session *); +static void smtp_filter_eom(struct smtp_session *); +static void smtp_filter_helo(struct smtp_session *); +static void smtp_filter_mail(struct smtp_session *s); +static void smtp_filter_rcpt(struct smtp_session *s); +static void smtp_filter_data(struct smtp_session *s); + static struct { int code; const char *cmd; } commands[] = { { CMD_HELO, "HELO" }, { CMD_EHLO, "EHLO" }, @@ -201,7 +209,6 @@ static struct { int code; const char *cmd; } commands[] = { static struct tree wait_lka_ptr; static struct tree wait_lka_helo; static struct tree wait_lka_rcpt; -static struct tree wait_mfa_response; static struct tree wait_mfa_data; static struct tree wait_parent_auth; static struct tree wait_queue_msg; @@ -219,7 +226,6 @@ smtp_session_init(void) tree_init(&wait_lka_ptr); tree_init(&wait_lka_helo); tree_init(&wait_lka_rcpt); - tree_init(&wait_mfa_response); tree_init(&wait_mfa_data); tree_init(&wait_parent_auth); tree_init(&wait_queue_msg); @@ -293,7 +299,7 @@ smtp_session_imsg(struct mproc *p, struct imsg *imsg) struct msg m; const char *line, *helo; uint64_t reqid, evpid; - uint32_t code, msgid; + uint32_t msgid; int status, success, dnserror; X509 *x; void *ssl_ctx; @@ -352,20 +358,6 @@ smtp_session_imsg(struct mproc *p, struct imsg *imsg) smtp_connected(s); return; - case IMSG_MFA_SMTP_RESPONSE: - m_msg(&m, imsg); - m_get_id(&m, &reqid); - m_get_int(&m, &status); - m_get_u32(&m, &code); - if (!m_is_eom(&m)) - m_get_string(&m, &line); - else - line = NULL; - m_end(&m); - s = tree_xpop(&wait_mfa_response, reqid); - smtp_mfa_response(s, status, code, line); - return; - case IMSG_SMTP_MESSAGE_CREATE: m_msg(&m, imsg); m_get_id(&m, &reqid); @@ -503,9 +495,7 @@ smtp_session_imsg(struct mproc *p, struct imsg *imsg) m_end(&m); s = tree_xpop(&wait_queue_commit, reqid); if (!success) { - m_create(p_mfa, IMSG_SMTP_EVENT_ROLLBACK, 0, 0, -1); - m_add_id(p_mfa, s->id); - m_close(p_mfa); + smtp_filter_rollback(s); smtp_reply(s, "421 %s: Temporary failure", esc_code(ESC_STATUS_TEMPFAIL, ESC_OTHER_MAIL_SYSTEM_STATUS)); smtp_enter_state(s, STATE_QUIT); @@ -513,10 +503,7 @@ smtp_session_imsg(struct mproc *p, struct imsg *imsg) return; } - m_create(p_mfa, IMSG_SMTP_EVENT_COMMIT, 0, 0, -1); - m_add_id(p_mfa, s->id); - m_close(p_mfa); - + smtp_filter_commit(s); smtp_reply(s, "250 %s: %08x Message accepted for delivery", esc_code(ESC_STATUS_OK, ESC_OTHER_STATUS), evpid_to_msgid(s->evp.id)); @@ -644,7 +631,7 @@ smtp_session_imsg(struct mproc *p, struct imsg *imsg) } static void -smtp_mfa_response(struct smtp_session *s, int status, uint32_t code, +smtp_mfa_response(struct smtp_session *s, int msg, int status, uint32_t code, const char *line) { struct ca_cert_req_msg req_ca_cert; @@ -658,7 +645,7 @@ smtp_mfa_response(struct smtp_session *s, int status, uint32_t code, return; } - switch (s->mfa_imsg) { + switch (msg) { case IMSG_SMTP_REQ_CONNECT: if (status != MFA_OK) { @@ -894,11 +881,7 @@ smtp_io(struct io *io, int evt) iobuf_normalize(&s->iobuf); io_set_write(io); - m_create(p_mfa, IMSG_SMTP_REQ_EOM, 0, 0, -1); - m_add_id(p_mfa, s->id); - m_add_u32(p_mfa, s->datalen); - m_close(p_mfa); - smtp_wait_mfa(s, IMSG_SMTP_REQ_EOM); + smtp_filter_eom(s); return; } @@ -1047,12 +1030,7 @@ smtp_command(struct smtp_session *s, char *line) smtp_message_reset(s, 1); - m_create(p_mfa, IMSG_SMTP_REQ_HELO, 0, 0, -1); - m_add_id(p_mfa, s->id); - m_add_string(p_mfa, s->helo); - m_close(p_mfa); - smtp_wait_mfa(s, IMSG_SMTP_REQ_HELO); - + smtp_filter_helo(s); break; /* * SETUP @@ -1181,11 +1159,7 @@ smtp_command(struct smtp_session *s, char *line) if (args && smtp_parse_mail_args(s, args) == -1) break; - m_create(p_mfa, IMSG_SMTP_REQ_MAIL, 0, 0, -1); - m_add_id(p_mfa, s->id); - m_add_mailaddr(p_mfa, &s->evp.sender); - m_close(p_mfa); - smtp_wait_mfa(s, IMSG_SMTP_REQ_MAIL); + smtp_filter_mail(s); break; /* * TRANSACTION @@ -1215,11 +1189,7 @@ smtp_command(struct smtp_session *s, char *line) if (args && smtp_parse_rcpt_args(s, args) == -1) break; - m_create(p_mfa, IMSG_SMTP_REQ_RCPT, 0, 0, -1); - m_add_id(p_mfa, s->id); - m_add_mailaddr(p_mfa, &s->evp.rcpt); - m_close(p_mfa); - smtp_wait_mfa(s, IMSG_SMTP_REQ_RCPT); + smtp_filter_rcpt(s); break; case CMD_RSET: @@ -1230,9 +1200,7 @@ smtp_command(struct smtp_session *s, char *line) break; } - m_create(p_mfa, IMSG_SMTP_EVENT_RSET, 0, 0, -1); - m_add_id(p_mfa, s->id); - m_close(p_mfa); + smtp_filter_rset(s); if (s->evp.id) { m_create(p_queue, IMSG_SMTP_MESSAGE_ROLLBACK, 0, 0, -1); @@ -1260,10 +1228,7 @@ smtp_command(struct smtp_session *s, char *line) break; } - m_create(p_mfa, IMSG_SMTP_REQ_DATA, 0, 0, -1); - m_add_id(p_mfa, s->id); - m_close(p_mfa); - smtp_wait_mfa(s, IMSG_SMTP_REQ_DATA); + smtp_filter_data(s); break; /* * ANY @@ -1549,14 +1514,8 @@ smtp_connected(struct smtp_session *s) return; } - m_create(p_mfa, IMSG_SMTP_REQ_CONNECT, 0, 0, -1); - m_add_id(p_mfa, s->id); - m_add_sockaddr(p_mfa, (struct sockaddr *)&ss); - m_add_sockaddr(p_mfa, (struct sockaddr *)&s->ss); - m_add_string(p_mfa, s->hostname); - m_close(p_mfa); s->flags |= SF_MFACONNSENT; - smtp_wait_mfa(s, IMSG_SMTP_REQ_CONNECT); + smtp_filter_connect(s, (struct sockaddr *)&ss); } static void @@ -1706,13 +1665,6 @@ smtp_reply(struct smtp_session *s, char *fmt, ...) } static void -smtp_wait_mfa(struct smtp_session *s, int type) -{ - s->mfa_imsg = type; - tree_xset(&wait_mfa_response, s->id, s); -} - -static void smtp_free(struct smtp_session *s, const char * reason) { struct smtp_rcpt *rcpt; @@ -1720,7 +1672,6 @@ smtp_free(struct smtp_session *s, const char * reason) log_debug("debug: smtp: %p: deleting session: %s", s, reason); tree_pop(&wait_mfa_data, s->id); - tree_pop(&wait_mfa_response, s->id); if (s->ofile) fclose(s->ofile); @@ -1731,11 +1682,8 @@ smtp_free(struct smtp_session *s, const char * reason) m_close(p_queue); } - if (s->flags & SF_MFACONNSENT) { - m_create(p_mfa, IMSG_SMTP_EVENT_DISCONNECT, 0, 0, -1); - m_add_id(p_mfa, s->id); - m_close(p_mfa); - } + if (s->flags & SF_MFACONNSENT) + smtp_filter_disconnect(s); if (s->flags & SF_SECURE && s->listener->flags & F_SMTPS) stat_decrement("smtp.smtps", 1); @@ -1928,6 +1876,61 @@ smtp_sni_callback(SSL *ssl, int *ad, void *arg) return SSL_TLSEXT_ERR_OK; } +static void +smtp_filter_rset(struct smtp_session *s) +{ +} + +static void +smtp_filter_commit(struct smtp_session *s) +{ +} + +static void +smtp_filter_rollback(struct smtp_session *s) +{ +} + +static void +smtp_filter_disconnect(struct smtp_session *s) +{ +} + +static void +smtp_filter_connect(struct smtp_session *s, struct sockaddr *sa) +{ + smtp_mfa_response(s, IMSG_SMTP_REQ_CONNECT, MFA_OK, 0, NULL); +} + +static void +smtp_filter_eom(struct smtp_session *s) +{ + smtp_mfa_response(s, IMSG_SMTP_REQ_EOM, MFA_OK, 0, NULL); +} + +static void +smtp_filter_helo(struct smtp_session *s) +{ + smtp_mfa_response(s, IMSG_SMTP_REQ_HELO, MFA_OK, 0, NULL); +} + +static void +smtp_filter_mail(struct smtp_session *s) +{ + smtp_mfa_response(s, IMSG_SMTP_REQ_MAIL, MFA_OK, 0, NULL); +} + +static void +smtp_filter_rcpt(struct smtp_session *s) +{ + smtp_mfa_response(s, IMSG_SMTP_REQ_RCPT, MFA_OK, 0, NULL); +} + +static void +smtp_filter_data(struct smtp_session *s) +{ + smtp_mfa_response(s, IMSG_SMTP_REQ_DATA, MFA_OK, 0, NULL); +} #define CASE(x) case x : return #x @@ -1,4 +1,4 @@ -/* $OpenBSD: smtpd.c,v 1.218 2014/04/04 16:10:42 eric Exp $ */ +/* $OpenBSD: smtpd.c,v 1.219 2014/04/09 18:55:19 eric Exp $ */ /* * Copyright (c) 2008 Gilles Chehade <gilles@poolp.org> @@ -57,7 +57,6 @@ static void usage(void); static void parent_shutdown(int); static void parent_send_config(int, short, void *); static void parent_send_config_lka(void); -static void parent_send_config_mfa(void); static void parent_send_config_pony(void); static void parent_sig_handler(int, short, void *); static void forkmda(struct mproc *, uint64_t, struct deliver *); @@ -118,7 +117,6 @@ struct smtpd *env = NULL; struct mproc *p_control = NULL; struct mproc *p_lka = NULL; -struct mproc *p_mfa = NULL; struct mproc *p_parent = NULL; struct mproc *p_queue = NULL; struct mproc *p_scheduler = NULL; @@ -235,7 +233,6 @@ parent_imsg(struct mproc *p, struct imsg *imsg) m_end(&m); log_verbose(v); m_forward(p_lka, imsg); - m_forward(p_mfa, imsg); m_forward(p_queue, imsg); m_forward(p_pony, imsg); return; @@ -319,7 +316,6 @@ static void parent_send_config(int fd, short event, void *p) { parent_send_config_lka(); - parent_send_config_mfa(); parent_send_config_pony(); purge_config(PURGE_PKI); } @@ -333,14 +329,6 @@ parent_send_config_pony(void) } void -parent_send_config_mfa() -{ - log_debug("debug: parent_send_config_mfa: reloading"); - m_compose(p_mfa, IMSG_CONF_START, 0, 0, -1, NULL, 0); - m_compose(p_mfa, IMSG_CONF_END, 0, 0, -1, NULL, 0); -} - -void parent_send_config_lka() { log_debug("debug: parent_send_config_ruleset: reloading"); @@ -659,7 +647,6 @@ main(int argc, char *argv[]) config_peer(PROC_CONTROL); config_peer(PROC_LKA); - config_peer(PROC_MFA); config_peer(PROC_QUEUE); config_peer(PROC_PONY); config_done(); @@ -725,7 +712,6 @@ fork_peers(void) child_add(queue(), CHILD_DAEMON, proc_title(PROC_QUEUE)); child_add(control(), CHILD_DAEMON, proc_title(PROC_CONTROL)); child_add(lka(), CHILD_DAEMON, proc_title(PROC_LKA)); - child_add(mfa(), CHILD_DAEMON, proc_title(PROC_MFA)); child_add(scheduler(), CHILD_DAEMON, proc_title(PROC_SCHEDULER)); child_add(pony(), CHILD_DAEMON, proc_title(PROC_PONY)); post_fork(PROC_PARENT); @@ -1210,8 +1196,6 @@ proc_title(enum smtp_proc_type proc) switch (proc) { case PROC_PARENT: return "[priv]"; - case PROC_MFA: - return "filter"; case PROC_LKA: return "lookup"; case PROC_QUEUE: @@ -1233,8 +1217,6 @@ proc_name(enum smtp_proc_type proc) switch (proc) { case PROC_PARENT: return "parent"; - case PROC_MFA: - return "mfa"; case PROC_LKA: return "lka"; case PROC_QUEUE: @@ -1428,10 +1410,6 @@ parent_broadcast_verbose(uint32_t v) m_add_int(p_pony, v); m_close(p_pony); - m_create(p_mfa, IMSG_CTL_VERBOSE, 0, 0, -1); - m_add_int(p_mfa, v); - m_close(p_mfa); - m_create(p_queue, IMSG_CTL_VERBOSE, 0, 0, -1); m_add_int(p_queue, v); m_close(p_queue); @@ -1448,10 +1426,6 @@ parent_broadcast_profile(uint32_t v) m_add_int(p_pony, v); m_close(p_pony); - m_create(p_mfa, IMSG_CTL_PROFILE, 0, 0, -1); - m_add_int(p_mfa, v); - m_close(p_mfa); - m_create(p_queue, IMSG_CTL_PROFILE, 0, 0, -1); m_add_int(p_queue, v); m_close(p_queue); @@ -1,4 +1,4 @@ -/* $OpenBSD: smtpd.h,v 1.453 2014/04/09 12:47:23 eric Exp $ */ +/* $OpenBSD: smtpd.h,v 1.454 2014/04/09 18:55:19 eric Exp $ */ /* * Copyright (c) 2008 Gilles Chehade <gilles@poolp.org> @@ -31,7 +31,7 @@ #define MAILNAME_FILE "/etc/mail/mailname" #define CA_FILE "/etc/ssl/cert.pem" -#define PROC_COUNT 7 +#define PROC_COUNT 6 #define MAX_HOPS_COUNT 100 #define DEFAULT_MAX_BODY_SIZE (35*1024*1024) @@ -293,7 +293,6 @@ enum blockmodes { enum smtp_proc_type { PROC_PARENT = 0, - PROC_MFA, PROC_LKA, PROC_QUEUE, PROC_CONTROL, @@ -973,7 +972,6 @@ extern int profiling; extern struct mproc *p_control; extern struct mproc *p_parent; extern struct mproc *p_lka; -extern struct mproc *p_mfa; extern struct mproc *p_queue; extern struct mproc *p_scheduler; extern struct mproc *p_pony; diff --git a/smtpd/Makefile b/smtpd/Makefile index 23dcb8de..4f6e2c6c 100644 --- a/smtpd/Makefile +++ b/smtpd/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.72 2014/04/04 16:10:42 eric Exp $ +# $OpenBSD: Makefile,v 1.73 2014/04/09 18:55:19 eric Exp $ .PATH: ${.CURDIR}/.. @@ -7,7 +7,7 @@ PROG= smtpd SRCS= aliases.c bounce.c ca.c compress_backend.c config.c \ control.c crypto.c delivery.c dict.c dns.c envelope.c esc.c \ expand.c forward.c iobuf.c ioev.c limit.c lka.c lka_session.c \ - log.c mda.c mfa.c mfa_session.c mproc.c \ + log.c mda.c mproc.c \ mta.c mta_session.c parse.y pony.c queue.c queue_backend.c \ ruleset.c runq.c scheduler.c scheduler_backend.c \ smtp.c smtp_session.c smtpd.c ssl.c ssl_privsep.c \ |