tidying: dkim output function args
[exim.git] / src / src / receive.c
CommitLineData
059ec3d9
PH
1/*************************************************
2* Exim - an Internet mail transport agent *
3*************************************************/
4
80fea873 5/* Copyright (c) University of Cambridge 1995 - 2016 */
059ec3d9
PH
6/* See the file NOTICE for conditions of use and distribution. */
7
8/* Code for receiving a message and setting up spool files. */
9
059ec3d9
PH
10#include "exim.h"
11
6a8f9482
TK
12#ifdef EXPERIMENTAL_DCC
13extern int dcc_ok;
14#endif
15
4840604e 16#ifdef EXPERIMENTAL_DMARC
c007c974 17# include "dmarc.h"
4840604e
TL
18#endif /* EXPERIMENTAL_DMARC */
19
059ec3d9
PH
20/*************************************************
21* Local static variables *
22*************************************************/
23
24static FILE *data_file = NULL;
25static int data_fd = -1;
41313d92 26static uschar *spool_name = US"";
059ec3d9
PH
27
28
29
30/*************************************************
31* Non-SMTP character reading functions *
32*************************************************/
33
34/* These are the default functions that are set up in the variables such as
35receive_getc initially. They just call the standard functions, passing stdin as
36the file. (When SMTP input is occurring, different functions are used by
37changing the pointer variables.) */
38
39int
40stdin_getc(void)
41{
42return getc(stdin);
43}
44
45int
46stdin_ungetc(int c)
47{
48return ungetc(c, stdin);
49}
50
51int
52stdin_feof(void)
53{
54return feof(stdin);
55}
56
57int
58stdin_ferror(void)
59{
60return ferror(stdin);
61}
62
63
64
65
66/*************************************************
67* Check that a set sender is allowed *
68*************************************************/
69
70/* This function is called when a local caller sets an explicit sender address.
71It checks whether this is permitted, which it is for trusted callers.
72Otherwise, it must match the pattern(s) in untrusted_set_sender.
73
74Arguments: the proposed sender address
75Returns: TRUE for a trusted caller
76 TRUE if the address has been set, untrusted_set_sender has been
77 set, and the address matches something in the list
78 FALSE otherwise
79*/
80
81BOOL
82receive_check_set_sender(uschar *newsender)
83{
84uschar *qnewsender;
85if (trusted_caller) return TRUE;
86if (newsender == NULL || untrusted_set_sender == NULL) return FALSE;
87qnewsender = (Ustrchr(newsender, '@') != NULL)?
88 newsender : string_sprintf("%s@%s", newsender, qualify_domain_sender);
89return
55414b25 90 match_address_list(qnewsender, TRUE, TRUE, CUSS &untrusted_set_sender, NULL, -1,
059ec3d9
PH
91 0, NULL) == OK;
92}
93
94
95
96
97/*************************************************
5cb8cbc6 98* Read space info for a partition *
059ec3d9
PH
99*************************************************/
100
8e669ac1
PH
101/* This function is called by receive_check_fs() below, and also by string
102expansion for variables such as $spool_space. The field names for the statvfs
5cb8cbc6
PH
103structure are macros, because not all OS have F_FAVAIL and it seems tidier to
104have macros for F_BAVAIL and F_FILES as well. Some kinds of file system do not
105have inodes, and they return -1 for the number available.
059ec3d9 106
5cb8cbc6
PH
107Later: It turns out that some file systems that do not have the concept of
108inodes return 0 rather than -1. Such systems should also return 0 for the total
8e669ac1 109number of inodes, so we require that to be greater than zero before returning
5cb8cbc6 110an inode count.
059ec3d9 111
5cb8cbc6
PH
112Arguments:
113 isspool TRUE for spool partition, FALSE for log partition
114 inodeptr address of int to receive inode count; -1 if there isn't one
8e669ac1 115
5cb8cbc6 116Returns: available on-root space, in kilobytes
8e669ac1
PH
117 -1 for log partition if there isn't one
118
119All values are -1 if the STATFS functions are not available.
059ec3d9
PH
120*/
121
8e669ac1 122int
5cb8cbc6 123receive_statvfs(BOOL isspool, int *inodeptr)
059ec3d9
PH
124{
125#ifdef HAVE_STATFS
059ec3d9 126struct STATVFS statbuf;
5cb8cbc6
PH
127uschar *path;
128uschar *name;
129uschar buffer[1024];
059ec3d9 130
5cb8cbc6 131/* The spool directory must always exist. */
059ec3d9 132
5cb8cbc6 133if (isspool)
059ec3d9 134 {
8e669ac1
PH
135 path = spool_directory;
136 name = US"spool";
137 }
138
059ec3d9
PH
139/* Need to cut down the log file path to the directory, and to ignore any
140appearance of "syslog" in it. */
141
5cb8cbc6 142else
059ec3d9 143 {
059ec3d9 144 int sep = ':'; /* Not variable - outside scripts use */
55414b25 145 const uschar *p = log_file_path;
8e669ac1 146 name = US"log";
059ec3d9
PH
147
148 /* An empty log_file_path means "use the default". This is the same as an
149 empty item in a list. */
150
151 if (*p == 0) p = US":";
55414b25
JH
152 while ((path = string_nextinlist(&p, &sep, buffer, sizeof(buffer))))
153 if (Ustrcmp(path, "syslog") != 0)
154 break;
059ec3d9 155
5cb8cbc6
PH
156 if (path == NULL) /* No log files */
157 {
8e669ac1
PH
158 *inodeptr = -1;
159 return -1;
160 }
059ec3d9 161
8e669ac1
PH
162 /* An empty string means use the default, which is in the spool directory.
163 But don't just use the spool directory, as it is possible that the log
5cb8cbc6 164 subdirectory has been symbolically linked elsewhere. */
059ec3d9 165
8e669ac1 166 if (path[0] == 0)
059ec3d9 167 {
5cb8cbc6
PH
168 sprintf(CS buffer, CS"%s/log", CS spool_directory);
169 path = buffer;
8e669ac1
PH
170 }
171 else
059ec3d9 172 {
8e669ac1 173 uschar *cp;
5cb8cbc6 174 if ((cp = Ustrrchr(path, '/')) != NULL) *cp = 0;
8e669ac1 175 }
5cb8cbc6 176 }
8e669ac1 177
8f128379 178/* We now have the path; do the business */
5cb8cbc6
PH
179
180memset(&statbuf, 0, sizeof(statbuf));
181
182if (STATVFS(CS path, &statbuf) != 0)
183 {
184 log_write(0, LOG_MAIN|LOG_PANIC, "cannot accept message: failed to stat "
185 "%s directory %s: %s", name, spool_directory, strerror(errno));
186 smtp_closedown(US"spool or log directory problem");
187 exim_exit(EXIT_FAILURE);
188 }
8e669ac1 189
5cb8cbc6
PH
190*inodeptr = (statbuf.F_FILES > 0)? statbuf.F_FAVAIL : -1;
191
192/* Disks are getting huge. Take care with computing the size in kilobytes. */
8e669ac1 193
5cb8cbc6
PH
194return (int)(((double)statbuf.F_BAVAIL * (double)statbuf.F_FRSIZE)/1024.0);
195
196/* Unable to find partition sizes in this environment. */
197
198#else
199*inodeptr = -1;
200return -1;
201#endif
202}
203
059ec3d9 204
059ec3d9 205
5cb8cbc6
PH
206
207/*************************************************
208* Check space on spool and log partitions *
209*************************************************/
210
211/* This function is called before accepting a message; if any thresholds are
212set, it checks them. If a message_size is supplied, it checks that there is
213enough space for that size plus the threshold - i.e. that the message won't
214reduce the space to the threshold. Not all OS have statvfs(); for those that
215don't, this function always returns TRUE. For some OS the old function and
216struct name statfs is used; that is handled by a macro, defined in exim.h.
217
218Arguments:
219 msg_size the (estimated) size of an incoming message
220
221Returns: FALSE if there isn't enough space, or if the information cannot
222 be obtained
223 TRUE if no check was done or there is enough space
224*/
225
226BOOL
227receive_check_fs(int msg_size)
228{
229int space, inodes;
230
231if (check_spool_space > 0 || msg_size > 0 || check_spool_inodes > 0)
232 {
8e669ac1
PH
233 space = receive_statvfs(TRUE, &inodes);
234
059ec3d9 235 DEBUG(D_receive)
5cb8cbc6
PH
236 debug_printf("spool directory space = %dK inodes = %d "
237 "check_space = %dK inodes = %d msg_size = %d\n",
238 space, inodes, check_spool_space, check_spool_inodes, msg_size);
8e669ac1
PH
239
240 if ((space >= 0 && space < check_spool_space) ||
5cb8cbc6 241 (inodes >= 0 && inodes < check_spool_inodes))
8e669ac1 242 {
5cb8cbc6
PH
243 log_write(0, LOG_MAIN, "spool directory space check failed: space=%d "
244 "inodes=%d", space, inodes);
059ec3d9
PH
245 return FALSE;
246 }
247 }
248
5cb8cbc6
PH
249if (check_log_space > 0 || check_log_inodes > 0)
250 {
8e669ac1
PH
251 space = receive_statvfs(FALSE, &inodes);
252
5cb8cbc6
PH
253 DEBUG(D_receive)
254 debug_printf("log directory space = %dK inodes = %d "
255 "check_space = %dK inodes = %d\n",
256 space, inodes, check_log_space, check_log_inodes);
8e669ac1
PH
257
258 if ((space >= 0 && space < check_log_space) ||
5cb8cbc6 259 (inodes >= 0 && inodes < check_log_inodes))
8e669ac1 260 {
5cb8cbc6
PH
261 log_write(0, LOG_MAIN, "log directory space check failed: space=%d "
262 "inodes=%d", space, inodes);
263 return FALSE;
264 }
8e669ac1
PH
265 }
266
059ec3d9
PH
267return TRUE;
268}
269
270
271
272/*************************************************
273* Bomb out while reading a message *
274*************************************************/
275
276/* The common case of wanting to bomb out is if a SIGTERM or SIGINT is
277received, or if there is a timeout. A rarer case might be if the log files are
278screwed up and Exim can't open them to record a message's arrival. Handling
279that case is done by setting a flag to cause the log functions to call this
280function if there is an ultimate disaster. That is why it is globally
281accessible.
282
8f128379
PH
283Arguments:
284 reason text reason to pass to the not-quit ACL
285 msg default SMTP response to give if in an SMTP session
059ec3d9
PH
286Returns: it doesn't
287*/
288
289void
8f128379 290receive_bomb_out(uschar *reason, uschar *msg)
059ec3d9 291{
ead37e6c
PP
292 static BOOL already_bombing_out;
293/* The smtp_notquit_exit() below can call ACLs which can trigger recursive
294timeouts, if someone has something slow in their quit ACL. Since the only
295things we should be doing are to close down cleanly ASAP, on the second
296pass we also close down stuff that might be opened again, before bypassing
297the ACL call and exiting. */
298
059ec3d9
PH
299/* If spool_name is set, it contains the name of the data file that is being
300written. Unlink it before closing so that it cannot be picked up by a delivery
301process. Ensure that any header file is also removed. */
302
ead37e6c 303if (spool_name[0] != '\0')
059ec3d9
PH
304 {
305 Uunlink(spool_name);
306 spool_name[Ustrlen(spool_name) - 1] = 'H';
307 Uunlink(spool_name);
ead37e6c 308 spool_name[0] = '\0';
059ec3d9
PH
309 }
310
311/* Now close the file if it is open, either as a fd or a stream. */
312
ead37e6c
PP
313if (data_file != NULL)
314 {
315 (void)fclose(data_file);
316 data_file = NULL;
317} else if (data_fd >= 0) {
318 (void)close(data_fd);
319 data_fd = -1;
320 }
059ec3d9 321
8f128379
PH
322/* Attempt to close down an SMTP connection tidily. For non-batched SMTP, call
323smtp_notquit_exit(), which runs the NOTQUIT ACL, if present, and handles the
324SMTP response. */
059ec3d9 325
ead37e6c 326if (!already_bombing_out)
059ec3d9 327 {
ead37e6c
PP
328 already_bombing_out = TRUE;
329 if (smtp_input)
330 {
331 if (smtp_batched_input)
332 moan_smtp_batch(NULL, "421 %s - message abandoned", msg); /* No return */
333 smtp_notquit_exit(reason, US"421", US"%s %s - closing connection.",
334 smtp_active_hostname, msg);
335 }
059ec3d9
PH
336 }
337
338/* Exit from the program (non-BSMTP cases) */
339
340exim_exit(EXIT_FAILURE);
341}
342
343
344/*************************************************
345* Data read timeout *
346*************************************************/
347
348/* Handler function for timeouts that occur while reading the data that
349comprises a message.
350
351Argument: the signal number
352Returns: nothing
353*/
354
355static void
356data_timeout_handler(int sig)
357{
358uschar *msg = NULL;
359
360sig = sig; /* Keep picky compilers happy */
361
362if (smtp_input)
363 {
364 msg = US"SMTP incoming data timeout";
365 log_write(L_lost_incoming_connection,
366 LOG_MAIN, "SMTP data timeout (message abandoned) on connection "
fed77020
PH
367 "from %s F=<%s>",
368 (sender_fullhost != NULL)? sender_fullhost : US"local process",
369 sender_address);
059ec3d9
PH
370 }
371else
372 {
373 fprintf(stderr, "exim: timed out while reading - message abandoned\n");
374 log_write(L_lost_incoming_connection,
375 LOG_MAIN, "timed out while reading local message");
376 }
377
8f128379 378receive_bomb_out(US"data-timeout", msg); /* Does not return */
059ec3d9
PH
379}
380
381
382
383/*************************************************
384* local_scan() timeout *
385*************************************************/
386
387/* Handler function for timeouts that occur while running a local_scan()
388function.
389
390Argument: the signal number
391Returns: nothing
392*/
393
394static void
395local_scan_timeout_handler(int sig)
396{
397sig = sig; /* Keep picky compilers happy */
398log_write(0, LOG_MAIN|LOG_REJECT, "local_scan() function timed out - "
399 "message temporarily rejected (size %d)", message_size);
8f128379
PH
400/* Does not return */
401receive_bomb_out(US"local-scan-timeout", US"local verification problem");
059ec3d9
PH
402}
403
404
405
406/*************************************************
407* local_scan() crashed *
408*************************************************/
409
410/* Handler function for signals that occur while running a local_scan()
411function.
412
413Argument: the signal number
414Returns: nothing
415*/
416
417static void
418local_scan_crash_handler(int sig)
419{
420log_write(0, LOG_MAIN|LOG_REJECT, "local_scan() function crashed with "
421 "signal %d - message temporarily rejected (size %d)", sig, message_size);
8f128379
PH
422/* Does not return */
423receive_bomb_out(US"local-scan-error", US"local verification problem");
059ec3d9
PH
424}
425
426
427/*************************************************
428* SIGTERM or SIGINT received *
429*************************************************/
430
431/* Handler for SIGTERM or SIGINT signals that occur while reading the
432data that comprises a message.
433
434Argument: the signal number
435Returns: nothing
436*/
437
438static void
439data_sigterm_sigint_handler(int sig)
440{
441uschar *msg = NULL;
442
443if (smtp_input)
444 {
445 msg = US"Service not available - SIGTERM or SIGINT received";
446 log_write(0, LOG_MAIN, "%s closed after %s", smtp_get_connection_info(),
447 (sig == SIGTERM)? "SIGTERM" : "SIGINT");
448 }
449else
450 {
f05da2e8 451 if (filter_test == FTEST_NONE)
059ec3d9
PH
452 {
453 fprintf(stderr, "\nexim: %s received - message abandoned\n",
454 (sig == SIGTERM)? "SIGTERM" : "SIGINT");
455 log_write(0, LOG_MAIN, "%s received while reading local message",
456 (sig == SIGTERM)? "SIGTERM" : "SIGINT");
457 }
458 }
459
8f128379 460receive_bomb_out(US"signal-exit", msg); /* Does not return */
059ec3d9
PH
461}
462
463
464
465/*************************************************
466* Add new recipient to list *
467*************************************************/
468
469/* This function builds a list of recipient addresses in argc/argv
470format.
471
472Arguments:
473 recipient the next address to add to recipients_list
474 pno parent number for fixed aliases; -1 otherwise
475
476Returns: nothing
477*/
478
479void
480receive_add_recipient(uschar *recipient, int pno)
481{
482if (recipients_count >= recipients_list_max)
483 {
484 recipient_item *oldlist = recipients_list;
485 int oldmax = recipients_list_max;
486 recipients_list_max = recipients_list_max? 2*recipients_list_max : 50;
487 recipients_list = store_get(recipients_list_max * sizeof(recipient_item));
488 if (oldlist != NULL)
489 memcpy(recipients_list, oldlist, oldmax * sizeof(recipient_item));
490 }
491
492recipients_list[recipients_count].address = recipient;
493recipients_list[recipients_count].pno = pno;
8523533c
TK
494#ifdef EXPERIMENTAL_BRIGHTMAIL
495recipients_list[recipients_count].bmi_optin = bmi_current_optin;
496/* reset optin string pointer for next recipient */
497bmi_current_optin = NULL;
498#endif
6c1c3d1d
WB
499recipients_list[recipients_count].orcpt = NULL;
500recipients_list[recipients_count].dsn_flags = 0;
059ec3d9
PH
501recipients_list[recipients_count++].errors_to = NULL;
502}
503
504
505
506
fd98a5c6
JH
507/*************************************************
508* Send user response message *
509*************************************************/
61147df4 510
fd98a5c6
JH
511/* This function is passed a default response code and a user message. It calls
512smtp_message_code() to check and possibly modify the response code, and then
513calls smtp_respond() to transmit the response. I put this into a function
514just to avoid a lot of repetition.
61147df4
PP
515
516Arguments:
fd98a5c6
JH
517 code the response code
518 user_msg the user message
519
520Returns: nothing
61147df4
PP
521*/
522
8ccd00b1 523#ifndef DISABLE_PRDR
61147df4 524static void
fd98a5c6 525smtp_user_msg(uschar *code, uschar *user_msg)
61147df4 526{
fd98a5c6 527int len = 3;
4f6ae5c3 528smtp_message_code(&code, &len, &user_msg, NULL, TRUE);
fd98a5c6 529smtp_respond(code, len, TRUE, user_msg);
61147df4
PP
530}
531#endif
532
533
534
535
fd98a5c6 536
059ec3d9
PH
537/*************************************************
538* Remove a recipient from the list *
539*************************************************/
540
541/* This function is provided for local_scan() to use.
542
543Argument:
544 recipient address to remove
545
546Returns: TRUE if it did remove something; FALSE otherwise
547*/
548
549BOOL
550receive_remove_recipient(uschar *recipient)
551{
552int count;
553DEBUG(D_receive) debug_printf("receive_remove_recipient(\"%s\") called\n",
554 recipient);
555for (count = 0; count < recipients_count; count++)
556 {
557 if (Ustrcmp(recipients_list[count].address, recipient) == 0)
558 {
559 if ((--recipients_count - count) > 0)
560 memmove(recipients_list + count, recipients_list + count + 1,
54cdb463 561 (recipients_count - count)*sizeof(recipient_item));
059ec3d9
PH
562 return TRUE;
563 }
564 }
565return FALSE;
566}
567
568
569
570
571
572/*************************************************
573* Read data portion of a non-SMTP message *
574*************************************************/
575
576/* This function is called to read the remainder of a message (following the
577header) when the input is not from SMTP - we are receiving a local message on
578a standard input stream. The message is always terminated by EOF, and is also
579terminated by a dot on a line by itself if the flag dot_ends is TRUE. Split the
580two cases for maximum efficiency.
581
582Ensure that the body ends with a newline. This will naturally be the case when
583the termination is "\n.\n" but may not be otherwise. The RFC defines messages
584as "sequences of lines" - this of course strictly applies only to SMTP, but
585deliveries into BSD-type mailbox files also require it. Exim used to have a
586flag for doing this at delivery time, but as it was always set for all
587transports, I decided to simplify things by putting the check here instead.
588
589There is at least one MUA (dtmail) that sends CRLF via this interface, and
590other programs are known to do this as well. Exim used to have a option for
591dealing with this: in July 2003, after much discussion, the code has been
592changed to default to treat any of LF, CRLF, and bare CR as line terminators.
593
594However, for the case when a dot on a line by itself terminates a message, the
595only recognized terminating sequences before and after the dot are LF and CRLF.
596Otherwise, having read EOL . CR, you don't know whether to read another
597character or not.
598
599Internally, in messages stored in Exim's spool files, LF is used as the line
600terminator. Under the new regime, bare CRs will no longer appear in these
601files.
602
603Arguments:
604 fout a FILE to which to write the message
605
606Returns: One of the END_xxx values indicating why it stopped reading
607*/
608
609static int
610read_message_data(FILE *fout)
611{
612int ch_state;
613register int ch;
d677b2f2 614register int linelength = 0;
059ec3d9
PH
615
616/* Handle the case when only EOF terminates the message */
617
618if (!dot_ends)
619 {
620 register int last_ch = '\n';
621
80a47a2c 622 for (; (ch = (receive_getc)()) != EOF; last_ch = ch)
059ec3d9
PH
623 {
624 if (ch == 0) body_zerocount++;
625 if (last_ch == '\r' && ch != '\n')
626 {
d677b2f2
PH
627 if (linelength > max_received_linelength)
628 max_received_linelength = linelength;
629 linelength = 0;
059ec3d9
PH
630 if (fputc('\n', fout) == EOF) return END_WERROR;
631 message_size++;
632 body_linecount++;
633 }
634 if (ch == '\r') continue;
635
636 if (fputc(ch, fout) == EOF) return END_WERROR;
d677b2f2
PH
637 if (ch == '\n')
638 {
639 if (linelength > max_received_linelength)
640 max_received_linelength = linelength;
641 linelength = 0;
642 body_linecount++;
643 }
644 else linelength++;
059ec3d9
PH
645 if (++message_size > thismessage_size_limit) return END_SIZE;
646 }
647
648 if (last_ch != '\n')
649 {
d677b2f2
PH
650 if (linelength > max_received_linelength)
651 max_received_linelength = linelength;
059ec3d9
PH
652 if (fputc('\n', fout) == EOF) return END_WERROR;
653 message_size++;
654 body_linecount++;
655 }
656
657 return END_EOF;
658 }
659
660/* Handle the case when a dot on a line on its own, or EOF, terminates. */
661
662ch_state = 1;
663
80a47a2c 664while ((ch = (receive_getc)()) != EOF)
059ec3d9
PH
665 {
666 if (ch == 0) body_zerocount++;
667 switch (ch_state)
668 {
669 case 0: /* Normal state (previous char written) */
670 if (ch == '\n')
d677b2f2
PH
671 {
672 body_linecount++;
673 if (linelength > max_received_linelength)
674 max_received_linelength = linelength;
675 linelength = -1;
676 ch_state = 1;
677 }
059ec3d9
PH
678 else if (ch == '\r')
679 { ch_state = 2; continue; }
680 break;
681
682 case 1: /* After written "\n" */
683 if (ch == '.') { ch_state = 3; continue; }
6eb02f88 684 if (ch == '\r') { ch_state = 2; continue; }
d677b2f2 685 if (ch != '\n') ch_state = 0; else linelength = -1;
059ec3d9
PH
686 break;
687
688 case 2:
689 body_linecount++; /* After unwritten "\r" */
d677b2f2
PH
690 if (linelength > max_received_linelength)
691 max_received_linelength = linelength;
059ec3d9 692 if (ch == '\n')
d677b2f2
PH
693 {
694 ch_state = 1;
695 linelength = -1;
696 }
059ec3d9
PH
697 else
698 {
699 if (message_size++, fputc('\n', fout) == EOF) return END_WERROR;
700 if (ch == '\r') continue;
701 ch_state = 0;
d677b2f2 702 linelength = 0;
059ec3d9
PH
703 }
704 break;
705
706 case 3: /* After "\n." (\n written, dot not) */
707 if (ch == '\n') return END_DOT;
708 if (ch == '\r') { ch_state = 4; continue; }
709 message_size++;
d677b2f2 710 linelength++;
059ec3d9
PH
711 if (fputc('.', fout) == EOF) return END_WERROR;
712 ch_state = 0;
713 break;
714
715 case 4: /* After "\n.\r" (\n written, rest not) */
716 if (ch == '\n') return END_DOT;
717 message_size += 2;
718 body_linecount++;
719 if (fputs(".\n", fout) == EOF) return END_WERROR;
720 if (ch == '\r') { ch_state = 2; continue; }
721 ch_state = 0;
722 break;
723 }
724
d677b2f2 725 linelength++;
059ec3d9
PH
726 if (fputc(ch, fout) == EOF) return END_WERROR;
727 if (++message_size > thismessage_size_limit) return END_SIZE;
728 }
729
730/* Get here if EOF read. Unless we have just written "\n", we need to ensure
731the message ends with a newline, and we must also write any characters that
732were saved up while testing for an ending dot. */
733
734if (ch_state != 1)
735 {
736 static uschar *ends[] = { US"\n", NULL, US"\n", US".\n", US".\n" };
737 if (fputs(CS ends[ch_state], fout) == EOF) return END_WERROR;
738 message_size += Ustrlen(ends[ch_state]);
739 body_linecount++;
740 }
741
742return END_EOF;
743}
744
745
746
747
748/*************************************************
749* Read data portion of an SMTP message *
750*************************************************/
751
752/* This function is called to read the remainder of an SMTP message (after the
753headers), or to skip over it when an error has occurred. In this case, the
754output file is passed as NULL.
755
756If any line begins with a dot, that character is skipped. The input should only
757be successfully terminated by CR LF . CR LF unless it is local (non-network)
758SMTP, in which case the CRs are optional, but...
759
760FUDGE: It seems that sites on the net send out messages with just LF
761terminators, despite the warnings in the RFCs, and other MTAs handle this. So
762we make the CRs optional in all cases.
763
764July 2003: Bare CRs cause trouble. We now treat them as line terminators as
765well, so that there are no CRs in spooled messages. However, the message
766terminating dot is not recognized between two bare CRs.
767
768Arguments:
769 fout a FILE to which to write the message; NULL if skipping
770
771Returns: One of the END_xxx values indicating why it stopped reading
772*/
773
774static int
775read_message_data_smtp(FILE *fout)
776{
777int ch_state = 0;
e4bdf652 778int ch;
7e3ce68e 779int linelength = 0;
059ec3d9 780
80a47a2c 781while ((ch = (receive_getc)()) != EOF)
059ec3d9
PH
782 {
783 if (ch == 0) body_zerocount++;
784 switch (ch_state)
785 {
786 case 0: /* After LF or CRLF */
787 if (ch == '.')
788 {
789 ch_state = 3;
790 continue; /* Don't ever write . after LF */
791 }
792 ch_state = 1;
793
794 /* Else fall through to handle as normal uschar. */
795
796 case 1: /* Normal state */
797 if (ch == '\n')
798 {
799 ch_state = 0;
800 body_linecount++;
1f5497b2
PH
801 if (linelength > max_received_linelength)
802 max_received_linelength = linelength;
803 linelength = -1;
059ec3d9
PH
804 }
805 else if (ch == '\r')
806 {
807 ch_state = 2;
808 continue;
809 }
810 break;
811
812 case 2: /* After (unwritten) CR */
813 body_linecount++;
1f5497b2
PH
814 if (linelength > max_received_linelength)
815 max_received_linelength = linelength;
816 linelength = -1;
059ec3d9
PH
817 if (ch == '\n')
818 {
819 ch_state = 0;
820 }
821 else
822 {
823 message_size++;
824 if (fout != NULL && fputc('\n', fout) == EOF) return END_WERROR;
e4bdf652 825 (void) cutthrough_put_nl();
059ec3d9
PH
826 if (ch != '\r') ch_state = 1; else continue;
827 }
828 break;
829
830 case 3: /* After [CR] LF . */
831 if (ch == '\n')
832 return END_DOT;
833 if (ch == '\r')
834 {
835 ch_state = 4;
836 continue;
837 }
1bc460a6
JH
838 /* The dot was removed at state 3. For a doubled dot, here, reinstate
839 it to cutthrough. The current ch, dot or not, is passed both to cutthrough
840 and to file below. */
841 if (ch == '.')
842 {
843 uschar c= ch;
844 (void) cutthrough_puts(&c, 1);
845 }
846 ch_state = 1;
059ec3d9
PH
847 break;
848
849 case 4: /* After [CR] LF . CR */
850 if (ch == '\n') return END_DOT;
851 message_size++;
852 body_linecount++;
853 if (fout != NULL && fputc('\n', fout) == EOF) return END_WERROR;
e4bdf652 854 (void) cutthrough_put_nl();
059ec3d9
PH
855 if (ch == '\r')
856 {
857 ch_state = 2;
858 continue;
859 }
860 ch_state = 1;
861 break;
862 }
863
864 /* Add the character to the spool file, unless skipping; then loop for the
865 next. */
866
867 message_size++;
1f5497b2 868 linelength++;
7e3ce68e 869 if (fout)
059ec3d9
PH
870 {
871 if (fputc(ch, fout) == EOF) return END_WERROR;
872 if (message_size > thismessage_size_limit) return END_SIZE;
873 }
e4bdf652
JH
874 if(ch == '\n')
875 (void) cutthrough_put_nl();
876 else
877 {
7e3ce68e 878 uschar c = ch;
e4bdf652
JH
879 (void) cutthrough_puts(&c, 1);
880 }
059ec3d9
PH
881 }
882
883/* Fall through here if EOF encountered. This indicates some kind of error,
884since a correct message is terminated by [CR] LF . [CR] LF. */
885
886return END_EOF;
887}
888
889
890
891
7e3ce68e
JH
892/* Variant of the above read_message_data_smtp() specialised for RFC 3030
893CHUNKING. We assume that the incoming has proper CRLF, so only have to scan
894for and strip CR. On the downside there are more protocol reasons to stop.
895
896Arguments:
897 fout a FILE to which to write the message; NULL if skipping
898
899Returns: One of the END_xxx values indicating why it stopped reading
900*/
901
902static int
903read_message_bdat_smtp(FILE *fout)
904{
905int ch;
906int linelength = 0;
907
908for (;;) switch (ch = bdat_getc())
909 {
910 case EOF: return END_EOF;
911 case EOD: return END_DOT;
912 case ERR: return END_PROTOCOL;
913
914 case '\r':
915 body_linecount++;
916 if (linelength > max_received_linelength)
917 max_received_linelength = linelength;
918 linelength = -1;
919 break;
920
921 case 0:
922 body_zerocount++;
923 /*FALLTHROUGH*/
924 default:
925 message_size++;
926 linelength++;
927 if (fout)
928 {
929 if (fputc(ch, fout) == EOF) return END_WERROR;
930 if (message_size > thismessage_size_limit) return END_SIZE;
931 }
932#ifdef notyet
933 if(ch == '\n')
934 (void) cutthrough_put_nl();
935 else
936 {
937 uschar c = ch;
938 (void) cutthrough_puts(&c, 1);
939 }
940#endif
941 break;
942 }
943/*NOTREACHED*/
944}
945
946
947
948
059ec3d9
PH
949/*************************************************
950* Swallow SMTP message *
951*************************************************/
952
953/* This function is called when there has been some kind of error while reading
954an SMTP message, and the remaining data may need to be swallowed. It is global
955because it is called from smtp_closedown() to shut down an incoming call
956tidily.
957
958Argument: a FILE from which to read the message
959Returns: nothing
960*/
961
962void
963receive_swallow_smtp(void)
964{
7e3ce68e 965/*XXX CHUNKING: not enough. read chunks until RSET? */
059ec3d9
PH
966if (message_ended >= END_NOTENDED)
967 message_ended = read_message_data_smtp(NULL);
968}
969
970
971
972/*************************************************
973* Handle lost SMTP connection *
974*************************************************/
975
976/* This function logs connection loss incidents and generates an appropriate
977SMTP response.
978
979Argument: additional data for the message
980Returns: the SMTP response
981*/
982
983static uschar *
984handle_lost_connection(uschar *s)
985{
986log_write(L_lost_incoming_connection | L_smtp_connection, LOG_MAIN,
987 "%s lost while reading message data%s", smtp_get_connection_info(), s);
988return US"421 Lost incoming connection";
989}
990
991
992
993
994/*************************************************
995* Handle a non-smtp reception error *
996*************************************************/
997
998/* This function is called for various errors during the reception of non-SMTP
999messages. It either sends a message to the sender of the problem message, or it
1000writes to the standard error stream.
1001
1002Arguments:
1003 errcode code for moan_to_sender(), identifying the error
1004 text1 first message text, passed to moan_to_sender()
1005 text2 second message text, used only for stderrr
1006 error_rc code to pass to exim_exit if no problem
1007 f FILE containing body of message (may be stdin)
1008 hptr pointer to instore headers or NULL
1009
1010Returns: calls exim_exit(), which does not return
1011*/
1012
1013static void
1014give_local_error(int errcode, uschar *text1, uschar *text2, int error_rc,
1015 FILE *f, header_line *hptr)
1016{
1017if (error_handling == ERRORS_SENDER)
1018 {
1019 error_block eblock;
1020 eblock.next = NULL;
1021 eblock.text1 = text1;
37f3dc43 1022 eblock.text2 = US"";
059ec3d9
PH
1023 if (!moan_to_sender(errcode, &eblock, hptr, f, FALSE))
1024 error_rc = EXIT_FAILURE;
1025 }
37f3dc43
JH
1026else
1027 fprintf(stderr, "exim: %s%s\n", text2, text1); /* Sic */
f1e894f3 1028(void)fclose(f);
059ec3d9
PH
1029exim_exit(error_rc);
1030}
1031
1032
1033
1034/*************************************************
1035* Add header lines set up by ACL *
1036*************************************************/
1037
850635b6
PH
1038/* This function is called to add the header lines that were set up by
1039statements in an ACL to the list of headers in memory. It is done in two stages
1040like this, because when the ACL for RCPT is running, the other headers have not
1041yet been received. This function is called twice; once just before running the
1042DATA ACL, and once after. This is so that header lines added by MAIL or RCPT
1043are visible to the DATA ACL.
059ec3d9
PH
1044
1045Originally these header lines were added at the end. Now there is support for
1046three different places: top, bottom, and after the Received: header(s). There
1047will always be at least one Received: header, even if it is marked deleted, and
1048even if something else has been put in front of it.
1049
1050Arguments:
1051 acl_name text to identify which ACL
1052
1053Returns: nothing
1054*/
1055
1056static void
578d43dc 1057add_acl_headers(int where, uschar *acl_name)
059ec3d9
PH
1058{
1059header_line *h, *next;
1060header_line *last_received = NULL;
e7568d51 1061
578d43dc
JH
1062switch(where)
1063 {
1064 case ACL_WHERE_DKIM:
1065 case ACL_WHERE_MIME:
af4a1bca 1066 case ACL_WHERE_DATA:
5032d1cf 1067 if (cutthrough.fd >= 0 && (acl_removed_headers || acl_added_headers))
578d43dc
JH
1068 {
1069 log_write(0, LOG_MAIN|LOG_PANIC, "Header modification in data ACLs"
af4a1bca 1070 " will not take effect on cutthrough deliveries");
578d43dc
JH
1071 return;
1072 }
1073 }
1074
e7568d51
TL
1075if (acl_removed_headers != NULL)
1076 {
1077 DEBUG(D_receive|D_acl) debug_printf(">>Headers removed by %s ACL:\n", acl_name);
1078
4a142059 1079 for (h = header_list; h != NULL; h = h->next) if (h->type != htype_old)
e7568d51 1080 {
55414b25 1081 const uschar * list = acl_removed_headers;
e7568d51
TL
1082 int sep = ':'; /* This is specified as a colon-separated list */
1083 uschar *s;
1084 uschar buffer[128];
4a142059
JH
1085
1086 while ((s = string_nextinlist(&list, &sep, buffer, sizeof(buffer))))
1087 if (header_testname(h, s, Ustrlen(s), FALSE))
e7568d51
TL
1088 {
1089 h->type = htype_old;
1090 DEBUG(D_receive|D_acl) debug_printf(" %s", h->text);
1091 }
e7568d51
TL
1092 }
1093 acl_removed_headers = NULL;
1094 DEBUG(D_receive|D_acl) debug_printf(">>\n");
1095 }
059ec3d9 1096
71fafd95 1097if (acl_added_headers == NULL) return;
059ec3d9
PH
1098DEBUG(D_receive|D_acl) debug_printf(">>Headers added by %s ACL:\n", acl_name);
1099
71fafd95 1100for (h = acl_added_headers; h != NULL; h = next)
059ec3d9
PH
1101 {
1102 next = h->next;
1103
1104 switch(h->type)
1105 {
1106 case htype_add_top:
1107 h->next = header_list;
1108 header_list = h;
1109 DEBUG(D_receive|D_acl) debug_printf(" (at top)");
1110 break;
1111
1112 case htype_add_rec:
1113 if (last_received == NULL)
1114 {
1115 last_received = header_list;
1116 while (!header_testname(last_received, US"Received", 8, FALSE))
1117 last_received = last_received->next;
1118 while (last_received->next != NULL &&
1119 header_testname(last_received->next, US"Received", 8, FALSE))
1120 last_received = last_received->next;
1121 }
1122 h->next = last_received->next;
1123 last_received->next = h;
1124 DEBUG(D_receive|D_acl) debug_printf(" (after Received:)");
1125 break;
1126
8523533c
TK
1127 case htype_add_rfc:
1128 /* add header before any header which is NOT Received: or Resent- */
1129 last_received = header_list;
1130 while ( (last_received->next != NULL) &&
1131 ( (header_testname(last_received->next, US"Received", 8, FALSE)) ||
1132 (header_testname_incomplete(last_received->next, US"Resent-", 7, FALSE)) ) )
1133 last_received = last_received->next;
1134 /* last_received now points to the last Received: or Resent-* header
1135 in an uninterrupted chain of those header types (seen from the beginning
1136 of all headers. Our current header must follow it. */
1137 h->next = last_received->next;
1138 last_received->next = h;
8e669ac1 1139 DEBUG(D_receive|D_acl) debug_printf(" (before any non-Received: or Resent-*: header)");
8523533c
TK
1140 break;
1141
059ec3d9
PH
1142 default:
1143 h->next = NULL;
1144 header_last->next = h;
1145 break;
1146 }
1147
1148 if (h->next == NULL) header_last = h;
1149
1150 /* Check for one of the known header types (From:, To:, etc.) though in
1151 practice most added headers are going to be "other". Lower case
1152 identification letters are never stored with the header; they are used
1153 for existence tests when messages are received. So discard any lower case
1154 flag values. */
1155
1156 h->type = header_checkname(h, FALSE);
1157 if (h->type >= 'a') h->type = htype_other;
1158
1159 DEBUG(D_receive|D_acl) debug_printf(" %s", header_last->text);
1160 }
1161
71fafd95 1162acl_added_headers = NULL;
059ec3d9
PH
1163DEBUG(D_receive|D_acl) debug_printf(">>\n");
1164}
1165
1166
1167
1168/*************************************************
1169* Add host information for log line *
1170*************************************************/
1171
1172/* Called for acceptance and rejecting log lines. This adds information about
1173the calling host to a string that is being built dynamically.
1174
1175Arguments:
1176 s the dynamic string
1177 sizeptr points to the size variable
1178 ptrptr points to the pointer variable
1179
1180Returns: the extended string
1181*/
1182
1183static uschar *
fc16abb4 1184add_host_info_for_log(uschar * s, int * sizeptr, int * ptrptr)
059ec3d9 1185{
fc16abb4 1186if (sender_fullhost)
059ec3d9 1187 {
fc16abb4
JH
1188 if (LOGGING(dnssec) && sender_host_dnssec) /*XXX sender_helo_dnssec? */
1189 s = string_cat(s, sizeptr, ptrptr, US" DS");
059ec3d9 1190 s = string_append(s, sizeptr, ptrptr, 2, US" H=", sender_fullhost);
6c6d6e48 1191 if (LOGGING(incoming_interface) && interface_address != NULL)
059ec3d9 1192 {
fc16abb4
JH
1193 s = string_cat(s, sizeptr, ptrptr,
1194 string_sprintf(" I=[%s]:%d", interface_address, interface_port));
059ec3d9
PH
1195 }
1196 }
1197if (sender_ident != NULL)
1198 s = string_append(s, sizeptr, ptrptr, 2, US" U=", sender_ident);
1199if (received_protocol != NULL)
1200 s = string_append(s, sizeptr, ptrptr, 2, US" P=", received_protocol);
1201return s;
1202}
1203
1204
1205
63955bf2 1206#ifdef WITH_CONTENT_SCAN
059ec3d9 1207
54cdb463
PH
1208/*************************************************
1209* Run the MIME ACL on a message *
1210*************************************************/
1211
1212/* This code is in a subroutine so that it can be used for both SMTP
1213and non-SMTP messages. It is called with a non-NULL ACL pointer.
1214
1215Arguments:
1216 acl The ACL to run (acl_smtp_mime or acl_not_smtp_mime)
1217 smtp_yield_ptr Set FALSE to kill messages after dropped connection
1218 smtp_reply_ptr Where SMTP reply is being built
1219 blackholed_by_ptr Where "blackholed by" message is being built
1220
1221Returns: TRUE to carry on; FALSE to abandon the message
1222*/
1223
1224static BOOL
1225run_mime_acl(uschar *acl, BOOL *smtp_yield_ptr, uschar **smtp_reply_ptr,
1226 uschar **blackholed_by_ptr)
1227{
1228FILE *mbox_file;
1229uschar rfc822_file_path[2048];
1230unsigned long mbox_size;
1231header_line *my_headerlist;
1232uschar *user_msg, *log_msg;
1233int mime_part_count_buffer = -1;
7156b1ef 1234int rc = OK;
54cdb463
PH
1235
1236memset(CS rfc822_file_path,0,2048);
1237
1238/* check if it is a MIME message */
1239my_headerlist = header_list;
4e88a19f
PH
1240while (my_headerlist != NULL)
1241 {
54cdb463 1242 /* skip deleted headers */
4e88a19f
PH
1243 if (my_headerlist->type == '*')
1244 {
54cdb463
PH
1245 my_headerlist = my_headerlist->next;
1246 continue;
4e88a19f
PH
1247 }
1248 if (strncmpic(my_headerlist->text, US"Content-Type:", 13) == 0)
1249 {
54cdb463
PH
1250 DEBUG(D_receive) debug_printf("Found Content-Type: header - executing acl_smtp_mime.\n");
1251 goto DO_MIME_ACL;
4e88a19f 1252 }
54cdb463 1253 my_headerlist = my_headerlist->next;
4e88a19f 1254 }
54cdb463
PH
1255
1256DEBUG(D_receive) debug_printf("No Content-Type: header - presumably not a MIME message.\n");
1257return TRUE;
1258
1259DO_MIME_ACL:
1260/* make sure the eml mbox file is spooled up */
8544e77a 1261mbox_file = spool_mbox(&mbox_size, NULL);
54cdb463
PH
1262if (mbox_file == NULL) {
1263 /* error while spooling */
1264 log_write(0, LOG_MAIN|LOG_PANIC,
1265 "acl_smtp_mime: error while creating mbox spool file, message temporarily rejected.");
1266 Uunlink(spool_name);
1267 unspool_mbox();
6f0c431a
PP
1268#ifdef EXPERIMENTAL_DCC
1269 dcc_ok = 0;
1270#endif
a5bd321b 1271 smtp_respond(US"451", 3, TRUE, US"temporary local problem");
54cdb463
PH
1272 message_id[0] = 0; /* Indicate no message accepted */
1273 *smtp_reply_ptr = US""; /* Indicate reply already sent */
1274 return FALSE; /* Indicate skip to end of receive function */
1275};
1276
1277mime_is_rfc822 = 0;
1278
1279MIME_ACL_CHECK:
1280mime_part_count = -1;
1281rc = mime_acl_check(acl, mbox_file, NULL, &user_msg, &log_msg);
f1e894f3 1282(void)fclose(mbox_file);
54cdb463 1283
4e88a19f
PH
1284if (Ustrlen(rfc822_file_path) > 0)
1285 {
54cdb463
PH
1286 mime_part_count = mime_part_count_buffer;
1287
4e88a19f
PH
1288 if (unlink(CS rfc822_file_path) == -1)
1289 {
54cdb463
PH
1290 log_write(0, LOG_PANIC,
1291 "acl_smtp_mime: can't unlink RFC822 spool file, skipping.");
1292 goto END_MIME_ACL;
4e88a19f
PH
1293 }
1294 }
54cdb463
PH
1295
1296/* check if we must check any message/rfc822 attachments */
4e88a19f
PH
1297if (rc == OK)
1298 {
54cdb463 1299 uschar temp_path[1024];
e8bc7fca
JH
1300 struct dirent * entry;
1301 DIR * tempdir;
54cdb463 1302
e8bc7fca
JH
1303 (void) string_format(temp_path, sizeof(temp_path), "%s/scan/%s",
1304 spool_directory, message_id);
54cdb463 1305
4e88a19f 1306 tempdir = opendir(CS temp_path);
e8bc7fca 1307 for (;;)
4e88a19f 1308 {
e8bc7fca
JH
1309 if (!(entry = readdir(tempdir)))
1310 break;
1311 if (strncmpic(US entry->d_name, US"__rfc822_", 9) == 0)
4e88a19f 1312 {
e8bc7fca
JH
1313 (void) string_format(rfc822_file_path, sizeof(rfc822_file_path),
1314 "%s/scan/%s/%s", spool_directory, message_id, entry->d_name);
1315 debug_printf("RFC822 attachment detected: running MIME ACL for '%s'\n",
1316 rfc822_file_path);
4e88a19f
PH
1317 break;
1318 }
e8bc7fca 1319 }
4e88a19f 1320 closedir(tempdir);
54cdb463 1321
e8bc7fca 1322 if (entry)
4e88a19f 1323 {
e8bc7fca 1324 if ((mbox_file = Ufopen(rfc822_file_path, "rb")))
4e88a19f 1325 {
e8bc7fca
JH
1326 /* set RFC822 expansion variable */
1327 mime_is_rfc822 = 1;
1328 mime_part_count_buffer = mime_part_count;
1329 goto MIME_ACL_CHECK;
4e88a19f 1330 }
e8bc7fca
JH
1331 log_write(0, LOG_PANIC,
1332 "acl_smtp_mime: can't open RFC822 spool file, skipping.");
1333 unlink(CS rfc822_file_path);
4e88a19f
PH
1334 }
1335 }
54cdb463
PH
1336
1337END_MIME_ACL:
578d43dc 1338add_acl_headers(ACL_WHERE_MIME, US"MIME");
54cdb463
PH
1339if (rc == DISCARD)
1340 {
1341 recipients_count = 0;
1342 *blackholed_by_ptr = US"MIME ACL";
1343 }
1344else if (rc != OK)
1345 {
1346 Uunlink(spool_name);
1347 unspool_mbox();
6f0c431a
PP
1348#ifdef EXPERIMENTAL_DCC
1349 dcc_ok = 0;
1350#endif
4f6ae5c3
JH
1351 if ( smtp_input
1352 && smtp_handle_acl_fail(ACL_WHERE_MIME, rc, user_msg, log_msg) != 0)
1353 {
85ffcba6 1354 *smtp_yield_ptr = FALSE; /* No more messages after dropped connection */
f4c1088b 1355 *smtp_reply_ptr = US""; /* Indicate reply already sent */
4f6ae5c3 1356 }
54cdb463
PH
1357 message_id[0] = 0; /* Indicate no message accepted */
1358 return FALSE; /* Cause skip to end of receive function */
4e88a19f 1359 }
54cdb463
PH
1360
1361return TRUE;
1362}
1363
63955bf2 1364#endif /* WITH_CONTENT_SCAN */
54cdb463
PH
1365
1366
e4bdf652
JH
1367
1368void
1369received_header_gen(void)
1370{
1371uschar *received;
1372uschar *timestamp;
1373header_line *received_header= header_list;
1374
1375timestamp = expand_string(US"${tod_full}");
1376if (recipients_count == 1) received_for = recipients_list[0].address;
1377received = expand_string(received_header_text);
1378received_for = NULL;
1379
d4ff61d1 1380if (!received)
e4bdf652
JH
1381 {
1382 if(spool_name[0] != 0)
1383 Uunlink(spool_name); /* Lose the data file */
1384 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Expansion of \"%s\" "
1385 "(received_header_text) failed: %s", string_printing(received_header_text),
1386 expand_string_message);
1387 }
1388
1389/* The first element on the header chain is reserved for the Received header,
1390so all we have to do is fill in the text pointer, and set the type. However, if
1391the result of the expansion is an empty string, we leave the header marked as
1392"old" so as to refrain from adding a Received header. */
1393
1394if (received[0] == 0)
1395 {
1396 received_header->text = string_sprintf("Received: ; %s\n", timestamp);
1397 received_header->type = htype_old;
1398 }
1399else
1400 {
1401 received_header->text = string_sprintf("%s; %s\n", received, timestamp);
1402 received_header->type = htype_received;
1403 }
1404
1405received_header->slen = Ustrlen(received_header->text);
1406
1407DEBUG(D_receive) debug_printf(">>Generated Received: header line\n%c %s",
1408 received_header->type, received_header->text);
1409}
1410
1411
1412
059ec3d9
PH
1413/*************************************************
1414* Receive message *
1415*************************************************/
1416
1417/* Receive a message on the given input, and put it into a pair of spool files.
1418Either a non-null list of recipients, or the extract flag will be true, or
1419both. The flag sender_local is true for locally generated messages. The flag
1420submission_mode is true if an ACL has obeyed "control = submission". The flag
8800895a 1421suppress_local_fixups is true if an ACL has obeyed "control =
f4ee74ac
PP
1422suppress_local_fixups" or -G was passed on the command-line.
1423The flag smtp_input is true if the message is to be
8800895a
PH
1424handled using SMTP conventions about termination and lines starting with dots.
1425For non-SMTP messages, dot_ends is true for dot-terminated messages.
059ec3d9
PH
1426
1427If a message was successfully read, message_id[0] will be non-zero.
1428
1429The general actions of this function are:
1430
1431 . Read the headers of the message (if any) into a chain of store
1432 blocks.
1433
1434 . If there is a "sender:" header and the message is locally originated,
69358f02
PH
1435 throw it away, unless the caller is trusted, or unless
1436 active_local_sender_retain is set - which can only happen if
1437 active_local_from_check is false.
059ec3d9
PH
1438
1439 . If recipients are to be extracted from the message, build the
1440 recipients list from the headers, removing any that were on the
1441 original recipients list (unless extract_addresses_remove_arguments is
1442 false), and at the same time, remove any bcc header that may be present.
1443
1444 . Get the spool file for the data, sort out its unique name, open
1445 and lock it (but don't give it the name yet).
1446
1447 . Generate a "Message-Id" header if the message doesn't have one, for
1448 locally-originated messages.
1449
1450 . Generate a "Received" header.
1451
1452 . Ensure the recipients list is fully qualified and rewritten if necessary.
1453
1454 . If there are any rewriting rules, apply them to the sender address
1455 and also to the headers.
1456
1457 . If there is no from: header, generate one, for locally-generated messages
1458 and messages in "submission mode" only.
1459
1460 . If the sender is local, check that from: is correct, and if not, generate
1461 a Sender: header, unless message comes from a trusted caller, or this
69358f02 1462 feature is disabled by active_local_from_check being false.
059ec3d9
PH
1463
1464 . If there is no "date" header, generate one, for locally-originated
1465 or submission mode messages only.
1466
1467 . Copy the rest of the input, or up to a terminating "." if in SMTP or
1468 dot_ends mode, to the data file. Leave it open, to hold the lock.
1469
1470 . Write the envelope and the headers to a new file.
1471
1472 . Set the name for the header file; close it.
1473
1474 . Set the name for the data file; close it.
1475
1476Because this function can potentially be called many times in a single
1477SMTP connection, all store should be got by store_get(), so that it will be
1478automatically retrieved after the message is accepted.
1479
1480FUDGE: It seems that sites on the net send out messages with just LF
1481terminators, despite the warnings in the RFCs, and other MTAs handle this. So
1482we make the CRs optional in all cases.
1483
1484July 2003: Bare CRs in messages, especially in header lines, cause trouble. A
1485new regime is now in place in which bare CRs in header lines are turned into LF
1486followed by a space, so as not to terminate the header line.
1487
1488February 2004: A bare LF in a header line in a message whose first line was
1489terminated by CRLF is treated in the same way as a bare CR.
1490
1491Arguments:
1492 extract_recip TRUE if recipients are to be extracted from the message's
1493 headers
1494
1495Returns: TRUE there are more messages to be read (SMTP input)
1496 FALSE there are no more messages to be read (non-SMTP input
1497 or SMTP connection collapsed, or other failure)
1498
1499When reading a message for filter testing, the returned value indicates
1500whether the headers (which is all that is read) were terminated by '.' or
1501not. */
1502
1503BOOL
1504receive_msg(BOOL extract_recip)
1505{
7156b1ef
NM
1506int i;
1507int rc = FAIL;
059ec3d9
PH
1508int msg_size = 0;
1509int process_info_len = Ustrlen(process_info);
1510int error_rc = (error_handling == ERRORS_SENDER)?
1511 errors_sender_rc : EXIT_FAILURE;
1512int header_size = 256;
1513int start, end, domain, size, sptr;
1514int id_resolution;
1515int had_zero = 0;
d677b2f2 1516int prevlines_length = 0;
059ec3d9
PH
1517
1518register int ptr = 0;
1519
1520BOOL contains_resent_headers = FALSE;
1521BOOL extracted_ignored = FALSE;
1522BOOL first_line_ended_crlf = TRUE_UNSET;
1523BOOL smtp_yield = TRUE;
1524BOOL yield = FALSE;
1525
1526BOOL resents_exist = FALSE;
1527uschar *resent_prefix = US"";
1528uschar *blackholed_by = NULL;
04f7d5b9 1529uschar *blackhole_log_msg = US"";
c5430c20 1530enum {NOT_TRIED, TMP_REJ, PERM_REJ, ACCEPTED} cutthrough_done = NOT_TRIED;
059ec3d9
PH
1531
1532flock_t lock_data;
1533error_block *bad_addresses = NULL;
1534
1535uschar *frozen_by = NULL;
1536uschar *queued_by = NULL;
1537
1538uschar *errmsg, *s;
1539struct stat statbuf;
1540
4e88a19f 1541/* Final message to give to SMTP caller, and messages from ACLs */
059ec3d9
PH
1542
1543uschar *smtp_reply = NULL;
4e88a19f 1544uschar *user_msg, *log_msg;
059ec3d9
PH
1545
1546/* Working header pointers */
1547
1548header_line *h, *next;
1549
2cbb4081 1550/* Flags for noting the existence of certain headers (only one left) */
059ec3d9
PH
1551
1552BOOL date_header_exists = FALSE;
1553
1554/* Pointers to receive the addresses of headers whose contents we need. */
1555
1556header_line *from_header = NULL;
1557header_line *subject_header = NULL;
1558header_line *msgid_header = NULL;
1559header_line *received_header;
1560
4840604e
TL
1561#ifdef EXPERIMENTAL_DMARC
1562int dmarc_up = 0;
1563#endif /* EXPERIMENTAL_DMARC */
1564
059ec3d9
PH
1565/* Variables for use when building the Received: header. */
1566
059ec3d9
PH
1567uschar *timestamp;
1568int tslen;
1569
1570/* Release any open files that might have been cached while preparing to
1571accept the message - e.g. by verifying addresses - because reading a message
1572might take a fair bit of real time. */
1573
1574search_tidyup();
1575
e4bdf652
JH
1576/* Extracting the recipient list from an input file is incompatible with
1577cutthrough delivery with the no-spool option. It shouldn't be possible
817d9f57 1578to set up the combination, but just in case kill any ongoing connection. */
e4bdf652 1579if (extract_recip || !smtp_input)
2e5b33cd 1580 cancel_cutthrough_connection("not smtp input");
e4bdf652 1581
059ec3d9
PH
1582/* Initialize the chain of headers by setting up a place-holder for Received:
1583header. Temporarily mark it as "old", i.e. not to be used. We keep header_last
1584pointing to the end of the chain to make adding headers simple. */
1585
1586received_header = header_list = header_last = store_get(sizeof(header_line));
1587header_list->next = NULL;
1588header_list->type = htype_old;
1589header_list->text = NULL;
1590header_list->slen = 0;
1591
1592/* Control block for the next header to be read. */
1593
1594next = store_get(sizeof(header_line));
1595next->text = store_get(header_size);
1596
1597/* Initialize message id to be null (indicating no message read), and the
1598header names list to be the normal list. Indicate there is no data file open
1599yet, initialize the size and warning count, and deal with no size limit. */
1600
1601message_id[0] = 0;
1602data_file = NULL;
1603data_fd = -1;
41313d92 1604spool_name = US"";
059ec3d9
PH
1605message_size = 0;
1606warning_count = 0;
d677b2f2 1607received_count = 1; /* For the one we will add */
059ec3d9
PH
1608
1609if (thismessage_size_limit <= 0) thismessage_size_limit = INT_MAX;
1610
2e0c1448 1611/* While reading the message, the following counts are computed. */
059ec3d9 1612
d677b2f2
PH
1613message_linecount = body_linecount = body_zerocount =
1614 max_received_linelength = 0;
059ec3d9 1615
80a47a2c
TK
1616#ifndef DISABLE_DKIM
1617/* Call into DKIM to set up the context. */
1618if (smtp_input && !smtp_batched_input && !dkim_disable_verify) dkim_exim_verify_init();
fb2274d4
TK
1619#endif
1620
4840604e
TL
1621#ifdef EXPERIMENTAL_DMARC
1622/* initialize libopendmarc */
1623dmarc_up = dmarc_init();
1624#endif
1625
059ec3d9
PH
1626/* Remember the time of reception. Exim uses time+pid for uniqueness of message
1627ids, and fractions of a second are required. See the comments that precede the
1628message id creation below. */
1629
1630(void)gettimeofday(&message_id_tv, NULL);
1631
1632/* For other uses of the received time we can operate with granularity of one
1633second, and for that we use the global variable received_time. This is for
1634things like ultimate message timeouts. */
1635
1636received_time = message_id_tv.tv_sec;
1637
1638/* If SMTP input, set the special handler for timeouts. The alarm() calls
1639happen in the smtp_getc() function when it refills its buffer. */
1640
1641if (smtp_input) os_non_restarting_signal(SIGALRM, data_timeout_handler);
1642
1643/* If not SMTP input, timeout happens only if configured, and we just set a
1644single timeout for the whole message. */
1645
1646else if (receive_timeout > 0)
1647 {
1648 os_non_restarting_signal(SIGALRM, data_timeout_handler);
1649 alarm(receive_timeout);
1650 }
1651
1652/* SIGTERM and SIGINT are caught always. */
1653
1654signal(SIGTERM, data_sigterm_sigint_handler);
1655signal(SIGINT, data_sigterm_sigint_handler);
1656
1657/* Header lines in messages are not supposed to be very long, though when
1658unfolded, to: and cc: headers can take up a lot of store. We must also cope
1659with the possibility of junk being thrown at us. Start by getting 256 bytes for
1660storing the header, and extend this as necessary using string_cat().
1661
1662To cope with total lunacies, impose an upper limit on the length of the header
1663section of the message, as otherwise the store will fill up. We must also cope
1664with the possibility of binary zeros in the data. Hence we cannot use fgets().
1665Folded header lines are joined into one string, leaving the '\n' characters
1666inside them, so that writing them out reproduces the input.
1667
1668Loop for each character of each header; the next structure for chaining the
1669header is set up already, with ptr the offset of the next character in
1670next->text. */
1671
1672for (;;)
1673 {
80a47a2c 1674 int ch = (receive_getc)();
059ec3d9
PH
1675
1676 /* If we hit EOF on a SMTP connection, it's an error, since incoming
1677 SMTP must have a correct "." terminator. */
1678
1679 if (ch == EOF && smtp_input /* && !smtp_batched_input */)
1680 {
1681 smtp_reply = handle_lost_connection(US" (header)");
1682 smtp_yield = FALSE;
1683 goto TIDYUP; /* Skip to end of function */
1684 }
1685
1686 /* See if we are at the current header's size limit - there must be at least
1687 four bytes left. This allows for the new character plus a zero, plus two for
1688 extra insertions when we are playing games with dots and carriage returns. If
1689 we are at the limit, extend the text buffer. This could have been done
1690 automatically using string_cat() but because this is a tightish loop storing
1691 only one character at a time, we choose to do it inline. Normally
1692 store_extend() will be able to extend the block; only at the end of a big
1693 store block will a copy be needed. To handle the case of very long headers
1694 (and sometimes lunatic messages can have ones that are 100s of K long) we
1695 call store_release() for strings that have been copied - if the string is at
1696 the start of a block (and therefore the only thing in it, because we aren't
1697 doing any other gets), the block gets freed. We can only do this because we
1698 know there are no other calls to store_get() going on. */
1699
1700 if (ptr >= header_size - 4)
1701 {
1702 int oldsize = header_size;
1703 /* header_size += 256; */
1704 header_size *= 2;
1705 if (!store_extend(next->text, oldsize, header_size))
1706 {
1707 uschar *newtext = store_get(header_size);
1708 memcpy(newtext, next->text, ptr);
1709 store_release(next->text);
1710 next->text = newtext;
1711 }
1712 }
1713
1714 /* Cope with receiving a binary zero. There is dispute about whether
1715 these should be allowed in RFC 822 messages. The middle view is that they
1716 should not be allowed in headers, at least. Exim takes this attitude at
1717 the moment. We can't just stomp on them here, because we don't know that
1718 this line is a header yet. Set a flag to cause scanning later. */
1719
1720 if (ch == 0) had_zero++;
1721
1722 /* Test for termination. Lines in remote SMTP are terminated by CRLF, while
1723 those from data files use just LF. Treat LF in local SMTP input as a
1724 terminator too. Treat EOF as a line terminator always. */
1725
1726 if (ch == EOF) goto EOL;
1727
1728 /* FUDGE: There are sites out there that don't send CRs before their LFs, and
1729 other MTAs accept this. We are therefore forced into this "liberalisation"
1730 too, so we accept LF as a line terminator whatever the source of the message.
1731 However, if the first line of the message ended with a CRLF, we treat a bare
1732 LF specially by inserting a white space after it to ensure that the header
1733 line is not terminated. */
1734
1735 if (ch == '\n')
1736 {
1737 if (first_line_ended_crlf == TRUE_UNSET) first_line_ended_crlf = FALSE;
80a47a2c 1738 else if (first_line_ended_crlf) receive_ungetc(' ');
059ec3d9
PH
1739 goto EOL;
1740 }
1741
1742 /* This is not the end of the line. If this is SMTP input and this is
1743 the first character in the line and it is a "." character, ignore it.
1744 This implements the dot-doubling rule, though header lines starting with
1745 dots aren't exactly common. They are legal in RFC 822, though. If the
1746 following is CRLF or LF, this is the line that that terminates the
1747 entire message. We set message_ended to indicate this has happened (to
1748 prevent further reading), and break out of the loop, having freed the
1749 empty header, and set next = NULL to indicate no data line. */
1750
1751 if (ptr == 0 && ch == '.' && (smtp_input || dot_ends))
1752 {
80a47a2c 1753 ch = (receive_getc)();
059ec3d9
PH
1754 if (ch == '\r')
1755 {
80a47a2c 1756 ch = (receive_getc)();
059ec3d9
PH
1757 if (ch != '\n')
1758 {
80a47a2c 1759 receive_ungetc(ch);
059ec3d9
PH
1760 ch = '\r'; /* Revert to CR */
1761 }
1762 }
1763 if (ch == '\n')
1764 {
1765 message_ended = END_DOT;
1766 store_reset(next);
1767 next = NULL;
1768 break; /* End character-reading loop */
1769 }
1770
1771 /* For non-SMTP input, the dot at the start of the line was really a data
1772 character. What is now in ch is the following character. We guaranteed
1773 enough space for this above. */
1774
1775 if (!smtp_input)
1776 {
1777 next->text[ptr++] = '.';
1778 message_size++;
1779 }
1780 }
1781
1782 /* If CR is immediately followed by LF, end the line, ignoring the CR, and
1783 remember this case if this is the first line ending. */
1784
1785 if (ch == '\r')
1786 {
80a47a2c 1787 ch = (receive_getc)();
059ec3d9
PH
1788 if (ch == '\n')
1789 {
1790 if (first_line_ended_crlf == TRUE_UNSET) first_line_ended_crlf = TRUE;
1791 goto EOL;
1792 }
1793
1794 /* Otherwise, put back the character after CR, and turn the bare CR
1795 into LF SP. */
1796
80a47a2c 1797 ch = (receive_ungetc)(ch);
059ec3d9
PH
1798 next->text[ptr++] = '\n';
1799 message_size++;
1800 ch = ' ';
1801 }
1802
1803 /* We have a data character for the header line. */
1804
1805 next->text[ptr++] = ch; /* Add to buffer */
1806 message_size++; /* Total message size so far */
1807
1808 /* Handle failure due to a humungously long header section. The >= allows
1809 for the terminating \n. Add what we have so far onto the headers list so
1810 that it gets reflected in any error message, and back up the just-read
1811 character. */
1812
1813 if (message_size >= header_maxsize)
1814 {
1815 next->text[ptr] = 0;
1816 next->slen = ptr;
1817 next->type = htype_other;
1818 next->next = NULL;
1819 header_last->next = next;
1820 header_last = next;
1821
1822 log_write(0, LOG_MAIN, "ridiculously long message header received from "
1823 "%s (more than %d characters): message abandoned",
1824 sender_host_unknown? sender_ident : sender_fullhost, header_maxsize);
1825
1826 if (smtp_input)
1827 {
1828 smtp_reply = US"552 Message header is ridiculously long";
1829 receive_swallow_smtp();
1830 goto TIDYUP; /* Skip to end of function */
1831 }
1832
1833 else
1834 {
1835 give_local_error(ERRMESS_VLONGHEADER,
1836 string_sprintf("message header longer than %d characters received: "
1837 "message not accepted", header_maxsize), US"", error_rc, stdin,
1838 header_list->next);
1839 /* Does not return */
1840 }
1841 }
1842
1843 continue; /* With next input character */
1844
1845 /* End of header line reached */
1846
1847 EOL:
2e0c1448
PH
1848
1849 /* Keep track of lines for BSMTP errors and overall message_linecount. */
1850
1851 receive_linecount++;
1852 message_linecount++;
059ec3d9 1853
d677b2f2
PH
1854 /* Keep track of maximum line length */
1855
1856 if (ptr - prevlines_length > max_received_linelength)
1857 max_received_linelength = ptr - prevlines_length;
1858 prevlines_length = ptr + 1;
1859
059ec3d9
PH
1860 /* Now put in the terminating newline. There is always space for
1861 at least two more characters. */
1862
1863 next->text[ptr++] = '\n';
1864 message_size++;
1865
1866 /* A blank line signals the end of the headers; release the unwanted
1867 space and set next to NULL to indicate this. */
1868
1869 if (ptr == 1)
1870 {
1871 store_reset(next);
1872 next = NULL;
1873 break;
1874 }
1875
1876 /* There is data in the line; see if the next input character is a
1877 whitespace character. If it is, we have a continuation of this header line.
1878 There is always space for at least one character at this point. */
1879
1880 if (ch != EOF)
1881 {
80a47a2c 1882 int nextch = (receive_getc)();
059ec3d9
PH
1883 if (nextch == ' ' || nextch == '\t')
1884 {
1885 next->text[ptr++] = nextch;
1886 message_size++;
1887 continue; /* Iterate the loop */
1888 }
80a47a2c 1889 else if (nextch != EOF) (receive_ungetc)(nextch); /* For next time */
059ec3d9
PH
1890 else ch = EOF; /* Cause main loop to exit at end */
1891 }
1892
1893 /* We have got to the real line end. Terminate the string and release store
1894 beyond it. If it turns out to be a real header, internal binary zeros will
1895 be squashed later. */
1896
1897 next->text[ptr] = 0;
1898 next->slen = ptr;
1899 store_reset(next->text + ptr + 1);
1900
1901 /* Check the running total size against the overall message size limit. We
1902 don't expect to fail here, but if the overall limit is set less than MESSAGE_
1903 MAXSIZE and a big header is sent, we want to catch it. Just stop reading
1904 headers - the code to read the body will then also hit the buffer. */
1905
1906 if (message_size > thismessage_size_limit) break;
1907
1908 /* A line that is not syntactically correct for a header also marks
1909 the end of the headers. In this case, we leave next containing the
1910 first data line. This might actually be several lines because of the
1911 continuation logic applied above, but that doesn't matter.
1912
1913 It turns out that smail, and presumably sendmail, accept leading lines
1914 of the form
1915
1916 From ph10 Fri Jan 5 12:35 GMT 1996
1917
1918 in messages. The "mail" command on Solaris 2 sends such lines. I cannot
1919 find any documentation of this, but for compatibility it had better be
1920 accepted. Exim restricts it to the case of non-smtp messages, and
1921 treats it as an alternative to the -f command line option. Thus it is
1922 ignored except for trusted users or filter testing. Otherwise it is taken
1923 as the sender address, unless -f was used (sendmail compatibility).
1924
1925 It further turns out that some UUCPs generate the From_line in a different
1926 format, e.g.
1927
1928 From ph10 Fri, 7 Jan 97 14:00:00 GMT
1929
1930 The regex for matching these things is now capable of recognizing both
1931 formats (including 2- and 4-digit years in the latter). In fact, the regex
1932 is now configurable, as is the expansion string to fish out the sender.
1933
1934 Even further on it has been discovered that some broken clients send
1935 these lines in SMTP messages. There is now an option to ignore them from
1936 specified hosts or networks. Sigh. */
1937
1938 if (header_last == header_list &&
1939 (!smtp_input
1940 ||
1941 (sender_host_address != NULL &&
1942 verify_check_host(&ignore_fromline_hosts) == OK)
1943 ||
1944 (sender_host_address == NULL && ignore_fromline_local)
1945 ) &&
1946 regex_match_and_setup(regex_From, next->text, 0, -1))
1947 {
1948 if (!sender_address_forced)
1949 {
1950 uschar *uucp_sender = expand_string(uucp_from_sender);
1951 if (uucp_sender == NULL)
1952 {
1953 log_write(0, LOG_MAIN|LOG_PANIC,
1954 "expansion of \"%s\" failed after matching "
1955 "\"From \" line: %s", uucp_from_sender, expand_string_message);
1956 }
1957 else
1958 {
1959 int start, end, domain;
1960 uschar *errmess;
1961 uschar *newsender = parse_extract_address(uucp_sender, &errmess,
1962 &start, &end, &domain, TRUE);
1963 if (newsender != NULL)
1964 {
1965 if (domain == 0 && newsender[0] != 0)
1966 newsender = rewrite_address_qualify(newsender, FALSE);
1967
f05da2e8 1968 if (filter_test != FTEST_NONE || receive_check_set_sender(newsender))
059ec3d9
PH
1969 {
1970 sender_address = newsender;
1971
f05da2e8 1972 if (trusted_caller || filter_test != FTEST_NONE)
059ec3d9
PH
1973 {
1974 authenticated_sender = NULL;
1975 originator_name = US"";
1976 sender_local = FALSE;
1977 }
1978
f05da2e8 1979 if (filter_test != FTEST_NONE)
059ec3d9
PH
1980 printf("Sender taken from \"From \" line\n");
1981 }
1982 }
1983 }
1984 }
1985 }
1986
1987 /* Not a leading "From " line. Check to see if it is a valid header line.
1988 Header names may contain any non-control characters except space and colon,
1989 amazingly. */
1990
1991 else
1992 {
1993 uschar *p = next->text;
1994
1995 /* If not a valid header line, break from the header reading loop, leaving
1996 next != NULL, indicating that it holds the first line of the body. */
1997
1998 if (isspace(*p)) break;
1999 while (mac_isgraph(*p) && *p != ':') p++;
2000 while (isspace(*p)) p++;
2001 if (*p != ':')
2002 {
2003 body_zerocount = had_zero;
2004 break;
2005 }
2006
2007 /* We have a valid header line. If there were any binary zeroes in
2008 the line, stomp on them here. */
2009
2010 if (had_zero > 0)
2011 for (p = next->text; p < next->text + ptr; p++) if (*p == 0) *p = '?';
2012
2013 /* It is perfectly legal to have an empty continuation line
2014 at the end of a header, but it is confusing to humans
2015 looking at such messages, since it looks like a blank line.
2016 Reduce confusion by removing redundant white space at the
2017 end. We know that there is at least one printing character
2018 (the ':' tested for above) so there is no danger of running
2019 off the end. */
2020
2021 p = next->text + ptr - 2;
2022 for (;;)
2023 {
2024 while (*p == ' ' || *p == '\t') p--;
2025 if (*p != '\n') break;
2026 ptr = (p--) - next->text + 1;
2027 message_size -= next->slen - ptr;
2028 next->text[ptr] = 0;
2029 next->slen = ptr;
2030 }
2031
2032 /* Add the header to the chain */
2033
2034 next->type = htype_other;
2035 next->next = NULL;
2036 header_last->next = next;
2037 header_last = next;
2038
2039 /* Check the limit for individual line lengths. This comes after adding to
2040 the chain so that the failing line is reflected if a bounce is generated
2041 (for a local message). */
2042
2043 if (header_line_maxsize > 0 && next->slen > header_line_maxsize)
2044 {
2045 log_write(0, LOG_MAIN, "overlong message header line received from "
2046 "%s (more than %d characters): message abandoned",
2047 sender_host_unknown? sender_ident : sender_fullhost,
2048 header_line_maxsize);
2049
2050 if (smtp_input)
2051 {
2052 smtp_reply = US"552 A message header line is too long";
2053 receive_swallow_smtp();
2054 goto TIDYUP; /* Skip to end of function */
2055 }
2056
2057 else
2058 {
2059 give_local_error(ERRMESS_VLONGHDRLINE,
2060 string_sprintf("message header line longer than %d characters "
2061 "received: message not accepted", header_line_maxsize), US"",
2062 error_rc, stdin, header_list->next);
2063 /* Does not return */
2064 }
2065 }
2066
2067 /* Note if any resent- fields exist. */
2068
2069 if (!resents_exist && strncmpic(next->text, US"resent-", 7) == 0)
2070 {
2071 resents_exist = TRUE;
2072 resent_prefix = US"Resent-";
2073 }
2074 }
2075
2076 /* The line has been handled. If we have hit EOF, break out of the loop,
2077 indicating no pending data line. */
2078
2079 if (ch == EOF) { next = NULL; break; }
2080
2081 /* Set up for the next header */
2082
2083 header_size = 256;
2084 next = store_get(sizeof(header_line));
2085 next->text = store_get(header_size);
2086 ptr = 0;
2087 had_zero = 0;
d677b2f2 2088 prevlines_length = 0;
059ec3d9
PH
2089 } /* Continue, starting to read the next header */
2090
2091/* At this point, we have read all the headers into a data structure in main
2092store. The first header is still the dummy placeholder for the Received: header
2093we are going to generate a bit later on. If next != NULL, it contains the first
2094data line - which terminated the headers before reaching a blank line (not the
2095normal case). */
2096
2097DEBUG(D_receive)
2098 {
2099 debug_printf(">>Headers received:\n");
2100 for (h = header_list->next; h != NULL; h = h->next)
2101 debug_printf("%s", h->text);
2102 debug_printf("\n");
2103 }
2104
2105/* End of file on any SMTP connection is an error. If an incoming SMTP call
2106is dropped immediately after valid headers, the next thing we will see is EOF.
2107We must test for this specially, as further down the reading of the data is
2108skipped if already at EOF. */
2109
2110if (smtp_input && (receive_feof)())
2111 {
2112 smtp_reply = handle_lost_connection(US" (after header)");
2113 smtp_yield = FALSE;
2114 goto TIDYUP; /* Skip to end of function */
2115 }
2116
2117/* If this is a filter test run and no headers were read, output a warning
2118in case there is a mistake in the test message. */
2119
f05da2e8 2120if (filter_test != FTEST_NONE && header_list->next == NULL)
059ec3d9
PH
2121 printf("Warning: no message headers read\n");
2122
2123
2124/* Scan the headers to identify them. Some are merely marked for later
2125processing; some are dealt with here. */
2126
2127for (h = header_list->next; h != NULL; h = h->next)
2128 {
2129 BOOL is_resent = strncmpic(h->text, US"resent-", 7) == 0;
2130 if (is_resent) contains_resent_headers = TRUE;
2131
2132 switch (header_checkname(h, is_resent))
2133 {
059ec3d9 2134 case htype_bcc:
2cbb4081 2135 h->type = htype_bcc; /* Both Bcc: and Resent-Bcc: */
059ec3d9
PH
2136 break;
2137
059ec3d9 2138 case htype_cc:
2cbb4081 2139 h->type = htype_cc; /* Both Cc: and Resent-Cc: */
059ec3d9
PH
2140 break;
2141
2142 /* Record whether a Date: or Resent-Date: header exists, as appropriate. */
2143
2144 case htype_date:
4c69d561 2145 if (!resents_exist || is_resent) date_header_exists = TRUE;
059ec3d9
PH
2146 break;
2147
2148 /* Same comments as about Return-Path: below. */
2149
2150 case htype_delivery_date:
2151 if (delivery_date_remove) h->type = htype_old;
2152 break;
2153
2154 /* Same comments as about Return-Path: below. */
2155
2156 case htype_envelope_to:
2157 if (envelope_to_remove) h->type = htype_old;
2158 break;
2159
2160 /* Mark all "From:" headers so they get rewritten. Save the one that is to
2161 be used for Sender: checking. For Sendmail compatibility, if the "From:"
2162 header consists of just the login id of the user who called Exim, rewrite
2163 it with the gecos field first. Apply this rule to Resent-From: if there
2164 are resent- fields. */
2165
2166 case htype_from:
2167 h->type = htype_from;
2168 if (!resents_exist || is_resent)
2169 {
2170 from_header = h;
2171 if (!smtp_input)
2172 {
5de8faa3 2173 int len;
059ec3d9
PH
2174 uschar *s = Ustrchr(h->text, ':') + 1;
2175 while (isspace(*s)) s++;
5de8faa3 2176 len = h->slen - (s - h->text) - 1;
e0fccd1d
TF
2177 if (Ustrlen(originator_login) == len &&
2178 strncmpic(s, originator_login, len) == 0)
059ec3d9
PH
2179 {
2180 uschar *name = is_resent? US"Resent-From" : US"From";
2181 header_add(htype_from, "%s: %s <%s@%s>\n", name, originator_name,
2182 originator_login, qualify_domain_sender);
2183 from_header = header_last;
2184 h->type = htype_old;
2185 DEBUG(D_receive|D_rewrite)
2186 debug_printf("rewrote \"%s:\" header using gecos\n", name);
2187 }
2188 }
2189 }
2190 break;
2191
2192 /* Identify the Message-id: header for generating "in-reply-to" in the
2193 autoreply transport. For incoming logging, save any resent- value. In both
2194 cases, take just the first of any multiples. */
2195
2196 case htype_id:
2197 if (msgid_header == NULL && (!resents_exist || is_resent))
2198 {
2199 msgid_header = h;
2200 h->type = htype_id;
2201 }
2202 break;
2203
2204 /* Flag all Received: headers */
2205
2206 case htype_received:
2207 h->type = htype_received;
2208 received_count++;
2209 break;
2210
2211 /* "Reply-to:" is just noted (there is no resent-reply-to field) */
2212
2213 case htype_reply_to:
2214 h->type = htype_reply_to;
2215 break;
2216
2217 /* The Return-path: header is supposed to be added to messages when
2218 they leave the SMTP system. We shouldn't receive messages that already
2219 contain Return-path. However, since Exim generates Return-path: on
2220 local delivery, resent messages may well contain it. We therefore
2221 provide an option (which defaults on) to remove any Return-path: headers
2222 on input. Removal actually means flagging as "old", which prevents the
2223 header being transmitted with the message. */
2224
2225 case htype_return_path:
2226 if (return_path_remove) h->type = htype_old;
2227
2228 /* If we are testing a mail filter file, use the value of the
2229 Return-Path: header to set up the return_path variable, which is not
2230 otherwise set. However, remove any <> that surround the address
2231 because the variable doesn't have these. */
2232
f05da2e8 2233 if (filter_test != FTEST_NONE)
059ec3d9
PH
2234 {
2235 uschar *start = h->text + 12;
2236 uschar *end = start + Ustrlen(start);
2237 while (isspace(*start)) start++;
2238 while (end > start && isspace(end[-1])) end--;
2239 if (*start == '<' && end[-1] == '>')
2240 {
2241 start++;
2242 end--;
2243 }
2244 return_path = string_copyn(start, end - start);
2245 printf("Return-path taken from \"Return-path:\" header line\n");
2246 }
2247 break;
2248
2249 /* If there is a "Sender:" header and the message is locally originated,
8800895a
PH
2250 and from an untrusted caller and suppress_local_fixups is not set, or if we
2251 are in submission mode for a remote message, mark it "old" so that it will
2252 not be transmitted with the message, unless active_local_sender_retain is
2253 set. (This can only be true if active_local_from_check is false.) If there
2254 are any resent- headers in the message, apply this rule to Resent-Sender:
2255 instead of Sender:. Messages with multiple resent- header sets cannot be
2256 tidily handled. (For this reason, at least one MUA - Pine - turns old
2257 resent- headers into X-resent- headers when resending, leaving just one
2258 set.) */
059ec3d9
PH
2259
2260 case htype_sender:
69358f02 2261 h->type = ((!active_local_sender_retain &&
8800895a
PH
2262 (
2263 (sender_local && !trusted_caller && !suppress_local_fixups)
2264 || submission_mode
2265 )
059ec3d9
PH
2266 ) &&
2267 (!resents_exist||is_resent))?
2268 htype_old : htype_sender;
2269 break;
2270
2271 /* Remember the Subject: header for logging. There is no Resent-Subject */
2272
2273 case htype_subject:
2274 subject_header = h;
2275 break;
2276
2277 /* "To:" gets flagged, and the existence of a recipient header is noted,
2278 whether it's resent- or not. */
2279
2280 case htype_to:
2281 h->type = htype_to;
2282 /****
2283 to_or_cc_header_exists = TRUE;
2284 ****/
2285 break;
2286 }
2287 }
2288
2289/* Extract recipients from the headers if that is required (the -t option).
2290Note that this is documented as being done *before* any address rewriting takes
2291place. There are two possibilities:
2292
2293(1) According to sendmail documentation for Solaris, IRIX, and HP-UX, any
2294recipients already listed are to be REMOVED from the message. Smail 3 works
2295like this. We need to build a non-recipients tree for that list, because in
2296subsequent processing this data is held in a tree and that's what the
2297spool_write_header() function expects. Make sure that non-recipient addresses
2298are fully qualified and rewritten if necessary.
2299
2300(2) According to other sendmail documentation, -t ADDS extracted recipients to
2301those in the command line arguments (and it is rumoured some other MTAs do
2302this). Therefore, there is an option to make Exim behave this way.
2303
2304*** Notes on "Resent-" header lines ***
2305
2306The presence of resent-headers in the message makes -t horribly ambiguous.
2307Experiments with sendmail showed that it uses recipients for all resent-
2308headers, totally ignoring the concept of "sets of resent- headers" as described
2309in RFC 2822 section 3.6.6. Sendmail also amalgamates them into a single set
2310with all the addresses in one instance of each header.
2311
2312This seems to me not to be at all sensible. Before release 4.20, Exim 4 gave an
2313error for -t if there were resent- headers in the message. However, after a
2314discussion on the mailing list, I've learned that there are MUAs that use
2315resent- headers with -t, and also that the stuff about sets of resent- headers
2316and their ordering in RFC 2822 is generally ignored. An MUA that submits a
2317message with -t and resent- header lines makes sure that only *its* resent-
2318headers are present; previous ones are often renamed as X-resent- for example.
2319
2320Consequently, Exim has been changed so that, if any resent- header lines are
2321present, the recipients are taken from all of the appropriate resent- lines,
2322and not from the ordinary To:, Cc:, etc. */
2323
2324if (extract_recip)
2325 {
2326 int rcount = 0;
2327 error_block **bnext = &bad_addresses;
2328
2329 if (extract_addresses_remove_arguments)
2330 {
2331 while (recipients_count-- > 0)
2332 {
2333 uschar *s = rewrite_address(recipients_list[recipients_count].address,
2334 TRUE, TRUE, global_rewrite_rules, rewrite_existflags);
2335 tree_add_nonrecipient(s);
2336 }
2337 recipients_list = NULL;
2338 recipients_count = recipients_list_max = 0;
2339 }
2340
059ec3d9
PH
2341 /* Now scan the headers */
2342
2343 for (h = header_list->next; h != NULL; h = h->next)
2344 {
2345 if ((h->type == htype_to || h->type == htype_cc || h->type == htype_bcc) &&
2346 (!contains_resent_headers || strncmpic(h->text, US"resent-", 7) == 0))
2347 {
2348 uschar *s = Ustrchr(h->text, ':') + 1;
2349 while (isspace(*s)) s++;
2350
1eccaa59
PH
2351 parse_allow_group = TRUE; /* Allow address group syntax */
2352
059ec3d9
PH
2353 while (*s != 0)
2354 {
2355 uschar *ss = parse_find_address_end(s, FALSE);
2356 uschar *recipient, *errmess, *p, *pp;
2357 int start, end, domain;
2358
2359 /* Check on maximum */
2360
2361 if (recipients_max > 0 && ++rcount > recipients_max)
2362 {
2363 give_local_error(ERRMESS_TOOMANYRECIP, US"too many recipients",
2364 US"message rejected: ", error_rc, stdin, NULL);
2365 /* Does not return */
2366 }
2367
2368 /* Make a copy of the address, and remove any internal newlines. These
2369 may be present as a result of continuations of the header line. The
2370 white space that follows the newline must not be removed - it is part
2371 of the header. */
2372
2373 pp = recipient = store_get(ss - s + 1);
2374 for (p = s; p < ss; p++) if (*p != '\n') *pp++ = *p;
2375 *pp = 0;
250b6871 2376
8c5d388a 2377#ifdef SUPPORT_I18N
250b6871
JH
2378 {
2379 BOOL b = allow_utf8_domains;
2380 allow_utf8_domains = TRUE;
2381#endif
059ec3d9
PH
2382 recipient = parse_extract_address(recipient, &errmess, &start, &end,
2383 &domain, FALSE);
2384
8c5d388a 2385#ifdef SUPPORT_I18N
250b6871
JH
2386 if (string_is_utf8(recipient))
2387 message_smtputf8 = TRUE;
2388 else
2389 allow_utf8_domains = b;
2390 }
2391#endif
2392
059ec3d9
PH
2393 /* Keep a list of all the bad addresses so we can send a single
2394 error message at the end. However, an empty address is not an error;
2395 just ignore it. This can come from an empty group list like
2396
2397 To: Recipients of list:;
2398
2399 If there are no recipients at all, an error will occur later. */
2400
2401 if (recipient == NULL && Ustrcmp(errmess, "empty address") != 0)
2402 {
2403 int len = Ustrlen(s);
2404 error_block *b = store_get(sizeof(error_block));
2405 while (len > 0 && isspace(s[len-1])) len--;
2406 b->next = NULL;
2407 b->text1 = string_printing(string_copyn(s, len));
2408 b->text2 = errmess;
2409 *bnext = b;
2410 bnext = &(b->next);
2411 }
2412
2413 /* If the recipient is already in the nonrecipients tree, it must
2414 have appeared on the command line with the option extract_addresses_
2415 remove_arguments set. Do not add it to the recipients, and keep a note
2416 that this has happened, in order to give a better error if there are
2417 no recipients left. */
2418
2419 else if (recipient != NULL)
2420 {
2421 if (tree_search(tree_nonrecipients, recipient) == NULL)
2422 receive_add_recipient(recipient, -1);
2423 else
2424 extracted_ignored = TRUE;
2425 }
2426
2427 /* Move on past this address */
2428
2429 s = ss + (*ss? 1:0);
2430 while (isspace(*s)) s++;
1eccaa59
PH
2431 } /* Next address */
2432
2433 parse_allow_group = FALSE; /* Reset group syntax flags */
2434 parse_found_group = FALSE;
059ec3d9
PH
2435
2436 /* If this was the bcc: header, mark it "old", which means it
2437 will be kept on the spool, but not transmitted as part of the
2438 message. */
2439
2cbb4081 2440 if (h->type == htype_bcc) h->type = htype_old;
059ec3d9
PH
2441 } /* For appropriate header line */
2442 } /* For each header line */
2443
059ec3d9
PH
2444 }
2445
2446/* Now build the unique message id. This has changed several times over the
2447lifetime of Exim. This description was rewritten for Exim 4.14 (February 2003).
2448Retaining all the history in the comment has become too unwieldy - read
2449previous release sources if you want it.
2450
2451The message ID has 3 parts: tttttt-pppppp-ss. Each part is a number in base 62.
2452The first part is the current time, in seconds. The second part is the current
2453pid. Both are large enough to hold 32-bit numbers in base 62. The third part
2454can hold a number in the range 0-3843. It used to be a computed sequence
2455number, but is now the fractional component of the current time in units of
24561/2000 of a second (i.e. a value in the range 0-1999). After a message has been
2457received, Exim ensures that the timer has ticked at the appropriate level
2458before proceeding, to avoid duplication if the pid happened to be re-used
2459within the same time period. It seems likely that most messages will take at
2460least half a millisecond to be received, so no delay will normally be
2461necessary. At least for some time...
2462
2463There is a modification when localhost_number is set. Formerly this was allowed
2464to be as large as 255. Now it is restricted to the range 0-16, and the final
2465component of the message id becomes (localhost_number * 200) + fractional time
2466in units of 1/200 of a second (i.e. a value in the range 0-3399).
2467
2468Some not-really-Unix operating systems use case-insensitive file names (Darwin,
2469Cygwin). For these, we have to use base 36 instead of base 62. Luckily, this
2470still allows the tttttt field to hold a large enough number to last for some
2471more decades, and the final two-digit field can hold numbers up to 1295, which
2472is enough for milliseconds (instead of 1/2000 of a second).
2473
2474However, the pppppp field cannot hold a 32-bit pid, but it can hold a 31-bit
2475pid, so it is probably safe because pids have to be positive. The
2476localhost_number is restricted to 0-10 for these hosts, and when it is set, the
2477final field becomes (localhost_number * 100) + fractional time in centiseconds.
2478
2479Note that string_base62() returns its data in a static storage block, so it
2480must be copied before calling string_base62() again. It always returns exactly
24816 characters.
2482
2483There doesn't seem to be anything in the RFC which requires a message id to
2484start with a letter, but Smail was changed to ensure this. The external form of
2485the message id (as supplied by string expansion) therefore starts with an
2486additional leading 'E'. The spool file names do not include this leading
2487letter and it is not used internally.
2488
2489NOTE: If ever the format of message ids is changed, the regular expression for
2490checking that a string is in this format must be updated in a corresponding
2491way. It appears in the initializing code in exim.c. The macro MESSAGE_ID_LENGTH
2492must also be changed to reflect the correct string length. Then, of course,
2493other programs that rely on the message id format will need updating too. */
2494
2495Ustrncpy(message_id, string_base62((long int)(message_id_tv.tv_sec)), 6);
2496message_id[6] = '-';
2497Ustrncpy(message_id + 7, string_base62((long int)getpid()), 6);
2498
2499/* Deal with the case where the host number is set. The value of the number was
2500checked when it was read, to ensure it isn't too big. The timing granularity is
2501left in id_resolution so that an appropriate wait can be done after receiving
2502the message, if necessary (we hope it won't be). */
2503
2504if (host_number_string != NULL)
2505 {
2506 id_resolution = (BASE_62 == 62)? 5000 : 10000;
2507 sprintf(CS(message_id + MESSAGE_ID_LENGTH - 3), "-%2s",
2508 string_base62((long int)(
2509 host_number * (1000000/id_resolution) +
2510 message_id_tv.tv_usec/id_resolution)) + 4);
2511 }
2512
2513/* Host number not set: final field is just the fractional time at an
2514appropriate resolution. */
2515
2516else
2517 {
2518 id_resolution = (BASE_62 == 62)? 500 : 1000;
2519 sprintf(CS(message_id + MESSAGE_ID_LENGTH - 3), "-%2s",
2520 string_base62((long int)(message_id_tv.tv_usec/id_resolution)) + 4);
2521 }
2522
2523/* Add the current message id onto the current process info string if
2524it will fit. */
2525
2526(void)string_format(process_info + process_info_len,
2527 PROCESS_INFO_SIZE - process_info_len, " id=%s", message_id);
2528
2529/* If we are using multiple input directories, set up the one for this message
2530to be the least significant base-62 digit of the time of arrival. Otherwise
2531ensure that it is an empty string. */
2532
a2da3176 2533message_subdir[0] = split_spool_directory ? message_id[5] : 0;
059ec3d9
PH
2534
2535/* Now that we have the message-id, if there is no message-id: header, generate
8800895a
PH
2536one, but only for local (without suppress_local_fixups) or submission mode
2537messages. This can be user-configured if required, but we had better flatten
2538any illegal characters therein. */
059ec3d9 2539
8800895a
PH
2540if (msgid_header == NULL &&
2541 ((sender_host_address == NULL && !suppress_local_fixups)
2542 || submission_mode))
059ec3d9
PH
2543 {
2544 uschar *p;
2545 uschar *id_text = US"";
2546 uschar *id_domain = primary_hostname;
2547
2548 /* Permit only letters, digits, dots, and hyphens in the domain */
2549
2550 if (message_id_domain != NULL)
2551 {
2552 uschar *new_id_domain = expand_string(message_id_domain);
2553 if (new_id_domain == NULL)
2554 {
2555 if (!expand_string_forcedfail)
2556 log_write(0, LOG_MAIN|LOG_PANIC,
2557 "expansion of \"%s\" (message_id_header_domain) "
2558 "failed: %s", message_id_domain, expand_string_message);
2559 }
2560 else if (*new_id_domain != 0)
2561 {
2562 id_domain = new_id_domain;
2563 for (p = id_domain; *p != 0; p++)
2564 if (!isalnum(*p) && *p != '.') *p = '-'; /* No need to test '-' ! */
2565 }
2566 }
2567
2568 /* Permit all characters except controls and RFC 2822 specials in the
2569 additional text part. */
2570
2571 if (message_id_text != NULL)
2572 {
2573 uschar *new_id_text = expand_string(message_id_text);
2574 if (new_id_text == NULL)
2575 {
2576 if (!expand_string_forcedfail)
2577 log_write(0, LOG_MAIN|LOG_PANIC,
2578 "expansion of \"%s\" (message_id_header_text) "
2579 "failed: %s", message_id_text, expand_string_message);
2580 }
2581 else if (*new_id_text != 0)
2582 {
2583 id_text = new_id_text;
2584 for (p = id_text; *p != 0; p++)
2585 if (mac_iscntrl_or_special(*p)) *p = '-';
2586 }
2587 }
2588
e7e680d6
PP
2589 /* Add the header line
2590 * Resent-* headers are prepended, per RFC 5322 3.6.6. Non-Resent-* are
2591 * appended, to preserve classical expectations of header ordering. */
059ec3d9 2592
e7e680d6 2593 header_add_at_position(!resents_exist, NULL, FALSE, htype_id,
5eb690a1
NM
2594 "%sMessage-Id: <%s%s%s@%s>\n", resent_prefix, message_id_external,
2595 (*id_text == 0)? "" : ".", id_text, id_domain);
059ec3d9
PH
2596 }
2597
2598/* If we are to log recipients, keep a copy of the raw ones before any possible
2599rewriting. Must copy the count, because later ACLs and the local_scan()
2600function may mess with the real recipients. */
2601
6c6d6e48 2602if (LOGGING(received_recipients))
059ec3d9
PH
2603 {
2604 raw_recipients = store_get(recipients_count * sizeof(uschar *));
2605 for (i = 0; i < recipients_count; i++)
2606 raw_recipients[i] = string_copy(recipients_list[i].address);
2607 raw_recipients_count = recipients_count;
2608 }
2609
2610/* Ensure the recipients list is fully qualified and rewritten. Unqualified
2611recipients will get here only if the conditions were right (allow_unqualified_
2612recipient is TRUE). */
2613
2614for (i = 0; i < recipients_count; i++)
2615 recipients_list[i].address =
2616 rewrite_address(recipients_list[i].address, TRUE, TRUE,
2617 global_rewrite_rules, rewrite_existflags);
2618
8800895a
PH
2619/* If there is no From: header, generate one for local (without
2620suppress_local_fixups) or submission_mode messages. If there is no sender
2621address, but the sender is local or this is a local delivery error, use the
2622originator login. This shouldn't happen for genuine bounces, but might happen
2623for autoreplies. The addition of From: must be done *before* checking for the
2624possible addition of a Sender: header, because untrusted_set_sender allows an
2625untrusted user to set anything in the envelope (which might then get info
2626From:) but we still want to ensure a valid Sender: if it is required. */
2627
2628if (from_header == NULL &&
2629 ((sender_host_address == NULL && !suppress_local_fixups)
2630 || submission_mode))
059ec3d9 2631 {
2fe1a124
PH
2632 uschar *oname = US"";
2633
2634 /* Use the originator_name if this is a locally submitted message and the
2635 caller is not trusted. For trusted callers, use it only if -F was used to
2636 force its value or if we have a non-SMTP message for which -f was not used
2637 to set the sender. */
2638
2639 if (sender_host_address == NULL)
2640 {
2641 if (!trusted_caller || sender_name_forced ||
2642 (!smtp_input && !sender_address_forced))
2643 oname = originator_name;
2644 }
2645
2646 /* For non-locally submitted messages, the only time we use the originator
2647 name is when it was forced by the /name= option on control=submission. */
2648
2649 else
2650 {
2651 if (submission_name != NULL) oname = submission_name;
2652 }
2653
059ec3d9
PH
2654 /* Envelope sender is empty */
2655
2656 if (sender_address[0] == 0)
2657 {
87ba3f5f
PH
2658 uschar *fromstart, *fromend;
2659
2660 fromstart = string_sprintf("%sFrom: %s%s", resent_prefix,
2fe1a124
PH
2661 oname, (oname[0] == 0)? "" : " <");
2662 fromend = (oname[0] == 0)? US"" : US">";
87ba3f5f 2663
059ec3d9
PH
2664 if (sender_local || local_error_message)
2665 {
87ba3f5f
PH
2666 header_add(htype_from, "%s%s@%s%s\n", fromstart,
2667 local_part_quote(originator_login), qualify_domain_sender,
2668 fromend);
059ec3d9
PH
2669 }
2670 else if (submission_mode && authenticated_id != NULL)
2671 {
2672 if (submission_domain == NULL)
2673 {
87ba3f5f
PH
2674 header_add(htype_from, "%s%s@%s%s\n", fromstart,
2675 local_part_quote(authenticated_id), qualify_domain_sender,
2676 fromend);
059ec3d9
PH
2677 }
2678 else if (submission_domain[0] == 0) /* empty => whole address set */
2679 {
87ba3f5f
PH
2680 header_add(htype_from, "%s%s%s\n", fromstart, authenticated_id,
2681 fromend);
059ec3d9
PH
2682 }
2683 else
2684 {
87ba3f5f
PH
2685 header_add(htype_from, "%s%s@%s%s\n", fromstart,
2686 local_part_quote(authenticated_id), submission_domain,
2687 fromend);
059ec3d9
PH
2688 }
2689 from_header = header_last; /* To get it checked for Sender: */
2690 }
2691 }
2692
2693 /* There is a non-null envelope sender. Build the header using the original
2694 sender address, before any rewriting that might have been done while
2695 verifying it. */
2696
2697 else
2698 {
87ba3f5f 2699 header_add(htype_from, "%sFrom: %s%s%s%s\n", resent_prefix,
2fe1a124
PH
2700 oname,
2701 (oname[0] == 0)? "" : " <",
87ba3f5f
PH
2702 (sender_address_unrewritten == NULL)?
2703 sender_address : sender_address_unrewritten,
2fe1a124 2704 (oname[0] == 0)? "" : ">");
059ec3d9
PH
2705
2706 from_header = header_last; /* To get it checked for Sender: */
2707 }
2708 }
2709
2710
8800895a
PH
2711/* If the sender is local (without suppress_local_fixups), or if we are in
2712submission mode and there is an authenticated_id, check that an existing From:
2713is correct, and if not, generate a Sender: header, unless disabled. Any
2714previously-existing Sender: header was removed above. Note that sender_local,
2715as well as being TRUE if the caller of exim is not trusted, is also true if a
2716trusted caller did not supply a -f argument for non-smtp input. To allow
2717trusted callers to forge From: without supplying -f, we have to test explicitly
2718here. If the From: header contains more than one address, then the call to
2719parse_extract_address fails, and a Sender: header is inserted, as required. */
059ec3d9
PH
2720
2721if (from_header != NULL &&
69358f02 2722 (active_local_from_check &&
8800895a 2723 ((sender_local && !trusted_caller && !suppress_local_fixups) ||
69358f02 2724 (submission_mode && authenticated_id != NULL))
059ec3d9
PH
2725 ))
2726 {
2727 BOOL make_sender = TRUE;
2728 int start, end, domain;
2729 uschar *errmess;
2730 uschar *from_address =
2731 parse_extract_address(Ustrchr(from_header->text, ':') + 1, &errmess,
2732 &start, &end, &domain, FALSE);
2733 uschar *generated_sender_address;
2734
2735 if (submission_mode)
2736 {
2737 if (submission_domain == NULL)
2738 {
2739 generated_sender_address = string_sprintf("%s@%s",
2740 local_part_quote(authenticated_id), qualify_domain_sender);
2741 }
2742 else if (submission_domain[0] == 0) /* empty => full address */
2743 {
2744 generated_sender_address = string_sprintf("%s",
2745 authenticated_id);
2746 }
2747 else
2748 {
2749 generated_sender_address = string_sprintf("%s@%s",
2750 local_part_quote(authenticated_id), submission_domain);
2751 }
2752 }
2753 else
2754 generated_sender_address = string_sprintf("%s@%s",
2755 local_part_quote(originator_login), qualify_domain_sender);
2756
2757 /* Remove permitted prefixes and suffixes from the local part of the From:
2758 address before doing the comparison with the generated sender. */
2759
2760 if (from_address != NULL)
2761 {
2762 int slen;
2763 uschar *at = (domain == 0)? NULL : from_address + domain - 1;
2764
2765 if (at != NULL) *at = 0;
2766 from_address += route_check_prefix(from_address, local_from_prefix);
2767 slen = route_check_suffix(from_address, local_from_suffix);
2768 if (slen > 0)
2769 {
2770 memmove(from_address+slen, from_address, Ustrlen(from_address)-slen);
2771 from_address += slen;
2772 }
2773 if (at != NULL) *at = '@';
2774
2775 if (strcmpic(generated_sender_address, from_address) == 0 ||
2776 (domain == 0 && strcmpic(from_address, originator_login) == 0))
2777 make_sender = FALSE;
2778 }
2779
2780 /* We have to cause the Sender header to be rewritten if there are
2781 appropriate rewriting rules. */
2782
2783 if (make_sender)
2784 {
2fe1a124 2785 if (submission_mode && submission_name == NULL)
059ec3d9
PH
2786 header_add(htype_sender, "%sSender: %s\n", resent_prefix,
2787 generated_sender_address);
2788 else
2789 header_add(htype_sender, "%sSender: %s <%s>\n",
2fe1a124
PH
2790 resent_prefix,
2791 submission_mode? submission_name : originator_name,
2792 generated_sender_address);
059ec3d9 2793 }
87ba3f5f
PH
2794
2795 /* Ensure that a non-null envelope sender address corresponds to the
2796 submission mode sender address. */
2797
2798 if (submission_mode && sender_address[0] != 0)
2799 {
2800 if (sender_address_unrewritten == NULL)
2801 sender_address_unrewritten = sender_address;
2802 sender_address = generated_sender_address;
089793a4
TF
2803 if (Ustrcmp(sender_address_unrewritten, generated_sender_address) != 0)
2804 log_write(L_address_rewrite, LOG_MAIN,
2805 "\"%s\" from env-from rewritten as \"%s\" by submission mode",
2806 sender_address_unrewritten, generated_sender_address);
87ba3f5f 2807 }
059ec3d9
PH
2808 }
2809
059ec3d9
PH
2810/* If there are any rewriting rules, apply them to the sender address, unless
2811it has already been rewritten as part of verification for SMTP input. */
2812
2813if (global_rewrite_rules != NULL && sender_address_unrewritten == NULL &&
2814 sender_address[0] != 0)
2815 {
2816 sender_address = rewrite_address(sender_address, FALSE, TRUE,
2817 global_rewrite_rules, rewrite_existflags);
2818 DEBUG(D_receive|D_rewrite)
2819 debug_printf("rewritten sender = %s\n", sender_address);
2820 }
2821
2822
2823/* The headers must be run through rewrite_header(), because it ensures that
2824addresses are fully qualified, as well as applying any rewriting rules that may
2825exist.
2826
2827Qualification of header addresses in a message from a remote host happens only
2828if the host is in sender_unqualified_hosts or recipient_unqualified hosts, as
2829appropriate. For local messages, qualification always happens, unless -bnq is
2830used to explicitly suppress it. No rewriting is done for an unqualified address
2831that is left untouched.
2832
2833We start at the second header, skipping our own Received:. This rewriting is
2834documented as happening *after* recipient addresses are taken from the headers
2835by the -t command line option. An added Sender: gets rewritten here. */
2836
2837for (h = header_list->next; h != NULL; h = h->next)
2838 {
2839 header_line *newh = rewrite_header(h, NULL, NULL, global_rewrite_rules,
2840 rewrite_existflags, TRUE);
2841 if (newh != NULL) h = newh;
2842 }
2843
2844
2845/* An RFC 822 (sic) message is not legal unless it has at least one of "to",
2cbb4081 2846"cc", or "bcc". Note that although the minimal examples in RFC 822 show just
059ec3d9
PH
2847"to" or "bcc", the full syntax spec allows "cc" as well. If any resent- header
2848exists, this applies to the set of resent- headers rather than the normal set.
2849
2cbb4081
PH
2850The requirement for a recipient header has been removed in RFC 2822. At this
2851point in the code, earlier versions of Exim added a To: header for locally
2852submitted messages, and an empty Bcc: header for others. In the light of the
2853changes in RFC 2822, this was dropped in November 2003. */
059ec3d9 2854
059ec3d9
PH
2855
2856/* If there is no date header, generate one if the message originates locally
8800895a
PH
2857(i.e. not over TCP/IP) and suppress_local_fixups is not set, or if the
2858submission mode flag is set. Messages without Date: are not valid, but it seems
e7e680d6
PP
2859to be more confusing if Exim adds one to all remotely-originated messages.
2860As per Message-Id, we prepend if resending, else append.
2861*/
059ec3d9 2862
8800895a
PH
2863if (!date_header_exists &&
2864 ((sender_host_address == NULL && !suppress_local_fixups)
2865 || submission_mode))
e7e680d6
PP
2866 header_add_at_position(!resents_exist, NULL, FALSE, htype_other,
2867 "%sDate: %s\n", resent_prefix, tod_stamp(tod_full));
059ec3d9
PH
2868
2869search_tidyup(); /* Free any cached resources */
2870
2871/* Show the complete set of headers if debugging. Note that the first one (the
2872new Received:) has not yet been set. */
2873
2874DEBUG(D_receive)
2875 {
2876 debug_printf(">>Headers after rewriting and local additions:\n");
2877 for (h = header_list->next; h != NULL; h = h->next)
2878 debug_printf("%c %s", h->type, h->text);
2879 debug_printf("\n");
2880 }
2881
2882/* The headers are now complete in store. If we are running in filter
2883testing mode, that is all this function does. Return TRUE if the message
2884ended with a dot. */
2885
f05da2e8 2886if (filter_test != FTEST_NONE)
059ec3d9
PH
2887 {
2888 process_info[process_info_len] = 0;
2889 return message_ended == END_DOT;
2890 }
2891
7e3ce68e
JH
2892/*XXX CHUNKING: need to cancel cutthrough under BDAT, for now. In future,
2893think more if it could be handled. Cannot do onward CHUNKING unless
2894inbound is, but inbound chunking ought to be ok with outbound plain.
2895Could we do onward CHUNKING given inbound CHUNKING?
2896*/
2897if (chunking_state > CHUNKING_OFFERED)
2898 cancel_cutthrough_connection("chunking active");
2899
817d9f57 2900/* Cutthrough delivery:
5032d1cf
JH
2901We have to create the Received header now rather than at the end of reception,
2902so the timestamp behaviour is a change to the normal case.
2903XXX Ensure this gets documented XXX.
2904Having created it, send the headers to the destination. */
2905if (cutthrough.fd >= 0)
e4bdf652 2906 {
817d9f57
JH
2907 if (received_count > received_headers_max)
2908 {
2e5b33cd 2909 cancel_cutthrough_connection("too many headers");
817d9f57
JH
2910 if (smtp_input) receive_swallow_smtp(); /* Swallow incoming SMTP */
2911 log_write(0, LOG_MAIN|LOG_REJECT, "rejected from <%s>%s%s%s%s: "
2912 "Too many \"Received\" headers",
2913 sender_address,
2914 (sender_fullhost == NULL)? "" : " H=",
2915 (sender_fullhost == NULL)? US"" : sender_fullhost,
2916 (sender_ident == NULL)? "" : " U=",
2917 (sender_ident == NULL)? US"" : sender_ident);
2918 message_id[0] = 0; /* Indicate no message accepted */
2919 smtp_reply = US"550 Too many \"Received\" headers - suspected mail loop";
2920 goto TIDYUP; /* Skip to end of function */
2921 }
e4bdf652 2922 received_header_gen();
578d43dc 2923 add_acl_headers(ACL_WHERE_RCPT, US"MAIL or RCPT");
e4bdf652
JH
2924 (void) cutthrough_headers_send();
2925 }
61147df4 2926
e4bdf652 2927
059ec3d9
PH
2928/* Open a new spool file for the data portion of the message. We need
2929to access it both via a file descriptor and a stream. Try to make the
41313d92 2930directory if it isn't there. */
059ec3d9 2931
41313d92 2932spool_name = spool_fname(US"input", message_subdir, message_id, US"-D");
a2da3176
JH
2933DEBUG(D_receive) debug_printf("Data file name: %s\n", spool_name);
2934
2935if ((data_fd = Uopen(spool_name, O_RDWR|O_CREAT|O_EXCL, SPOOL_MODE)) < 0)
059ec3d9
PH
2936 {
2937 if (errno == ENOENT)
2938 {
0971ec06 2939 (void) directory_make(spool_directory,
41313d92
JH
2940 spool_sname(US"input", message_subdir),
2941 INPUT_DIRECTORY_MODE, TRUE);
059ec3d9
PH
2942 data_fd = Uopen(spool_name, O_RDWR|O_CREAT|O_EXCL, SPOOL_MODE);
2943 }
2944 if (data_fd < 0)
2945 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Failed to create spool file %s: %s",
2946 spool_name, strerror(errno));
2947 }
2948
2949/* Make sure the file's group is the Exim gid, and double-check the mode
2950because the group setting doesn't always get set automatically. */
2951
1ac6b2e7
JH
2952if (fchown(data_fd, exim_uid, exim_gid))
2953 log_write(0, LOG_MAIN|LOG_PANIC_DIE,
2954 "Failed setting ownership on spool file %s: %s",
2955 spool_name, strerror(errno));
ff790e47 2956(void)fchmod(data_fd, SPOOL_MODE);
059ec3d9
PH
2957
2958/* We now have data file open. Build a stream for it and lock it. We lock only
2959the first line of the file (containing the message ID) because otherwise there
2960are problems when Exim is run under Cygwin (I'm told). See comments in
2961spool_in.c, where the same locking is done. */
2962
2963data_file = fdopen(data_fd, "w+");
2964lock_data.l_type = F_WRLCK;
2965lock_data.l_whence = SEEK_SET;
2966lock_data.l_start = 0;
2967lock_data.l_len = SPOOL_DATA_START_OFFSET;
2968
2969if (fcntl(data_fd, F_SETLK, &lock_data) < 0)
2970 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Cannot lock %s (%d): %s", spool_name,
2971 errno, strerror(errno));
2972
2973/* We have an open, locked data file. Write the message id to it to make it
2974self-identifying. Then read the remainder of the input of this message and
2975write it to the data file. If the variable next != NULL, it contains the first
2976data line (which was read as a header but then turned out not to have the right
2977format); write it (remembering that it might contain binary zeros). The result
2978of fwrite() isn't inspected; instead we call ferror() below. */
2979
2980fprintf(data_file, "%s-D\n", message_id);
2981if (next != NULL)
2982 {
2983 uschar *s = next->text;
2984 int len = next->slen;
1ac6b2e7 2985 len = fwrite(s, 1, len, data_file); len = len; /* compiler quietening */
059ec3d9
PH
2986 body_linecount++; /* Assumes only 1 line */
2987 }
2988
2989/* Note that we might already be at end of file, or the logical end of file
2990(indicated by '.'), or might have encountered an error while writing the
2991message id or "next" line. */
2992
2993if (!ferror(data_file) && !(receive_feof)() && message_ended != END_DOT)
2994 {
2995 if (smtp_input)
2996 {
7e3ce68e
JH
2997 message_ended = chunking_state > CHUNKING_OFFERED
2998 ? read_message_bdat_smtp(data_file)
2999 : read_message_data_smtp(data_file);
059ec3d9
PH
3000 receive_linecount++; /* The terminating "." line */
3001 }
3002 else message_ended = read_message_data(data_file);
3003
3004 receive_linecount += body_linecount; /* For BSMTP errors mainly */
2e0c1448 3005 message_linecount += body_linecount;
059ec3d9 3006
7e3ce68e 3007 switch (message_ended)
059ec3d9 3008 {
7e3ce68e 3009 /* Handle premature termination of SMTP */
059ec3d9 3010
7e3ce68e
JH
3011 case END_EOF:
3012 if (smtp_input)
3013 {
3014 Uunlink(spool_name); /* Lose data file when closed */
3015 cancel_cutthrough_connection("sender closed connection");
3016 message_id[0] = 0; /* Indicate no message accepted */
3017 smtp_reply = handle_lost_connection(US"");
3018 smtp_yield = FALSE;
3019 goto TIDYUP; /* Skip to end of function */
3020 }
3021 break;
059ec3d9 3022
7e3ce68e
JH
3023 /* Handle message that is too big. Don't use host_or_ident() in the log
3024 message; we want to see the ident value even for non-remote messages. */
059ec3d9 3025
7e3ce68e
JH
3026 case END_SIZE:
3027 Uunlink(spool_name); /* Lose the data file when closed */
3028 cancel_cutthrough_connection("mail too big");
3029 if (smtp_input) receive_swallow_smtp(); /* Swallow incoming SMTP */
059ec3d9 3030
7e3ce68e
JH
3031 log_write(L_size_reject, LOG_MAIN|LOG_REJECT, "rejected from <%s>%s%s%s%s: "
3032 "message too big: read=%d max=%d",
3033 sender_address,
3034 (sender_fullhost == NULL)? "" : " H=",
3035 (sender_fullhost == NULL)? US"" : sender_fullhost,
3036 (sender_ident == NULL)? "" : " U=",
3037 (sender_ident == NULL)? US"" : sender_ident,
3038 message_size,
3039 thismessage_size_limit);
3040
3041 if (smtp_input)
3042 {
3043 smtp_reply = US"552 Message size exceeds maximum permitted";
3044 message_id[0] = 0; /* Indicate no message accepted */
3045 goto TIDYUP; /* Skip to end of function */
3046 }
3047 else
3048 {
3049 fseek(data_file, (long int)SPOOL_DATA_START_OFFSET, SEEK_SET);
3050 give_local_error(ERRMESS_TOOBIG,
3051 string_sprintf("message too big (max=%d)", thismessage_size_limit),
3052 US"message rejected: ", error_rc, data_file, header_list);
3053 /* Does not return */
3054 }
3055 break;
3056
3057 /* Handle bad BDAT protocol sequence */
3058
3059 case END_PROTOCOL:
3060 Uunlink(spool_name); /* Lose the data file when closed */
3061 cancel_cutthrough_connection("sender protocol error");
3062 smtp_reply = US""; /* Response already sent */
3063 message_id[0] = 0; /* Indicate no message accepted */
3064 goto TIDYUP; /* Skip to end of function */
059ec3d9
PH
3065 }
3066 }
3067
3068/* Restore the standard SIGALRM handler for any subsequent processing. (For
3069example, there may be some expansion in an ACL that uses a timer.) */
3070
3071os_non_restarting_signal(SIGALRM, sigalrm_handler);
3072
3073/* The message body has now been read into the data file. Call fflush() to
3074empty the buffers in C, and then call fsync() to get the data written out onto
3075the disk, as fflush() doesn't do this (or at least, it isn't documented as
3076having to do this). If there was an I/O error on either input or output,
3077attempt to send an error message, and unlink the spool file. For non-SMTP input
3078we can then give up. Note that for SMTP input we must swallow the remainder of
3079the input in cases of output errors, since the far end doesn't expect to see
3080anything until the terminating dot line is sent. */
3081
3082if (fflush(data_file) == EOF || ferror(data_file) ||
54fc8428 3083 EXIMfsync(fileno(data_file)) < 0 || (receive_ferror)())
059ec3d9
PH
3084 {
3085 uschar *msg_errno = US strerror(errno);
3086 BOOL input_error = (receive_ferror)() != 0;
3087 uschar *msg = string_sprintf("%s error (%s) while receiving message from %s",
3088 input_error? "Input read" : "Spool write",
3089 msg_errno,
3090 (sender_fullhost != NULL)? sender_fullhost : sender_ident);
3091
3092 log_write(0, LOG_MAIN, "Message abandoned: %s", msg);
3093 Uunlink(spool_name); /* Lose the data file */
2e5b33cd 3094 cancel_cutthrough_connection("error writing spoolfile");
059ec3d9
PH
3095
3096 if (smtp_input)
3097 {
3098 if (input_error)
3099 smtp_reply = US"451 Error while reading input data";
3100 else
3101 {
3102 smtp_reply = US"451 Error while writing spool file";
3103 receive_swallow_smtp();
3104 }
3105 message_id[0] = 0; /* Indicate no message accepted */
3106 goto TIDYUP; /* Skip to end of function */
3107 }
3108
3109 else
3110 {
3111 fseek(data_file, (long int)SPOOL_DATA_START_OFFSET, SEEK_SET);
3112 give_local_error(ERRMESS_IOERR, msg, US"", error_rc, data_file,
3113 header_list);
3114 /* Does not return */
3115 }
3116 }
3117
3118
3119/* No I/O errors were encountered while writing the data file. */
3120
3121DEBUG(D_receive) debug_printf("Data file written for message %s\n", message_id);
3122
3123
3124/* If there were any bad addresses extracted by -t, or there were no recipients
3125left after -t, send a message to the sender of this message, or write it to
3126stderr if the error handling option is set that way. Note that there may
3127legitimately be no recipients for an SMTP message if they have all been removed
3128by "discard".
3129
3130We need to rewind the data file in order to read it. In the case of no
3131recipients or stderr error writing, throw the data file away afterwards, and
3132exit. (This can't be SMTP, which always ensures there's at least one
3133syntactically good recipient address.) */
3134
3135if (extract_recip && (bad_addresses != NULL || recipients_count == 0))
3136 {
3137 DEBUG(D_receive)
3138 {
3139 if (recipients_count == 0) debug_printf("*** No recipients\n");
3140 if (bad_addresses != NULL)
3141 {
3142 error_block *eblock = bad_addresses;
3143 debug_printf("*** Bad address(es)\n");
3144 while (eblock != NULL)
3145 {
3146 debug_printf(" %s: %s\n", eblock->text1, eblock->text2);
3147 eblock = eblock->next;
3148 }
3149 }
3150 }
3151
3152 fseek(data_file, (long int)SPOOL_DATA_START_OFFSET, SEEK_SET);
3153
3154 /* If configured to send errors to the sender, but this fails, force
3155 a failure error code. We use a special one for no recipients so that it
3156 can be detected by the autoreply transport. Otherwise error_rc is set to
3157 errors_sender_rc, which is EXIT_FAILURE unless -oee was given, in which case
3158 it is EXIT_SUCCESS. */
3159
3160 if (error_handling == ERRORS_SENDER)
3161 {
3162 if (!moan_to_sender(
3163 (bad_addresses == NULL)?
3164 (extracted_ignored? ERRMESS_IGADDRESS : ERRMESS_NOADDRESS) :
3165 (recipients_list == NULL)? ERRMESS_BADNOADDRESS : ERRMESS_BADADDRESS,
3166 bad_addresses, header_list, data_file, FALSE))
3167 error_rc = (bad_addresses == NULL)? EXIT_NORECIPIENTS : EXIT_FAILURE;
3168 }
3169 else
3170 {
3171 if (bad_addresses == NULL)
3172 {
3173 if (extracted_ignored)
3174 fprintf(stderr, "exim: all -t recipients overridden by command line\n");
3175 else
3176 fprintf(stderr, "exim: no recipients in message\n");
3177 }
3178 else
3179 {
3180 fprintf(stderr, "exim: invalid address%s",
3181 (bad_addresses->next == NULL)? ":" : "es:\n");
3182 while (bad_addresses != NULL)
3183 {
3184 fprintf(stderr, " %s: %s\n", bad_addresses->text1,
3185 bad_addresses->text2);
3186 bad_addresses = bad_addresses->next;
3187 }
3188 }
3189 }
3190
3191 if (recipients_count == 0 || error_handling == ERRORS_STDERR)
3192 {
3193 Uunlink(spool_name);
f1e894f3 3194 (void)fclose(data_file);
059ec3d9
PH
3195 exim_exit(error_rc);
3196 }
3197 }
3198
3199/* Data file successfully written. Generate text for the Received: header by
3200expanding the configured string, and adding a timestamp. By leaving this
3201operation till now, we ensure that the timestamp is the time that message
3202reception was completed. However, this is deliberately done before calling the
3203data ACL and local_scan().
3204
3205This Received: header may therefore be inspected by the data ACL and by code in
3206the local_scan() function. When they have run, we update the timestamp to be
3207the final time of reception.
3208
3209If there is just one recipient, set up its value in the $received_for variable
3210for use when we generate the Received: header.
3211
3212Note: the checking for too many Received: headers is handled by the delivery
3213code. */
e4bdf652 3214/*XXX eventually add excess Received: check for cutthrough case back when classifying them */
059ec3d9 3215
e4bdf652 3216if (received_header->text == NULL) /* Non-cutthrough case */
059ec3d9 3217 {
e4bdf652 3218 received_header_gen();
059ec3d9 3219
e4bdf652 3220 /* Set the value of message_body_size for the DATA ACL and for local_scan() */
059ec3d9 3221
e4bdf652
JH
3222 message_body_size = (fstat(data_fd, &statbuf) == 0)?
3223 statbuf.st_size - SPOOL_DATA_START_OFFSET : -1;
059ec3d9 3224
e4bdf652
JH
3225 /* If an ACL from any RCPT commands set up any warning headers to add, do so
3226 now, before running the DATA ACL. */
059ec3d9 3227
578d43dc 3228 add_acl_headers(ACL_WHERE_RCPT, US"MAIL or RCPT");
e4bdf652 3229 }
817d9f57 3230else
e4bdf652
JH
3231 message_body_size = (fstat(data_fd, &statbuf) == 0)?
3232 statbuf.st_size - SPOOL_DATA_START_OFFSET : -1;
059ec3d9
PH
3233
3234/* If an ACL is specified for checking things at this stage of reception of a
3235message, run it, unless all the recipients were removed by "discard" in earlier
3236ACLs. That is the only case in which recipients_count can be zero at this
3237stage. Set deliver_datafile to point to the data file so that $message_body and
3238$message_body_end can be extracted if needed. Allow $recipients in expansions.
3239*/
3240
3241deliver_datafile = data_fd;
4e88a19f 3242user_msg = NULL;
059ec3d9 3243
0e20aff9
MH
3244enable_dollar_recipients = TRUE;
3245
059ec3d9 3246if (recipients_count == 0)
7e3ce68e
JH
3247 blackholed_by = recipients_discarded ? US"MAIL ACL" : US"RCPT ACL";
3248
059ec3d9
PH
3249else
3250 {
059ec3d9
PH
3251 /* Handle interactive SMTP messages */
3252
3253 if (smtp_input && !smtp_batched_input)
3254 {
8523533c 3255
80a47a2c
TK
3256#ifndef DISABLE_DKIM
3257 if (!dkim_disable_verify)
3258 {
3259 /* Finish verification, this will log individual signature results to
3260 the mainlog */
3261 dkim_exim_verify_finish();
3262
3263 /* Check if we must run the DKIM ACL */
7e3ce68e 3264 if (acl_smtp_dkim && dkim_verify_signers && *dkim_verify_signers)
80a47a2c
TK
3265 {
3266 uschar *dkim_verify_signers_expanded =
3267 expand_string(dkim_verify_signers);
7e3ce68e 3268 if (!dkim_verify_signers_expanded)
80a47a2c
TK
3269 log_write(0, LOG_MAIN|LOG_PANIC,
3270 "expansion of dkim_verify_signers option failed: %s",
3271 expand_string_message);
7e3ce68e 3272
80a47a2c
TK
3273 else
3274 {
3275 int sep = 0;
55414b25 3276 const uschar *ptr = dkim_verify_signers_expanded;
80a47a2c 3277 uschar *item = NULL;
9e5d6b55
TK
3278 uschar *seen_items = NULL;
3279 int seen_items_size = 0;
3280 int seen_items_offset = 0;
9122af94
TK
3281 /* Default to OK when no items are present */
3282 rc = OK;
7e3ce68e 3283 while ((item = string_nextinlist(&ptr, &sep, NULL, 0)))
80a47a2c 3284 {
6119d1ea 3285 /* Prevent running ACL for an empty item */
7e3ce68e 3286 if (!item || !*item) continue;
5032d1cf
JH
3287
3288 /* Only run ACL once for each domain or identity,
3289 no matter how often it appears in the expanded list. */
3290 if (seen_items)
6119d1ea 3291 {
ae9094bf 3292 uschar *seen_item = NULL;
55414b25 3293 const uschar *seen_items_list = seen_items;
5032d1cf 3294 BOOL seen_this_item = FALSE;
61147df4 3295
ae9094bf 3296 while ((seen_item = string_nextinlist(&seen_items_list, &sep,
7e3ce68e 3297 NULL, 0)))
5032d1cf
JH
3298 if (Ustrcmp(seen_item,item) == 0)
3299 {
3300 seen_this_item = TRUE;
3301 break;
3302 }
3303
3304 if (seen_this_item)
6119d1ea
TK
3305 {
3306 DEBUG(D_receive)
5032d1cf
JH
3307 debug_printf("acl_smtp_dkim: skipping signer %s, "
3308 "already seen\n", item);
6119d1ea
TK
3309 continue;
3310 }
61147df4 3311
5032d1cf
JH
3312 seen_items = string_append(seen_items, &seen_items_size,
3313 &seen_items_offset, 1, ":");
6119d1ea
TK
3314 }
3315
5032d1cf
JH
3316 seen_items = string_append(seen_items, &seen_items_size,
3317 &seen_items_offset, 1, item);
4a73449b 3318 seen_items[seen_items_offset] = '\0';
6119d1ea
TK
3319
3320 DEBUG(D_receive)
5032d1cf
JH
3321 debug_printf("calling acl_smtp_dkim for dkim_cur_signer=%s\n",
3322 item);
6119d1ea 3323
80a47a2c 3324 dkim_exim_acl_setup(item);
5032d1cf
JH
3325 rc = acl_check(ACL_WHERE_DKIM, NULL, acl_smtp_dkim,
3326 &user_msg, &log_msg);
6119d1ea
TK
3327
3328 if (rc != OK)
5032d1cf
JH
3329 {
3330 DEBUG(D_receive)
3331 debug_printf("acl_smtp_dkim: acl_check returned %d on %s, "
3332 "skipping remaining items\n", rc, item);
3333 cancel_cutthrough_connection("dkim acl not ok");
3334 break;
3335 }
80a47a2c 3336 }
578d43dc 3337 add_acl_headers(ACL_WHERE_DKIM, US"DKIM");
80a47a2c
TK
3338 if (rc == DISCARD)
3339 {
3340 recipients_count = 0;
3341 blackholed_by = US"DKIM ACL";
3342 if (log_msg != NULL)
3343 blackhole_log_msg = string_sprintf(": %s", log_msg);
3344 }
3345 else if (rc != OK)
3346 {
3347 Uunlink(spool_name);
3348 if (smtp_handle_acl_fail(ACL_WHERE_DKIM, rc, user_msg, log_msg) != 0)
85ffcba6 3349 smtp_yield = FALSE; /* No more messages after dropped connection */
80a47a2c
TK
3350 smtp_reply = US""; /* Indicate reply already sent */
3351 message_id[0] = 0; /* Indicate no message accepted */
3352 goto TIDYUP; /* Skip to end of function */
3353 }
3354 }
3355 }
3356 }
4a8ce2d8 3357#endif /* DISABLE_DKIM */
fb2274d4 3358
8523533c 3359#ifdef WITH_CONTENT_SCAN
80a47a2c
TK
3360 if (recipients_count > 0 &&
3361 acl_smtp_mime != NULL &&
54cdb463
PH
3362 !run_mime_acl(acl_smtp_mime, &smtp_yield, &smtp_reply, &blackholed_by))
3363 goto TIDYUP;
8523533c
TK
3364#endif /* WITH_CONTENT_SCAN */
3365
4840604e
TL
3366#ifdef EXPERIMENTAL_DMARC
3367 dmarc_up = dmarc_store_data(from_header);
3368#endif /* EXPERIMENTAL_DMARC */
3369
8ccd00b1
JH
3370#ifndef DISABLE_PRDR
3371 if (prdr_requested && recipients_count > 1 && acl_smtp_data_prdr)
fd98a5c6
JH
3372 {
3373 unsigned int c;
3374 int all_pass = OK;
3375 int all_fail = FAIL;
3376
3377 smtp_printf("353 PRDR content analysis beginning\r\n");
3378 /* Loop through recipients, responses must be in same order received */
3379 for (c = 0; recipients_count > c; c++)
3380 {
3381 uschar * addr= recipients_list[c].address;
3382 uschar * msg= US"PRDR R=<%s> %s";
3383 uschar * code;
3384 DEBUG(D_receive)
3385 debug_printf("PRDR processing recipient %s (%d of %d)\n",
3386 addr, c+1, recipients_count);
3387 rc = acl_check(ACL_WHERE_PRDR, addr,
3388 acl_smtp_data_prdr, &user_msg, &log_msg);
3389
3390 /* If any recipient rejected content, indicate it in final message */
3391 all_pass |= rc;
3392 /* If all recipients rejected, indicate in final message */
3393 all_fail &= rc;
3394
3395 switch (rc)
3396 {
3397 case OK: case DISCARD: code = US"250"; break;
3398 case DEFER: code = US"450"; break;
3399 default: code = US"550"; break;
3400 }
3401 if (user_msg != NULL)
3402 smtp_user_msg(code, user_msg);
3403 else
3404 {
3405 switch (rc)
3406 {
3407 case OK: case DISCARD:
3408 msg = string_sprintf(CS msg, addr, "acceptance"); break;
3409 case DEFER:
3410 msg = string_sprintf(CS msg, addr, "temporary refusal"); break;
3411 default:
3412 msg = string_sprintf(CS msg, addr, "refusal"); break;
3413 }
3414 smtp_user_msg(code, msg);
3415 }
3416 if (log_msg) log_write(0, LOG_MAIN, "PRDR %s %s", addr, log_msg);
3417 else if (user_msg) log_write(0, LOG_MAIN, "PRDR %s %s", addr, user_msg);
112b6a93 3418 else log_write(0, LOG_MAIN, "%s", CS msg);
fd98a5c6
JH
3419
3420 if (rc != OK) { receive_remove_recipient(addr); c--; }
3421 }
3422 /* Set up final message, used if data acl gives OK */
3423 smtp_reply = string_sprintf("%s id=%s message %s",
3424 all_fail == FAIL ? US"550" : US"250",
3425 message_id,
3426 all_fail == FAIL
3427 ? US"rejected for all recipients"
3428 : all_pass == OK
3429 ? US"accepted"
3430 : US"accepted for some recipients");
3431 if (recipients_count == 0)
3432 {
3433 message_id[0] = 0; /* Indicate no message accepted */
3434 goto TIDYUP;
3435 }
3436 }
3437 else
3438 prdr_requested = FALSE;
8ccd00b1 3439#endif /* !DISABLE_PRDR */
fd98a5c6 3440
54cdb463
PH
3441 /* Check the recipients count again, as the MIME ACL might have changed
3442 them. */
8523533c 3443
059ec3d9
PH
3444 if (acl_smtp_data != NULL && recipients_count > 0)
3445 {
059ec3d9 3446 rc = acl_check(ACL_WHERE_DATA, NULL, acl_smtp_data, &user_msg, &log_msg);
578d43dc 3447 add_acl_headers(ACL_WHERE_DATA, US"DATA");
059ec3d9
PH
3448 if (rc == DISCARD)
3449 {
3450 recipients_count = 0;
3451 blackholed_by = US"DATA ACL";
8e669ac1
PH
3452 if (log_msg != NULL)
3453 blackhole_log_msg = string_sprintf(": %s", log_msg);
2e5b33cd 3454 cancel_cutthrough_connection("data acl discard");
059ec3d9
PH
3455 }
3456 else if (rc != OK)
3457 {
3458 Uunlink(spool_name);
2e5b33cd 3459 cancel_cutthrough_connection("data acl not ok");
8523533c
TK
3460#ifdef WITH_CONTENT_SCAN
3461 unspool_mbox();
6f0c431a
PP
3462#endif
3463#ifdef EXPERIMENTAL_DCC
3464 dcc_ok = 0;
8523533c 3465#endif
059ec3d9 3466 if (smtp_handle_acl_fail(ACL_WHERE_DATA, rc, user_msg, log_msg) != 0)
85ffcba6 3467 smtp_yield = FALSE; /* No more messages after dropped connection */
059ec3d9
PH
3468 smtp_reply = US""; /* Indicate reply already sent */
3469 message_id[0] = 0; /* Indicate no message accepted */
3470 goto TIDYUP; /* Skip to end of function */
3471 }
3472 }
3473 }
3474
3475 /* Handle non-SMTP and batch SMTP (i.e. non-interactive) messages. Note that
3476 we cannot take different actions for permanent and temporary rejections. */
3477
54cdb463 3478 else
059ec3d9 3479 {
54cdb463
PH
3480
3481#ifdef WITH_CONTENT_SCAN
3482 if (acl_not_smtp_mime != NULL &&
3483 !run_mime_acl(acl_not_smtp_mime, &smtp_yield, &smtp_reply,
3484 &blackholed_by))
3485 goto TIDYUP;
3486#endif /* WITH_CONTENT_SCAN */
3487
3488 if (acl_not_smtp != NULL)
059ec3d9 3489 {
54cdb463
PH
3490 uschar *user_msg, *log_msg;
3491 rc = acl_check(ACL_WHERE_NOTSMTP, NULL, acl_not_smtp, &user_msg, &log_msg);
3492 if (rc == DISCARD)
059ec3d9 3493 {
54cdb463
PH
3494 recipients_count = 0;
3495 blackholed_by = US"non-SMTP ACL";
3496 if (log_msg != NULL)
3497 blackhole_log_msg = string_sprintf(": %s", log_msg);
059ec3d9 3498 }
54cdb463 3499 else if (rc != OK)
059ec3d9 3500 {
54cdb463
PH
3501 Uunlink(spool_name);
3502#ifdef WITH_CONTENT_SCAN
3503 unspool_mbox();
6f0c431a
PP
3504#endif
3505#ifdef EXPERIMENTAL_DCC
3506 dcc_ok = 0;
54cdb463 3507#endif
6ea85e9a
PH
3508 /* The ACL can specify where rejections are to be logged, possibly
3509 nowhere. The default is main and reject logs. */
3510
3511 if (log_reject_target != 0)
3512 log_write(0, log_reject_target, "F=<%s> rejected by non-SMTP ACL: %s",
3513 sender_address, log_msg);
3514
54cdb463
PH
3515 if (user_msg == NULL) user_msg = US"local configuration problem";
3516 if (smtp_batched_input)
3517 {
3518 moan_smtp_batch(NULL, "%d %s", 550, user_msg);
3519 /* Does not return */
3520 }
3521 else
3522 {
3523 fseek(data_file, (long int)SPOOL_DATA_START_OFFSET, SEEK_SET);
3524 give_local_error(ERRMESS_LOCAL_ACL, user_msg,
3525 US"message rejected by non-SMTP ACL: ", error_rc, data_file,
3526 header_list);
3527 /* Does not return */
3528 }
059ec3d9 3529 }
578d43dc 3530 add_acl_headers(ACL_WHERE_NOTSMTP, US"non-SMTP");
059ec3d9 3531 }
059ec3d9
PH
3532 }
3533
54cdb463
PH
3534 /* The applicable ACLs have been run */
3535
059ec3d9
PH
3536 if (deliver_freeze) frozen_by = US"ACL"; /* for later logging */
3537 if (queue_only_policy) queued_by = US"ACL";
059ec3d9
PH
3538 }
3539
8523533c
TK
3540#ifdef WITH_CONTENT_SCAN
3541unspool_mbox();
3542#endif
3543
6a8f9482
TK
3544#ifdef EXPERIMENTAL_DCC
3545dcc_ok = 0;
3546#endif
3547
3548
059ec3d9
PH
3549/* The final check on the message is to run the scan_local() function. The
3550version supplied with Exim always accepts, but this is a hook for sysadmins to
3551supply their own checking code. The local_scan() function is run even when all
3552the recipients have been discarded. */
3553
3554lseek(data_fd, (long int)SPOOL_DATA_START_OFFSET, SEEK_SET);
3555
3556/* Arrange to catch crashes in local_scan(), so that the -D file gets
3557deleted, and the incident gets logged. */
3558
3559os_non_restarting_signal(SIGSEGV, local_scan_crash_handler);
3560os_non_restarting_signal(SIGFPE, local_scan_crash_handler);
3561os_non_restarting_signal(SIGILL, local_scan_crash_handler);
3562os_non_restarting_signal(SIGBUS, local_scan_crash_handler);
3563
3564DEBUG(D_receive) debug_printf("calling local_scan(); timeout=%d\n",
3565 local_scan_timeout);
3566local_scan_data = NULL;
3567
3568os_non_restarting_signal(SIGALRM, local_scan_timeout_handler);
3569if (local_scan_timeout > 0) alarm(local_scan_timeout);
3570rc = local_scan(data_fd, &local_scan_data);
3571alarm(0);
3572os_non_restarting_signal(SIGALRM, sigalrm_handler);
3573
0e20aff9
MH
3574enable_dollar_recipients = FALSE;
3575
059ec3d9
PH
3576store_pool = POOL_MAIN; /* In case changed */
3577DEBUG(D_receive) debug_printf("local_scan() returned %d %s\n", rc,
3578 local_scan_data);
3579
3580os_non_restarting_signal(SIGSEGV, SIG_DFL);
3581os_non_restarting_signal(SIGFPE, SIG_DFL);
3582os_non_restarting_signal(SIGILL, SIG_DFL);
3583os_non_restarting_signal(SIGBUS, SIG_DFL);
3584
3585/* The length check is paranoia against some runaway code, and also because
3586(for a success return) lines in the spool file are read into big_buffer. */
3587
3588if (local_scan_data != NULL)
3589 {
3590 int len = Ustrlen(local_scan_data);
3591 if (len > LOCAL_SCAN_MAX_RETURN) len = LOCAL_SCAN_MAX_RETURN;
3592 local_scan_data = string_copyn(local_scan_data, len);
3593 }
3594
3595if (rc == LOCAL_SCAN_ACCEPT_FREEZE)
3596 {
58eb016e 3597 if (!deliver_freeze) /* ACL might have already frozen */
059ec3d9
PH
3598 {
3599 deliver_freeze = TRUE;
3600 deliver_frozen_at = time(NULL);
3601 frozen_by = US"local_scan()";
3602 }
3603 rc = LOCAL_SCAN_ACCEPT;
3604 }
3605else if (rc == LOCAL_SCAN_ACCEPT_QUEUE)
3606 {
3607 if (!queue_only_policy) /* ACL might have already queued */
3608 {
3609 queue_only_policy = TRUE;
3610 queued_by = US"local_scan()";
3611 }
3612 rc = LOCAL_SCAN_ACCEPT;
3613 }
3614
3615/* Message accepted: remove newlines in local_scan_data because otherwise
3616the spool file gets corrupted. Ensure that all recipients are qualified. */
3617
3618if (rc == LOCAL_SCAN_ACCEPT)
3619 {
3620 if (local_scan_data != NULL)
3621 {
3622 uschar *s;
3623 for (s = local_scan_data; *s != 0; s++) if (*s == '\n') *s = ' ';
3624 }
3625 for (i = 0; i < recipients_count; i++)
3626 {
3627 recipient_item *r = recipients_list + i;
3628 r->address = rewrite_address_qualify(r->address, TRUE);
3629 if (r->errors_to != NULL)
3630 r->errors_to = rewrite_address_qualify(r->errors_to, TRUE);
3631 }
3632 if (recipients_count == 0 && blackholed_by == NULL)
3633 blackholed_by = US"local_scan";
3634 }
3635
3636/* Message rejected: newlines permitted in local_scan_data to generate
3637multiline SMTP responses. */
3638
3639else
3640 {
3641 uschar *istemp = US"";
3642 uschar *s = NULL;
a5bd321b 3643 uschar *smtp_code;
059ec3d9
PH
3644 int size = 0;
3645 int sptr = 0;
059ec3d9
PH
3646
3647 errmsg = local_scan_data;
3648
3649 Uunlink(spool_name); /* Cancel this message */
3650 switch(rc)
3651 {
3652 default:
3653 log_write(0, LOG_MAIN, "invalid return %d from local_scan(). Temporary "
3654 "rejection given", rc);
3655 goto TEMPREJECT;
3656
3657 case LOCAL_SCAN_REJECT_NOLOGHDR:
6c6d6e48 3658 BIT_CLEAR(log_selector, log_selector_size, Li_rejected_header);
059ec3d9
PH
3659 /* Fall through */
3660
3661 case LOCAL_SCAN_REJECT:
a5bd321b 3662 smtp_code = US"550";
059ec3d9
PH
3663 if (errmsg == NULL) errmsg = US"Administrative prohibition";
3664 break;
3665
3666 case LOCAL_SCAN_TEMPREJECT_NOLOGHDR:
6c6d6e48 3667 BIT_CLEAR(log_selector, log_selector_size, Li_rejected_header);
059ec3d9
PH
3668 /* Fall through */
3669
3670 case LOCAL_SCAN_TEMPREJECT:
3671 TEMPREJECT:
a5bd321b 3672 smtp_code = US"451";
059ec3d9
PH
3673 if (errmsg == NULL) errmsg = US"Temporary local problem";
3674 istemp = US"temporarily ";
3675 break;
3676 }
3677
3678 s = string_append(s, &size, &sptr, 2, US"F=",
3679 (sender_address[0] == 0)? US"<>" : sender_address);
3680 s = add_host_info_for_log(s, &size, &sptr);
3681 s[sptr] = 0;
3682
3683 log_write(0, LOG_MAIN|LOG_REJECT, "%s %srejected by local_scan(): %.256s",
3684 s, istemp, string_printing(errmsg));
3685
3686 if (smtp_input)
3687 {
3688 if (!smtp_batched_input)
3689 {
a5bd321b 3690 smtp_respond(smtp_code, 3, TRUE, errmsg);
059ec3d9
PH
3691 message_id[0] = 0; /* Indicate no message accepted */
3692 smtp_reply = US""; /* Indicate reply already sent */
3693 goto TIDYUP; /* Skip to end of function */
3694 }
3695 else
3696 {
a5bd321b 3697 moan_smtp_batch(NULL, "%s %s", smtp_code, errmsg);
059ec3d9
PH
3698 /* Does not return */
3699 }
3700 }
3701 else
3702 {
3703 fseek(data_file, (long int)SPOOL_DATA_START_OFFSET, SEEK_SET);
3704 give_local_error(ERRMESS_LOCAL_SCAN, errmsg,
3705 US"message rejected by local scan code: ", error_rc, data_file,
3706 header_list);
3707 /* Does not return */
3708 }
3709 }
3710
3711/* Reset signal handlers to ignore signals that previously would have caused
3712the message to be abandoned. */
3713
3714signal(SIGTERM, SIG_IGN);
3715signal(SIGINT, SIG_IGN);
3716
e4bdf652 3717
059ec3d9
PH
3718/* Ensure the first time flag is set in the newly-received message. */
3719
3720deliver_firsttime = TRUE;
3721
8523533c 3722#ifdef EXPERIMENTAL_BRIGHTMAIL
a2da3176
JH
3723if (bmi_run == 1)
3724 { /* rewind data file */
8523533c
TK
3725 lseek(data_fd, (long int)SPOOL_DATA_START_OFFSET, SEEK_SET);
3726 bmi_verdicts = bmi_process_message(header_list, data_fd);
a2da3176 3727 }
8523533c
TK
3728#endif
3729
059ec3d9
PH
3730/* Update the timstamp in our Received: header to account for any time taken by
3731an ACL or by local_scan(). The new time is the time that all reception
3732processing is complete. */
3733
3734timestamp = expand_string(US"${tod_full}");
3735tslen = Ustrlen(timestamp);
3736
3737memcpy(received_header->text + received_header->slen - tslen - 1,
3738 timestamp, tslen);
3739
3740/* In MUA wrapper mode, ignore queueing actions set by ACL or local_scan() */
3741
3742if (mua_wrapper)
3743 {
3744 deliver_freeze = FALSE;
3745 queue_only_policy = FALSE;
3746 }
3747
3748/* Keep the data file open until we have written the header file, in order to
3749hold onto the lock. In a -bh run, or if the message is to be blackholed, we
3750don't write the header file, and we unlink the data file. If writing the header
3751file fails, we have failed to accept this message. */
3752
3753if (host_checking || blackholed_by != NULL)
3754 {
3755 header_line *h;
3756 Uunlink(spool_name);
3757 msg_size = 0; /* Compute size for log line */
3758 for (h = header_list; h != NULL; h = h->next)
3759 if (h->type != '*') msg_size += h->slen;
3760 }
3761
3762/* Write the -H file */
3763
3764else
059ec3d9
PH
3765 if ((msg_size = spool_write_header(message_id, SW_RECEIVING, &errmsg)) < 0)
3766 {
3767 log_write(0, LOG_MAIN, "Message abandoned: %s", errmsg);
3768 Uunlink(spool_name); /* Lose the data file */
3769
3770 if (smtp_input)
3771 {
3772 smtp_reply = US"451 Error in writing spool file";
3773 message_id[0] = 0; /* Indicate no message accepted */
3774 goto TIDYUP;
3775 }
3776 else
3777 {
3778 fseek(data_file, (long int)SPOOL_DATA_START_OFFSET, SEEK_SET);
3779 give_local_error(ERRMESS_IOERR, errmsg, US"", error_rc, data_file,
3780 header_list);
3781 /* Does not return */
3782 }
3783 }
059ec3d9
PH
3784
3785
3786/* The message has now been successfully received. */
3787
3788receive_messagecount++;
3789
3790/* In SMTP sessions we may receive several in one connection. After each one,
3791we wait for the clock to tick at the level of message-id granularity. This is
3792so that the combination of time+pid is unique, even on systems where the pid
3793can be re-used within our time interval. We can't shorten the interval without
3794re-designing the message-id. See comments above where the message id is
3795created. This is Something For The Future. */
3796
3797message_id_tv.tv_usec = (message_id_tv.tv_usec/id_resolution) * id_resolution;
3798exim_wait_tick(&message_id_tv, id_resolution);
3799
3800/* Add data size to written header size. We do not count the initial file name
3801that is in the file, but we do add one extra for the notional blank line that
3802precedes the data. This total differs from message_size in that it include the
3803added Received: header and any other headers that got created locally. */
3804
3805fflush(data_file);
3806fstat(data_fd, &statbuf);
3807
3808msg_size += statbuf.st_size - SPOOL_DATA_START_OFFSET + 1;
3809
3810/* Generate a "message received" log entry. We do this by building up a dynamic
3811string as required. Since we commonly want to add two items at a time, use a
3812macro to simplify the coding. We log the arrival of a new message while the
3813file is still locked, just in case the machine is *really* fast, and delivers
3814it first! Include any message id that is in the message - since the syntax of a
3815message id is actually an addr-spec, we can use the parse routine to canonicize
3816it. */
3817
3818size = 256;
3819sptr = 0;
3820s = store_get(size);
3821
3822s = string_append(s, &size, &sptr, 2, US"<= ",
3823 (sender_address[0] == 0)? US"<>" : sender_address);
3824if (message_reference != NULL)
3825 s = string_append(s, &size, &sptr, 2, US" R=", message_reference);
3826
3827s = add_host_info_for_log(s, &size, &sptr);
3828
3829#ifdef SUPPORT_TLS
6c6d6e48 3830if (LOGGING(tls_cipher) && tls_in.cipher)
817d9f57 3831 s = string_append(s, &size, &sptr, 2, US" X=", tls_in.cipher);
6c6d6e48 3832if (LOGGING(tls_certificate_verified) && tls_in.cipher)
059ec3d9 3833 s = string_append(s, &size, &sptr, 2, US" CV=",
817d9f57 3834 tls_in.certificate_verified? "yes":"no");
6c6d6e48 3835if (LOGGING(tls_peerdn) && tls_in.peerdn)
48ed62d9 3836 s = string_append(s, &size, &sptr, 3, US" DN=\"",
817d9f57 3837 string_printing(tls_in.peerdn), US"\"");
6c6d6e48 3838if (LOGGING(tls_sni) && tls_in.sni)
3f0945ff 3839 s = string_append(s, &size, &sptr, 3, US" SNI=\"",
817d9f57 3840 string_printing(tls_in.sni), US"\"");
3f0945ff 3841#endif
059ec3d9 3842
8ccd00b1 3843if (sender_host_authenticated)
059ec3d9
PH
3844 {
3845 s = string_append(s, &size, &sptr, 2, US" A=", sender_host_authenticated);
3846 if (authenticated_id != NULL)
c8e2fc1e 3847 {
059ec3d9 3848 s = string_append(s, &size, &sptr, 2, US":", authenticated_id);
6c6d6e48 3849 if (LOGGING(smtp_mailauth) && authenticated_sender != NULL)
c8e2fc1e
JH
3850 s = string_append(s, &size, &sptr, 2, US":", authenticated_sender);
3851 }
059ec3d9
PH
3852 }
3853
8ccd00b1 3854#ifndef DISABLE_PRDR
fd98a5c6 3855if (prdr_requested)
7e3ce68e 3856 s = string_catn(s, &size, &sptr, US" PRDR", 5);
fd98a5c6 3857#endif
8ccd00b1 3858
cee5f132 3859#ifdef SUPPORT_PROXY
6c6d6e48 3860if (proxy_session && LOGGING(proxy))
e6d2a989 3861 s = string_append(s, &size, &sptr, 2, US" PRX=", proxy_local_address);
a3c86431 3862#endif
fd98a5c6 3863
7e3ce68e
JH
3864if (chunking_state > CHUNKING_OFFERED)
3865 s = string_catn(s, &size, &sptr, US" K", 2);
3866
059ec3d9
PH
3867sprintf(CS big_buffer, "%d", msg_size);
3868s = string_append(s, &size, &sptr, 2, US" S=", big_buffer);
3869
3c0a92dc
JH
3870/* log 8BITMIME mode announced in MAIL_FROM
3871 0 ... no BODY= used
3872 7 ... 7BIT
3873 8 ... 8BITMIME */
6c6d6e48 3874if (LOGGING(8bitmime))
c8e2fc1e 3875 {
3c0a92dc
JH
3876 sprintf(CS big_buffer, "%d", body_8bitmime);
3877 s = string_append(s, &size, &sptr, 2, US" M8S=", big_buffer);
c8e2fc1e 3878 }
3c0a92dc 3879
afa6d3ad
JH
3880if (*queue_name)
3881 s = string_append(s, &size, &sptr, 2, US" Q=", queue_name);
3882
059ec3d9
PH
3883/* If an addr-spec in a message-id contains a quoted string, it can contain
3884any characters except " \ and CR and so in particular it can contain NL!
3885Therefore, make sure we use a printing-characters only version for the log.
3886Also, allow for domain literals in the message id. */
3887
3888if (msgid_header != NULL)
3889 {
3890 uschar *old_id;
3891 BOOL save_allow_domain_literals = allow_domain_literals;
3892 allow_domain_literals = TRUE;
3893 old_id = parse_extract_address(Ustrchr(msgid_header->text, ':') + 1,
3894 &errmsg, &start, &end, &domain, FALSE);
3895 allow_domain_literals = save_allow_domain_literals;
3896 if (old_id != NULL)
3897 s = string_append(s, &size, &sptr, 2, US" id=", string_printing(old_id));
3898 }
3899
3900/* If subject logging is turned on, create suitable printing-character
3901text. By expanding $h_subject: we make use of the MIME decoding. */
3902
6c6d6e48 3903if (LOGGING(subject) && subject_header != NULL)
059ec3d9
PH
3904 {
3905 int i;
3906 uschar *p = big_buffer;
3907 uschar *ss = expand_string(US"$h_subject:");
3908
3909 /* Backslash-quote any double quotes or backslashes so as to make a
3910 a C-like string, and turn any non-printers into escape sequences. */
3911
3912 *p++ = '\"';
3913 if (*ss != 0) for (i = 0; i < 100 && ss[i] != 0; i++)
3914 {
3915 if (ss[i] == '\"' || ss[i] == '\\') *p++ = '\\';
3916 *p++ = ss[i];
3917 }
3918 *p++ = '\"';
3919 *p = 0;
3920 s = string_append(s, &size, &sptr, 2, US" T=", string_printing(big_buffer));
3921 }
3922
3923/* Terminate the string: string_cat() and string_append() leave room, but do
3924not put the zero in. */
3925
3926s[sptr] = 0;
3927
059ec3d9
PH
3928/* Create a message log file if message logs are being used and this message is
3929not blackholed. Write the reception stuff to it. We used to leave message log
e4bdf652 3930creation until the first delivery, but this has proved confusing for some
059ec3d9
PH
3931people. */
3932
3933if (message_logs && blackholed_by == NULL)
3934 {
3935 int fd;
3936
41313d92 3937 spool_name = spool_fname(US"msglog", message_subdir, message_id, US"");
a2da3176
JH
3938
3939 if ( (fd = Uopen(spool_name, O_WRONLY|O_APPEND|O_CREAT, SPOOL_MODE)) < 0
3940 && errno == ENOENT
3941 )
059ec3d9 3942 {
41313d92
JH
3943 (void)directory_make(spool_directory,
3944 spool_sname(US"msglog", message_subdir),
3945 MSGLOG_DIRECTORY_MODE, TRUE);
059ec3d9
PH
3946 fd = Uopen(spool_name, O_WRONLY|O_APPEND|O_CREAT, SPOOL_MODE);
3947 }
3948
3949 if (fd < 0)
3950 {
3951 log_write(0, LOG_MAIN|LOG_PANIC, "Couldn't open message log %s: %s",
3952 spool_name, strerror(errno));
3953 }
3954
3955 else
3956 {
3957 FILE *message_log = fdopen(fd, "a");
3958 if (message_log == NULL)
3959 {
3960 log_write(0, LOG_MAIN|LOG_PANIC, "Couldn't fdopen message log %s: %s",
3961 spool_name, strerror(errno));
f1e894f3 3962 (void)close(fd);
059ec3d9
PH
3963 }
3964 else
3965 {
3966 uschar *now = tod_stamp(tod_log);
3967 fprintf(message_log, "%s Received from %s\n", now, s+3);
3968 if (deliver_freeze) fprintf(message_log, "%s frozen by %s\n", now,
3969 frozen_by);
3970 if (queue_only_policy) fprintf(message_log,
3971 "%s no immediate delivery: queued by %s\n", now, queued_by);
f1e894f3 3972 (void)fclose(message_log);
059ec3d9
PH
3973 }
3974 }
3975 }
3976
58eb016e
PH
3977/* Everything has now been done for a successful message except logging its
3978arrival, and outputting an SMTP response. While writing to the log, set a flag
3979to cause a call to receive_bomb_out() if the log cannot be opened. */
3980
3981receive_call_bombout = TRUE;
3982
563b63fa
PH
3983/* Before sending an SMTP response in a TCP/IP session, we check to see if the
3984connection has gone away. This can only be done if there is no unconsumed input
3985waiting in the local input buffer. We can test for this by calling
3986receive_smtp_buffered(). RFC 2920 (pipelining) explicitly allows for additional
3987input to be sent following the final dot, so the presence of following input is
3988not an error.
58eb016e 3989
563b63fa
PH
3990If the connection is still present, but there is no unread input for the
3991socket, the result of a select() call will be zero. If, however, the connection
3992has gone away, or if there is pending input, the result of select() will be
3993non-zero. The two cases can be distinguished by trying to read the next input
3994character. If we succeed, we can unread it so that it remains in the local
3995buffer for handling later. If not, the connection has been lost.
58eb016e 3996
563b63fa
PH
3997Of course, since TCP/IP is asynchronous, there is always a chance that the
3998connection will vanish between the time of this test and the sending of the
3999response, but the chance of this happening should be small. */
4000
4001if (smtp_input && sender_host_address != NULL && !sender_host_notsocket &&
4002 !receive_smtp_buffered())
58eb016e
PH
4003 {
4004 struct timeval tv;
4005 fd_set select_check;
4006 FD_ZERO(&select_check);
4007 FD_SET(fileno(smtp_in), &select_check);
4008 tv.tv_sec = 0;
4009 tv.tv_usec = 0;
4010
563b63fa 4011 if (select(fileno(smtp_in) + 1, &select_check, NULL, NULL, &tv) != 0)
58eb016e 4012 {
80a47a2c
TK
4013 int c = (receive_getc)();
4014 if (c != EOF) (receive_ungetc)(c); else
58eb016e 4015 {
563b63fa
PH
4016 uschar *msg = US"SMTP connection lost after final dot";
4017 smtp_reply = US""; /* No attempt to send a response */
4018 smtp_yield = FALSE; /* Nothing more on this connection */
58eb016e 4019
563b63fa 4020 /* Re-use the log line workspace */
58eb016e 4021
563b63fa 4022 sptr = 0;
c2f669a4 4023 s = string_cat(s, &size, &sptr, msg);
563b63fa
PH
4024 s = add_host_info_for_log(s, &size, &sptr);
4025 s[sptr] = 0;
4026 log_write(0, LOG_MAIN, "%s", s);
58eb016e 4027
563b63fa 4028 /* Delete the files for this aborted message. */
58eb016e 4029
41313d92
JH
4030 Uunlink(spool_fname(US"input", message_subdir, message_id, US"-D"));
4031 Uunlink(spool_fname(US"input", message_subdir, message_id, US"-H"));
4032 Uunlink(spool_fname(US"msglog", message_subdir, message_id, US""));
58eb016e 4033
563b63fa
PH
4034 goto TIDYUP;
4035 }
58eb016e
PH
4036 }
4037 }
4038
4039/* The connection has not gone away; we really are going to take responsibility
4040for this message. */
4041
817d9f57 4042/* Cutthrough - had sender last-dot; assume we've sent (or bufferred) all
e4bdf652
JH
4043 data onward by now.
4044
817d9f57 4045 Send dot onward. If accepted, wipe the spooled files, log as delivered and accept
e4bdf652 4046 the sender's dot (below).
817d9f57
JH
4047 If rejected: copy response to sender, wipe the spooled files, log approriately.
4048 If temp-reject: accept to sender, keep the spooled files.
e4bdf652
JH
4049
4050 Having the normal spool files lets us do data-filtering, and store/forward on temp-reject.
817d9f57
JH
4051
4052 XXX We do not handle queue-only, freezing, or blackholes.
e4bdf652 4053*/
5032d1cf 4054if(cutthrough.fd >= 0)
e4bdf652 4055 {
85ffcba6 4056 uschar * msg= cutthrough_finaldot(); /* Ask the target system to accept the message */
817d9f57 4057 /* Logging was done in finaldot() */
e4bdf652 4058 switch(msg[0])
817d9f57
JH
4059 {
4060 case '2': /* Accept. Do the same to the source; dump any spoolfiles. */
b784ce7f 4061 cutthrough_done = ACCEPTED;
817d9f57 4062 break; /* message_id needed for SMTP accept below */
61147df4 4063
817d9f57
JH
4064 default: /* Unknown response, or error. Treat as temp-reject. */
4065 case '4': /* Temp-reject. Keep spoolfiles and accept. */
b784ce7f 4066 cutthrough_done = TMP_REJ; /* Avoid the usual immediate delivery attempt */
817d9f57 4067 break; /* message_id needed for SMTP accept below */
61147df4 4068
817d9f57
JH
4069 case '5': /* Perm-reject. Do the same to the source. Dump any spoolfiles */
4070 smtp_reply= msg; /* Pass on the exact error */
b784ce7f 4071 cutthrough_done = PERM_REJ;
817d9f57
JH
4072 break;
4073 }
e4bdf652 4074 }
58eb016e 4075
8ccd00b1
JH
4076#ifndef DISABLE_PRDR
4077if(!smtp_reply || prdr_requested)
4078#else
4079if(!smtp_reply)
fd98a5c6 4080#endif
e4bdf652
JH
4081 {
4082 log_write(0, LOG_MAIN |
6c6d6e48
TF
4083 (LOGGING(received_recipients)? LOG_RECIPIENTS : 0) |
4084 (LOGGING(received_sender)? LOG_SENDER : 0),
e4bdf652
JH
4085 "%s", s);
4086
4087 /* Log any control actions taken by an ACL or local_scan(). */
58eb016e 4088
e4bdf652
JH
4089 if (deliver_freeze) log_write(0, LOG_MAIN, "frozen by %s", frozen_by);
4090 if (queue_only_policy) log_write(L_delay_delivery, LOG_MAIN,
4091 "no immediate delivery: queued by %s", queued_by);
4092 }
4093receive_call_bombout = FALSE;
58eb016e 4094
059ec3d9
PH
4095store_reset(s); /* The store for the main log message can be reused */
4096
4097/* If the message is frozen, and freeze_tell is set, do the telling. */
4098
4099if (deliver_freeze && freeze_tell != NULL && freeze_tell[0] != 0)
4100 {
4101 moan_tell_someone(freeze_tell, NULL, US"Message frozen on arrival",
4102 "Message %s was frozen on arrival by %s.\nThe sender is <%s>.\n",
4103 message_id, frozen_by, sender_address);
4104 }
4105
4106
4107/* Either a message has been successfully received and written to the two spool
4108files, or an error in writing the spool has occurred for an SMTP message, or
58eb016e
PH
4109an SMTP message has been rejected for policy reasons. (For a non-SMTP message
4110we will have already given up because there's no point in carrying on!) In
4111either event, we must now close (and thereby unlock) the data file. In the
059ec3d9
PH
4112successful case, this leaves the message on the spool, ready for delivery. In
4113the error case, the spool file will be deleted. Then tidy up store, interact
4114with an SMTP call if necessary, and return.
4115
4116A fflush() was done earlier in the expectation that any write errors on the
4117data file will be flushed(!) out thereby. Nevertheless, it is theoretically
4118possible for fclose() to fail - but what to do? What has happened to the lock
4119if this happens? */
4120
e4bdf652 4121
059ec3d9 4122TIDYUP:
f1e894f3
PH
4123process_info[process_info_len] = 0; /* Remove message id */
4124if (data_file != NULL) (void)fclose(data_file); /* Frees the lock */
059ec3d9
PH
4125
4126/* Now reset signal handlers to their defaults */
4127
4128signal(SIGTERM, SIG_DFL);
4129signal(SIGINT, SIG_DFL);
4130
4131/* Tell an SMTP caller the state of play, and arrange to return the SMTP return
4132value, which defaults TRUE - meaning there may be more incoming messages from
4133this connection. For non-SMTP callers (where there is only ever one message),
4134the default is FALSE. */
4135
4136if (smtp_input)
4137 {
4138 yield = smtp_yield;
4139
4140 /* Handle interactive SMTP callers. After several kinds of error, smtp_reply
58eb016e
PH
4141 is set to the response that should be sent. When it is NULL, we generate
4142 default responses. After an ACL error or local_scan() error, the response has
4143 already been sent, and smtp_reply is an empty string to indicate this. */
059ec3d9
PH
4144
4145 if (!smtp_batched_input)
4146 {
4147 if (smtp_reply == NULL)
4148 {
29aba418 4149 if (fake_response != OK)
a5bd321b
PH
4150 smtp_respond((fake_response == DEFER)? US"450" : US"550", 3, TRUE,
4151 fake_response_text);
4e88a19f
PH
4152
4153 /* An OK response is required; use "message" text if present. */
4154
4155 else if (user_msg != NULL)
4156 {
4157 uschar *code = US"250";
4158 int len = 3;
4f6ae5c3 4159 smtp_message_code(&code, &len, &user_msg, NULL, TRUE);
4e88a19f
PH
4160 smtp_respond(code, len, TRUE, user_msg);
4161 }
4162
4163 /* Default OK response */
4164
7e3ce68e
JH
4165 else if (chunking_state > CHUNKING_OFFERED)
4166 {
4167 smtp_printf("250- %u byte chunk, total %d\r\n250 OK id=%s\r\n",
4168 chunking_datasize, message_size+message_linecount, message_id);
4169 chunking_state = CHUNKING_OFFERED;
4170 }
8e669ac1
PH
4171 else
4172 smtp_printf("250 OK id=%s\r\n", message_id);
7e3ce68e 4173
059ec3d9
PH
4174 if (host_checking)
4175 fprintf(stdout,
4176 "\n**** SMTP testing: that is not a real message id!\n\n");
4177 }
4e88a19f 4178
58eb016e 4179 /* smtp_reply is set non-empty */
4e88a19f 4180
8523533c
TK
4181 else if (smtp_reply[0] != 0)
4182 {
29aba418 4183 if (fake_response != OK && (smtp_reply[0] == '2'))
a5bd321b
PH
4184 smtp_respond((fake_response == DEFER)? US"450" : US"550", 3, TRUE,
4185 fake_response_text);
8e669ac1 4186 else
6951ac6c
PH
4187 smtp_printf("%.1024s\r\n", smtp_reply);
4188 }
e4bdf652 4189
817d9f57
JH
4190 switch (cutthrough_done)
4191 {
b784ce7f 4192 case ACCEPTED: log_write(0, LOG_MAIN, "Completed");/* Delivery was done */
41313d92
JH
4193 case PERM_REJ:
4194 { /* Delete spool files */
4195 Uunlink(spool_fname(US"input", message_subdir, message_id, US"-D"));
4196 Uunlink(spool_fname(US"input", message_subdir, message_id, US"-H"));
4197 Uunlink(spool_fname(US"msglog", message_subdir, message_id, US""));
817d9f57 4198 }
b784ce7f 4199 case TMP_REJ: message_id[0] = 0; /* Prevent a delivery from starting */
817d9f57 4200 default:break;
e4bdf652 4201 }
5032d1cf 4202 cutthrough.delivery = FALSE;
059ec3d9
PH
4203 }
4204
4205 /* For batched SMTP, generate an error message on failure, and do
4206 nothing on success. The function moan_smtp_batch() does not return -
4207 it exits from the program with a non-zero return code. */
4208
4209 else if (smtp_reply != NULL) moan_smtp_batch(NULL, "%s", smtp_reply);
4210 }
4211
4212
4213/* If blackholing, we can immediately log this message's sad fate. The data
4214file has already been unlinked, and the header file was never written to disk.
4215We must now indicate that nothing was received, to prevent a delivery from
4216starting. */
4217
4218if (blackholed_by != NULL)
4219 {
55414b25
JH
4220 const uschar *detail = local_scan_data
4221 ? string_printing(local_scan_data)
4222 : string_sprintf("(%s discarded recipients)", blackholed_by);
04f7d5b9 4223 log_write(0, LOG_MAIN, "=> blackhole %s%s", detail, blackhole_log_msg);
059ec3d9
PH
4224 log_write(0, LOG_MAIN, "Completed");
4225 message_id[0] = 0;
4226 }
4227
4228/* Reset headers so that logging of rejects for a subsequent message doesn't
4229include them. It is also important to set header_last = NULL before exiting
4230from this function, as this prevents certain rewrites that might happen during
4231subsequent verifying (of another incoming message) from trying to add headers
4232when they shouldn't. */
4233
4234header_list = header_last = NULL;
4235
4236return yield; /* TRUE if more messages (SMTP only) */
4237}
4238
4239/* End of receive.c */