diff -Naur Mail-SpamAssassin-3.2.4-orig/lib/Mail/SpamAssassin/Plugin/FecUtmCT.pm Mail-SpamAssassin-3.2.4/lib/Mail/SpamAssassin/Plugin/FecUtmCT.pm
--- Mail-SpamAssassin-3.2.4-orig/lib/Mail/SpamAssassin/Plugin/FecUtmCT.pm	1970-01-01 01:00:00.000000000 +0100
+++ Mail-SpamAssassin-3.2.4/lib/Mail/SpamAssassin/Plugin/FecUtmCT.pm	2008-04-21 17:59:01.000000000 +0200
@@ -0,0 +1,122 @@
+package Mail::SpamAssassin::Plugin::FecUtmCT;
+
+use Mail::SpamAssassin::Plugin;
+use Mail::SpamAssassin::Util;
+use strict;
+use warnings;
+use bytes;
+
+use Sys::Syslog;
+use File::Temp qw/ tempfile /;
+
+use constant PACTDE_SCANDIR => "/var/spool/packetalarm/vscan";
+
+use vars qw(@ISA);
+@ISA = qw(Mail::SpamAssassin::Plugin);
+
+
+sub new
+{
+	my $class = shift;
+	my $mailsaobject = shift;
+
+	$class = ref($class) || $class;
+	my $self = $class->SUPER::new($mailsaobject);
+	bless ($self, $class);
+
+	$self->register_eval_rule('check_fecutm_ct');
+
+	return $self;
+}
+
+
+sub paAddrPrepare
+{
+	my($self, $addr) = @_;
+
+	$addr =~ s/^<//;
+	$addr =~ s/>$//;
+	return $addr;
+}
+
+
+
+
+sub ctde_client
+{
+	my($self, $pms) = @_;
+
+	$pms->{paCTDEchecked} = 1;
+	$pms->{tag_data}->{COMMTOUCHID} = '';
+	my($fd, $filename) = tempfile(
+	  DIR => PACTDE_SCANDIR, SUFFIX => ".msg");
+	unless($fd) {
+		syslog("mail|err", "CTDE, unable to open temp file");
+		return;
+	}
+	chmod 0666, $filename;
+	$filename =~ /\/([^\/]+)$/;
+	my $msgfile = $1;
+	my $msg = $pms->get_message();
+        print $fd $msg->get_pristine();
+	close($fd);
+	my $senderIP = "";
+	my $envelopeFrom = $self->paAddrPrepare(
+	  $pms->get("EnvelopeFrom"));
+	my $envelopeTo = $self->paAddrPrepare(
+	  $pms->get("X-Envelope-To"));
+	my $received = $pms->get("Received");
+	if($received =~ /from.+\[(\d+\.\d+\.\d+\.\d+)\]/) {
+		$senderIP = $1;
+	}
+	my $sock = IO::Socket::INET->new(PeerAddr => "127.0.0.1",
+	  PeerPort => 6683, Proto => "tcp");
+	unless($sock) {
+		syslog("mail|err", "csdk, unable to connect to server process");
+		unlink($filename);
+		return;
+	}
+	print $sock "$msgfile\n";
+	print $sock "$senderIP\n";
+	print $sock "$envelopeFrom\n";
+	print $sock "$envelopeTo\n";
+	my $response = <$sock>;
+	my $refID;
+	chomp($response);
+	if($response =~ /^(\-{0,1}\d+)$/) {
+		$pms->{paCTDEstatus} = $1;
+		if($pms->{paCTDEstatus} < 0) {
+			syslog("mail|err", "CTDE, check failed, rc = " .
+			$pms->{paCTDEstatus});
+		} else {
+			$refID = <$sock>;
+			chomp($refID);
+			$pms->{paCTDERefID} = $refID;
+			$pms->{tag_data}->{COMMTOUCHID} = $refID;
+		}
+	} else {
+		syslog("mail|err", "CTDE, unexpected response from server");
+	}
+	$sock->close();
+	unlink($filename);
+}
+
+
+sub check_fecutm_ct
+{
+	my($self, $pms, $textRef, $requiredStatus) = @_;
+
+	my %status = ("suspect" => 1, "bulk" => 2, "confirmed" => 3);
+	unless(exists($status{$requiredStatus})) {
+		syslog("mail|err", "CTDE, invalid required status " .
+		  $requiredStatus);
+		return;
+	}
+	$self->ctde_client($pms) unless($pms->{paCTDEchecked});
+	return if($pms->{paCTDEstatus} < 0);
+	return 1 if ($pms->{paCTDEstatus} == $status{$requiredStatus});
+  	return;
+}
+
+
+1;

