Logging: server pipelining offer but no uptake
[exim.git] / src / src / smtp_in.c
CommitLineData
059ec3d9
PH
1/*************************************************
2* Exim - an Internet mail transport agent *
3*************************************************/
4
f9ba5e22 5/* Copyright (c) University of Cambridge 1995 - 2018 */
059ec3d9
PH
6/* See the file NOTICE for conditions of use and distribution. */
7
8/* Functions for handling an incoming SMTP call. */
9
10
11#include "exim.h"
2ef7ed08 12#include <assert.h>
059ec3d9
PH
13
14
15/* Initialize for TCP wrappers if so configured. It appears that the macro
16HAVE_IPV6 is used in some versions of the tcpd.h header, so we unset it before
17including that header, and restore its value afterwards. */
18
19#ifdef USE_TCP_WRAPPERS
20
21 #if HAVE_IPV6
22 #define EXIM_HAVE_IPV6
23 #endif
24 #undef HAVE_IPV6
25 #include <tcpd.h>
26 #undef HAVE_IPV6
27 #ifdef EXIM_HAVE_IPV6
28 #define HAVE_IPV6 TRUE
29 #endif
30
31int allow_severity = LOG_INFO;
32int deny_severity = LOG_NOTICE;
5dc43717 33uschar *tcp_wrappers_name;
059ec3d9
PH
34#endif
35
36
8d67ada3
PH
37/* Size of buffer for reading SMTP commands. We used to use 512, as defined
38by RFC 821. However, RFC 1869 specifies that this must be increased for SMTP
39commands that accept arguments, and this in particular applies to AUTH, where
94431adb 40the data can be quite long. More recently this value was 2048 in Exim;
e2ca7082 41however, RFC 4954 (circa 2007) recommends 12288 bytes to handle AUTH. Clients
94431adb
HSHR
42such as Thunderbird will send an AUTH with an initial-response for GSSAPI.
43The maximum size of a Kerberos ticket under Windows 2003 is 12000 bytes, and
e2ca7082
PP
44we need room to handle large base64-encoded AUTHs for GSSAPI.
45*/
46
bd8fbe36 47#define SMTP_CMD_BUFFER_SIZE 16384
059ec3d9
PH
48
49/* Size of buffer for reading SMTP incoming packets */
50
bd8fbe36 51#define IN_BUFFER_SIZE 8192
059ec3d9
PH
52
53/* Structure for SMTP command list */
54
55typedef struct {
1ba28e2b 56 const char *name;
059ec3d9
PH
57 int len;
58 short int cmd;
59 short int has_arg;
60 short int is_mail_cmd;
61} smtp_cmd_list;
62
63/* Codes for identifying commands. We order them so that those that come first
64are those for which synchronization is always required. Checking this can help
65block some spam. */
66
67enum {
68 /* These commands are required to be synchronized, i.e. to be the last in a
69 block of commands when pipelining. */
70
71 HELO_CMD, EHLO_CMD, DATA_CMD, /* These are listed in the pipelining */
72 VRFY_CMD, EXPN_CMD, NOOP_CMD, /* RFC as requiring synchronization */
73 ETRN_CMD, /* This by analogy with TURN from the RFC */
74 STARTTLS_CMD, /* Required by the STARTTLS RFC */
b3ef41c9 75 TLS_AUTH_CMD, /* auto-command at start of SSL */
059ec3d9
PH
76
77 /* This is a dummy to identify the non-sync commands when pipelining */
78
79 NON_SYNC_CMD_PIPELINING,
80
81 /* These commands need not be synchronized when pipelining */
82
83 MAIL_CMD, RCPT_CMD, RSET_CMD,
84
f4630439
JH
85 /* This is a dummy to identify the non-sync commands when not pipelining */
86
87 NON_SYNC_CMD_NON_PIPELINING,
88
6d5c916c
JH
89 /* RFC3030 section 2: "After all MAIL and RCPT responses are collected and
90 processed the message is sent using a series of BDAT commands"
91 implies that BDAT should be synchronized. However, we see Google, at least,
92 sending MAIL,RCPT,BDAT-LAST in a single packet, clearly not waiting for
f4630439
JH
93 processing of the RCPT response(s). We shall do the same, and not require
94 synch for BDAT. Worse, as the chunk may (very likely will) follow the
95 command-header in the same packet we cannot do the usual "is there any
4c04137d 96 follow-on data after the command line" even for non-pipeline mode.
f4630439 97 So we'll need an explicit check after reading the expected chunk amount
4c04137d 98 when non-pipe, before sending the ACK. */
6d5c916c
JH
99
100 BDAT_CMD,
101
059ec3d9
PH
102 /* I have been unable to find a statement about the use of pipelining
103 with AUTH, so to be on the safe side it is here, though I kind of feel
104 it should be up there with the synchronized commands. */
105
106 AUTH_CMD,
107
108 /* I'm not sure about these, but I don't think they matter. */
109
110 QUIT_CMD, HELP_CMD,
111
cee5f132 112#ifdef SUPPORT_PROXY
a3c86431
TL
113 PROXY_FAIL_IGNORE_CMD,
114#endif
115
059ec3d9
PH
116 /* These are specials that don't correspond to actual commands */
117
118 EOF_CMD, OTHER_CMD, BADARG_CMD, BADCHAR_CMD, BADSYN_CMD,
119 TOO_MANY_NONMAIL_CMD };
120
121
b4ed4da0
PH
122/* This is a convenience macro for adding the identity of an SMTP command
123to the circular buffer that holds a list of the last n received. */
124
125#define HAD(n) \
126 smtp_connection_had[smtp_ch_index++] = n; \
127 if (smtp_ch_index >= SMTP_HBUFF_SIZE) smtp_ch_index = 0
128
059ec3d9
PH
129
130/*************************************************
131* Local static variables *
132*************************************************/
133
134static auth_instance *authenticated_by;
135static BOOL auth_advertised;
136#ifdef SUPPORT_TLS
137static BOOL tls_advertised;
8ac90765
JH
138# ifdef EXPERIMENTAL_REQUIRETLS
139static BOOL requiretls_advertised;
140# endif
059ec3d9 141#endif
6c1c3d1d 142static BOOL dsn_advertised;
059ec3d9
PH
143static BOOL esmtp;
144static BOOL helo_required = FALSE;
145static BOOL helo_verify = FALSE;
146static BOOL helo_seen;
147static BOOL helo_accept_junk;
148static BOOL count_nonmail;
2679d413
PH
149static BOOL rcpt_smtp_response_same;
150static BOOL rcpt_in_progress;
059ec3d9 151static int nonmail_command_count;
8f128379 152static BOOL smtp_exit_function_called = 0;
8c5d388a 153#ifdef SUPPORT_I18N
d1a13eea
JH
154static BOOL smtputf8_advertised;
155#endif
059ec3d9
PH
156static int synprot_error_count;
157static int unknown_command_count;
158static int sync_cmd_limit;
159static int smtp_write_error = 0;
160
2679d413 161static uschar *rcpt_smtp_response;
ca86f471
PH
162static uschar *smtp_data_buffer;
163static uschar *smtp_cmd_data;
164
059ec3d9
PH
165/* We need to know the position of RSET, HELO, EHLO, AUTH, and STARTTLS. Their
166final fields of all except AUTH are forced TRUE at the start of a new message
167setup, to allow one of each between messages that is not counted as a nonmail
168command. (In fact, only one of HELO/EHLO is not counted.) Also, we have to
169allow a new EHLO after starting up TLS.
170
171AUTH is "falsely" labelled as a mail command initially, so that it doesn't get
172counted. However, the flag is changed when AUTH is received, so that multiple
173failing AUTHs will eventually hit the limit. After a successful AUTH, another
174AUTH is already forbidden. After a TLS session is started, AUTH's flag is again
175forced TRUE, to allow for the re-authentication that can happen at that point.
176
177QUIT is also "falsely" labelled as a mail command so that it doesn't up the
2f460950
JH
178count of non-mail commands and possibly provoke an error.
179
180tls_auth is a pseudo-command, never expected in input. It is activated
181on TLS startup and looks for a tls authenticator. */
059ec3d9
PH
182
183static smtp_cmd_list cmd_list[] = {
d1a13eea
JH
184 /* name len cmd has_arg is_mail_cmd */
185
059ec3d9
PH
186 { "rset", sizeof("rset")-1, RSET_CMD, FALSE, FALSE }, /* First */
187 { "helo", sizeof("helo")-1, HELO_CMD, TRUE, FALSE },
188 { "ehlo", sizeof("ehlo")-1, EHLO_CMD, TRUE, FALSE },
189 { "auth", sizeof("auth")-1, AUTH_CMD, TRUE, TRUE },
e0574cb5 190#ifdef SUPPORT_TLS
059ec3d9 191 { "starttls", sizeof("starttls")-1, STARTTLS_CMD, FALSE, FALSE },
69d8eed7 192 { "tls_auth", 0, TLS_AUTH_CMD, FALSE, FALSE },
e0574cb5 193#endif
059ec3d9
PH
194
195/* If you change anything above here, also fix the definitions below. */
196
197 { "mail from:", sizeof("mail from:")-1, MAIL_CMD, TRUE, TRUE },
198 { "rcpt to:", sizeof("rcpt to:")-1, RCPT_CMD, TRUE, TRUE },
199 { "data", sizeof("data")-1, DATA_CMD, FALSE, TRUE },
18481de3 200 { "bdat", sizeof("bdat")-1, BDAT_CMD, TRUE, TRUE },
059ec3d9
PH
201 { "quit", sizeof("quit")-1, QUIT_CMD, FALSE, TRUE },
202 { "noop", sizeof("noop")-1, NOOP_CMD, TRUE, FALSE },
203 { "etrn", sizeof("etrn")-1, ETRN_CMD, TRUE, FALSE },
204 { "vrfy", sizeof("vrfy")-1, VRFY_CMD, TRUE, FALSE },
205 { "expn", sizeof("expn")-1, EXPN_CMD, TRUE, FALSE },
206 { "help", sizeof("help")-1, HELP_CMD, TRUE, FALSE }
207};
208
209static smtp_cmd_list *cmd_list_end =
210 cmd_list + sizeof(cmd_list)/sizeof(smtp_cmd_list);
211
212#define CMD_LIST_RSET 0
213#define CMD_LIST_HELO 1
214#define CMD_LIST_EHLO 2
215#define CMD_LIST_AUTH 3
216#define CMD_LIST_STARTTLS 4
b3ef41c9 217#define CMD_LIST_TLS_AUTH 5
059ec3d9 218
b4ed4da0
PH
219/* This list of names is used for performing the smtp_no_mail logging action.
220It must be kept in step with the SCH_xxx enumerations. */
221
222static uschar *smtp_names[] =
223 {
18481de3
JH
224 US"NONE", US"AUTH", US"DATA", US"BDAT", US"EHLO", US"ETRN", US"EXPN",
225 US"HELO", US"HELP", US"MAIL", US"NOOP", US"QUIT", US"RCPT", US"RSET",
226 US"STARTTLS", US"VRFY" };
b4ed4da0 227
e524074d 228static uschar *protocols_local[] = {
981756db
PH
229 US"local-smtp", /* HELO */
230 US"local-smtps", /* The rare case EHLO->STARTTLS->HELO */
231 US"local-esmtp", /* EHLO */
232 US"local-esmtps", /* EHLO->STARTTLS->EHLO */
233 US"local-esmtpa", /* EHLO->AUTH */
234 US"local-esmtpsa" /* EHLO->STARTTLS->EHLO->AUTH */
059ec3d9 235 };
e524074d
JH
236static uschar *protocols[] = {
237 US"smtp", /* HELO */
238 US"smtps", /* The rare case EHLO->STARTTLS->HELO */
239 US"esmtp", /* EHLO */
240 US"esmtps", /* EHLO->STARTTLS->EHLO */
241 US"esmtpa", /* EHLO->AUTH */
242 US"esmtpsa" /* EHLO->STARTTLS->EHLO->AUTH */
243 };
059ec3d9
PH
244
245#define pnormal 0
981756db
PH
246#define pextend 2
247#define pcrpted 1 /* added to pextend or pnormal */
248#define pauthed 2 /* added to pextend */
059ec3d9 249
d27f98fe
TL
250/* Sanity check and validate optional args to MAIL FROM: envelope */
251enum {
2ef7ed08 252 ENV_MAIL_OPT_NULL,
d27f98fe 253 ENV_MAIL_OPT_SIZE, ENV_MAIL_OPT_BODY, ENV_MAIL_OPT_AUTH,
8ccd00b1 254#ifndef DISABLE_PRDR
fd98a5c6 255 ENV_MAIL_OPT_PRDR,
6c1c3d1d 256#endif
6c1c3d1d 257 ENV_MAIL_OPT_RET, ENV_MAIL_OPT_ENVID,
8c5d388a 258#ifdef SUPPORT_I18N
d1a13eea 259 ENV_MAIL_OPT_UTF8,
8ac90765
JH
260#endif
261#ifdef EXPERIMENTAL_REQUIRETLS
262 ENV_MAIL_OPT_REQTLS,
d1a13eea 263#endif
d27f98fe
TL
264 };
265typedef struct {
266 uschar * name; /* option requested during MAIL cmd */
267 int value; /* enum type */
268 BOOL need_value; /* TRUE requires value (name=value pair format)
269 FALSE is a singleton */
270 } env_mail_type_t;
271static env_mail_type_t env_mail_type_list[] = {
272 { US"SIZE", ENV_MAIL_OPT_SIZE, TRUE },
273 { US"BODY", ENV_MAIL_OPT_BODY, TRUE },
274 { US"AUTH", ENV_MAIL_OPT_AUTH, TRUE },
8ccd00b1 275#ifndef DISABLE_PRDR
fd98a5c6 276 { US"PRDR", ENV_MAIL_OPT_PRDR, FALSE },
6c1c3d1d 277#endif
6c1c3d1d
WB
278 { US"RET", ENV_MAIL_OPT_RET, TRUE },
279 { US"ENVID", ENV_MAIL_OPT_ENVID, TRUE },
8c5d388a 280#ifdef SUPPORT_I18N
d1a13eea 281 { US"SMTPUTF8",ENV_MAIL_OPT_UTF8, FALSE }, /* rfc6531 */
8ac90765
JH
282#endif
283#ifdef EXPERIMENTAL_REQUIRETLS
284 /* https://tools.ietf.org/html/draft-ietf-uta-smtp-require-tls-03 */
285 { US"REQUIRETLS",ENV_MAIL_OPT_REQTLS, FALSE },
d1a13eea 286#endif
2ef7ed08
HSHR
287 /* keep this the last entry */
288 { US"NULL", ENV_MAIL_OPT_NULL, FALSE },
d27f98fe
TL
289 };
290
059ec3d9
PH
291/* When reading SMTP from a remote host, we have to use our own versions of the
292C input-reading functions, in order to be able to flush the SMTP output only
293when about to read more data from the socket. This is the only way to get
294optimal performance when the client is using pipelining. Flushing for every
295command causes a separate packet and reply packet each time; saving all the
296responses up (when pipelining) combines them into one packet and one response.
297
298For simplicity, these functions are used for *all* SMTP input, not only when
299receiving over a socket. However, after setting up a secure socket (SSL), input
300is read via the OpenSSL library, and another set of functions is used instead
301(see tls.c).
302
303These functions are set in the receive_getc etc. variables and called with the
304same interface as the C functions. However, since there can only ever be
305one incoming SMTP call, we just use a single buffer and flags. There is no need
306to implement a complicated private FILE-like structure.*/
307
308static uschar *smtp_inbuffer;
309static uschar *smtp_inptr;
310static uschar *smtp_inend;
311static int smtp_had_eof;
312static int smtp_had_error;
313
314
7e3ce68e 315/* forward declarations */
bd8fbe36 316static int smtp_read_command(BOOL check_sync, unsigned buffer_lim);
7e3ce68e
JH
317static int synprot_error(int type, int code, uschar *data, uschar *errmess);
318static void smtp_quit_handler(uschar **, uschar **);
319static void smtp_rset_handler(void);
320
f4630439
JH
321/*************************************************
322* Recheck synchronization *
323*************************************************/
324
325/* Synchronization checks can never be perfect because a packet may be on its
925ac8e4
JH
326way but not arrived when the check is done. Normally, the checks happen when
327commands are read: Exim ensures that there is no more input in the input buffer.
328In normal cases, the response to the command will be fast, and there is no
329further check.
f4630439
JH
330
331However, for some commands an ACL is run, and that can include delays. In those
332cases, it is useful to do another check on the input just before sending the
333response. This also applies at the start of a connection. This function does
334that check by means of the select() function, as long as the facility is not
335disabled or inappropriate. A failure of select() is ignored.
336
337When there is unwanted input, we read it so that it appears in the log of the
338error.
339
340Arguments: none
341Returns: TRUE if all is well; FALSE if there is input pending
342*/
343
344static BOOL
925ac8e4 345wouldblock_reading(void)
f4630439
JH
346{
347int fd, rc;
348fd_set fds;
349struct timeval tzero;
350
9067f574 351#ifdef SUPPORT_TLS
74f1a423 352if (tls_in.active.sock >= 0)
e5de01f0 353 return !tls_could_read();
9067f574 354#endif
f4630439 355
40525d07
JH
356if (smtp_inptr < smtp_inend)
357 return FALSE;
358
f4630439
JH
359fd = fileno(smtp_in);
360FD_ZERO(&fds);
361FD_SET(fd, &fds);
362tzero.tv_sec = 0;
363tzero.tv_usec = 0;
364rc = select(fd + 1, (SELECT_ARG2_TYPE *)&fds, NULL, NULL, &tzero);
365
366if (rc <= 0) return TRUE; /* Not ready to read */
bd8fbe36 367rc = smtp_getc(GETC_BUFFER_UNLIMITED);
f4630439
JH
368if (rc < 0) return TRUE; /* End of file or error */
369
370smtp_ungetc(rc);
f4630439
JH
371return FALSE;
372}
373
925ac8e4
JH
374static BOOL
375check_sync(void)
376{
ecce6d9a 377if (!smtp_enforce_sync || !sender_host_address || sender_host_notsocket)
925ac8e4
JH
378 return TRUE;
379
380return wouldblock_reading();
381}
382
383
384/* If there's input waiting (and we're doing pipelineing) then we can pipeline
385a reponse with the one following. */
386
387static BOOL
388pipeline_response(void)
389{
390if ( !smtp_enforce_sync || !sender_host_address
7c576fca 391 || sender_host_notsocket || !smtp_in_pipelining_advertised)
925ac8e4
JH
392 return FALSE;
393
3fc73bdc
JH
394if (wouldblock_reading()) return FALSE;
395smtp_in_pipelining_used = TRUE;
396return TRUE;
925ac8e4
JH
397}
398
f4630439
JH
399
400
401/*************************************************
402* Log incomplete transactions *
403*************************************************/
404
405/* This function is called after a transaction has been aborted by RSET, QUIT,
406connection drops or other errors. It logs the envelope information received
407so far in order to preserve address verification attempts.
408
409Argument: string to indicate what aborted the transaction
410Returns: nothing
411*/
412
413static void
414incomplete_transaction_log(uschar *what)
415{
416if (sender_address == NULL || /* No transaction in progress */
417 !LOGGING(smtp_incomplete_transaction))
418 return;
419
420/* Build list of recipients for logging */
421
422if (recipients_count > 0)
423 {
424 int i;
425 raw_recipients = store_get(recipients_count * sizeof(uschar *));
426 for (i = 0; i < recipients_count; i++)
427 raw_recipients[i] = recipients_list[i].address;
428 raw_recipients_count = recipients_count;
429 }
430
431log_write(L_smtp_incomplete_transaction, LOG_MAIN|LOG_SENDER|LOG_RECIPIENTS,
432 "%s incomplete transaction (%s)", host_and_ident(TRUE), what);
433}
434
435
436
437
9723f966
JH
438void
439smtp_command_timeout_exit(void)
440{
441log_write(L_lost_incoming_connection,
442 LOG_MAIN, "SMTP command timeout on%s connection from %s",
74f1a423 443 tls_in.active.sock >= 0 ? " TLS" : "", host_and_ident(FALSE));
9723f966
JH
444if (smtp_batched_input)
445 moan_smtp_batch(NULL, "421 SMTP command timeout"); /* Does not return */
446smtp_notquit_exit(US"command-timeout", US"421",
447 US"%s: SMTP command timeout - closing connection",
448 smtp_active_hostname);
449exim_exit(EXIT_FAILURE, US"receiving");
450}
451
452void
453smtp_command_sigterm_exit(void)
454{
455log_write(0, LOG_MAIN, "%s closed after SIGTERM", smtp_get_connection_info());
456if (smtp_batched_input)
457 moan_smtp_batch(NULL, "421 SIGTERM received"); /* Does not return */
458smtp_notquit_exit(US"signal-exit", US"421",
459 US"%s: Service not available - closing connection", smtp_active_hostname);
460exim_exit(EXIT_FAILURE, US"receiving");
461}
462
463void
464smtp_data_timeout_exit(void)
465{
466log_write(L_lost_incoming_connection,
467 LOG_MAIN, "SMTP data timeout (message abandoned) on connection from %s F=<%s>",
468 sender_fullhost ? sender_fullhost : US"local process", sender_address);
469receive_bomb_out(US"data-timeout", US"SMTP incoming data timeout");
470/* Does not return */
471}
472
473void
474smtp_data_sigint_exit(void)
475{
476log_write(0, LOG_MAIN, "%s closed after %s",
477 smtp_get_connection_info(), had_data_sigint == SIGTERM ? "SIGTERM":"SIGINT");
478receive_bomb_out(US"signal-exit",
479 US"Service not available - SIGTERM or SIGINT received");
480/* Does not return */
481}
482
483
484
0d81dabc
JH
485/* Refill the buffer, and notify DKIM verification code.
486Return false for error or EOF.
487*/
488
489static BOOL
490smtp_refill(unsigned lim)
491{
492int rc, save_errno;
493if (!smtp_out) return FALSE;
494fflush(smtp_out);
495if (smtp_receive_timeout > 0) alarm(smtp_receive_timeout);
496
ecce6d9a
JH
497/* Limit amount read, so non-message data is not fed to DKIM.
498Take care to not touch the safety NUL at the end of the buffer. */
0d81dabc 499
ecce6d9a 500rc = read(fileno(smtp_in), smtp_inbuffer, MIN(IN_BUFFER_SIZE-1, lim));
0d81dabc 501save_errno = errno;
9723f966 502if (smtp_receive_timeout > 0) alarm(0);
0d81dabc
JH
503if (rc <= 0)
504 {
505 /* Must put the error text in fixed store, because this might be during
506 header reading, where it releases unused store above the header. */
507 if (rc < 0)
508 {
9723f966
JH
509 if (had_command_timeout) /* set by signal handler */
510 smtp_command_timeout_exit(); /* does not return */
511 if (had_command_sigterm)
512 smtp_command_sigterm_exit();
513 if (had_data_timeout)
514 smtp_data_timeout_exit();
515 if (had_data_sigint)
516 smtp_data_sigint_exit();
517
0d81dabc
JH
518 smtp_had_error = save_errno;
519 smtp_read_error = string_copy_malloc(
520 string_sprintf(" (error: %s)", strerror(save_errno)));
521 }
9723f966
JH
522 else
523 smtp_had_eof = 1;
0d81dabc
JH
524 return FALSE;
525 }
526#ifndef DISABLE_DKIM
527dkim_exim_verify_feed(smtp_inbuffer, rc);
528#endif
529smtp_inend = smtp_inbuffer + rc;
530smtp_inptr = smtp_inbuffer;
531return TRUE;
532}
533
059ec3d9
PH
534/*************************************************
535* SMTP version of getc() *
536*************************************************/
537
538/* This gets the next byte from the SMTP input buffer. If the buffer is empty,
539it flushes the output, and refills the buffer, with a timeout. The signal
540handler is set appropriately by the calling function. This function is not used
4c04137d 541after a connection has negotiated itself into an TLS/SSL state.
059ec3d9 542
bd8fbe36 543Arguments: lim Maximum amount to read/buffer
059ec3d9
PH
544Returns: the next character or EOF
545*/
546
547int
bd8fbe36 548smtp_getc(unsigned lim)
059ec3d9
PH
549{
550if (smtp_inptr >= smtp_inend)
0d81dabc 551 if (!smtp_refill(lim))
059ec3d9 552 return EOF;
059ec3d9
PH
553return *smtp_inptr++;
554}
555
0d81dabc
JH
556uschar *
557smtp_getbuf(unsigned * len)
558{
559unsigned size;
560uschar * buf;
561
562if (smtp_inptr >= smtp_inend)
563 if (!smtp_refill(*len))
564 { *len = 0; return NULL; }
565
566if ((size = smtp_inend - smtp_inptr) > *len) size = *len;
567buf = smtp_inptr;
568smtp_inptr += size;
569*len = size;
570return buf;
571}
572
584e96c6
JH
573void
574smtp_get_cache(void)
575{
9960d1e5 576#ifndef DISABLE_DKIM
584e96c6
JH
577int n = smtp_inend - smtp_inptr;
578if (n > 0)
579 dkim_exim_verify_feed(smtp_inptr, n);
584e96c6 580#endif
9960d1e5 581}
059ec3d9
PH
582
583
7e3ce68e
JH
584/* Get a byte from the smtp input, in CHUNKING mode. Handle ack of the
585previous BDAT chunk and getting new ones when we run out. Uses the
586underlying smtp_getc or tls_getc both for that and for getting the
587(buffered) data byte. EOD signals (an expected) no further data.
588ERR signals a protocol error, and EOF a closed input stream.
589
590Called from read_bdat_smtp() in receive.c for the message body, but also
591by the headers read loop in receive_msg(); manipulates chunking_state
592to handle the BDAT command/response.
593Placed here due to the correlation with the above smtp_getc(), which it wraps,
594and also by the need to do smtp command/response handling.
595
bd8fbe36 596Arguments: lim (ignored)
7e3ce68e
JH
597Returns: the next character or ERR, EOD or EOF
598*/
599
600int
bd8fbe36 601bdat_getc(unsigned lim)
7e3ce68e
JH
602{
603uschar * user_msg = NULL;
604uschar * log_msg;
605
606for(;;)
607 {
79de4f37 608#ifndef DISABLE_DKIM
64b67b65 609 unsigned dkim_save;
79de4f37
JH
610#endif
611
bd8fbe36
JH
612 if (chunking_data_left > 0)
613 return lwr_receive_getc(chunking_data_left--);
7e3ce68e
JH
614
615 receive_getc = lwr_receive_getc;
0d81dabc 616 receive_getbuf = lwr_receive_getbuf;
7e3ce68e 617 receive_ungetc = lwr_receive_ungetc;
bd8fbe36 618#ifndef DISABLE_DKIM
79de4f37 619 dkim_save = dkim_collect_input;
64b67b65 620 dkim_collect_input = 0;
bd8fbe36 621#endif
7e3ce68e 622
f4630439
JH
623 /* Unless PIPELINING was offered, there should be no next command
624 until after we ack that chunk */
625
7c576fca 626 if (!smtp_in_pipelining_advertised && !check_sync())
f4630439 627 {
40525d07
JH
628 unsigned n = smtp_inend - smtp_inptr;
629 if (n > 32) n = 32;
630
f4630439
JH
631 incomplete_transaction_log(US"sync failure");
632 log_write(0, LOG_MAIN|LOG_REJECT, "SMTP protocol synchronization error "
633 "(next input sent too soon: pipelining was not advertised): "
9e0ed81f 634 "rejected \"%s\" %s next input=\"%s\"%s",
f4630439 635 smtp_cmd_buffer, host_and_ident(TRUE),
9e0ed81f
JH
636 string_printing(string_copyn(smtp_inptr, n)),
637 smtp_inend - smtp_inptr > n ? "..." : "");
638 (void) synprot_error(L_smtp_protocol_error, 554, NULL,
639 US"SMTP synchronization error");
f4630439
JH
640 goto repeat_until_rset;
641 }
642
7e3ce68e
JH
643 /* If not the last, ack the received chunk. The last response is delayed
644 until after the data ACL decides on it */
7e3ce68e
JH
645
646 if (chunking_state == CHUNKING_LAST)
584e96c6
JH
647 {
648#ifndef DISABLE_DKIM
e983e85a 649 dkim_exim_verify_feed(NULL, 0); /* notify EOD */
584e96c6 650#endif
7e3ce68e 651 return EOD;
584e96c6 652 }
7e3ce68e 653
925ac8e4 654 smtp_printf("250 %u byte chunk received\r\n", FALSE, chunking_datasize);
bd8fbe36
JH
655 chunking_state = CHUNKING_OFFERED;
656 DEBUG(D_receive) debug_printf("chunking state %d\n", (int)chunking_state);
7e3ce68e
JH
657
658 /* Expect another BDAT cmd from input. RFC 3030 says nothing about
659 QUIT, RSET or NOOP but handling them seems obvious */
660
661next_cmd:
bd8fbe36 662 switch(smtp_read_command(TRUE, 1))
7e3ce68e
JH
663 {
664 default:
665 (void) synprot_error(L_smtp_protocol_error, 503, NULL,
666 US"only BDAT permissible after non-LAST BDAT");
667
668 repeat_until_rset:
bd8fbe36 669 switch(smtp_read_command(TRUE, 1))
7e3ce68e
JH
670 {
671 case QUIT_CMD: smtp_quit_handler(&user_msg, &log_msg); /*FALLTHROUGH */
672 case EOF_CMD: return EOF;
673 case RSET_CMD: smtp_rset_handler(); return ERR;
674 default: if (synprot_error(L_smtp_protocol_error, 503, NULL,
675 US"only RSET accepted now") > 0)
676 return EOF;
677 goto repeat_until_rset;
678 }
679
680 case QUIT_CMD:
681 smtp_quit_handler(&user_msg, &log_msg);
682 /*FALLTHROUGH*/
683 case EOF_CMD:
684 return EOF;
685
686 case RSET_CMD:
687 smtp_rset_handler();
688 return ERR;
689
690 case NOOP_CMD:
691 HAD(SCH_NOOP);
925ac8e4 692 smtp_printf("250 OK\r\n", FALSE);
7e3ce68e
JH
693 goto next_cmd;
694
695 case BDAT_CMD:
696 {
697 int n;
698
699 if (sscanf(CS smtp_cmd_data, "%u %n", &chunking_datasize, &n) < 1)
700 {
701 (void) synprot_error(L_smtp_protocol_error, 501, NULL,
702 US"missing size for BDAT command");
703 return ERR;
704 }
705 chunking_state = strcmpic(smtp_cmd_data+n, US"LAST") == 0
706 ? CHUNKING_LAST : CHUNKING_ACTIVE;
707 chunking_data_left = chunking_datasize;
bd8fbe36
JH
708 DEBUG(D_receive) debug_printf("chunking state %d, %d bytes\n",
709 (int)chunking_state, chunking_data_left);
7e3ce68e
JH
710
711 if (chunking_datasize == 0)
712 if (chunking_state == CHUNKING_LAST)
713 return EOD;
714 else
715 {
716 (void) synprot_error(L_smtp_protocol_error, 504, NULL,
717 US"zero size for BDAT command");
718 goto repeat_until_rset;
719 }
720
721 receive_getc = bdat_getc;
8b77d27a 722 receive_getbuf = bdat_getbuf; /* r~getbuf is never actually used */
7e3ce68e 723 receive_ungetc = bdat_ungetc;
bd8fbe36 724#ifndef DISABLE_DKIM
79de4f37 725 dkim_collect_input = dkim_save;
bd8fbe36 726#endif
7e3ce68e
JH
727 break; /* to top of main loop */
728 }
729 }
730 }
731}
732
0d81dabc
JH
733uschar *
734bdat_getbuf(unsigned * len)
735{
736uschar * buf;
737
738if (chunking_data_left <= 0)
739 { *len = 0; return NULL; }
740
741if (*len > chunking_data_left) *len = chunking_data_left;
742buf = lwr_receive_getbuf(len); /* Either smtp_getbuf or tls_getbuf */
743chunking_data_left -= *len;
744return buf;
745}
746
1ebe15c3 747void
45bd315d
JH
748bdat_flush_data(void)
749{
e99a3a6c 750while (chunking_data_left)
db57e575 751 {
e99a3a6c 752 unsigned n = chunking_data_left;
8b77d27a 753 if (!bdat_getbuf(&n)) break;
db57e575 754 }
45bd315d
JH
755
756receive_getc = lwr_receive_getc;
0d81dabc 757receive_getbuf = lwr_receive_getbuf;
45bd315d
JH
758receive_ungetc = lwr_receive_ungetc;
759
760if (chunking_state != CHUNKING_LAST)
bd8fbe36 761 {
45bd315d 762 chunking_state = CHUNKING_OFFERED;
bd8fbe36
JH
763 DEBUG(D_receive) debug_printf("chunking state %d\n", (int)chunking_state);
764 }
45bd315d
JH
765}
766
7e3ce68e
JH
767
768
769
059ec3d9
PH
770/*************************************************
771* SMTP version of ungetc() *
772*************************************************/
773
774/* Puts a character back in the input buffer. Only ever
775called once.
776
777Arguments:
778 ch the character
779
780Returns: the character
781*/
782
783int
784smtp_ungetc(int ch)
785{
7e3ce68e 786*--smtp_inptr = ch;
059ec3d9
PH
787return ch;
788}
789
790
7e3ce68e
JH
791int
792bdat_ungetc(int ch)
793{
794chunking_data_left++;
795return lwr_receive_ungetc(ch);
796}
797
059ec3d9
PH
798
799
800/*************************************************
801* SMTP version of feof() *
802*************************************************/
803
804/* Tests for a previous EOF
805
806Arguments: none
807Returns: non-zero if the eof flag is set
808*/
809
810int
811smtp_feof(void)
812{
813return smtp_had_eof;
814}
815
816
817
818
819/*************************************************
820* SMTP version of ferror() *
821*************************************************/
822
823/* Tests for a previous read error, and returns with errno
824restored to what it was when the error was detected.
825
826Arguments: none
827Returns: non-zero if the error flag is set
828*/
829
830int
831smtp_ferror(void)
832{
833errno = smtp_had_error;
834return smtp_had_error;
835}
836
837
838
58eb016e
PH
839/*************************************************
840* Test for characters in the SMTP buffer *
841*************************************************/
842
843/* Used at the end of a message
844
845Arguments: none
846Returns: TRUE/FALSE
847*/
848
849BOOL
850smtp_buffered(void)
851{
852return smtp_inptr < smtp_inend;
853}
854
855
059ec3d9
PH
856
857/*************************************************
858* Write formatted string to SMTP channel *
859*************************************************/
860
861/* This is a separate function so that we don't have to repeat everything for
862TLS support or debugging. It is global so that the daemon and the
863authentication functions can use it. It does not return any error indication,
864because major problems such as dropped connections won't show up till an output
865flush for non-TLS connections. The smtp_fflush() function is available for
866checking that: for convenience, TLS output errors are remembered here so that
867they are also picked up later by smtp_fflush().
868
869Arguments:
870 format format string
925ac8e4 871 more further data expected
059ec3d9
PH
872 ... optional arguments
873
874Returns: nothing
875*/
876
877void
925ac8e4 878smtp_printf(const char *format, BOOL more, ...)
059ec3d9
PH
879{
880va_list ap;
881
925ac8e4
JH
882va_start(ap, more);
883smtp_vprintf(format, more, ap);
ce552449
NM
884va_end(ap);
885}
886
887/* This is split off so that verify.c:respond_printf() can, in effect, call
888smtp_printf(), bearing in mind that in C a vararg function can't directly
fb08281f 889call another vararg function, only a function which accepts a va_list. */
ce552449
NM
890
891void
925ac8e4 892smtp_vprintf(const char *format, BOOL more, va_list ap)
ce552449 893{
fb08281f
DW
894BOOL yield;
895
896yield = string_vformat(big_buffer, big_buffer_size, format, ap);
ce552449 897
059ec3d9
PH
898DEBUG(D_receive)
899 {
fb08281f
DW
900 void *reset_point = store_get(0);
901 uschar *msg_copy, *cr, *end;
902 msg_copy = string_copy(big_buffer);
903 end = msg_copy + Ustrlen(msg_copy);
904 while ((cr = Ustrchr(msg_copy, '\r')) != NULL) /* lose CRs */
905 memmove(cr, cr + 1, (end--) - cr);
906 debug_printf("SMTP>> %s", msg_copy);
907 store_reset(reset_point);
059ec3d9
PH
908 }
909
fb08281f 910if (!yield)
2679d413
PH
911 {
912 log_write(0, LOG_MAIN|LOG_PANIC, "string too large in smtp_printf()");
913 smtp_closedown(US"Unexpected error");
9bfb7e1b 914 exim_exit(EXIT_FAILURE, NULL);
2679d413 915 }
2679d413
PH
916
917/* If this is the first output for a (non-batch) RCPT command, see if all RCPTs
918have had the same. Note: this code is also present in smtp_respond(). It would
919be tidier to have it only in one place, but when it was added, it was easier to
920do it that way, so as not to have to mess with the code for the RCPT command,
921which sometimes uses smtp_printf() and sometimes smtp_respond(). */
922
923if (rcpt_in_progress)
924 {
925 if (rcpt_smtp_response == NULL)
926 rcpt_smtp_response = string_copy(big_buffer);
927 else if (rcpt_smtp_response_same &&
928 Ustrcmp(rcpt_smtp_response, big_buffer) != 0)
929 rcpt_smtp_response_same = FALSE;
930 rcpt_in_progress = FALSE;
931 }
059ec3d9 932
2679d413 933/* Now write the string */
059ec3d9
PH
934
935#ifdef SUPPORT_TLS
74f1a423 936if (tls_in.active.sock >= 0)
059ec3d9 937 {
74f1a423 938 if (tls_write(NULL, big_buffer, Ustrlen(big_buffer), more) < 0)
817d9f57 939 smtp_write_error = -1;
059ec3d9
PH
940 }
941else
942#endif
943
2679d413 944if (fprintf(smtp_out, "%s", big_buffer) < 0) smtp_write_error = -1;
059ec3d9
PH
945}
946
947
948
949/*************************************************
950* Flush SMTP out and check for error *
951*************************************************/
952
953/* This function isn't currently used within Exim (it detects errors when it
954tries to read the next SMTP input), but is available for use in local_scan().
955For non-TLS connections, it flushes the output and checks for errors. For
956TLS-connections, it checks for a previously-detected TLS write error.
957
958Arguments: none
959Returns: 0 for no error; -1 after an error
960*/
961
962int
963smtp_fflush(void)
964{
74f1a423 965if (tls_in.active.sock < 0 && fflush(smtp_out) != 0) smtp_write_error = -1;
059ec3d9
PH
966return smtp_write_error;
967}
968
969
970
971/*************************************************
972* SMTP command read timeout *
973*************************************************/
974
975/* Signal handler for timing out incoming SMTP commands. This attempts to
976finish off tidily.
977
978Argument: signal number (SIGALRM)
979Returns: nothing
980*/
981
982static void
983command_timeout_handler(int sig)
984{
9723f966 985had_command_timeout = sig;
059ec3d9
PH
986}
987
988
989
990/*************************************************
991* SIGTERM received *
992*************************************************/
993
994/* Signal handler for handling SIGTERM. Again, try to finish tidily.
995
996Argument: signal number (SIGTERM)
997Returns: nothing
998*/
999
1000static void
1001command_sigterm_handler(int sig)
1002{
9723f966 1003had_command_sigterm = sig;
059ec3d9
PH
1004}
1005
1006
1007
a14e5636 1008
cee5f132 1009#ifdef SUPPORT_PROXY
a3bddaa8
TL
1010/*************************************************
1011* Restore socket timeout to previous value *
1012*************************************************/
1013/* If the previous value was successfully retrieved, restore
1014it before returning control to the non-proxy routines
1015
1016Arguments: fd - File descriptor for input
1017 get_ok - Successfully retrieved previous values
1018 tvtmp - Time struct with previous values
1019 vslen - Length of time struct
1020Returns: none
1021*/
1022static void
f267271d 1023restore_socket_timeout(int fd, int get_ok, struct timeval * tvtmp, socklen_t vslen)
a3bddaa8
TL
1024{
1025if (get_ok == 0)
f267271d 1026 (void) setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, CS tvtmp, vslen);
a3bddaa8
TL
1027}
1028
a3c86431
TL
1029/*************************************************
1030* Check if host is required proxy host *
1031*************************************************/
1032/* The function determines if inbound host will be a regular smtp host
1811cb4c
JH
1033or if it is configured that it must use Proxy Protocol. A local
1034connection cannot.
a3c86431
TL
1035
1036Arguments: none
1037Returns: bool
1038*/
1039
1040static BOOL
1041check_proxy_protocol_host()
1042{
1043int rc;
a3c86431 1044
1811cb4c
JH
1045if ( sender_host_address
1046 && (rc = verify_check_this_host(CUSS &hosts_proxy, NULL, NULL,
1047 sender_host_address, NULL)) == OK)
a3c86431
TL
1048 {
1049 DEBUG(D_receive)
1050 debug_printf("Detected proxy protocol configured host\n");
1051 proxy_session = TRUE;
1052 }
1053return proxy_session;
1054}
1055
1056
3f251b3c
PP
1057/*************************************************
1058* Read data until newline or end of buffer *
1059*************************************************/
1060/* While SMTP is server-speaks-first, TLS is client-speaks-first, so we can't
1061read an entire buffer and assume there will be nothing past a proxy protocol
1062header. Our approach normally is to use stdio, but again that relies upon
1063"STARTTLS\r\n" and a server response before the client starts TLS handshake, or
1064reading _nothing_ before client TLS handshake. So we don't want to use the
1065usual buffering reads which may read enough to block TLS starting.
1066
1067So unfortunately we're down to "read one byte at a time, with a syscall each,
1068and expect a little overhead", for all proxy-opened connections which are v1,
1069just to handle the TLS-on-connect case. Since SSL functions wrap the
1070underlying fd, we can't assume that we can feed them any already-read content.
1071
1072We need to know where to read to, the max capacity, and we'll read until we
1073get a CR and one more character. Let the caller scream if it's CR+!LF.
1074
1075Return the amount read.
1076*/
1077
1078static int
da88acae 1079swallow_until_crlf(int fd, uschar *base, int already, int capacity)
3f251b3c 1080{
2c0f3ea1
JH
1081uschar *to = base + already;
1082uschar *cr;
1083int have = 0;
1084int ret;
1085int last = 0;
1086
1087/* For "PROXY UNKNOWN\r\n" we, at time of writing, expect to have read
1088up through the \r; for the _normal_ case, we haven't yet seen the \r. */
da88acae 1089
2c0f3ea1
JH
1090cr = memchr(base, '\r', already);
1091if (cr != NULL)
1092 {
1093 if ((cr - base) < already - 1)
da88acae 1094 {
2c0f3ea1
JH
1095 /* \r and presumed \n already within what we have; probably not
1096 actually proxy protocol, but abort cleanly. */
1097 return 0;
da88acae 1098 }
2c0f3ea1
JH
1099 /* \r is last character read, just need one more. */
1100 last = 1;
1101 }
1102
1103while (capacity > 0)
1104 {
1105 do { ret = recv(fd, to, 1, 0); } while (ret == -1 && errno == EINTR);
1106 if (ret == -1)
1107 return -1;
1108 have++;
1109 if (last)
1110 return have;
1111 if (*to == '\r')
1112 last = 1;
1113 capacity--;
1114 to++;
1115 }
1116
1117/* reached end without having room for a final newline, abort */
1118errno = EOVERFLOW;
1119return -1;
3f251b3c
PP
1120}
1121
a3c86431
TL
1122/*************************************************
1123* Setup host for proxy protocol *
1124*************************************************/
1125/* The function configures the connection based on a header from the
1126inbound host to use Proxy Protocol. The specification is very exact
1127so exit with an error if do not find the exact required pieces. This
1128includes an incorrect number of spaces separating args.
1129
1130Arguments: none
f267271d 1131Returns: Boolean success
a3c86431
TL
1132*/
1133
1811cb4c 1134static void
a3c86431
TL
1135setup_proxy_protocol_host()
1136{
1137union {
1138 struct {
1139 uschar line[108];
1140 } v1;
1141 struct {
1142 uschar sig[12];
36719342
TL
1143 uint8_t ver_cmd;
1144 uint8_t fam;
1145 uint16_t len;
a3c86431
TL
1146 union {
1147 struct { /* TCP/UDP over IPv4, len = 12 */
1148 uint32_t src_addr;
1149 uint32_t dst_addr;
1150 uint16_t src_port;
1151 uint16_t dst_port;
1152 } ip4;
1153 struct { /* TCP/UDP over IPv6, len = 36 */
1154 uint8_t src_addr[16];
1155 uint8_t dst_addr[16];
1156 uint16_t src_port;
1157 uint16_t dst_port;
1158 } ip6;
1159 struct { /* AF_UNIX sockets, len = 216 */
1160 uschar src_addr[108];
1161 uschar dst_addr[108];
1162 } unx;
1163 } addr;
1164 } v2;
1165} hdr;
1166
eb57651e
TL
1167/* Temp variables used in PPv2 address:port parsing */
1168uint16_t tmpport;
1169char tmpip[INET_ADDRSTRLEN];
1170struct sockaddr_in tmpaddr;
1171char tmpip6[INET6_ADDRSTRLEN];
1172struct sockaddr_in6 tmpaddr6;
1173
da88acae
PP
1174/* We can't read "all data until end" because while SMTP is
1175server-speaks-first, the TLS handshake is client-speaks-first, so for
1176TLS-on-connect ports the proxy protocol header will usually be immediately
1177followed by a TLS handshake, and with N TLS libraries, we can't reliably
1178reinject data for reading by those. So instead we first read "enough to be
1179safely read within the header, and figure out how much more to read".
1180For v1 we will later read to the end-of-line, for v2 we will read based upon
1181the stated length.
1182
1183The v2 sig is 12 octets, and another 4 gets us the length, so we know how much
1184data is needed total. For v1, where the line looks like:
1185PROXY TCPn L3src L3dest SrcPort DestPort \r\n
1186
1187However, for v1 there's also `PROXY UNKNOWN\r\n` which is only 15 octets.
1188We seem to support that. So, if we read 14 octets then we can tell if we're
1189v2 or v1. If we're v1, we can continue reading as normal.
1190
1191If we're v2, we can't slurp up the entire header. We need the length in the
119215th & 16th octets, then to read everything after that.
1193
1194So to safely handle v1 and v2, with client-sent-first supported correctly,
1195we have to do a minimum of 3 read calls, not 1. Eww.
1196*/
1197
1198#define PROXY_INITIAL_READ 14
1199#define PROXY_V2_HEADER_SIZE 16
1200#if PROXY_INITIAL_READ > PROXY_V2_HEADER_SIZE
1201# error Code bug in sizes of data to read for proxy usage
1202#endif
1203
eb57651e 1204int get_ok = 0;
f267271d
JH
1205int size, ret;
1206int fd = fileno(smtp_in);
36719342 1207const char v2sig[12] = "\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A";
9e7e0f6a 1208uschar * iptype; /* To display debug info */
a3c86431 1209struct timeval tv;
a3bddaa8 1210struct timeval tvtmp;
f267271d 1211socklen_t vslen = sizeof(struct timeval);
1811cb4c 1212BOOL yield = FALSE;
a3c86431 1213
a3bddaa8 1214/* Save current socket timeout values */
f267271d 1215get_ok = getsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, CS &tvtmp, &vslen);
a3bddaa8 1216
a3c86431
TL
1217/* Proxy Protocol host must send header within a short time
1218(default 3 seconds) or it's considered invalid */
1219tv.tv_sec = PROXY_NEGOTIATION_TIMEOUT_SEC;
1220tv.tv_usec = PROXY_NEGOTIATION_TIMEOUT_USEC;
f267271d 1221if (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, CS &tv, sizeof(tv)) < 0)
1811cb4c 1222 goto bad;
a3bddaa8 1223
a3c86431
TL
1224do
1225 {
eb57651e 1226 /* The inbound host was declared to be a Proxy Protocol host, so
2c0f3ea1
JH
1227 don't do a PEEK into the data, actually slurp up enough to be
1228 "safe". Can't take it all because TLS-on-connect clients follow
1229 immediately with TLS handshake. */
3f251b3c 1230 ret = recv(fd, &hdr, PROXY_INITIAL_READ, 0);
a3c86431
TL
1231 }
1232 while (ret == -1 && errno == EINTR);
1233
1234if (ret == -1)
f267271d 1235 goto proxyfail;
a3c86431 1236
da88acae
PP
1237/* For v2, handle reading the length, and then the rest. */
1238if ((ret == PROXY_INITIAL_READ) && (memcmp(&hdr.v2, v2sig, sizeof(v2sig)) == 0))
a3c86431 1239 {
da88acae
PP
1240 int retmore;
1241 uint8_t ver;
1242
1243 /* First get the length fields. */
1244 do
1245 {
1246 retmore = recv(fd, (uschar*)&hdr + ret, PROXY_V2_HEADER_SIZE - PROXY_INITIAL_READ, 0);
1247 } while (retmore == -1 && errno == EINTR);
1248 if (retmore == -1)
3f251b3c 1249 goto proxyfail;
da88acae 1250 ret += retmore;
3f251b3c
PP
1251
1252 ver = (hdr.v2.ver_cmd & 0xf0) >> 4;
36719342
TL
1253
1254 /* May 2014: haproxy combined the version and command into one byte to
2c0f3ea1
JH
1255 allow two full bytes for the length field in order to proxy SSL
1256 connections. SSL Proxy is not supported in this version of Exim, but
1257 must still separate values here. */
36719342
TL
1258
1259 if (ver != 0x02)
1260 {
1261 DEBUG(D_receive) debug_printf("Invalid Proxy Protocol version: %d\n", ver);
1262 goto proxyfail;
1263 }
da88acae 1264
36719342 1265 /* The v2 header will always be 16 bytes per the spec. */
5d036699 1266 size = 16 + ntohs(hdr.v2.len);
da88acae
PP
1267 DEBUG(D_receive) debug_printf("Detected PROXYv2 header, size %d (limit %d)\n",
1268 size, (int)sizeof(hdr));
1269
1270 /* We should now have 16 octets (PROXY_V2_HEADER_SIZE), and we know the total
1271 amount that we need. Double-check that the size is not unreasonable, then
1272 get the rest. */
1273 if (size > sizeof(hdr))
a3c86431 1274 {
da88acae 1275 DEBUG(D_receive) debug_printf("PROXYv2 header size unreasonably large; security attack?\n");
a3c86431
TL
1276 goto proxyfail;
1277 }
da88acae
PP
1278
1279 do
1280 {
1281 do
1282 {
1283 retmore = recv(fd, (uschar*)&hdr + ret, size-ret, 0);
1284 } while (retmore == -1 && errno == EINTR);
1285 if (retmore == -1)
1286 goto proxyfail;
1287 ret += retmore;
1288 DEBUG(D_receive) debug_printf("PROXYv2: have %d/%d required octets\n", ret, size);
1289 } while (ret < size);
1290
1291 } /* end scope for getting rest of data for v2 */
1292
1293/* At this point: if PROXYv2, we've read the exact size required for all data;
1294if PROXYv1 then we've read "less than required for any valid line" and should
1295read the rest". */
1296
1297if (ret >= 16 && memcmp(&hdr.v2, v2sig, 12) == 0)
1298 {
1299 uint8_t cmd = (hdr.v2.ver_cmd & 0x0f);
1300
36719342 1301 switch (cmd)
a3c86431
TL
1302 {
1303 case 0x01: /* PROXY command */
1304 switch (hdr.v2.fam)
1305 {
eb57651e
TL
1306 case 0x11: /* TCPv4 address type */
1307 iptype = US"IPv4";
1308 tmpaddr.sin_addr.s_addr = hdr.v2.addr.ip4.src_addr;
5d036699
JH
1309 inet_ntop(AF_INET, &tmpaddr.sin_addr, CS &tmpip, sizeof(tmpip));
1310 if (!string_is_ip_address(US tmpip, NULL))
eb57651e
TL
1311 {
1312 DEBUG(D_receive) debug_printf("Invalid %s source IP\n", iptype);
f267271d 1313 goto proxyfail;
eb57651e 1314 }
e6d2a989 1315 proxy_local_address = sender_host_address;
eb57651e
TL
1316 sender_host_address = string_copy(US tmpip);
1317 tmpport = ntohs(hdr.v2.addr.ip4.src_port);
e6d2a989 1318 proxy_local_port = sender_host_port;
eb57651e
TL
1319 sender_host_port = tmpport;
1320 /* Save dest ip/port */
1321 tmpaddr.sin_addr.s_addr = hdr.v2.addr.ip4.dst_addr;
5d036699
JH
1322 inet_ntop(AF_INET, &tmpaddr.sin_addr, CS &tmpip, sizeof(tmpip));
1323 if (!string_is_ip_address(US tmpip, NULL))
eb57651e
TL
1324 {
1325 DEBUG(D_receive) debug_printf("Invalid %s dest port\n", iptype);
f267271d 1326 goto proxyfail;
eb57651e 1327 }
7a2fa0bc 1328 proxy_external_address = string_copy(US tmpip);
eb57651e 1329 tmpport = ntohs(hdr.v2.addr.ip4.dst_port);
7a2fa0bc 1330 proxy_external_port = tmpport;
a3c86431 1331 goto done;
eb57651e
TL
1332 case 0x21: /* TCPv6 address type */
1333 iptype = US"IPv6";
1334 memmove(tmpaddr6.sin6_addr.s6_addr, hdr.v2.addr.ip6.src_addr, 16);
5d036699
JH
1335 inet_ntop(AF_INET6, &tmpaddr6.sin6_addr, CS &tmpip6, sizeof(tmpip6));
1336 if (!string_is_ip_address(US tmpip6, NULL))
eb57651e
TL
1337 {
1338 DEBUG(D_receive) debug_printf("Invalid %s source IP\n", iptype);
f267271d 1339 goto proxyfail;
eb57651e 1340 }
e6d2a989 1341 proxy_local_address = sender_host_address;
eb57651e
TL
1342 sender_host_address = string_copy(US tmpip6);
1343 tmpport = ntohs(hdr.v2.addr.ip6.src_port);
e6d2a989 1344 proxy_local_port = sender_host_port;
eb57651e
TL
1345 sender_host_port = tmpport;
1346 /* Save dest ip/port */
1347 memmove(tmpaddr6.sin6_addr.s6_addr, hdr.v2.addr.ip6.dst_addr, 16);
5d036699
JH
1348 inet_ntop(AF_INET6, &tmpaddr6.sin6_addr, CS &tmpip6, sizeof(tmpip6));
1349 if (!string_is_ip_address(US tmpip6, NULL))
eb57651e
TL
1350 {
1351 DEBUG(D_receive) debug_printf("Invalid %s dest port\n", iptype);
f267271d 1352 goto proxyfail;
eb57651e 1353 }
7a2fa0bc 1354 proxy_external_address = string_copy(US tmpip6);
eb57651e 1355 tmpport = ntohs(hdr.v2.addr.ip6.dst_port);
7a2fa0bc 1356 proxy_external_port = tmpport;
a3c86431 1357 goto done;
eb57651e
TL
1358 default:
1359 DEBUG(D_receive)
1360 debug_printf("Unsupported PROXYv2 connection type: 0x%02x\n",
1361 hdr.v2.fam);
1362 goto proxyfail;
a3c86431
TL
1363 }
1364 /* Unsupported protocol, keep local connection address */
1365 break;
1366 case 0x00: /* LOCAL command */
1367 /* Keep local connection address for LOCAL */
9e7e0f6a 1368 iptype = US"local";
a3c86431
TL
1369 break;
1370 default:
eb57651e 1371 DEBUG(D_receive)
36719342 1372 debug_printf("Unsupported PROXYv2 command: 0x%x\n", cmd);
a3c86431
TL
1373 goto proxyfail;
1374 }
1375 }
5d036699 1376else if (ret >= 8 && memcmp(hdr.v1.line, "PROXY", 5) == 0)
a3c86431 1377 {
3f251b3c
PP
1378 uschar *p;
1379 uschar *end;
a3c86431
TL
1380 uschar *sp; /* Utility variables follow */
1381 int tmp_port;
3f251b3c 1382 int r2;
a3c86431
TL
1383 char *endc;
1384
3f251b3c 1385 /* get the rest of the line */
da88acae 1386 r2 = swallow_until_crlf(fd, (uschar*)&hdr, ret, sizeof(hdr)-ret);
3f251b3c
PP
1387 if (r2 == -1)
1388 goto proxyfail;
1389 ret += r2;
1390
1391 p = string_copy(hdr.v1.line);
1392 end = memchr(p, '\r', ret - 1);
1393
da88acae 1394 if (!end || (end == (uschar*)&hdr + ret) || end[1] != '\n')
a3c86431
TL
1395 {
1396 DEBUG(D_receive) debug_printf("Partial or invalid PROXY header\n");
1397 goto proxyfail;
1398 }
1399 *end = '\0'; /* Terminate the string */
a5d4db40 1400 size = end + 2 - p; /* Skip header + CRLF */
a3c86431 1401 DEBUG(D_receive) debug_printf("Detected PROXYv1 header\n");
3f251b3c 1402 DEBUG(D_receive) debug_printf("Bytes read not within PROXY header: %d\n", ret - size);
a3c86431 1403 /* Step through the string looking for the required fields. Ensure
2c0f3ea1 1404 strict adherence to required formatting, exit for any error. */
a3c86431
TL
1405 p += 5;
1406 if (!isspace(*(p++)))
1407 {
1408 DEBUG(D_receive) debug_printf("Missing space after PROXY command\n");
1409 goto proxyfail;
1410 }
1411 if (!Ustrncmp(p, CCS"TCP4", 4))
1412 iptype = US"IPv4";
1413 else if (!Ustrncmp(p,CCS"TCP6", 4))
1414 iptype = US"IPv6";
1415 else if (!Ustrncmp(p,CCS"UNKNOWN", 7))
1416 {
1417 iptype = US"Unknown";
1418 goto done;
1419 }
1420 else
1421 {
1422 DEBUG(D_receive) debug_printf("Invalid TCP type\n");
1423 goto proxyfail;
1424 }
1425
1426 p += Ustrlen(iptype);
1427 if (!isspace(*(p++)))
1428 {
1429 DEBUG(D_receive) debug_printf("Missing space after TCP4/6 command\n");
1430 goto proxyfail;
1431 }
1432 /* Find the end of the arg */
1433 if ((sp = Ustrchr(p, ' ')) == NULL)
1434 {
1435 DEBUG(D_receive)
1436 debug_printf("Did not find proxied src %s\n", iptype);
1437 goto proxyfail;
1438 }
1439 *sp = '\0';
5d036699 1440 if(!string_is_ip_address(p, NULL))
a3c86431
TL
1441 {
1442 DEBUG(D_receive)
1443 debug_printf("Proxied src arg is not an %s address\n", iptype);
1444 goto proxyfail;
1445 }
e6d2a989 1446 proxy_local_address = sender_host_address;
a3c86431
TL
1447 sender_host_address = p;
1448 p = sp + 1;
1449 if ((sp = Ustrchr(p, ' ')) == NULL)
1450 {
1451 DEBUG(D_receive)
1452 debug_printf("Did not find proxy dest %s\n", iptype);
1453 goto proxyfail;
1454 }
1455 *sp = '\0';
5d036699 1456 if(!string_is_ip_address(p, NULL))
a3c86431
TL
1457 {
1458 DEBUG(D_receive)
1459 debug_printf("Proxy dest arg is not an %s address\n", iptype);
1460 goto proxyfail;
1461 }
7a2fa0bc 1462 proxy_external_address = p;
a3c86431
TL
1463 p = sp + 1;
1464 if ((sp = Ustrchr(p, ' ')) == NULL)
1465 {
1466 DEBUG(D_receive) debug_printf("Did not find proxied src port\n");
1467 goto proxyfail;
1468 }
1469 *sp = '\0';
5d036699 1470 tmp_port = strtol(CCS p, &endc, 10);
a3c86431
TL
1471 if (*endc || tmp_port == 0)
1472 {
1473 DEBUG(D_receive)
1474 debug_printf("Proxied src port '%s' not an integer\n", p);
1475 goto proxyfail;
1476 }
e6d2a989 1477 proxy_local_port = sender_host_port;
a3c86431
TL
1478 sender_host_port = tmp_port;
1479 p = sp + 1;
1480 if ((sp = Ustrchr(p, '\0')) == NULL)
1481 {
1482 DEBUG(D_receive) debug_printf("Did not find proxy dest port\n");
1483 goto proxyfail;
1484 }
5d036699 1485 tmp_port = strtol(CCS p, &endc, 10);
a3c86431
TL
1486 if (*endc || tmp_port == 0)
1487 {
1488 DEBUG(D_receive)
1489 debug_printf("Proxy dest port '%s' not an integer\n", p);
1490 goto proxyfail;
1491 }
7a2fa0bc 1492 proxy_external_port = tmp_port;
a3c86431 1493 /* Already checked for /r /n above. Good V1 header received. */
a3c86431
TL
1494 }
1495else
1496 {
1497 /* Wrong protocol */
eb57651e 1498 DEBUG(D_receive) debug_printf("Invalid proxy protocol version negotiation\n");
da88acae 1499 (void) swallow_until_crlf(fd, (uschar*)&hdr, ret, sizeof(hdr)-ret);
a3c86431
TL
1500 goto proxyfail;
1501 }
1502
1811cb4c
JH
1503done:
1504 DEBUG(D_receive)
1505 debug_printf("Valid %s sender from Proxy Protocol header\n", iptype);
1506 yield = proxy_session;
1507
1508/* Don't flush any potential buffer contents. Any input on proxyfail
1509should cause a synchronization failure */
1510
a3c86431 1511proxyfail:
1811cb4c 1512 restore_socket_timeout(fd, get_ok, &tvtmp, vslen);
a3c86431 1513
1811cb4c
JH
1514bad:
1515 if (yield)
1516 {
1517 sender_host_name = NULL;
1518 (void) host_name_lookup();
1519 host_build_sender_fullhost();
1520 }
1521 else
1522 {
1523 proxy_session_failed = TRUE;
1524 DEBUG(D_receive)
1525 debug_printf("Failure to extract proxied host, only QUIT allowed\n");
1526 }
1527
1528return;
a3c86431
TL
1529}
1530#endif
1531
059ec3d9
PH
1532/*************************************************
1533* Read one command line *
1534*************************************************/
1535
1536/* Strictly, SMTP commands coming over the net are supposed to end with CRLF.
1537There are sites that don't do this, and in any case internal SMTP probably
1538should check only for LF. Consequently, we check here for LF only. The line
1539ends up with [CR]LF removed from its end. If we get an overlong line, treat as
3ee512ff
PH
1540an unknown command. The command is read into the global smtp_cmd_buffer so that
1541it is available via $smtp_command.
059ec3d9
PH
1542
1543The character reading routine sets up a timeout for each block actually read
1544from the input (which may contain more than one command). We set up a special
1545signal handler that closes down the session on a timeout. Control does not
1546return when it runs.
1547
1548Arguments:
bd8fbe36
JH
1549 check_sync if TRUE, check synchronization rules if global option is TRUE
1550 buffer_lim maximum to buffer in lower layer
059ec3d9
PH
1551
1552Returns: a code identifying the command (enumerated above)
1553*/
1554
1555static int
bd8fbe36 1556smtp_read_command(BOOL check_sync, unsigned buffer_lim)
059ec3d9
PH
1557{
1558int c;
1559int ptr = 0;
1560smtp_cmd_list *p;
1561BOOL hadnull = FALSE;
1562
9723f966 1563had_command_timeout = 0;
059ec3d9
PH
1564os_non_restarting_signal(SIGALRM, command_timeout_handler);
1565
bd8fbe36 1566while ((c = (receive_getc)(buffer_lim)) != '\n' && c != EOF)
059ec3d9 1567 {
bd8fbe36 1568 if (ptr >= SMTP_CMD_BUFFER_SIZE)
059ec3d9
PH
1569 {
1570 os_non_restarting_signal(SIGALRM, sigalrm_handler);
1571 return OTHER_CMD;
1572 }
1573 if (c == 0)
1574 {
1575 hadnull = TRUE;
1576 c = '?';
1577 }
3ee512ff 1578 smtp_cmd_buffer[ptr++] = c;
059ec3d9
PH
1579 }
1580
1581receive_linecount++; /* For BSMTP errors */
1582os_non_restarting_signal(SIGALRM, sigalrm_handler);
1583
1584/* If hit end of file, return pseudo EOF command. Whether we have a
1585part-line already read doesn't matter, since this is an error state. */
1586
1587if (c == EOF) return EOF_CMD;
1588
1589/* Remove any CR and white space at the end of the line, and terminate the
1590string. */
1591
3ee512ff
PH
1592while (ptr > 0 && isspace(smtp_cmd_buffer[ptr-1])) ptr--;
1593smtp_cmd_buffer[ptr] = 0;
059ec3d9 1594
3ee512ff 1595DEBUG(D_receive) debug_printf("SMTP<< %s\n", smtp_cmd_buffer);
059ec3d9
PH
1596
1597/* NULLs are not allowed in SMTP commands */
1598
1599if (hadnull) return BADCHAR_CMD;
1600
1601/* Scan command list and return identity, having set the data pointer
1602to the start of the actual data characters. Check for SMTP synchronization
1603if required. */
1604
1605for (p = cmd_list; p < cmd_list_end; p++)
1606 {
1811cb4c 1607#ifdef SUPPORT_PROXY
a3c86431 1608 /* Only allow QUIT command if Proxy Protocol parsing failed */
1811cb4c
JH
1609 if (proxy_session && proxy_session_failed && p->cmd != QUIT_CMD)
1610 continue;
1611#endif
2f460950
JH
1612 if ( p->len
1613 && strncmpic(smtp_cmd_buffer, US p->name, p->len) == 0
1614 && ( smtp_cmd_buffer[p->len-1] == ':' /* "mail from:" or "rcpt to:" */
1615 || smtp_cmd_buffer[p->len] == 0
1616 || smtp_cmd_buffer[p->len] == ' '
1617 ) )
059ec3d9
PH
1618 {
1619 if (smtp_inptr < smtp_inend && /* Outstanding input */
1620 p->cmd < sync_cmd_limit && /* Command should sync */
1621 check_sync && /* Local flag set */
1622 smtp_enforce_sync && /* Global flag set */
1623 sender_host_address != NULL && /* Not local input */
1624 !sender_host_notsocket) /* Really is a socket */
1625 return BADSYN_CMD;
1626
ca86f471
PH
1627 /* The variables $smtp_command and $smtp_command_argument point into the
1628 unmodified input buffer. A copy of the latter is taken for actual
1629 processing, so that it can be chopped up into separate parts if necessary,
1630 for example, when processing a MAIL command options such as SIZE that can
1631 follow the sender address. */
059ec3d9 1632
3ee512ff 1633 smtp_cmd_argument = smtp_cmd_buffer + p->len;
ca86f471
PH
1634 while (isspace(*smtp_cmd_argument)) smtp_cmd_argument++;
1635 Ustrcpy(smtp_data_buffer, smtp_cmd_argument);
1636 smtp_cmd_data = smtp_data_buffer;
059ec3d9
PH
1637
1638 /* Count non-mail commands from those hosts that are controlled in this
1639 way. The default is all hosts. We don't waste effort checking the list
1640 until we get a non-mail command, but then cache the result to save checking
1641 again. If there's a DEFER while checking the host, assume it's in the list.
1642
1643 Note that one instance of RSET, EHLO/HELO, and STARTTLS is allowed at the
1644 start of each incoming message by fiddling with the value in the table. */
1645
1646 if (!p->is_mail_cmd)
1647 {
1648 if (count_nonmail == TRUE_UNSET) count_nonmail =
1649 verify_check_host(&smtp_accept_max_nonmail_hosts) != FAIL;
1650 if (count_nonmail && ++nonmail_command_count > smtp_accept_max_nonmail)
1651 return TOO_MANY_NONMAIL_CMD;
1652 }
1653
ca86f471
PH
1654 /* If there is data for a command that does not expect it, generate the
1655 error here. */
059ec3d9 1656
ca86f471 1657 return (p->has_arg || *smtp_cmd_data == 0)? p->cmd : BADARG_CMD;
059ec3d9
PH
1658 }
1659 }
1660
cee5f132 1661#ifdef SUPPORT_PROXY
a3c86431
TL
1662/* Only allow QUIT command if Proxy Protocol parsing failed */
1663if (proxy_session && proxy_session_failed)
1664 return PROXY_FAIL_IGNORE_CMD;
1665#endif
1666
059ec3d9
PH
1667/* Enforce synchronization for unknown commands */
1668
ecce6d9a
JH
1669if ( smtp_inptr < smtp_inend /* Outstanding input */
1670 && check_sync /* Local flag set */
1671 && smtp_enforce_sync /* Global flag set */
1672 && sender_host_address /* Not local input */
1673 && !sender_host_notsocket) /* Really is a socket */
059ec3d9
PH
1674 return BADSYN_CMD;
1675
1676return OTHER_CMD;
1677}
1678
1679
1680
1681/*************************************************
1682* Forced closedown of call *
1683*************************************************/
1684
1685/* This function is called from log.c when Exim is dying because of a serious
1686disaster, and also from some other places. If an incoming non-batched SMTP
1687channel is open, it swallows the rest of the incoming message if in the DATA
1688phase, sends the reply string, and gives an error to all subsequent commands
1689except QUIT. The existence of an SMTP call is detected by the non-NULLness of
1690smtp_in.
1691
8f128379
PH
1692Arguments:
1693 message SMTP reply string to send, excluding the code
1694
059ec3d9
PH
1695Returns: nothing
1696*/
1697
1698void
1699smtp_closedown(uschar *message)
1700{
db57e575 1701if (!smtp_in || smtp_batched_input) return;
059ec3d9 1702receive_swallow_smtp();
925ac8e4 1703smtp_printf("421 %s\r\n", FALSE, message);
059ec3d9 1704
bd8fbe36 1705for (;;) switch(smtp_read_command(FALSE, GETC_BUFFER_UNLIMITED))
059ec3d9 1706 {
60d10ce7 1707 case EOF_CMD:
db57e575 1708 return;
059ec3d9 1709
60d10ce7 1710 case QUIT_CMD:
db57e575
JH
1711 smtp_printf("221 %s closing connection\r\n", FALSE, smtp_active_hostname);
1712 mac_smtp_fflush();
1713 return;
059ec3d9 1714
60d10ce7 1715 case RSET_CMD:
db57e575
JH
1716 smtp_printf("250 Reset OK\r\n", FALSE);
1717 break;
059ec3d9 1718
60d10ce7 1719 default:
db57e575
JH
1720 smtp_printf("421 %s\r\n", FALSE, message);
1721 break;
059ec3d9
PH
1722 }
1723}
1724
1725
1726
1727
1728/*************************************************
1729* Set up connection info for logging *
1730*************************************************/
1731
1732/* This function is called when logging information about an SMTP connection.
1733It sets up appropriate source information, depending on the type of connection.
dac79d3e
PH
1734If sender_fullhost is NULL, we are at a very early stage of the connection;
1735just use the IP address.
059ec3d9
PH
1736
1737Argument: none
1738Returns: a string describing the connection
1739*/
1740
1741uschar *
1742smtp_get_connection_info(void)
1743{
f5d25c2b
JH
1744const uschar * hostname = sender_fullhost
1745 ? sender_fullhost : sender_host_address;
dac79d3e 1746
059ec3d9 1747if (host_checking)
dac79d3e 1748 return string_sprintf("SMTP connection from %s", hostname);
059ec3d9
PH
1749
1750if (sender_host_unknown || sender_host_notsocket)
1751 return string_sprintf("SMTP connection from %s", sender_ident);
1752
1753if (is_inetd)
dac79d3e 1754 return string_sprintf("SMTP connection from %s (via inetd)", hostname);
059ec3d9 1755
6c6d6e48 1756if (LOGGING(incoming_interface) && interface_address != NULL)
dac79d3e 1757 return string_sprintf("SMTP connection from %s I=[%s]:%d", hostname,
059ec3d9
PH
1758 interface_address, interface_port);
1759
dac79d3e 1760return string_sprintf("SMTP connection from %s", hostname);
059ec3d9
PH
1761}
1762
1763
1764
e45a1c37 1765#ifdef SUPPORT_TLS
887291d2
JH
1766/* Append TLS-related information to a log line
1767
1768Arguments:
acec9514 1769 g String under construction: allocated string to extend, or NULL
887291d2
JH
1770
1771Returns: Allocated string or NULL
1772*/
acec9514
JH
1773static gstring *
1774s_tlslog(gstring * g)
e45a1c37 1775{
acec9514
JH
1776if (LOGGING(tls_cipher) && tls_in.cipher)
1777 g = string_append(g, 2, US" X=", tls_in.cipher);
1778if (LOGGING(tls_certificate_verified) && tls_in.cipher)
1779 g = string_append(g, 2, US" CV=", tls_in.certificate_verified? "yes":"no");
1780if (LOGGING(tls_peerdn) && tls_in.peerdn)
1781 g = string_append(g, 3, US" DN=\"", string_printing(tls_in.peerdn), US"\"");
1782if (LOGGING(tls_sni) && tls_in.sni)
1783 g = string_append(g, 3, US" SNI=\"", string_printing(tls_in.sni), US"\"");
1784return g;
e45a1c37
JH
1785}
1786#endif
1787
b4ed4da0
PH
1788/*************************************************
1789* Log lack of MAIL if so configured *
1790*************************************************/
1791
1792/* This function is called when an SMTP session ends. If the log selector
1793smtp_no_mail is set, write a log line giving some details of what has happened
1794in the SMTP session.
1795
1796Arguments: none
1797Returns: nothing
1798*/
1799
1800void
1801smtp_log_no_mail(void)
1802{
acec9514
JH
1803int i;
1804uschar * sep, * s;
1805gstring * g = NULL;
b4ed4da0 1806
6c6d6e48 1807if (smtp_mailcmd_count > 0 || !LOGGING(smtp_no_mail))
b4ed4da0
PH
1808 return;
1809
db57e575 1810if (sender_host_authenticated)
b4ed4da0 1811 {
acec9514
JH
1812 g = string_append(g, 2, US" A=", sender_host_authenticated);
1813 if (authenticated_id) g = string_append(g, 2, US":", authenticated_id);
b4ed4da0
PH
1814 }
1815
1816#ifdef SUPPORT_TLS
acec9514 1817g = s_tlslog(g);
3f0945ff 1818#endif
b4ed4da0 1819
acec9514
JH
1820sep = smtp_connection_had[SMTP_HBUFF_SIZE-1] != SCH_NONE ? US" C=..." : US" C=";
1821
b4ed4da0 1822for (i = smtp_ch_index; i < SMTP_HBUFF_SIZE; i++)
b4ed4da0
PH
1823 if (smtp_connection_had[i] != SCH_NONE)
1824 {
acec9514 1825 g = string_append(g, 2, sep, smtp_names[smtp_connection_had[i]]);
b4ed4da0
PH
1826 sep = US",";
1827 }
b4ed4da0
PH
1828
1829for (i = 0; i < smtp_ch_index; i++)
1830 {
acec9514 1831 g = string_append(g, 2, sep, smtp_names[smtp_connection_had[i]]);
b4ed4da0
PH
1832 sep = US",";
1833 }
1834
acec9514
JH
1835if (!(s = string_from_gstring(g))) s = US"";
1836
a2673768
JH
1837log_write(0, LOG_MAIN, "no MAIL in %sSMTP connection from %s D=%s%s",
1838 tcp_in_fastopen ? US"TFO " : US"",
0f1a8658 1839 host_and_ident(FALSE), string_timesince(&smtp_connection_start), s);
b4ed4da0
PH
1840}
1841
1842
a09f2942
JH
1843/* Return list of recent smtp commands */
1844
1845uschar *
1846smtp_cmd_hist(void)
1847{
acec9514
JH
1848int i;
1849gstring * list = NULL;
1850uschar * s;
a09f2942
JH
1851
1852for (i = smtp_ch_index; i < SMTP_HBUFF_SIZE; i++)
1853 if (smtp_connection_had[i] != SCH_NONE)
acec9514
JH
1854 list = string_append_listele(list, ',', smtp_names[smtp_connection_had[i]]);
1855
a09f2942 1856for (i = 0; i < smtp_ch_index; i++)
acec9514
JH
1857 list = string_append_listele(list, ',', smtp_names[smtp_connection_had[i]]);
1858
1859s = string_from_gstring(list);
1860return s ? s : US"";
a09f2942
JH
1861}
1862
1863
1864
b4ed4da0 1865
059ec3d9
PH
1866/*************************************************
1867* Check HELO line and set sender_helo_name *
1868*************************************************/
1869
1870/* Check the format of a HELO line. The data for HELO/EHLO is supposed to be
1871the domain name of the sending host, or an ip literal in square brackets. The
4c04137d 1872argument is placed in sender_helo_name, which is in malloc store, because it
059ec3d9
PH
1873must persist over multiple incoming messages. If helo_accept_junk is set, this
1874host is permitted to send any old junk (needed for some broken hosts).
1875Otherwise, helo_allow_chars can be used for rogue characters in general
1876(typically people want to let in underscores).
1877
1878Argument:
1879 s the data portion of the line (already past any white space)
1880
1881Returns: TRUE or FALSE
1882*/
1883
1884static BOOL
1885check_helo(uschar *s)
1886{
1887uschar *start = s;
1888uschar *end = s + Ustrlen(s);
1889BOOL yield = helo_accept_junk;
1890
1891/* Discard any previous helo name */
1892
2d0dc929 1893if (sender_helo_name)
059ec3d9
PH
1894 {
1895 store_free(sender_helo_name);
1896 sender_helo_name = NULL;
1897 }
1898
1899/* Skip tests if junk is permitted. */
1900
1901if (!yield)
db57e575 1902
059ec3d9
PH
1903 /* Allow the new standard form for IPv6 address literals, namely,
1904 [IPv6:....], and because someone is bound to use it, allow an equivalent
1905 IPv4 form. Allow plain addresses as well. */
1906
1907 if (*s == '[')
1908 {
1909 if (end[-1] == ']')
1910 {
1911 end[-1] = 0;
1912 if (strncmpic(s, US"[IPv6:", 6) == 0)
1913 yield = (string_is_ip_address(s+6, NULL) == 6);
1914 else if (strncmpic(s, US"[IPv4:", 6) == 0)
1915 yield = (string_is_ip_address(s+6, NULL) == 4);
1916 else
1917 yield = (string_is_ip_address(s+1, NULL) != 0);
1918 end[-1] = ']';
1919 }
1920 }
1921
1922 /* Non-literals must be alpha, dot, hyphen, plus any non-valid chars
1923 that have been configured (usually underscore - sigh). */
1924
db57e575
JH
1925 else if (*s)
1926 for (yield = TRUE; *s; s++)
059ec3d9
PH
1927 if (!isalnum(*s) && *s != '.' && *s != '-' &&
1928 Ustrchr(helo_allow_chars, *s) == NULL)
1929 {
1930 yield = FALSE;
1931 break;
1932 }
059ec3d9
PH
1933
1934/* Save argument if OK */
1935
1936if (yield) sender_helo_name = string_copy_malloc(start);
1937return yield;
1938}
1939
1940
1941
1942
1943
1944/*************************************************
1945* Extract SMTP command option *
1946*************************************************/
1947
ca86f471 1948/* This function picks the next option setting off the end of smtp_cmd_data. It
059ec3d9
PH
1949is called for MAIL FROM and RCPT TO commands, to pick off the optional ESMTP
1950things that can appear there.
1951
1952Arguments:
1953 name point this at the name
1954 value point this at the data string
1955
1956Returns: TRUE if found an option
1957*/
1958
1959static BOOL
1960extract_option(uschar **name, uschar **value)
1961{
1962uschar *n;
ca86f471 1963uschar *v = smtp_cmd_data + Ustrlen(smtp_cmd_data) - 1;
059ec3d9
PH
1964while (isspace(*v)) v--;
1965v[1] = 0;
d7a2c833
JH
1966while (v > smtp_cmd_data && *v != '=' && !isspace(*v))
1967 {
1968 /* Take care to not stop at a space embedded in a quoted local-part */
1969
1970 if (*v == '"') do v--; while (*v != '"' && v > smtp_cmd_data+1);
1971 v--;
1972 }
059ec3d9
PH
1973
1974n = v;
fd98a5c6 1975if (*v == '=')
a2673768 1976 {
fd98a5c6
JH
1977 while(isalpha(n[-1])) n--;
1978 /* RFC says SP, but TAB seen in wild and other major MTAs accept it */
1979 if (!isspace(n[-1])) return FALSE;
1980 n[-1] = 0;
a2673768 1981 }
fd98a5c6 1982else
a2673768 1983 {
fd98a5c6
JH
1984 n++;
1985 if (v == smtp_cmd_data) return FALSE;
a2673768 1986 }
059ec3d9 1987*v++ = 0;
fd98a5c6 1988*name = n;
059ec3d9
PH
1989*value = v;
1990return TRUE;
1991}
1992
1993
1994
1995
1996
059ec3d9
PH
1997/*************************************************
1998* Reset for new message *
1999*************************************************/
2000
2001/* This function is called whenever the SMTP session is reset from
e04bfa34 2002within either of the setup functions; also from the daemon loop.
059ec3d9
PH
2003
2004Argument: the stacking pool storage reset point
2005Returns: nothing
2006*/
2007
e04bfa34 2008void
059ec3d9
PH
2009smtp_reset(void *reset_point)
2010{
059ec3d9
PH
2011recipients_list = NULL;
2012rcpt_count = rcpt_defer_count = rcpt_fail_count =
2013 raw_recipients_count = recipients_count = recipients_list_max = 0;
2e0c1448 2014message_linecount = 0;
059ec3d9 2015message_size = -1;
71fafd95 2016acl_added_headers = NULL;
e7568d51 2017acl_removed_headers = NULL;
059ec3d9 2018queue_only_policy = FALSE;
2679d413
PH
2019rcpt_smtp_response = NULL;
2020rcpt_smtp_response_same = TRUE;
2021rcpt_in_progress = FALSE;
69358f02 2022deliver_freeze = FALSE; /* Can be set by ACL */
6a3f1455 2023freeze_tell = freeze_tell_config; /* Can be set by ACL */
29aba418 2024fake_response = OK; /* Can be set by ACL */
6951ac6c 2025#ifdef WITH_CONTENT_SCAN
8523533c
TK
2026no_mbox_unspool = FALSE; /* Can be set by ACL */
2027#endif
69358f02 2028submission_mode = FALSE; /* Can be set by ACL */
f4ee74ac 2029suppress_local_fixups = suppress_local_fixups_default; /* Can be set by ACL */
69358f02
PH
2030active_local_from_check = local_from_check; /* Can be set by ACL */
2031active_local_sender_retain = local_sender_retain; /* Can be set by ACL */
90341c71
JH
2032sending_ip_address = NULL;
2033return_path = sender_address = NULL;
2034sender_data = NULL; /* Can be set by ACL */
c679ee08
JH
2035deliver_localpart_parent = deliver_localpart_orig = NULL;
2036deliver_domain_parent = deliver_domain_orig = NULL;
90341c71 2037callout_address = NULL;
2fe1a124 2038submission_name = NULL; /* Can be set by ACL */
059ec3d9
PH
2039raw_sender = NULL; /* After SMTP rewrite, before qualifying */
2040sender_address_unrewritten = NULL; /* Set only after verify rewrite */
2041sender_verified_list = NULL; /* No senders verified */
2042memset(sender_address_cache, 0, sizeof(sender_address_cache));
2043memset(sender_domain_cache, 0, sizeof(sender_domain_cache));
6c1c3d1d 2044
059ec3d9 2045authenticated_sender = NULL;
8523533c
TK
2046#ifdef EXPERIMENTAL_BRIGHTMAIL
2047bmi_run = 0;
2048bmi_verdicts = NULL;
2049#endif
90341c71 2050dnslist_domain = dnslist_matched = NULL;
01067968
JH
2051#ifdef SUPPORT_SPF
2052spf_header_comment = spf_received = spf_result = spf_smtp_comment = NULL;
2053spf_result_guessed = FALSE;
2054#endif
80a47a2c 2055#ifndef DISABLE_DKIM
d342446f 2056dkim_cur_signer = dkim_signers =
b4757e36 2057dkim_signing_domain = dkim_signing_selector = dkim_signatures = NULL;
d342446f 2058dkim_cur_signer = dkim_signers = dkim_signing_domain = dkim_signing_selector = NULL;
64b67b65
JH
2059dkim_disable_verify = FALSE;
2060dkim_collect_input = 0;
d342446f
JH
2061dkim_verify_overall = dkim_verify_status = dkim_verify_reason = NULL;
2062dkim_key_length = 0;
2063dkim_verify_signers = US"$dkim_signers";
f7572e5a 2064#endif
b4757e36
JH
2065#ifdef EXPERIMENTAL_DMARC
2066dmarc_has_been_checked = dmarc_disable_verify = dmarc_enable_forensic = FALSE;
8aeef98a 2067dmarc_domain_policy = dmarc_status = dmarc_status_text =
6372d4c9 2068dmarc_used_domain = NULL;
f7572e5a 2069#endif
01067968
JH
2070#ifdef EXPERIMENTAL_ARC
2071arc_state = arc_state_reason = NULL;
b4757e36 2072#endif
aa368db3
JH
2073dsn_ret = 0;
2074dsn_envid = NULL;
90341c71 2075deliver_host = deliver_host_address = NULL; /* Can be set by ACL */
aa368db3
JH
2076#ifndef DISABLE_PRDR
2077prdr_requested = FALSE;
2078#endif
8c5d388a 2079#ifdef SUPPORT_I18N
d1a13eea
JH
2080message_smtputf8 = FALSE;
2081#endif
059ec3d9
PH
2082body_linecount = body_zerocount = 0;
2083
870f6ba8
TF
2084sender_rate = sender_rate_limit = sender_rate_period = NULL;
2085ratelimiters_mail = NULL; /* Updated by ratelimit ACL condition */
2086 /* Note that ratelimiters_conn persists across resets. */
2087
38a0a95f 2088/* Reset message ACL variables */
47ca6d6c 2089
38a0a95f 2090acl_var_m = NULL;
059ec3d9
PH
2091
2092/* The message body variables use malloc store. They may be set if this is
2093not the first message in an SMTP session and the previous message caused them
2094to be referenced in an ACL. */
2095
90341c71 2096if (message_body)
059ec3d9
PH
2097 {
2098 store_free(message_body);
2099 message_body = NULL;
2100 }
2101
90341c71 2102if (message_body_end)
059ec3d9
PH
2103 {
2104 store_free(message_body_end);
2105 message_body_end = NULL;
2106 }
2107
2108/* Warning log messages are also saved in malloc store. They are saved to avoid
2109repetition in the same message, but it seems right to repeat them for different
4e88a19f 2110messages. */
059ec3d9 2111
90341c71 2112while (acl_warn_logged)
059ec3d9
PH
2113 {
2114 string_item *this = acl_warn_logged;
2115 acl_warn_logged = acl_warn_logged->next;
2116 store_free(this);
2117 }
90341c71 2118store_reset(reset_point);
059ec3d9
PH
2119}
2120
2121
2122
2123
2124
2125/*************************************************
2126* Initialize for incoming batched SMTP message *
2127*************************************************/
2128
2129/* This function is called from smtp_setup_msg() in the case when
2130smtp_batched_input is true. This happens when -bS is used to pass a whole batch
2131of messages in one file with SMTP commands between them. All errors must be
2132reported by sending a message, and only MAIL FROM, RCPT TO, and DATA are
2133relevant. After an error on a sender, or an invalid recipient, the remainder
2134of the message is skipped. The value of received_protocol is already set.
2135
2136Argument: none
2137Returns: > 0 message successfully started (reached DATA)
2138 = 0 QUIT read or end of file reached
2139 < 0 should not occur
2140*/
2141
2142static int
2143smtp_setup_batch_msg(void)
2144{
2145int done = 0;
2146void *reset_point = store_get(0);
2147
2148/* Save the line count at the start of each transaction - single commands
2149like HELO and RSET count as whole transactions. */
2150
2151bsmtp_transaction_linecount = receive_linecount;
2152
2153if ((receive_feof)()) return 0; /* Treat EOF as QUIT */
2154
57cc2785 2155cancel_cutthrough_connection(TRUE, US"smtp_setup_batch_msg");
059ec3d9
PH
2156smtp_reset(reset_point); /* Reset for start of message */
2157
2158/* Deal with SMTP commands. This loop is exited by setting done to a POSITIVE
2159value. The values are 2 larger than the required yield of the function. */
2160
2161while (done <= 0)
2162 {
2163 uschar *errmess;
2164 uschar *recipient = NULL;
2165 int start, end, sender_domain, recipient_domain;
2166
bd8fbe36 2167 switch(smtp_read_command(FALSE, GETC_BUFFER_UNLIMITED))
059ec3d9
PH
2168 {
2169 /* The HELO/EHLO commands set sender_address_helo if they have
2170 valid data; otherwise they are ignored, except that they do
2171 a reset of the state. */
2172
2173 case HELO_CMD:
2174 case EHLO_CMD:
2175
db57e575
JH
2176 check_helo(smtp_cmd_data);
2177 /* Fall through */
059ec3d9
PH
2178
2179 case RSET_CMD:
db57e575
JH
2180 cancel_cutthrough_connection(TRUE, US"RSET received");
2181 smtp_reset(reset_point);
2182 bsmtp_transaction_linecount = receive_linecount;
2183 break;
059ec3d9
PH
2184
2185
2186 /* The MAIL FROM command requires an address as an operand. All we
2187 do here is to parse it for syntactic correctness. The form "<>" is
2188 a special case which converts into an empty string. The start/end
2189 pointers in the original are not used further for this address, as
2190 it is the canonical extracted address which is all that is kept. */
2191
2192 case MAIL_CMD:
db57e575
JH
2193 smtp_mailcmd_count++; /* Count for no-mail log */
2194 if (sender_address != NULL)
2195 /* The function moan_smtp_batch() does not return. */
2196 moan_smtp_batch(smtp_cmd_buffer, "503 Sender already given");
059ec3d9 2197
db57e575
JH
2198 if (smtp_cmd_data[0] == 0)
2199 /* The function moan_smtp_batch() does not return. */
2200 moan_smtp_batch(smtp_cmd_buffer, "501 MAIL FROM must have an address operand");
059ec3d9 2201
db57e575 2202 /* Reset to start of message */
059ec3d9 2203
db57e575
JH
2204 cancel_cutthrough_connection(TRUE, US"MAIL received");
2205 smtp_reset(reset_point);
059ec3d9 2206
db57e575 2207 /* Apply SMTP rewrite */
059ec3d9 2208
db57e575
JH
2209 raw_sender = ((rewrite_existflags & rewrite_smtp) != 0)?
2210 rewrite_one(smtp_cmd_data, rewrite_smtp|rewrite_smtp_sender, NULL, FALSE,
2211 US"", global_rewrite_rules) : smtp_cmd_data;
059ec3d9 2212
db57e575 2213 /* Extract the address; the TRUE flag allows <> as valid */
059ec3d9 2214
db57e575
JH
2215 raw_sender =
2216 parse_extract_address(raw_sender, &errmess, &start, &end, &sender_domain,
2217 TRUE);
059ec3d9 2218
db57e575
JH
2219 if (!raw_sender)
2220 /* The function moan_smtp_batch() does not return. */
2221 moan_smtp_batch(smtp_cmd_buffer, "501 %s", errmess);
059ec3d9 2222
db57e575 2223 sender_address = string_copy(raw_sender);
059ec3d9 2224
db57e575 2225 /* Qualify unqualified sender addresses if permitted to do so. */
059ec3d9 2226
db57e575
JH
2227 if ( !sender_domain
2228 && sender_address[0] != 0 && sender_address[0] != '@')
2229 if (allow_unqualified_sender)
2230 {
2231 sender_address = rewrite_address_qualify(sender_address, FALSE);
2232 DEBUG(D_receive) debug_printf("unqualified address %s accepted "
2233 "and rewritten\n", raw_sender);
2234 }
2235 /* The function moan_smtp_batch() does not return. */
2236 else
2237 moan_smtp_batch(smtp_cmd_buffer, "501 sender address must contain "
2238 "a domain");
2239 break;
059ec3d9
PH
2240
2241
2242 /* The RCPT TO command requires an address as an operand. All we do
2243 here is to parse it for syntactic correctness. There may be any number
2244 of RCPT TO commands, specifying multiple senders. We build them all into
2245 a data structure that is in argc/argv format. The start/end values
2246 given by parse_extract_address are not used, as we keep only the
2247 extracted address. */
2248
2249 case RCPT_CMD:
db57e575
JH
2250 if (!sender_address)
2251 /* The function moan_smtp_batch() does not return. */
2252 moan_smtp_batch(smtp_cmd_buffer, "503 No sender yet given");
059ec3d9 2253
db57e575
JH
2254 if (smtp_cmd_data[0] == 0)
2255 /* The function moan_smtp_batch() does not return. */
2256 moan_smtp_batch(smtp_cmd_buffer,
2257 "501 RCPT TO must have an address operand");
059ec3d9 2258
db57e575 2259 /* Check maximum number allowed */
059ec3d9 2260
db57e575
JH
2261 if (recipients_max > 0 && recipients_count + 1 > recipients_max)
2262 /* The function moan_smtp_batch() does not return. */
2263 moan_smtp_batch(smtp_cmd_buffer, "%s too many recipients",
2264 recipients_max_reject? "552": "452");
059ec3d9 2265
db57e575
JH
2266 /* Apply SMTP rewrite, then extract address. Don't allow "<>" as a
2267 recipient address */
059ec3d9 2268
db57e575
JH
2269 recipient = rewrite_existflags & rewrite_smtp
2270 ? rewrite_one(smtp_cmd_data, rewrite_smtp, NULL, FALSE, US"",
2271 global_rewrite_rules)
2272 : smtp_cmd_data;
059ec3d9 2273
db57e575
JH
2274 recipient = parse_extract_address(recipient, &errmess, &start, &end,
2275 &recipient_domain, FALSE);
059ec3d9 2276
db57e575
JH
2277 if (!recipient)
2278 /* The function moan_smtp_batch() does not return. */
2279 moan_smtp_batch(smtp_cmd_buffer, "501 %s", errmess);
059ec3d9 2280
db57e575
JH
2281 /* If the recipient address is unqualified, qualify it if permitted. Then
2282 add it to the list of recipients. */
059ec3d9 2283
db57e575
JH
2284 if (!recipient_domain)
2285 if (allow_unqualified_recipient)
2286 {
2287 DEBUG(D_receive) debug_printf("unqualified address %s accepted\n",
2288 recipient);
2289 recipient = rewrite_address_qualify(recipient, TRUE);
2290 }
2291 /* The function moan_smtp_batch() does not return. */
2292 else
2293 moan_smtp_batch(smtp_cmd_buffer,
2294 "501 recipient address must contain a domain");
2295
2296 receive_add_recipient(recipient, -1);
2297 break;
059ec3d9
PH
2298
2299
2300 /* The DATA command is legal only if it follows successful MAIL FROM
2301 and RCPT TO commands. This function is complete when a valid DATA
2302 command is encountered. */
2303
2304 case DATA_CMD:
db57e575
JH
2305 if (!sender_address || recipients_count <= 0)
2306 /* The function moan_smtp_batch() does not return. */
2307 if (!sender_address)
2308 moan_smtp_batch(smtp_cmd_buffer,
2309 "503 MAIL FROM:<sender> command must precede DATA");
2310 else
2311 moan_smtp_batch(smtp_cmd_buffer,
2312 "503 RCPT TO:<recipient> must precede DATA");
059ec3d9 2313 else
db57e575
JH
2314 {
2315 done = 3; /* DATA successfully achieved */
2316 message_ended = END_NOTENDED; /* Indicate in middle of message */
2317 }
2318 break;
059ec3d9
PH
2319
2320
2321 /* The VRFY, EXPN, HELP, ETRN, and NOOP commands are ignored. */
2322
2323 case VRFY_CMD:
2324 case EXPN_CMD:
2325 case HELP_CMD:
2326 case NOOP_CMD:
2327 case ETRN_CMD:
db57e575
JH
2328 bsmtp_transaction_linecount = receive_linecount;
2329 break;
059ec3d9
PH
2330
2331
2332 case EOF_CMD:
2333 case QUIT_CMD:
db57e575
JH
2334 done = 2;
2335 break;
059ec3d9
PH
2336
2337
2338 case BADARG_CMD:
db57e575
JH
2339 /* The function moan_smtp_batch() does not return. */
2340 moan_smtp_batch(smtp_cmd_buffer, "501 Unexpected argument data");
2341 break;
059ec3d9
PH
2342
2343
2344 case BADCHAR_CMD:
db57e575
JH
2345 /* The function moan_smtp_batch() does not return. */
2346 moan_smtp_batch(smtp_cmd_buffer, "501 Unexpected NULL in SMTP command");
2347 break;
059ec3d9
PH
2348
2349
2350 default:
db57e575
JH
2351 /* The function moan_smtp_batch() does not return. */
2352 moan_smtp_batch(smtp_cmd_buffer, "500 Command unrecognized");
2353 break;
059ec3d9
PH
2354 }
2355 }
2356
2357return done - 2; /* Convert yield values */
2358}
2359
2360
2361
2362
cf0c6164
JH
2363static BOOL
2364smtp_log_tls_fail(uschar * errstr)
2365{
2366uschar * conn_info = smtp_get_connection_info();
2367
2368if (Ustrncmp(conn_info, US"SMTP ", 5) == 0) conn_info += 5;
2369/* I'd like to get separated H= here, but too hard for now */
2370
2371log_write(0, LOG_MAIN, "TLS error on %s %s", conn_info, errstr);
2372return FALSE;
2373}
2374
2375
a2673768
JH
2376
2377
2378#ifdef TCP_FASTOPEN
2379static void
2380tfo_in_check(void)
2381{
2382# ifdef TCP_INFO
2383struct tcp_info tinfo;
2384socklen_t len = sizeof(tinfo);
2385
2386if ( getsockopt(fileno(smtp_out), IPPROTO_TCP, TCP_INFO, &tinfo, &len) == 0
2387 && tinfo.tcpi_state == TCP_SYN_RECV
2388 )
2389 {
1ccd5f67 2390 DEBUG(D_receive) debug_printf("TCP_FASTOPEN mode connection (state TCP_SYN_RECV)\n");
a2673768
JH
2391 tcp_in_fastopen = TRUE;
2392 }
2393# endif
2394}
2395#endif
2396
2397
059ec3d9
PH
2398/*************************************************
2399* Start an SMTP session *
2400*************************************************/
2401
2402/* This function is called at the start of an SMTP session. Thereafter,
2403smtp_setup_msg() is called to initiate each separate message. This
2404function does host-specific testing, and outputs the banner line.
2405
2406Arguments: none
2407Returns: FALSE if the session can not continue; something has
2408 gone wrong, or the connection to the host is blocked
2409*/
2410
2411BOOL
2412smtp_start_session(void)
2413{
acec9514 2414int esclen;
4e88a19f
PH
2415uschar *user_msg, *log_msg;
2416uschar *code, *esc;
acec9514
JH
2417uschar *p, *s;
2418gstring * ss;
059ec3d9 2419
0f1a8658 2420gettimeofday(&smtp_connection_start, NULL);
b4ed4da0
PH
2421for (smtp_ch_index = 0; smtp_ch_index < SMTP_HBUFF_SIZE; smtp_ch_index++)
2422 smtp_connection_had[smtp_ch_index] = SCH_NONE;
2423smtp_ch_index = 0;
2424
00f00ca5
PH
2425/* Default values for certain variables */
2426
059ec3d9 2427helo_seen = esmtp = helo_accept_junk = FALSE;
b4ed4da0 2428smtp_mailcmd_count = 0;
059ec3d9
PH
2429count_nonmail = TRUE_UNSET;
2430synprot_error_count = unknown_command_count = nonmail_command_count = 0;
2431smtp_delay_mail = smtp_rlm_base;
2432auth_advertised = FALSE;
3fc73bdc 2433smtp_in_pipelining_advertised = smtp_in_pipelining_used = FALSE;
cf8b11a5 2434pipelining_enable = TRUE;
059ec3d9 2435sync_cmd_limit = NON_SYNC_CMD_NON_PIPELINING;
8f128379 2436smtp_exit_function_called = FALSE; /* For avoiding loop in not-quit exit */
059ec3d9 2437
33d73e3b
PH
2438/* If receiving by -bs from a trusted user, or testing with -bh, we allow
2439authentication settings from -oMaa to remain in force. */
2440
c44ff8be
JH
2441if (!host_checking && !sender_host_notsocket)
2442 sender_host_auth_pubname = sender_host_authenticated = NULL;
059ec3d9
PH
2443authenticated_by = NULL;
2444
2445#ifdef SUPPORT_TLS
817d9f57 2446tls_in.cipher = tls_in.peerdn = NULL;
9d1c15ef
JH
2447tls_in.ourcert = tls_in.peercert = NULL;
2448tls_in.sni = NULL;
44662487 2449tls_in.ocsp = OCSP_NOT_REQ;
059ec3d9 2450tls_advertised = FALSE;
8ac90765
JH
2451# ifdef EXPERIMENTAL_REQUIRETLS
2452requiretls_advertised = FALSE;
2453# endif
059ec3d9 2454#endif
6c1c3d1d 2455dsn_advertised = FALSE;
8c5d388a 2456#ifdef SUPPORT_I18N
d1a13eea
JH
2457smtputf8_advertised = FALSE;
2458#endif
059ec3d9
PH
2459
2460/* Reset ACL connection variables */
2461
38a0a95f 2462acl_var_c = NULL;
059ec3d9 2463
ca86f471 2464/* Allow for trailing 0 in the command and data buffers. */
3ee512ff 2465
bd8fbe36 2466if (!(smtp_cmd_buffer = US malloc(2*SMTP_CMD_BUFFER_SIZE + 2)))
059ec3d9
PH
2467 log_write(0, LOG_MAIN|LOG_PANIC_DIE,
2468 "malloc() failed for SMTP command buffer");
40c90bca 2469
2416c261 2470smtp_cmd_buffer[0] = 0;
bd8fbe36 2471smtp_data_buffer = smtp_cmd_buffer + SMTP_CMD_BUFFER_SIZE + 1;
059ec3d9
PH
2472
2473/* For batched input, the protocol setting can be overridden from the
2474command line by a trusted caller. */
2475
2476if (smtp_batched_input)
2477 {
40c90bca 2478 if (!received_protocol) received_protocol = US"local-bsmtp";
059ec3d9
PH
2479 }
2480
2481/* For non-batched SMTP input, the protocol setting is forced here. It will be
2482reset later if any of EHLO/AUTH/STARTTLS are received. */
2483
2484else
2485 received_protocol =
e524074d 2486 (sender_host_address ? protocols : protocols_local) [pnormal];
059ec3d9
PH
2487
2488/* Set up the buffer for inputting using direct read() calls, and arrange to
ecce6d9a
JH
2489call the local functions instead of the standard C ones. Place a NUL at the
2490end of the buffer to safety-stop C-string reads from it. */
059ec3d9 2491
5903c6ff 2492if (!(smtp_inbuffer = US malloc(IN_BUFFER_SIZE)))
059ec3d9 2493 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "malloc() failed for SMTP input buffer");
ecce6d9a 2494smtp_inbuffer[IN_BUFFER_SIZE-1] = '\0';
40c90bca 2495
059ec3d9 2496receive_getc = smtp_getc;
0d81dabc 2497receive_getbuf = smtp_getbuf;
584e96c6 2498receive_get_cache = smtp_get_cache;
059ec3d9
PH
2499receive_ungetc = smtp_ungetc;
2500receive_feof = smtp_feof;
2501receive_ferror = smtp_ferror;
58eb016e 2502receive_smtp_buffered = smtp_buffered;
059ec3d9
PH
2503smtp_inptr = smtp_inend = smtp_inbuffer;
2504smtp_had_eof = smtp_had_error = 0;
2505
2506/* Set up the message size limit; this may be host-specific */
2507
d45b1de8 2508thismessage_size_limit = expand_string_integer(message_size_limit, TRUE);
db57e575 2509if (expand_string_message)
059ec3d9
PH
2510 {
2511 if (thismessage_size_limit == -1)
2512 log_write(0, LOG_MAIN|LOG_PANIC, "unable to expand message_size_limit: "
2513 "%s", expand_string_message);
2514 else
2515 log_write(0, LOG_MAIN|LOG_PANIC, "invalid message_size_limit: "
2516 "%s", expand_string_message);
2517 smtp_closedown(US"Temporary local problem - please try later");
2518 return FALSE;
2519 }
2520
2521/* When a message is input locally via the -bs or -bS options, sender_host_
2522unknown is set unless -oMa was used to force an IP address, in which case it
2523is checked like a real remote connection. When -bs is used from inetd, this
2524flag is not set, causing the sending host to be checked. The code that deals
2525with IP source routing (if configured) is never required for -bs or -bS and
2526the flag sender_host_notsocket is used to suppress it.
2527
2528If smtp_accept_max and smtp_accept_reserve are set, keep some connections in
2529reserve for certain hosts and/or networks. */
2530
2531if (!sender_host_unknown)
2532 {
2533 int rc;
2534 BOOL reserved_host = FALSE;
2535
2536 /* Look up IP options (source routing info) on the socket if this is not an
2537 -oMa "host", and if any are found, log them and drop the connection.
2538
2539 Linux (and others now, see below) is different to everyone else, so there
2540 has to be some conditional compilation here. Versions of Linux before 2.1.15
2541 used a structure whose name was "options". Somebody finally realized that
2542 this name was silly, and it got changed to "ip_options". I use the
2543 newer name here, but there is a fudge in the script that sets up os.h
2544 to define a macro in older Linux systems.
2545
2546 Sigh. Linux is a fast-moving target. Another generation of Linux uses
2547 glibc 2, which has chosen ip_opts for the structure name. This is now
2548 really a glibc thing rather than a Linux thing, so the condition name
2549 has been changed to reflect this. It is relevant also to GNU/Hurd.
2550
2551 Mac OS 10.x (Darwin) is like the later glibc versions, but without the
2552 setting of the __GLIBC__ macro, so we can't detect it automatically. There's
2553 a special macro defined in the os.h file.
2554
2555 Some DGUX versions on older hardware appear not to support IP options at
2556 all, so there is now a general macro which can be set to cut out this
2557 support altogether.
2558
2559 How to do this properly in IPv6 is not yet known. */
2560
e0574cb5 2561#if !HAVE_IPV6 && !defined(NO_IP_OPTIONS)
059ec3d9
PH
2562
2563 #ifdef GLIBC_IP_OPTIONS
2564 #if (!defined __GLIBC__) || (__GLIBC__ < 2)
2565 #define OPTSTYLE 1
2566 #else
2567 #define OPTSTYLE 2
2568 #endif
2569 #elif defined DARWIN_IP_OPTIONS
2570 #define OPTSTYLE 2
2571 #else
2572 #define OPTSTYLE 3
2573 #endif
2574
2575 if (!host_checking && !sender_host_notsocket)
2576 {
2577 #if OPTSTYLE == 1
36a3b041 2578 EXIM_SOCKLEN_T optlen = sizeof(struct ip_options) + MAX_IPOPTLEN;
059ec3d9
PH
2579 struct ip_options *ipopt = store_get(optlen);
2580 #elif OPTSTYLE == 2
2581 struct ip_opts ipoptblock;
2582 struct ip_opts *ipopt = &ipoptblock;
36a3b041 2583 EXIM_SOCKLEN_T optlen = sizeof(ipoptblock);
059ec3d9
PH
2584 #else
2585 struct ipoption ipoptblock;
2586 struct ipoption *ipopt = &ipoptblock;
36a3b041 2587 EXIM_SOCKLEN_T optlen = sizeof(ipoptblock);
059ec3d9
PH
2588 #endif
2589
2590 /* Occasional genuine failures of getsockopt() have been seen - for
2591 example, "reset by peer". Therefore, just log and give up on this
2592 call, unless the error is ENOPROTOOPT. This error is given by systems
2593 that have the interfaces but not the mechanism - e.g. GNU/Hurd at the time
2594 of writing. So for that error, carry on - we just can't do an IP options
2595 check. */
2596
2597 DEBUG(D_receive) debug_printf("checking for IP options\n");
2598
5903c6ff 2599 if (getsockopt(fileno(smtp_out), IPPROTO_IP, IP_OPTIONS, US (ipopt),
059ec3d9
PH
2600 &optlen) < 0)
2601 {
2602 if (errno != ENOPROTOOPT)
2603 {
2604 log_write(0, LOG_MAIN, "getsockopt() failed from %s: %s",
2605 host_and_ident(FALSE), strerror(errno));
925ac8e4 2606 smtp_printf("451 SMTP service not available\r\n", FALSE);
059ec3d9
PH
2607 return FALSE;
2608 }
2609 }
2610
2611 /* Deal with any IP options that are set. On the systems I have looked at,
2612 the value of MAX_IPOPTLEN has been 40, meaning that there should never be
2613 more logging data than will fit in big_buffer. Nevertheless, after somebody
2614 questioned this code, I've added in some paranoid checking. */
2615
2616 else if (optlen > 0)
2617 {
2618 uschar *p = big_buffer;
2619 uschar *pend = big_buffer + big_buffer_size;
2620 uschar *opt, *adptr;
2621 int optcount;
2622 struct in_addr addr;
2623
2624 #if OPTSTYLE == 1
5903c6ff 2625 uschar *optstart = US (ipopt->__data);
059ec3d9 2626 #elif OPTSTYLE == 2
5903c6ff 2627 uschar *optstart = US (ipopt->ip_opts);
059ec3d9 2628 #else
5903c6ff 2629 uschar *optstart = US (ipopt->ipopt_list);
059ec3d9
PH
2630 #endif
2631
2632 DEBUG(D_receive) debug_printf("IP options exist\n");
2633
2634 Ustrcpy(p, "IP options on incoming call:");
2635 p += Ustrlen(p);
2636
2637 for (opt = optstart; opt != NULL &&
5903c6ff 2638 opt < US (ipopt) + optlen;)
059ec3d9
PH
2639 {
2640 switch (*opt)
2641 {
2642 case IPOPT_EOL:
2643 opt = NULL;
2644 break;
2645
2646 case IPOPT_NOP:
2647 opt++;
2648 break;
2649
2650 case IPOPT_SSRR:
2651 case IPOPT_LSRR:
2652 if (!string_format(p, pend-p, " %s [@%s",
2653 (*opt == IPOPT_SSRR)? "SSRR" : "LSRR",
2654 #if OPTSTYLE == 1
2655 inet_ntoa(*((struct in_addr *)(&(ipopt->faddr))))))
2656 #elif OPTSTYLE == 2
2657 inet_ntoa(ipopt->ip_dst)))
2658 #else
2659 inet_ntoa(ipopt->ipopt_dst)))
2660 #endif
2661 {
2662 opt = NULL;
2663 break;
2664 }
2665
2666 p += Ustrlen(p);
2667 optcount = (opt[1] - 3) / sizeof(struct in_addr);
2668 adptr = opt + 3;
2669 while (optcount-- > 0)
2670 {
2671 memcpy(&addr, adptr, sizeof(addr));
2672 if (!string_format(p, pend - p - 1, "%s%s",
2673 (optcount == 0)? ":" : "@", inet_ntoa(addr)))
2674 {
2675 opt = NULL;
2676 break;
2677 }
2678 p += Ustrlen(p);
2679 adptr += sizeof(struct in_addr);
2680 }
2681 *p++ = ']';
2682 opt += opt[1];
2683 break;
2684
2685 default:
2686 {
2687 int i;
2688 if (pend - p < 4 + 3*opt[1]) { opt = NULL; break; }
2689 Ustrcat(p, "[ ");
2690 p += 2;
2691 for (i = 0; i < opt[1]; i++)
5976eb99 2692 p += sprintf(CS p, "%2.2x ", opt[i]);
059ec3d9
PH
2693 *p++ = ']';
2694 }
2695 opt += opt[1];
2696 break;
2697 }
2698 }
2699
2700 *p = 0;
2701 log_write(0, LOG_MAIN, "%s", big_buffer);
2702
2703 /* Refuse any call with IP options. This is what tcpwrappers 7.5 does. */
2704
2705 log_write(0, LOG_MAIN|LOG_REJECT,
2706 "connection from %s refused (IP options)", host_and_ident(FALSE));
2707
925ac8e4 2708 smtp_printf("554 SMTP service not available\r\n", FALSE);
059ec3d9
PH
2709 return FALSE;
2710 }
2711
2712 /* Length of options = 0 => there are no options */
2713
2714 else DEBUG(D_receive) debug_printf("no IP options found\n");
2715 }
e0574cb5 2716#endif /* HAVE_IPV6 && !defined(NO_IP_OPTIONS) */
059ec3d9
PH
2717
2718 /* Set keep-alive in socket options. The option is on by default. This
2719 setting is an attempt to get rid of some hanging connections that stick in
2720 read() when the remote end (usually a dialup) goes away. */
2721
2722 if (smtp_accept_keepalive && !sender_host_notsocket)
2723 ip_keepalive(fileno(smtp_out), sender_host_address, FALSE);
2724
2725 /* If the current host matches host_lookup, set the name by doing a
2726 reverse lookup. On failure, sender_host_name will be NULL and
2727 host_lookup_failed will be TRUE. This may or may not be serious - optional
2728 checks later. */
2729
2730 if (verify_check_host(&host_lookup) == OK)
2731 {
2732 (void)host_name_lookup();
2733 host_build_sender_fullhost();
2734 }
2735
2736 /* Delay this until we have the full name, if it is looked up. */
2737
2738 set_process_info("handling incoming connection from %s",
2739 host_and_ident(FALSE));
2740
1ad6489e
JH
2741 /* Expand smtp_receive_timeout, if needed */
2742
2743 if (smtp_receive_timeout_s)
2744 {
2745 uschar * exp;
2746 if ( !(exp = expand_string(smtp_receive_timeout_s))
2747 || !(*exp)
2748 || (smtp_receive_timeout = readconf_readtime(exp, 0, FALSE)) < 0
2749 )
2750 log_write(0, LOG_MAIN|LOG_PANIC,
2751 "bad value for smtp_receive_timeout: '%s'", exp ? exp : US"");
2752 }
2753
059ec3d9
PH
2754 /* Test for explicit connection rejection */
2755
2756 if (verify_check_host(&host_reject_connection) == OK)
2757 {
2758 log_write(L_connection_reject, LOG_MAIN|LOG_REJECT, "refused connection "
2759 "from %s (host_reject_connection)", host_and_ident(FALSE));
925ac8e4 2760 smtp_printf("554 SMTP service not available\r\n", FALSE);
059ec3d9
PH
2761 return FALSE;
2762 }
2763
afb3eaaf
PH
2764 /* Test with TCP Wrappers if so configured. There is a problem in that
2765 hosts_ctl() returns 0 (deny) under a number of system failure circumstances,
2766 such as disks dying. In these cases, it is desirable to reject with a 4xx
2767 error instead of a 5xx error. There isn't a "right" way to detect such
2768 problems. The following kludge is used: errno is zeroed before calling
2769 hosts_ctl(). If the result is "reject", a 5xx error is given only if the
2770 value of errno is 0 or ENOENT (which happens if /etc/hosts.{allow,deny} does
2771 not exist). */
059ec3d9 2772
1811cb4c 2773#ifdef USE_TCP_WRAPPERS
afb3eaaf 2774 errno = 0;
1811cb4c 2775 if (!(tcp_wrappers_name = expand_string(tcp_wrappers_daemon_name)))
5dc43717
JJ
2776 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Expansion of \"%s\" "
2777 "(tcp_wrappers_name) failed: %s", string_printing(tcp_wrappers_name),
2778 expand_string_message);
1811cb4c 2779
5dc43717 2780 if (!hosts_ctl(tcp_wrappers_name,
1811cb4c
JH
2781 sender_host_name ? CS sender_host_name : STRING_UNKNOWN,
2782 sender_host_address ? CS sender_host_address : STRING_UNKNOWN,
2783 sender_ident ? CS sender_ident : STRING_UNKNOWN))
059ec3d9 2784 {
afb3eaaf
PH
2785 if (errno == 0 || errno == ENOENT)
2786 {
2787 HDEBUG(D_receive) debug_printf("tcp wrappers rejection\n");
2788 log_write(L_connection_reject,
2789 LOG_MAIN|LOG_REJECT, "refused connection from %s "
2790 "(tcp wrappers)", host_and_ident(FALSE));
925ac8e4 2791 smtp_printf("554 SMTP service not available\r\n", FALSE);
afb3eaaf
PH
2792 }
2793 else
2794 {
2795 int save_errno = errno;
2796 HDEBUG(D_receive) debug_printf("tcp wrappers rejected with unexpected "
2797 "errno value %d\n", save_errno);
2798 log_write(L_connection_reject,
2799 LOG_MAIN|LOG_REJECT, "temporarily refused connection from %s "
2800 "(tcp wrappers errno=%d)", host_and_ident(FALSE), save_errno);
925ac8e4 2801 smtp_printf("451 Temporary local problem - please try later\r\n", FALSE);
afb3eaaf 2802 }
059ec3d9
PH
2803 return FALSE;
2804 }
1811cb4c 2805#endif
059ec3d9 2806
b01dd148
PH
2807 /* Check for reserved slots. The value of smtp_accept_count has already been
2808 incremented to include this process. */
059ec3d9
PH
2809
2810 if (smtp_accept_max > 0 &&
b01dd148 2811 smtp_accept_count > smtp_accept_max - smtp_accept_reserve)
059ec3d9
PH
2812 {
2813 if ((rc = verify_check_host(&smtp_reserve_hosts)) != OK)
2814 {
2815 log_write(L_connection_reject,
2816 LOG_MAIN, "temporarily refused connection from %s: not in "
2817 "reserve list: connected=%d max=%d reserve=%d%s",
b01dd148 2818 host_and_ident(FALSE), smtp_accept_count - 1, smtp_accept_max,
059ec3d9
PH
2819 smtp_accept_reserve, (rc == DEFER)? " (lookup deferred)" : "");
2820 smtp_printf("421 %s: Too many concurrent SMTP connections; "
925ac8e4 2821 "please try again later\r\n", FALSE, smtp_active_hostname);
059ec3d9
PH
2822 return FALSE;
2823 }
2824 reserved_host = TRUE;
2825 }
2826
2827 /* If a load level above which only messages from reserved hosts are
2828 accepted is set, check the load. For incoming calls via the daemon, the
2829 check is done in the superior process if there are no reserved hosts, to
2830 save a fork. In all cases, the load average will already be available
2831 in a global variable at this point. */
2832
2833 if (smtp_load_reserve >= 0 &&
2834 load_average > smtp_load_reserve &&
2835 !reserved_host &&
2836 verify_check_host(&smtp_reserve_hosts) != OK)
2837 {
2838 log_write(L_connection_reject,
2839 LOG_MAIN, "temporarily refused connection from %s: not in "
2840 "reserve list and load average = %.2f", host_and_ident(FALSE),
2841 (double)load_average/1000.0);
925ac8e4 2842 smtp_printf("421 %s: Too much load; please try again later\r\n", FALSE,
059ec3d9
PH
2843 smtp_active_hostname);
2844 return FALSE;
2845 }
2846
2847 /* Determine whether unqualified senders or recipients are permitted
2848 for this host. Unfortunately, we have to do this every time, in order to
2849 set the flags so that they can be inspected when considering qualifying
2850 addresses in the headers. For a site that permits no qualification, this
2851 won't take long, however. */
2852
2853 allow_unqualified_sender =
2854 verify_check_host(&sender_unqualified_hosts) == OK;
2855
2856 allow_unqualified_recipient =
2857 verify_check_host(&recipient_unqualified_hosts) == OK;
2858
2859 /* Determine whether HELO/EHLO is required for this host. The requirement
2860 can be hard or soft. */
2861
2862 helo_required = verify_check_host(&helo_verify_hosts) == OK;
2863 if (!helo_required)
2864 helo_verify = verify_check_host(&helo_try_verify_hosts) == OK;
2865
2866 /* Determine whether this hosts is permitted to send syntactic junk
2867 after a HELO or EHLO command. */
2868
2869 helo_accept_junk = verify_check_host(&helo_accept_junk_hosts) == OK;
2870 }
2871
2872/* For batch SMTP input we are now done. */
2873
2874if (smtp_batched_input) return TRUE;
2875
a3c86431
TL
2876/* If valid Proxy Protocol source is connecting, set up session.
2877 * Failure will not allow any SMTP function other than QUIT. */
1811cb4c
JH
2878
2879#ifdef SUPPORT_PROXY
a3c86431
TL
2880proxy_session = FALSE;
2881proxy_session_failed = FALSE;
2882if (check_proxy_protocol_host())
1811cb4c
JH
2883 setup_proxy_protocol_host();
2884#endif
2885
2886 /* Start up TLS if tls_on_connect is set. This is for supporting the legacy
2887 smtps port for use with older style SSL MTAs. */
2888
2889#ifdef SUPPORT_TLS
69d8eed7
JH
2890 if (tls_in.on_connect)
2891 {
2892 if (tls_server_start(tls_require_ciphers, &user_msg) != OK)
2893 return smtp_log_tls_fail(user_msg);
2894 cmd_list[CMD_LIST_TLS_AUTH].is_mail_cmd = TRUE;
2895 }
a3c86431
TL
2896#endif
2897
1811cb4c 2898/* Run the connect ACL if it exists */
059ec3d9 2899
4e88a19f 2900user_msg = NULL;
3cc3f762 2901if (acl_smtp_connect)
059ec3d9
PH
2902 {
2903 int rc;
3cc3f762
JH
2904 if ((rc = acl_check(ACL_WHERE_CONNECT, NULL, acl_smtp_connect, &user_msg,
2905 &log_msg)) != OK)
059ec3d9 2906 {
3cc3f762 2907 (void) smtp_handle_acl_fail(ACL_WHERE_CONNECT, rc, user_msg, log_msg);
059ec3d9
PH
2908 return FALSE;
2909 }
2910 }
2911
2912/* Output the initial message for a two-way SMTP connection. It may contain
2913newlines, which then cause a multi-line response to be given. */
2914
4e88a19f
PH
2915code = US"220"; /* Default status code */
2916esc = US""; /* Default extended status code */
2917esclen = 0; /* Length of esc */
2918
d4ff61d1 2919if (!user_msg)
4e88a19f 2920 {
d4ff61d1 2921 if (!(s = expand_string(smtp_banner)))
4e88a19f
PH
2922 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Expansion of \"%s\" (smtp_banner) "
2923 "failed: %s", smtp_banner, expand_string_message);
2924 }
2925else
2926 {
2927 int codelen = 3;
2928 s = user_msg;
4f6ae5c3 2929 smtp_message_code(&code, &codelen, &s, NULL, TRUE);
d6a96edc 2930 if (codelen > 4)
4e88a19f
PH
2931 {
2932 esc = code + 4;
2933 esclen = codelen - 4;
2934 }
2935 }
059ec3d9
PH
2936
2937/* Remove any terminating newlines; might as well remove trailing space too */
2938
2939p = s + Ustrlen(s);
2940while (p > s && isspace(p[-1])) p--;
2941*p = 0;
2942
2943/* It seems that CC:Mail is braindead, and assumes that the greeting message
2944is all contained in a single IP packet. The original code wrote out the
2945greeting using several calls to fprint/fputc, and on busy servers this could
2946cause it to be split over more than one packet - which caused CC:Mail to fall
2947over when it got the second part of the greeting after sending its first
2948command. Sigh. To try to avoid this, build the complete greeting message
2949first, and output it in one fell swoop. This gives a better chance of it
2950ending up as a single packet. */
2951
acec9514 2952ss = string_get(256);
059ec3d9
PH
2953
2954p = s;
2955do /* At least once, in case we have an empty string */
2956 {
2957 int len;
2958 uschar *linebreak = Ustrchr(p, '\n');
acec9514 2959 ss = string_catn(ss, code, 3);
db57e575 2960 if (!linebreak)
059ec3d9
PH
2961 {
2962 len = Ustrlen(p);
acec9514 2963 ss = string_catn(ss, US" ", 1);
059ec3d9
PH
2964 }
2965 else
2966 {
2967 len = linebreak - p;
acec9514 2968 ss = string_catn(ss, US"-", 1);
059ec3d9 2969 }
acec9514
JH
2970 ss = string_catn(ss, esc, esclen);
2971 ss = string_catn(ss, p, len);
2972 ss = string_catn(ss, US"\r\n", 2);
059ec3d9 2973 p += len;
db57e575 2974 if (linebreak) p++;
059ec3d9 2975 }
db57e575 2976while (*p);
059ec3d9 2977
059ec3d9
PH
2978/* Before we write the banner, check that there is no input pending, unless
2979this synchronisation check is disabled. */
2980
a14e5636 2981if (!check_sync())
059ec3d9 2982 {
40525d07
JH
2983 unsigned n = smtp_inend - smtp_inptr;
2984 if (n > 32) n = 32;
2985
a14e5636
PH
2986 log_write(0, LOG_MAIN|LOG_REJECT, "SMTP protocol "
2987 "synchronization error (input sent without waiting for greeting): "
2988 "rejected connection from %s input=\"%s\"", host_and_ident(TRUE),
40525d07 2989 string_printing(string_copyn(smtp_inptr, n)));
925ac8e4 2990 smtp_printf("554 SMTP synchronization error\r\n", FALSE);
a14e5636 2991 return FALSE;
059ec3d9
PH
2992 }
2993
2994/* Now output the banner */
2995
acec9514 2996smtp_printf("%s", FALSE, string_from_gstring(ss));
a2673768
JH
2997
2998/* Attempt to see if we sent the banner before the last ACK of the 3-way
2999handshake arrived. If so we must have managed a TFO. */
3000
3001#ifdef TCP_FASTOPEN
3002tfo_in_check();
3003#endif
3004
059ec3d9
PH
3005return TRUE;
3006}
3007
3008
3009
3010
3011
3012/*************************************************
3013* Handle SMTP syntax and protocol errors *
3014*************************************************/
3015
3016/* Write to the log for SMTP syntax errors in incoming commands, if configured
3017to do so. Then transmit the error response. The return value depends on the
3018number of syntax and protocol errors in this SMTP session.
3019
3020Arguments:
3021 type error type, given as a log flag bit
3022 code response code; <= 0 means don't send a response
3023 data data to reflect in the response (can be NULL)
3024 errmess the error message
3025
3026Returns: -1 limit of syntax/protocol errors NOT exceeded
3027 +1 limit of syntax/protocol errors IS exceeded
3028
3029These values fit in with the values of the "done" variable in the main
3030processing loop in smtp_setup_msg(). */
3031
3032static int
3033synprot_error(int type, int code, uschar *data, uschar *errmess)
3034{
3035int yield = -1;
3036
3037log_write(type, LOG_MAIN, "SMTP %s error in \"%s\" %s %s",
3038 (type == L_smtp_syntax_error)? "syntax" : "protocol",
3ee512ff 3039 string_printing(smtp_cmd_buffer), host_and_ident(TRUE), errmess);
059ec3d9
PH
3040
3041if (++synprot_error_count > smtp_max_synprot_errors)
3042 {
3043 yield = 1;
3044 log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
3045 "syntax or protocol errors (last command was \"%s\")",
0ebc4d69 3046 host_and_ident(FALSE), string_printing(smtp_cmd_buffer));
059ec3d9
PH
3047 }
3048
3049if (code > 0)
3050 {
925ac8e4
JH
3051 smtp_printf("%d%c%s%s%s\r\n", FALSE, code, yield == 1 ? '-' : ' ',
3052 data ? data : US"", data ? US": " : US"", errmess);
059ec3d9 3053 if (yield == 1)
925ac8e4 3054 smtp_printf("%d Too many syntax or protocol errors\r\n", FALSE, code);
059ec3d9
PH
3055 }
3056
3057return yield;
3058}
3059
3060
3061
3062
059ec3d9
PH
3063/*************************************************
3064* Send SMTP response, possibly multiline *
3065*************************************************/
3066
3067/* There are, it seems, broken clients out there that cannot handle multiline
3068responses. If no_multiline_responses is TRUE (it can be set from an ACL), we
3069output nothing for non-final calls, and only the first line for anything else.
3070
3071Arguments:
a5bd321b 3072 code SMTP code, may involve extended status codes
d6a96edc 3073 codelen length of smtp code; if > 4 there's an ESC
059ec3d9
PH
3074 final FALSE if the last line isn't the final line
3075 msg message text, possibly containing newlines
3076
3077Returns: nothing
3078*/
3079
3080void
a5bd321b 3081smtp_respond(uschar* code, int codelen, BOOL final, uschar *msg)
059ec3d9 3082{
a5bd321b
PH
3083int esclen = 0;
3084uschar *esc = US"";
3085
059ec3d9
PH
3086if (!final && no_multiline_responses) return;
3087
d6a96edc 3088if (codelen > 4)
a5bd321b
PH
3089 {
3090 esc = code + 4;
3091 esclen = codelen - 4;
3092 }
3093
2679d413
PH
3094/* If this is the first output for a (non-batch) RCPT command, see if all RCPTs
3095have had the same. Note: this code is also present in smtp_printf(). It would
3096be tidier to have it only in one place, but when it was added, it was easier to
3097do it that way, so as not to have to mess with the code for the RCPT command,
3098which sometimes uses smtp_printf() and sometimes smtp_respond(). */
3099
3100if (rcpt_in_progress)
3101 {
3102 if (rcpt_smtp_response == NULL)
3103 rcpt_smtp_response = string_copy(msg);
3104 else if (rcpt_smtp_response_same &&
3105 Ustrcmp(rcpt_smtp_response, msg) != 0)
3106 rcpt_smtp_response_same = FALSE;
3107 rcpt_in_progress = FALSE;
3108 }
3109
e5de01f0 3110/* Now output the message, splitting it up into multiple lines if necessary.
925ac8e4
JH
3111We only handle pipelining these responses as far as nonfinal/final groups,
3112not the whole MAIL/RCPT/DATA response set. */
2679d413 3113
059ec3d9
PH
3114for (;;)
3115 {
3116 uschar *nl = Ustrchr(msg, '\n');
3117 if (nl == NULL)
3118 {
925ac8e4 3119 smtp_printf("%.3s%c%.*s%s\r\n", !final, code, final ? ' ':'-', esclen, esc, msg);
059ec3d9
PH
3120 return;
3121 }
3122 else if (nl[1] == 0 || no_multiline_responses)
3123 {
925ac8e4 3124 smtp_printf("%.3s%c%.*s%.*s\r\n", !final, code, final ? ' ':'-', esclen, esc,
a5bd321b 3125 (int)(nl - msg), msg);
059ec3d9
PH
3126 return;
3127 }
3128 else
3129 {
925ac8e4 3130 smtp_printf("%.3s-%.*s%.*s\r\n", TRUE, code, esclen, esc, (int)(nl - msg), msg);
059ec3d9
PH
3131 msg = nl + 1;
3132 while (isspace(*msg)) msg++;
3133 }
3134 }
3135}
3136
3137
3138
3139
4e88a19f
PH
3140/*************************************************
3141* Parse user SMTP message *
3142*************************************************/
3143
3144/* This function allows for user messages overriding the response code details
3145by providing a suitable response code string at the start of the message
3146user_msg. Check the message for starting with a response code and optionally an
3147extended status code. If found, check that the first digit is valid, and if so,
3148change the code pointer and length to use the replacement. An invalid code
3149causes a panic log; in this case, if the log messages is the same as the user
3150message, we must also adjust the value of the log message to show the code that
3151is actually going to be used (the original one).
3152
3153This function is global because it is called from receive.c as well as within
3154this module.
3155
d6a96edc
PH
3156Note that the code length returned includes the terminating whitespace
3157character, which is always included in the regex match.
3158
4e88a19f
PH
3159Arguments:
3160 code SMTP code, may involve extended status codes
d6a96edc 3161 codelen length of smtp code; if > 4 there's an ESC
4e88a19f
PH
3162 msg message text
3163 log_msg optional log message, to be adjusted with the new SMTP code
4f6ae5c3 3164 check_valid if true, verify the response code
4e88a19f
PH
3165
3166Returns: nothing
3167*/
3168
3169void
4f6ae5c3
JH
3170smtp_message_code(uschar **code, int *codelen, uschar **msg, uschar **log_msg,
3171 BOOL check_valid)
4e88a19f
PH
3172{
3173int n;
3174int ovector[3];
3175
4f6ae5c3 3176if (!msg || !*msg) return;
4e88a19f 3177
4f6ae5c3
JH
3178if ((n = pcre_exec(regex_smtp_code, NULL, CS *msg, Ustrlen(*msg), 0,
3179 PCRE_EOPT, ovector, sizeof(ovector)/sizeof(int))) < 0) return;
4e88a19f 3180
4f6ae5c3 3181if (check_valid && (*msg)[0] != (*code)[0])
4e88a19f
PH
3182 {
3183 log_write(0, LOG_MAIN|LOG_PANIC, "configured error code starts with "
3184 "incorrect digit (expected %c) in \"%s\"", (*code)[0], *msg);
3185 if (log_msg != NULL && *log_msg == *msg)
3186 *log_msg = string_sprintf("%s %s", *code, *log_msg + ovector[1]);
3187 }
3188else
3189 {
3190 *code = *msg;
3191 *codelen = ovector[1]; /* Includes final space */
3192 }
3193*msg += ovector[1]; /* Chop the code off the message */
3194return;
3195}
3196
3197
3198
3199
059ec3d9
PH
3200/*************************************************
3201* Handle an ACL failure *
3202*************************************************/
3203
3204/* This function is called when acl_check() fails. As well as calls from within
3205this module, it is called from receive.c for an ACL after DATA. It sorts out
5b6f7658 3206logging the incident, and sends the error response. A message containing
059ec3d9
PH
3207newlines is turned into a multiline SMTP response, but for logging, only the
3208first line is used.
3209
a5bd321b
PH
3210There's a table of default permanent failure response codes to use in
3211globals.c, along with the table of names. VFRY is special. Despite RFC1123 it
3212defaults disabled in Exim. However, discussion in connection with RFC 821bis
3213(aka RFC 2821) has concluded that the response should be 252 in the disabled
3214state, because there are broken clients that try VRFY before RCPT. A 5xx
3215response should be given only when the address is positively known to be
4f6ae5c3
JH
3216undeliverable. Sigh. We return 252 if there is no VRFY ACL or it provides
3217no explicit code, but if there is one we let it know best.
3218Also, for ETRN, 458 is given on refusal, and for AUTH, 503.
a5bd321b
PH
3219
3220From Exim 4.63, it is possible to override the response code details by
3221providing a suitable response code string at the start of the message provided
3222in user_msg. The code's first digit is checked for validity.
059ec3d9
PH
3223
3224Arguments:
4f6ae5c3
JH
3225 where where the ACL was called from
3226 rc the failure code
3227 user_msg a message that can be included in an SMTP response
3228 log_msg a message for logging
059ec3d9
PH
3229
3230Returns: 0 in most cases
3231 2 if the failure code was FAIL_DROP, in which case the
3232 SMTP connection should be dropped (this value fits with the
3233 "done" variable in smtp_setup_msg() below)
3234*/
3235
3236int
3237smtp_handle_acl_fail(int where, int rc, uschar *user_msg, uschar *log_msg)
3238{
059ec3d9 3239BOOL drop = rc == FAIL_DROP;
a5bd321b 3240int codelen = 3;
a5bd321b 3241uschar *smtp_code;
059ec3d9
PH
3242uschar *lognl;
3243uschar *sender_info = US"";
64ffc24f 3244uschar *what =
8523533c 3245#ifdef WITH_CONTENT_SCAN
3cc3f762 3246 where == ACL_WHERE_MIME ? US"during MIME ACL checks" :
8e669ac1 3247#endif
3cc3f762
JH
3248 where == ACL_WHERE_PREDATA ? US"DATA" :
3249 where == ACL_WHERE_DATA ? US"after DATA" :
8ccd00b1 3250#ifndef DISABLE_PRDR
3cc3f762 3251 where == ACL_WHERE_PRDR ? US"after DATA PRDR" :
fd98a5c6 3252#endif
3cc3f762
JH
3253 smtp_cmd_data ?
3254 string_sprintf("%s %s", acl_wherenames[where], smtp_cmd_data) :
3255 string_sprintf("%s in \"connect\" ACL", acl_wherenames[where]);
059ec3d9
PH
3256
3257if (drop) rc = FAIL;
3258
4e88a19f 3259/* Set the default SMTP code, and allow a user message to change it. */
a5bd321b 3260
4f6ae5c3
JH
3261smtp_code = rc == FAIL ? acl_wherecodes[where] : US"451";
3262smtp_message_code(&smtp_code, &codelen, &user_msg, &log_msg,
3263 where != ACL_WHERE_VRFY);
a5bd321b 3264
059ec3d9
PH
3265/* We used to have sender_address here; however, there was a bug that was not
3266updating sender_address after a rewrite during a verify. When this bug was
3267fixed, sender_address at this point became the rewritten address. I'm not sure
3268this is what should be logged, so I've changed to logging the unrewritten
3269address to retain backward compatibility. */
3270
8523533c 3271#ifndef WITH_CONTENT_SCAN
059ec3d9 3272if (where == ACL_WHERE_RCPT || where == ACL_WHERE_DATA)
8523533c
TK
3273#else
3274if (where == ACL_WHERE_RCPT || where == ACL_WHERE_DATA || where == ACL_WHERE_MIME)
3275#endif
059ec3d9 3276 {
b98bb9ac
PP
3277 sender_info = string_sprintf("F=<%s>%s%s%s%s ",
3278 sender_address_unrewritten ? sender_address_unrewritten : sender_address,
3279 sender_host_authenticated ? US" A=" : US"",
3280 sender_host_authenticated ? sender_host_authenticated : US"",
3281 sender_host_authenticated && authenticated_id ? US":" : US"",
3282 sender_host_authenticated && authenticated_id ? authenticated_id : US""
3283 );
059ec3d9
PH
3284 }
3285
3286/* If there's been a sender verification failure with a specific message, and
3287we have not sent a response about it yet, do so now, as a preliminary line for
278c6e6c
PH
3288failures, but not defers. However, always log it for defer, and log it for fail
3289unless the sender_verify_fail log selector has been turned off. */
059ec3d9 3290
02b41d71 3291if (sender_verified_failed &&
059ec3d9
PH
3292 !testflag(sender_verified_failed, af_sverify_told))
3293 {
2679d413
PH
3294 BOOL save_rcpt_in_progress = rcpt_in_progress;
3295 rcpt_in_progress = FALSE; /* So as not to treat these as the error */
3296
059ec3d9
PH
3297 setflag(sender_verified_failed, af_sverify_told);
3298
6c6d6e48 3299 if (rc != FAIL || LOGGING(sender_verify_fail))
278c6e6c
PH
3300 log_write(0, LOG_MAIN|LOG_REJECT, "%s sender verify %s for <%s>%s",
3301 host_and_ident(TRUE),
3302 ((sender_verified_failed->special_action & 255) == DEFER)? "defer":"fail",
3303 sender_verified_failed->address,
3304 (sender_verified_failed->message == NULL)? US"" :
3305 string_sprintf(": %s", sender_verified_failed->message));
059ec3d9 3306
02b41d71 3307 if (rc == FAIL && sender_verified_failed->user_message)
a5bd321b 3308 smtp_respond(smtp_code, codelen, FALSE, string_sprintf(
059ec3d9
PH
3309 testflag(sender_verified_failed, af_verify_pmfail)?
3310 "Postmaster verification failed while checking <%s>\n%s\n"
3311 "Several RFCs state that you are required to have a postmaster\n"
3312 "mailbox for each mail domain. This host does not accept mail\n"
3313 "from domains whose servers reject the postmaster address."
3314 :
3315 testflag(sender_verified_failed, af_verify_nsfail)?
3316 "Callback setup failed while verifying <%s>\n%s\n"
3317 "The initial connection, or a HELO or MAIL FROM:<> command was\n"
3318 "rejected. Refusing MAIL FROM:<> does not help fight spam, disregards\n"
3319 "RFC requirements, and stops you from receiving standard bounce\n"
3320 "messages. This host does not accept mail from domains whose servers\n"
3321 "refuse bounces."
3322 :
3323 "Verification failed for <%s>\n%s",
3324 sender_verified_failed->address,
3325 sender_verified_failed->user_message));
2679d413
PH
3326
3327 rcpt_in_progress = save_rcpt_in_progress;
059ec3d9
PH
3328 }
3329
3330/* Sort out text for logging */
3331
3cc3f762
JH
3332log_msg = log_msg ? string_sprintf(": %s", log_msg) : US"";
3333if ((lognl = Ustrchr(log_msg, '\n'))) *lognl = 0;
059ec3d9
PH
3334
3335/* Send permanent failure response to the command, but the code used isn't
3336always a 5xx one - see comments at the start of this function. If the original
3337rc was FAIL_DROP we drop the connection and yield 2. */
3338
ff5929e3
JH
3339if (rc == FAIL)
3340 smtp_respond(smtp_code, codelen, TRUE,
3341 user_msg ? user_msg : US"Administrative prohibition");
059ec3d9
PH
3342
3343/* Send temporary failure response to the command. Don't give any details,
3344unless acl_temp_details is set. This is TRUE for a callout defer, a "defer"
3345verb, and for a header verify when smtp_return_error_details is set.
3346
3347This conditional logic is all somewhat of a mess because of the odd
3348interactions between temp_details and return_error_details. One day it should
3349be re-implemented in a tidier fashion. */
3350
3351else
ff5929e3 3352 if (acl_temp_details && user_msg)
059ec3d9 3353 {
ff5929e3
JH
3354 if ( smtp_return_error_details
3355 && sender_verified_failed
3356 && sender_verified_failed->message
3357 )
a5bd321b 3358 smtp_respond(smtp_code, codelen, FALSE, sender_verified_failed->message);
ff5929e3 3359
a5bd321b 3360 smtp_respond(smtp_code, codelen, TRUE, user_msg);
059ec3d9
PH
3361 }
3362 else
a5bd321b
PH
3363 smtp_respond(smtp_code, codelen, TRUE,
3364 US"Temporary local problem - please try later");
059ec3d9 3365
6ea85e9a
PH
3366/* Log the incident to the logs that are specified by log_reject_target
3367(default main, reject). This can be empty to suppress logging of rejections. If
3368the connection is not forcibly to be dropped, return 0. Otherwise, log why it
3369is closing if required and return 2. */
059ec3d9 3370
6ea85e9a 3371if (log_reject_target != 0)
887291d2 3372 {
e45a1c37 3373#ifdef SUPPORT_TLS
acec9514
JH
3374 gstring * g = s_tlslog(NULL);
3375 uschar * tls = string_from_gstring(g);
fc16abb4 3376 if (!tls) tls = US"";
e45a1c37 3377#else
fc16abb4 3378 uschar * tls = US"";
e45a1c37 3379#endif
3cc3f762
JH
3380 log_write(where == ACL_WHERE_CONNECT ? L_connection_reject : 0,
3381 log_reject_target, "%s%s%s %s%srejected %s%s",
fc16abb4
JH
3382 LOGGING(dnssec) && sender_host_dnssec ? US" DS" : US"",
3383 host_and_ident(TRUE),
3384 tls,
3385 sender_info,
3386 rc == FAIL ? US"" : US"temporarily ",
3387 what, log_msg);
887291d2 3388 }
059ec3d9
PH
3389
3390if (!drop) return 0;
3391
3392log_write(L_smtp_connection, LOG_MAIN, "%s closed by DROP in ACL",
3393 smtp_get_connection_info());
8f128379
PH
3394
3395/* Run the not-quit ACL, but without any custom messages. This should not be a
3396problem, because we get here only if some other ACL has issued "drop", and
3397in that case, *its* custom messages will have been used above. */
3398
3399smtp_notquit_exit(US"acl-drop", NULL, NULL);
059ec3d9
PH
3400return 2;
3401}
3402
3403
3404
3405
8f128379
PH
3406/*************************************************
3407* Handle SMTP exit when QUIT is not given *
3408*************************************************/
3409
3410/* This function provides a logging/statistics hook for when an SMTP connection
3411is dropped on the floor or the other end goes away. It's a global function
3412because it's called from receive.c as well as this module. As well as running
3413the NOTQUIT ACL, if there is one, this function also outputs a final SMTP
3414response, either with a custom message from the ACL, or using a default. There
3415is one case, however, when no message is output - after "drop". In that case,
3416the ACL that obeyed "drop" has already supplied the custom message, and NULL is
3417passed to this function.
3418
3419In case things go wrong while processing this function, causing an error that
4c04137d 3420may re-enter this function, there is a recursion check.
8f128379
PH
3421
3422Arguments:
3423 reason What $smtp_notquit_reason will be set to in the ACL;
3424 if NULL, the ACL is not run
3425 code The error code to return as part of the response
3426 defaultrespond The default message if there's no user_msg
3427
3428Returns: Nothing
3429*/
3430
3431void
3432smtp_notquit_exit(uschar *reason, uschar *code, uschar *defaultrespond, ...)
3433{
3434int rc;
3435uschar *user_msg = NULL;
3436uschar *log_msg = NULL;
3437
3438/* Check for recursive acll */
3439
3440if (smtp_exit_function_called)
3441 {
3442 log_write(0, LOG_PANIC, "smtp_notquit_exit() called more than once (%s)",
3443 reason);
3444 return;
3445 }
3446smtp_exit_function_called = TRUE;
3447
3448/* Call the not-QUIT ACL, if there is one, unless no reason is given. */
3449
eea0defe 3450if (acl_smtp_notquit && reason)
8f128379
PH
3451 {
3452 smtp_notquit_reason = reason;
eea0defe
JB
3453 if ((rc = acl_check(ACL_WHERE_NOTQUIT, NULL, acl_smtp_notquit, &user_msg,
3454 &log_msg)) == ERROR)
8f128379
PH
3455 log_write(0, LOG_MAIN|LOG_PANIC, "ACL for not-QUIT returned ERROR: %s",
3456 log_msg);
3457 }
3458
3459/* Write an SMTP response if we are expected to give one. As the default
3460responses are all internal, they should always fit in the buffer, but code a
3461warning, just in case. Note that string_vformat() still leaves a complete
3462string, even if it is incomplete. */
3463
eea0defe 3464if (code && defaultrespond)
8f128379 3465 {
eea0defe
JB
3466 if (user_msg)
3467 smtp_respond(code, 3, TRUE, user_msg);
3468 else
8f128379
PH
3469 {
3470 uschar buffer[128];
3471 va_list ap;
3472 va_start(ap, defaultrespond);
3473 if (!string_vformat(buffer, sizeof(buffer), CS defaultrespond, ap))
3474 log_write(0, LOG_MAIN|LOG_PANIC, "string too large in smtp_notquit_exit()");
925ac8e4 3475 smtp_printf("%s %s\r\n", FALSE, code, buffer);
8f128379
PH
3476 va_end(ap);
3477 }
8f128379
PH
3478 mac_smtp_fflush();
3479 }
3480}
3481
3482
3483
3484
d7b47fd0
PH
3485/*************************************************
3486* Verify HELO argument *
3487*************************************************/
3488
3489/* This function is called if helo_verify_hosts or helo_try_verify_hosts is
3490matched. It is also called from ACL processing if verify = helo is used and
3491verification was not previously tried (i.e. helo_try_verify_hosts was not
3492matched). The result of its processing is to set helo_verified and
3493helo_verify_failed. These variables should both be FALSE for this function to
3494be called.
3495
3496Note that EHLO/HELO is legitimately allowed to quote an address literal. Allow
3497for IPv6 ::ffff: literals.
3498
3499Argument: none
3500Returns: TRUE if testing was completed;
3501 FALSE on a temporary failure
3502*/
3503
3504BOOL
3505smtp_verify_helo(void)
3506{
3507BOOL yield = TRUE;
3508
3509HDEBUG(D_receive) debug_printf("verifying EHLO/HELO argument \"%s\"\n",
3510 sender_helo_name);
3511
3512if (sender_helo_name == NULL)
3513 {
3514 HDEBUG(D_receive) debug_printf("no EHLO/HELO command was issued\n");
3515 }
3516
d1d5595c
PH
3517/* Deal with the case of -bs without an IP address */
3518
3519else if (sender_host_address == NULL)
3520 {
3521 HDEBUG(D_receive) debug_printf("no client IP address: assume success\n");
3522 helo_verified = TRUE;
3523 }
3524
3525/* Deal with the more common case when there is a sending IP address */
3526
d7b47fd0
PH
3527else if (sender_helo_name[0] == '[')
3528 {
3529 helo_verified = Ustrncmp(sender_helo_name+1, sender_host_address,
3530 Ustrlen(sender_host_address)) == 0;
3531
e0574cb5 3532#if HAVE_IPV6
d7b47fd0
PH
3533 if (!helo_verified)
3534 {
3535 if (strncmpic(sender_host_address, US"::ffff:", 7) == 0)
3536 helo_verified = Ustrncmp(sender_helo_name + 1,
3537 sender_host_address + 7, Ustrlen(sender_host_address) - 7) == 0;
3538 }
e0574cb5 3539#endif
d7b47fd0
PH
3540
3541 HDEBUG(D_receive)
3542 { if (helo_verified) debug_printf("matched host address\n"); }
3543 }
3544
3545/* Do a reverse lookup if one hasn't already given a positive or negative
3546response. If that fails, or the name doesn't match, try checking with a forward
3547lookup. */
3548
3549else
3550 {
3551 if (sender_host_name == NULL && !host_lookup_failed)
3552 yield = host_name_lookup() != DEFER;
3553
3554 /* If a host name is known, check it and all its aliases. */
3555
1705dd20
JH
3556 if (sender_host_name)
3557 if ((helo_verified = strcmpic(sender_host_name, sender_helo_name) == 0))
d7b47fd0 3558 {
1705dd20 3559 sender_helo_dnssec = sender_host_dnssec;
d7b47fd0
PH
3560 HDEBUG(D_receive) debug_printf("matched host name\n");
3561 }
3562 else
3563 {
3564 uschar **aliases = sender_host_aliases;
1705dd20
JH
3565 while (*aliases)
3566 if ((helo_verified = strcmpic(*aliases++, sender_helo_name) == 0))
3567 {
3568 sender_helo_dnssec = sender_host_dnssec;
3569 break;
3570 }
3571
3572 HDEBUG(D_receive) if (helo_verified)
d7b47fd0 3573 debug_printf("matched alias %s\n", *(--aliases));
d7b47fd0 3574 }
d7b47fd0
PH
3575
3576 /* Final attempt: try a forward lookup of the helo name */
3577
3578 if (!helo_verified)
3579 {
3580 int rc;
3581 host_item h;
1705dd20
JH
3582 dnssec_domains d;
3583 host_item *hh;
3584
d7b47fd0
PH
3585 h.name = sender_helo_name;
3586 h.address = NULL;
3587 h.mx = MX_NONE;
3588 h.next = NULL;
1705dd20
JH
3589 d.request = US"*";
3590 d.require = US"";
3591
d7b47fd0
PH
3592 HDEBUG(D_receive) debug_printf("getting IP address for %s\n",
3593 sender_helo_name);
66387a73 3594 rc = host_find_bydns(&h, NULL, HOST_FIND_BY_A | HOST_FIND_BY_AAAA,
1705dd20 3595 NULL, NULL, NULL, &d, NULL, NULL);
d7b47fd0 3596 if (rc == HOST_FOUND || rc == HOST_FOUND_LOCAL)
1705dd20 3597 for (hh = &h; hh; hh = hh->next)
d7b47fd0
PH
3598 if (Ustrcmp(hh->address, sender_host_address) == 0)
3599 {
3600 helo_verified = TRUE;
1705dd20 3601 if (h.dnssec == DS_YES) sender_helo_dnssec = TRUE;
d7b47fd0 3602 HDEBUG(D_receive)
1705dd20
JH
3603 {
3604 debug_printf("IP address for %s matches calling address\n"
3605 "Forward DNS security status: %sverified\n",
3606 sender_helo_name, sender_helo_dnssec ? "" : "un");
3607 }
d7b47fd0
PH
3608 break;
3609 }
d7b47fd0
PH
3610 }
3611 }
3612
d1d5595c 3613if (!helo_verified) helo_verify_failed = TRUE; /* We've tried ... */
d7b47fd0
PH
3614return yield;
3615}
3616
3617
3618
3619
4e88a19f
PH
3620/*************************************************
3621* Send user response message *
3622*************************************************/
3623
3624/* This function is passed a default response code and a user message. It calls
3625smtp_message_code() to check and possibly modify the response code, and then
3626calls smtp_respond() to transmit the response. I put this into a function
3627just to avoid a lot of repetition.
3628
3629Arguments:
3630 code the response code
3631 user_msg the user message
3632
3633Returns: nothing
3634*/
3635
3636static void
3637smtp_user_msg(uschar *code, uschar *user_msg)
3638{
3639int len = 3;
4f6ae5c3 3640smtp_message_code(&code, &len, &user_msg, NULL, TRUE);
4e88a19f
PH
3641smtp_respond(code, len, TRUE, user_msg);
3642}
3643
3644
3645
b3ef41c9
JH
3646static int
3647smtp_in_auth(auth_instance *au, uschar ** s, uschar ** ss)
3648{
3649const uschar *set_id = NULL;
3650int rc, i;
3651
3652/* Run the checking code, passing the remainder of the command line as
3653data. Initials the $auth<n> variables as empty. Initialize $0 empty and set
3654it as the only set numerical variable. The authenticator may set $auth<n>
3655and also set other numeric variables. The $auth<n> variables are preferred
3656nowadays; the numerical variables remain for backwards compatibility.
3657
3658Afterwards, have a go at expanding the set_id string, even if
3659authentication failed - for bad passwords it can be useful to log the
3660userid. On success, require set_id to expand and exist, and put it in
3661authenticated_id. Save this in permanent store, as the working store gets
3662reset at HELO, RSET, etc. */
3663
3664for (i = 0; i < AUTH_VARS; i++) auth_vars[i] = NULL;
3665expand_nmax = 0;
3666expand_nlength[0] = 0; /* $0 contains nothing */
3667
3668rc = (au->info->servercode)(au, smtp_cmd_data);
3669if (au->set_id) set_id = expand_string(au->set_id);
3670expand_nmax = -1; /* Reset numeric variables */
3671for (i = 0; i < AUTH_VARS; i++) auth_vars[i] = NULL; /* Reset $auth<n> */
3672
3673/* The value of authenticated_id is stored in the spool file and printed in
3674log lines. It must not contain binary zeros or newline characters. In
3675normal use, it never will, but when playing around or testing, this error
3676can (did) happen. To guard against this, ensure that the id contains only
3677printing characters. */
3678
3679if (set_id) set_id = string_printing(set_id);
3680
3681/* For the non-OK cases, set up additional logging data if set_id
3682is not empty. */
3683
3684if (rc != OK)
3685 set_id = set_id && *set_id
3686 ? string_sprintf(" (set_id=%s)", set_id) : US"";
3687
3688/* Switch on the result */
3689
3690switch(rc)
3691 {
3692 case OK:
3693 if (!au->set_id || set_id) /* Complete success */
3694 {
3695 if (set_id) authenticated_id = string_copy_malloc(set_id);
3696 sender_host_authenticated = au->name;
c44ff8be 3697 sender_host_auth_pubname = au->public_name;
b3ef41c9
JH
3698 authentication_failed = FALSE;
3699 authenticated_fail_id = NULL; /* Impossible to already be set? */
3700
3701 received_protocol =
3702 (sender_host_address ? protocols : protocols_local)
74f1a423 3703 [pextend + pauthed + (tls_in.active.sock >= 0 ? pcrpted:0)];
b3ef41c9
JH
3704 *s = *ss = US"235 Authentication succeeded";
3705 authenticated_by = au;
3706 break;
3707 }
3708
3709 /* Authentication succeeded, but we failed to expand the set_id string.
3710 Treat this as a temporary error. */
3711
3712 auth_defer_msg = expand_string_message;
3713 /* Fall through */
3714
3715 case DEFER:
3716 if (set_id) authenticated_fail_id = string_copy_malloc(set_id);
3717 *s = string_sprintf("435 Unable to authenticate at present%s",
3718 auth_defer_user_msg);
3719 *ss = string_sprintf("435 Unable to authenticate at present%s: %s",
3720 set_id, auth_defer_msg);
3721 break;
3722
3723 case BAD64:
3724 *s = *ss = US"501 Invalid base64 data";
3725 break;
3726
3727 case CANCELLED:
3728 *s = *ss = US"501 Authentication cancelled";
3729 break;
3730
3731 case UNEXPECTED:
3732 *s = *ss = US"553 Initial data not expected";
3733 break;
3734
3735 case FAIL:
3736 if (set_id) authenticated_fail_id = string_copy_malloc(set_id);
3737 *s = US"535 Incorrect authentication data";
3738 *ss = string_sprintf("535 Incorrect authentication data%s", set_id);
3739 break;
3740
3741 default:
3742 if (set_id) authenticated_fail_id = string_copy_malloc(set_id);
3743 *s = US"435 Internal error";
3744 *ss = string_sprintf("435 Internal error%s: return %d from authentication "
3745 "check", set_id, rc);
3746 break;
3747 }
3748
3749return rc;
3750}
3751
3752
3753
2685d6e0
JH
3754
3755
3756static int
3757qualify_recipient(uschar ** recipient, uschar * smtp_cmd_data, uschar * tag)
3758{
3759int rd;
3760if (allow_unqualified_recipient || strcmpic(*recipient, US"postmaster") == 0)
3761 {
3762 DEBUG(D_receive) debug_printf("unqualified address %s accepted\n",
3763 *recipient);
3764 rd = Ustrlen(recipient) + 1;
3765 *recipient = rewrite_address_qualify(*recipient, TRUE);
3766 return rd;
3767 }
925ac8e4 3768smtp_printf("501 %s: recipient address must contain a domain\r\n", FALSE,
2685d6e0
JH
3769 smtp_cmd_data);
3770log_write(L_smtp_syntax_error,
3771 LOG_MAIN|LOG_REJECT, "unqualified %s rejected: <%s> %s%s",
3772 tag, *recipient, host_and_ident(TRUE), host_lookup_msg);
3773return 0;
3774}
3775
3776
3777
3778
7e3ce68e
JH
3779static void
3780smtp_quit_handler(uschar ** user_msgp, uschar ** log_msgp)
3781{
3782HAD(SCH_QUIT);
3783incomplete_transaction_log(US"QUIT");
60d10ce7 3784if (acl_smtp_quit)
7e3ce68e
JH
3785 {
3786 int rc = acl_check(ACL_WHERE_QUIT, NULL, acl_smtp_quit, user_msgp, log_msgp);
3787 if (rc == ERROR)
3788 log_write(0, LOG_MAIN|LOG_PANIC, "ACL for QUIT returned ERROR: %s",
3789 *log_msgp);
3790 }
3791if (*user_msgp)
3792 smtp_respond(US"221", 3, TRUE, *user_msgp);
3793else
925ac8e4 3794 smtp_printf("221 %s closing connection\r\n", FALSE, smtp_active_hostname);
7e3ce68e
JH
3795
3796#ifdef SUPPORT_TLS
74f1a423 3797tls_close(NULL, TLS_SHUTDOWN_NOWAIT);
7e3ce68e
JH
3798#endif
3799
3800log_write(L_smtp_connection, LOG_MAIN, "%s closed by QUIT",
3801 smtp_get_connection_info());
3802}
3803
3804
3805static void
3806smtp_rset_handler(void)
3807{
3808HAD(SCH_RSET);
3809incomplete_transaction_log(US"RSET");
925ac8e4 3810smtp_printf("250 Reset OK\r\n", FALSE);
7e3ce68e
JH
3811cmd_list[CMD_LIST_RSET].is_mail_cmd = FALSE;
3812}
3813
3814
3815
059ec3d9
PH
3816/*************************************************
3817* Initialize for SMTP incoming message *
3818*************************************************/
3819
3820/* This function conducts the initial dialogue at the start of an incoming SMTP
3821message, and builds a list of recipients. However, if the incoming message
3822is part of a batch (-bS option) a separate function is called since it would
3823be messy having tests splattered about all over this function. This function
3824therefore handles the case where interaction is occurring. The input and output
3825files are set up in smtp_in and smtp_out.
3826
3827The global recipients_list is set to point to a vector of recipient_item
3828blocks, whose number is given by recipients_count. This is extended by the
3829receive_add_recipient() function. The global variable sender_address is set to
3830the sender's address. The yield is +1 if a message has been successfully
3831started, 0 if a QUIT command was encountered or the connection was refused from
3832the particular host, or -1 if the connection was lost.
3833
3834Argument: none
3835
3836Returns: > 0 message successfully started (reached DATA)
3837 = 0 QUIT read or end of file reached or call refused
3838 < 0 lost connection
3839*/
3840
3841int
3842smtp_setup_msg(void)
3843{
3844int done = 0;
3845BOOL toomany = FALSE;
3846BOOL discarded = FALSE;
3847BOOL last_was_rej_mail = FALSE;
3848BOOL last_was_rcpt = FALSE;
3849void *reset_point = store_get(0);
3850
3851DEBUG(D_receive) debug_printf("smtp_setup_msg entered\n");
3852
3853/* Reset for start of new message. We allow one RSET not to be counted as a
3854nonmail command, for those MTAs that insist on sending it between every
3855message. Ditto for EHLO/HELO and for STARTTLS, to allow for going in and out of
3856TLS between messages (an Exim client may do this if it has messages queued up
3857for the host). Note: we do NOT reset AUTH at this point. */
3858
3859smtp_reset(reset_point);
3860message_ended = END_NOTSTARTED;
3861
7e3ce68e
JH
3862chunking_state = chunking_offered ? CHUNKING_OFFERED : CHUNKING_NOT_OFFERED;
3863
059ec3d9
PH
3864cmd_list[CMD_LIST_RSET].is_mail_cmd = TRUE;
3865cmd_list[CMD_LIST_HELO].is_mail_cmd = TRUE;
3866cmd_list[CMD_LIST_EHLO].is_mail_cmd = TRUE;
3867#ifdef SUPPORT_TLS
3868cmd_list[CMD_LIST_STARTTLS].is_mail_cmd = TRUE;
3869#endif
3870
3871/* Set the local signal handler for SIGTERM - it tries to end off tidily */
3872
9723f966 3873had_command_sigterm = 0;
059ec3d9
PH
3874os_non_restarting_signal(SIGTERM, command_sigterm_handler);
3875
3876/* Batched SMTP is handled in a different function. */
3877
3878if (smtp_batched_input) return smtp_setup_batch_msg();
3879
3880/* Deal with SMTP commands. This loop is exited by setting done to a POSITIVE
3881value. The values are 2 larger than the required yield of the function. */
3882
3883while (done <= 0)
3884 {
55414b25 3885 const uschar **argv;
059ec3d9
PH
3886 uschar *etrn_command;
3887 uschar *etrn_serialize_key;
3888 uschar *errmess;
4e88a19f
PH
3889 uschar *log_msg, *smtp_code;
3890 uschar *user_msg = NULL;
059ec3d9
PH
3891 uschar *recipient = NULL;
3892 uschar *hello = NULL;
059ec3d9
PH
3893 uschar *s, *ss;
3894 BOOL was_rej_mail = FALSE;
3895 BOOL was_rcpt = FALSE;
3896 void (*oldsignal)(int);
3897 pid_t pid;
3898 int start, end, sender_domain, recipient_domain;
acec9514 3899 int rc;
aa7751be 3900 int c;
059ec3d9 3901 auth_instance *au;
6c1c3d1d
WB
3902 uschar *orcpt = NULL;
3903 int flags;
acec9514 3904 gstring * g;
059ec3d9 3905
16be7f11 3906#ifdef AUTH_TLS
b3ef41c9 3907 /* Check once per STARTTLS or SSL-on-connect for a TLS AUTH */
74f1a423 3908 if ( tls_in.active.sock >= 0
b3ef41c9
JH
3909 && tls_in.peercert
3910 && tls_in.certificate_verified
3911 && cmd_list[CMD_LIST_TLS_AUTH].is_mail_cmd
3912 )
3913 {
3914 cmd_list[CMD_LIST_TLS_AUTH].is_mail_cmd = FALSE;
b3ef41c9
JH
3915
3916 for (au = auths; au; au = au->next)
3917 if (strcmpic(US"tls", au->driver_name) == 0)
3918 {
b64d13ee
JH
3919 if ( acl_smtp_auth
3920 && (rc = acl_check(ACL_WHERE_AUTH, NULL, acl_smtp_auth,
3921 &user_msg, &log_msg)) != OK
3922 )
3923 done = smtp_handle_acl_fail(ACL_WHERE_AUTH, rc, user_msg, log_msg);
805bb5c3 3924 else
b64d13ee
JH
3925 {
3926 smtp_cmd_data = NULL;
3927
3928 if (smtp_in_auth(au, &s, &ss) == OK)
3929 { DEBUG(D_auth) debug_printf("tls auth succeeded\n"); }
3930 else
3931 { DEBUG(D_auth) debug_printf("tls auth not succeeded\n"); }
3932 }
b3ef41c9
JH
3933 break;
3934 }
3935 }
3936#endif
3937
8d330698
JH
3938#ifdef TCP_QUICKACK
3939 if (smtp_in) /* Avoid pure-ACKs while in cmd pingpong phase */
3940 (void) setsockopt(fileno(smtp_in), IPPROTO_TCP, TCP_QUICKACK,
3941 US &off, sizeof(off));
3942#endif
3943
bd8fbe36 3944 switch(smtp_read_command(TRUE, GETC_BUFFER_UNLIMITED))
059ec3d9
PH
3945 {
3946 /* The AUTH command is not permitted to occur inside a transaction, and may
c46782ef
PH
3947 occur successfully only once per connection. Actually, that isn't quite
3948 true. When TLS is started, all previous information about a connection must
3949 be discarded, so a new AUTH is permitted at that time.
3950
3951 AUTH may only be used when it has been advertised. However, it seems that
3952 there are clients that send AUTH when it hasn't been advertised, some of
3953 them even doing this after HELO. And there are MTAs that accept this. Sigh.
3954 So there's a get-out that allows this to happen.
059ec3d9
PH
3955
3956 AUTH is initially labelled as a "nonmail command" so that one occurrence
3957 doesn't get counted. We change the label here so that multiple failing
3958 AUTHS will eventually hit the nonmail threshold. */
3959
3960 case AUTH_CMD:
e0574cb5
JH
3961 HAD(SCH_AUTH);
3962 authentication_failed = TRUE;
3963 cmd_list[CMD_LIST_AUTH].is_mail_cmd = FALSE;
059ec3d9 3964
e0574cb5
JH
3965 if (!auth_advertised && !allow_auth_unadvertised)
3966 {
3967 done = synprot_error(L_smtp_protocol_error, 503, NULL,
3968 US"AUTH command used when not advertised");
3969 break;
3970 }
3971 if (sender_host_authenticated)
3972 {
3973 done = synprot_error(L_smtp_protocol_error, 503, NULL,
3974 US"already authenticated");
3975 break;
3976 }
3977 if (sender_address)
3978 {
3979 done = synprot_error(L_smtp_protocol_error, 503, NULL,
3980 US"not permitted in mail transaction");
3981 break;
3982 }
059ec3d9 3983
e0574cb5 3984 /* Check the ACL */
059ec3d9 3985
e0574cb5
JH
3986 if ( acl_smtp_auth
3987 && (rc = acl_check(ACL_WHERE_AUTH, NULL, acl_smtp_auth,
3988 &user_msg, &log_msg)) != OK
3989 )
3990 {
3991 done = smtp_handle_acl_fail(ACL_WHERE_AUTH, rc, user_msg, log_msg);
3992 break;
3993 }
059ec3d9 3994
e0574cb5 3995 /* Find the name of the requested authentication mechanism. */
059ec3d9 3996
e0574cb5
JH
3997 s = smtp_cmd_data;
3998 while ((c = *smtp_cmd_data) != 0 && !isspace(c))
3999 {
4000 if (!isalnum(c) && c != '-' && c != '_')
4001 {
4002 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4003 US"invalid character in authentication mechanism name");
4004 goto COMMAND_LOOP;
4005 }
4006 smtp_cmd_data++;
4007 }
059ec3d9 4008
e0574cb5
JH
4009 /* If not at the end of the line, we must be at white space. Terminate the
4010 name and move the pointer on to any data that may be present. */
059ec3d9 4011
e0574cb5
JH
4012 if (*smtp_cmd_data != 0)
4013 {
4014 *smtp_cmd_data++ = 0;
4015 while (isspace(*smtp_cmd_data)) smtp_cmd_data++;
4016 }
059ec3d9 4017
e0574cb5
JH
4018 /* Search for an authentication mechanism which is configured for use
4019 as a server and which has been advertised (unless, sigh, allow_auth_
4020 unadvertised is set). */
059ec3d9 4021
e0574cb5
JH
4022 for (au = auths; au; au = au->next)
4023 if (strcmpic(s, au->public_name) == 0 && au->server &&
4024 (au->advertised || allow_auth_unadvertised))
4025 break;
059ec3d9 4026
e0574cb5
JH
4027 if (au)
4028 {
4029 c = smtp_in_auth(au, &s, &ss);
059ec3d9 4030
e0574cb5
JH
4031 smtp_printf("%s\r\n", FALSE, s);
4032 if (c != OK)
4033 log_write(0, LOG_MAIN|LOG_REJECT, "%s authenticator failed for %s: %s",
4034 au->name, host_and_ident(FALSE), ss);
4035 }
4036 else
4037 done = synprot_error(L_smtp_protocol_error, 504, NULL,
4038 string_sprintf("%s authentication mechanism not supported", s));
059ec3d9 4039
e0574cb5 4040 break; /* AUTH_CMD */
059ec3d9
PH
4041
4042 /* The HELO/EHLO commands are permitted to appear in the middle of a
4043 session as well as at the beginning. They have the effect of a reset in
4044 addition to their other functions. Their absence at the start cannot be
4045 taken to be an error.
4046
4047 RFC 2821 says:
4048
4049 If the EHLO command is not acceptable to the SMTP server, 501, 500,
4050 or 502 failure replies MUST be returned as appropriate. The SMTP
4051 server MUST stay in the same state after transmitting these replies
4052 that it was in before the EHLO was received.
4053
4054 Therefore, we do not do the reset until after checking the command for
4055 acceptability. This change was made for Exim release 4.11. Previously
4056 it did the reset first. */
4057
4058 case HELO_CMD:
e0574cb5
JH
4059 HAD(SCH_HELO);
4060 hello = US"HELO";
4061 esmtp = FALSE;
4062 goto HELO_EHLO;
059ec3d9
PH
4063
4064 case EHLO_CMD:
e0574cb5
JH
4065 HAD(SCH_EHLO);
4066 hello = US"EHLO";
4067 esmtp = TRUE;
059ec3d9
PH
4068
4069 HELO_EHLO: /* Common code for HELO and EHLO */
e0574cb5
JH
4070 cmd_list[CMD_LIST_HELO].is_mail_cmd = FALSE;
4071 cmd_list[CMD_LIST_EHLO].is_mail_cmd = FALSE;
059ec3d9 4072
e0574cb5
JH
4073 /* Reject the HELO if its argument was invalid or non-existent. A
4074 successful check causes the argument to be saved in malloc store. */
059ec3d9 4075
e0574cb5
JH
4076 if (!check_helo(smtp_cmd_data))
4077 {
4078 smtp_printf("501 Syntactically invalid %s argument(s)\r\n", FALSE, hello);
059ec3d9 4079
e0574cb5
JH
4080 log_write(0, LOG_MAIN|LOG_REJECT, "rejected %s from %s: syntactically "
4081 "invalid argument(s): %s", hello, host_and_ident(FALSE),
4082 *smtp_cmd_argument == 0 ? US"(no argument given)" :
4083 string_printing(smtp_cmd_argument));
059ec3d9 4084
e0574cb5
JH
4085 if (++synprot_error_count > smtp_max_synprot_errors)
4086 {
4087 log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
4088 "syntax or protocol errors (last command was \"%s\")",
4089 host_and_ident(FALSE), string_printing(smtp_cmd_buffer));
4090 done = 1;
4091 }
059ec3d9 4092
e0574cb5
JH
4093 break;
4094 }
059ec3d9 4095
e0574cb5
JH
4096 /* If sender_host_unknown is true, we have got here via the -bs interface,
4097 not called from inetd. Otherwise, we are running an IP connection and the
4098 host address will be set. If the helo name is the primary name of this
4099 host and we haven't done a reverse lookup, force one now. If helo_required
4100 is set, ensure that the HELO name matches the actual host. If helo_verify
4101 is set, do the same check, but softly. */
059ec3d9 4102
e0574cb5
JH
4103 if (!sender_host_unknown)
4104 {
4105 BOOL old_helo_verified = helo_verified;
4106 uschar *p = smtp_cmd_data;
059ec3d9 4107
e0574cb5
JH
4108 while (*p != 0 && !isspace(*p)) { *p = tolower(*p); p++; }
4109 *p = 0;
059ec3d9 4110
e0574cb5
JH
4111 /* Force a reverse lookup if HELO quoted something in helo_lookup_domains
4112 because otherwise the log can be confusing. */
059ec3d9 4113
e0574cb5
JH
4114 if ( !sender_host_name
4115 && (deliver_domain = sender_helo_name, /* set $domain */
4116 match_isinlist(sender_helo_name, CUSS &helo_lookup_domains, 0,
4117 &domainlist_anchor, NULL, MCL_DOMAIN, TRUE, NULL)) == OK)
4118 (void)host_name_lookup();
059ec3d9 4119
e0574cb5
JH
4120 /* Rebuild the fullhost info to include the HELO name (and the real name
4121 if it was looked up.) */
059ec3d9 4122
e0574cb5
JH
4123 host_build_sender_fullhost(); /* Rebuild */
4124 set_process_info("handling%s incoming connection from %s",
4125 tls_in.active.sock >= 0 ? " TLS" : "", host_and_ident(FALSE));
059ec3d9 4126
e0574cb5
JH
4127 /* Verify if configured. This doesn't give much security, but it does
4128 make some people happy to be able to do it. If helo_required is set,
4129 (host matches helo_verify_hosts) failure forces rejection. If helo_verify
4130 is set (host matches helo_try_verify_hosts), it does not. This is perhaps
4131 now obsolescent, since the verification can now be requested selectively
4132 at ACL time. */
059ec3d9 4133
e0574cb5
JH
4134 helo_verified = helo_verify_failed = sender_helo_dnssec = FALSE;
4135 if (helo_required || helo_verify)
4136 {
4137 BOOL tempfail = !smtp_verify_helo();
4138 if (!helo_verified)
4139 {
4140 if (helo_required)
4141 {
4142 smtp_printf("%d %s argument does not match calling host\r\n", FALSE,
4143 tempfail? 451 : 550, hello);
4144 log_write(0, LOG_MAIN|LOG_REJECT, "%srejected \"%s %s\" from %s",
4145 tempfail? "temporarily " : "",
4146 hello, sender_helo_name, host_and_ident(FALSE));
4147 helo_verified = old_helo_verified;
4148 break; /* End of HELO/EHLO processing */
4149 }
4150 HDEBUG(D_all) debug_printf("%s verification failed but host is in "
4151 "helo_try_verify_hosts\n", hello);
4152 }
4153 }
4154 }
059ec3d9 4155
7952eef9 4156#ifdef SUPPORT_SPF
e0574cb5
JH
4157 /* set up SPF context */
4158 spf_init(sender_helo_name, sender_host_address);
8523533c
TK
4159#endif
4160
e0574cb5
JH
4161 /* Apply an ACL check if one is defined; afterwards, recheck
4162 synchronization in case the client started sending in a delay. */
059ec3d9 4163
e0574cb5
JH
4164 if (acl_smtp_helo)
4165 if ((rc = acl_check(ACL_WHERE_HELO, NULL, acl_smtp_helo,
4166 &user_msg, &log_msg)) != OK)
a5c60e3c 4167 {
e0574cb5
JH
4168 done = smtp_handle_acl_fail(ACL_WHERE_HELO, rc, user_msg, log_msg);
4169 if (sender_helo_name)
4170 {
4171 store_free(sender_helo_name);
4172 sender_helo_name = NULL;
4173 }
4174 host_build_sender_fullhost(); /* Rebuild */
4175 break;
a5c60e3c 4176 }
e0574cb5 4177 else if (!check_sync()) goto SYNC_FAILURE;
059ec3d9 4178
e0574cb5
JH
4179 /* Generate an OK reply. The default string includes the ident if present,
4180 and also the IP address if present. Reflecting back the ident is intended
4181 as a deterrent to mail forgers. For maximum efficiency, and also because
4182 some broken systems expect each response to be in a single packet, arrange
4183 that the entire reply is sent in one write(). */
059ec3d9 4184
e0574cb5
JH
4185 auth_advertised = FALSE;
4186 smtp_in_pipelining_advertised = FALSE;
d1a13eea 4187#ifdef SUPPORT_TLS
e0574cb5 4188 tls_advertised = FALSE;
8ac90765 4189# ifdef EXPERIMENTAL_REQUIRETLS
e0574cb5 4190 requiretls_advertised = FALSE;
8ac90765 4191# endif
d1a13eea 4192#endif
e0574cb5 4193 dsn_advertised = FALSE;
8c5d388a 4194#ifdef SUPPORT_I18N
e0574cb5 4195 smtputf8_advertised = FALSE;
d1a13eea 4196#endif
059ec3d9 4197
e0574cb5
JH
4198 smtp_code = US"250 "; /* Default response code plus space*/
4199 if (!user_msg)
4200 {
4201 s = string_sprintf("%.3s %s Hello %s%s%s",
4202 smtp_code,
4203 smtp_active_hostname,
4204 sender_ident ? sender_ident : US"",
4205 sender_ident ? US" at " : US"",
4206 sender_host_name ? sender_host_name : sender_helo_name);
4207 g = string_cat(NULL, s);
4208
4209 if (sender_host_address)
4210 {
4211 g = string_catn(g, US" [", 2);
4212 g = string_cat (g, sender_host_address);
4213 g = string_catn(g, US"]", 1);
4214 }
4215 }
4e88a19f 4216
e0574cb5
JH
4217 /* A user-supplied EHLO greeting may not contain more than one line. Note
4218 that the code returned by smtp_message_code() includes the terminating
4219 whitespace character. */
059ec3d9 4220
e0574cb5
JH
4221 else
4222 {
4223 char *ss;
4224 int codelen = 4;
4225 smtp_message_code(&smtp_code, &codelen, &user_msg, NULL, TRUE);
4226 s = string_sprintf("%.*s%s", codelen, smtp_code, user_msg);
4227 if ((ss = strpbrk(CS s, "\r\n")) != NULL)
4228 {
4229 log_write(0, LOG_MAIN|LOG_PANIC, "EHLO/HELO response must not contain "
4230 "newlines: message truncated: %s", string_printing(s));
4231 *ss = 0;
4232 }
4233 g = string_cat(NULL, s);
4234 }
059ec3d9 4235
e0574cb5 4236 g = string_catn(g, US"\r\n", 2);
059ec3d9 4237
e0574cb5
JH
4238 /* If we received EHLO, we must create a multiline response which includes
4239 the functions supported. */
059ec3d9 4240
e0574cb5
JH
4241 if (esmtp)
4242 {
4243 g->s[3] = '-';
059ec3d9 4244
e0574cb5
JH
4245 /* I'm not entirely happy with this, as an MTA is supposed to check
4246 that it has enough room to accept a message of maximum size before
4247 it sends this. However, there seems little point in not sending it.
4248 The actual size check happens later at MAIL FROM time. By postponing it
4249 till then, VRFY and EXPN can be used after EHLO when space is short. */
059ec3d9 4250
e0574cb5
JH
4251 if (thismessage_size_limit > 0)
4252 {
4253 sprintf(CS big_buffer, "%.3s-SIZE %d\r\n", smtp_code,
4254 thismessage_size_limit);
4255 g = string_cat(g, big_buffer);
4256 }
4257 else
4258 {
4259 g = string_catn(g, smtp_code, 3);
4260 g = string_catn(g, US"-SIZE\r\n", 7);
4261 }
059ec3d9 4262
e0574cb5
JH
4263 /* Exim does not do protocol conversion or data conversion. It is 8-bit
4264 clean; if it has an 8-bit character in its hand, it just sends it. It
4265 cannot therefore specify 8BITMIME and remain consistent with the RFCs.
4266 However, some users want this option simply in order to stop MUAs
4267 mangling messages that contain top-bit-set characters. It is therefore
4268 provided as an option. */
059ec3d9 4269
e0574cb5
JH
4270 if (accept_8bitmime)
4271 {
4272 g = string_catn(g, smtp_code, 3);
4273 g = string_catn(g, US"-8BITMIME\r\n", 11);
4274 }
059ec3d9 4275
e0574cb5
JH
4276 /* Advertise DSN support if configured to do so. */
4277 if (verify_check_host(&dsn_advertise_hosts) != FAIL)
4278 {
4279 g = string_catn(g, smtp_code, 3);
4280 g = string_catn(g, US"-DSN\r\n", 6);
4281 dsn_advertised = TRUE;
4282 }
6c1c3d1d 4283
e0574cb5
JH
4284 /* Advertise ETRN/VRFY/EXPN if there's are ACL checking whether a host is
4285 permitted to issue them; a check is made when any host actually tries. */
059ec3d9 4286
e0574cb5
JH
4287 if (acl_smtp_etrn)
4288 {
4289 g = string_catn(g, smtp_code, 3);
4290 g = string_catn(g, US"-ETRN\r\n", 7);
4291 }
4292 if (acl_smtp_vrfy)
4293 {
4294 g = string_catn(g, smtp_code, 3);
4295 g = string_catn(g, US"-VRFY\r\n", 7);
4296 }
4297 if (acl_smtp_expn)
4298 {
4299 g = string_catn(g, smtp_code, 3);
4300 g = string_catn(g, US"-EXPN\r\n", 7);
4301 }
059ec3d9 4302
e0574cb5
JH
4303 /* Exim is quite happy with pipelining, so let the other end know that
4304 it is safe to use it, unless advertising is disabled. */
059ec3d9 4305
e0574cb5
JH
4306 if (pipelining_enable &&
4307 verify_check_host(&pipelining_advertise_hosts) == OK)
4308 {
4309 g = string_catn(g, smtp_code, 3);
4310 g = string_catn(g, US"-PIPELINING\r\n", 13);
4311 sync_cmd_limit = NON_SYNC_CMD_PIPELINING;
4312 smtp_in_pipelining_advertised = TRUE;
4313 }
059ec3d9 4314
fd98a5c6 4315
e0574cb5
JH
4316 /* If any server authentication mechanisms are configured, advertise
4317 them if the current host is in auth_advertise_hosts. The problem with
4318 advertising always is that some clients then require users to
4319 authenticate (and aren't configurable otherwise) even though it may not
4320 be necessary (e.g. if the host is in host_accept_relay).
059ec3d9 4321
e0574cb5
JH
4322 RFC 2222 states that SASL mechanism names contain only upper case
4323 letters, so output the names in upper case, though we actually recognize
4324 them in either case in the AUTH command. */
059ec3d9 4325
e0574cb5 4326 if ( auths
16be7f11 4327#ifdef AUTH_TLS
e0574cb5 4328 && !sender_host_authenticated
b3ef41c9 4329#endif
e0574cb5
JH
4330 && verify_check_host(&auth_advertise_hosts) == OK
4331 )
8b6b06fe 4332 {
e0574cb5
JH
4333 auth_instance *au;
4334 BOOL first = TRUE;
4335 for (au = auths; au; au = au->next)
b3ef41c9 4336 {
e0574cb5
JH
4337 au->advertised = FALSE;
4338 if (au->server)
b3ef41c9 4339 {
e0574cb5
JH
4340 DEBUG(D_auth+D_expand) debug_printf_indent(
4341 "Evaluating advertise_condition for %s athenticator\n",
4342 au->public_name);
4343 if ( !au->advertise_condition
4344 || expand_check_condition(au->advertise_condition, au->name,
4345 US"authenticator")
4346 )
8b6b06fe 4347 {
e0574cb5
JH
4348 int saveptr;
4349 if (first)
4350 {
4351 g = string_catn(g, smtp_code, 3);
4352 g = string_catn(g, US"-AUTH", 5);
4353 first = FALSE;
4354 auth_advertised = TRUE;
4355 }
4356 saveptr = g->ptr;
4357 g = string_catn(g, US" ", 1);
4358 g = string_cat (g, au->public_name);
4359 while (++saveptr < g->ptr) g->s[saveptr] = toupper(g->s[saveptr]);
4360 au->advertised = TRUE;
8b6b06fe 4361 }
b3ef41c9 4362 }
b3ef41c9 4363 }
b3ef41c9 4364
e0574cb5
JH
4365 if (!first) g = string_catn(g, US"\r\n", 2);
4366 }
059ec3d9 4367
e0574cb5 4368 /* RFC 3030 CHUNKING */
059ec3d9 4369
e0574cb5
JH
4370 if (verify_check_host(&chunking_advertise_hosts) != FAIL)
4371 {
4372 g = string_catn(g, smtp_code, 3);
4373 g = string_catn(g, US"-CHUNKING\r\n", 11);
4374 chunking_offered = TRUE;
4375 chunking_state = CHUNKING_OFFERED;
4376 }
aa368db3 4377
e0574cb5
JH
4378 /* Advertise TLS (Transport Level Security) aka SSL (Secure Socket Layer)
4379 if it has been included in the binary, and the host matches
4380 tls_advertise_hosts. We must *not* advertise if we are already in a
4381 secure connection. */
18481de3 4382
d1a13eea 4383#ifdef SUPPORT_TLS
e0574cb5
JH
4384 if (tls_in.active.sock < 0 &&
4385 verify_check_host(&tls_advertise_hosts) != FAIL)
4386 {
4387 g = string_catn(g, smtp_code, 3);
4388 g = string_catn(g, US"-STARTTLS\r\n", 11);
4389 tls_advertised = TRUE;
4390 }
8ac90765
JH
4391
4392# ifdef EXPERIMENTAL_REQUIRETLS
e0574cb5
JH
4393 /* Advertise REQUIRETLS only once we are in a secure connection */
4394 if ( tls_in.active.sock >= 0
4395 && verify_check_host(&tls_advertise_requiretls) != FAIL)
4396 {
4397 g = string_catn(g, smtp_code, 3);
4398 g = string_catn(g, US"-REQUIRETLS\r\n", 13);
4399 requiretls_advertised = TRUE;
4400 }
8ac90765 4401# endif
d1a13eea 4402#endif
059ec3d9 4403
d1a13eea 4404#ifndef DISABLE_PRDR
e0574cb5
JH
4405 /* Per Recipient Data Response, draft by Eric A. Hall extending RFC */
4406 if (prdr_enable)
4407 {
4408 g = string_catn(g, smtp_code, 3);
4409 g = string_catn(g, US"-PRDR\r\n", 7);
4410 }
d1a13eea
JH
4411#endif
4412
8c5d388a 4413#ifdef SUPPORT_I18N
e0574cb5
JH
4414 if ( accept_8bitmime
4415 && verify_check_host(&smtputf8_advertise_hosts) != FAIL)
4416 {
4417 g = string_catn(g, smtp_code, 3);
4418 g = string_catn(g, US"-SMTPUTF8\r\n", 11);
4419 smtputf8_advertised = TRUE;
4420 }
d1a13eea 4421#endif
fd98a5c6 4422
e0574cb5 4423 /* Finish off the multiline reply with one that is always available. */
059ec3d9 4424
e0574cb5
JH
4425 g = string_catn(g, smtp_code, 3);
4426 g = string_catn(g, US" HELP\r\n", 7);
4427 }
059ec3d9 4428
e0574cb5
JH
4429 /* Terminate the string (for debug), write it, and note that HELO/EHLO
4430 has been seen. */
059ec3d9 4431
d1a13eea 4432#ifdef SUPPORT_TLS
e0574cb5 4433 if (tls_in.active.sock >= 0) (void)tls_write(NULL, g->s, g->ptr, FALSE); else
d1a13eea 4434#endif
059ec3d9 4435
e0574cb5
JH
4436 {
4437 int i = fwrite(g->s, 1, g->ptr, smtp_out); i = i; /* compiler quietening */
4438 }
4439 DEBUG(D_receive)
4440 {
4441 uschar *cr;
acec9514 4442
e0574cb5
JH
4443 (void) string_from_gstring(g);
4444 while ((cr = Ustrchr(g->s, '\r')) != NULL) /* lose CRs */
4445 memmove(cr, cr + 1, (g->ptr--) - (cr - g->s));
4446 debug_printf("SMTP>> %s", g->s);
4447 }
4448 helo_seen = TRUE;
4e88a19f 4449
e0574cb5
JH
4450 /* Reset the protocol and the state, abandoning any previous message. */
4451 received_protocol =
4452 (sender_host_address ? protocols : protocols_local)
4453 [ (esmtp
4454 ? pextend + (sender_host_authenticated ? pauthed : 0)
4455 : pnormal)
4456 + (tls_in.active.sock >= 0 ? pcrpted : 0)
4457 ];
4458 cancel_cutthrough_connection(TRUE, US"sent EHLO response");
4459 smtp_reset(reset_point);
4460 toomany = FALSE;
4461 break; /* HELO/EHLO */
059ec3d9
PH
4462
4463
4464 /* The MAIL command requires an address as an operand. All we do
4465 here is to parse it for syntactic correctness. The form "<>" is
4466 a special case which converts into an empty string. The start/end
4467 pointers in the original are not used further for this address, as
4468 it is the canonical extracted address which is all that is kept. */
4469
4470 case MAIL_CMD:
e0574cb5
JH
4471 HAD(SCH_MAIL);
4472 smtp_mailcmd_count++; /* Count for limit and ratelimit */
4473 was_rej_mail = TRUE; /* Reset if accepted */
4474 env_mail_type_t * mail_args; /* Sanity check & validate args */
059ec3d9 4475
e0574cb5
JH
4476 if (helo_required && !helo_seen)
4477 {
4478 smtp_printf("503 HELO or EHLO required\r\n", FALSE);
4479 log_write(0, LOG_MAIN|LOG_REJECT, "rejected MAIL from %s: no "
4480 "HELO/EHLO given", host_and_ident(FALSE));
4481 break;
4482 }
059ec3d9 4483
e0574cb5
JH
4484 if (sender_address)
4485 {
4486 done = synprot_error(L_smtp_protocol_error, 503, NULL,
4487 US"sender already given");
4488 break;
4489 }
059ec3d9 4490
e0574cb5
JH
4491 if (!*smtp_cmd_data)
4492 {
4493 done = synprot_error(L_smtp_protocol_error, 501, NULL,
4494 US"MAIL must have an address operand");
4495 break;
4496 }
059ec3d9 4497
e0574cb5
JH
4498 /* Check to see if the limit for messages per connection would be
4499 exceeded by accepting further messages. */
059ec3d9 4500
e0574cb5
JH
4501 if (smtp_accept_max_per_connection > 0 &&
4502 smtp_mailcmd_count > smtp_accept_max_per_connection)
4503 {
4504 smtp_printf("421 too many messages in this connection\r\n", FALSE);
4505 log_write(0, LOG_MAIN|LOG_REJECT, "rejected MAIL command %s: too many "
4506 "messages in one connection", host_and_ident(TRUE));
4507 break;
4508 }
059ec3d9 4509
e0574cb5
JH
4510 /* Reset for start of message - even if this is going to fail, we
4511 obviously need to throw away any previous data. */
059ec3d9 4512
e0574cb5
JH
4513 cancel_cutthrough_connection(TRUE, US"MAIL received");
4514 smtp_reset(reset_point);
4515 toomany = FALSE;
4516 sender_data = recipient_data = NULL;
059ec3d9 4517
e0574cb5 4518 /* Loop, checking for ESMTP additions to the MAIL FROM command. */
059ec3d9 4519
e0574cb5
JH
4520 if (esmtp) for(;;)
4521 {
4522 uschar *name, *value, *end;
4523 unsigned long int size;
4524 BOOL arg_error = FALSE;
059ec3d9 4525
e0574cb5 4526 if (!extract_option(&name, &value)) break;
059ec3d9 4527
e0574cb5
JH
4528 for (mail_args = env_mail_type_list;
4529 mail_args->value != ENV_MAIL_OPT_NULL;
4530 mail_args++
4531 )
4532 if (strcmpic(name, mail_args->name) == 0)
4533 break;
4534 if (mail_args->need_value && strcmpic(value, US"") == 0)
4535 break;
059ec3d9 4536
e0574cb5
JH
4537 switch(mail_args->value)
4538 {
4539 /* Handle SIZE= by reading the value. We don't do the check till later,
4540 in order to be able to log the sender address on failure. */
4541 case ENV_MAIL_OPT_SIZE:
4542 if (((size = Ustrtoul(value, &end, 10)), *end == 0))
9d4319df 4543 {
e0574cb5
JH
4544 if ((size == ULONG_MAX && errno == ERANGE) || size > INT_MAX)
4545 size = INT_MAX;
4546 message_size = (int)size;
4547 }
4548 else
4549 arg_error = TRUE;
4550 break;
4551
4552 /* If this session was initiated with EHLO and accept_8bitmime is set,
4553 Exim will have indicated that it supports the BODY=8BITMIME option. In
4554 fact, it does not support this according to the RFCs, in that it does not
4555 take any special action for forwarding messages containing 8-bit
4556 characters. That is why accept_8bitmime is not the default setting, but
4557 some sites want the action that is provided. We recognize both "8BITMIME"
4558 and "7BIT" as body types, but take no action. */
4559 case ENV_MAIL_OPT_BODY:
4560 if (accept_8bitmime) {
4561 if (strcmpic(value, US"8BITMIME") == 0)
4562 body_8bitmime = 8;
4563 else if (strcmpic(value, US"7BIT") == 0)
4564 body_8bitmime = 7;
4565 else
4566 {
4567 body_8bitmime = 0;
4568 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4569 US"invalid data for BODY");
4570 goto COMMAND_LOOP;
4571 }
4572 DEBUG(D_receive) debug_printf("8BITMIME: %d\n", body_8bitmime);
4573 break;
4574 }
4575 arg_error = TRUE;
3c0a92dc 4576 break;
059ec3d9 4577
e0574cb5
JH
4578 /* Handle the two DSN options, but only if configured to do so (which
4579 will have caused "DSN" to be given in the EHLO response). The code itself
4580 is included only if configured in at build time. */
6c1c3d1d 4581
e0574cb5
JH
4582 case ENV_MAIL_OPT_RET:
4583 if (dsn_advertised)
9d4319df 4584 {
e0574cb5
JH
4585 /* Check if RET has already been set */
4586 if (dsn_ret > 0)
4587 {
4588 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4589 US"RET can be specified once only");
4590 goto COMMAND_LOOP;
4591 }
4592 dsn_ret = strcmpic(value, US"HDRS") == 0
4593 ? dsn_ret_hdrs
4594 : strcmpic(value, US"FULL") == 0
4595 ? dsn_ret_full
4596 : 0;
4597 DEBUG(D_receive) debug_printf("DSN_RET: %d\n", dsn_ret);
4598 /* Check for invalid invalid value, and exit with error */
4599 if (dsn_ret == 0)
4600 {
4601 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4602 US"Value for RET is invalid");
4603 goto COMMAND_LOOP;
4604 }
9d4319df 4605 }
e0574cb5
JH
4606 break;
4607 case ENV_MAIL_OPT_ENVID:
4608 if (dsn_advertised)
9d4319df 4609 {
e0574cb5
JH
4610 /* Check if the dsn envid has been already set */
4611 if (dsn_envid)
4612 {
4613 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4614 US"ENVID can be specified once only");
4615 goto COMMAND_LOOP;
4616 }
4617 dsn_envid = string_copy(value);
4618 DEBUG(D_receive) debug_printf("DSN_ENVID: %s\n", dsn_envid);
9d4319df 4619 }
e0574cb5 4620 break;
059ec3d9 4621
e0574cb5
JH
4622 /* Handle the AUTH extension. If the value given is not "<>" and either
4623 the ACL says "yes" or there is no ACL but the sending host is
4624 authenticated, we set it up as the authenticated sender. However, if the
4625 authenticator set a condition to be tested, we ignore AUTH on MAIL unless
4626 the condition is met. The value of AUTH is an xtext, which means that +,
4627 = and cntrl chars are coded in hex; however "<>" is unaffected by this
4628 coding. */
4629 case ENV_MAIL_OPT_AUTH:
4630 if (Ustrcmp(value, "<>") != 0)
4631 {
4632 int rc;
4633 uschar *ignore_msg;
94431adb 4634
e0574cb5
JH
4635 if (auth_xtextdecode(value, &authenticated_sender) < 0)
4636 {
4637 /* Put back terminator overrides for error message */
9d4319df
JH
4638 value[-1] = '=';
4639 name[-1] = ' ';
e0574cb5
JH
4640 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4641 US"invalid data for AUTH");
9d4319df 4642 goto COMMAND_LOOP;
e0574cb5
JH
4643 }
4644 if (!acl_smtp_mailauth)
4645 {
4646 ignore_msg = US"client not authenticated";
4647 rc = sender_host_authenticated ? OK : FAIL;
4648 }
4649 else
4650 {
4651 ignore_msg = US"rejected by ACL";
4652 rc = acl_check(ACL_WHERE_MAILAUTH, NULL, acl_smtp_mailauth,
4653 &user_msg, &log_msg);
4654 }
4655
4656 switch (rc)
4657 {
4658 case OK:
4659 if (authenticated_by == NULL ||
4660 authenticated_by->mail_auth_condition == NULL ||
4661 expand_check_condition(authenticated_by->mail_auth_condition,
4662 authenticated_by->name, US"authenticator"))
4663 break; /* Accept the AUTH */
4664
4665 ignore_msg = US"server_mail_auth_condition failed";
4666 if (authenticated_id != NULL)
4667 ignore_msg = string_sprintf("%s: authenticated ID=\"%s\"",
4668 ignore_msg, authenticated_id);
4669
4670 /* Fall through */
4671
4672 case FAIL:
4673 authenticated_sender = NULL;
4674 log_write(0, LOG_MAIN, "ignoring AUTH=%s from %s (%s)",
4675 value, host_and_ident(TRUE), ignore_msg);
4676 break;
4677
4678 /* Should only get DEFER or ERROR here. Put back terminator
4679 overrides for error message */
4680
4681 default:
4682 value[-1] = '=';
4683 name[-1] = ' ';
4684 (void)smtp_handle_acl_fail(ACL_WHERE_MAILAUTH, rc, user_msg,
4685 log_msg);
4686 goto COMMAND_LOOP;
4687 }
4688 }
4689 break;
fd98a5c6 4690
8ccd00b1 4691#ifndef DISABLE_PRDR
e0574cb5
JH
4692 case ENV_MAIL_OPT_PRDR:
4693 if (prdr_enable)
4694 prdr_requested = TRUE;
4695 break;
fd98a5c6
JH
4696#endif
4697
8c5d388a 4698#ifdef SUPPORT_I18N
e0574cb5
JH
4699 case ENV_MAIL_OPT_UTF8:
4700 if (!smtputf8_advertised)
4701 {
4702 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4703 US"SMTPUTF8 used when not advertised");
4704 goto COMMAND_LOOP;
4705 }
8c34c611 4706
e0574cb5
JH
4707 DEBUG(D_receive) debug_printf("smtputf8 requested\n");
4708 message_smtputf8 = allow_utf8_domains = TRUE;
4709 if (Ustrncmp(received_protocol, US"utf8", 4) != 0)
4710 {
4711 int old_pool = store_pool;
4712 store_pool = POOL_PERM;
4713 received_protocol = string_sprintf("utf8%s", received_protocol);
4714 store_pool = old_pool;
4715 }
4716 break;
d1a13eea 4717#endif
8ac90765
JH
4718
4719#if defined(SUPPORT_TLS) && defined(EXPERIMENTAL_REQUIRETLS)
e0574cb5 4720 case ENV_MAIL_OPT_REQTLS:
8ac90765 4721 {
e0574cb5
JH
4722 uschar * r, * t;
4723
4724 if (!requiretls_advertised)
4725 {
4726 done = synprot_error(L_smtp_syntax_error, 555, NULL,
4727 US"unadvertised MAIL option: REQUIRETLS");
4728 goto COMMAND_LOOP;
4729 }
8ac90765 4730
e0574cb5
JH
4731 DEBUG(D_receive) debug_printf("requiretls requested\n");
4732 tls_requiretls = REQUIRETLS_MSG;
8ac90765 4733
e0574cb5
JH
4734 r = string_copy_malloc(received_protocol);
4735 if ((t = Ustrrchr(r, 's'))) *t = 'S';
4736 received_protocol = r;
4737 }
4738 break;
8ac90765
JH
4739#endif
4740
e0574cb5
JH
4741 /* No valid option. Stick back the terminator characters and break
4742 the loop. Do the name-terminator second as extract_option sets
4743 value==name when it found no equal-sign.
4744 An error for a malformed address will occur. */
4745 case ENV_MAIL_OPT_NULL:
4746 value[-1] = '=';
4747 name[-1] = ' ';
4748 arg_error = TRUE;
4749 break;
2ef7ed08 4750
e0574cb5
JH
4751 default: assert(0);
4752 }
4753 /* Break out of for loop if switch() had bad argument or
4754 when start of the email address is reached */
4755 if (arg_error) break;
4756 }
059ec3d9 4757
8ac90765 4758#if defined(SUPPORT_TLS) && defined(EXPERIMENTAL_REQUIRETLS)
e0574cb5
JH
4759 if (tls_requiretls & REQUIRETLS_MSG)
4760 {
4761 /* Ensure headers-only bounces whether a RET option was given or not. */
8ac90765 4762
e0574cb5
JH
4763 DEBUG(D_receive) if (dsn_ret == dsn_ret_full)
4764 debug_printf("requiretls override: dsn_ret_full -> dsn_ret_hdrs\n");
4765 dsn_ret = dsn_ret_hdrs;
4766 }
8ac90765
JH
4767#endif
4768
e0574cb5
JH
4769 /* If we have passed the threshold for rate limiting, apply the current
4770 delay, and update it for next time, provided this is a limited host. */
059ec3d9 4771
e0574cb5
JH
4772 if (smtp_mailcmd_count > smtp_rlm_threshold &&
4773 verify_check_host(&smtp_ratelimit_hosts) == OK)
4774 {
4775 DEBUG(D_receive) debug_printf("rate limit MAIL: delay %.3g sec\n",
4776 smtp_delay_mail/1000.0);
4777 millisleep((int)smtp_delay_mail);
4778 smtp_delay_mail *= smtp_rlm_factor;
4779 if (smtp_delay_mail > (double)smtp_rlm_limit)
4780 smtp_delay_mail = (double)smtp_rlm_limit;
4781 }
059ec3d9 4782
e0574cb5
JH
4783 /* Now extract the address, first applying any SMTP-time rewriting. The
4784 TRUE flag allows "<>" as a sender address. */
059ec3d9 4785
e0574cb5
JH
4786 raw_sender = rewrite_existflags & rewrite_smtp
4787 ? rewrite_one(smtp_cmd_data, rewrite_smtp, NULL, FALSE, US"",
4788 global_rewrite_rules)
4789 : smtp_cmd_data;
059ec3d9 4790
e0574cb5
JH
4791 raw_sender =
4792 parse_extract_address(raw_sender, &errmess, &start, &end, &sender_domain,
4793 TRUE);
059ec3d9 4794
e0574cb5
JH
4795 if (!raw_sender)
4796 {
4797 done = synprot_error(L_smtp_syntax_error, 501, smtp_cmd_data, errmess);
4798 break;
4799 }
059ec3d9 4800
e0574cb5 4801 sender_address = raw_sender;
059ec3d9 4802
e0574cb5
JH
4803 /* If there is a configured size limit for mail, check that this message
4804 doesn't exceed it. The check is postponed to this point so that the sender
4805 can be logged. */
059ec3d9 4806
e0574cb5
JH
4807 if (thismessage_size_limit > 0 && message_size > thismessage_size_limit)
4808 {
4809 smtp_printf("552 Message size exceeds maximum permitted\r\n", FALSE);
4810 log_write(L_size_reject,
4811 LOG_MAIN|LOG_REJECT, "rejected MAIL FROM:<%s> %s: "
4812 "message too big: size%s=%d max=%d",
4813 sender_address,
4814 host_and_ident(TRUE),
4815 (message_size == INT_MAX)? ">" : "",
4816 message_size,
4817 thismessage_size_limit);
4818 sender_address = NULL;
4819 break;
4820 }
059ec3d9 4821
e0574cb5
JH
4822 /* Check there is enough space on the disk unless configured not to.
4823 When smtp_check_spool_space is set, the check is for thismessage_size_limit
4824 plus the current message - i.e. we accept the message only if it won't
4825 reduce the space below the threshold. Add 5000 to the size to allow for
4826 overheads such as the Received: line and storing of recipients, etc.
4827 By putting the check here, even when SIZE is not given, it allow VRFY
4828 and EXPN etc. to be used when space is short. */
4829
4830 if (!receive_check_fs(
4831 (smtp_check_spool_space && message_size >= 0)?
4832 message_size + 5000 : 0))
4833 {
4834 smtp_printf("452 Space shortage, please try later\r\n", FALSE);
4835 sender_address = NULL;
4836 break;
4837 }
059ec3d9 4838
e0574cb5
JH
4839 /* If sender_address is unqualified, reject it, unless this is a locally
4840 generated message, or the sending host or net is permitted to send
4841 unqualified addresses - typically local machines behaving as MUAs -
4842 in which case just qualify the address. The flag is set above at the start
4843 of the SMTP connection. */
059ec3d9 4844
e0574cb5
JH
4845 if (!sender_domain && *sender_address)
4846 if (allow_unqualified_sender)
4847 {
4848 sender_domain = Ustrlen(sender_address) + 1;
4849 sender_address = rewrite_address_qualify(sender_address, FALSE);
4850 DEBUG(D_receive) debug_printf("unqualified address %s accepted\n",
4851 raw_sender);
4852 }
4853 else
4854 {
4855 smtp_printf("501 %s: sender address must contain a domain\r\n", FALSE,
4856 smtp_cmd_data);
4857 log_write(L_smtp_syntax_error,
4858 LOG_MAIN|LOG_REJECT,
4859 "unqualified sender rejected: <%s> %s%s",
4860 raw_sender,
4861 host_and_ident(TRUE),
4862 host_lookup_msg);
4863 sender_address = NULL;
4864 break;
4865 }
059ec3d9 4866
e0574cb5
JH
4867 /* Apply an ACL check if one is defined, before responding. Afterwards,
4868 when pipelining is not advertised, do another sync check in case the ACL
4869 delayed and the client started sending in the meantime. */
059ec3d9 4870
e0574cb5
JH
4871 if (acl_smtp_mail)
4872 {
4873 rc = acl_check(ACL_WHERE_MAIL, NULL, acl_smtp_mail, &user_msg, &log_msg);
4874 if (rc == OK && !smtp_in_pipelining_advertised && !check_sync())
4875 goto SYNC_FAILURE;
4876 }
4877 else
4878 rc = OK;
925ac8e4 4879
e0574cb5
JH
4880 if (rc == OK || rc == DISCARD)
4881 {
4882 BOOL more = pipeline_response();
4883
4884 if (!user_msg)
4885 smtp_printf("%s%s%s", more, US"250 OK",
4886 #ifndef DISABLE_PRDR
4887 prdr_requested ? US", PRDR Requested" : US"",
4888 #else
4889 US"",
4890 #endif
4891 US"\r\n");
4892 else
4893 {
4894 #ifndef DISABLE_PRDR
4895 if (prdr_requested)
4896 user_msg = string_sprintf("%s%s", user_msg, US", PRDR Requested");
4897 #endif
4898 smtp_user_msg(US"250", user_msg);
4899 }
4900 smtp_delay_rcpt = smtp_rlr_base;
4901 recipients_discarded = (rc == DISCARD);
4902 was_rej_mail = FALSE;
4903 }
94431adb 4904 else
e0574cb5
JH
4905 {
4906 done = smtp_handle_acl_fail(ACL_WHERE_MAIL, rc, user_msg, log_msg);
4907 sender_address = NULL;
4908 }
4909 break;
059ec3d9
PH
4910
4911
2679d413
PH
4912 /* The RCPT command requires an address as an operand. There may be any
4913 number of RCPT commands, specifying multiple recipients. We build them all
4914 into a data structure. The start/end values given by parse_extract_address
4915 are not used, as we keep only the extracted address. */
059ec3d9
PH
4916
4917 case RCPT_CMD:
e0574cb5
JH
4918 HAD(SCH_RCPT);
4919 rcpt_count++;
4920 was_rcpt = rcpt_in_progress = TRUE;
059ec3d9 4921
e0574cb5
JH
4922 /* There must be a sender address; if the sender was rejected and
4923 pipelining was advertised, we assume the client was pipelining, and do not
4924 count this as a protocol error. Reset was_rej_mail so that further RCPTs
4925 get the same treatment. */
059ec3d9 4926
e0574cb5
JH
4927 if (sender_address == NULL)
4928 {
4929 if (smtp_in_pipelining_advertised && last_was_rej_mail)
4930 {
4931 smtp_printf("503 sender not yet given\r\n", FALSE);
4932 was_rej_mail = TRUE;
4933 }
4934 else
4935 {
4936 done = synprot_error(L_smtp_protocol_error, 503, NULL,
4937 US"sender not yet given");
4938 was_rcpt = FALSE; /* Not a valid RCPT */
4939 }
4940 rcpt_fail_count++;
4941 break;
4942 }
059ec3d9 4943
e0574cb5 4944 /* Check for an operand */
059ec3d9 4945
e0574cb5
JH
4946 if (smtp_cmd_data[0] == 0)
4947 {
4948 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4949 US"RCPT must have an address operand");
4950 rcpt_fail_count++;
4951 break;
4952 }
50dc7409 4953
e0574cb5
JH
4954 /* Set the DSN flags orcpt and dsn_flags from the session*/
4955 orcpt = NULL;
4956 flags = 0;
6c1c3d1d 4957
e0574cb5
JH
4958 if (esmtp) for(;;)
4959 {
4960 uschar *name, *value;
6c1c3d1d 4961
e0574cb5
JH
4962 if (!extract_option(&name, &value))
4963 break;
6c1c3d1d 4964
e0574cb5 4965 if (dsn_advertised && strcmpic(name, US"ORCPT") == 0)
45500060 4966 {
e0574cb5
JH
4967 /* Check whether orcpt has been already set */
4968 if (orcpt)
4969 {
4970 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4971 US"ORCPT can be specified once only");
4972 goto COMMAND_LOOP;
4973 }
4974 orcpt = string_copy(value);
4975 DEBUG(D_receive) debug_printf("DSN orcpt: %s\n", orcpt);
4976 }
6c1c3d1d 4977
e0574cb5 4978 else if (dsn_advertised && strcmpic(name, US"NOTIFY") == 0)
45500060 4979 {
e0574cb5
JH
4980 /* Check if the notify flags have been already set */
4981 if (flags > 0)
4982 {
4983 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4984 US"NOTIFY can be specified once only");
4985 goto COMMAND_LOOP;
4986 }
4987 if (strcmpic(value, US"NEVER") == 0)
4988 flags |= rf_notify_never;
4989 else
4990 {
4991 uschar *p = value;
4992 while (*p != 0)
45500060 4993 {
e0574cb5
JH
4994 uschar *pp = p;
4995 while (*pp != 0 && *pp != ',') pp++;
4996 if (*pp == ',') *pp++ = 0;
4997 if (strcmpic(p, US"SUCCESS") == 0)
4998 {
4999 DEBUG(D_receive) debug_printf("DSN: Setting notify success\n");
5000 flags |= rf_notify_success;
5001 }
5002 else if (strcmpic(p, US"FAILURE") == 0)
5003 {
5004 DEBUG(D_receive) debug_printf("DSN: Setting notify failure\n");
5005 flags |= rf_notify_failure;
5006 }
5007 else if (strcmpic(p, US"DELAY") == 0)
5008 {
5009 DEBUG(D_receive) debug_printf("DSN: Setting notify delay\n");
5010 flags |= rf_notify_delay;
5011 }
5012 else
5013 {
5014 /* Catch any strange values */
5015 done = synprot_error(L_smtp_syntax_error, 501, NULL,
5016 US"Invalid value for NOTIFY parameter");
5017 goto COMMAND_LOOP;
5018 }
5019 p = pp;
5020 }
5021 DEBUG(D_receive) debug_printf("DSN Flags: %x\n", flags);
5022 }
5023 }
6c1c3d1d 5024
e0574cb5
JH
5025 /* Unknown option. Stick back the terminator characters and break
5026 the loop. An error for a malformed address will occur. */
6c1c3d1d 5027
e0574cb5
JH
5028 else
5029 {
5030 DEBUG(D_receive) debug_printf("Invalid RCPT option: %s : %s\n", name, value);
5031 name[-1] = ' ';
5032 value[-1] = '=';
5033 break;
5034 }
5035 }
059ec3d9 5036
e0574cb5
JH
5037 /* Apply SMTP rewriting then extract the working address. Don't allow "<>"
5038 as a recipient address */
059ec3d9 5039
e0574cb5
JH
5040 recipient = rewrite_existflags & rewrite_smtp
5041 ? rewrite_one(smtp_cmd_data, rewrite_smtp, NULL, FALSE, US"",
5042 global_rewrite_rules)
5043 : smtp_cmd_data;
059ec3d9 5044
e0574cb5
JH
5045 if (!(recipient = parse_extract_address(recipient, &errmess, &start, &end,
5046 &recipient_domain, FALSE)))
5047 {
5048 done = synprot_error(L_smtp_syntax_error, 501, smtp_cmd_data, errmess);
5049 rcpt_fail_count++;
5050 break;
5051 }
059ec3d9 5052
e0574cb5
JH
5053 /* If the recipient address is unqualified, reject it, unless this is a
5054 locally generated message. However, unqualified addresses are permitted
5055 from a configured list of hosts and nets - typically when behaving as
5056 MUAs rather than MTAs. Sad that SMTP is used for both types of traffic,
5057 really. The flag is set at the start of the SMTP connection.
059ec3d9 5058
e0574cb5
JH
5059 RFC 1123 talks about supporting "the reserved mailbox postmaster"; I always
5060 assumed this meant "reserved local part", but the revision of RFC 821 and
5061 friends now makes it absolutely clear that it means *mailbox*. Consequently
5062 we must always qualify this address, regardless. */
059ec3d9 5063
e0574cb5
JH
5064 if (!recipient_domain)
5065 if (!(recipient_domain = qualify_recipient(&recipient, smtp_cmd_data,
5066 US"recipient")))
5067 {
5068 rcpt_fail_count++;
5069 break;
5070 }
059ec3d9 5071
e0574cb5 5072 /* Check maximum allowed */
059ec3d9 5073
e0574cb5
JH
5074 if (rcpt_count > recipients_max && recipients_max > 0)
5075 {
5076 if (recipients_max_reject)
5077 {
5078 rcpt_fail_count++;
5079 smtp_printf("552 too many recipients\r\n", FALSE);
5080 if (!toomany)
5081 log_write(0, LOG_MAIN|LOG_REJECT, "too many recipients: message "
5082 "rejected: sender=<%s> %s", sender_address, host_and_ident(TRUE));
5083 }
5084 else
5085 {
5086 rcpt_defer_count++;
5087 smtp_printf("452 too many recipients\r\n", FALSE);
5088 if (!toomany)
5089 log_write(0, LOG_MAIN|LOG_REJECT, "too many recipients: excess "
5090 "temporarily rejected: sender=<%s> %s", sender_address,
5091 host_and_ident(TRUE));
5092 }
059ec3d9 5093
e0574cb5
JH
5094 toomany = TRUE;
5095 break;
5096 }
059ec3d9 5097
e0574cb5
JH
5098 /* If we have passed the threshold for rate limiting, apply the current
5099 delay, and update it for next time, provided this is a limited host. */
059ec3d9 5100
e0574cb5
JH
5101 if (rcpt_count > smtp_rlr_threshold &&
5102 verify_check_host(&smtp_ratelimit_hosts) == OK)
5103 {
5104 DEBUG(D_receive) debug_printf("rate limit RCPT: delay %.3g sec\n",
5105 smtp_delay_rcpt/1000.0);
5106 millisleep((int)smtp_delay_rcpt);
5107 smtp_delay_rcpt *= smtp_rlr_factor;
5108 if (smtp_delay_rcpt > (double)smtp_rlr_limit)
5109 smtp_delay_rcpt = (double)smtp_rlr_limit;
5110 }
059ec3d9 5111
e0574cb5
JH
5112 /* If the MAIL ACL discarded all the recipients, we bypass ACL checking
5113 for them. Otherwise, check the access control list for this recipient. As
5114 there may be a delay in this, re-check for a synchronization error
5115 afterwards, unless pipelining was advertised. */
059ec3d9 5116
e0574cb5
JH
5117 if (recipients_discarded)
5118 rc = DISCARD;
5119 else
5120 if ( (rc = acl_check(ACL_WHERE_RCPT, recipient, acl_smtp_rcpt, &user_msg,
5121 &log_msg)) == OK
5122 && !smtp_in_pipelining_advertised && !check_sync())
5123 goto SYNC_FAILURE;
059ec3d9 5124
e0574cb5 5125 /* The ACL was happy */
059ec3d9 5126
e0574cb5
JH
5127 if (rc == OK)
5128 {
5129 BOOL more = pipeline_response();
925ac8e4 5130
e0574cb5
JH
5131 if (user_msg)
5132 smtp_user_msg(US"250", user_msg);
5133 else
5134 smtp_printf("250 Accepted\r\n", more);
5135 receive_add_recipient(recipient, -1);
94431adb 5136
e0574cb5
JH
5137 /* Set the dsn flags in the recipients_list */
5138 recipients_list[recipients_count-1].orcpt = orcpt;
5139 recipients_list[recipients_count-1].dsn_flags = flags;
6c1c3d1d 5140
e0574cb5
JH
5141 DEBUG(D_receive) debug_printf("DSN: orcpt: %s flags: %d\n",
5142 recipients_list[recipients_count-1].orcpt,
5143 recipients_list[recipients_count-1].dsn_flags);
5144 }
059ec3d9 5145
e0574cb5 5146 /* The recipient was discarded */
059ec3d9 5147
e0574cb5
JH
5148 else if (rc == DISCARD)
5149 {
5150 if (user_msg)
5151 smtp_user_msg(US"250", user_msg);
5152 else
5153 smtp_printf("250 Accepted\r\n", FALSE);
5154 rcpt_fail_count++;
5155 discarded = TRUE;
5156 log_write(0, LOG_MAIN|LOG_REJECT, "%s F=<%s> RCPT %s: "
5157 "discarded by %s ACL%s%s", host_and_ident(TRUE),
5158 sender_address_unrewritten? sender_address_unrewritten : sender_address,
5159 smtp_cmd_argument, recipients_discarded? "MAIL" : "RCPT",
5160 log_msg ? US": " : US"", log_msg ? log_msg : US"");
5161 }
059ec3d9 5162
e0574cb5 5163 /* Either the ACL failed the address, or it was deferred. */
059ec3d9 5164
e0574cb5
JH
5165 else
5166 {
5167 if (rc == FAIL) rcpt_fail_count++; else rcpt_defer_count++;
5168 done = smtp_handle_acl_fail(ACL_WHERE_RCPT, rc, user_msg, log_msg);
5169 }
5170 break;
059ec3d9
PH
5171
5172
5173 /* The DATA command is legal only if it follows successful MAIL FROM
5174 and RCPT TO commands. However, if pipelining is advertised, a bad DATA is
5175 not counted as a protocol error if it follows RCPT (which must have been
5176 rejected if there are no recipients.) This function is complete when a
5177 valid DATA command is encountered.
5178
5179 Note concerning the code used: RFC 2821 says this:
5180
5181 - If there was no MAIL, or no RCPT, command, or all such commands
5182 were rejected, the server MAY return a "command out of sequence"
5183 (503) or "no valid recipients" (554) reply in response to the
5184 DATA command.
5185
5186 The example in the pipelining RFC 2920 uses 554, but I use 503 here
2679d413
PH
5187 because it is the same whether pipelining is in use or not.
5188
5189 If all the RCPT commands that precede DATA provoked the same error message
5190 (often indicating some kind of system error), it is helpful to include it
5191 with the DATA rejection (an idea suggested by Tony Finch). */
059ec3d9 5192
18481de3 5193 case BDAT_CMD:
18481de3
JH
5194 {
5195 int n;
5196
e0574cb5 5197 HAD(SCH_BDAT);
18481de3
JH
5198 if (chunking_state != CHUNKING_OFFERED)
5199 {
5200 done = synprot_error(L_smtp_protocol_error, 503, NULL,
5201 US"BDAT command used when CHUNKING not advertised");
5202 break;
5203 }
5204
5205 /* grab size, endmarker */
5206
5207 if (sscanf(CS smtp_cmd_data, "%u %n", &chunking_datasize, &n) < 1)
5208 {
7e3ce68e 5209 done = synprot_error(L_smtp_protocol_error, 501, NULL,
18481de3
JH
5210 US"missing size for BDAT command");
5211 break;
5212 }
5213 chunking_state = strcmpic(smtp_cmd_data+n, US"LAST") == 0
5214 ? CHUNKING_LAST : CHUNKING_ACTIVE;
7e3ce68e 5215 chunking_data_left = chunking_datasize;
bd8fbe36
JH
5216 DEBUG(D_receive) debug_printf("chunking state %d, %d bytes\n",
5217 (int)chunking_state, chunking_data_left);
7e3ce68e 5218
527504e8
HSHR
5219 /* push the current receive_* function on the "stack", and
5220 replace them by bdat_getc(), which in turn will use the lwr_receive_*
5221 functions to do the dirty work. */
7e3ce68e 5222 lwr_receive_getc = receive_getc;
0d81dabc 5223 lwr_receive_getbuf = receive_getbuf;
7e3ce68e 5224 lwr_receive_ungetc = receive_ungetc;
527504e8 5225
7e3ce68e
JH
5226 receive_getc = bdat_getc;
5227 receive_ungetc = bdat_ungetc;
18481de3 5228
527504e8
HSHR
5229 dot_ends = FALSE;
5230
18481de3
JH
5231 goto DATA_BDAT;
5232 }
5233
059ec3d9 5234 case DATA_CMD:
e0574cb5
JH
5235 HAD(SCH_DATA);
5236 dot_ends = TRUE;
45bd315d 5237
e0574cb5
JH
5238 DATA_BDAT: /* Common code for DATA and BDAT */
5239 if (!discarded && recipients_count <= 0)
5240 {
5241 if (rcpt_smtp_response_same && rcpt_smtp_response != NULL)
5242 {
5243 uschar *code = US"503";
5244 int len = Ustrlen(rcpt_smtp_response);
5245 smtp_respond(code, 3, FALSE, US"All RCPT commands were rejected with "
5246 "this error:");
5247 /* Responses from smtp_printf() will have \r\n on the end */
5248 if (len > 2 && rcpt_smtp_response[len-2] == '\r')
5249 rcpt_smtp_response[len-2] = 0;
5250 smtp_respond(code, 3, FALSE, rcpt_smtp_response);
5251 }
5252 if (smtp_in_pipelining_advertised && last_was_rcpt)
5253 smtp_printf("503 Valid RCPT command must precede %s\r\n", FALSE,
5254 smtp_names[smtp_connection_had[smtp_ch_index-1]]);
5255 else
5256 done = synprot_error(L_smtp_protocol_error, 503, NULL,
5257 smtp_connection_had[smtp_ch_index-1] == SCH_DATA
5258 ? US"valid RCPT command must precede DATA"
5259 : US"valid RCPT command must precede BDAT");
059ec3d9 5260
e0574cb5
JH
5261 if (chunking_state > CHUNKING_OFFERED)
5262 bdat_flush_data();
5263 break;
5264 }
8e669ac1 5265
e0574cb5
JH
5266 if (toomany && recipients_max_reject)
5267 {
5268 sender_address = NULL; /* This will allow a new MAIL without RSET */
5269 sender_address_unrewritten = NULL;
5270 smtp_printf("554 Too many recipients\r\n", FALSE);
5271 break;
5272 }
059ec3d9 5273
e0574cb5
JH
5274 if (chunking_state > CHUNKING_OFFERED)
5275 rc = OK; /* No predata ACL or go-ahead output for BDAT */
7e3ce68e
JH
5276 else
5277 {
e0574cb5
JH
5278 /* If there is an ACL, re-check the synchronization afterwards, since the
5279 ACL may have delayed. To handle cutthrough delivery enforce a dummy call
5280 to get the DATA command sent. */
7e3ce68e 5281
e0574cb5
JH
5282 if (acl_smtp_predata == NULL && cutthrough.cctx.sock < 0)
5283 rc = OK;
5284 else
5285 {
5286 uschar * acl = acl_smtp_predata ? acl_smtp_predata : US"accept";
5287 enable_dollar_recipients = TRUE;
5288 rc = acl_check(ACL_WHERE_PREDATA, NULL, acl, &user_msg,
5289 &log_msg);
5290 enable_dollar_recipients = FALSE;
5291 if (rc == OK && !check_sync())
5292 goto SYNC_FAILURE;
5293
5294 if (rc != OK)
5295 { /* Either the ACL failed the address, or it was deferred. */
5296 done = smtp_handle_acl_fail(ACL_WHERE_PREDATA, rc, user_msg, log_msg);
5297 break;
5298 }
7e3ce68e 5299 }
7e3ce68e 5300
e0574cb5
JH
5301 if (user_msg)
5302 smtp_user_msg(US"354", user_msg);
5303 else
5304 smtp_printf(
5305 "354 Enter message, ending with \".\" on a line by itself\r\n", FALSE);
5306 }
059ec3d9 5307
8d330698 5308#ifdef TCP_QUICKACK
e0574cb5
JH
5309 if (smtp_in) /* all ACKs needed to ramp window up for bulk data */
5310 (void) setsockopt(fileno(smtp_in), IPPROTO_TCP, TCP_QUICKACK,
5311 US &on, sizeof(on));
8d330698 5312#endif
e0574cb5
JH
5313 done = 3;
5314 message_ended = END_NOTENDED; /* Indicate in middle of data */
059ec3d9 5315
e0574cb5 5316 break;
059ec3d9
PH
5317
5318
5319 case VRFY_CMD:
059ec3d9 5320 {
4f6ae5c3 5321 uschar * address;
059ec3d9 5322
4f6ae5c3 5323 HAD(SCH_VRFY);
059ec3d9 5324
05392bbc
JH
5325 if (!(address = parse_extract_address(smtp_cmd_data, &errmess,
5326 &start, &end, &recipient_domain, FALSE)))
5327 {
925ac8e4 5328 smtp_printf("501 %s\r\n", FALSE, errmess);
05392bbc
JH
5329 break;
5330 }
5331
c39b93a6 5332 if (!recipient_domain)
2685d6e0
JH
5333 if (!(recipient_domain = qualify_recipient(&address, smtp_cmd_data,
5334 US"verify")))
05392bbc 5335 break;
4f6ae5c3 5336
05392bbc 5337 if ((rc = acl_check(ACL_WHERE_VRFY, address, acl_smtp_vrfy,
4f6ae5c3
JH
5338 &user_msg, &log_msg)) != OK)
5339 done = smtp_handle_acl_fail(ACL_WHERE_VRFY, rc, user_msg, log_msg);
059ec3d9 5340 else
4f6ae5c3 5341 {
05392bbc
JH
5342 uschar * s = NULL;
5343 address_item * addr = deliver_make_addr(address, FALSE);
059ec3d9 5344
4f6ae5c3
JH
5345 switch(verify_address(addr, NULL, vopt_is_recipient | vopt_qualify, -1,
5346 -1, -1, NULL, NULL, NULL))
5347 {
5348 case OK:
5349 s = string_sprintf("250 <%s> is deliverable", address);
5350 break;
059ec3d9 5351
4f6ae5c3
JH
5352 case DEFER:
5353 s = (addr->user_message != NULL)?
5354 string_sprintf("451 <%s> %s", address, addr->user_message) :
5355 string_sprintf("451 Cannot resolve <%s> at this time", address);
5356 break;
059ec3d9 5357
4f6ae5c3
JH
5358 case FAIL:
5359 s = (addr->user_message != NULL)?
5360 string_sprintf("550 <%s> %s", address, addr->user_message) :
5361 string_sprintf("550 <%s> is not deliverable", address);
5362 log_write(0, LOG_MAIN, "VRFY failed for %s %s",
5363 smtp_cmd_argument, host_and_ident(TRUE));
5364 break;
5365 }
5366
925ac8e4 5367 smtp_printf("%s\r\n", FALSE, s);
4f6ae5c3
JH
5368 }
5369 break;
059ec3d9 5370 }
059ec3d9
PH
5371
5372
5373 case EXPN_CMD:
e0574cb5
JH
5374 HAD(SCH_EXPN);
5375 rc = acl_check(ACL_WHERE_EXPN, NULL, acl_smtp_expn, &user_msg, &log_msg);
5376 if (rc != OK)
5377 done = smtp_handle_acl_fail(ACL_WHERE_EXPN, rc, user_msg, log_msg);
5378 else
5379 {
5380 BOOL save_log_testing_mode = log_testing_mode;
5381 address_test_mode = log_testing_mode = TRUE;
5382 (void) verify_address(deliver_make_addr(smtp_cmd_data, FALSE),
5383 smtp_out, vopt_is_recipient | vopt_qualify | vopt_expn, -1, -1, -1,
5384 NULL, NULL, NULL);
5385 address_test_mode = FALSE;
5386 log_testing_mode = save_log_testing_mode; /* true for -bh */
5387 }
5388 break;
059ec3d9
PH
5389
5390
5391 #ifdef SUPPORT_TLS
5392
5393 case STARTTLS_CMD:
e0574cb5
JH
5394 HAD(SCH_STARTTLS);
5395 if (!tls_advertised)
5396 {
5397 done = synprot_error(L_smtp_protocol_error, 503, NULL,
5398 US"STARTTLS command used when not advertised");
5399 break;
5400 }
059ec3d9 5401
e0574cb5 5402 /* Apply an ACL check if one is defined */
059ec3d9 5403
e0574cb5
JH
5404 if ( acl_smtp_starttls
5405 && (rc = acl_check(ACL_WHERE_STARTTLS, NULL, acl_smtp_starttls,
5406 &user_msg, &log_msg)) != OK
5407 )
5408 {
5409 done = smtp_handle_acl_fail(ACL_WHERE_STARTTLS, rc, user_msg, log_msg);
5410 break;
5411 }
059ec3d9 5412
e0574cb5
JH
5413 /* RFC 2487 is not clear on when this command may be sent, though it
5414 does state that all information previously obtained from the client
5415 must be discarded if a TLS session is started. It seems reasonable to
5416 do an implied RSET when STARTTLS is received. */
da80c2a8 5417
e0574cb5
JH
5418 incomplete_transaction_log(US"STARTTLS");
5419 cancel_cutthrough_connection(TRUE, US"STARTTLS received");
5420 smtp_reset(reset_point);
5421 toomany = FALSE;
5422 cmd_list[CMD_LIST_STARTTLS].is_mail_cmd = FALSE;
5423
5424 /* There's an attack where more data is read in past the STARTTLS command
5425 before TLS is negotiated, then assumed to be part of the secure session
5426 when used afterwards; we use segregated input buffers, so are not
5427 vulnerable, but we want to note when it happens and, for sheer paranoia,
5428 ensure that the buffer is "wiped".
5429 Pipelining sync checks will normally have protected us too, unless disabled
5430 by configuration. */
5431
5432 if (receive_smtp_buffered())
5433 {
5434 DEBUG(D_any)
5435 debug_printf("Non-empty input buffer after STARTTLS; naive attack?\n");
5436 if (tls_in.active.sock < 0)
5437 smtp_inend = smtp_inptr = smtp_inbuffer;
5438 /* and if TLS is already active, tls_server_start() should fail */
5439 }
4e7ee012 5440
e0574cb5
JH
5441 /* There is nothing we value in the input buffer and if TLS is successfully
5442 negotiated, we won't use this buffer again; if TLS fails, we'll just read
5443 fresh content into it. The buffer contains arbitrary content from an
5444 untrusted remote source; eg: NOOP <shellcode>\r\nSTARTTLS\r\n
5445 It seems safest to just wipe away the content rather than leave it as a
5446 target to jump to. */
4e7ee012 5447
e0574cb5 5448 memset(smtp_inbuffer, 0, IN_BUFFER_SIZE);
059ec3d9 5449
e0574cb5
JH
5450 /* Attempt to start up a TLS session, and if successful, discard all
5451 knowledge that was obtained previously. At least, that's what the RFC says,
5452 and that's what happens by default. However, in order to work round YAEB,
5453 there is an option to remember the esmtp state. Sigh.
059ec3d9 5454
e0574cb5
JH
5455 We must allow for an extra EHLO command and an extra AUTH command after
5456 STARTTLS that don't add to the nonmail command count. */
059ec3d9 5457
e0574cb5
JH
5458 s = NULL;
5459 if ((rc = tls_server_start(tls_require_ciphers, &s)) == OK)
5460 {
5461 if (!tls_remember_esmtp)
5462 helo_seen = esmtp = auth_advertised = smtp_in_pipelining_advertised = FALSE;
5463 cmd_list[CMD_LIST_EHLO].is_mail_cmd = TRUE;
5464 cmd_list[CMD_LIST_AUTH].is_mail_cmd = TRUE;
5465 cmd_list[CMD_LIST_TLS_AUTH].is_mail_cmd = TRUE;
5466 if (sender_helo_name)
5467 {
5468 store_free(sender_helo_name);
5469 sender_helo_name = NULL;
5470 host_build_sender_fullhost(); /* Rebuild */
5471 set_process_info("handling incoming TLS connection from %s",
5472 host_and_ident(FALSE));
5473 }
5474 received_protocol =
5475 (sender_host_address ? protocols : protocols_local)
5476 [ (esmtp
5477 ? pextend + (sender_host_authenticated ? pauthed : 0)
5478 : pnormal)
5479 + (tls_in.active.sock >= 0 ? pcrpted : 0)
5480 ];
5481
5482 sender_host_auth_pubname = sender_host_authenticated = NULL;
5483 authenticated_id = NULL;
5484 sync_cmd_limit = NON_SYNC_CMD_NON_PIPELINING;
5485 DEBUG(D_tls) debug_printf("TLS active\n");
5486 break; /* Successful STARTTLS */
5487 }
5488 else
5489 (void) smtp_log_tls_fail(s);
059ec3d9 5490
e0574cb5
JH
5491 /* Some local configuration problem was discovered before actually trying
5492 to do a TLS handshake; give a temporary error. */
059ec3d9 5493
e0574cb5
JH
5494 if (rc == DEFER)
5495 {
5496 smtp_printf("454 TLS currently unavailable\r\n", FALSE);
5497 break;
5498 }
059ec3d9 5499
e0574cb5
JH
5500 /* Hard failure. Reject everything except QUIT or closed connection. One
5501 cause for failure is a nested STARTTLS, in which case tls_in.active remains
5502 set, but we must still reject all incoming commands. */
059ec3d9 5503
e0574cb5
JH
5504 DEBUG(D_tls) debug_printf("TLS failed to start\n");
5505 while (done <= 0) switch(smtp_read_command(FALSE, GETC_BUFFER_UNLIMITED))
5506 {
5507 case EOF_CMD:
5508 log_write(L_smtp_connection, LOG_MAIN, "%s closed by EOF",
5509 smtp_get_connection_info());
5510 smtp_notquit_exit(US"tls-failed", NULL, NULL);
5511 done = 2;
5512 break;
8f128379 5513
e0574cb5
JH
5514 /* It is perhaps arguable as to which exit ACL should be called here,
5515 but as it is probably a situation that almost never arises, it
5516 probably doesn't matter. We choose to call the real QUIT ACL, which in
5517 some sense is perhaps "right". */
5518
5519 case QUIT_CMD:
5520 user_msg = NULL;
5521 if ( acl_smtp_quit
5522 && ((rc = acl_check(ACL_WHERE_QUIT, NULL, acl_smtp_quit, &user_msg,
5523 &log_msg)) == ERROR))
5524 log_write(0, LOG_MAIN|LOG_PANIC, "ACL for QUIT returned ERROR: %s",
5525 log_msg);
5526 if (user_msg)
5527 smtp_respond(US"221", 3, TRUE, user_msg);
5528 else
5529 smtp_printf("221 %s closing connection\r\n", FALSE, smtp_active_hostname);
5530 log_write(L_smtp_connection, LOG_MAIN, "%s closed by QUIT",
5531 smtp_get_connection_info());
5532 done = 2;
5533 break;
059ec3d9 5534
e0574cb5
JH
5535 default:
5536 smtp_printf("554 Security failure\r\n", FALSE);
5537 break;
5538 }
5539 tls_close(NULL, TLS_SHUTDOWN_NOWAIT);
5540 break;
059ec3d9
PH
5541 #endif
5542
5543
5544 /* The ACL for QUIT is provided for gathering statistical information or
5545 similar; it does not affect the response code, but it can supply a custom
5546 message. */
5547
5548 case QUIT_CMD:
e0574cb5
JH
5549 smtp_quit_handler(&user_msg, &log_msg);
5550 done = 2;
5551 break;
059ec3d9
PH
5552
5553
5554 case RSET_CMD:
e0574cb5
JH
5555 smtp_rset_handler();
5556 cancel_cutthrough_connection(TRUE, US"RSET received");
5557 smtp_reset(reset_point);
5558 toomany = FALSE;
5559 break;
059ec3d9
PH
5560
5561
5562 case NOOP_CMD:
e0574cb5
JH
5563 HAD(SCH_NOOP);
5564 smtp_printf("250 OK\r\n", FALSE);
5565 break;
059ec3d9
PH
5566
5567
b43a74ea
PH
5568 /* Show ETRN/EXPN/VRFY if there's an ACL for checking hosts; if actually
5569 used, a check will be done for permitted hosts. Show STARTTLS only if not
5570 already in a TLS session and if it would be advertised in the EHLO
5571 response. */
059ec3d9
PH
5572
5573 case HELP_CMD:
e0574cb5
JH
5574 HAD(SCH_HELP);
5575 smtp_printf("214-Commands supported:\r\n", TRUE);
5576 {
5577 uschar buffer[256];
5578 buffer[0] = 0;
5579 Ustrcat(buffer, " AUTH");
5580 #ifdef SUPPORT_TLS
5581 if (tls_in.active.sock < 0 &&
5582 verify_check_host(&tls_advertise_hosts) != FAIL)
5583 Ustrcat(buffer, " STARTTLS");
5584 #endif
5585 Ustrcat(buffer, " HELO EHLO MAIL RCPT DATA BDAT");
5586 Ustrcat(buffer, " NOOP QUIT RSET HELP");
5587 if (acl_smtp_etrn != NULL) Ustrcat(buffer, " ETRN");
5588 if (acl_smtp_expn != NULL) Ustrcat(buffer, " EXPN");
5589 if (acl_smtp_vrfy != NULL) Ustrcat(buffer, " VRFY");
5590 smtp_printf("214%s\r\n", FALSE, buffer);
5591 }
5592 break;
059ec3d9
PH
5593
5594
5595 case EOF_CMD:
e0574cb5
JH
5596 incomplete_transaction_log(US"connection lost");
5597 smtp_notquit_exit(US"connection-lost", US"421",
5598 US"%s lost input connection", smtp_active_hostname);
5599
5600 /* Don't log by default unless in the middle of a message, as some mailers
5601 just drop the call rather than sending QUIT, and it clutters up the logs.
5602 */
5603
5604 if (sender_address || recipients_count > 0)
5605 log_write(L_lost_incoming_connection, LOG_MAIN,
5606 "unexpected %s while reading SMTP command from %s%s%s D=%s",
5607 sender_host_unknown ? "EOF" : "disconnection",
5608 tcp_in_fastopen && !tcp_in_fastopen_logged ? US"TFO " : US"",
5609 host_and_ident(FALSE), smtp_read_error,
5610 string_timesince(&smtp_connection_start)
5611 );
2ac25850 5612
e0574cb5
JH
5613 else
5614 log_write(L_smtp_connection, LOG_MAIN, "%s %slost%s D=%s",
5615 smtp_get_connection_info(),
5616 tcp_in_fastopen && !tcp_in_fastopen_logged ? US"TFO " : US"",
5617 smtp_read_error,
5618 string_timesince(&smtp_connection_start)
5619 );
5620
5621 done = 1;
5622 break;
059ec3d9
PH
5623
5624
5625 case ETRN_CMD:
e0574cb5
JH
5626 HAD(SCH_ETRN);
5627 if (sender_address)
5628 {
5629 done = synprot_error(L_smtp_protocol_error, 503, NULL,
5630 US"ETRN is not permitted inside a transaction");
5631 break;
5632 }
059ec3d9 5633
e0574cb5
JH
5634 log_write(L_etrn, LOG_MAIN, "ETRN %s received from %s", smtp_cmd_argument,
5635 host_and_ident(FALSE));
059ec3d9 5636
e0574cb5
JH
5637 if ((rc = acl_check(ACL_WHERE_ETRN, NULL, acl_smtp_etrn,
5638 &user_msg, &log_msg)) != OK)
5639 {
5640 done = smtp_handle_acl_fail(ACL_WHERE_ETRN, rc, user_msg, log_msg);
5641 break;
5642 }
059ec3d9 5643
e0574cb5 5644 /* Compute the serialization key for this command. */
059ec3d9 5645
e0574cb5 5646 etrn_serialize_key = string_sprintf("etrn-%s\n", smtp_cmd_data);
059ec3d9 5647
e0574cb5
JH
5648 /* If a command has been specified for running as a result of ETRN, we
5649 permit any argument to ETRN. If not, only the # standard form is permitted,
5650 since that is strictly the only kind of ETRN that can be implemented
5651 according to the RFC. */
059ec3d9 5652
e0574cb5
JH
5653 if (smtp_etrn_command)
5654 {
5655 uschar *error;
5656 BOOL rc;
5657 etrn_command = smtp_etrn_command;
5658 deliver_domain = smtp_cmd_data;
5659 rc = transport_set_up_command(&argv, smtp_etrn_command, TRUE, 0, NULL,
5660 US"ETRN processing", &error);
5661 deliver_domain = NULL;
5662 if (!rc)
5663 {
5664 log_write(0, LOG_MAIN|LOG_PANIC, "failed to set up ETRN command: %s",
5665 error);
5666 smtp_printf("458 Internal failure\r\n", FALSE);
5667 break;
5668 }
5669 }
059ec3d9 5670
e0574cb5 5671 /* Else set up to call Exim with the -R option. */
059ec3d9 5672
e0574cb5
JH
5673 else
5674 {
5675 if (*smtp_cmd_data++ != '#')
5676 {
5677 done = synprot_error(L_smtp_syntax_error, 501, NULL,
5678 US"argument must begin with #");
5679 break;
5680 }
5681 etrn_command = US"exim -R";
5682 argv = CUSS child_exec_exim(CEE_RETURN_ARGV, TRUE, NULL, TRUE,
5683 *queue_name ? 4 : 2,
5684 US"-R", smtp_cmd_data,
5685 US"-MCG", queue_name);
5686 }
059ec3d9 5687
e0574cb5 5688 /* If we are host-testing, don't actually do anything. */
059ec3d9 5689
e0574cb5
JH
5690 if (host_checking)
5691 {
5692 HDEBUG(D_any)
5693 {
5694 debug_printf("ETRN command is: %s\n", etrn_command);
5695 debug_printf("ETRN command execution skipped\n");
5696 }
5697 if (user_msg == NULL) smtp_printf("250 OK\r\n", FALSE);
5698 else smtp_user_msg(US"250", user_msg);
5699 break;
5700 }
059ec3d9
PH
5701
5702
e0574cb5
JH
5703 /* If ETRN queue runs are to be serialized, check the database to
5704 ensure one isn't already running. */
059ec3d9 5705
e0574cb5
JH
5706 if (smtp_etrn_serialize && !enq_start(etrn_serialize_key, 1))
5707 {
5708 smtp_printf("458 Already processing %s\r\n", FALSE, smtp_cmd_data);
5709 break;
5710 }
059ec3d9 5711
e0574cb5
JH
5712 /* Fork a child process and run the command. We don't want to have to
5713 wait for the process at any point, so set SIGCHLD to SIG_IGN before
5714 forking. It should be set that way anyway for external incoming SMTP,
5715 but we save and restore to be tidy. If serialization is required, we
5716 actually run the command in yet another process, so we can wait for it
5717 to complete and then remove the serialization lock. */
059ec3d9 5718
e0574cb5 5719 oldsignal = signal(SIGCHLD, SIG_IGN);
059ec3d9 5720
e0574cb5
JH
5721 if ((pid = fork()) == 0)
5722 {
5723 smtp_input = FALSE; /* This process is not associated with the */
5724 (void)fclose(smtp_in); /* SMTP call any more. */
5725 (void)fclose(smtp_out);
059ec3d9 5726
e0574cb5 5727 signal(SIGCHLD, SIG_DFL); /* Want to catch child */
059ec3d9 5728
e0574cb5
JH
5729 /* If not serializing, do the exec right away. Otherwise, fork down
5730 into another process. */
059ec3d9 5731
e0574cb5
JH
5732 if (!smtp_etrn_serialize || (pid = fork()) == 0)
5733 {
5734 DEBUG(D_exec) debug_print_argv(argv);
5735 exim_nullstd(); /* Ensure std{in,out,err} exist */
5736 execv(CS argv[0], (char *const *)argv);
5737 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "exec of \"%s\" (ETRN) failed: %s",
5738 etrn_command, strerror(errno));
5739 _exit(EXIT_FAILURE); /* paranoia */
5740 }
059ec3d9 5741
e0574cb5
JH
5742 /* Obey this if smtp_serialize and the 2nd fork yielded non-zero. That
5743 is, we are in the first subprocess, after forking again. All we can do
5744 for a failing fork is to log it. Otherwise, wait for the 2nd process to
5745 complete, before removing the serialization. */
059ec3d9 5746
e0574cb5
JH
5747 if (pid < 0)
5748 log_write(0, LOG_MAIN|LOG_PANIC, "2nd fork for serialized ETRN "
5749 "failed: %s", strerror(errno));
5750 else
5751 {
5752 int status;
5753 DEBUG(D_any) debug_printf("waiting for serialized ETRN process %d\n",
5754 (int)pid);
5755 (void)wait(&status);
5756 DEBUG(D_any) debug_printf("serialized ETRN process %d ended\n",
5757 (int)pid);
5758 }
059ec3d9 5759
e0574cb5
JH
5760 enq_end(etrn_serialize_key);
5761 _exit(EXIT_SUCCESS);
5762 }
059ec3d9 5763
e0574cb5
JH
5764 /* Back in the top level SMTP process. Check that we started a subprocess
5765 and restore the signal state. */
059ec3d9 5766
e0574cb5
JH
5767 if (pid < 0)
5768 {
5769 log_write(0, LOG_MAIN|LOG_PANIC, "fork of process for ETRN failed: %s",
5770 strerror(errno));
5771 smtp_printf("458 Unable to fork process\r\n", FALSE);
5772 if (smtp_etrn_serialize) enq_end(etrn_serialize_key);
5773 }
5774 else
5775 {
5776 if (user_msg == NULL) smtp_printf("250 OK\r\n", FALSE);
5777 else smtp_user_msg(US"250", user_msg);
5778 }
059ec3d9 5779
e0574cb5
JH
5780 signal(SIGCHLD, oldsignal);
5781 break;
059ec3d9
PH
5782
5783
5784 case BADARG_CMD:
e0574cb5
JH
5785 done = synprot_error(L_smtp_syntax_error, 501, NULL,
5786 US"unexpected argument data");
5787 break;
059ec3d9
PH
5788
5789
5790 /* This currently happens only for NULLs, but could be extended. */
5791
5792 case BADCHAR_CMD:
e0574cb5
JH
5793 done = synprot_error(L_smtp_syntax_error, 0, NULL, /* Just logs */
5794 US"NUL character(s) present (shown as '?')");
5795 smtp_printf("501 NUL characters are not allowed in SMTP commands\r\n",
5796 FALSE);
5797 break;
059ec3d9
PH
5798
5799
5800 case BADSYN_CMD:
a14e5636 5801 SYNC_FAILURE:
e0574cb5
JH
5802 if (smtp_inend >= smtp_inbuffer + IN_BUFFER_SIZE)
5803 smtp_inend = smtp_inbuffer + IN_BUFFER_SIZE - 1;
5804 c = smtp_inend - smtp_inptr;
5805 if (c > 150) c = 150; /* limit logged amount */
5806 smtp_inptr[c] = 0;
5807 incomplete_transaction_log(US"sync failure");
5808 log_write(0, LOG_MAIN|LOG_REJECT, "SMTP protocol synchronization error "
5809 "(next input sent too soon: pipelining was%s advertised): "
5810 "rejected \"%s\" %s next input=\"%s\"",
5811 smtp_in_pipelining_advertised ? "" : " not",
5812 smtp_cmd_buffer, host_and_ident(TRUE),
5813 string_printing(smtp_inptr));
5814 smtp_notquit_exit(US"synchronization-error", US"554",
5815 US"SMTP synchronization error");
5816 done = 1; /* Pretend eof - drops connection */
5817 break;
059ec3d9
PH
5818
5819
5820 case TOO_MANY_NONMAIL_CMD:
e0574cb5
JH
5821 s = smtp_cmd_buffer;
5822 while (*s != 0 && !isspace(*s)) s++;
5823 incomplete_transaction_log(US"too many non-mail commands");
5824 log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
5825 "nonmail commands (last was \"%.*s\")", host_and_ident(FALSE),
5826 (int)(s - smtp_cmd_buffer), smtp_cmd_buffer);
5827 smtp_notquit_exit(US"bad-commands", US"554", US"Too many nonmail commands");
5828 done = 1; /* Pretend eof - drops connection */
5829 break;
059ec3d9 5830
cee5f132 5831#ifdef SUPPORT_PROXY
a3c86431 5832 case PROXY_FAIL_IGNORE_CMD:
e0574cb5
JH
5833 smtp_printf("503 Command refused, required Proxy negotiation failed\r\n", FALSE);
5834 break;
cee5f132 5835#endif
059ec3d9
PH
5836
5837 default:
e0574cb5
JH
5838 if (unknown_command_count++ >= smtp_max_unknown_commands)
5839 {
5840 log_write(L_smtp_syntax_error, LOG_MAIN,
5841 "SMTP syntax error in \"%s\" %s %s",
5842 string_printing(smtp_cmd_buffer), host_and_ident(TRUE),
5843 US"unrecognized command");
5844 incomplete_transaction_log(US"unrecognized command");
5845 smtp_notquit_exit(US"bad-commands", US"500",
5846 US"Too many unrecognized commands");
5847 done = 2;
5848 log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
5849 "unrecognized commands (last was \"%s\")", host_and_ident(FALSE),
5850 string_printing(smtp_cmd_buffer));
5851 }
5852 else
5853 done = synprot_error(L_smtp_syntax_error, 500, NULL,
5854 US"unrecognized command");
5855 break;
059ec3d9
PH
5856 }
5857
5858 /* This label is used by goto's inside loops that want to break out to
5859 the end of the command-processing loop. */
5860
5861 COMMAND_LOOP:
5862 last_was_rej_mail = was_rej_mail; /* Remember some last commands for */
5863 last_was_rcpt = was_rcpt; /* protocol error handling */
5864 continue;
5865 }
5866
5867return done - 2; /* Convert yield values */
5868}
5869
dfbcb5ac
JH
5870
5871
5872gstring *
5873authres_smtpauth(gstring * g)
5874{
5875if (!sender_host_authenticated)
5876 return g;
5877
c44ff8be
JH
5878g = string_append(g, 2, US";\n\tauth=pass (", sender_host_auth_pubname);
5879
5880if (Ustrcmp(sender_host_auth_pubname, "tls") != 0)
5881 g = string_append(g, 2, US") smtp.auth=", authenticated_id);
5882else if (authenticated_id)
5883 g = string_append(g, 2, US") x509.auth=", authenticated_id);
5884else
5885 g = string_catn(g, US") reason=x509.auth", 17);
5886
dfbcb5ac
JH
5887if (authenticated_sender)
5888 g = string_append(g, 2, US" smtp.mailfrom=", authenticated_sender);
5889return g;
5890}
5891
5892
5893
e45a1c37
JH
5894/* vi: aw ai sw=2
5895*/
059ec3d9 5896/* End of smtp_in.c */