]> diplodocus.org Git - nmh/blobdiff - uip/inc.c
Attempt to decode base64-encoded strings in -snoop traffic.
[nmh] / uip / inc.c
index a4aea3e7d38412ae029fb2e37497b893d6a40bbb..78914533137bf686949dc9817e590ce08ba70403 100644 (file)
--- a/uip/inc.c
+++ b/uip/inc.c
@@ -8,7 +8,13 @@
  */
 
 #ifdef MAILGROUP
-/* Revised: Sat Apr 14 17:08:17 PDT 1990 (marvit@hplabs)
+/*
+ * Thu Feb 12 21:00 CST 2015            Marcin Cieslak <saper@saper.info>
+ *    Replaced setgid() calls with setegid() so that it works with dot
+ *    locking on FreeBSD.  setegid() should be supported on modern POSIX
+ *    systems.
+ *
+ * Revised: Sat Apr 14 17:08:17 PDT 1990 (marvit@hplabs)
  *    Added hpux hacks to set and reset gid to be "mail" as needed. The reset
  *    is necessary so inc'ed mail is the group of the inc'er, rather than
  *    "mail". We setgid to egid only when [un]locking the mail file. This
@@ -52,7 +58,6 @@
     X("form formatfile", 0, FORMSW) \
     X("format string", 5, FMTSW) \
     X("host hostname", 0, HOSTSW) \
-    X("oauth service", 0, OAUTHSW) \
     X("user username", 0, USERSW) \
     X("pack file", 0, PACKSW) \
     X("nopack", 0, NPACKSW) \
     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("authservice", SASLminc(0), AUTHSERVICESW) \
     X("proxy command", 0, PROXYSW) \
 
 #define X(sw, minchars, id) id,
@@ -128,10 +134,16 @@ static FILE *pf = NULL;
  * For setting and returning to "mail" gid
  */
 #ifdef MAILGROUP
-static int return_gid;
+static gid_t return_gid;
 #define TRYDROPGROUPPRIVS() DROPGROUPPRIVS()
-#define DROPGROUPPRIVS() setgid(getgid())
-#define GETGROUPPRIVS() setgid(return_gid)
+#define DROPGROUPPRIVS() \
+    if (setegid(getgid()) != 0) { \
+        adios ("setegid", "unable to restore group to %ld", (long) getgid()); \
+    }
+#define GETGROUPPRIVS() \
+    if (setegid(return_gid) != 0) { \
+        adios ("setegid", "unable to set group to %ld", (long) return_gid); \
+    }
 #define SAVEGROUPPRIVS() return_gid = getegid()
 #else
 /* define *GROUPPRIVS() as null; this avoids having lots of "#ifdef MAILGROUP"s */
@@ -179,14 +191,13 @@ main (int argc, char **argv)
     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;
     FILE *aud = NULL;
     char b[PATH_MAX + 1];
     char *maildir_copy = NULL; /* copy of mail directory because the static gets overwritten */
-    const char *oauth_svc = NULL;
 
     int nmsgs, nbytes;
     char *MAILHOST_env_variable;
@@ -314,16 +325,6 @@ main (int argc, char **argv)
                    adios (NULL, "missing argument to %s", argp[-2]);
                continue;
 
-            case OAUTHSW:
-#ifdef OAUTH_SUPPORT
-                if (!(cp = *argp++) || *cp == '-')
-                    adios (NULL, "missing argument to %s", argp[-2]);
-                oauth_svc = cp;
-#else
-                adios (NULL, "not built with OAuth support");
-#endif
-                continue;
-
            case USERSW:
                if (!(user = *argp++) || *user == '-')
                    adios (NULL, "missing argument to %s", argp[-2]);
@@ -352,6 +353,16 @@ main (int argc, char **argv)
                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 PROXYSW:
                if (!(proxy = *argp++) || *proxy == '-')
                    adios (NULL, "missing argument to %s", argp[-2]);
@@ -394,11 +405,14 @@ main (int argc, char **argv)
     if (inc_type == INC_POP) {
        struct nmh_creds creds = { 0, 0, 0 };
 
-       if (oauth_svc == NULL) {
+       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 -oauth");
+               adios (NULL, "must specify -user with -saslmech xoauth2");
            }
            creds.user = user;
        }
@@ -407,7 +421,7 @@ main (int argc, char **argv)
         * initialize POP connection
         */
        if (pop_init (host, port, creds.user, creds.password, proxy, snoop,
-                     sasl, saslmech, oauth_svc) == NOTOK)
+                     sasl, saslmech, auth_svc) == NOTOK)
            adios (NULL, "%s", response);
 
        /* Check if there are any messages */
@@ -591,7 +605,7 @@ go_to_it:
                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);
            }
@@ -966,6 +980,7 @@ skip:
 static void
 inc_done (int status)
 {
+    done = exit;
     if (packfile && pd != NOTOK)
        mbx_close (packfile, pd);
     if (locked)