r483@dog: rspier | 2005-07-06 21:17:00 -0700
The great plugin renaming in the name of inheritance and standardization commit. 1. new concept of standard hook_ names. 2. Plugin::init 3. renamed many subroutines in plugins (and cleaned up register subs) 4. updated README.plugins git-svn-id: https://svn.perl.org/qpsmtpd/trunk@479 958fd67b-6ff1-0310-b445-bb7760255be9
This commit is contained in:
parent
254b4fd2b2
commit
90daeb3786
@ -270,3 +270,82 @@ ended.
|
||||
Returns the configured system-wide spool directory.
|
||||
|
||||
=back
|
||||
|
||||
=head1 Naming Conventions
|
||||
|
||||
Plugins should be written using standard named hook subroutines. This
|
||||
allows them to be overloaded and extended easily.
|
||||
|
||||
Because some of our callback names have characters invalid in
|
||||
subroutine names, they must be translated. The current translation
|
||||
routine is: C< s/\W/_/g; >
|
||||
|
||||
=head2 Naming Map
|
||||
|
||||
hook method
|
||||
---------- ------------
|
||||
config hook_config
|
||||
queue hook_queue
|
||||
data hook_data
|
||||
data_post hook_data_post
|
||||
quit hook_quit
|
||||
rcpt hook_rcpt
|
||||
mail hook_mail
|
||||
ehlo hook_ehlo
|
||||
helo hook_helo
|
||||
auth hook_auth
|
||||
auth-plain hook_auth_plain
|
||||
auth-login hook_auth_login
|
||||
auth-cram-md5 hook_auth_cram_md5
|
||||
connect hook_connect
|
||||
reset_transaction hook_reset_transaction
|
||||
unrecognized_command hook_unrecognized_command
|
||||
|
||||
=head1 Register
|
||||
|
||||
If you choose not to use the default naming convention, you need to
|
||||
register the hooks in your plugin. You do this with the C< register >
|
||||
method call on the plugin object.
|
||||
|
||||
sub register {
|
||||
my ($self, $qp) = @_;
|
||||
|
||||
$self->register_hook('mail', 'mail_handler');
|
||||
$self->register_hook('rcpt', 'rcpt_handler');
|
||||
$self->register_hook('disconnect', 'disconnect_handler');
|
||||
}
|
||||
|
||||
sub mail_handler { ... }
|
||||
sub rcpt_handler { ... }
|
||||
sub disconnect_handler { ... }
|
||||
|
||||
A single plugin can register as many hooks as it wants, and can
|
||||
register a hook multiple times.
|
||||
|
||||
The C< register > method is also often used for initialization and
|
||||
reading configuration.
|
||||
|
||||
=head1 Init
|
||||
|
||||
The 'init' method is the first method called after a plugin is
|
||||
loaded. It's mostly for inheritance, below.
|
||||
|
||||
=head1 Inheritance
|
||||
|
||||
Instead of modifying @ISA directly in your plugin, use the
|
||||
C< plugin_isa > method from the init subroutine.
|
||||
|
||||
# rcpt_ok_child
|
||||
sub init {
|
||||
my ($self, $qp) = @_;
|
||||
$self->isa_plugin('rcpt_ok');
|
||||
}
|
||||
|
||||
sub hook_rcpt {
|
||||
my ($self, $transaction, $recipient) = @_;
|
||||
# do something special here...
|
||||
$self->SUPER::hook_rcpt( $transaction, $recipient );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
package Qpsmtpd::Plugin;
|
||||
use Qpsmtpd::Constants;
|
||||
use strict;
|
||||
|
||||
our %hooks = map { $_ => 1 } qw(
|
||||
@ -16,9 +17,11 @@ sub new {
|
||||
|
||||
sub register_hook {
|
||||
my ($plugin, $hook, $method, $unshift) = @_;
|
||||
|
||||
|
||||
die $plugin->plugin_name . " : Invalid hook: $hook" unless $hooks{$hook};
|
||||
|
||||
$plugin->{_qp}->varlog(LOGDEBUG, $plugin->plugin_name, " hooking ", $hook);
|
||||
|
||||
# I can't quite decide if it's better to parse this code ref or if
|
||||
# we should pass the plugin object and method name ... hmn.
|
||||
$plugin->qp->_register_hook($hook, { code => sub { local $plugin->{_qp} = shift; local $plugin->{_hook} = $hook; $plugin->$method(@_) },
|
||||
@ -32,7 +35,9 @@ sub _register {
|
||||
my $self = shift;
|
||||
my $qp = shift;
|
||||
local $self->{_qp} = $qp;
|
||||
$self->register($qp, @_);
|
||||
$self->init($qp, @_) if $self->can('init');
|
||||
$self->_register_standard_hooks($qp, @_);
|
||||
$self->register($qp, @_) if $self->can('register');
|
||||
}
|
||||
|
||||
sub qp {
|
||||
@ -74,7 +79,7 @@ sub temp_dir {
|
||||
|
||||
# plugin inheritance:
|
||||
# usage:
|
||||
# sub register {
|
||||
# sub init {
|
||||
# my $self = shift;
|
||||
# $self->isa_plugin("rhsbl");
|
||||
# $self->SUPER::register(@_);
|
||||
@ -82,18 +87,23 @@ sub temp_dir {
|
||||
sub isa_plugin {
|
||||
my ($self, $parent) = @_;
|
||||
my ($currentPackage) = caller;
|
||||
my $newPackage = $currentPackage."::_isa_";
|
||||
|
||||
my $cleanParent = $parent;
|
||||
$cleanParent =~ s/\W/_/g;
|
||||
my $newPackage = $currentPackage."::_isa_$cleanParent";
|
||||
|
||||
|
||||
return if defined &{"${newPackage}::register"};
|
||||
|
||||
Qpsmtpd::_compile($self->plugin_name . "_isa",
|
||||
$self->compile($self->plugin_name . "_isa_$cleanParent",
|
||||
$newPackage,
|
||||
"plugins/$parent"); # assumes Cwd is qpsmtpd root
|
||||
|
||||
warn "---- $newPackage\n";
|
||||
no strict 'refs';
|
||||
push @{"${currentPackage}::ISA"}, $newPackage;
|
||||
}
|
||||
|
||||
# why isn't compile private? it's only called from Plugin and Qpsmtpd.
|
||||
sub compile {
|
||||
my ($class, $plugin, $package, $file, $test_mode) = @_;
|
||||
|
||||
@ -141,4 +151,16 @@ sub compile {
|
||||
die "eval $@" if $@;
|
||||
}
|
||||
|
||||
sub _register_standard_hooks {
|
||||
my ($plugin, $qp) = @_;
|
||||
|
||||
for my $hook (keys %hooks) {
|
||||
my $hooksub = "hook_$hook";
|
||||
$hooksub =~ s/\W/_/g;
|
||||
$plugin->register_hook( $hook, $hooksub )
|
||||
if ($plugin->can($hooksub));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
|
@ -5,12 +5,7 @@
|
||||
# the Qpsmtpd::Auth module. Don't run this in production!!!
|
||||
#
|
||||
|
||||
sub register {
|
||||
my ( $self, $qp ) = @_;
|
||||
$self->register_hook( "auth", "authdeny" );
|
||||
}
|
||||
|
||||
sub authdeny {
|
||||
sub hook_auth {
|
||||
my ( $self, $transaction, $method, $user, $passClear, $passHash, $ticket ) =
|
||||
@_;
|
||||
|
||||
|
@ -5,17 +5,7 @@
|
||||
# the Qpsmtpd::Auth module. Don't run this in production!!!
|
||||
#
|
||||
|
||||
sub register {
|
||||
my ( $self, $qp ) = @_;
|
||||
|
||||
# $self->register_hook("auth-plain", "authnull");
|
||||
# $self->register_hook("auth-login", "authnull");
|
||||
# $self->register_hook("auth-cram-md5", "authnull");
|
||||
|
||||
$self->register_hook( "auth", "authnull" );
|
||||
}
|
||||
|
||||
sub authnull {
|
||||
sub hook_auth {
|
||||
my ( $self, $transaction, $method, $user, $passClear, $passHash, $ticket ) =
|
||||
@_;
|
||||
|
||||
|
@ -20,13 +20,7 @@ stage, so store it until later.
|
||||
|
||||
=cut
|
||||
|
||||
sub register {
|
||||
my ($self, $qp) = @_;
|
||||
$self->register_hook("mail", "mail_handler");
|
||||
$self->register_hook("rcpt", "rcpt_handler");
|
||||
}
|
||||
|
||||
sub mail_handler {
|
||||
sub hook_mail {
|
||||
my ($self, $transaction, $sender) = @_;
|
||||
|
||||
my @badmailfrom = $self->qp->config("badmailfrom")
|
||||
@ -49,7 +43,7 @@ sub mail_handler {
|
||||
return (DECLINED);
|
||||
}
|
||||
|
||||
sub rcpt_handler {
|
||||
sub hook_rcpt {
|
||||
my ($self, $transaction, $rcpt) = @_;
|
||||
my $note = $transaction->notes('badmailfrom');
|
||||
if ($note) {
|
||||
|
@ -16,13 +16,7 @@ Based heavily on check_badmailfrom.
|
||||
|
||||
=cut
|
||||
|
||||
sub register {
|
||||
my ($self, $qp) = @_;
|
||||
$self->register_hook("mail", "mail_handler");
|
||||
$self->register_hook("rcpt", "rcpt_handler");
|
||||
}
|
||||
|
||||
sub mail_handler {
|
||||
sub hook_mail {
|
||||
my ($self, $transaction, $sender) = @_;
|
||||
|
||||
my @badmailfromto = $self->qp->config("badmailfromto")
|
||||
@ -46,7 +40,7 @@ sub mail_handler {
|
||||
return (DECLINED);
|
||||
}
|
||||
|
||||
sub rcpt_handler {
|
||||
sub hook_rcpt {
|
||||
my ($self, $transaction, $rcpt) = @_;
|
||||
my $recipient = lc($rcpt->user) . '@' . lc($rcpt->host);
|
||||
my $sender = $transaction->notes('badmailfromto');
|
||||
|
@ -1,11 +1,6 @@
|
||||
# this plugin checks the badrcptto config (like badmailfrom for rcpt address)
|
||||
|
||||
sub register {
|
||||
my ($self, $qp) = @_;
|
||||
$self->register_hook("rcpt", "check_for_badrcptto");
|
||||
}
|
||||
|
||||
sub check_for_badrcptto {
|
||||
sub hook_rcpt {
|
||||
my ($self, $transaction, $recipient) = @_;
|
||||
my @badrcptto = $self->qp->config("badrcptto") or return (DECLINED);
|
||||
return (DECLINED) unless $recipient->host && $recipient->user;
|
||||
|
@ -26,13 +26,7 @@ terms as Perl itself.
|
||||
|
||||
=cut
|
||||
|
||||
sub register
|
||||
{
|
||||
my ($self, $qp) = @_;
|
||||
$self->register_hook("rcpt", "check_for_badrcptto_patterns");
|
||||
}
|
||||
|
||||
sub check_for_badrcptto_patterns
|
||||
sub hook_rcpt
|
||||
{
|
||||
my ($self, $transaction, $recipient) = @_;
|
||||
|
||||
|
@ -33,7 +33,6 @@ use Date::Parse qw(str2time);
|
||||
|
||||
sub register {
|
||||
my ($self, $qp, @args) = @_;
|
||||
$self->register_hook("data_post", "check_basic_headers");
|
||||
|
||||
if (@args > 0) {
|
||||
$self->{_days} = $args[0];
|
||||
@ -41,7 +40,7 @@ sub register {
|
||||
}
|
||||
}
|
||||
|
||||
sub check_basic_headers {
|
||||
sub hook_data_post {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
return (DENY, "You have to send some data first")
|
||||
|
@ -28,7 +28,6 @@ Released to the public domain, 17 June 2005.
|
||||
|
||||
sub register {
|
||||
my ($self, $qp, @args) = @_;
|
||||
$self->register_hook("data_post", "check_loop");
|
||||
|
||||
$self->{_max_hops} = $args[0] || 100;
|
||||
|
||||
@ -38,7 +37,7 @@ sub register {
|
||||
$self->log(LOGWARN, "Ignoring additional arguments") if @args > 1;
|
||||
}
|
||||
|
||||
sub check_loop {
|
||||
sub hook_data_post {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
my $hops = 0;
|
||||
|
@ -34,12 +34,7 @@ terms as Perl itself.
|
||||
|
||||
=cut
|
||||
|
||||
sub register {
|
||||
my ($self, $qp) = @_;
|
||||
$self->register_hook("connect", "check_norelay");
|
||||
}
|
||||
|
||||
sub check_norelay {
|
||||
sub hook_connect {
|
||||
my ($self, $transaction) = @_;
|
||||
my $connection = $self->qp->connection;
|
||||
|
||||
|
@ -2,12 +2,7 @@
|
||||
# $ENV{RELAYCLIENT} to see if relaying is allowed.
|
||||
#
|
||||
|
||||
sub register {
|
||||
my ($self, $qp) = @_;
|
||||
$self->register_hook("connect", "check_relay");
|
||||
}
|
||||
|
||||
sub check_relay {
|
||||
sub hook_connect {
|
||||
my ($self, $transaction) = @_;
|
||||
my $connection = $self->qp->connection;
|
||||
|
||||
|
@ -16,13 +16,7 @@ per line.
|
||||
|
||||
=cut
|
||||
|
||||
sub register {
|
||||
my ($self, $qp) = @_;
|
||||
$self->register_hook("helo", "check_helo");
|
||||
$self->register_hook("ehlo", "check_helo");
|
||||
}
|
||||
|
||||
sub check_helo {
|
||||
sub hook_helo {
|
||||
my ($self, $transaction, $host) = @_;
|
||||
($host = lc $host) or return DECLINED;
|
||||
|
||||
@ -35,3 +29,5 @@ sub check_helo {
|
||||
return DECLINED;
|
||||
}
|
||||
|
||||
# also support EHLO
|
||||
*hook_ehlo = \&hook_helo;
|
||||
|
@ -6,12 +6,7 @@
|
||||
|
||||
use POSIX qw:strftime:;
|
||||
|
||||
sub register {
|
||||
my ($self, $qp) = @_;
|
||||
$self->register_hook("data_post", "mail_handler");
|
||||
}
|
||||
|
||||
sub mail_handler {
|
||||
sub hook_data_post {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
# as a decent default, log on a per-day-basis
|
||||
|
@ -17,7 +17,6 @@ before we disconnect the client. Defaults to 4.
|
||||
|
||||
sub register {
|
||||
my ($self, $qp, @args) = @_;
|
||||
$self->register_hook("unrecognized_command", "check_unrec_cmd");
|
||||
|
||||
if (@args > 0) {
|
||||
$self->{_unrec_cmd_max} = $args[0];
|
||||
@ -30,7 +29,7 @@ sub register {
|
||||
|
||||
}
|
||||
|
||||
sub check_unrec_cmd {
|
||||
sub hook_unrecognized_command {
|
||||
my ($self, $cmd) = @_[0,2];
|
||||
|
||||
$self->log(LOGINFO, "Unrecognized command '$cmd'");
|
||||
|
@ -41,14 +41,7 @@ based on the 'whitelist' plugin by Devin Carraway <qpsmtpd@devin.com>.
|
||||
|
||||
=cut
|
||||
|
||||
sub register {
|
||||
my ($self, $qp) = @_;
|
||||
|
||||
$self->register_hook("connect", "connect_handler");
|
||||
$self->register_hook("rcpt", "rcpt_handler");
|
||||
}
|
||||
|
||||
sub connect_handler {
|
||||
sub hook_connect {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
my $remote_ip = $self->qp->connection->remote_ip;
|
||||
@ -145,7 +138,7 @@ sub process_sockets {
|
||||
|
||||
}
|
||||
|
||||
sub rcpt_handler {
|
||||
sub hook_rcpt {
|
||||
my ($self, $transaction, $rcpt) = @_;
|
||||
my $ip = $self->qp->connection->remote_ip || return (DECLINED);
|
||||
my $note = $self->process_sockets;
|
||||
@ -155,13 +148,4 @@ sub rcpt_handler {
|
||||
return DECLINED;
|
||||
}
|
||||
|
||||
sub disconnect_handler {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
$self->qp->connection->notes('whitelist_sockets', undef);
|
||||
|
||||
return DECLINED;
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
|
@ -8,13 +8,10 @@ sub register {
|
||||
else {
|
||||
$self->{_dnsbl}->{DENY} = DENY;
|
||||
}
|
||||
|
||||
$self->register_hook("connect", "connect_handler");
|
||||
$self->register_hook("rcpt", "rcpt_handler");
|
||||
$self->register_hook("disconnect", "disconnect_handler");
|
||||
|
||||
}
|
||||
|
||||
sub connect_handler {
|
||||
sub hook_connect {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
my $remote_ip = $self->qp->connection->remote_ip;
|
||||
@ -151,7 +148,7 @@ sub process_sockets {
|
||||
|
||||
}
|
||||
|
||||
sub rcpt_handler {
|
||||
sub hook_rcpt {
|
||||
my ($self, $transaction, $rcpt) = @_;
|
||||
my $connection = $self->qp->connection;
|
||||
|
||||
@ -184,7 +181,7 @@ sub rcpt_handler {
|
||||
|
||||
}
|
||||
|
||||
sub disconnect_handler {
|
||||
sub hook_disconnect {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
$self->qp->connection->notes('dnsbl_sockets', undef);
|
||||
|
@ -137,7 +137,6 @@ sub register {
|
||||
} else {
|
||||
$self->register_hook("rcpt", "rcpt_handler");
|
||||
}
|
||||
$self->register_hook("data_post", "data_handler");
|
||||
}
|
||||
|
||||
sub mail_handler {
|
||||
@ -167,7 +166,7 @@ sub rcpt_handler {
|
||||
return DECLINED;
|
||||
}
|
||||
|
||||
sub data_handler {
|
||||
sub hook_data {
|
||||
my ($self, $transaction) = @_;
|
||||
my $note = $transaction->notes('denysoft_greylist');
|
||||
return DECLINED unless $note;
|
||||
|
@ -31,10 +31,9 @@ my @urls;
|
||||
sub register {
|
||||
my ($self, $qp, @args) = @_;
|
||||
@urls = @args;
|
||||
$self->register_hook("config", "http_config");
|
||||
}
|
||||
|
||||
sub http_config {
|
||||
sub hook_config {
|
||||
my ($self, $transaction, $config) = @_;
|
||||
$self->log(LOGNOTICE, "http_config called with $config");
|
||||
for my $url (@urls) {
|
||||
|
@ -17,13 +17,7 @@ use Geo::IP;
|
||||
|
||||
my $geoip = Geo::IP->new(GEOIP_STANDARD);
|
||||
|
||||
|
||||
sub register {
|
||||
my ($self, $qp) = @_;
|
||||
$self->register_hook("connect", "lookup_geoip");
|
||||
}
|
||||
|
||||
sub lookup_geoip {
|
||||
sub hook_connect {
|
||||
my ($self) = @_;
|
||||
|
||||
my $country =
|
||||
|
@ -23,13 +23,12 @@ use Net::IP;
|
||||
|
||||
sub register {
|
||||
my ($self, $qp, $p0f_socket) = @_;
|
||||
$self->register_hook("connect", "lookup_p0f");
|
||||
|
||||
$p0f_socket =~ /(.*)/; # untaint
|
||||
$self->{_args}->{p0f_socket} = $1;
|
||||
}
|
||||
|
||||
sub lookup_p0f {
|
||||
sub hook_connect {
|
||||
my($self, $qp) = @_;
|
||||
|
||||
eval {
|
||||
|
@ -30,16 +30,12 @@ sub register {
|
||||
$self->{_prefix} = $1;
|
||||
}
|
||||
|
||||
$self->register_hook( 'logging', 'wlog' );
|
||||
$self->register_hook( 'deny', 'dlog' );
|
||||
$self->register_hook( 'reset_transaction', 'slog' );
|
||||
|
||||
# If you want to capture this log entry with this plugin, you need to
|
||||
# wait until after you register the plugin
|
||||
$self->log( LOGINFO, 'Initializing logging::adaptive plugin' );
|
||||
}
|
||||
|
||||
sub wlog {
|
||||
sub hook_logging { # wlog
|
||||
my ( $self, $transaction, $trace, $hook, $plugin, @log ) = @_;
|
||||
|
||||
# Don't log your own log entries! If this is the only logging plugin
|
||||
@ -66,12 +62,12 @@ sub wlog {
|
||||
return DECLINED;
|
||||
}
|
||||
|
||||
sub dlog {
|
||||
sub hook_deny { # dlog
|
||||
my ( $self, $transaction, $prev_hook, $return, $return_text ) = @_;
|
||||
$self->{_denied} = 1;
|
||||
}
|
||||
|
||||
sub slog {
|
||||
sub hook_reset_transaction { # slog
|
||||
|
||||
# fires when a message is accepted
|
||||
my ( $self, $transaction, @args ) = @_;
|
||||
|
@ -1,13 +1,7 @@
|
||||
#!/usr/bin/perl
|
||||
# this is a simple 'drop packets on the floor' plugin
|
||||
|
||||
sub register {
|
||||
my $self = shift;
|
||||
|
||||
$self->register_hook('logging', 'wlog');
|
||||
}
|
||||
|
||||
sub wlog {
|
||||
sub hook_logging {
|
||||
return DECLINED;
|
||||
}
|
||||
|
||||
|
@ -16,14 +16,13 @@ sub register {
|
||||
$self->{_level} = log_level($loglevel);
|
||||
}
|
||||
}
|
||||
$self->register_hook('logging', 'wlog');
|
||||
|
||||
# If you want to capture this log entry with this plugin, you need to
|
||||
# wait until after you register the plugin
|
||||
$self->log(LOGINFO,'Initializing logging::warn plugin');
|
||||
}
|
||||
|
||||
sub wlog {
|
||||
sub hook_logging {
|
||||
my ($self, $transaction, $trace, $hook, $plugin, @log) = @_;
|
||||
|
||||
# Don't log your own log entries! If this is the only logging plugin
|
||||
|
@ -42,15 +42,9 @@ sub register {
|
||||
$self->{host} = $host;
|
||||
$self->{port} = $port;
|
||||
|
||||
$self->register_hook("connect", "connect_handler");
|
||||
$self->register_hook("helo", "helo_handler");
|
||||
$self->register_hook("mail", "mail_handler");
|
||||
$self->register_hook("rcpt", "rcpt_handler");
|
||||
$self->register_hook("data_post", "data_handler");
|
||||
$self->register_hook("disconnect", "disconnect_handler");
|
||||
}
|
||||
|
||||
sub disconnect_handler {
|
||||
sub hook_disconnect {
|
||||
my ($self) = @_;
|
||||
|
||||
my $milter = $self->qp->connection->notes('milter') || return DECLINED;
|
||||
@ -93,7 +87,7 @@ sub check_results {
|
||||
}
|
||||
}
|
||||
|
||||
sub connect_handler {
|
||||
sub hook_connect {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
$self->log(LOGDEBUG, "milter $self->{name} opening connection to milter backend");
|
||||
@ -119,7 +113,7 @@ sub connect_handler {
|
||||
return DECLINED;
|
||||
}
|
||||
|
||||
sub helo_handler {
|
||||
sub hook_helo {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
if (my $txt = $self->qp->connection->notes('spam')) {
|
||||
@ -140,7 +134,7 @@ sub helo_handler {
|
||||
return DECLINED;
|
||||
}
|
||||
|
||||
sub mail_handler {
|
||||
sub hook_mail {
|
||||
my ($self, $transaction, $address) = @_;
|
||||
|
||||
my $milter = $self->qp->connection->notes('milter');
|
||||
@ -153,7 +147,7 @@ sub mail_handler {
|
||||
return DECLINED;
|
||||
}
|
||||
|
||||
sub rcpt_handler {
|
||||
sub hook_rcpt {
|
||||
my ($self, $transaction, $address) = @_;
|
||||
|
||||
my $milter = $self->qp->connection->notes('milter');
|
||||
@ -167,7 +161,7 @@ sub rcpt_handler {
|
||||
return DECLINED;
|
||||
}
|
||||
|
||||
sub data_handler {
|
||||
sub hook_data {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
my $milter = $self->qp->connection->notes('milter');
|
||||
|
@ -35,13 +35,11 @@ sub register {
|
||||
my $hostname = (hostname =~ m/([\w\._\-]+)/)[0];
|
||||
$self->{_hostname} = $hostname;
|
||||
|
||||
$self->register_hook("queue", "queue_handler");
|
||||
|
||||
}
|
||||
|
||||
my $maildir_counter = 0;
|
||||
|
||||
sub queue_handler {
|
||||
sub hook_queue {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
my ($time, $microseconds) = gettimeofday;
|
||||
|
@ -18,7 +18,6 @@ use Qpsmtpd::Postfix;
|
||||
|
||||
sub register {
|
||||
my ($self, $qp, @args) = @_;
|
||||
$self->register_hook("queue", "queue_handler");
|
||||
|
||||
if (@args > 0) {
|
||||
$self->{_queue_socket} = $args[0];
|
||||
@ -31,7 +30,7 @@ sub register {
|
||||
|
||||
}
|
||||
|
||||
sub queue_handler {
|
||||
sub hook_queue {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
my ($status, $qid, $reason) = Qpsmtpd::Postfix->inject_mail($transaction);
|
||||
|
@ -23,7 +23,6 @@ use POSIX ();
|
||||
|
||||
sub register {
|
||||
my ($self, $qp, @args) = @_;
|
||||
$self->register_hook("queue", "queue_handler");
|
||||
|
||||
if (@args > 0) {
|
||||
$self->{_queue_exec} = $args[0];
|
||||
@ -36,7 +35,7 @@ sub register {
|
||||
$self->{_queue_exec} = $ENV{QMAILQUEUE} if $ENV{QMAILQUEUE};
|
||||
}
|
||||
|
||||
sub queue_handler {
|
||||
sub hook_queue {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
# these bits inspired by Peter Samuels "qmail-queue wrapper"
|
||||
|
@ -23,7 +23,6 @@ use Net::SMTP;
|
||||
|
||||
sub register {
|
||||
my ($self, $qp, @args) = @_;
|
||||
$self->register_hook("queue", "queue_handler");
|
||||
|
||||
if (@args > 0) {
|
||||
if ($args[0] =~ /^([\.\w_-]+)$/) {
|
||||
@ -43,7 +42,7 @@ sub register {
|
||||
|
||||
}
|
||||
|
||||
sub queue_handler {
|
||||
sub hook_queue {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
$self->log(LOGINFO, "forwarding to $self->{_smtp_server}:$self->{_smtp_port}");
|
||||
|
@ -1,9 +1,5 @@
|
||||
|
||||
sub register {
|
||||
shift->register_hook("quit", "quit_handler");
|
||||
}
|
||||
|
||||
sub quit_handler {
|
||||
sub hook_quit {
|
||||
my $qp = shift->qp;
|
||||
|
||||
# if she talks EHLO she is probably too sophisticated to enjoy the
|
||||
|
@ -3,12 +3,7 @@
|
||||
# It should be configured to be run _LAST_!
|
||||
#
|
||||
|
||||
sub register {
|
||||
my ($self, $qp) = @_;
|
||||
$self->register_hook("rcpt", "rcpt_ok");
|
||||
}
|
||||
|
||||
sub rcpt_ok {
|
||||
sub hook_rcpt {
|
||||
my ($self, $transaction, $recipient) = @_;
|
||||
my $host = lc $recipient->host;
|
||||
|
||||
|
@ -1,11 +1,6 @@
|
||||
use Net::DNS qw(mx);
|
||||
|
||||
sub register {
|
||||
my ($self, $qp) = @_;
|
||||
$self->register_hook("mail", "mail_handler");
|
||||
}
|
||||
|
||||
sub mail_handler {
|
||||
sub hook_mail {
|
||||
my ($self, $transaction, $sender) = @_;
|
||||
|
||||
return DECLINED
|
||||
|
@ -1,12 +1,5 @@
|
||||
sub register {
|
||||
my ($self, $qp) = @_;
|
||||
|
||||
$self->register_hook('mail', 'mail_handler');
|
||||
$self->register_hook('rcpt', 'rcpt_handler');
|
||||
$self->register_hook('disconnect', 'disconnect_handler');
|
||||
}
|
||||
|
||||
sub mail_handler {
|
||||
sub hook_mail {
|
||||
my ($self, $transaction, $sender) = @_;
|
||||
|
||||
my $res = new Net::DNS::Resolver;
|
||||
@ -40,7 +33,7 @@ sub mail_handler {
|
||||
return DECLINED;
|
||||
}
|
||||
|
||||
sub rcpt_handler {
|
||||
sub hook_rcpt {
|
||||
my ($self, $transaction, $rcpt) = @_;
|
||||
my $host = $transaction->sender->host;
|
||||
my $hello = $self->qp->connection->hello_host;
|
||||
@ -111,7 +104,7 @@ sub process_sockets {
|
||||
return $trans->notes('rhsbl', $result);
|
||||
}
|
||||
|
||||
sub disconnect_handler {
|
||||
sub hook_disconnect {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
$transaction->notes('rhsbl_sockets', undef);
|
||||
|
@ -31,12 +31,9 @@ use Mail::SPF::Query 1.991;
|
||||
sub register {
|
||||
my ($self, $qp, @args) = @_;
|
||||
%{$self->{_args}} = @args;
|
||||
$self->register_hook("mail", "mail_handler");
|
||||
$self->register_hook("rcpt", "rcpt_handler");
|
||||
$self->register_hook("data_post", "data_handler");
|
||||
}
|
||||
|
||||
sub mail_handler {
|
||||
sub hook_mail {
|
||||
my ($self, $transaction, $sender) = @_;
|
||||
|
||||
return (DECLINED) unless ($sender->format ne "<>"
|
||||
@ -73,7 +70,7 @@ sub mail_handler {
|
||||
return (DECLINED);
|
||||
}
|
||||
|
||||
sub rcpt_handler {
|
||||
sub hook_rcpt {
|
||||
my ($self, $transaction, $rcpt) = @_;
|
||||
|
||||
# special addresses don't get SPF-tested.
|
||||
@ -109,7 +106,7 @@ sub _uri_escape {
|
||||
return $str;
|
||||
}
|
||||
|
||||
sub data_handler {
|
||||
sub hook_data {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
my $query = $transaction->notes('spfquery');
|
||||
|
@ -76,7 +76,6 @@ use IO::Handle;
|
||||
|
||||
sub register {
|
||||
my ($self, $qp, @args) = @_;
|
||||
$self->register_hook("data_post", "check_spam");
|
||||
|
||||
$self->log(LOGERROR, "Bad parameters for the spamassassin plugin")
|
||||
if @_ % 2;
|
||||
@ -91,7 +90,7 @@ sub register {
|
||||
|
||||
}
|
||||
|
||||
sub check_spam {
|
||||
sub hook_data_post { # check_spam
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
$self->log(LOGDEBUG, "check_spam");
|
||||
|
@ -96,9 +96,6 @@ use Mail::Address;
|
||||
sub register {
|
||||
my ($self, $qp, @args) = @_;
|
||||
|
||||
# where to be called
|
||||
$self->register_hook("data_post", "avscan");
|
||||
|
||||
# defaults to be used
|
||||
$self->{_avclient_bin} = "/opt/kav/bin/aveclient";
|
||||
$self->{_avdaemon_sock} = "/var/run/aveserver";
|
||||
@ -122,7 +119,7 @@ sub register {
|
||||
}
|
||||
}
|
||||
|
||||
sub avscan {
|
||||
sub hook_data_post {
|
||||
my ($self, $transaction) = @_;
|
||||
my ($temp_fh, $filename) = tempfile();
|
||||
my $description = 'clean';
|
||||
|
@ -67,7 +67,6 @@ use warnings;
|
||||
|
||||
sub register {
|
||||
my ( $self, $qp, @args ) = @_;
|
||||
$self->register_hook( "data_post", "bdc_scan" );
|
||||
|
||||
while (@args) {
|
||||
$self->{"_bitd"}->{ pop @args } = pop @args;
|
||||
@ -78,7 +77,7 @@ sub register {
|
||||
$self->{"_bitd"}->{"max_size"} *= 1024;
|
||||
}
|
||||
|
||||
sub bdc_scan {
|
||||
sub hook_data_post {
|
||||
my ( $self, $transaction ) = @_;
|
||||
|
||||
if ( $transaction->body_size > $self->{"_bitd"}->{"max_size"} ) {
|
||||
|
@ -1,11 +1,6 @@
|
||||
#!/usr/bin/perl -w
|
||||
|
||||
sub register {
|
||||
my $self = shift;
|
||||
$self->register_hook('data_post', 'check_for_hi_virus');
|
||||
}
|
||||
|
||||
sub check_for_hi_virus {
|
||||
sub hook_data_post {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
# make sure we read from the beginning;
|
||||
|
@ -148,11 +148,9 @@ sub register {
|
||||
return undef;
|
||||
}
|
||||
|
||||
$self->register_hook("data_post", "clam_scan");
|
||||
1;
|
||||
}
|
||||
|
||||
sub clam_scan {
|
||||
sub hook_data_post {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
if ($transaction->body_size > $self->{_max_size}) {
|
||||
|
@ -94,7 +94,6 @@ use Clamd;
|
||||
|
||||
sub register {
|
||||
my ( $self, $qp, @args ) = @_;
|
||||
$self->register_hook( "data_post", "clamdscan" );
|
||||
|
||||
%{ $self->{"_clamd"} } = @args;
|
||||
|
||||
@ -104,7 +103,7 @@ sub register {
|
||||
$self->{"_clamd"}->{"max_size"} ||= 128;
|
||||
}
|
||||
|
||||
sub clamdscan {
|
||||
sub hook_data_post {
|
||||
my ( $self, $transaction ) = @_;
|
||||
$DB::single = 1;
|
||||
|
||||
|
@ -53,7 +53,6 @@ The B<hbedv> plugin is published under the same licence as qpsmtpd itself.
|
||||
|
||||
sub register {
|
||||
my ($self, $qp, @args) = @_;
|
||||
$self->register_hook("data_post", "hbedv_scan");
|
||||
|
||||
if (@args % 2) {
|
||||
$self->log(LOGERROR, "FATAL ERROR: odd number of arguments");
|
||||
@ -72,7 +71,7 @@ sub register {
|
||||
}
|
||||
}
|
||||
|
||||
sub hbedv_scan {
|
||||
sub hook_data_post {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
my $filename = $transaction->body_filename;
|
||||
|
@ -57,7 +57,6 @@ use Mail::Address;
|
||||
|
||||
sub register {
|
||||
my ($self, $qp, @args) = @_;
|
||||
$self->register_hook("data_post", "kav_scan");
|
||||
|
||||
if (@args % 2) {
|
||||
$self->log(LOGWARN, "kavscanner: Wrong number of arguments");
|
||||
@ -80,7 +79,7 @@ sub register {
|
||||
}
|
||||
}
|
||||
|
||||
sub kav_scan {
|
||||
sub hook_data_post {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
my ($temp_fh, $filename) = tempfile();
|
||||
|
@ -1,9 +1,5 @@
|
||||
sub register {
|
||||
my ($self, $qp) = @_;
|
||||
$self->register_hook("data_post", "check_klez");
|
||||
}
|
||||
|
||||
sub check_klez {
|
||||
sub hook_data_post {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
# klez files are always sorta big .. how big? Dunno.
|
||||
|
@ -3,7 +3,6 @@ use IO::Socket;
|
||||
|
||||
sub register {
|
||||
my ( $self, $qp, @args ) = @_;
|
||||
$self->register_hook( "data_post", "sophiescan" );
|
||||
|
||||
%{ $self->{"_sophie"} } = @args;
|
||||
|
||||
@ -13,7 +12,7 @@ sub register {
|
||||
$self->{"_sophie"}->{"max_size"} ||= 128;
|
||||
}
|
||||
|
||||
sub sophiescan {
|
||||
sub hook_data_post {
|
||||
my ( $self, $transaction ) = @_;
|
||||
$DB::single = 1;
|
||||
|
||||
|
@ -44,7 +44,6 @@ Please see the LICENSE file included with qpsmtpd for details.
|
||||
|
||||
sub register {
|
||||
my ($self, $qp, @args) = @_;
|
||||
$self->register_hook("data_post", "uvscan");
|
||||
|
||||
while (@args) {
|
||||
$self->{"_uvscan"}->{pop @args}=pop @args;
|
||||
@ -52,7 +51,7 @@ sub register {
|
||||
$self->{"_uvscan"}->{"uvscan_location"}||="/usr/local/bin/uvscan";
|
||||
}
|
||||
|
||||
sub uvscan {
|
||||
sub hook_data_post {
|
||||
my ($self, $transaction) = @_;
|
||||
|
||||
return (DECLINED)
|
||||
|
Loading…
Reference in New Issue
Block a user