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