tidying
[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 *), FALSE);
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, TRUE);
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, FALSE);
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 /* Run the checking code, passing the remainder of the command line as
3781 data. Initials the $auth<n> variables as empty. Initialize $0 empty and set
3782 it as the only set numerical variable. The authenticator may set $auth<n>
3783 and also set other numeric variables. The $auth<n> variables are preferred
3784 nowadays; the numerical variables remain for backwards compatibility.
3785
3786 Afterwards, have a go at expanding the set_id string, even if
3787 authentication failed - for bad passwords it can be useful to log the
3788 userid. On success, require set_id to expand and exist, and put it in
3789 authenticated_id. Save this in permanent store, as the working store gets
3790 reset at HELO, RSET, etc. */
3791
3792 for (int i = 0; i < AUTH_VARS; i++) auth_vars[i] = NULL;
3793 expand_nmax = 0;
3794 expand_nlength[0] = 0;   /* $0 contains nothing */
3795
3796 rc = (au->info->servercode)(au, smtp_cmd_data);
3797 if (au->set_id) set_id = expand_string(au->set_id);
3798 expand_nmax = -1;        /* Reset numeric variables */
3799 for (int i = 0; i < AUTH_VARS; i++) auth_vars[i] = NULL;   /* Reset $auth<n> */
3800
3801 /* The value of authenticated_id is stored in the spool file and printed in
3802 log lines. It must not contain binary zeros or newline characters. In
3803 normal use, it never will, but when playing around or testing, this error
3804 can (did) happen. To guard against this, ensure that the id contains only
3805 printing characters. */
3806
3807 if (set_id) set_id = string_printing(set_id);
3808
3809 /* For the non-OK cases, set up additional logging data if set_id
3810 is not empty. */
3811
3812 if (rc != OK)
3813   set_id = set_id && *set_id
3814     ? string_sprintf(" (set_id=%s)", set_id) : US"";
3815
3816 /* Switch on the result */
3817
3818 switch(rc)
3819   {
3820   case OK:
3821     if (!au->set_id || set_id)    /* Complete success */
3822       {
3823       if (set_id) authenticated_id = string_copy_perm(set_id, TRUE);
3824       sender_host_authenticated = au->name;
3825       sender_host_auth_pubname  = au->public_name;
3826       authentication_failed = FALSE;
3827       authenticated_fail_id = NULL;   /* Impossible to already be set? */
3828
3829       received_protocol =
3830         (sender_host_address ? protocols : protocols_local)
3831           [pextend + pauthed + (tls_in.active.sock >= 0 ? pcrpted:0)];
3832       *s = *ss = US"235 Authentication succeeded";
3833       authenticated_by = au;
3834       break;
3835       }
3836
3837     /* Authentication succeeded, but we failed to expand the set_id string.
3838     Treat this as a temporary error. */
3839
3840     auth_defer_msg = expand_string_message;
3841     /* Fall through */
3842
3843   case DEFER:
3844     if (set_id) authenticated_fail_id = string_copy_perm(set_id, TRUE);
3845     *s = string_sprintf("435 Unable to authenticate at present%s",
3846       auth_defer_user_msg);
3847     *ss = string_sprintf("435 Unable to authenticate at present%s: %s",
3848       set_id, auth_defer_msg);
3849     break;
3850
3851   case BAD64:
3852     *s = *ss = US"501 Invalid base64 data";
3853     break;
3854
3855   case CANCELLED:
3856     *s = *ss = US"501 Authentication cancelled";
3857     break;
3858
3859   case UNEXPECTED:
3860     *s = *ss = US"553 Initial data not expected";
3861     break;
3862
3863   case FAIL:
3864     if (set_id) authenticated_fail_id = string_copy_perm(set_id, TRUE);
3865     *s = US"535 Incorrect authentication data";
3866     *ss = string_sprintf("535 Incorrect authentication data%s", set_id);
3867     break;
3868
3869   default:
3870     if (set_id) authenticated_fail_id = string_copy_perm(set_id, TRUE);
3871     *s = US"435 Internal error";
3872     *ss = string_sprintf("435 Internal error%s: return %d from authentication "
3873       "check", set_id, rc);
3874     break;
3875   }
3876
3877 return rc;
3878 }
3879
3880
3881
3882
3883
3884 static int
3885 qualify_recipient(uschar ** recipient, uschar * smtp_cmd_data, uschar * tag)
3886 {
3887 int rd;
3888 if (f.allow_unqualified_recipient || strcmpic(*recipient, US"postmaster") == 0)
3889   {
3890   DEBUG(D_receive) debug_printf("unqualified address %s accepted\n",
3891     *recipient);
3892   rd = Ustrlen(recipient) + 1;
3893   /* deconst ok as *recipient was not const */
3894   *recipient = US rewrite_address_qualify(*recipient, TRUE);
3895   return rd;
3896   }
3897 smtp_printf("501 %s: recipient address must contain a domain\r\n", FALSE,
3898   smtp_cmd_data);
3899 log_write(L_smtp_syntax_error,
3900   LOG_MAIN|LOG_REJECT, "unqualified %s rejected: <%s> %s%s",
3901   tag, *recipient, host_and_ident(TRUE), host_lookup_msg);
3902 return 0;
3903 }
3904
3905
3906
3907
3908 static void
3909 smtp_quit_handler(uschar ** user_msgp, uschar ** log_msgp)
3910 {
3911 HAD(SCH_QUIT);
3912 f.smtp_in_quit = TRUE;
3913 incomplete_transaction_log(US"QUIT");
3914 if (  acl_smtp_quit
3915    && acl_check(ACL_WHERE_QUIT, NULL, acl_smtp_quit, user_msgp, log_msgp)
3916         == ERROR)
3917     log_write(0, LOG_MAIN|LOG_PANIC, "ACL for QUIT returned ERROR: %s",
3918       *log_msgp);
3919
3920 #ifdef EXIM_TCP_CORK
3921 (void) setsockopt(fileno(smtp_out), IPPROTO_TCP, EXIM_TCP_CORK, US &on, sizeof(on));
3922 #endif
3923
3924 if (*user_msgp)
3925   smtp_respond(US"221", 3, TRUE, *user_msgp);
3926 else
3927   smtp_printf("221 %s closing connection\r\n", FALSE, smtp_active_hostname);
3928
3929 #ifdef SERVERSIDE_CLOSE_NOWAIT
3930 # ifndef DISABLE_TLS
3931 tls_close(NULL, TLS_SHUTDOWN_NOWAIT);
3932 # endif
3933
3934 log_write(L_smtp_connection, LOG_MAIN, "%s closed by QUIT",
3935   smtp_get_connection_info());
3936 #else
3937
3938 # ifndef DISABLE_TLS
3939 tls_close(NULL, TLS_SHUTDOWN_WAIT);
3940 # endif
3941
3942 log_write(L_smtp_connection, LOG_MAIN, "%s closed by QUIT",
3943   smtp_get_connection_info());
3944
3945 /* Pause, hoping client will FIN first so that they get the TIME_WAIT.
3946 The socket should become readble (though with no data) */
3947
3948 (void) poll_one_fd(fileno(smtp_in), POLLIN, 200);
3949 #endif  /*!SERVERSIDE_CLOSE_NOWAIT*/
3950 }
3951
3952
3953 static void
3954 smtp_rset_handler(void)
3955 {
3956 HAD(SCH_RSET);
3957 incomplete_transaction_log(US"RSET");
3958 smtp_printf("250 Reset OK\r\n", FALSE);
3959 cmd_list[CMD_LIST_RSET].is_mail_cmd = FALSE;
3960 }
3961
3962
3963 static int
3964 expand_mailmax(const uschar * s)
3965 {
3966 if (!(s = expand_cstring(s)))
3967   log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand smtp_accept_max_per_connection");
3968 return *s ? Uatoi(s) : 0;
3969 }
3970
3971 /*************************************************
3972 *       Initialize for SMTP incoming message     *
3973 *************************************************/
3974
3975 /* This function conducts the initial dialogue at the start of an incoming SMTP
3976 message, and builds a list of recipients. However, if the incoming message
3977 is part of a batch (-bS option) a separate function is called since it would
3978 be messy having tests splattered about all over this function. This function
3979 therefore handles the case where interaction is occurring. The input and output
3980 files are set up in smtp_in and smtp_out.
3981
3982 The global recipients_list is set to point to a vector of recipient_item
3983 blocks, whose number is given by recipients_count. This is extended by the
3984 receive_add_recipient() function. The global variable sender_address is set to
3985 the sender's address. The yield is +1 if a message has been successfully
3986 started, 0 if a QUIT command was encountered or the connection was refused from
3987 the particular host, or -1 if the connection was lost.
3988
3989 Argument: none
3990
3991 Returns:  > 0 message successfully started (reached DATA)
3992           = 0 QUIT read or end of file reached or call refused
3993           < 0 lost connection
3994 */
3995
3996 int
3997 smtp_setup_msg(void)
3998 {
3999 int done = 0;
4000 BOOL toomany = FALSE;
4001 BOOL discarded = FALSE;
4002 BOOL last_was_rej_mail = FALSE;
4003 BOOL last_was_rcpt = FALSE;
4004 rmark reset_point = store_mark();
4005
4006 DEBUG(D_receive) debug_printf("smtp_setup_msg entered\n");
4007
4008 /* Reset for start of new message. We allow one RSET not to be counted as a
4009 nonmail command, for those MTAs that insist on sending it between every
4010 message. Ditto for EHLO/HELO and for STARTTLS, to allow for going in and out of
4011 TLS between messages (an Exim client may do this if it has messages queued up
4012 for the host). Note: we do NOT reset AUTH at this point. */
4013
4014 reset_point = smtp_reset(reset_point);
4015 message_ended = END_NOTSTARTED;
4016
4017 chunking_state = f.chunking_offered ? CHUNKING_OFFERED : CHUNKING_NOT_OFFERED;
4018
4019 cmd_list[CMD_LIST_RSET].is_mail_cmd = TRUE;
4020 cmd_list[CMD_LIST_HELO].is_mail_cmd = TRUE;
4021 cmd_list[CMD_LIST_EHLO].is_mail_cmd = TRUE;
4022 #ifndef DISABLE_TLS
4023 cmd_list[CMD_LIST_STARTTLS].is_mail_cmd = TRUE;
4024 #endif
4025
4026 if (lwr_receive_getc != NULL)
4027   {
4028   /* This should have already happened, but if we've gotten confused,
4029   force a reset here. */
4030   DEBUG(D_receive) debug_printf("WARNING: smtp_setup_msg had to restore receive functions to lowers\n");
4031   bdat_pop_receive_functions();
4032   }
4033
4034 /* Set the local signal handler for SIGTERM - it tries to end off tidily */
4035
4036 had_command_sigterm = 0;
4037 os_non_restarting_signal(SIGTERM, command_sigterm_handler);
4038
4039 /* Batched SMTP is handled in a different function. */
4040
4041 if (smtp_batched_input) return smtp_setup_batch_msg();
4042
4043 #ifdef TCP_QUICKACK
4044 if (smtp_in)            /* Avoid pure-ACKs while in cmd pingpong phase */
4045   (void) setsockopt(fileno(smtp_in), IPPROTO_TCP, TCP_QUICKACK,
4046           US &off, sizeof(off));
4047 #endif
4048
4049 /* Deal with SMTP commands. This loop is exited by setting done to a POSITIVE
4050 value. The values are 2 larger than the required yield of the function. */
4051
4052 while (done <= 0)
4053   {
4054   const uschar **argv;
4055   uschar *etrn_command;
4056   uschar *etrn_serialize_key;
4057   uschar *errmess;
4058   uschar *log_msg, *smtp_code;
4059   uschar *user_msg = NULL;
4060   uschar *recipient = NULL;
4061   uschar *hello = NULL;
4062   uschar *s, *ss;
4063   BOOL was_rej_mail = FALSE;
4064   BOOL was_rcpt = FALSE;
4065   void (*oldsignal)(int);
4066   pid_t pid;
4067   int start, end, sender_domain, recipient_domain;
4068   int rc;
4069   int c;
4070   uschar *orcpt = NULL;
4071   int dsn_flags;
4072   gstring * g;
4073
4074 #ifdef AUTH_TLS
4075   /* Check once per STARTTLS or SSL-on-connect for a TLS AUTH */
4076   if (  tls_in.active.sock >= 0
4077      && tls_in.peercert
4078      && tls_in.certificate_verified
4079      && cmd_list[CMD_LIST_TLS_AUTH].is_mail_cmd
4080      )
4081     {
4082     cmd_list[CMD_LIST_TLS_AUTH].is_mail_cmd = FALSE;
4083
4084     for (auth_instance * au = auths; au; au = au->next)
4085       if (strcmpic(US"tls", au->driver_name) == 0)
4086         {
4087         if (  acl_smtp_auth
4088            && (rc = acl_check(ACL_WHERE_AUTH, NULL, acl_smtp_auth,
4089                       &user_msg, &log_msg)) != OK
4090            )
4091           done = smtp_handle_acl_fail(ACL_WHERE_AUTH, rc, user_msg, log_msg);
4092         else
4093           {
4094           smtp_cmd_data = NULL;
4095
4096           if (smtp_in_auth(au, &s, &ss) == OK)
4097             { DEBUG(D_auth) debug_printf("tls auth succeeded\n"); }
4098           else
4099             { DEBUG(D_auth) debug_printf("tls auth not succeeded\n"); }
4100           }
4101         break;
4102         }
4103     }
4104 #endif
4105
4106   switch(smtp_read_command(
4107 #ifndef DISABLE_PIPE_CONNECT
4108           !fl.pipe_connect_acceptable,
4109 #else
4110           TRUE,
4111 #endif
4112           GETC_BUFFER_UNLIMITED))
4113     {
4114     /* The AUTH command is not permitted to occur inside a transaction, and may
4115     occur successfully only once per connection. Actually, that isn't quite
4116     true. When TLS is started, all previous information about a connection must
4117     be discarded, so a new AUTH is permitted at that time.
4118
4119     AUTH may only be used when it has been advertised. However, it seems that
4120     there are clients that send AUTH when it hasn't been advertised, some of
4121     them even doing this after HELO. And there are MTAs that accept this. Sigh.
4122     So there's a get-out that allows this to happen.
4123
4124     AUTH is initially labelled as a "nonmail command" so that one occurrence
4125     doesn't get counted. We change the label here so that multiple failing
4126     AUTHS will eventually hit the nonmail threshold. */
4127
4128     case AUTH_CMD:
4129       HAD(SCH_AUTH);
4130       authentication_failed = TRUE;
4131       cmd_list[CMD_LIST_AUTH].is_mail_cmd = FALSE;
4132
4133       if (!fl.auth_advertised && !f.allow_auth_unadvertised)
4134         {
4135         done = synprot_error(L_smtp_protocol_error, 503, NULL,
4136           US"AUTH command used when not advertised");
4137         break;
4138         }
4139       if (sender_host_authenticated)
4140         {
4141         done = synprot_error(L_smtp_protocol_error, 503, NULL,
4142           US"already authenticated");
4143         break;
4144         }
4145       if (sender_address)
4146         {
4147         done = synprot_error(L_smtp_protocol_error, 503, NULL,
4148           US"not permitted in mail transaction");
4149         break;
4150         }
4151
4152       /* Check the ACL */
4153
4154       if (  acl_smtp_auth
4155          && (rc = acl_check(ACL_WHERE_AUTH, NULL, acl_smtp_auth,
4156                     &user_msg, &log_msg)) != OK
4157          )
4158         {
4159         done = smtp_handle_acl_fail(ACL_WHERE_AUTH, rc, user_msg, log_msg);
4160         break;
4161         }
4162
4163       /* Find the name of the requested authentication mechanism. */
4164
4165       s = smtp_cmd_data;
4166       for (; (c = *smtp_cmd_data) && !isspace(c); smtp_cmd_data++)
4167         if (!isalnum(c) && c != '-' && c != '_')
4168           {
4169           done = synprot_error(L_smtp_syntax_error, 501, NULL,
4170             US"invalid character in authentication mechanism name");
4171           goto COMMAND_LOOP;
4172           }
4173
4174       /* If not at the end of the line, we must be at white space. Terminate the
4175       name and move the pointer on to any data that may be present. */
4176
4177       if (*smtp_cmd_data)
4178         {
4179         *smtp_cmd_data++ = 0;
4180         while (isspace(*smtp_cmd_data)) smtp_cmd_data++;
4181         }
4182
4183       /* Search for an authentication mechanism which is configured for use
4184       as a server and which has been advertised (unless, sigh, allow_auth_
4185       unadvertised is set). */
4186
4187         {
4188         auth_instance * au;
4189         for (au = auths; au; au = au->next)
4190           if (strcmpic(s, au->public_name) == 0 && au->server &&
4191               (au->advertised || f.allow_auth_unadvertised))
4192             break;
4193
4194         if (au)
4195           {
4196           c = smtp_in_auth(au, &s, &ss);
4197
4198           smtp_printf("%s\r\n", FALSE, s);
4199           if (c != OK)
4200             log_write(0, LOG_MAIN|LOG_REJECT, "%s authenticator failed for %s: %s",
4201               au->name, host_and_ident(FALSE), ss);
4202           }
4203         else
4204           done = synprot_error(L_smtp_protocol_error, 504, NULL,
4205             string_sprintf("%s authentication mechanism not supported", s));
4206         }
4207
4208       break;  /* AUTH_CMD */
4209
4210     /* The HELO/EHLO commands are permitted to appear in the middle of a
4211     session as well as at the beginning. They have the effect of a reset in
4212     addition to their other functions. Their absence at the start cannot be
4213     taken to be an error.
4214
4215     RFC 2821 says:
4216
4217       If the EHLO command is not acceptable to the SMTP server, 501, 500,
4218       or 502 failure replies MUST be returned as appropriate.  The SMTP
4219       server MUST stay in the same state after transmitting these replies
4220       that it was in before the EHLO was received.
4221
4222     Therefore, we do not do the reset until after checking the command for
4223     acceptability. This change was made for Exim release 4.11. Previously
4224     it did the reset first. */
4225
4226     case HELO_CMD:
4227       HAD(SCH_HELO);
4228       hello = US"HELO";
4229       fl.esmtp = FALSE;
4230       goto HELO_EHLO;
4231
4232     case EHLO_CMD:
4233       HAD(SCH_EHLO);
4234       hello = US"EHLO";
4235       fl.esmtp = TRUE;
4236
4237     HELO_EHLO:      /* Common code for HELO and EHLO */
4238       cmd_list[CMD_LIST_HELO].is_mail_cmd = FALSE;
4239       cmd_list[CMD_LIST_EHLO].is_mail_cmd = FALSE;
4240
4241       /* Reject the HELO if its argument was invalid or non-existent. A
4242       successful check causes the argument to be saved in malloc store. */
4243
4244       if (!check_helo(smtp_cmd_data))
4245         {
4246         smtp_printf("501 Syntactically invalid %s argument(s)\r\n", FALSE, hello);
4247
4248         log_write(0, LOG_MAIN|LOG_REJECT, "rejected %s from %s: syntactically "
4249           "invalid argument(s): %s", hello, host_and_ident(FALSE),
4250           *smtp_cmd_argument == 0 ? US"(no argument given)" :
4251                              string_printing(smtp_cmd_argument));
4252
4253         if (++synprot_error_count > smtp_max_synprot_errors)
4254           {
4255           log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
4256             "syntax or protocol errors (last command was \"%s\", %s)",
4257             host_and_ident(FALSE), string_printing(smtp_cmd_buffer),
4258             string_from_gstring(s_connhad_log(NULL))
4259             );
4260           done = 1;
4261           }
4262
4263         break;
4264         }
4265
4266       /* If sender_host_unknown is true, we have got here via the -bs interface,
4267       not called from inetd. Otherwise, we are running an IP connection and the
4268       host address will be set. If the helo name is the primary name of this
4269       host and we haven't done a reverse lookup, force one now. If helo_verify_required
4270       is set, ensure that the HELO name matches the actual host. If helo_verify
4271       is set, do the same check, but softly. */
4272
4273       if (!f.sender_host_unknown)
4274         {
4275         BOOL old_helo_verified = f.helo_verified;
4276         uschar *p = smtp_cmd_data;
4277
4278         while (*p != 0 && !isspace(*p)) { *p = tolower(*p); p++; }
4279         *p = 0;
4280
4281         /* Force a reverse lookup if HELO quoted something in helo_lookup_domains
4282         because otherwise the log can be confusing. */
4283
4284         if (  !sender_host_name
4285            && match_isinlist(sender_helo_name, CUSS &helo_lookup_domains, 0,
4286                 &domainlist_anchor, NULL, MCL_DOMAIN, TRUE, NULL) == OK)
4287           (void)host_name_lookup();
4288
4289         /* Rebuild the fullhost info to include the HELO name (and the real name
4290         if it was looked up.) */
4291
4292         host_build_sender_fullhost();  /* Rebuild */
4293         set_process_info("handling%s incoming connection from %s",
4294           tls_in.active.sock >= 0 ? " TLS" : "", host_and_ident(FALSE));
4295
4296         /* Verify if configured. This doesn't give much security, but it does
4297         make some people happy to be able to do it. If helo_verify_required is set,
4298         (host matches helo_verify_hosts) failure forces rejection. If helo_verify
4299         is set (host matches helo_try_verify_hosts), it does not. This is perhaps
4300         now obsolescent, since the verification can now be requested selectively
4301         at ACL time. */
4302
4303         f.helo_verified = f.helo_verify_failed = sender_helo_dnssec = FALSE;
4304         if (fl.helo_verify_required || fl.helo_verify)
4305           {
4306           BOOL tempfail = !smtp_verify_helo();
4307           if (!f.helo_verified)
4308             {
4309             if (fl.helo_verify_required)
4310               {
4311               smtp_printf("%d %s argument does not match calling host\r\n", FALSE,
4312                 tempfail? 451 : 550, hello);
4313               log_write(0, LOG_MAIN|LOG_REJECT, "%srejected \"%s %s\" from %s",
4314                 tempfail? "temporarily " : "",
4315                 hello, sender_helo_name, host_and_ident(FALSE));
4316               f.helo_verified = old_helo_verified;
4317               break;                   /* End of HELO/EHLO processing */
4318               }
4319             HDEBUG(D_all) debug_printf("%s verification failed but host is in "
4320               "helo_try_verify_hosts\n", hello);
4321             }
4322           }
4323         }
4324
4325 #ifdef SUPPORT_SPF
4326       /* set up SPF context */
4327       spf_conn_init(sender_helo_name, sender_host_address);
4328 #endif
4329
4330       /* Apply an ACL check if one is defined; afterwards, recheck
4331       synchronization in case the client started sending in a delay. */
4332
4333       if (acl_smtp_helo)
4334         if ((rc = acl_check(ACL_WHERE_HELO, NULL, acl_smtp_helo,
4335                   &user_msg, &log_msg)) != OK)
4336           {
4337           done = smtp_handle_acl_fail(ACL_WHERE_HELO, rc, user_msg, log_msg);
4338           sender_helo_name = NULL;
4339           host_build_sender_fullhost();  /* Rebuild */
4340           break;
4341           }
4342 #ifndef DISABLE_PIPE_CONNECT
4343         else if (!fl.pipe_connect_acceptable && !check_sync())
4344 #else
4345         else if (!check_sync())
4346 #endif
4347           goto SYNC_FAILURE;
4348
4349       /* Generate an OK reply. The default string includes the ident if present,
4350       and also the IP address if present. Reflecting back the ident is intended
4351       as a deterrent to mail forgers. For maximum efficiency, and also because
4352       some broken systems expect each response to be in a single packet, arrange
4353       that the entire reply is sent in one write(). */
4354
4355       fl.auth_advertised = FALSE;
4356       f.smtp_in_pipelining_advertised = FALSE;
4357 #ifndef DISABLE_TLS
4358       fl.tls_advertised = FALSE;
4359 #endif
4360       fl.dsn_advertised = FALSE;
4361 #ifdef SUPPORT_I18N
4362       fl.smtputf8_advertised = FALSE;
4363 #endif
4364
4365       /* Expand the per-connection message count limit option */
4366       smtp_mailcmd_max = expand_mailmax(smtp_accept_max_per_connection);
4367
4368       smtp_code = US"250 ";        /* Default response code plus space*/
4369       if (!user_msg)
4370         {
4371         /* sender_host_name below will be tainted, so save on copy when we hit it */
4372         g = string_get_tainted(24, TRUE);
4373         g = string_fmt_append(g, "%.3s %s Hello %s%s%s",
4374           smtp_code,
4375           smtp_active_hostname,
4376           sender_ident ? sender_ident : US"",
4377           sender_ident ? US" at " : US"",
4378           sender_host_name ? sender_host_name : sender_helo_name);
4379
4380         if (sender_host_address)
4381           g = string_fmt_append(g, " [%s]", sender_host_address);
4382         }
4383
4384       /* A user-supplied EHLO greeting may not contain more than one line. Note
4385       that the code returned by smtp_message_code() includes the terminating
4386       whitespace character. */
4387
4388       else
4389         {
4390         char *ss;
4391         int codelen = 4;
4392         smtp_message_code(&smtp_code, &codelen, &user_msg, NULL, TRUE);
4393         s = string_sprintf("%.*s%s", codelen, smtp_code, user_msg);
4394         if ((ss = strpbrk(CS s, "\r\n")) != NULL)
4395           {
4396           log_write(0, LOG_MAIN|LOG_PANIC, "EHLO/HELO response must not contain "
4397             "newlines: message truncated: %s", string_printing(s));
4398           *ss = 0;
4399           }
4400         g = string_cat(NULL, s);
4401         }
4402
4403       g = string_catn(g, US"\r\n", 2);
4404
4405       /* If we received EHLO, we must create a multiline response which includes
4406       the functions supported. */
4407
4408       if (fl.esmtp)
4409         {
4410         g->s[3] = '-';
4411
4412         /* I'm not entirely happy with this, as an MTA is supposed to check
4413         that it has enough room to accept a message of maximum size before
4414         it sends this. However, there seems little point in not sending it.
4415         The actual size check happens later at MAIL FROM time. By postponing it
4416         till then, VRFY and EXPN can be used after EHLO when space is short. */
4417
4418         if (thismessage_size_limit > 0)
4419           g = string_fmt_append(g, "%.3s-SIZE %d\r\n", smtp_code,
4420             thismessage_size_limit);
4421         else
4422           {
4423           g = string_catn(g, smtp_code, 3);
4424           g = string_catn(g, US"-SIZE\r\n", 7);
4425           }
4426
4427 #ifdef EXPERIMENTAL_ESMTP_LIMITS
4428         if (  (smtp_mailcmd_max > 0 || recipients_max)
4429            && verify_check_host(&limits_advertise_hosts) == OK)
4430           {
4431           g = string_fmt_append(g, "%.3s-LIMITS", smtp_code);
4432           if (smtp_mailcmd_max > 0)
4433             g = string_fmt_append(g, " MAILMAX=%d", smtp_mailcmd_max);
4434           if (recipients_max)
4435             g = string_fmt_append(g, " RCPTMAX=%d", recipients_max);
4436           g = string_catn(g, US"\r\n", 2);
4437           }
4438 #endif
4439
4440         /* Exim does not do protocol conversion or data conversion. It is 8-bit
4441         clean; if it has an 8-bit character in its hand, it just sends it. It
4442         cannot therefore specify 8BITMIME and remain consistent with the RFCs.
4443         However, some users want this option simply in order to stop MUAs
4444         mangling messages that contain top-bit-set characters. It is therefore
4445         provided as an option. */
4446
4447         if (accept_8bitmime)
4448           {
4449           g = string_catn(g, smtp_code, 3);
4450           g = string_catn(g, US"-8BITMIME\r\n", 11);
4451           }
4452
4453         /* Advertise DSN support if configured to do so. */
4454         if (verify_check_host(&dsn_advertise_hosts) != FAIL)
4455           {
4456           g = string_catn(g, smtp_code, 3);
4457           g = string_catn(g, US"-DSN\r\n", 6);
4458           fl.dsn_advertised = TRUE;
4459           }
4460
4461         /* Advertise ETRN/VRFY/EXPN if there's are ACL checking whether a host is
4462         permitted to issue them; a check is made when any host actually tries. */
4463
4464         if (acl_smtp_etrn)
4465           {
4466           g = string_catn(g, smtp_code, 3);
4467           g = string_catn(g, US"-ETRN\r\n", 7);
4468           }
4469         if (acl_smtp_vrfy)
4470           {
4471           g = string_catn(g, smtp_code, 3);
4472           g = string_catn(g, US"-VRFY\r\n", 7);
4473           }
4474         if (acl_smtp_expn)
4475           {
4476           g = string_catn(g, smtp_code, 3);
4477           g = string_catn(g, US"-EXPN\r\n", 7);
4478           }
4479
4480         /* Exim is quite happy with pipelining, so let the other end know that
4481         it is safe to use it, unless advertising is disabled. */
4482
4483         if (  f.pipelining_enable
4484            && verify_check_host(&pipelining_advertise_hosts) == OK)
4485           {
4486           g = string_catn(g, smtp_code, 3);
4487           g = string_catn(g, US"-PIPELINING\r\n", 13);
4488           sync_cmd_limit = NON_SYNC_CMD_PIPELINING;
4489           f.smtp_in_pipelining_advertised = TRUE;
4490
4491 #ifndef DISABLE_PIPE_CONNECT
4492           if (fl.pipe_connect_acceptable)
4493             {
4494             f.smtp_in_early_pipe_advertised = TRUE;
4495             g = string_catn(g, smtp_code, 3);
4496             g = string_catn(g, US"-" EARLY_PIPE_FEATURE_NAME "\r\n", EARLY_PIPE_FEATURE_LEN+3);
4497             }
4498 #endif
4499           }
4500
4501
4502         /* If any server authentication mechanisms are configured, advertise
4503         them if the current host is in auth_advertise_hosts. The problem with
4504         advertising always is that some clients then require users to
4505         authenticate (and aren't configurable otherwise) even though it may not
4506         be necessary (e.g. if the host is in host_accept_relay).
4507
4508         RFC 2222 states that SASL mechanism names contain only upper case
4509         letters, so output the names in upper case, though we actually recognize
4510         them in either case in the AUTH command. */
4511
4512         if (  auths
4513 #ifdef AUTH_TLS
4514            && !sender_host_authenticated
4515 #endif
4516            && verify_check_host(&auth_advertise_hosts) == OK
4517            )
4518           {
4519           BOOL first = TRUE;
4520           for (auth_instance * au = auths; au; au = au->next)
4521             {
4522             au->advertised = FALSE;
4523             if (au->server)
4524               {
4525               DEBUG(D_auth+D_expand) debug_printf_indent(
4526                 "Evaluating advertise_condition for %s %s athenticator\n",
4527                 au->name, au->public_name);
4528               if (  !au->advertise_condition
4529                  || expand_check_condition(au->advertise_condition, au->name,
4530                         US"authenticator")
4531                  )
4532                 {
4533                 int saveptr;
4534                 if (first)
4535                   {
4536                   g = string_catn(g, smtp_code, 3);
4537                   g = string_catn(g, US"-AUTH", 5);
4538                   first = FALSE;
4539                   fl.auth_advertised = TRUE;
4540                   }
4541                 saveptr = g->ptr;
4542                 g = string_catn(g, US" ", 1);
4543                 g = string_cat (g, au->public_name);
4544                 while (++saveptr < g->ptr) g->s[saveptr] = toupper(g->s[saveptr]);
4545                 au->advertised = TRUE;
4546                 }
4547               }
4548             }
4549
4550           if (!first) g = string_catn(g, US"\r\n", 2);
4551           }
4552
4553         /* RFC 3030 CHUNKING */
4554
4555         if (verify_check_host(&chunking_advertise_hosts) != FAIL)
4556           {
4557           g = string_catn(g, smtp_code, 3);
4558           g = string_catn(g, US"-CHUNKING\r\n", 11);
4559           f.chunking_offered = TRUE;
4560           chunking_state = CHUNKING_OFFERED;
4561           }
4562
4563         /* Advertise TLS (Transport Level Security) aka SSL (Secure Socket Layer)
4564         if it has been included in the binary, and the host matches
4565         tls_advertise_hosts. We must *not* advertise if we are already in a
4566         secure connection. */
4567
4568 #ifndef DISABLE_TLS
4569         if (tls_in.active.sock < 0 &&
4570             verify_check_host(&tls_advertise_hosts) != FAIL)
4571           {
4572           g = string_catn(g, smtp_code, 3);
4573           g = string_catn(g, US"-STARTTLS\r\n", 11);
4574           fl.tls_advertised = TRUE;
4575           }
4576 #endif
4577
4578 #ifndef DISABLE_PRDR
4579         /* Per Recipient Data Response, draft by Eric A. Hall extending RFC */
4580         if (prdr_enable)
4581           {
4582           g = string_catn(g, smtp_code, 3);
4583           g = string_catn(g, US"-PRDR\r\n", 7);
4584           }
4585 #endif
4586
4587 #ifdef SUPPORT_I18N
4588         if (  accept_8bitmime
4589            && verify_check_host(&smtputf8_advertise_hosts) != FAIL)
4590           {
4591           g = string_catn(g, smtp_code, 3);
4592           g = string_catn(g, US"-SMTPUTF8\r\n", 11);
4593           fl.smtputf8_advertised = TRUE;
4594           }
4595 #endif
4596
4597         /* Finish off the multiline reply with one that is always available. */
4598
4599         g = string_catn(g, smtp_code, 3);
4600         g = string_catn(g, US" HELP\r\n", 7);
4601         }
4602
4603       /* Terminate the string (for debug), write it, and note that HELO/EHLO
4604       has been seen. */
4605
4606 #ifndef DISABLE_TLS
4607       if (tls_in.active.sock >= 0)
4608         (void)tls_write(NULL, g->s, g->ptr,
4609 # ifndef DISABLE_PIPE_CONNECT
4610                         fl.pipe_connect_acceptable && pipeline_connect_sends());
4611 # else
4612                         FALSE);
4613 # endif
4614       else
4615 #endif
4616         (void) fwrite(g->s, 1, g->ptr, smtp_out);
4617
4618       DEBUG(D_receive)
4619         {
4620         uschar *cr;
4621
4622         (void) string_from_gstring(g);
4623         while ((cr = Ustrchr(g->s, '\r')) != NULL)   /* lose CRs */
4624           memmove(cr, cr + 1, (g->ptr--) - (cr - g->s));
4625         debug_printf("SMTP>> %s", g->s);
4626         }
4627       fl.helo_seen = TRUE;
4628
4629       /* Reset the protocol and the state, abandoning any previous message. */
4630       received_protocol =
4631         (sender_host_address ? protocols : protocols_local)
4632           [ (fl.esmtp
4633             ? pextend + (sender_host_authenticated ? pauthed : 0)
4634             : pnormal)
4635           + (tls_in.active.sock >= 0 ? pcrpted : 0)
4636           ];
4637       cancel_cutthrough_connection(TRUE, US"sent EHLO response");
4638       reset_point = smtp_reset(reset_point);
4639       toomany = FALSE;
4640       break;   /* HELO/EHLO */
4641
4642
4643     /* The MAIL command requires an address as an operand. All we do
4644     here is to parse it for syntactic correctness. The form "<>" is
4645     a special case which converts into an empty string. The start/end
4646     pointers in the original are not used further for this address, as
4647     it is the canonical extracted address which is all that is kept. */
4648
4649     case MAIL_CMD:
4650       HAD(SCH_MAIL);
4651       smtp_mailcmd_count++;              /* Count for limit and ratelimit */
4652       message_start();
4653       was_rej_mail = TRUE;               /* Reset if accepted */
4654       env_mail_type_t * mail_args;       /* Sanity check & validate args */
4655
4656       if (!fl.helo_seen)
4657         if (  fl.helo_verify_required
4658            || verify_check_host(&hosts_require_helo) == OK)
4659           {
4660           smtp_printf("503 HELO or EHLO required\r\n", FALSE);
4661           log_write(0, LOG_MAIN|LOG_REJECT, "rejected MAIL from %s: no "
4662             "HELO/EHLO given", host_and_ident(FALSE));
4663           break;
4664           }
4665         else if (smtp_mailcmd_max < 0)
4666           smtp_mailcmd_max = expand_mailmax(smtp_accept_max_per_connection);
4667
4668       if (sender_address)
4669         {
4670         done = synprot_error(L_smtp_protocol_error, 503, NULL,
4671           US"sender already given");
4672         break;
4673         }
4674
4675       if (!*smtp_cmd_data)
4676         {
4677         done = synprot_error(L_smtp_protocol_error, 501, NULL,
4678           US"MAIL must have an address operand");
4679         break;
4680         }
4681
4682       /* Check to see if the limit for messages per connection would be
4683       exceeded by accepting further messages. */
4684
4685       if (smtp_mailcmd_max > 0 && smtp_mailcmd_count > smtp_mailcmd_max)
4686         {
4687         smtp_printf("421 too many messages in this connection\r\n", FALSE);
4688         log_write(0, LOG_MAIN|LOG_REJECT, "rejected MAIL command %s: too many "
4689           "messages in one connection", host_and_ident(TRUE));
4690         break;
4691         }
4692
4693       /* Reset for start of message - even if this is going to fail, we
4694       obviously need to throw away any previous data. */
4695
4696       cancel_cutthrough_connection(TRUE, US"MAIL received");
4697       reset_point = smtp_reset(reset_point);
4698       toomany = FALSE;
4699       sender_data = recipient_data = NULL;
4700
4701       /* Loop, checking for ESMTP additions to the MAIL FROM command. */
4702
4703       if (fl.esmtp) for(;;)
4704         {
4705         uschar *name, *value, *end;
4706         unsigned long int size;
4707         BOOL arg_error = FALSE;
4708
4709         if (!extract_option(&name, &value)) break;
4710
4711         for (mail_args = env_mail_type_list;
4712              mail_args->value != ENV_MAIL_OPT_NULL;
4713              mail_args++
4714             )
4715           if (strcmpic(name, mail_args->name) == 0)
4716             break;
4717         if (mail_args->need_value && strcmpic(value, US"") == 0)
4718           break;
4719
4720         switch(mail_args->value)
4721           {
4722           /* Handle SIZE= by reading the value. We don't do the check till later,
4723           in order to be able to log the sender address on failure. */
4724           case ENV_MAIL_OPT_SIZE:
4725             if (((size = Ustrtoul(value, &end, 10)), *end == 0))
4726               {
4727               if ((size == ULONG_MAX && errno == ERANGE) || size > INT_MAX)
4728                 size = INT_MAX;
4729               message_size = (int)size;
4730               }
4731             else
4732               arg_error = TRUE;
4733             break;
4734
4735           /* If this session was initiated with EHLO and accept_8bitmime is set,
4736           Exim will have indicated that it supports the BODY=8BITMIME option. In
4737           fact, it does not support this according to the RFCs, in that it does not
4738           take any special action for forwarding messages containing 8-bit
4739           characters. That is why accept_8bitmime is not the default setting, but
4740           some sites want the action that is provided. We recognize both "8BITMIME"
4741           and "7BIT" as body types, but take no action. */
4742           case ENV_MAIL_OPT_BODY:
4743             if (accept_8bitmime) {
4744               if (strcmpic(value, US"8BITMIME") == 0)
4745                 body_8bitmime = 8;
4746               else if (strcmpic(value, US"7BIT") == 0)
4747                 body_8bitmime = 7;
4748               else
4749                 {
4750                 body_8bitmime = 0;
4751                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4752                   US"invalid data for BODY");
4753                 goto COMMAND_LOOP;
4754                 }
4755               DEBUG(D_receive) debug_printf("8BITMIME: %d\n", body_8bitmime);
4756               break;
4757             }
4758             arg_error = TRUE;
4759             break;
4760
4761           /* Handle the two DSN options, but only if configured to do so (which
4762           will have caused "DSN" to be given in the EHLO response). The code itself
4763           is included only if configured in at build time. */
4764
4765           case ENV_MAIL_OPT_RET:
4766             if (fl.dsn_advertised)
4767               {
4768               /* Check if RET has already been set */
4769               if (dsn_ret > 0)
4770                 {
4771                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4772                   US"RET can be specified once only");
4773                 goto COMMAND_LOOP;
4774                 }
4775               dsn_ret = strcmpic(value, US"HDRS") == 0
4776                 ? dsn_ret_hdrs
4777                 : strcmpic(value, US"FULL") == 0
4778                 ? dsn_ret_full
4779                 : 0;
4780               DEBUG(D_receive) debug_printf("DSN_RET: %d\n", dsn_ret);
4781               /* Check for invalid invalid value, and exit with error */
4782               if (dsn_ret == 0)
4783                 {
4784                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4785                   US"Value for RET is invalid");
4786                 goto COMMAND_LOOP;
4787                 }
4788               }
4789             break;
4790           case ENV_MAIL_OPT_ENVID:
4791             if (fl.dsn_advertised)
4792               {
4793               /* Check if the dsn envid has been already set */
4794               if (dsn_envid)
4795                 {
4796                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4797                   US"ENVID can be specified once only");
4798                 goto COMMAND_LOOP;
4799                 }
4800               dsn_envid = string_copy(value);
4801               DEBUG(D_receive) debug_printf("DSN_ENVID: %s\n", dsn_envid);
4802               }
4803             break;
4804
4805           /* Handle the AUTH extension. If the value given is not "<>" and either
4806           the ACL says "yes" or there is no ACL but the sending host is
4807           authenticated, we set it up as the authenticated sender. However, if the
4808           authenticator set a condition to be tested, we ignore AUTH on MAIL unless
4809           the condition is met. The value of AUTH is an xtext, which means that +,
4810           = and cntrl chars are coded in hex; however "<>" is unaffected by this
4811           coding. */
4812           case ENV_MAIL_OPT_AUTH:
4813             if (Ustrcmp(value, "<>") != 0)
4814               {
4815               int rc;
4816               uschar *ignore_msg;
4817
4818               if (auth_xtextdecode(value, &authenticated_sender) < 0)
4819                 {
4820                 /* Put back terminator overrides for error message */
4821                 value[-1] = '=';
4822                 name[-1] = ' ';
4823                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4824                   US"invalid data for AUTH");
4825                 goto COMMAND_LOOP;
4826                 }
4827               if (!acl_smtp_mailauth)
4828                 {
4829                 ignore_msg = US"client not authenticated";
4830                 rc = sender_host_authenticated ? OK : FAIL;
4831                 }
4832               else
4833                 {
4834                 ignore_msg = US"rejected by ACL";
4835                 rc = acl_check(ACL_WHERE_MAILAUTH, NULL, acl_smtp_mailauth,
4836                   &user_msg, &log_msg);
4837                 }
4838
4839               switch (rc)
4840                 {
4841                 case OK:
4842                   if (authenticated_by == NULL ||
4843                       authenticated_by->mail_auth_condition == NULL ||
4844                       expand_check_condition(authenticated_by->mail_auth_condition,
4845                           authenticated_by->name, US"authenticator"))
4846                     break;     /* Accept the AUTH */
4847
4848                   ignore_msg = US"server_mail_auth_condition failed";
4849                   if (authenticated_id != NULL)
4850                     ignore_msg = string_sprintf("%s: authenticated ID=\"%s\"",
4851                       ignore_msg, authenticated_id);
4852
4853                 /* Fall through */
4854
4855                 case FAIL:
4856                   authenticated_sender = NULL;
4857                   log_write(0, LOG_MAIN, "ignoring AUTH=%s from %s (%s)",
4858                     value, host_and_ident(TRUE), ignore_msg);
4859                   break;
4860
4861                 /* Should only get DEFER or ERROR here. Put back terminator
4862                 overrides for error message */
4863
4864                 default:
4865                   value[-1] = '=';
4866                   name[-1] = ' ';
4867                   (void)smtp_handle_acl_fail(ACL_WHERE_MAILAUTH, rc, user_msg,
4868                     log_msg);
4869                   goto COMMAND_LOOP;
4870                 }
4871               }
4872               break;
4873
4874 #ifndef DISABLE_PRDR
4875           case ENV_MAIL_OPT_PRDR:
4876             if (prdr_enable)
4877               prdr_requested = TRUE;
4878             break;
4879 #endif
4880
4881 #ifdef SUPPORT_I18N
4882           case ENV_MAIL_OPT_UTF8:
4883             if (!fl.smtputf8_advertised)
4884               {
4885               done = synprot_error(L_smtp_syntax_error, 501, NULL,
4886                 US"SMTPUTF8 used when not advertised");
4887               goto COMMAND_LOOP;
4888               }
4889
4890             DEBUG(D_receive) debug_printf("smtputf8 requested\n");
4891             message_smtputf8 = allow_utf8_domains = TRUE;
4892             if (Ustrncmp(received_protocol, US"utf8", 4) != 0)
4893               {
4894               int old_pool = store_pool;
4895               store_pool = POOL_PERM;
4896               received_protocol = string_sprintf("utf8%s", received_protocol);
4897               store_pool = old_pool;
4898               }
4899             break;
4900 #endif
4901
4902           /* No valid option. Stick back the terminator characters and break
4903           the loop.  Do the name-terminator second as extract_option sets
4904           value==name when it found no equal-sign.
4905           An error for a malformed address will occur. */
4906           case ENV_MAIL_OPT_NULL:
4907             value[-1] = '=';
4908             name[-1] = ' ';
4909             arg_error = TRUE;
4910             break;
4911
4912           default:  assert(0);
4913           }
4914         /* Break out of for loop if switch() had bad argument or
4915            when start of the email address is reached */
4916         if (arg_error) break;
4917         }
4918
4919       /* If we have passed the threshold for rate limiting, apply the current
4920       delay, and update it for next time, provided this is a limited host. */
4921
4922       if (smtp_mailcmd_count > smtp_rlm_threshold &&
4923           verify_check_host(&smtp_ratelimit_hosts) == OK)
4924         {
4925         DEBUG(D_receive) debug_printf("rate limit MAIL: delay %.3g sec\n",
4926           smtp_delay_mail/1000.0);
4927         millisleep((int)smtp_delay_mail);
4928         smtp_delay_mail *= smtp_rlm_factor;
4929         if (smtp_delay_mail > (double)smtp_rlm_limit)
4930           smtp_delay_mail = (double)smtp_rlm_limit;
4931         }
4932
4933       /* Now extract the address, first applying any SMTP-time rewriting. The
4934       TRUE flag allows "<>" as a sender address. */
4935
4936       raw_sender = rewrite_existflags & rewrite_smtp
4937         /* deconst ok as smtp_cmd_data was not const */
4938         ? US rewrite_one(smtp_cmd_data, rewrite_smtp, NULL, FALSE, US"",
4939                       global_rewrite_rules)
4940         : smtp_cmd_data;
4941
4942       raw_sender =
4943         parse_extract_address(raw_sender, &errmess, &start, &end, &sender_domain,
4944           TRUE);
4945
4946       if (!raw_sender)
4947         {
4948         done = synprot_error(L_smtp_syntax_error, 501, smtp_cmd_data, errmess);
4949         break;
4950         }
4951
4952       sender_address = raw_sender;
4953
4954       /* If there is a configured size limit for mail, check that this message
4955       doesn't exceed it. The check is postponed to this point so that the sender
4956       can be logged. */
4957
4958       if (thismessage_size_limit > 0 && message_size > thismessage_size_limit)
4959         {
4960         smtp_printf("552 Message size exceeds maximum permitted\r\n", FALSE);
4961         log_write(L_size_reject,
4962             LOG_MAIN|LOG_REJECT, "rejected MAIL FROM:<%s> %s: "
4963             "message too big: size%s=%d max=%d",
4964             sender_address,
4965             host_and_ident(TRUE),
4966             (message_size == INT_MAX)? ">" : "",
4967             message_size,
4968             thismessage_size_limit);
4969         sender_address = NULL;
4970         break;
4971         }
4972
4973       /* Check there is enough space on the disk unless configured not to.
4974       When smtp_check_spool_space is set, the check is for thismessage_size_limit
4975       plus the current message - i.e. we accept the message only if it won't
4976       reduce the space below the threshold. Add 5000 to the size to allow for
4977       overheads such as the Received: line and storing of recipients, etc.
4978       By putting the check here, even when SIZE is not given, it allow VRFY
4979       and EXPN etc. to be used when space is short. */
4980
4981       if (!receive_check_fs(
4982            smtp_check_spool_space && message_size >= 0
4983               ? message_size + 5000 : 0))
4984         {
4985         smtp_printf("452 Space shortage, please try later\r\n", FALSE);
4986         sender_address = NULL;
4987         break;
4988         }
4989
4990       /* If sender_address is unqualified, reject it, unless this is a locally
4991       generated message, or the sending host or net is permitted to send
4992       unqualified addresses - typically local machines behaving as MUAs -
4993       in which case just qualify the address. The flag is set above at the start
4994       of the SMTP connection. */
4995
4996       if (!sender_domain && *sender_address)
4997         if (f.allow_unqualified_sender)
4998           {
4999           sender_domain = Ustrlen(sender_address) + 1;
5000           /* deconst ok as sender_address was not const */
5001           sender_address = US rewrite_address_qualify(sender_address, FALSE);
5002           DEBUG(D_receive) debug_printf("unqualified address %s accepted\n",
5003             raw_sender);
5004           }
5005         else
5006           {
5007           smtp_printf("501 %s: sender address must contain a domain\r\n", FALSE,
5008             smtp_cmd_data);
5009           log_write(L_smtp_syntax_error,
5010             LOG_MAIN|LOG_REJECT,
5011             "unqualified sender rejected: <%s> %s%s",
5012             raw_sender,
5013             host_and_ident(TRUE),
5014             host_lookup_msg);
5015           sender_address = NULL;
5016           break;
5017           }
5018
5019       /* Apply an ACL check if one is defined, before responding. Afterwards,
5020       when pipelining is not advertised, do another sync check in case the ACL
5021       delayed and the client started sending in the meantime. */
5022
5023       if (acl_smtp_mail)
5024         {
5025         rc = acl_check(ACL_WHERE_MAIL, NULL, acl_smtp_mail, &user_msg, &log_msg);
5026         if (rc == OK && !f.smtp_in_pipelining_advertised && !check_sync())
5027           goto SYNC_FAILURE;
5028         }
5029       else
5030         rc = OK;
5031
5032       if (rc == OK || rc == DISCARD)
5033         {
5034         BOOL more = pipeline_response();
5035
5036         if (!user_msg)
5037           smtp_printf("%s%s%s", more, US"250 OK",
5038                     #ifndef DISABLE_PRDR
5039                       prdr_requested ? US", PRDR Requested" : US"",
5040                     #else
5041                       US"",
5042                     #endif
5043                       US"\r\n");
5044         else
5045           {
5046         #ifndef DISABLE_PRDR
5047           if (prdr_requested)
5048              user_msg = string_sprintf("%s%s", user_msg, US", PRDR Requested");
5049         #endif
5050           smtp_user_msg(US"250", user_msg);
5051           }
5052         smtp_delay_rcpt = smtp_rlr_base;
5053         f.recipients_discarded = (rc == DISCARD);
5054         was_rej_mail = FALSE;
5055         }
5056       else
5057         {
5058         done = smtp_handle_acl_fail(ACL_WHERE_MAIL, rc, user_msg, log_msg);
5059         sender_address = NULL;
5060         }
5061       break;
5062
5063
5064     /* The RCPT command requires an address as an operand. There may be any
5065     number of RCPT commands, specifying multiple recipients. We build them all
5066     into a data structure. The start/end values given by parse_extract_address
5067     are not used, as we keep only the extracted address. */
5068
5069     case RCPT_CMD:
5070       HAD(SCH_RCPT);
5071       /* We got really to many recipients. A check against configured
5072       limits is done later */
5073       if (rcpt_count < 0 || rcpt_count >= INT_MAX/2)
5074         log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Too many recipients: %d", rcpt_count);
5075       rcpt_count++;
5076       was_rcpt = fl.rcpt_in_progress = TRUE;
5077
5078       /* There must be a sender address; if the sender was rejected and
5079       pipelining was advertised, we assume the client was pipelining, and do not
5080       count this as a protocol error. Reset was_rej_mail so that further RCPTs
5081       get the same treatment. */
5082
5083       if (sender_address == NULL)
5084         {
5085         if (f.smtp_in_pipelining_advertised && last_was_rej_mail)
5086           {
5087           smtp_printf("503 sender not yet given\r\n", FALSE);
5088           was_rej_mail = TRUE;
5089           }
5090         else
5091           {
5092           done = synprot_error(L_smtp_protocol_error, 503, NULL,
5093             US"sender not yet given");
5094           was_rcpt = FALSE;             /* Not a valid RCPT */
5095           }
5096         rcpt_fail_count++;
5097         break;
5098         }
5099
5100       /* Check for an operand */
5101
5102       if (smtp_cmd_data[0] == 0)
5103         {
5104         done = synprot_error(L_smtp_syntax_error, 501, NULL,
5105           US"RCPT must have an address operand");
5106         rcpt_fail_count++;
5107         break;
5108         }
5109
5110       /* Set the DSN flags orcpt and dsn_flags from the session*/
5111       orcpt = NULL;
5112       dsn_flags = 0;
5113
5114       if (fl.esmtp) for(;;)
5115         {
5116         uschar *name, *value;
5117
5118         if (!extract_option(&name, &value))
5119           break;
5120
5121         if (fl.dsn_advertised && strcmpic(name, US"ORCPT") == 0)
5122           {
5123           /* Check whether orcpt has been already set */
5124           if (orcpt)
5125             {
5126             done = synprot_error(L_smtp_syntax_error, 501, NULL,
5127               US"ORCPT can be specified once only");
5128             goto COMMAND_LOOP;
5129             }
5130           orcpt = string_copy(value);
5131           DEBUG(D_receive) debug_printf("DSN orcpt: %s\n", orcpt);
5132           }
5133
5134         else if (fl.dsn_advertised && strcmpic(name, US"NOTIFY") == 0)
5135           {
5136           /* Check if the notify flags have been already set */
5137           if (dsn_flags > 0)
5138             {
5139             done = synprot_error(L_smtp_syntax_error, 501, NULL,
5140                 US"NOTIFY can be specified once only");
5141             goto COMMAND_LOOP;
5142             }
5143           if (strcmpic(value, US"NEVER") == 0)
5144             dsn_flags |= rf_notify_never;
5145           else
5146             {
5147             uschar *p = value;
5148             while (*p != 0)
5149               {
5150               uschar *pp = p;
5151               while (*pp != 0 && *pp != ',') pp++;
5152               if (*pp == ',') *pp++ = 0;
5153               if (strcmpic(p, US"SUCCESS") == 0)
5154                 {
5155                 DEBUG(D_receive) debug_printf("DSN: Setting notify success\n");
5156                 dsn_flags |= rf_notify_success;
5157                 }
5158               else if (strcmpic(p, US"FAILURE") == 0)
5159                 {
5160                 DEBUG(D_receive) debug_printf("DSN: Setting notify failure\n");
5161                 dsn_flags |= rf_notify_failure;
5162                 }
5163               else if (strcmpic(p, US"DELAY") == 0)
5164                 {
5165                 DEBUG(D_receive) debug_printf("DSN: Setting notify delay\n");
5166                 dsn_flags |= rf_notify_delay;
5167                 }
5168               else
5169                 {
5170                 /* Catch any strange values */
5171                 done = synprot_error(L_smtp_syntax_error, 501, NULL,
5172                   US"Invalid value for NOTIFY parameter");
5173                 goto COMMAND_LOOP;
5174                 }
5175               p = pp;
5176               }
5177               DEBUG(D_receive) debug_printf("DSN Flags: %x\n", dsn_flags);
5178             }
5179           }
5180
5181         /* Unknown option. Stick back the terminator characters and break
5182         the loop. An error for a malformed address will occur. */
5183
5184         else
5185           {
5186           DEBUG(D_receive) debug_printf("Invalid RCPT option: %s : %s\n", name, value);
5187           name[-1] = ' ';
5188           value[-1] = '=';
5189           break;
5190           }
5191         }
5192
5193       /* Apply SMTP rewriting then extract the working address. Don't allow "<>"
5194       as a recipient address */
5195
5196       recipient = rewrite_existflags & rewrite_smtp
5197         /* deconst ok as smtp_cmd_data was not const */
5198         ? US rewrite_one(smtp_cmd_data, rewrite_smtp, NULL, FALSE, US"",
5199             global_rewrite_rules)
5200         : smtp_cmd_data;
5201
5202       if (!(recipient = parse_extract_address(recipient, &errmess, &start, &end,
5203         &recipient_domain, FALSE)))
5204         {
5205         done = synprot_error(L_smtp_syntax_error, 501, smtp_cmd_data, errmess);
5206         rcpt_fail_count++;
5207         break;
5208         }
5209
5210       /* If the recipient address is unqualified, reject it, unless this is a
5211       locally generated message. However, unqualified addresses are permitted
5212       from a configured list of hosts and nets - typically when behaving as
5213       MUAs rather than MTAs. Sad that SMTP is used for both types of traffic,
5214       really. The flag is set at the start of the SMTP connection.
5215
5216       RFC 1123 talks about supporting "the reserved mailbox postmaster"; I always
5217       assumed this meant "reserved local part", but the revision of RFC 821 and
5218       friends now makes it absolutely clear that it means *mailbox*. Consequently
5219       we must always qualify this address, regardless. */
5220
5221       if (!recipient_domain)
5222         if (!(recipient_domain = qualify_recipient(&recipient, smtp_cmd_data,
5223                                     US"recipient")))
5224           {
5225           rcpt_fail_count++;
5226           break;
5227           }
5228
5229       /* Check maximum allowed */
5230
5231       if (rcpt_count+1 < 0 || rcpt_count > recipients_max && recipients_max > 0)
5232         {
5233         if (recipients_max_reject)
5234           {
5235           rcpt_fail_count++;
5236           smtp_printf("552 too many recipients\r\n", FALSE);
5237           if (!toomany)
5238             log_write(0, LOG_MAIN|LOG_REJECT, "too many recipients: message "
5239               "rejected: sender=<%s> %s", sender_address, host_and_ident(TRUE));
5240           }
5241         else
5242           {
5243           rcpt_defer_count++;
5244           smtp_printf("452 too many recipients\r\n", FALSE);
5245           if (!toomany)
5246             log_write(0, LOG_MAIN|LOG_REJECT, "too many recipients: excess "
5247               "temporarily rejected: sender=<%s> %s", sender_address,
5248               host_and_ident(TRUE));
5249           }
5250
5251         toomany = TRUE;
5252         break;
5253         }
5254
5255       /* If we have passed the threshold for rate limiting, apply the current
5256       delay, and update it for next time, provided this is a limited host. */
5257
5258       if (rcpt_count > smtp_rlr_threshold &&
5259           verify_check_host(&smtp_ratelimit_hosts) == OK)
5260         {
5261         DEBUG(D_receive) debug_printf("rate limit RCPT: delay %.3g sec\n",
5262           smtp_delay_rcpt/1000.0);
5263         millisleep((int)smtp_delay_rcpt);
5264         smtp_delay_rcpt *= smtp_rlr_factor;
5265         if (smtp_delay_rcpt > (double)smtp_rlr_limit)
5266           smtp_delay_rcpt = (double)smtp_rlr_limit;
5267         }
5268
5269       /* If the MAIL ACL discarded all the recipients, we bypass ACL checking
5270       for them. Otherwise, check the access control list for this recipient. As
5271       there may be a delay in this, re-check for a synchronization error
5272       afterwards, unless pipelining was advertised. */
5273
5274       if (f.recipients_discarded)
5275         rc = DISCARD;
5276       else
5277         if (  (rc = acl_check(ACL_WHERE_RCPT, recipient, acl_smtp_rcpt, &user_msg,
5278                       &log_msg)) == OK
5279            && !f.smtp_in_pipelining_advertised && !check_sync())
5280           goto SYNC_FAILURE;
5281
5282       /* The ACL was happy */
5283
5284       if (rc == OK)
5285         {
5286         BOOL more = pipeline_response();
5287
5288         if (user_msg)
5289           smtp_user_msg(US"250", user_msg);
5290         else
5291           smtp_printf("250 Accepted\r\n", more);
5292         receive_add_recipient(recipient, -1);
5293
5294         /* Set the dsn flags in the recipients_list */
5295         recipients_list[recipients_count-1].orcpt = orcpt;
5296         recipients_list[recipients_count-1].dsn_flags = dsn_flags;
5297
5298         /* DEBUG(D_receive) debug_printf("DSN: orcpt: %s  flags: %d\n",
5299           recipients_list[recipients_count-1].orcpt,
5300           recipients_list[recipients_count-1].dsn_flags); */
5301         }
5302
5303       /* The recipient was discarded */
5304
5305       else if (rc == DISCARD)
5306         {
5307         if (user_msg)
5308           smtp_user_msg(US"250", user_msg);
5309         else
5310           smtp_printf("250 Accepted\r\n", FALSE);
5311         rcpt_fail_count++;
5312         discarded = TRUE;
5313         log_write(0, LOG_MAIN|LOG_REJECT, "%s F=<%s> RCPT %s: "
5314           "discarded by %s ACL%s%s", host_and_ident(TRUE),
5315           sender_address_unrewritten ? sender_address_unrewritten : sender_address,
5316           smtp_cmd_argument, f.recipients_discarded ? "MAIL" : "RCPT",
5317           log_msg ? US": " : US"", log_msg ? log_msg : US"");
5318         }
5319
5320       /* Either the ACL failed the address, or it was deferred. */
5321
5322       else
5323         {
5324         if (rc == FAIL) rcpt_fail_count++; else rcpt_defer_count++;
5325         done = smtp_handle_acl_fail(ACL_WHERE_RCPT, rc, user_msg, log_msg);
5326         }
5327       break;
5328
5329
5330     /* The DATA command is legal only if it follows successful MAIL FROM
5331     and RCPT TO commands. However, if pipelining is advertised, a bad DATA is
5332     not counted as a protocol error if it follows RCPT (which must have been
5333     rejected if there are no recipients.) This function is complete when a
5334     valid DATA command is encountered.
5335
5336     Note concerning the code used: RFC 2821 says this:
5337
5338      -  If there was no MAIL, or no RCPT, command, or all such commands
5339         were rejected, the server MAY return a "command out of sequence"
5340         (503) or "no valid recipients" (554) reply in response to the
5341         DATA command.
5342
5343     The example in the pipelining RFC 2920 uses 554, but I use 503 here
5344     because it is the same whether pipelining is in use or not.
5345
5346     If all the RCPT commands that precede DATA provoked the same error message
5347     (often indicating some kind of system error), it is helpful to include it
5348     with the DATA rejection (an idea suggested by Tony Finch). */
5349
5350     case BDAT_CMD:
5351       {
5352       int n;
5353
5354       HAD(SCH_BDAT);
5355       if (chunking_state != CHUNKING_OFFERED)
5356         {
5357         done = synprot_error(L_smtp_protocol_error, 503, NULL,
5358           US"BDAT command used when CHUNKING not advertised");
5359         break;
5360         }
5361
5362       /* grab size, endmarker */
5363
5364       if (sscanf(CS smtp_cmd_data, "%u %n", &chunking_datasize, &n) < 1)
5365         {
5366         done = synprot_error(L_smtp_protocol_error, 501, NULL,
5367           US"missing size for BDAT command");
5368         break;
5369         }
5370       chunking_state = strcmpic(smtp_cmd_data+n, US"LAST") == 0
5371         ? CHUNKING_LAST : CHUNKING_ACTIVE;
5372       chunking_data_left = chunking_datasize;
5373       DEBUG(D_receive) debug_printf("chunking state %d, %d bytes\n",
5374                                     (int)chunking_state, chunking_data_left);
5375
5376       f.bdat_readers_wanted = TRUE; /* FIXME: redundant vs chunking_state? */
5377       f.dot_ends = FALSE;
5378
5379       goto DATA_BDAT;
5380       }
5381
5382     case DATA_CMD:
5383       HAD(SCH_DATA);
5384       f.dot_ends = TRUE;
5385       f.bdat_readers_wanted = FALSE;
5386
5387     DATA_BDAT:          /* Common code for DATA and BDAT */
5388 #ifndef DISABLE_PIPE_CONNECT
5389       fl.pipe_connect_acceptable = FALSE;
5390 #endif
5391       if (!discarded && recipients_count <= 0)
5392         {
5393         if (fl.rcpt_smtp_response_same && rcpt_smtp_response != NULL)
5394           {
5395           uschar *code = US"503";
5396           int len = Ustrlen(rcpt_smtp_response);
5397           smtp_respond(code, 3, FALSE, US"All RCPT commands were rejected with "
5398             "this error:");
5399           /* Responses from smtp_printf() will have \r\n on the end */
5400           if (len > 2 && rcpt_smtp_response[len-2] == '\r')
5401             rcpt_smtp_response[len-2] = 0;
5402           smtp_respond(code, 3, FALSE, rcpt_smtp_response);
5403           }
5404         if (f.smtp_in_pipelining_advertised && last_was_rcpt)
5405           smtp_printf("503 Valid RCPT command must precede %s\r\n", FALSE,
5406             smtp_names[smtp_connection_had[SMTP_HBUFF_PREV(smtp_ch_index)]]);
5407         else
5408           done = synprot_error(L_smtp_protocol_error, 503, NULL,
5409             smtp_connection_had[SMTP_HBUFF_PREV(smtp_ch_index)] == SCH_DATA
5410             ? US"valid RCPT command must precede DATA"
5411             : US"valid RCPT command must precede BDAT");
5412
5413         if (chunking_state > CHUNKING_OFFERED)
5414           {
5415           bdat_push_receive_functions();
5416           bdat_flush_data();
5417           }
5418         break;
5419         }
5420
5421       if (toomany && recipients_max_reject)
5422         {
5423         sender_address = NULL;  /* This will allow a new MAIL without RSET */
5424         sender_address_unrewritten = NULL;
5425         smtp_printf("554 Too many recipients\r\n", FALSE);
5426
5427         if (chunking_state > CHUNKING_OFFERED)
5428           {
5429           bdat_push_receive_functions();
5430           bdat_flush_data();
5431           }
5432         break;
5433         }
5434
5435       if (chunking_state > CHUNKING_OFFERED)
5436         rc = OK;                        /* No predata ACL or go-ahead output for BDAT */
5437       else
5438         {
5439         /* If there is an ACL, re-check the synchronization afterwards, since the
5440         ACL may have delayed.  To handle cutthrough delivery enforce a dummy call
5441         to get the DATA command sent. */
5442
5443         if (!acl_smtp_predata && cutthrough.cctx.sock < 0)
5444           rc = OK;
5445         else
5446           {
5447           uschar * acl = acl_smtp_predata ? acl_smtp_predata : US"accept";
5448           f.enable_dollar_recipients = TRUE;
5449           rc = acl_check(ACL_WHERE_PREDATA, NULL, acl, &user_msg,
5450             &log_msg);
5451           f.enable_dollar_recipients = FALSE;
5452           if (rc == OK && !check_sync())
5453             goto SYNC_FAILURE;
5454
5455           if (rc != OK)
5456             {   /* Either the ACL failed the address, or it was deferred. */
5457             done = smtp_handle_acl_fail(ACL_WHERE_PREDATA, rc, user_msg, log_msg);
5458             break;
5459             }
5460           }
5461
5462         if (user_msg)
5463           smtp_user_msg(US"354", user_msg);
5464         else
5465           smtp_printf(
5466             "354 Enter message, ending with \".\" on a line by itself\r\n", FALSE);
5467         }
5468
5469       if (f.bdat_readers_wanted)
5470         bdat_push_receive_functions();
5471
5472 #ifdef TCP_QUICKACK
5473       if (smtp_in)      /* all ACKs needed to ramp window up for bulk data */
5474         (void) setsockopt(fileno(smtp_in), IPPROTO_TCP, TCP_QUICKACK,
5475                 US &on, sizeof(on));
5476 #endif
5477       done = 3;
5478       message_ended = END_NOTENDED;   /* Indicate in middle of data */
5479
5480       break;
5481
5482
5483     case VRFY_CMD:
5484       {
5485       uschar * address;
5486
5487       HAD(SCH_VRFY);
5488
5489       if (!(address = parse_extract_address(smtp_cmd_data, &errmess,
5490             &start, &end, &recipient_domain, FALSE)))
5491         {
5492         smtp_printf("501 %s\r\n", FALSE, errmess);
5493         break;
5494         }
5495
5496       if (!recipient_domain)
5497         if (!(recipient_domain = qualify_recipient(&address, smtp_cmd_data,
5498                                     US"verify")))
5499           break;
5500
5501       if ((rc = acl_check(ACL_WHERE_VRFY, address, acl_smtp_vrfy,
5502                     &user_msg, &log_msg)) != OK)
5503         done = smtp_handle_acl_fail(ACL_WHERE_VRFY, rc, user_msg, log_msg);
5504       else
5505         {
5506         uschar * s = NULL;
5507         address_item * addr = deliver_make_addr(address, FALSE);
5508
5509         switch(verify_address(addr, NULL, vopt_is_recipient | vopt_qualify, -1,
5510                -1, -1, NULL, NULL, NULL))
5511           {
5512           case OK:
5513             s = string_sprintf("250 <%s> is deliverable", address);
5514             break;
5515
5516           case DEFER:
5517             s = (addr->user_message != NULL)?
5518               string_sprintf("451 <%s> %s", address, addr->user_message) :
5519               string_sprintf("451 Cannot resolve <%s> at this time", address);
5520             break;
5521
5522           case FAIL:
5523             s = (addr->user_message != NULL)?
5524               string_sprintf("550 <%s> %s", address, addr->user_message) :
5525               string_sprintf("550 <%s> is not deliverable", address);
5526             log_write(0, LOG_MAIN, "VRFY failed for %s %s",
5527               smtp_cmd_argument, host_and_ident(TRUE));
5528             break;
5529           }
5530
5531         smtp_printf("%s\r\n", FALSE, s);
5532         }
5533       break;
5534       }
5535
5536
5537     case EXPN_CMD:
5538       HAD(SCH_EXPN);
5539       rc = acl_check(ACL_WHERE_EXPN, NULL, acl_smtp_expn, &user_msg, &log_msg);
5540       if (rc != OK)
5541         done = smtp_handle_acl_fail(ACL_WHERE_EXPN, rc, user_msg, log_msg);
5542       else
5543         {
5544         BOOL save_log_testing_mode = f.log_testing_mode;
5545         f.address_test_mode = f.log_testing_mode = TRUE;
5546         (void) verify_address(deliver_make_addr(smtp_cmd_data, FALSE),
5547           smtp_out, vopt_is_recipient | vopt_qualify | vopt_expn, -1, -1, -1,
5548           NULL, NULL, NULL);
5549         f.address_test_mode = FALSE;
5550         f.log_testing_mode = save_log_testing_mode;    /* true for -bh */
5551         }
5552       break;
5553
5554
5555     #ifndef DISABLE_TLS
5556
5557     case STARTTLS_CMD:
5558       HAD(SCH_STARTTLS);
5559       if (!fl.tls_advertised)
5560         {
5561         done = synprot_error(L_smtp_protocol_error, 503, NULL,
5562           US"STARTTLS command used when not advertised");
5563         break;
5564         }
5565
5566       /* Apply an ACL check if one is defined */
5567
5568       if (  acl_smtp_starttls
5569          && (rc = acl_check(ACL_WHERE_STARTTLS, NULL, acl_smtp_starttls,
5570                     &user_msg, &log_msg)) != OK
5571          )
5572         {
5573         done = smtp_handle_acl_fail(ACL_WHERE_STARTTLS, rc, user_msg, log_msg);
5574         break;
5575         }
5576
5577       /* RFC 2487 is not clear on when this command may be sent, though it
5578       does state that all information previously obtained from the client
5579       must be discarded if a TLS session is started. It seems reasonable to
5580       do an implied RSET when STARTTLS is received. */
5581
5582       incomplete_transaction_log(US"STARTTLS");
5583       cancel_cutthrough_connection(TRUE, US"STARTTLS received");
5584       reset_point = smtp_reset(reset_point);
5585       toomany = FALSE;
5586       cmd_list[CMD_LIST_STARTTLS].is_mail_cmd = FALSE;
5587
5588       /* There's an attack where more data is read in past the STARTTLS command
5589       before TLS is negotiated, then assumed to be part of the secure session
5590       when used afterwards; we use segregated input buffers, so are not
5591       vulnerable, but we want to note when it happens and, for sheer paranoia,
5592       ensure that the buffer is "wiped".
5593       Pipelining sync checks will normally have protected us too, unless disabled
5594       by configuration. */
5595
5596       if (receive_hasc())
5597         {
5598         DEBUG(D_any)
5599           debug_printf("Non-empty input buffer after STARTTLS; naive attack?\n");
5600         if (tls_in.active.sock < 0)
5601           smtp_inend = smtp_inptr = smtp_inbuffer;
5602         /* and if TLS is already active, tls_server_start() should fail */
5603         }
5604
5605       /* There is nothing we value in the input buffer and if TLS is successfully
5606       negotiated, we won't use this buffer again; if TLS fails, we'll just read
5607       fresh content into it.  The buffer contains arbitrary content from an
5608       untrusted remote source; eg: NOOP <shellcode>\r\nSTARTTLS\r\n
5609       It seems safest to just wipe away the content rather than leave it as a
5610       target to jump to. */
5611
5612       memset(smtp_inbuffer, 0, IN_BUFFER_SIZE);
5613
5614       /* Attempt to start up a TLS session, and if successful, discard all
5615       knowledge that was obtained previously. At least, that's what the RFC says,
5616       and that's what happens by default. However, in order to work round YAEB,
5617       there is an option to remember the esmtp state. Sigh.
5618
5619       We must allow for an extra EHLO command and an extra AUTH command after
5620       STARTTLS that don't add to the nonmail command count. */
5621
5622       s = NULL;
5623       if ((rc = tls_server_start(&s)) == OK)
5624         {
5625         if (!tls_remember_esmtp)
5626           fl.helo_seen = fl.esmtp = fl.auth_advertised = f.smtp_in_pipelining_advertised = FALSE;
5627         cmd_list[CMD_LIST_EHLO].is_mail_cmd = TRUE;
5628         cmd_list[CMD_LIST_AUTH].is_mail_cmd = TRUE;
5629         cmd_list[CMD_LIST_TLS_AUTH].is_mail_cmd = TRUE;
5630         if (sender_helo_name)
5631           {
5632           sender_helo_name = NULL;
5633           host_build_sender_fullhost();  /* Rebuild */
5634           set_process_info("handling incoming TLS connection from %s",
5635             host_and_ident(FALSE));
5636           }
5637         received_protocol =
5638           (sender_host_address ? protocols : protocols_local)
5639             [ (fl.esmtp
5640               ? pextend + (sender_host_authenticated ? pauthed : 0)
5641               : pnormal)
5642             + (tls_in.active.sock >= 0 ? pcrpted : 0)
5643             ];
5644
5645         sender_host_auth_pubname = sender_host_authenticated = NULL;
5646         authenticated_id = NULL;
5647         sync_cmd_limit = NON_SYNC_CMD_NON_PIPELINING;
5648         DEBUG(D_tls) debug_printf("TLS active\n");
5649         break;     /* Successful STARTTLS */
5650         }
5651       else
5652         (void) smtp_log_tls_fail(s);
5653
5654       /* Some local configuration problem was discovered before actually trying
5655       to do a TLS handshake; give a temporary error. */
5656
5657       if (rc == DEFER)
5658         {
5659         smtp_printf("454 TLS currently unavailable\r\n", FALSE);
5660         break;
5661         }
5662
5663       /* Hard failure. Reject everything except QUIT or closed connection. One
5664       cause for failure is a nested STARTTLS, in which case tls_in.active remains
5665       set, but we must still reject all incoming commands.  Another is a handshake
5666       failure - and there may some encrypted data still in the pipe to us, which we
5667       see as garbage commands. */
5668
5669       DEBUG(D_tls) debug_printf("TLS failed to start\n");
5670       while (done <= 0) switch(smtp_read_command(FALSE, GETC_BUFFER_UNLIMITED))
5671         {
5672         case EOF_CMD:
5673           log_write(L_smtp_connection, LOG_MAIN, "%s closed by EOF",
5674             smtp_get_connection_info());
5675           smtp_notquit_exit(US"tls-failed", NULL, NULL);
5676           done = 2;
5677           break;
5678
5679         /* It is perhaps arguable as to which exit ACL should be called here,
5680         but as it is probably a situation that almost never arises, it
5681         probably doesn't matter. We choose to call the real QUIT ACL, which in
5682         some sense is perhaps "right". */
5683
5684         case QUIT_CMD:
5685           f.smtp_in_quit = TRUE;
5686           user_msg = NULL;
5687           if (  acl_smtp_quit
5688              && ((rc = acl_check(ACL_WHERE_QUIT, NULL, acl_smtp_quit, &user_msg,
5689                                 &log_msg)) == ERROR))
5690               log_write(0, LOG_MAIN|LOG_PANIC, "ACL for QUIT returned ERROR: %s",
5691                 log_msg);
5692           if (user_msg)
5693             smtp_respond(US"221", 3, TRUE, user_msg);
5694           else
5695             smtp_printf("221 %s closing connection\r\n", FALSE, smtp_active_hostname);
5696           log_write(L_smtp_connection, LOG_MAIN, "%s closed by QUIT",
5697             smtp_get_connection_info());
5698           done = 2;
5699           break;
5700
5701         default:
5702           smtp_printf("554 Security failure\r\n", FALSE);
5703           break;
5704         }
5705       tls_close(NULL, TLS_SHUTDOWN_NOWAIT);
5706       break;
5707     #endif
5708
5709
5710     /* The ACL for QUIT is provided for gathering statistical information or
5711     similar; it does not affect the response code, but it can supply a custom
5712     message. */
5713
5714     case QUIT_CMD:
5715       smtp_quit_handler(&user_msg, &log_msg);
5716       done = 2;
5717       break;
5718
5719
5720     case RSET_CMD:
5721       smtp_rset_handler();
5722       cancel_cutthrough_connection(TRUE, US"RSET received");
5723       reset_point = smtp_reset(reset_point);
5724       toomany = FALSE;
5725       break;
5726
5727
5728     case NOOP_CMD:
5729       HAD(SCH_NOOP);
5730       smtp_printf("250 OK\r\n", FALSE);
5731       break;
5732
5733
5734     /* Show ETRN/EXPN/VRFY if there's an ACL for checking hosts; if actually
5735     used, a check will be done for permitted hosts. Show STARTTLS only if not
5736     already in a TLS session and if it would be advertised in the EHLO
5737     response. */
5738
5739     case HELP_CMD:
5740       HAD(SCH_HELP);
5741       smtp_printf("214-Commands supported:\r\n", TRUE);
5742         {
5743         uschar buffer[256];
5744         buffer[0] = 0;
5745         Ustrcat(buffer, US" AUTH");
5746         #ifndef DISABLE_TLS
5747         if (tls_in.active.sock < 0 &&
5748             verify_check_host(&tls_advertise_hosts) != FAIL)
5749           Ustrcat(buffer, US" STARTTLS");
5750         #endif
5751         Ustrcat(buffer, US" HELO EHLO MAIL RCPT DATA BDAT");
5752         Ustrcat(buffer, US" NOOP QUIT RSET HELP");
5753         if (acl_smtp_etrn) Ustrcat(buffer, US" ETRN");
5754         if (acl_smtp_expn) Ustrcat(buffer, US" EXPN");
5755         if (acl_smtp_vrfy) Ustrcat(buffer, US" VRFY");
5756         smtp_printf("214%s\r\n", FALSE, buffer);
5757         }
5758       break;
5759
5760
5761     case EOF_CMD:
5762       incomplete_transaction_log(US"connection lost");
5763       smtp_notquit_exit(US"connection-lost", US"421",
5764         US"%s lost input connection", smtp_active_hostname);
5765
5766       /* Don't log by default unless in the middle of a message, as some mailers
5767       just drop the call rather than sending QUIT, and it clutters up the logs.
5768       */
5769
5770       if (sender_address || recipients_count > 0)
5771         log_write(L_lost_incoming_connection, LOG_MAIN,
5772           "unexpected %s while reading SMTP command from %s%s%s D=%s",
5773           f.sender_host_unknown ? "EOF" : "disconnection",
5774           f.tcp_in_fastopen_logged
5775           ? US""
5776           : f.tcp_in_fastopen
5777           ? f.tcp_in_fastopen_data ? US"TFO* " : US"TFO "
5778           : US"",
5779           host_and_ident(FALSE), smtp_read_error,
5780           string_timesince(&smtp_connection_start)
5781           );
5782
5783       else
5784         log_write(L_smtp_connection, LOG_MAIN, "%s %slost%s D=%s",
5785           smtp_get_connection_info(),
5786           f.tcp_in_fastopen && !f.tcp_in_fastopen_logged ? US"TFO " : US"",
5787           smtp_read_error,
5788           string_timesince(&smtp_connection_start)
5789           );
5790
5791       done = 1;
5792       break;
5793
5794
5795     case ETRN_CMD:
5796       HAD(SCH_ETRN);
5797       if (sender_address)
5798         {
5799         done = synprot_error(L_smtp_protocol_error, 503, NULL,
5800           US"ETRN is not permitted inside a transaction");
5801         break;
5802         }
5803
5804       log_write(L_etrn, LOG_MAIN, "ETRN %s received from %s", smtp_cmd_argument,
5805         host_and_ident(FALSE));
5806
5807       if ((rc = acl_check(ACL_WHERE_ETRN, NULL, acl_smtp_etrn,
5808                   &user_msg, &log_msg)) != OK)
5809         {
5810         done = smtp_handle_acl_fail(ACL_WHERE_ETRN, rc, user_msg, log_msg);
5811         break;
5812         }
5813
5814       /* Compute the serialization key for this command. */
5815
5816       etrn_serialize_key = string_sprintf("etrn-%s\n", smtp_cmd_data);
5817
5818       /* If a command has been specified for running as a result of ETRN, we
5819       permit any argument to ETRN. If not, only the # standard form is permitted,
5820       since that is strictly the only kind of ETRN that can be implemented
5821       according to the RFC. */
5822
5823       if (smtp_etrn_command)
5824         {
5825         uschar *error;
5826         BOOL rc;
5827         etrn_command = smtp_etrn_command;
5828         deliver_domain = smtp_cmd_data;
5829         rc = transport_set_up_command(&argv, smtp_etrn_command, TRUE, 0, NULL,
5830           US"ETRN processing", &error);
5831         deliver_domain = NULL;
5832         if (!rc)
5833           {
5834           log_write(0, LOG_MAIN|LOG_PANIC, "failed to set up ETRN command: %s",
5835             error);
5836           smtp_printf("458 Internal failure\r\n", FALSE);
5837           break;
5838           }
5839         }
5840
5841       /* Else set up to call Exim with the -R option. */
5842
5843       else
5844         {
5845         if (*smtp_cmd_data++ != '#')
5846           {
5847           done = synprot_error(L_smtp_syntax_error, 501, NULL,
5848             US"argument must begin with #");
5849           break;
5850           }
5851         etrn_command = US"exim -R";
5852         argv = CUSS child_exec_exim(CEE_RETURN_ARGV, TRUE, NULL, TRUE,
5853           *queue_name ? 4 : 2,
5854           US"-R", smtp_cmd_data,
5855           US"-MCG", queue_name);
5856         }
5857
5858       /* If we are host-testing, don't actually do anything. */
5859
5860       if (host_checking)
5861         {
5862         HDEBUG(D_any)
5863           {
5864           debug_printf("ETRN command is: %s\n", etrn_command);
5865           debug_printf("ETRN command execution skipped\n");
5866           }
5867         if (user_msg == NULL) smtp_printf("250 OK\r\n", FALSE);
5868           else smtp_user_msg(US"250", user_msg);
5869         break;
5870         }
5871
5872
5873       /* If ETRN queue runs are to be serialized, check the database to
5874       ensure one isn't already running. */
5875
5876       if (smtp_etrn_serialize && !enq_start(etrn_serialize_key, 1))
5877         {
5878         smtp_printf("458 Already processing %s\r\n", FALSE, smtp_cmd_data);
5879         break;
5880         }
5881
5882       /* Fork a child process and run the command. We don't want to have to
5883       wait for the process at any point, so set SIGCHLD to SIG_IGN before
5884       forking. It should be set that way anyway for external incoming SMTP,
5885       but we save and restore to be tidy. If serialization is required, we
5886       actually run the command in yet another process, so we can wait for it
5887       to complete and then remove the serialization lock. */
5888
5889       oldsignal = signal(SIGCHLD, SIG_IGN);
5890
5891       if ((pid = exim_fork(US"etrn-command")) == 0)
5892         {
5893         smtp_input = FALSE;       /* This process is not associated with the */
5894         (void)fclose(smtp_in);    /* SMTP call any more. */
5895         (void)fclose(smtp_out);
5896
5897         signal(SIGCHLD, SIG_DFL);      /* Want to catch child */
5898
5899         /* If not serializing, do the exec right away. Otherwise, fork down
5900         into another process. */
5901
5902         if (  !smtp_etrn_serialize
5903            || (pid = exim_fork(US"etrn-serialised-command")) == 0)
5904           {
5905           DEBUG(D_exec) debug_print_argv(argv);
5906           exim_nullstd();                   /* Ensure std{in,out,err} exist */
5907           execv(CS argv[0], (char *const *)argv);
5908           log_write(0, LOG_MAIN|LOG_PANIC_DIE, "exec of \"%s\" (ETRN) failed: %s",
5909             etrn_command, strerror(errno));
5910           _exit(EXIT_FAILURE);         /* paranoia */
5911           }
5912
5913         /* Obey this if smtp_serialize and the 2nd fork yielded non-zero. That
5914         is, we are in the first subprocess, after forking again. All we can do
5915         for a failing fork is to log it. Otherwise, wait for the 2nd process to
5916         complete, before removing the serialization. */
5917
5918         if (pid < 0)
5919           log_write(0, LOG_MAIN|LOG_PANIC, "2nd fork for serialized ETRN "
5920             "failed: %s", strerror(errno));
5921         else
5922           {
5923           int status;
5924           DEBUG(D_any) debug_printf("waiting for serialized ETRN process %d\n",
5925             (int)pid);
5926           (void)wait(&status);
5927           DEBUG(D_any) debug_printf("serialized ETRN process %d ended\n",
5928             (int)pid);
5929           }
5930
5931         enq_end(etrn_serialize_key);
5932         exim_underbar_exit(EXIT_SUCCESS);
5933         }
5934
5935       /* Back in the top level SMTP process. Check that we started a subprocess
5936       and restore the signal state. */
5937
5938       if (pid < 0)
5939         {
5940         log_write(0, LOG_MAIN|LOG_PANIC, "fork of process for ETRN failed: %s",
5941           strerror(errno));
5942         smtp_printf("458 Unable to fork process\r\n", FALSE);
5943         if (smtp_etrn_serialize) enq_end(etrn_serialize_key);
5944         }
5945       else
5946         if (!user_msg)
5947           smtp_printf("250 OK\r\n", FALSE);
5948         else
5949           smtp_user_msg(US"250", user_msg);
5950
5951       signal(SIGCHLD, oldsignal);
5952       break;
5953
5954
5955     case BADARG_CMD:
5956       done = synprot_error(L_smtp_syntax_error, 501, NULL,
5957         US"unexpected argument data");
5958       break;
5959
5960
5961     /* This currently happens only for NULLs, but could be extended. */
5962
5963     case BADCHAR_CMD:
5964       done = synprot_error(L_smtp_syntax_error, 0, NULL,       /* Just logs */
5965         US"NUL character(s) present (shown as '?')");
5966       smtp_printf("501 NUL characters are not allowed in SMTP commands\r\n",
5967                   FALSE);
5968       break;
5969
5970
5971     case BADSYN_CMD:
5972     SYNC_FAILURE:
5973       if (smtp_inend >= smtp_inbuffer + IN_BUFFER_SIZE)
5974         smtp_inend = smtp_inbuffer + IN_BUFFER_SIZE - 1;
5975       c = smtp_inend - smtp_inptr;
5976       if (c > 150) c = 150;     /* limit logged amount */
5977       smtp_inptr[c] = 0;
5978       incomplete_transaction_log(US"sync failure");
5979       log_write(0, LOG_MAIN|LOG_REJECT, "SMTP protocol synchronization error "
5980         "(next input sent too soon: pipelining was%s advertised): "
5981         "rejected \"%s\" %s next input=\"%s\"",
5982         f.smtp_in_pipelining_advertised ? "" : " not",
5983         smtp_cmd_buffer, host_and_ident(TRUE),
5984         string_printing(smtp_inptr));
5985       smtp_notquit_exit(US"synchronization-error", US"554",
5986         US"SMTP synchronization error");
5987       done = 1;   /* Pretend eof - drops connection */
5988       break;
5989
5990
5991     case TOO_MANY_NONMAIL_CMD:
5992       s = smtp_cmd_buffer;
5993       while (*s != 0 && !isspace(*s)) s++;
5994       incomplete_transaction_log(US"too many non-mail commands");
5995       log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
5996         "nonmail commands (last was \"%.*s\")",  host_and_ident(FALSE),
5997         (int)(s - smtp_cmd_buffer), smtp_cmd_buffer);
5998       smtp_notquit_exit(US"bad-commands", US"554", US"Too many nonmail commands");
5999       done = 1;   /* Pretend eof - drops connection */
6000       break;
6001
6002 #ifdef SUPPORT_PROXY
6003     case PROXY_FAIL_IGNORE_CMD:
6004       smtp_printf("503 Command refused, required Proxy negotiation failed\r\n", FALSE);
6005       break;
6006 #endif
6007
6008     default:
6009       if (unknown_command_count++ >= smtp_max_unknown_commands)
6010         {
6011         log_write(L_smtp_syntax_error, LOG_MAIN,
6012           "SMTP syntax error in \"%s\" %s %s",
6013           string_printing(smtp_cmd_buffer), host_and_ident(TRUE),
6014           US"unrecognized command");
6015         incomplete_transaction_log(US"unrecognized command");
6016         smtp_notquit_exit(US"bad-commands", US"500",
6017           US"Too many unrecognized commands");
6018         done = 2;
6019         log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
6020           "unrecognized commands (last was \"%s\")", host_and_ident(FALSE),
6021           string_printing(smtp_cmd_buffer));
6022         }
6023       else
6024         done = synprot_error(L_smtp_syntax_error, 500, NULL,
6025           US"unrecognized command");
6026       break;
6027     }
6028
6029   /* This label is used by goto's inside loops that want to break out to
6030   the end of the command-processing loop. */
6031
6032   COMMAND_LOOP:
6033   last_was_rej_mail = was_rej_mail;     /* Remember some last commands for */
6034   last_was_rcpt = was_rcpt;             /* protocol error handling */
6035   continue;
6036   }
6037
6038 return done - 2;  /* Convert yield values */
6039 }
6040
6041
6042
6043 gstring *
6044 authres_smtpauth(gstring * g)
6045 {
6046 if (!sender_host_authenticated)
6047   return g;
6048
6049 g = string_append(g, 2, US";\n\tauth=pass (", sender_host_auth_pubname);
6050
6051 if (Ustrcmp(sender_host_auth_pubname, "tls") == 0)
6052   g = authenticated_id
6053     ? string_append(g, 2, US") x509.auth=", authenticated_id)
6054     : string_cat(g, US") reason=x509.auth");
6055 else
6056   g = authenticated_id
6057     ? string_append(g, 2, US") smtp.auth=", authenticated_id)
6058     : string_cat(g, US", no id saved)");
6059
6060 if (authenticated_sender)
6061   g = string_append(g, 2, US" smtp.mailfrom=", authenticated_sender);
6062 return g;
6063 }
6064
6065
6066
6067 /* vi: aw ai sw=2
6068 */
6069 /* End of smtp_in.c */