commit - 183acf206b8693212cbce187915c05172ed56615
commit + a05d5c54d90ccfd3cd7f8a9fed2ecedae149bc74
blob - fa7206abe42133da80b85f141b971786f4572e40
blob + acc026b2c8062c0edb9a7bf98b3f4df11c76d6e0
--- opensmtpd.c
+++ opensmtpd.c
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 *,
},
{
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,
},
{
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,
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)
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;
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++)
}
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);
}
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
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,
#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;
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;
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 *,