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