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