]> git.donarmstrong.com Git - debbugs.git/blobdiff - scripts/process.in
[project @ 2002-10-06 22:54:48 by cjwatson]
[debbugs.git] / scripts / process.in
index f5f0df20649a571284b64a85711da1ba40d36b9b..b15271cc180bdb8a0d4fd9e3ce5f20d0f193d1e5 100755 (executable)
@@ -1,10 +1,12 @@
 #!/usr/bin/perl
-# $Id: process.in,v 1.37 2001/09/18 20:04:41 joy Exp $
+# $Id: process.in,v 1.49 2002/10/06 22:54:48 cjwatson Exp $
 #
 # Usage: process nn
 # Temps:  incoming/Pnn
 
 use Mail::Address;
+use MIME::Parser;
+
 $config_path = '/org/bugs.debian.org/etc';
 $lib_path = '/org/bugs.debian.org/scripts';
 
@@ -12,7 +14,7 @@ require "$config_path/config";
 require "$lib_path/errorlib";
 $ENV{'PATH'} = $lib_path.':'.$ENV{'PATH'};
 
-chdir( "$gSpoolDir" ) || die 'chdir spool: $!\n';
+chdir( "$gSpoolDir" ) || die "chdir spool: $!\n";
 
 #open(DEBUG,"> /tmp/debbugs.debug");
 umask(002);
@@ -46,68 +48,82 @@ open(M,"incoming/P$nn");
 close(M);
 
 @msg=@log;
-grep(s/\n+$//,@msg);
+chomp @msg;
 
 print DEBUG "###\n",join("##\n",@msg),"\n###\n";
 
 chop($tdate= `date -u '+%a, %d %h %Y %T GMT'`);
 $fwd= <<END;
-X-Loop: $gMaintainerEmail
 Received: via spool by $baddress\@$gEmailDomain id=$nn
           (code $codeletter ref $tryref); $tdate
 END
 
-# Process the message's mail headers
-for ($i=0; $i<=$#msg; $i++) {
-    $_ = $msg[$i];
-    last unless length($_);
-    &quit("looping detected") if m/^x-loop: (\S+)$/i && $1 eq "$gMaintainerEmail";
-    $ins= !m/^subject:/i && !m/^reply-to:/i && !m/^return-path:/i
-       && !m/^From / && !m/^X-Debbugs-CC:/i && !m/^received:/i;
-    $fwd .= $_."\n" if $ins;
-    while ($msg[$i+1] =~ m/^\s/) {
-        $i++;
-        $fwd .= $msg[$i]."\n" if $ins;
-        $_ .= ' '.$msg[$i];
+# header and decoded body respectively
+my (@headerlines, @bodylines);
+
+my $parser = new MIME::Parser;
+mkdir "$gSpoolDir/mime.tmp", 0777;
+$parser->output_under("$gSpoolDir/mime.tmp");
+my $entity = eval { $parser->parse_data(join('',@log)) };
+
+if ($entity and $entity->head->tags) {
+    @headerlines = @{$entity->head->header};
+    chomp @headerlines;
+
+    my $entity_body = getmailbody($entity);
+    @bodylines = $entity_body ? $entity_body->as_lines() : ();
+    chomp @bodylines;
+
+    # set $i to beginning of encoded body data, so we can dump it out
+    # verbatim later
+    $i = 0;
+    ++$i while $msg[$i] =~ /./;
+} else {
+    # Legacy pre-MIME code, kept around in case MIME::Parser fails.
+    for ($i = 0; $i <= $#msg; $i++) {
+       $_ = $msg[$i];
+       last unless length($_);
+       while ($msg[$i+1] =~ m/^\s/) {
+           $i++;
+           $_ .= "\n".$msg[$i];
+       }
+       push @headerlines, $_;
     }
+
+    @bodylines = @msg[$i..$#msg];
+}
+
+for my $hdr (@headerlines) {
+    $_ = $hdr;
+    s/\n\s/ /g;
+    &quit("looping detected")
+       if m/^x-loop: (\S+)$/i && $1 eq "$gMaintainerEmail";
+    my $ins = !m/^subject:/i && !m/^reply-to:/i && !m/^return-path:/i
+           && !m/^From / && !m/^X-Debbugs-CC:/i && !m/^received:/i;
+    $fwd .= $hdr."\n" if $ins;
 # print DEBUG ">$_<\n";
     if (s/^(\S+):\s*//) {
-        $v= $1; $v =~ y/A-Z/a-z/;
-               print DEBUG ">$v=$_<\n";
-        $header{$v}= $_;
+       my $v = lc $1;
+       print DEBUG ">$v=$_<\n";
+       $header{$v} = $_;
     } else {
        print DEBUG "!>$_<\n";
     }
 }
 
-#remove blank lines
-while ($i <= $#msg && !length($msg[$i])) { $fwd .= "\n"; $i++; }
-
-#skips the "this is mime" message and any blank space after it
-if ( $msg[$i] =~ /^This is a multi-part message in MIME format./ )
-{
-       while ( $i <= $#msg && length( $msg[$i] ) ) { $fwd .= $msg[$i] . "\n"; $i++; }
-       while ( $i <= $#msg && !length( $msg[$i] ) ) { $fwd .= "\n"; $i++; }
-}
-#if the lines starts with -- or is nothing but blank space...
-#skip to the next blank line(s) then skip past the blank line(s)
-if ( $msg[$i] =~ /^--/ || $msg[$i] =~ /^\s*$/ )
-{
-       while ( $i <= $#msg && length( $msg[$i] ) ) { $fwd .= $msg[$i] . "\n"; $i++; }
-       while ( $i <= $#msg && !length( $msg[$i] ) ) { $fwd .= "\n"; $i++; }
-}              
+# remove blank lines
+shift @bodylines while @bodylines and $bodylines[0] !~ /\S/;
 
-while (defined ($msg[$i] ) )
+# extract pseudo-headers
+for my $phline (@bodylines)
 {
-       last if ( $msg[$i] !~ m/^([\w]+):\s*(\S.*)/ );
-       $i++;
-       $fn = $1; $fv = $2;
-       print DEBUG ">$fn|$'|\n";
-    $fwd .= $fn.': '.$fv."\n";
-    $fn =~ y/A-Z/a-z/;
-    $fv =~ y/A-Z/a-z/;
-    $pheader{$fn}= $fv;
-       print DEBUG ">$fn~$fv<\n";
+    last if $phline !~ m/^([\w]+):\s*(\S.*)/;
+    my ($fn, $fv) = ($1, $2);
+    print DEBUG ">$fn|$fv|\n";
+    $fn = lc $fn;
+    $fv = lc $fv;
+    $pheader{$fn} = $fv;
+    print DEBUG ">$fn~$fv<\n";
 }
 
 
@@ -127,14 +143,16 @@ $replytocompare= $_;
 print DEBUG "replytocompare >$replytocompare<\n";
     
 if (!defined($header{'subject'})) 
-{      $brokenness.= <<END;
+{
+       $brokenness.= <<END;
 
-Your message did not contain a Subject field.  This is broken, I am
-afraid - the Subject: line is a Required Header according to RFC822.
+Your message did not contain a Subject field. They are recommended and
+useful because the title of a $gBug is determined using this field.
 Please remember to include a Subject field in your messages in future.
-If you did so the fact that it got lost probably indicates a poorly
-configured mail system at your site or an intervening one.
 END
+
+# RFC822 actually lists it as an `optional-field'.
+
     $subject= '(no subject)';
 } else { $subject= $header{'subject'}; }
 
@@ -498,8 +516,8 @@ END
 
 print DEBUG "maintainers >@maintaddrs<\n";
 
-$orgsender= defined($header{'sender'}) ? "Orignal-Sender: $header{'sender'}\n" : '';
-$newsubject= $subject;  $newsubject =~ s/^$gBug#$ref\W*\s*//;
+$orgsender= defined($header{'sender'}) ? "Original-Sender: $header{'sender'}\n" : '';
+$newsubject= $subject;  $newsubject =~ s/^$gBug#$ref:*\s*//;
 
 $xcchdr= $header{ 'x-debbugs-cc' };
 if ($xcchdr =~ m/\S/) {
@@ -520,6 +538,8 @@ Your message has been sent to the package maintainer(s):
 END
 }
 
+push(@resentccs, @addsrcaddrs);
+
 $veryquiet= $codeletter eq 'Q';
 if ($codeletter eq 'M' && !@maintaddrs) {
     $veryquiet= 1;
@@ -724,7 +744,7 @@ Subject: $gBug#$ref: Info received for maintainer only
 Message-ID: <handler.$ref.$nn.ackinfomaint\@$gEmailDomain>
 In-Reply-To: $header{'message-id'}
 References: $header{'message-id'}
-X-$gProject-PR-Message: ack-info $ref
+X-$gProject-PR-Message: ack-info-maintonly $ref
 Reply-To: $ref-maintonly\@$gEmailDomain
 
 Thank you for the additional information you have supplied regarding
@@ -746,8 +766,8 @@ Subject: $gBug#$ref: Info received (was $subject)
 Message-ID: <handler.$ref.$nn.ackinfo\@$gEmailDomain>
 In-Reply-To: $header{'message-id'}
 References: $header{'message-id'}
-X-$gProject-PR-Message: ack-info-maintonly $ref
-Reply-To: $ref\@$gEmailDomain
+X-$gProject-PR-Message: ack-info $ref
+Disabled-Doogie-Reply-To: $ref\@$gEmailDomain
 
 Thank you for the additional information you have supplied regarding
 this problem report.  It has been forwarded to the developer(s) and
@@ -816,79 +836,79 @@ sub get_addresses {
                map { Mail::Address->parse($_) } @_;
 }
 
-
 sub sendmessage {
     local ($msg,@recips) = @_;
     if ($recips[0] eq '' && $#recips == 0) { @recips= ('-t'); }
+    $msg = "X-Loop: $gMaintainerEmail\n" . $msg;
 
     my $hash = get_hashname($ref);
-       #save email to the log
+    #save email to the log
     open(AP,">>db-h/$hash/$ref.log") || &quit("opening db-h/$hash/$ref.log (lo): $!");
     print(AP "\2\n",join("\4",@recips),"\n\5\n$msg\n\3\n") ||
         &quit("writing db-h/$hash/$ref.log (lo): $!");
     close(AP) || &quit("closing db-h/$hash/$ref.log (lo): $!");
     
-       #if debbuging.. save email to a log
-#      open AP, ">>debug";
-#      print AP join( '|', @recips )."\n>>";
-#      print AP get_addresses( @recips );
-#      print AP "<<\n".$msg;
-#      print AP "\n--------------------------------------------------------\n";
-#      close AP;
-
-       #start mailing
-       $_ = '';
+#if debbuging.. save email to a log
+#    open AP, ">>debug";
+#    print AP join( '|', @recips )."\n>>";
+#    print AP get_addresses( @recips );
+#    print AP "<<\n".$msg;
+#    print AP "\n--------------------------------------------------------\n";
+#    close AP;
+
+    #start mailing
+    $_ = '';
     $SIG{'CHLD'}='chldhandle';
-       #print DEBUG "mailing sigchild set up<\n";
-       $chldexit = 'no';
+    #print DEBUG "mailing sigchild set up<\n";
+    $chldexit = 'no';
     $c= open(U,"-|");
-       #print DEBUG "mailing opened pipe fork<\n";
+    #print DEBUG "mailing opened pipe fork<\n";
     defined($c) || die $!;
-       #print DEBUG "mailing opened pipe fork ok $c<\n";
+    #print DEBUG "mailing opened pipe fork ok $c<\n";
     if (!$c) { # ie, we are in the child process
-               #print DEBUG "mailing child<\n";
+       #print DEBUG "mailing child<\n";
         unless (open(STDERR,">&STDOUT")) {
-                       #print DEBUG "mailing child opened stderr<\n";
+           #print DEBUG "mailing child opened stderr<\n";
             print STDOUT "redirect stderr: $!\n";
-                       #print DEBUG "mailing child opened stderr fail<\n";
+           #print DEBUG "mailing child opened stderr fail<\n";
             exit 1;
-                       #print DEBUG "mailing child opened stderr fail exit !?<\n";
+           #print DEBUG "mailing child opened stderr fail exit !?<\n";
         }
-               #print DEBUG "mailing child opened stderr ok<\n";
+       #print DEBUG "mailing child opened stderr ok<\n";
         $c= open(D,"|-");
-               #print DEBUG "mailing child forked again<\n";
+       #print DEBUG "mailing child forked again<\n";
         defined($c) || die $!;
-               #print DEBUG "mailing child forked again ok $c<\n";
+       #print DEBUG "mailing child forked again ok $c<\n";
         if (!$c) { # ie, we are the child process
-                       #print DEBUG "mailing grandchild<\n";
+           #print DEBUG "mailing grandchild<\n";
             exec '/usr/lib/sendmail','-f'."$gMaintainerEmail",'-odq','-oem','-oi',get_addresses(@recips);
-                       #print DEBUG "mailing grandchild exec failed<\n";
+           #print DEBUG "mailing grandchild exec failed<\n";
             die $!;
-                       #print DEBUG "mailing grandchild died !?<\n";
+           #print DEBUG "mailing grandchild died !?<\n";
         }
-               #print DEBUG "mailing child not grandchild<\n";
+       #print DEBUG "mailing child not grandchild<\n";
         print(D $msg) || die $!;
-               #print DEBUG "mailing child printed msg<\n";
+       #print DEBUG "mailing child printed msg<\n";
         close(D);
-               #print DEBUG "mailing child closed pipe<\n";
+       #print DEBUG "mailing child closed pipe<\n";
         die "\n*** command returned exit status $?\n" if $?;
-               #print DEBUG "mailing child exit status ok<\n";
+       #print DEBUG "mailing child exit status ok<\n";
         exit 0;
-               #print DEBUG "mailing child exited ?!<\n";
+       #print DEBUG "mailing child exited ?!<\n";
     }
-       #print DEBUG "mailing parent<\n";
+    #print DEBUG "mailing parent<\n";
     $results='';
-       #print DEBUG "mailing parent results emptied<\n";
+    #print DEBUG "mailing parent results emptied<\n";
     while( $chldexit eq 'no' ) { $results.= $_; }
-       #print DEBUG "mailing parent results read >$results<\n";
+    #print DEBUG "mailing parent results read >$results<\n";
     close(U);
-       #print DEBUG "mailing parent results closed<\n";
+    #print DEBUG "mailing parent results closed<\n";
     $results.= "\n*** child returned exit status $?\n" if $?;
-       #print DEBUG "mailing parent exit status ok<\n";
+    #print DEBUG "mailing parent exit status ok<\n";
     $SIG{'CHLD'}='DEFAULT';
-       #print DEBUG "mailing parent sigchild default<\n";
+    #print DEBUG "mailing parent sigchild default<\n";
     if (length($results)) { &quit("running sendmail: $results"); }
-       #print DEBUG "mailing parent results ok<\n";
+    #print DEBUG "mailing parent results ok<\n";
 }
 
 sub checkmaintainers {
@@ -912,9 +932,22 @@ sub checkmaintainers {
         $maintainerof{$1}= $2;
     }
     close(MAINT);
+    open(SOURCES,"$gPackageSource") || &quit("pkgsrc open: $!");
+    while (<SOURCES>) {
+        next unless m/^(\S+)\s+(\S.*\S)\s*$/;
+       ($a,$b)=($1,$2);
+       $a =~ y/A-Z/a-z/;
+       $pkgsrc{$a} = $b;
+    }
+    close(SOURCES);
     $anymaintfound=0; $anymaintnotfound=0;
     for $p (split(m/[ \t?,()]+/,$s_package)) {
         $p =~ y/A-Z/a-z/;
+       if (defined($pkgsrc{$p})) {
+           push @addsrcaddrs, "$pkgsrc{$p}\@packages.qa.debian.org";
+       } else {
+           push @addsrcaddrs, "$p\@packages.qa.debian.org";
+       }
         if (defined($maintainerof{$p})) {
 print DEBUG "maintainer add >$p|$maintainerof{$p}<\n";
             $addmaint= $maintainerof{$p};