diff options
author | Jarkko Hietaniemi <jhi@iki.fi> | 1999-01-21 10:46:01 +0000 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 1999-01-21 10:46:01 +0000 |
commit | b91c086317cf43911abff2cceb5a395352adb185 (patch) | |
tree | d244ee572dbf636880e62bdcd0f199a70250d86e /t | |
parent | c955f1177b2e311d54ed3bf28758443cd10a3c9e (diff) | |
download | perl-b91c086317cf43911abff2cceb5a395352adb185.tar.gz |
Handle NIS (and NetInfo) more robustly.
p4raw-id: //depot/cfgperl@2655
Diffstat (limited to 't')
-rwxr-xr-x | t/op/grent.t | 103 | ||||
-rwxr-xr-x | t/op/pwent.t | 111 |
2 files changed, 143 insertions, 71 deletions
diff --git a/t/op/grent.t b/t/op/grent.t index d054ccc2b9..abe6b5add0 100755 --- a/t/op/grent.t +++ b/t/op/grent.t @@ -2,36 +2,62 @@ BEGIN { chdir 't' if -d 't'; - @INC = "../lib" if -d "../lib"; + unshift @INC, "../lib" if -d "../lib"; eval { require Config; import Config; }; - my $GR = "/etc/group"; + unless (defined $Config{'i_grp'} && + $Config{'i_grp'} eq 'define' && + -f "/etc/group" ) { # Play safe. + print "1..0\n"; + exit 0; + } - $where = $GR; + if (not defined $where) { # Try NIS. + foreach my $ypcat (qw(/usr/bin/ypcat /bin/ypcat /etc/ypcat)) { + if (-x $ypcat && + open(GR, "$ypcat group 2>/dev/null |") && + defined(<GR>)) { + $where = "NIS group"; + last; + } + } + } + + if (not defined $where) { # Try NetInfo. + foreach my $nidump (qw(/usr/bin/nidump)) { + if (-x $nidump && + open(GR, "$nidump group . 2>/dev/null |") && + defined(<GR>)) { + $where = "NetInfo group"; + last; + } + } + } - if (-x "/usr/bin/nidump") { # nidump is not just NeXT/OpenStep - if (open(GR, "nidump group . |")) { - $where = "NetInfo group"; - } else { - print "1..0\n"; - exit 0; + if (not defined $where) { # Try local. + my $GR = "/etc/group"; + if (-f $GR && open(GR, $GR) && defined(<GR>)) { + $where = $GR; } - } elsif ((defined $Config{'i_grp'} and $Config{'i_grp'} ne 'define') - or not -f $GR or not open(GR, $GR) - ) { + } + + if (not defined $where) { # Give up. print "1..0\n"; exit 0; } } +# By now GR filehandle should be open and full of juicy group entries. + print "1..1\n"; # Go through at most this many groups. +# (note that the first entry has been read away by now) my $max = 25; my $n = 0; my $tst = 1; -my %suspect; +my %perfect; my %seen; while (<GR>) { @@ -44,7 +70,7 @@ while (<GR>) { warn "# Your $where line $. is empty.\n"; next; } - next if $n == $max; + last if $n == $max; # In principle we could whine if @s != 4 but do we know enough # of group file formats everywhere? if (@s == 4) { @@ -61,31 +87,42 @@ while (<GR>) { ($name,$passwd,$gid,$members) = @n; next if $name_s ne $name; } + # NOTE: group names *CAN* contain whitespace. $members =~ s/\s+/,/g; - $suspect{$name_s}++ - if $name ne $name_s or -# Shadow passwords confuse this. + # what about different orders of members? + $perfect{$name_s}++ + if $name eq $name_s and +# Do not compare passwords: think shadow passwords. # Not that group passwords are used much but better not assume anything. -# $passwd ne $passwd_s or - $gid ne $gid_s or - $members ne $members_s; + $gid eq $gid_s and + $members eq $members_s; } $n++; } -# Drop the multiply defined groups. - -foreach (sort keys %seen) { - my $times = @{ $seen{$_} }; - if ($times > 1) { - # Multiply defined groups are rarely intentional. - local $" = ", "; - print "# Group '$_' defined multiple times in $where, lines: @{$seen{$_}}.\n"; - delete $suspect{$_}; - } +if (keys %perfect == 0) { + $max++; + print <<EOEX; +# +# The failure of op/grent test is not necessarily serious. +# It may fail due to local group administration conventions. +# If you are for example using both NIS and local groups, +# test failure is possible. Any distributed group scheme +# can cause such failures. +# +# What the grent test is doing is that it compares the $max first +# entries of $where +# with the results of getgrgid() and getgrnam() call. If it finds no +# matches at all, it suspects something is wrong. +# +EOEX + print "not "; + $not = 1; +} else { + $not = 0; } - -print "not " if keys %suspect; -print "ok ", $tst++, "\n"; +print "ok ", $tst++; +print "\t# (not necessarily serious: run t/op/grent.t by itself)" if $not; +print "\n"; close(GR); diff --git a/t/op/pwent.t b/t/op/pwent.t index 4151ef26b3..cd5db34cf5 100755 --- a/t/op/pwent.t +++ b/t/op/pwent.t @@ -2,49 +2,76 @@ BEGIN { chdir 't' if -d 't'; - @INC = "../lib" if -d "../lib"; + unshift @INC, "../lib" if -d "../lib"; eval { require Config; import Config; }; - my $PW = "/etc/passwd"; + unless (defined $Config{'i_pwd'} && + $Config{'i_pwd'} eq 'define' && + -f "/etc/passwd" ) { # Play safe. + print "1..0\n"; + exit 0; + } + + if (not defined $where) { # Try NIS. + foreach my $ypcat (qw(/usr/bin/ypcat /bin/ypcat /etc/ypcat)) { + if (-x $ypcat && + open(PW, "$ypcat passwd 2>/dev/null |") && + defined(<PW>)) { + $where = "NIS passwd"; + last; + } + } + } - $where = $PW; + if (not defined $where) { # Try NetInfo. + foreach my $nidump (qw(/usr/bin/nidump)) { + if (-x $nidump && + open(PW, "$nidump passwd . 2>/dev/null |") && + defined(<PW>)) { + $where = "NetInfo passwd"; + last; + } + } + } - if (-x "/usr/bin/nidump") { # nidump is not just NeXT/OpenStep - if (open(PW, "nidump passwd . |")) { - $where = "NetInfo passwd"; - } else { - print "1..0\n"; - exit 0; + if (not defined $where) { # Try local. + my $PW = "/etc/passwd"; + if (-f $PW && open(PW, $PW) && defined(<PW>)) { + $where = $PW; } - } elsif ((defined $Config{'i_pwd'} and $Config{'i_pwd'} ne 'define') - or not -f $PW or not open(PW, $PW)) { + } + + if (not defined $where) { # Give up. print "1..0\n"; exit 0; } } +# By now PW filehandle should be open and full of juicy password entries. + print "1..1\n"; # Go through at most this many users. -my $max = 25; # +# (note that the first entry has been read away by now) +my $max = 25; my $n = 0; my $tst = 1; -my %suspect; +my %perfect; my %seen; while (<PW>) { chomp; - next if /^\+/; # ignore NIS includes my @s = split /:/; my ($name_s, $passwd_s, $uid_s, $gid_s, $gcos_s, $home_s, $shell_s) = @s; + next if /^\+/; # ignore NIS includes if (@s) { push @{ $seen{$name_s} }, $.; } else { warn "# Your $where line $. is empty.\n"; next; } - next if $n == $max; + last if $n == $max; # In principle we could whine if @s != 7 but do we know enough # of passwd file formats everywhere? if (@s == 7) { @@ -58,33 +85,41 @@ while (<PW>) { ($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$home,$shell) = @n; next if $name_s ne $name; } - $suspect{$name_s}++ - if $name ne $name_s or -# Shadow passwords confuse this. -# Think about non-crypt(3) encryptions, too, before you do anything rash. -# $passwd ne $passwd_s or - $uid ne $uid_s or - $gid ne $gid_s or - $gcos ne $gcos_s or - $home ne $home_s or - $shell ne $shell_s; + $perfect{$name_s}++ + if $name eq $name_s and + $uid eq $uid_s and +# Do not compare passwords: think shadow passwords. + $gid eq $gid_s and + $gcos eq $gcos_s and + $home eq $home_s and + $shell eq $shell_s; } $n++; } -# Drop the multiply defined users. - -foreach (sort keys %seen) { - my $times = @{ $seen{$_} }; - if ($times > 1) { - # Multiply defined users are rarely intentional. - local $" = ", "; - print "# User '$_' defined multiple times in $where, lines: @{$seen{$_}}.\n"; - delete $suspect{$_}; - } +if (keys %perfect == 0) { + $max++; + print <<EOEX; +# +# The failure of op/pwent test is not necessarily serious. +# It may fail due to local password administration conventions. +# If you are for example using both NIS and local passwords, +# test failure is possible. Any distributed password scheme +# can cause such failures. +# +# What the pwent test is doing is that it compares the $max first +# entries of $where +# with the results of getpwuid() and getpwnam() call. If it finds no +# matches at all, it suspects something is wrong. +# +EOEX + print "not "; + $not = 1; +} else { + $not = 0; } - -print "not " if keys %suspect; -print "ok ", $tst++, "\n"; +print "ok ", $tst++; +print "\t# (not necessarily serious: run t/op/pwent.t by itself)" if $not; +print "\n"; close(PW); |