From ec9a0917055d731aa95e2fea2045445f9945b74d Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 27 May 2009 18:38:10 +0200 Subject: nss_wrapper: restructure nwrap calls. Guenther --- lib/nss_wrapper/nss_wrapper.c | 240 +++++++++++++++++++++++++++++------------- 1 file changed, 169 insertions(+), 71 deletions(-) (limited to 'lib') diff --git a/lib/nss_wrapper/nss_wrapper.c b/lib/nss_wrapper/nss_wrapper.c index da090832b0..09603b8794 100644 --- a/lib/nss_wrapper/nss_wrapper.c +++ b/lib/nss_wrapper/nss_wrapper.c @@ -771,14 +771,11 @@ static int nwrap_gr_copy_r(const struct group *src, struct group *dst, } /* user functions */ -_PUBLIC_ struct passwd *nwrap_getpwnam(const char *name) + +static struct passwd *nwrap_files_getpwnam(const char *name) { int i; - if (!nwrap_enabled()) { - return real_getpwnam(name); - } - nwrap_cache_reload(nwrap_pw_global.cache); for (i=0; i Date: Wed, 27 May 2009 22:35:14 +0200 Subject: nss_wrapper: split out passwd and group paths in nss_wrapper.pl. Guenther --- lib/nss_wrapper/nss_wrapper.pl | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) (limited to 'lib') diff --git a/lib/nss_wrapper/nss_wrapper.pl b/lib/nss_wrapper/nss_wrapper.pl index cfd3206c2a..89958245ca 100644 --- a/lib/nss_wrapper/nss_wrapper.pl +++ b/lib/nss_wrapper/nss_wrapper.pl @@ -7,7 +7,8 @@ use Getopt::Long; use Cwd qw(abs_path); my $opt_help = 0; -my $opt_path = undef; +my $opt_passwd_path = undef; +my $opt_group_path = undef; my $opt_action = undef; my $opt_type = undef; my $opt_name = undef; @@ -23,7 +24,8 @@ sub group_delete($$); my $result = GetOptions( 'help|h|?' => \$opt_help, - 'path=s' => \$opt_path, + 'passwd_path=s' => \$opt_passwd_path, + 'group_path=s' => \$opt_group_path, 'action=s' => \$opt_action, 'type=s' => \$opt_type, 'name=s' => \$opt_name @@ -39,7 +41,8 @@ sub usage($;$) --help|-h|-? Show this help. - --path Path of the 'passwd' or 'group' file. + --passwd_path Path of the 'passwd' file. + --group_path Path of the 'group' file. --type Only 'passwd' and 'group' are supported yet, maybe 'member' will be added in future. @@ -55,18 +58,6 @@ usage(1) if (not $result); usage(0) if ($opt_help); -if (not defined($opt_path)) { - usage(1, "missing: --path "); -} -if ($opt_path eq "" or $opt_path eq "/") { - usage(1, "invalid: --path : '$opt_path'"); -} -my $opt_fullpath = abs_path($opt_path); -if (not defined($opt_fullpath)) { - usage(1, "invalid: --path : '$opt_path'"); -} - - if (not defined($opt_action)) { usage(1, "missing: --action [add|delete]"); } @@ -83,10 +74,13 @@ if ($opt_action eq "add") { if (not defined($opt_type)) { usage(1, "missing: --type [passwd|group]"); } +my $opt_fullpath; if ($opt_type eq "passwd") { $actionfn = $passwdfn; + $opt_fullpath = check_path($opt_passwd_path, $opt_type); } elsif ($opt_type eq "group") { $actionfn = $groupfn; + $opt_fullpath = check_path($opt_group_path, $opt_type); } else { usage(1, "invalid: --type [passwd|group]: '$opt_type'") } @@ -100,6 +94,23 @@ if ($opt_name eq "") { exit $actionfn->($opt_fullpath, $opt_name); +sub check_path($$) +{ + my ($path,$type) = @_; + + if (not defined($path)) { + usage(1, "missing: --$type\_path "); + } + if ($path eq "" or $path eq "/") { + usage(1, "invalid: --$type\_path : '$path'"); + } + my $fullpath = abs_path($path); + if (not defined($fullpath)) { + usage(1, "invalid: --$type\_path : '$path'"); + } + return $fullpath; +} + sub passwd_add_entry($$); sub passwd_load($) -- cgit From ebf8df35c9583619a012e85964f2ad5187a199fe Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 28 May 2009 10:39:37 +0200 Subject: nss_wrapper: support member add and delete for groups in nss_wrapper.pl. Guenther --- lib/nss_wrapper/nss_wrapper.pl | 162 +++++++++++++++++++++++++++++++++++------ 1 file changed, 141 insertions(+), 21 deletions(-) (limited to 'lib') diff --git a/lib/nss_wrapper/nss_wrapper.pl b/lib/nss_wrapper/nss_wrapper.pl index 89958245ca..1f1aef1118 100644 --- a/lib/nss_wrapper/nss_wrapper.pl +++ b/lib/nss_wrapper/nss_wrapper.pl @@ -12,15 +12,21 @@ my $opt_group_path = undef; my $opt_action = undef; my $opt_type = undef; my $opt_name = undef; +my $opt_member = undef; my $passwdfn = undef; my $groupfn = undef; +my $memberfn = undef; my $actionfn = undef; -sub passwd_add($$); -sub passwd_delete($$); -sub group_add($$); -sub group_delete($$); +sub passwd_add($$$$); +sub passwd_delete($$$$); +sub group_add($$$$); +sub group_delete($$$$); +sub member_add($$$$); +sub member_delete($$$$); + +sub check_path($$); my $result = GetOptions( 'help|h|?' => \$opt_help, @@ -28,7 +34,8 @@ my $result = GetOptions( 'group_path=s' => \$opt_group_path, 'action=s' => \$opt_action, 'type=s' => \$opt_type, - 'name=s' => \$opt_name + 'name=s' => \$opt_name, + 'member=s' => \$opt_member ); sub usage($;$) @@ -44,12 +51,13 @@ sub usage($;$) --passwd_path Path of the 'passwd' file. --group_path Path of the 'group' file. - --type Only 'passwd' and 'group' are supported yet, - maybe 'member' will be added in future. + --type 'passwd', 'group' and 'member' are supported. --action 'add' or 'delete'. --name The name of the object. + + --member The name of the member. "; exit($ret); } @@ -64,23 +72,33 @@ if (not defined($opt_action)) { if ($opt_action eq "add") { $passwdfn = \&passwd_add; $groupfn = \&group_add; + $memberfn = \&member_add; } elsif ($opt_action eq "delete") { $passwdfn = \&passwd_delete; $groupfn = \&group_delete; + $memberfn = \&member_delete; } else { usage(1, "invalid: --action [add|delete]: '$opt_action'"); } if (not defined($opt_type)) { - usage(1, "missing: --type [passwd|group]"); + usage(1, "missing: --type [passwd|group|member]"); } -my $opt_fullpath; +if ($opt_type eq "member" and not defined($opt_member)) { + usage(1, "missing: --member "); +} +my $opt_fullpath_passwd; +my $opt_fullpath_group; if ($opt_type eq "passwd") { $actionfn = $passwdfn; - $opt_fullpath = check_path($opt_passwd_path, $opt_type); + $opt_fullpath_passwd = check_path($opt_passwd_path, $opt_type); } elsif ($opt_type eq "group") { $actionfn = $groupfn; - $opt_fullpath = check_path($opt_group_path, $opt_type); + $opt_fullpath_group = check_path($opt_group_path, $opt_type); +} elsif ($opt_type eq "member") { + $actionfn = $memberfn; + $opt_fullpath_passwd = check_path($opt_passwd_path, "passwd"); + $opt_fullpath_group = check_path($opt_group_path, "group"); } else { usage(1, "invalid: --type [passwd|group]: '$opt_type'") } @@ -92,7 +110,7 @@ if ($opt_name eq "") { usage(1, "invalid: --name "); } -exit $actionfn->($opt_fullpath, $opt_name); +exit $actionfn->($opt_fullpath_passwd, $opt_member, $opt_fullpath_group, $opt_name); sub check_path($$) { @@ -271,6 +289,62 @@ sub group_remove_entry($$) delete $group->{gid}{${$eref}[2]}; } +sub group_add_member($$$) +{ + my ($group, $eref, $username) = @_; + + my @members; + my $str = @$eref[3] || undef; + if ($str) { + @members = split(",", $str); + } + + foreach my $member (@members) { + if ($member and $member eq $username) { + die("account[$username] is already member of '@$eref[0]'"); + } + } + + push(@members, $username); + + my $gwent = @$eref[0].":x:".@$eref[2].":".join(",", @members); + + group_remove_entry($group, $eref); + + group_add_entry($group, $gwent); +} + +sub group_delete_member($$$) +{ + my ($group, $eref, $username) = @_; + + my @members = undef; + my $str = @$eref[3] || undef; + if ($str) { + @members = split(",", $str); + } + my @new_members; + my $removed = 0; + + foreach my $member (@members) { + if ($member and $member ne $username) { + push(@new_members, $member); + } else { + $removed = 1; + } + } + + if ($removed != 1) { + die("account[$username] is not member of '@$eref[0]'"); + } + + my $gwent = @$eref[0].":x:".@$eref[2].":".join(",", @new_members); + + group_remove_entry($group, $eref); + + group_add_entry($group, $gwent); +} + sub passwd_save($) { my ($passwd) = @_; @@ -314,9 +388,9 @@ sub group_save($) rename($tmppath, $path) or die("Unable to rename $tmppath => $path"); } -sub passwd_add($$) +sub passwd_add($$$$) { - my ($path, $name) = @_; + my ($path, $dummy, $dummy2, $name) = @_; #print "passwd_add: '$name' in '$path'\n"; @@ -337,9 +411,9 @@ sub passwd_add($$) return 0; } -sub passwd_delete($$) +sub passwd_delete($$$$) { - my ($path, $name) = @_; + my ($path, $dummy, $dummy2, $name) = @_; #print "passwd_delete: '$name' in '$path'\n"; @@ -355,9 +429,9 @@ sub passwd_delete($$) return 0; } -sub group_add($$) +sub group_add($$$$) { - my ($path, $name) = @_; + my ($dummy, $dummy2, $path, $name) = @_; #print "group_add: '$name' in '$path'\n"; @@ -368,7 +442,7 @@ sub group_add($$) my $gid = group_get_free_gid($group); - my $gwent = $name.":x:".$gid.":".""; #no members yet + my $gwent = $name.":x:".$gid.":".""; group_add_entry($group, $gwent); @@ -379,9 +453,9 @@ sub group_add($$) return 0; } -sub group_delete($$) +sub group_delete($$$$) { - my ($path, $name) = @_; + my ($dummy, $dummy2, $path, $name) = @_; #print "group_delete: '$name' in '$path'\n"; @@ -396,3 +470,49 @@ sub group_delete($$) return 0; } + +sub member_add($$$$) +{ + my ($passwd_path, $username, $group_path, $groupname) = @_; + + #print "member_add: adding '$username' in '$passwd_path' to '$groupname' in '$group_path'\n"; + + my $group = group_load($group_path); + + my $g = group_lookup_name($group, $groupname); + die("group[$groupname] does not exists in '$group_path'") unless defined($g); + + my $passwd = passwd_load($passwd_path); + + my $u = passwd_lookup_name($passwd, $username); + die("account[$username] does not exists in '$passwd_path'") unless defined($u); + + group_add_member($group, $g, $username); + + group_save($group); + + return 0; +} + +sub member_delete($$$$) +{ + my ($passwd_path, $username, $group_path, $groupname) = @_; + + #print "member_delete: removing '$username' in '$passwd_path' from '$groupname' in '$group_path'\n"; + + my $group = group_load($group_path); + + my $g = group_lookup_name($group, $groupname); + die("group[$groupname] does not exists in '$group_path'") unless defined($g); + + my $passwd = passwd_load($passwd_path); + + my $u = passwd_lookup_name($passwd, $username); + die("account[$username] does not exists in '$passwd_path'") unless defined($u); + + group_delete_member($group, $g, $username); + + group_save($group); + + return 0; +} -- cgit From 37e4c92b383397a2c77db7e5d8adf2fa4a24d398 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 28 May 2009 10:53:53 +0200 Subject: nss_wrapper: remove re-structuring leftovers (unused variables). Guenther --- lib/nss_wrapper/nss_wrapper.c | 6 ------ 1 file changed, 6 deletions(-) (limited to 'lib') diff --git a/lib/nss_wrapper/nss_wrapper.c b/lib/nss_wrapper/nss_wrapper.c index 09603b8794..3c061f0de8 100644 --- a/lib/nss_wrapper/nss_wrapper.c +++ b/lib/nss_wrapper/nss_wrapper.c @@ -855,8 +855,6 @@ static struct passwd *nwrap_files_getpwuid(uid_t uid) _PUBLIC_ struct passwd *nwrap_getpwuid(uid_t uid) { - int i; - if (!nwrap_enabled()) { return real_getpwuid(uid); } @@ -1057,8 +1055,6 @@ static int nwrap_files_getgrnam_r(const char *name, struct group *grdst, _PUBLIC_ int nwrap_getgrnam_r(const char *name, struct group *grdst, char *buf, size_t buflen, struct group **grdstp) { - struct group *gr; - if (!nwrap_enabled()) { return real_getgrnam_r(name, grdst, buf, buflen, grdstp); } @@ -1091,8 +1087,6 @@ static struct group *nwrap_files_getgrgid(gid_t gid) _PUBLIC_ struct group *nwrap_getgrgid(gid_t gid) { - int i; - if (!nwrap_enabled()) { return real_getgrgid(gid); } -- cgit From 136b2a3eb21eda28e7a18547751ee20f097e7492 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 28 May 2009 11:51:46 +0200 Subject: nss_wrapper: fix nss_wrapper build for solaris. Guenther --- lib/nss_wrapper/nss_wrapper.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib') diff --git a/lib/nss_wrapper/nss_wrapper.c b/lib/nss_wrapper/nss_wrapper.c index 3c061f0de8..1875dc3e4f 100644 --- a/lib/nss_wrapper/nss_wrapper.c +++ b/lib/nss_wrapper/nss_wrapper.c @@ -954,6 +954,7 @@ _PUBLIC_ int nwrap_getpwent_r(struct passwd *pwdst, char *buf, { if (!nwrap_enabled()) { #ifdef SOLARIS_GETPWENT_R + struct passwd *pw; pw = real_getpwent_r(pwdst, buf, buflen); if (!pw) { if (errno == 0) { @@ -1188,6 +1189,7 @@ _PUBLIC_ int nwrap_getgrent_r(struct group *grdst, char *buf, { if (!nwrap_enabled()) { #ifdef SOLARIS_GETGRENT_R + struct group *gr; gr = real_getgrent_r(grdst, buf, buflen); if (!gr) { if (errno == 0) { -- cgit