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);
# 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
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
{
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)";
$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;
$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
(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'},
&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)",
$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',
);
&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'};
$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}= '';
}
}
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",
# 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';
$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
${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>".
${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
# 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,
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
}
-my $maintainerschecked = 0;
sub checkmaintainers {
return if $maintainerschecked++;
return if !length($data->{package});
# 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>;