X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/64e8827c5d5def0325ab7181fe939623c77e807c..bc49ece4e36e2e50c330df468b325aa3741dc682:/uip/send.c diff --git a/uip/send.c b/uip/send.c index 626eba16..1e48ea3a 100644 --- a/uip/send.c +++ b/uip/send.c @@ -9,7 +9,11 @@ #include #include +#include +#ifdef OAUTH_SUPPORT +# include +#endif #ifndef CYRUS_SASL # define SASLminc(a) (a) @@ -58,9 +62,9 @@ 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("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) \ @@ -69,6 +73,7 @@ X("tls", TLSminc(-3), TLSSW) \ X("initialtls", TLSminc(-10), INITTLSSW) \ X("notls", TLSminc(-5), NTLSSW) \ + X("sendmail program", 0, MTSSM) \ X("mts smtp|sendmail/smtp|sendmail/pipe", 2, MTSSW) \ X("messageid localname|random", 2, MESSAGEIDSW) \ @@ -115,14 +120,13 @@ 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, *saslmech = NULL; struct msgs *mp; struct stat st; + int snoop = 0; + char *auth_svc = NULL; - setlocale(LC_ALL, ""); - invo_name = r1bindex (argv[0], '/'); - - /* read user profile/context */ - context_read(); + if (nmh_init(argv[0], 1)) { return 1; } arguments = getarguments (invo_name, argc, argv, 1); argp = arguments; @@ -231,6 +235,11 @@ main (int argc, char **argv) vec[vecp++] = --cp; continue; + case SNOOPSW: + snoop++; + vec[vecp++] = --cp; + continue; + case DEBUGSW: debugsw++; /* fall */ case NFILTSW: @@ -242,7 +251,6 @@ main (int argc, char **argv) case NMSGDSW: case WATCSW: case NWATCSW: - case SNOOPSW: case SASLSW: case NOSASLSW: case TLSSW: @@ -251,15 +259,35 @@ main (int argc, char **argv) vec[vecp++] = --cp; continue; + case USERSW: + vec[vecp++] = --cp; + if (!(cp = *argp++) || *cp == '-') + adios (NULL, "missing argument to %s", argp[-2]); + vec[vecp++] = cp; + 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[-2]); + /* Fall through */ + case ALIASW: case FILTSW: case WIDTHSW: case CLIESW: case SERVSW: - case SASLMECHSW: - case SASLMXSSFSW: - case USERSW: case PORTSW: + case MTSSM: case MTSSW: case MESSAGEIDSW: vec[vecp++] = --cp; @@ -303,7 +331,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: @@ -382,8 +410,12 @@ go_to_it: && (distsw = atoi (cp)) && altmsg) { vec[vecp++] = "-dist"; - distfile = getcpy (m_mktemp2 (altmsg, invo_name, NULL, NULL)); - unlink(distfile); + if ((cp = m_mktemp2(altmsg, invo_name, NULL, NULL)) == NULL) { + adios(NULL, "unable to create temporary file in %s", + get_temp_dir()); + } + distfile = getcpy (cp); + (void) m_unlink(distfile); if (link (altmsg, distfile) == NOTOK) { /* Cygwin with FAT32 filesystem produces EPERM. */ if (errno != EXDEV && errno != EPERM @@ -393,7 +425,11 @@ go_to_it: ) adios (distfile, "unable to link %s to", altmsg); free (distfile); - distfile = getcpy (m_mktemp2(NULL, invo_name, NULL, NULL)); + if ((cp = m_mktemp2(NULL, invo_name, NULL, NULL)) == NULL) { + adios(NULL, "unable to create temporary file in %s", + get_temp_dir()); + } + distfile = getcpy (cp); { int in, out; struct stat st; @@ -412,6 +448,22 @@ go_to_it: distfile = NULL; } +#ifdef OAUTH_SUPPORT + 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 -saslmech xoauth2"); + } + } +#else + NMH_UNUSED(auth_svc); + NMH_UNUSED(user); + NMH_UNUSED(saslmech); +#endif /* OAUTH_SUPPORT */ + if (altmsg == NULL || stat (altmsg, &st) == NOTOK) { st.st_mtime = 0; st.st_dev = 0; @@ -424,7 +476,7 @@ 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); case NOTOK: