X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scripts%2Fprocess;h=2f4341c7a60c115a01d8075049e07f975fbd05c0;hb=4118f90e5b711616eeff28aef36615b0a892b57f;hp=5b7175f5d032c57c8e7de9e627f7564fa1130581;hpb=530fa81af8a7dd6319009bc5be7d6e70ff427473;p=debbugs.git diff --git a/scripts/process b/scripts/process index 5b7175f..2f4341c 100755 --- a/scripts/process +++ b/scripts/process @@ -7,7 +7,9 @@ use warnings; use strict; -use POSIX qw(strftime); +use locale; +use POSIX qw(strftime locale_h); +setlocale(LC_TIME, "C"); use IO::File; @@ -77,6 +79,7 @@ my $debugfh = IO::File->new('/dev/null','w') or if ($DEBUG > 0) { $debugfh = \*STDERR; } +binmode($debugfh,':raw:encoding(UTF-8)'); # these are the valid bug addresses my %baddress = (B => 'submit', @@ -172,13 +175,14 @@ my %header; 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; @@ -220,6 +224,7 @@ for my $phline (@bodylines) # 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*$//; @@ -243,10 +248,12 @@ for my $key (grep /X-Debbugs-.*/i, keys %pheader) { # 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'}; @@ -271,7 +278,21 @@ if (!defined($header{'subject'})) } 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; } @@ -443,8 +464,14 @@ if ($codeletter eq 'D' || $codeletter eq 'F') # 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"}; @@ -514,10 +541,10 @@ if ($codeletter eq 'D' || $codeletter eq 'F') Subject => "$gBug#$ref closed by $markedby ($header{'subject'})", "Message-ID" => "", (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", @@ -717,7 +744,9 @@ if (defined $gStrongList and isstrongseverity($data->{severity})) { } # 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 @@ -986,7 +1015,7 @@ if (@control_bits) { request_subject => $header{subject}, request_nn => $nn, request_replyto => $replyto, - message => $msg, + message => [$msg], affected_bugs => \%bug_affected, affected_packages => \%affected_packages, recipients => \%recipients, @@ -1017,12 +1046,14 @@ if (@control_bits) { 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"; @@ -1039,7 +1070,7 @@ if (@control_bits) { 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)", @@ -1177,7 +1208,7 @@ sub sendmessage { write_log_records(logfh => $logfh, records => {text => stripbccs($msg), type => 'recips', - recips => [@{$recips}], + recips => [map {encode_utf8($_)} @{$recips}], }, ); if (ref($bcc)) { @@ -1255,15 +1286,15 @@ sub checkmaintainers { $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