commit - 681d8d4923321c8caf195fd32a7682c98b61ec07
commit + 58a6bc69bbda6ff4b5c1ec0b918afb31d42b4e10
blob - a73487daca0c4c739ebea7f7c7267d404b7fcdd1
blob + 648038bd9c9ec155da670cfb9e07c6b8c3565c09
--- Symbols.list
+++ Symbols.list
osmtpd_register_report_disconnect
osmtpd_register_report_identify
osmtpd_register_report_tls
+osmtpd_register_report_auth
osmtpd_register_report_begin
osmtpd_register_report_mail
osmtpd_register_report_rcpt
blob - 71b0691f55d1ae2f533b94e0f027e22cf510c52e
blob + 4d551f0f161ea841d896117f7a9a8521263adc7e
--- opensmtpd.c
+++ opensmtpd.c
static void osmtpd_link_identify(struct osmtpd_callback *, struct osmtpd_ctx *,
char *, char *);
static void osmtpd_link_tls(struct osmtpd_callback *, struct osmtpd_ctx *,
+ char *, char *);
+static void osmtpd_link_auth(struct osmtpd_callback *, struct osmtpd_ctx *,
char *, char *);
static void osmtpd_tx_begin(struct osmtpd_callback *, struct osmtpd_ctx *,
char *, char *);
},
{
OSMTPD_TYPE_REPORT,
+ OSMTPD_PHASE_LINK_AUTH,
+ 1,
+ osmtpd_link_auth,
+ NULL,
+ 0,
+ 0
+ },
+ {
+ OSMTPD_TYPE_REPORT,
OSMTPD_PHASE_TX_BEGIN,
1,
osmtpd_tx_begin,
},
{
OSMTPD_TYPE_REPORT,
+ OSMTPD_PHASE_LINK_AUTH,
+ 0,
+ osmtpd_link_auth,
+ NULL,
+ 0,
+ 0
+ },
+ {
+ OSMTPD_TYPE_REPORT,
OSMTPD_PHASE_TX_BEGIN,
0,
osmtpd_tx_begin,
}
void
+osmtpd_register_report_auth(int incoming, void (*cb)(struct osmtpd_ctx *,
+ const char *, enum osmtpd_auth_status))
+{
+ osmtpd_register(OSMTPD_TYPE_REPORT, OSMTPD_PHASE_LINK_AUTH, incoming, 0,
+ (void *)cb);
+ osmtpd_register(OSMTPD_TYPE_REPORT, OSMTPD_PHASE_LINK_DISCONNECT,
+ incoming, 0, NULL);
+}
+
+void
osmtpd_register_report_begin(int incoming, void (*cb)(struct osmtpd_ctx *,
uint32_t))
{
incoming, 1, NULL);
if (needs & OSMTPD_NEED_CIPHERS)
osmtpd_register(OSMTPD_TYPE_REPORT, OSMTPD_PHASE_LINK_TLS,
+ incoming, 1, NULL);
+ if (needs & OSMTPD_NEED_USERNAME)
+ osmtpd_register(OSMTPD_TYPE_REPORT, OSMTPD_PHASE_LINK_AUTH,
incoming, 1, NULL);
if (needs & OSMTPD_NEED_MSGID) {
osmtpd_register(OSMTPD_TYPE_REPORT, OSMTPD_PHASE_TX_BEGIN,
ctx->ctx.greeting.identity = NULL;
ctx->ctx.ciphers = NULL;
ctx->ctx.msgid = 0;
+ ctx->ctx.username = NULL;
ctx->ctx.mailfrom = NULL;
ctx->ctx.rcptto = malloc(sizeof(*(ctx->ctx.rcptto)));
if (ctx->ctx.rcptto == NULL)
free(session->ctx.identity);
free(session->ctx.greeting.identity);
free(session->ctx.ciphers);
+ free(session->ctx.username);
free(session->ctx.mailfrom);
for (i = 0; session->ctx.rcptto[i] != NULL; i++)
free(session->ctx.rcptto[i]);
}
static void
+osmtpd_link_auth(struct osmtpd_callback *cb, struct osmtpd_ctx *ctx,
+ char *username, char *linedup)
+{
+ void (*f)(struct osmtpd_ctx *, const char *, enum osmtpd_auth_status);
+ char *status;
+ enum osmtpd_auth_status s;
+
+ if ((status = strrchr(username, '|')) == NULL)
+ osmtpd_errx(1, "Invalid auth received: %s", linedup);
+ status[0] = '\0';
+ status++;
+ if (strcmp(status, "pass") == 0)
+ s = OSMTPD_AUTH_PASS;
+ else if (strcmp(status, "fail") == 0)
+ s = OSMTPD_AUTH_FAIL;
+ else if (strcmp(status, "error") == 0)
+ s = OSMTPD_AUTH_ERROR;
+ else
+ osmtpd_errx(1, "Invalid auth status received: %s", linedup);
+
+ if (cb->storereport && s == OSMTPD_AUTH_PASS) {
+ if ((ctx->username = strdup(username)) == NULL)
+ osmtpd_err(1, NULL);
+ }
+
+ if ((f = cb->cb) != NULL)
+ f(ctx, username, s);
+}
+
+static void
osmtpd_tx_begin(struct osmtpd_callback *cb, struct osmtpd_ctx *ctx,
char *msgid, char *linedup)
{
return OSMTPD_PHASE_LINK_IDENTIFY;
if (strcmp(phase, "link-tls") == 0)
return OSMTPD_PHASE_LINK_TLS;
+ if (strcmp(phase, "link-auth") == 0)
+ return OSMTPD_PHASE_LINK_AUTH;
if (strcmp(phase, "tx-begin") == 0)
return OSMTPD_PHASE_TX_BEGIN;
if (strcmp(phase, "tx-mail") == 0)
return "link-identify";
case OSMTPD_PHASE_LINK_TLS:
return "link-tls";
+ case OSMTPD_PHASE_LINK_AUTH:
+ return "link-auth";
case OSMTPD_PHASE_TX_BEGIN:
return "tx-begin";
case OSMTPD_PHASE_TX_MAIL:
blob - eef32374977851e19c0518f7be2c250d9ff3fa10
blob + dc06d018816c18df0c231914fd9c582c9db0c7cd
--- opensmtpd.h
+++ opensmtpd.h
OSMTPD_STATUS_PERMFAIL
};
+enum osmtpd_auth_status {
+ OSMTPD_AUTH_PASS,
+ OSMTPD_AUTH_FAIL,
+ OSMTPD_AUTH_ERROR,
+};
+
enum osmtpd_type {
OSMTPD_TYPE_FILTER,
OSMTPD_TYPE_REPORT
OSMTPD_PHASE_LINK_GREETING,
OSMTPD_PHASE_LINK_IDENTIFY,
OSMTPD_PHASE_LINK_TLS,
+ OSMTPD_PHASE_LINK_AUTH,
OSMTPD_PHASE_TX_BEGIN,
OSMTPD_PHASE_TX_MAIL,
OSMTPD_PHASE_TX_RCPT,
#define OSMTPD_NEED_GREETING 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
+#define OSMTPD_NEED_USERNAME 1 << 8
+#define OSMTPD_NEED_MAILFROM 1 << 9
+#define OSMTPD_NEED_RCPTTO 1 << 10
+#define OSMTPD_NEED_EVPID 1 << 11
struct osmtpd_ctx {
enum osmtpd_type type;
} greeting;
char *ciphers;
uint32_t msgid;
+ char *username;
char *mailfrom;
char **rcptto;
uint64_t evpid;
const char *));
void osmtpd_register_report_tls(int, void (*)(struct osmtpd_ctx *,
const char *));
+void osmtpd_register_report_auth(int, void (*)(struct osmtpd_ctx *,
+ const char *, enum osmtpd_auth_status));
void osmtpd_register_report_begin(int, void (*)(struct osmtpd_ctx *, uint32_t));
void osmtpd_register_report_mail(int, void (*)(struct osmtpd_ctx *, uint32_t,
const char *, enum osmtpd_status));
blob - 8c9fbbbcbf4b5d16e859dea3b4825d86372684fe
blob + 5e9e8ca23ddbceca7c1a2c5a9600bd3475c324c6
--- osmtpd_run.3
+++ osmtpd_run.3
.Nm osmtpd_register_report_disconnect ,
.Nm osmtpd_register_report_identify ,
.Nm osmtpd_register_report_tls ,
+.Nm osmtpd_register_report_auth ,
.Nm osmtpd_register_report_begin ,
.Nm osmtpd_register_report_mail ,
.Nm osmtpd_register_report_rcpt ,
.Fo osmtpd_register_report_tls
.Fa "int incoming"
.Fa "void (*cb)(struct osmtpd_ctx *ctx, const char *ciphers)"
+.Fc
+.Ft void
+.Fo osmtpd_register_report_auth
+.Fa "int incoming"
+.Fa "void (*cb)(struct osmtpd_ctx *ctx, const char *username, enum osmtpd_auth_status status)"
.Fc
.Ft void
.Fo osmtpd_register_report_begin
.Nm osmtpd_register_report_identify
.It Dv OSMTPD_PHASE_LINK_TLS
.Nm osmtpd_register_report_tls
+.It Dv OSMTPD_PHASE_LINK_AUTH
+.Nm osmtpd_register_report_auth
.It Dv OSMTPD_PHASE_TX_BEGIN
.Nm osmtpd_register_report_begin
.It Dv OSMTPD_PHASE_TX_MAIL
.Nm osmtpd_local_message
and
.Va local_message .
+.It Vt char Va *username
+The username with which the session was successfully authenticated.
+.Nm osmtpd_need
+needs to be initialized with
+.DV OSMTPD_NEED_USERNAME .
+If not available or authentication failed is set to
+.Dv NULL .
.It Vt char Va *mailfrom
The envelope MAIL FROM address in the SMTP transaction.
.Nm osmtpd_need
blob - 3d7c908e43d641cb0dcddbee5df35d0ac5910b46
blob + 1edea46de912aea697c8369a973244bc7866c3e8
--- shlib_version
+++ shlib_version
-major=0
-minor=1
+major=1
+minor=0