]> git.deb.at Git - pkg/t-prot.git/blobdiff - t-prot
Imported Upstream version 2.10
[pkg/t-prot.git] / t-prot
diff --git a/t-prot b/t-prot
index 81fbd71b49e6181f6771bb15b70707f7623741f0..e2b36cff8acaa8b236ddc84531a46a835117e7de 100755 (executable)
--- a/t-prot
+++ b/t-prot
@@ -1,13 +1,13 @@
 #!/usr/bin/perl -w
-# $Id: t-prot,v 1.246 2006/06/17 22:45:55 jochen Exp $
+# $Id: t-prot,v 1.267 2009/12/30 21:34:16 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.1';
+use constant VER            => '2.10';
 use constant REV            => '';
-use constant REL            => q$Revision: 1.246 $=~m/(\d+(?:\.\d+)+)/;
+use constant REL            => q$Revision: 1.267 $=~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,9 +23,9 @@ 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 $mda $ml $ms $ms_smart $msg_quote $msg_ratio
-    $mua $nohdr $ofile $pgpshort $pgpmove $pgpmovevrf $sig $sigint
-    $sign $spass $spass_prefix $sysl $trad $trsp
+    $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
 
     $gpg_WARNING $gpg_Warning $gpg_Cantcheck $gpg_aka $gpg_bad
     $gpg_expired $gpg_good $gpg_bug
@@ -40,6 +40,7 @@ use vars qw(
 # command line can change them or they are used in rexexp's):
 $0 =~ s!^.*/!!;
 $maxsig         = 4;      # max. valid signature length
+$maxlines       = undef;  # no limit of message lines
 $indent         = '>';    # Indent string, regexp to identify a quoted line
 $kminl          = 65;     # see decomb() for details
 $kmaxl          = 80;
@@ -86,8 +87,8 @@ $gpg_bug                = '... this is a bug (';
 # help(): print help text and exit with appropriate exit code
 sub help {
     print "Usage: $0 [options] 
-  -a              remove ad footers; requires -A
   -A=DIRECTORY    ad footer directory, treat ad footers as signature
+  -a              remove ad footers; requires -A
   --bigq[=n[,x]]  remove all but x lines of quotes with more than n
                   lines; default is n=30 and x=10
   --body          input has no headers; does not work with --pgp-short;
@@ -100,19 +101,21 @@ 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!
   --locale=LOCALE internationalization; currently only used with -Mmutt
   -M, --mua=MUA   turn on special treatment for some mail user agents
   -m              delete MS style TOFU; careful: might be too agressive
+  --max-lines=x   maximum number of message lines
   --ms-smart      try to be smart with MS style TOFU; req. -Mmutt and -m
   -o=OUTFILE      file to be written to; '-' for STDOUT (default), 'NONE'
                   for no output at all
@@ -160,12 +163,14 @@ sub remove_footers {
     }
 
     if ($F && scalar(@$L)) {
-        if (!opendir(DIR, $F)) { print STDERR "Could not open $F: $!\n"; exit(EX_IOERR); }
+        if (!opendir(DIR, $F))
+            { print STDERR "Could not open $F: $!\n"; exit(EX_IOERR); }
         my @feet = grep { /^[^.]/ && -f "$F/$_" } readdir DIR;
         closedir DIR;
 
         foreach my $f (@feet) {
-            if (!open(IN, "$F/$f")) { print STDERR "Could not open $F/$f: $!\n"; exit(EX_IOERR); }
+            if (!open(IN, "$F/$f"))
+                { print STDERR "Could not open $F/$f: $!\n"; exit(EX_IOERR); }
             my @l = <IN>;
             close IN;
 
@@ -173,12 +178,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;
                             }
                         }
@@ -250,11 +255,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) &&
@@ -343,7 +349,8 @@ sub pgp {
                 if (index($$H[$m], 'From:')==0) {
                     $from = $$H[$m];
                     $m++;
-                    while (exists($$H[$m]) && $$H[$m] =~ /^\s/) { $from .= $$H[$m]; $m++; }
+                    while (exists($$H[$m]) && $$H[$m] =~ /^\s/)
+                        { $from .= $$H[$m]; $m++; }
                     last;
                 }
             }
@@ -435,7 +442,7 @@ 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; }; }
@@ -680,11 +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',
@@ -698,7 +707,10 @@ sub process_msg {
         DONE: for ($x=0; $x<scalar(@$lines); $x++) { 
             if (!$vrb[$x]) {
                 foreach my $tmp (@tofu) {
-                    if ($$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/))) { 
                         $x++;
                         $trad = 0;
                         $bigqn = 0;
@@ -893,20 +905,22 @@ sub process_msg {
 
 
 # environment
-my $locale = $ENV{'LC_ALL'}?$ENV{'LC_ALL'}:($ENV{'LC_MESSAGES'}?$ENV{'LC_MESSAGES'}:$ENV{'LANG'});
+my $locale = $ENV{'LC_ALL'}?$ENV{'LC_ALL'}:
+                 ($ENV{'LC_MESSAGES'}?$ENV{'LC_MESSAGES'}:$ENV{'LANG'});
 
 # 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 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; }
@@ -933,6 +947,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; }
@@ -943,6 +958,7 @@ while (my ($opt, $val, $pretty) = nextOption()) {
     elsif ($opt eq 'lax-security') { $lax = 1; }
     elsif ($opt eq 'locale') { $locale = $val; }
     elsif ($opt eq 'm')     { $ms = 1; }
+    elsif ($opt eq 'max-lines') { $maxlines = $val; }
     elsif ($opt eq 'ms-smart') { $ms_smart = 1; $ms = 1; }
     elsif ($opt eq 'M') {
         $mua = lc($val);
@@ -1045,10 +1061,19 @@ else {
 
 
 # Read message:
-if (!open(IN, $ifile)) { print STDERR "Could not open $ifile: $!\n"; exit(EX_IOERR); }
+if (!open(IN, $ifile))
+    { print STDERR "Could not open $ifile: $!\n"; exit(EX_IOERR); }
 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);