On Tue, Mar 30, 2004 at 10:26:20AM +0200, Skaag Argonius wrote:
> Here's what I get when i add this plugin to the chain:
>
> @4000000040692c9b095cf324 Variable "@args" will not stay shared at
> ./plugins/check_basicheaders line 37.
>
> I run the plugin with 14 as a parameter.
yes, that's what i get for making the range configurable at the last
second.
a fixed plugin is attached.
jim
#!/usr/bin/perl
=head1 NAME
check_basicheaders - Make sure both From and Date headers are present, and do optional
range checking on the Date header
=head1 DESCRIPTION
Rejects messages that do not have a From or Date header.
Can also reject messages where the date in the Date header is more than
some number of the days in the past or future.
=head1 CONFIGURATION
Takes one optional parameter, the number of days in the future or past
beyond which to reject messages. (The default is to not reject messages
based on the date.)
=head1 AUTHOR
Written by Jim Winstead Jr.
=head1 LICENSE
Released to the public domain, 26 March 2004.
=cut
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];
$self->log(1, "WARNING: Ignoring additional arguments.") if (@args > 1);
}
}
sub check_basic_headers {
my ($self, $transaction) = @_;
return (DENY, "Mail with no From header not accepted here")
unless $transaction->header->get('From');
my $date = $transaction->header->get('Date');
return (DENY, "Mail with no Date header not accepted here")
unless $date;
return (DECLINED) unless defined $self->{_days};
my $ts = str2time($date);
return (DECLINED) unless $ts;
return (DENY, "The Date in the header was too far in the past")
if $ts < time - ($self->{_days}*24*3600);
return (DENY, "The Date in the header was too far in the future")
if $ts > time + ($self->{_days}*24*3600);
return (DECLINED);
}