Fixed long standing bug about displaying proper message
authorAndrew DeFaria <Andrew@DeFaria.com>
Wed, 12 May 2021 14:49:31 +0000 (07:49 -0700)
committerAndrew DeFaria <Andrew@DeFaria.com>
Wed, 12 May 2021 14:49:31 +0000 (07:49 -0700)
If there were more than one message sent by the sender then attempting
to display the individual message would not work. This was because we
were going by msg_nbr but the msg_nbr did not really relate to the
message shown on the detail.cti web page. Here we change the alogrithm
to use the message date instead as it uniquely identifies the message.

Note that there still may be times when one sender/msg_date relates to
more than one message (think two messages with the exact same
timestamp). I'm not sure if this is possible nor if it's really that
important.

maps/bin/detail.cgi
maps/bin/display.cgi
maps/lib/MAPS.pm

index ed7efca..55c9cbd 100755 (executable)
@@ -242,8 +242,9 @@ sub PrintTable {
     my $messages = 1;
 
     for (@msgs) {
-      my $msg_date = pop @{$_};
-      my $subject  = pop @{$_};
+      my $msg_date  = pop @{$_};
+      my $link_date = $msg_date;
+      my $subject   = pop @{$_};
 
       if ($date eq substr ($msg_date, 0, 10)) {
         $msg_date = b font {-color => 'green'}, SQLDatetime2UnixDatetime $msg_date;
@@ -262,7 +263,6 @@ sub PrintTable {
                      -cellspacing => 2,
                      -border      => 0,
                      -width       => '100%'};
-      my $msg_nbr = $messages;
       print
         Tr [
           td {-class   => 'msgnbr',
@@ -275,7 +275,7 @@ sub PrintTable {
           td {-class   => 'subject',
               -valign  => 'middle',
               -bgcolor => '#ffffff'},
-           a {-href    => "display.cgi?sender=$sender;msg_nbr=$msg_nbr"}, $subject,
+           a {-href    => "display.cgi?sender=$sender;msg_date=$link_date"}, $subject,
           td {-class   => 'date',
               -width   => '150',
               -valign  => 'middle'}, $msg_date
index 76f5ab6..1dbbd1b 100755 (executable)
@@ -32,7 +32,7 @@ use MIME::Words qw(:all);
 
 my $userid      = cookie('MAPSUser');
 my $sender      = param('sender');
-my $msg_nbr     = param('msg_nbr');
+my $msg_date    = param('msg_date');
 my $table_name  = 'message';
 
 sub ParseEmail(@) {
@@ -65,22 +65,16 @@ sub ParseEmail(@) {
 } # ParseEmail
 
 sub Body($) {
-  my ($count) = @_;
+  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 = MIME::Parser->new();
 
-  $parser->output_to_core (1);
+  $parser->output_to_core(1);
 
   my $entity = $parser->parse_data ($message);
 
@@ -107,10 +101,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 +112,7 @@ sub Body($) {
              -width    => "8%"}, "$_:") . "\n" .
         td ({-bgcolor  => "white"}, $str)
       ]);
-    } # if
+    } # for
 
     print end_table;
     print "</td></tr>";
@@ -174,7 +168,7 @@ sub Body($) {
         } # for
       } elsif ($part->mime_type eq 'multipart/related') {
         # Sometimes parts are 'multipart/relative'...
-       $part->print_body;
+        $part->print_body;
       } else {
         if ($part->mime_type =~ /text/) {
           my $encoding = '';
@@ -213,6 +207,6 @@ $userid = Heading(
 SetContext($userid);
 NavigationBar($userid);
 
-Body($msg_nbr);
+Body($msg_date);
 
 Footing($table_name);
index ae6efcc..b1df123 100644 (file)
@@ -702,16 +702,19 @@ sub Encrypt($$) {
   return $row[0];
 } # Encrypt
 
-sub FindEmail(;$) {
-  my ($sender) = @_;
+sub FindEmail(;$$) {
+  my ($sender, $date) = @_;
 
   my $statement;
 
-  if (!defined $sender || $sender eq '') {
-    $statement = "select * from email where userid = '$userid'";
-  } else {
-    $statement = "select * from email where userid = '$userid' and sender = '$sender'";
-  } # if
+  $sender //= '';
+  $date   //= '';
+
+  $statement  = "select * from email where userid = '$userid'";
+
+  # Add conditions if present
+  $statement .= " and sender = '$sender'"  if $sender;
+  $statement .= " and timestamp = '$date'" if $date;
 
   my $sth = $DB->prepare($statement)
     or DBError('FindEmail: Unable to prepare statement', $statement);