X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fpost.c;h=aff49a09197e0d387ec63878e2889cf1123f7fd2;hp=66d978cc0737c237177cb33e22782356a2d9571b;hb=eda249e4fdf983daef578a79a959d16dc9d5936e;hpb=a928fd1215493206663ef9c96f2a5b5bbd822cc6 diff --git a/uip/post.c b/uip/post.c index 66d978c..aff49a0 100644 --- a/uip/post.c +++ b/uip/post.c @@ -3,6 +3,10 @@ * post.c -- enter messages into the mail transport system * * $Id$ + * + * This code is Copyright (c) 2002, by the authors of nmh. See the + * COPYRIGHT file in the root directory of the nmh distribution for + * complete copyright information. */ #include @@ -13,8 +17,8 @@ #include #include -#include -#include +#include +#include #include #include @@ -36,15 +40,7 @@ # include #endif -/* - * Currently smtp and sendmail use - * the same interface for posting. - */ #ifdef SMTPMTS -# define SENDMTS -#endif - -#ifdef SENDMTS # include #endif @@ -52,6 +48,12 @@ # define uptolow(c) ((isalpha(c) && isupper (c)) ? tolower (c) : (c)) #endif +#ifndef CYRUS_SASL +# define SASLminc(a) (a) +#else /* CYRUS_SASL */ +# define SASLminc(a) 0 +#endif /* CYRUS_SASL */ + #define FCCS 10 /* max number of fccs allowed */ /* In the following array of structures, the numeric second field of the @@ -136,6 +138,12 @@ static struct swit switches[] = { { "partno", -6 }, #define QUEUESW 36 { "queued", -6 }, +#define SASLSW 37 + { "sasl", SASLminc(-4) }, +#define SASLMECHSW 38 + { "saslmech", SASLminc(-5) }, +#define USERSW 39 + { "user", SASLminc(-4) }, { NULL, 0 } }; @@ -235,6 +243,9 @@ static int whomsw = 0; /* we are whom not post */ static int checksw = 0; /* whom -check */ static int linepos=0; /* putadr()'s position on the line */ static int nameoutput=0; /* putadr() has output header name */ +static int sasl=0; /* Use SASL auth for SMTP */ +static char *saslmech=NULL; /* Force use of particular SASL mech */ +static char *user=NULL; /* Authenticate as this user */ static unsigned msgflags = 0; /* what we've seen */ @@ -267,14 +278,14 @@ static char *submitmode = "m"; /* deliver to mailbox only */ static char submitopts[6] = "vl"; /* initial options for submit */ #endif /* MMDFMTS */ -#ifdef SENDMTS +#ifdef SMTPMTS static int snoop = 0; static int smtpmode = S_MAIL; static char *clientsw = NULL; static char *serversw = NULL; extern struct smtp sm_reply; -#endif /* SENDMTS */ +#endif /* SMTPMTS */ static char prefix[] = "----- =_aaaaaaaaaa"; @@ -283,7 +294,7 @@ static char *fill_in = NULL; static char *partno = NULL; static int queued = 0; -extern int MMailids; +extern boolean draft_from_masquerading; /* defined in mts.c */ /* * static prototypes @@ -475,7 +486,7 @@ main (int argc, char **argv) adios (NULL, "missing argument to %s", argp[-2]); continue; -#ifndef SENDMTS +#ifndef SMTPMTS case CLIESW: case SERVSW: if (!(cp = *argp++) || *cp == '-') @@ -484,7 +495,7 @@ main (int argc, char **argv) case SNOOPSW: continue; -#else /* SENDMTS */ +#else /* SMTPMTS */ case MAILSW: smtpmode = S_MAIL; continue; @@ -508,7 +519,7 @@ main (int argc, char **argv) case SNOOPSW: snoop++; continue; -#endif /* SENDMTS */ +#endif /* SMTPMTS */ case FILLSW: if (!(fill_in = *argp++) || *fill_in == '-') @@ -525,6 +536,20 @@ main (int argc, char **argv) case QUEUESW: queued++; continue; + + case SASLSW: + sasl++; + continue; + + case SASLMECHSW: + if (!(saslmech = *argp++) || *saslmech == '-') + adios (NULL, "missing argument to %s", argp[-2]); + continue; + + case USERSW: + if (!(user = *argp++) || *user == '-') + adios (NULL, "missing argument to %s", argp[-2]); + continue; } } if (msg) @@ -768,15 +793,16 @@ putfmt (char *name, char *str, FILE *out) continue; } - if (MMailids && ((msgstate == RESENT) - ? (hdr->set & MRFM) - : (hdr->set & MFRM))) + if (draft_from_masquerading && ((msgstate == RESENT) + ? (hdr->set & MRFM) + : (hdr->set & MFRM))) /* The user manually specified a [Resent-]From: address in - their draft and mts.conf turned on "mmailid", so we'll - set things up to use the actual email address embedded in - the draft [Resent-]From: (after alias substitution, and - without the GECOS full name or angle brackets) as the - envelope From:. */ + their draft and the "masquerade:" line in mts.conf + doesn't contain "draft_from", so we'll set things up to + use the actual email address embedded in the draft + [Resent-]From: (after alias substitution, and without the + GECOS full name or angle brackets) as the envelope + From:. */ strncpy(from, auxformat(mp, 0), sizeof(from) - 1); if (hdr->flags & HBCC) @@ -799,14 +825,16 @@ putfmt (char *name, char *str, FILE *out) } else { /* Address includes a host, so no alias substitution is needed. */ - if (MMailids && ((msgstate == RESENT) - ? (hdr->set & MRFM) - : (hdr->set & MFRM))) - /* The user manually specified a [Resent-]From: address in their - draft and mts.conf turned on "mmailid", so we'll set things - up to use the actual email address embedded in the draft - [Resent-]From: (without the GECOS full name or angle - brackets) as the envelope From:. */ + if (draft_from_masquerading && ((msgstate == RESENT) + ? (hdr->set & MRFM) + : (hdr->set & MFRM))) + /* The user manually specified a [Resent-]From: address in + their draft and the "masquerade:" line in mts.conf + doesn't contain "draft_from", so we'll set things up to + use the actual email address embedded in the draft + [Resent-]From: (after alias substitution, and without the + GECOS full name or angle brackets) as the envelope + From:. */ strncpy(from, auxformat(mp, 0), sizeof(from) - 1); if (hdr->flags & HBCC) @@ -891,10 +919,11 @@ finish_headers (FILE *out) (int) getpid (), (long) tclock, LocalName ()); if (msgflags & MFRM) { /* There was already a From: in the draft. Don't add one. */ - if (!MMailids) - /* mts.conf didn't turn on mmailid, so we'll reveal the - user's actual account@thismachine address in a Sender: - header (and use it as the envelope From: later). */ + if (!draft_from_masquerading) + /* mts.conf didn't contain "masquerade:[...]draft_from[...]" + so we'll reveal the user's actual account@thismachine + address in a Sender: header (and use it as the envelope + From: later). */ fprintf (out, "Sender: %s\n", from); } else @@ -929,11 +958,11 @@ finish_headers (FILE *out) (int) getpid (), (long) tclock, LocalName ()); if (msgflags & MRFM) { /* There was already a Resent-From: in draft. Don't add one. */ - if (!MMailids) - /* mts.conf didn't turn on mmailid, so we'll reveal the - user's actual account@thismachine address in a - Resent-Sender: header (and use it as the envelope From: - later). */ + if (!draft_from_masquerading) + /* mts.conf didn't contain "masquerade:[...]draft_from[...]" + so we'll reveal the user's actual account@thismachine + address in a Sender: header (and use it as the envelope + From: later). */ fprintf (out, "Resent-Sender: %s\n", from); } else @@ -1374,10 +1403,10 @@ do_addresses (int bccque, int talk) die (NULL, "problem ending addresses [%s]\n", rp_valstr (retval)); #endif /* MMDFMTS */ -#ifdef SENDMTS +#ifdef SMTPMTS if (rp_isbad (retval = sm_waend ())) die (NULL, "problem ending addresses; %s", rp_string (retval)); -#endif /* SENDMTS */ +#endif /* SMTPMTS */ } @@ -1390,7 +1419,7 @@ do_addresses (int bccque, int talk) * SENDMAIL/SMTP routines */ -#ifdef SENDMTS +#ifdef SMTPMTS static void post (char *file, int bccque, int talk) @@ -1410,7 +1439,8 @@ post (char *file, int bccque, int talk) sigon (); if (rp_isbad (retval = sm_init (clientsw, serversw, watch, verbose, - snoop, onex, queued)) + snoop, onex, queued, sasl, saslmech, + user)) || rp_isbad (retval = sm_winit (smtpmode, from))) die (NULL, "problem initializing server; %s", rp_string (retval)); @@ -1447,7 +1477,8 @@ verify_all_addresses (int talk) sigon (); if (!whomsw || checksw) - if (rp_isbad (retval = sm_init (clientsw, serversw, 0, 0, snoop, 0, 0)) + if (rp_isbad (retval = sm_init (clientsw, serversw, watch, verbose, snoop, 0, + queued, sasl, saslmech, user)) || rp_isbad (retval = sm_winit (smtpmode, from))) die (NULL, "problem initializing server; %s", rp_string (retval)); @@ -1573,7 +1604,7 @@ do_text (char *file, int fd) } } -#endif /* SENDMTS */ +#endif /* SMTPMTS */ /* * MMDF routines @@ -1866,10 +1897,10 @@ sigser (int i) mm_end (NOTOK); #endif /* MMDFMTS */ -#ifdef SENDMTS +#ifdef SMTPMTS if (!whomsw || checksw) sm_end (NOTOK); -#endif /* SENDMTS */ +#endif /* SMTPMTS */ done (1); } @@ -1990,10 +2021,10 @@ die (char *what, char *fmt, ...) mm_end (NOTOK); #endif /* MMDFMTS */ -#ifdef SENDMTS +#ifdef SMTPMTS if (!whomsw || checksw) sm_end (NOTOK); -#endif /* SENDMTS */ +#endif /* SMTPMTS */ va_start(ap, fmt); advertise (what, NULL, fmt, ap);