Merged MAPS2.0
[clearscm.git] / maps / bin / display.cgi
index 21f47b4..0a0cfcd 100755 (executable)
@@ -2,7 +2,7 @@
 ################################################################################
 #
 # File:         $RCSfile: display.cgi,v $
-# Revision:    $Revision: 1.1 $
+# Revision:     $Revision: 1.1 $
 # Description:  Displays an email message
 # Author:       Andrew@DeFaria.com
 # Created:      Fri Nov 29 14:17:21  2002
@@ -16,9 +16,10 @@ use strict;
 use warnings;
 
 use FindBin;
-$0 = $FindBin::Script;
+local $0 = $FindBin::Script;
 
-use lib $FindBin::Bin;
+use lib "$FindBin::Bin/../lib";
+use lib "$FindBin::Bin/../../lib";
 
 use MAPS;
 use MAPSWeb;
@@ -30,19 +31,24 @@ use MIME::Parser;
 use MIME::Base64;
 use MIME::Words qw(:all);
 
-my $userid     = cookie ("MAPSUser");
-my $sender     = param ("sender");
-my $msg_nbr    = param ("msg_nbr");
-my $table_name = "message";
+my $userid = cookie('MAPSUser');
+my $sender = param('sender');
 
-sub ParseEmail (@) {
+# 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(@) {
   my (@header) = @_;
 
   my %header;
 
   # First output the header information. Note we'll skip uninteresting stuff
-  foreach (@header) {
-    last if ($_ eq "" || $_ eq "\cM");
+  for (@header) {
+    last if ($_ eq '' || $_ eq "\cM");
 
     # Escape "<" and ">"
     s/\</\&lt\;/;
@@ -56,115 +62,147 @@ sub ParseEmail (@) {
       $header{date} = $1;
     } elsif (/^To:\s*(.*)/i) {
       $header{to} = $1;
+    } elsif (/^Content-Transfer-Encoding: base64/) {
+      $header{base64} = 1;
     } # if
-  } # while
+  } # for
 
   return %header;
 } # ParseEmail
 
-sub Body ($) {
-  my ($count) = @_;
-
-  $count ||= 1;
-
-  my $handle = FindEmail $sender;
+sub Body($) {
+  my ($date) = @_;
 
-  my ($userid, $sender, $subject, $timestamp, $message);
+  # Find unique message using $date
+  my ($err, $msg) = FindEmail(
+    userid    => $userid,
+    sender    => $sender,
+    timestamp => $date,
+  );
 
-  # Need to handle multiple messages
-  for (my $i = 0; $i < $count; $i++) {
-    ($userid, $sender, $subject, $timestamp, $message) = GetEmail $handle;
-  } # for
+  my $rec = GetEmail;
 
-  my $parser = new MIME::Parser;
+  my $parser = MIME::Parser->new();
 
-  $parser->output_to_core (1);
+  # For some strange reason MIME::Parser has started having some problems
+  # with writing out tmp files...
+  $parser->output_to_core(1);
+  $parser->tmp_to_core(1);
 
-  my $entity = $parser->parse_data ($message);
+  my $entity = $parser->parse_data($rec->{data});
 
   my %header = ParseEmail @{($entity->header)[0]};
 
   print p . "\n";
-    print start_table ({-align         => "center",
-                       -id             => $table_name,
-                       -border         => 0,
-                       -cellspacing    => 0,
-                       -cellpadding    => 0,
-                       -width          => "100%"});
-    print start_table ({-align         => "center",
-                       -bgcolor        => "#d4d0c8",
-                       -border         => 0,
-                       -cellspacing    => 2,
-                       -cellpadding    => 2,
-                       -width          => "100%"}) . "\n";
+    print start_table ({-align        => "center",
+                        -id           => $table_name,
+                        -border       => 0,
+                        -cellspacing  => 0,
+                        -cellpadding  => 0,
+                        -width        => "100%"});
+    print start_table ({-align        => "center",
+                        -bgcolor      => 'steelblue',
+                        #-bgcolor      => "#d4d0c8",
+                        -border       => 0,
+                        -cellspacing  => 2,
+                        -cellpadding  => 2,
+                        -width        => "100%"}) . "\n";
     print "<tbody><tr><td>\n";
-    print start_table ({-align         => "center",
-                       -border         => 0,
-                       -cellspacing    => 0,
-                       -cellpadding    => 2,
-                       -bgcolor        => "#ece9d8",
-                       -width          => "100%"}) . "\n";
+    print start_table ({-align        => "center",
+                        -border       => 0,
+                        -cellspacing  => 0,
+                        -cellpadding  => 2,
+                        -bgcolor      => 'black',
+                        #-bgcolor      => "#ece9d8",
+                        -width        => "100%"}) . "\n";
+
+    for (keys (%header)) {
+      next if /base64/;
 
-    foreach (keys (%header)) {
-      my $str = decode_mimewords ($header{$_});
+      my $str = decode_mimewords($header{$_});
 
       print Tr ([
-             th ({-align       => "right",
-                  -bgcolor     => "#ece9d8",
-                  -width       => "8%"}, "$_:") . "\n" .
-             td ({-bgcolor     => "white"}, $str)
-           ]);
-    } # if
+        th ({-align    => 'right',
+             -bgcolor  => 'steelblue',
+             -style    => 'color: white',
+             #-bgcolor  => "#ece9d8",
+             -width    => "8%"}, ucfirst "$_:") . "\n" .
+        td ({-bgcolor  => 'white'}, $str)
+      ]);
+    } # for
 
     print end_table;
     print "</td></tr>";
     print end_table;
 
-  print start_table ({-align           => "center",
-                     -bgcolor          => "black",
-                     -border           => 0,
-                     -cellspacing      => 0,
-                     -cellpadding      => 2,
-                     -width            => "100%"}) . "\n";
+  print start_table ({-align        => 'center',
+                      -bgcolor      => 'steelblue',
+                      -border       => 0,
+                      -cellspacing  => 0,
+                      -cellpadding  => 2,
+                      -width        => "100%"}) . "\n";
   print "<tbody><tr><td>\n";
-  print start_table ({-align           => "center",
-                     -border           => 0,
-                     -cellspacing      => 0,
-                     -cellpadding      => 2,
-                     -bgcolor          => "white",
-                     -width            => "100%"}) . "\n";
+  print start_table ({-align        => "center",
+                      -border       => 0,
+                      -cellspacing  => 0,
+                      -cellpadding  => 2,
+                      -bgcolor      => 'white',
+                      -width        => "100%"}) . "\n";
   print "<tbody><tr><td>\n";
 
   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>';
+      print $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) {
-         if ($subpart->mime_type eq 'text/html') {
-           $subpart->print_body;
-           last;
-         } elsif ($subpart->mime_type eq 'multipart/related') {
-           # This is stupid - multipart/related? When it's really just HTML?!?
-           $subpart->print_body;
-           last;
-         } # if
-       } # foreach
+        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]};
+            if ($encoding =~ /base64/) {
+              $subpart->bodyhandle->print;
+            } else {
+              print $subpart->print_body;
+            } # if
+            last;
+          } elsif ($subpart->mime_type eq 'multipart/related') {
+            # This is stupid - multipart/related? When it's really just HTML?!?
+            $subpart->print_body;
+            last;
+          } # if
+        } # 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>';
-       } # if
+        if ($part->mime_type =~ /text/) {
+          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>';
+            print $part->print_body;
+            print '</pre>';
+          } # if
+        } # if
       } # if
-    } # foreach
+    } # for
   } # if
 
   print "</td></tr>\n";
@@ -174,18 +212,20 @@ sub Body ($) {
   print end_table;
 } # Body
 
-$userid = Heading (
-  "getcookie",
-  "",
+$userid = Heading(
+  'getcookie',
+  '',
   "Email message from $sender",
   "Email message from $sender",
-  "",
+  '',
   $table_name,
 );
 
-SetContext $userid;
-NavigationBar $userid;
+$userid //= $ENV{USER};
+
+SetContext($userid);
+NavigationBar($userid);
 
-Body $msg_nbr;
+Body($msg_date);
 
-Footing $table_name;
+Footing($table_name);