Download | Plain Text | Line Numbers
--- qmail-smtpd.c.orig 2006-12-31 02:11:02.000000000 +0100
+++ qmail-smtpd.c 2006-12-31 02:35:31.000000000 +0100
@@ -44,6 +44,8 @@
#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 @@
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"); }
@@ -282,6 +285,11 @@
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");
@@ -1308,12 +1316,40 @@
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");
}