dbaa9dbd6c
on files in plugins dir: fixed a number of POD errors formatted some # comments into POD removed bare 1; (these are plugins, not perl modules) most instances of this were copy/pasted from a previous plugin that had it removed instances of # vim ts=N ... they weren't consistent, many didn't match .perltidyrc on modules that failed perl -c tests, added 'use Qpsmtpd::Constants;' Conflicts: plugins/async/check_earlytalker plugins/async/dns_whitelist_soft plugins/async/dnsbl plugins/async/queue/smtp-forward plugins/async/require_resolvable_fromhost plugins/async/rhsbl plugins/async/uribl plugins/auth/auth_checkpassword plugins/auth/auth_cvm_unix_local plugins/auth/auth_flat_file plugins/auth/auth_ldap_bind plugins/auth/auth_vpopmail plugins/auth/auth_vpopmail_sql plugins/auth/authdeny plugins/check_badmailfromto plugins/check_badrcptto_patterns plugins/check_bogus_bounce plugins/check_earlytalker plugins/check_norelay plugins/check_spamhelo plugins/connection_time plugins/dns_whitelist_soft plugins/dnsbl plugins/domainkeys plugins/greylisting plugins/hosts_allow plugins/http_config plugins/logging/adaptive plugins/logging/apache plugins/logging/connection_id plugins/logging/transaction_id plugins/logging/warn plugins/milter plugins/queue/exim-bsmtp plugins/queue/maildir plugins/queue/postfix-queue plugins/queue/smtp-forward plugins/quit_fortune plugins/random_error plugins/rcpt_map plugins/rcpt_regexp plugins/relay_only plugins/require_resolvable_fromhost plugins/rhsbl plugins/sender_permitted_from plugins/spamassassin plugins/tls plugins/tls_cert plugins/uribl plugins/virus/aveclient plugins/virus/bitdefender plugins/virus/clamav plugins/virus/clamdscan plugins/virus/hbedv plugins/virus/kavscanner plugins/virus/klez_filter plugins/virus/sophie plugins/virus/uvscan
119 lines
2.7 KiB
Perl
119 lines
2.7 KiB
Perl
#!perl -Tw
|
|
sub init {
|
|
my ($self, $qp, %args) = @_;
|
|
|
|
foreach my $key ( %args ) {
|
|
$self->{$key} = $args{$key};
|
|
}
|
|
}
|
|
|
|
sub hook_data_post {
|
|
use Mail::DomainKeys::Message;
|
|
use Mail::DomainKeys::Policy;
|
|
|
|
my ($self, $transaction) = @_;
|
|
|
|
# if this isn't signed, just move along
|
|
return DECLINED
|
|
unless $transaction->header->get('DomainKey-Signature');
|
|
|
|
my @body;
|
|
|
|
$transaction->body_resetpos;
|
|
|
|
$transaction->body_getline; # \r\n seperator is NOT part of the body
|
|
|
|
while (my $line = $transaction->body_getline) {
|
|
push @body, $line;
|
|
}
|
|
|
|
my $message = load Mail::DomainKeys::Message(
|
|
HeadString => $transaction->header->as_string,
|
|
BodyReference => \@body) or
|
|
$self->log(LOGWARN, "unable to load message"),
|
|
return DECLINED;
|
|
|
|
# no sender domain means no verification
|
|
$message->senderdomain or
|
|
return DECLINED;
|
|
|
|
my $status;
|
|
|
|
# key testing
|
|
if ( $message->testing ) {
|
|
# Don't do anything else
|
|
$status = "testing";
|
|
}
|
|
elsif ( $message->signed and $message->verify ) {
|
|
# verified: add good header
|
|
$status = $message->signature->status;
|
|
}
|
|
else { # not signed or not verified
|
|
my $policy = fetch Mail::DomainKeys::Policy(
|
|
Protocol => "dns",
|
|
Domain => $message->senderdomain
|
|
);
|
|
if ( $policy ) {
|
|
if ( $policy->testing ) {
|
|
# Don't do anything else
|
|
$status = "testing";
|
|
}
|
|
elsif ( $policy->signall ) {
|
|
# if policy requires all mail to be signed
|
|
$status = undef;
|
|
}
|
|
else { # $policy->signsome
|
|
# not signed and domain doesn't sign all
|
|
$status = "no signature";
|
|
}
|
|
}
|
|
else {
|
|
$status = $message->signed ? "non-participant" : "no signature";
|
|
}
|
|
}
|
|
|
|
|
|
if ( defined $status ) {
|
|
$transaction->header->replace("DomainKey-Status", $status);
|
|
$self->log(LOGWARN, "DomainKeys-Status: $status");
|
|
return DECLINED;
|
|
}
|
|
else {
|
|
$self->log(LOGERROR, "DomainKeys signature failed to verify");
|
|
if ( $self->{warn_only} ) {
|
|
return DECLINED;
|
|
}
|
|
else {
|
|
return (DENY, "DomainKeys signature failed to verify");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
=head1 NAME
|
|
|
|
domainkeys: validate a DomainKeys signature on an incoming mail
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
domainkeys [warn_only 1]
|
|
|
|
Performs a DomainKeys validation on the message. Takes a single
|
|
configuration
|
|
|
|
warn_only 1
|
|
|
|
which means that messages which are not correctly signed (i.e. signed but
|
|
modified or deliberately forged) will not be DENY'd, but an error will still
|
|
be issued to the logfile.
|
|
|
|
=head1 COPYRIGHT
|
|
|
|
Copyright (C) 2005-2006 John Peacock.
|
|
|
|
Portions Copyright (C) 2004 Anthony D. Urso. All rights reserved. This
|
|
program is free software; you can redistribute it and/or modify it under
|
|
the same terms as Perl itself.
|
|
|
|
=cut
|