#!/usr/bin/perl
#
# xm-spf.pl by Davide Libenzi ( XMail Perl filter for SPF )
# Copyright (C) 2004 Davide Libenzi
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Davide Libenzi <[EMAIL PROTECTED]>
#
use strict;
use Mail::SPF::Query;
my $opt_file = undef;
my $opt_ip = undef;
my $opt_sender = undef;
my $opt_helo = undef;
my $opt_rcpt_to = undef;
my $opt_local = undef;
my $opt_trusted = undef;
my $opt_guess = undef;
my $opt_exp = undef;
my $opt_max_lookup = undef;
my $opt_sanitize = undef;
my $opt_name = "spfquery";
my $opt_debug = 0;
my $opt_keep_comments = 0;
my $opt_fallback = undef;
my $opt_override = undef;
my $opt_dns = undef;
my $opt_help = undef;
my $opt_pcode = 0;
my $opt_fcode = 19;
my @opt_bypass = undef;
my $i;
for ($i = 0; $i <= $#ARGV; $i++) {
if ($ARGV[$i] eq "--file") {
if (++$i <= $#ARGV) {
$opt_file = $ARGV[$i];
}
} elsif ($ARGV[$i] eq "--ip") {
if (++$i <= $#ARGV) {
$opt_ip = $ARGV[$i];
}
} elsif ($ARGV[$i] eq "--sender") {
if (++$i <= $#ARGV) {
$opt_sender = $ARGV[$i];
}
} elsif ($ARGV[$i] eq "--helo") {
if (++$i <= $#ARGV) {
$opt_helo = $ARGV[$i];
}
} elsif ($ARGV[$i] eq "--rcpt-to") {
if (++$i <= $#ARGV) {
$opt_rcpt_to = $ARGV[$i];
}
} elsif ($ARGV[$i] eq "--debug") {
if (++$i <= $#ARGV) {
$opt_debug = int($ARGV[$i]);
}
} elsif ($ARGV[$i] eq "--local") {
if (++$i <= $#ARGV) {
$opt_local = $ARGV[$i];
}
} elsif ($ARGV[$i] eq "--trusted") {
if (++$i <= $#ARGV) {
$opt_trusted = $ARGV[$i];
}
} elsif ($ARGV[$i] eq "--guess") {
if (++$i <= $#ARGV) {
$opt_guess = $ARGV[$i];
}
} elsif ($ARGV[$i] eq "--expl") {
if (++$i <= $#ARGV) {
$opt_exp = $ARGV[$i];
}
} elsif ($ARGV[$i] eq "--max-lookup") {
if (++$i <= $#ARGV) {
$opt_max_lookup = $ARGV[$i];
}
} elsif ($ARGV[$i] eq "--sanitize") {
if (++$i <= $#ARGV) {
$opt_sanitize = $ARGV[$i];
}
} elsif ($ARGV[$i] eq "--name") {
if (++$i <= $#ARGV) {
$opt_name = $ARGV[$i];
}
} elsif ($ARGV[$i] eq "--fallback") {
if (++$i <= $#ARGV) {
$opt_fallback = $ARGV[$i];
}
} elsif ($ARGV[$i] eq "--override") {
if (++$i <= $#ARGV) {
$opt_override = $ARGV[$i];
}
} elsif ($ARGV[$i] eq "--dns") {
if (++$i <= $#ARGV) {
$opt_dns = $ARGV[$i];
}
} elsif ($ARGV[$i] eq "--pcode") {
if (++$i <= $#ARGV) {
$opt_pcode = $ARGV[$i];
}
} elsif ($ARGV[$i] eq "--fcode") {
if (++$i <= $#ARGV) {
$opt_fcode = $ARGV[$i];
}
} elsif ($ARGV[$i] eq "--bypass") {
if (++$i <= $#ARGV) {
push(@opt_bypass, $ARGV[$i]);
}
} elsif ($ARGV[$i] eq "--help") {
$opt_help = 1;
}
}
if ($opt_help) {
exit($opt_pcode);
}
if (defined($opt_file)) {
my $ln;
my @hvars;
if (!open(MFIL, "$opt_file")) {
print STDERR "unable to open ${opt_file}\n";
exit($opt_pcode);
}
# Read message info
$ln = <MFIL>;
chomp($ln);
@hvars = split(/;/, $ln);
# Discard SMTP domain
$ln = <MFIL>;
# Discard message ID
$ln = <MFIL>;
# Read MAIL FROM
$ln = <MFIL>;
chomp($ln);
close(MFIL);
# Handle both cases of early message file and spool file
($opt_sender = $ln) =~ s/[^<]+<([^>]*)>.*/$1/;
if ($#hvars > 3) {
$opt_helo = $hvars[0];
($opt_ip = $hvars[1]) =~ s/([^:]+):[0-9]+/$1/;
} else {
($opt_ip = $hvars[0]) =~ s/([^:]+):[0-9]+/$1/;
}
}
if (!defined($opt_helo) && ($opt_sender =~ /\@/)) {
($opt_helo = $opt_sender) =~ s/.*\@(.*)/$1/;
}
for ($i = 0; $i <= $#opt_bypass; $i++) {
if ($opt_ip =~ /$opt_bypass[$i]/) {
if ($opt_debug) {
print "whitelist ip ${opt_ip}\n";
}
exit($opt_pcode);
}
}
my $query = new Mail::SPF::Query(ipv4 => $opt_ip,
sender => $opt_sender,
helo => $opt_helo,
local => $opt_local,
trusted => $opt_trusted,
guess => $opt_guess,
default_explanation => $opt_exp,
max_lookup => $opt_max_lookup,
sanitize => $opt_sanitize,
myhostname => $opt_name,
fallback => $opt_fallback,
override => $opt_override,
debug => $opt_debug,
);
my $rcode = ($query->result eq "fail") ? $opt_fcode: $opt_pcode;
if ($opt_debug) {
print $query->result . "\n";
}
exit($rcode);
Vinny Wadding wrote:
> Hi Guys,
>
> I am looking at the SPF script that Davide published, I am wondering if
> any one else was using this filter? I have been trying to trawl net
> and forums for any information about it, but there doesn't seem to be
> any info about how it works, or what parameters you pass it etc.
>
> So I was wondering, If people have got it up and running what parameters
> are you passing it from xmail? How did you have it configured as a
> filter? Im sure im not the only person who is out there looking for
> this info.
>
> Thanks
>
>
>
>
>
>
> -
> To unsubscribe from this list: send the line "unsubscribe xmail" in
> the body of a message to [EMAIL PROTECTED]
> For general help: send the line "help" in the body of a message to
> [EMAIL PROTECTED]
>
>
>
-
To unsubscribe from this list: send the line "unsubscribe xmail" in
the body of a message to [EMAIL PROTECTED]
For general help: send the line "help" in the body of a message to
[EMAIL PROTECTED]