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