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