Add $smtp_command_history variable
authorJeremy Harris <jgh146exb@wizmail.org>
Wed, 5 Jul 2017 13:30:05 +0000 (14:30 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Sun, 9 Jul 2017 15:23:24 +0000 (16:23 +0100)
doc/doc-docbook/spec.xfpt
doc/doc-txt/NewStuff
src/src/expand.c
src/src/functions.h
src/src/smtp_in.c
test/confs/0021
test/paniclog/0021
test/stderr/0021

index aab8c00d5ba8968d5072669ed23516a195d0c7f5..84540508f88978c25306be3f7a61fb3b673ba811 100644 (file)
@@ -12793,6 +12793,15 @@ argument, that is, the text that follows the command name, with leading white
 space removed. Following the introduction of &$smtp_command$&, this variable is
 somewhat redundant, but is retained for backwards compatibility.
 
+.new
+.vitem &$smtp_command_history$&
+.cindex SMTP "command history"
+.vindex "&$smtp_command_history$&"
+A comma-separated list (with no whitespace) of the most-recent SMTP commands
+received, in time-order left to right.  Only a limited number of commands
+are remembered.
+.wen
+
 .vitem &$smtp_count_at_connection_start$&
 .vindex "&$smtp_count_at_connection_start$&"
 This variable is set greater than zero only in processes spawned by the Exim
index 17fe1979ad350abdf651105a6d8f4b1ce3bff301..f3050a950fc1caea7c3a4d07013ea811ee9257c3 100644 (file)
@@ -41,6 +41,9 @@ Version 4.90
  9. New option modifier "no_check" for quota and quota_filecount
     appendfile transport.
 
+10. Variable $smtp_command_history returning a comma-sep list of recent
+    SMTP commands.
+
 
 Version 4.89
 ------------
index a064e34e462db5c90ff4064a03fffa2b7f74f3ba..4eb1818f10ab859e9b61a1c9908c2485b3d85626 100644 (file)
@@ -680,6 +680,7 @@ static var_entry var_table[] = {
   { "smtp_active_hostname", vtype_stringptr,  &smtp_active_hostname },
   { "smtp_command",        vtype_stringptr,   &smtp_cmd_buffer },
   { "smtp_command_argument", vtype_stringptr, &smtp_cmd_argument },
+  { "smtp_command_history", vtype_string_func, &smtp_cmd_hist },
   { "smtp_count_at_connection_start", vtype_int, &smtp_accept_count },
   { "smtp_notquit_reason", vtype_stringptr,   &smtp_notquit_reason },
   { "sn0",                 vtype_filter_int,  &filter_sn[0] },
index f7173576b435ff4d832db2deb10841436bfb55da..9c9caaf97d8fb23878c00c2f8df6d13e3b98c309 100644 (file)
@@ -394,6 +394,7 @@ extern int     sieve_interpret(uschar *, int, uschar *, uschar *, uschar *,
 extern void    sigalrm_handler(int);
 extern BOOL    smtp_buffered(void);
 extern void    smtp_closedown(uschar *);
+extern uschar *smtp_cmd_hist(void);
 extern int     smtp_connect(host_item *, int, uschar *, int,
                 transport_instance *);
 extern int     smtp_sock_connect(host_item *, int, int, uschar *,
index 92dbac4cee8bebcfa2df72e5cbdc4bd6764b8b3e..6296342672b238877e910064e1182ba0dca672ab 100644 (file)
@@ -1795,7 +1795,7 @@ for (i = 0; i < smtp_ch_index; i++)
   sep = US",";
   }
 
-if (s != NULL) s[ptr] = 0; else s = US"";
+if (s) s[ptr] = 0; else s = US"";
 log_write(0, LOG_MAIN, "no MAIL in SMTP connection from %s D=%s%s",
   host_and_ident(FALSE),
   readconf_printtime( (int) ((long)time(NULL) - (long)smtp_connection_start)),
@@ -1803,6 +1803,26 @@ log_write(0, LOG_MAIN, "no MAIL in SMTP connection from %s D=%s%s",
 }
 
 
+/* Return list of recent smtp commands */
+
+uschar *
+smtp_cmd_hist(void)
+{
+uschar * list = NULL;
+int size = 0, len = 0, i;
+
+for (i = smtp_ch_index; i < SMTP_HBUFF_SIZE; i++)
+  if (smtp_connection_had[i] != SCH_NONE)
+    list = string_append_listele(list, &size, &len, ',',
+      smtp_names[smtp_connection_had[i]]);
+for (i = 0; i < smtp_ch_index; i++)
+  list = string_append_listele(list, &size, &len, ',',
+    smtp_names[smtp_connection_had[i]]);
+return list ? list : US"";
+}
+
+
+
 
 /*************************************************
 *   Check HELO line and set sender_helo_name     *
index ae5a309b972e3ba0a57d1c184226ff1eaa8d52c6..cb057386eaed0306ec8a0f1f553c91cc88e313a6 100644 (file)
@@ -67,7 +67,7 @@ mail:
 rcpt:
   accept senders = +ok_senders
          sender_domains = +ok_sender_domains
-         logwrite = :panic: rcpt accepted
+         logwrite = :panic: rcpt accepted C=$smtp_command_history
 
 # ----- Routers -----
 
index dae415203d3ea35e0b1dae5228f667dddb18448a..d6e91d34677cadf60bd89d1cc1bd12c7b419d4cd 100644 (file)
@@ -1,6 +1,6 @@
-1999-03-02 09:44:33 rcpt accepted
-1999-03-02 09:44:33 rcpt accepted
+1999-03-02 09:44:33 rcpt accepted C=MAIL,MAIL,RCPT
+1999-03-02 09:44:33 rcpt accepted C=MAIL,MAIL,RCPT,RCPT
 1999-03-02 09:44:33 ACL "warn" with "message" setting found in a non-message (EHLO or HELO) ACL: cannot specify header lines here: message ignored
-1999-03-02 09:44:33 rcpt accepted
+1999-03-02 09:44:33 rcpt accepted C=MAIL,RCPT
 1999-03-02 09:44:33 ACL "warn" with "message" setting found in a non-message (EHLO or HELO) ACL: cannot specify header lines here: message ignored
-1999-03-02 09:44:33 rcpt accepted
+1999-03-02 09:44:33 rcpt accepted C=EHLO,MAIL,RCPT
index 7c5a79ee947a6dabf98781813d13da29ec36fda0..299cc4974fe9e8f7c312fb7655e46c4f8da6a619 100644 (file)
@@ -80,9 +80,10 @@ ok@test1 in "+ok_senders"? yes (matched "+ok_senders")
 check sender_domains = +ok_sender_domains
 test1 in "somewhere : test1 : test3"? yes (matched "test1")
 test1 in "+ok_sender_domains"? yes (matched "+ok_sender_domains")
-check logwrite = :panic: rcpt accepted
+check logwrite = :panic: rcpt accepted C=$smtp_command_history
+               = :panic: rcpt accepted C=MAIL,MAIL,RCPT
 LOG: PANIC
-  rcpt accepted
+  rcpt accepted C=MAIL,MAIL,RCPT
 accept: condition test succeeded in ACL "rcpt"
 end of ACL "rcpt": ACCEPT
 using ACL "rcpt"
@@ -94,9 +95,10 @@ ok@test1 in "+ok_senders"? yes (matched "+ok_senders" - cached)
 check sender_domains = +ok_sender_domains
 cached yes match for +ok_sender_domains
 test1 in "+ok_sender_domains"? yes (matched "+ok_sender_domains" - cached)
-check logwrite = :panic: rcpt accepted
+check logwrite = :panic: rcpt accepted C=$smtp_command_history
+               = :panic: rcpt accepted C=MAIL,MAIL,RCPT,RCPT
 LOG: PANIC
-  rcpt accepted
+  rcpt accepted C=MAIL,MAIL,RCPT,RCPT
 accept: condition test succeeded in ACL "rcpt"
 end of ACL "rcpt": ACCEPT
 LOG: smtp_connection MAIN
@@ -173,9 +175,10 @@ ok@test3 in "+ok_senders"? yes (matched "+ok_senders")
 check sender_domains = +ok_sender_domains
 test3 in "somewhere : test1 : test3"? yes (matched "test3")
 test3 in "+ok_sender_domains"? yes (matched "+ok_sender_domains")
-check logwrite = :panic: rcpt accepted
+check logwrite = :panic: rcpt accepted C=$smtp_command_history
+               = :panic: rcpt accepted C=MAIL,RCPT
 LOG: PANIC
-  rcpt accepted
+  rcpt accepted C=MAIL,RCPT
 accept: condition test succeeded in ACL "rcpt"
 end of ACL "rcpt": ACCEPT
 >>Headers added by MAIL or RCPT ACL:
@@ -197,4 +200,4 @@ LOG: smtp_connection MAIN
   SMTP connection from CALLER closed by QUIT
 >>>>>>>>>>>>>>>> Exim pid=pppp terminating with rc=0 >>>>>>>>>>>>>>>>
 1999-03-02 09:44:33 ACL "warn" with "message" setting found in a non-message (EHLO or HELO) ACL: cannot specify header lines here: message ignored
-1999-03-02 09:44:33 rcpt accepted
+1999-03-02 09:44:33 rcpt accepted C=EHLO,MAIL,RCPT