]> diplodocus.org Git - nmh/blobdiff - uip/inc.c
More work, but not there just yet.
[nmh] / uip / inc.c
index b4572824a7eb7c3e094a84e126bdea5b5a7264af..61d7ea9b4d95ffb1fbeba14a8fe619ebd6f01678 100644 (file)
--- a/uip/inc.c
+++ b/uip/inc.c
 # define SASLminc(a)  0
 #endif
 
 # define SASLminc(a)  0
 #endif
 
+#ifndef TLS_SUPPORT
+# define TLSminc(a) (a)
+#else
+# define TLSminc(a)  0
+#endif
+
 #define INC_SWITCHES \
     X("audit audit-file", 0, AUDSW) \
     X("noaudit", 0, NAUDSW) \
 #define INC_SWITCHES \
     X("audit audit-file", 0, AUDSW) \
     X("noaudit", 0, NAUDSW) \
     X("version", 0, VERSIONSW) \
     X("help", 0, HELPSW) \
     X("snoop", -5, SNOOPSW) \
     X("version", 0, VERSIONSW) \
     X("help", 0, HELPSW) \
     X("snoop", -5, SNOOPSW) \
-    X("sasl", SASLminc(-4), SASLSW) \
-    X("nosasl", SASLminc(-6), NOSASLSW) \
-    X("saslmech", SASLminc(-8), SASLMECHSW) \
+    X("sasl", SASLminc(5), SASLSW) \
+    X("nosasl", SASLminc(3), NOSASLSW) \
+    X("saslmech", SASLminc(5), SASLMECHSW) \
+    X("initialtls", TLSminc(-10), INITTLSSW) \
+    X("noinitialtls", TLSminc(-12), NOINITTLSSW) \
+    X("authservice", SASLminc(0), AUTHSERVICESW) \
     X("proxy command", 0, PROXYSW) \
 
 #define X(sw, minchars, id) id,
     X("proxy command", 0, PROXYSW) \
 
 #define X(sw, minchars, id) id,
@@ -137,7 +146,7 @@ static gid_t return_gid;
 #define TRYDROPGROUPPRIVS() DROPGROUPPRIVS()
 #define DROPGROUPPRIVS() \
     if (setegid(getgid()) != 0) { \
 #define TRYDROPGROUPPRIVS() DROPGROUPPRIVS()
 #define DROPGROUPPRIVS() \
     if (setegid(getgid()) != 0) { \
-        adios ("setegid", "unable to set group to %ld", (long) getgid()); \
+        adios ("setegid", "unable to restore group to %ld", (long) getgid()); \
     }
 #define GETGROUPPRIVS() \
     if (setegid(return_gid) != 0) { \
     }
 #define GETGROUPPRIVS() \
     if (setegid(return_gid) != 0) { \
@@ -185,12 +194,12 @@ main (int argc, char **argv)
     int chgflag = 1, trnflag = 1;
     int noisy = 1, width = -1;
     int hghnum = 0, msgnum = 0;
     int chgflag = 1, trnflag = 1;
     int noisy = 1, width = -1;
     int hghnum = 0, msgnum = 0;
-    int sasl = 0;
+    int sasl = 0, tls = 0;
     int incerr = 0; /* <0 if inc hits an error which means it should not truncate mailspool */
     char *cp, *maildir = NULL, *folder = NULL;
     char *format = NULL, *form = NULL;
     char *host = NULL, *port = NULL, *user = NULL, *proxy = NULL;
     int incerr = 0; /* <0 if inc hits an error which means it should not truncate mailspool */
     char *cp, *maildir = NULL, *folder = NULL;
     char *format = NULL, *form = NULL;
     char *host = NULL, *port = NULL, *user = NULL, *proxy = NULL;
-    char *audfile = NULL, *from = NULL, *saslmech = NULL;
+    char *audfile = NULL, *from = NULL, *saslmech = NULL, *auth_svc = NULL;
     char buf[BUFSIZ], **argp, *nfs, **arguments;
     struct msgs *mp = NULL;
     struct stat st, s1;
     char buf[BUFSIZ], **argp, *nfs, **arguments;
     struct msgs *mp = NULL;
     struct stat st, s1;
@@ -200,7 +209,6 @@ main (int argc, char **argv)
 
     int nmsgs, nbytes;
     char *MAILHOST_env_variable;
 
     int nmsgs, nbytes;
     char *MAILHOST_env_variable;
-
     done=inc_done;
 
 /* absolutely the first thing we do is save our privileges,
     done=inc_done;
 
 /* absolutely the first thing we do is save our privileges,
@@ -353,6 +361,24 @@ main (int argc, char **argv)
                if (!(saslmech = *argp++) || *saslmech == '-')
                    adios (NULL, "missing argument to %s", argp[-2]);
                continue;
                if (!(saslmech = *argp++) || *saslmech == '-')
                    adios (NULL, "missing argument to %s", argp[-2]);
                continue;
+
+           case INITTLSSW:
+               tls++;
+               continue;
+
+           case NOINITTLSSW:
+               tls = 0;
+               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 PROXYSW:
                if (!(proxy = *argp++) || *proxy == '-')
                    adios (NULL, "missing argument to %s", argp[-2]);
            case PROXYSW:
                if (!(proxy = *argp++) || *proxy == '-')
                    adios (NULL, "missing argument to %s", argp[-2]);
@@ -395,12 +421,23 @@ main (int argc, char **argv)
     if (inc_type == INC_POP) {
        struct nmh_creds creds = { 0, 0, 0 };
 
     if (inc_type == INC_POP) {
        struct nmh_creds creds = { 0, 0, 0 };
 
+       if (auth_svc == NULL) {
+           if (saslmech  &&  ! strcasecmp(saslmech, "xoauth2")) {
+               adios (NULL, "must specify -authservice with -saslmech xoauth2");
+           }
+           nmh_get_credentials (host, user, sasl, &creds);
+       } else {
+           if (user == NULL) {
+               adios (NULL, "must specify -user with -saslmech xoauth2");
+           }
+           creds.user = user;
+       }
+
        /*
         * initialize POP connection
         */
        /*
         * initialize POP connection
         */
-       nmh_get_credentials (host, user, sasl, &creds);
        if (pop_init (host, port, creds.user, creds.password, proxy, snoop,
        if (pop_init (host, port, creds.user, creds.password, proxy, snoop,
-                     sasl, saslmech) == NOTOK)
+                     sasl, saslmech, tls, auth_svc) == NOTOK)
            adios (NULL, "%s", response);
 
        /* Check if there are any messages */
            adios (NULL, "%s", response);
 
        /* Check if there are any messages */
@@ -584,7 +621,7 @@ go_to_it:
                if (errno != ENOENT)
                    adios (packfile, "error on file");
                cp = concat ("Create file \"", packfile, "\"? ", NULL);
                if (errno != ENOENT)
                    adios (packfile, "error on file");
                cp = concat ("Create file \"", packfile, "\"? ", NULL);
-               if (noisy && !getanswer (cp))
+               if (noisy && !read_yes_or_no_if_tty (cp))
                    done (1);
                free (cp);
            }
                    done (1);
                free (cp);
            }
@@ -959,6 +996,7 @@ skip:
 static void
 inc_done (int status)
 {
 static void
 inc_done (int status)
 {
+    done = exit;
     if (packfile && pd != NOTOK)
        mbx_close (packfile, pd);
     if (locked)
     if (packfile && pd != NOTOK)
        mbx_close (packfile, pd);
     if (locked)