]> Pileus Git - ~andy/fetchmail/blob - sink.c
cbed595e28821b75eb4e0224e8e0c9c1b2ee8c6d
[~andy/fetchmail] / sink.c
1 /*
2  * sink.c -- forwarding/delivery support for fetchmail
3  *
4  * The interface of this module (open_sink(), stuff_line(), close_sink(),
5  * release_sink()) seals off the delivery logic from the protocol machine,
6  * so the latter won't have to care whether it's shipping to an [SL]MTP
7  * listener daemon or an MDA pipe.
8  *
9  * Copyright 1998 by Eric S. Raymond
10  * For license terms, see the file COPYING in this directory.
11  */
12
13 #include  "config.h"
14 #include  <stdio.h>
15 #include  <errno.h>
16 #include  <string.h>
17 #include  <signal.h>
18 #include  <time.h>
19 #ifdef HAVE_MEMORY_H
20 #include  <memory.h>
21 #endif /* HAVE_MEMORY_H */
22 #if defined(STDC_HEADERS)
23 #include  <stdlib.h>
24 #endif
25 #if defined(HAVE_UNISTD_H)
26 #include  <unistd.h>
27 #endif
28 #if defined(HAVE_STDARG_H)
29 #include  <stdarg.h>
30 #else
31 #include  <varargs.h>
32 #endif
33 #include  <ctype.h>
34 #include  <time.h>
35
36 #include  "fetchmail.h"
37 #include  "socket.h"
38 #include  "smtp.h"
39 #include  "i18n.h"
40
41 /* BSD portability hack...I know, this is an ugly place to put it */
42 #if !defined(SIGCHLD) && defined(SIGCLD)
43 #define SIGCHLD SIGCLD
44 #endif
45
46 /* makes the open_sink()/close_sink() pair non-reentrant */
47 static int lmtp_responses;
48
49 void smtp_close(struct query *ctl, int sayquit)
50 /* close the socket to SMTP server */
51 {
52     if (ctl->smtp_socket != -1)
53     {
54         if (sayquit)
55             SMTP_quit(ctl->smtp_socket);
56         SockClose(ctl->smtp_socket);
57         ctl->smtp_socket = -1;
58     }
59     batchcount = 0;
60 }
61
62 int smtp_open(struct query *ctl)
63 /* try to open a socket to the appropriate SMTP server for this query */ 
64 {
65     char *parsed_host = NULL;
66
67     /* maybe it's time to close the socket in order to force delivery */
68     if (NUM_NONZERO(ctl->batchlimit)) {
69         if (batchcount == ctl->batchlimit)
70             smtp_close(ctl, 1);
71         batchcount++;
72     }
73
74     /* if no socket to any SMTP host is already set up, try to open one */
75     if (ctl->smtp_socket == -1) 
76     {
77         /* 
78          * RFC 1123 requires that the domain name in HELO address is a
79          * "valid principal domain name" for the client host. If we're
80          * running in invisible mode, violate this with malice
81          * aforethought in order to make the Received headers and
82          * logging look right.
83          *
84          * In fact this code relies on the RFC1123 requirement that the
85          * SMTP listener must accept messages even if verification of the
86          * HELO name fails (RFC1123 section 5.2.5, paragraph 2).
87          *
88          * How we compute the true mailhost name to pass to the
89          * listener doesn't affect behavior on RFC1123-violating
90          * listeners that check for name match; we're going to lose
91          * on those anyway because we can never give them a name
92          * that matches the local machine fetchmail is running on.
93          * What it will affect is the listener's logging.
94          */
95         struct idlist   *idp;
96         const char *id_me = run.invisible ? ctl->server.truename : fetchmailhost;
97         int oldphase = phase;
98
99         errno = 0;
100
101         /*
102          * Run down the SMTP hunt list looking for a server that's up.
103          * Use both explicit hunt entries (value TRUE) and implicit 
104          * (default) ones (value FALSE).
105          */
106         oldphase = phase;
107         phase = LISTENER_WAIT;
108
109         set_timeout(ctl->server.timeout);
110         for (idp = ctl->smtphunt; idp; idp = idp->next)
111         {
112             char        *cp;
113 #ifdef INET6_ENABLE 
114             char        *portnum = SMTP_PORT;
115 #else
116             int         portnum = SMTP_PORT;
117 #endif /* INET6_ENABLE */
118
119             xalloca(parsed_host, char *, strlen(idp->id) + 1);
120
121             ctl->smtphost = idp->id;  /* remember last host tried. */
122             if(ctl->smtphost[0]=='/')
123                 ctl->listener = LMTP_MODE;
124
125             strcpy(parsed_host, idp->id);
126             if ((cp = strrchr(parsed_host, '/')))
127             {
128                 *cp++ = 0;
129 #ifdef INET6_ENABLE 
130                 portnum = cp;
131 #else
132                 portnum = atoi(cp);
133 #endif /* INET6_ENABLE */
134             }
135
136             if (ctl->smtphost[0]=='/'){
137                 if ((ctl->smtp_socket = UnixOpen(ctl->smtphost))==-1)
138                     continue;
139             } else
140                 if ((ctl->smtp_socket = SockOpen(parsed_host,portnum,NULL,
141                                              ctl->server.plugout)) == -1)
142                     continue;
143
144             /* return immediately for ODMR */
145             if (ctl->server.protocol == P_ODMR)
146                return(ctl->smtp_socket); /* success */
147
148             /* are we doing SMTP or LMTP? */
149             SMTP_setmode(ctl->listener);
150
151             /* first, probe for ESMTP */
152             if (SMTP_ok(ctl->smtp_socket) == SM_OK &&
153                     SMTP_ehlo(ctl->smtp_socket, id_me,
154                           &ctl->server.esmtp_options) == SM_OK)
155                break;  /* success */
156
157             /*
158              * RFC 1869 warns that some listeners hang up on a failed EHLO,
159              * so it's safest not to assume the socket will still be good.
160              */
161             smtp_close(ctl, 0);
162
163             /* if opening for ESMTP failed, try SMTP */
164             if ((ctl->smtp_socket = SockOpen(parsed_host,portnum,NULL,
165                                              ctl->server.plugout)) == -1)
166                 continue;
167
168             if (SMTP_ok(ctl->smtp_socket) == SM_OK && 
169                     SMTP_helo(ctl->smtp_socket, id_me) == SM_OK)
170                 break;  /* success */
171
172             smtp_close(ctl, 0);
173         }
174         set_timeout(0);
175         phase = oldphase;
176     }
177
178     /*
179      * RFC 1123 requires that the domain name part of the
180      * RCPT TO address be "canonicalized", that is a FQDN
181      * or MX but not a CNAME.  Some listeners (like exim)
182      * enforce this.  Now that we have the actual hostname,
183      * compute what we should canonicalize with.
184      * 
185      * make sure we do not forget to drop the /port if
186      * using LMTP (hmh)
187      */
188     if (ctl->listener == LMTP_MODE && !ctl->smtpaddress) 
189     {
190         if (parsed_host && parsed_host[0] != 0)
191                 ctl->destaddr = xstrdup(parsed_host);
192         else 
193                 ctl->destaddr = (ctl->smtphost && ctl->smtphost[0] != '/') ? ctl->smtphost : "localhost";
194     } 
195     else 
196         ctl->destaddr = ctl->smtpaddress ? ctl->smtpaddress : ( ctl->smtphost && ctl->smtphost[0] != '/' ? ctl->smtphost : "localhost");
197
198     if (outlevel >= O_DEBUG && ctl->smtp_socket != -1)
199         report(stdout, GT_("forwarding to %s\n"), ctl->smtphost);
200
201     return(ctl->smtp_socket);
202 }
203
204 static void sanitize(char *s)
205 /* replace unsafe shellchars by an _ */
206 {
207     const static char *ok_chars = " 1234567890!@%-_=+:,./abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
208     char *cp;
209
210     for (cp = s; *(cp += strspn(cp, ok_chars)); /* NO INCREMENT */)
211         *cp = '_';
212 }
213
214 static int send_bouncemail(struct query *ctl, struct msgblk *msg,
215                            int userclass, char *message,
216                            int nerrors, char *errors[])
217 /* bounce back an error report a la RFC 1892 */
218 {
219     char daemon_name[18 + HOSTLEN] = "FETCHMAIL-DAEMON@";
220     char boundary[BUFSIZ], *bounce_to;
221     int sock;
222
223     /* don't bounce in reply to undeliverable bounces */
224     if (!msg->return_path[0] || strcmp(msg->return_path, "<>") == 0)
225         return(FALSE);
226
227     bounce_to = (run.bouncemail ? msg->return_path : run.postmaster);
228
229     SMTP_setmode(SMTP_MODE);
230
231     /* can't just use fetchmailhost here, it might be localhost */
232     strcat(daemon_name, host_fqdn());
233
234     /* we need only SMTP for this purpose */
235     if ((sock = SockOpen("localhost", SMTP_PORT, NULL, NULL)) == -1
236                 || SMTP_ok(sock) != SM_OK 
237                 || SMTP_helo(sock, fetchmailhost) != SM_OK
238                 || SMTP_from(sock, daemon_name, (char *)NULL) != SM_OK
239                 || SMTP_rcpt(sock, bounce_to) != SM_OK
240                 || SMTP_data(sock) != SM_OK)
241         return(FALSE);
242
243     /* our first duty is to keep the sacred foo counters turning... */
244 #ifdef HAVE_SNPRINTF
245     snprintf(boundary, sizeof(boundary),
246 #else
247     sprintf(boundary,
248 #endif /* HAVE_SNPRINTF */
249             "foo-mani-padme-hum-%d-%d-%ld", 
250             (int)getpid(), (int)getppid(), time((time_t *)NULL));
251
252     if (outlevel >= O_VERBOSE)
253         report(stdout, GT_("SMTP: (bounce-message body)\n"));
254     else
255         /* this will usually go to sylog... */
256         report(stderr, GT_("mail from %s bounced to %s\n"),
257                daemon_name, bounce_to);
258
259     /* bouncemail headers */
260     SockPrintf(sock, "Return-Path: <>\r\n");
261     SockPrintf(sock, "From: %s\r\n", daemon_name);
262     SockPrintf(sock, "To: %s\r\n", bounce_to);
263     SockPrintf(sock, "MIME-Version: 1.0\r\n");
264     SockPrintf(sock, "Content-Type: multipart/report; report-type=delivery-status;\r\n\tboundary=\"%s\"\r\n", boundary);
265     SockPrintf(sock, "\r\n");
266
267     /* RFC1892 part 1 -- human-readable message */
268     SockPrintf(sock, "--%s\r\n", boundary); 
269     SockPrintf(sock,"Content-Type: text/plain\r\n");
270     SockPrintf(sock, "\r\n");
271     SockWrite(sock, message, strlen(message));
272     SockPrintf(sock, "\r\n");
273     SockPrintf(sock, "\r\n");
274
275     if (nerrors)
276     {
277         struct idlist   *idp;
278         int             nusers;
279         
280         /* RFC1892 part 2 -- machine-readable responses */
281         SockPrintf(sock, "--%s\r\n", boundary); 
282         SockPrintf(sock,"Content-Type: message/delivery-status\r\n");
283         SockPrintf(sock, "\r\n");
284         SockPrintf(sock, "Reporting-MTA: dns; %s\r\n", fetchmailhost);
285
286         nusers = 0;
287         for (idp = msg->recipients; idp; idp = idp->next)
288             if (idp->val.status.mark == userclass)
289             {
290                 char    *error;
291                 /* Minimum RFC1894 compliance + Diagnostic-Code field */
292                 SockPrintf(sock, "\r\n");
293                 SockPrintf(sock, "Final-Recipient: rfc822; %s@%s\r\n", 
294                            idp->id, fetchmailhost);
295                 SockPrintf(sock, "Last-Attempt-Date: %s\r\n", rfc822timestamp());
296                 SockPrintf(sock, "Action: failed\r\n");
297
298                 if (nerrors == 1)
299                     /* one error applies to all users */
300                     error = errors[0];
301                 else if (nerrors > nusers)
302                 {
303                     SockPrintf(sock, "Internal error: SMTP error count doesn't match number of recipients.\r\n");
304                     break;
305                 }
306                 else
307                     /* errors correspond 1-1 to selected users */
308                     error = errors[nusers++];
309                 
310                 if (strlen(error) > 9 && isdigit(error[4])
311                         && error[5] == '.' && isdigit(error[6])
312                         && error[7] == '.' && isdigit(error[8]))
313                     /* Enhanced status code available, use it */
314                     SockPrintf(sock, "Status: %5.5s\r\n", &(error[4]));
315                 else
316                     /* Enhanced status code not available, fake one */
317                     SockPrintf(sock, "Status: %c.0.0\r\n", error[0]);
318                 SockPrintf(sock, "Diagnostic-Code: %s\r\n", error);
319             }
320         SockPrintf(sock, "\r\n");
321     }
322
323     /* RFC1892 part 3 -- headers of undelivered message */
324     SockPrintf(sock, "--%s\r\n", boundary); 
325     SockPrintf(sock, "Content-Type: text/rfc822-headers\r\n");
326     SockPrintf(sock, "\r\n");
327     SockWrite(sock, msg->headers, strlen(msg->headers));
328     SockPrintf(sock, "\r\n");
329     SockPrintf(sock, "--%s--\r\n", boundary); 
330
331     if (SMTP_eom(sock) != SM_OK || SMTP_quit(sock))
332         return(FALSE);
333
334     SockClose(sock);
335
336     return(TRUE);
337 }
338
339 static int handle_smtp_report(struct query *ctl, struct msgblk *msg)
340 /* handle SMTP errors based on the content of SMTP_response */
341 /* return of PS_REFUSED deletes mail from the server; PS_TRANSIENT keeps it */
342 {
343     int smtperr = atoi(smtp_response);
344     char *responses[1];
345
346     xalloca(responses[0], char *, strlen(smtp_response)+1);
347     strcpy(responses[0], smtp_response);
348
349 #ifdef __UNUSED__
350     /*
351      * Don't do this!  It can really mess you up if, for example, you're
352      * reporting an error with a single RCPT TO address among several;
353      * RSET discards the message body and it doesn't get sent to the
354      * valid recipients.
355      */
356     SMTP_rset(ctl->smtp_socket);    /* stay on the safe side */
357     if (outlevel >= O_DEBUG)
358         report(stdout, GT_("Saved error is still %d\n"), smtperr);
359 #endif /* __UNUSED */
360
361     /*
362      * Note: send_bouncemail message strings are not made subject
363      * to gettext translation because (a) they're going to be 
364      * embedded in a text/plain 7bit part, and (b) they're
365      * going to be associated with listener error-response
366      * messages, which are probably in English (none of the
367      * MTAs I know about are internationalized).
368      */
369     if (str_find(&ctl->antispam, smtperr))
370     {
371         /*
372          * SMTP listener explicitly refuses to deliver mail
373          * coming from this address, probably due to an
374          * anti-spam domain exclusion.  Respect this.  Don't
375          * try to ship the message, and don't prevent it from
376          * being deleted.  There's no point in bouncing the
377          * email either since most spammers don't put their
378          * real return email address anywhere in the headers
379          * (unless the user insists with the SET SPAMBOUNCE
380          * config option).
381          *
382          * Default values:
383          *
384          * 571 = sendmail's "unsolicited email refused"
385          * 550 = exim's new antispam response (temporary)
386          * 501 = exim's old antispam response
387          * 554 = Postfix antispam response.
388          *
389          */
390         if (run.spambounce)
391                 send_bouncemail(ctl, msg, XMIT_ACCEPT,
392                         "Our spam filter rejected this transaction.\r\n", 
393                         1, responses);
394         return(PS_REFUSED);
395     }
396
397     /*
398      * Suppress error message only if the response specifically 
399      * meant `excluded for policy reasons'.  We *should* see
400      * an error when the return code is less specific.
401      */
402     if (smtperr >= 400)
403         report(stderr, GT_("%cMTP error: %s\n"), 
404               ctl->listener,
405               responses[0]);
406
407     switch (smtperr)
408     {
409     case 552: /* message exceeds fixed maximum message size */
410         /*
411          * Permanent no-go condition on the
412          * ESMTP server.  Don't try to ship the message, 
413          * and allow it to be deleted.
414          */
415         if (run.bouncemail)
416             send_bouncemail(ctl, msg, XMIT_ACCEPT,
417                         "This message was too large (SMTP error 552).\r\n", 
418                         1, responses);
419         return(PS_REFUSED);
420   
421     case 553: /* invalid sending domain */
422         /*
423          * These latter days 553 usually means a spammer is trying to
424          * cover his tracks.  We never bouncemail on these, because 
425          * (a) the return address is invalid by definition, and 
426          * (b) we wouldn't want spammers to get confirmation that
427          * this address is live, anyway.
428          */
429 #ifdef __DONT_FEED_THE_SPAMMERS__
430         if (run.bouncemail)
431             send_bouncemail(ctl, msg, XMIT_ACCEPT,
432                         "Invalid address in MAIL FROM (SMTP error 553).\r\n", 
433                         1, responses);
434 #endif /* __DONT_FEED_THE_SPAMMERS__ */
435         return(PS_REFUSED);
436
437     default:
438         /* bounce non-transient errors back to the sender */
439         if (smtperr >= 500 && smtperr <= 599)
440             if (send_bouncemail(ctl, msg, XMIT_ACCEPT,
441                                 "General SMTP/ESMTP error.\r\n", 
442                                 1, responses))
443                 return(run.bouncemail ? PS_REFUSED : PS_TRANSIENT);
444         /*
445          * We're going to end up here on 4xx errors, like:
446          *
447          * 451: temporarily unable to identify sender (exim)
448          * 452: temporary out-of-queue-space condition on the ESMTP server.
449          *
450          * These are temporary errors.  Don't try to ship the message,
451          * and suppress deletion so it can be retried on a future
452          * retrieval cycle.
453          *
454          * Bouncemail *might* be appropriate here as a delay
455          * notification (note; if we ever add this, we must make
456          * sure the RFC1894 Action field is "delayed" rather than
457          * "failed").  But it's not really necessary because
458          * these are not actual failures, we're very likely to be
459          * able to recover on the next cycle.
460          */
461         return(PS_TRANSIENT);
462     }
463 }
464
465 /* these are shared by open_sink and stuffline */
466 static FILE *sinkfp;
467
468 int stuffline(struct query *ctl, char *buf)
469 /* ship a line to the given control block's output sink (SMTP server or MDA) */
470 {
471     int n, oldphase;
472     char *last;
473
474     /* The line may contain NUL characters. Find the last char to use
475      * -- the real line termination is the sequence "\n\0".
476      */
477     last = buf;
478     while ((last += strlen(last)) && (last[-1] != '\n'))
479         last++;
480
481     /* fix message lines that have only \n termination (for qmail) */
482     if (ctl->forcecr)
483     {
484         if (last - 1 == buf || last[-2] != '\r')
485         {
486             last[-1] = '\r';
487             *last++  = '\n';
488             *last    = '\0';
489         }
490     }
491
492     oldphase = phase;
493     phase = FORWARDING_WAIT;
494
495     /*
496      * SMTP byte-stuffing.  We only do this if the protocol does *not*
497      * use .<CR><LF> as EOM.  If it does, the server will already have
498      * decorated any . lines it sends back up.
499      */
500     if (*buf == '.')
501     {
502         if (ctl->server.base_protocol->delimited)       /* server has already byte-stuffed */
503         {
504             if (ctl->mda)
505                 ++buf;
506             else
507                 /* writing to SMTP, leave the byte-stuffing in place */;
508         }
509         else /* if (!protocol->delimited)       -- not byte-stuffed already */
510         {
511             if (!ctl->mda)
512                 SockWrite(ctl->smtp_socket, buf, 1);    /* byte-stuff it */
513             else
514                 /* leave it alone */;
515         }
516     }
517
518     /* we may need to strip carriage returns */
519     if (ctl->stripcr)
520     {
521         char    *sp, *tp;
522
523         for (sp = tp = buf; sp < last; sp++)
524             if (*sp != '\r')
525                 *tp++ =  *sp;
526         *tp = '\0';
527         last = tp;
528     }
529
530     n = 0;
531     if (ctl->mda || ctl->bsmtp)
532         n = fwrite(buf, 1, last - buf, sinkfp);
533     else if (ctl->smtp_socket != -1)
534         n = SockWrite(ctl->smtp_socket, buf, last - buf);
535
536     phase = oldphase;
537
538     return(n);
539 }
540
541 static int open_bsmtp_sink(struct query *ctl, struct msgblk *msg,
542               int *good_addresses, int *bad_addresses)
543 /* open a BSMTP stream */
544 {
545     struct      idlist *idp;
546
547     if (strcmp(ctl->bsmtp, "-") == 0)
548         sinkfp = stdout;
549     else
550         sinkfp = fopen(ctl->bsmtp, "a");
551
552     /* see the ap computation under the SMTP branch */
553     fprintf(sinkfp, 
554             "MAIL FROM: %s", (msg->return_path[0]) ? msg->return_path : user);
555
556     if (ctl->pass8bits || (ctl->mimemsg & MSG_IS_8BIT))
557         fputs(" BODY=8BITMIME", sinkfp);
558     else if (ctl->mimemsg & MSG_IS_7BIT)
559         fputs(" BODY=7BIT", sinkfp);
560
561     /* exim's BSMTP processor does not handle SIZE */
562     /* fprintf(sinkfp, " SIZE=%d", msg->reallen); */
563
564     fprintf(sinkfp, "\r\n");
565
566     /*
567      * RFC 1123 requires that the domain name part of the
568      * RCPT TO address be "canonicalized", that is a FQDN
569      * or MX but not a CNAME.  Some listeners (like exim)
570      * enforce this.  Now that we have the actual hostname,
571      * compute what we should canonicalize with.
572      */
573     ctl->destaddr = ctl->smtpaddress ? ctl->smtpaddress : "localhost";
574
575     *bad_addresses = 0;
576     for (idp = msg->recipients; idp; idp = idp->next)
577         if (idp->val.status.mark == XMIT_ACCEPT)
578         {
579             if (ctl->smtpname)
580                 fprintf(sinkfp, "RCPT TO: %s\r\n", ctl->smtpname);
581             else if (strchr(idp->id, '@'))
582                 fprintf(sinkfp,
583                         "RCPT TO: %s\r\n", idp->id);
584             else
585                 fprintf(sinkfp,
586                         "RCPT TO: %s@%s\r\n", idp->id, ctl->destaddr);
587             *good_addresses = 0;
588         }
589
590     fputs("DATA\r\n", sinkfp);
591
592     if (ferror(sinkfp))
593     {
594         report(stderr, GT_("BSMTP file open or preamble write failed\n"));
595         return(PS_BSMTP);
596     }
597
598     return(PS_SUCCESS);
599 }
600
601 /* this is experimental and will be removed if double bounces are reported */
602 #define EXPLICIT_BOUNCE_ON_BAD_ADDRESS
603
604 static int open_smtp_sink(struct query *ctl, struct msgblk *msg,
605               int *good_addresses, int *bad_addresses)
606 /* open an SMTP stream */
607 {
608     const char  *ap;
609     struct      idlist *idp;
610     char                options[MSGBUFSIZE]; 
611     char                addr[HOSTLEN+USERNAMELEN+1];
612 #ifdef EXPLICIT_BOUNCE_ON_BAD_ADDRESS
613     char                **from_responses;
614 #endif /* EXPLICIT_BOUNCE_ON_BAD_ADDRESS */
615     int         total_addresses;
616
617     /*
618      * Compute ESMTP options.
619      */
620     options[0] = '\0';
621     if (ctl->server.esmtp_options & ESMTP_8BITMIME) {
622          if (ctl->pass8bits || (ctl->mimemsg & MSG_IS_8BIT))
623             strcpy(options, " BODY=8BITMIME");
624          else if (ctl->mimemsg & MSG_IS_7BIT)
625             strcpy(options, " BODY=7BIT");
626     }
627
628     if ((ctl->server.esmtp_options & ESMTP_SIZE) && msg->reallen > 0)
629         sprintf(options + strlen(options), " SIZE=%d", msg->reallen);
630
631     /*
632      * Try to get the SMTP listener to take the Return-Path
633      * address as MAIL FROM.  If it won't, fall back on the
634      * remotename and mailserver host.  This won't affect replies,
635      * which use the header From address anyway; the MAIL FROM
636      * address is a place for the SMTP listener to send
637      * bouncemail.  The point is to guarantee a FQDN in the MAIL
638      * FROM line -- some SMTP listeners, like smail, become
639      * unhappy otherwise.
640      *
641      * RFC 1123 requires that the domain name part of the
642      * MAIL FROM address be "canonicalized", that is a
643      * FQDN or MX but not a CNAME.  We'll assume the Return-Path
644      * header is already in this form here (it certainly
645      * is if rewrite is on).  RFC 1123 is silent on whether
646      * a nonexistent hostname part is considered canonical.
647      *
648      * This is a potential problem if the MTAs further upstream
649      * didn't pass canonicalized From/Return-Path lines, *and* the
650      * local SMTP listener insists on them. 
651      *
652      * Handle the case where an upstream MTA is setting a return
653      * path equal to "@".  Ghod knows why anyone does this, but 
654      * it's been reported to happen in mail from Amazon.com and
655      * Motorola.
656      */
657     if (!msg->return_path[0] || (0 == strcmp(msg->return_path, "@")))
658     {
659 #ifdef HAVE_SNPRINTF
660         snprintf(addr, sizeof(addr),
661 #else
662         sprintf(addr,
663 #endif /* HAVE_SNPRINTF */
664               "%s@%s", ctl->remotename, ctl->server.truename);
665         ap = addr;
666     }
667     else if (strchr(msg->return_path,'@') || strchr(msg->return_path,'!'))
668         ap = msg->return_path;
669     else                /* in case Return-Path existed but was local */
670     {
671 #ifdef HAVE_SNPRINTF
672         snprintf(addr, sizeof(addr),
673 #else
674         sprintf(addr,
675 #endif /* HAVE_SNPRINTF */
676                 "%s@%s", msg->return_path, ctl->server.truename);
677         ap = addr;
678     }
679
680     if (SMTP_from(ctl->smtp_socket, ap, options) != SM_OK)
681     {
682         int err = handle_smtp_report(ctl, msg);
683
684         SMTP_rset(ctl->smtp_socket);    /* stay on the safe side */
685         return(err);
686     }
687
688     /*
689      * Now list the recipient addressees
690      */
691     total_addresses = 0;
692     for (idp = msg->recipients; idp; idp = idp->next)
693         total_addresses++;
694 #ifdef EXPLICIT_BOUNCE_ON_BAD_ADDRESS
695     xalloca(from_responses, char **, sizeof(char *) * total_addresses);
696 #endif /* EXPLICIT_BOUNCE_ON_BAD_ADDRESS */
697     for (idp = msg->recipients; idp; idp = idp->next)
698         if (idp->val.status.mark == XMIT_ACCEPT)
699         {
700             if (strchr(idp->id, '@'))
701                 strcpy(addr, idp->id);
702             else {
703                 if (ctl->smtpname) {
704 #ifdef HAVE_SNPRINTF
705                     snprintf(addr, sizeof(addr)-1, "%s", ctl->smtpname);
706 #else
707                     sprintf(addr, "%s", ctl->smtpname);
708 #endif /* HAVE_SNPRINTF */
709
710                 } else {
711 #ifdef HAVE_SNPRINTF
712                   snprintf(addr, sizeof(addr)-1, "%s@%s", idp->id, ctl->destaddr);
713 #else
714                   sprintf(addr, "%s@%s", idp->id, ctl->destaddr);
715 #endif /* HAVE_SNPRINTF */
716                 }
717             }
718             if (SMTP_rcpt(ctl->smtp_socket, addr) == SM_OK)
719                 (*good_addresses)++;
720             else
721             {
722 #ifdef EXPLICIT_BOUNCE_ON_BAD_ADDRESS
723                     char errbuf[POPBUFSIZE];
724 #endif /* EXPLICIT_BOUNCE_ON_BAD_ADDRESS */
725                 handle_smtp_report(ctl, msg);
726
727 #ifdef EXPLICIT_BOUNCE_ON_BAD_ADDRESS
728 #ifdef HAVE_SNPRINTF
729                 snprintf(errbuf, sizeof(errbuf), "%s: %s",
730                                 idp->id, smtp_response);
731 #else
732                 strncpy(errbuf, idp->id, sizeof(errbuf));
733                 strcat(errbuf, ": ");
734                 strcat(errbuf, smtp_response);
735 #endif /* HAVE_SNPRINTF */
736
737                 xalloca(from_responses[*bad_addresses], 
738                         char *, 
739                         strlen(errbuf)+1);
740                 strcpy(from_responses[*bad_addresses], errbuf);
741 #endif /* EXPLICIT_BOUNCE_ON_BAD_ADDRESS */
742
743                 (*bad_addresses)++;
744                 idp->val.status.mark = XMIT_RCPTBAD;
745                 if (outlevel >= O_VERBOSE)
746                     report(stderr, 
747                           GT_("%cMTP listener doesn't like recipient address `%s'\n"),
748                           ctl->listener, addr);
749             }
750         }
751
752 #ifdef EXPLICIT_BOUNCE_ON_BAD_ADDRESS
753     /*
754      * This should not be necessary, because the SMTP listener itself
755      * should genrate a bounce for the bad address.
756      */
757     if (*bad_addresses)
758         send_bouncemail(ctl, msg, XMIT_RCPTBAD,
759                         "Some addresses were rejected by the MDA fetchmail forwards to.\r\n",
760                         *bad_addresses, from_responses);
761 #endif /* EXPLICIT_BOUNCE_ON_BAD_ADDRESS */
762
763     /*
764      * It's tempting to do local notification only if bouncemail was
765      * insufficient -- that is, to add && total_addresses > *bad_addresses
766      * to the test here.  The problem with this theory is that it would
767      * make initial diagnosis of a broken multidrop configuration very
768      * hard -- most single-recipient messages would just invisibly bounce.
769      */
770     if (!(*good_addresses)) 
771     {
772         if (!run.postmaster[0])
773         {
774             if (outlevel >= O_VERBOSE)
775                 report(stderr, GT_("no address matches; no postmaster set.\n"));
776             SMTP_rset(ctl->smtp_socket);        /* required by RFC1870 */
777             return(PS_REFUSED);
778         }
779         if (strchr(run.postmaster, '@'))
780             strncpy(addr, run.postmaster, sizeof(addr));
781         else
782         {
783 #ifdef HAVE_SNPRINTF
784             snprintf(addr, sizeof(addr)-1, "%s@%s", run.postmaster, ctl->destaddr);
785 #else
786             sprintf(addr, "%s@%s", run.postmaster, ctl->destaddr);
787 #endif /* HAVE_SNPRINTF */
788         }
789
790         if (SMTP_rcpt(ctl->smtp_socket, addr) != SM_OK)
791         {
792             report(stderr, GT_("can't even send to %s!\n"), run.postmaster);
793             SMTP_rset(ctl->smtp_socket);        /* required by RFC1870 */
794             return(PS_REFUSED);
795         }
796
797         if (outlevel >= O_VERBOSE)
798             report(stderr, GT_("no address matches; forwarding to %s.\n"), run.postmaster);
799     }
800
801     /* 
802      * Tell the listener we're ready to send data.
803      * Some listeners (like zmailer) may return antispam errors here.
804      */
805     if (SMTP_data(ctl->smtp_socket) != SM_OK)
806     {
807         SMTP_rset(ctl->smtp_socket);    /* stay on the safe side */
808         return(handle_smtp_report(ctl, msg));
809     }
810
811     /*
812      * We need to stash this away in order to know how many
813      * response lines to expect after the LMTP end-of-message.
814      */
815     lmtp_responses = *good_addresses;
816
817     return(PS_SUCCESS);
818 }
819
820 static int open_mda_sink(struct query *ctl, struct msgblk *msg,
821               int *good_addresses, int *bad_addresses)
822 /* open a stream to a local MDA */
823 {
824 #ifdef HAVE_SIGACTION
825     struct      sigaction sa_new;
826 #endif /* HAVE_SIGACTION */
827     struct      idlist *idp;
828     int length = 0, fromlen = 0, nameslen = 0;
829     char        *names = NULL, *before, *after, *from = NULL;
830
831     ctl->destaddr = "localhost";
832
833     for (idp = msg->recipients; idp; idp = idp->next)
834         if (idp->val.status.mark == XMIT_ACCEPT)
835             (*good_addresses)++;
836
837     length = strlen(ctl->mda);
838     before = xstrdup(ctl->mda);
839
840     /* get user addresses for %T (or %s for backward compatibility) */
841     if (strstr(before, "%s") || strstr(before, "%T"))
842     {
843         /*
844          * We go through this in order to be able to handle very
845          * long lists of users and (re)implement %s.
846          */
847         nameslen = 0;
848         for (idp = msg->recipients; idp; idp = idp->next)
849             if ((idp->val.status.mark == XMIT_ACCEPT))
850                 nameslen += (strlen(idp->id) + 1);      /* string + ' ' */
851         if ((*good_addresses == 0))
852             nameslen = strlen(run.postmaster);
853
854         names = (char *)xmalloc(nameslen + 1);  /* account for '\0' */
855         if (*good_addresses == 0)
856             strcpy(names, run.postmaster);
857         else
858         {
859             names[0] = '\0';
860             for (idp = msg->recipients; idp; idp = idp->next)
861                 if (idp->val.status.mark == XMIT_ACCEPT)
862                 {
863                     strcat(names, idp->id);
864                     strcat(names, " ");
865                 }
866             names[--nameslen] = '\0';   /* chop trailing space */
867         }
868
869         /* sanitize names in order to contain only harmless shell chars */
870         sanitize(names);
871     }
872
873     /* get From address for %F */
874     if (strstr(before, "%F"))
875     {
876         from = xstrdup(msg->return_path);
877
878         /* sanitize from in order to contain *only* harmless shell chars */
879         sanitize(from);
880
881         fromlen = strlen(from);
882     }
883
884     /* do we have to build an mda string? */
885     if (names || from) 
886     {           
887         char    *sp, *dp;
888
889         /* find length of resulting mda string */
890         sp = before;
891         while ((sp = strstr(sp, "%s"))) {
892             length += nameslen - 2;     /* subtract %s */
893             sp += 2;
894         }
895         sp = before;
896         while ((sp = strstr(sp, "%T"))) {
897             length += nameslen - 2;     /* subtract %T */
898             sp += 2;
899         }
900         sp = before;
901         while ((sp = strstr(sp, "%F"))) {
902             length += fromlen - 2;      /* subtract %F */
903             sp += 2;
904         }
905
906         after = xmalloc(length + 1);
907
908         /* copy mda source string to after, while expanding %[sTF] */
909         for (dp = after, sp = before; (*dp = *sp); dp++, sp++) {
910             if (sp[0] != '%')   continue;
911
912             /* need to expand? BTW, no here overflow, because in
913             ** the worst case (end of string) sp[1] == '\0' */
914             if (sp[1] == 's' || sp[1] == 'T') {
915                 strcpy(dp, names);
916                 dp += nameslen;
917                 sp++;   /* position sp over [sT] */
918                 dp--;   /* adjust dp */
919             } else if (sp[1] == 'F') {
920                 strcpy(dp, from);
921                 dp += fromlen;
922                 sp++;   /* position sp over F */
923                 dp--;   /* adjust dp */
924             }
925         }
926
927         if (names) {
928             free(names);
929             names = NULL;
930         }
931         if (from) {
932             free(from);
933             from = NULL;
934         }
935
936         free(before);
937
938         before = after;
939     }
940
941
942     if (outlevel >= O_DEBUG)
943         report(stdout, GT_("about to deliver with: %s\n"), before);
944
945 #ifdef HAVE_SETEUID
946     /*
947      * Arrange to run with user's permissions if we're root.
948      * This will initialize the ownership of any files the
949      * MDA creates properly.  (The seteuid call is available
950      * under all BSDs and Linux)
951      */
952     seteuid(ctl->uid);
953 #endif /* HAVE_SETEUID */
954
955     sinkfp = popen(before, "w");
956     free(before);
957     before = NULL;
958
959 #ifdef HAVE_SETEUID
960     /* this will fail quietly if we didn't start as root */
961     seteuid(0);
962 #endif /* HAVE_SETEUID */
963
964     if (!sinkfp)
965     {
966         report(stderr, GT_("MDA open failed\n"));
967         return(PS_IOERR);
968     }
969
970     /*
971      * We need to disable the normal SIGCHLD handling here because 
972      * sigchld_handler() would reap away the error status, returning
973      * error status instead of 0 for successful completion.
974      */
975 #ifndef HAVE_SIGACTION
976     signal(SIGCHLD, SIG_DFL);
977 #else
978     memset (&sa_new, 0, sizeof sa_new);
979     sigemptyset (&sa_new.sa_mask);
980     sa_new.sa_handler = SIG_DFL;
981     sigaction (SIGCHLD, &sa_new, NULL);
982 #endif /* HAVE_SIGACTION */
983
984     return(PS_SUCCESS);
985 }
986
987 int open_sink(struct query *ctl, struct msgblk *msg,
988               int *good_addresses, int *bad_addresses)
989 /* set up sinkfp to be an input sink we can ship a message to */
990 {
991     *bad_addresses = *good_addresses = 0;
992
993     if (ctl->bsmtp)             /* dump to a BSMTP batch file */
994         return(open_bsmtp_sink(ctl, msg, good_addresses, bad_addresses));
995     /* 
996      * Try to forward to an SMTP or LMTP listener.  If the attempt to 
997      * open a socket fails, fall through to attempt delivery via
998      * local MDA.
999      */
1000     else if (!ctl->mda && smtp_open(ctl) != -1)
1001         return(open_smtp_sink(ctl, msg, good_addresses, bad_addresses));
1002
1003     /*
1004      * Awkward case.  User didn't specify an MDA.  Our attempt to get a
1005      * listener socket failed.  Try to cope anyway -- initial configuration
1006      * may have found procmail.
1007      */
1008     else if (!ctl->mda)
1009     {
1010         report(stderr, GT_("%cMTP connect to %s failed\n"),
1011                ctl->listener,
1012                ctl->smtphost ? ctl->smtphost : "localhost");
1013
1014 #ifndef FALLBACK_MDA
1015         /* No fallback MDA declared.  Bail out. */
1016         return(PS_SMTP);
1017 #else
1018         /*
1019          * If user had things set up to forward offsite, no way
1020          * we want to deliver locally!
1021          */
1022         if (ctl->smtphost && strcmp(ctl->smtphost, "localhost"))
1023             return(PS_SMTP);
1024
1025         /* 
1026          * User was delivering locally.  We have a fallback MDA.
1027          * Latch it in place, logging the error, and fall through.
1028          */
1029         ctl->mda = FALLBACK_MDA;
1030
1031         report(stderr, GT_("can't raise the listener; falling back to %s"),
1032                          FALLBACK_MDA);
1033 #endif
1034     }
1035
1036     if (ctl->mda)               /* must deliver through an MDA */
1037         return(open_mda_sink(ctl, msg, good_addresses, bad_addresses));
1038
1039     return(PS_SUCCESS);
1040 }
1041
1042 void release_sink(struct query *ctl)
1043 /* release the per-message output sink, whether it's a pipe or SMTP socket */
1044 {
1045     if (ctl->bsmtp && sinkfp)
1046         fclose(sinkfp);
1047     else if (ctl->mda)
1048     {
1049         if (sinkfp)
1050         {
1051             pclose(sinkfp);
1052             sinkfp = (FILE *)NULL;
1053         }
1054         deal_with_sigchld(); /* Restore SIGCHLD handling to reap zombies */
1055     }
1056 }
1057
1058 int close_sink(struct query *ctl, struct msgblk *msg, flag forward)
1059 /* perform end-of-message actions on the current output sink */
1060 {
1061     if (ctl->mda)
1062     {
1063         int rc;
1064
1065         /* close the delivery pipe, we'll reopen before next message */
1066         if (sinkfp)
1067         {
1068             rc = pclose(sinkfp);
1069             sinkfp = (FILE *)NULL;
1070         }
1071         else
1072             rc = 0;
1073
1074         deal_with_sigchld(); /* Restore SIGCHLD handling to reap zombies */
1075
1076         if (rc)
1077         {
1078             report(stderr, 
1079                    GT_("MDA returned nonzero status %d\n"), rc);
1080             return(FALSE);
1081         }
1082     }
1083     else if (ctl->bsmtp && sinkfp)
1084     {
1085         int error;
1086
1087         /* implicit disk-full check here... */
1088         fputs(".\r\n", sinkfp);
1089         error = ferror(sinkfp);
1090         if (strcmp(ctl->bsmtp, "-"))
1091             if (fclose(sinkfp) == EOF) error = 1;
1092         if (error)
1093         {
1094             report(stderr, 
1095                    GT_("Message termination or close of BSMTP file failed\n"));
1096             return(FALSE);
1097         }
1098     }
1099     else if (forward)
1100     {
1101         /* write message terminator */
1102         if (SMTP_eom(ctl->smtp_socket) != SM_OK)
1103         {
1104             if (handle_smtp_report(ctl, msg) != PS_REFUSED)
1105             {
1106                 SMTP_rset(ctl->smtp_socket);    /* stay on the safe side */
1107                 return(FALSE);
1108             }
1109             else
1110             {
1111                 report(stderr, GT_("SMTP listener refused delivery\n"));
1112                 SMTP_rset(ctl->smtp_socket);    /* stay on the safe side */
1113                 return(TRUE);
1114             }
1115         }
1116
1117         /*
1118          * If this is an SMTP connection, SMTP_eom() ate the response.
1119          * But could be this is an LMTP connection, in which case we have to
1120          * interpret either (a) a single 503 response meaning there
1121          * were no successful RCPT TOs, or (b) a variable number of
1122          * responses, one for each successful RCPT TO.  We need to send
1123          * bouncemail on each failed response and then return TRUE anyway,
1124          * otherwise the message will get left in the queue and resent
1125          * to people who got it the first time.
1126          */
1127         if (ctl->listener == LMTP_MODE)
1128         {
1129             if (lmtp_responses == 0)
1130             {
1131                 SMTP_ok(ctl->smtp_socket); 
1132
1133                 /*
1134                  * According to RFC2033, 503 is the only legal response
1135                  * if no RCPT TO commands succeeded.  No error recovery
1136                  * is really possible here, as we have no idea what
1137                  * insane thing the listener might be doing if it doesn't
1138                  * comply.
1139                  */
1140                 if (atoi(smtp_response) == 503)
1141                     report(stderr, GT_("LMTP delivery error on EOM\n"));
1142                 else
1143                     report(stderr,
1144                           GT_("Unexpected non-503 response to LMTP EOM: %s\n"),
1145                           smtp_response);
1146
1147                 /*
1148                  * It's not completely clear what to do here.  We choose to
1149                  * interpret delivery failure here as a transient error, 
1150                  * the same way SMTP delivery failure is handled.  If we're
1151                  * wrong, an undead message will get stuck in the queue.
1152                  */
1153                 return(FALSE);
1154             }
1155             else
1156             {
1157                 int     i, errors;
1158                 char    **responses;
1159
1160                 /* eat the RFC2033-required responses, saving errors */ 
1161                 xalloca(responses, char **, sizeof(char *) * lmtp_responses);
1162                 for (errors = i = 0; i < lmtp_responses; i++)
1163                 {
1164                     if (SMTP_ok(ctl->smtp_socket) == SM_OK)
1165                         responses[i] = (char *)NULL;
1166                     else
1167                     {
1168                         xalloca(responses[errors], 
1169                                 char *, 
1170                                 strlen(smtp_response)+1);
1171                         strcpy(responses[errors], smtp_response);
1172                         errors++;
1173                     }
1174                 }
1175
1176                 if (errors == 0)
1177                     return(TRUE);       /* all deliveries succeeded */
1178                 else
1179                     /*
1180                      * One or more deliveries failed.
1181                      * If we can bounce a failures list back to the
1182                      * sender, and the postmaster does not want to
1183                      * deal with the bounces return TRUE, deleting the
1184                      * message from the server so it won't be
1185                      * re-forwarded on subsequent poll cycles.
1186                      */
1187                   return(send_bouncemail(ctl, msg, XMIT_ACCEPT,
1188                                          "LSMTP partial delivery failure.\r\n",
1189                                          errors, responses));
1190             }
1191         }
1192     }
1193
1194     return(TRUE);
1195 }
1196
1197 int open_warning_by_mail(struct query *ctl, struct msgblk *msg)
1198 /* set up output sink for a mailed warning to calling user */
1199 {
1200     int good, bad;
1201
1202     /*
1203      * Dispatching warning email is a little complicated.  The problem is
1204      * that we have to deal with three distinct cases:
1205      *
1206      * 1. Single-drop running from user account.  Warning mail should
1207      * go to the local name for which we're collecting (coincides
1208      * with calling user).
1209      *
1210      * 2. Single-drop running from root or other privileged ID, with rc
1211      * file generated on the fly (Ken Estes's weird setup...)  Mail
1212      * should go to the local name for which we're collecting (does not 
1213      * coincide with calling user).
1214      * 
1215      * 3. Multidrop.  Mail must go to postmaster.  We leave the recipients
1216      * member null so this message will fall through to run.postmaster.
1217      *
1218      * The zero in the reallen element means we won't pass a SIZE
1219      * option to ESMTP; the message length would be more trouble than
1220      * it's worth to compute.
1221      */
1222     struct msgblk reply = {NULL, NULL, "FETCHMAIL-DAEMON@", 0};
1223     int status;
1224
1225     strcat(reply.return_path, fetchmailhost);
1226
1227     if (!MULTIDROP(ctl))                /* send to calling user */
1228     {
1229         save_str(&reply.recipients, ctl->localnames->id, XMIT_ACCEPT);
1230         status = open_sink(ctl, &reply, &good, &bad);
1231         free_str_list(&reply.recipients);
1232     }
1233     else                                /* send to postmaster  */
1234         status = open_sink(ctl, &reply, &good, &bad);
1235     stuff_warning(ctl, "Date: %s", rfc822timestamp());
1236     return(status);
1237 }
1238
1239 #if defined(HAVE_STDARG_H)
1240 void stuff_warning(struct query *ctl, const char *fmt, ... )
1241 #else
1242 void stuff_warning(struct query *ctl, fmt, va_alist)
1243 struct query *ctl;
1244 const char *fmt;        /* printf-style format */
1245 va_dcl
1246 #endif
1247 /* format and ship a warning message line by mail */
1248 {
1249     char        buf[POPBUFSIZE];
1250     va_list ap;
1251
1252     /*
1253      * stuffline() requires its input to be writeable (for CR stripping),
1254      * so we needed to copy the message to a writeable buffer anyway in
1255      * case it was a string constant.  We make a virtue of that necessity
1256      * here by supporting stdargs/varargs.
1257      */
1258 #if defined(HAVE_STDARG_H)
1259     va_start(ap, fmt) ;
1260 #else
1261     va_start(ap);
1262 #endif
1263 #ifdef HAVE_VSNPRINTF
1264     vsnprintf(buf, sizeof(buf), fmt, ap);
1265 #else
1266     vsprintf(buf, fmt, ap);
1267 #endif
1268     va_end(ap);
1269
1270 #ifdef HAVE_SNPRINTF
1271     snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\r\n");
1272 #else
1273     strcat(buf, "\r\n");
1274 #endif /* HAVE_SNPRINTF */
1275
1276     stuffline(ctl, buf);
1277 }
1278
1279 void close_warning_by_mail(struct query *ctl, struct msgblk *msg)
1280 /* sign and send mailed warnings */
1281 {
1282     stuff_warning(ctl, GT_("--\r\n\t\t\t\tThe Fetchmail Daemon\r\n"));
1283     close_sink(ctl, msg, TRUE);
1284 }
1285
1286 /* sink.c ends here */