]> git.donarmstrong.com Git - debbugs.git/blobdiff - scripts/process.in
* Properly handle \n line terminated emails
[debbugs.git] / scripts / process.in
index 7c3a6f6e7832ef7cc95111c4485b86789ac9f884..e17127b8831e2eb61882263afb5490bde1caf1bd 100755 (executable)
@@ -9,6 +9,8 @@ use strict;
 
 use POSIX qw(strftime);
 
+use IO::File;
+
 use MIME::Parser;
 use Debbugs::MIME qw(decode_rfc1522 create_mime_message getmailbody);
 use Debbugs::Mail qw(send_mail_message encode_headers);
@@ -75,6 +77,8 @@ END
 # header and decoded body respectively
 my (@headerlines, @bodylines);
 
+# whether maintainer addresses have been checked
+our $maintainerschecked = 0;
 #maintainer address for this message
 our @maintaddrs;
 # other src addresses
@@ -100,8 +104,8 @@ if ($entity and $entity->head->tags) {
     chomp @headerlines;
 
     my $entity_body = getmailbody($entity);
-    @bodylines = $entity_body ? $entity_body->as_lines() : ();
-    chomp @bodylines;
+    @bodylines = map {s/\r?\n$//; $_;}
+        $entity_body ? $entity_body->as_lines() : ();
 
     # set $i to beginning of encoded body data, so we can dump it out
     # verbatim later
@@ -262,8 +266,9 @@ if ($codeletter eq 'D' || $codeletter eq 'F')
 {
     if ($replyto =~ m/$gBounceFroms/o ||
         $header{'from'} =~ m/$gBounceFroms/o)
-    { 
-        &quit("bounce detected !  Mwaap! Mwaap!"); 
+    {
+        print STDERR "bounce detected !  Mwaap! Mwaap!";
+        exit 1;
     }
     my $markedby= $header{'from'} eq $replyto ? $replyto :
                "$header{'from'} (reply to $replyto)";
@@ -289,7 +294,7 @@ if ($codeletter eq 'D' || $codeletter eq 'F')
            $generalcc=''; 
         }
     } else { # Done
-        if (length($data->{done}) and
+        if (defined $data->{done} and length($data->{done}) and
                 not defined $pheader{'source-version'} and
                 not defined $pheader{'version'}) {
             &appendlog;
@@ -354,10 +359,24 @@ if ($codeletter eq 'D' || $codeletter eq 'F')
             $data->{keywords} = join ' ', grep $_ ne 'pending',
                                      split ' ', $data->{keywords};
             if (defined $pheader{'source-version'}) {
-                addfixedversions($data, $pheader{source}, $pheader{'source-version'}, '');
-            } elsif (defined $pheader{version}) {
-                addfixedversions($data, $pheader{package}, $pheader{version}, 'binary');
-            }
+                if ($pheader{'source-version'} !~ m/^$config{package_version_re}$/) {
+                     $brokenness .= fill_template('mail/invalid_version',
+                                                  {version => $pheader{'source-version'}},
+                                                 );
+                }
+                else {
+                     addfixedversions($data, $pheader{source}, $pheader{'source-version'}, '');
+                }
+           } elsif (defined $pheader{version}) {
+                if ($pheader{version} !~ m/^$config{package_version_re}$/) {
+                     $brokenness .= fill_template('mail/invalid_version',
+                                                  {version => $pheader{version}},
+                                                 );
+                }
+                else {
+                     addfixedversions($data, $pheader{package}, $pheader{version}, '');
+                }
+           }
         }
 
        # Add bug mailing list to $generalbcc as appropriate
@@ -437,7 +456,7 @@ if ($codeletter eq 'D' || $codeletter eq 'F')
              (defined($source_package) and length($source_package))?("X-$gProject-PR-Source" => $source_package):(),
               "Reply-To"                => "$ref\@$gEmailDomain",
               "Content-Type"            => 'text/plain; charset="utf-8"',
-             ],message_body_template('mail/process_mark_as_done',
+             ],message_body_template('mail/process_your_bug_done',
                                     {data      => $data,
                                      markedby  => $markedby,
                                      messageid => $header{'message-id'},
@@ -451,8 +470,8 @@ if ($codeletter eq 'D' || $codeletter eq 'F')
     &finish;
 }
 
-if ($ref<0) {
-    if ($codeletter eq 'U') {
+if ($ref<0) { # new bug report
+    if ($codeletter eq 'U') { # -submitter
         &htmllog("Warning","sent",$replyto,"Message not forwarded.");
        &sendmessage(create_mime_message(
           [From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
@@ -482,7 +501,10 @@ if ($ref<0) {
         $data->{package} = $pheader{source};
     } elsif (defined $pheader{package}) {
         $data->{package} = $pheader{package};
-    } else {
+    } elsif (defined $config{default_package}) {
+       $data->{package} = $config{default_package},
+    }
+    else {
        &htmllog("Warning","sent",$replyto,"Message not forwarded.");
        my $body = message_body_template('mail/process_no_package',
                                        );
@@ -508,6 +530,22 @@ if ($ref<0) {
        &finish;
     }
 
+    if (defined $config{default_package}) {
+        &checkmaintainers;
+        # if there are no maintainers for this package, assign it to the default package
+        if (not @maintaddrs) {
+             $data->{package} = $config{default_package};
+             $brokenness.= fill_template('mail/process_default_package_selected',
+                                         {old_package => $pheader{source} || $pheader{package} || 'No package',
+                                          new_package => $data->{package},
+                                         }
+                                        );
+             # force the maintainers to be rechecked
+             $maintainerschecked = 0;
+             &checkmaintainers;
+        }
+    }
+
     $data->{keywords}= '';
     if (defined($pheader{'keywords'})) {
         $data->{keywords}= $pheader{'keywords'};
@@ -529,9 +567,9 @@ if ($ref<0) {
        $data->{severity} =~ s/^\s*(.+)\s*$/$1/;
 
        if (!grep($_ eq $data->{severity}, @gSeverityList, "$gDefaultSeverity")) {
-            $brokenness.= fill_in_template('mail/invalid_severity',
-                                          {severity=>$data->{severity}}
-                                         );
+            $brokenness.= fill_template('mail/invalid_severity',
+                                       {severity=>$data->{severity}}
+                                      );
             $data->{severity}= '';
         }
     }
@@ -577,9 +615,9 @@ if ($ref<0) {
              write_usertags(\%user_tags,$user);
         }
         else {
-             $brokenness .= fill_in_template('mail/invalid_user',
-                                             {user => $user}
-                                            );
+             $brokenness .= fill_template('mail/invalid_user',
+                                          {user => $user}
+                                         );
         }
     }
     &overwrite("db-h/$hash/$ref.report",
@@ -622,15 +660,38 @@ if (defined $pheader{source}) {
     # appear that way in version trees so that we can deal with binary
     # packages moving from one source package to another.
     if (defined $pheader{'source-version'}) {
-        addfoundversions($data, $pheader{source}, $pheader{'source-version'}, '');
+        if ($pheader{'source-version'} !~ m/^$config{package_version_re}$/) {
+             $brokenness .= fill_template('mail/invalid_version',
+                                          {version => $pheader{'source-version'}},
+                                         );
+        }
+        else {
+             addfoundversions($data, $pheader{source}, $pheader{'source-version'}, '');
+        }
     } elsif (defined $pheader{version}) {
-        addfoundversions($data, $pheader{source}, $pheader{version}, '');
+        if ($pheader{version} !~ m/^$config{package_version_re}$/) {
+             $brokenness .= fill_template('mail/invalid_version',
+                                          {version => $pheader{version}},
+                                         );
+        }
+        else {
+             addfoundversions($data, $pheader{source}, $pheader{version}, '');
+        }
     }
     writebug($ref, $data);
 } elsif (defined $pheader{package}) {
     # TODO: could handle Source-Version: by looking up the source package?
-    addfoundversions($data, $pheader{package}, $pheader{version}, 'binary');
-    writebug($ref, $data);
+     if (defined $pheader{version}) {
+         if ($pheader{version} !~ m/^$config{package_version_re}$/) {
+              $brokenness .= fill_template('mail/invalid_version',
+                                           {version => $pheader{version}},
+                                          );
+         }
+         else {
+              addfoundversions($data, $pheader{package}, $pheader{version}, 'binary');
+         }
+     }
+     writebug($ref, $data);
 }
 
 my $veryquiet= $codeletter eq 'Q';
@@ -648,7 +709,7 @@ if (length($resentccval)) {
     $resentcc= "Resent-CC: $resentccval\n"; 
 }
 
-if ($codeletter eq 'U') {
+if ($codeletter eq 'U') { # sent to -submitter
     &htmllog("Message", "sent on", $data->{originator}, "$gBug#$ref.");
     &sendmessage(<<END,[$data->{originator},@resentccs],[@bccs]);
 Subject: $gBug#$ref: $newsubject
@@ -663,6 +724,7 @@ X-$gProject-PR-Keywords: $data->{keywords}
 ${source_pr_header}$fwd
 END
 } elsif ($codeletter eq 'B') { # Sent to submit
+    my $report_followup = $newref ? 'report' : 'followup';
     &htmllog($newref ? "Report" : "Information", "forwarded",
              join(', ',"$gSubmitList\@$gListDomain",@resentccs),
              "<code>$gBug#$ref</code>".
@@ -676,7 +738,7 @@ ${orgsender}Resent-To: $gSubmitList\@$gListDomain
 ${resentcc}Resent-Date: $tdate
 Resent-Message-ID: <handler.$ref.$nn\@$gEmailDomain>
 Resent-Sender: $gMaintainerEmail
-X-$gProject-PR-Message: report $ref
+X-$gProject-PR-Message: $report_followup $ref
 X-$gProject-PR-Package: $data->{package}
 X-$gProject-PR-Keywords: $data->{keywords}
 ${source_pr_header}$fwd
@@ -685,6 +747,7 @@ END
     # D and F done far earlier; B just done - so this must be M or Q
     # We preserve whichever it was in the Reply-To (possibly adding
     # the $gBug#).
+    my $report_followup = $newref ? 'report' : 'followup';
     if (@resentccs) {
         &htmllog($newref ? "Report" : "Information", "forwarded",
                  $resentccval,
@@ -706,7 +769,7 @@ ${orgsender}Resent-To: $resentccval
 Resent-Date: $tdate
 Resent-Message-ID: <handler.$ref.$nn\@$gEmailDomain>
 Resent-Sender: $gMaintainerEmail
-X-$gProject-PR-Message: report $ref
+X-$gProject-PR-Message: $report_followup $ref
 X-$gProject-PR-Package: $data->{package}
 X-$gProject-PR-Keywords: $data->{keywords}
 ${source_pr_header}$fwd
@@ -985,7 +1048,6 @@ sub fill_template{
 }
 
 
-my $maintainerschecked = 0;
 sub checkmaintainers {
     return if $maintainerschecked++;
     return if !length($data->{package});
@@ -1070,7 +1132,7 @@ sub bug_list_forward{
      # the mailing list
      my ($bug_number) = $bug_fn =~ /^L(\d+)\./;
      my ($bfound, $data)= lockreadbugmerge($bug_number);
-     my $bug_fh = new IO::File "incoming/P$bug_fn" or die "Unable to open incoming/P$bug_fn $!";
+     my $bug_fh = IO::File->new("incoming/P$bug_fn",'r') or die "Unable to open incoming/P$bug_fn $!";
 
      local $/ = undef;
      my $bug_message = <$bug_fh>;