f8656a6e84487e0418db0e566ba0fb2837f1b44d
[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=%lu", 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 spf_header_comment = spf_received = spf_result = spf_smtp_comment = NULL;
1686 spf_result_guessed = FALSE;
1687 #endif
1688 #ifndef DISABLE_DKIM
1689 dkim_cur_signer = dkim_signers =
1690 dkim_signing_domain = dkim_signing_selector = dkim_signatures = NULL;
1691 f.dkim_disable_verify = FALSE;
1692 dkim_collect_input = 0;
1693 dkim_verify_overall = dkim_verify_status = dkim_verify_reason = NULL;
1694 dkim_key_length = 0;
1695 #endif
1696 #ifdef SUPPORT_DMARC
1697 f.dmarc_has_been_checked = f.dmarc_disable_verify = f.dmarc_enable_forensic = FALSE;
1698 dmarc_domain_policy = dmarc_status = dmarc_status_text =
1699 dmarc_used_domain = NULL;
1700 #endif
1701 #ifdef EXPERIMENTAL_ARC
1702 arc_state = arc_state_reason = NULL;
1703 arc_received_instance = 0;
1704 #endif
1705 dsn_ret = 0;
1706 dsn_envid = NULL;
1707 deliver_host = deliver_host_address = NULL;     /* Can be set by ACL */
1708 #ifndef DISABLE_PRDR
1709 prdr_requested = FALSE;
1710 #endif
1711 #ifdef SUPPORT_I18N
1712 message_smtputf8 = FALSE;
1713 #endif
1714 #ifdef WITH_CONTENT_SCAN
1715 regex_vars_clear();
1716 #endif
1717 body_linecount = body_zerocount = 0;
1718
1719 lookup_value = NULL;                            /* Can be set by ACL */
1720 sender_rate = sender_rate_limit = sender_rate_period = NULL;
1721 ratelimiters_mail = NULL;           /* Updated by ratelimit ACL condition */
1722                    /* Note that ratelimiters_conn persists across resets. */
1723
1724 /* Reset message ACL variables */
1725
1726 acl_var_m = NULL;
1727
1728 /* Warning log messages are saved in malloc store. They are saved to avoid
1729 repetition in the same message, but it seems right to repeat them for different
1730 messages. */
1731
1732 while (acl_warn_logged)
1733   {
1734   string_item *this = acl_warn_logged;
1735   acl_warn_logged = acl_warn_logged->next;
1736   store_free(this);
1737   }
1738
1739 message_tidyup();
1740 store_reset(reset_point);
1741
1742 message_start();
1743 return store_mark();
1744 }
1745
1746
1747
1748
1749
1750 /*************************************************
1751 *  Initialize for incoming batched SMTP message  *
1752 *************************************************/
1753
1754 /* This function is called from smtp_setup_msg() in the case when
1755 smtp_batched_input is true. This happens when -bS is used to pass a whole batch
1756 of messages in one file with SMTP commands between them. All errors must be
1757 reported by sending a message, and only MAIL FROM, RCPT TO, and DATA are
1758 relevant. After an error on a sender, or an invalid recipient, the remainder
1759 of the message is skipped. The value of received_protocol is already set.
1760
1761 Argument: none
1762 Returns:  > 0 message successfully started (reached DATA)
1763           = 0 QUIT read or end of file reached
1764           < 0 should not occur
1765 */
1766
1767 static int
1768 smtp_setup_batch_msg(void)
1769 {
1770 int done = 0;
1771 rmark reset_point = store_mark();
1772
1773 /* Save the line count at the start of each transaction - single commands
1774 like HELO and RSET count as whole transactions. */
1775
1776 bsmtp_transaction_linecount = receive_linecount;
1777
1778 if ((receive_feof)()) return 0;   /* Treat EOF as QUIT */
1779
1780 cancel_cutthrough_connection(TRUE, US"smtp_setup_batch_msg");
1781 reset_point = smtp_reset(reset_point);                /* Reset for start of message */
1782
1783 /* Deal with SMTP commands. This loop is exited by setting done to a POSITIVE
1784 value. The values are 2 larger than the required yield of the function. */
1785
1786 while (done <= 0)
1787   {
1788   uschar *errmess;
1789   uschar *recipient = NULL;
1790   int start, end, sender_domain, recipient_domain;
1791
1792   switch(smtp_read_command(FALSE, GETC_BUFFER_UNLIMITED))
1793     {
1794     /* The HELO/EHLO commands set sender_address_helo if they have
1795     valid data; otherwise they are ignored, except that they do
1796     a reset of the state. */
1797
1798     case HELO_CMD:
1799     case EHLO_CMD:
1800
1801       check_helo(smtp_cmd_data);
1802       /* Fall through */
1803
1804     case RSET_CMD:
1805       cancel_cutthrough_connection(TRUE, US"RSET received");
1806       reset_point = smtp_reset(reset_point);
1807       bsmtp_transaction_linecount = receive_linecount;
1808       break;
1809
1810     /* The MAIL FROM command requires an address as an operand. All we
1811     do here is to parse it for syntactic correctness. The form "<>" is
1812     a special case which converts into an empty string. The start/end
1813     pointers in the original are not used further for this address, as
1814     it is the canonical extracted address which is all that is kept. */
1815
1816     case MAIL_CMD:
1817       smtp_mailcmd_count++;              /* Count for no-mail log */
1818       if (sender_address)
1819         /* The function moan_smtp_batch() does not return. */
1820         moan_smtp_batch(smtp_cmd_buffer, "503 Sender already given");
1821
1822       if (smtp_cmd_data[0] == 0)
1823         /* The function moan_smtp_batch() does not return. */
1824         moan_smtp_batch(smtp_cmd_buffer, "501 MAIL FROM must have an address operand");
1825
1826       /* Reset to start of message */
1827
1828       cancel_cutthrough_connection(TRUE, US"MAIL received");
1829       reset_point = smtp_reset(reset_point);
1830
1831       /* Apply SMTP rewrite */
1832
1833       raw_sender = rewrite_existflags & rewrite_smtp
1834         /* deconst ok as smtp_cmd_data was not const */
1835         ? US rewrite_one(smtp_cmd_data, rewrite_smtp|rewrite_smtp_sender, NULL,
1836                       FALSE, US"", global_rewrite_rules)
1837         : smtp_cmd_data;
1838
1839       /* Extract the address; the TRUE flag allows <> as valid */
1840
1841       raw_sender =
1842         parse_extract_address(raw_sender, &errmess, &start, &end, &sender_domain,
1843           TRUE);
1844
1845       if (!raw_sender)
1846         /* The function moan_smtp_batch() does not return. */
1847         moan_smtp_batch(smtp_cmd_buffer, "501 %s", errmess);
1848
1849       sender_address = string_copy(raw_sender);
1850
1851       /* Qualify unqualified sender addresses if permitted to do so. */
1852
1853       if (  !sender_domain
1854          && sender_address[0] != 0 && sender_address[0] != '@')
1855         if (f.allow_unqualified_sender)
1856           {
1857           /* deconst ok as sender_address was not const */
1858           sender_address = US rewrite_address_qualify(sender_address, FALSE);
1859           DEBUG(D_receive) debug_printf("unqualified address %s accepted "
1860             "and rewritten\n", raw_sender);
1861           }
1862         /* The function moan_smtp_batch() does not return. */
1863         else
1864           moan_smtp_batch(smtp_cmd_buffer, "501 sender address must contain "
1865             "a domain");
1866       break;
1867
1868
1869     /* The RCPT TO command requires an address as an operand. All we do
1870     here is to parse it for syntactic correctness. There may be any number
1871     of RCPT TO commands, specifying multiple senders. We build them all into
1872     a data structure that is in argc/argv format. The start/end values
1873     given by parse_extract_address are not used, as we keep only the
1874     extracted address. */
1875
1876     case RCPT_CMD:
1877       if (!sender_address)
1878         /* The function moan_smtp_batch() does not return. */
1879         moan_smtp_batch(smtp_cmd_buffer, "503 No sender yet given");
1880
1881       if (smtp_cmd_data[0] == 0)
1882         /* The function moan_smtp_batch() does not return. */
1883         moan_smtp_batch(smtp_cmd_buffer,
1884           "501 RCPT TO must have an address operand");
1885
1886       /* Check maximum number allowed */
1887
1888       if (  recipients_max_expanded > 0
1889          && recipients_count + 1 > recipients_max_expanded)
1890         /* The function moan_smtp_batch() does not return. */
1891         moan_smtp_batch(smtp_cmd_buffer, "%s too many recipients",
1892           recipients_max_reject ? "552": "452");
1893
1894       /* Apply SMTP rewrite, then extract address. Don't allow "<>" as a
1895       recipient address */
1896
1897       recipient = rewrite_existflags & rewrite_smtp
1898         /* deconst ok as smtp_cmd_data was not const */
1899         ? US rewrite_one(smtp_cmd_data, rewrite_smtp, NULL, FALSE, US"",
1900                       global_rewrite_rules)
1901         : smtp_cmd_data;
1902
1903       recipient = parse_extract_address(recipient, &errmess, &start, &end,
1904         &recipient_domain, FALSE);
1905
1906       if (!recipient)
1907         /* The function moan_smtp_batch() does not return. */
1908         moan_smtp_batch(smtp_cmd_buffer, "501 %s", errmess);
1909
1910       /* If the recipient address is unqualified, qualify it if permitted. Then
1911       add it to the list of recipients. */
1912
1913       if (!recipient_domain)
1914         if (f.allow_unqualified_recipient)
1915           {
1916           DEBUG(D_receive) debug_printf("unqualified address %s accepted\n",
1917             recipient);
1918           /* deconst ok as recipient was not const */
1919           recipient = US rewrite_address_qualify(recipient, TRUE);
1920           }
1921         /* The function moan_smtp_batch() does not return. */
1922         else
1923           moan_smtp_batch(smtp_cmd_buffer,
1924             "501 recipient address must contain a domain");
1925
1926       receive_add_recipient(recipient, -1);
1927       break;
1928
1929
1930     /* The DATA command is legal only if it follows successful MAIL FROM
1931     and RCPT TO commands. This function is complete when a valid DATA
1932     command is encountered. */
1933
1934     case DATA_CMD:
1935       if (!sender_address || recipients_count <= 0)
1936         /* The function moan_smtp_batch() does not return. */
1937         if (!sender_address)
1938           moan_smtp_batch(smtp_cmd_buffer,
1939             "503 MAIL FROM:<sender> command must precede DATA");
1940         else
1941           moan_smtp_batch(smtp_cmd_buffer,
1942             "503 RCPT TO:<recipient> must precede DATA");
1943       else
1944         {
1945         done = 3;                      /* DATA successfully achieved */
1946         message_ended = END_NOTENDED;  /* Indicate in middle of message */
1947         }
1948       break;
1949
1950
1951     /* The VRFY, EXPN, HELP, ETRN, and NOOP commands are ignored. */
1952
1953     case VRFY_CMD:
1954     case EXPN_CMD:
1955     case HELP_CMD:
1956     case NOOP_CMD:
1957     case ETRN_CMD:
1958 #ifndef DISABLE_WELLKNOWN
1959     case WELLKNOWN_CMD:
1960 #endif
1961       bsmtp_transaction_linecount = receive_linecount;
1962       break;
1963
1964
1965     case QUIT_CMD:
1966       f.smtp_in_quit = TRUE;
1967     case EOF_CMD:
1968       done = 2;
1969       break;
1970
1971
1972     case BADARG_CMD:
1973       /* The function moan_smtp_batch() does not return. */
1974       moan_smtp_batch(smtp_cmd_buffer, "501 Unexpected argument data");
1975       break;
1976
1977
1978     case BADCHAR_CMD:
1979       /* The function moan_smtp_batch() does not return. */
1980       moan_smtp_batch(smtp_cmd_buffer, "501 Unexpected NULL in SMTP command");
1981       break;
1982
1983
1984     default:
1985       /* The function moan_smtp_batch() does not return. */
1986       moan_smtp_batch(smtp_cmd_buffer, "500 Command unrecognized");
1987       break;
1988     }
1989   }
1990
1991 return done - 2;  /* Convert yield values */
1992 }
1993
1994
1995
1996
1997 #ifndef DISABLE_TLS
1998 static BOOL
1999 smtp_log_tls_fail(const uschar * errstr)
2000 {
2001 const uschar * conn_info = smtp_get_connection_info();
2002
2003 if (Ustrncmp(conn_info, US"SMTP ", 5) == 0) conn_info += 5;
2004 /* I'd like to get separated H= here, but too hard for now */
2005
2006 log_write(0, LOG_MAIN, "TLS error on %s %s", conn_info, errstr);
2007 return FALSE;
2008 }
2009 #endif
2010
2011
2012
2013
2014 #ifdef TCP_FASTOPEN
2015 static void
2016 tfo_in_check(void)
2017 {
2018 # ifdef __FreeBSD__
2019 int is_fastopen;
2020 socklen_t len = sizeof(is_fastopen);
2021
2022 /* The tinfo TCPOPT_FAST_OPEN bit seems unreliable, and we don't see state
2023 TCP_SYN_RCV (as of 12.1) so no idea about data-use. */
2024
2025 if (getsockopt(fileno(smtp_out), IPPROTO_TCP, TCP_FASTOPEN, &is_fastopen, &len) == 0)
2026   {
2027   if (is_fastopen)
2028     {
2029     DEBUG(D_receive)
2030       debug_printf("TFO mode connection (TCP_FASTOPEN getsockopt)\n");
2031     f.tcp_in_fastopen = TRUE;
2032     }
2033   }
2034 else DEBUG(D_receive)
2035   debug_printf("TCP_INFO getsockopt: %s\n", strerror(errno));
2036
2037 # elif defined(TCP_INFO)
2038 struct tcp_info tinfo;
2039 socklen_t len = sizeof(tinfo);
2040
2041 if (getsockopt(fileno(smtp_out), IPPROTO_TCP, TCP_INFO, &tinfo, &len) == 0)
2042 #  ifdef TCPI_OPT_SYN_DATA      /* FreeBSD 11,12 do not seem to have this yet */
2043   if (tinfo.tcpi_options & TCPI_OPT_SYN_DATA)
2044     {
2045     DEBUG(D_receive)
2046       debug_printf("TFO mode connection (ACKd data-on-SYN)\n");
2047     f.tcp_in_fastopen_data = f.tcp_in_fastopen = TRUE;
2048     }
2049   else
2050 #  endif
2051     if (tinfo.tcpi_state == TCP_SYN_RECV)       /* Not seen on FreeBSD 12.1 */
2052     {
2053     DEBUG(D_receive)
2054       debug_printf("TFO mode connection (state TCP_SYN_RECV)\n");
2055     f.tcp_in_fastopen = TRUE;
2056     }
2057 else DEBUG(D_receive)
2058   debug_printf("TCP_INFO getsockopt: %s\n", strerror(errno));
2059 # endif
2060 }
2061 #endif
2062
2063
2064 static void
2065 log_connect_tls_drop(const uschar * what, const uschar * log_msg)
2066 {
2067 if (log_reject_target)
2068   {
2069 #ifdef DISABLE_TLS
2070   uschar * tls = NULL;
2071 #else
2072   gstring * g = s_tlslog(NULL);
2073   uschar * tls = string_from_gstring(g);
2074 #endif
2075   log_write(L_connection_reject,
2076     log_reject_target, "%s%s%s dropped by %s%s%s",
2077     LOGGING(dnssec) && sender_host_dnssec ? US" DS" : US"",
2078     host_and_ident(TRUE),
2079     tls ? tls : US"",
2080     what,
2081     log_msg ? US": " : US"", log_msg);
2082   }
2083 }
2084
2085
2086 /*************************************************
2087 *          Start an SMTP session                 *
2088 *************************************************/
2089
2090 /* This function is called at the start of an SMTP session. Thereafter,
2091 smtp_setup_msg() is called to initiate each separate message. This
2092 function does host-specific testing, and outputs the banner line.
2093
2094 Arguments:     none
2095 Returns:       FALSE if the session can not continue; something has
2096                gone wrong, or the connection to the host is blocked
2097 */
2098
2099 BOOL
2100 smtp_start_session(void)
2101 {
2102 int esclen;
2103 uschar *user_msg, *log_msg;
2104 uschar *code, *esc;
2105 uschar *p, *s;
2106 gstring * ss;
2107
2108 gettimeofday(&smtp_connection_start, NULL);
2109 for (smtp_ch_index = 0; smtp_ch_index < SMTP_HBUFF_SIZE; smtp_ch_index++)
2110   smtp_connection_had[smtp_ch_index] = SCH_NONE;
2111 smtp_ch_index = 0;
2112
2113 /* Default values for certain variables */
2114
2115 fl.helo_seen = fl.esmtp = fl.helo_accept_junk = FALSE;
2116 smtp_mailcmd_count = 0;
2117 count_nonmail = TRUE_UNSET;
2118 synprot_error_count = unknown_command_count = nonmail_command_count = 0;
2119 smtp_delay_mail = smtp_rlm_base;
2120 fl.auth_advertised = FALSE;
2121 f.smtp_in_pipelining_advertised = f.smtp_in_pipelining_used = FALSE;
2122 f.pipelining_enable = TRUE;
2123 sync_cmd_limit = NON_SYNC_CMD_NON_PIPELINING;
2124 fl.smtp_exit_function_called = FALSE;    /* For avoiding loop in not-quit exit */
2125
2126 /* If receiving by -bs from a trusted user, or testing with -bh, we allow
2127 authentication settings from -oMaa to remain in force. */
2128
2129 if (!host_checking && !f.sender_host_notsocket)
2130   sender_host_auth_pubname = sender_host_authenticated = NULL;
2131 authenticated_by = NULL;
2132
2133 #ifndef DISABLE_TLS
2134 tls_in.ver = tls_in.cipher = tls_in.peerdn = NULL;
2135 tls_in.ourcert = tls_in.peercert = NULL;
2136 tls_in.sni = NULL;
2137 tls_in.ocsp = OCSP_NOT_REQ;
2138 fl.tls_advertised = FALSE;
2139 #endif
2140 fl.dsn_advertised = FALSE;
2141 #ifdef SUPPORT_I18N
2142 fl.smtputf8_advertised = FALSE;
2143 #endif
2144
2145 /* Reset ACL connection variables */
2146
2147 acl_var_c = NULL;
2148
2149 /* Allow for trailing 0 in the command and data buffers.  Tainted. */
2150
2151 smtp_cmd_buffer = store_get_perm(2*SMTP_CMD_BUFFER_SIZE + 2, GET_TAINTED);
2152
2153 smtp_cmd_buffer[0] = 0;
2154 smtp_data_buffer = smtp_cmd_buffer + SMTP_CMD_BUFFER_SIZE + 1;
2155
2156 /* For batched input, the protocol setting can be overridden from the
2157 command line by a trusted caller. */
2158
2159 if (smtp_batched_input)
2160   {
2161   if (!received_protocol) received_protocol = US"local-bsmtp";
2162   }
2163
2164 /* For non-batched SMTP input, the protocol setting is forced here. It will be
2165 reset later if any of EHLO/AUTH/STARTTLS are received. */
2166
2167 else
2168   received_protocol =
2169     (sender_host_address ? protocols : protocols_local) [pnormal];
2170
2171 /* Set up the buffer for inputting using direct read() calls, and arrange to
2172 call the local functions instead of the standard C ones. */
2173
2174 smtp_buf_init();
2175
2176 receive_getc = smtp_getc;
2177 receive_getbuf = smtp_getbuf;
2178 receive_get_cache = smtp_get_cache;
2179 receive_hasc = smtp_hasc;
2180 receive_ungetc = smtp_ungetc;
2181 receive_feof = smtp_feof;
2182 receive_ferror = smtp_ferror;
2183 lwr_receive_getc = NULL;
2184 lwr_receive_getbuf = NULL;
2185 lwr_receive_hasc = NULL;
2186 lwr_receive_ungetc = NULL;
2187
2188 /* Set up the message size limit; this may be host-specific */
2189
2190 GET_OPTION("message_size_limit");
2191 thismessage_size_limit = expand_string_integer(message_size_limit, TRUE);
2192 if (expand_string_message)
2193   {
2194   if (thismessage_size_limit == -1)
2195     log_write(0, LOG_MAIN|LOG_PANIC, "unable to expand message_size_limit: "
2196       "%s", expand_string_message);
2197   else
2198     log_write(0, LOG_MAIN|LOG_PANIC, "invalid message_size_limit: "
2199       "%s", expand_string_message);
2200   smtp_closedown(US"Temporary local problem - please try later");
2201   return FALSE;
2202   }
2203
2204 /* When a message is input locally via the -bs or -bS options, sender_host_
2205 unknown is set unless -oMa was used to force an IP address, in which case it
2206 is checked like a real remote connection. When -bs is used from inetd, this
2207 flag is not set, causing the sending host to be checked. The code that deals
2208 with IP source routing (if configured) is never required for -bs or -bS and
2209 the flag sender_host_notsocket is used to suppress it.
2210
2211 If smtp_accept_max and smtp_accept_reserve are set, keep some connections in
2212 reserve for certain hosts and/or networks. */
2213
2214 if (!f.sender_host_unknown)
2215   {
2216   int rc;
2217   BOOL reserved_host = FALSE;
2218
2219   /* Look up IP options (source routing info) on the socket if this is not an
2220   -oMa "host", and if any are found, log them and drop the connection.
2221
2222   Linux (and others now, see below) is different to everyone else, so there
2223   has to be some conditional compilation here. Versions of Linux before 2.1.15
2224   used a structure whose name was "options". Somebody finally realized that
2225   this name was silly, and it got changed to "ip_options". I use the
2226   newer name here, but there is a fudge in the script that sets up os.h
2227   to define a macro in older Linux systems.
2228
2229   Sigh. Linux is a fast-moving target. Another generation of Linux uses
2230   glibc 2, which has chosen ip_opts for the structure name. This is now
2231   really a glibc thing rather than a Linux thing, so the condition name
2232   has been changed to reflect this. It is relevant also to GNU/Hurd.
2233
2234   Mac OS 10.x (Darwin) is like the later glibc versions, but without the
2235   setting of the __GLIBC__ macro, so we can't detect it automatically. There's
2236   a special macro defined in the os.h file.
2237
2238   Some DGUX versions on older hardware appear not to support IP options at
2239   all, so there is now a general macro which can be set to cut out this
2240   support altogether.
2241
2242   How to do this properly in IPv6 is not yet known. */
2243
2244 #if !HAVE_IPV6 && !defined(NO_IP_OPTIONS)
2245
2246 # ifdef GLIBC_IP_OPTIONS
2247 #  if (!defined __GLIBC__) || (__GLIBC__ < 2)
2248 #   define OPTSTYLE 1
2249 #  else
2250 #   define OPTSTYLE 2
2251 #  endif
2252 # elif defined DARWIN_IP_OPTIONS
2253 # define OPTSTYLE 2
2254 # else
2255 # define OPTSTYLE 3
2256 # endif
2257
2258   if (!host_checking && !f.sender_host_notsocket)
2259     {
2260 # if OPTSTYLE == 1
2261     EXIM_SOCKLEN_T optlen = sizeof(struct ip_options) + MAX_IPOPTLEN;
2262     struct ip_options *ipopt = store_get(optlen, GET_UNTAINTED);
2263 # elif OPTSTYLE == 2
2264     struct ip_opts ipoptblock;
2265     struct ip_opts *ipopt = &ipoptblock;
2266     EXIM_SOCKLEN_T optlen = sizeof(ipoptblock);
2267 # else
2268     struct ipoption ipoptblock;
2269     struct ipoption *ipopt = &ipoptblock;
2270     EXIM_SOCKLEN_T optlen = sizeof(ipoptblock);
2271 # endif
2272
2273     /* Occasional genuine failures of getsockopt() have been seen - for
2274     example, "reset by peer". Therefore, just log and give up on this
2275     call, unless the error is ENOPROTOOPT. This error is given by systems
2276     that have the interfaces but not the mechanism - e.g. GNU/Hurd at the time
2277     of writing. So for that error, carry on - we just can't do an IP options
2278     check. */
2279
2280     DEBUG(D_receive) debug_printf("checking for IP options\n");
2281
2282     if (getsockopt(fileno(smtp_out), IPPROTO_IP, IP_OPTIONS, US (ipopt),
2283           &optlen) < 0)
2284       {
2285       if (errno != ENOPROTOOPT)
2286         {
2287         log_write(0, LOG_MAIN, "getsockopt() failed from %s: %s",
2288           host_and_ident(FALSE), strerror(errno));
2289         smtp_printf("451 SMTP service not available\r\n", SP_NO_MORE);
2290         return FALSE;
2291         }
2292       }
2293
2294     /* Deal with any IP options that are set. On the systems I have looked at,
2295     the value of MAX_IPOPTLEN has been 40, meaning that there should never be
2296     more logging data than will fit in big_buffer. Nevertheless, after somebody
2297     questioned this code, I've added in some paranoid checking. */
2298
2299     else if (optlen > 0)
2300       {
2301       uschar * p = big_buffer;
2302       uschar * pend = big_buffer + big_buffer_size;
2303       uschar * adptr;
2304       int optcount;
2305       struct in_addr addr;
2306
2307 # if OPTSTYLE == 1
2308       uschar * optstart = US (ipopt->__data);
2309 # elif OPTSTYLE == 2
2310       uschar * optstart = US (ipopt->ip_opts);
2311 # else
2312       uschar * optstart = US (ipopt->ipopt_list);
2313 # endif
2314
2315       DEBUG(D_receive) debug_printf("IP options exist\n");
2316
2317       Ustrcpy(p, "IP options on incoming call:");
2318       p += Ustrlen(p);
2319
2320       for (uschar * opt = optstart; opt && opt < US (ipopt) + optlen; )
2321         switch (*opt)
2322           {
2323           case IPOPT_EOL:
2324             opt = NULL;
2325             break;
2326
2327           case IPOPT_NOP:
2328             opt++;
2329             break;
2330
2331           case IPOPT_SSRR:
2332           case IPOPT_LSRR:
2333             if (!
2334 # if OPTSTYLE == 1
2335                  string_format(p, pend-p, " %s [@%s",
2336                  (*opt == IPOPT_SSRR)? "SSRR" : "LSRR",
2337                  inet_ntoa(*((struct in_addr *)(&(ipopt->faddr)))))
2338 # elif OPTSTYLE == 2
2339                  string_format(p, pend-p, " %s [@%s",
2340                  (*opt == IPOPT_SSRR)? "SSRR" : "LSRR",
2341                  inet_ntoa(ipopt->ip_dst))
2342 # else
2343                  string_format(p, pend-p, " %s [@%s",
2344                  (*opt == IPOPT_SSRR)? "SSRR" : "LSRR",
2345                  inet_ntoa(ipopt->ipopt_dst))
2346 # endif
2347               )
2348               {
2349               opt = NULL;
2350               break;
2351               }
2352
2353             p += Ustrlen(p);
2354             optcount = (opt[1] - 3) / sizeof(struct in_addr);
2355             adptr = opt + 3;
2356             while (optcount-- > 0)
2357               {
2358               memcpy(&addr, adptr, sizeof(addr));
2359               if (!string_format(p, pend - p - 1, "%s%s",
2360                     (optcount == 0)? ":" : "@", inet_ntoa(addr)))
2361                 {
2362                 opt = NULL;
2363                 break;
2364                 }
2365               p += Ustrlen(p);
2366               adptr += sizeof(struct in_addr);
2367               }
2368             *p++ = ']';
2369             opt += opt[1];
2370             break;
2371
2372           default:
2373               {
2374               if (pend - p < 4 + 3*opt[1]) { opt = NULL; break; }
2375               Ustrcat(p, "[ ");
2376               p += 2;
2377               for (int i = 0; i < opt[1]; i++)
2378                 p += sprintf(CS p, "%2.2x ", opt[i]);
2379               *p++ = ']';
2380               }
2381             opt += opt[1];
2382             break;
2383           }
2384
2385       *p = 0;
2386       log_write(0, LOG_MAIN, "%s", big_buffer);
2387
2388       /* Refuse any call with IP options. This is what tcpwrappers 7.5 does. */
2389
2390       log_write(0, LOG_MAIN|LOG_REJECT,
2391         "connection from %s refused (IP options)", host_and_ident(FALSE));
2392
2393       smtp_printf("554 SMTP service not available\r\n", SP_NO_MORE);
2394       return FALSE;
2395       }
2396
2397     /* Length of options = 0 => there are no options */
2398
2399     else DEBUG(D_receive) debug_printf("no IP options found\n");
2400     }
2401 #endif  /* HAVE_IPV6 && !defined(NO_IP_OPTIONS) */
2402
2403   /* Set keep-alive in socket options. The option is on by default. This
2404   setting is an attempt to get rid of some hanging connections that stick in
2405   read() when the remote end (usually a dialup) goes away. */
2406
2407   if (smtp_accept_keepalive && !f.sender_host_notsocket)
2408     ip_keepalive(fileno(smtp_out), sender_host_address, FALSE);
2409
2410   /* If the current host matches host_lookup, set the name by doing a
2411   reverse lookup. On failure, sender_host_name will be NULL and
2412   host_lookup_failed will be TRUE. This may or may not be serious - optional
2413   checks later. */
2414
2415   if (verify_check_host(&host_lookup) == OK)
2416     {
2417     (void)host_name_lookup();
2418     host_build_sender_fullhost();
2419     }
2420
2421   /* Delay this until we have the full name, if it is looked up. */
2422
2423   set_process_info("handling incoming connection from %s",
2424     host_and_ident(FALSE));
2425
2426   /* Expand smtp_receive_timeout, if needed */
2427
2428   if (smtp_receive_timeout_s)
2429     {
2430     uschar * exp;
2431     if (  !(exp = expand_string(smtp_receive_timeout_s))
2432        || !(*exp)
2433        || (smtp_receive_timeout = readconf_readtime(exp, 0, FALSE)) < 0
2434        )
2435       log_write(0, LOG_MAIN|LOG_PANIC,
2436         "bad value for smtp_receive_timeout: '%s'", exp ? exp : US"");
2437     }
2438
2439   /* Test for explicit connection rejection */
2440
2441   if (verify_check_host(&host_reject_connection) == OK)
2442     {
2443     log_write(L_connection_reject, LOG_MAIN|LOG_REJECT, "refused connection "
2444       "from %s (host_reject_connection)", host_and_ident(FALSE));
2445 #ifndef DISABLE_TLS
2446     if (!tls_in.on_connect)
2447 #endif
2448       smtp_printf("554 SMTP service not available\r\n", SP_NO_MORE);
2449     return FALSE;
2450     }
2451
2452   /* Test with TCP Wrappers if so configured. There is a problem in that
2453   hosts_ctl() returns 0 (deny) under a number of system failure circumstances,
2454   such as disks dying. In these cases, it is desirable to reject with a 4xx
2455   error instead of a 5xx error. There isn't a "right" way to detect such
2456   problems. The following kludge is used: errno is zeroed before calling
2457   hosts_ctl(). If the result is "reject", a 5xx error is given only if the
2458   value of errno is 0 or ENOENT (which happens if /etc/hosts.{allow,deny} does
2459   not exist). */
2460
2461 #ifdef USE_TCP_WRAPPERS
2462   errno = 0;
2463   if (!(tcp_wrappers_name = expand_string(tcp_wrappers_daemon_name)))
2464     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Expansion of \"%s\" "
2465       "(tcp_wrappers_name) failed: %s", string_printing(tcp_wrappers_name),
2466         expand_string_message);
2467
2468   if (!hosts_ctl(tcp_wrappers_name,
2469          sender_host_name ? CS sender_host_name : STRING_UNKNOWN,
2470          sender_host_address ? CS sender_host_address : STRING_UNKNOWN,
2471          sender_ident ? CS sender_ident : STRING_UNKNOWN))
2472     {
2473     if (errno == 0 || errno == ENOENT)
2474       {
2475       HDEBUG(D_receive) debug_printf("tcp wrappers rejection\n");
2476       log_write(L_connection_reject,
2477                 LOG_MAIN|LOG_REJECT, "refused connection from %s "
2478                 "(tcp wrappers)", host_and_ident(FALSE));
2479       smtp_printf("554 SMTP service not available\r\n", SP_NO_MORE);
2480       }
2481     else
2482       {
2483       int save_errno = errno;
2484       HDEBUG(D_receive) debug_printf("tcp wrappers rejected with unexpected "
2485         "errno value %d\n", save_errno);
2486       log_write(L_connection_reject,
2487                 LOG_MAIN|LOG_REJECT, "temporarily refused connection from %s "
2488                 "(tcp wrappers errno=%d)", host_and_ident(FALSE), save_errno);
2489       smtp_printf("451 Temporary local problem - please try later\r\n", SP_NO_MORE);
2490       }
2491     return FALSE;
2492     }
2493 #endif
2494
2495   /* Check for reserved slots. The value of smtp_accept_count has already been
2496   incremented to include this process. */
2497
2498   if (smtp_accept_max > 0 &&
2499       smtp_accept_count > smtp_accept_max - smtp_accept_reserve)
2500     {
2501     if ((rc = verify_check_host(&smtp_reserve_hosts)) != OK)
2502       {
2503       log_write(L_connection_reject,
2504         LOG_MAIN, "temporarily refused connection from %s: not in "
2505         "reserve list: connected=%d max=%d reserve=%d%s",
2506         host_and_ident(FALSE), smtp_accept_count - 1, smtp_accept_max,
2507         smtp_accept_reserve, (rc == DEFER)? " (lookup deferred)" : "");
2508       smtp_printf("421 %s: Too many concurrent SMTP connections; "
2509         "please try again later\r\n", SP_NO_MORE, smtp_active_hostname);
2510       return FALSE;
2511       }
2512     reserved_host = TRUE;
2513     }
2514
2515   /* If a load level above which only messages from reserved hosts are
2516   accepted is set, check the load. For incoming calls via the daemon, the
2517   check is done in the superior process if there are no reserved hosts, to
2518   save a fork. In all cases, the load average will already be available
2519   in a global variable at this point. */
2520
2521   if (smtp_load_reserve >= 0 &&
2522        load_average > smtp_load_reserve &&
2523        !reserved_host &&
2524        verify_check_host(&smtp_reserve_hosts) != OK)
2525     {
2526     log_write(L_connection_reject,
2527       LOG_MAIN, "temporarily refused connection from %s: not in "
2528       "reserve list and load average = %.2f", host_and_ident(FALSE),
2529       (double)load_average/1000.0);
2530     smtp_printf("421 %s: Too much load; please try again later\r\n", SP_NO_MORE,
2531       smtp_active_hostname);
2532     return FALSE;
2533     }
2534
2535   /* Determine whether unqualified senders or recipients are permitted
2536   for this host. Unfortunately, we have to do this every time, in order to
2537   set the flags so that they can be inspected when considering qualifying
2538   addresses in the headers. For a site that permits no qualification, this
2539   won't take long, however. */
2540
2541   f.allow_unqualified_sender =
2542     verify_check_host(&sender_unqualified_hosts) == OK;
2543
2544   f.allow_unqualified_recipient =
2545     verify_check_host(&recipient_unqualified_hosts) == OK;
2546
2547   /* Determine whether HELO/EHLO is required for this host. The requirement
2548   can be hard or soft. */
2549
2550   fl.helo_verify_required = verify_check_host(&helo_verify_hosts) == OK;
2551   if (!fl.helo_verify_required)
2552     fl.helo_verify = verify_check_host(&helo_try_verify_hosts) == OK;
2553
2554   /* Determine whether this hosts is permitted to send syntactic junk
2555   after a HELO or EHLO command. */
2556
2557   fl.helo_accept_junk = verify_check_host(&helo_accept_junk_hosts) == OK;
2558   }
2559
2560 /* Expand recipients_max, if needed */
2561  {
2562   uschar * rme = expand_string(recipients_max);
2563   recipients_max_expanded = atoi(CCS rme);
2564  }
2565 /* For batch SMTP input we are now done. */
2566
2567 if (smtp_batched_input) return TRUE;
2568
2569 #if defined(SUPPORT_PROXY) || defined(SUPPORT_SOCKS) || defined(EXPERIMENTAL_XCLIENT)
2570 proxy_session = FALSE;
2571 #endif
2572
2573 #ifdef SUPPORT_PROXY
2574 /* If valid Proxy Protocol source is connecting, set up session.
2575 Failure will not allow any SMTP function other than QUIT. */
2576
2577 f.proxy_session_failed = FALSE;
2578 if (proxy_protocol_host())
2579   {
2580   os_non_restarting_signal(SIGALRM, command_timeout_handler);
2581   proxy_protocol_setup();
2582   }
2583 #endif
2584
2585 /* Run the connect ACL if it exists */
2586
2587 user_msg = NULL;
2588 GET_OPTION("acl_smtp_connect");
2589 if (acl_smtp_connect)
2590   {
2591   int rc;
2592   if ((rc = acl_check(ACL_WHERE_CONNECT, NULL, acl_smtp_connect, &user_msg,
2593                       &log_msg)) != OK)
2594     {
2595 #ifndef DISABLE_TLS
2596     if (tls_in.on_connect)
2597       log_connect_tls_drop(US"'connect' ACL", log_msg);
2598     else
2599 #endif
2600       (void) smtp_handle_acl_fail(ACL_WHERE_CONNECT, rc, user_msg, log_msg);
2601     return FALSE;
2602     }
2603   }
2604
2605 /* Start up TLS if tls_on_connect is set. This is for supporting the legacy
2606 smtps port for use with older style SSL MTAs. */
2607
2608 #ifndef DISABLE_TLS
2609 if (tls_in.on_connect)
2610   {
2611   if (tls_server_start(&user_msg) != OK)
2612     return smtp_log_tls_fail(user_msg);
2613   cmd_list[CL_TLAU].is_mail_cmd = TRUE;
2614   }
2615 #endif
2616
2617 /* Output the initial message for a two-way SMTP connection. It may contain
2618 newlines, which then cause a multi-line response to be given. */
2619
2620 code = US"220";   /* Default status code */
2621 esc = US"";       /* Default extended status code */
2622 esclen = 0;       /* Length of esc */
2623
2624 if (user_msg)
2625   {
2626   int codelen = 3;
2627   s = user_msg;
2628   smtp_message_code(&code, &codelen, &s, NULL, TRUE);
2629   if (codelen > 4)
2630     {
2631     esc = code + 4;
2632     esclen = codelen - 4;
2633     }
2634   }
2635 else
2636   {
2637   GET_OPTION("smtp_banner");
2638   if (!(s = expand_string(smtp_banner)))
2639     {
2640     log_write(0, f.expand_string_forcedfail ? LOG_MAIN : LOG_MAIN|LOG_PANIC_DIE,
2641       "Expansion of \"%s\" (smtp_banner) failed: %s",
2642       smtp_banner, expand_string_message);
2643     /* for force-fail */
2644   #ifndef DISABLE_TLS
2645     if (tls_in.on_connect) tls_close(NULL, TLS_SHUTDOWN_WAIT);
2646   #endif
2647     return FALSE;
2648     }
2649   }
2650
2651 /* Remove any terminating newlines; might as well remove trailing space too */
2652
2653 p = s + Ustrlen(s);
2654 while (p > s && isspace(p[-1])) p--;
2655 s = string_copyn(s, p-s);
2656
2657 /* It seems that CC:Mail is braindead, and assumes that the greeting message
2658 is all contained in a single IP packet. The original code wrote out the
2659 greeting using several calls to fprint/fputc, and on busy servers this could
2660 cause it to be split over more than one packet - which caused CC:Mail to fall
2661 over when it got the second part of the greeting after sending its first
2662 command. Sigh. To try to avoid this, build the complete greeting message
2663 first, and output it in one fell swoop. This gives a better chance of it
2664 ending up as a single packet. */
2665
2666 ss = string_get(256);
2667
2668 p = s;
2669 do       /* At least once, in case we have an empty string */
2670   {
2671   int len;
2672   uschar *linebreak = Ustrchr(p, '\n');
2673   ss = string_catn(ss, code, 3);
2674   if (!linebreak)
2675     {
2676     len = Ustrlen(p);
2677     ss = string_catn(ss, US" ", 1);
2678     }
2679   else
2680     {
2681     len = linebreak - p;
2682     ss = string_catn(ss, US"-", 1);
2683     }
2684   ss = string_catn(ss, esc, esclen);
2685   ss = string_catn(ss, p, len);
2686   ss = string_catn(ss, US"\r\n", 2);
2687   p += len;
2688   if (linebreak) p++;
2689   }
2690 while (*p);
2691
2692 /* Before we write the banner, check that there is no input pending, unless
2693 this synchronisation check is disabled. */
2694
2695 #ifndef DISABLE_PIPE_CONNECT
2696 fl.pipe_connect_acceptable =
2697   sender_host_address && verify_check_host(&pipe_connect_advertise_hosts) == OK;
2698
2699 if (!check_sync())
2700   if (fl.pipe_connect_acceptable)
2701     f.smtp_in_early_pipe_used = TRUE;
2702   else
2703 #else
2704 if (!check_sync())
2705 #endif
2706     {
2707     unsigned n = smtp_inend - smtp_inptr;
2708     if (n > 128) n = 128;
2709
2710     log_write(0, LOG_MAIN|LOG_REJECT, "SMTP protocol "
2711       "synchronization error (input sent without waiting for greeting): "
2712       "rejected connection from %s input=\"%s\"", host_and_ident(TRUE),
2713       string_printing(string_copyn(smtp_inptr, n)));
2714     smtp_printf("554 SMTP synchronization error\r\n", SP_NO_MORE);
2715     return FALSE;
2716     }
2717
2718 /* Now output the banner */
2719 /*XXX the ehlo-resp code does its own tls/nontls bit.  Maybe subroutine that? */
2720
2721 smtp_printf("%Y",
2722 #ifndef DISABLE_PIPE_CONNECT
2723   fl.pipe_connect_acceptable && pipeline_connect_sends(),
2724 #else
2725   SP_NO_MORE,
2726 #endif
2727   ss);
2728
2729 /* Attempt to see if we sent the banner before the last ACK of the 3-way
2730 handshake arrived.  If so we must have managed a TFO. */
2731
2732 #ifdef TCP_FASTOPEN
2733 if (sender_host_address && !f.sender_host_notsocket) tfo_in_check();
2734 #endif
2735
2736 return TRUE;
2737 }
2738
2739
2740
2741
2742
2743 /*************************************************
2744 *     Handle SMTP syntax and protocol errors     *
2745 *************************************************/
2746
2747 /* Write to the log for SMTP syntax errors in incoming commands, if configured
2748 to do so. Then transmit the error response. The return value depends on the
2749 number of syntax and protocol errors in this SMTP session.
2750
2751 Arguments:
2752   type      error type, given as a log flag bit
2753   code      response code; <= 0 means don't send a response
2754   data      data to reflect in the response (can be NULL)
2755   errmess   the error message
2756
2757 Returns:    -1   limit of syntax/protocol errors NOT exceeded
2758             +1   limit of syntax/protocol errors IS exceeded
2759
2760 These values fit in with the values of the "done" variable in the main
2761 processing loop in smtp_setup_msg(). */
2762
2763 static int
2764 synprot_error(int type, int code, uschar *data, uschar *errmess)
2765 {
2766 int yield = -1;
2767
2768 log_write(type, LOG_MAIN, "SMTP %s error in \"%s\" %s %s",
2769   type == L_smtp_syntax_error ? "syntax" : "protocol",
2770   string_printing(smtp_cmd_buffer), host_and_ident(TRUE), errmess);
2771
2772 if (++synprot_error_count > smtp_max_synprot_errors)
2773   {
2774   yield = 1;
2775   log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
2776     "syntax or protocol errors (last command was \"%s\", %Y)",
2777     host_and_ident(FALSE), string_printing(smtp_cmd_buffer),
2778     s_connhad_log(NULL)
2779     );
2780   }
2781
2782 if (code > 0)
2783   {
2784   smtp_printf("%d%c%s%s%s\r\n", SP_NO_MORE, code, yield == 1 ? '-' : ' ',
2785     data ? data : US"", data ? US": " : US"", errmess);
2786   if (yield == 1)
2787     smtp_printf("%d Too many syntax or protocol errors\r\n", SP_NO_MORE, code);
2788   }
2789
2790 return yield;
2791 }
2792
2793
2794
2795
2796 /*************************************************
2797 *    Send SMTP response, possibly multiline      *
2798 *************************************************/
2799
2800 /* There are, it seems, broken clients out there that cannot handle multiline
2801 responses. If no_multiline_responses is TRUE (it can be set from an ACL), we
2802 output nothing for non-final calls, and only the first line for anything else.
2803
2804 Arguments:
2805   code          SMTP code, may involve extended status codes
2806   codelen       length of smtp code; if > 4 there's an ESC
2807   final         FALSE if the last line isn't the final line
2808   msg           message text, possibly containing newlines
2809
2810 Returns:        nothing
2811 */
2812
2813 void
2814 smtp_respond(uschar * code, int codelen, BOOL final, uschar * msg)
2815 {
2816 int esclen = 0;
2817 uschar *esc = US"";
2818
2819 if (!final && f.no_multiline_responses) return;
2820
2821 if (codelen > 4)
2822   {
2823   esc = code + 4;
2824   esclen = codelen - 4;
2825   }
2826
2827 /* If this is the first output for a (non-batch) RCPT command, see if all RCPTs
2828 have had the same. Note: this code is also present in smtp_printf(). It would
2829 be tidier to have it only in one place, but when it was added, it was easier to
2830 do it that way, so as not to have to mess with the code for the RCPT command,
2831 which sometimes uses smtp_printf() and sometimes smtp_respond(). */
2832
2833 if (fl.rcpt_in_progress)
2834   {
2835   if (!rcpt_smtp_response)
2836     rcpt_smtp_response = string_copy(msg);
2837   else if (fl.rcpt_smtp_response_same &&
2838            Ustrcmp(rcpt_smtp_response, msg) != 0)
2839     fl.rcpt_smtp_response_same = FALSE;
2840   fl.rcpt_in_progress = FALSE;
2841   }
2842
2843 /* Now output the message, splitting it up into multiple lines if necessary.
2844 We only handle pipelining these responses as far as nonfinal/final groups,
2845 not the whole MAIL/RCPT/DATA response set. */
2846
2847 for (uschar * nl;;)
2848   if (!(nl = Ustrchr(msg, '\n')))
2849     {
2850     smtp_printf("%.3s%c%.*s%s\r\n", !final, code, final ? ' ':'-', esclen, esc, msg);
2851     return;
2852     }
2853   else if (nl[1] == 0 || f.no_multiline_responses)
2854     {
2855     smtp_printf("%.3s%c%.*s%.*s\r\n", !final, code, final ? ' ':'-', esclen, esc,
2856       (int)(nl - msg), msg);
2857     return;
2858     }
2859   else
2860     {
2861     smtp_printf("%.3s-%.*s%.*s\r\n", SP_MORE, code, esclen, esc, (int)(nl - msg), msg);
2862     msg = nl + 1;
2863     Uskip_whitespace(&msg);
2864     }
2865 }
2866
2867
2868
2869
2870 /*************************************************
2871 *            Parse user SMTP message             *
2872 *************************************************/
2873
2874 /* This function allows for user messages overriding the response code details
2875 by providing a suitable response code string at the start of the message
2876 user_msg. Check the message for starting with a response code and optionally an
2877 extended status code. If found, check that the first digit is valid, and if so,
2878 change the code pointer and length to use the replacement. An invalid code
2879 causes a panic log; in this case, if the log messages is the same as the user
2880 message, we must also adjust the value of the log message to show the code that
2881 is actually going to be used (the original one).
2882
2883 This function is global because it is called from receive.c as well as within
2884 this module.
2885
2886 Note that the code length returned includes the terminating whitespace
2887 character, which is always included in the regex match.
2888
2889 Arguments:
2890   code          SMTP code, may involve extended status codes
2891   codelen       length of smtp code; if > 4 there's an ESC
2892   msg           message text
2893   log_msg       optional log message, to be adjusted with the new SMTP code
2894   check_valid   if true, verify the response code
2895
2896 Returns:        nothing
2897 */
2898
2899 void
2900 smtp_message_code(uschar **code, int *codelen, uschar **msg, uschar **log_msg,
2901   BOOL check_valid)
2902 {
2903 uschar * match;
2904 int len;
2905
2906 if (!msg || !*msg || !regex_match(regex_smtp_code, *msg, -1, &match))
2907   return;
2908
2909 len = Ustrlen(match);
2910 if (check_valid && (*msg)[0] != (*code)[0])
2911   {
2912   log_write(0, LOG_MAIN|LOG_PANIC, "configured error code starts with "
2913     "incorrect digit (expected %c) in \"%s\"", (*code)[0], *msg);
2914   if (log_msg && *log_msg == *msg)
2915     *log_msg = string_sprintf("%s %s", *code, *log_msg + len);
2916   }
2917 else
2918   {
2919   *code = *msg;
2920   *codelen = len;    /* Includes final space */
2921   }
2922 *msg += len;         /* Chop the code off the message */
2923 return;
2924 }
2925
2926
2927
2928
2929 /*************************************************
2930 *           Handle an ACL failure                *
2931 *************************************************/
2932
2933 /* This function is called when acl_check() fails. As well as calls from within
2934 this module, it is called from receive.c for an ACL after DATA. It sorts out
2935 logging the incident, and sends the error response. A message containing
2936 newlines is turned into a multiline SMTP response, but for logging, only the
2937 first line is used.
2938
2939 There's a table of default permanent failure response codes to use in
2940 globals.c, along with the table of names. VFRY is special. Despite RFC1123 it
2941 defaults disabled in Exim. However, discussion in connection with RFC 821bis
2942 (aka RFC 2821) has concluded that the response should be 252 in the disabled
2943 state, because there are broken clients that try VRFY before RCPT. A 5xx
2944 response should be given only when the address is positively known to be
2945 undeliverable. Sigh. We return 252 if there is no VRFY ACL or it provides
2946 no explicit code, but if there is one we let it know best.
2947 Also, for ETRN, 458 is given on refusal, and for AUTH, 503.
2948
2949 From Exim 4.63, it is possible to override the response code details by
2950 providing a suitable response code string at the start of the message provided
2951 in user_msg. The code's first digit is checked for validity.
2952
2953 Arguments:
2954   where        where the ACL was called from
2955   rc           the failure code
2956   user_msg     a message that can be included in an SMTP response
2957   log_msg      a message for logging
2958
2959 Returns:     0 in most cases
2960              2 if the failure code was FAIL_DROP, in which case the
2961                SMTP connection should be dropped (this value fits with the
2962                "done" variable in smtp_setup_msg() below)
2963 */
2964
2965 int
2966 smtp_handle_acl_fail(int where, int rc, uschar * user_msg, uschar * log_msg)
2967 {
2968 BOOL drop = rc == FAIL_DROP;
2969 int codelen = 3;
2970 uschar *smtp_code;
2971 uschar *lognl;
2972 uschar *sender_info = US"";
2973 uschar *what;
2974
2975 if (drop) rc = FAIL;
2976
2977 /* Set the default SMTP code, and allow a user message to change it. */
2978
2979 smtp_code = rc == FAIL ? acl_wherecodes[where] : US"451";
2980 smtp_message_code(&smtp_code, &codelen, &user_msg, &log_msg,
2981   where != ACL_WHERE_VRFY);
2982
2983 /* Get info for logging.
2984 We used to have sender_address here; however, there was a bug that was not
2985 updating sender_address after a rewrite during a verify. When this bug was
2986 fixed, sender_address at this point became the rewritten address. I'm not sure
2987 this is what should be logged, so I've changed to logging the unrewritten
2988 address to retain backward compatibility. */
2989
2990 switch (where)
2991   {
2992 #ifdef WITH_CONTENT_SCAN
2993   case ACL_WHERE_MIME:          what = US"during MIME ACL checks";      break;
2994 #endif
2995   case ACL_WHERE_PREDATA:       what = US"DATA";                        break;
2996   case ACL_WHERE_DATA:          what = US"after DATA";                  break;
2997 #ifndef DISABLE_PRDR
2998   case ACL_WHERE_PRDR:          what = US"after DATA PRDR";             break;
2999 #endif
3000   default:
3001     {
3002     uschar * place = smtp_cmd_data ? smtp_cmd_data : US"in \"connect\" ACL";
3003     int lim = 100;
3004
3005     if (where == ACL_WHERE_AUTH)        /* avoid logging auth creds */
3006       {
3007       uschar * s = smtp_cmd_data;
3008       Uskip_nonwhite(&s);
3009       lim = s - smtp_cmd_data;  /* stop after method */
3010       }
3011     what = string_sprintf("%s %.*s", acl_wherenames[where], lim, place);
3012     }
3013   }
3014 switch (where)
3015   {
3016   case ACL_WHERE_RCPT:
3017   case ACL_WHERE_DATA:
3018 #ifdef WITH_CONTENT_SCAN
3019   case ACL_WHERE_MIME:
3020 #endif
3021     sender_info = string_sprintf("F=<%s>%s%s%s%s ",
3022       sender_address_unrewritten ? sender_address_unrewritten : sender_address,
3023       sender_host_authenticated ? US" A="                                    : US"",
3024       sender_host_authenticated ? sender_host_authenticated                  : US"",
3025       sender_host_authenticated && authenticated_id ? US":"                  : US"",
3026       sender_host_authenticated && authenticated_id ? authenticated_id       : US""
3027       );
3028   break;
3029   }
3030
3031 /* If there's been a sender verification failure with a specific message, and
3032 we have not sent a response about it yet, do so now, as a preliminary line for
3033 failures, but not defers. However, always log it for defer, and log it for fail
3034 unless the sender_verify_fail log selector has been turned off. */
3035
3036 if (sender_verified_failed &&
3037     !testflag(sender_verified_failed, af_sverify_told))
3038   {
3039   BOOL save_rcpt_in_progress = fl.rcpt_in_progress;
3040   fl.rcpt_in_progress = FALSE;  /* So as not to treat these as the error */
3041
3042   setflag(sender_verified_failed, af_sverify_told);
3043
3044   if (rc != FAIL || LOGGING(sender_verify_fail))
3045     log_write(0, LOG_MAIN|LOG_REJECT, "%s sender verify %s for <%s>%s",
3046       host_and_ident(TRUE),
3047       ((sender_verified_failed->special_action & 255) == DEFER)? "defer":"fail",
3048       sender_verified_failed->address,
3049       (sender_verified_failed->message == NULL)? US"" :
3050       string_sprintf(": %s", sender_verified_failed->message));
3051
3052   if (rc == FAIL && sender_verified_failed->user_message)
3053     smtp_respond(smtp_code, codelen, SR_NOT_FINAL, string_sprintf(
3054         testflag(sender_verified_failed, af_verify_pmfail)?
3055           "Postmaster verification failed while checking <%s>\n%s\n"
3056           "Several RFCs state that you are required to have a postmaster\n"
3057           "mailbox for each mail domain. This host does not accept mail\n"
3058           "from domains whose servers reject the postmaster address."
3059           :
3060         testflag(sender_verified_failed, af_verify_nsfail)?
3061           "Callback setup failed while verifying <%s>\n%s\n"
3062           "The initial connection, or a HELO or MAIL FROM:<> command was\n"
3063           "rejected. Refusing MAIL FROM:<> does not help fight spam, disregards\n"
3064           "RFC requirements, and stops you from receiving standard bounce\n"
3065           "messages. This host does not accept mail from domains whose servers\n"
3066           "refuse bounces."
3067           :
3068           "Verification failed for <%s>\n%s",
3069         sender_verified_failed->address,
3070         sender_verified_failed->user_message));
3071
3072   fl.rcpt_in_progress = save_rcpt_in_progress;
3073   }
3074
3075 /* Sort out text for logging */
3076
3077 log_msg = log_msg ? string_sprintf(": %s", log_msg) : US"";
3078 if ((lognl = Ustrchr(log_msg, '\n'))) *lognl = 0;
3079
3080 /* Send permanent failure response to the command, but the code used isn't
3081 always a 5xx one - see comments at the start of this function. If the original
3082 rc was FAIL_DROP we drop the connection and yield 2. */
3083
3084 if (rc == FAIL)
3085   smtp_respond(smtp_code, codelen, SR_FINAL,
3086     user_msg ? user_msg : US"Administrative prohibition");
3087
3088 /* Send temporary failure response to the command. Don't give any details,
3089 unless acl_temp_details is set. This is TRUE for a callout defer, a "defer"
3090 verb, and for a header verify when smtp_return_error_details is set.
3091
3092 This conditional logic is all somewhat of a mess because of the odd
3093 interactions between temp_details and return_error_details. One day it should
3094 be re-implemented in a tidier fashion. */
3095
3096 else
3097   if (f.acl_temp_details && user_msg)
3098     {
3099     if (  smtp_return_error_details
3100        && sender_verified_failed
3101        && sender_verified_failed->message
3102        )
3103       smtp_respond(smtp_code, codelen, SR_NOT_FINAL, sender_verified_failed->message);
3104
3105     smtp_respond(smtp_code, codelen, SR_FINAL, user_msg);
3106     }
3107   else
3108     smtp_respond(smtp_code, codelen, SR_FINAL,
3109       US"Temporary local problem - please try later");
3110
3111 /* Log the incident to the logs that are specified by log_reject_target
3112 (default main, reject). This can be empty to suppress logging of rejections. If
3113 the connection is not forcibly to be dropped, return 0. Otherwise, log why it
3114 is closing if required and return 2.  */
3115
3116 if (log_reject_target)
3117   {
3118 #ifndef DISABLE_TLS
3119   gstring * g = s_tlslog(NULL);
3120   uschar * tls = string_from_gstring(g);
3121   if (!tls) tls = US"";
3122 #else
3123   uschar * tls = US"";
3124 #endif
3125   log_write(where == ACL_WHERE_CONNECT ? L_connection_reject : 0,
3126     log_reject_target, "%s%s%s %s%srejected %s%s",
3127     LOGGING(dnssec) && sender_host_dnssec ? US" DS" : US"",
3128     host_and_ident(TRUE),
3129     tls,
3130     sender_info,
3131     rc == FAIL ? US"" : US"temporarily ",
3132     what, log_msg);
3133   }
3134
3135 if (!drop) return 0;
3136
3137 log_close_event(US"by DROP in ACL");
3138
3139 /* Run the not-quit ACL, but without any custom messages. This should not be a
3140 problem, because we get here only if some other ACL has issued "drop", and
3141 in that case, *its* custom messages will have been used above. */
3142
3143 smtp_notquit_exit(US"acl-drop", NULL, NULL);
3144
3145 /* An overenthusiastic fail2ban/iptables implimentation has been seen to result
3146 in the TCP conn staying open, and retrying, despite this process exiting. A
3147 malicious client could possibly do the same, tying up server netowrking
3148 resources. Close the socket explicitly to try to avoid that (there's a note in
3149 the Linux socket(7) manpage, SO_LINGER para, to the effect that exim() without
3150 close() results in the socket always lingering). */
3151
3152 (void) poll_one_fd(fileno(smtp_in), POLLIN, 200);
3153 DEBUG(D_any) debug_printf_indent("SMTP(close)>>\n");
3154 (void) fclose(smtp_in);
3155 (void) fclose(smtp_out);
3156
3157 return 2;
3158 }
3159
3160
3161
3162
3163 /*************************************************
3164 *     Handle SMTP exit when QUIT is not given    *
3165 *************************************************/
3166
3167 /* This function provides a logging/statistics hook for when an SMTP connection
3168 is dropped on the floor or the other end goes away. It's a global function
3169 because it's called from receive.c as well as this module. As well as running
3170 the NOTQUIT ACL, if there is one, this function also outputs a final SMTP
3171 response, either with a custom message from the ACL, or using a default. There
3172 is one case, however, when no message is output - after "drop". In that case,
3173 the ACL that obeyed "drop" has already supplied the custom message, and NULL is
3174 passed to this function.
3175
3176 In case things go wrong while processing this function, causing an error that
3177 may re-enter this function, there is a recursion check.
3178
3179 Arguments:
3180   reason          What $smtp_notquit_reason will be set to in the ACL;
3181                     if NULL, the ACL is not run
3182   code            The error code to return as part of the response
3183   defaultrespond  The default message if there's no user_msg
3184
3185 Returns:          Nothing
3186 */
3187
3188 void
3189 smtp_notquit_exit(uschar *reason, uschar *code, uschar *defaultrespond, ...)
3190 {
3191 int rc;
3192 uschar *user_msg = NULL;
3193 uschar *log_msg = NULL;
3194
3195 /* Check for recursive call */
3196
3197 if (fl.smtp_exit_function_called)
3198   {
3199   log_write(0, LOG_PANIC, "smtp_notquit_exit() called more than once (%s)",
3200     reason);
3201   return;
3202   }
3203 fl.smtp_exit_function_called = TRUE;
3204
3205 /* Call the not-QUIT ACL, if there is one, unless no reason is given. */
3206
3207 GET_OPTION("acl_smtp_notquit");
3208 if (acl_smtp_notquit && reason)
3209   {
3210   smtp_notquit_reason = reason;
3211   if ((rc = acl_check(ACL_WHERE_NOTQUIT, NULL, acl_smtp_notquit, &user_msg,
3212                       &log_msg)) == ERROR)
3213     log_write(0, LOG_MAIN|LOG_PANIC, "ACL for not-QUIT returned ERROR: %s",
3214       log_msg);
3215   }
3216
3217 /* If the connection was dropped, we certainly are no longer talking TLS */
3218 tls_in.active.sock = -1;
3219
3220 /* Write an SMTP response if we are expected to give one. As the default
3221 responses are all internal, they should be reasonable size. */
3222
3223 if (code && defaultrespond)
3224   {
3225   if (user_msg)
3226     smtp_respond(code, 3, SR_FINAL, user_msg);
3227   else
3228     {
3229     gstring * g;
3230     va_list ap;
3231
3232     va_start(ap, defaultrespond);
3233     g = string_vformat(NULL, SVFMT_EXTEND|SVFMT_REBUFFER, CS defaultrespond, ap);
3234     va_end(ap);
3235     smtp_printf("%s %Y\r\n", SP_NO_MORE, code, g);
3236     }
3237   mac_smtp_fflush();
3238   }
3239 }
3240
3241
3242
3243
3244 /*************************************************
3245 *             Verify HELO argument               *
3246 *************************************************/
3247
3248 /* This function is called if helo_verify_hosts or helo_try_verify_hosts is
3249 matched. It is also called from ACL processing if verify = helo is used and
3250 verification was not previously tried (i.e. helo_try_verify_hosts was not
3251 matched). The result of its processing is to set helo_verified and
3252 helo_verify_failed. These variables should both be FALSE for this function to
3253 be called.
3254
3255 Note that EHLO/HELO is legitimately allowed to quote an address literal. Allow
3256 for IPv6 ::ffff: literals.
3257
3258 Argument:   none
3259 Returns:    TRUE if testing was completed;
3260             FALSE on a temporary failure
3261 */
3262
3263 BOOL
3264 smtp_verify_helo(void)
3265 {
3266 BOOL yield = TRUE;
3267
3268 HDEBUG(D_receive) debug_printf("verifying EHLO/HELO argument \"%s\"\n",
3269   sender_helo_name);
3270
3271 if (sender_helo_name == NULL)
3272   {
3273   HDEBUG(D_receive) debug_printf("no EHLO/HELO command was issued\n");
3274   }
3275
3276 /* Deal with the case of -bs without an IP address */
3277
3278 else if (sender_host_address == NULL)
3279   {
3280   HDEBUG(D_receive) debug_printf("no client IP address: assume success\n");
3281   f.helo_verified = TRUE;
3282   }
3283
3284 /* Deal with the more common case when there is a sending IP address */
3285
3286 else if (sender_helo_name[0] == '[')
3287   {
3288   f.helo_verified = Ustrncmp(sender_helo_name+1, sender_host_address,
3289     Ustrlen(sender_host_address)) == 0;
3290
3291 #if HAVE_IPV6
3292   if (!f.helo_verified)
3293     {
3294     if (strncmpic(sender_host_address, US"::ffff:", 7) == 0)
3295       f.helo_verified = Ustrncmp(sender_helo_name + 1,
3296         sender_host_address + 7, Ustrlen(sender_host_address) - 7) == 0;
3297     }
3298 #endif
3299
3300   HDEBUG(D_receive)
3301     { if (f.helo_verified) debug_printf("matched host address\n"); }
3302   }
3303
3304 /* Do a reverse lookup if one hasn't already given a positive or negative
3305 response. If that fails, or the name doesn't match, try checking with a forward
3306 lookup. */
3307
3308 else
3309   {
3310   if (sender_host_name == NULL && !host_lookup_failed)
3311     yield = host_name_lookup() != DEFER;
3312
3313   /* If a host name is known, check it and all its aliases. */
3314
3315   if (sender_host_name)
3316     if ((f.helo_verified = strcmpic(sender_host_name, sender_helo_name) == 0))
3317       {
3318       sender_helo_dnssec = sender_host_dnssec;
3319       HDEBUG(D_receive) debug_printf("matched host name\n");
3320       }
3321     else
3322       {
3323       uschar **aliases = sender_host_aliases;
3324       while (*aliases)
3325         if ((f.helo_verified = strcmpic(*aliases++, sender_helo_name) == 0))
3326           {
3327           sender_helo_dnssec = sender_host_dnssec;
3328           break;
3329           }
3330
3331       HDEBUG(D_receive) if (f.helo_verified)
3332           debug_printf("matched alias %s\n", *(--aliases));
3333       }
3334
3335   /* Final attempt: try a forward lookup of the helo name */
3336
3337   if (!f.helo_verified)
3338     {
3339     int rc;
3340     host_item h =
3341       {.name = sender_helo_name, .address = NULL, .mx = MX_NONE, .next = NULL};
3342     dnssec_domains d =
3343       {.request = US"*", .require = US""};
3344
3345     HDEBUG(D_receive) debug_printf("getting IP address for %s\n",
3346       sender_helo_name);
3347     rc = host_find_bydns(&h, NULL, HOST_FIND_BY_A | HOST_FIND_BY_AAAA,
3348                           NULL, NULL, NULL, &d, NULL, NULL);
3349     if (rc == HOST_FOUND || rc == HOST_FOUND_LOCAL)
3350       for (host_item * hh = &h; hh; hh = hh->next)
3351         if (Ustrcmp(hh->address, sender_host_address) == 0)
3352           {
3353           f.helo_verified = TRUE;
3354           if (h.dnssec == DS_YES) sender_helo_dnssec = TRUE;
3355           HDEBUG(D_receive)
3356             debug_printf("IP address for %s matches calling address\n"
3357               "Forward DNS security status: %sverified\n",
3358               sender_helo_name, sender_helo_dnssec ? "" : "un");
3359           break;
3360           }
3361     }
3362   }
3363
3364 if (!f.helo_verified) f.helo_verify_failed = TRUE;  /* We've tried ... */
3365 return yield;
3366 }
3367
3368
3369
3370
3371 /*************************************************
3372 *        Send user response message              *
3373 *************************************************/
3374
3375 /* This function is passed a default response code and a user message. It calls
3376 smtp_message_code() to check and possibly modify the response code, and then
3377 calls smtp_respond() to transmit the response. I put this into a function
3378 just to avoid a lot of repetition.
3379
3380 Arguments:
3381   code         the response code
3382   user_msg     the user message
3383
3384 Returns:       nothing
3385 */
3386
3387 static void
3388 smtp_user_msg(uschar * code, uschar * user_msg)
3389 {
3390 int len = 3;
3391 smtp_message_code(&code, &len, &user_msg, NULL, TRUE);
3392 smtp_respond(code, len, SR_FINAL, user_msg);
3393 }
3394
3395
3396
3397 static int
3398 smtp_in_auth(auth_instance *au, uschar ** smtp_resp, uschar ** errmsg)
3399 {
3400 const uschar *set_id = NULL;
3401 int rc;
3402
3403 /* Set up globals for error messages */
3404
3405 authenticator_name = au->name;
3406 driver_srcfile = au->srcfile;
3407 driver_srcline = au->srcline;
3408
3409 /* Run the checking code, passing the remainder of the command line as
3410 data. Initials the $auth<n> variables as empty. Initialize $0 empty and set
3411 it as the only set numerical variable. The authenticator may set $auth<n>
3412 and also set other numeric variables. The $auth<n> variables are preferred
3413 nowadays; the numerical variables remain for backwards compatibility.
3414
3415 Afterwards, have a go at expanding the set_id string, even if
3416 authentication failed - for bad passwords it can be useful to log the
3417 userid. On success, require set_id to expand and exist, and put it in
3418 authenticated_id. Save this in permanent store, as the working store gets
3419 reset at HELO, RSET, etc. */
3420
3421 for (int i = 0; i < AUTH_VARS; i++) auth_vars[i] = NULL;
3422 expand_nmax = 0;
3423 expand_nlength[0] = 0;   /* $0 contains nothing */
3424
3425 rc = (au->info->servercode)(au, smtp_cmd_data);
3426 if (au->set_id) set_id = expand_string(au->set_id);
3427 expand_nmax = -1;        /* Reset numeric variables */
3428 for (int i = 0; i < AUTH_VARS; i++) auth_vars[i] = NULL;   /* Reset $auth<n> */
3429 driver_srcfile = authenticator_name = NULL; driver_srcline = 0;
3430
3431 /* The value of authenticated_id is stored in the spool file and printed in
3432 log lines. It must not contain binary zeros or newline characters. In
3433 normal use, it never will, but when playing around or testing, this error
3434 can (did) happen. To guard against this, ensure that the id contains only
3435 printing characters. */
3436
3437 if (set_id) set_id = string_printing(set_id);
3438
3439 /* For the non-OK cases, set up additional logging data if set_id
3440 is not empty. */
3441
3442 if (rc != OK)
3443   set_id = set_id && *set_id
3444     ? string_sprintf(" (set_id=%s)", set_id) : US"";
3445
3446 /* Switch on the result */
3447
3448 switch(rc)
3449   {
3450   case OK:
3451     if (!au->set_id || set_id)    /* Complete success */
3452       {
3453       if (set_id) authenticated_id = string_copy_perm(set_id, TRUE);
3454       sender_host_authenticated = au->name;
3455       sender_host_auth_pubname  = au->public_name;
3456       authentication_failed = FALSE;
3457       authenticated_fail_id = NULL;   /* Impossible to already be set? */
3458
3459       received_protocol =
3460         (sender_host_address ? protocols : protocols_local)
3461           [pextend + pauthed + (tls_in.active.sock >= 0 ? pcrpted:0)];
3462       *smtp_resp = *errmsg = US"235 Authentication succeeded";
3463       authenticated_by = au;
3464       break;
3465       }
3466
3467     /* Authentication succeeded, but we failed to expand the set_id string.
3468     Treat this as a temporary error. */
3469
3470     auth_defer_msg = expand_string_message;
3471     /* Fall through */
3472
3473   case DEFER:
3474     if (set_id) authenticated_fail_id = string_copy_perm(set_id, TRUE);
3475     *smtp_resp = string_sprintf("435 Unable to authenticate at present%s",
3476       auth_defer_user_msg);
3477     *errmsg = string_sprintf("435 Unable to authenticate at present%s: %s",
3478       set_id, auth_defer_msg);
3479     break;
3480
3481   case BAD64:
3482     *smtp_resp = *errmsg = US"501 Invalid base64 data";
3483     break;
3484
3485   case CANCELLED:
3486     *smtp_resp = *errmsg = US"501 Authentication cancelled";
3487     break;
3488
3489   case UNEXPECTED:
3490     *smtp_resp = *errmsg = US"553 Initial data not expected";
3491     break;
3492
3493   case FAIL:
3494     if (set_id) authenticated_fail_id = string_copy_perm(set_id, TRUE);
3495     *smtp_resp = US"535 Incorrect authentication data";
3496     *errmsg = string_sprintf("535 Incorrect authentication data%s", set_id);
3497     break;
3498
3499   default:
3500     if (set_id) authenticated_fail_id = string_copy_perm(set_id, TRUE);
3501     *smtp_resp = US"435 Internal error";
3502     *errmsg = string_sprintf("435 Internal error%s: return %d from authentication "
3503       "check", set_id, rc);
3504     break;
3505   }
3506
3507 return rc;
3508 }
3509
3510
3511
3512
3513
3514 static int
3515 qualify_recipient(uschar ** recipient, uschar * smtp_cmd_data, uschar * tag)
3516 {
3517 int rd;
3518 if (f.allow_unqualified_recipient || strcmpic(*recipient, US"postmaster") == 0)
3519   {
3520   DEBUG(D_receive) debug_printf("unqualified address %s accepted\n",
3521     *recipient);
3522   rd = Ustrlen(recipient) + 1;
3523   /* deconst ok as *recipient was not const */
3524   *recipient = US rewrite_address_qualify(*recipient, TRUE);
3525   return rd;
3526   }
3527 smtp_printf("501 %s: recipient address must contain a domain\r\n", SP_NO_MORE,
3528   smtp_cmd_data);
3529 log_write(L_smtp_syntax_error,
3530   LOG_MAIN|LOG_REJECT, "unqualified %s rejected: <%s> %s%s",
3531   tag, *recipient, host_and_ident(TRUE), host_lookup_msg);
3532 return 0;
3533 }
3534
3535
3536
3537
3538 static void
3539 smtp_quit_handler(uschar ** user_msgp, uschar ** log_msgp)
3540 {
3541 HAD(SCH_QUIT);
3542 f.smtp_in_quit = TRUE;
3543 incomplete_transaction_log(US"QUIT");
3544 GET_OPTION("acl_smtp_quit");
3545 if (  acl_smtp_quit
3546    && acl_check(ACL_WHERE_QUIT, NULL, acl_smtp_quit, user_msgp, log_msgp)
3547         == ERROR)
3548     log_write(0, LOG_MAIN|LOG_PANIC, "ACL for QUIT returned ERROR: %s",
3549       *log_msgp);
3550
3551 #ifdef EXIM_TCP_CORK
3552 (void) setsockopt(fileno(smtp_out), IPPROTO_TCP, EXIM_TCP_CORK, US &on, sizeof(on));
3553 #endif
3554
3555 if (*user_msgp)
3556   smtp_respond(US"221", 3, SR_FINAL, *user_msgp);
3557 else
3558   smtp_printf("221 %s closing connection\r\n", SP_NO_MORE, smtp_active_hostname);
3559
3560 #ifdef SERVERSIDE_CLOSE_NOWAIT
3561 # ifndef DISABLE_TLS
3562 tls_close(NULL, TLS_SHUTDOWN_NOWAIT);
3563 # endif
3564
3565 log_close_event(US"by QUIT");
3566 #else
3567
3568 # ifndef DISABLE_TLS
3569 tls_close(NULL, TLS_SHUTDOWN_WAIT);
3570 # endif
3571
3572 log_close_event(US"by QUIT");
3573
3574 /* Pause, hoping client will FIN first so that they get the TIME_WAIT.
3575 The socket should become readble (though with no data) */
3576
3577 (void) poll_one_fd(fileno(smtp_in), POLLIN, 200);
3578 #endif  /*!SERVERSIDE_CLOSE_NOWAIT*/
3579 }
3580
3581
3582 static void
3583 smtp_rset_handler(void)
3584 {
3585 HAD(SCH_RSET);
3586 incomplete_transaction_log(US"RSET");
3587 smtp_printf("250 Reset OK\r\n", SP_NO_MORE);
3588 cmd_list[CL_RSET].is_mail_cmd = FALSE;
3589 if (chunking_state > CHUNKING_OFFERED)
3590   chunking_state = CHUNKING_OFFERED;
3591 }
3592
3593
3594 #ifndef DISABLE_WELLKNOWN
3595 static int
3596 smtp_wellknown_handler(void)
3597 {
3598 if (verify_check_host(&wellknown_advertise_hosts) != FAIL)
3599   {
3600   GET_OPTION("acl_smtp_wellknown");
3601   if (acl_smtp_wellknown)
3602     {
3603     uschar * user_msg = NULL, * log_msg;
3604     int rc;
3605
3606     if ((rc = acl_check(ACL_WHERE_WELLKNOWN, NULL, acl_smtp_wellknown,
3607                 &user_msg, &log_msg)) != OK)
3608       return smtp_handle_acl_fail(ACL_WHERE_WELLKNOWN, rc, user_msg, log_msg);
3609     else if (!wellknown_response)
3610       return smtp_handle_acl_fail(ACL_WHERE_WELLKNOWN, ERROR, user_msg, log_msg);
3611     smtp_user_msg(US"250", wellknown_response);
3612     return 0;
3613     }
3614   }
3615
3616 smtp_printf("554 not permitted\r\n", SP_NO_MORE);
3617 log_write(0, LOG_MAIN|LOG_REJECT, "rejected \"%s\" from %s",
3618               smtp_cmd_buffer, sender_helo_name, host_and_ident(FALSE));
3619 return 0;
3620 }
3621 #endif
3622
3623
3624 static int
3625 expand_mailmax(const uschar * s)
3626 {
3627 if (!(s = expand_cstring(s)))
3628   log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand smtp_accept_max_per_connection");
3629 return *s ? Uatoi(s) : 0;
3630 }
3631
3632 /*************************************************
3633 *       Initialize for SMTP incoming message     *
3634 *************************************************/
3635
3636 /* This function conducts the initial dialogue at the start of an incoming SMTP
3637 message, and builds a list of recipients. However, if the incoming message
3638 is part of a batch (-bS option) a separate function is called since it would
3639 be messy having tests splattered about all over this function. This function
3640 therefore handles the case where interaction is occurring. The input and output
3641 files are set up in smtp_in and smtp_out.
3642
3643 The global recipients_list is set to point to a vector of recipient_item
3644 blocks, whose number is given by recipients_count. This is extended by the
3645 receive_add_recipient() function. The global variable sender_address is set to
3646 the sender's address. The yield is +1 if a message has been successfully
3647 started, 0 if a QUIT command was encountered or the connection was refused from
3648 the particular host, or -1 if the connection was lost.
3649
3650 Argument: none
3651
3652 Returns:  > 0 message successfully started (reached DATA)
3653           = 0 QUIT read or end of file reached or call refused
3654           < 0 lost connection
3655 */
3656
3657 int
3658 smtp_setup_msg(void)
3659 {
3660 int done = 0;
3661 BOOL toomany = FALSE;
3662 BOOL discarded = FALSE;
3663 BOOL last_was_rej_mail = FALSE;
3664 BOOL last_was_rcpt = FALSE;
3665 rmark reset_point = store_mark();
3666
3667 DEBUG(D_receive) debug_printf("smtp_setup_msg entered\n");
3668
3669 /* Reset for start of new message. We allow one RSET not to be counted as a
3670 nonmail command, for those MTAs that insist on sending it between every
3671 message. Ditto for EHLO/HELO and for STARTTLS, to allow for going in and out of
3672 TLS between messages (an Exim client may do this if it has messages queued up
3673 for the host). Note: we do NOT reset AUTH at this point. */
3674
3675 reset_point = smtp_reset(reset_point);
3676 message_ended = END_NOTSTARTED;
3677
3678 chunking_state = f.chunking_offered ? CHUNKING_OFFERED : CHUNKING_NOT_OFFERED;
3679
3680 cmd_list[CL_RSET].is_mail_cmd = TRUE;
3681 cmd_list[CL_HELO].is_mail_cmd = TRUE;
3682 cmd_list[CL_EHLO].is_mail_cmd = TRUE;
3683 #ifndef DISABLE_TLS
3684 cmd_list[CL_STLS].is_mail_cmd = TRUE;
3685 #endif
3686
3687 if (lwr_receive_getc != NULL)
3688   {
3689   /* This should have already happened, but if we've gotten confused,
3690   force a reset here. */
3691   DEBUG(D_receive) debug_printf("WARNING: smtp_setup_msg had to restore receive functions to lowers\n");
3692   bdat_pop_receive_functions();
3693   }
3694
3695 /* Set the local signal handler for SIGTERM - it tries to end off tidily */
3696
3697 had_command_sigterm = 0;
3698 os_non_restarting_signal(SIGTERM, command_sigterm_handler);
3699
3700 /* Batched SMTP is handled in a different function. */
3701
3702 if (smtp_batched_input) return smtp_setup_batch_msg();
3703
3704 #ifdef TCP_QUICKACK
3705 if (smtp_in)            /* Avoid pure-ACKs while in cmd pingpong phase */
3706   (void) setsockopt(fileno(smtp_in), IPPROTO_TCP, TCP_QUICKACK,
3707           US &off, sizeof(off));
3708 #endif
3709
3710 /* Deal with SMTP commands. This loop is exited by setting done to a POSITIVE
3711 value. The values are 2 larger than the required yield of the function. */
3712
3713 while (done <= 0)
3714   {
3715   const uschar **argv;
3716   uschar *etrn_command;
3717   uschar *etrn_serialize_key;
3718   uschar *errmess;
3719   uschar *log_msg, *smtp_code;
3720   uschar *user_msg = NULL;
3721   uschar *recipient = NULL;
3722   uschar *hello = NULL;
3723   uschar *s, *ss;
3724   BOOL was_rej_mail = FALSE;
3725   BOOL was_rcpt = FALSE;
3726   void (*oldsignal)(int);
3727   pid_t pid;
3728   int start, end, sender_domain, recipient_domain;
3729   int rc, c;
3730   uschar * orcpt = NULL;
3731   int dsn_flags;
3732   gstring * g;
3733
3734 #ifdef AUTH_TLS
3735   /* Check once per STARTTLS or SSL-on-connect for a TLS AUTH */
3736   if (  tls_in.active.sock >= 0
3737      && tls_in.peercert
3738      && tls_in.certificate_verified
3739      && cmd_list[CL_TLAU].is_mail_cmd
3740      )
3741     {
3742     cmd_list[CL_TLAU].is_mail_cmd = FALSE;
3743
3744     for (auth_instance * au = auths; au; au = au->next)
3745       if (strcmpic(US"tls", au->driver_name) == 0)
3746         {
3747         GET_OPTION("acl_smtp_auth");
3748         if (  acl_smtp_auth
3749            && (rc = acl_check(ACL_WHERE_AUTH, NULL, acl_smtp_auth,
3750                       &user_msg, &log_msg)) != OK
3751            )
3752           done = smtp_handle_acl_fail(ACL_WHERE_AUTH, rc, user_msg, log_msg);
3753         else
3754           {
3755           smtp_cmd_data = NULL;
3756
3757           if (smtp_in_auth(au, &s, &ss) == OK)
3758             { DEBUG(D_auth) debug_printf("tls auth succeeded\n"); }
3759           else
3760             {
3761             DEBUG(D_auth) debug_printf("tls auth not succeeded\n");
3762 #ifndef DISABLE_EVENT
3763              {
3764               uschar * save_name = sender_host_authenticated, * logmsg;
3765               sender_host_authenticated = au->name;
3766               if ((logmsg = event_raise(event_action, US"auth:fail", s, NULL)))
3767                 log_write(0, LOG_MAIN, "%s", logmsg);
3768               sender_host_authenticated = save_name;
3769              }
3770 #endif
3771             }
3772           }
3773         break;
3774         }
3775     }
3776 #endif
3777
3778   switch(smtp_read_command(
3779 #ifndef DISABLE_PIPE_CONNECT
3780           !fl.pipe_connect_acceptable,
3781 #else
3782           TRUE,
3783 #endif
3784           GETC_BUFFER_UNLIMITED))
3785     {
3786     /* The AUTH command is not permitted to occur inside a transaction, and may
3787     occur successfully only once per connection. Actually, that isn't quite
3788     true. When TLS is started, all previous information about a connection must
3789     be discarded, so a new AUTH is permitted at that time.
3790
3791     AUTH may only be used when it has been advertised. However, it seems that
3792     there are clients that send AUTH when it hasn't been advertised, some of
3793     them even doing this after HELO. And there are MTAs that accept this. Sigh.
3794     So there's a get-out that allows this to happen.
3795
3796     AUTH is initially labelled as a "nonmail command" so that one occurrence
3797     doesn't get counted. We change the label here so that multiple failing
3798     AUTHS will eventually hit the nonmail threshold. */
3799
3800     case AUTH_CMD:
3801       HAD(SCH_AUTH);
3802       authentication_failed = TRUE;
3803       cmd_list[CL_AUTH].is_mail_cmd = FALSE;
3804
3805       if (!fl.auth_advertised && !f.allow_auth_unadvertised)
3806         {
3807         done = synprot_error(L_smtp_protocol_error, 503, NULL,
3808           US"AUTH command used when not advertised");
3809         break;
3810         }
3811       if (sender_host_authenticated)
3812         {
3813         done = synprot_error(L_smtp_protocol_error, 503, NULL,
3814           US"already authenticated");
3815         break;
3816         }
3817       if (sender_address)
3818         {
3819         done = synprot_error(L_smtp_protocol_error, 503, NULL,
3820           US"not permitted in mail transaction");
3821         break;
3822         }
3823
3824       /* Check the ACL */
3825
3826       GET_OPTION("acl_smtp_auth");
3827       if (  acl_smtp_auth
3828          && (rc = acl_check(ACL_WHERE_AUTH, NULL, acl_smtp_auth,
3829                     &user_msg, &log_msg)) != OK
3830          )
3831         {
3832         done = smtp_handle_acl_fail(ACL_WHERE_AUTH, rc, user_msg, log_msg);
3833         break;
3834         }
3835
3836       /* Find the name of the requested authentication mechanism. */
3837
3838       s = smtp_cmd_data;
3839       for (; (c = *smtp_cmd_data) && !isspace(c); smtp_cmd_data++)
3840         if (!isalnum(c) && c != '-' && c != '_')
3841           {
3842           done = synprot_error(L_smtp_syntax_error, 501, NULL,
3843             US"invalid character in authentication mechanism name");
3844           goto COMMAND_LOOP;
3845           }
3846
3847       /* If not at the end of the line, we must be at white space. Terminate the
3848       name and move the pointer on to any data that may be present. */
3849
3850       if (*smtp_cmd_data)
3851         {
3852         *smtp_cmd_data++ = '\0';
3853         Uskip_whitespace(&smtp_cmd_data);
3854         }
3855
3856       /* Search for an authentication mechanism which is configured for use
3857       as a server and which has been advertised (unless, sigh, allow_auth_
3858       unadvertised is set). */
3859
3860         {
3861         auth_instance * au;
3862         uschar * smtp_resp, * errmsg;
3863
3864         for (au = auths; au; au = au->next)
3865           if (strcmpic(s, au->public_name) == 0 && au->server &&
3866               (au->advertised || f.allow_auth_unadvertised))
3867             break;
3868
3869         if (au)
3870           {
3871           int rc = smtp_in_auth(au, &smtp_resp, &errmsg);
3872
3873           smtp_printf("%s\r\n", SP_NO_MORE, smtp_resp);
3874           if (rc != OK)
3875             {
3876             uschar * logmsg = NULL;
3877 #ifndef DISABLE_EVENT
3878              {uschar * save_name = sender_host_authenticated;
3879               sender_host_authenticated = au->name;
3880               logmsg = event_raise(event_action, US"auth:fail", smtp_resp, NULL);
3881               sender_host_authenticated = save_name;
3882              }
3883 #endif
3884             if (logmsg)
3885               log_write(0, LOG_MAIN|LOG_REJECT, "%s", logmsg);
3886             else
3887               log_write(0, LOG_MAIN|LOG_REJECT, "%s authenticator failed for %s: %s",
3888                 au->name, host_and_ident(FALSE), errmsg);
3889             }
3890           }
3891         else
3892           done = synprot_error(L_smtp_protocol_error, 504, NULL,
3893             string_sprintf("%s authentication mechanism not supported", s));
3894         }
3895
3896       break;  /* AUTH_CMD */
3897
3898     /* The HELO/EHLO commands are permitted to appear in the middle of a
3899     session as well as at the beginning. They have the effect of a reset in
3900     addition to their other functions. Their absence at the start cannot be
3901     taken to be an error.
3902
3903     RFC 2821 says:
3904
3905       If the EHLO command is not acceptable to the SMTP server, 501, 500,
3906       or 502 failure replies MUST be returned as appropriate.  The SMTP
3907       server MUST stay in the same state after transmitting these replies
3908       that it was in before the EHLO was received.
3909
3910     Therefore, we do not do the reset until after checking the command for
3911     acceptability. This change was made for Exim release 4.11. Previously
3912     it did the reset first. */
3913
3914     case HELO_CMD:
3915       HAD(SCH_HELO);
3916       hello = US"HELO";
3917       fl.esmtp = FALSE;
3918       goto HELO_EHLO;
3919
3920     case EHLO_CMD:
3921       HAD(SCH_EHLO);
3922       hello = US"EHLO";
3923       fl.esmtp = TRUE;
3924
3925     HELO_EHLO:      /* Common code for HELO and EHLO */
3926       cmd_list[CL_HELO].is_mail_cmd = FALSE;
3927       cmd_list[CL_EHLO].is_mail_cmd = FALSE;
3928
3929       /* Reject the HELO if its argument was invalid or non-existent. A
3930       successful check causes the argument to be saved in malloc store. */
3931
3932       if (!check_helo(smtp_cmd_data))
3933         {
3934         smtp_printf("501 Syntactically invalid %s argument(s)\r\n", SP_NO_MORE, hello);
3935
3936         log_write(0, LOG_MAIN|LOG_REJECT, "rejected %s from %s: syntactically "
3937           "invalid argument(s): %s", hello, host_and_ident(FALSE),
3938           *smtp_cmd_argument == 0 ? US"(no argument given)" :
3939                              string_printing(smtp_cmd_argument));
3940
3941         if (++synprot_error_count > smtp_max_synprot_errors)
3942           {
3943           log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
3944             "syntax or protocol errors (last command was \"%s\", %Y)",
3945             host_and_ident(FALSE), string_printing(smtp_cmd_buffer),
3946             s_connhad_log(NULL)
3947             );
3948           done = 1;
3949           }
3950
3951         break;
3952         }
3953
3954       /* If sender_host_unknown is true, we have got here via the -bs interface,
3955       not called from inetd. Otherwise, we are running an IP connection and the
3956       host address will be set. If the helo name is the primary name of this
3957       host and we haven't done a reverse lookup, force one now. If helo_verify_required
3958       is set, ensure that the HELO name matches the actual host. If helo_verify
3959       is set, do the same check, but softly. */
3960
3961       if (!f.sender_host_unknown)
3962         {
3963         BOOL old_helo_verified = f.helo_verified;
3964         uschar * p = smtp_cmd_data;
3965
3966         while (*p && !isspace(*p)) { *p = tolower(*p); p++; }
3967         *p = '\0';
3968
3969         /* Force a reverse lookup if HELO quoted something in helo_lookup_domains
3970         because otherwise the log can be confusing. */
3971
3972         if (  !sender_host_name
3973            && match_isinlist(sender_helo_name, CUSS &helo_lookup_domains, 0,
3974                 &domainlist_anchor, NULL, MCL_DOMAIN, TRUE, NULL) == OK)
3975           (void)host_name_lookup();
3976
3977         /* Rebuild the fullhost info to include the HELO name (and the real name
3978         if it was looked up.) */
3979
3980         host_build_sender_fullhost();  /* Rebuild */
3981         set_process_info("handling%s incoming connection from %s",
3982           tls_in.active.sock >= 0 ? " TLS" : "", host_and_ident(FALSE));
3983
3984         /* Verify if configured. This doesn't give much security, but it does
3985         make some people happy to be able to do it. If helo_verify_required is set,
3986         (host matches helo_verify_hosts) failure forces rejection. If helo_verify
3987         is set (host matches helo_try_verify_hosts), it does not. This is perhaps
3988         now obsolescent, since the verification can now be requested selectively
3989         at ACL time. */
3990
3991         f.helo_verified = f.helo_verify_failed = sender_helo_dnssec = FALSE;
3992         if (fl.helo_verify_required || fl.helo_verify)
3993           {
3994           BOOL tempfail = !smtp_verify_helo();
3995           if (!f.helo_verified)
3996             {
3997             if (fl.helo_verify_required)
3998               {
3999               smtp_printf("%d %s argument does not match calling host\r\n", SP_NO_MORE,
4000                 tempfail? 451 : 550, hello);
4001               log_write(0, LOG_MAIN|LOG_REJECT, "%srejected \"%s %s\" from %s",
4002                 tempfail? "temporarily " : "",
4003                 hello, sender_helo_name, host_and_ident(FALSE));
4004               f.helo_verified = old_helo_verified;
4005               break;                   /* End of HELO/EHLO processing */
4006               }
4007             HDEBUG(D_all) debug_printf("%s verification failed but host is in "
4008               "helo_try_verify_hosts\n", hello);
4009             }
4010           }
4011         }
4012
4013 #ifdef SUPPORT_SPF
4014       /* set up SPF context */
4015       spf_conn_init(sender_helo_name, sender_host_address);
4016 #endif
4017
4018       /* Apply an ACL check if one is defined; afterwards, recheck
4019       synchronization in case the client started sending in a delay. */
4020
4021       GET_OPTION("acl_smtp_helo");
4022       if (acl_smtp_helo)
4023         if ((rc = acl_check(ACL_WHERE_HELO, NULL, acl_smtp_helo,
4024                   &user_msg, &log_msg)) != OK)
4025           {
4026           done = smtp_handle_acl_fail(ACL_WHERE_HELO, rc, user_msg, log_msg);
4027           sender_helo_name = NULL;
4028           host_build_sender_fullhost();  /* Rebuild */
4029           break;
4030           }
4031 #ifndef DISABLE_PIPE_CONNECT
4032         else if (!fl.pipe_connect_acceptable && !check_sync())
4033 #else
4034         else if (!check_sync())
4035 #endif
4036           goto SYNC_FAILURE;
4037
4038       /* Generate an OK reply. The default string includes the ident if present,
4039       and also the IP address if present. Reflecting back the ident is intended
4040       as a deterrent to mail forgers. For maximum efficiency, and also because
4041       some broken systems expect each response to be in a single packet, arrange
4042       that the entire reply is sent in one write(). */
4043
4044       fl.auth_advertised = FALSE;
4045       f.smtp_in_pipelining_advertised = FALSE;
4046 #ifndef DISABLE_TLS
4047       fl.tls_advertised = FALSE;
4048 #endif
4049       fl.dsn_advertised = FALSE;
4050 #ifdef SUPPORT_I18N
4051       fl.smtputf8_advertised = FALSE;
4052 #endif
4053
4054       /* Expand the per-connection message count limit option */
4055       smtp_mailcmd_max = expand_mailmax(smtp_accept_max_per_connection);
4056
4057       smtp_code = US"250 ";        /* Default response code plus space*/
4058       if (!user_msg)
4059         {
4060         /* sender_host_name below will be tainted, so save on copy when we hit it */
4061         g = string_get_tainted(24, GET_TAINTED);
4062         g = string_fmt_append(g, "%.3s %s Hello %s%s%s",
4063           smtp_code,
4064           smtp_active_hostname,
4065           sender_ident ? sender_ident : US"",
4066           sender_ident ? US" at " : US"",
4067           sender_host_name ? sender_host_name : sender_helo_name);
4068
4069         if (sender_host_address)
4070           g = string_fmt_append(g, " [%s]", sender_host_address);
4071         }
4072
4073       /* A user-supplied EHLO greeting may not contain more than one line. Note
4074       that the code returned by smtp_message_code() includes the terminating
4075       whitespace character. */
4076
4077       else
4078         {
4079         char * ss;
4080         int codelen = 4;
4081         smtp_message_code(&smtp_code, &codelen, &user_msg, NULL, TRUE);
4082         s = string_sprintf("%.*s%s", codelen, smtp_code, user_msg);
4083         if ((ss = strpbrk(CS s, "\r\n")) != NULL)
4084           {
4085           log_write(0, LOG_MAIN|LOG_PANIC, "EHLO/HELO response must not contain "
4086             "newlines: message truncated: %s", string_printing(s));
4087           *ss = 0;
4088           }
4089         g = string_cat(NULL, s);
4090         }
4091
4092       g = string_catn(g, US"\r\n", 2);
4093
4094       /* If we received EHLO, we must create a multiline response which includes
4095       the functions supported. */
4096
4097       if (fl.esmtp)
4098         {
4099         g->s[3] = '-';  /* overwrite the space after the SMTP response code */
4100
4101         /* I'm not entirely happy with this, as an MTA is supposed to check
4102         that it has enough room to accept a message of maximum size before
4103         it sends this. However, there seems little point in not sending it.
4104         The actual size check happens later at MAIL FROM time. By postponing it
4105         till then, VRFY and EXPN can be used after EHLO when space is short. */
4106
4107         if (thismessage_size_limit > 0)
4108           g = string_fmt_append(g, "%.3s-SIZE %d\r\n", smtp_code,
4109             thismessage_size_limit);
4110         else
4111           {
4112           g = string_catn(g, smtp_code, 3);
4113           g = string_catn(g, US"-SIZE\r\n", 7);
4114           }
4115
4116 #ifndef DISABLE_ESMTP_LIMITS
4117         if (  (smtp_mailcmd_max > 0 || recipients_max_expanded > 0)
4118            && verify_check_host(&limits_advertise_hosts) == OK)
4119           {
4120           g = string_fmt_append(g, "%.3s-LIMITS", smtp_code);
4121           if (smtp_mailcmd_max > 0)
4122             g = string_fmt_append(g, " MAILMAX=%d", smtp_mailcmd_max);
4123           if (recipients_max_expanded > 0)
4124             g = string_fmt_append(g, " RCPTMAX=%d", recipients_max_expanded);
4125           g = string_catn(g, US"\r\n", 2);
4126           }
4127 #endif
4128
4129         /* Exim does not do protocol conversion or data conversion. It is 8-bit
4130         clean; if it has an 8-bit character in its hand, it just sends it. It
4131         cannot therefore specify 8BITMIME and remain consistent with the RFCs.
4132         However, some users want this option simply in order to stop MUAs
4133         mangling messages that contain top-bit-set characters. It is therefore
4134         provided as an option. */
4135
4136         if (accept_8bitmime)
4137           {
4138           g = string_catn(g, smtp_code, 3);
4139           g = string_catn(g, US"-8BITMIME\r\n", 11);
4140           }
4141
4142         /* Advertise DSN support if configured to do so. */
4143         if (verify_check_host(&dsn_advertise_hosts) != FAIL)
4144           {
4145           g = string_catn(g, smtp_code, 3);
4146           g = string_catn(g, US"-DSN\r\n", 6);
4147           fl.dsn_advertised = TRUE;
4148           }
4149
4150         /* Advertise ETRN/VRFY/EXPN if there's are ACL checking whether a host is
4151         permitted to issue them; a check is made when any host actually tries. */
4152
4153         GET_OPTION("acl_smtp_etrn");
4154         if (acl_smtp_etrn)
4155           {
4156           g = string_catn(g, smtp_code, 3);
4157           g = string_catn(g, US"-ETRN\r\n", 7);
4158           }
4159         GET_OPTION("acl_smtp_vrfy");
4160         if (acl_smtp_vrfy)
4161           {
4162           g = string_catn(g, smtp_code, 3);
4163           g = string_catn(g, US"-VRFY\r\n", 7);
4164           }
4165         GET_OPTION("acl_smtp_expn");
4166         if (acl_smtp_expn)
4167           {
4168           g = string_catn(g, smtp_code, 3);
4169           g = string_catn(g, US"-EXPN\r\n", 7);
4170           }
4171
4172         /* Exim is quite happy with pipelining, so let the other end know that
4173         it is safe to use it, unless advertising is disabled. */
4174
4175         if (  f.pipelining_enable
4176            && verify_check_host(&pipelining_advertise_hosts) == OK)
4177           {
4178           g = string_catn(g, smtp_code, 3);
4179           g = string_catn(g, US"-PIPELINING\r\n", 13);
4180           sync_cmd_limit = NON_SYNC_CMD_PIPELINING;
4181           f.smtp_in_pipelining_advertised = TRUE;
4182
4183 #ifndef DISABLE_PIPE_CONNECT
4184           if (fl.pipe_connect_acceptable)
4185             {
4186             f.smtp_in_early_pipe_advertised = TRUE;
4187             g = string_catn(g, smtp_code, 3);
4188             g = string_catn(g, US"-" EARLY_PIPE_FEATURE_NAME "\r\n", EARLY_PIPE_FEATURE_LEN+3);
4189             }
4190 #endif
4191           }
4192
4193
4194         /* If any server authentication mechanisms are configured, advertise
4195         them if the current host is in auth_advertise_hosts. The problem with
4196         advertising always is that some clients then require users to
4197         authenticate (and aren't configurable otherwise) even though it may not
4198         be necessary (e.g. if the host is in host_accept_relay).
4199
4200         RFC 2222 states that SASL mechanism names contain only upper case
4201         letters, so output the names in upper case, though we actually recognize
4202         them in either case in the AUTH command. */
4203
4204         if (  auths
4205 #ifdef AUTH_TLS
4206            && !sender_host_authenticated
4207 #endif
4208            && verify_check_host(&auth_advertise_hosts) == OK
4209            )
4210           {
4211           BOOL first = TRUE;
4212           for (auth_instance * au = auths; au; au = au->next)
4213             {
4214             au->advertised = FALSE;
4215             if (au->server)
4216               {
4217               DEBUG(D_auth+D_expand) debug_printf_indent(
4218                 "Evaluating advertise_condition for %s %s athenticator\n",
4219                 au->name, au->public_name);
4220               if (  !au->advertise_condition
4221                  || expand_check_condition(au->advertise_condition, au->name,
4222                         US"authenticator")
4223                  )
4224                 {
4225                 int saveptr;
4226                 if (first)
4227                   {
4228                   g = string_catn(g, smtp_code, 3);
4229                   g = string_catn(g, US"-AUTH", 5);
4230                   first = FALSE;
4231                   fl.auth_advertised = TRUE;
4232                   }
4233                 saveptr = gstring_length(g);
4234                 g = string_catn(g, US" ", 1);
4235                 g = string_cat(g, au->public_name);
4236                 while (++saveptr < g->ptr) g->s[saveptr] = toupper(g->s[saveptr]);
4237                 au->advertised = TRUE;
4238                 }
4239               }
4240             }
4241
4242           if (!first) g = string_catn(g, US"\r\n", 2);
4243           }
4244
4245         /* RFC 3030 CHUNKING */
4246
4247         if (verify_check_host(&chunking_advertise_hosts) != FAIL)
4248           {
4249           g = string_catn(g, smtp_code, 3);
4250           g = string_catn(g, US"-CHUNKING\r\n", 11);
4251           f.chunking_offered = TRUE;
4252           chunking_state = CHUNKING_OFFERED;
4253           }
4254
4255 #ifndef DISABLE_TLS
4256         /* Advertise TLS (Transport Level Security) aka SSL (Secure Socket Layer)
4257         if it has been included in the binary, and the host matches
4258         tls_advertise_hosts. We must *not* advertise if we are already in a
4259         secure connection. */
4260
4261         if (tls_in.active.sock < 0 &&
4262             verify_check_host(&tls_advertise_hosts) != FAIL)
4263           {
4264           g = string_catn(g, smtp_code, 3);
4265           g = string_catn(g, US"-STARTTLS\r\n", 11);
4266           fl.tls_advertised = TRUE;
4267           }
4268 #endif
4269 #ifdef EXPERIMENTAL_XCLIENT
4270         if (proxy_session || verify_check_host(&hosts_xclient) != FAIL)
4271           {
4272           g = string_catn(g, smtp_code, 3);
4273           g = xclient_smtp_advertise_str(g);
4274           }
4275 #endif
4276 #ifndef DISABLE_PRDR
4277         /* Per Recipient Data Response, draft by Eric A. Hall extending RFC */
4278         if (prdr_enable)
4279           {
4280           g = string_catn(g, smtp_code, 3);
4281           g = string_catn(g, US"-PRDR\r\n", 7);
4282           }
4283 #endif
4284
4285 #ifdef SUPPORT_I18N
4286         if (  accept_8bitmime
4287            && verify_check_host(&smtputf8_advertise_hosts) != FAIL)
4288           {
4289           g = string_catn(g, smtp_code, 3);
4290           g = string_catn(g, US"-SMTPUTF8\r\n", 11);
4291           fl.smtputf8_advertised = TRUE;
4292           }
4293 #endif
4294 #ifndef DISABLE_WELLKNOWN
4295         if (verify_check_host(&wellknown_advertise_hosts) != FAIL)
4296           {
4297           g = string_catn(g, smtp_code, 3);
4298           g = string_catn(g, US"-WELLKNOWN\r\n", 12);
4299           }
4300 #endif
4301
4302         /* Finish off the multiline reply with one that is always available. */
4303
4304         g = string_catn(g, smtp_code, 3);
4305         g = string_catn(g, US" HELP\r\n", 7);
4306         }
4307
4308       /* Terminate the string (for debug), write it, and note that HELO/EHLO
4309       has been seen. */
4310
4311        {
4312         uschar * ehlo_resp;
4313         int len = len_string_from_gstring(g, &ehlo_resp);
4314 #ifndef DISABLE_TLS
4315         if (tls_in.active.sock >= 0)
4316           (void) tls_write(NULL, ehlo_resp, len,
4317 # ifndef DISABLE_PIPE_CONNECT
4318                           fl.pipe_connect_acceptable && pipeline_connect_sends());
4319 # else
4320                           FALSE);
4321 # endif
4322         else
4323 #endif
4324           (void) fwrite(ehlo_resp, 1, len, smtp_out);
4325
4326         DEBUG(D_receive) for (const uschar * t, * s = ehlo_resp;
4327                               s && (t = Ustrchr(s, '\r'));
4328                               s = t + 2)                                /* \r\n */
4329             debug_printf("%s %.*s\n",
4330                           s == g->s ? "SMTP>>" : "      ",
4331                           (int)(t - s), s);
4332         fl.helo_seen = TRUE;
4333        }
4334
4335       /* Reset the protocol and the state, abandoning any previous message. */
4336       received_protocol =
4337         (sender_host_address ? protocols : protocols_local)
4338           [ (fl.esmtp
4339             ? pextend + (sender_host_authenticated ? pauthed : 0)
4340             : pnormal)
4341           + (tls_in.active.sock >= 0 ? pcrpted : 0)
4342           ];
4343       cancel_cutthrough_connection(TRUE, US"sent EHLO response");
4344       reset_point = smtp_reset(reset_point);
4345       toomany = FALSE;
4346       break;   /* HELO/EHLO */
4347
4348 #ifndef DISABLE_WELLKNOWN
4349     case WELLKNOWN_CMD:
4350       HAD(SCH_WELLKNOWN);
4351       smtp_mailcmd_count++;
4352       smtp_wellknown_handler();
4353       break;
4354 #endif
4355
4356 #ifdef EXPERIMENTAL_XCLIENT
4357     case XCLIENT_CMD:
4358       {
4359       BOOL fatal = fl.helo_seen;
4360       uschar * errmsg;
4361       int resp;
4362
4363       HAD(SCH_XCLIENT);
4364       smtp_mailcmd_count++;
4365
4366       if ((errmsg = xclient_smtp_command(smtp_cmd_data, &resp, &fatal)))
4367         if (fatal)
4368           done = synprot_error(L_smtp_syntax_error, resp, NULL, errmsg);
4369         else
4370           {
4371           smtp_printf("%d %s\r\n", SP_NO_MORE, resp, errmsg);
4372           log_write(0, LOG_MAIN|LOG_REJECT, "rejected XCLIENT from %s: %s",
4373             host_and_ident(FALSE), errmsg);
4374           }
4375       else
4376         {
4377         fl.helo_seen = FALSE;                   /* Require another EHLO */
4378         smtp_code = string_sprintf("%d", resp);
4379
4380         /*XXX unclear in spec. if this needs to be an ESMTP banner,
4381         nor whether we get the original client's HELO after (or a proxy fake).
4382         We require that we do; the following HELO/EHLO handling will set
4383         sender_helo_name as normal. */
4384
4385         smtp_printf("%s XCLIENT success\r\n", SP_NO_MORE, smtp_code);
4386         }
4387       break; /* XCLIENT */
4388       }
4389 #endif
4390
4391
4392     /* The MAIL command requires an address as an operand. All we do
4393     here is to parse it for syntactic correctness. The form "<>" is
4394     a special case which converts into an empty string. The start/end
4395     pointers in the original are not used further for this address, as
4396     it is the canonical extracted address which is all that is kept. */
4397
4398     case MAIL_CMD:
4399       HAD(SCH_MAIL);
4400       smtp_mailcmd_count++;              /* Count for limit and ratelimit */
4401       message_start();
4402       was_rej_mail = TRUE;               /* Reset if accepted */
4403       env_mail_type_t * mail_args;       /* Sanity check & validate args */
4404
4405       if (!fl.helo_seen)
4406         if (  fl.helo_verify_required
4407            || verify_check_host(&hosts_require_helo) == OK)
4408           {
4409           log_write(0, LOG_MAIN|LOG_REJECT, "rejected MAIL from %s: no "
4410             "HELO/EHLO given", host_and_ident(FALSE));
4411           done = synprot_error(L_smtp_protocol_error, 503, NULL,
4412                       US"HELO or EHLO required");
4413           break;
4414           }
4415         else if (smtp_mailcmd_max < 0)
4416           smtp_mailcmd_max = expand_mailmax(smtp_accept_max_per_connection);
4417
4418       if (sender_address)
4419         {
4420         done = synprot_error(L_smtp_protocol_error, 503, NULL,
4421           US"sender already given");
4422         break;
4423         }
4424
4425       if (!*smtp_cmd_data)
4426         {
4427         done = synprot_error(L_smtp_protocol_error, 501, NULL,
4428           US"MAIL must have an address operand");
4429         break;
4430         }
4431
4432       /* Check to see if the limit for messages per connection would be
4433       exceeded by accepting further messages. */
4434
4435       if (smtp_mailcmd_max > 0 && smtp_mailcmd_count > smtp_mailcmd_max)
4436         {
4437         smtp_printf("421 too many messages in this connection\r\n", SP_NO_MORE);
4438         log_write(0, LOG_MAIN|LOG_REJECT, "rejected MAIL command %s: too many "
4439           "messages in one connection", host_and_ident(TRUE));
4440         break;
4441         }
4442
4443       /* Reset for start of message - even if this is going to fail, we
4444       obviously need to throw away any previous data. */
4445
4446       cancel_cutthrough_connection(TRUE, US"MAIL received");
4447       reset_point = smtp_reset(reset_point);
4448       toomany = FALSE;
4449       sender_data = recipient_data = NULL;
4450
4451       /* Loop, checking for ESMTP additions to the MAIL FROM command. */
4452
4453       if (fl.esmtp) for(;;)
4454         {
4455         uschar *name, *value, *end;
4456         unsigned long int size;
4457         BOOL arg_error = FALSE;
4458
4459         if (!extract_option(&name, &value)) break;
4460
4461         for (mail_args = env_mail_type_list;
4462              mail_args->value != ENV_MAIL_OPT_NULL;
4463              mail_args++
4464             )
4465           if (strcmpic(name, mail_args->name) == 0)
4466             break;
4467         if (mail_args->need_value && strcmpic(value, US"") == 0)
4468           break;
4469
4470         switch(mail_args->value)
4471           {
4472           /* Handle SIZE= by reading the value. We don't do the check till later,
4473           in order to be able to log the sender address on failure. */
4474           case ENV_MAIL_OPT_SIZE:
4475             if (((size = Ustrtoul(value, &end, 10)), *end == 0))
4476               {
4477               if ((size == ULONG_MAX && errno == ERANGE) || size > INT_MAX)
4478                 size = INT_MAX;
4479               message_size = (int)size;
4480               }
4481             else
4482               arg_error = TRUE;
4483             break;
4484
4485           /* If this session was initiated with EHLO and accept_8bitmime is set,
4486           Exim will have indicated that it supports the BODY=8BITMIME option. In
4487           fact, it does not support this according to the RFCs, in that it does not
4488           take any special action for forwarding messages containing 8-bit
4489           characters. That is why accept_8bitmime is not the default setting, but
4490           some sites want the action that is provided. We recognize both "8BITMIME"
4491           and "7BIT" as body types, but take no action. */
4492           case ENV_MAIL_OPT_BODY:
4493             if (accept_8bitmime) {
4494               if (strcmpic(value, US"8BITMIME") == 0)
4495                 body_8bitmime = 8;
4496               else if (strcmpic(value, US"7BIT") == 0)
4497                 body_8bitmime = 7;
4498               else
4499                 {
4500                 body_8bitmime = 0;
4501                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4502                   US"invalid data for BODY");
4503                 goto COMMAND_LOOP;
4504                 }
4505               DEBUG(D_receive) debug_printf("8BITMIME: %d\n", body_8bitmime);
4506               break;
4507             }
4508             arg_error = TRUE;
4509             break;
4510
4511           /* Handle the two DSN options, but only if configured to do so (which
4512           will have caused "DSN" to be given in the EHLO response). The code itself
4513           is included only if configured in at build time. */
4514
4515           case ENV_MAIL_OPT_RET:
4516             if (fl.dsn_advertised)
4517               {
4518               /* Check if RET has already been set */
4519               if (dsn_ret > 0)
4520                 {
4521                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4522                   US"RET can be specified once only");
4523                 goto COMMAND_LOOP;
4524                 }
4525               dsn_ret = strcmpic(value, US"HDRS") == 0
4526                 ? dsn_ret_hdrs
4527                 : strcmpic(value, US"FULL") == 0
4528                 ? dsn_ret_full
4529                 : 0;
4530               DEBUG(D_receive) debug_printf("DSN_RET: %d\n", dsn_ret);
4531               /* Check for invalid invalid value, and exit with error */
4532               if (dsn_ret == 0)
4533                 {
4534                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4535                   US"Value for RET is invalid");
4536                 goto COMMAND_LOOP;
4537                 }
4538               }
4539             break;
4540           case ENV_MAIL_OPT_ENVID:
4541             if (fl.dsn_advertised)
4542               {
4543               /* Check if the dsn envid has been already set */
4544               if (dsn_envid)
4545                 {
4546                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4547                   US"ENVID can be specified once only");
4548                 goto COMMAND_LOOP;
4549                 }
4550               dsn_envid = string_copy(value);
4551               DEBUG(D_receive) debug_printf("DSN_ENVID: %s\n", dsn_envid);
4552               }
4553             break;
4554
4555           /* Handle the AUTH extension. If the value given is not "<>" and either
4556           the ACL says "yes" or there is no ACL but the sending host is
4557           authenticated, we set it up as the authenticated sender. However, if the
4558           authenticator set a condition to be tested, we ignore AUTH on MAIL unless
4559           the condition is met. The value of AUTH is an xtext, which means that +,
4560           = and cntrl chars are coded in hex; however "<>" is unaffected by this
4561           coding. */
4562           case ENV_MAIL_OPT_AUTH:
4563             if (Ustrcmp(value, "<>") != 0)
4564               {
4565               int rc;
4566               uschar *ignore_msg;
4567
4568               if (auth_xtextdecode(value, &authenticated_sender) < 0)
4569                 {
4570                 /* Put back terminator overrides for error message */
4571                 value[-1] = '=';
4572                 name[-1] = ' ';
4573                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4574                   US"invalid data for AUTH");
4575                 goto COMMAND_LOOP;
4576                 }
4577               GET_OPTION("acl_smtp_mailauth");
4578               if (!acl_smtp_mailauth)
4579                 {
4580                 ignore_msg = US"client not authenticated";
4581                 rc = sender_host_authenticated ? OK : FAIL;
4582                 }
4583               else
4584                 {
4585                 ignore_msg = US"rejected by ACL";
4586                 rc = acl_check(ACL_WHERE_MAILAUTH, NULL, acl_smtp_mailauth,
4587                   &user_msg, &log_msg);
4588                 }
4589
4590               switch (rc)
4591                 {
4592                 case OK:
4593                   if (authenticated_by == NULL ||
4594                       authenticated_by->mail_auth_condition == NULL ||
4595                       expand_check_condition(authenticated_by->mail_auth_condition,
4596                           authenticated_by->name, US"authenticator"))
4597                     break;     /* Accept the AUTH */
4598
4599                   ignore_msg = US"server_mail_auth_condition failed";
4600                   if (authenticated_id != NULL)
4601                     ignore_msg = string_sprintf("%s: authenticated ID=\"%s\"",
4602                       ignore_msg, authenticated_id);
4603
4604                 /* Fall through */
4605
4606                 case FAIL:
4607                   authenticated_sender = NULL;
4608                   log_write(0, LOG_MAIN, "ignoring AUTH=%s from %s (%s)",
4609                     value, host_and_ident(TRUE), ignore_msg);
4610                   break;
4611
4612                 /* Should only get DEFER or ERROR here. Put back terminator
4613                 overrides for error message */
4614
4615                 default:
4616                   value[-1] = '=';
4617                   name[-1] = ' ';
4618                   (void)smtp_handle_acl_fail(ACL_WHERE_MAILAUTH, rc, user_msg,
4619                     log_msg);
4620                   goto COMMAND_LOOP;
4621                 }
4622               }
4623               break;
4624
4625 #ifndef DISABLE_PRDR
4626           case ENV_MAIL_OPT_PRDR:
4627             if (prdr_enable)
4628               prdr_requested = TRUE;
4629             break;
4630 #endif
4631
4632 #ifdef SUPPORT_I18N
4633           case ENV_MAIL_OPT_UTF8:
4634             if (!fl.smtputf8_advertised)
4635               {
4636               done = synprot_error(L_smtp_syntax_error, 501, NULL,
4637                 US"SMTPUTF8 used when not advertised");
4638               goto COMMAND_LOOP;
4639               }
4640
4641             DEBUG(D_receive) debug_printf("smtputf8 requested\n");
4642             message_smtputf8 = allow_utf8_domains = TRUE;
4643             if (Ustrncmp(received_protocol, US"utf8", 4) != 0)
4644               {
4645               int old_pool = store_pool;
4646               store_pool = POOL_PERM;
4647               received_protocol = string_sprintf("utf8%s", received_protocol);
4648               store_pool = old_pool;
4649               }
4650             break;
4651 #endif
4652
4653           /* No valid option. Stick back the terminator characters and break
4654           the loop.  Do the name-terminator second as extract_option sets
4655           value==name when it found no equal-sign.
4656           An error for a malformed address will occur. */
4657           case ENV_MAIL_OPT_NULL:
4658             value[-1] = '=';
4659             name[-1] = ' ';
4660             arg_error = TRUE;
4661             break;
4662
4663           default:  assert(0);
4664           }
4665         /* Break out of for loop if switch() had bad argument or
4666            when start of the email address is reached */
4667         if (arg_error) break;
4668         }
4669
4670       /* If we have passed the threshold for rate limiting, apply the current
4671       delay, and update it for next time, provided this is a limited host. */
4672
4673       if (smtp_mailcmd_count > smtp_rlm_threshold &&
4674           verify_check_host(&smtp_ratelimit_hosts) == OK)
4675         {
4676         DEBUG(D_receive) debug_printf("rate limit MAIL: delay %.3g sec\n",
4677           smtp_delay_mail/1000.0);
4678         millisleep((int)smtp_delay_mail);
4679         smtp_delay_mail *= smtp_rlm_factor;
4680         if (smtp_delay_mail > (double)smtp_rlm_limit)
4681           smtp_delay_mail = (double)smtp_rlm_limit;
4682         }
4683
4684       /* Now extract the address, first applying any SMTP-time rewriting. The
4685       TRUE flag allows "<>" as a sender address. */
4686
4687       raw_sender = rewrite_existflags & rewrite_smtp
4688         /* deconst ok as smtp_cmd_data was not const */
4689         ? US rewrite_one(smtp_cmd_data, rewrite_smtp, NULL, FALSE, US"",
4690                       global_rewrite_rules)
4691         : smtp_cmd_data;
4692
4693       raw_sender =
4694         parse_extract_address(raw_sender, &errmess, &start, &end, &sender_domain,
4695           TRUE);
4696
4697       if (!raw_sender)
4698         {
4699         done = synprot_error(L_smtp_syntax_error, 501, smtp_cmd_data, errmess);
4700         break;
4701         }
4702
4703       sender_address = raw_sender;
4704
4705       /* If there is a configured size limit for mail, check that this message
4706       doesn't exceed it. The check is postponed to this point so that the sender
4707       can be logged. */
4708
4709       if (thismessage_size_limit > 0 && message_size > thismessage_size_limit)
4710         {
4711         smtp_printf("552 Message size exceeds maximum permitted\r\n", SP_NO_MORE);
4712         log_write(L_size_reject,
4713             LOG_MAIN|LOG_REJECT, "rejected MAIL FROM:<%s> %s: "
4714             "message too big: size%s=%d max=%d",
4715             sender_address,
4716             host_and_ident(TRUE),
4717             (message_size == INT_MAX)? ">" : "",
4718             message_size,
4719             thismessage_size_limit);
4720         sender_address = NULL;
4721         break;
4722         }
4723
4724       /* Check there is enough space on the disk unless configured not to.
4725       When smtp_check_spool_space is set, the check is for thismessage_size_limit
4726       plus the current message - i.e. we accept the message only if it won't
4727       reduce the space below the threshold. Add 5000 to the size to allow for
4728       overheads such as the Received: line and storing of recipients, etc.
4729       By putting the check here, even when SIZE is not given, it allow VRFY
4730       and EXPN etc. to be used when space is short. */
4731
4732       if (!receive_check_fs(
4733            smtp_check_spool_space && message_size >= 0
4734               ? message_size + 5000 : 0))
4735         {
4736         smtp_printf("452 Space shortage, please try later\r\n", SP_NO_MORE);
4737         sender_address = NULL;
4738         break;
4739         }
4740
4741       /* If sender_address is unqualified, reject it, unless this is a locally
4742       generated message, or the sending host or net is permitted to send
4743       unqualified addresses - typically local machines behaving as MUAs -
4744       in which case just qualify the address. The flag is set above at the start
4745       of the SMTP connection. */
4746
4747       if (!sender_domain && *sender_address)
4748         if (f.allow_unqualified_sender)
4749           {
4750           sender_domain = Ustrlen(sender_address) + 1;
4751           /* deconst ok as sender_address was not const */
4752           sender_address = US rewrite_address_qualify(sender_address, FALSE);
4753           DEBUG(D_receive) debug_printf("unqualified address %s accepted\n",
4754             raw_sender);
4755           }
4756         else
4757           {
4758           smtp_printf("501 %s: sender address must contain a domain\r\n", SP_NO_MORE,
4759             smtp_cmd_data);
4760           log_write(L_smtp_syntax_error,
4761             LOG_MAIN|LOG_REJECT,
4762             "unqualified sender rejected: <%s> %s%s",
4763             raw_sender,
4764             host_and_ident(TRUE),
4765             host_lookup_msg);
4766           sender_address = NULL;
4767           break;
4768           }
4769
4770       /* Apply an ACL check if one is defined, before responding. Afterwards,
4771       when pipelining is not advertised, do another sync check in case the ACL
4772       delayed and the client started sending in the meantime. */
4773
4774       GET_OPTION("acl_smtp_mail");
4775       if (acl_smtp_mail)
4776         {
4777         rc = acl_check(ACL_WHERE_MAIL, NULL, acl_smtp_mail, &user_msg, &log_msg);
4778         if (rc == OK && !f.smtp_in_pipelining_advertised && !check_sync())
4779           goto SYNC_FAILURE;
4780         }
4781       else
4782         rc = OK;
4783
4784       if (rc == OK || rc == DISCARD)
4785         {
4786         BOOL more = pipeline_response();
4787
4788         if (!user_msg)
4789           smtp_printf("%s%s%s", more, US"250 OK",
4790                     #ifndef DISABLE_PRDR
4791                       prdr_requested ? US", PRDR Requested" : US"",
4792                     #else
4793                       US"",
4794                     #endif
4795                       US"\r\n");
4796         else
4797           {
4798         #ifndef DISABLE_PRDR
4799           if (prdr_requested)
4800              user_msg = string_sprintf("%s%s", user_msg, US", PRDR Requested");
4801         #endif
4802           smtp_user_msg(US"250", user_msg);
4803           }
4804         smtp_delay_rcpt = smtp_rlr_base;
4805         f.recipients_discarded = (rc == DISCARD);
4806         was_rej_mail = FALSE;
4807         }
4808       else
4809         {
4810         done = smtp_handle_acl_fail(ACL_WHERE_MAIL, rc, user_msg, log_msg);
4811         sender_address = NULL;
4812         }
4813       break;
4814
4815
4816     /* The RCPT command requires an address as an operand. There may be any
4817     number of RCPT commands, specifying multiple recipients. We build them all
4818     into a data structure. The start/end values given by parse_extract_address
4819     are not used, as we keep only the extracted address. */
4820
4821     case RCPT_CMD:
4822       HAD(SCH_RCPT);
4823       /* We got really to many recipients. A check against configured
4824       limits is done later */
4825       if (rcpt_count < 0 || rcpt_count >= INT_MAX/2)
4826         log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Too many recipients: %d", rcpt_count);
4827       rcpt_count++;
4828       was_rcpt = fl.rcpt_in_progress = TRUE;
4829
4830       /* There must be a sender address; if the sender was rejected and
4831       pipelining was advertised, we assume the client was pipelining, and do not
4832       count this as a protocol error. Reset was_rej_mail so that further RCPTs
4833       get the same treatment. */
4834
4835       if (!sender_address)
4836         {
4837         if (f.smtp_in_pipelining_advertised && last_was_rej_mail)
4838           {
4839           smtp_printf("503 sender not yet given\r\n", SP_NO_MORE);
4840           was_rej_mail = TRUE;
4841           }
4842         else
4843           {
4844           done = synprot_error(L_smtp_protocol_error, 503, NULL,
4845             US"sender not yet given");
4846           was_rcpt = FALSE;             /* Not a valid RCPT */
4847           }
4848         rcpt_fail_count++;
4849         break;
4850         }
4851
4852       /* Check for an operand */
4853
4854       if (!smtp_cmd_data[0])
4855         {
4856         done = synprot_error(L_smtp_syntax_error, 501, NULL,
4857           US"RCPT must have an address operand");
4858         rcpt_fail_count++;
4859         break;
4860         }
4861
4862       /* Set the DSN flags orcpt and dsn_flags from the session*/
4863       orcpt = NULL;
4864       dsn_flags = 0;
4865
4866       if (fl.esmtp) for(;;)
4867         {
4868         uschar *name, *value;
4869
4870         if (!extract_option(&name, &value))
4871           break;
4872
4873         if (fl.dsn_advertised && strcmpic(name, US"ORCPT") == 0)
4874           {
4875           /* Check whether orcpt has been already set */
4876           if (orcpt)
4877             {
4878             done = synprot_error(L_smtp_syntax_error, 501, NULL,
4879               US"ORCPT can be specified once only");
4880             goto COMMAND_LOOP;
4881             }
4882           orcpt = string_copy(value);
4883           DEBUG(D_receive) debug_printf("DSN orcpt: %s\n", orcpt);
4884           }
4885
4886         else if (fl.dsn_advertised && strcmpic(name, US"NOTIFY") == 0)
4887           {
4888           /* Check if the notify flags have been already set */
4889           if (dsn_flags > 0)
4890             {
4891             done = synprot_error(L_smtp_syntax_error, 501, NULL,
4892                 US"NOTIFY can be specified once only");
4893             goto COMMAND_LOOP;
4894             }
4895           if (strcmpic(value, US"NEVER") == 0)
4896             dsn_flags |= rf_notify_never;
4897           else
4898             {
4899             uschar *p = value;
4900             while (*p != 0)
4901               {
4902               uschar *pp = p;
4903               while (*pp != 0 && *pp != ',') pp++;
4904               if (*pp == ',') *pp++ = 0;
4905               if (strcmpic(p, US"SUCCESS") == 0)
4906                 {
4907                 DEBUG(D_receive) debug_printf("DSN: Setting notify success\n");
4908                 dsn_flags |= rf_notify_success;
4909                 }
4910               else if (strcmpic(p, US"FAILURE") == 0)
4911                 {
4912                 DEBUG(D_receive) debug_printf("DSN: Setting notify failure\n");
4913                 dsn_flags |= rf_notify_failure;
4914                 }
4915               else if (strcmpic(p, US"DELAY") == 0)
4916                 {
4917                 DEBUG(D_receive) debug_printf("DSN: Setting notify delay\n");
4918                 dsn_flags |= rf_notify_delay;
4919                 }
4920               else
4921                 {
4922                 /* Catch any strange values */
4923                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4924                   US"Invalid value for NOTIFY parameter");
4925                 goto COMMAND_LOOP;
4926                 }
4927               p = pp;
4928               }
4929               DEBUG(D_receive) debug_printf("DSN Flags: %x\n", dsn_flags);
4930             }
4931           }
4932
4933         /* Unknown option. Stick back the terminator characters and break
4934         the loop. An error for a malformed address will occur. */
4935
4936         else
4937           {
4938           DEBUG(D_receive) debug_printf("Invalid RCPT option: %s : %s\n", name, value);
4939           name[-1] = ' ';
4940           value[-1] = '=';
4941           break;
4942           }
4943         }
4944
4945       /* Apply SMTP rewriting then extract the working address. Don't allow "<>"
4946       as a recipient address */
4947
4948       recipient = rewrite_existflags & rewrite_smtp
4949         /* deconst ok as smtp_cmd_data was not const */
4950         ? US rewrite_one(smtp_cmd_data, rewrite_smtp, NULL, FALSE, US"",
4951             global_rewrite_rules)
4952         : smtp_cmd_data;
4953
4954       if (!(recipient = parse_extract_address(recipient, &errmess, &start, &end,
4955         &recipient_domain, FALSE)))
4956         {
4957         done = synprot_error(L_smtp_syntax_error, 501, smtp_cmd_data, errmess);
4958         rcpt_fail_count++;
4959         break;
4960         }
4961
4962       /* If the recipient address is unqualified, reject it, unless this is a
4963       locally generated message. However, unqualified addresses are permitted
4964       from a configured list of hosts and nets - typically when behaving as
4965       MUAs rather than MTAs. Sad that SMTP is used for both types of traffic,
4966       really. The flag is set at the start of the SMTP connection.
4967
4968       RFC 1123 talks about supporting "the reserved mailbox postmaster"; I always
4969       assumed this meant "reserved local part", but the revision of RFC 821 and
4970       friends now makes it absolutely clear that it means *mailbox*. Consequently
4971       we must always qualify this address, regardless. */
4972
4973       if (!recipient_domain)
4974         if (!(recipient_domain = qualify_recipient(&recipient, smtp_cmd_data,
4975                                     US"recipient")))
4976           {
4977           rcpt_fail_count++;
4978           break;
4979           }
4980
4981       /* Check maximum allowed */
4982
4983       if (  rcpt_count+1 < 0
4984          || rcpt_count > recipients_max_expanded && recipients_max_expanded > 0)
4985         {
4986         if (recipients_max_reject)
4987           {
4988           rcpt_fail_count++;
4989           smtp_printf("552 too many recipients\r\n", SP_NO_MORE);
4990           if (!toomany)
4991             log_write(0, LOG_MAIN|LOG_REJECT, "too many recipients: message "
4992               "rejected: sender=<%s> %s", sender_address, host_and_ident(TRUE));
4993           }
4994         else
4995           {
4996           rcpt_defer_count++;
4997           smtp_printf("452 too many recipients\r\n", SP_NO_MORE);
4998           if (!toomany)
4999             log_write(0, LOG_MAIN|LOG_REJECT, "too many recipients: excess "
5000               "temporarily rejected: sender=<%s> %s", sender_address,
5001               host_and_ident(TRUE));
5002           }
5003
5004         toomany = TRUE;
5005         break;
5006         }
5007
5008       /* If we have passed the threshold for rate limiting, apply the current
5009       delay, and update it for next time, provided this is a limited host. */
5010
5011       if (rcpt_count > smtp_rlr_threshold &&
5012           verify_check_host(&smtp_ratelimit_hosts) == OK)
5013         {
5014         DEBUG(D_receive) debug_printf("rate limit RCPT: delay %.3g sec\n",
5015           smtp_delay_rcpt/1000.0);
5016         millisleep((int)smtp_delay_rcpt);
5017         smtp_delay_rcpt *= smtp_rlr_factor;
5018         if (smtp_delay_rcpt > (double)smtp_rlr_limit)
5019           smtp_delay_rcpt = (double)smtp_rlr_limit;
5020         }
5021
5022       /* If the MAIL ACL discarded all the recipients, we bypass ACL checking
5023       for them. Otherwise, check the access control list for this recipient. As
5024       there may be a delay in this, re-check for a synchronization error
5025       afterwards, unless pipelining was advertised. */
5026
5027       if (f.recipients_discarded)
5028         rc = DISCARD;
5029       else
5030         {
5031         GET_OPTION("acl_smtp_rcpt");
5032         if (  (rc = acl_check(ACL_WHERE_RCPT, recipient, acl_smtp_rcpt, &user_msg,
5033                       &log_msg)) == OK
5034            && !f.smtp_in_pipelining_advertised && !check_sync())
5035           goto SYNC_FAILURE;
5036         }
5037
5038       /* The ACL was happy */
5039
5040       if (rc == OK)
5041         {
5042         BOOL more = pipeline_response();
5043
5044         if (user_msg)
5045           smtp_user_msg(US"250", user_msg);
5046         else
5047           smtp_printf("250 Accepted\r\n", more);
5048         receive_add_recipient(recipient, -1);
5049
5050         /* Set the dsn flags in the recipients_list */
5051         recipients_list[recipients_count-1].orcpt = orcpt;
5052         recipients_list[recipients_count-1].dsn_flags = dsn_flags;
5053
5054         /* DEBUG(D_receive) debug_printf("DSN: orcpt: %s  flags: %d\n",
5055           recipients_list[recipients_count-1].orcpt,
5056           recipients_list[recipients_count-1].dsn_flags); */
5057         }
5058
5059       /* The recipient was discarded */
5060
5061       else if (rc == DISCARD)
5062         {
5063         if (user_msg)
5064           smtp_user_msg(US"250", user_msg);
5065         else
5066           smtp_printf("250 Accepted\r\n", SP_NO_MORE);
5067         rcpt_fail_count++;
5068         discarded = TRUE;
5069         log_write(0, LOG_MAIN|LOG_REJECT, "%s F=<%s> RCPT %s: "
5070           "discarded by %s ACL%s%s", host_and_ident(TRUE),
5071           sender_address_unrewritten ? sender_address_unrewritten : sender_address,
5072           smtp_cmd_argument, f.recipients_discarded ? "MAIL" : "RCPT",
5073           log_msg ? US": " : US"", log_msg ? log_msg : US"");
5074         }
5075
5076       /* Either the ACL failed the address, or it was deferred. */
5077
5078       else
5079         {
5080         if (rc == FAIL) rcpt_fail_count++; else rcpt_defer_count++;
5081         done = smtp_handle_acl_fail(ACL_WHERE_RCPT, rc, user_msg, log_msg);
5082         }
5083       break;
5084
5085
5086     /* The DATA command is legal only if it follows successful MAIL FROM
5087     and RCPT TO commands. However, if pipelining is advertised, a bad DATA is
5088     not counted as a protocol error if it follows RCPT (which must have been
5089     rejected if there are no recipients.) This function is complete when a
5090     valid DATA command is encountered.
5091
5092     Note concerning the code used: RFC 2821 says this:
5093
5094      -  If there was no MAIL, or no RCPT, command, or all such commands
5095         were rejected, the server MAY return a "command out of sequence"
5096         (503) or "no valid recipients" (554) reply in response to the
5097         DATA command.
5098
5099     The example in the pipelining RFC 2920 uses 554, but I use 503 here
5100     because it is the same whether pipelining is in use or not.
5101
5102     If all the RCPT commands that precede DATA provoked the same error message
5103     (often indicating some kind of system error), it is helpful to include it
5104     with the DATA rejection (an idea suggested by Tony Finch). */
5105
5106     case BDAT_CMD:
5107       {
5108       int n;
5109
5110       HAD(SCH_BDAT);
5111       if (chunking_state != CHUNKING_OFFERED)
5112         {
5113         done = synprot_error(L_smtp_protocol_error, 503, NULL,
5114           US"BDAT command used when CHUNKING not advertised");
5115         break;
5116         }
5117
5118       /* grab size, endmarker */
5119
5120       if (sscanf(CS smtp_cmd_data, "%u %n", &chunking_datasize, &n) < 1)
5121         {
5122         done = synprot_error(L_smtp_protocol_error, 501, NULL,
5123           US"missing size for BDAT command");
5124         break;
5125         }
5126       chunking_state = strcmpic(smtp_cmd_data+n, US"LAST") == 0
5127         ? CHUNKING_LAST : CHUNKING_ACTIVE;
5128       chunking_data_left = chunking_datasize;
5129       DEBUG(D_receive) debug_printf("chunking state %d, %d bytes\n",
5130                                     (int)chunking_state, chunking_data_left);
5131
5132       f.bdat_readers_wanted = TRUE; /* FIXME: redundant vs chunking_state? */
5133       f.dot_ends = FALSE;
5134
5135       goto DATA_BDAT;
5136       }
5137
5138     case DATA_CMD:
5139       HAD(SCH_DATA);
5140       f.dot_ends = TRUE;
5141       f.bdat_readers_wanted = FALSE;
5142
5143     DATA_BDAT:          /* Common code for DATA and BDAT */
5144 #ifndef DISABLE_PIPE_CONNECT
5145       fl.pipe_connect_acceptable = FALSE;
5146 #endif
5147       if (!discarded && recipients_count <= 0)
5148         {
5149         if (fl.rcpt_smtp_response_same && rcpt_smtp_response)
5150           {
5151           uschar *code = US"503";
5152           int len = Ustrlen(rcpt_smtp_response);
5153           smtp_respond(code, 3, SR_NOT_FINAL, US"All RCPT commands were rejected with "
5154             "this error:");
5155           /* Responses from smtp_printf() will have \r\n on the end */
5156           if (len > 2 && rcpt_smtp_response[len-2] == '\r')
5157             rcpt_smtp_response[len-2] = 0;
5158           smtp_respond(code, 3, SR_NOT_FINAL, rcpt_smtp_response);
5159           }
5160         if (f.smtp_in_pipelining_advertised && last_was_rcpt)
5161           smtp_printf("503 Valid RCPT command must precede %s\r\n", SP_NO_MORE,
5162             smtp_names[smtp_connection_had[SMTP_HBUFF_PREV(smtp_ch_index)]]);
5163         else
5164           done = synprot_error(L_smtp_protocol_error, 503, NULL,
5165             smtp_connection_had[SMTP_HBUFF_PREV(smtp_ch_index)] == SCH_DATA
5166             ? US"valid RCPT command must precede DATA"
5167             : US"valid RCPT command must precede BDAT");
5168
5169         if (chunking_state > CHUNKING_OFFERED)
5170           {
5171           bdat_push_receive_functions();
5172           bdat_flush_data();
5173           }
5174         break;
5175         }
5176
5177       if (toomany && recipients_max_reject)
5178         {
5179         sender_address = NULL;  /* This will allow a new MAIL without RSET */
5180         sender_address_unrewritten = NULL;
5181         smtp_printf("554 Too many recipients\r\n", SP_NO_MORE);
5182
5183         if (chunking_state > CHUNKING_OFFERED)
5184           {
5185           bdat_push_receive_functions();
5186           bdat_flush_data();
5187           }
5188         break;
5189         }
5190
5191       if (chunking_state > CHUNKING_OFFERED)
5192         rc = OK;        /* There is no predata ACL or go-ahead output for BDAT */
5193       else
5194         {
5195         /* If there is a predata-ACL, re-check the synchronization afterwards,
5196         since the ACL may have delayed.  To handle cutthrough delivery enforce a
5197         dummy call to get the DATA command sent. */
5198
5199         GET_OPTION("acl_smtp_predata");
5200         if (!acl_smtp_predata && cutthrough.cctx.sock < 0)
5201           rc = OK;
5202         else
5203           {
5204           uschar * acl = acl_smtp_predata ? acl_smtp_predata : US"accept";
5205           f.enable_dollar_recipients = TRUE;
5206           rc = acl_check(ACL_WHERE_PREDATA, NULL, acl, &user_msg,
5207             &log_msg);
5208           f.enable_dollar_recipients = FALSE;
5209           if (rc == OK && !check_sync())
5210             goto SYNC_FAILURE;
5211
5212           if (rc != OK)
5213             {   /* Either the ACL failed the address, or it was deferred. */
5214             done = smtp_handle_acl_fail(ACL_WHERE_PREDATA, rc, user_msg, log_msg);
5215             break;
5216             }
5217           }
5218
5219         if (user_msg)
5220           smtp_user_msg(US"354", user_msg);
5221         else
5222           smtp_printf(
5223             "354 Enter message, ending with \".\" on a line by itself\r\n", SP_NO_MORE);
5224         }
5225
5226       if (f.bdat_readers_wanted)
5227         bdat_push_receive_functions();
5228
5229 #ifdef TCP_QUICKACK
5230       if (smtp_in)      /* all ACKs needed to ramp window up for bulk data */
5231         (void) setsockopt(fileno(smtp_in), IPPROTO_TCP, TCP_QUICKACK,
5232                 US &on, sizeof(on));
5233 #endif
5234       done = 3;
5235       message_ended = END_NOTENDED;   /* Indicate in middle of data */
5236
5237       break;
5238
5239
5240     case VRFY_CMD:
5241       {
5242       uschar * address;
5243
5244       HAD(SCH_VRFY);
5245
5246       if (!(address = parse_extract_address(smtp_cmd_data, &errmess,
5247             &start, &end, &recipient_domain, FALSE)))
5248         {
5249         smtp_printf("501 %s\r\n", SP_NO_MORE, errmess);
5250         break;
5251         }
5252
5253       if (!recipient_domain)
5254         if (!(recipient_domain = qualify_recipient(&address, smtp_cmd_data,
5255                                     US"verify")))
5256           break;
5257
5258       GET_OPTION("acl_smtp_vrfy");
5259       if ((rc = acl_check(ACL_WHERE_VRFY, address, acl_smtp_vrfy,
5260                     &user_msg, &log_msg)) != OK)
5261         done = smtp_handle_acl_fail(ACL_WHERE_VRFY, rc, user_msg, log_msg);
5262       else
5263         {
5264         uschar * s = NULL;
5265         address_item * addr = deliver_make_addr(address, FALSE);
5266
5267         switch(verify_address(addr, NULL, vopt_is_recipient | vopt_qualify, -1,
5268                -1, -1, NULL, NULL, NULL))
5269           {
5270           case OK:
5271             s = string_sprintf("250 <%s> is deliverable", address);
5272             break;
5273
5274           case DEFER:
5275             s = (addr->user_message != NULL)?
5276               string_sprintf("451 <%s> %s", address, addr->user_message) :
5277               string_sprintf("451 Cannot resolve <%s> at this time", address);
5278             break;
5279
5280           case FAIL:
5281             s = (addr->user_message != NULL)?
5282               string_sprintf("550 <%s> %s", address, addr->user_message) :
5283               string_sprintf("550 <%s> is not deliverable", address);
5284             log_write(0, LOG_MAIN, "VRFY failed for %s %s",
5285               smtp_cmd_argument, host_and_ident(TRUE));
5286             break;
5287           }
5288
5289         smtp_printf("%s\r\n", SP_NO_MORE, s);
5290         }
5291       break;
5292       }
5293
5294
5295     case EXPN_CMD:
5296       HAD(SCH_EXPN);
5297       GET_OPTION("acl_smtp_expn");
5298       rc = acl_check(ACL_WHERE_EXPN, NULL, acl_smtp_expn, &user_msg, &log_msg);
5299       if (rc != OK)
5300         done = smtp_handle_acl_fail(ACL_WHERE_EXPN, rc, user_msg, log_msg);
5301       else
5302         {
5303         BOOL save_log_testing_mode = f.log_testing_mode;
5304         f.address_test_mode = f.log_testing_mode = TRUE;
5305         (void) verify_address(deliver_make_addr(smtp_cmd_data, FALSE),
5306           smtp_out, vopt_is_recipient | vopt_qualify | vopt_expn, -1, -1, -1,
5307           NULL, NULL, NULL);
5308         f.address_test_mode = FALSE;
5309         f.log_testing_mode = save_log_testing_mode;    /* true for -bh */
5310         }
5311       break;
5312
5313
5314     #ifndef DISABLE_TLS
5315
5316     case STARTTLS_CMD:
5317       HAD(SCH_STARTTLS);
5318       if (!fl.tls_advertised)
5319         {
5320         done = synprot_error(L_smtp_protocol_error, 503, NULL,
5321           US"STARTTLS command used when not advertised");
5322         break;
5323         }
5324
5325       /* Apply an ACL check if one is defined */
5326
5327       GET_OPTION("acl_smtp_starttls");
5328       if (  acl_smtp_starttls
5329          && (rc = acl_check(ACL_WHERE_STARTTLS, NULL, acl_smtp_starttls,
5330                     &user_msg, &log_msg)) != OK
5331          )
5332         {
5333         done = smtp_handle_acl_fail(ACL_WHERE_STARTTLS, rc, user_msg, log_msg);
5334         break;
5335         }
5336
5337       /* RFC 2487 is not clear on when this command may be sent, though it
5338       does state that all information previously obtained from the client
5339       must be discarded if a TLS session is started. It seems reasonable to
5340       do an implied RSET when STARTTLS is received. */
5341
5342       incomplete_transaction_log(US"STARTTLS");
5343       cancel_cutthrough_connection(TRUE, US"STARTTLS received");
5344       reset_point = smtp_reset(reset_point);
5345       toomany = FALSE;
5346       cmd_list[CL_STLS].is_mail_cmd = FALSE;
5347
5348       /* There's an attack where more data is read in past the STARTTLS command
5349       before TLS is negotiated, then assumed to be part of the secure session
5350       when used afterwards; we use segregated input buffers, so are not
5351       vulnerable, but we want to note when it happens and, for sheer paranoia,
5352       ensure that the buffer is "wiped".
5353       Pipelining sync checks will normally have protected us too, unless disabled
5354       by configuration. */
5355
5356       if (receive_hasc())
5357         {
5358         DEBUG(D_any)
5359           debug_printf("Non-empty input buffer after STARTTLS; naive attack?\n");
5360         if (tls_in.active.sock < 0)
5361           smtp_inend = smtp_inptr = smtp_inbuffer;
5362         /* and if TLS is already active, tls_server_start() should fail */
5363         }
5364
5365       /* There is nothing we value in the input buffer and if TLS is successfully
5366       negotiated, we won't use this buffer again; if TLS fails, we'll just read
5367       fresh content into it.  The buffer contains arbitrary content from an
5368       untrusted remote source; eg: NOOP <shellcode>\r\nSTARTTLS\r\n
5369       It seems safest to just wipe away the content rather than leave it as a
5370       target to jump to. */
5371
5372       memset(smtp_inbuffer, 0, IN_BUFFER_SIZE);
5373
5374       /* Attempt to start up a TLS session, and if successful, discard all
5375       knowledge that was obtained previously. At least, that's what the RFC says,
5376       and that's what happens by default. However, in order to work round YAEB,
5377       there is an option to remember the esmtp state. Sigh.
5378
5379       We must allow for an extra EHLO command and an extra AUTH command after
5380       STARTTLS that don't add to the nonmail command count. */
5381
5382       s = NULL;
5383       if ((rc = tls_server_start(&s)) == OK)
5384         {
5385         if (!tls_remember_esmtp)
5386           fl.helo_seen = fl.esmtp = fl.auth_advertised = f.smtp_in_pipelining_advertised = FALSE;
5387         cmd_list[CL_EHLO].is_mail_cmd = TRUE;
5388         cmd_list[CL_AUTH].is_mail_cmd = TRUE;
5389         cmd_list[CL_TLAU].is_mail_cmd = TRUE;
5390         if (sender_helo_name)
5391           {
5392           sender_helo_name = NULL;
5393           host_build_sender_fullhost();  /* Rebuild */
5394           set_process_info("handling incoming TLS connection from %s",
5395             host_and_ident(FALSE));
5396           }
5397         received_protocol =
5398           (sender_host_address ? protocols : protocols_local)
5399             [ (fl.esmtp
5400               ? pextend + (sender_host_authenticated ? pauthed : 0)
5401               : pnormal)
5402             + (tls_in.active.sock >= 0 ? pcrpted : 0)
5403             ];
5404
5405         sender_host_auth_pubname = sender_host_authenticated = NULL;
5406         authenticated_id = NULL;
5407         sync_cmd_limit = NON_SYNC_CMD_NON_PIPELINING;
5408         DEBUG(D_tls) debug_printf("TLS active\n");
5409         break;     /* Successful STARTTLS */
5410         }
5411       else
5412         (void) smtp_log_tls_fail(s);
5413
5414       /* Some local configuration problem was discovered before actually trying
5415       to do a TLS handshake; give a temporary error. */
5416
5417       if (rc == DEFER)
5418         {
5419         smtp_printf("454 TLS currently unavailable\r\n", SP_NO_MORE);
5420         break;
5421         }
5422
5423       /* Hard failure. Reject everything except QUIT or closed connection. One
5424       cause for failure is a nested STARTTLS, in which case tls_in.active remains
5425       set, but we must still reject all incoming commands.  Another is a handshake
5426       failure - and there may some encrypted data still in the pipe to us, which we
5427       see as garbage commands. */
5428
5429       DEBUG(D_tls) debug_printf("TLS failed to start\n");
5430       while (done <= 0) switch(smtp_read_command(FALSE, GETC_BUFFER_UNLIMITED))
5431         {
5432         case EOF_CMD:
5433           log_close_event(US"by EOF");
5434           smtp_notquit_exit(US"tls-failed", NULL, NULL);
5435           done = 2;
5436           break;
5437
5438         /* It is perhaps arguable as to which exit ACL should be called here,
5439         but as it is probably a situation that almost never arises, it
5440         probably doesn't matter. We choose to call the real QUIT ACL, which in
5441         some sense is perhaps "right". */
5442
5443         case QUIT_CMD:
5444           f.smtp_in_quit = TRUE;
5445           user_msg = NULL;
5446           GET_OPTION("acl_smtp_quit");
5447           if (  acl_smtp_quit
5448              && ((rc = acl_check(ACL_WHERE_QUIT, NULL, acl_smtp_quit, &user_msg,
5449                                 &log_msg)) == ERROR))
5450               log_write(0, LOG_MAIN|LOG_PANIC, "ACL for QUIT returned ERROR: %s",
5451                 log_msg);
5452           if (user_msg)
5453             smtp_respond(US"221", 3, SR_FINAL, user_msg);
5454           else
5455             smtp_printf("221 %s closing connection\r\n", SP_NO_MORE, smtp_active_hostname);
5456           log_close_event(US"by QUIT");
5457           done = 2;
5458           break;
5459
5460         default:
5461           smtp_printf("554 Security failure\r\n", SP_NO_MORE);
5462           break;
5463         }
5464       tls_close(NULL, TLS_SHUTDOWN_NOWAIT);
5465       break;
5466     #endif
5467
5468
5469     /* The ACL for QUIT is provided for gathering statistical information or
5470     similar; it does not affect the response code, but it can supply a custom
5471     message. */
5472
5473     case QUIT_CMD:
5474       smtp_quit_handler(&user_msg, &log_msg);
5475       done = 2;
5476       break;
5477
5478
5479     case RSET_CMD:
5480       smtp_rset_handler();
5481       cancel_cutthrough_connection(TRUE, US"RSET received");
5482       reset_point = smtp_reset(reset_point);
5483       toomany = FALSE;
5484       break;
5485
5486
5487     case NOOP_CMD:
5488       HAD(SCH_NOOP);
5489       smtp_printf("250 OK\r\n", SP_NO_MORE);
5490       break;
5491
5492
5493     /* Show ETRN/EXPN/VRFY if there's an ACL for checking hosts; if actually
5494     used, a check will be done for permitted hosts. Show STARTTLS only if not
5495     already in a TLS session and if it would be advertised in the EHLO
5496     response. */
5497
5498     case HELP_CMD:
5499       HAD(SCH_HELP);
5500       smtp_printf("214-Commands supported:\r\n214", SP_MORE);
5501       smtp_printf(" AUTH", SP_MORE);
5502 #ifndef DISABLE_TLS
5503       if (tls_in.active.sock < 0 &&
5504           verify_check_host(&tls_advertise_hosts) != FAIL)
5505         smtp_printf(" STARTTLS", SP_MORE);
5506 #endif
5507       smtp_printf(" HELO EHLO MAIL RCPT DATA BDAT", SP_MORE);
5508       smtp_printf(" NOOP QUIT RSET HELP", SP_MORE);
5509       if (acl_smtp_etrn) smtp_printf(" ETRN", SP_MORE);
5510       if (acl_smtp_expn) smtp_printf(" EXPN", SP_MORE);
5511       if (acl_smtp_vrfy) smtp_printf(" VRFY", SP_MORE);
5512 #ifndef DISABLE_WELLKNOWN
5513       if (verify_check_host(&wellknown_advertise_hosts) != FAIL)
5514         smtp_printf(" WELLKNOWN", SP_MORE);
5515 #endif
5516 #ifdef EXPERIMENTAL_XCLIENT
5517       if (proxy_session || verify_check_host(&hosts_xclient) != FAIL)
5518         smtp_printf(" XCLIENT", SP_MORE);
5519 #endif
5520       smtp_printf("\r\n", SP_NO_MORE);
5521       break;
5522
5523
5524     case EOF_CMD:
5525       incomplete_transaction_log(US"connection lost");
5526       smtp_notquit_exit(US"connection-lost", US"421",
5527         US"%s lost input connection", smtp_active_hostname);
5528
5529       /* Don't log by default unless in the middle of a message, as some mailers
5530       just drop the call rather than sending QUIT, and it clutters up the logs.
5531       */
5532
5533       if (sender_address || recipients_count > 0)
5534         log_write(L_lost_incoming_connection, LOG_MAIN,
5535           "unexpected %s while reading SMTP command from %s%s%s D=%s",
5536           f.sender_host_unknown ? "EOF" : "disconnection",
5537           f.tcp_in_fastopen_logged
5538           ? US""
5539           : f.tcp_in_fastopen
5540           ? f.tcp_in_fastopen_data ? US"TFO* " : US"TFO "
5541           : US"",
5542           host_and_ident(FALSE), smtp_read_error,
5543           string_timesince(&smtp_connection_start)
5544           );
5545
5546       else
5547         log_write(L_smtp_connection, LOG_MAIN, "%s %slost%s D=%s",
5548           smtp_get_connection_info(),
5549           f.tcp_in_fastopen && !f.tcp_in_fastopen_logged ? US"TFO " : US"",
5550           smtp_read_error,
5551           string_timesince(&smtp_connection_start)
5552           );
5553
5554       done = 1;
5555       break;
5556
5557
5558     case ETRN_CMD:
5559       HAD(SCH_ETRN);
5560       if (sender_address)
5561         {
5562         done = synprot_error(L_smtp_protocol_error, 503, NULL,
5563           US"ETRN is not permitted inside a transaction");
5564         break;
5565         }
5566
5567       log_write(L_etrn, LOG_MAIN, "ETRN %s received from %s", smtp_cmd_argument,
5568         host_and_ident(FALSE));
5569
5570       GET_OPTION("acl_smtp_etrn");
5571       if ((rc = acl_check(ACL_WHERE_ETRN, NULL, acl_smtp_etrn,
5572                   &user_msg, &log_msg)) != OK)
5573         {
5574         done = smtp_handle_acl_fail(ACL_WHERE_ETRN, rc, user_msg, log_msg);
5575         break;
5576         }
5577
5578       /* Compute the serialization key for this command. */
5579
5580       etrn_serialize_key = string_sprintf("etrn-%s\n", smtp_cmd_data);
5581
5582       /* If a command has been specified for running as a result of ETRN, we
5583       permit any argument to ETRN. If not, only the # standard form is permitted,
5584       since that is strictly the only kind of ETRN that can be implemented
5585       according to the RFC. */
5586
5587       GET_OPTION("smtp_etrn_command");
5588       if (smtp_etrn_command)
5589         {
5590         uschar *error;
5591         BOOL rc;
5592         etrn_command = smtp_etrn_command;
5593         deliver_domain = smtp_cmd_data;
5594         rc = transport_set_up_command(&argv, smtp_etrn_command, TSUC_EXPAND_ARGS, 0, NULL,
5595           US"ETRN processing", &error);
5596         deliver_domain = NULL;
5597         if (!rc)
5598           {
5599           log_write(0, LOG_MAIN|LOG_PANIC, "failed to set up ETRN command: %s",
5600             error);
5601           smtp_printf("458 Internal failure\r\n", SP_NO_MORE);
5602           break;
5603           }
5604         }
5605
5606       /* Else set up to call Exim with the -R option. */
5607
5608       else
5609         {
5610         if (*smtp_cmd_data++ != '#')
5611           {
5612           done = synprot_error(L_smtp_syntax_error, 501, NULL,
5613             US"argument must begin with #");
5614           break;
5615           }
5616         etrn_command = US"exim -R";
5617         argv = CUSS child_exec_exim(CEE_RETURN_ARGV, TRUE, NULL, TRUE,
5618           *queue_name ? 4 : 2,
5619           US"-R", smtp_cmd_data,
5620           US"-MCG", queue_name);
5621         }
5622
5623       /* If we are host-testing, don't actually do anything. */
5624
5625       if (host_checking)
5626         {
5627         HDEBUG(D_any)
5628           {
5629           debug_printf("ETRN command is: %s\n", etrn_command);
5630           debug_printf("ETRN command execution skipped\n");
5631           }
5632         if (user_msg == NULL) smtp_printf("250 OK\r\n", SP_NO_MORE);
5633           else smtp_user_msg(US"250", user_msg);
5634         break;
5635         }
5636
5637
5638       /* If ETRN queue runs are to be serialized, check the database to
5639       ensure one isn't already running. */
5640
5641       if (smtp_etrn_serialize && !enq_start(etrn_serialize_key, 1))
5642         {
5643         smtp_printf("458 Already processing %s\r\n", SP_NO_MORE, smtp_cmd_data);
5644         break;
5645         }
5646
5647       /* Fork a child process and run the command. We don't want to have to
5648       wait for the process at any point, so set SIGCHLD to SIG_IGN before
5649       forking. It should be set that way anyway for external incoming SMTP,
5650       but we save and restore to be tidy. If serialization is required, we
5651       actually run the command in yet another process, so we can wait for it
5652       to complete and then remove the serialization lock. */
5653
5654       oldsignal = signal(SIGCHLD, SIG_IGN);
5655
5656       if ((pid = exim_fork(US"etrn-command")) == 0)
5657         {
5658         smtp_input = FALSE;       /* This process is not associated with the */
5659         (void)fclose(smtp_in);    /* SMTP call any more. */
5660         (void)fclose(smtp_out);
5661
5662         signal(SIGCHLD, SIG_DFL);      /* Want to catch child */
5663
5664         /* If not serializing, do the exec right away. Otherwise, fork down
5665         into another process. */
5666
5667         if (  !smtp_etrn_serialize
5668            || (pid = exim_fork(US"etrn-serialised-command")) == 0)
5669           {
5670           DEBUG(D_exec) debug_print_argv(argv);
5671           exim_nullstd();                   /* Ensure std{in,out,err} exist */
5672           /* argv[0] should be untainted, from child_exec_exim() */
5673           execv(CS argv[0], (char *const *)argv);
5674           log_write(0, LOG_MAIN|LOG_PANIC_DIE, "exec of \"%s\" (ETRN) failed: %s",
5675             etrn_command, strerror(errno));
5676           _exit(EXIT_FAILURE);         /* paranoia */
5677           }
5678
5679         /* Obey this if smtp_serialize and the 2nd fork yielded non-zero. That
5680         is, we are in the first subprocess, after forking again. All we can do
5681         for a failing fork is to log it. Otherwise, wait for the 2nd process to
5682         complete, before removing the serialization. */
5683
5684         if (pid < 0)
5685           log_write(0, LOG_MAIN|LOG_PANIC, "2nd fork for serialized ETRN "
5686             "failed: %s", strerror(errno));
5687         else
5688           {
5689           int status;
5690           DEBUG(D_any) debug_printf("waiting for serialized ETRN process %d\n",
5691             (int)pid);
5692           (void)wait(&status);
5693           DEBUG(D_any) debug_printf("serialized ETRN process %d ended\n",
5694             (int)pid);
5695           }
5696
5697         enq_end(etrn_serialize_key);
5698         exim_underbar_exit(EXIT_SUCCESS);
5699         }
5700
5701       /* Back in the top level SMTP process. Check that we started a subprocess
5702       and restore the signal state. */
5703
5704       if (pid < 0)
5705         {
5706         log_write(0, LOG_MAIN|LOG_PANIC, "fork of process for ETRN failed: %s",
5707           strerror(errno));
5708         smtp_printf("458 Unable to fork process\r\n", SP_NO_MORE);
5709         if (smtp_etrn_serialize) enq_end(etrn_serialize_key);
5710         }
5711       else
5712         if (!user_msg)
5713           smtp_printf("250 OK\r\n", SP_NO_MORE);
5714         else
5715           smtp_user_msg(US"250", user_msg);
5716
5717       signal(SIGCHLD, oldsignal);
5718       break;
5719
5720
5721     case BADARG_CMD:
5722       done = synprot_error(L_smtp_syntax_error, 501, NULL,
5723         US"unexpected argument data");
5724       break;
5725
5726
5727     /* This currently happens only for NULLs, but could be extended. */
5728
5729     case BADCHAR_CMD:
5730       done = synprot_error(L_smtp_syntax_error, 0, NULL,       /* Just logs */
5731         US"NUL character(s) present (shown as '?')");
5732       smtp_printf("501 NUL characters are not allowed in SMTP commands\r\n",
5733                   SP_NO_MORE);
5734       break;
5735
5736
5737     case BADSYN_CMD:
5738     SYNC_FAILURE:
5739       {
5740         unsigned nchars = 150;
5741         uschar * buf = receive_getbuf(&nchars);         /* destructive read */
5742         buf[nchars] = '\0';
5743         incomplete_transaction_log(US"sync failure");
5744         log_write(0, LOG_MAIN|LOG_REJECT, "SMTP protocol synchronization error "
5745           "(next input sent too soon: pipelining was%s advertised): "
5746           "rejected \"%s\" %s next input=\"%s\" (%u bytes)",
5747           f.smtp_in_pipelining_advertised ? "" : " not",
5748           smtp_cmd_buffer, host_and_ident(TRUE),
5749           string_printing(buf), nchars);
5750         smtp_notquit_exit(US"synchronization-error", US"554",
5751           US"SMTP synchronization error");
5752         done = 1;   /* Pretend eof - drops connection */
5753         break;
5754       }
5755
5756
5757     case TOO_MANY_NONMAIL_CMD:
5758       s = smtp_cmd_buffer;
5759       Uskip_nonwhite(&s);
5760       incomplete_transaction_log(US"too many non-mail commands");
5761       log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
5762         "nonmail commands (last was \"%.*s\")",  host_and_ident(FALSE),
5763         (int)(s - smtp_cmd_buffer), smtp_cmd_buffer);
5764       smtp_notquit_exit(US"bad-commands", US"554", US"Too many nonmail commands");
5765       done = 1;   /* Pretend eof - drops connection */
5766       break;
5767
5768 #ifdef SUPPORT_PROXY
5769     case PROXY_FAIL_IGNORE_CMD:
5770       smtp_printf("503 Command refused, required Proxy negotiation failed\r\n", SP_NO_MORE);
5771       break;
5772 #endif
5773
5774     default:
5775       if (unknown_command_count++ >= smtp_max_unknown_commands)
5776         {
5777         log_write(L_smtp_syntax_error, LOG_MAIN,
5778           "SMTP syntax error in \"%s\" %s %s",
5779           string_printing(smtp_cmd_buffer), host_and_ident(TRUE),
5780           US"unrecognized command");
5781         incomplete_transaction_log(US"unrecognized command");
5782         smtp_notquit_exit(US"bad-commands", US"500",
5783           US"Too many unrecognized commands");
5784         done = 2;
5785         log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
5786           "unrecognized commands (last was \"%s\")", host_and_ident(FALSE),
5787           string_printing(smtp_cmd_buffer));
5788         }
5789       else
5790         done = synprot_error(L_smtp_syntax_error, 500, NULL,
5791           US"unrecognized command");
5792       break;
5793     }
5794
5795   /* This label is used by goto's inside loops that want to break out to
5796   the end of the command-processing loop. */
5797
5798   COMMAND_LOOP:
5799   last_was_rej_mail = was_rej_mail;     /* Remember some last commands for */
5800   last_was_rcpt = was_rcpt;             /* protocol error handling */
5801   }
5802
5803 return done - 2;  /* Convert yield values */
5804 }
5805
5806
5807
5808 gstring *
5809 authres_smtpauth(gstring * g)
5810 {
5811 if (!sender_host_authenticated)
5812   return g;
5813
5814 g = string_append(g, 2, US";\n\tauth=pass (", sender_host_auth_pubname);
5815
5816 if (Ustrcmp(sender_host_auth_pubname, "tls") == 0)
5817   g = authenticated_id
5818     ? string_append(g, 2, US") x509.auth=", authenticated_id)
5819     : string_cat(g, US") reason=x509.auth");
5820 else
5821   g = authenticated_id
5822     ? string_append(g, 2, US") smtp.auth=", authenticated_id)
5823     : string_cat(g, US", no id saved)");
5824
5825 if (authenticated_sender)
5826   g = string_append(g, 2, US" smtp.mailfrom=", authenticated_sender);
5827 return g;
5828 }
5829
5830
5831
5832 /* vi: aw ai sw=2
5833 */
5834 /* End of smtp_in.c */