From: Todd C. Miller <Todd.Miller@courtesan.com> Date: Wed, 5 Jan 2005 19:50:49 +0000 (+0000) Subject: Add support for custom passwd/group files. X-Git-Tag: SUDO_1_7_0~747 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5e475c85b3fa560fda9a028e891a84ce8625db81;p=sudo Add support for custom passwd/group files. --- diff --git a/testsudoers.c b/testsudoers.c index 99306e98a..49b6f97b8 100644 --- a/testsudoers.c +++ b/testsudoers.c @@ -99,17 +99,19 @@ void print_privilege __P((struct privilege *)); void print_userspecs __P((void)); void usage __P((void)) __attribute__((__noreturn__)); +extern void my_setpwfile __P((const char *)); +extern void my_setgrfile __P((const char *)); + int main(argc, argv) int argc; char **argv; { struct cmndspec *cs; - struct passwd pw, rpw; struct member *runas; struct privilege *priv; struct userspec *us; - char *p, hbuf[MAXHOSTNAMELEN]; + char *p, *grfile, *pwfile, *uflag, hbuf[MAXHOSTNAMELEN]; int ch, dflag, rval, matched; #ifdef YYDEBUG extern int yydebug; @@ -119,17 +121,9 @@ main(argc, argv) Argv = argv; Argc = argc; - setpwent(); - setgrent(); - pwcache_init(); - - memset(&pw, 0, sizeof(pw)); - sudo_user.pw = &pw; - memset(&rpw, 0, sizeof(rpw)); - runas_pw = &rpw; - dflag = 0; - while ((ch = getopt(argc, argv, "dh:u:")) != -1) { + grfile = pwfile = uflag = NULL; + while ((ch = getopt(argc, argv, "dg:h:p:u:")) != -1) { switch (ch) { case 'd': dflag = 1; @@ -137,9 +131,15 @@ main(argc, argv) case 'h': user_host = optarg; break; + case 'g': + grfile = optarg; + break; + case 'p': + pwfile = optarg; + break; case 'u': - /* XXX - call getpwnam() */ - runas_pw->pw_name = optarg; + uflag = optarg; + user_runas = &uflag; break; default: usage(); @@ -150,14 +150,25 @@ main(argc, argv) argv += optind; NewArgc = argc; NewArgv = argv; + + /* Set group/passwd file and init the cache. */ + if (grfile) + my_setgrfile(grfile); + if (pwfile) + my_setpwfile(pwfile); + sudo_setpwent(); + sudo_setgrent(); + if (argc < 2) { if (!dflag) usage(); - user_name = "nobody"; + if ((sudo_user.pw = sudo_getpwnam("nobody")) == NULL) + errorx(1, "no passwd entry for nobody!"); user_cmnd = user_base = "true"; } else { - user_name = *argv++; - user_cmnd = *argv; + if ((sudo_user.pw = sudo_getpwnam(*argv)) == NULL) + errorx(1, "no passwd entry for %s!", *argv); + user_cmnd = *++argv; if ((p = strrchr(user_cmnd, '/')) != NULL) user_base = p + 1; else @@ -198,10 +209,13 @@ main(argc, argv) /* Initialize default values. */ init_defaults(); - if (runas_pw->pw_name) - user_runas = &runas_pw->pw_name; - else - runas_pw->pw_name = *user_runas; + if (**user_runas == '#') { + if ((runas_pw = sudo_getpwuid(atoi(*user_runas + 1))) == NULL) + runas_pw = sudo_fakepwnam(*user_runas); + } else { + if ((runas_pw = sudo_getpwnam(*user_runas)) == NULL) + errorx(1, "no passwd entry for %s!", *user_runas); + } /* Load ip addr/mask for each interface. */ load_interfaces(); @@ -260,6 +274,25 @@ main(argc, argv) exit(0); } +void +sudo_setspent() +{ + return; +} + +void +sudo_endspent() +{ + return; +} + +char * +sudo_getepw(pw) + const struct passwd *pw; +{ + return (pw->pw_passwd); +} + void set_fqdn() { @@ -297,7 +330,8 @@ set_perms(perm) void cleanup() { - pwcache_destroy(); + sudo_endpwent(); + sudo_endgrent(); } void @@ -466,8 +500,6 @@ dump_sudoers() void usage() { - (void) fprintf(stderr, - "usage: %s [-h host] [-u user] <user> <command> [args]\n", - getprogname()); + (void) fprintf(stderr, "usage: %s [-d] [-g grfile] [-h host] [-p pwfile] [-u user] <user> <command> [args]\n", getprogname()); exit(1); }