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