#!/usr/bin/perl -w
-# $Id: t-prot,v 1.255 2007/09/19 11:32:58 jochen Exp $
+# $Id: t-prot,v 1.269 2010/01/05 12:05:03 jochen Exp $
require 5.006;
use strict;
use Fcntl qw(O_EXCL O_WRONLY O_CREAT);
use Getopt::Mixed qw(nextOption);
-use constant VER => '2.5';
+use constant VER => '2.11';
use constant REV => '';
-use constant REL => q$Revision: 1.255 $=~m/(\d+(?:\.\d+)+)/;
+use constant REL => q$Revision: 1.269 $=~m/(\d+(?:\.\d+)+)/;
# MTA expecting mail on STDIN
# (you might have to adjust this if using a different MTA)
use constant SENDMAIL => '/usr/sbin/sendmail -oi';
$ftr_ml = undef; # too hard on performance to be default
$ofile = '-'; # use STDOUT if nothing is specified
$spass_prefix = 'SPAM: ';
-$check_ratio = .75; # 3/4 tofu is enough not to accept the message
+$check_ratio = 0; # off by default
$msg_quote = "Blocked by $0: This message has been rejected because of a full quote. Please see http://learn.to/quote/ and http://www.escape.de/users/tolot/mutt/ for more info. Have a nice day!\n";
$msg_ratio = "Blocked by $0: This message has been rejected because of excessive quoting. Please see http://learn.to/quote/ and http://www.escape.de/users/tolot/mutt/ for more info. Have a nice day!\n";
# end of user adjusted vals
--kminl=n min. line length for wrapped line; requires -k
--kmaxl=n max. line length for wrapped line; requires -k
--kdiff=n max. length difference between wrapped lines; req. -k
- -L=DIRECTORY mailling list footer directory, treat mailing list
+ -L=DIRECTORY mailing list footer directory, treat mailing list
footers as signature
-l delete mailing list footer; requires -L
--lax-security use unsafe writing method; USE ON YOUR OWN RISK!
for (my $z=0; $z<=$#l; $z++) { chomp($l[$z]); }
if (defined $V) {
- WIPE: for (my $z=scalar(@$L)-scalar(@l); $z>=0; $z--)
- {
+ WIPE: for (my $z=scalar(@$L)-scalar(@l); $z>=0; $z--) {
if (scalar(@l)+$z<=scalar(@$L)) {
my $y = 0;
for(my $x=1; $x<=scalar(@l); $x++) {
- if (index($$L[scalar(@$L)-$x-$z], $l[scalar(@l)-$x])!=0) {
+ if (index($$L[scalar(@$L)-$x-$z],
+ $l[scalar(@l)-$x])!=0) {
$y = 1;
}
}
(index($$L[$x+1], $indent)!=0) &&
($$L[$x+1] !~ /^$/) &&
($$L[$x+1] !~ /^[\s^]/) &&
- ($$L[$x] !~ /-$/) &&
+ ($$L[$x] !~ /-$/) &&
($$L[$x+1] !~ /^\Q[...]\E\s*$/) &&
($mua ne 'mutt' || $$L[$x+1] !~ /^(?:\e[^\a]+\a)?\[-- /) &&
(length($$L[$x])+index($$L[$x+1], ' ')>$max ||
- (index($$L[$x+1], ' ')<0 && length($$L[$x])+length($$L[$x+1])>$max)) &&
+ (index($$L[$x+1], ' ')<0 &&
+ length($$L[$x])+length($$L[$x+1])>$max)) &&
(length($$L[$x])+length($$L[$x+1])<$kmaxl) &&
(length($$L[$x])+length($$L[$x+1])>$kminl) &&
(length($$L[$x])-length($$L[$x+1])>$kdiff) &&
my (@ads, @hdr, @bo1, @bo2, @ftr, @sig, @vrb, @att) =
((), (), (), (), (), (), (), (), ());
- # First, remove and store lines we might need later...
+ # Remove and store lines we might need later...
# Remove headers:
if (!$nohdr) {
for ($x=0; $x<$#$lines; $x++) { if (@$lines[$x] =~ /^$/) { last; }; }
-
- # check body length and stop processing silently if msg is too long:
- if ((defined $maxlines) && (@$lines-$x > $maxlines)) {
- return;
- }
-
@hdr = @$lines[0..$x];
splice(@$lines, 0, $x+1);
}
- elsif ((defined $maxlines) && (@$lines > $maxlines)) {
- # check body length and stop processing silently if msg is too long:
- return;
- }
# remember the original body lines count
my $linecount = scalar(@$lines);
if (index($$lines[$x], $indent)==0) { $y++; }
}
}
- $y = $y/$z;
- if ($y>=$check_ratio) {
+ if ($y/$z>=$check_ratio) {
print $msg_ratio;
exit EX_UNAVAILABLE;
}
my @tofu = ('Original Message',
'Original-Nachricht',
'Ursprüngliche Nachricht',
+ 'Ursprüngliche Nachricht',
'Ursprungliche Nachricht',
'Mensagem original',
'Ursprungligt meddelande',
DONE: for ($x=0; $x<scalar(@$lines); $x++) {
if (!$vrb[$x]) {
foreach my $tmp (@tofu) {
- if (($ms && $$lines[$x] =~ /^-+\s?$tmp\s?-+/) ||
+ if (($ms && $$lines[$x] =~ /^\s?-+\s?$tmp\s?-+/) ||
($gw &&
($$lines[$x] =~ /^>>>[^\<]+<[^\>]+> \d\d?\/\d\d?\/\d\d? \d\d?:\d\d [AP]M >>>/ ||
$$lines[$x] =~ /^>>> On [A-Z][a-z][a-z]?, [A-Z][a-z][a-z]? \d\d?, \d\d\d\d at [ \d]\d:\d\d [AP]M, in message/))) {
elsif ($opt eq 'c') { $cr = 1; }
elsif ($opt eq 'check') {
$check = 1;
- while ($val && $val =~ s/^([^,\s]+)(?:,(\S+))?$/$2/) {
+ while ($val && $val =~ /^([^,\s]+)(?:,(\S+))?$/) {
my $foo = $1;
+ $val = $2;
- if ($foo =~ /^ratio=(0?\.\d+)$/) {
- $check_ratio = $1?$1:1;
+ if ($foo =~ /^ratio(?:=(0?\.\d+))?$/) {
+ $check_ratio = $1?$1:0.75;
}
}
}
my @message = <IN>;
close IN;
+# First, check msg length and stop processing if msg is too long:
+if ((defined $maxlines) && (@message > $maxlines)) {
+ if ($ofile ne 'NONE') {
+ write_msg(($mda?'|'.SENDMAIL." $mda":">$ofile"), \@message);
+ }
+ exit(EX_DATAERR);
+}
+
# this should be self-explanatory:
process_msg(\@message);