Merge branch 'master' of git+ssh://github.com/adefaria/clearscm
[clearscm.git] / maps / bin / display.cgi
index 7c4e3b8..14c2553 100755 (executable)
@@ -18,7 +18,7 @@ use warnings;
 use FindBin;
 $0 = $FindBin::Script;
 
-use lib $FindBin::Bin;
+use lib "$FindBin::Bin/../lib";
 
 use MAPS;
 use MAPSWeb;
@@ -32,16 +32,21 @@ use MIME::Words qw(:all);
 
 my $userid      = cookie('MAPSUser');
 my $sender      = param('sender');
-my $msg_nbr     = param('msg_nbr');
+
+# CGI will replace '+' with ' ', which many mailers are starting to do,
+# so add it back
+$sender =~ s/ /\+/;
+
+my $msg_date    = param('msg_date');
 my $table_name  = 'message';
 
-sub ParseEmail (@) {
+sub ParseEmail(@) {
   my (@header) = @_;
 
   my %header;
 
   # First output the header information. Note we'll skip uninteresting stuff
-  foreach (@header) {
+  for (@header) {
     last if ($_ eq '' || $_ eq "\cM");
 
     # Escape "<" and ">"
@@ -59,28 +64,22 @@ sub ParseEmail (@) {
     } elsif (/^Content-Transfer-Encoding: base64/) {
       $header{base64} = 1;
     } # if
-  } # while
+  } # for
 
   return %header;
 } # ParseEmail
 
-sub Body ($) {
-  my ($count) = @_;
+sub Body($) {
+  my ($date) = @_;
 
-  $count ||= 1;
+  # Find unique message using $date
+  my $handle = FindEmail $sender, $date;
 
-  my $handle = FindEmail $sender;
-
-  my ($userid, $sender, $subject, $timestamp, $message);
-
-  # Need to handle multiple messages
-  for (my $i = 0; $i < $count; $i++) {
-    ($userid, $sender, $subject, $timestamp, $message) = GetEmail $handle;
-  } # for
+  my ($userid, $sender, $subject, $timestamp, $message) = GetEmail $handle;
 
-  my $parser = new MIME::Parser;
+  my $parser = MIME::Parser->new();
 
-  $parser->output_to_core (1);
+  $parser->output_to_core(1);
 
   my $entity = $parser->parse_data ($message);
 
@@ -107,10 +106,10 @@ sub Body ($) {
                         -bgcolor      => "#ece9d8",
                         -width        => "100%"}) . "\n";
 
-    foreach (keys (%header)) {
+    for (keys (%header)) {
       next if /base64/;
 
-      my $str = decode_mimewords ($header{$_});
+      my $str = decode_mimewords($header{$_});
 
       print Tr ([
         th ({-align    => "right",
@@ -118,7 +117,7 @@ sub Body ($) {
              -width    => "8%"}, "$_:") . "\n" .
         td ({-bgcolor  => "white"}, $str)
       ]);
-    } # if
+    } # for
 
     print end_table;
     print "</td></tr>";
@@ -142,16 +141,21 @@ sub Body ($) {
   my @parts = $entity->parts;
 
   if (scalar @parts == 0) {
-    print '<pre>';
-    $entity->print_body;
-    print '</pre>';
+    if ($entity->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'} and
+        ${$entity->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'}[0]} =~ /base64/) {
+      print $entity->{ME_Bodyhandle}{MBS_Data};
+    } else {
+      print '<pre>';
+      $entity->print_body;
+      print '</pre>';
+    } # if
   } else {
-    foreach my $part ($entity->parts) {
+    for my $part ($entity->parts) {
       # We assume here that if this part is multipart/alternative then
       # there exists at least one part that is text/html and we favor
       # that (since we're outputing to a web page anyway...
       if ($part->mime_type eq 'multipart/alternative') {
-        foreach my $subpart ($part->parts) {
+        for my $subpart ($part->parts) {
           if ($subpart->mime_type eq 'text/html') {
             # There should be an easier way to get this but I couldn't find one.
             my $encoding = ${$subpart->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'}[0]};
@@ -166,15 +170,27 @@ sub Body ($) {
             $subpart->print_body;
             last;
           } # if
-        } # foreach
+        } # for
+      } elsif ($part->mime_type eq 'multipart/related') {
+        # Sometimes parts are 'multipart/relative'...
+        $part->print_body;
       } else {
         if ($part->mime_type =~ /text/) {
-          print '<pre>';
-          $part->print_body;
-          print '</pre>';
+          my $encoding = '';
+
+          $encoding = ${$part->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'}[0]}
+            if $part->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'};
+
+          if ($encoding =~ /base64/) {
+            $part->bodyhandle->print();
+          } else {
+            print '<pre>';
+            $part->print_body;
+            print '</pre>';
+          } # if
         } # if
       } # if
-    } # foreach
+    } # for
   } # if
 
   print "</td></tr>\n";
@@ -184,7 +200,7 @@ sub Body ($) {
   print end_table;
 } # Body
 
-$userid = Heading (
+$userid = Heading(
   'getcookie',
   '',
   "Email message from $sender",
@@ -193,9 +209,9 @@ $userid = Heading (
   $table_name,
 );
 
-SetContext $userid;
-NavigationBar $userid;
+SetContext($userid);
+NavigationBar($userid);
 
-Body $msg_nbr;
+Body($msg_date);
 
-Footing $table_name;
+Footing($table_name);