From 8b77bc6a233b9a7ab069c68e75dc140af7a7e539 Mon Sep 17 00:00:00 2001 From: manuel Date: Wed, 6 Feb 2013 00:42:40 +0100 Subject: [PATCH] qmail-1.03-r17-greetdelay --- qmail-smtpd.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'qmail-smtpd.c') diff --git a/qmail-smtpd.c b/qmail-smtpd.c index 9fb495b..76cedcb 100644 --- a/qmail-smtpd.c +++ b/qmail-smtpd.c @@ -44,6 +44,8 @@ int spp_val; #define MAXHOPS 100 unsigned int databytes = 0; unsigned int mfchk = 0; +unsigned int greetdelay = 0; +unsigned int drop_pre_greet = 0; int timeout = 1200; const char *protocol = "SMTP"; @@ -134,6 +136,7 @@ void straynewline() out("451 See http://pobox.com/~djb/docs/smtplf.html.\r\n"); flush(); eflush(); _exit(1); } +void die_pre_greet() { out("554 SMTP protocol violation\r\n"); flush(); _exit(1); } void err_size() { out("552 sorry, that message size exceeds my databytes limit (#5.3.4)\r\n"); } void err_bmf() { out("553 sorry, your envelope sender has been denied (#5.7.1)\r\n"); } @@ -286,6 +289,11 @@ void setup() if (x) { scan_ulong(x,&u); databytes = u; } if (!(databytes + 1)) --databytes; + x = env_get("GREETDELAY"); + if (x) { scan_ulong(x, &u); greetdelay = u; } + x = env_get("DROP_PRE_GREET"); + if (x) { scan_ulong(x, &u); drop_pre_greet = u; } + remoteip = env_get("TCPREMOTEIP"); if (!remoteip) remoteip = "unknown"; local = env_get("TCPLOCALHOST"); @@ -1331,12 +1339,40 @@ void main(argc,argv) int argc; char **argv; { + int n, m; childargs = argv + 1; sig_pipeignore(); if (chdir(auto_qmail) == -1) die_control(); setup(); if (ipme_init() != 1) die_ipme(); if (spp_connect()) { + if (!relayclient && greetdelay) { + if (drop_pre_greet) { + n = timeoutread(greetdelay ? greetdelay : 1, 0, ssinbuf, sizeof(ssinbuf)); + if(n == -1) { + if (errno != error_timeout) + strerr_die3sys(1, "GREETDELAY from ", remoteip, ": "); + } else if (n == 0) { + strerr_die3x(1, "GREETDELAY from ", remoteip, ": client disconnected"); + } else { + strerr_warn3("GREETDELAY from ", remoteip, ": client sent data before greeting", 0); + die_pre_greet(); + } + } + else { + sleep(greetdelay); + m = 0; + for (;;) { + n = timeoutread(0, 0, ssinbuf, sizeof(ssinbuf)); + if (n <= 0) + break; + if (n > 0 && m == 0) { + strerr_warn3("GREETDELAY from ", remoteip, ": client sent data before greeting. ignoring", 0); + m = 1; + } + } + } + } smtp_greet("220 "); out(" ESMTP\r\n"); } -- cgit v1.2.3