From 7ad5fd1a2d54b940018de904485ce560562af176 Mon Sep 17 00:00:00 2001 From: Andrew DeFaria Date: Wed, 12 May 2021 07:49:31 -0700 Subject: [PATCH 1/1] Fixed long standing bug about displaying proper message 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 | 8 ++++---- maps/bin/display.cgi | 28 +++++++++++----------------- maps/lib/MAPS.pm | 17 ++++++++++------- 3 files changed, 25 insertions(+), 28 deletions(-) diff --git a/maps/bin/detail.cgi b/maps/bin/detail.cgi index ed7efca..55c9cbd 100755 --- a/maps/bin/detail.cgi +++ b/maps/bin/detail.cgi @@ -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 diff --git a/maps/bin/display.cgi b/maps/bin/display.cgi index 76f5ab6..1dbbd1b 100755 --- a/maps/bin/display.cgi +++ b/maps/bin/display.cgi @@ -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 ""; @@ -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); diff --git a/maps/lib/MAPS.pm b/maps/lib/MAPS.pm index ae6efcc..b1df123 100644 --- a/maps/lib/MAPS.pm +++ b/maps/lib/MAPS.pm @@ -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); -- 2.17.1