From: TJ S. <cas...@us...> - 2010-02-24 23:14:10
|
Update of /cvsroot/proftp/proftpd/tests/t/lib/ProFTPD/Tests/Config/Limit In directory sfp-cvsdas-2.v30.ch3.sourceforge.com:/tmp/cvs-serv27947/tests/t/lib/ProFTPD/Tests/Config/Limit Added Files: MFMT.pm Log Message: Bug#3399 - <Limit> statement does not restore access to MFMT commands. --- NEW FILE --- package ProFTPD::Tests::Config::Limit::MFMT; use lib qw(t/lib); use base qw(Test::Unit::TestCase ProFTPD::TestSuite::Child); use strict; use File::Path qw(mkpath rmtree); use File::Spec; use IO::Handle; use ProFTPD::TestSuite::FTP; use ProFTPD::TestSuite::Utils qw(:auth :config :running :test :testsuite); $| = 1; my $order = 0; my $TESTS = { mfmt_limit_bug3399 => { order => ++$order, test_class => [qw(bug forking rootprivs)], }, }; sub new { return shift()->SUPER::new(@_); } sub list_tests { return testsuite_get_runnable_tests($TESTS); } sub set_up { my $self = shift; $self->{tmpdir} = testsuite_get_tmp_dir(); # Create temporary scratch dir eval { mkpath($self->{tmpdir}) }; if ($@) { my $abs_path = File::Spec->rel2abs($self->{tmpdir}); die("Can't create dir $abs_path: $@"); } } sub tear_down { my $self = shift; # Remove temporary scratch dir if ($self->{tmpdir}) { eval { rmtree($self->{tmpdir}) }; } undef $self; } sub mfmt_limit_bug3399 { $ENV{TEST_VERBOSE}=1; my $self = shift; my $tmpdir = $self->{tmpdir}; my $config_file = "$tmpdir/limit.conf"; my $pid_file = File::Spec->rel2abs("$tmpdir/limit.pid"); my $scoreboard_file = File::Spec->rel2abs("$tmpdir/limit.scoreboard"); my $log_file = File::Spec->rel2abs('tests.log'); my $auth_user_file = File::Spec->rel2abs("$tmpdir/limit.passwd"); my $auth_group_file = File::Spec->rel2abs("$tmpdir/limit.group"); my $user = 'proftpd'; my $passwd = 'test'; my $home_dir = File::Spec->rel2abs($tmpdir); my $uid = 500; my $gid = 500; my $sub_dir = File::Spec->rel2abs("$tmpdir/foo"); mkpath($sub_dir); # Make sure that, if we're running as root, that the home directory has # permissions/privs set for the account we create if ($< == 0) { unless (chmod(0755, $home_dir, $sub_dir)) { die("Can't set perms on $home_dir to 0755: $!"); } unless (chown($uid, $gid, $home_dir, $sub_dir)) { die("Can't set owner of $home_dir to $uid/$gid: $!"); } } auth_user_write($auth_user_file, $user, $passwd, $uid, $gid, $home_dir, '/bin/bash'); auth_group_write($auth_group_file, 'ftpd', $gid, $user); my $config = { PidFile => $pid_file, ScoreboardFile => $scoreboard_file, SystemLog => $log_file, TraceLog => $log_file, Trace => 'directory:10', AuthUserFile => $auth_user_file, AuthGroupFile => $auth_group_file, DefaultRoot => '~', IfModules => { 'mod_delay.c' => { DelayEngine => 'off', }, }, }; my ($port, $config_user, $config_group) = config_write($config_file, $config); if (open(my $fh, ">> $config_file")) { print $fh <<EOC; <Directory $home_dir> <Limit SITE WRITE> DenyAll </Limit> </Directory> <Directory $sub_dir/*> <Limit SITE READ WRITE DIRS> AllowAll </Limit> </Directory> EOC unless (close($fh)) { die("Can't write $config_file: $!"); } } else { die("Can't open $config_file: $!"); } # Open pipes, for use between the parent and child processes. Specifically, # the child will indicate when it's done with its test by writing a message # to the parent. my ($rfh, $wfh); unless (pipe($rfh, $wfh)) { die("Can't open pipe: $!"); } my $ex; # Fork child $self->handle_sigchld(); defined(my $pid = fork()) or die("Can't fork: $!"); if ($pid) { eval { my $client = ProFTPD::TestSuite::FTP->new('127.0.0.1', $port); $client->login($user, $passwd); $client->cwd('foo'); my $conn = $client->stor_raw('test.txt'); unless ($conn) { die("STOR test.txt failed: " . $client->response_code() . $client->response_msg()); } $conn->close(); my ($resp_code, $resp_msg); ($resp_code, $resp_msg) = $client->mfmt('20020717210715', 'test.txt'); my $expected; $expected = 213; $self->assert($expected == $resp_code, test_msg("Expected $expected, got $resp_code")); $expected = 'Modify=20020717210715; test.txt'; $self->assert($expected eq $resp_msg, test_msg("Expected '$expected', got '$resp_msg'")); $client->quit(); }; if ($@) { $ex = $@; } $wfh->print("done\n"); $wfh->flush(); } else { eval { server_wait($config_file, $rfh) }; if ($@) { warn($@); exit 1; } exit 0; } # Stop server server_stop($pid_file); $self->assert_child_ok($pid); if ($ex) { die($ex); } unlink($log_file); } 1; |