mirror of
https://github.com/sudo-project/sudo.git
synced 2025-08-22 18:08:23 +00:00
Add support for custom passwd/group files.
This commit is contained in:
parent
66773d1b6a
commit
5e475c85b3
@ -99,17 +99,19 @@ void print_privilege __P((struct privilege *));
|
|||||||
void print_userspecs __P((void));
|
void print_userspecs __P((void));
|
||||||
void usage __P((void)) __attribute__((__noreturn__));
|
void usage __P((void)) __attribute__((__noreturn__));
|
||||||
|
|
||||||
|
extern void my_setpwfile __P((const char *));
|
||||||
|
extern void my_setgrfile __P((const char *));
|
||||||
|
|
||||||
int
|
int
|
||||||
main(argc, argv)
|
main(argc, argv)
|
||||||
int argc;
|
int argc;
|
||||||
char **argv;
|
char **argv;
|
||||||
{
|
{
|
||||||
struct cmndspec *cs;
|
struct cmndspec *cs;
|
||||||
struct passwd pw, rpw;
|
|
||||||
struct member *runas;
|
struct member *runas;
|
||||||
struct privilege *priv;
|
struct privilege *priv;
|
||||||
struct userspec *us;
|
struct userspec *us;
|
||||||
char *p, hbuf[MAXHOSTNAMELEN];
|
char *p, *grfile, *pwfile, *uflag, hbuf[MAXHOSTNAMELEN];
|
||||||
int ch, dflag, rval, matched;
|
int ch, dflag, rval, matched;
|
||||||
#ifdef YYDEBUG
|
#ifdef YYDEBUG
|
||||||
extern int yydebug;
|
extern int yydebug;
|
||||||
@ -119,17 +121,9 @@ main(argc, argv)
|
|||||||
Argv = argv;
|
Argv = argv;
|
||||||
Argc = argc;
|
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;
|
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) {
|
switch (ch) {
|
||||||
case 'd':
|
case 'd':
|
||||||
dflag = 1;
|
dflag = 1;
|
||||||
@ -137,9 +131,15 @@ main(argc, argv)
|
|||||||
case 'h':
|
case 'h':
|
||||||
user_host = optarg;
|
user_host = optarg;
|
||||||
break;
|
break;
|
||||||
|
case 'g':
|
||||||
|
grfile = optarg;
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
pwfile = optarg;
|
||||||
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
/* XXX - call getpwnam() */
|
uflag = optarg;
|
||||||
runas_pw->pw_name = optarg;
|
user_runas = &uflag;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
usage();
|
usage();
|
||||||
@ -150,14 +150,25 @@ main(argc, argv)
|
|||||||
argv += optind;
|
argv += optind;
|
||||||
NewArgc = argc;
|
NewArgc = argc;
|
||||||
NewArgv = argv;
|
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 (argc < 2) {
|
||||||
if (!dflag)
|
if (!dflag)
|
||||||
usage();
|
usage();
|
||||||
user_name = "nobody";
|
if ((sudo_user.pw = sudo_getpwnam("nobody")) == NULL)
|
||||||
|
errorx(1, "no passwd entry for nobody!");
|
||||||
user_cmnd = user_base = "true";
|
user_cmnd = user_base = "true";
|
||||||
} else {
|
} else {
|
||||||
user_name = *argv++;
|
if ((sudo_user.pw = sudo_getpwnam(*argv)) == NULL)
|
||||||
user_cmnd = *argv;
|
errorx(1, "no passwd entry for %s!", *argv);
|
||||||
|
user_cmnd = *++argv;
|
||||||
if ((p = strrchr(user_cmnd, '/')) != NULL)
|
if ((p = strrchr(user_cmnd, '/')) != NULL)
|
||||||
user_base = p + 1;
|
user_base = p + 1;
|
||||||
else
|
else
|
||||||
@ -198,10 +209,13 @@ main(argc, argv)
|
|||||||
|
|
||||||
/* Initialize default values. */
|
/* Initialize default values. */
|
||||||
init_defaults();
|
init_defaults();
|
||||||
if (runas_pw->pw_name)
|
if (**user_runas == '#') {
|
||||||
user_runas = &runas_pw->pw_name;
|
if ((runas_pw = sudo_getpwuid(atoi(*user_runas + 1))) == NULL)
|
||||||
else
|
runas_pw = sudo_fakepwnam(*user_runas);
|
||||||
runas_pw->pw_name = *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 ip addr/mask for each interface. */
|
||||||
load_interfaces();
|
load_interfaces();
|
||||||
@ -260,6 +274,25 @@ main(argc, argv)
|
|||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sudo_setspent()
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sudo_endspent()
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
sudo_getepw(pw)
|
||||||
|
const struct passwd *pw;
|
||||||
|
{
|
||||||
|
return (pw->pw_passwd);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
set_fqdn()
|
set_fqdn()
|
||||||
{
|
{
|
||||||
@ -297,7 +330,8 @@ set_perms(perm)
|
|||||||
void
|
void
|
||||||
cleanup()
|
cleanup()
|
||||||
{
|
{
|
||||||
pwcache_destroy();
|
sudo_endpwent();
|
||||||
|
sudo_endgrent();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -466,8 +500,6 @@ dump_sudoers()
|
|||||||
void
|
void
|
||||||
usage()
|
usage()
|
||||||
{
|
{
|
||||||
(void) fprintf(stderr,
|
(void) fprintf(stderr, "usage: %s [-d] [-g grfile] [-h host] [-p pwfile] [-u user] <user> <command> [args]\n", getprogname());
|
||||||
"usage: %s [-h host] [-u user] <user> <command> [args]\n",
|
|
||||||
getprogname());
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user