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