proftpd-mod-proxy_protocol/t/lib/ProFTPD/Tests/Modules/mod_proxy_protocol/wrap2.pm

140 lines
2.9 KiB
C

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;