#!perl -w =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 or are completely empty. 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) = @_; if (@args > 0) { $self->{_days} = $args[0]; $self->log(LOGWARN, "WARNING: Ignoring additional arguments.") if (@args > 1); } } sub hook_data_post { my ($self, $transaction) = @_; return (DENY, "You have to send some data first") if $transaction->data_size == 0; my $header = $transaction->header; return (DENY, "Mail with no From header not accepted here") unless $header && $header->get('From'); my $date = $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); }