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;
++$i while $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;
-$subject =~ s/^Re:\s*//i; $_= $subject."\n";
+# remove Re: from the subject line
+$subject =~ s/^Re:\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;
}
+my $locks = 0;
my $data;
if (defined $tryref) {
- my $bfound;
- ($bfound, $data)= &lockreadbugmerge($tryref);
- if ($bfound and not $data->{archived}) {
- $ref= $tryref;
+ my $locks_recv;
+ ($locks_recv, $data)= &lockreadbugmerge($tryref);
+ $locks += $locks_recv;
+ if ($locks_recv and not $data->{archived}) {
+ $ref= $tryref;
} else {
&sendmessage(create_mime_message(
[From => "$gMaintainerEmail ($gProject $gBug Tracking System)",
for $ref (@process) {
if ($ref != $orgref) {
&unfilelock;
+ $locks--;
$data = &lockreadbug($ref)
|| die "huh ? $ref from $orgref out of ".join(' ',@process);
+ $locks++;
}
$data->{done}= $set_done if defined($set_done);
$data->{forwarded}= $set_forwarded if defined($set_forwarded);
# 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,@addsrcaddrs,"bugs=$ref\@$gListDomain");
- my $generalbcc = join(', ', $generalcc, @addsrcaddrs,"bugs=$ref\@$gListDomain");
+ my @generalbcc = @generalcc;
+ if (defined $config{subscription_domain} and length $config{subscription_domain}) {
+ @generalbcc = (@generalbcc, @addsrcaddrs);
+ }
+ if (defined $config{bug_subscription_domain} and length $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"};
}
# Send mail to the per bug list subscription too
-push @bccs, "bugs=$ref\@$gListDomain";
+if (defined $config{bug_subscription_domain} and length $config{bug_subscription_domain}) {
+ push @bccs, "bugs=$ref\@$config{bug_subscription_domain}";
+}
if (defined $pheader{source}) {
# Prefix source versions with the name of the source package. They
}
appendlog($ref,$msg);
+# unlock the locks we have received
+while ($locks--) {unfilelock();}
## handle control messages at this point, immediately before finishing
my %clonebugs = (-1 => $ref);
transcript => $transcript,
debug => 0,
ok => \$ok,
+ replyto => $replyto,
);
if ($terminate_control) {
last;
}
}
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";
$p =~ /((?:src:)?[a-z0-9.+-]+)/;
$p = $1;
next unless defined $p;
- if (defined $gSubscriptionDomain) {
+ if (defined $config{subscription_domain} and length $config{subscription_domain}) {
my @source = binary_to_source(binary => $p,
source_only => 1,
);
if (@source) {
push @addsrcaddrs,
- map {"$_\@$gSubscriptionDomain"} @source;
+ map {"$_\@$config{subscription_domain}"} @source;
} else {
- push @addsrcaddrs, "$p\@$gSubscriptionDomain";
+ push @addsrcaddrs, "$p\@$config{subscription_domain}";
}
}
# this is utter hackery until we switch to Debbugs::Recipients