Mail-SpamAssassin
view release on metacpan or search on metacpan
spamd-apache2/lib/Mail/SpamAssassin/Spamd/Apache2/Config.pm view on Meta::CPAN
exists $add->{satimeout} ? $add->{satimeout}
: exists $base->{satimeout} ? $base->{satimeout}
: die 'should not happen';
bless $new, ref $base;
}
use APR::Const -compile => qw(:error SUCCESS);
use Apache2::ServerRec (); # $s->is_virtual
use Apache2::Log ();
use File::Temp (); # tempdir
use File::Path (); # rmpath
# PerlPostConfigHandler
sub post_config {
my ($conf_pool, $log_pool, $temp_pool, $serv) = @_;
my ($num_vhosts, $num_configured);
my $hackish_tmp_ref;
for (my $s = $serv; $s; $s = $s->next) {
die "\$num_vhosts>5000; loop?" if ++$num_vhosts > 1000;
my $srv_cfg = Apache2::Module::get_config(__PACKAGE__, $s) || '';
# hack: if default server is configured with SAEnabled On, and a vhost
# is not, the vhost inherits On value. I don't know how to prevent it
# other way... check $hackish_tmp_ref use later. --radek
$hackish_tmp_ref = $srv_cfg unless $s->is_virtual;
# is SA enabled for this vhost?
if (!$srv_cfg->{saenabled}
or $s->is_virtual && $srv_cfg eq $hackish_tmp_ref)
{
my $msg = 'SAEnabled off for ' . _vhost_id($s);
# it inherits handler too
$msg .= ' and on in default server; it probably won\'t work as'
. ' you intend it to -- either Apache or this code is broken'
if $hackish_tmp_ref->{saenabled} && $srv_cfg && !$srv_cfg->{saenabled};
$s->log_serror(Apache2::Log::LOG_MARK(),
Apache2::Const::LOG_DEBUG | Apache2::Const::LOG_STARTUP,
APR::Const::SUCCESS, $msg);
next;
}
# check options
if (ref $srv_cfg->{sa_users}
&& grep { $_ eq 'none' } @{ $srv_cfg->{sa_users} })
{
if (@{ $srv_cfg->{sa_users} } > 1) {
die "if you add 'none' to SAUsers, it's pointless to add anything else\n";
}
else {
delete $srv_cfg->{sa_users};
}
}
# create list of allowed networks
use APR::IpSubnet ();
for my $net (@{ $srv_cfg->{allowed_ips} }) {
my $ais = APR::IpSubnet->new($conf_pool, split m#/#, $net, 2)
or die "APR::IpSubnet->new($net) failed";
push @{ $srv_cfg->{allowed_networks} }, $ais;
}
my @cfg = (
'SetHandler modperl',
'PerlProcessConnectionHandler Mail::SpamAssassin::Spamd::Apache2',
'PerlPreConnectionHandler Mail::SpamAssassin::Spamd::Apache2::AclIP',
);
require Mail::SpamAssassin::Spamd::Apache2;
require Mail::SpamAssassin::Spamd::Apache2::AclIP;
if ($srv_cfg->{auth_ident}) {
require Mail::SpamAssassin::Spamd::Apache2::AclRFC1413;
push @cfg, 'PerlPreConnectionHandler '
. 'Mail::SpamAssassin::Spamd::Apache2::AclRFC1413';
}
$s->add_config(\@cfg);
if (!$Mail::SpamAssassin::Spamd::Apache2::spamtest) {
require Mail::SpamAssassin;
local $/ = $/; # Razor resets this
# Is there a way to toggle these settings in handler? See bug #4963.
# Problem: if other vhost defined eg. SALocal, it would be silently
# ignored, as this block executes only for the first SAEnabled seen.
# Workaround: forcing these settings to be unavailable in vhosts
# until the bug is resolved.
my $sa = Mail::SpamAssassin->new({
## dont_copy_prefs => $dontcopy,
## rules_filename => ($srv_cfg->{configpath} || 0),
## site_rules_filename => ($srv_cfg->{siteconfigpath} || 0),
debug => ($srv_cfg->{sa_debug} || 0),
## paranoid => ($srv_cfg->{paranoid} || 0),
## PREFIX => $PREFIX,
## DEF_RULES_DIR => $DEF_RULES_DIR,
## LOCAL_RULES_DIR => $LOCAL_RULES_DIR,
## LOCAL_STATE_DIR => $LOCAL_STATE_DIR,
($srv_cfg->{sa_args_to_new} ? %{ $srv_cfg->{sa_args_to_new} } : ()),
}) or die 'Mail::SpamAssassin->new() failed';
# initialize SA configuration
my $tmphome = File::Temp::tempdir()
or die "creating temp directory failed: $!";
my $tmpsadir = File::Spec->catdir($tmphome, '.spamassassin');
mkdir $tmpsadir, 0700 or die "spamd: cannot create $tmpsadir: $!";
$ENV{HOME} = $tmphome;
$sa->compile_now(0, 1);
delete $ENV{HOME};
system("rm -rf '$tmphome'");
$Mail::SpamAssassin::Spamd::Apache2::spamtest = $sa;
Mail::SpamAssassin::Spamd::backup_config($sa);
}
$num_configured++;
$s->log_serror(Apache2::Log::LOG_MARK(),
Apache2::Const::LOG_DEBUG | Apache2::Const::LOG_STARTUP,
APR::Const::SUCCESS,
( run in 0.747 second using v1.01-cache-2.11-cpan-5511b514fd6 )