stas 2003/12/13 18:09:04
Modified: perl-framework/Apache-Test/lib/Apache TestRun.pm
perl-framework/Apache-Test Changes
Log:
Another attempt at providing a test function that verifies whether
Apache when switching from 'root' to 'nobody' or another user will be
able to access and create files under the t/ directory. This time
using perl's vars $(, $< since POSIX equivalents seem to be broken on
some systems. Also using a better test that actually tries to
write/read/execute in the path under test.
Revision Changes Path
1.124 +47 -11
httpd-test/perl-framework/Apache-Test/lib/Apache/TestRun.pm
Index: TestRun.pm
===================================================================
RCS file:
/home/cvs/httpd-test/perl-framework/Apache-Test/lib/Apache/TestRun.pm,v
retrieving revision 1.123
retrieving revision 1.124
diff -u -u -r1.123 -r1.124
--- TestRun.pm 24 Nov 2003 08:28:34 -0000 1.123
+++ TestRun.pm 14 Dec 2003 02:09:04 -0000 1.124
@@ -13,7 +13,7 @@
use File::Find qw(finddepth);
use File::Spec::Functions qw(catfile);
-use File::Basename qw(basename);
+use File::Basename qw(basename dirname);
use Getopt::Long qw(GetOptions);
use Config;
@@ -809,6 +809,44 @@
}
}
+# this sub is executed from an external process only, since it
+# "sudo"'s into a uid/gid of choice
+sub run_root_fs_test {
+ my($uid, $gid, $dir) = @_;
+
+ # first must change gid and egid
+ $( = $) = $gid+0;
+ die "failed to change gid to $gid" unless $( == $gid;
+
+ # only now can change uid and euid
+ $< = $> = $uid+0;
+ die "failed to change uid to $uid" unless $< == $uid;
+
+ my $file = catfile $dir, ".apache-test-file-$$-".time.int(rand);
+ eval "END { unlink q[$file] }";
+
+ # unfortunately we can't run the what seems to be an obvious test:
+ # -r $dir && -w _ && -x _
+ # since not all perl implementations do it right (e.g. sometimes
+ # acls are ignored, at other times setid/gid change is ignored)
+ # therefore we test by trying to attempt to read/write/execute
+
+ # -w
+ open TEST, ">$file" or die "failed to open $file: $!";
+
+ # -x
+ -f $file or die "$file cannot be looked up";
+ close TEST;
+
+ # -r
+ opendir DIR, $dir or die "failed to open dir $dir: $!";
+ defined readdir DIR or die "failed to read dir $dir: $!";
+ close DIR;
+
+ # all tests passed
+ print "OK";
+}
+
sub check_perms {
my ($self, $user, $uid, $gid) = @_;
@@ -817,16 +855,14 @@
my $dir = $vars->{t_dir};
my $perl = $vars->{perl};
- my $check = <<"EOC";
-$perl -e '
- require POSIX;
- POSIX::setuid($uid);
- POSIX::setgid($gid);
- print -r q{$dir} && -w _ && -x _ ? q{OK} : q{NOK};
-'
-EOC
- $check =~ s/\n/ /g;
- warning "$check\n";
+ # find where Apache::TestRun was loaded from, so we load this
+ # exact package from the external process
+ my $inc = dirname dirname $INC{"Apache/TestRun.pm"};
+ my $sub = "Apache::TestRun::run_root_fs_test";
+ my $check = <<"EOI";
+$perl -Mlib=$inc -MApache::TestRun -e 'eval { $sub($uid, $gid, q[$dir]) }';
+EOI
+ warning "testing whether '$user' is able to -rwx $dir\n$check\n";
my $res = qx[$check] || '';
warning "result: $res";
1.72 +7 -0 httpd-test/perl-framework/Apache-Test/Changes
Index: Changes
===================================================================
RCS file: /home/cvs/httpd-test/perl-framework/Apache-Test/Changes,v
retrieving revision 1.71
retrieving revision 1.72
diff -u -u -r1.71 -r1.72
--- Changes 10 Dec 2003 02:26:30 -0000 1.71
+++ Changes 14 Dec 2003 02:09:04 -0000 1.72
@@ -8,6 +8,13 @@
=item 1.07-dev
+Another attempt at providing a test function that verifies whether
+Apache when switching from 'root' to 'nobody' or another user will be
+able to access and create files under the t/ directory. This time
+using perl's vars $(, $< since POSIX equivalents seem to be broken on
+some systems. Also using a better test that actually tries to
+write/read/execute in the path under test. [Stas]
+
Cleanly exit (and complain) if the default hostname resolution has
failed (usually due to a missing localhost entry in /etc/hosts) [Stas]