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