chiark / gitweb /
truncation: include header name in warning header
[modbot-ulm.git] / stump / bin / submission.pl
index f978a1fb36d526a1f3b2672611a45bf5646ebf6a..fa98e930f7b3abc5978bf787126b72686b438585 100755 (executable)
@@ -133,11 +133,8 @@ print STDERR "Too many newsgroups\n";
 # checks if poster needs acknowledgment of receipt
 #
 sub checkAck {
-  if( &nameIsInList( $From, "noack.list" ) ) {
-    $needAck = "no";
-  } else {
-    $needAck = "yes";
-  }
+  #ULM mods want to disable this, so just return "no"
+  $needAck = "no";
 }
 
 ################################################################### checkPGP
@@ -163,8 +160,8 @@ print STDERR "FromSig = $FromSig, good = $good\n" if $FromSig;
     return "$Command_Reject signature Your PGP signature does NOT match, or is not in our keyring";
   }
 
-  if( &nameIsInList( $From, $PGPMustList ) ||
-      ($PGPCheckPreapproved && &nameIsInList($From, $goodGuys) ) ) {
+  if( &nameIsInListRegexp( $From, $PGPMustList ) ||
+      ($PGPCheckPreapproved && &nameIsInListExactly($From, $goodGuys) ) ) {
     if( $FromSig eq "" ) {
       return "$Command_Reject signature You are REQUIRED to sign your posts.";
     } 
@@ -184,8 +181,8 @@ print STDERR "FromSig = $FromSig, good = $good\n" if $FromSig;
 # checks charter calling conforms_charter
 #
 sub checkCharter {
-  open( VERIFY, "|conforms_charter" );
-  print VERIFY $Body;
+  open( VERIFY, "|conforms_charter" ) or die $!;
+  print VERIFY $Body or die $!;
   close( VERIFY );
 
   return $? == 0;
@@ -214,8 +211,8 @@ sub Filter {
     }
   }
 
-  if( &nameIsInList( $From, $badGuys ) ) {
-    return "$Command_Reject abuse";
+  if( &nameIsInListRegexp( $From, $badGuys ) ) {
+    return "$Command_Reject blocklist";
   }
 
   # note that if even a preapproved person uses "BAD words" (that is
@@ -223,7 +220,7 @@ sub Filter {
   # "suspicious" and will be forwarded to a humen mod for review.
   # As an example of a bad word may be "MAKE MONEY FAST - IT REALLY WORKS!!!"
   #
-  if( $badWord = &nameIsInList( $Body, $badWords ) ) {
+  if( $badWord = &nameIsInListRegexp( $Body, $badWords ) ) {
 print STDERR "BAD WORD $badWord FOUND!!!\n";
     return $Command_Suspicious; # messages from approved guys MAY be 
                          # suspicious if they write about
@@ -237,7 +234,7 @@ print STDERR "BAD WORD $badWord FOUND!!!\n";
   }
 
   # Checking preapproved list
-  if( &nameIsInList( $From, $goodGuys ) ) {
+  if( &nameIsInListExactly( $From, $goodGuys ) ) {
   local( $from ) = $From; $from =~ s/^From: //i;
 print STDERR "$from is a PREAPPROVED person\n";
     return $Command_Approve;
@@ -267,7 +264,6 @@ sub ignoreHeader {
   return 1 if( $header =~ /^Supersedes:/i );
   return 1 if( $header =~ /^Precedence:/i );
   return 1 if( $header =~ /^Apparently-To:/i );
-  return 1 if( $header =~ /^Date:/i );
   return 1 if( $header =~ /^Expires:/i );
   return 1 if( $header =~ /^Distribution:/i );
   return 1 if( $header =~ /^Path:/i );
@@ -280,6 +276,9 @@ sub ignoreHeader {
   return 1 if( $header =~ /^Sender:/i );
   return 1 if( $header =~ /^In-Reply-To:/i );
   return 1 if( $header =~ /^Originator:/i );
+  return 1 if( $header =~ /^X-Trace:/i );
+  return 1 if( $header =~ /^X-Complaints-To:/i );
+  return 1 if( $header =~ /^NNTP-Posting-Date:/i );
 
   return 0;
 }
@@ -298,22 +297,84 @@ sub ignoreHeader {
 
 sub readMessage {
 
-open IWJL, ">>/home/webstump/t.log";
-print IWJL "=========== SUBMISSION READMESSAGE\n";
+#open IWJL, ">>/home/webstump/t.log";
+#print IWJL "=========== SUBMISSION READMESSAGE\n";
 
-  open( TMPFILE, "> $TmpFile" );
+  open( TMPFILE, "> $TmpFile" ) or die $!;
 
   $IsBody = 0;
-  
-  while( <> ) {
-print IWJL "SbRm $_\n";
+
+  my @unfolded;
+  my $readahead = '';
+
+  our $warnings=0;
+  my $warning = sub {
+    sprintf "X-STUMP-Warning-%d: %s\n", $warnings++, $_[0];
+  };
+
+#open TTY, ">/home/webstump/t";
+  for (;;) {
+#print TTY "=| $IsBody | $readahead ...\n";
+    if (!defined $readahead) {
+      # we got EOF earlier;
+      last;
+    }
+    if (length $readahead) {
+      $_ = $readahead;
+      $readahead = '';
+    } else {
+      $_ = <>;
+      last unless defined;
+    }
+    if (!$IsBody) {
+      # right now there is no readahead, since we just consumed it into $_
+      if ($_ !~ m/^\r?\n$/) { # blank line ? no...
+       $readahead = <>;
+       if (defined $readahead && $readahead =~ m/^[ \t]/) {
+         # this is a continuation, keep stashing
+         $readahead = $_.$readahead;
+         next;
+       }
+       # OK, $readahead is perhaps:
+       #   - undef: we got eof
+       #   - empty line: signalling end of (these) headers
+       #   - start of next header
+       # In these cases, keep that in $readahead for now,
+       # and process the previous header, which is in $_.
+       # But, first, a wrinkle ...
+       if (!m/^(?:References):/i) {
+         push @unfolded, (m/^[^:]+:/ ? $& : '????')
+           if s/\n(?=.)//g;
+         if (length $_ > 505) { #wtf
+           $_ = substr($_, 0, 500);
+           $_ =~ s/\n?$/\n/;
+           $readahead = $_;
+           m/^[0-9a-z-]+/i;
+           $_ = $warning->("Next header ($&) truncated!");
+         }
+       }
+      } else {
+       # $_ is empty line at end of headers
+       # (and, there is no $readahead)
+       if (@unfolded) {
+         # insert this warning into the right set of headers
+         $readahead = $_;
+         $_ = $warning->("Unfolded headers @unfolded");
+         @unfolded = ();
+       }
+      }
+      # Now we have in $_ either a complete header, unfolded,
+      # or the empty line at the end of headers
+    } 
+#print TTY "=> $IsBody | $readahead | $_ ...\n";
+
     $Body .= $_;
 
     if( !$IsBody && &ignoreHeader( $_ ) ) {
       next;
     }
 
-    print TMPFILE;
+    print TMPFILE or die $!;
   
     chop;
   
@@ -367,7 +428,7 @@ print STDERR "BAD NEWSSERVER\n";
     }
   }
 use IO::Handle;
-  print IWJL "SbRmE $!\n";
+#  print IWJL "SbRmE $!\n";
   die "read message $! !" if STDIN->error;
 
   close( TMPFILE );
@@ -402,16 +463,15 @@ $command = &Filter;
 # process
 print STDERR "command = $command\n";
 
-open IWJL, ">>/home/webstump/t.log";
-print IWJL "=========== SUBMISSION MAIN\n";
+#open IWJL, ">>/home/webstump/t.log";
+#print IWJL "=========== SUBMISSION MAIN\n";
 
-open( COMMAND, "| $command" );
+open( COMMAND, "| $command" ) or die $!;
 open( TMPFILE, "$TmpFile" ) || die "cant open tmpfile";
 
   $IsBody = 0;
 
   while( <TMPFILE> ) {
-print IWJL "SbRt $_\n";
 
     if( $BadNewsserver && !(/^$/) ) {
       next;
@@ -427,10 +487,10 @@ print IWJL "SbRt $_\n";
     }
 
     if( /^From / ) {
-      print COMMAND;
-      print COMMAND "X-Origin: $X_Origin, $_" if $X_Origin;
+      print COMMAND or die $!;
+      print COMMAND "X-Origin: $X_Origin, $_" or die $! if $X_Origin;
       print STDERR "Subject =`$Subject'\n";
-      print COMMAND "Subject: No subject given\n" if !$Subject;
+      print COMMAND "Subject: No subject given\n" or die $! if !$Subject;
       # nothing
     } elsif( /^From: / && !$IsBody) {
       next if $FromWasUsed;
@@ -440,20 +500,20 @@ print IWJL "SbRt $_\n";
                         # "From: " to go to headers!
 
       if( $From ) {
-        print COMMAND "$From\n";
+        print COMMAND "$From\n" or die $!;
         $From = "";
       } else {
-        print COMMAND;
+        print COMMAND or die $!;
       }
     } elsif( /^Newsgroups: / && !$IsBody ) {
-      print COMMAND "Newsgroups: $Newsgroups\n";
+      print COMMAND "Newsgroups: $Newsgroups\n" or die $!;
     } else {
-      print COMMAND;
+      print COMMAND or die $!;
     }
   }
 
-close( TMPFILE );
-close( COMMAND );
+close( TMPFILE ) or die $!;
+close( COMMAND ) or die "$? $!";
 
 ################################################################## Archiving
 # archive