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