[prev in list] [next in list] [prev in thread] [next in thread]
List: proftpd-committers
Subject: [ProFTPD-committers] proftpd/tests/t/lib/ProFTPD/Tests/Config PassivePorts.pm, NONE, 1.1
From: TJ Saunders <castaglia () users ! sourceforge ! net>
Date: 2014-02-28 18:11:19
Message-ID: E1WJRu7-0007Be-8s () sfs-ml-4 ! v29 ! ch3 ! sourceforge ! com
[Download RAW message or body]
Update of /cvsroot/proftp/proftpd/tests/t/lib/ProFTPD/Tests/Config
In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv19541/t/lib/ProFTPD/Tests/Config
Added Files:
PassivePorts.pm
Log Message:
Added regression tests for the PassivePorts directive in various configuration
contexts, i.e. "server config", <Global>, and <VirtualHost>.
--- NEW FILE: PassivePorts.pm ---
package ProFTPD::Tests::Config::PassivePorts;
use lib qw(t/lib);
use base qw(ProFTPD::TestSuite::Child);
use strict;
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 = {
pasv_ports_server_config => {
order => ++$order,
test_class => [qw(forking)],
},
pasv_ports_global => {
order => ++$order,
test_class => [qw(forking)],
},
pasv_ports_vhost => {
order => ++$order,
test_class => [qw(forking)],
},
};
sub new {
return shift()->SUPER::new(@_);
}
sub list_tests {
return testsuite_get_runnable_tests($TESTS);
}
sub pasv_ports_server_config {
my $self = shift;
my $tmpdir = $self->{tmpdir};
my $config_file = "$tmpdir/config.conf";
my $pid_file = File::Spec->rel2abs("$tmpdir/config.pid");
my $scoreboard_file = File::Spec->rel2abs("$tmpdir/config.scoreboard");
my $log_file = test_get_logfile();
my $auth_user_file = File::Spec->rel2abs("$tmpdir/config.passwd");
my $auth_group_file = File::Spec->rel2abs("$tmpdir/config.group");
my $user = 'proftpd';
my $passwd = 'test';
my $group = 'ftpd';
my $home_dir = File::Spec->rel2abs($tmpdir);
my $uid = 500;
my $gid = 500;
# 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)) {
die("Can't set perms on $home_dir to 0755: $!");
}
unless (chown($uid, $gid, $home_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, $group, $gid, $user);
my $test_file = File::Spec->rel2abs("$tmpdir/test.txt");
if (open(my $fh, "> $test_file")) {
print $fh "ABCD" x 8192;
unless (close($fh)) {
die("Can't write $test_file: $!");
}
} else {
die("Can't open $test_file: $!");
}
my $min_port = 40100;
my $max_port = 40200;
my $config = {
PidFile => $pid_file,
ScoreboardFile => $scoreboard_file,
SystemLog => $log_file,
TraceLog => $log_file,
Trace => 'DEFAULT:0 data:10',
AuthUserFile => $auth_user_file,
AuthGroupFile => $auth_group_file,
PassivePorts => "$min_port $max_port",
IfModules => {
'mod_delay.c' => {
DelayEngine => 'off',
},
},
};
my ($port, $config_user, $config_group) = config_write($config_file, $config);
# 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);
my ($resp_code, $resp_msg) = $client->pasv();
$client->quit();
my $expected;
$expected = 227;
$self->assert($expected == $resp_code,
test_msg("Expected response code $expected, got $resp_code"));
$expected = '\(\d+,\d+,\d+,\d+,\d+,\d+\)';
$self->assert(qr/$expected/, $resp_msg,
test_msg("Expected response message '$expected', got '$resp_msg'"));
unless ($resp_msg =~ /\(\d+,\d+,\d+,\d+,(\d+),(\d+)\)/) {
die("Response '$resp_msg' does not match expected pattern");
}
my $pasv_port = ($1 * 256) + $2;
$self->assert($min_port <= $pasv_port && $max_port >= $pasv_port,
test_msg("Expected port from $min_port to $max_port, got $pasv_port"));
};
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) {
test_append_logfile($log_file, $ex);
unlink($log_file);
die($ex);
}
unlink($log_file);
}
sub pasv_ports_global {
my $self = shift;
my $tmpdir = $self->{tmpdir};
my $config_file = "$tmpdir/config.conf";
my $pid_file = File::Spec->rel2abs("$tmpdir/config.pid");
my $scoreboard_file = File::Spec->rel2abs("$tmpdir/config.scoreboard");
my $log_file = test_get_logfile();
my $auth_user_file = File::Spec->rel2abs("$tmpdir/config.passwd");
my $auth_group_file = File::Spec->rel2abs("$tmpdir/config.group");
my $user = 'proftpd';
my $passwd = 'test';
my $group = 'ftpd';
my $home_dir = File::Spec->rel2abs($tmpdir);
my $uid = 500;
my $gid = 500;
# 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)) {
die("Can't set perms on $home_dir to 0755: $!");
}
unless (chown($uid, $gid, $home_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, $group, $gid, $user);
my $test_file = File::Spec->rel2abs("$tmpdir/test.txt");
if (open(my $fh, "> $test_file")) {
print $fh "ABCD" x 8192;
unless (close($fh)) {
die("Can't write $test_file: $!");
}
} else {
die("Can't open $test_file: $!");
}
my $min_port = 40100;
my $max_port = 40200;
my $config = {
PidFile => $pid_file,
ScoreboardFile => $scoreboard_file,
SystemLog => $log_file,
TraceLog => $log_file,
Trace => 'DEFAULT:0 data:10',
AuthUserFile => $auth_user_file,
AuthGroupFile => $auth_group_file,
Global => {
PassivePorts => "$min_port $max_port",
},
IfModules => {
'mod_delay.c' => {
DelayEngine => 'off',
},
},
};
my ($port, $config_user, $config_group) = config_write($config_file, $config);
# 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);
my ($resp_code, $resp_msg) = $client->pasv();
$client->quit();
my $expected;
$expected = 227;
$self->assert($expected == $resp_code,
test_msg("Expected response code $expected, got $resp_code"));
$expected = '\(\d+,\d+,\d+,\d+,\d+,\d+\)';
$self->assert(qr/$expected/, $resp_msg,
test_msg("Expected response message '$expected', got '$resp_msg'"));
unless ($resp_msg =~ /\(\d+,\d+,\d+,\d+,(\d+),(\d+)\)/) {
die("Response '$resp_msg' does not match expected pattern");
}
my $pasv_port = ($1 * 256) + $2;
$self->assert($min_port <= $pasv_port && $max_port >= $pasv_port,
test_msg("Expected port from $min_port to $max_port, got $pasv_port"));
};
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) {
test_append_logfile($log_file, $ex);
unlink($log_file);
die($ex);
}
unlink($log_file);
}
sub pasv_ports_vhost {
my $self = shift;
my $tmpdir = $self->{tmpdir};
my $config_file = "$tmpdir/config.conf";
my $pid_file = File::Spec->rel2abs("$tmpdir/config.pid");
my $scoreboard_file = File::Spec->rel2abs("$tmpdir/config.scoreboard");
my $log_file = test_get_logfile();
my $auth_user_file = File::Spec->rel2abs("$tmpdir/config.passwd");
my $auth_group_file = File::Spec->rel2abs("$tmpdir/config.group");
my $user = 'proftpd';
my $passwd = 'test';
my $group = 'ftpd';
my $home_dir = File::Spec->rel2abs($tmpdir);
my $uid = 500;
my $gid = 500;
# 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)) {
die("Can't set perms on $home_dir to 0755: $!");
}
unless (chown($uid, $gid, $home_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, $group, $gid, $user);
my $test_file = File::Spec->rel2abs("$tmpdir/test.txt");
if (open(my $fh, "> $test_file")) {
print $fh "ABCD" x 8192;
unless (close($fh)) {
die("Can't write $test_file: $!");
}
} else {
die("Can't open $test_file: $!");
}
my $min_port = 40100;
my $max_port = 40200;
my $config = {
PidFile => $pid_file,
ScoreboardFile => $scoreboard_file,
SystemLog => $log_file,
TraceLog => $log_file,
Trace => 'DEFAULT:0 data:10',
AuthUserFile => $auth_user_file,
AuthGroupFile => $auth_group_file,
Port => '0',
SocketBindTight => 'on',
IfModules => {
'mod_delay.c' => {
DelayEngine => 'off',
},
},
};
my ($port, $config_user, $config_group) = config_write($config_file, $config);
my $vhost_port = ProFTPD::TestSuite::Utils::get_high_numbered_port();
if (open(my $fh, ">> $config_file")) {
print $fh <<EOC;
<VirtualHost 127.0.0.1>
ServerName "Vhost"
Port $vhost_port
AuthUserFile $auth_user_file
AuthGroupFile $auth_group_file
PassivePorts $min_port $max_port
</VirtualHost>
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', $vhost_port);
$client->login($user, $passwd);
my ($resp_code, $resp_msg) = $client->pasv();
$client->quit();
my $expected;
$expected = 227;
$self->assert($expected == $resp_code,
test_msg("Expected response code $expected, got $resp_code"));
$expected = '\(\d+,\d+,\d+,\d+,\d+,\d+\)';
$self->assert(qr/$expected/, $resp_msg,
test_msg("Expected response message '$expected', got '$resp_msg'"));
unless ($resp_msg =~ /\(\d+,\d+,\d+,\d+,(\d+),(\d+)\)/) {
die("Response '$resp_msg' does not match expected pattern");
}
my $pasv_port = ($1 * 256) + $2;
$self->assert($min_port <= $pasv_port && $max_port >= $pasv_port,
test_msg("Expected port from $min_port to $max_port, got $pasv_port"));
};
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) {
test_append_logfile($log_file, $ex);
unlink($log_file);
die($ex);
}
unlink($log_file);
}
1;
------------------------------------------------------------------------------
Flow-based real-time traffic analytics software. Cisco certified tool.
Monitor traffic, SLAs, QoS, Medianet, WAAS etc. with NetFlow Analyzer
Customize your own dashboards, set traffic alerts and generate reports.
Network behavioral analysis & security monitoring. All-in-one tool.
http://pubads.g.doubleclick.net/gampad/clk?id=126839071&iu=/4140/ostg.clktrk
_______________________________________________
ProFTPD Committers Mailing List
proftpd-committers@proftpd.org
https://lists.sourceforge.net/lists/listinfo/proftp-committers
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic