debian experimental exim-daemon-heavy config
[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
5990a265
JH
1819
1820
1821static gstring *
1822s_connhad_log(gstring * g)
1823{
1824uschar * sep = smtp_connection_had[SMTP_HBUFF_SIZE-1] != SCH_NONE
1825 ? US" C=..." : US" C=";
1826
1827for (int i = smtp_ch_index; i < SMTP_HBUFF_SIZE; i++)
1828 if (smtp_connection_had[i] != SCH_NONE)
1829 {
1830 g = string_append(g, 2, sep, smtp_names[smtp_connection_had[i]]);
1831 sep = US",";
1832 }
1833for (int i = 0; i < smtp_ch_index; i++)
1834 {
1835 g = string_append(g, 2, sep, smtp_names[smtp_connection_had[i]]);
1836 sep = US",";
1837 }
1838return g;
1839}
1840
1841
b4ed4da0
PH
1842/*************************************************
1843* Log lack of MAIL if so configured *
1844*************************************************/
1845
1846/* This function is called when an SMTP session ends. If the log selector
1847smtp_no_mail is set, write a log line giving some details of what has happened
1848in the SMTP session.
1849
1850Arguments: none
1851Returns: nothing
1852*/
1853
1854void
1855smtp_log_no_mail(void)
1856{
5990a265 1857uschar * s;
acec9514 1858gstring * g = NULL;
b4ed4da0 1859
6c6d6e48 1860if (smtp_mailcmd_count > 0 || !LOGGING(smtp_no_mail))
b4ed4da0
PH
1861 return;
1862
db57e575 1863if (sender_host_authenticated)
b4ed4da0 1864 {
acec9514
JH
1865 g = string_append(g, 2, US" A=", sender_host_authenticated);
1866 if (authenticated_id) g = string_append(g, 2, US":", authenticated_id);
b4ed4da0
PH
1867 }
1868
01603eec 1869#ifndef DISABLE_TLS
acec9514 1870g = s_tlslog(g);
3f0945ff 1871#endif
b4ed4da0 1872
5990a265 1873g = s_connhad_log(g);
b4ed4da0 1874
acec9514
JH
1875if (!(s = string_from_gstring(g))) s = US"";
1876
a2673768 1877log_write(0, LOG_MAIN, "no MAIL in %sSMTP connection from %s D=%s%s",
ee8b8090 1878 f.tcp_in_fastopen ? f.tcp_in_fastopen_data ? US"TFO* " : US"TFO " : US"",
0f1a8658 1879 host_and_ident(FALSE), string_timesince(&smtp_connection_start), s);
b4ed4da0
PH
1880}
1881
1882
a09f2942
JH
1883/* Return list of recent smtp commands */
1884
1885uschar *
1886smtp_cmd_hist(void)
1887{
acec9514
JH
1888gstring * list = NULL;
1889uschar * s;
a09f2942 1890
d7978c0f 1891for (int i = smtp_ch_index; i < SMTP_HBUFF_SIZE; i++)
a09f2942 1892 if (smtp_connection_had[i] != SCH_NONE)
acec9514
JH
1893 list = string_append_listele(list, ',', smtp_names[smtp_connection_had[i]]);
1894
d7978c0f 1895for (int i = 0; i < smtp_ch_index; i++)
acec9514
JH
1896 list = string_append_listele(list, ',', smtp_names[smtp_connection_had[i]]);
1897
1898s = string_from_gstring(list);
1899return s ? s : US"";
a09f2942
JH
1900}
1901
1902
1903
b4ed4da0 1904
059ec3d9
PH
1905/*************************************************
1906* Check HELO line and set sender_helo_name *
1907*************************************************/
1908
1909/* Check the format of a HELO line. The data for HELO/EHLO is supposed to be
1910the domain name of the sending host, or an ip literal in square brackets. The
4c04137d 1911argument is placed in sender_helo_name, which is in malloc store, because it
059ec3d9
PH
1912must persist over multiple incoming messages. If helo_accept_junk is set, this
1913host is permitted to send any old junk (needed for some broken hosts).
1914Otherwise, helo_allow_chars can be used for rogue characters in general
1915(typically people want to let in underscores).
1916
1917Argument:
1918 s the data portion of the line (already past any white space)
1919
1920Returns: TRUE or FALSE
1921*/
1922
1923static BOOL
1924check_helo(uschar *s)
1925{
1926uschar *start = s;
1927uschar *end = s + Ustrlen(s);
88752192 1928BOOL yield = fl.helo_accept_junk;
059ec3d9
PH
1929
1930/* Discard any previous helo name */
1931
f3ebb786 1932sender_helo_name = NULL;
059ec3d9
PH
1933
1934/* Skip tests if junk is permitted. */
1935
1936if (!yield)
db57e575 1937
059ec3d9
PH
1938 /* Allow the new standard form for IPv6 address literals, namely,
1939 [IPv6:....], and because someone is bound to use it, allow an equivalent
1940 IPv4 form. Allow plain addresses as well. */
1941
1942 if (*s == '[')
1943 {
1944 if (end[-1] == ']')
1945 {
1946 end[-1] = 0;
1947 if (strncmpic(s, US"[IPv6:", 6) == 0)
1948 yield = (string_is_ip_address(s+6, NULL) == 6);
1949 else if (strncmpic(s, US"[IPv4:", 6) == 0)
1950 yield = (string_is_ip_address(s+6, NULL) == 4);
1951 else
1952 yield = (string_is_ip_address(s+1, NULL) != 0);
1953 end[-1] = ']';
1954 }
1955 }
1956
1957 /* Non-literals must be alpha, dot, hyphen, plus any non-valid chars
1958 that have been configured (usually underscore - sigh). */
1959
db57e575
JH
1960 else if (*s)
1961 for (yield = TRUE; *s; s++)
059ec3d9
PH
1962 if (!isalnum(*s) && *s != '.' && *s != '-' &&
1963 Ustrchr(helo_allow_chars, *s) == NULL)
1964 {
1965 yield = FALSE;
1966 break;
1967 }
059ec3d9
PH
1968
1969/* Save argument if OK */
1970
f3ebb786 1971if (yield) sender_helo_name = string_copy_perm(start, TRUE);
059ec3d9
PH
1972return yield;
1973}
1974
1975
1976
1977
1978
1979/*************************************************
1980* Extract SMTP command option *
1981*************************************************/
1982
ca86f471 1983/* This function picks the next option setting off the end of smtp_cmd_data. It
059ec3d9
PH
1984is called for MAIL FROM and RCPT TO commands, to pick off the optional ESMTP
1985things that can appear there.
1986
1987Arguments:
1988 name point this at the name
1989 value point this at the data string
1990
1991Returns: TRUE if found an option
1992*/
1993
1994static BOOL
1995extract_option(uschar **name, uschar **value)
1996{
1997uschar *n;
ca86f471 1998uschar *v = smtp_cmd_data + Ustrlen(smtp_cmd_data) - 1;
059ec3d9
PH
1999while (isspace(*v)) v--;
2000v[1] = 0;
d7a2c833
JH
2001while (v > smtp_cmd_data && *v != '=' && !isspace(*v))
2002 {
2003 /* Take care to not stop at a space embedded in a quoted local-part */
2004
2005 if (*v == '"') do v--; while (*v != '"' && v > smtp_cmd_data+1);
2006 v--;
2007 }
059ec3d9
PH
2008
2009n = v;
fd98a5c6 2010if (*v == '=')
a2673768 2011 {
fd98a5c6
JH
2012 while(isalpha(n[-1])) n--;
2013 /* RFC says SP, but TAB seen in wild and other major MTAs accept it */
2014 if (!isspace(n[-1])) return FALSE;
2015 n[-1] = 0;
a2673768 2016 }
fd98a5c6 2017else
a2673768 2018 {
fd98a5c6
JH
2019 n++;
2020 if (v == smtp_cmd_data) return FALSE;
a2673768 2021 }
059ec3d9 2022*v++ = 0;
fd98a5c6 2023*name = n;
059ec3d9
PH
2024*value = v;
2025return TRUE;
2026}
2027
2028
2029
2030
2031
059ec3d9
PH
2032/*************************************************
2033* Reset for new message *
2034*************************************************/
2035
2036/* This function is called whenever the SMTP session is reset from
e04bfa34 2037within either of the setup functions; also from the daemon loop.
059ec3d9
PH
2038
2039Argument: the stacking pool storage reset point
2040Returns: nothing
2041*/
2042
f3ebb786 2043void *
059ec3d9
PH
2044smtp_reset(void *reset_point)
2045{
059ec3d9
PH
2046recipients_list = NULL;
2047rcpt_count = rcpt_defer_count = rcpt_fail_count =
2048 raw_recipients_count = recipients_count = recipients_list_max = 0;
2e0c1448 2049message_linecount = 0;
059ec3d9 2050message_size = -1;
71fafd95 2051acl_added_headers = NULL;
e7568d51 2052acl_removed_headers = NULL;
8768d548 2053f.queue_only_policy = FALSE;
2679d413 2054rcpt_smtp_response = NULL;
88752192
JH
2055fl.rcpt_smtp_response_same = TRUE;
2056fl.rcpt_in_progress = FALSE;
8768d548 2057f.deliver_freeze = FALSE; /* Can be set by ACL */
6a3f1455 2058freeze_tell = freeze_tell_config; /* Can be set by ACL */
29aba418 2059fake_response = OK; /* Can be set by ACL */
6951ac6c 2060#ifdef WITH_CONTENT_SCAN
8768d548 2061f.no_mbox_unspool = FALSE; /* Can be set by ACL */
8523533c 2062#endif
8768d548
JH
2063f.submission_mode = FALSE; /* Can be set by ACL */
2064f.suppress_local_fixups = f.suppress_local_fixups_default; /* Can be set by ACL */
2065f.active_local_from_check = local_from_check; /* Can be set by ACL */
2066f.active_local_sender_retain = local_sender_retain; /* Can be set by ACL */
90341c71
JH
2067sending_ip_address = NULL;
2068return_path = sender_address = NULL;
0f9c36e6
JH
2069deliver_localpart_data = deliver_domain_data =
2070recipient_data = sender_data = NULL; /* Can be set by ACL */
c679ee08
JH
2071deliver_localpart_parent = deliver_localpart_orig = NULL;
2072deliver_domain_parent = deliver_domain_orig = NULL;
90341c71 2073callout_address = NULL;
2fe1a124 2074submission_name = NULL; /* Can be set by ACL */
059ec3d9
PH
2075raw_sender = NULL; /* After SMTP rewrite, before qualifying */
2076sender_address_unrewritten = NULL; /* Set only after verify rewrite */
2077sender_verified_list = NULL; /* No senders verified */
2078memset(sender_address_cache, 0, sizeof(sender_address_cache));
2079memset(sender_domain_cache, 0, sizeof(sender_domain_cache));
6c1c3d1d 2080
059ec3d9 2081authenticated_sender = NULL;
8523533c
TK
2082#ifdef EXPERIMENTAL_BRIGHTMAIL
2083bmi_run = 0;
2084bmi_verdicts = NULL;
2085#endif
90341c71 2086dnslist_domain = dnslist_matched = NULL;
01067968
JH
2087#ifdef SUPPORT_SPF
2088spf_header_comment = spf_received = spf_result = spf_smtp_comment = NULL;
2089spf_result_guessed = FALSE;
2090#endif
80a47a2c 2091#ifndef DISABLE_DKIM
d342446f 2092dkim_cur_signer = dkim_signers =
b4757e36 2093dkim_signing_domain = dkim_signing_selector = dkim_signatures = NULL;
d342446f 2094dkim_cur_signer = dkim_signers = dkim_signing_domain = dkim_signing_selector = NULL;
8768d548 2095f.dkim_disable_verify = FALSE;
64b67b65 2096dkim_collect_input = 0;
d342446f
JH
2097dkim_verify_overall = dkim_verify_status = dkim_verify_reason = NULL;
2098dkim_key_length = 0;
f7572e5a 2099#endif
1a2e76e1 2100#ifdef SUPPORT_DMARC
8768d548 2101f.dmarc_has_been_checked = f.dmarc_disable_verify = f.dmarc_enable_forensic = FALSE;
8aeef98a 2102dmarc_domain_policy = dmarc_status = dmarc_status_text =
6372d4c9 2103dmarc_used_domain = NULL;
f7572e5a 2104#endif
01067968
JH
2105#ifdef EXPERIMENTAL_ARC
2106arc_state = arc_state_reason = NULL;
1415d1a6 2107arc_received_instance = 0;
b4757e36 2108#endif
aa368db3
JH
2109dsn_ret = 0;
2110dsn_envid = NULL;
90341c71 2111deliver_host = deliver_host_address = NULL; /* Can be set by ACL */
aa368db3
JH
2112#ifndef DISABLE_PRDR
2113prdr_requested = FALSE;
2114#endif
8c5d388a 2115#ifdef SUPPORT_I18N
d1a13eea
JH
2116message_smtputf8 = FALSE;
2117#endif
059ec3d9
PH
2118body_linecount = body_zerocount = 0;
2119
870f6ba8
TF
2120sender_rate = sender_rate_limit = sender_rate_period = NULL;
2121ratelimiters_mail = NULL; /* Updated by ratelimit ACL condition */
2122 /* Note that ratelimiters_conn persists across resets. */
2123
38a0a95f 2124/* Reset message ACL variables */
47ca6d6c 2125
38a0a95f 2126acl_var_m = NULL;
059ec3d9
PH
2127
2128/* The message body variables use malloc store. They may be set if this is
2129not the first message in an SMTP session and the previous message caused them
2130to be referenced in an ACL. */
2131
90341c71 2132if (message_body)
059ec3d9
PH
2133 {
2134 store_free(message_body);
2135 message_body = NULL;
2136 }
2137
90341c71 2138if (message_body_end)
059ec3d9
PH
2139 {
2140 store_free(message_body_end);
2141 message_body_end = NULL;
2142 }
2143
2144/* Warning log messages are also saved in malloc store. They are saved to avoid
2145repetition in the same message, but it seems right to repeat them for different
4e88a19f 2146messages. */
059ec3d9 2147
90341c71 2148while (acl_warn_logged)
059ec3d9
PH
2149 {
2150 string_item *this = acl_warn_logged;
2151 acl_warn_logged = acl_warn_logged->next;
2152 store_free(this);
2153 }
90341c71 2154store_reset(reset_point);
f3ebb786 2155return store_mark();
059ec3d9
PH
2156}
2157
2158
2159
2160
2161
2162/*************************************************
2163* Initialize for incoming batched SMTP message *
2164*************************************************/
2165
2166/* This function is called from smtp_setup_msg() in the case when
2167smtp_batched_input is true. This happens when -bS is used to pass a whole batch
2168of messages in one file with SMTP commands between them. All errors must be
2169reported by sending a message, and only MAIL FROM, RCPT TO, and DATA are
2170relevant. After an error on a sender, or an invalid recipient, the remainder
2171of the message is skipped. The value of received_protocol is already set.
2172
2173Argument: none
2174Returns: > 0 message successfully started (reached DATA)
2175 = 0 QUIT read or end of file reached
2176 < 0 should not occur
2177*/
2178
2179static int
2180smtp_setup_batch_msg(void)
2181{
2182int done = 0;
f3ebb786 2183rmark reset_point = store_mark();
059ec3d9
PH
2184
2185/* Save the line count at the start of each transaction - single commands
2186like HELO and RSET count as whole transactions. */
2187
2188bsmtp_transaction_linecount = receive_linecount;
2189
2190if ((receive_feof)()) return 0; /* Treat EOF as QUIT */
2191
57cc2785 2192cancel_cutthrough_connection(TRUE, US"smtp_setup_batch_msg");
f3ebb786 2193reset_point = smtp_reset(reset_point); /* Reset for start of message */
059ec3d9
PH
2194
2195/* Deal with SMTP commands. This loop is exited by setting done to a POSITIVE
2196value. The values are 2 larger than the required yield of the function. */
2197
2198while (done <= 0)
2199 {
2200 uschar *errmess;
2201 uschar *recipient = NULL;
2202 int start, end, sender_domain, recipient_domain;
2203
bd8fbe36 2204 switch(smtp_read_command(FALSE, GETC_BUFFER_UNLIMITED))
059ec3d9
PH
2205 {
2206 /* The HELO/EHLO commands set sender_address_helo if they have
2207 valid data; otherwise they are ignored, except that they do
2208 a reset of the state. */
2209
2210 case HELO_CMD:
2211 case EHLO_CMD:
2212
db57e575
JH
2213 check_helo(smtp_cmd_data);
2214 /* Fall through */
059ec3d9
PH
2215
2216 case RSET_CMD:
db57e575 2217 cancel_cutthrough_connection(TRUE, US"RSET received");
f3ebb786 2218 reset_point = smtp_reset(reset_point);
db57e575
JH
2219 bsmtp_transaction_linecount = receive_linecount;
2220 break;
059ec3d9
PH
2221
2222
2223 /* The MAIL FROM command requires an address as an operand. All we
2224 do here is to parse it for syntactic correctness. The form "<>" is
2225 a special case which converts into an empty string. The start/end
2226 pointers in the original are not used further for this address, as
2227 it is the canonical extracted address which is all that is kept. */
2228
2229 case MAIL_CMD:
db57e575
JH
2230 smtp_mailcmd_count++; /* Count for no-mail log */
2231 if (sender_address != NULL)
2232 /* The function moan_smtp_batch() does not return. */
2233 moan_smtp_batch(smtp_cmd_buffer, "503 Sender already given");
059ec3d9 2234
db57e575
JH
2235 if (smtp_cmd_data[0] == 0)
2236 /* The function moan_smtp_batch() does not return. */
2237 moan_smtp_batch(smtp_cmd_buffer, "501 MAIL FROM must have an address operand");
059ec3d9 2238
db57e575 2239 /* Reset to start of message */
059ec3d9 2240
db57e575 2241 cancel_cutthrough_connection(TRUE, US"MAIL received");
f3ebb786 2242 reset_point = smtp_reset(reset_point);
059ec3d9 2243
db57e575 2244 /* Apply SMTP rewrite */
059ec3d9 2245
db57e575
JH
2246 raw_sender = ((rewrite_existflags & rewrite_smtp) != 0)?
2247 rewrite_one(smtp_cmd_data, rewrite_smtp|rewrite_smtp_sender, NULL, FALSE,
2248 US"", global_rewrite_rules) : smtp_cmd_data;
059ec3d9 2249
db57e575 2250 /* Extract the address; the TRUE flag allows <> as valid */
059ec3d9 2251
db57e575
JH
2252 raw_sender =
2253 parse_extract_address(raw_sender, &errmess, &start, &end, &sender_domain,
2254 TRUE);
059ec3d9 2255
db57e575
JH
2256 if (!raw_sender)
2257 /* The function moan_smtp_batch() does not return. */
2258 moan_smtp_batch(smtp_cmd_buffer, "501 %s", errmess);
059ec3d9 2259
db57e575 2260 sender_address = string_copy(raw_sender);
059ec3d9 2261
db57e575 2262 /* Qualify unqualified sender addresses if permitted to do so. */
059ec3d9 2263
db57e575
JH
2264 if ( !sender_domain
2265 && sender_address[0] != 0 && sender_address[0] != '@')
8768d548 2266 if (f.allow_unqualified_sender)
db57e575
JH
2267 {
2268 sender_address = rewrite_address_qualify(sender_address, FALSE);
2269 DEBUG(D_receive) debug_printf("unqualified address %s accepted "
2270 "and rewritten\n", raw_sender);
2271 }
2272 /* The function moan_smtp_batch() does not return. */
2273 else
2274 moan_smtp_batch(smtp_cmd_buffer, "501 sender address must contain "
2275 "a domain");
2276 break;
059ec3d9
PH
2277
2278
2279 /* The RCPT TO command requires an address as an operand. All we do
2280 here is to parse it for syntactic correctness. There may be any number
2281 of RCPT TO commands, specifying multiple senders. We build them all into
2282 a data structure that is in argc/argv format. The start/end values
2283 given by parse_extract_address are not used, as we keep only the
2284 extracted address. */
2285
2286 case RCPT_CMD:
db57e575
JH
2287 if (!sender_address)
2288 /* The function moan_smtp_batch() does not return. */
2289 moan_smtp_batch(smtp_cmd_buffer, "503 No sender yet given");
059ec3d9 2290
db57e575
JH
2291 if (smtp_cmd_data[0] == 0)
2292 /* The function moan_smtp_batch() does not return. */
2293 moan_smtp_batch(smtp_cmd_buffer,
2294 "501 RCPT TO must have an address operand");
059ec3d9 2295
db57e575 2296 /* Check maximum number allowed */
059ec3d9 2297
db57e575
JH
2298 if (recipients_max > 0 && recipients_count + 1 > recipients_max)
2299 /* The function moan_smtp_batch() does not return. */
2300 moan_smtp_batch(smtp_cmd_buffer, "%s too many recipients",
2301 recipients_max_reject? "552": "452");
059ec3d9 2302
db57e575
JH
2303 /* Apply SMTP rewrite, then extract address. Don't allow "<>" as a
2304 recipient address */
059ec3d9 2305
db57e575
JH
2306 recipient = rewrite_existflags & rewrite_smtp
2307 ? rewrite_one(smtp_cmd_data, rewrite_smtp, NULL, FALSE, US"",
2308 global_rewrite_rules)
2309 : smtp_cmd_data;
059ec3d9 2310
db57e575
JH
2311 recipient = parse_extract_address(recipient, &errmess, &start, &end,
2312 &recipient_domain, FALSE);
059ec3d9 2313
db57e575
JH
2314 if (!recipient)
2315 /* The function moan_smtp_batch() does not return. */
2316 moan_smtp_batch(smtp_cmd_buffer, "501 %s", errmess);
059ec3d9 2317
db57e575
JH
2318 /* If the recipient address is unqualified, qualify it if permitted. Then
2319 add it to the list of recipients. */
059ec3d9 2320
db57e575 2321 if (!recipient_domain)
8768d548 2322 if (f.allow_unqualified_recipient)
db57e575
JH
2323 {
2324 DEBUG(D_receive) debug_printf("unqualified address %s accepted\n",
2325 recipient);
2326 recipient = rewrite_address_qualify(recipient, TRUE);
2327 }
2328 /* The function moan_smtp_batch() does not return. */
2329 else
2330 moan_smtp_batch(smtp_cmd_buffer,
2331 "501 recipient address must contain a domain");
2332
2333 receive_add_recipient(recipient, -1);
2334 break;
059ec3d9
PH
2335
2336
2337 /* The DATA command is legal only if it follows successful MAIL FROM
2338 and RCPT TO commands. This function is complete when a valid DATA
2339 command is encountered. */
2340
2341 case DATA_CMD:
db57e575
JH
2342 if (!sender_address || recipients_count <= 0)
2343 /* The function moan_smtp_batch() does not return. */
2344 if (!sender_address)
2345 moan_smtp_batch(smtp_cmd_buffer,
2346 "503 MAIL FROM:<sender> command must precede DATA");
2347 else
2348 moan_smtp_batch(smtp_cmd_buffer,
2349 "503 RCPT TO:<recipient> must precede DATA");
059ec3d9 2350 else
db57e575
JH
2351 {
2352 done = 3; /* DATA successfully achieved */
2353 message_ended = END_NOTENDED; /* Indicate in middle of message */
2354 }
2355 break;
059ec3d9
PH
2356
2357
2358 /* The VRFY, EXPN, HELP, ETRN, and NOOP commands are ignored. */
2359
2360 case VRFY_CMD:
2361 case EXPN_CMD:
2362 case HELP_CMD:
2363 case NOOP_CMD:
2364 case ETRN_CMD:
db57e575
JH
2365 bsmtp_transaction_linecount = receive_linecount;
2366 break;
059ec3d9
PH
2367
2368
2369 case EOF_CMD:
2370 case QUIT_CMD:
db57e575
JH
2371 done = 2;
2372 break;
059ec3d9
PH
2373
2374
2375 case BADARG_CMD:
db57e575
JH
2376 /* The function moan_smtp_batch() does not return. */
2377 moan_smtp_batch(smtp_cmd_buffer, "501 Unexpected argument data");
2378 break;
059ec3d9
PH
2379
2380
2381 case BADCHAR_CMD:
db57e575
JH
2382 /* The function moan_smtp_batch() does not return. */
2383 moan_smtp_batch(smtp_cmd_buffer, "501 Unexpected NULL in SMTP command");
2384 break;
059ec3d9
PH
2385
2386
2387 default:
db57e575
JH
2388 /* The function moan_smtp_batch() does not return. */
2389 moan_smtp_batch(smtp_cmd_buffer, "500 Command unrecognized");
2390 break;
059ec3d9
PH
2391 }
2392 }
2393
2394return done - 2; /* Convert yield values */
2395}
2396
2397
2398
2399
01603eec 2400#ifndef DISABLE_TLS
cf0c6164
JH
2401static BOOL
2402smtp_log_tls_fail(uschar * errstr)
2403{
2404uschar * conn_info = smtp_get_connection_info();
2405
2406if (Ustrncmp(conn_info, US"SMTP ", 5) == 0) conn_info += 5;
2407/* I'd like to get separated H= here, but too hard for now */
2408
2409log_write(0, LOG_MAIN, "TLS error on %s %s", conn_info, errstr);
2410return FALSE;
2411}
13c7874e 2412#endif
cf0c6164
JH
2413
2414
a2673768
JH
2415
2416
2417#ifdef TCP_FASTOPEN
2418static void
2419tfo_in_check(void)
2420{
53c7b3a7
JH
2421# ifdef __FreeBSD__
2422int is_fastopen;
2423socklen_t len = sizeof(is_fastopen);
2424
2425/* The tinfo TCPOPT_FAST_OPEN bit seems unreliable, and we don't see state
2426TCP_SYN_RCV (as of 12.1) so no idea about data-use. */
2427
2428if (getsockopt(fileno(smtp_out), IPPROTO_TCP, TCP_FASTOPEN, &is_fastopen, &len) == 0)
2429 {
2430 if (is_fastopen)
2431 {
2432 DEBUG(D_receive)
2433 debug_printf("TFO mode connection (TCP_FASTOPEN getsockopt)\n");
2434 f.tcp_in_fastopen = TRUE;
2435 }
2436 }
2437else DEBUG(D_receive)
2438 debug_printf("TCP_INFO getsockopt: %s\n", strerror(errno));
2439
2440# elif defined(TCP_INFO)
a2673768
JH
2441struct tcp_info tinfo;
2442socklen_t len = sizeof(tinfo);
2443
ee8b8090 2444if (getsockopt(fileno(smtp_out), IPPROTO_TCP, TCP_INFO, &tinfo, &len) == 0)
73a10da9 2445# ifdef TCPI_OPT_SYN_DATA /* FreeBSD 11,12 do not seem to have this yet */
ee8b8090
JH
2446 if (tinfo.tcpi_options & TCPI_OPT_SYN_DATA)
2447 {
73a10da9 2448 DEBUG(D_receive)
53c7b3a7 2449 debug_printf("TFO mode connection (ACKd data-on-SYN)\n");
ee8b8090
JH
2450 f.tcp_in_fastopen_data = f.tcp_in_fastopen = TRUE;
2451 }
dbcb6d0a 2452 else
73a10da9
JH
2453# endif
2454 if (tinfo.tcpi_state == TCP_SYN_RECV) /* Not seen on FreeBSD 12.1 */
ee8b8090 2455 {
73a10da9 2456 DEBUG(D_receive)
53c7b3a7 2457 debug_printf("TFO mode connection (state TCP_SYN_RECV)\n");
ee8b8090
JH
2458 f.tcp_in_fastopen = TRUE;
2459 }
73a10da9
JH
2460else DEBUG(D_receive)
2461 debug_printf("TCP_INFO getsockopt: %s\n", strerror(errno));
a2673768
JH
2462# endif
2463}
2464#endif
2465
2466
059ec3d9
PH
2467/*************************************************
2468* Start an SMTP session *
2469*************************************************/
2470
2471/* This function is called at the start of an SMTP session. Thereafter,
2472smtp_setup_msg() is called to initiate each separate message. This
2473function does host-specific testing, and outputs the banner line.
2474
2475Arguments: none
2476Returns: FALSE if the session can not continue; something has
2477 gone wrong, or the connection to the host is blocked
2478*/
2479
2480BOOL
2481smtp_start_session(void)
2482{
acec9514 2483int esclen;
4e88a19f
PH
2484uschar *user_msg, *log_msg;
2485uschar *code, *esc;
acec9514
JH
2486uschar *p, *s;
2487gstring * ss;
059ec3d9 2488
0f1a8658 2489gettimeofday(&smtp_connection_start, NULL);
b4ed4da0
PH
2490for (smtp_ch_index = 0; smtp_ch_index < SMTP_HBUFF_SIZE; smtp_ch_index++)
2491 smtp_connection_had[smtp_ch_index] = SCH_NONE;
2492smtp_ch_index = 0;
2493
00f00ca5
PH
2494/* Default values for certain variables */
2495
88752192 2496fl.helo_seen = fl.esmtp = fl.helo_accept_junk = FALSE;
b4ed4da0 2497smtp_mailcmd_count = 0;
059ec3d9
PH
2498count_nonmail = TRUE_UNSET;
2499synprot_error_count = unknown_command_count = nonmail_command_count = 0;
2500smtp_delay_mail = smtp_rlm_base;
88752192 2501fl.auth_advertised = FALSE;
8768d548
JH
2502f.smtp_in_pipelining_advertised = f.smtp_in_pipelining_used = FALSE;
2503f.pipelining_enable = TRUE;
059ec3d9 2504sync_cmd_limit = NON_SYNC_CMD_NON_PIPELINING;
88752192 2505fl.smtp_exit_function_called = FALSE; /* For avoiding loop in not-quit exit */
059ec3d9 2506
33d73e3b
PH
2507/* If receiving by -bs from a trusted user, or testing with -bh, we allow
2508authentication settings from -oMaa to remain in force. */
2509
8768d548 2510if (!host_checking && !f.sender_host_notsocket)
c44ff8be 2511 sender_host_auth_pubname = sender_host_authenticated = NULL;
059ec3d9
PH
2512authenticated_by = NULL;
2513
01603eec 2514#ifndef DISABLE_TLS
da40b1ec 2515tls_in.ver = tls_in.cipher = tls_in.peerdn = NULL;
9d1c15ef
JH
2516tls_in.ourcert = tls_in.peercert = NULL;
2517tls_in.sni = NULL;
44662487 2518tls_in.ocsp = OCSP_NOT_REQ;
88752192 2519fl.tls_advertised = FALSE;
059ec3d9 2520#endif
88752192 2521fl.dsn_advertised = FALSE;
8c5d388a 2522#ifdef SUPPORT_I18N
88752192 2523fl.smtputf8_advertised = FALSE;
d1a13eea 2524#endif
059ec3d9
PH
2525
2526/* Reset ACL connection variables */
2527
38a0a95f 2528acl_var_c = NULL;
059ec3d9 2529
f3ebb786 2530/* Allow for trailing 0 in the command and data buffers. Tainted. */
3ee512ff 2531
f3ebb786 2532smtp_cmd_buffer = store_get_perm(2*SMTP_CMD_BUFFER_SIZE + 2, TRUE);
40c90bca 2533
2416c261 2534smtp_cmd_buffer[0] = 0;
bd8fbe36 2535smtp_data_buffer = smtp_cmd_buffer + SMTP_CMD_BUFFER_SIZE + 1;
059ec3d9
PH
2536
2537/* For batched input, the protocol setting can be overridden from the
2538command line by a trusted caller. */
2539
2540if (smtp_batched_input)
2541 {
40c90bca 2542 if (!received_protocol) received_protocol = US"local-bsmtp";
059ec3d9
PH
2543 }
2544
2545/* For non-batched SMTP input, the protocol setting is forced here. It will be
2546reset later if any of EHLO/AUTH/STARTTLS are received. */
2547
2548else
2549 received_protocol =
e524074d 2550 (sender_host_address ? protocols : protocols_local) [pnormal];
059ec3d9
PH
2551
2552/* Set up the buffer for inputting using direct read() calls, and arrange to
ecce6d9a
JH
2553call the local functions instead of the standard C ones. Place a NUL at the
2554end of the buffer to safety-stop C-string reads from it. */
059ec3d9 2555
5903c6ff 2556if (!(smtp_inbuffer = US malloc(IN_BUFFER_SIZE)))
059ec3d9 2557 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "malloc() failed for SMTP input buffer");
ecce6d9a 2558smtp_inbuffer[IN_BUFFER_SIZE-1] = '\0';
40c90bca 2559
059ec3d9 2560receive_getc = smtp_getc;
0d81dabc 2561receive_getbuf = smtp_getbuf;
584e96c6 2562receive_get_cache = smtp_get_cache;
059ec3d9
PH
2563receive_ungetc = smtp_ungetc;
2564receive_feof = smtp_feof;
2565receive_ferror = smtp_ferror;
58eb016e 2566receive_smtp_buffered = smtp_buffered;
059ec3d9
PH
2567smtp_inptr = smtp_inend = smtp_inbuffer;
2568smtp_had_eof = smtp_had_error = 0;
2569
2570/* Set up the message size limit; this may be host-specific */
2571
d45b1de8 2572thismessage_size_limit = expand_string_integer(message_size_limit, TRUE);
db57e575 2573if (expand_string_message)
059ec3d9
PH
2574 {
2575 if (thismessage_size_limit == -1)
2576 log_write(0, LOG_MAIN|LOG_PANIC, "unable to expand message_size_limit: "
2577 "%s", expand_string_message);
2578 else
2579 log_write(0, LOG_MAIN|LOG_PANIC, "invalid message_size_limit: "
2580 "%s", expand_string_message);
2581 smtp_closedown(US"Temporary local problem - please try later");
2582 return FALSE;
2583 }
2584
2585/* When a message is input locally via the -bs or -bS options, sender_host_
2586unknown is set unless -oMa was used to force an IP address, in which case it
2587is checked like a real remote connection. When -bs is used from inetd, this
2588flag is not set, causing the sending host to be checked. The code that deals
2589with IP source routing (if configured) is never required for -bs or -bS and
2590the flag sender_host_notsocket is used to suppress it.
2591
2592If smtp_accept_max and smtp_accept_reserve are set, keep some connections in
2593reserve for certain hosts and/or networks. */
2594
8768d548 2595if (!f.sender_host_unknown)
059ec3d9
PH
2596 {
2597 int rc;
2598 BOOL reserved_host = FALSE;
2599
2600 /* Look up IP options (source routing info) on the socket if this is not an
2601 -oMa "host", and if any are found, log them and drop the connection.
2602
2603 Linux (and others now, see below) is different to everyone else, so there
2604 has to be some conditional compilation here. Versions of Linux before 2.1.15
2605 used a structure whose name was "options". Somebody finally realized that
2606 this name was silly, and it got changed to "ip_options". I use the
2607 newer name here, but there is a fudge in the script that sets up os.h
2608 to define a macro in older Linux systems.
2609
2610 Sigh. Linux is a fast-moving target. Another generation of Linux uses
2611 glibc 2, which has chosen ip_opts for the structure name. This is now
2612 really a glibc thing rather than a Linux thing, so the condition name
2613 has been changed to reflect this. It is relevant also to GNU/Hurd.
2614
2615 Mac OS 10.x (Darwin) is like the later glibc versions, but without the
2616 setting of the __GLIBC__ macro, so we can't detect it automatically. There's
2617 a special macro defined in the os.h file.
2618
2619 Some DGUX versions on older hardware appear not to support IP options at
2620 all, so there is now a general macro which can be set to cut out this
2621 support altogether.
2622
2623 How to do this properly in IPv6 is not yet known. */
2624
e0574cb5 2625#if !HAVE_IPV6 && !defined(NO_IP_OPTIONS)
059ec3d9
PH
2626
2627 #ifdef GLIBC_IP_OPTIONS
2628 #if (!defined __GLIBC__) || (__GLIBC__ < 2)
2629 #define OPTSTYLE 1
2630 #else
2631 #define OPTSTYLE 2
2632 #endif
2633 #elif defined DARWIN_IP_OPTIONS
2634 #define OPTSTYLE 2
2635 #else
2636 #define OPTSTYLE 3
2637 #endif
2638
8768d548 2639 if (!host_checking && !f.sender_host_notsocket)
059ec3d9
PH
2640 {
2641 #if OPTSTYLE == 1
36a3b041 2642 EXIM_SOCKLEN_T optlen = sizeof(struct ip_options) + MAX_IPOPTLEN;
f3ebb786 2643 struct ip_options *ipopt = store_get(optlen, FALSE);
059ec3d9
PH
2644 #elif OPTSTYLE == 2
2645 struct ip_opts ipoptblock;
2646 struct ip_opts *ipopt = &ipoptblock;
36a3b041 2647 EXIM_SOCKLEN_T optlen = sizeof(ipoptblock);
059ec3d9
PH
2648 #else
2649 struct ipoption ipoptblock;
2650 struct ipoption *ipopt = &ipoptblock;
36a3b041 2651 EXIM_SOCKLEN_T optlen = sizeof(ipoptblock);
059ec3d9
PH
2652 #endif
2653
2654 /* Occasional genuine failures of getsockopt() have been seen - for
2655 example, "reset by peer". Therefore, just log and give up on this
2656 call, unless the error is ENOPROTOOPT. This error is given by systems
2657 that have the interfaces but not the mechanism - e.g. GNU/Hurd at the time
2658 of writing. So for that error, carry on - we just can't do an IP options
2659 check. */
2660
2661 DEBUG(D_receive) debug_printf("checking for IP options\n");
2662
5903c6ff 2663 if (getsockopt(fileno(smtp_out), IPPROTO_IP, IP_OPTIONS, US (ipopt),
059ec3d9
PH
2664 &optlen) < 0)
2665 {
2666 if (errno != ENOPROTOOPT)
2667 {
2668 log_write(0, LOG_MAIN, "getsockopt() failed from %s: %s",
2669 host_and_ident(FALSE), strerror(errno));
925ac8e4 2670 smtp_printf("451 SMTP service not available\r\n", FALSE);
059ec3d9
PH
2671 return FALSE;
2672 }
2673 }
2674
2675 /* Deal with any IP options that are set. On the systems I have looked at,
2676 the value of MAX_IPOPTLEN has been 40, meaning that there should never be
2677 more logging data than will fit in big_buffer. Nevertheless, after somebody
2678 questioned this code, I've added in some paranoid checking. */
2679
2680 else if (optlen > 0)
2681 {
2682 uschar *p = big_buffer;
2683 uschar *pend = big_buffer + big_buffer_size;
d7978c0f 2684 uschar *adptr;
059ec3d9
PH
2685 int optcount;
2686 struct in_addr addr;
2687
2688 #if OPTSTYLE == 1
5903c6ff 2689 uschar *optstart = US (ipopt->__data);
059ec3d9 2690 #elif OPTSTYLE == 2
5903c6ff 2691 uschar *optstart = US (ipopt->ip_opts);
059ec3d9 2692 #else
5903c6ff 2693 uschar *optstart = US (ipopt->ipopt_list);
059ec3d9
PH
2694 #endif
2695
2696 DEBUG(D_receive) debug_printf("IP options exist\n");
2697
2698 Ustrcpy(p, "IP options on incoming call:");
2699 p += Ustrlen(p);
2700
d7978c0f 2701 for (uschar * opt = optstart; opt && opt < US (ipopt) + optlen; )
059ec3d9
PH
2702 switch (*opt)
2703 {
2704 case IPOPT_EOL:
2705 opt = NULL;
2706 break;
2707
2708 case IPOPT_NOP:
2709 opt++;
2710 break;
2711
2712 case IPOPT_SSRR:
2713 case IPOPT_LSRR:
2714 if (!string_format(p, pend-p, " %s [@%s",
2715 (*opt == IPOPT_SSRR)? "SSRR" : "LSRR",
2716 #if OPTSTYLE == 1
2717 inet_ntoa(*((struct in_addr *)(&(ipopt->faddr))))))
2718 #elif OPTSTYLE == 2
2719 inet_ntoa(ipopt->ip_dst)))
2720 #else
2721 inet_ntoa(ipopt->ipopt_dst)))
2722 #endif
2723 {
2724 opt = NULL;
2725 break;
2726 }
2727
2728 p += Ustrlen(p);
2729 optcount = (opt[1] - 3) / sizeof(struct in_addr);
2730 adptr = opt + 3;
2731 while (optcount-- > 0)
2732 {
2733 memcpy(&addr, adptr, sizeof(addr));
2734 if (!string_format(p, pend - p - 1, "%s%s",
2735 (optcount == 0)? ":" : "@", inet_ntoa(addr)))
2736 {
2737 opt = NULL;
2738 break;
2739 }
2740 p += Ustrlen(p);
2741 adptr += sizeof(struct in_addr);
2742 }
2743 *p++ = ']';
2744 opt += opt[1];
2745 break;
2746
2747 default:
2748 {
059ec3d9
PH
2749 if (pend - p < 4 + 3*opt[1]) { opt = NULL; break; }
2750 Ustrcat(p, "[ ");
2751 p += 2;
d7978c0f 2752 for (int i = 0; i < opt[1]; i++)
5976eb99 2753 p += sprintf(CS p, "%2.2x ", opt[i]);
059ec3d9
PH
2754 *p++ = ']';
2755 }
2756 opt += opt[1];
2757 break;
2758 }
059ec3d9
PH
2759
2760 *p = 0;
2761 log_write(0, LOG_MAIN, "%s", big_buffer);
2762
2763 /* Refuse any call with IP options. This is what tcpwrappers 7.5 does. */
2764
2765 log_write(0, LOG_MAIN|LOG_REJECT,
2766 "connection from %s refused (IP options)", host_and_ident(FALSE));
2767
925ac8e4 2768 smtp_printf("554 SMTP service not available\r\n", FALSE);
059ec3d9
PH
2769 return FALSE;
2770 }
2771
2772 /* Length of options = 0 => there are no options */
2773
2774 else DEBUG(D_receive) debug_printf("no IP options found\n");
2775 }
e0574cb5 2776#endif /* HAVE_IPV6 && !defined(NO_IP_OPTIONS) */
059ec3d9
PH
2777
2778 /* Set keep-alive in socket options. The option is on by default. This
2779 setting is an attempt to get rid of some hanging connections that stick in
2780 read() when the remote end (usually a dialup) goes away. */
2781
8768d548 2782 if (smtp_accept_keepalive && !f.sender_host_notsocket)
059ec3d9
PH
2783 ip_keepalive(fileno(smtp_out), sender_host_address, FALSE);
2784
2785 /* If the current host matches host_lookup, set the name by doing a
2786 reverse lookup. On failure, sender_host_name will be NULL and
2787 host_lookup_failed will be TRUE. This may or may not be serious - optional
2788 checks later. */
2789
2790 if (verify_check_host(&host_lookup) == OK)
2791 {
2792 (void)host_name_lookup();
2793 host_build_sender_fullhost();
2794 }
2795
2796 /* Delay this until we have the full name, if it is looked up. */
2797
2798 set_process_info("handling incoming connection from %s",
2799 host_and_ident(FALSE));
2800
1ad6489e
JH
2801 /* Expand smtp_receive_timeout, if needed */
2802
2803 if (smtp_receive_timeout_s)
2804 {
2805 uschar * exp;
2806 if ( !(exp = expand_string(smtp_receive_timeout_s))
2807 || !(*exp)
2808 || (smtp_receive_timeout = readconf_readtime(exp, 0, FALSE)) < 0
2809 )
2810 log_write(0, LOG_MAIN|LOG_PANIC,
2811 "bad value for smtp_receive_timeout: '%s'", exp ? exp : US"");
2812 }
2813
059ec3d9
PH
2814 /* Test for explicit connection rejection */
2815
2816 if (verify_check_host(&host_reject_connection) == OK)
2817 {
2818 log_write(L_connection_reject, LOG_MAIN|LOG_REJECT, "refused connection "
2819 "from %s (host_reject_connection)", host_and_ident(FALSE));
925ac8e4 2820 smtp_printf("554 SMTP service not available\r\n", FALSE);
059ec3d9
PH
2821 return FALSE;
2822 }
2823
afb3eaaf
PH
2824 /* Test with TCP Wrappers if so configured. There is a problem in that
2825 hosts_ctl() returns 0 (deny) under a number of system failure circumstances,
2826 such as disks dying. In these cases, it is desirable to reject with a 4xx
2827 error instead of a 5xx error. There isn't a "right" way to detect such
2828 problems. The following kludge is used: errno is zeroed before calling
2829 hosts_ctl(). If the result is "reject", a 5xx error is given only if the
2830 value of errno is 0 or ENOENT (which happens if /etc/hosts.{allow,deny} does
2831 not exist). */
059ec3d9 2832
1811cb4c 2833#ifdef USE_TCP_WRAPPERS
afb3eaaf 2834 errno = 0;
1811cb4c 2835 if (!(tcp_wrappers_name = expand_string(tcp_wrappers_daemon_name)))
5dc43717
JJ
2836 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Expansion of \"%s\" "
2837 "(tcp_wrappers_name) failed: %s", string_printing(tcp_wrappers_name),
2838 expand_string_message);
1811cb4c 2839
5dc43717 2840 if (!hosts_ctl(tcp_wrappers_name,
1811cb4c
JH
2841 sender_host_name ? CS sender_host_name : STRING_UNKNOWN,
2842 sender_host_address ? CS sender_host_address : STRING_UNKNOWN,
2843 sender_ident ? CS sender_ident : STRING_UNKNOWN))
059ec3d9 2844 {
afb3eaaf
PH
2845 if (errno == 0 || errno == ENOENT)
2846 {
2847 HDEBUG(D_receive) debug_printf("tcp wrappers rejection\n");
2848 log_write(L_connection_reject,
2849 LOG_MAIN|LOG_REJECT, "refused connection from %s "
2850 "(tcp wrappers)", host_and_ident(FALSE));
925ac8e4 2851 smtp_printf("554 SMTP service not available\r\n", FALSE);
afb3eaaf
PH
2852 }
2853 else
2854 {
2855 int save_errno = errno;
2856 HDEBUG(D_receive) debug_printf("tcp wrappers rejected with unexpected "
2857 "errno value %d\n", save_errno);
2858 log_write(L_connection_reject,
2859 LOG_MAIN|LOG_REJECT, "temporarily refused connection from %s "
2860 "(tcp wrappers errno=%d)", host_and_ident(FALSE), save_errno);
925ac8e4 2861 smtp_printf("451 Temporary local problem - please try later\r\n", FALSE);
afb3eaaf 2862 }
059ec3d9
PH
2863 return FALSE;
2864 }
1811cb4c 2865#endif
059ec3d9 2866
b01dd148
PH
2867 /* Check for reserved slots. The value of smtp_accept_count has already been
2868 incremented to include this process. */
059ec3d9
PH
2869
2870 if (smtp_accept_max > 0 &&
b01dd148 2871 smtp_accept_count > smtp_accept_max - smtp_accept_reserve)
059ec3d9
PH
2872 {
2873 if ((rc = verify_check_host(&smtp_reserve_hosts)) != OK)
2874 {
2875 log_write(L_connection_reject,
2876 LOG_MAIN, "temporarily refused connection from %s: not in "
2877 "reserve list: connected=%d max=%d reserve=%d%s",
b01dd148 2878 host_and_ident(FALSE), smtp_accept_count - 1, smtp_accept_max,
059ec3d9
PH
2879 smtp_accept_reserve, (rc == DEFER)? " (lookup deferred)" : "");
2880 smtp_printf("421 %s: Too many concurrent SMTP connections; "
925ac8e4 2881 "please try again later\r\n", FALSE, smtp_active_hostname);
059ec3d9
PH
2882 return FALSE;
2883 }
2884 reserved_host = TRUE;
2885 }
2886
2887 /* If a load level above which only messages from reserved hosts are
2888 accepted is set, check the load. For incoming calls via the daemon, the
2889 check is done in the superior process if there are no reserved hosts, to
2890 save a fork. In all cases, the load average will already be available
2891 in a global variable at this point. */
2892
2893 if (smtp_load_reserve >= 0 &&
2894 load_average > smtp_load_reserve &&
2895 !reserved_host &&
2896 verify_check_host(&smtp_reserve_hosts) != OK)
2897 {
2898 log_write(L_connection_reject,
2899 LOG_MAIN, "temporarily refused connection from %s: not in "
2900 "reserve list and load average = %.2f", host_and_ident(FALSE),
2901 (double)load_average/1000.0);
925ac8e4 2902 smtp_printf("421 %s: Too much load; please try again later\r\n", FALSE,
059ec3d9
PH
2903 smtp_active_hostname);
2904 return FALSE;
2905 }
2906
2907 /* Determine whether unqualified senders or recipients are permitted
2908 for this host. Unfortunately, we have to do this every time, in order to
2909 set the flags so that they can be inspected when considering qualifying
2910 addresses in the headers. For a site that permits no qualification, this
2911 won't take long, however. */
2912
8768d548 2913 f.allow_unqualified_sender =
059ec3d9
PH
2914 verify_check_host(&sender_unqualified_hosts) == OK;
2915
8768d548 2916 f.allow_unqualified_recipient =
059ec3d9
PH
2917 verify_check_host(&recipient_unqualified_hosts) == OK;
2918
2919 /* Determine whether HELO/EHLO is required for this host. The requirement
2920 can be hard or soft. */
2921
88752192
JH
2922 fl.helo_required = verify_check_host(&helo_verify_hosts) == OK;
2923 if (!fl.helo_required)
2924 fl.helo_verify = verify_check_host(&helo_try_verify_hosts) == OK;
059ec3d9
PH
2925
2926 /* Determine whether this hosts is permitted to send syntactic junk
2927 after a HELO or EHLO command. */
2928
88752192 2929 fl.helo_accept_junk = verify_check_host(&helo_accept_junk_hosts) == OK;
059ec3d9
PH
2930 }
2931
2932/* For batch SMTP input we are now done. */
2933
2934if (smtp_batched_input) return TRUE;
2935
a3c86431
TL
2936/* If valid Proxy Protocol source is connecting, set up session.
2937 * Failure will not allow any SMTP function other than QUIT. */
1811cb4c
JH
2938
2939#ifdef SUPPORT_PROXY
a3c86431 2940proxy_session = FALSE;
8768d548 2941f.proxy_session_failed = FALSE;
a3c86431 2942if (check_proxy_protocol_host())
1811cb4c
JH
2943 setup_proxy_protocol_host();
2944#endif
2945
2946 /* Start up TLS if tls_on_connect is set. This is for supporting the legacy
2947 smtps port for use with older style SSL MTAs. */
2948
01603eec 2949#ifndef DISABLE_TLS
69d8eed7
JH
2950 if (tls_in.on_connect)
2951 {
2952 if (tls_server_start(tls_require_ciphers, &user_msg) != OK)
2953 return smtp_log_tls_fail(user_msg);
2954 cmd_list[CMD_LIST_TLS_AUTH].is_mail_cmd = TRUE;
2955 }
a3c86431
TL
2956#endif
2957
1811cb4c 2958/* Run the connect ACL if it exists */
059ec3d9 2959
4e88a19f 2960user_msg = NULL;
3cc3f762 2961if (acl_smtp_connect)
059ec3d9
PH
2962 {
2963 int rc;
3cc3f762
JH
2964 if ((rc = acl_check(ACL_WHERE_CONNECT, NULL, acl_smtp_connect, &user_msg,
2965 &log_msg)) != OK)
059ec3d9 2966 {
3cc3f762 2967 (void) smtp_handle_acl_fail(ACL_WHERE_CONNECT, rc, user_msg, log_msg);
059ec3d9
PH
2968 return FALSE;
2969 }
2970 }
2971
2972/* Output the initial message for a two-way SMTP connection. It may contain
2973newlines, which then cause a multi-line response to be given. */
2974
4e88a19f
PH
2975code = US"220"; /* Default status code */
2976esc = US""; /* Default extended status code */
2977esclen = 0; /* Length of esc */
2978
d4ff61d1 2979if (!user_msg)
4e88a19f 2980 {
d4ff61d1 2981 if (!(s = expand_string(smtp_banner)))
4e88a19f
PH
2982 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Expansion of \"%s\" (smtp_banner) "
2983 "failed: %s", smtp_banner, expand_string_message);
2984 }
2985else
2986 {
2987 int codelen = 3;
2988 s = user_msg;
4f6ae5c3 2989 smtp_message_code(&code, &codelen, &s, NULL, TRUE);
d6a96edc 2990 if (codelen > 4)
4e88a19f
PH
2991 {
2992 esc = code + 4;
2993 esclen = codelen - 4;
2994 }
2995 }
059ec3d9
PH
2996
2997/* Remove any terminating newlines; might as well remove trailing space too */
2998
2999p = s + Ustrlen(s);
3000while (p > s && isspace(p[-1])) p--;
3001*p = 0;
3002
3003/* It seems that CC:Mail is braindead, and assumes that the greeting message
3004is all contained in a single IP packet. The original code wrote out the
3005greeting using several calls to fprint/fputc, and on busy servers this could
3006cause it to be split over more than one packet - which caused CC:Mail to fall
3007over when it got the second part of the greeting after sending its first
3008command. Sigh. To try to avoid this, build the complete greeting message
3009first, and output it in one fell swoop. This gives a better chance of it
3010ending up as a single packet. */
3011
acec9514 3012ss = string_get(256);
059ec3d9
PH
3013
3014p = s;
3015do /* At least once, in case we have an empty string */
3016 {
3017 int len;
3018 uschar *linebreak = Ustrchr(p, '\n');
acec9514 3019 ss = string_catn(ss, code, 3);
db57e575 3020 if (!linebreak)
059ec3d9
PH
3021 {
3022 len = Ustrlen(p);
acec9514 3023 ss = string_catn(ss, US" ", 1);
059ec3d9
PH
3024 }
3025 else
3026 {
3027 len = linebreak - p;
acec9514 3028 ss = string_catn(ss, US"-", 1);
059ec3d9 3029 }
acec9514
JH
3030 ss = string_catn(ss, esc, esclen);
3031 ss = string_catn(ss, p, len);
3032 ss = string_catn(ss, US"\r\n", 2);
059ec3d9 3033 p += len;
db57e575 3034 if (linebreak) p++;
059ec3d9 3035 }
db57e575 3036while (*p);
059ec3d9 3037
059ec3d9
PH
3038/* Before we write the banner, check that there is no input pending, unless
3039this synchronisation check is disabled. */
3040
81344b40 3041#ifndef DISABLE_PIPE_CONNECT
ee8b8090
JH
3042fl.pipe_connect_acceptable =
3043 sender_host_address && verify_check_host(&pipe_connect_advertise_hosts) == OK;
3044
a14e5636 3045if (!check_sync())
ee8b8090
JH
3046 if (fl.pipe_connect_acceptable)
3047 f.smtp_in_early_pipe_used = TRUE;
3048 else
3049#else
3050if (!check_sync())
3051#endif
3052 {
3053 unsigned n = smtp_inend - smtp_inptr;
3be4dbba 3054 if (n > 128) n = 128;
ee8b8090
JH
3055
3056 log_write(0, LOG_MAIN|LOG_REJECT, "SMTP protocol "
3057 "synchronization error (input sent without waiting for greeting): "
3058 "rejected connection from %s input=\"%s\"", host_and_ident(TRUE),
3059 string_printing(string_copyn(smtp_inptr, n)));
3060 smtp_printf("554 SMTP synchronization error\r\n", FALSE);
3061 return FALSE;
3062 }
059ec3d9
PH
3063
3064/* Now output the banner */
ee8b8090 3065/*XXX the ehlo-resp code does its own tls/nontls bit. Maybe subroutine that? */
059ec3d9 3066
ee8b8090 3067smtp_printf("%s",
81344b40 3068#ifndef DISABLE_PIPE_CONNECT
ee8b8090
JH
3069 fl.pipe_connect_acceptable && pipeline_connect_sends(),
3070#else
3071 FALSE,
3072#endif
3073 string_from_gstring(ss));
a2673768
JH
3074
3075/* Attempt to see if we sent the banner before the last ACK of the 3-way
3076handshake arrived. If so we must have managed a TFO. */
3077
3078#ifdef TCP_FASTOPEN
53c7b3a7 3079if (sender_host_address && !f.sender_host_notsocket) tfo_in_check();
a2673768
JH
3080#endif
3081
059ec3d9
PH
3082return TRUE;
3083}
3084
3085
3086
3087
3088
3089/*************************************************
3090* Handle SMTP syntax and protocol errors *
3091*************************************************/
3092
3093/* Write to the log for SMTP syntax errors in incoming commands, if configured
3094to do so. Then transmit the error response. The return value depends on the
3095number of syntax and protocol errors in this SMTP session.
3096
3097Arguments:
3098 type error type, given as a log flag bit
3099 code response code; <= 0 means don't send a response
3100 data data to reflect in the response (can be NULL)
3101 errmess the error message
3102
3103Returns: -1 limit of syntax/protocol errors NOT exceeded
3104 +1 limit of syntax/protocol errors IS exceeded
3105
3106These values fit in with the values of the "done" variable in the main
3107processing loop in smtp_setup_msg(). */
3108
3109static int
3110synprot_error(int type, int code, uschar *data, uschar *errmess)
3111{
3112int yield = -1;
3113
3114log_write(type, LOG_MAIN, "SMTP %s error in \"%s\" %s %s",
5990a265 3115 type == L_smtp_syntax_error ? "syntax" : "protocol",
3ee512ff 3116 string_printing(smtp_cmd_buffer), host_and_ident(TRUE), errmess);
059ec3d9
PH
3117
3118if (++synprot_error_count > smtp_max_synprot_errors)
3119 {
3120 yield = 1;
3121 log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
5990a265
JH
3122 "syntax or protocol errors (last command was \"%s\", %s)",
3123 host_and_ident(FALSE), string_printing(smtp_cmd_buffer),
3124 string_from_gstring(s_connhad_log(NULL))
3125 );
059ec3d9
PH
3126 }
3127
3128if (code > 0)
3129 {
925ac8e4
JH
3130 smtp_printf("%d%c%s%s%s\r\n", FALSE, code, yield == 1 ? '-' : ' ',
3131 data ? data : US"", data ? US": " : US"", errmess);
059ec3d9 3132 if (yield == 1)
925ac8e4 3133 smtp_printf("%d Too many syntax or protocol errors\r\n", FALSE, code);
059ec3d9
PH
3134 }
3135
3136return yield;
3137}
3138
3139
3140
3141
059ec3d9
PH
3142/*************************************************
3143* Send SMTP response, possibly multiline *
3144*************************************************/
3145
3146/* There are, it seems, broken clients out there that cannot handle multiline
3147responses. If no_multiline_responses is TRUE (it can be set from an ACL), we
3148output nothing for non-final calls, and only the first line for anything else.
3149
3150Arguments:
a5bd321b 3151 code SMTP code, may involve extended status codes
d6a96edc 3152 codelen length of smtp code; if > 4 there's an ESC
059ec3d9
PH
3153 final FALSE if the last line isn't the final line
3154 msg message text, possibly containing newlines
3155
3156Returns: nothing
3157*/
3158
3159void
a5bd321b 3160smtp_respond(uschar* code, int codelen, BOOL final, uschar *msg)
059ec3d9 3161{
a5bd321b
PH
3162int esclen = 0;
3163uschar *esc = US"";
3164
8768d548 3165if (!final && f.no_multiline_responses) return;
059ec3d9 3166
d6a96edc 3167if (codelen > 4)
a5bd321b
PH
3168 {
3169 esc = code + 4;
3170 esclen = codelen - 4;
3171 }
3172
2679d413
PH
3173/* If this is the first output for a (non-batch) RCPT command, see if all RCPTs
3174have had the same. Note: this code is also present in smtp_printf(). It would
3175be tidier to have it only in one place, but when it was added, it was easier to
3176do it that way, so as not to have to mess with the code for the RCPT command,
3177which sometimes uses smtp_printf() and sometimes smtp_respond(). */
3178
88752192 3179if (fl.rcpt_in_progress)
2679d413
PH
3180 {
3181 if (rcpt_smtp_response == NULL)
3182 rcpt_smtp_response = string_copy(msg);
88752192 3183 else if (fl.rcpt_smtp_response_same &&
2679d413 3184 Ustrcmp(rcpt_smtp_response, msg) != 0)
88752192
JH
3185 fl.rcpt_smtp_response_same = FALSE;
3186 fl.rcpt_in_progress = FALSE;
2679d413
PH
3187 }
3188
e5de01f0 3189/* Now output the message, splitting it up into multiple lines if necessary.
925ac8e4
JH
3190We only handle pipelining these responses as far as nonfinal/final groups,
3191not the whole MAIL/RCPT/DATA response set. */
2679d413 3192
059ec3d9
PH
3193for (;;)
3194 {
3195 uschar *nl = Ustrchr(msg, '\n');
3196 if (nl == NULL)
3197 {
925ac8e4 3198 smtp_printf("%.3s%c%.*s%s\r\n", !final, code, final ? ' ':'-', esclen, esc, msg);
059ec3d9
PH
3199 return;
3200 }
8768d548 3201 else if (nl[1] == 0 || f.no_multiline_responses)
059ec3d9 3202 {
925ac8e4 3203 smtp_printf("%.3s%c%.*s%.*s\r\n", !final, code, final ? ' ':'-', esclen, esc,
a5bd321b 3204 (int)(nl - msg), msg);
059ec3d9
PH
3205 return;
3206 }
3207 else
3208 {
925ac8e4 3209 smtp_printf("%.3s-%.*s%.*s\r\n", TRUE, code, esclen, esc, (int)(nl - msg), msg);
059ec3d9 3210 msg = nl + 1;
137ae145 3211 Uskip_whitespace(&msg);
059ec3d9
PH
3212 }
3213 }
3214}
3215
3216
3217
3218
4e88a19f
PH
3219/*************************************************
3220* Parse user SMTP message *
3221*************************************************/
3222
3223/* This function allows for user messages overriding the response code details
3224by providing a suitable response code string at the start of the message
3225user_msg. Check the message for starting with a response code and optionally an
3226extended status code. If found, check that the first digit is valid, and if so,
3227change the code pointer and length to use the replacement. An invalid code
3228causes a panic log; in this case, if the log messages is the same as the user
3229message, we must also adjust the value of the log message to show the code that
3230is actually going to be used (the original one).
3231
3232This function is global because it is called from receive.c as well as within
3233this module.
3234
d6a96edc
PH
3235Note that the code length returned includes the terminating whitespace
3236character, which is always included in the regex match.
3237
4e88a19f
PH
3238Arguments:
3239 code SMTP code, may involve extended status codes
d6a96edc 3240 codelen length of smtp code; if > 4 there's an ESC
4e88a19f
PH
3241 msg message text
3242 log_msg optional log message, to be adjusted with the new SMTP code
4f6ae5c3 3243 check_valid if true, verify the response code
4e88a19f
PH
3244
3245Returns: nothing
3246*/
3247
3248void
4f6ae5c3
JH
3249smtp_message_code(uschar **code, int *codelen, uschar **msg, uschar **log_msg,
3250 BOOL check_valid)
4e88a19f
PH
3251{
3252int n;
3253int ovector[3];
3254
4f6ae5c3 3255if (!msg || !*msg) return;
4e88a19f 3256
4f6ae5c3
JH
3257if ((n = pcre_exec(regex_smtp_code, NULL, CS *msg, Ustrlen(*msg), 0,
3258 PCRE_EOPT, ovector, sizeof(ovector)/sizeof(int))) < 0) return;
4e88a19f 3259
4f6ae5c3 3260if (check_valid && (*msg)[0] != (*code)[0])
4e88a19f
PH
3261 {
3262 log_write(0, LOG_MAIN|LOG_PANIC, "configured error code starts with "
3263 "incorrect digit (expected %c) in \"%s\"", (*code)[0], *msg);
3264 if (log_msg != NULL && *log_msg == *msg)
3265 *log_msg = string_sprintf("%s %s", *code, *log_msg + ovector[1]);
3266 }
3267else
3268 {
3269 *code = *msg;
3270 *codelen = ovector[1]; /* Includes final space */
3271 }
3272*msg += ovector[1]; /* Chop the code off the message */
3273return;
3274}
3275
3276
3277
3278
059ec3d9
PH
3279/*************************************************
3280* Handle an ACL failure *
3281*************************************************/
3282
3283/* This function is called when acl_check() fails. As well as calls from within
3284this module, it is called from receive.c for an ACL after DATA. It sorts out
5b6f7658 3285logging the incident, and sends the error response. A message containing
059ec3d9
PH
3286newlines is turned into a multiline SMTP response, but for logging, only the
3287first line is used.
3288
a5bd321b
PH
3289There's a table of default permanent failure response codes to use in
3290globals.c, along with the table of names. VFRY is special. Despite RFC1123 it
3291defaults disabled in Exim. However, discussion in connection with RFC 821bis
3292(aka RFC 2821) has concluded that the response should be 252 in the disabled
3293state, because there are broken clients that try VRFY before RCPT. A 5xx
3294response should be given only when the address is positively known to be
4f6ae5c3
JH
3295undeliverable. Sigh. We return 252 if there is no VRFY ACL or it provides
3296no explicit code, but if there is one we let it know best.
3297Also, for ETRN, 458 is given on refusal, and for AUTH, 503.
a5bd321b
PH
3298
3299From Exim 4.63, it is possible to override the response code details by
3300providing a suitable response code string at the start of the message provided
3301in user_msg. The code's first digit is checked for validity.
059ec3d9
PH
3302
3303Arguments:
4f6ae5c3
JH
3304 where where the ACL was called from
3305 rc the failure code
3306 user_msg a message that can be included in an SMTP response
3307 log_msg a message for logging
059ec3d9
PH
3308
3309Returns: 0 in most cases
3310 2 if the failure code was FAIL_DROP, in which case the
3311 SMTP connection should be dropped (this value fits with the
3312 "done" variable in smtp_setup_msg() below)
3313*/
3314
3315int
3316smtp_handle_acl_fail(int where, int rc, uschar *user_msg, uschar *log_msg)
3317{
059ec3d9 3318BOOL drop = rc == FAIL_DROP;
a5bd321b 3319int codelen = 3;
a5bd321b 3320uschar *smtp_code;
059ec3d9
PH
3321uschar *lognl;
3322uschar *sender_info = US"";
64ffc24f 3323uschar *what =
8523533c 3324#ifdef WITH_CONTENT_SCAN
3cc3f762 3325 where == ACL_WHERE_MIME ? US"during MIME ACL checks" :
8e669ac1 3326#endif
3cc3f762
JH
3327 where == ACL_WHERE_PREDATA ? US"DATA" :
3328 where == ACL_WHERE_DATA ? US"after DATA" :
8ccd00b1 3329#ifndef DISABLE_PRDR
3cc3f762 3330 where == ACL_WHERE_PRDR ? US"after DATA PRDR" :
fd98a5c6 3331#endif
3cc3f762
JH
3332 smtp_cmd_data ?
3333 string_sprintf("%s %s", acl_wherenames[where], smtp_cmd_data) :
3334 string_sprintf("%s in \"connect\" ACL", acl_wherenames[where]);
059ec3d9
PH
3335
3336if (drop) rc = FAIL;
3337
4e88a19f 3338/* Set the default SMTP code, and allow a user message to change it. */
a5bd321b 3339
4f6ae5c3
JH
3340smtp_code = rc == FAIL ? acl_wherecodes[where] : US"451";
3341smtp_message_code(&smtp_code, &codelen, &user_msg, &log_msg,
3342 where != ACL_WHERE_VRFY);
a5bd321b 3343
059ec3d9
PH
3344/* We used to have sender_address here; however, there was a bug that was not
3345updating sender_address after a rewrite during a verify. When this bug was
3346fixed, sender_address at this point became the rewritten address. I'm not sure
3347this is what should be logged, so I've changed to logging the unrewritten
3348address to retain backward compatibility. */
3349
8523533c 3350#ifndef WITH_CONTENT_SCAN
059ec3d9 3351if (where == ACL_WHERE_RCPT || where == ACL_WHERE_DATA)
8523533c
TK
3352#else
3353if (where == ACL_WHERE_RCPT || where == ACL_WHERE_DATA || where == ACL_WHERE_MIME)
3354#endif
059ec3d9 3355 {
b98bb9ac
PP
3356 sender_info = string_sprintf("F=<%s>%s%s%s%s ",
3357 sender_address_unrewritten ? sender_address_unrewritten : sender_address,
3358 sender_host_authenticated ? US" A=" : US"",
3359 sender_host_authenticated ? sender_host_authenticated : US"",
3360 sender_host_authenticated && authenticated_id ? US":" : US"",
3361 sender_host_authenticated && authenticated_id ? authenticated_id : US""
3362 );
059ec3d9
PH
3363 }
3364
3365/* If there's been a sender verification failure with a specific message, and
3366we have not sent a response about it yet, do so now, as a preliminary line for
278c6e6c
PH
3367failures, but not defers. However, always log it for defer, and log it for fail
3368unless the sender_verify_fail log selector has been turned off. */
059ec3d9 3369
02b41d71 3370if (sender_verified_failed &&
059ec3d9
PH
3371 !testflag(sender_verified_failed, af_sverify_told))
3372 {
88752192
JH
3373 BOOL save_rcpt_in_progress = fl.rcpt_in_progress;
3374 fl.rcpt_in_progress = FALSE; /* So as not to treat these as the error */
2679d413 3375
059ec3d9
PH
3376 setflag(sender_verified_failed, af_sverify_told);
3377
6c6d6e48 3378 if (rc != FAIL || LOGGING(sender_verify_fail))
278c6e6c
PH
3379 log_write(0, LOG_MAIN|LOG_REJECT, "%s sender verify %s for <%s>%s",
3380 host_and_ident(TRUE),
3381 ((sender_verified_failed->special_action & 255) == DEFER)? "defer":"fail",
3382 sender_verified_failed->address,
3383 (sender_verified_failed->message == NULL)? US"" :
3384 string_sprintf(": %s", sender_verified_failed->message));
059ec3d9 3385
02b41d71 3386 if (rc == FAIL && sender_verified_failed->user_message)
a5bd321b 3387 smtp_respond(smtp_code, codelen, FALSE, string_sprintf(
059ec3d9
PH
3388 testflag(sender_verified_failed, af_verify_pmfail)?
3389 "Postmaster verification failed while checking <%s>\n%s\n"
3390 "Several RFCs state that you are required to have a postmaster\n"
3391 "mailbox for each mail domain. This host does not accept mail\n"
3392 "from domains whose servers reject the postmaster address."
3393 :
3394 testflag(sender_verified_failed, af_verify_nsfail)?
3395 "Callback setup failed while verifying <%s>\n%s\n"
3396 "The initial connection, or a HELO or MAIL FROM:<> command was\n"
3397 "rejected. Refusing MAIL FROM:<> does not help fight spam, disregards\n"
3398 "RFC requirements, and stops you from receiving standard bounce\n"
3399 "messages. This host does not accept mail from domains whose servers\n"
3400 "refuse bounces."
3401 :
3402 "Verification failed for <%s>\n%s",
3403 sender_verified_failed->address,
3404 sender_verified_failed->user_message));
2679d413 3405
88752192 3406 fl.rcpt_in_progress = save_rcpt_in_progress;
059ec3d9
PH
3407 }
3408
3409/* Sort out text for logging */
3410
3cc3f762
JH
3411log_msg = log_msg ? string_sprintf(": %s", log_msg) : US"";
3412if ((lognl = Ustrchr(log_msg, '\n'))) *lognl = 0;
059ec3d9
PH
3413
3414/* Send permanent failure response to the command, but the code used isn't
3415always a 5xx one - see comments at the start of this function. If the original
3416rc was FAIL_DROP we drop the connection and yield 2. */
3417
ff5929e3
JH
3418if (rc == FAIL)
3419 smtp_respond(smtp_code, codelen, TRUE,
3420 user_msg ? user_msg : US"Administrative prohibition");
059ec3d9
PH
3421
3422/* Send temporary failure response to the command. Don't give any details,
3423unless acl_temp_details is set. This is TRUE for a callout defer, a "defer"
3424verb, and for a header verify when smtp_return_error_details is set.
3425
3426This conditional logic is all somewhat of a mess because of the odd
3427interactions between temp_details and return_error_details. One day it should
3428be re-implemented in a tidier fashion. */
3429
3430else
8768d548 3431 if (f.acl_temp_details && user_msg)
059ec3d9 3432 {
ff5929e3
JH
3433 if ( smtp_return_error_details
3434 && sender_verified_failed
3435 && sender_verified_failed->message
3436 )
a5bd321b 3437 smtp_respond(smtp_code, codelen, FALSE, sender_verified_failed->message);
ff5929e3 3438
a5bd321b 3439 smtp_respond(smtp_code, codelen, TRUE, user_msg);
059ec3d9
PH
3440 }
3441 else
a5bd321b
PH
3442 smtp_respond(smtp_code, codelen, TRUE,
3443 US"Temporary local problem - please try later");
059ec3d9 3444
6ea85e9a
PH
3445/* Log the incident to the logs that are specified by log_reject_target
3446(default main, reject). This can be empty to suppress logging of rejections. If
3447the connection is not forcibly to be dropped, return 0. Otherwise, log why it
3448is closing if required and return 2. */
059ec3d9 3449
6ea85e9a 3450if (log_reject_target != 0)
887291d2 3451 {
01603eec 3452#ifndef DISABLE_TLS
acec9514
JH
3453 gstring * g = s_tlslog(NULL);
3454 uschar * tls = string_from_gstring(g);
fc16abb4 3455 if (!tls) tls = US"";
e45a1c37 3456#else
fc16abb4 3457 uschar * tls = US"";
e45a1c37 3458#endif
3cc3f762
JH
3459 log_write(where == ACL_WHERE_CONNECT ? L_connection_reject : 0,
3460 log_reject_target, "%s%s%s %s%srejected %s%s",
fc16abb4
JH
3461 LOGGING(dnssec) && sender_host_dnssec ? US" DS" : US"",
3462 host_and_ident(TRUE),
3463 tls,
3464 sender_info,
3465 rc == FAIL ? US"" : US"temporarily ",
3466 what, log_msg);
887291d2 3467 }
059ec3d9
PH
3468
3469if (!drop) return 0;
3470
3471log_write(L_smtp_connection, LOG_MAIN, "%s closed by DROP in ACL",
3472 smtp_get_connection_info());
8f128379
PH
3473
3474/* Run the not-quit ACL, but without any custom messages. This should not be a
3475problem, because we get here only if some other ACL has issued "drop", and
3476in that case, *its* custom messages will have been used above. */
3477
3478smtp_notquit_exit(US"acl-drop", NULL, NULL);
059ec3d9
PH
3479return 2;
3480}
3481
3482
3483
3484
8f128379
PH
3485/*************************************************
3486* Handle SMTP exit when QUIT is not given *
3487*************************************************/
3488
3489/* This function provides a logging/statistics hook for when an SMTP connection
3490is dropped on the floor or the other end goes away. It's a global function
3491because it's called from receive.c as well as this module. As well as running
3492the NOTQUIT ACL, if there is one, this function also outputs a final SMTP
3493response, either with a custom message from the ACL, or using a default. There
3494is one case, however, when no message is output - after "drop". In that case,
3495the ACL that obeyed "drop" has already supplied the custom message, and NULL is
3496passed to this function.
3497
3498In case things go wrong while processing this function, causing an error that
4c04137d 3499may re-enter this function, there is a recursion check.
8f128379
PH
3500
3501Arguments:
3502 reason What $smtp_notquit_reason will be set to in the ACL;
3503 if NULL, the ACL is not run
3504 code The error code to return as part of the response
3505 defaultrespond The default message if there's no user_msg
3506
3507Returns: Nothing
3508*/
3509
3510void
3511smtp_notquit_exit(uschar *reason, uschar *code, uschar *defaultrespond, ...)
3512{
3513int rc;
3514uschar *user_msg = NULL;
3515uschar *log_msg = NULL;
3516
8c513105 3517/* Check for recursive call */
8f128379 3518
88752192 3519if (fl.smtp_exit_function_called)
8f128379
PH
3520 {
3521 log_write(0, LOG_PANIC, "smtp_notquit_exit() called more than once (%s)",
3522 reason);
3523 return;
3524 }
88752192 3525fl.smtp_exit_function_called = TRUE;
8f128379
PH
3526
3527/* Call the not-QUIT ACL, if there is one, unless no reason is given. */
3528
eea0defe 3529if (acl_smtp_notquit && reason)
8f128379
PH
3530 {
3531 smtp_notquit_reason = reason;
eea0defe
JB
3532 if ((rc = acl_check(ACL_WHERE_NOTQUIT, NULL, acl_smtp_notquit, &user_msg,
3533 &log_msg)) == ERROR)
8f128379
PH
3534 log_write(0, LOG_MAIN|LOG_PANIC, "ACL for not-QUIT returned ERROR: %s",
3535 log_msg);
3536 }
3537
58c09a7f
JH
3538/* If the connection was dropped, we certainly are no longer talking TLS */
3539tls_in.active.sock = -1;
3540
8f128379 3541/* Write an SMTP response if we are expected to give one. As the default
8c513105 3542responses are all internal, they should be reasonable size. */
8f128379 3543
eea0defe 3544if (code && defaultrespond)
8f128379 3545 {
eea0defe
JB
3546 if (user_msg)
3547 smtp_respond(code, 3, TRUE, user_msg);
3548 else
8f128379 3549 {
d12746bc 3550 gstring * g;
8f128379 3551 va_list ap;
d12746bc 3552
8f128379 3553 va_start(ap, defaultrespond);
f3ebb786 3554 g = string_vformat(NULL, SVFMT_EXTEND|SVFMT_REBUFFER, CS defaultrespond, ap);
8f128379 3555 va_end(ap);
d12746bc 3556 smtp_printf("%s %s\r\n", FALSE, code, string_from_gstring(g));
8f128379 3557 }
8f128379
PH
3558 mac_smtp_fflush();
3559 }
3560}
3561
3562
3563
3564
d7b47fd0
PH
3565/*************************************************
3566* Verify HELO argument *
3567*************************************************/
3568
3569/* This function is called if helo_verify_hosts or helo_try_verify_hosts is
3570matched. It is also called from ACL processing if verify = helo is used and
3571verification was not previously tried (i.e. helo_try_verify_hosts was not
3572matched). The result of its processing is to set helo_verified and
3573helo_verify_failed. These variables should both be FALSE for this function to
3574be called.
3575
3576Note that EHLO/HELO is legitimately allowed to quote an address literal. Allow
3577for IPv6 ::ffff: literals.
3578
3579Argument: none
3580Returns: TRUE if testing was completed;
3581 FALSE on a temporary failure
3582*/
3583
3584BOOL
3585smtp_verify_helo(void)
3586{
3587BOOL yield = TRUE;
3588
3589HDEBUG(D_receive) debug_printf("verifying EHLO/HELO argument \"%s\"\n",
3590 sender_helo_name);
3591
3592if (sender_helo_name == NULL)
3593 {
3594 HDEBUG(D_receive) debug_printf("no EHLO/HELO command was issued\n");
3595 }
3596
d1d5595c
PH
3597/* Deal with the case of -bs without an IP address */
3598
3599else if (sender_host_address == NULL)
3600 {
3601 HDEBUG(D_receive) debug_printf("no client IP address: assume success\n");
8768d548 3602 f.helo_verified = TRUE;
d1d5595c
PH
3603 }
3604
3605/* Deal with the more common case when there is a sending IP address */
3606
d7b47fd0
PH
3607else if (sender_helo_name[0] == '[')
3608 {
8768d548 3609 f.helo_verified = Ustrncmp(sender_helo_name+1, sender_host_address,
d7b47fd0
PH
3610 Ustrlen(sender_host_address)) == 0;
3611
e0574cb5 3612#if HAVE_IPV6
8768d548 3613 if (!f.helo_verified)
d7b47fd0
PH
3614 {
3615 if (strncmpic(sender_host_address, US"::ffff:", 7) == 0)
8768d548 3616 f.helo_verified = Ustrncmp(sender_helo_name + 1,
d7b47fd0
PH
3617 sender_host_address + 7, Ustrlen(sender_host_address) - 7) == 0;
3618 }
e0574cb5 3619#endif
d7b47fd0
PH
3620
3621 HDEBUG(D_receive)
8768d548 3622 { if (f.helo_verified) debug_printf("matched host address\n"); }
d7b47fd0
PH
3623 }
3624
3625/* Do a reverse lookup if one hasn't already given a positive or negative
3626response. If that fails, or the name doesn't match, try checking with a forward
3627lookup. */
3628
3629else
3630 {
3631 if (sender_host_name == NULL && !host_lookup_failed)
3632 yield = host_name_lookup() != DEFER;
3633
3634 /* If a host name is known, check it and all its aliases. */
3635
1705dd20 3636 if (sender_host_name)
8768d548 3637 if ((f.helo_verified = strcmpic(sender_host_name, sender_helo_name) == 0))
d7b47fd0 3638 {
1705dd20 3639 sender_helo_dnssec = sender_host_dnssec;
d7b47fd0
PH
3640 HDEBUG(D_receive) debug_printf("matched host name\n");
3641 }
3642 else
3643 {
3644 uschar **aliases = sender_host_aliases;
1705dd20 3645 while (*aliases)
8768d548 3646 if ((f.helo_verified = strcmpic(*aliases++, sender_helo_name) == 0))
1705dd20
JH
3647 {
3648 sender_helo_dnssec = sender_host_dnssec;
3649 break;
3650 }
3651
8768d548 3652 HDEBUG(D_receive) if (f.helo_verified)
d7b47fd0 3653 debug_printf("matched alias %s\n", *(--aliases));
d7b47fd0 3654 }
d7b47fd0
PH
3655
3656 /* Final attempt: try a forward lookup of the helo name */
3657
8768d548 3658 if (!f.helo_verified)
d7b47fd0
PH
3659 {
3660 int rc;
d7978c0f
JH
3661 host_item h =
3662 {.name = sender_helo_name, .address = NULL, .mx = MX_NONE, .next = NULL};
3663 dnssec_domains d =
3664 {.request = US"*", .require = US""};
1705dd20 3665
d7b47fd0
PH
3666 HDEBUG(D_receive) debug_printf("getting IP address for %s\n",
3667 sender_helo_name);
66387a73 3668 rc = host_find_bydns(&h, NULL, HOST_FIND_BY_A | HOST_FIND_BY_AAAA,
1705dd20 3669 NULL, NULL, NULL, &d, NULL, NULL);
d7b47fd0 3670 if (rc == HOST_FOUND || rc == HOST_FOUND_LOCAL)
d7978c0f 3671 for (host_item * hh = &h; hh; hh = hh->next)
d7b47fd0
PH
3672 if (Ustrcmp(hh->address, sender_host_address) == 0)
3673 {
8768d548 3674 f.helo_verified = TRUE;
1705dd20 3675 if (h.dnssec == DS_YES) sender_helo_dnssec = TRUE;
d7b47fd0 3676 HDEBUG(D_receive)
1705dd20
JH
3677 debug_printf("IP address for %s matches calling address\n"
3678 "Forward DNS security status: %sverified\n",
3679 sender_helo_name, sender_helo_dnssec ? "" : "un");
d7b47fd0
PH
3680 break;
3681 }
d7b47fd0
PH
3682 }
3683 }
3684
8768d548 3685if (!f.helo_verified) f.helo_verify_failed = TRUE; /* We've tried ... */
d7b47fd0
PH
3686return yield;
3687}
3688
3689
3690
3691
4e88a19f
PH
3692/*************************************************
3693* Send user response message *
3694*************************************************/
3695
3696/* This function is passed a default response code and a user message. It calls
3697smtp_message_code() to check and possibly modify the response code, and then
3698calls smtp_respond() to transmit the response. I put this into a function
3699just to avoid a lot of repetition.
3700
3701Arguments:
3702 code the response code
3703 user_msg the user message
3704
3705Returns: nothing
3706*/
3707
3708static void
3709smtp_user_msg(uschar *code, uschar *user_msg)
3710{
3711int len = 3;
4f6ae5c3 3712smtp_message_code(&code, &len, &user_msg, NULL, TRUE);
4e88a19f
PH
3713smtp_respond(code, len, TRUE, user_msg);
3714}
3715
3716
3717
b3ef41c9
JH
3718static int
3719smtp_in_auth(auth_instance *au, uschar ** s, uschar ** ss)
3720{
3721const uschar *set_id = NULL;
d7978c0f 3722int rc;
b3ef41c9
JH
3723
3724/* Run the checking code, passing the remainder of the command line as
3725data. Initials the $auth<n> variables as empty. Initialize $0 empty and set
3726it as the only set numerical variable. The authenticator may set $auth<n>
3727and also set other numeric variables. The $auth<n> variables are preferred
3728nowadays; the numerical variables remain for backwards compatibility.
3729
3730Afterwards, have a go at expanding the set_id string, even if
3731authentication failed - for bad passwords it can be useful to log the
3732userid. On success, require set_id to expand and exist, and put it in
3733authenticated_id. Save this in permanent store, as the working store gets
3734reset at HELO, RSET, etc. */
3735
d7978c0f 3736for (int i = 0; i < AUTH_VARS; i++) auth_vars[i] = NULL;
b3ef41c9
JH
3737expand_nmax = 0;
3738expand_nlength[0] = 0; /* $0 contains nothing */
3739
3740rc = (au->info->servercode)(au, smtp_cmd_data);
3741if (au->set_id) set_id = expand_string(au->set_id);
3742expand_nmax = -1; /* Reset numeric variables */
d7978c0f 3743for (int i = 0; i < AUTH_VARS; i++) auth_vars[i] = NULL; /* Reset $auth<n> */
b3ef41c9
JH
3744
3745/* The value of authenticated_id is stored in the spool file and printed in
3746log lines. It must not contain binary zeros or newline characters. In
3747normal use, it never will, but when playing around or testing, this error
3748can (did) happen. To guard against this, ensure that the id contains only
3749printing characters. */
3750
3751if (set_id) set_id = string_printing(set_id);
3752
3753/* For the non-OK cases, set up additional logging data if set_id
3754is not empty. */
3755
3756if (rc != OK)
3757 set_id = set_id && *set_id
3758 ? string_sprintf(" (set_id=%s)", set_id) : US"";
3759
3760/* Switch on the result */
3761
3762switch(rc)
3763 {
3764 case OK:
a3df1579
JH
3765 if (!au->set_id || set_id) /* Complete success */
3766 {
3767 if (set_id) authenticated_id = string_copy_perm(set_id, TRUE);
3768 sender_host_authenticated = au->name;
3769 sender_host_auth_pubname = au->public_name;
3770 authentication_failed = FALSE;
3771 authenticated_fail_id = NULL; /* Impossible to already be set? */
b3ef41c9 3772
a3df1579
JH
3773 received_protocol =
3774 (sender_host_address ? protocols : protocols_local)
3775 [pextend + pauthed + (tls_in.active.sock >= 0 ? pcrpted:0)];
3776 *s = *ss = US"235 Authentication succeeded";
3777 authenticated_by = au;
3778 break;
3779 }
b3ef41c9 3780
a3df1579
JH
3781 /* Authentication succeeded, but we failed to expand the set_id string.
3782 Treat this as a temporary error. */
b3ef41c9 3783
a3df1579
JH
3784 auth_defer_msg = expand_string_message;
3785 /* Fall through */
b3ef41c9
JH
3786
3787 case DEFER:
a3df1579
JH
3788 if (set_id) authenticated_fail_id = string_copy_perm(set_id, TRUE);
3789 *s = string_sprintf("435 Unable to authenticate at present%s",
3790 auth_defer_user_msg);
3791 *ss = string_sprintf("435 Unable to authenticate at present%s: %s",
3792 set_id, auth_defer_msg);
3793 break;
b3ef41c9
JH
3794
3795 case BAD64:
a3df1579
JH
3796 *s = *ss = US"501 Invalid base64 data";
3797 break;
b3ef41c9
JH
3798
3799 case CANCELLED:
a3df1579
JH
3800 *s = *ss = US"501 Authentication cancelled";
3801 break;
b3ef41c9
JH
3802
3803 case UNEXPECTED:
a3df1579
JH
3804 *s = *ss = US"553 Initial data not expected";
3805 break;
b3ef41c9
JH
3806
3807 case FAIL:
a3df1579
JH
3808 if (set_id) authenticated_fail_id = string_copy_perm(set_id, TRUE);
3809 *s = US"535 Incorrect authentication data";
3810 *ss = string_sprintf("535 Incorrect authentication data%s", set_id);
3811 break;
b3ef41c9
JH
3812
3813 default:
a3df1579
JH
3814 if (set_id) authenticated_fail_id = string_copy_perm(set_id, TRUE);
3815 *s = US"435 Internal error";
3816 *ss = string_sprintf("435 Internal error%s: return %d from authentication "
3817 "check", set_id, rc);
3818 break;
b3ef41c9
JH
3819 }
3820
3821return rc;
3822}
3823
3824
3825
2685d6e0
JH
3826
3827
3828static int
3829qualify_recipient(uschar ** recipient, uschar * smtp_cmd_data, uschar * tag)
3830{
3831int rd;
8768d548 3832if (f.allow_unqualified_recipient || strcmpic(*recipient, US"postmaster") == 0)
2685d6e0
JH
3833 {
3834 DEBUG(D_receive) debug_printf("unqualified address %s accepted\n",
3835 *recipient);
3836 rd = Ustrlen(recipient) + 1;
3837 *recipient = rewrite_address_qualify(*recipient, TRUE);
3838 return rd;
3839 }
925ac8e4 3840smtp_printf("501 %s: recipient address must contain a domain\r\n", FALSE,
2685d6e0
JH
3841 smtp_cmd_data);
3842log_write(L_smtp_syntax_error,
3843 LOG_MAIN|LOG_REJECT, "unqualified %s rejected: <%s> %s%s",
3844 tag, *recipient, host_and_ident(TRUE), host_lookup_msg);
3845return 0;
3846}
3847
3848
3849
3850
7e3ce68e
JH
3851static void
3852smtp_quit_handler(uschar ** user_msgp, uschar ** log_msgp)
3853{
3854HAD(SCH_QUIT);
3855incomplete_transaction_log(US"QUIT");
60d10ce7 3856if (acl_smtp_quit)
7e3ce68e
JH
3857 {
3858 int rc = acl_check(ACL_WHERE_QUIT, NULL, acl_smtp_quit, user_msgp, log_msgp);
3859 if (rc == ERROR)
3860 log_write(0, LOG_MAIN|LOG_PANIC, "ACL for QUIT returned ERROR: %s",
3861 *log_msgp);
3862 }
2aaa3cdd
JH
3863
3864#ifdef TCP_CORK
3865(void) setsockopt(fileno(smtp_out), IPPROTO_TCP, TCP_CORK, US &on, sizeof(on));
3866#endif
3867
7e3ce68e
JH
3868if (*user_msgp)
3869 smtp_respond(US"221", 3, TRUE, *user_msgp);
3870else
925ac8e4 3871 smtp_printf("221 %s closing connection\r\n", FALSE, smtp_active_hostname);
7e3ce68e 3872
01603eec 3873#ifndef DISABLE_TLS
74f1a423 3874tls_close(NULL, TLS_SHUTDOWN_NOWAIT);
7e3ce68e
JH
3875#endif
3876
3877log_write(L_smtp_connection, LOG_MAIN, "%s closed by QUIT",
3878 smtp_get_connection_info());
3879}
3880
3881
3882static void
3883smtp_rset_handler(void)
3884{
3885HAD(SCH_RSET);
3886incomplete_transaction_log(US"RSET");
925ac8e4 3887smtp_printf("250 Reset OK\r\n", FALSE);
7e3ce68e
JH
3888cmd_list[CMD_LIST_RSET].is_mail_cmd = FALSE;
3889}
3890
3891
3892
059ec3d9
PH
3893/*************************************************
3894* Initialize for SMTP incoming message *
3895*************************************************/
3896
3897/* This function conducts the initial dialogue at the start of an incoming SMTP
3898message, and builds a list of recipients. However, if the incoming message
3899is part of a batch (-bS option) a separate function is called since it would
3900be messy having tests splattered about all over this function. This function
3901therefore handles the case where interaction is occurring. The input and output
3902files are set up in smtp_in and smtp_out.
3903
3904The global recipients_list is set to point to a vector of recipient_item
3905blocks, whose number is given by recipients_count. This is extended by the
3906receive_add_recipient() function. The global variable sender_address is set to
3907the sender's address. The yield is +1 if a message has been successfully
3908started, 0 if a QUIT command was encountered or the connection was refused from
3909the particular host, or -1 if the connection was lost.
3910
3911Argument: none
3912
3913Returns: > 0 message successfully started (reached DATA)
3914 = 0 QUIT read or end of file reached or call refused
3915 < 0 lost connection
3916*/
3917
3918int
3919smtp_setup_msg(void)
3920{
3921int done = 0;
3922BOOL toomany = FALSE;
3923BOOL discarded = FALSE;
3924BOOL last_was_rej_mail = FALSE;
3925BOOL last_was_rcpt = FALSE;
f3ebb786 3926rmark reset_point = store_mark();
059ec3d9
PH
3927
3928DEBUG(D_receive) debug_printf("smtp_setup_msg entered\n");
3929
3930/* Reset for start of new message. We allow one RSET not to be counted as a
3931nonmail command, for those MTAs that insist on sending it between every
3932message. Ditto for EHLO/HELO and for STARTTLS, to allow for going in and out of
3933TLS between messages (an Exim client may do this if it has messages queued up
3934for the host). Note: we do NOT reset AUTH at this point. */
3935
f3ebb786 3936reset_point = smtp_reset(reset_point);
059ec3d9
PH
3937message_ended = END_NOTSTARTED;
3938
8768d548 3939chunking_state = f.chunking_offered ? CHUNKING_OFFERED : CHUNKING_NOT_OFFERED;
7e3ce68e 3940
059ec3d9
PH
3941cmd_list[CMD_LIST_RSET].is_mail_cmd = TRUE;
3942cmd_list[CMD_LIST_HELO].is_mail_cmd = TRUE;
3943cmd_list[CMD_LIST_EHLO].is_mail_cmd = TRUE;
01603eec 3944#ifndef DISABLE_TLS
059ec3d9
PH
3945cmd_list[CMD_LIST_STARTTLS].is_mail_cmd = TRUE;
3946#endif
3947
3948/* Set the local signal handler for SIGTERM - it tries to end off tidily */
3949
9723f966 3950had_command_sigterm = 0;
059ec3d9
PH
3951os_non_restarting_signal(SIGTERM, command_sigterm_handler);
3952
3953/* Batched SMTP is handled in a different function. */
3954
3955if (smtp_batched_input) return smtp_setup_batch_msg();
3956
3957/* Deal with SMTP commands. This loop is exited by setting done to a POSITIVE
3958value. The values are 2 larger than the required yield of the function. */
3959
3960while (done <= 0)
3961 {
55414b25 3962 const uschar **argv;
059ec3d9
PH
3963 uschar *etrn_command;
3964 uschar *etrn_serialize_key;
3965 uschar *errmess;
4e88a19f
PH
3966 uschar *log_msg, *smtp_code;
3967 uschar *user_msg = NULL;
059ec3d9
PH
3968 uschar *recipient = NULL;
3969 uschar *hello = NULL;
059ec3d9
PH
3970 uschar *s, *ss;
3971 BOOL was_rej_mail = FALSE;
3972 BOOL was_rcpt = FALSE;
3973 void (*oldsignal)(int);
3974 pid_t pid;
3975 int start, end, sender_domain, recipient_domain;
acec9514 3976 int rc;
aa7751be 3977 int c;
6c1c3d1d 3978 uschar *orcpt = NULL;
ea97267c 3979 int dsn_flags;
acec9514 3980 gstring * g;
059ec3d9 3981
16be7f11 3982#ifdef AUTH_TLS
b3ef41c9 3983 /* Check once per STARTTLS or SSL-on-connect for a TLS AUTH */
74f1a423 3984 if ( tls_in.active.sock >= 0
b3ef41c9
JH
3985 && tls_in.peercert
3986 && tls_in.certificate_verified
3987 && cmd_list[CMD_LIST_TLS_AUTH].is_mail_cmd
3988 )
3989 {
3990 cmd_list[CMD_LIST_TLS_AUTH].is_mail_cmd = FALSE;
b3ef41c9 3991
d7978c0f 3992 for (auth_instance * au = auths; au; au = au->next)
b3ef41c9
JH
3993 if (strcmpic(US"tls", au->driver_name) == 0)
3994 {
b64d13ee
JH
3995 if ( acl_smtp_auth
3996 && (rc = acl_check(ACL_WHERE_AUTH, NULL, acl_smtp_auth,
3997 &user_msg, &log_msg)) != OK
3998 )
3999 done = smtp_handle_acl_fail(ACL_WHERE_AUTH, rc, user_msg, log_msg);
805bb5c3 4000 else
b64d13ee
JH
4001 {
4002 smtp_cmd_data = NULL;
4003
4004 if (smtp_in_auth(au, &s, &ss) == OK)
4005 { DEBUG(D_auth) debug_printf("tls auth succeeded\n"); }
4006 else
4007 { DEBUG(D_auth) debug_printf("tls auth not succeeded\n"); }
4008 }
b3ef41c9
JH
4009 break;
4010 }
4011 }
4012#endif
4013
8d330698
JH
4014#ifdef TCP_QUICKACK
4015 if (smtp_in) /* Avoid pure-ACKs while in cmd pingpong phase */
4016 (void) setsockopt(fileno(smtp_in), IPPROTO_TCP, TCP_QUICKACK,
4017 US &off, sizeof(off));
4018#endif
4019
ee8b8090 4020 switch(smtp_read_command(
81344b40 4021#ifndef DISABLE_PIPE_CONNECT
ee8b8090
JH
4022 !fl.pipe_connect_acceptable,
4023#else
4024 TRUE,
4025#endif
4026 GETC_BUFFER_UNLIMITED))
059ec3d9
PH
4027 {
4028 /* The AUTH command is not permitted to occur inside a transaction, and may
c46782ef
PH
4029 occur successfully only once per connection. Actually, that isn't quite
4030 true. When TLS is started, all previous information about a connection must
4031 be discarded, so a new AUTH is permitted at that time.
4032
4033 AUTH may only be used when it has been advertised. However, it seems that
4034 there are clients that send AUTH when it hasn't been advertised, some of
4035 them even doing this after HELO. And there are MTAs that accept this. Sigh.
4036 So there's a get-out that allows this to happen.
059ec3d9
PH
4037
4038 AUTH is initially labelled as a "nonmail command" so that one occurrence
4039 doesn't get counted. We change the label here so that multiple failing
4040 AUTHS will eventually hit the nonmail threshold. */
4041
4042 case AUTH_CMD:
e0574cb5
JH
4043 HAD(SCH_AUTH);
4044 authentication_failed = TRUE;
4045 cmd_list[CMD_LIST_AUTH].is_mail_cmd = FALSE;
059ec3d9 4046
88752192 4047 if (!fl.auth_advertised && !f.allow_auth_unadvertised)
e0574cb5
JH
4048 {
4049 done = synprot_error(L_smtp_protocol_error, 503, NULL,
4050 US"AUTH command used when not advertised");
4051 break;
4052 }
4053 if (sender_host_authenticated)
4054 {
4055 done = synprot_error(L_smtp_protocol_error, 503, NULL,
4056 US"already authenticated");
4057 break;
4058 }
4059 if (sender_address)
4060 {
4061 done = synprot_error(L_smtp_protocol_error, 503, NULL,
4062 US"not permitted in mail transaction");
4063 break;
4064 }
059ec3d9 4065
e0574cb5 4066 /* Check the ACL */
059ec3d9 4067
e0574cb5
JH
4068 if ( acl_smtp_auth
4069 && (rc = acl_check(ACL_WHERE_AUTH, NULL, acl_smtp_auth,
4070 &user_msg, &log_msg)) != OK
4071 )
4072 {
4073 done = smtp_handle_acl_fail(ACL_WHERE_AUTH, rc, user_msg, log_msg);
4074 break;
4075 }
059ec3d9 4076
e0574cb5 4077 /* Find the name of the requested authentication mechanism. */
059ec3d9 4078
e0574cb5
JH
4079 s = smtp_cmd_data;
4080 while ((c = *smtp_cmd_data) != 0 && !isspace(c))
4081 {
4082 if (!isalnum(c) && c != '-' && c != '_')
4083 {
4084 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4085 US"invalid character in authentication mechanism name");
4086 goto COMMAND_LOOP;
4087 }
4088 smtp_cmd_data++;
4089 }
059ec3d9 4090
e0574cb5
JH
4091 /* If not at the end of the line, we must be at white space. Terminate the
4092 name and move the pointer on to any data that may be present. */
059ec3d9 4093
e0574cb5
JH
4094 if (*smtp_cmd_data != 0)
4095 {
4096 *smtp_cmd_data++ = 0;
4097 while (isspace(*smtp_cmd_data)) smtp_cmd_data++;
4098 }
059ec3d9 4099
e0574cb5
JH
4100 /* Search for an authentication mechanism which is configured for use
4101 as a server and which has been advertised (unless, sigh, allow_auth_
4102 unadvertised is set). */
059ec3d9 4103
e0574cb5 4104 {
d7978c0f
JH
4105 auth_instance * au;
4106 for (au = auths; au; au = au->next)
4107 if (strcmpic(s, au->public_name) == 0 && au->server &&
4108 (au->advertised || f.allow_auth_unadvertised))
4109 break;
4110
4111 if (au)
4112 {
4113 c = smtp_in_auth(au, &s, &ss);
059ec3d9 4114
d7978c0f
JH
4115 smtp_printf("%s\r\n", FALSE, s);
4116 if (c != OK)
4117 log_write(0, LOG_MAIN|LOG_REJECT, "%s authenticator failed for %s: %s",
4118 au->name, host_and_ident(FALSE), ss);
4119 }
4120 else
4121 done = synprot_error(L_smtp_protocol_error, 504, NULL,
4122 string_sprintf("%s authentication mechanism not supported", s));
e0574cb5 4123 }
059ec3d9 4124
e0574cb5 4125 break; /* AUTH_CMD */
059ec3d9
PH
4126
4127 /* The HELO/EHLO commands are permitted to appear in the middle of a
4128 session as well as at the beginning. They have the effect of a reset in
4129 addition to their other functions. Their absence at the start cannot be
4130 taken to be an error.
4131
4132 RFC 2821 says:
4133
4134 If the EHLO command is not acceptable to the SMTP server, 501, 500,
4135 or 502 failure replies MUST be returned as appropriate. The SMTP
4136 server MUST stay in the same state after transmitting these replies
4137 that it was in before the EHLO was received.
4138
4139 Therefore, we do not do the reset until after checking the command for
4140 acceptability. This change was made for Exim release 4.11. Previously
4141 it did the reset first. */
4142
4143 case HELO_CMD:
e0574cb5
JH
4144 HAD(SCH_HELO);
4145 hello = US"HELO";
88752192 4146 fl.esmtp = FALSE;
e0574cb5 4147 goto HELO_EHLO;
059ec3d9
PH
4148
4149 case EHLO_CMD:
e0574cb5
JH
4150 HAD(SCH_EHLO);
4151 hello = US"EHLO";
88752192 4152 fl.esmtp = TRUE;
059ec3d9
PH
4153
4154 HELO_EHLO: /* Common code for HELO and EHLO */
e0574cb5
JH
4155 cmd_list[CMD_LIST_HELO].is_mail_cmd = FALSE;
4156 cmd_list[CMD_LIST_EHLO].is_mail_cmd = FALSE;
059ec3d9 4157
e0574cb5
JH
4158 /* Reject the HELO if its argument was invalid or non-existent. A
4159 successful check causes the argument to be saved in malloc store. */
059ec3d9 4160
e0574cb5
JH
4161 if (!check_helo(smtp_cmd_data))
4162 {
4163 smtp_printf("501 Syntactically invalid %s argument(s)\r\n", FALSE, hello);
059ec3d9 4164
e0574cb5
JH
4165 log_write(0, LOG_MAIN|LOG_REJECT, "rejected %s from %s: syntactically "
4166 "invalid argument(s): %s", hello, host_and_ident(FALSE),
4167 *smtp_cmd_argument == 0 ? US"(no argument given)" :
4168 string_printing(smtp_cmd_argument));
059ec3d9 4169
e0574cb5
JH
4170 if (++synprot_error_count > smtp_max_synprot_errors)
4171 {
4172 log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
5990a265
JH
4173 "syntax or protocol errors (last command was \"%s\", %s)",
4174 host_and_ident(FALSE), string_printing(smtp_cmd_buffer),
4175 string_from_gstring(s_connhad_log(NULL))
4176 );
e0574cb5
JH
4177 done = 1;
4178 }
059ec3d9 4179
e0574cb5
JH
4180 break;
4181 }
059ec3d9 4182
e0574cb5
JH
4183 /* If sender_host_unknown is true, we have got here via the -bs interface,
4184 not called from inetd. Otherwise, we are running an IP connection and the
4185 host address will be set. If the helo name is the primary name of this
4186 host and we haven't done a reverse lookup, force one now. If helo_required
4187 is set, ensure that the HELO name matches the actual host. If helo_verify
4188 is set, do the same check, but softly. */
059ec3d9 4189
8768d548 4190 if (!f.sender_host_unknown)
e0574cb5 4191 {
8768d548 4192 BOOL old_helo_verified = f.helo_verified;
e0574cb5 4193 uschar *p = smtp_cmd_data;
059ec3d9 4194
e0574cb5
JH
4195 while (*p != 0 && !isspace(*p)) { *p = tolower(*p); p++; }
4196 *p = 0;
059ec3d9 4197
e0574cb5
JH
4198 /* Force a reverse lookup if HELO quoted something in helo_lookup_domains
4199 because otherwise the log can be confusing. */
059ec3d9 4200
e0574cb5 4201 if ( !sender_host_name
cde93db0
JH
4202 && match_isinlist(sender_helo_name, CUSS &helo_lookup_domains, 0,
4203 &domainlist_anchor, NULL, MCL_DOMAIN, TRUE, NULL) == OK)
e0574cb5 4204 (void)host_name_lookup();
059ec3d9 4205
e0574cb5
JH
4206 /* Rebuild the fullhost info to include the HELO name (and the real name
4207 if it was looked up.) */
059ec3d9 4208
e0574cb5
JH
4209 host_build_sender_fullhost(); /* Rebuild */
4210 set_process_info("handling%s incoming connection from %s",
4211 tls_in.active.sock >= 0 ? " TLS" : "", host_and_ident(FALSE));
059ec3d9 4212
e0574cb5
JH
4213 /* Verify if configured. This doesn't give much security, but it does
4214 make some people happy to be able to do it. If helo_required is set,
4215 (host matches helo_verify_hosts) failure forces rejection. If helo_verify
4216 is set (host matches helo_try_verify_hosts), it does not. This is perhaps
4217 now obsolescent, since the verification can now be requested selectively
4218 at ACL time. */
059ec3d9 4219
8768d548 4220 f.helo_verified = f.helo_verify_failed = sender_helo_dnssec = FALSE;
88752192 4221 if (fl.helo_required || fl.helo_verify)
e0574cb5
JH
4222 {
4223 BOOL tempfail = !smtp_verify_helo();
8768d548 4224 if (!f.helo_verified)
e0574cb5 4225 {
88752192 4226 if (fl.helo_required)
e0574cb5
JH
4227 {
4228 smtp_printf("%d %s argument does not match calling host\r\n", FALSE,
4229 tempfail? 451 : 550, hello);
4230 log_write(0, LOG_MAIN|LOG_REJECT, "%srejected \"%s %s\" from %s",
4231 tempfail? "temporarily " : "",
4232 hello, sender_helo_name, host_and_ident(FALSE));
8768d548 4233 f.helo_verified = old_helo_verified;
e0574cb5
JH
4234 break; /* End of HELO/EHLO processing */
4235 }
4236 HDEBUG(D_all) debug_printf("%s verification failed but host is in "
4237 "helo_try_verify_hosts\n", hello);
4238 }
4239 }
4240 }
059ec3d9 4241
7952eef9 4242#ifdef SUPPORT_SPF
e0574cb5 4243 /* set up SPF context */
73ec116f 4244 spf_conn_init(sender_helo_name, sender_host_address);
8523533c
TK
4245#endif
4246
e0574cb5
JH
4247 /* Apply an ACL check if one is defined; afterwards, recheck
4248 synchronization in case the client started sending in a delay. */
059ec3d9 4249
e0574cb5
JH
4250 if (acl_smtp_helo)
4251 if ((rc = acl_check(ACL_WHERE_HELO, NULL, acl_smtp_helo,
4252 &user_msg, &log_msg)) != OK)
a5c60e3c 4253 {
e0574cb5 4254 done = smtp_handle_acl_fail(ACL_WHERE_HELO, rc, user_msg, log_msg);
f3ebb786 4255 sender_helo_name = NULL;
e0574cb5
JH
4256 host_build_sender_fullhost(); /* Rebuild */
4257 break;
a5c60e3c 4258 }
81344b40 4259#ifndef DISABLE_PIPE_CONNECT
ee8b8090
JH
4260 else if (!fl.pipe_connect_acceptable && !check_sync())
4261#else
4262 else if (!check_sync())
4263#endif
4264 goto SYNC_FAILURE;
059ec3d9 4265
e0574cb5
JH
4266 /* Generate an OK reply. The default string includes the ident if present,
4267 and also the IP address if present. Reflecting back the ident is intended
4268 as a deterrent to mail forgers. For maximum efficiency, and also because
4269 some broken systems expect each response to be in a single packet, arrange
4270 that the entire reply is sent in one write(). */
059ec3d9 4271
88752192 4272 fl.auth_advertised = FALSE;
8768d548 4273 f.smtp_in_pipelining_advertised = FALSE;
01603eec 4274#ifndef DISABLE_TLS
88752192 4275 fl.tls_advertised = FALSE;
d1a13eea 4276#endif
88752192 4277 fl.dsn_advertised = FALSE;
8c5d388a 4278#ifdef SUPPORT_I18N
88752192 4279 fl.smtputf8_advertised = FALSE;
d1a13eea 4280#endif
059ec3d9 4281
e0574cb5
JH
4282 smtp_code = US"250 "; /* Default response code plus space*/
4283 if (!user_msg)
4284 {
f3ebb786
JH
4285 /* sender_host_name below will be tainted, so save on copy when we hit it */
4286 g = string_get_tainted(24, TRUE);
4287 g = string_fmt_append(g, "%.3s %s Hello %s%s%s",
e0574cb5
JH
4288 smtp_code,
4289 smtp_active_hostname,
4290 sender_ident ? sender_ident : US"",
4291 sender_ident ? US" at " : US"",
4292 sender_host_name ? sender_host_name : sender_helo_name);
e0574cb5
JH
4293
4294 if (sender_host_address)
52f12a7c 4295 g = string_fmt_append(g, " [%s]", sender_host_address);
e0574cb5 4296 }
4e88a19f 4297
e0574cb5
JH
4298 /* A user-supplied EHLO greeting may not contain more than one line. Note
4299 that the code returned by smtp_message_code() includes the terminating
4300 whitespace character. */
059ec3d9 4301
e0574cb5
JH
4302 else
4303 {
4304 char *ss;
4305 int codelen = 4;
4306 smtp_message_code(&smtp_code, &codelen, &user_msg, NULL, TRUE);
4307 s = string_sprintf("%.*s%s", codelen, smtp_code, user_msg);
4308 if ((ss = strpbrk(CS s, "\r\n")) != NULL)
4309 {
4310 log_write(0, LOG_MAIN|LOG_PANIC, "EHLO/HELO response must not contain "
4311 "newlines: message truncated: %s", string_printing(s));
4312 *ss = 0;
4313 }
4314 g = string_cat(NULL, s);
4315 }
059ec3d9 4316
e0574cb5 4317 g = string_catn(g, US"\r\n", 2);
059ec3d9 4318
e0574cb5
JH
4319 /* If we received EHLO, we must create a multiline response which includes
4320 the functions supported. */
059ec3d9 4321
88752192 4322 if (fl.esmtp)
e0574cb5
JH
4323 {
4324 g->s[3] = '-';
059ec3d9 4325
e0574cb5
JH
4326 /* I'm not entirely happy with this, as an MTA is supposed to check
4327 that it has enough room to accept a message of maximum size before
4328 it sends this. However, there seems little point in not sending it.
4329 The actual size check happens later at MAIL FROM time. By postponing it
4330 till then, VRFY and EXPN can be used after EHLO when space is short. */
059ec3d9 4331
e0574cb5 4332 if (thismessage_size_limit > 0)
52f12a7c 4333 g = string_fmt_append(g, "%.3s-SIZE %d\r\n", smtp_code,
e0574cb5 4334 thismessage_size_limit);
e0574cb5
JH
4335 else
4336 {
4337 g = string_catn(g, smtp_code, 3);
4338 g = string_catn(g, US"-SIZE\r\n", 7);
4339 }
059ec3d9 4340
e0574cb5
JH
4341 /* Exim does not do protocol conversion or data conversion. It is 8-bit
4342 clean; if it has an 8-bit character in its hand, it just sends it. It
4343 cannot therefore specify 8BITMIME and remain consistent with the RFCs.
4344 However, some users want this option simply in order to stop MUAs
4345 mangling messages that contain top-bit-set characters. It is therefore
4346 provided as an option. */
059ec3d9 4347
e0574cb5
JH
4348 if (accept_8bitmime)
4349 {
4350 g = string_catn(g, smtp_code, 3);
4351 g = string_catn(g, US"-8BITMIME\r\n", 11);
4352 }
059ec3d9 4353
e0574cb5
JH
4354 /* Advertise DSN support if configured to do so. */
4355 if (verify_check_host(&dsn_advertise_hosts) != FAIL)
4356 {
4357 g = string_catn(g, smtp_code, 3);
4358 g = string_catn(g, US"-DSN\r\n", 6);
88752192 4359 fl.dsn_advertised = TRUE;
e0574cb5 4360 }
6c1c3d1d 4361
e0574cb5
JH
4362 /* Advertise ETRN/VRFY/EXPN if there's are ACL checking whether a host is
4363 permitted to issue them; a check is made when any host actually tries. */
059ec3d9 4364
e0574cb5
JH
4365 if (acl_smtp_etrn)
4366 {
4367 g = string_catn(g, smtp_code, 3);
4368 g = string_catn(g, US"-ETRN\r\n", 7);
4369 }
4370 if (acl_smtp_vrfy)
4371 {
4372 g = string_catn(g, smtp_code, 3);
4373 g = string_catn(g, US"-VRFY\r\n", 7);
4374 }
4375 if (acl_smtp_expn)
4376 {
4377 g = string_catn(g, smtp_code, 3);
4378 g = string_catn(g, US"-EXPN\r\n", 7);
4379 }
059ec3d9 4380
e0574cb5
JH
4381 /* Exim is quite happy with pipelining, so let the other end know that
4382 it is safe to use it, unless advertising is disabled. */
059ec3d9 4383
ee8b8090
JH
4384 if ( f.pipelining_enable
4385 && verify_check_host(&pipelining_advertise_hosts) == OK)
e0574cb5
JH
4386 {
4387 g = string_catn(g, smtp_code, 3);
4388 g = string_catn(g, US"-PIPELINING\r\n", 13);
4389 sync_cmd_limit = NON_SYNC_CMD_PIPELINING;
8768d548 4390 f.smtp_in_pipelining_advertised = TRUE;
ee8b8090 4391
81344b40 4392#ifndef DISABLE_PIPE_CONNECT
ee8b8090
JH
4393 if (fl.pipe_connect_acceptable)
4394 {
4395 f.smtp_in_early_pipe_advertised = TRUE;
4396 g = string_catn(g, smtp_code, 3);
4397 g = string_catn(g, US"-" EARLY_PIPE_FEATURE_NAME "\r\n", EARLY_PIPE_FEATURE_LEN+3);
4398 }
4399#endif
e0574cb5 4400 }
059ec3d9 4401
fd98a5c6 4402
e0574cb5
JH
4403 /* If any server authentication mechanisms are configured, advertise
4404 them if the current host is in auth_advertise_hosts. The problem with
4405 advertising always is that some clients then require users to
4406 authenticate (and aren't configurable otherwise) even though it may not
4407 be necessary (e.g. if the host is in host_accept_relay).
059ec3d9 4408
e0574cb5
JH
4409 RFC 2222 states that SASL mechanism names contain only upper case
4410 letters, so output the names in upper case, though we actually recognize
4411 them in either case in the AUTH command. */
059ec3d9 4412
e0574cb5 4413 if ( auths
16be7f11 4414#ifdef AUTH_TLS
e0574cb5 4415 && !sender_host_authenticated
b3ef41c9 4416#endif
e0574cb5
JH
4417 && verify_check_host(&auth_advertise_hosts) == OK
4418 )
8b6b06fe 4419 {
e0574cb5 4420 BOOL first = TRUE;
d7978c0f 4421 for (auth_instance * au = auths; au; au = au->next)
b3ef41c9 4422 {
e0574cb5
JH
4423 au->advertised = FALSE;
4424 if (au->server)
b3ef41c9 4425 {
e0574cb5 4426 DEBUG(D_auth+D_expand) debug_printf_indent(
49d47806
JH
4427 "Evaluating advertise_condition for %s %s athenticator\n",
4428 au->name, au->public_name);
e0574cb5
JH
4429 if ( !au->advertise_condition
4430 || expand_check_condition(au->advertise_condition, au->name,
4431 US"authenticator")
4432 )
8b6b06fe 4433 {
e0574cb5
JH
4434 int saveptr;
4435 if (first)
4436 {
4437 g = string_catn(g, smtp_code, 3);
4438 g = string_catn(g, US"-AUTH", 5);
4439 first = FALSE;
88752192 4440 fl.auth_advertised = TRUE;
e0574cb5
JH
4441 }
4442 saveptr = g->ptr;
4443 g = string_catn(g, US" ", 1);
4444 g = string_cat (g, au->public_name);
4445 while (++saveptr < g->ptr) g->s[saveptr] = toupper(g->s[saveptr]);
4446 au->advertised = TRUE;
8b6b06fe 4447 }
b3ef41c9 4448 }
b3ef41c9 4449 }
b3ef41c9 4450
e0574cb5
JH
4451 if (!first) g = string_catn(g, US"\r\n", 2);
4452 }
059ec3d9 4453
e0574cb5 4454 /* RFC 3030 CHUNKING */
059ec3d9 4455
e0574cb5
JH
4456 if (verify_check_host(&chunking_advertise_hosts) != FAIL)
4457 {
4458 g = string_catn(g, smtp_code, 3);
4459 g = string_catn(g, US"-CHUNKING\r\n", 11);
8768d548 4460 f.chunking_offered = TRUE;
e0574cb5
JH
4461 chunking_state = CHUNKING_OFFERED;
4462 }
aa368db3 4463
e0574cb5
JH
4464 /* Advertise TLS (Transport Level Security) aka SSL (Secure Socket Layer)
4465 if it has been included in the binary, and the host matches
4466 tls_advertise_hosts. We must *not* advertise if we are already in a
4467 secure connection. */
18481de3 4468
01603eec 4469#ifndef DISABLE_TLS
e0574cb5
JH
4470 if (tls_in.active.sock < 0 &&
4471 verify_check_host(&tls_advertise_hosts) != FAIL)
4472 {
4473 g = string_catn(g, smtp_code, 3);
4474 g = string_catn(g, US"-STARTTLS\r\n", 11);
88752192 4475 fl.tls_advertised = TRUE;
e0574cb5 4476 }
d1a13eea 4477#endif
059ec3d9 4478
d1a13eea 4479#ifndef DISABLE_PRDR
e0574cb5
JH
4480 /* Per Recipient Data Response, draft by Eric A. Hall extending RFC */
4481 if (prdr_enable)
4482 {
4483 g = string_catn(g, smtp_code, 3);
4484 g = string_catn(g, US"-PRDR\r\n", 7);
4485 }
d1a13eea
JH
4486#endif
4487
8c5d388a 4488#ifdef SUPPORT_I18N
e0574cb5
JH
4489 if ( accept_8bitmime
4490 && verify_check_host(&smtputf8_advertise_hosts) != FAIL)
4491 {
4492 g = string_catn(g, smtp_code, 3);
4493 g = string_catn(g, US"-SMTPUTF8\r\n", 11);
88752192 4494 fl.smtputf8_advertised = TRUE;
e0574cb5 4495 }
d1a13eea 4496#endif
fd98a5c6 4497
e0574cb5 4498 /* Finish off the multiline reply with one that is always available. */
059ec3d9 4499
e0574cb5
JH
4500 g = string_catn(g, smtp_code, 3);
4501 g = string_catn(g, US" HELP\r\n", 7);
4502 }
059ec3d9 4503
e0574cb5
JH
4504 /* Terminate the string (for debug), write it, and note that HELO/EHLO
4505 has been seen. */
059ec3d9 4506
01603eec 4507#ifndef DISABLE_TLS
ee8b8090
JH
4508 if (tls_in.active.sock >= 0)
4509 (void)tls_write(NULL, g->s, g->ptr,
81344b40 4510# ifndef DISABLE_PIPE_CONNECT
ee8b8090
JH
4511 fl.pipe_connect_acceptable && pipeline_connect_sends());
4512# else
4513 FALSE);
4514# endif
4515 else
d1a13eea 4516#endif
059ec3d9 4517
e0574cb5
JH
4518 {
4519 int i = fwrite(g->s, 1, g->ptr, smtp_out); i = i; /* compiler quietening */
4520 }
4521 DEBUG(D_receive)
4522 {
4523 uschar *cr;
acec9514 4524
e0574cb5
JH
4525 (void) string_from_gstring(g);
4526 while ((cr = Ustrchr(g->s, '\r')) != NULL) /* lose CRs */
4527 memmove(cr, cr + 1, (g->ptr--) - (cr - g->s));
4528 debug_printf("SMTP>> %s", g->s);
4529 }
88752192 4530 fl.helo_seen = TRUE;
4e88a19f 4531
e0574cb5
JH
4532 /* Reset the protocol and the state, abandoning any previous message. */
4533 received_protocol =
4534 (sender_host_address ? protocols : protocols_local)
88752192 4535 [ (fl.esmtp
e0574cb5
JH
4536 ? pextend + (sender_host_authenticated ? pauthed : 0)
4537 : pnormal)
4538 + (tls_in.active.sock >= 0 ? pcrpted : 0)
4539 ];
4540 cancel_cutthrough_connection(TRUE, US"sent EHLO response");
f3ebb786 4541 reset_point = smtp_reset(reset_point);
e0574cb5
JH
4542 toomany = FALSE;
4543 break; /* HELO/EHLO */
059ec3d9
PH
4544
4545
4546 /* The MAIL command requires an address as an operand. All we do
4547 here is to parse it for syntactic correctness. The form "<>" is
4548 a special case which converts into an empty string. The start/end
4549 pointers in the original are not used further for this address, as
4550 it is the canonical extracted address which is all that is kept. */
4551
4552 case MAIL_CMD:
e0574cb5
JH
4553 HAD(SCH_MAIL);
4554 smtp_mailcmd_count++; /* Count for limit and ratelimit */
4555 was_rej_mail = TRUE; /* Reset if accepted */
4556 env_mail_type_t * mail_args; /* Sanity check & validate args */
059ec3d9 4557
88752192 4558 if (fl.helo_required && !fl.helo_seen)
e0574cb5
JH
4559 {
4560 smtp_printf("503 HELO or EHLO required\r\n", FALSE);
4561 log_write(0, LOG_MAIN|LOG_REJECT, "rejected MAIL from %s: no "
4562 "HELO/EHLO given", host_and_ident(FALSE));
4563 break;
4564 }
059ec3d9 4565
e0574cb5
JH
4566 if (sender_address)
4567 {
4568 done = synprot_error(L_smtp_protocol_error, 503, NULL,
4569 US"sender already given");
4570 break;
4571 }
059ec3d9 4572
e0574cb5
JH
4573 if (!*smtp_cmd_data)
4574 {
4575 done = synprot_error(L_smtp_protocol_error, 501, NULL,
4576 US"MAIL must have an address operand");
4577 break;
4578 }
059ec3d9 4579
e0574cb5
JH
4580 /* Check to see if the limit for messages per connection would be
4581 exceeded by accepting further messages. */
059ec3d9 4582
e0574cb5
JH
4583 if (smtp_accept_max_per_connection > 0 &&
4584 smtp_mailcmd_count > smtp_accept_max_per_connection)
4585 {
4586 smtp_printf("421 too many messages in this connection\r\n", FALSE);
4587 log_write(0, LOG_MAIN|LOG_REJECT, "rejected MAIL command %s: too many "
4588 "messages in one connection", host_and_ident(TRUE));
4589 break;
4590 }
059ec3d9 4591
e0574cb5
JH
4592 /* Reset for start of message - even if this is going to fail, we
4593 obviously need to throw away any previous data. */
059ec3d9 4594
e0574cb5 4595 cancel_cutthrough_connection(TRUE, US"MAIL received");
f3ebb786 4596 reset_point = smtp_reset(reset_point);
e0574cb5
JH
4597 toomany = FALSE;
4598 sender_data = recipient_data = NULL;
059ec3d9 4599
e0574cb5 4600 /* Loop, checking for ESMTP additions to the MAIL FROM command. */
059ec3d9 4601
88752192 4602 if (fl.esmtp) for(;;)
e0574cb5
JH
4603 {
4604 uschar *name, *value, *end;
4605 unsigned long int size;
4606 BOOL arg_error = FALSE;
059ec3d9 4607
e0574cb5 4608 if (!extract_option(&name, &value)) break;
059ec3d9 4609
e0574cb5
JH
4610 for (mail_args = env_mail_type_list;
4611 mail_args->value != ENV_MAIL_OPT_NULL;
4612 mail_args++
4613 )
4614 if (strcmpic(name, mail_args->name) == 0)
4615 break;
4616 if (mail_args->need_value && strcmpic(value, US"") == 0)
4617 break;
059ec3d9 4618
e0574cb5
JH
4619 switch(mail_args->value)
4620 {
4621 /* Handle SIZE= by reading the value. We don't do the check till later,
4622 in order to be able to log the sender address on failure. */
4623 case ENV_MAIL_OPT_SIZE:
4624 if (((size = Ustrtoul(value, &end, 10)), *end == 0))
9d4319df 4625 {
e0574cb5
JH
4626 if ((size == ULONG_MAX && errno == ERANGE) || size > INT_MAX)
4627 size = INT_MAX;
4628 message_size = (int)size;
4629 }
4630 else
4631 arg_error = TRUE;
4632 break;
4633
4634 /* If this session was initiated with EHLO and accept_8bitmime is set,
4635 Exim will have indicated that it supports the BODY=8BITMIME option. In
4636 fact, it does not support this according to the RFCs, in that it does not
4637 take any special action for forwarding messages containing 8-bit
4638 characters. That is why accept_8bitmime is not the default setting, but
4639 some sites want the action that is provided. We recognize both "8BITMIME"
4640 and "7BIT" as body types, but take no action. */
4641 case ENV_MAIL_OPT_BODY:
4642 if (accept_8bitmime) {
4643 if (strcmpic(value, US"8BITMIME") == 0)
4644 body_8bitmime = 8;
4645 else if (strcmpic(value, US"7BIT") == 0)
4646 body_8bitmime = 7;
4647 else
4648 {
4649 body_8bitmime = 0;
4650 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4651 US"invalid data for BODY");
4652 goto COMMAND_LOOP;
4653 }
4654 DEBUG(D_receive) debug_printf("8BITMIME: %d\n", body_8bitmime);
4655 break;
4656 }
4657 arg_error = TRUE;
3c0a92dc 4658 break;
059ec3d9 4659
e0574cb5
JH
4660 /* Handle the two DSN options, but only if configured to do so (which
4661 will have caused "DSN" to be given in the EHLO response). The code itself
4662 is included only if configured in at build time. */
6c1c3d1d 4663
e0574cb5 4664 case ENV_MAIL_OPT_RET:
88752192 4665 if (fl.dsn_advertised)
9d4319df 4666 {
e0574cb5
JH
4667 /* Check if RET has already been set */
4668 if (dsn_ret > 0)
4669 {
4670 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4671 US"RET can be specified once only");
4672 goto COMMAND_LOOP;
4673 }
4674 dsn_ret = strcmpic(value, US"HDRS") == 0
4675 ? dsn_ret_hdrs
4676 : strcmpic(value, US"FULL") == 0
4677 ? dsn_ret_full
4678 : 0;
4679 DEBUG(D_receive) debug_printf("DSN_RET: %d\n", dsn_ret);
4680 /* Check for invalid invalid value, and exit with error */
4681 if (dsn_ret == 0)
4682 {
4683 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4684 US"Value for RET is invalid");
4685 goto COMMAND_LOOP;
4686 }
9d4319df 4687 }
e0574cb5
JH
4688 break;
4689 case ENV_MAIL_OPT_ENVID:
88752192 4690 if (fl.dsn_advertised)
9d4319df 4691 {
e0574cb5
JH
4692 /* Check if the dsn envid has been already set */
4693 if (dsn_envid)
4694 {
4695 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4696 US"ENVID can be specified once only");
4697 goto COMMAND_LOOP;
4698 }
4699 dsn_envid = string_copy(value);
4700 DEBUG(D_receive) debug_printf("DSN_ENVID: %s\n", dsn_envid);
9d4319df 4701 }
e0574cb5 4702 break;
059ec3d9 4703
e0574cb5
JH
4704 /* Handle the AUTH extension. If the value given is not "<>" and either
4705 the ACL says "yes" or there is no ACL but the sending host is
4706 authenticated, we set it up as the authenticated sender. However, if the
4707 authenticator set a condition to be tested, we ignore AUTH on MAIL unless
4708 the condition is met. The value of AUTH is an xtext, which means that +,
4709 = and cntrl chars are coded in hex; however "<>" is unaffected by this
4710 coding. */
4711 case ENV_MAIL_OPT_AUTH:
4712 if (Ustrcmp(value, "<>") != 0)
4713 {
4714 int rc;
4715 uschar *ignore_msg;
94431adb 4716
e0574cb5
JH
4717 if (auth_xtextdecode(value, &authenticated_sender) < 0)
4718 {
4719 /* Put back terminator overrides for error message */
9d4319df
JH
4720 value[-1] = '=';
4721 name[-1] = ' ';
e0574cb5
JH
4722 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4723 US"invalid data for AUTH");
9d4319df 4724 goto COMMAND_LOOP;
e0574cb5
JH
4725 }
4726 if (!acl_smtp_mailauth)
4727 {
4728 ignore_msg = US"client not authenticated";
4729 rc = sender_host_authenticated ? OK : FAIL;
4730 }
4731 else
4732 {
4733 ignore_msg = US"rejected by ACL";
4734 rc = acl_check(ACL_WHERE_MAILAUTH, NULL, acl_smtp_mailauth,
4735 &user_msg, &log_msg);
4736 }
4737
4738 switch (rc)
4739 {
4740 case OK:
4741 if (authenticated_by == NULL ||
4742 authenticated_by->mail_auth_condition == NULL ||
4743 expand_check_condition(authenticated_by->mail_auth_condition,
4744 authenticated_by->name, US"authenticator"))
4745 break; /* Accept the AUTH */
4746
4747 ignore_msg = US"server_mail_auth_condition failed";
4748 if (authenticated_id != NULL)
4749 ignore_msg = string_sprintf("%s: authenticated ID=\"%s\"",
4750 ignore_msg, authenticated_id);
4751
4752 /* Fall through */
4753
4754 case FAIL:
4755 authenticated_sender = NULL;
4756 log_write(0, LOG_MAIN, "ignoring AUTH=%s from %s (%s)",
4757 value, host_and_ident(TRUE), ignore_msg);
4758 break;
4759
4760 /* Should only get DEFER or ERROR here. Put back terminator
4761 overrides for error message */
4762
4763 default:
4764 value[-1] = '=';
4765 name[-1] = ' ';
4766 (void)smtp_handle_acl_fail(ACL_WHERE_MAILAUTH, rc, user_msg,
4767 log_msg);
4768 goto COMMAND_LOOP;
4769 }
4770 }
4771 break;
fd98a5c6 4772
8ccd00b1 4773#ifndef DISABLE_PRDR
e0574cb5
JH
4774 case ENV_MAIL_OPT_PRDR:
4775 if (prdr_enable)
4776 prdr_requested = TRUE;
4777 break;
fd98a5c6
JH
4778#endif
4779
8c5d388a 4780#ifdef SUPPORT_I18N
e0574cb5 4781 case ENV_MAIL_OPT_UTF8:
88752192 4782 if (!fl.smtputf8_advertised)
e0574cb5
JH
4783 {
4784 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4785 US"SMTPUTF8 used when not advertised");
4786 goto COMMAND_LOOP;
4787 }
8c34c611 4788
e0574cb5
JH
4789 DEBUG(D_receive) debug_printf("smtputf8 requested\n");
4790 message_smtputf8 = allow_utf8_domains = TRUE;
4791 if (Ustrncmp(received_protocol, US"utf8", 4) != 0)
4792 {
4793 int old_pool = store_pool;
4794 store_pool = POOL_PERM;
4795 received_protocol = string_sprintf("utf8%s", received_protocol);
4796 store_pool = old_pool;
4797 }
4798 break;
d1a13eea 4799#endif
8ac90765 4800
e0574cb5
JH
4801 /* No valid option. Stick back the terminator characters and break
4802 the loop. Do the name-terminator second as extract_option sets
4803 value==name when it found no equal-sign.
4804 An error for a malformed address will occur. */
4805 case ENV_MAIL_OPT_NULL:
4806 value[-1] = '=';
4807 name[-1] = ' ';
4808 arg_error = TRUE;
4809 break;
2ef7ed08 4810
e0574cb5
JH
4811 default: assert(0);
4812 }
4813 /* Break out of for loop if switch() had bad argument or
4814 when start of the email address is reached */
4815 if (arg_error) break;
4816 }
059ec3d9 4817
e0574cb5
JH
4818 /* If we have passed the threshold for rate limiting, apply the current
4819 delay, and update it for next time, provided this is a limited host. */
059ec3d9 4820
e0574cb5
JH
4821 if (smtp_mailcmd_count > smtp_rlm_threshold &&
4822 verify_check_host(&smtp_ratelimit_hosts) == OK)
4823 {
4824 DEBUG(D_receive) debug_printf("rate limit MAIL: delay %.3g sec\n",
4825 smtp_delay_mail/1000.0);
4826 millisleep((int)smtp_delay_mail);
4827 smtp_delay_mail *= smtp_rlm_factor;
4828 if (smtp_delay_mail > (double)smtp_rlm_limit)
4829 smtp_delay_mail = (double)smtp_rlm_limit;
4830 }
059ec3d9 4831
e0574cb5
JH
4832 /* Now extract the address, first applying any SMTP-time rewriting. The
4833 TRUE flag allows "<>" as a sender address. */
059ec3d9 4834
e0574cb5
JH
4835 raw_sender = rewrite_existflags & rewrite_smtp
4836 ? rewrite_one(smtp_cmd_data, rewrite_smtp, NULL, FALSE, US"",
4837 global_rewrite_rules)
4838 : smtp_cmd_data;
059ec3d9 4839
e0574cb5
JH
4840 raw_sender =
4841 parse_extract_address(raw_sender, &errmess, &start, &end, &sender_domain,
4842 TRUE);
059ec3d9 4843
e0574cb5
JH
4844 if (!raw_sender)
4845 {
4846 done = synprot_error(L_smtp_syntax_error, 501, smtp_cmd_data, errmess);
4847 break;
4848 }
059ec3d9 4849
e0574cb5 4850 sender_address = raw_sender;
059ec3d9 4851
e0574cb5
JH
4852 /* If there is a configured size limit for mail, check that this message
4853 doesn't exceed it. The check is postponed to this point so that the sender
4854 can be logged. */
059ec3d9 4855
e0574cb5
JH
4856 if (thismessage_size_limit > 0 && message_size > thismessage_size_limit)
4857 {
4858 smtp_printf("552 Message size exceeds maximum permitted\r\n", FALSE);
4859 log_write(L_size_reject,
4860 LOG_MAIN|LOG_REJECT, "rejected MAIL FROM:<%s> %s: "
4861 "message too big: size%s=%d max=%d",
4862 sender_address,
4863 host_and_ident(TRUE),
4864 (message_size == INT_MAX)? ">" : "",
4865 message_size,
4866 thismessage_size_limit);
4867 sender_address = NULL;
4868 break;
4869 }
059ec3d9 4870
e0574cb5
JH
4871 /* Check there is enough space on the disk unless configured not to.
4872 When smtp_check_spool_space is set, the check is for thismessage_size_limit
4873 plus the current message - i.e. we accept the message only if it won't
4874 reduce the space below the threshold. Add 5000 to the size to allow for
4875 overheads such as the Received: line and storing of recipients, etc.
4876 By putting the check here, even when SIZE is not given, it allow VRFY
4877 and EXPN etc. to be used when space is short. */
4878
4879 if (!receive_check_fs(
dd6711f0
EL
4880 smtp_check_spool_space && message_size >= 0
4881 ? message_size + 5000 : 0))
e0574cb5
JH
4882 {
4883 smtp_printf("452 Space shortage, please try later\r\n", FALSE);
4884 sender_address = NULL;
4885 break;
4886 }
059ec3d9 4887
e0574cb5
JH
4888 /* If sender_address is unqualified, reject it, unless this is a locally
4889 generated message, or the sending host or net is permitted to send
4890 unqualified addresses - typically local machines behaving as MUAs -
4891 in which case just qualify the address. The flag is set above at the start
4892 of the SMTP connection. */
059ec3d9 4893
e0574cb5 4894 if (!sender_domain && *sender_address)
8768d548 4895 if (f.allow_unqualified_sender)
e0574cb5
JH
4896 {
4897 sender_domain = Ustrlen(sender_address) + 1;
4898 sender_address = rewrite_address_qualify(sender_address, FALSE);
4899 DEBUG(D_receive) debug_printf("unqualified address %s accepted\n",
4900 raw_sender);
4901 }
4902 else
4903 {
4904 smtp_printf("501 %s: sender address must contain a domain\r\n", FALSE,
4905 smtp_cmd_data);
4906 log_write(L_smtp_syntax_error,
4907 LOG_MAIN|LOG_REJECT,
4908 "unqualified sender rejected: <%s> %s%s",
4909 raw_sender,
4910 host_and_ident(TRUE),
4911 host_lookup_msg);
4912 sender_address = NULL;
4913 break;
4914 }
059ec3d9 4915
e0574cb5
JH
4916 /* Apply an ACL check if one is defined, before responding. Afterwards,
4917 when pipelining is not advertised, do another sync check in case the ACL
4918 delayed and the client started sending in the meantime. */
059ec3d9 4919
e0574cb5
JH
4920 if (acl_smtp_mail)
4921 {
4922 rc = acl_check(ACL_WHERE_MAIL, NULL, acl_smtp_mail, &user_msg, &log_msg);
8768d548 4923 if (rc == OK && !f.smtp_in_pipelining_advertised && !check_sync())
e0574cb5
JH
4924 goto SYNC_FAILURE;
4925 }
4926 else
4927 rc = OK;
925ac8e4 4928
e0574cb5
JH
4929 if (rc == OK || rc == DISCARD)
4930 {
4931 BOOL more = pipeline_response();
4932
4933 if (!user_msg)
4934 smtp_printf("%s%s%s", more, US"250 OK",
4935 #ifndef DISABLE_PRDR
4936 prdr_requested ? US", PRDR Requested" : US"",
4937 #else
4938 US"",
4939 #endif
4940 US"\r\n");
4941 else
4942 {
4943 #ifndef DISABLE_PRDR
4944 if (prdr_requested)
4945 user_msg = string_sprintf("%s%s", user_msg, US", PRDR Requested");
4946 #endif
4947 smtp_user_msg(US"250", user_msg);
4948 }
4949 smtp_delay_rcpt = smtp_rlr_base;
8768d548 4950 f.recipients_discarded = (rc == DISCARD);
e0574cb5
JH
4951 was_rej_mail = FALSE;
4952 }
94431adb 4953 else
e0574cb5
JH
4954 {
4955 done = smtp_handle_acl_fail(ACL_WHERE_MAIL, rc, user_msg, log_msg);
4956 sender_address = NULL;
4957 }
4958 break;
059ec3d9
PH
4959
4960
2679d413
PH
4961 /* The RCPT command requires an address as an operand. There may be any
4962 number of RCPT commands, specifying multiple recipients. We build them all
4963 into a data structure. The start/end values given by parse_extract_address
4964 are not used, as we keep only the extracted address. */
059ec3d9
PH
4965
4966 case RCPT_CMD:
e0574cb5
JH
4967 HAD(SCH_RCPT);
4968 rcpt_count++;
88752192 4969 was_rcpt = fl.rcpt_in_progress = TRUE;
059ec3d9 4970
e0574cb5
JH
4971 /* There must be a sender address; if the sender was rejected and
4972 pipelining was advertised, we assume the client was pipelining, and do not
4973 count this as a protocol error. Reset was_rej_mail so that further RCPTs
4974 get the same treatment. */
059ec3d9 4975
e0574cb5
JH
4976 if (sender_address == NULL)
4977 {
8768d548 4978 if (f.smtp_in_pipelining_advertised && last_was_rej_mail)
e0574cb5
JH
4979 {
4980 smtp_printf("503 sender not yet given\r\n", FALSE);
4981 was_rej_mail = TRUE;
4982 }
4983 else
4984 {
4985 done = synprot_error(L_smtp_protocol_error, 503, NULL,
4986 US"sender not yet given");
4987 was_rcpt = FALSE; /* Not a valid RCPT */
4988 }
4989 rcpt_fail_count++;
4990 break;
4991 }
059ec3d9 4992
e0574cb5 4993 /* Check for an operand */
059ec3d9 4994
e0574cb5
JH
4995 if (smtp_cmd_data[0] == 0)
4996 {
4997 done = synprot_error(L_smtp_syntax_error, 501, NULL,
4998 US"RCPT must have an address operand");
4999 rcpt_fail_count++;
5000 break;
5001 }
50dc7409 5002
e0574cb5
JH
5003 /* Set the DSN flags orcpt and dsn_flags from the session*/
5004 orcpt = NULL;
ea97267c 5005 dsn_flags = 0;
6c1c3d1d 5006
88752192 5007 if (fl.esmtp) for(;;)
e0574cb5
JH
5008 {
5009 uschar *name, *value;
6c1c3d1d 5010
e0574cb5
JH
5011 if (!extract_option(&name, &value))
5012 break;
6c1c3d1d 5013
88752192 5014 if (fl.dsn_advertised && strcmpic(name, US"ORCPT") == 0)
45500060 5015 {
e0574cb5
JH
5016 /* Check whether orcpt has been already set */
5017 if (orcpt)
5018 {
5019 done = synprot_error(L_smtp_syntax_error, 501, NULL,
5020 US"ORCPT can be specified once only");
5021 goto COMMAND_LOOP;
5022 }
5023 orcpt = string_copy(value);
5024 DEBUG(D_receive) debug_printf("DSN orcpt: %s\n", orcpt);
5025 }
6c1c3d1d 5026
88752192 5027 else if (fl.dsn_advertised && strcmpic(name, US"NOTIFY") == 0)
45500060 5028 {
e0574cb5 5029 /* Check if the notify flags have been already set */
ea97267c 5030 if (dsn_flags > 0)
e0574cb5
JH
5031 {
5032 done = synprot_error(L_smtp_syntax_error, 501, NULL,
5033 US"NOTIFY can be specified once only");
5034 goto COMMAND_LOOP;
5035 }
5036 if (strcmpic(value, US"NEVER") == 0)
ea97267c 5037 dsn_flags |= rf_notify_never;
e0574cb5
JH
5038 else
5039 {
5040 uschar *p = value;
5041 while (*p != 0)
45500060 5042 {
e0574cb5
JH
5043 uschar *pp = p;
5044 while (*pp != 0 && *pp != ',') pp++;
5045 if (*pp == ',') *pp++ = 0;
5046 if (strcmpic(p, US"SUCCESS") == 0)
5047 {
5048 DEBUG(D_receive) debug_printf("DSN: Setting notify success\n");
ea97267c 5049 dsn_flags |= rf_notify_success;
e0574cb5
JH
5050 }
5051 else if (strcmpic(p, US"FAILURE") == 0)
5052 {
5053 DEBUG(D_receive) debug_printf("DSN: Setting notify failure\n");
ea97267c 5054 dsn_flags |= rf_notify_failure;
e0574cb5
JH
5055 }
5056 else if (strcmpic(p, US"DELAY") == 0)
5057 {
5058 DEBUG(D_receive) debug_printf("DSN: Setting notify delay\n");
ea97267c 5059 dsn_flags |= rf_notify_delay;
e0574cb5
JH
5060 }
5061 else
5062 {
5063 /* Catch any strange values */
5064 done = synprot_error(L_smtp_syntax_error, 501, NULL,
5065 US"Invalid value for NOTIFY parameter");
5066 goto COMMAND_LOOP;
5067 }
5068 p = pp;
5069 }
ea97267c 5070 DEBUG(D_receive) debug_printf("DSN Flags: %x\n", dsn_flags);
e0574cb5
JH
5071 }
5072 }
6c1c3d1d 5073
e0574cb5
JH
5074 /* Unknown option. Stick back the terminator characters and break
5075 the loop. An error for a malformed address will occur. */
6c1c3d1d 5076
e0574cb5
JH
5077 else
5078 {
5079 DEBUG(D_receive) debug_printf("Invalid RCPT option: %s : %s\n", name, value);
5080 name[-1] = ' ';
5081 value[-1] = '=';
5082 break;
5083 }
5084 }
059ec3d9 5085
e0574cb5
JH
5086 /* Apply SMTP rewriting then extract the working address. Don't allow "<>"
5087 as a recipient address */
059ec3d9 5088
e0574cb5
JH
5089 recipient = rewrite_existflags & rewrite_smtp
5090 ? rewrite_one(smtp_cmd_data, rewrite_smtp, NULL, FALSE, US"",
5091 global_rewrite_rules)
5092 : smtp_cmd_data;
059ec3d9 5093
e0574cb5
JH
5094 if (!(recipient = parse_extract_address(recipient, &errmess, &start, &end,
5095 &recipient_domain, FALSE)))
5096 {
5097 done = synprot_error(L_smtp_syntax_error, 501, smtp_cmd_data, errmess);
5098 rcpt_fail_count++;
5099 break;
5100 }
059ec3d9 5101
e0574cb5
JH
5102 /* If the recipient address is unqualified, reject it, unless this is a
5103 locally generated message. However, unqualified addresses are permitted
5104 from a configured list of hosts and nets - typically when behaving as
5105 MUAs rather than MTAs. Sad that SMTP is used for both types of traffic,
5106 really. The flag is set at the start of the SMTP connection.
059ec3d9 5107
e0574cb5
JH
5108 RFC 1123 talks about supporting "the reserved mailbox postmaster"; I always
5109 assumed this meant "reserved local part", but the revision of RFC 821 and
5110 friends now makes it absolutely clear that it means *mailbox*. Consequently
5111 we must always qualify this address, regardless. */
059ec3d9 5112
e0574cb5
JH
5113 if (!recipient_domain)
5114 if (!(recipient_domain = qualify_recipient(&recipient, smtp_cmd_data,
5115 US"recipient")))
5116 {
5117 rcpt_fail_count++;
5118 break;
5119 }
059ec3d9 5120
e0574cb5 5121 /* Check maximum allowed */
059ec3d9 5122
e0574cb5
JH
5123 if (rcpt_count > recipients_max && recipients_max > 0)
5124 {
5125 if (recipients_max_reject)
5126 {
5127 rcpt_fail_count++;
5128 smtp_printf("552 too many recipients\r\n", FALSE);
5129 if (!toomany)
5130 log_write(0, LOG_MAIN|LOG_REJECT, "too many recipients: message "
5131 "rejected: sender=<%s> %s", sender_address, host_and_ident(TRUE));
5132 }
5133 else
5134 {
5135 rcpt_defer_count++;
5136 smtp_printf("452 too many recipients\r\n", FALSE);
5137 if (!toomany)
5138 log_write(0, LOG_MAIN|LOG_REJECT, "too many recipients: excess "
5139 "temporarily rejected: sender=<%s> %s", sender_address,
5140 host_and_ident(TRUE));
5141 }
059ec3d9 5142
e0574cb5
JH
5143 toomany = TRUE;
5144 break;
5145 }
059ec3d9 5146
e0574cb5
JH
5147 /* If we have passed the threshold for rate limiting, apply the current
5148 delay, and update it for next time, provided this is a limited host. */
059ec3d9 5149
e0574cb5
JH
5150 if (rcpt_count > smtp_rlr_threshold &&
5151 verify_check_host(&smtp_ratelimit_hosts) == OK)
5152 {
5153 DEBUG(D_receive) debug_printf("rate limit RCPT: delay %.3g sec\n",
5154 smtp_delay_rcpt/1000.0);
5155 millisleep((int)smtp_delay_rcpt);
5156 smtp_delay_rcpt *= smtp_rlr_factor;
5157 if (smtp_delay_rcpt > (double)smtp_rlr_limit)
5158 smtp_delay_rcpt = (double)smtp_rlr_limit;
5159 }
059ec3d9 5160
e0574cb5
JH
5161 /* If the MAIL ACL discarded all the recipients, we bypass ACL checking
5162 for them. Otherwise, check the access control list for this recipient. As
5163 there may be a delay in this, re-check for a synchronization error
5164 afterwards, unless pipelining was advertised. */
059ec3d9 5165
8768d548 5166 if (f.recipients_discarded)
e0574cb5
JH
5167 rc = DISCARD;
5168 else
5169 if ( (rc = acl_check(ACL_WHERE_RCPT, recipient, acl_smtp_rcpt, &user_msg,
5170 &log_msg)) == OK
8768d548 5171 && !f.smtp_in_pipelining_advertised && !check_sync())
e0574cb5 5172 goto SYNC_FAILURE;
059ec3d9 5173
e0574cb5 5174 /* The ACL was happy */
059ec3d9 5175
e0574cb5
JH
5176 if (rc == OK)
5177 {
5178 BOOL more = pipeline_response();
925ac8e4 5179
e0574cb5
JH
5180 if (user_msg)
5181 smtp_user_msg(US"250", user_msg);
5182 else
5183 smtp_printf("250 Accepted\r\n", more);
5184 receive_add_recipient(recipient, -1);
94431adb 5185
e0574cb5
JH
5186 /* Set the dsn flags in the recipients_list */
5187 recipients_list[recipients_count-1].orcpt = orcpt;
ea97267c 5188 recipients_list[recipients_count-1].dsn_flags = dsn_flags;
6c1c3d1d 5189
632b9f8d 5190 /* DEBUG(D_receive) debug_printf("DSN: orcpt: %s flags: %d\n",
e0574cb5 5191 recipients_list[recipients_count-1].orcpt,
632b9f8d 5192 recipients_list[recipients_count-1].dsn_flags); */
e0574cb5 5193 }
059ec3d9 5194
e0574cb5 5195 /* The recipient was discarded */
059ec3d9 5196
e0574cb5
JH
5197 else if (rc == DISCARD)
5198 {
5199 if (user_msg)
5200 smtp_user_msg(US"250", user_msg);
5201 else
5202 smtp_printf("250 Accepted\r\n", FALSE);
5203 rcpt_fail_count++;
5204 discarded = TRUE;
5205 log_write(0, LOG_MAIN|LOG_REJECT, "%s F=<%s> RCPT %s: "
5206 "discarded by %s ACL%s%s", host_and_ident(TRUE),
632b9f8d
JH
5207 sender_address_unrewritten ? sender_address_unrewritten : sender_address,
5208 smtp_cmd_argument, f.recipients_discarded ? "MAIL" : "RCPT",
e0574cb5
JH
5209 log_msg ? US": " : US"", log_msg ? log_msg : US"");
5210 }
059ec3d9 5211
e0574cb5 5212 /* Either the ACL failed the address, or it was deferred. */
059ec3d9 5213
e0574cb5
JH
5214 else
5215 {
5216 if (rc == FAIL) rcpt_fail_count++; else rcpt_defer_count++;
5217 done = smtp_handle_acl_fail(ACL_WHERE_RCPT, rc, user_msg, log_msg);
5218 }
5219 break;
059ec3d9
PH
5220
5221
5222 /* The DATA command is legal only if it follows successful MAIL FROM
5223 and RCPT TO commands. However, if pipelining is advertised, a bad DATA is
5224 not counted as a protocol error if it follows RCPT (which must have been
5225 rejected if there are no recipients.) This function is complete when a
5226 valid DATA command is encountered.
5227
5228 Note concerning the code used: RFC 2821 says this:
5229
5230 - If there was no MAIL, or no RCPT, command, or all such commands
5231 were rejected, the server MAY return a "command out of sequence"
5232 (503) or "no valid recipients" (554) reply in response to the
5233 DATA command.
5234
5235 The example in the pipelining RFC 2920 uses 554, but I use 503 here
2679d413
PH
5236 because it is the same whether pipelining is in use or not.
5237
5238 If all the RCPT commands that precede DATA provoked the same error message
5239 (often indicating some kind of system error), it is helpful to include it
5240 with the DATA rejection (an idea suggested by Tony Finch). */
059ec3d9 5241
18481de3 5242 case BDAT_CMD:
18481de3
JH
5243 {
5244 int n;
5245
e0574cb5 5246 HAD(SCH_BDAT);
18481de3
JH
5247 if (chunking_state != CHUNKING_OFFERED)
5248 {
5249 done = synprot_error(L_smtp_protocol_error, 503, NULL,
5250 US"BDAT command used when CHUNKING not advertised");
5251 break;
5252 }
5253
5254 /* grab size, endmarker */
5255
5256 if (sscanf(CS smtp_cmd_data, "%u %n", &chunking_datasize, &n) < 1)
5257 {
7e3ce68e 5258 done = synprot_error(L_smtp_protocol_error, 501, NULL,
18481de3
JH
5259 US"missing size for BDAT command");
5260 break;
5261 }
5262 chunking_state = strcmpic(smtp_cmd_data+n, US"LAST") == 0
5263 ? CHUNKING_LAST : CHUNKING_ACTIVE;
7e3ce68e 5264 chunking_data_left = chunking_datasize;
bd8fbe36
JH
5265 DEBUG(D_receive) debug_printf("chunking state %d, %d bytes\n",
5266 (int)chunking_state, chunking_data_left);
7e3ce68e 5267
527504e8
HSHR
5268 /* push the current receive_* function on the "stack", and
5269 replace them by bdat_getc(), which in turn will use the lwr_receive_*
5270 functions to do the dirty work. */
7e3ce68e 5271 lwr_receive_getc = receive_getc;
0d81dabc 5272 lwr_receive_getbuf = receive_getbuf;
7e3ce68e 5273 lwr_receive_ungetc = receive_ungetc;
527504e8 5274
7e3ce68e
JH
5275 receive_getc = bdat_getc;
5276 receive_ungetc = bdat_ungetc;
18481de3 5277
8768d548 5278 f.dot_ends = FALSE;
527504e8 5279
18481de3
JH
5280 goto DATA_BDAT;
5281 }
5282
059ec3d9 5283 case DATA_CMD:
e0574cb5 5284 HAD(SCH_DATA);
8768d548 5285 f.dot_ends = TRUE;
45bd315d 5286
ee8b8090 5287 DATA_BDAT: /* Common code for DATA and BDAT */
81344b40 5288#ifndef DISABLE_PIPE_CONNECT
ee8b8090
JH
5289 fl.pipe_connect_acceptable = FALSE;
5290#endif
e0574cb5
JH
5291 if (!discarded && recipients_count <= 0)
5292 {
88752192 5293 if (fl.rcpt_smtp_response_same && rcpt_smtp_response != NULL)
e0574cb5
JH
5294 {
5295 uschar *code = US"503";
5296 int len = Ustrlen(rcpt_smtp_response);
5297 smtp_respond(code, 3, FALSE, US"All RCPT commands were rejected with "
5298 "this error:");
5299 /* Responses from smtp_printf() will have \r\n on the end */
5300 if (len > 2 && rcpt_smtp_response[len-2] == '\r')
5301 rcpt_smtp_response[len-2] = 0;
5302 smtp_respond(code, 3, FALSE, rcpt_smtp_response);
5303 }
8768d548 5304 if (f.smtp_in_pipelining_advertised && last_was_rcpt)
e0574cb5
JH
5305 smtp_printf("503 Valid RCPT command must precede %s\r\n", FALSE,
5306 smtp_names[smtp_connection_had[smtp_ch_index-1]]);
5307 else
5308 done = synprot_error(L_smtp_protocol_error, 503, NULL,
5309 smtp_connection_had[smtp_ch_index-1] == SCH_DATA
5310 ? US"valid RCPT command must precede DATA"
5311 : US"valid RCPT command must precede BDAT");
059ec3d9 5312
e0574cb5
JH
5313 if (chunking_state > CHUNKING_OFFERED)
5314 bdat_flush_data();
5315 break;
5316 }
8e669ac1 5317
e0574cb5
JH
5318 if (toomany && recipients_max_reject)
5319 {
5320 sender_address = NULL; /* This will allow a new MAIL without RSET */
5321 sender_address_unrewritten = NULL;
5322 smtp_printf("554 Too many recipients\r\n", FALSE);
5323 break;
5324 }
059ec3d9 5325
e0574cb5
JH
5326 if (chunking_state > CHUNKING_OFFERED)
5327 rc = OK; /* No predata ACL or go-ahead output for BDAT */
7e3ce68e
JH
5328 else
5329 {
e0574cb5
JH
5330 /* If there is an ACL, re-check the synchronization afterwards, since the
5331 ACL may have delayed. To handle cutthrough delivery enforce a dummy call
5332 to get the DATA command sent. */
7e3ce68e 5333
e0574cb5
JH
5334 if (acl_smtp_predata == NULL && cutthrough.cctx.sock < 0)
5335 rc = OK;
5336 else
5337 {
5338 uschar * acl = acl_smtp_predata ? acl_smtp_predata : US"accept";
8768d548 5339 f.enable_dollar_recipients = TRUE;
e0574cb5
JH
5340 rc = acl_check(ACL_WHERE_PREDATA, NULL, acl, &user_msg,
5341 &log_msg);
8768d548 5342 f.enable_dollar_recipients = FALSE;
e0574cb5
JH
5343 if (rc == OK && !check_sync())
5344 goto SYNC_FAILURE;
5345
5346 if (rc != OK)
5347 { /* Either the ACL failed the address, or it was deferred. */
5348 done = smtp_handle_acl_fail(ACL_WHERE_PREDATA, rc, user_msg, log_msg);
5349 break;
5350 }
7e3ce68e 5351 }
7e3ce68e 5352
e0574cb5
JH
5353 if (user_msg)
5354 smtp_user_msg(US"354", user_msg);
5355 else
5356 smtp_printf(
5357 "354 Enter message, ending with \".\" on a line by itself\r\n", FALSE);
5358 }
059ec3d9 5359
8d330698 5360#ifdef TCP_QUICKACK
e0574cb5
JH
5361 if (smtp_in) /* all ACKs needed to ramp window up for bulk data */
5362 (void) setsockopt(fileno(smtp_in), IPPROTO_TCP, TCP_QUICKACK,
5363 US &on, sizeof(on));
8d330698 5364#endif
e0574cb5
JH
5365 done = 3;
5366 message_ended = END_NOTENDED; /* Indicate in middle of data */
059ec3d9 5367
e0574cb5 5368 break;
059ec3d9
PH
5369
5370
5371 case VRFY_CMD:
059ec3d9 5372 {
4f6ae5c3 5373 uschar * address;
059ec3d9 5374
4f6ae5c3 5375 HAD(SCH_VRFY);
059ec3d9 5376
05392bbc
JH
5377 if (!(address = parse_extract_address(smtp_cmd_data, &errmess,
5378 &start, &end, &recipient_domain, FALSE)))
5379 {
925ac8e4 5380 smtp_printf("501 %s\r\n", FALSE, errmess);
05392bbc
JH
5381 break;
5382 }
5383
c39b93a6 5384 if (!recipient_domain)
2685d6e0
JH
5385 if (!(recipient_domain = qualify_recipient(&address, smtp_cmd_data,
5386 US"verify")))
05392bbc 5387 break;
4f6ae5c3 5388
05392bbc 5389 if ((rc = acl_check(ACL_WHERE_VRFY, address, acl_smtp_vrfy,
4f6ae5c3
JH
5390 &user_msg, &log_msg)) != OK)
5391 done = smtp_handle_acl_fail(ACL_WHERE_VRFY, rc, user_msg, log_msg);
059ec3d9 5392 else
4f6ae5c3 5393 {
05392bbc
JH
5394 uschar * s = NULL;
5395 address_item * addr = deliver_make_addr(address, FALSE);
059ec3d9 5396
4f6ae5c3
JH
5397 switch(verify_address(addr, NULL, vopt_is_recipient | vopt_qualify, -1,
5398 -1, -1, NULL, NULL, NULL))
5399 {
5400 case OK:
5401 s = string_sprintf("250 <%s> is deliverable", address);
5402 break;
059ec3d9 5403
4f6ae5c3
JH
5404 case DEFER:
5405 s = (addr->user_message != NULL)?
5406 string_sprintf("451 <%s> %s", address, addr->user_message) :
5407 string_sprintf("451 Cannot resolve <%s> at this time", address);
5408 break;
059ec3d9 5409
4f6ae5c3
JH
5410 case FAIL:
5411 s = (addr->user_message != NULL)?
5412 string_sprintf("550 <%s> %s", address, addr->user_message) :
5413 string_sprintf("550 <%s> is not deliverable", address);
5414 log_write(0, LOG_MAIN, "VRFY failed for %s %s",
5415 smtp_cmd_argument, host_and_ident(TRUE));
5416 break;
5417 }
5418
925ac8e4 5419 smtp_printf("%s\r\n", FALSE, s);
4f6ae5c3
JH
5420 }
5421 break;
059ec3d9 5422 }
059ec3d9
PH
5423
5424
5425 case EXPN_CMD:
e0574cb5
JH
5426 HAD(SCH_EXPN);
5427 rc = acl_check(ACL_WHERE_EXPN, NULL, acl_smtp_expn, &user_msg, &log_msg);
5428 if (rc != OK)
5429 done = smtp_handle_acl_fail(ACL_WHERE_EXPN, rc, user_msg, log_msg);
5430 else
5431 {
8768d548
JH
5432 BOOL save_log_testing_mode = f.log_testing_mode;
5433 f.address_test_mode = f.log_testing_mode = TRUE;
e0574cb5
JH
5434 (void) verify_address(deliver_make_addr(smtp_cmd_data, FALSE),
5435 smtp_out, vopt_is_recipient | vopt_qualify | vopt_expn, -1, -1, -1,
5436 NULL, NULL, NULL);
8768d548
JH
5437 f.address_test_mode = FALSE;
5438 f.log_testing_mode = save_log_testing_mode; /* true for -bh */
e0574cb5
JH
5439 }
5440 break;
059ec3d9
PH
5441
5442
01603eec 5443 #ifndef DISABLE_TLS
059ec3d9
PH
5444
5445 case STARTTLS_CMD:
e0574cb5 5446 HAD(SCH_STARTTLS);
88752192 5447 if (!fl.tls_advertised)
e0574cb5
JH
5448 {
5449 done = synprot_error(L_smtp_protocol_error, 503, NULL,
5450 US"STARTTLS command used when not advertised");
5451 break;
5452 }
059ec3d9 5453
e0574cb5 5454 /* Apply an ACL check if one is defined */
059ec3d9 5455
e0574cb5
JH
5456 if ( acl_smtp_starttls
5457 && (rc = acl_check(ACL_WHERE_STARTTLS, NULL, acl_smtp_starttls,
5458 &user_msg, &log_msg)) != OK
5459 )
5460 {
5461 done = smtp_handle_acl_fail(ACL_WHERE_STARTTLS, rc, user_msg, log_msg);
5462 break;
5463 }
059ec3d9 5464
e0574cb5
JH
5465 /* RFC 2487 is not clear on when this command may be sent, though it
5466 does state that all information previously obtained from the client
5467 must be discarded if a TLS session is started. It seems reasonable to
5468 do an implied RSET when STARTTLS is received. */
da80c2a8 5469
e0574cb5
JH
5470 incomplete_transaction_log(US"STARTTLS");
5471 cancel_cutthrough_connection(TRUE, US"STARTTLS received");
f3ebb786 5472 reset_point = smtp_reset(reset_point);
e0574cb5
JH
5473 toomany = FALSE;
5474 cmd_list[CMD_LIST_STARTTLS].is_mail_cmd = FALSE;
5475
5476 /* There's an attack where more data is read in past the STARTTLS command
5477 before TLS is negotiated, then assumed to be part of the secure session
5478 when used afterwards; we use segregated input buffers, so are not
5479 vulnerable, but we want to note when it happens and, for sheer paranoia,
5480 ensure that the buffer is "wiped".
5481 Pipelining sync checks will normally have protected us too, unless disabled
5482 by configuration. */
5483
5484 if (receive_smtp_buffered())
5485 {
5486 DEBUG(D_any)
5487 debug_printf("Non-empty input buffer after STARTTLS; naive attack?\n");
5488 if (tls_in.active.sock < 0)
5489 smtp_inend = smtp_inptr = smtp_inbuffer;
5490 /* and if TLS is already active, tls_server_start() should fail */
5491 }
4e7ee012 5492
e0574cb5
JH
5493 /* There is nothing we value in the input buffer and if TLS is successfully
5494 negotiated, we won't use this buffer again; if TLS fails, we'll just read
5495 fresh content into it. The buffer contains arbitrary content from an
5496 untrusted remote source; eg: NOOP <shellcode>\r\nSTARTTLS\r\n
5497 It seems safest to just wipe away the content rather than leave it as a
5498 target to jump to. */
4e7ee012 5499
e0574cb5 5500 memset(smtp_inbuffer, 0, IN_BUFFER_SIZE);
059ec3d9 5501
e0574cb5
JH
5502 /* Attempt to start up a TLS session, and if successful, discard all
5503 knowledge that was obtained previously. At least, that's what the RFC says,
5504 and that's what happens by default. However, in order to work round YAEB,
5505 there is an option to remember the esmtp state. Sigh.
059ec3d9 5506
e0574cb5
JH
5507 We must allow for an extra EHLO command and an extra AUTH command after
5508 STARTTLS that don't add to the nonmail command count. */
059ec3d9 5509
e0574cb5
JH
5510 s = NULL;
5511 if ((rc = tls_server_start(tls_require_ciphers, &s)) == OK)
5512 {
5513 if (!tls_remember_esmtp)
88752192 5514 fl.helo_seen = fl.esmtp = fl.auth_advertised = f.smtp_in_pipelining_advertised = FALSE;
e0574cb5
JH
5515 cmd_list[CMD_LIST_EHLO].is_mail_cmd = TRUE;
5516 cmd_list[CMD_LIST_AUTH].is_mail_cmd = TRUE;
5517 cmd_list[CMD_LIST_TLS_AUTH].is_mail_cmd = TRUE;
5518 if (sender_helo_name)
5519 {
e0574cb5
JH
5520 sender_helo_name = NULL;
5521 host_build_sender_fullhost(); /* Rebuild */
5522 set_process_info("handling incoming TLS connection from %s",
5523 host_and_ident(FALSE));
5524 }
5525 received_protocol =
5526 (sender_host_address ? protocols : protocols_local)
88752192 5527 [ (fl.esmtp
e0574cb5
JH
5528 ? pextend + (sender_host_authenticated ? pauthed : 0)
5529 : pnormal)
5530 + (tls_in.active.sock >= 0 ? pcrpted : 0)
5531 ];
5532
5533 sender_host_auth_pubname = sender_host_authenticated = NULL;
5534 authenticated_id = NULL;
5535 sync_cmd_limit = NON_SYNC_CMD_NON_PIPELINING;
5536 DEBUG(D_tls) debug_printf("TLS active\n");
5537 break; /* Successful STARTTLS */
5538 }
5539 else
5540 (void) smtp_log_tls_fail(s);
059ec3d9 5541
e0574cb5
JH
5542 /* Some local configuration problem was discovered before actually trying
5543 to do a TLS handshake; give a temporary error. */
059ec3d9 5544
e0574cb5
JH
5545 if (rc == DEFER)
5546 {
5547 smtp_printf("454 TLS currently unavailable\r\n", FALSE);
5548 break;
5549 }
059ec3d9 5550
e0574cb5
JH
5551 /* Hard failure. Reject everything except QUIT or closed connection. One
5552 cause for failure is a nested STARTTLS, in which case tls_in.active remains
ce80533b
JH
5553 set, but we must still reject all incoming commands. Another is a handshake
5554 failure - and there may some encrypted data still in the pipe to us, which we
5555 see as garbage commands. */
059ec3d9 5556
e0574cb5
JH
5557 DEBUG(D_tls) debug_printf("TLS failed to start\n");
5558 while (done <= 0) switch(smtp_read_command(FALSE, GETC_BUFFER_UNLIMITED))
5559 {
5560 case EOF_CMD:
5561 log_write(L_smtp_connection, LOG_MAIN, "%s closed by EOF",
5562 smtp_get_connection_info());
5563 smtp_notquit_exit(US"tls-failed", NULL, NULL);
5564 done = 2;
5565 break;
8f128379 5566
e0574cb5
JH
5567 /* It is perhaps arguable as to which exit ACL should be called here,
5568 but as it is probably a situation that almost never arises, it
5569 probably doesn't matter. We choose to call the real QUIT ACL, which in
5570 some sense is perhaps "right". */
5571
5572 case QUIT_CMD:
5573 user_msg = NULL;
5574 if ( acl_smtp_quit
5575 && ((rc = acl_check(ACL_WHERE_QUIT, NULL, acl_smtp_quit, &user_msg,
5576 &log_msg)) == ERROR))
5577 log_write(0, LOG_MAIN|LOG_PANIC, "ACL for QUIT returned ERROR: %s",
5578 log_msg);
5579 if (user_msg)
5580 smtp_respond(US"221", 3, TRUE, user_msg);
5581 else
5582 smtp_printf("221 %s closing connection\r\n", FALSE, smtp_active_hostname);
5583 log_write(L_smtp_connection, LOG_MAIN, "%s closed by QUIT",
5584 smtp_get_connection_info());
5585 done = 2;
5586 break;
059ec3d9 5587
e0574cb5
JH
5588 default:
5589 smtp_printf("554 Security failure\r\n", FALSE);
5590 break;
5591 }
5592 tls_close(NULL, TLS_SHUTDOWN_NOWAIT);
5593 break;
059ec3d9
PH
5594 #endif
5595
5596
5597 /* The ACL for QUIT is provided for gathering statistical information or
5598 similar; it does not affect the response code, but it can supply a custom
5599 message. */
5600
5601 case QUIT_CMD:
e0574cb5
JH
5602 smtp_quit_handler(&user_msg, &log_msg);
5603 done = 2;
5604 break;
059ec3d9
PH
5605
5606
5607 case RSET_CMD:
e0574cb5
JH
5608 smtp_rset_handler();
5609 cancel_cutthrough_connection(TRUE, US"RSET received");
f3ebb786 5610 reset_point = smtp_reset(reset_point);
e0574cb5
JH
5611 toomany = FALSE;
5612 break;
059ec3d9
PH
5613
5614
5615 case NOOP_CMD:
e0574cb5
JH
5616 HAD(SCH_NOOP);
5617 smtp_printf("250 OK\r\n", FALSE);
5618 break;
059ec3d9
PH
5619
5620
b43a74ea
PH
5621 /* Show ETRN/EXPN/VRFY if there's an ACL for checking hosts; if actually
5622 used, a check will be done for permitted hosts. Show STARTTLS only if not
5623 already in a TLS session and if it would be advertised in the EHLO
5624 response. */
059ec3d9
PH
5625
5626 case HELP_CMD:
e0574cb5
JH
5627 HAD(SCH_HELP);
5628 smtp_printf("214-Commands supported:\r\n", TRUE);
5629 {
5630 uschar buffer[256];
5631 buffer[0] = 0;
f3ebb786 5632 Ustrcat(buffer, US" AUTH");
01603eec 5633 #ifndef DISABLE_TLS
e0574cb5
JH
5634 if (tls_in.active.sock < 0 &&
5635 verify_check_host(&tls_advertise_hosts) != FAIL)
f3ebb786 5636 Ustrcat(buffer, US" STARTTLS");
e0574cb5 5637 #endif
f3ebb786
JH
5638 Ustrcat(buffer, US" HELO EHLO MAIL RCPT DATA BDAT");
5639 Ustrcat(buffer, US" NOOP QUIT RSET HELP");
5640 if (acl_smtp_etrn) Ustrcat(buffer, US" ETRN");
5641 if (acl_smtp_expn) Ustrcat(buffer, US" EXPN");
5642 if (acl_smtp_vrfy) Ustrcat(buffer, US" VRFY");
e0574cb5
JH
5643 smtp_printf("214%s\r\n", FALSE, buffer);
5644 }
5645 break;
059ec3d9
PH
5646
5647
5648 case EOF_CMD:
e0574cb5
JH
5649 incomplete_transaction_log(US"connection lost");
5650 smtp_notquit_exit(US"connection-lost", US"421",
5651 US"%s lost input connection", smtp_active_hostname);
5652
5653 /* Don't log by default unless in the middle of a message, as some mailers
5654 just drop the call rather than sending QUIT, and it clutters up the logs.
5655 */
5656
5657 if (sender_address || recipients_count > 0)
5658 log_write(L_lost_incoming_connection, LOG_MAIN,
5659 "unexpected %s while reading SMTP command from %s%s%s D=%s",
8768d548 5660 f.sender_host_unknown ? "EOF" : "disconnection",
ee8b8090
JH
5661 f.tcp_in_fastopen_logged
5662 ? US""
5663 : f.tcp_in_fastopen
5664 ? f.tcp_in_fastopen_data ? US"TFO* " : US"TFO "
5665 : US"",
e0574cb5
JH
5666 host_and_ident(FALSE), smtp_read_error,
5667 string_timesince(&smtp_connection_start)
5668 );
2ac25850 5669
e0574cb5
JH
5670 else
5671 log_write(L_smtp_connection, LOG_MAIN, "%s %slost%s D=%s",
5672 smtp_get_connection_info(),
8768d548 5673 f.tcp_in_fastopen && !f.tcp_in_fastopen_logged ? US"TFO " : US"",
e0574cb5
JH
5674 smtp_read_error,
5675 string_timesince(&smtp_connection_start)
5676 );
5677
5678 done = 1;
5679 break;
059ec3d9
PH
5680
5681
5682 case ETRN_CMD:
e0574cb5
JH
5683 HAD(SCH_ETRN);
5684 if (sender_address)
5685 {
5686 done = synprot_error(L_smtp_protocol_error, 503, NULL,
5687 US"ETRN is not permitted inside a transaction");
5688 break;
5689 }
059ec3d9 5690
e0574cb5
JH
5691 log_write(L_etrn, LOG_MAIN, "ETRN %s received from %s", smtp_cmd_argument,
5692 host_and_ident(FALSE));
059ec3d9 5693
e0574cb5
JH
5694 if ((rc = acl_check(ACL_WHERE_ETRN, NULL, acl_smtp_etrn,
5695 &user_msg, &log_msg)) != OK)
5696 {
5697 done = smtp_handle_acl_fail(ACL_WHERE_ETRN, rc, user_msg, log_msg);
5698 break;
5699 }
059ec3d9 5700
e0574cb5 5701 /* Compute the serialization key for this command. */
059ec3d9 5702
e0574cb5 5703 etrn_serialize_key = string_sprintf("etrn-%s\n", smtp_cmd_data);
059ec3d9 5704
e0574cb5
JH
5705 /* If a command has been specified for running as a result of ETRN, we
5706 permit any argument to ETRN. If not, only the # standard form is permitted,
5707 since that is strictly the only kind of ETRN that can be implemented
5708 according to the RFC. */
059ec3d9 5709
e0574cb5
JH
5710 if (smtp_etrn_command)
5711 {
5712 uschar *error;
5713 BOOL rc;
5714 etrn_command = smtp_etrn_command;
5715 deliver_domain = smtp_cmd_data;
5716 rc = transport_set_up_command(&argv, smtp_etrn_command, TRUE, 0, NULL,
5717 US"ETRN processing", &error);
5718 deliver_domain = NULL;
5719 if (!rc)
5720 {
5721 log_write(0, LOG_MAIN|LOG_PANIC, "failed to set up ETRN command: %s",
5722 error);
5723 smtp_printf("458 Internal failure\r\n", FALSE);
5724 break;
5725 }
5726 }
059ec3d9 5727
e0574cb5 5728 /* Else set up to call Exim with the -R option. */
059ec3d9 5729
e0574cb5
JH
5730 else
5731 {
5732 if (*smtp_cmd_data++ != '#')
5733 {
5734 done = synprot_error(L_smtp_syntax_error, 501, NULL,
5735 US"argument must begin with #");
5736 break;
5737 }
5738 etrn_command = US"exim -R";
5739 argv = CUSS child_exec_exim(CEE_RETURN_ARGV, TRUE, NULL, TRUE,
5740 *queue_name ? 4 : 2,
5741 US"-R", smtp_cmd_data,
5742 US"-MCG", queue_name);
5743 }
059ec3d9 5744
e0574cb5 5745 /* If we are host-testing, don't actually do anything. */
059ec3d9 5746
e0574cb5
JH
5747 if (host_checking)
5748 {
5749 HDEBUG(D_any)
5750 {
5751 debug_printf("ETRN command is: %s\n", etrn_command);
5752 debug_printf("ETRN command execution skipped\n");
5753 }
5754 if (user_msg == NULL) smtp_printf("250 OK\r\n", FALSE);
5755 else smtp_user_msg(US"250", user_msg);
5756 break;
5757 }
059ec3d9
PH
5758
5759
e0574cb5
JH
5760 /* If ETRN queue runs are to be serialized, check the database to
5761 ensure one isn't already running. */
059ec3d9 5762
e0574cb5
JH
5763 if (smtp_etrn_serialize && !enq_start(etrn_serialize_key, 1))
5764 {
5765 smtp_printf("458 Already processing %s\r\n", FALSE, smtp_cmd_data);
5766 break;
5767 }
059ec3d9 5768
e0574cb5
JH
5769 /* Fork a child process and run the command. We don't want to have to
5770 wait for the process at any point, so set SIGCHLD to SIG_IGN before
5771 forking. It should be set that way anyway for external incoming SMTP,
5772 but we save and restore to be tidy. If serialization is required, we
5773 actually run the command in yet another process, so we can wait for it
5774 to complete and then remove the serialization lock. */
059ec3d9 5775
e0574cb5 5776 oldsignal = signal(SIGCHLD, SIG_IGN);
059ec3d9 5777
4b01271f 5778 if ((pid = exim_fork(US"etrn-command")) == 0)
e0574cb5
JH
5779 {
5780 smtp_input = FALSE; /* This process is not associated with the */
5781 (void)fclose(smtp_in); /* SMTP call any more. */
5782 (void)fclose(smtp_out);
059ec3d9 5783
e0574cb5 5784 signal(SIGCHLD, SIG_DFL); /* Want to catch child */
059ec3d9 5785
e0574cb5
JH
5786 /* If not serializing, do the exec right away. Otherwise, fork down
5787 into another process. */
059ec3d9 5788
8e9fdd63 5789 if ( !smtp_etrn_serialize
4b01271f 5790 || (pid = exim_fork(US"etrn-serialised-command")) == 0)
e0574cb5
JH
5791 {
5792 DEBUG(D_exec) debug_print_argv(argv);
5793 exim_nullstd(); /* Ensure std{in,out,err} exist */
5794 execv(CS argv[0], (char *const *)argv);
5795 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "exec of \"%s\" (ETRN) failed: %s",
5796 etrn_command, strerror(errno));
5797 _exit(EXIT_FAILURE); /* paranoia */
5798 }
059ec3d9 5799
e0574cb5
JH
5800 /* Obey this if smtp_serialize and the 2nd fork yielded non-zero. That
5801 is, we are in the first subprocess, after forking again. All we can do
5802 for a failing fork is to log it. Otherwise, wait for the 2nd process to
5803 complete, before removing the serialization. */
059ec3d9 5804
e0574cb5
JH
5805 if (pid < 0)
5806 log_write(0, LOG_MAIN|LOG_PANIC, "2nd fork for serialized ETRN "
5807 "failed: %s", strerror(errno));
5808 else
5809 {
5810 int status;
5811 DEBUG(D_any) debug_printf("waiting for serialized ETRN process %d\n",
5812 (int)pid);
5813 (void)wait(&status);
5814 DEBUG(D_any) debug_printf("serialized ETRN process %d ended\n",
5815 (int)pid);
5816 }
059ec3d9 5817
e0574cb5 5818 enq_end(etrn_serialize_key);
81022793 5819 exim_underbar_exit(EXIT_SUCCESS);
e0574cb5 5820 }
059ec3d9 5821
e0574cb5
JH
5822 /* Back in the top level SMTP process. Check that we started a subprocess
5823 and restore the signal state. */
059ec3d9 5824
e0574cb5
JH
5825 if (pid < 0)
5826 {
5827 log_write(0, LOG_MAIN|LOG_PANIC, "fork of process for ETRN failed: %s",
5828 strerror(errno));
5829 smtp_printf("458 Unable to fork process\r\n", FALSE);
5830 if (smtp_etrn_serialize) enq_end(etrn_serialize_key);
5831 }
5832 else
f3ebb786
JH
5833 if (!user_msg)
5834 smtp_printf("250 OK\r\n", FALSE);
5835 else
5836 smtp_user_msg(US"250", user_msg);
059ec3d9 5837
e0574cb5
JH
5838 signal(SIGCHLD, oldsignal);
5839 break;
059ec3d9
PH
5840
5841
5842 case BADARG_CMD:
e0574cb5
JH
5843 done = synprot_error(L_smtp_syntax_error, 501, NULL,
5844 US"unexpected argument data");
5845 break;
059ec3d9
PH
5846
5847
5848 /* This currently happens only for NULLs, but could be extended. */
5849
5850 case BADCHAR_CMD:
e0574cb5
JH
5851 done = synprot_error(L_smtp_syntax_error, 0, NULL, /* Just logs */
5852 US"NUL character(s) present (shown as '?')");
5853 smtp_printf("501 NUL characters are not allowed in SMTP commands\r\n",
5854 FALSE);
5855 break;
059ec3d9
PH
5856
5857
5858 case BADSYN_CMD:
a14e5636 5859 SYNC_FAILURE:
e0574cb5
JH
5860 if (smtp_inend >= smtp_inbuffer + IN_BUFFER_SIZE)
5861 smtp_inend = smtp_inbuffer + IN_BUFFER_SIZE - 1;
5862 c = smtp_inend - smtp_inptr;
5863 if (c > 150) c = 150; /* limit logged amount */
5864 smtp_inptr[c] = 0;
5865 incomplete_transaction_log(US"sync failure");
5866 log_write(0, LOG_MAIN|LOG_REJECT, "SMTP protocol synchronization error "
5867 "(next input sent too soon: pipelining was%s advertised): "
5868 "rejected \"%s\" %s next input=\"%s\"",
8768d548 5869 f.smtp_in_pipelining_advertised ? "" : " not",
e0574cb5
JH
5870 smtp_cmd_buffer, host_and_ident(TRUE),
5871 string_printing(smtp_inptr));
5872 smtp_notquit_exit(US"synchronization-error", US"554",
5873 US"SMTP synchronization error");
5874 done = 1; /* Pretend eof - drops connection */
5875 break;
059ec3d9
PH
5876
5877
5878 case TOO_MANY_NONMAIL_CMD:
e0574cb5
JH
5879 s = smtp_cmd_buffer;
5880 while (*s != 0 && !isspace(*s)) s++;
5881 incomplete_transaction_log(US"too many non-mail commands");
5882 log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
5883 "nonmail commands (last was \"%.*s\")", host_and_ident(FALSE),
5884 (int)(s - smtp_cmd_buffer), smtp_cmd_buffer);
5885 smtp_notquit_exit(US"bad-commands", US"554", US"Too many nonmail commands");
5886 done = 1; /* Pretend eof - drops connection */
5887 break;
059ec3d9 5888
cee5f132 5889#ifdef SUPPORT_PROXY
a3c86431 5890 case PROXY_FAIL_IGNORE_CMD:
e0574cb5
JH
5891 smtp_printf("503 Command refused, required Proxy negotiation failed\r\n", FALSE);
5892 break;
cee5f132 5893#endif
059ec3d9
PH
5894
5895 default:
e0574cb5
JH
5896 if (unknown_command_count++ >= smtp_max_unknown_commands)
5897 {
5898 log_write(L_smtp_syntax_error, LOG_MAIN,
5899 "SMTP syntax error in \"%s\" %s %s",
5900 string_printing(smtp_cmd_buffer), host_and_ident(TRUE),
5901 US"unrecognized command");
5902 incomplete_transaction_log(US"unrecognized command");
5903 smtp_notquit_exit(US"bad-commands", US"500",
5904 US"Too many unrecognized commands");
5905 done = 2;
5906 log_write(0, LOG_MAIN|LOG_REJECT, "SMTP call from %s dropped: too many "
5907 "unrecognized commands (last was \"%s\")", host_and_ident(FALSE),
5908 string_printing(smtp_cmd_buffer));
5909 }
5910 else
5911 done = synprot_error(L_smtp_syntax_error, 500, NULL,
5912 US"unrecognized command");
5913 break;
059ec3d9
PH
5914 }
5915
5916 /* This label is used by goto's inside loops that want to break out to
5917 the end of the command-processing loop. */
5918
5919 COMMAND_LOOP:
5920 last_was_rej_mail = was_rej_mail; /* Remember some last commands for */
5921 last_was_rcpt = was_rcpt; /* protocol error handling */
5922 continue;
5923 }
5924
5925return done - 2; /* Convert yield values */
5926}
5927
dfbcb5ac
JH
5928
5929
5930gstring *
5931authres_smtpauth(gstring * g)
5932{
5933if (!sender_host_authenticated)
5934 return g;
5935
c44ff8be
JH
5936g = string_append(g, 2, US";\n\tauth=pass (", sender_host_auth_pubname);
5937
5938if (Ustrcmp(sender_host_auth_pubname, "tls") != 0)
5939 g = string_append(g, 2, US") smtp.auth=", authenticated_id);
5940else if (authenticated_id)
5941 g = string_append(g, 2, US") x509.auth=", authenticated_id);
5942else
5943 g = string_catn(g, US") reason=x509.auth", 17);
5944
dfbcb5ac
JH
5945if (authenticated_sender)
5946 g = string_append(g, 2, US" smtp.mailfrom=", authenticated_sender);
5947return g;
5948}
5949
5950
5951
e45a1c37
JH
5952/* vi: aw ai sw=2
5953*/
059ec3d9 5954/* End of smtp_in.c */