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