From: Andrew DeFaria Date: Wed, 12 May 2021 14:49:31 +0000 (-0700) Subject: Fixed long standing bug about displaying proper message X-Git-Url: https://defaria.com/gitweb/?a=commitdiff_plain;h=7ad5fd1a2d54b940018de904485ce560562af176;hp=710dceea2f43455f4f4a3b20ea74f1c0b131211a;p=clearscm.git 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. --- 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);