#!/usr/bin/perl -w
-# $Id: t-prot,v 1.261 2009/08/24 20:32:11 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.7';
+use constant VER => '2.13';
use constant REV => '';
-use constant REL => q$Revision: 1.261 $=~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';
);
-# 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
$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
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;
}
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] !~
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;
}
}
}
}
}
-else {
- if ($ms_smart || $pgpshort || $pgpmove || $pgpmovevrf) { help(); }
-}
+elsif ($ms_smart || $pgpshort || $pgpmove || $pgpmovevrf) { help(); }
# Read message:
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') {
+ 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);