From: Todd C. Miller Date: Mon, 15 Nov 2004 18:00:29 +0000 (+0000) Subject: Expand aliases in "sudo -l" mode X-Git-Tag: SUDO_1_7_0~828 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=74169a83e0dafdc500a7996dbd1932b0900cacbd;p=sudo Expand aliases in "sudo -l" mode --- diff --git a/parse.c b/parse.c index 93c9cb1cd..13825f754 100644 --- 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 21ea9f364..13d5efe2e 100644 --- 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 */