Commit Diff


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 *,