use warnings;
use strict;
-use POSIX qw(strftime);
+use locale;
+use POSIX qw(strftime locale_h);
+setlocale(LC_TIME, "C");
use IO::File;
if ($DEBUG > 0) {
$debugfh = \*STDERR;
}
+binmode($debugfh,':raw:encoding(UTF-8)');
# these are the valid bug addresses
my %baddress = (B => 'submit',
my @common_headers;
for my $hdr (@headerlines) {
+ my $orig_hdr = $hdr;
$hdr = decode_rfc1522($hdr);
$_ = $hdr;
s/\n\s/ /g;
finish() 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-/i;
- $fwd .= $hdr."\n" if $ins;
+ $fwd .= encode_utf8($hdr)."\n" if $ins;
# print {$debugfh} ">$_<\n";
if (s/^(\S+):\s*//) {
my $v = lc $1;
# Remove BOM markers from UTF-8 strings
# Fixes #488554
$phline =~ s/\xef\xbb\xbf//g;
+ $phline =~ s/\N{U+FEFF}//g;
last if $phline !~ m/^([\w-]+):\s*(\S.*)/;
my ($fn, $fv) = ($1, $2);
$fv =~ s/\s*$//;
# set $i to beginning of encoded body data, so we can dump it out
# verbatim later
my $i = 0;
-++$i while $msg[$i] =~ /./;
+++$i while $i <= $#msg and $msg[$i] =~ /./;
$fwd .= join("\n",@msg[$i..$#msg]);
+binmode($debugfh,':raw');
print {$debugfh} "***\n$fwd\n***\n";
+binmode($debugfh,':raw:encoding(UTF-8)');
if (defined $header{'resent-from'} && !defined $header{'from'}) {
$header{'from'} = $header{'resent-from'};
my $ref=-1;
# remove Re: from the subject line
$subject =~ s/^Re:\s*//i;
-# remove remaining mailing list name markers from the subject line
-$subject =~ s/^\[.*\]\s*//i;
+# remove remaining mailing list name markers from the subject line if
+# this appears to be a message that has traversed a mailing list
+if (exists $header{'list-id'} or exists $header{'list-subscribe'} or
+ (exists $header{'precedence'} and defined $header{'precedence'} and
+ $header{'precedence'} eq 'bulk') or
+ exists $header{'mailing-list'} or exists $header{'list-processor-version'}
+ ){
+ # if a mailing list didn't match any of the above, it's probably
+ # so horribly configured that we wouldn't be able to figure it out
+ # anyway.
+ $subject =~ s/^\[.*\]\s*//i;
+}
$_= $subject."\n";
if (not defined $tryref and m/^Bug ?\#(\d+)\D/i) {
$tryref = $1 if $1 > 0;
# Add bug mailing list to $generalbcc as appropriate
# This array is used to specify bcc in the cases where we're using create_mime_message.
my @generalbcc = @generalcc;
- my $generalbcc = $generalcc;
if (defined $config{subscription_domain} and length $config{subscription_domain}) {
- my @generalbcc = (@generalbcc, @addsrcaddrs);
- my $generalbcc = join(', ', $generalbcc, @addsrcaddrs);
+ @generalbcc = (@generalbcc, @addsrcaddrs);
}
if (defined $config{bug_subscription_domain} and length $config{bug_subscription_domain}) {
- my @generalbcc = (@generalbcc, "bugs=$ref\@$config{bug_subscription_domain}");
- my $generalbcc = join(', ', $generalbcc, "bugs=$ref\@$config{bug_subscription_domain}");
+ @generalbcc = (@generalbcc, "bugs=$ref\@$config{bug_subscription_domain}");
}
+ my $generalbcc = join(', ', @generalbcc);
$generalbcc =~ s/\s+\n\s+/ /g;
$generalbcc =~ s/^\s+/ /; $generalbcc =~ s/\s+$//;
if (length $generalbcc) {$generalbcc = "Bcc: $generalbcc\n"};
Subject => "$gBug#$ref closed by $markedby ($header{'subject'})",
"Message-ID" => "<handler.$ref.$nn.notifdone\@$gEmailDomain>",
(defined $data->{msgid})?("In-Reply-To" => $data->{msgid}):(),
- References => join(' ',grep {defined $_} ($header{'message-id'},$data->{msgid})),
+ References => join(' ',grep {defined $_} ($header{'message-id'},$data->{msgid},'')),
"X-$gProject-PR-Message" => "they-closed $ref",
- "X-$gProject-PR-Package" => "$data->{package}",
- "X-$gProject-PR-Keywords" => "$data->{keywords}",
+ (defined $data->{package})?("X-$gProject-PR-Package" => $data->{package}):(),
+ (defined $data->{keywords})?("X-$gProject-PR-Keywords" => $data->{keywords}):(),
# Only have a X-$gProject-PR-Source when we know the source package
(defined($source_package) and length($source_package))?("X-$gProject-PR-Source" => $source_package):(),
"Reply-To" => "$ref\@$gEmailDomain",
request_subject => $header{subject},
request_nn => $nn,
request_replyto => $replyto,
- message => $msg,
+ message => [$msg],
affected_bugs => \%bug_affected,
affected_packages => \%affected_packages,
recipients => \%recipients,
}
}
else {
+ print {$transcript} "Unknown command or malformed arguments to command.\n\n";
$errors++;
if (++$unknowns >= 5) {
print {$transcript} "Too many unknown commands, stopping here.\n\n";
address_only => 1,
cc => 1,
);
- my $error_text = $errors > 0 ? " (with $errors errors)":'';
+ my $error_text = $errors > 0 ? " (with $errors error" . ($errors > 1 ? "s" : "") . ")" : "";
my $reply =
create_mime_message(['X-Loop' => $gMaintainerEmail,
From => "$gMaintainerEmail ($gProject $gBug Tracking System)",
write_log_records(logfh => $logfh,
records => {text => stripbccs($msg),
type => 'recips',
- recips => [@{$recips}],
+ recips => [map {encode_utf8($_)} @{$recips}],
},
);
if (ref($bcc)) {