X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~webstump/git?a=blobdiff_plain;f=stump%2Fbin%2Fsubmission.pl;h=d19c3ba9eaa08d6f64a8d94964b3d759889dd2ca;hb=bf46be8bbf6faf94da6ca687f6a61b1c78a03879;hp=73c72398696eb35a83bc9cf039e1d52209c9ff66;hpb=fea9ba5fbcb59686380c2b6c590a4b21b54af561;p=modbot-urcm.git diff --git a/stump/bin/submission.pl b/stump/bin/submission.pl index 73c7239..d19c3ba 100755 --- a/stump/bin/submission.pl +++ b/stump/bin/submission.pl @@ -282,6 +282,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; } @@ -306,9 +309,70 @@ sub readMessage { 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 = $_; + $_ = $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( $_ ) ) {