]> diplodocus.org Git - nmh/blobdiff - uip/send.c
Fix mhlogin(1) title.
[nmh] / uip / send.c
index 2fabe1c368c8855bbd015361198b1bbb4486aaf4..a623964fe0baffab3f3239c3b574f07faa62f8dd 100644 (file)
@@ -9,7 +9,11 @@
 
 #include <h/mh.h>
 #include <fcntl.h>
+#include <h/utils.h>
 
+#ifdef OAUTH_SUPPORT
+# include <h/oauth.h>
+#endif
 
 #ifndef CYRUS_SASL
 # define SASLminc(a) (a)
     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("saslmaxssf", SASLminc(6), SASLMXSSFSW) \
+    X("saslmech mechanism", SASLminc(6), SASLMECHSW) \
+    X("authservice", SASLminc(0), AUTHSERVICESW) \
     X("user username", SASLminc(-4), USERSW) \
-    X("attach", 6, ATTACHSW) \
-    X("noattach", 0, NOATTACHSW) \
+    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("sendmail program", 0, MTSSM) \
     X("mts smtp|sendmail/smtp|sendmail/pipe", 2, MTSSW) \
     X("messageid localname|random", 2, MESSAGEIDSW) \
 
@@ -115,18 +121,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;
-    char *attach = NMH_ATTACH_HEADER;  /* header field name for attachments */
-    int attachformat = 1; /* mhbuild format specifier for attachments */
-
-#ifdef LOCALE
-    setlocale(LC_ALL, "");
-#endif
-    invo_name = r1bindex (argv[0], '/');
+    int snoop = 0;
+    char *auth_svc = NULL;
 
-    /* read user profile/context */
-    context_read();
+    if (nmh_init(argv[0], 1)) { return 1; }
 
     arguments = getarguments (invo_name, argc, argv, 1);
     argp = arguments;
@@ -235,6 +236,11 @@ main (int argc, char **argv)
                    vec[vecp++] = --cp;
                    continue;
 
+               case SNOOPSW:
+                    snoop++;
+                   vec[vecp++] = --cp;
+                   continue;
+
                case DEBUGSW: 
                    debugsw++;  /* fall */
                case NFILTSW: 
@@ -246,7 +252,6 @@ main (int argc, char **argv)
                case NMSGDSW: 
                case WATCSW: 
                case NWATCSW: 
-               case SNOOPSW: 
                case SASLSW:
                case NOSASLSW:
                case TLSSW:
@@ -255,15 +260,36 @@ 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 SASLMECHSW:
+                   if (!(saslmech = *argp++) || *saslmech == '-')
+                       adios (NULL, "missing argument to %s", argp[-2]);
+                   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 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;
@@ -273,26 +299,14 @@ main (int argc, char **argv)
                    continue;
                
                case ATTACHSW:
-                   if (!(attach = *argp++) || *attach == '-')
-                       adios (NULL, "missing argument to %s", argp[-2]);
+                   advise(NULL, "The -attach switch is deprecated");
                    continue;
                case NOATTACHSW:
-                   attach = NULL;
+                   advise(NULL, "The -noattach switch is deprecated");
                    continue;
 
                case ATTACHFORMATSW:
-                   if (! *argp || **argp == '-')
-                       adios (NULL, "missing argument to %s", argp[-1]);
-                   else {
-                       attachformat = atoi (*argp);
-                       if (attachformat < 0 ||
-                           attachformat > ATTACHFORMATS - 1) {
-                           advise (NULL, "unsupported attachformat %d",
-                                   attachformat);
-                           continue;
-                       }
-                   }
-                   ++argp;
+                   advise(NULL, "The -attachformat switch is deprecated");
                    continue;
            }
        } else {
@@ -403,7 +417,7 @@ go_to_it:
                  get_temp_dir());
        }
        distfile = getcpy (cp);
-       unlink(distfile);
+       (void) m_unlink(distfile);
        if (link (altmsg, distfile) == NOTOK) {
            /* Cygwin with FAT32 filesystem produces EPERM. */
            if (errno != EXDEV  &&  errno != EPERM
@@ -436,6 +450,29 @@ 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");
+        }
+
+        vec[vecp++] = "-authservice";
+        if (saslmech  &&  ! strcasecmp(saslmech, "xoauth2")) {
+            vec[vecp++] = mh_oauth_do_xoauth (user, auth_svc, snoop ? stderr : NULL);
+        } else {
+            vec[vecp++] = auth_svc;
+        }
+    }
+#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;
@@ -448,8 +485,7 @@ go_to_it:
     closefds (3);
 
     for (msgnum = 0; msgnum < msgp; msgnum++) {
-       switch (sendsbr (vec, vecp, program, msgs[msgnum], &st, 1, attach,
-                        attachformat)) {
+       switch (sendsbr (vec, vecp, program, msgs[msgnum], &st, 1)) {
            case DONE: 
                done (++status);
            case NOTOK: