X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/012d05c2b62332eb400d66b806e48216d39358c6..4a56a28ac:/uip/send.c?ds=sidebyside diff --git a/uip/send.c b/uip/send.c index 22cdb10c..297b8f04 100644 --- a/uip/send.c +++ b/uip/send.c @@ -1,6 +1,4 @@ - -/* - * send.c -- send a composed message +/* send.c -- send a composed message * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for @@ -9,9 +7,12 @@ #include #include - -#include #include +#ifdef OAUTH_SUPPORT +# include +#endif +#include "../sbr/m_maildir.h" +#include "../sbr/m_mktemp.h" #ifndef CYRUS_SASL # define SASLminc(a) (a) @@ -60,18 +61,16 @@ X("server host", 6, SERVSW) \ X("snoop", 5, SNOOPSW) \ X("sasl", SASLminc(4), SASLSW) \ - X("nosasl", SASLminc(-6), NOSASLSW) \ - X("saslmaxssf", SASLminc(-10), SASLMXSSFSW) \ - X("saslmech mechanism", SASLminc(-5), SASLMECHSW) \ - X("oauth service", 0, OAUTHSW) \ + X("nosasl", SASLminc(6), NOSASLSW) \ + X("saslmech mechanism", SASLminc(6), SASLMECHSW) \ + X("authservice", SASLminc(0), AUTHSERVICESW) \ X("user username", SASLminc(-4), USERSW) \ - X("attach", -6, ATTACHSW) \ - X("noattach", -8, NOATTACHSW) \ - X("attachformat", 7, ATTACHFORMATSW) \ X("port server-port-name/number", 4, PORTSW) \ X("tls", TLSminc(-3), TLSSW) \ X("initialtls", TLSminc(-10), INITTLSSW) \ X("notls", TLSminc(-5), NTLSSW) \ + X("certverify", TLSminc(-10), CERTVERSW) \ + X("nocertverify", TLSminc(-12), NOCERTVERSW) \ X("sendmail program", 0, MTSSM) \ X("mts smtp|sendmail/smtp|sendmail/pipe", 2, MTSSW) \ X("messageid localname|random", 2, MESSAGEIDSW) \ @@ -119,10 +118,11 @@ main (int argc, char **argv) char *cp, *dfolder = NULL, *maildir = NULL; char buf[BUFSIZ], **ap, **argp, **arguments, *program; char *msgs[MAXARGS], **vec; - const char *user = NULL, *oauth_svc = NULL; + const char *user = NULL, *saslmech = NULL; struct msgs *mp; struct stat st; int snoop = 0; + char *auth_svc = NULL; if (nmh_init(argv[0], 1)) { return 1; } @@ -239,7 +239,8 @@ main (int argc, char **argv) continue; case DEBUGSW: - debugsw++; /* fall */ + debugsw++; + /* FALLTHRU */ case NFILTSW: case FRMTSW: case NFRMTSW: @@ -254,20 +255,11 @@ main (int argc, char **argv) case TLSSW: case INITTLSSW: case NTLSSW: + case CERTVERSW: + case NOCERTVERSW: vec[vecp++] = --cp; continue; - case OAUTHSW: -#ifdef OAUTH_SUPPORT - if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); - oauth_svc = cp; -#else - NMH_UNUSED (oauth_svc); - adios (NULL, "not built with OAuth support"); -#endif - continue; - case USERSW: vec[vecp++] = --cp; if (!(cp = *argp++) || *cp == '-') @@ -276,13 +268,25 @@ main (int argc, char **argv) user = cp; continue; + case AUTHSERVICESW: +#ifdef OAUTH_SUPPORT + if (!(auth_svc = *argp++) || *auth_svc == '-') + adios (NULL, "missing argument to %s", argp[-2]); +#else + adios (NULL, "not built with OAuth support"); +#endif + continue; + + case SASLMECHSW: + if (!(saslmech = *argp) || *saslmech == '-') + adios (NULL, "missing argument to %s", argp[-1]); + /* FALLTHRU */ + case ALIASW: case FILTSW: case WIDTHSW: case CLIESW: case SERVSW: - case SASLMECHSW: - case SASLMXSSFSW: case PORTSW: case MTSSM: case MTSSW: @@ -292,17 +296,6 @@ main (int argc, char **argv) adios (NULL, "missing argument to %s", argp[-2]); vec[vecp++] = cp; continue; - - case ATTACHSW: - advise(NULL, "The -attach switch is deprecated"); - continue; - case NOATTACHSW: - advise(NULL, "The -noattach switch is deprecated"); - continue; - - case ATTACHFORMATSW: - advise(NULL, "The -attachformat switch is deprecated"); - continue; } } else { msgs[msgp++] = cp; @@ -315,7 +308,7 @@ main (int argc, char **argv) if ((cp = context_find ("Aliasfile"))) { char *dp = NULL; - for (ap = brkstring(dp = getcpy(cp), " ", "\n"); ap && *ap; ap++) { + for (ap = brkstring(dp = mh_xstrdup(cp), " ", "\n"); ap && *ap; ap++) { vec[vecp++] = "-alias"; vec[vecp++] = *ap; } @@ -328,7 +321,7 @@ main (int argc, char **argv) adios (msgs[0], "unable to stat draft file"); cp = concat ("Use \"", msgs[0], "\"? ", NULL); for (status = LISTDSW; status != YESW;) { - if (!(argp = getans (cp, anyl))) + if (!(argp = read_switch_multiword (cp, anyl))) done (1); switch (status = smatch (*argp, anyl)) { case NOSW: @@ -339,7 +332,7 @@ main (int argc, char **argv) showfile (++argp, msgs[0]); break; default: - advise (NULL, "say what?"); + inform("say what?"); break; } } @@ -374,7 +367,7 @@ main (int argc, char **argv) for (msgp = 0, msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (is_selected (mp, msgnum)) { - msgs[msgp++] = getcpy (m_name (msgnum)); + msgs[msgp++] = mh_xstrdup(m_name (msgnum)); unset_exists (mp, msgnum); } } @@ -389,7 +382,7 @@ go_to_it: if ((cp = getenv ("SIGNATURE")) == NULL || *cp == 0) if ((cp = context_find ("signature")) && *cp) - m_putenv ("SIGNATURE", cp); + setenv("SIGNATURE", cp, 1); for (msgnum = 0; msgnum < msgp; msgnum++) if (stat (msgs[msgnum], &st) == NOTOK) @@ -411,7 +404,7 @@ go_to_it: adios(NULL, "unable to create temporary file in %s", get_temp_dir()); } - distfile = getcpy (cp); + distfile = mh_xstrdup(cp); (void) m_unlink(distfile); if (link (altmsg, distfile) == NOTOK) { /* Cygwin with FAT32 filesystem produces EPERM. */ @@ -426,7 +419,7 @@ go_to_it: adios(NULL, "unable to create temporary file in %s", get_temp_dir()); } - distfile = getcpy (cp); + distfile = mh_xstrdup(cp); { int in, out; struct stat st; @@ -446,15 +439,19 @@ go_to_it: } #ifdef OAUTH_SUPPORT - if (oauth_svc != NULL) { + if (auth_svc == NULL) { + if (saslmech && ! strcasecmp(saslmech, "xoauth2")) { + adios (NULL, "must specify -authservice with -saslmech xoauth2"); + } + } else { if (user == NULL) { - adios (NULL, "must specify -user with -oauth"); + adios (NULL, "must specify -user with -saslmech xoauth2"); } - - vec[vecp++] = "-oauth"; - vec[vecp++] = mh_oauth_do_xoauth (user, oauth_svc, - snoop ? stderr : NULL); } +#else + NMH_UNUSED(auth_svc); + NMH_UNUSED(user); + NMH_UNUSED(saslmech); #endif /* OAUTH_SUPPORT */ if (altmsg == NULL || stat (altmsg, &st) == NOTOK) { @@ -469,11 +466,13 @@ go_to_it: closefds (3); for (msgnum = 0; msgnum < msgp; msgnum++) { - switch (sendsbr (vec, vecp, program, msgs[msgnum], &st, 1)) { + switch (sendsbr (vec, vecp, program, msgs[msgnum], &st, 1, auth_svc)) { case DONE: done (++status); + /* FALLTHRU */ case NOTOK: - status++; /* fall */ + status++; + /* FALLTHRU */ case OK: break; }