]> granicus.if.org Git - sudo/commitdiff
Expand aliases in "sudo -l" mode
authorTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 15 Nov 2004 18:00:29 +0000 (18:00 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 15 Nov 2004 18:00:29 +0000 (18:00 +0000)
parse.c
parse.h

diff --git a/parse.c b/parse.c
index 93c9cb1cdf7e9e910ab1f7f60718e59e349fe9b1..13825f7540a9ac3f2ece204479c42ebac24c6494 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -59,6 +59,11 @@ static const char rcsid[] = "$Sudo$";
  */
 extern struct userspec *userspecs;
 
+/*
+ * Local prototypes.
+ */
+static void print_member       __P((char *, int, int, int));
+
 /*
  * Parse the specified sudoers file.
  */
@@ -211,7 +216,7 @@ display_privs(pw)
                for (m = runas; m != NULL; m = m->next) {
                    if (m != runas)
                        fputs(", ", stdout);
-                   print_member(m);
+                   print_member(m->name, m->type, m->negated, RUNASALIAS);
                }
                fputs(") ", stdout);
            }
@@ -221,7 +226,8 @@ display_privs(pw)
                printf("%sEXEC: ", cs->tags.noexec ? "NO" : "");
            if (cs->tags.nopasswd != UNSPEC && cs->tags.nopasswd != !def_authenticate)
                printf("%sPASSWD: ", cs->tags.nopasswd ? "NO" : "");
-           print_member(cs->cmnd);
+           m = cs->cmnd;
+           print_member(m->name, m->type, m->negated, CMNDALIAS);
            putchar('\n');
        }
     }
@@ -230,21 +236,37 @@ display_privs(pw)
 /*
  * Print the contents of a struct member to stdout
  */
-void
-print_member(m)
-    struct member *m;
+static void
+print_member(name, type, negated, alias_type)
+    char *name;
+    int type, negated, alias_type;
 {
+    struct alias *a;
+    struct member *m;
     struct sudo_command *c;
 
-    if (m->negated)
-       printf("!");
-    if (m->name == NULL)
-       printf("ALL");
-    else if (m->type != COMMAND)
-       printf("%s", m->name);
-    else {
-       c = (struct sudo_command *) m->name;
-       printf("%s%s%s", c->cmnd, c->args ? " " : "",
-           c->args ? c->args : "");
+    switch (type) {
+       case ALL:
+           printf("%sALL", negated ? "!" : "");
+           break;
+       case COMMAND:
+           c = (struct sudo_command *) name;
+           printf("%s%s%s%s", negated ? "!" : "", c->cmnd, c->args ? " " : "",
+               c->args ? c->args : "");
+           break;
+       case ALIAS:
+           if ((a = find_alias(name, alias_type)) != NULL) {
+               for (m = a->first_member; m != NULL; m = m->next) {
+                   if (m != a->first_member)
+                       fputs(", ", stdout);
+                   print_member(m->name, m->type,
+                       negated ? !m->negated : m->negated, alias_type);
+               }
+               break;
+           }
+           /* FALLTHROUGH */
+       default:
+           printf("%s%s", negated ? "!" : "", name);
+           break;
     }
 }
diff --git a/parse.h b/parse.h
index 21ea9f3640fb471fd2e2d4cf804200f845b501f3..13d5efe2e7985b21d6ca0aeaea5aa435a17b6faf 100644 (file)
--- a/parse.h
+++ b/parse.h
@@ -169,6 +169,5 @@ int userpw_matches  __P((char *, char *, struct passwd *));
 struct alias *find_alias __P((char *, int));
 void alias_apply       __P((int (*)(VOID *, VOID *), VOID *));
 void init_parser       __P((char *, int));
-void print_member      __P((struct member *m));
 
 #endif /* _SUDO_PARSE_H */