Merge branch 'master' of git+ssh://github.com/adefaria/clearscm
[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 $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 $handle = FindEmail $sender, $date;
77
78   my ($userid, $sender, $subject, $timestamp, $message) = GetEmail $handle;
79
80   my $parser = MIME::Parser->new();
81
82   $parser->output_to_core(1);
83
84   my $entity = $parser->parse_data ($message);
85
86   my %header = ParseEmail @{($entity->header)[0]};
87
88   print p . "\n";
89     print start_table ({-align        => "center",
90                         -id           => $table_name,
91                         -border       => 0,
92                         -cellspacing  => 0,
93                         -cellpadding  => 0,
94                         -width        => "100%"});
95     print start_table ({-align        => "center",
96                         -bgcolor      => "#d4d0c8",
97                         -border       => 0,
98                         -cellspacing  => 2,
99                         -cellpadding  => 2,
100                         -width        => "100%"}) . "\n";
101     print "<tbody><tr><td>\n";
102     print start_table ({-align        => "center",
103                         -border       => 0,
104                         -cellspacing  => 0,
105                         -cellpadding  => 2,
106                         -bgcolor      => "#ece9d8",
107                         -width        => "100%"}) . "\n";
108
109     for (keys (%header)) {
110       next if /base64/;
111
112       my $str = decode_mimewords($header{$_});
113
114       print Tr ([
115         th ({-align    => "right",
116              -bgcolor  => "#ece9d8",
117              -width    => "8%"}, "$_:") . "\n" .
118         td ({-bgcolor  => "white"}, $str)
119       ]);
120     } # for
121
122     print end_table;
123     print "</td></tr>";
124     print end_table;
125
126   print start_table ({-align        => "center",
127                       -bgcolor      => "black",
128                       -border       => 0,
129                       -cellspacing  => 0,
130                       -cellpadding  => 2,
131                       -width        => "100%"}) . "\n";
132   print "<tbody><tr><td>\n";
133   print start_table ({-align        => "center",
134                       -border       => 0,
135                       -cellspacing  => 0,
136                       -cellpadding  => 2,
137                       -bgcolor      => "white",
138                       -width        => "100%"}) . "\n";
139   print "<tbody><tr><td>\n";
140
141   my @parts = $entity->parts;
142
143   if (scalar @parts == 0) {
144     if ($entity->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'} and
145         ${$entity->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'}[0]} =~ /base64/) {
146       print $entity->{ME_Bodyhandle}{MBS_Data};
147     } else {
148       print '<pre>';
149       $entity->print_body;
150       print '</pre>';
151     } # if
152   } else {
153     for my $part ($entity->parts) {
154       # We assume here that if this part is multipart/alternative then
155       # there exists at least one part that is text/html and we favor
156       # that (since we're outputing to a web page anyway...
157       if ($part->mime_type eq 'multipart/alternative') {
158         for my $subpart ($part->parts) {
159           if ($subpart->mime_type eq 'text/html') {
160             # There should be an easier way to get this but I couldn't find one.
161             my $encoding = ${$subpart->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'}[0]};
162             if ($encoding =~ /base64/) {
163               $subpart->bodyhandle->print();
164             } else {
165               $subpart->print_body;
166             } # if
167             last;
168           } elsif ($subpart->mime_type eq 'multipart/related') {
169             # This is stupid - multipart/related? When it's really just HTML?!?
170             $subpart->print_body;
171             last;
172           } # if
173         } # for
174       } elsif ($part->mime_type eq 'multipart/related') {
175         # Sometimes parts are 'multipart/relative'...
176         $part->print_body;
177       } else {
178         if ($part->mime_type =~ /text/) {
179           my $encoding = '';
180
181           $encoding = ${$part->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'}[0]}
182             if $part->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'};
183
184           if ($encoding =~ /base64/) {
185             $part->bodyhandle->print();
186           } else {
187             print '<pre>';
188             $part->print_body;
189             print '</pre>';
190           } # if
191         } # if
192       } # if
193     } # for
194   } # if
195
196   print "</td></tr>\n";
197   print end_table;
198   print "</td></tr>\n";
199   print end_table;
200   print end_table;
201 } # Body
202
203 $userid = Heading(
204   'getcookie',
205   '',
206   "Email message from $sender",
207   "Email message from $sender",
208   '',
209   $table_name,
210 );
211
212 SetContext($userid);
213 NavigationBar($userid);
214
215 Body($msg_date);
216
217 Footing($table_name);