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