summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhilip Hazel <ph10@hermes.cam.ac.uk>2007-01-15 15:59:22 +0000
committerPhilip Hazel <ph10@hermes.cam.ac.uk>2007-01-15 15:59:22 +0000
commitb4ed4da0f525ab98c05797e15df0045e49ae3618 (patch)
tree14791744c4c09157336e91dcf2b4d994d2acdb9f /src
parentad26813496addda838a0512075cacd58dca01b30 (diff)
Added log selector +smtp_no_mail to log when no MAIL is issued (for
Tony).
Diffstat (limited to 'src')
-rw-r--r--src/src/daemon.c4
-rw-r--r--src/src/exim.c10
-rw-r--r--src/src/functions.h3
-rw-r--r--src/src/globals.c6
-rw-r--r--src/src/globals.h5
-rw-r--r--src/src/macros.h26
-rw-r--r--src/src/smtp_in.c106
-rw-r--r--src/src/version.c4
8 files changed, 149 insertions, 15 deletions
diff --git a/src/src/daemon.c b/src/src/daemon.c
index 7b84490e9..81c32020e 100644
--- a/src/src/daemon.c
+++ b/src/src/daemon.c
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/daemon.c,v 1.19 2007/01/08 10:50:17 ph10 Exp $ */
+/* $Cambridge: exim/src/src/daemon.c,v 1.20 2007/01/15 15:59:22 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -500,6 +500,7 @@ if (pid == 0)
if (!ok) /* Connection was dropped */
{
mac_smtp_fflush();
+ smtp_log_no_mail(); /* Log no mail if configured */
_exit(EXIT_SUCCESS);
}
if (message_id[0] == 0) continue; /* No message was accepted */
@@ -508,6 +509,7 @@ if (pid == 0)
{
mac_smtp_fflush();
search_tidyup();
+ smtp_log_no_mail(); /* Log no mail if configured */
_exit((rc == 0)? EXIT_SUCCESS : EXIT_FAILURE);
}
diff --git a/src/src/exim.c b/src/src/exim.c
index 5ed6e54e1..d33a04d03 100644
--- a/src/src/exim.c
+++ b/src/src/exim.c
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/exim.c,v 1.51 2007/01/08 10:50:18 ph10 Exp $ */
+/* $Cambridge: exim/src/src/exim.c,v 1.52 2007/01/15 15:59:22 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -4381,6 +4381,7 @@ if (host_checking)
if (!receive_msg(FALSE)) break;
}
}
+ smtp_log_no_mail();
exim_exit(EXIT_SUCCESS);
}
@@ -4636,10 +4637,15 @@ while (more)
if (message_id[0] == 0)
{
if (more) continue;
+ smtp_log_no_mail(); /* Log no mail if configured */
exim_exit(EXIT_FAILURE);
}
}
- else exim_exit((rc == 0)? EXIT_SUCCESS : EXIT_FAILURE);
+ else
+ {
+ smtp_log_no_mail(); /* Log no mail if configured */
+ exim_exit((rc == 0)? EXIT_SUCCESS : EXIT_FAILURE);
+ }
}
/* In the non-SMTP case, we have all the information from the command
diff --git a/src/src/functions.h b/src/src/functions.h
index 51ad1e062..f15142336 100644
--- a/src/src/functions.h
+++ b/src/src/functions.h
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/functions.h,v 1.32 2007/01/08 10:50:18 ph10 Exp $ */
+/* $Cambridge: exim/src/src/functions.h,v 1.33 2007/01/15 15:59:22 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -269,6 +269,7 @@ extern BOOL smtp_get_interface(uschar *, int, address_item *, BOOL *,
extern BOOL smtp_get_port(uschar *, address_item *, int *, uschar *);
extern int smtp_getc(void);
extern int smtp_handle_acl_fail(int, int, uschar *, uschar *);
+extern void smtp_log_no_mail(void);
extern void smtp_message_code(uschar **, int *, uschar **, uschar **);
extern BOOL smtp_read_response(smtp_inblock *, uschar *, int, int, int);
extern void smtp_respond(uschar *, int, BOOL, uschar *);
diff --git a/src/src/globals.c b/src/src/globals.c
index 23d6ac967..796104bc0 100644
--- a/src/src/globals.c
+++ b/src/src/globals.c
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/globals.c,v 1.61 2007/01/08 10:50:18 ph10 Exp $ */
+/* $Cambridge: exim/src/src/globals.c,v 1.62 2007/01/15 15:59:22 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -696,6 +696,7 @@ bit_table log_options[] = {
{ US"smtp_confirmation", LX_smtp_confirmation },
{ US"smtp_connection", L_smtp_connection },
{ US"smtp_incomplete_transaction", L_smtp_incomplete_transaction },
+ { US"smtp_no_mail", LX_smtp_no_mail },
{ US"smtp_protocol_error", L_smtp_protocol_error },
{ US"smtp_syntax_error", L_smtp_syntax_error },
{ US"subject", LX_subject },
@@ -1042,8 +1043,11 @@ uschar *smtp_banner = US"$smtp_active_hostname ESMTP "
"\0<---------------Space to patch smtp_banner->";
BOOL smtp_batched_input = FALSE;
BOOL smtp_check_spool_space = TRUE;
+int smtp_ch_index = 0;
uschar *smtp_cmd_argument = NULL;
uschar *smtp_cmd_buffer = NULL;
+time_t smtp_connection_start = 0;
+uschar smtp_connection_had[SMTP_HBUFF_SIZE];
int smtp_connect_backlog = 20;
double smtp_delay_mail = 0.0;
double smtp_delay_rcpt = 0.0;
diff --git a/src/src/globals.h b/src/src/globals.h
index e7e4913d4..2ea06dad9 100644
--- a/src/src/globals.h
+++ b/src/src/globals.h
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/globals.h,v 1.42 2007/01/08 10:50:18 ph10 Exp $ */
+/* $Cambridge: exim/src/src/globals.h,v 1.43 2007/01/15 15:59:22 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -628,8 +628,11 @@ extern uschar *smtp_active_hostname; /* Hostname for this message */
extern BOOL smtp_authenticated; /* Sending client has authenticated */
extern uschar *smtp_banner; /* Banner string (to be expanded) */
extern BOOL smtp_check_spool_space; /* TRUE to check SMTP SIZE value */
+extern int smtp_ch_index; /* Index in smtp_connection_had */
extern uschar *smtp_cmd_argument; /* For all SMTP commands */
extern uschar *smtp_cmd_buffer; /* SMTP command buffer */
+extern time_t smtp_connection_start; /* Start time of SMTP connection */
+extern uschar smtp_connection_had[]; /* Recent SMTP commands */
extern int smtp_connect_backlog; /* Max backlog permitted */
extern double smtp_delay_mail; /* Current MAIL delay */
extern double smtp_delay_rcpt; /* Current RCPT delay */
diff --git a/src/src/macros.h b/src/src/macros.h
index b7dfb591b..7b317e42d 100644
--- a/src/src/macros.h
+++ b/src/src/macros.h
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/macros.h,v 1.29 2007/01/08 10:50:18 ph10 Exp $ */
+/* $Cambridge: exim/src/src/macros.h,v 1.30 2007/01/15 15:59:22 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -127,6 +127,10 @@ enough to hold all the headers from a normal kind of message. */
#define LOG_BUFFER_SIZE 8192
+/* The size of the circular buffer that remembers recent SMTP commands */
+
+#define SMTP_HBUFF_SIZE 20
+
/* The initial size of a big buffer for use in various places. It gets put
into big_buffer_size and in some circumstances increased. It should be at least
as long as the maximum path length. */
@@ -383,11 +387,12 @@ set all the bits in a multi-word selector. */
#define LX_sender_on_delivery 0x80004000
#define LX_sender_verify_fail 0x80008000
#define LX_smtp_confirmation 0x80010000
-#define LX_subject 0x80020000
-#define LX_tls_certificate_verified 0x80040000
-#define LX_tls_cipher 0x80080000
-#define LX_tls_peerdn 0x80100000
-#define LX_unknown_in_list 0x80200000
+#define LX_smtp_no_mail 0x80020000
+#define LX_subject 0x80040000
+#define LX_tls_certificate_verified 0x80080000
+#define LX_tls_cipher 0x80100000
+#define LX_tls_peerdn 0x80200000
+#define LX_unknown_in_list 0x80400000
#define L_default (L_connection_reject | \
L_delay_delivery | \
@@ -691,6 +696,15 @@ local_scan.h */
#define LOG_CONFIG_FOR (256+128) /* Add " for" instead of ":\n" */
#define LOG_CONFIG_IN (512+128) /* Add " in line x[ of file y]" */
+/* SMTP command identifiers for the smtp_connection_had field that records the
+most recent SMTP commands. Must be kept in step with the list of names in
+smtp_in.c that is used for creating the smtp_no_mail logging action. SCH_NONE
+is "empty". */
+
+enum { SCH_NONE, SCH_AUTH, SCH_DATA, SCH_EHLO, SCH_ETRN, SCH_EXPN, SCH_HELO,
+ SCH_HELP, SCH_MAIL, SCH_NOOP, SCH_QUIT, SCH_RCPT, SCH_RSET, SCH_STARTTLS,
+ SCH_VRFY };
+
/* Returns from host_find_by{name,dns}() */
enum {
diff --git a/src/src/smtp_in.c b/src/src/smtp_in.c
index 7e80c6209..b1a1eba3d 100644
--- a/src/src/smtp_in.c
+++ b/src/src/smtp_in.c
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/smtp_in.c,v 1.49 2007/01/08 10:50:18 ph10 Exp $ */
+/* $Cambridge: exim/src/src/smtp_in.c,v 1.50 2007/01/15 15:59:22 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -96,6 +96,13 @@ enum {
TOO_MANY_NONMAIL_CMD };
+/* This is a convenience macro for adding the identity of an SMTP command
+to the circular buffer that holds a list of the last n received. */
+
+#define HAD(n) \
+ smtp_connection_had[smtp_ch_index++] = n; \
+ if (smtp_ch_index >= SMTP_HBUFF_SIZE) smtp_ch_index = 0
+
/*************************************************
* Local static variables *
@@ -165,6 +172,15 @@ static smtp_cmd_list *cmd_list_end =
#define CMD_LIST_AUTH 3
#define CMD_LIST_STARTTLS 4
+/* This list of names is used for performing the smtp_no_mail logging action.
+It must be kept in step with the SCH_xxx enumerations. */
+
+static uschar *smtp_names[] =
+ {
+ US"NONE", US"AUTH", US"DATA", US"EHLO", US"ETRN", US"EXPN", US"HELO",
+ US"HELP", US"MAIL", US"NOOP", US"QUIT", US"RCPT", US"RSET", US"STARTTLS",
+ US"VRFY" };
+
static uschar *protocols[] = {
US"local-smtp", /* HELO */
US"local-smtps", /* The rare case EHLO->STARTTLS->HELO */
@@ -667,6 +683,74 @@ return string_sprintf("SMTP connection from %s", hostname);
/*************************************************
+* Log lack of MAIL if so configured *
+*************************************************/
+
+/* This function is called when an SMTP session ends. If the log selector
+smtp_no_mail is set, write a log line giving some details of what has happened
+in the SMTP session.
+
+Arguments: none
+Returns: nothing
+*/
+
+void
+smtp_log_no_mail(void)
+{
+int size, ptr, i;
+uschar *s, *sep;
+
+if (smtp_mailcmd_count > 0 || (log_extra_selector & LX_smtp_no_mail) == 0)
+ return;
+
+s = NULL;
+size = ptr = 0;
+
+if (sender_host_authenticated != NULL)
+ {
+ s = string_append(s, &size, &ptr, 2, US" A=", sender_host_authenticated);
+ if (authenticated_id != NULL)
+ s = string_append(s, &size, &ptr, 2, US":", authenticated_id);
+ }
+
+#ifdef SUPPORT_TLS
+if ((log_extra_selector & LX_tls_cipher) != 0 && tls_cipher != NULL)
+ s = string_append(s, &size, &ptr, 2, US" X=", tls_cipher);
+if ((log_extra_selector & LX_tls_certificate_verified) != 0 &&
+ tls_cipher != NULL)
+ s = string_append(s, &size, &ptr, 2, US" CV=",
+ tls_certificate_verified? "yes":"no");
+if ((log_extra_selector & LX_tls_peerdn) != 0 && tls_peerdn != NULL)
+ s = string_append(s, &size, &ptr, 3, US" DN=\"", tls_peerdn, US"\"");
+#endif
+
+sep = (smtp_connection_had[SMTP_HBUFF_SIZE-1] != SCH_NONE)?
+ US" C=..." : US" C=";
+for (i = smtp_ch_index; i < SMTP_HBUFF_SIZE; i++)
+ {
+ if (smtp_connection_had[i] != SCH_NONE)
+ {
+ s = string_append(s, &size, &ptr, 2, sep,
+ smtp_names[smtp_connection_had[i]]);
+ sep = US",";
+ }
+ }
+
+for (i = 0; i < smtp_ch_index; i++)
+ {
+ s = string_append(s, &size, &ptr, 2, sep, smtp_names[smtp_connection_had[i]]);
+ sep = US",";
+ }
+
+if (s != NULL) 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(time(NULL) - smtp_connection_start), s);
+}
+
+
+
+/*************************************************
* Check HELO line and set sender_helo_name *
*************************************************/
@@ -1146,9 +1230,15 @@ uschar *user_msg, *log_msg;
uschar *code, *esc;
uschar *p, *s, *ss;
+smtp_connection_start = time(NULL);
+for (smtp_ch_index = 0; smtp_ch_index < SMTP_HBUFF_SIZE; smtp_ch_index++)
+ smtp_connection_had[smtp_ch_index] = SCH_NONE;
+smtp_ch_index = 0;
+
/* Default values for certain variables */
helo_seen = esmtp = helo_accept_junk = FALSE;
+smtp_mailcmd_count = 0;
count_nonmail = TRUE_UNSET;
synprot_error_count = unknown_command_count = nonmail_command_count = 0;
smtp_delay_mail = smtp_rlm_base;
@@ -2335,6 +2425,7 @@ while (done <= 0)
AUTHS will eventually hit the nonmail threshold. */
case AUTH_CMD:
+ HAD(SCH_AUTH);
authentication_failed = TRUE;
cmd_list[CMD_LIST_AUTH].is_mail_cmd = FALSE;
@@ -2527,11 +2618,13 @@ while (done <= 0)
it did the reset first. */
case HELO_CMD:
+ HAD(SCH_HELO);
hello = US"HELO";
esmtp = FALSE;
goto HELO_EHLO;
case EHLO_CMD:
+ HAD(SCH_EHLO);
hello = US"EHLO";
esmtp = TRUE;
@@ -2870,6 +2963,7 @@ while (done <= 0)
it is the canonical extracted address which is all that is kept. */
case MAIL_CMD:
+ HAD(SCH_MAIL);
smtp_mailcmd_count++; /* Count for limit and ratelimit */
was_rej_mail = TRUE; /* Reset if accepted */
@@ -3159,6 +3253,7 @@ while (done <= 0)
extracted address. */
case RCPT_CMD:
+ HAD(SCH_RCPT);
rcpt_count++;
was_rcpt = TRUE;
@@ -3346,6 +3441,7 @@ while (done <= 0)
because it is the same whether pipelining is in use or not. */
case DATA_CMD:
+ HAD(SCH_DATA);
if (!discarded && recipients_count <= 0)
{
if (pipelining_advertised && last_was_rcpt)
@@ -3390,6 +3486,7 @@ while (done <= 0)
case VRFY_CMD:
+ HAD(SCH_VRFY);
rc = acl_check(ACL_WHERE_VRFY, NULL, acl_smtp_vrfy, &user_msg, &log_msg);
if (rc != OK)
done = smtp_handle_acl_fail(ACL_WHERE_VRFY, rc, user_msg, log_msg);
@@ -3437,6 +3534,7 @@ while (done <= 0)
case EXPN_CMD:
+ HAD(SCH_EXPN);
rc = acl_check(ACL_WHERE_EXPN, NULL, acl_smtp_expn, &user_msg, &log_msg);
if (rc != OK)
done = smtp_handle_acl_fail(ACL_WHERE_EXPN, rc, user_msg, log_msg);
@@ -3456,6 +3554,7 @@ while (done <= 0)
#ifdef SUPPORT_TLS
case STARTTLS_CMD:
+ HAD(SCH_STARTTLS);
if (!tls_advertised)
{
done = synprot_error(L_smtp_protocol_error, 503, NULL,
@@ -3569,6 +3668,7 @@ while (done <= 0)
message. */
case QUIT_CMD:
+ HAD(SCH_QUIT);
incomplete_transaction_log(US"QUIT");
if (acl_smtp_quit != NULL)
@@ -3595,6 +3695,7 @@ while (done <= 0)
case RSET_CMD:
+ HAD(SCH_RSET);
incomplete_transaction_log(US"RSET");
smtp_reset(reset_point);
toomany = FALSE;
@@ -3604,6 +3705,7 @@ while (done <= 0)
case NOOP_CMD:
+ HAD(SCH_NOOP);
smtp_printf("250 OK\r\n");
break;
@@ -3613,6 +3715,7 @@ while (done <= 0)
permitted hosts. */
case HELP_CMD:
+ HAD(SCH_HELP);
smtp_printf("214-Commands supported:\r\n");
{
uschar buffer[256];
@@ -3654,6 +3757,7 @@ while (done <= 0)
case ETRN_CMD:
+ HAD(SCH_ETRN);
if (sender_address != NULL)
{
done = synprot_error(L_smtp_protocol_error, 503, NULL,
diff --git a/src/src/version.c b/src/src/version.c
index a41b17c90..70cf65a7b 100644
--- a/src/src/version.c
+++ b/src/src/version.c
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/version.c,v 1.20 2007/01/08 10:50:18 ph10 Exp $ */
+/* $Cambridge: exim/src/src/version.c,v 1.21 2007/01/15 15:59:22 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -12,7 +12,7 @@
#include "exim.h"
-#define THIS_VERSION "4.66"
+#define THIS_VERSION "4.67"
/* The header file cnumber.h contains a single line containing the