Download | Plain Text | No Line Numbers


  1. --- qmail-smtpd.c.orig 2006-12-31 02:11:02.000000000 +0100
  2. +++ qmail-smtpd.c 2006-12-31 02:35:31.000000000 +0100
  3. @@ -44,6 +44,8 @@
  4. #define MAXHOPS 100
  5. unsigned int databytes = 0;
  6. unsigned int mfchk = 0;
  7. +unsigned int greetdelay = 0;
  8. +unsigned int drop_pre_greet = 0;
  9. int timeout = 1200;
  10.  
  11. const char *protocol = "SMTP";
  12. @@ -134,6 +136,7 @@
  13. out("451 See http://pobox.com/~djb/docs/smtplf.html.\r\n"); flush();
  14. eflush(); _exit(1);
  15. }
  16. +void die_pre_greet() { out("554 SMTP protocol violation\r\n"); flush(); _exit(1); }
  17.  
  18. void err_size() { out("552 sorry, that message size exceeds my databytes limit (#5.3.4)\r\n"); }
  19. void err_bmf() { out("553 sorry, your envelope sender has been denied (#5.7.1)\r\n"); }
  20. @@ -282,6 +285,11 @@
  21. if (x) { scan_ulong(x,&u); databytes = u; }
  22. if (!(databytes + 1)) --databytes;
  23.  
  24. + x = env_get("GREETDELAY");
  25. + if (x) { scan_ulong(x, &u); greetdelay = u; }
  26. + x = env_get("DROP_PRE_GREET");
  27. + if (x) { scan_ulong(x, &u); drop_pre_greet = u; }
  28. +
  29. remoteip = env_get("TCPREMOTEIP");
  30. if (!remoteip) remoteip = "unknown";
  31. local = env_get("TCPLOCALHOST");
  32. @@ -1308,12 +1316,40 @@
  33. int argc;
  34. char **argv;
  35. {
  36. + int n, m;
  37. childargs = argv + 1;
  38. sig_pipeignore();
  39. if (chdir(auto_qmail) == -1) die_control();
  40. setup();
  41. if (ipme_init() != 1) die_ipme();
  42. if (spp_connect()) {
  43. + if (!relayclient && greetdelay) {
  44. + if (drop_pre_greet) {
  45. + n = timeoutread(greetdelay ? greetdelay : 1, 0, ssinbuf, sizeof(ssinbuf));
  46. + if(n == -1) {
  47. + if (errno != error_timeout)
  48. + strerr_die3sys(1, "GREETDELAY from ", remoteip, ": ");
  49. + } else if (n == 0) {
  50. + strerr_die3x(1, "GREETDELAY from ", remoteip, ": client disconnected");
  51. + } else {
  52. + strerr_warn3("GREETDELAY from ", remoteip, ": client sent data before greeting", 0);
  53. + die_pre_greet();
  54. + }
  55. + }
  56. + else {
  57. + sleep(greetdelay);
  58. + m = 0;
  59. + for (;;) {
  60. + n = timeoutread(0, 0, ssinbuf, sizeof(ssinbuf));
  61. + if (n <= 0)
  62. + break;
  63. + if (n > 0 && m == 0) {
  64. + strerr_warn3("GREETDELAY from ", remoteip, ": client sent data before greeting. ignoring", 0);
  65. + m = 1;
  66. + }
  67. + }
  68. + }
  69. + }
  70. smtp_greet("220 ");
  71. out(" ESMTP\r\n");
  72. }
  73.