X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=cgi%2Fbugreport.cgi;h=5fe8db54e18e84350e762858b277d5a142ec8519;hb=2ee73259657d024a84208bc1f056606b668d2f74;hp=831d1718a4fe018c832ee8f3b3465d5998cc79c8;hpb=2d41a161d35f9dfd4522a8506da6d14e7faa6a46;p=debbugs.git diff --git a/cgi/bugreport.cgi b/cgi/bugreport.cgi index 831d171..5fe8db5 100755 --- a/cgi/bugreport.cgi +++ b/cgi/bugreport.cgi @@ -31,6 +31,7 @@ my $boring = ($param{'boring'} || 'no') eq 'yes'; my $terse = ($param{'terse'} || 'no') eq 'yes'; my $reverse = ($param{'reverse'} || 'no') eq 'yes'; my $mbox = ($param{'mbox'} || 'no') eq 'yes'; +my $mime = ($param{'mime'} || 'yes') eq 'yes'; # Not used by this script directly, but fetch these so that pkgurl() and # friends can propagate them correctly. @@ -52,6 +53,77 @@ if ($ENV{REQUEST_METHOD} eq 'HEAD' and not defined($att) and not $mbox) { exit 0; } +sub display_entity ($$$$\$\@); +sub display_entity ($$$$\$\@) { + my $entity = shift; + my $ref = shift; + my $top = shift; + my $xmessage = shift; + my $this = shift; + my $attachments = shift; + + my $head = $entity->head; + my $disposition = $head->mime_attr('content-disposition'); + $disposition = 'inline' if not defined $disposition or $disposition eq ''; + my $type = $entity->effective_type; + my $filename = $entity->head->recommended_filename; + $filename = '' unless defined $filename; + + if ($top) { + $$this .= htmlsanit($entity->stringify_header) unless ($terse); + $$this .= "\n"; + } + + unless (($top and $type =~ m[^text(?:/plain)?(?:;|$)]) or + ($type =~ m[^multipart/])) { + push @$attachments, $entity; + my @dlargs = ($ref, "msg=$xmessage", "att=$#$attachments"); + push @dlargs, "filename=$filename" if $filename ne ''; + my $printname = $filename; + $printname = 'Message part ' . ($#$attachments + 1) if $filename eq ''; + $$this .= '[$printname } . + "($type, $disposition)]\n\n"; + + if ($msg and defined($att) and $att eq $#$attachments) { + my $head = $entity->head; + chomp(my $type = $entity->effective_type); + my $body = $entity->stringify_body; + print "Content-Type: $type"; + print "; name=$filename" if $filename ne ''; + print "\n\n"; + my $decoder = new MIME::Decoder($head->mime_encoding); + $decoder->decode(new IO::Scalar(\$body), \*STDOUT); + exit(0); + } + } + + return if not $top and $disposition eq 'attachment' and not defined($att); + return unless ($type =~ m[^text/?] and $type !~ m[^text/html(?:;|$)]) or + $type =~ m[^application/pgp(?:;|$)] or + $entity->parts; + + if ($entity->is_multipart) { + my @parts = $entity->parts; + foreach my $part (@parts) { + display_entity($part, $ref, 0, $xmessage, + $$this, @$attachments); + $$this .= "\n"; + } + } elsif ($entity->parts) { + # We must be dealing with a nested message. + $$this .= "
\n"; + my @parts = $entity->parts; + foreach my $part (@parts) { + display_entity($part, $ref, 1, $xmessage, + $$this, @$attachments); + $$this .= "\n"; + } + $$this .= "
\n"; + } else { + $$this .= htmlsanit($entity->bodyhandle->as_string) unless ($terse); + } +} + my %maintainer = %{getmaintainers()}; my %pkgsrc = %{getpkgsrc()}; @@ -93,7 +165,7 @@ my @tpacks = splitpackages($tpack); if ($status{severity} eq 'normal') { $showseverity = ''; -#} elsif (grep($status{severity} eq $_, @strongseverities)) { +#} elsif (isstrongseverity($status{severity})) { # $showseverity = "Severity: $status{severity};\n"; } else { $showseverity = "Severity: $status{severity};\n"; @@ -126,7 +198,22 @@ if (@merged) { push @descstates, $descmerged; } -if (length($status{done})) { +if (@{$status{found_versions}}) { + my $foundtext = 'Found in '; + $foundtext .= (@{$status{found_versions}} == 1) ? 'version ' : 'versions '; + $foundtext .= join ', ', map htmlsanit($_), @{$status{found_versions}}; + push @descstates, $foundtext; +} + +if (@{$status{fixed_versions}}) { + my $fixedtext = 'Fixed in '; + $fixedtext .= (@{$status{fixed_versions}} == 1) ? 'version ' : 'versions '; + $fixedtext .= join ', ', map htmlsanit($_), @{$status{fixed_versions}}; + if (length($status{done})) { + $fixedtext .= ' by ' . htmlsanit($status{done}); + } + push @descstates, $fixedtext; +} elsif (length($status{done})) { push @descstates, "Done: ".htmlsanit($status{done}); } elsif (length($status{forwarded})) { push @descstates, "Forwarded to ".maybelink($status{forwarded}); @@ -139,15 +226,17 @@ foreach my $pkg (@tpacks) { my $tmaint = defined($maintainer{$pkg}) ? $maintainer{$pkg} : '(unknown)'; my $tsrc = defined($pkgsrc{$pkg}) ? $pkgsrc{$pkg} : '(unknown)'; - $descriptivehead .= "Maintainer for $pkg is\n". - ''.htmlsanit($tmaint).''; + $descriptivehead .= + htmlmaintlinks(sub { $_[0] == 1 ? "Maintainer for $pkg is\n" + : "Maintainers for $pkg are\n" }, + $tmaint); $descriptivehead .= ";\nSource for $pkg is\n". '$tsrc" if ($tsrc ne "(unknown)"); $descriptivehead .= ".\n
"; } open L, "<$buglog" or &quitcgi("open log for $ref: $!"); -if ($buglog !~ m#^\Q$gSpoolDir/db-h/#) { +if ($buglog !~ m#^\Q$gSpoolDir/db#) { $descriptivehead .= "\n

Bug is archived. No further changes may be made.

"; } @@ -209,60 +298,20 @@ while(my $line = ) { push @mails, join( '', @mail ) if ( $mbox && @mail ); if ($show) { - my $downloadHtml = ''; - if (@mail) { + if (not $mime and @mail) { + $this .= htmlsanit(join '', @mail); + } elsif (@mail) { my $parser = new MIME::Parser; $parser->tmp_to_core(1); $parser->output_to_core(1); # $parser->output_under("/tmp"); my $entity = $parser->parse( new IO::Lines \@mail ); - # TODO: make local subdir, clean it outselves + # TODO: make local subdir, clean it ourselves # the following does NOT delete the msg dirs in /tmp END { if ( $entity ) { $entity->purge; } if ( $parser ) { $parser->filer->purge; } } my @attachments = (); - if ( $entity->is_multipart ) { - my @parts = $entity->parts_DFS; -# $this .= htmlsanit($entity->head->stringify); - my @keep = (); - foreach ( @parts ) { - my $head = $_->head; -# $head->mime_attr("content-transfer-encoding" => "8bit") -# if !$head->mime_attr("content-transfer-encoding"); - my ($disposition,$type) = ( - $head->mime_attr("content-disposition"), - lc $head->mime_attr("content-type") - ); - -#print STDERR "'$type' '$disposition'\n"; - if ($disposition && ( $disposition eq "attachment" || $disposition eq "inline" ) && $_->head->recommended_filename ) { - push @attachments, $_; - my $file = $_->head->recommended_filename; - $downloadHtml .= "View Attachment: $file\n"; - if ($msg && defined($att) && $att eq $#attachments) { - my $head = $_->head; - my $type; - chomp($type = $head->mime_attr("content-type")); - my $body = $_->stringify_body; - print "Content-Type: $type; name=$file\n\n"; - my $decoder = new MIME::Decoder($head->mime_encoding); - $decoder->decode(new IO::Scalar(\$body), \*STDOUT); - exit(0); - } - if ($type eq 'text/plain') { -# push @keep, $_; - } -# $this .= htmlsanit($_->head->stringify); - } else { -# $this .= htmlsanit($_->head->stringify); -# push @keep, $_; - } -# $this .= "\n" . htmlsanit($_->stringify_body); - } -# $entity->parts(\@keep) if (!$msg); - } - $this .= htmlsanit($entity->stringify); + display_entity($entity, $ref, 1, $xmessage, $this, @attachments); } - $this = "$downloadHtml\n$this$downloadHtml" if $downloadHtml; # if ($normstate eq 'go' || $normstate eq 'go-nox') { if ($normstate ne 'html') { $this = "
\n$this
\n"; @@ -271,8 +320,6 @@ while(my $line = ) { $this .= " Full text available."; } $this = "$thisheader$this" if $thisheader && !( $normstate eq 'html' );; - $this = "$downloadHtml" if ($terse && $normstate ne 'html'); - $downloadHtml = ''; $thisheader = ''; my $delim = $terse ? "

" : "


"; if ($reverse) { @@ -386,14 +433,16 @@ if ( $mbox ) { } print "Content-Type: text/html\n\n"; +my $title = htmlsanit($status{subject}); + print "\n"; print "\n" . - "$debbugs::gProject $debbugs::gBug report logs - $short\n" . + "$debbugs::gProject $debbugs::gBug report logs - $short - $title\n" . "\n" . '' . "\n"; -print "

" . "$debbugs::gProject $debbugs::gBug report logs - $short" . - "
" . htmlsanit($status{subject}) . "

\n"; +print "

" . "$debbugs::gProject $debbugs::gBug report logs - $short" . + "
" . $title . "

\n"; print "$descriptivehead\n"; printf "

View this report as an mbox folder.

\n", mboxurl($ref);