X-Git-Url: https://git.deb.at/w?p=pkg%2Ft-prot.git;a=blobdiff_plain;f=t-prot;h=364af8e3746f2de28860b14d398154983de75af8;hp=5141512af69382c96f70b10560b16ed89b34ce51;hb=60da21df18142fa6f9aa3be2a09593f0acd1cd1d;hpb=5618ebb44c189ce296f7bbc5b86fc451f657129b diff --git a/t-prot b/t-prot index 5141512..364af8e 100755 --- a/t-prot +++ b/t-prot @@ -1,13 +1,13 @@ #!/usr/bin/perl -w -# $Id: t-prot,v 1.253 2007/03/09 15:06:04 jochen Exp $ +# $Id: t-prot,v 1.277 2010/02/06 03:29:23 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.4'; +use constant VER => '2.13'; use constant REV => ''; -use constant REL => q$Revision: 1.253 $=~m/(\d+(?:\.\d+)+)/; +use constant REL => q$Revision: 1.277 $=~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'; @@ -23,7 +23,7 @@ use constant EX_BOUNCE => EX_UNAVAILABLE; use vars qw( $ad $ads $bigqn $bigqx $boun $check $check_ratio $cr $diff $elli $footers $ftr_ad $ftr_ml $hdrs $indent $kamm $kdiff $kminl $kmaxl - $lax $lsig $maxsig $maxlines $mda $ml $ms $ms_smart $msg_quote + $lax $lsig $maxsig $maxlines $mda $ml $gw $ms $ms_smart $msg_quote $msg_ratio $mua $nohdr $ofile $pgpshort $pgpmove $pgpmovevrf $sig $sigint $sign $spass $spass_prefix $sysl $trad $trsp @@ -36,8 +36,9 @@ use vars qw( ); -# Please adjust these vals to your needs (they are no constants because -# command line can change them or they are used in rexexp's): +# Please adjust these vals to your needs only if you know what you are +# doing. They are no constants because command line can change them or +# they are used in some rexexp. $0 =~ s!^.*/!!; $maxsig = 4; # max. valid signature length $maxlines = undef; # no limit of message lines @@ -54,7 +55,7 @@ $ftr_ad = undef; # too hard on performance to be default $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 @@ -101,13 +102,14 @@ sub help { -e force ellipsis for excessive punctuation --ftr-ad enable aggressive ad footer matching; requires -A --ftr-ml enable aggressive mailing list footer matching; req. -L + --groupwise delete Novell Groupwise style TOFU -h, --help show this short help and exit -i=INFILE file to be read; '-' for STDIN (default) -k try to fix \"Kammquotes\" --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! @@ -177,12 +179,12 @@ sub remove_footers { 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; } } @@ -254,11 +256,12 @@ sub decomb { (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) && @@ -440,23 +443,13 @@ sub process_msg { 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); @@ -557,9 +550,8 @@ sub process_msg { 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; } @@ -695,12 +687,13 @@ sub process_msg { if ($kamm) { decomb($lines, \@vrb); } # Now care about TOFU. - # One common mispractice is M$ style TOFU: - if ($ms) { + # One common mispractice is M$ and Groupwise style TOFU: + if ($ms||$gw) { # bloat this array if you want more internationalization: my @tofu = ('Original Message', 'Original-Nachricht', 'Ursprüngliche Nachricht', + 'Ursprüngliche Nachricht', 'Ursprungliche Nachricht', 'Mensagem original', 'Ursprungligt meddelande', @@ -714,7 +707,10 @@ sub process_msg { DONE: for ($x=0; $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/))) { $x++; $trad = 0; $bigqn = 0; @@ -725,6 +721,8 @@ sub process_msg { if ((!$k) && $$lines[$x] !~ /^\s*$/o && ((!$mua) || ($mua eq 'mutt' && + # this line seems not necessary since mutt-1.5.18: + $$lines[$x] !~ /^\e[^\a]+\a$/o && $$lines[$x] !~ /^(?:\e[^\a]+\a)?(?:\Q$mutt_attachment\E)/o && $$lines[$x] !~ @@ -914,16 +912,17 @@ my $locale = $ENV{'LC_ALL'}?$ENV{'LC_ALL'}: # command line switches ($ad, $ads, $bigqn, $bigqx, $check, $cr, $sysl, $diff, $elli, $footers, $lax, - $ml, $ms, $ms_smart, $mda, $mua, $hdrs, $kamm, $lsig, $nohdr, $sig, $sigint, - $spass, $trad, $trsp) = + $ml, $gw, $ms, $ms_smart, $mda, $mua, $hdrs, $kamm, $lsig, $nohdr, $sig, + $sigint, $spass, $trad, $trsp) = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); my $ifile = '-'; # use STDIN if nothing specified # get command line params: Getopt::Mixed::init('a A=s c d e h i=s k L=s l m M=s o=s P=s p:s r S:i'. - ' s t v w bigq:s body check:s debug>d diff ftr-ad ftr-ml help>h'. - ' kminl=i kmaxl=i kdiff=i lax-security locale=s max-lines=i ms-smart'. - ' mua>M pgp-short pgp-move pgp-move-vrf sigsmax:i spass version>v'); + ' s t v w bigq:s body check:s debug>d diff ftr-ad ftr-ml groupwise'. + ' help>h kminl=i kmaxl=i kdiff=i lax-security locale=s max-lines=i'. + ' ms-smart mua>M pgp-short pgp-move pgp-move-vrf sigsmax:i spass'. + ' version>v'); while (my ($opt, $val, $pretty) = nextOption()) { if ($opt eq 'a') { $ad = 1; } elsif ($opt eq 'A') { $ads = $val; } @@ -937,11 +936,12 @@ while (my ($opt, $val, $pretty) = nextOption()) { 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; } } } @@ -950,6 +950,7 @@ while (my ($opt, $val, $pretty) = nextOption()) { elsif ($opt eq 'e') { $elli = 1; } elsif ($opt eq 'ftr-ad') { $ftr_ad = 1; $ad = 1; } elsif ($opt eq 'ftr-ml') { $ftr_ml = 1; $ml = 1; } + elsif ($opt eq 'groupwise') { $gw = 1; } elsif ($opt eq 'i') { $ifile = $val; } elsif ($opt eq 'k') { $kamm = 1; } elsif ($opt eq 'kminl') { $kminl = $val; $kamm = 1; } @@ -1057,9 +1058,7 @@ if ($mua eq 'mutt') { } } -else { - if ($ms_smart || $pgpshort || $pgpmove || $pgpmovevrf) { help(); } -} +elsif ($ms_smart || $pgpshort || $pgpmove || $pgpmovevrf) { help(); } # Read message: @@ -1068,6 +1067,25 @@ if (!open(IN, $ifile)) my @message = ; close IN; +# First, check msg length and stop processing if msg is too long: +if ((defined $maxlines) && (@message > $maxlines)) { + if ($ofile ne 'NONE') { + if ($mua eq 'mutt') { + my $x = 0; + if (!$nohdr) { + do { $x++; } while ($x<$#message && $message[$x]!~/^$/); + $x++; + } + splice(@message, $x, 0, + ("[---=| Processing by $0 skipped: message too long |=---]\n\n")); + } + + write_msg(($mda?'|'.SENDMAIL." $mda":">$ofile"), \@message); + } + if ($mua eq 'mutt') { exit(EX_OK); } + exit(EX_DATAERR); +} + # this should be self-explanatory: process_msg(\@message);