]> git.donarmstrong.com Git - debbugs.git/blobdiff - Debbugs/CGI/Bugreport.pm
use hash_slice instead of multi-line exists
[debbugs.git] / Debbugs / CGI / Bugreport.pm
index 7dc2e5f5751ae45624a2dffb7179df8429076a19..a6063944a07b5edd1048639d17c6c8d1abecb085 100644 (file)
@@ -27,6 +27,7 @@ None known.
 
 use warnings;
 use strict;
+use utf8;
 use vars qw($VERSION $DEBUG %EXPORT_TAGS @EXPORT_OK @EXPORT);
 use Exporter qw(import);
 
@@ -34,9 +35,9 @@ use IO::Scalar;
 use Params::Validate qw(validate_with :types);
 use Digest::MD5 qw(md5_hex);
 use Debbugs::Mail qw(get_addresses :reply);
-use Debbugs::MIME qw(decode_rfc1522 create_mime_message);
+use Debbugs::MIME qw(decode_rfc1522 create_mime_message parse_to_mime_entity);
 use Debbugs::CGI qw(:url :html :util);
-use Debbugs::Common qw(globify_scalar english_join);
+use Debbugs::Common qw(globify_scalar english_join hash_slice);
 use Debbugs::UTF8;
 use Debbugs::Config qw(:config);
 use Debbugs::Log qw(:read);
@@ -44,6 +45,7 @@ use POSIX qw(strftime);
 use Encode qw(decode_utf8 encode_utf8);
 use URI::Escape qw(uri_escape_utf8);
 use Scalar::Util qw(blessed);
+use List::AllUtils qw(sum);
 use File::Temp;
 
 BEGIN{
@@ -224,9 +226,7 @@ sub display_entity {
                                output => $output,
                                attachments => $attachments,
                                terse => $param{terse},
-                               exists $param{msg}?(msg=>$param{msg}):(),
-                               exists $param{att}?(att=>$param{att}):(),
-                               exists $param{avatars}?(avatars=>$param{avatars}):(),
+                               hash_slice(%param,qw(msg att avatars)),
                               );
             if ($raw_output) {
                 return $raw_output;
@@ -247,9 +247,7 @@ sub display_entity {
                           output => $output,
                           attachments => $attachments,
                           terse => $param{terse},
-                          exists $param{msg}?(msg=>$param{msg}):(),
-                          exists $param{att}?(att=>$param{att}):(),
-                           exists $param{avatars}?(avatars=>$param{avatars}):(),
+                           hash_slice(%param,qw(msg att avatars)),
                          );
            # print {$output} "\n";
        }
@@ -277,7 +275,7 @@ sub display_entity {
             # if the first 20 lines in the message which have any non-space
             # characters are larger than 100 characters more often than they
             # are not, then use CSS to try to impose sensible wrapping
-            sum0(map {length ($_) > 100?1:-1} grep {/\S/} split /\n/,$body,20) > 0
+            sum(0,map {length ($_) > 100?1:-1} grep {/\S/} split /\n/,$body,20) > 0
            ) {
             $css_class .= " wrapping";
         }
@@ -302,7 +300,7 @@ sub display_entity {
            ) {
             # Add links to CVE vulnerabilities (closes #568464)
             $body =~ s{(^|\s|[\(\[])(CVE-\d{4}-\d{4,})(\s|[,.-\[\]\)]|$)}
-                      {$1<a href="http://$config{cve_tracker}$2">$2</a>$3}gxm;
+                      {$1<a href="$config{cve_tracker}$2">$2</a>$3}gxm;
         }
         if (not exists $param{att}) {
              print {$output} qq(<pre class="$css_class">$body</pre>\n);
@@ -333,17 +331,7 @@ sub handle_email_message{
      my $entity;
      my $tempdir;
      if (not blessed $record) {
-         my $parser = MIME::Parser->new();
-         # this will be cleaned up once it goes out of scope
-         $tempdir = File::Temp->newdir();
-         $parser->output_under($tempdir->dirname());
-         if ($record->{inner_file}) {
-             $entity = $parser->parse($record->{fh}) or
-                 die "Unable to parse entity";
-         } else {
-             $entity = $parser->parse_data($record->{text}) or
-                 die "Unable to parse entity";
-         }
+        $entity = parse_to_mime_entity($record);
      } else {
          $entity = $record;
      }
@@ -356,10 +344,8 @@ sub handle_email_message{
                         output => $output_fh,
                         attachments => \@attachments,
                         terse       => $param{terse},
-                        exists $param{msg}?(msg=>$param{msg}):(),
-                        exists $param{att}?(att=>$param{att}):(),
-                        exists $param{trim_headers}?(trim_headers=>$param{trim_headers}):(),
-                        exists $param{avatars}?(avatars=>$param{avatars}):(),
+                        hash_slice(%param,qw(msg att trim_headers avatars),
+                                  ),
                        );
      return $raw_output?$output:decode_utf8($output);
 }
@@ -394,7 +380,7 @@ sub handle_record{
          # Add links to the cloned bugs
          $output =~ s{(Bug )(\d+)( cloned as bugs? )(\d+)(?:\-(\d+)|)}{$1.bug_links(bug=>$2).$3.bug_links(bug=>(defined $5)?[$4..$5]:$4)}eo;
          # Add links to merged bugs
-         $output =~ s{(?<=Merged )([\d\s]+)(?=\.)}{join(' ',map {bug_links(bug=>$_)} (split /\s+/, $1))}eo;
+         $output =~ s{(?<=Merged )([\d\s]+)(?=[\.<])}{join(' ',map {bug_links(bug=>$_)} (split /\s+/, $1))}eo;
          # Add links to blocked bugs
          $output =~ s{(?<=Blocking bugs)(?:( of )(\d+))?( (?:added|set to|removed):\s+)([\d\s\,]+)}
                      {(defined $2?$1.bug_links(bug=>$2):'').$3.
@@ -403,7 +389,7 @@ sub handle_record{
                       (\d+(?:,\s+\d+)*(?:\,?\s+and\s+\d+)?)}
                      {$1.(defined $3?$2.bug_links(bug=>$3):'').$4.
                           english_join([map {bug_links(bug=>$_)} (split /\,?\s+(?:and\s+)?/, $5)])}xeo;
-         $output =~ s{([Aa]dded|[Rr]emoved)( indication that bug )(\d+)( blocks )([\d\s\,]+)}
+         $output =~ s{([Aa]dded|[Rr]emoved)( indication that bug )(\d+)( blocks ?)([\d\s\,]+)}
                      {$1.$2.(bug_links(bug=>$3)).$4.
                           english_join([map {bug_links(bug=>$_)} (split /\,?\s+(?:and\s+)?/, $5)])}eo;
          # Add links to reassigned packages
@@ -414,19 +400,20 @@ sub handle_record{
          if (defined $time) {
               $output .= ' ('.strftime('%a, %d %b %Y %T GMT',gmtime($time)).') ';
          }
-         $output .= '<a href="' .
+         $output .= qq{(<a href="} .
               html_escape(bug_links(bug => $bug_number,
                                     options => {msg => ($msg_number+1)},
                                     links_only => 1,
                                    )
-                         ) . '">Full text</a> and <a href="' .
+                         ) . '">full text</a>, <a href="' .
                               html_escape(bug_links(bug => $bug_number,
                                                     options => {msg => ($msg_number+1),
                                                                 mbox => 'yes'},
                                                     links_only => 1)
-                                         ) . '">rfc822 format</a> available.';
+                                         ) . '">mbox</a>, '.
+                                             qq{<a href="#$msg_number">link</a>).</p>};
 
-         $output = qq(<div class="$class"><hr>\n<a name="$msg_number"></a>\n) . $output . "</div>\n";
+         $output = qq(<div class="$class"><hr><p>\n<a name="$msg_number"></a>\n) . $output . "</p></div>\n";
      }
      elsif (/recips/) {
          my ($msg_id) = record_regex($record,qr/^Message-Id:\s+<(.+)>/i);
@@ -436,7 +423,8 @@ sub handle_record{
          elsif (defined $msg_id) {
               $$seen_msg_ids{$msg_id} = 1;
          }
-         $output .= qq(<hr><p class="msgreceived"><a name="$msg_number"></a>\n);
+         return () if defined $param{spam} and $param{spam}->is_spam($msg_id);
+         $output .= qq(<hr><p class="msgreceived"><a name="$msg_number" href="#$msg_number">🔗</a>\n);
          $output .= 'View this message in <a href="' . html_escape(bug_links(bug=>$bug_number, links_only => 1, options=>{msg=>$msg_number, mbox=>'yes'})) . '">rfc822 format</a></p>';
          $output .= handle_email_message($record,
                                          ref     => $bug_number,
@@ -455,6 +443,7 @@ sub handle_record{
          elsif (defined $msg_id) {
               $$seen_msg_ids{$msg_id} = 1;
          }
+         return () if defined $param{spam} and $param{spam}->is_spam($msg_id);
          # Incomming Mail Message
          my ($received,$hostname) = record_regex($record,qr/Received: \(at (\S+)\) by (\S+)\;/o);
          $output .= qq|<hr><p class="msgreceived"><a name="$msg_number"></a><a name="msg$msg_number"></a><a href="#$msg_number">Message #$msg_number</a> received at |.
@@ -471,6 +460,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});
@@ -511,9 +501,7 @@ sub __libravatar_url {
 
 
 __END__
-
-
-
-
-
-
+# Local Variables:
+# cperl-indent-level: 4
+# indent-tabs-mode: nil
+# End: