Imported Upstream version 0.1
This commit is contained in:
11
t/config/maxhostsperuser.t
Normal file
11
t/config/maxhostsperuser.t
Normal file
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use lib qw(t/lib);
|
||||
use strict;
|
||||
|
||||
use Test::Unit::HarnessUnit;
|
||||
|
||||
$| = 1;
|
||||
|
||||
my $r = Test::Unit::HarnessUnit->new();
|
||||
$r->start("ProFTPD::Tests::Config::MaxHostsPerUser");
|
||||
66
t/lib/ProFTPD/TestSuite/ProxiedFTP.pm
Normal file
66
t/lib/ProFTPD/TestSuite/ProxiedFTP.pm
Normal file
@@ -0,0 +1,66 @@
|
||||
package ProFTPD::TestSuite::ProxiedFTP;
|
||||
|
||||
use strict;
|
||||
use vars qw(@ISA);
|
||||
|
||||
use Carp;
|
||||
use Net::FTP;
|
||||
|
||||
@ISA = qw(Net::FTP);
|
||||
|
||||
my $proxy_info = undef;
|
||||
|
||||
sub new {
|
||||
my $class = shift;
|
||||
my ($addr, $port, $proxy, $timeout) = @_;
|
||||
$timeout = 5 unless defined($timeout);
|
||||
my $debug = undef;
|
||||
|
||||
$proxy_info = $proxy;
|
||||
|
||||
if ($ENV{TEST_VERBOSE}) {
|
||||
$debug = 10;
|
||||
}
|
||||
|
||||
my $self = $class->SUPER::new($addr,
|
||||
Port => $port,
|
||||
Timeout => $timeout,
|
||||
Debug => $debug,
|
||||
);
|
||||
|
||||
unless ($self) {
|
||||
croak($@);
|
||||
}
|
||||
|
||||
return $self;
|
||||
}
|
||||
|
||||
# Override response() from Net::Cmd to trigger sending the PROXY command
|
||||
sub response {
|
||||
my $self = shift;
|
||||
|
||||
if (defined($proxy_info)) {
|
||||
if (ref($proxy_info)) {
|
||||
my ($proto, $src_addr, $dst_addr, $src_port, $dst_port) = @$proxy_info;
|
||||
$self->command("PROXY", $proto, $src_addr, $dst_addr, $src_port, $dst_port);
|
||||
|
||||
} else {
|
||||
$self->rawdatasend($proxy_info);
|
||||
}
|
||||
|
||||
$proxy_info = undef;
|
||||
}
|
||||
|
||||
$self->SUPER::response();
|
||||
}
|
||||
|
||||
sub login {
|
||||
my $self = shift;
|
||||
|
||||
unless ($self->SUPER::login(@_)) {
|
||||
croak("Failed to login: " . $self->code . " " . $self->message);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
1;
|
||||
229
t/lib/ProFTPD/Tests/Config/MaxHostsPerUser.pm
Normal file
229
t/lib/ProFTPD/Tests/Config/MaxHostsPerUser.pm
Normal file
@@ -0,0 +1,229 @@
|
||||
package ProFTPD::Tests::Config::MaxHostsPerUser;
|
||||
|
||||
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::ProxiedFTP;
|
||||
use ProFTPD::TestSuite::Utils qw(:auth :config :running :test :testsuite);
|
||||
|
||||
$| = 1;
|
||||
|
||||
my $order = 0;
|
||||
|
||||
my $TESTS = {
|
||||
maxhostsperuser_one => {
|
||||
order => ++$order,
|
||||
test_class => [qw(forking mod_proxy_protocol)],
|
||||
},
|
||||
|
||||
maxhostsperuser_one_multi_conns => {
|
||||
order => ++$order,
|
||||
test_class => [qw(forking mod_proxy_protocol)],
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
sub new {
|
||||
return shift()->SUPER::new(@_);
|
||||
}
|
||||
|
||||
sub list_tests {
|
||||
return testsuite_get_runnable_tests($TESTS);
|
||||
}
|
||||
|
||||
sub maxhostsperuser_one {
|
||||
my $self = shift;
|
||||
my $tmpdir = $self->{tmpdir};
|
||||
my $setup = test_setup($tmpdir, 'config');
|
||||
|
||||
my $max_hosts = 1;
|
||||
|
||||
my $config = {
|
||||
PidFile => $setup->{pid_file},
|
||||
ScoreboardFile => $setup->{scoreboard_file},
|
||||
SystemLog => $setup->{log_file},
|
||||
|
||||
AuthUserFile => $setup->{auth_user_file},
|
||||
AuthGroupFile => $setup->{auth_group_file},
|
||||
|
||||
MaxHostsPerUser => $max_hosts,
|
||||
|
||||
IfModules => {
|
||||
'mod_delay.c' => {
|
||||
DelayEngine => 'off',
|
||||
},
|
||||
|
||||
'mod_proxy_protocol.c' => {
|
||||
ProxyProtocolEngine => 'on',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
my ($port, $config_user, $config_group) = config_write($setup->{config_file},
|
||||
$config);
|
||||
|
||||
my $proxy_info = ['TCP4', '1.1.1.1', '127.0.0.1', 111, $port];
|
||||
|
||||
# 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 {
|
||||
sleep(1);
|
||||
|
||||
# First client should be able to connect and log in...
|
||||
my $client1 = ProFTPD::TestSuite::ProxiedFTP->new('127.0.0.1', $port,
|
||||
['TCP4', '127.0.0.1', '127.0.0.1', 12345, $port]);
|
||||
$client1->login($setup->{user}, $setup->{passwd});
|
||||
|
||||
# ...but the second client should be able to connect, but not login.
|
||||
my $client2 = ProFTPD::TestSuite::ProxiedFTP->new('127.0.0.1', $port,
|
||||
$proxy_info);
|
||||
eval { $client2->login($setup->{user}, $setup->{passwd}) };
|
||||
unless ($@) {
|
||||
die("Login succeeded unexpectedly");
|
||||
}
|
||||
|
||||
$client1->quit();
|
||||
};
|
||||
|
||||
if ($@) {
|
||||
$ex = $@;
|
||||
}
|
||||
|
||||
$wfh->print("done\n");
|
||||
$wfh->flush();
|
||||
|
||||
} else {
|
||||
eval { server_wait($setup->{config_file}, $rfh) };
|
||||
if ($@) {
|
||||
warn($@);
|
||||
exit 1;
|
||||
}
|
||||
|
||||
exit 0;
|
||||
}
|
||||
|
||||
# Stop server
|
||||
server_stop($setup->{pid_file});
|
||||
$self->assert_child_ok($pid);
|
||||
|
||||
test_cleanup($setup->{log_file}, $ex);
|
||||
}
|
||||
|
||||
sub maxhostsperuser_one_multi_conns {
|
||||
my $self = shift;
|
||||
my $tmpdir = $self->{tmpdir};
|
||||
my $setup = test_setup($tmpdir, 'config');
|
||||
|
||||
my $max_hosts = 1;
|
||||
|
||||
my $config = {
|
||||
PidFile => $setup->{pid_file},
|
||||
ScoreboardFile => $setup->{scoreboard_file},
|
||||
SystemLog => $setup->{log_file},
|
||||
|
||||
AuthUserFile => $setup->{auth_user_file},
|
||||
AuthGroupFile => $setup->{auth_group_file},
|
||||
|
||||
MaxHostsPerUser => $max_hosts,
|
||||
|
||||
IfModules => {
|
||||
'mod_delay.c' => {
|
||||
DelayEngine => 'off',
|
||||
},
|
||||
|
||||
'mod_proxy_protocol.c' => {
|
||||
ProxyProtocolEngine => 'on',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
my ($port, $config_user, $config_group) = config_write($setup->{config_file},
|
||||
$config);
|
||||
|
||||
my $proxy_info = ['TCP4', '1.1.1.1', '127.0.0.1', 111, $port];
|
||||
|
||||
# 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 {
|
||||
sleep(1);
|
||||
|
||||
# First client should be able to connect and log in...
|
||||
my $client1 = ProFTPD::TestSuite::ProxiedFTP->new('127.0.0.1', $port,
|
||||
['TCP4', '127.0.0.1', '127.0.0.1', 12345, $port]);
|
||||
$client1->login($setup->{user}, $setup->{passwd});
|
||||
|
||||
# ...but the second client should be able to connect, but not login.
|
||||
my $client2 = ProFTPD::TestSuite::ProxiedFTP->new('127.0.0.1', $port,
|
||||
$proxy_info);
|
||||
eval { $client2->login($setup->{user}, $setup->{passwd}) };
|
||||
unless ($@) {
|
||||
die("Login succeeded unexpectedly");
|
||||
}
|
||||
|
||||
# Even though we can't log in, we should be able to connect quite
|
||||
# a few more times
|
||||
|
||||
my $clients = [];
|
||||
for (my $i = 0; $i < 10; $i++) {
|
||||
my $client = ProFTPD::TestSuite::ProxiedFTP->new('127.0.0.1', $port,
|
||||
$proxy_info);
|
||||
push(@$clients, $client);
|
||||
}
|
||||
|
||||
$client1->quit();
|
||||
};
|
||||
|
||||
if ($@) {
|
||||
$ex = $@;
|
||||
}
|
||||
|
||||
$wfh->print("done\n");
|
||||
$wfh->flush();
|
||||
|
||||
} else {
|
||||
eval { server_wait($setup->{config_file}, $rfh) };
|
||||
if ($@) {
|
||||
warn($@);
|
||||
exit 1;
|
||||
}
|
||||
|
||||
exit 0;
|
||||
}
|
||||
|
||||
# Stop server
|
||||
server_stop($setup->{pid_file});
|
||||
$self->assert_child_ok($pid);
|
||||
|
||||
test_cleanup($setup->{log_file}, $ex);
|
||||
}
|
||||
|
||||
1;
|
||||
2233
t/lib/ProFTPD/Tests/Modules/mod_proxy_protocol.pm
Normal file
2233
t/lib/ProFTPD/Tests/Modules/mod_proxy_protocol.pm
Normal file
File diff suppressed because it is too large
Load Diff
150
t/lib/ProFTPD/Tests/Modules/mod_proxy_protocol/sftp.pm
Normal file
150
t/lib/ProFTPD/Tests/Modules/mod_proxy_protocol/sftp.pm
Normal file
@@ -0,0 +1,150 @@
|
||||
package ProFTPD::Tests::Modules::mod_proxy_protocol::sftp;
|
||||
|
||||
use lib qw(t/lib);
|
||||
use base qw(ProFTPD::TestSuite::Child);
|
||||
use strict;
|
||||
|
||||
use File::Path qw(mkpath);
|
||||
use File::Spec;
|
||||
use IO::Handle;
|
||||
|
||||
use ProFTPD::TestSuite::ProxiedFTP;
|
||||
use ProFTPD::TestSuite::Utils qw(:auth :config :running :test :testsuite);
|
||||
|
||||
$| = 1;
|
||||
|
||||
my $order = 0;
|
||||
|
||||
my $TESTS = {
|
||||
proxy_protocol_sftp_with_proxy => {
|
||||
order => ++$order,
|
||||
test_class => [qw(forking mod_proxy_protocol mod_sftp)],
|
||||
},
|
||||
|
||||
proxy_protocol_sftp_without_proxy => {
|
||||
order => ++$order,
|
||||
test_class => [qw(forking mod_proxy_protocol mod_sftp)],
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
sub new {
|
||||
return shift()->SUPER::new(@_);
|
||||
}
|
||||
|
||||
sub list_tests {
|
||||
# return testsuite_get_runnable_tests($TESTS);
|
||||
return qw(
|
||||
proxy_protocol_sftp_with_proxy
|
||||
);
|
||||
}
|
||||
|
||||
sub set_up {
|
||||
my $self = shift;
|
||||
$self->SUPER::set_up(@_);
|
||||
|
||||
# Make sure that mod_sftp does not complain about permissions on the hostkey
|
||||
# files.
|
||||
|
||||
my $rsa_host_key = File::Spec->rel2abs("$ENV{PROFTPD_TEST_DIR}/t/etc/modules/mod_sftp/ssh_host_rsa_key");
|
||||
my $dsa_host_key = File::Spec->rel2abs("$ENV{PROFTPD_TEST_DIR}/t/etc/modules/mod_sftp/ssh_host_dsa_key");
|
||||
|
||||
unless (chmod(0400, $rsa_host_key, $dsa_host_key)) {
|
||||
die("Can't set perms on $rsa_host_key, $dsa_host_key: $!");
|
||||
}
|
||||
}
|
||||
|
||||
sub proxy_protocol_sftp_with_proxy {
|
||||
my $self = shift;
|
||||
my $tmpdir = $self->{tmpdir};
|
||||
my $setup = test_setup($tmpdir, 'proxy_protocol');
|
||||
|
||||
my $rsa_host_key = File::Spec->rel2abs("$ENV{PROFTPD_TEST_DIR}/t/etc/modules/mod_sftp/ssh_host_rsa_key");
|
||||
my $dsa_host_key = File::Spec->rel2abs("$ENV{PROFTPD_TEST_DIR}/t/etc/modules/mod_sftp/ssh_host_dsa_key");
|
||||
|
||||
my $config = {
|
||||
PidFile => $setup->{pid_file},
|
||||
ScoreboardFile => $setup->{scoreboard_file},
|
||||
SystemLog => $setup->{log_file},
|
||||
TraceLog => $setup->{log_file},
|
||||
Trace => 'ssh2:20',
|
||||
|
||||
AuthUserFile => $setup->{auth_user_file},
|
||||
AuthGroupFile => $setup->{auth_group_file},
|
||||
|
||||
IfModules => {
|
||||
'mod_delay.c' => {
|
||||
DelayEngine => 'off',
|
||||
},
|
||||
|
||||
'mod_proxy_protocol.c' => {
|
||||
ProxyProtocolEngine => 'on',
|
||||
},
|
||||
|
||||
'mod_sftp.c' => [
|
||||
"SFTPEngine on",
|
||||
"SFTPLog $setup->{log_file}",
|
||||
"SFTPHostKey $rsa_host_key",
|
||||
"SFTPHostKey $dsa_host_key",
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
my ($port, $config_user, $config_group) = config_write($setup->{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 {
|
||||
sleep(2);
|
||||
|
||||
my $client = ProFTPD::TestSuite::ProxiedFTP->new('127.0.0.1', $port);
|
||||
$client->send_proxy_raw('1.1.1.1', '2.2.2.2', 111, 222);
|
||||
my $banner = $client->getline();
|
||||
chomp($banner);
|
||||
|
||||
unless ($banner =~ /^SSH\-2\.0\-mod_sftp/) {
|
||||
die("Received unexpected banner from mod_sftp: '$banner'");
|
||||
}
|
||||
|
||||
print $client "SSH-2.0-ProFTPD_mod_proxy_protocol_sftp_Test\r\n";
|
||||
};
|
||||
|
||||
if ($@) {
|
||||
$ex = $@;
|
||||
}
|
||||
|
||||
$wfh->print("done\n");
|
||||
$wfh->flush();
|
||||
|
||||
} else {
|
||||
eval { server_wait($setup->{config_file}, $rfh, 10) };
|
||||
if ($@) {
|
||||
warn($@);
|
||||
exit 1;
|
||||
}
|
||||
|
||||
exit 0;
|
||||
}
|
||||
|
||||
# Stop server
|
||||
server_stop($setup->{pid_file});
|
||||
|
||||
$self->assert_child_ok($pid);
|
||||
|
||||
test_cleanup($setup->{log_file}, $ex);
|
||||
}
|
||||
|
||||
1;
|
||||
304
t/lib/ProFTPD/Tests/Modules/mod_proxy_protocol/tls.pm
Normal file
304
t/lib/ProFTPD/Tests/Modules/mod_proxy_protocol/tls.pm
Normal file
@@ -0,0 +1,304 @@
|
||||
package ProFTPD::Tests::Modules::mod_proxy_protocol::tls;
|
||||
|
||||
use lib qw(t/lib);
|
||||
use base qw(ProFTPD::TestSuite::Child);
|
||||
use strict;
|
||||
|
||||
use File::Path qw(mkpath);
|
||||
use File::Spec;
|
||||
use IO::Handle;
|
||||
use Net::Cmd qw(CMD_OK CMD_MORE);
|
||||
|
||||
use ProFTPD::TestSuite::ProxiedFTP;
|
||||
use ProFTPD::TestSuite::Utils qw(:auth :config :running :test :testsuite);
|
||||
|
||||
$| = 1;
|
||||
|
||||
my $order = 0;
|
||||
|
||||
my $TESTS = {
|
||||
proxy_protocol_tls_login_with_proxy => {
|
||||
order => ++$order,
|
||||
test_class => [qw(forking mod_proxy_protocol mod_tls)],
|
||||
},
|
||||
|
||||
proxy_protocol_tls_login_with_proxy_useimplicitssl => {
|
||||
order => ++$order,
|
||||
test_class => [qw(forking mod_proxy_protocol mod_tls)],
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
sub new {
|
||||
return shift()->SUPER::new(@_);
|
||||
}
|
||||
|
||||
sub list_tests {
|
||||
# Check for the required Perl modules:
|
||||
#
|
||||
# Net-SSLeay
|
||||
# IO-Socket-SSL
|
||||
|
||||
my $required = [qw(
|
||||
Net::SSLeay
|
||||
IO::Socket::SSL
|
||||
)];
|
||||
|
||||
foreach my $req (@$required) {
|
||||
eval "use $req";
|
||||
if ($@) {
|
||||
print STDERR "\nWARNING:\n + Module '$req' not found, skipping all tests\n";
|
||||
|
||||
if ($ENV{TEST_VERBOSE}) {
|
||||
print STDERR "Unable to load $req: $@\n";
|
||||
}
|
||||
|
||||
return qw(testsuite_empty_test);
|
||||
}
|
||||
}
|
||||
|
||||
# return testsuite_get_runnable_tests($TESTS);
|
||||
return qw(
|
||||
proxy_protocol_tls_login_with_proxy_useimplicitssl
|
||||
);
|
||||
}
|
||||
|
||||
sub proxy_protocol_tls_login_with_proxy {
|
||||
my $self = shift;
|
||||
my $tmpdir = $self->{tmpdir};
|
||||
my $setup = test_setup($tmpdir, 'proxy_protocol');
|
||||
|
||||
my $server_cert_file = File::Spec->rel2abs("$ENV{PROFTPD_TEST_DIR}/t/etc/modules/mod_tls/server-cert.pem");
|
||||
my $ca_file = File::Spec->rel2abs("$ENV{PROFTPD_TEST_DIR}/t/etc/modules/mod_tls/ca-cert.pem");
|
||||
|
||||
my $config = {
|
||||
PidFile => $setup->{pid_file},
|
||||
ScoreboardFile => $setup->{scoreboard_file},
|
||||
SystemLog => $setup->{log_file},
|
||||
TraceLog => $setup->{log_file},
|
||||
Trace => 'netio:10 proxy_protocol:20',
|
||||
|
||||
AuthUserFile => $setup->{auth_user_file},
|
||||
AuthGroupFile => $setup->{auth_group_file},
|
||||
|
||||
IfModules => {
|
||||
'mod_delay.c' => {
|
||||
DelayEngine => 'off',
|
||||
},
|
||||
|
||||
'mod_proxy_protocol.c' => {
|
||||
ProxyProtocolEngine => 'on',
|
||||
},
|
||||
|
||||
'mod_tls.c' => {
|
||||
TLSEngine => 'on',
|
||||
TLSLog => $setup->{log_file},
|
||||
TLSProtocol => 'SSLv3 TLSv1',
|
||||
TLSRequired => 'on',
|
||||
TLSRSACertificateFile => $server_cert_file,
|
||||
TLSCACertificateFile => $ca_file,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
my ($port, $config_user, $config_group) = config_write($setup->{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;
|
||||
|
||||
require IO::Socket::SSL;
|
||||
|
||||
# Fork child
|
||||
$self->handle_sigchld();
|
||||
defined(my $pid = fork()) or die("Can't fork: $!");
|
||||
if ($pid) {
|
||||
eval {
|
||||
sleep(2);
|
||||
|
||||
my $client = ProFTPD::TestSuite::ProxiedFTP->new('127.0.0.1', $port,
|
||||
['TCP4', '1.1.1.1', '2.2.2.2', 111, 222]);
|
||||
my $ok = $client->command("AUTH", "TLS")->response();
|
||||
unless ($ok == CMD_OK || $ok == CMD_MORE) {
|
||||
die($client->message);
|
||||
}
|
||||
|
||||
my $ssl_opts = {
|
||||
SSL_version => 'SSLv23',
|
||||
};
|
||||
|
||||
my $ssl_client = IO::Socket::SSL->start_SSL($client, %$ssl_opts);
|
||||
unless ($ssl_client) {
|
||||
die("TLS handshake failed: " . IO::Socket::SSL::errstr());
|
||||
}
|
||||
|
||||
push(@IO::Socket::SSL::ISA, 'Net::Cmd');
|
||||
|
||||
$ok = $ssl_client->command("USER", $setup->{user})->response();
|
||||
unless ($ok == CMD_OK || $ok == CMD_MORE) {
|
||||
die($client->message);
|
||||
}
|
||||
|
||||
$ok = $ssl_client->command("PASS", $setup->{passwd})->response();
|
||||
unless ($ok == CMD_OK || $ok == CMD_MORE) {
|
||||
die($client->message);
|
||||
}
|
||||
|
||||
$ok = $ssl_client->command("QUIT")->response();
|
||||
unless ($ok == CMD_OK) {
|
||||
die($client->message);
|
||||
}
|
||||
};
|
||||
|
||||
if ($@) {
|
||||
$ex = $@;
|
||||
}
|
||||
|
||||
$wfh->print("done\n");
|
||||
$wfh->flush();
|
||||
|
||||
} else {
|
||||
eval { server_wait($setup->{config_file}, $rfh, 10) };
|
||||
if ($@) {
|
||||
warn($@);
|
||||
exit 1;
|
||||
}
|
||||
|
||||
exit 0;
|
||||
}
|
||||
|
||||
# Stop server
|
||||
server_stop($setup->{pid_file});
|
||||
|
||||
$self->assert_child_ok($pid);
|
||||
|
||||
test_cleanup($setup->{log_file}, $ex);
|
||||
}
|
||||
|
||||
sub proxy_protocol_tls_login_with_proxy_useimplicitssl {
|
||||
my $self = shift;
|
||||
my $tmpdir = $self->{tmpdir};
|
||||
my $setup = test_setup($tmpdir, 'proxy_protocol');
|
||||
|
||||
my $server_cert_file = File::Spec->rel2abs("$ENV{PROFTPD_TEST_DIR}/t/etc/modules/mod_tls/server-cert.pem");
|
||||
my $ca_file = File::Spec->rel2abs("$ENV{PROFTPD_TEST_DIR}/t/etc/modules/mod_tls/ca-cert.pem");
|
||||
|
||||
my $config = {
|
||||
PidFile => $setup->{pid_file},
|
||||
ScoreboardFile => $setup->{scoreboard_file},
|
||||
SystemLog => $setup->{log_file},
|
||||
|
||||
AuthUserFile => $setup->{auth_user_file},
|
||||
AuthGroupFile => $setup->{auth_group_file},
|
||||
|
||||
IfModules => {
|
||||
'mod_delay.c' => {
|
||||
DelayEngine => 'off',
|
||||
},
|
||||
|
||||
'mod_proxy_protocol.c' => {
|
||||
ProxyProtocolEngine => 'on',
|
||||
},
|
||||
|
||||
'mod_tls.c' => {
|
||||
TLSEngine => 'on',
|
||||
TLSLog => $setup->{log_file},
|
||||
TLSProtocol => 'SSLv3 TLSv1',
|
||||
TLSRequired => 'on',
|
||||
TLSRSACertificateFile => $server_cert_file,
|
||||
TLSCACertificateFile => $ca_file,
|
||||
TLSOptions => 'UseImplicitSSL',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
my ($port, $config_user, $config_group) = config_write($setup->{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;
|
||||
|
||||
require IO::Socket::SSL;
|
||||
|
||||
# Fork child
|
||||
$self->handle_sigchld();
|
||||
defined(my $pid = fork()) or die("Can't fork: $!");
|
||||
if ($pid) {
|
||||
eval {
|
||||
sleep(2);
|
||||
|
||||
my $client = ProFTPD::TestSuite::ProxiedFTP->new('127.0.0.1', $port,
|
||||
['TCP4', '1.1.1.1', '2.2.2.2', 111, 222]);
|
||||
|
||||
my $ssl_opts = {
|
||||
SSL_version => 'SSLv23',
|
||||
};
|
||||
|
||||
my $ssl_client = IO::Socket::SSL->start_SSL($client, %$ssl_opts);
|
||||
unless ($ssl_client) {
|
||||
die("TLS handshake failed: " . IO::Socket::SSL::errstr());
|
||||
}
|
||||
|
||||
push(@IO::Socket::SSL::ISA, 'Net::Cmd');
|
||||
|
||||
my $ok = $ssl_client->response();
|
||||
unless ($ok == CMD_OK || $ok == CMD_MORE) {
|
||||
die($client->message);
|
||||
}
|
||||
|
||||
$ok = $ssl_client->command("USER", $setup->{user})->response();
|
||||
unless ($ok == CMD_OK || $ok == CMD_MORE) {
|
||||
die($client->message);
|
||||
}
|
||||
|
||||
$ok = $ssl_client->command("PASS", $setup->{passwd})->response();
|
||||
unless ($ok == CMD_OK || $ok == CMD_MORE) {
|
||||
die($client->message);
|
||||
}
|
||||
|
||||
$ok = $ssl_client->command("QUIT")->response();
|
||||
unless ($ok == CMD_OK) {
|
||||
die($client->message);
|
||||
}
|
||||
};
|
||||
|
||||
if ($@) {
|
||||
$ex = $@;
|
||||
}
|
||||
|
||||
$wfh->print("done\n");
|
||||
$wfh->flush();
|
||||
|
||||
} else {
|
||||
eval { server_wait($setup->{config_file}, $rfh, 10) };
|
||||
if ($@) {
|
||||
warn($@);
|
||||
exit 1;
|
||||
}
|
||||
|
||||
exit 0;
|
||||
}
|
||||
|
||||
# Stop server
|
||||
server_stop($setup->{pid_file});
|
||||
|
||||
$self->assert_child_ok($pid);
|
||||
|
||||
test_cleanup($setup->{log_file}, $ex);
|
||||
}
|
||||
|
||||
1;
|
||||
139
t/lib/ProFTPD/Tests/Modules/mod_proxy_protocol/wrap2.pm
Normal file
139
t/lib/ProFTPD/Tests/Modules/mod_proxy_protocol/wrap2.pm
Normal file
@@ -0,0 +1,139 @@
|
||||
package ProFTPD::Tests::Modules::mod_proxy_protocol::wrap2;
|
||||
|
||||
use lib qw(t/lib);
|
||||
use base qw(ProFTPD::TestSuite::Child);
|
||||
use strict;
|
||||
|
||||
use File::Path qw(mkpath);
|
||||
use File::Spec;
|
||||
use IO::Handle;
|
||||
|
||||
use ProFTPD::TestSuite::ProxiedFTP;
|
||||
use ProFTPD::TestSuite::Utils qw(:auth :config :running :test :testsuite);
|
||||
|
||||
$| = 1;
|
||||
|
||||
my $order = 0;
|
||||
|
||||
my $TESTS = {
|
||||
proxy_protocol_wrap2_config_deny => {
|
||||
order => ++$order,
|
||||
test_class => [qw(forking mod_proxy_protocol mod_wrap2)],
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
sub new {
|
||||
return shift()->SUPER::new(@_);
|
||||
}
|
||||
|
||||
sub list_tests {
|
||||
return testsuite_get_runnable_tests($TESTS);
|
||||
}
|
||||
|
||||
sub proxy_protocol_wrap2_config_deny {
|
||||
my $self = shift;
|
||||
my $tmpdir = $self->{tmpdir};
|
||||
my $setup = test_setup($tmpdir, 'proxy_protocol');
|
||||
|
||||
my $allow_file = File::Spec->rel2abs("$tmpdir/wrap2.allow");
|
||||
if (open(my $fh, "> $allow_file")) {
|
||||
unless (close($fh)) {
|
||||
die("Can't write $allow_file: $!");
|
||||
}
|
||||
|
||||
} else {
|
||||
die("Can't open $allow_file: $!");
|
||||
}
|
||||
|
||||
my $deny_file = File::Spec->rel2abs("$tmpdir/wrap2.deny");
|
||||
if (open(my $fh, "> $deny_file")) {
|
||||
print $fh "ALL: 1.1.1.1\n";
|
||||
|
||||
unless (close($fh)) {
|
||||
die("Can't write $deny_file: $!");
|
||||
}
|
||||
|
||||
} else {
|
||||
die("Can't open $deny_file: $!");
|
||||
}
|
||||
|
||||
my $config = {
|
||||
PidFile => $setup->{pid_file},
|
||||
ScoreboardFile => $setup->{scoreboard_file},
|
||||
SystemLog => $setup->{log_file},
|
||||
|
||||
AuthUserFile => $setup->{auth_user_file},
|
||||
AuthGroupFile => $setup->{auth_group_file},
|
||||
|
||||
IfModules => {
|
||||
'mod_delay.c' => {
|
||||
DelayEngine => 'off',
|
||||
},
|
||||
|
||||
'mod_proxy_protocol.c' => {
|
||||
ProxyProtocolEngine => 'on',
|
||||
},
|
||||
|
||||
'mod_wrap2.c' => {
|
||||
WrapEngine => 'on',
|
||||
WrapTables => "file:$allow_file file:$deny_file",
|
||||
WrapLog => $setup->{log_file},
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
my ($port, $config_user, $config_group) = config_write($setup->{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 {
|
||||
sleep(2);
|
||||
|
||||
my $client = ProFTPD::TestSuite::ProxiedFTP->new('127.0.0.1', $port);
|
||||
$client->send_proxy('1.1.1.1', '2.2.2.2', 111, 222);
|
||||
eval { $client->login($setup->{user}, $setup->{passwd}) };
|
||||
unless ($@) {
|
||||
die("Login succeeded unexpectedly");
|
||||
}
|
||||
};
|
||||
|
||||
if ($@) {
|
||||
$ex = $@;
|
||||
}
|
||||
|
||||
$wfh->print("done\n");
|
||||
$wfh->flush();
|
||||
|
||||
} else {
|
||||
eval { server_wait($setup->{config_file}, $rfh, 10) };
|
||||
if ($@) {
|
||||
warn($@);
|
||||
exit 1;
|
||||
}
|
||||
|
||||
exit 0;
|
||||
}
|
||||
|
||||
# Stop server
|
||||
server_stop($setup->{pid_file});
|
||||
|
||||
$self->assert_child_ok($pid);
|
||||
|
||||
test_cleanup($setup->{log_file}, $ex);
|
||||
}
|
||||
|
||||
1;
|
||||
11
t/modules/mod_proxy_protocol.t
Normal file
11
t/modules/mod_proxy_protocol.t
Normal file
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use lib qw(t/lib);
|
||||
use strict;
|
||||
|
||||
use Test::Unit::HarnessUnit;
|
||||
|
||||
$| = 1;
|
||||
|
||||
my $r = Test::Unit::HarnessUnit->new();
|
||||
$r->start("ProFTPD::Tests::Modules::mod_proxy_protocol");
|
||||
11
t/modules/mod_proxy_protocol/sftp.t
Normal file
11
t/modules/mod_proxy_protocol/sftp.t
Normal file
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use lib qw(t/lib);
|
||||
use strict;
|
||||
|
||||
use Test::Unit::HarnessUnit;
|
||||
|
||||
$| = 1;
|
||||
|
||||
my $r = Test::Unit::HarnessUnit->new();
|
||||
$r->start("ProFTPD::Tests::Modules::mod_proxy_protocol::sftp");
|
||||
11
t/modules/mod_proxy_protocol/tls.t
Normal file
11
t/modules/mod_proxy_protocol/tls.t
Normal file
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use lib qw(t/lib);
|
||||
use strict;
|
||||
|
||||
use Test::Unit::HarnessUnit;
|
||||
|
||||
$| = 1;
|
||||
|
||||
my $r = Test::Unit::HarnessUnit->new();
|
||||
$r->start("ProFTPD::Tests::Modules::mod_proxy_protocol::tls");
|
||||
11
t/modules/mod_proxy_protocol/wrap2.t
Normal file
11
t/modules/mod_proxy_protocol/wrap2.t
Normal file
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use lib qw(t/lib);
|
||||
use strict;
|
||||
|
||||
use Test::Unit::HarnessUnit;
|
||||
|
||||
$| = 1;
|
||||
|
||||
my $r = Test::Unit::HarnessUnit->new();
|
||||
$r->start("ProFTPD::Tests::Modules::mod_proxy_protocol::wrap2");
|
||||
Reference in New Issue
Block a user