Troels Walsted Hansen wrote:
I created a small plugin using the new plugin API in SpamAssassin 3.x. The plugin connects to a local ClamAV server (through TCP) and checks the email for virus. If a virus is found, it returns a positive return code to indicate spam and sets the header "X-Spam-Virus: Yes ($virusname)".
Well sort of. The headers only get set if the message ends up being classified as spam. If you receive a virus from a whitelisted user, or in a message that would otherwise score less than -5.0 (at least with the default score CLAMAV 10), the X-Spam-Virus: Yes ($virus) header won't be added since the headers are only added to %headers_spam. Of course, clean messages won't have a header added in ham messages either.
Adding the "Virus" headers to the headers_ham hash, as in the attached file, correct this.
Otherwise a pretty cool plugin for those who can't for whatever reason do it another way.
Daryl
package ClamAV; use strict; use Mail::SpamAssassin; use Mail::SpamAssassin::Plugin; use File::Scan::ClamAV; our @ISA = qw(Mail::SpamAssassin::Plugin);
sub new {
my ($class, $mailsa) = @_;
$class = ref($class) || $class;
my $self = $class->SUPER::new($mailsa);
bless ($self, $class);
$self->register_eval_rule ("check_clamav");
return $self;
}
sub check_clamav {
my ($self, $permsgstatus, $fulltext) = @_;
my $av = new File::Scan::ClamAV(port => 3310);
my ($code, $virus) = $av->streamscan(${$fulltext});
if(!$code) {
my $errstr = $av->errstr();
Mail::SpamAssassin::Plugin::dbg("ClamAV: Error scanning: $errstr");
$permsgstatus->{main}->{conf}->{headers_spam}->{"Virus"} = "Error
($errstr)";
$permsgstatus->{main}->{conf}->{headers_ham}->{"Virus"} = "Error ($errstr)";
} elsif($code eq 'OK') {
Mail::SpamAssassin::Plugin::dbg("ClamAV: No virus detected");
$permsgstatus->{main}->{conf}->{headers_spam}->{"Virus"} = "No";
$permsgstatus->{main}->{conf}->{headers_ham}->{"Virus"} = "No";
} elsif($code eq 'FOUND') {
Mail::SpamAssassin::Plugin::dbg("ClamAV: Detected virus: $virus");
$permsgstatus->{main}->{conf}->{headers_spam}->{"Virus"} = "Yes ($virus)";
$permsgstatus->{main}->{conf}->{headers_ham}->{"Virus"} = "Yes ($virus)";
return 1;
}
return 0;
}
1;
