commit a05d5c54d90ccfd3cd7f8a9fed2ecedae149bc74 from: Martijn van Duren date: Wed Aug 28 16:32:42 2019 UTC Add support for greeting banner commit - 183acf206b8693212cbce187915c05172ed56615 commit + a05d5c54d90ccfd3cd7f8a9fed2ecedae149bc74 blob - fa7206abe42133da80b85f141b971786f4572e40 blob + acc026b2c8062c0edb9a7bf98b3f4df11c76d6e0 --- opensmtpd.c +++ opensmtpd.c @@ -71,6 +71,8 @@ static void osmtpd_link_connect(struct osmtpd_callback char *, char *); static void osmtpd_link_disconnect(struct osmtpd_callback *, struct osmtpd_ctx *, char *, char *); +static void osmtpd_link_greeting(struct osmtpd_callback *, struct osmtpd_ctx *, + char *, char *); static void osmtpd_link_identify(struct osmtpd_callback *, struct osmtpd_ctx *, char *, char *); static void osmtpd_link_tls(struct osmtpd_callback *, struct osmtpd_ctx *, @@ -253,6 +255,15 @@ static struct osmtpd_callback osmtpd_callbacks[] = { }, { OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_LINK_GREETING, + 1, + osmtpd_link_greeting, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, OSMTPD_PHASE_LINK_IDENTIFY, 1, osmtpd_link_identify, @@ -388,6 +399,15 @@ static struct osmtpd_callback osmtpd_callbacks[] = { }, { OSMTPD_TYPE_REPORT, + OSMTPD_PHASE_LINK_GREETING, + 0, + osmtpd_link_greeting, + NULL, + 0, + 0 + }, + { + OSMTPD_TYPE_REPORT, OSMTPD_PHASE_LINK_IDENTIFY, 0, osmtpd_link_identify, @@ -826,7 +846,10 @@ osmtpd_register_need(int incoming) OSMTPD_NEED_FCRDNS)) osmtpd_register(OSMTPD_TYPE_REPORT, OSMTPD_PHASE_LINK_CONNECT, incoming, 1, NULL); - if (needs & OSMTPD_NEED_IDENTITY) + if (needs & OSMTPD_NEED_SIDENTITY) + osmtpd_register(OSMTPD_TYPE_REPORT, OSMTPD_PHASE_LINK_GREETING, + incoming, 1, NULL); + if (needs & OSMTPD_NEED_CIDENTITY) osmtpd_register(OSMTPD_TYPE_REPORT, OSMTPD_PHASE_LINK_IDENTIFY, incoming, 1, NULL); if (needs & OSMTPD_NEED_CIPHERS) @@ -1074,7 +1097,8 @@ osmtpd_newline(struct io *io, int ev, void *arg) ctx->ctx.reqid = search.ctx.reqid; ctx->ctx.rdns = NULL; ctx->ctx.fcrdns = OSMTPD_STATUS_TEMPFAIL; - ctx->ctx.identity = NULL; + ctx->ctx.sidentity = NULL; + ctx->ctx.cidentity = NULL; ctx->ctx.ciphers = NULL; ctx->ctx.msgid = 0; ctx->ctx.mailfrom = NULL; @@ -1246,7 +1270,8 @@ osmtpd_link_disconnect(struct osmtpd_callback *cb, str if (ondeletecb_session != NULL) ondeletecb_session(ctx, session->ctx.local_session); free(session->ctx.rdns); - free(session->ctx.identity); + free(session->ctx.sidentity); + free(session->ctx.cidentity); free(session->ctx.ciphers); free(session->ctx.mailfrom); for (i = 0; session->ctx.rcptto[i] != NULL; i++) @@ -1257,13 +1282,28 @@ osmtpd_link_disconnect(struct osmtpd_callback *cb, str } static void +osmtpd_link_greeting(struct osmtpd_callback *cb, struct osmtpd_ctx *ctx, + char *identity, char *linedup) +{ + void (*f)(struct osmtpd_ctx *, const char *); + + if (cb->storereport) { + if ((ctx->sidentity = strdup(identity)) == NULL) + osmtpd_err(1, NULL); + } + + if ((f = cb->cb) != NULL) + f(ctx, identity); +} + +static void osmtpd_link_identify(struct osmtpd_callback *cb, struct osmtpd_ctx *ctx, char *identity, char *linedup) { void (*f)(struct osmtpd_ctx *, const char *); if (cb->storereport) { - if ((ctx->identity = strdup(identity)) == NULL) + if ((ctx->sidentity = strdup(identity)) == NULL) osmtpd_err(1, NULL); } @@ -1807,6 +1847,8 @@ osmtpd_phasetostr(enum osmtpd_phase phase) return "link-connect"; case OSMTPD_PHASE_LINK_DISCONNECT: return "link-disconnect"; + case OSMTPD_PHASE_LINK_GREETING: + return "link-greeting"; case OSMTPD_PHASE_LINK_IDENTIFY: return "link-identify"; case OSMTPD_PHASE_LINK_TLS: blob - a4cb221b9c7c93fe14f90027a2a6c9956e8b054b blob + 519ed35c1c7fb5cb1295773908cee7bd15b9a73f --- opensmtpd.h +++ opensmtpd.h @@ -44,6 +44,7 @@ enum osmtpd_phase { OSMTPD_PHASE_COMMIT, OSMTPD_PHASE_LINK_CONNECT, OSMTPD_PHASE_LINK_DISCONNECT, + OSMTPD_PHASE_LINK_GREETING, OSMTPD_PHASE_LINK_IDENTIFY, OSMTPD_PHASE_LINK_TLS, OSMTPD_PHASE_TX_BEGIN, @@ -63,12 +64,13 @@ enum osmtpd_phase { #define OSMTPD_NEED_DST 1 << 1 #define OSMTPD_NEED_RDNS 1 << 2 #define OSMTPD_NEED_FCRDNS 1 << 3 -#define OSMTPD_NEED_IDENTITY 1 << 4 -#define OSMTPD_NEED_CIPHERS 1 << 5 -#define OSMTPD_NEED_MSGID 1 << 6 -#define OSMTPD_NEED_MAILFROM 1 << 7 -#define OSMTPD_NEED_RCPTTO 1 << 8 -#define OSMTPD_NEED_EVPID 1 << 9 +#define OSMTPD_NEED_SIDENTITY 1 << 4 +#define OSMTPD_NEED_CIDENTITY 1 << 5 +#define OSMTPD_NEED_CIPHERS 1 << 6 +#define OSMTPD_NEED_MSGID 1 << 7 +#define OSMTPD_NEED_MAILFROM 1 << 8 +#define OSMTPD_NEED_RCPTTO 1 << 9 +#define OSMTPD_NEED_EVPID 1 << 10 struct osmtpd_ctx { enum osmtpd_type type; @@ -83,7 +85,9 @@ struct osmtpd_ctx { struct sockaddr_storage dst; char *rdns; enum osmtpd_status fcrdns; - char *identity; + char *domain; + char *sidentity; + char *cidentity; char *ciphers; uint32_t msgid; char *mailfrom; @@ -115,6 +119,8 @@ void osmtpd_register_report_connect(int, void (*)(stru const char *, enum osmtpd_status, struct sockaddr_storage *, struct sockaddr_storage *)); void osmtpd_register_report_disconnect(int, void (*)(struct osmtpd_ctx *)); +void osmtpd_register_report_greeting(int, void (*)(struct osmtpd_ctx *, + const char *)); void osmtpd_register_report_identify(int, void (*)(struct osmtpd_ctx *, const char *)); void osmtpd_register_report_tls(int, void (*)(struct osmtpd_ctx *,