...
No Format |
---|
package ClamAV; use strict; # our $CLAMD_SOCK = 3310; # for TCP-based usage our $CLAMD_SOCK = "/var/run/clamd.basic/clamd.sock"; # change me use Mail::SpamAssassin; use Mail::SpamAssassin::Plugin; use Mail::SpamAssassin::Logger; 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 $clamav = new File::Scan::ClamAV(port => $CLAMD_SOCK); my ($code, $virus) = $clamav->streamscan(${$fulltext}); my $isspam = 0; my $header = ""; if(!$code) { my $errstr = $clamav->errstr(); Mail::SpamAssassin::Plugin::dbg("ClamAV: Error scanning: $errstr"); $header = "Error ($errstr)"; } elsif($code eq 'OK') { Mail::SpamAssassin::Plugin::dbg("ClamAV: No virus detected"); $header = "No"; } elsif($code eq 'FOUND') { Mail::SpamAssassin::Plugin::dbg("ClamAV: Detected virus: $virus"); $header = "Yes ($virus)"; $isspam = 1; # include the virus name in SpamAssassin's report $permsgstatus->test_log($virus); } else { Mail::SpamAssassin::Plugin::dbg("ClamAV: Error, unknown return code: $code"); $header = "Error (Unknown return code from ClamAV: $code)"; } my $conf = $permsgstatus->{main}->{conf}; if (ref $conf->{headers_spam} eq 'ARRAY') { # since SA 3.3.0 push(@{$conf->{headers_spam}}, ["Virus", $header]); push(@{$conf->{headers_ham}} =, ["Virus", $header]); $permsgstatus} else { # compatibility with SA 3.2.*, see Bug 6254, Bug 6185 $conf->{mainheaders_spam}->{conf}"Virus"} = $header; $conf->{headers_ham}->{"Virus"} = $header; } # add a metadatum so that rules can match against the result too $permsgstatus->{msg}->put_metadata('X-Spam-Virus',$header); return $isspam; } 1; |
...