]> diplodocus.org Git - nmh/blobdiff - uip/whatnowsbr.c
Create $MH_OBJ_DIR/test/testdir if it doesn't already exist. This
[nmh] / uip / whatnowsbr.c
index 2c2d2043bd5dfc508aa80e7f227e9bcfbfc62cd2..d0423f53957db48bd16e2ac619da18b1ee80c7c3 100644 (file)
 #include <h/mime.h>
 #include <h/utils.h>
 
+#ifdef OAUTH_SUPPORT
+# include <h/oauth.h>
+#endif
+
 #define WHATNOW_SWITCHES \
     X("draftfolder +folder", 0, DFOLDSW) \
     X("draftmessage msg", 0, DMSGSW) \
@@ -233,9 +237,9 @@ WhatNow (int argc, char **argv)
     snprintf (prompt, sizeof(prompt), myprompt, invo_name);
     for (;;) {
 #ifdef READLINE_SUPPORT
-       if (!(argp = getans_via_readline (prompt, aleqs))) {
+       if (!(argp = read_switch_multiword_via_readline (prompt, aleqs))) {
 #else /* ! READLINE_SUPPORT */
-       if (!(argp = getans (prompt, aleqs))) {
+       if (!(argp = read_switch_multiword (prompt, aleqs))) {
 #endif /* READLINE_SUPPORT */
            (void) m_unlink (LINK);
            done (1);
@@ -446,9 +450,6 @@ WhatNow (int argc, char **argv)
                    annotate(drft, ATTACH_FIELD, file, 1, 0, -2, 1);
                    if (verbose) {
                        ctype = mime_type(file);
-                   }
-
-                   if (verbose) {
                        printf ("Attaching %s as a %s\n", file, ctype);
                        free (ctype);
                    }
@@ -944,11 +945,12 @@ buildfile (char **argp, char *file)
     X("draftfolder +folder", -6, SDRFSW) \
     X("draftmessage msg", -6, SDRMSW) \
     X("nodraftfolder", -3, SNDRFSW) \
-    X("sasl", SASLminc(-4), SASLSW) \
-    X("nosasl", SASLminc(-6), NOSASLSW) \
-    X("saslmaxssf", SASLminc(-10), SASLMXSSFSW) \
-    X("saslmech", SASLminc(-5), SASLMECHSW) \
-    X("user", SASLminc(-4), USERSW) \
+    X("sasl", SASLminc(4), SASLSW) \
+    X("nosasl", SASLminc(6), NOSASLSW) \
+    X("saslmaxssf", SASLminc(10), SASLMXSSFSW) \
+    X("saslmech", SASLminc(5), SASLMECHSW) \
+    X("authservice", SASLminc(0), AUTHSERVICESW) \
+    X("user username", SASLminc(4), USERSW) \
     X("attach fieldname", 6, SNDATTACHSW) \
     X("noattach", 0, SNDNOATTACHSW) \
     X("attachformat", 7, SNDATTACHFORMAT) \
@@ -956,6 +958,7 @@ buildfile (char **argp, char *file)
     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) \
 
@@ -987,6 +990,9 @@ sendit (char *sp, char **arg, char *file, int pushed)
     int        vecp, n = 1;
     char *cp, buf[BUFSIZ], **argp, *program;
     char **arguments, *savearg[MAXARGS], **vec;
+    const char *user = NULL, *saslmech = NULL;
+    char *auth_svc = NULL;
+    int snoop = 0;
     struct stat st;
 
 #ifndef        lint
@@ -1127,7 +1133,6 @@ sendit (char *sp, char **arg, char *file, int pushed)
                case NMSGDSW:
                case WATCSW:
                case NWATCSW:
-               case SNOOPSW:
                case SASLSW:
                case NOSASLSW:
                case TLSSW:
@@ -1136,15 +1141,34 @@ sendit (char *sp, char **arg, char *file, int pushed)
                    vec[vecp++] = --cp;
                    continue;
 
+               case SNOOPSW:
+                    snoop++;
+                   vec[vecp++] = --cp;
+                   continue;
+
+               case AUTHSERVICESW:
+#ifdef OAUTH_SUPPORT
+                   if (!(auth_svc = *argp++) || *auth_svc == '-')
+                       adios (NULL, "missing argument to %s", argp[-2]);
+#else
+                    NMH_UNUSED (user);
+                    NMH_UNUSED (auth_svc);
+                   adios (NULL, "not built with OAuth support");
+#endif
+                   continue;
+
+               case SASLMECHSW:
+                    saslmech = *argp;
+                   /* fall thru */
                case ALIASW:
                case FILTSW:
                case WIDTHSW:
                case CLIESW:
                case SERVSW:
                case SASLMXSSFSW:
-               case SASLMECHSW:
                case USERSW:
                case PORTSW:
+               case MTSSM:
                case MTSSW:
                case MESSAGEIDSW:
                    vec[vecp++] = --cp;
@@ -1153,6 +1177,7 @@ sendit (char *sp, char **arg, char *file, int pushed)
                        return;
                    }
                    vec[vecp++] = cp;
+                    user = cp;
                    continue;
 
                case SDRFSW:
@@ -1221,6 +1246,27 @@ sendit (char *sp, char **arg, char *file, int pushed)
        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(saslmech);
+#endif /* OAUTH_SUPPORT */
+
     if (altmsg == NULL || stat (altmsg, &st) == NOTOK) {
        st.st_mtime = 0;
        st.st_dev = 0;
@@ -1256,10 +1302,10 @@ whomfile (char **arg, char *file)
 
        case OK:
            vec = argsplit(whomproc, &program, &vecp);
-           vec[vecp++] = file;
            if (arg)
                while (*arg)
                    vec[vecp++] = *arg++;
+           vec[vecp++] = file;
            vec[vecp] = NULL;
 
            execvp (program, vec);
@@ -1288,7 +1334,7 @@ removefile (char *drft)
 
 
 /*
- * Return 1 if we already have a MIME-Verson header, 0 otherwise.
+ * Return 1 if we already have a MIME-Version header, 0 otherwise.
  */
 
 static int