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