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