Imported Upstream version 1.8.2
[debian/sudo] / plugins / sudoers / testsudoers.c
index 60e338bcfa1ce11e1a8e831a5895179dbb083119..5eda9d02cb494331998cff16af630552a38d18df 100644 (file)
@@ -78,9 +78,10 @@ void print_defaults(void);
 void print_privilege(struct privilege *);
 void print_userspecs(void);
 void usage(void) __attribute__((__noreturn__));
-void set_runasgr(char *);
-void set_runaspw(char *);
 void cleanup(int);
+static void set_runaspw(const char *);
+static void set_runasgr(const char *);
+static int cb_runas_default(const char *);
 static int testsudoers_printf(int msg_type, const char *fmt, ...);
 static int testsudoers_print(const char *msg);
 
@@ -105,6 +106,7 @@ extern int (*trace_print)(const char *msg);
 struct interface *interfaces;
 struct sudo_user sudo_user;
 struct passwd *list_pw;
+static char *runas_group, *runas_user;
 extern int parse_error;
 sudo_printf_t sudo_printf = testsudoers_printf;
 
@@ -125,7 +127,7 @@ main(int argc, char *argv[])
     struct cmndspec *cs;
     struct privilege *priv;
     struct userspec *us;
-    char *p, *grfile, *pwfile, *runas_group, *runas_user;
+    char *p, *grfile, *pwfile;
     char hbuf[MAXHOSTNAMELEN + 1];
     int match, host_match, runas_match, cmnd_match;
     int ch, dflag;
@@ -142,7 +144,7 @@ main(int argc, char *argv[])
 #endif
 
     dflag = 0;
-    grfile = pwfile = runas_group = runas_user = NULL;
+    grfile = pwfile = NULL;
     while ((ch = getopt(argc, argv, "dg:G:h:p:tu:")) != -1) {
        switch (ch) {
            case 'd':
@@ -197,7 +199,7 @@ main(int argc, char *argv[])
        argc -= 2;
     }
     if ((sudo_user.pw = sudo_getpwnam(user_name)) == NULL)
-       errorx(1, "no passwd entry for %s!", user_name);
+       errorx(1, _("unknown user: %s"), user_name);
 
     if (user_host == NULL) {
        if (gethostname(hbuf, sizeof(hbuf)) != 0)
@@ -225,7 +227,7 @@ main(int argc, char *argv[])
        for (to = user_args, from = argv + 1; *from; from++) {
            n = strlcpy(to, *from, size - (to - user_args));
            if (n >= size - (to - user_args))
-                   errorx(1, "internal error, init_vars() overflow");
+                   errorx(1, _("internal error, init_vars() overflow"));
            to += n;
            *to++ = ' ';
        }
@@ -235,6 +237,9 @@ main(int argc, char *argv[])
     /* Initialize default values. */
     init_defaults();
 
+    /* Set runas callback. */
+    sudo_defs_table[I_RUNAS_DEFAULT].callback = cb_runas_default;
+
     /* Load ip addr/mask for each interface. */
     if (get_net_ifs(&p) > 0)
        set_interfaces(p);
@@ -301,11 +306,11 @@ main(int argc, char *argv[])
                    }
                }
            } else
-               puts("\thost  unmatched");
+               puts(_("\thost  unmatched"));
        }
     }
-    printf("\nCommand %s\n", match == ALLOW ? "allowed" :
-       match == DENY ? "denied" : "unmatched");
+    puts(match == ALLOW ? _("\nCommand allowed") :
+       match == DENY ?  _("\nCommand denied") :  _("\nCommand unmatched"));
 
     /*
      * Exit codes:
@@ -319,30 +324,46 @@ main(int argc, char *argv[])
     exit(match == ALLOW ? 0 : match + 3);
 }
 
-void
-set_runaspw(char *user)
+static void
+set_runaspw(const char *user)
 {
+    if (runas_pw != NULL)
+       pw_delref(runas_pw);
     if (*user == '#') {
        if ((runas_pw = sudo_getpwuid(atoi(user + 1))) == NULL)
            runas_pw = sudo_fakepwnam(user, runas_gr ? runas_gr->gr_gid : 0);
     } else {
        if ((runas_pw = sudo_getpwnam(user)) == NULL)
-           errorx(1, "unknown user: %s", user);
+           errorx(1, _("unknown user: %s"), user);
     }
 }
 
-void
-set_runasgr(char *group)
+static void
+set_runasgr(const char *group)
 {
+    if (runas_gr != NULL)
+       gr_delref(runas_gr);
     if (*group == '#') {
        if ((runas_gr = sudo_getgrgid(atoi(group + 1))) == NULL)
            runas_gr = sudo_fakegrnam(group);
     } else {
        if ((runas_gr = sudo_getgrnam(group)) == NULL)
-           errorx(1, "unknown group: %s", group);
+           errorx(1, _("unknown group: %s"), group);
     }
 }
 
+/* 
+ * Callback for runas_default sudoers setting.
+ */
+static int
+cb_runas_default(const char *user)
+{
+    /* Only reset runaspw if user didn't specify one. */
+    if (!runas_user && !runas_group)
+        set_runaspw(user);
+    return TRUE;
+}
+
 void
 sudo_setspent(void)
 {