From: Don Armstrong Date: Sat, 12 Aug 2017 15:58:14 +0000 (-0700) Subject: Merge remote-tracking branch 'local/master' into database X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=6d1e6305f448ad7f449eb650f4ecde192c41b0c4;hp=843f99899246e5de77be737c59dd336fb6783948;p=debbugs.git Merge remote-tracking branch 'local/master' into database --- diff --git a/Debbugs/CGI.pm b/Debbugs/CGI.pm index c70f682..0f44943 100644 --- a/Debbugs/CGI.pm +++ b/Debbugs/CGI.pm @@ -17,8 +17,6 @@ Debbugs::CGI -- General routines for the cgi scripts use Debbugs::CGI qw(:url :html); -html_escape(bug_url($ref,mbox=>'yes',mboxstatus=>'yes')); - =head1 DESCRIPTION This module is a replacement for parts of common.pl; subroutines in @@ -64,8 +62,8 @@ BEGIN{ $DEBUG = 0 unless defined $DEBUG; @EXPORT = (); - %EXPORT_TAGS = (url => [qw(bug_url bug_links bug_linklist maybelink), - qw(set_url_params pkg_url version_url), + %EXPORT_TAGS = (url => [qw(bug_links bug_linklist maybelink), + qw(set_url_params version_url), qw(submitterurl mainturl munge_url), qw(package_links bug_links), ], @@ -108,44 +106,6 @@ sub set_url_params{ } -=head2 bug_url - - bug_url($ref,mbox=>'yes',mboxstat=>'yes'); - -Constructs urls which point to a specific - -XXX use Params::Validate - -=cut - -sub bug_url{ - my $ref = shift; - my %params; - if (@_ % 2) { - shift; - %params = (%URL_PARAMS,@_); - } - else { - %params = @_; - } - carp "bug_url is deprecated, use bug_links instead"; - - return munge_url('bugreport.cgi?',%params,bug=>$ref); -} - -sub pkg_url{ - my %params; - if (@_ % 2) { - shift; - %params = (%URL_PARAMS,@_); - } - else { - %params = @_; - } - carp "pkg_url is deprecated, use package_links instead"; - return munge_url('pkgreport.cgi?',%params); -} - =head2 munge_url my $url = munge_url($url,%params_to_munge); @@ -633,8 +593,7 @@ link class C<$class>. XXX Use L; we want to be able to support query arguments here too; we should be able to combine bug_links and this -function into one. [Hell, bug_url should be one function with this one -too.] +function into one. =cut diff --git a/Debbugs/CGI/Bugreport.pm b/Debbugs/CGI/Bugreport.pm index dccae95..4a47506 100644 --- a/Debbugs/CGI/Bugreport.pm +++ b/Debbugs/CGI/Bugreport.pm @@ -466,6 +466,7 @@ sub handle_record{ # this will be cleaned up once it goes out of scope my $tempdir = File::Temp->newdir(); $parser->output_under($tempdir->dirname()); + $parser->filer->ignore_filename(1); my $entity; if ($record->{inner_file}) { $entity = $parser->parse($record->{fh}); @@ -506,9 +507,7 @@ sub __libravatar_url { __END__ - - - - - - +# Local Variables: +# cperl-indent-level: 4 +# indent-tabs-mode: nil +# End: diff --git a/Debbugs/CGI/Pkgreport.pm b/Debbugs/CGI/Pkgreport.pm index 4391197..e64300a 100644 --- a/Debbugs/CGI/Pkgreport.pm +++ b/Debbugs/CGI/Pkgreport.pm @@ -367,7 +367,6 @@ sub pkg_htmlizebugs { ); my $html = "
  • "; ##%d: %s\n
    ", - #bug_url($bug), $bug, html_escape($status{subject}); $html .= short_bug_status_html(status => \%status, options => $param{options}, ) . "\n"; diff --git a/Debbugs/Log/Spam.pm b/Debbugs/Log/Spam.pm index ab0bc7c..a2fe44c 100644 --- a/Debbugs/Log/Spam.pm +++ b/Debbugs/Log/Spam.pm @@ -8,7 +8,8 @@ package Debbugs::Log::Spam; =head1 NAME -Debbugs::Log::Spam -- an interface to debbugs .log.spam files +Debbugs::Log::Spam -- an interface to debbugs .log.spam files and .log.spam.d +directories =head1 SYNOPSIS @@ -18,6 +19,9 @@ my $spam = Debbugs::Log::Spam->new(bug_num => '12345'); =head1 DESCRIPTION +Spam in bugs can be excluded using a .log.spam file and a .log.spam.d directory. +The file contains message ids, one per line, and the directory contains files +named after message ids, one per file. =head1 BUGS @@ -120,7 +124,18 @@ sub _init { chomp; $self->{spam}{$_} = 1; } - close ($fh); + close ($fh) or + croak "Unable to close bug log filehandle: $!"; + } + if (-d $self->{name}.'.d') { + opendir(my $d,$self->{name}.'.d') or + croak "Unable to open bug log spamdir '$self->{name}.d' for reading: $!"; + for my $dir (readdir($d)) { + next unless $dir =~ m/([^\.].*)_(\w+)$/; + $self->{spam}{$1} = 1; + } + closedir($d) or + croak "Unable to close bug log spamdir: $!"; } return $self; } diff --git a/Debbugs/Text.pm b/Debbugs/Text.pm index 3c34b97..1edb174 100644 --- a/Debbugs/Text.pm +++ b/Debbugs/Text.pm @@ -45,11 +45,8 @@ BEGIN { @EXPORT_OK = (); Exporter::export_ok_tags(qw(templates)); $EXPORT_TAGS{all} = [@EXPORT_OK]; - push @ISA,qw(Safe::Hole::User); } -use Safe; -use Safe::Hole; use Text::Template; use Storable qw(dclone); @@ -63,7 +60,6 @@ use Data::Dumper; our %tt_templates; our %filled_templates; -our $safe; our $language; # This function is what is called when someone does include('foo/bar') @@ -72,7 +68,7 @@ our $language; sub include { my $template = shift; $filled_templates{$template}++; - print STDERR "include template $template language $language safe $safe\n" if $DEBUG; + print STDERR "include template $template language $language\n" if $DEBUG; # Die if we're in a template loop die "Template loop with $template" if $filled_templates{$template} > 10; my $filled_tmpl = ''; @@ -80,7 +76,6 @@ sub include { $filled_tmpl = fill_in_template(template => $template, variables => {}, language => $language, - safe => $safe, ); }; if ($@) { @@ -126,7 +121,6 @@ sub fill_in_template{ }, }, ); - #@param{qw(template variables language safe output hole_var no_safe)} = @_; if ($DEBUG) { print STDERR "fill_in_template "; print STDERR join(" ",map {exists $param{$_}?"$_:$param{$_}":()} keys %param); @@ -154,41 +148,6 @@ sub fill_in_template{ die "Unable to find template $param{template} with language $param{language}"; } -# if (defined $param{safe}) { -# $safe = $param{safe}; -# } -# else { -# print STDERR "Created new safe\n" if $DEBUG; -# $safe = Safe->new() or die "Unable to create safe compartment"; -# $safe->permit_only(':base_core',':base_loop',':base_mem', -# qw(padsv padav padhv padany), -# qw(rv2gv refgen srefgen ref), -# qw(caller require entereval), -# qw(gmtime time sprintf prtf), -# qw(sort), -# ); -# $safe->share('*STDERR'); -# $safe->share('%config'); -# $hole->wrap(\&Debbugs::Text::include,$safe,'&include'); -# my $root = $safe->root(); -# # load variables into the safe -# for my $key (keys %{$param{variables}||{}}) { -# print STDERR "Loading $key\n" if $DEBUG; -# if (ref($param{variables}{$key})) { -# no strict 'refs'; -# print STDERR $safe->root().'::'.$key,qq(\n) if $DEBUG; -# *{"${root}::$key"} = $param{variables}{$key}; -# } -# else { -# no strict 'refs'; -# ${"${root}::$key"} = $param{variables}{$key}; -# } -# } -# for my $key (keys %{exists $param{hole_var}?$param{hole_var}:{}}) { -# print STDERR "Wraping $key as $param{hole_var}{$key}\n" if $DEBUG; -# $hole->wrap($param{hole_var}{$key},$safe,$key); -# } -# } $language = $param{language}; my $tt; if ($tt_type eq 'FILE' and @@ -219,8 +178,7 @@ sub fill_in_template{ if (not defined $tt) { die "Unable to create Text::Template for $tt_type:$tt_source"; } - my $ret = $tt->fill_in(#SAFE => $safe, - PACKAGE => 'DTT', + my $ret = $tt->fill_in(PACKAGE => 'DTT', HASH => {%{$param{variables}//{}}, (map {my $t = $_; $t =~ s/^\&//; ($t => $param{hole_var}{$_})} keys %{$param{hole_var}//{}}), @@ -236,10 +194,7 @@ sub fill_in_template{ if ($DEBUG) { no strict 'refs'; no warnings 'uninitialized'; -# my $temp = $param{nosafe}?'main':$safe->{Root}; print STDERR "Variables for $param{template}\n"; -# print STDERR "Safe $temp\n"; -# print STDERR map {"$_: ".*{$_}."\n"} keys %{"${temp}::"}; } return $ret; diff --git a/bin/local-debbugs b/bin/local-debbugs index 0223da1..4825923 100755 --- a/bin/local-debbugs +++ b/bin/local-debbugs @@ -17,7 +17,7 @@ local-debbugs - use a local mirror of debbugs =head1 SYNOPSIS - [options] + local-debbugs [options] Options: --mirror, -M update local mirror @@ -113,16 +113,15 @@ use vars qw($DEBUG); use User; use Config::Simple; +use File::Basename qw(dirname); use File::Temp qw(tempdir); use Params::Validate qw(validate_with :types); use POSIX 'setsid'; -use Debbugs::Common qw(checkpid lockpid get_hashname); -use Debbugs::Mail qw(get_addresses); use SOAP::Lite; use IPC::Run; use IO::File; use File::Path; - +use File::Spec; my %options = (debug => 0, help => 0, @@ -130,8 +129,7 @@ my %options = (debug => 0, verbose => 0, quiet => 0, detach => 1, - cgi_bin => '/var/lib/debbugs/www/cgi', - css => '/var/lib/debbugs/www/bugs.css', + git_mode => -d (dirname(__FILE__).'/../.git') ? 1 : 0, bug_site => 'bugs.debian.org', bug_mirror => 'bugs-mirror.debian.org', ); @@ -151,6 +149,22 @@ GetOptions(\%options, 'bug_mirror|bug-mirror=s', 'debug|d+','help|h|?','man|m'); +if ($options{git_mode}) { + my $base_dir = dirname(File::Spec->rel2abs(dirname(__FILE__))); + $options{cgi_bin} = "$base_dir/cgi" unless defined $options{cgi_bin}; + $options{css} = "$base_dir/html/bugs.css" unless defined $options{css}; + $options{template_dir} = "$base_dir/templates"; + $options{base_dir} = $base_dir; + eval "use lib '$options{base_dir}'"; +} else { + $options{cgi_bin} = '/var/lib/debbugs/www/cgi'; + $options{css} = '/var/lib/debbugs/www/bugs.css'; + $options{template_dir} = "/usr/share/debbugs/templates"; +} + +eval "use Debbugs::Common qw(checkpid lockpid get_hashname)"; +eval "use Debbugs::Mail qw(get_addresses)"; + pod2usage() if $options{help}; pod2usage({verbose=>2}) if $options{man}; @@ -188,6 +202,7 @@ if ($options{daemon}) { print {$conf} <<"EOF"; \$gConfigDir = "$options{mirror_location}"; \$gSpoolDir = "$options{mirror_location}"; +\$gTemplateDir = "$options{template_dir}"; \$gWebHost = 'localhost:$options{port}'; \$gPackageSource = ''; \$gPseudoDescFile = ''; @@ -224,6 +239,7 @@ EOF package local_debbugs::server; use IO::File; use HTTP::Server::Simple; + use File::Basename qw(dirname); use base qw(HTTP::Server::Simple::CGI HTTP::Server::Simple::CGI::Environment); sub net_server { @@ -279,10 +295,13 @@ EOF redirect($cgi,$base_uri."/cgi-bin/pkgreport.cgi?pkg=$1"); } elsif ($path =~ m{^/?cgi(?:-bin)?/((?:(?:bug|pkg)report|version)\.cgi)}) { - # dispatch to pkgreport.cgi - #print "HTTP/1.1 200 OK\n"; - open(my $fh,'-|',"$options{cgi_bin}/$1") or - die "Unable to execute $options{cgi_bin}/$1"; + my @exec_options = "$options{cgi_bin}/$1"; + if ($options{git_mode}) { + unshift @exec_options, + 'perl','-I',$options{base_dir},'-T'; + } + open(my $fh,'-|',@exec_options) or + die "Unable to execute $options{cgi_bin}/$1"; my $status; my $cache = ''; while (<$fh>) { @@ -548,7 +567,7 @@ sub select_bugs{ elsif (/\s\w+\:/) { push @bug_selections, $_; } - } + } } # Split archive:both into archive:1 and archive:0 @bug_selections = @@ -599,8 +618,16 @@ sub select_bugs{ $bugs{$archived_bugs}{$_} = 1 for @{$bugs}; } } + for my $bug (@bugs) { + $bugs{archived}{$bug} = 1; + $bugs{unarchived}{$bug} = 1; + } return \%bugs; } __END__ +# Local Variables: +# cperl-indent-level: 4 +# indent-tabs-mode: nil +# End: diff --git a/cgi/bugreport.cgi b/cgi/bugreport.cgi index 7d3911a..51744b2 100755 --- a/cgi/bugreport.cgi +++ b/cgi/bugreport.cgi @@ -29,7 +29,7 @@ use Debbugs::Status qw(splitpackages split_status_fields get_bug_status isstrong use Scalar::Util qw(looks_like_number); use Debbugs::Text qw(:templates); - +use URI::Escape qw(uri_escape_utf8); use List::AllUtils qw(max); @@ -274,8 +274,8 @@ END next if @records > 1 and $spam->is_spam($msg_id); my @lines; if ($record->{inner_file}) { - push @lines, $record->{fh}->getline; - push @lines, $record->{fh}->getline; + push @lines, scalar $record->{fh}->getline; + push @lines, scalar $record->{fh}->getline; chomp $lines[0]; chomp $lines[1]; } else { @@ -454,13 +454,13 @@ print fill_in_template(template => 'cgi/bugreport', msg => $msg, isstrongseverity => \&Debbugs::Status::isstrongseverity, html_escape => \&Debbugs::CGI::html_escape, + uri_escape => \&URI::Escape::uri_escape_utf8, looks_like_number => \&Scalar::Util::looks_like_number, make_list => \&Debbugs::Common::make_list, }, hole_var => {'&package_links' => \&Debbugs::CGI::package_links, '&bug_links' => \&Debbugs::CGI::bug_links, '&version_url' => \&Debbugs::CGI::version_url, - '&bug_url' => \&Debbugs::CGI::bug_url, '&strftime' => \&POSIX::strftime, '&maybelink' => \&Debbugs::CGI::maybelink, }, diff --git a/debian/changelog b/debian/changelog index 41458cf..fc974f2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -57,6 +57,10 @@ debbugs (2.6.0~exp1) UNRELEASED; urgency=low path if the sendmail default is wrong. (Closes: #719205) * Fix links to merged and blocked bugs. (Closes: #539691) * Strip out Mail-Followup-To: (Closes: #798092) + * Include references from the original message in replies. (Closes: #485697) + Thanks to Julien Cristau + * Use pass-through for rewrites of URLs to hide implementation (Closes: + #871784) Thanks to Ridier 'OdyX' Raboud [ Niels Thykier ] * quitcgi() now returns 400/500 status codes instead of 200 (Closes: #584922) diff --git a/debian/control b/debian/control index 6fadd40..097852d 100644 --- a/debian/control +++ b/debian/control @@ -13,11 +13,10 @@ Build-Depends-Indep: libparams-validate-perl, libhttp-server-simple-perl, libtest-www-mechanize-perl, libmail-rfc822-address-perl, libsafe-hole-perl, libuser-perl, libconfig-simple-perl, libtest-pod-perl, liblist-allutils-perl, -# used by Debbugs::Libravatar and libravatar.cgi libfile-libmagic-perl, libgravatar-url-perl, libwww-perl, imagemagick, libdbix-class-perl, libdatetime-format-pg-perl, libdatetime-format-mail-perl, - libtext-template-perl, graphviz, libtext-iconv-perl + libtext-template-perl, graphviz, libtext-iconv-perl, libnet-server-perl Homepage: http://wiki.debian.org/Teams/Debbugs Package: debbugs diff --git a/examples/apache.conf b/examples/apache.conf index 0c1315d..6232e03 100644 --- a/examples/apache.conf +++ b/examples/apache.conf @@ -32,17 +32,18 @@ # The following two redirect to up-to-date pages RewriteRule ^/[[:space:]]*#?([[:digit:]][[:digit:]][[:digit:]]+)([;&].+)?$ /cgi-bin/bugreport.cgi?bug=$1$2 [L,R,NE] RewriteRule ^/([^/+]*)([+])([^/]*)$ "/$1%%{%}2B$3" [N] - RewriteRule ^/[Ff][Rr][Oo][Mm]:([^/]+\@.+)$ /cgi-bin/pkgreport.cgi?submitter=$1 [L,R,NE] + RewriteRule ^/[Ff][Rr][Oo][Mm]:([^/]+\@.+)$ /cgi-bin/pkgreport.cgi?submitter=$1 [PT,NE] # Commented out, 'cuz aj says it will crash master. (old master) # RewriteRule ^/[Ss][Ee][Vv][Ee][Rr][Ii][Tt][Yy]:([^/]+\@.+)$ /cgi-bin/pkgreport.cgi?severity=$1 [L,R] - RewriteRule ^/([^/]+\@.+)$ /cgi-bin/pkgreport.cgi?maint=$1 [L,R,NE] - RewriteRule ^/mbox:([[:digit:]][[:digit:]][[:digit:]]+)([;&].+)?$ /cgi-bin/bugreport.cgi?mbox=yes&bug=$1$2 [L,R,NE] - RewriteRule ^/src:([^/]+)$ /cgi-bin/pkgreport.cgi?src=$1 [L,R,NE] - RewriteRule ^/severity:([^/]+)$ /cgi-bin/pkgreport.cgi?severity=$1 [L,R,NE] - RewriteRule ^/tag:([^/]+)$ /cgi-bin/pkgreport.cgi?tag=$1 [L,R,NE] + RewriteRule ^/([^/]+\@.+)$ /cgi-bin/pkgreport.cgi?maint=$1 [PT,NE] + RewriteRule ^/mbox:([[:digit:]][[:digit:]][[:digit:]]+)([;&].+)?$ /cgi-bin/bugreport.cgi?mbox=yes&bug=$1$2 [PT,NE] + RewriteRule ^/src:([^/]+)$ /cgi-bin/pkgreport.cgi?src=$1 [PT,NE] + RewriteRule ^/severity:([^/]+)$ /cgi-bin/pkgreport.cgi?severity=$1 [PT,NE] + RewriteRule ^/tag:([^/]+)$ /cgi-bin/pkgreport.cgi?tag=$1 [PT,NE] # RewriteMap fix-chars int:noescape RewriteCond %{REQUEST_URI} ^/(Access\.html|Developer\.html|Reporting\.html|server-request\.html|server-control\.html|server-refcard\.html).* [NC] RewriteRule .* - [L] - RewriteRule ^/([0-9]+)$ /cgi-bin/bugreport.cgi?bug=$1 [L,R,NE] - RewriteRule ^/([^/]+)$ /cgi-bin/pkgreport.cgi?pkg=$1 [L,R,NE] + # PT|passthrough to bugreport.cgi and pkgreport.cgi + RewriteRule ^/([0-9]+)$ /cgi-bin/bugreport.cgi?bug=$1 [PT,NE] + RewriteRule ^/([^/]+)$ /cgi-bin/pkgreport.cgi?pkg=$1 [PT,NE] diff --git a/scripts/process b/scripts/process index 38e4f90..3eba1fc 100755 --- a/scripts/process +++ b/scripts/process @@ -7,7 +7,6 @@ use warnings; use strict; -use locale; use POSIX qw(strftime locale_h); setlocale(LC_TIME, "C"); @@ -180,7 +179,9 @@ for my $hdr (@headerlines) { $_ = $hdr; s/\n\s/ /g; finish() if m/^x-loop: (\S+)$/i && $1 eq "$gMaintainerEmail"; - my $ins = !m/^(?:(?:subject|reply-to|return-path|mail-followup-to): + my $ins = !m/^(?:(?:subject|reply-to|return-path| + mail-followup-to| + references): |From\s|X-Debbugs-)/xi; $fwd .= encode_utf8($hdr)."\n" if $ins; # print {$debugfh} ">$_<\n"; @@ -812,6 +813,12 @@ if (length($resentccval)) { $resentcc= "Resent-CC: $resentccval\n"; } +my $referencesval = join(' ',grep {defined $_} $header{'references'},$data->{msgid}); +my $references = ''; +if (!$newref && length($referencesval)) { + $references = "References: $referencesval\n"; +} + my $common_headers=''; { my @tmp = @common_headers; @@ -831,7 +838,7 @@ Resent-Sender: $gMaintainerEmail X-$gProject-PR-Message: report $ref X-$gProject-PR-Package: $data->{package} X-$gProject-PR-Keywords: $data->{keywords} -${source_pr_header} +${references}${source_pr_header} END chomp $enc_msg; $enc_msg = encode_utf8($enc_msg).$fwd."\n"; @@ -854,7 +861,7 @@ Resent-Sender: $gMaintainerEmail X-$gProject-PR-Message: $report_followup $ref X-$gProject-PR-Package: $data->{package} X-$gProject-PR-Keywords: $data->{keywords} -${source_pr_header} +${references}${source_pr_header} END chomp $enc_msg; $enc_msg = encode_utf8($enc_msg).$fwd."\n"; @@ -888,7 +895,7 @@ Resent-Sender: $gMaintainerEmail ${common_headers}X-$gProject-PR-Message: $report_followup $ref X-$gProject-PR-Package: $data->{package} X-$gProject-PR-Keywords: $data->{keywords} -${source_pr_header} +${references}${source_pr_header} END chomp $enc_msg; $enc_msg = encode_utf8($enc_msg).$fwd."\n"; diff --git a/scripts/service b/scripts/service index 0196e26..c62e3d5 100755 --- a/scripts/service +++ b/scripts/service @@ -7,7 +7,6 @@ use warnings; use strict; -use locale; use POSIX qw(strftime locale_h); setlocale(LC_TIME, "C");