55d31f828a7a9a3d85ab94bbfaf9532046007b64
[clearscm.git] / maps / bin / display.cgi
1 #!/usr/bin/perl
2 ################################################################################
3 #
4 # File:         $RCSfile: display.cgi,v $
5 # Revision:     $Revision: 1.1 $
6 # Description:  Displays an email message
7 # Author:       Andrew@DeFaria.com
8 # Created:      Fri Nov 29 14:17:21  2002
9 # Modified:     $Date: 2013/06/12 14:05:47 $
10 # Language:     perl
11 #
12 # (c) Copyright 2000-2006, Andrew@DeFaria.com, all rights reserved.
13 #
14 ################################################################################
15 use strict;
16 use warnings;
17
18 use FindBin;
19 local $0 = $FindBin::Script;
20
21 use lib "$FindBin::Bin/../lib";
22
23 use MAPS;
24 use MAPSWeb;
25
26 use CGI qw/:standard *table/;
27 use CGI::Carp "fatalsToBrowser";
28
29 use MIME::Parser;
30 use MIME::Base64;
31 use MIME::Words qw(:all);
32
33 my $userid = cookie('MAPSUser');
34 my $sender = param('sender');
35
36 # CGI will replace '+' with ' ', which many mailers are starting to do,
37 # so add it back
38 $sender =~ s/ /\+/;
39
40 my $msg_date   = param('msg_date');
41 my $table_name = 'message';
42
43 sub ParseEmail(@) {
44   my (@header) = @_;
45
46   my %header;
47
48   # First output the header information. Note we'll skip uninteresting stuff
49   for (@header) {
50     last if ($_ eq '' || $_ eq "\cM");
51
52     # Escape "<" and ">"
53     s/\</\&lt\;/;
54     s/\>/\&gt\;/;
55
56     if (/^from:\s*(.*)/i) {
57       $header{From} = $1;
58     } elsif (/^subject:\s*(.*)/i) {
59       $header{Subject} = $1;
60     } elsif (/^date:\s*(.*)/i) {
61       $header{date} = $1;
62     } elsif (/^To:\s*(.*)/i) {
63       $header{to} = $1;
64     } elsif (/^Content-Transfer-Encoding: base64/) {
65       $header{base64} = 1;
66     } # if
67   } # for
68
69   return %header;
70 } # ParseEmail
71
72 sub Body($) {
73   my ($date) = @_;
74
75   # Find unique message using $date
76   my ($err, $msg) = FindEmail(
77     userid    => $userid,
78     sender    => $sender,
79     timestamp => $date,
80   );
81
82   my $rec = GetEmail;
83
84   my $parser = MIME::Parser->new();
85
86   $parser->output_to_core(1);
87   $parser->tmp_to_core(1);
88
89   my $entity = $parser->parse_data($rec->{data});
90
91   my %header = ParseEmail @{($entity->header)[0]};
92
93   print p . "\n";
94     print start_table ({-align        => "center",
95                         -id           => $table_name,
96                         -border       => 0,
97                         -cellspacing  => 0,
98                         -cellpadding  => 0,
99                         -width        => "100%"});
100     print start_table ({-align        => "center",
101                         -bgcolor      => 'steelblue',
102                         #-bgcolor      => "#d4d0c8",
103                         -border       => 0,
104                         -cellspacing  => 2,
105                         -cellpadding  => 2,
106                         -width        => "100%"}) . "\n";
107     print "<tbody><tr><td>\n";
108     print start_table ({-align        => "center",
109                         -border       => 0,
110                         -cellspacing  => 0,
111                         -cellpadding  => 2,
112                         -bgcolor      => 'black',
113                         #-bgcolor      => "#ece9d8",
114                         -width        => "100%"}) . "\n";
115
116     for (keys (%header)) {
117       next if /base64/;
118
119       my $str = decode_mimewords($header{$_});
120
121       print Tr ([
122         th ({-align    => 'right',
123              -bgcolor  => 'steelblue',
124              -style    => 'color: white',
125              #-bgcolor  => "#ece9d8",
126              -width    => "8%"}, ucfirst "$_:") . "\n" .
127         td ({-bgcolor  => 'white'}, $str)
128       ]);
129     } # for
130
131     print end_table;
132     print "</td></tr>";
133     print end_table;
134
135   print start_table ({-align        => 'center',
136                       -bgcolor      => 'steelblue',
137                       -border       => 0,
138                       -cellspacing  => 0,
139                       -cellpadding  => 2,
140                       -width        => "100%"}) . "\n";
141   print "<tbody><tr><td>\n";
142   print start_table ({-align        => "center",
143                       -border       => 0,
144                       -cellspacing  => 0,
145                       -cellpadding  => 2,
146                       -bgcolor      => 'white',
147                       -width        => "100%"}) . "\n";
148   print "<tbody><tr><td>\n";
149
150   my @parts = $entity->parts;
151
152   if (scalar @parts == 0) {
153     if ($entity->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'} and
154         ${$entity->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'}[0]} =~ /base64/) {
155       print $entity->{ME_Bodyhandle}{MBS_Data};
156     } else {
157       print '<pre>';
158       print $entity->print_body;
159       print '</pre>';
160     } # if
161   } else {
162     for my $part ($entity->parts) {
163       # We assume here that if this part is multipart/alternative then
164       # there exists at least one part that is text/html and we favor
165       # that (since we're outputing to a web page anyway...
166       if ($part->mime_type eq 'multipart/alternative') {
167         for my $subpart ($part->parts) {
168           if ($subpart->mime_type eq 'text/html') {
169             # There should be an easier way to get this but I couldn't find one.
170             my $encoding = ${$subpart->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'}[0]};
171             if ($encoding =~ /base64/) {
172               $subpart->bodayhandle->print;
173             } else {
174               print $subpart->print_body;
175             } # if
176             last;
177           } elsif ($subpart->mime_type eq 'multipart/related') {
178             # This is stupid - multipart/related? When it's really just HTML?!?
179             $subpart->print_body;
180             last;
181           } # if
182         } # for
183       } elsif ($part->mime_type eq 'multipart/related') {
184         # Sometimes parts are 'multipart/relative'...
185         $part->print_body;
186       } else {
187         if ($part->mime_type =~ /text/) {
188           my $encoding = '';
189
190           $encoding = ${$part->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'}[0]}
191             if $part->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'};
192
193           if ($encoding =~ /base64/) {
194             $part->bodyhandle->print();
195           } else {
196             print '<pre>';
197             print $part->print_body;
198             print '</pre>';
199           } # if
200         } # if
201       } # if
202     } # for
203   } # if
204
205   print "</td></tr>\n";
206   print end_table;
207   print "</td></tr>\n";
208   print end_table;
209   print end_table;
210 } # Body
211
212 $userid = Heading(
213   'getcookie',
214   '',
215   "Email message from $sender",
216   "Email message from $sender",
217   '',
218   $table_name,
219 );
220
221 $userid //= $ENV{USER};
222
223 SetContext($userid);
224 NavigationBar($userid);
225
226 Body($msg_date);
227
228 Footing($table_name);