76f5ab6fef6f541c65aba432c9ad920f9c502e79
[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 my $msg_nbr     = param('msg_nbr');
36 my $table_name  = 'message';
37
38 sub ParseEmail(@) {
39   my (@header) = @_;
40
41   my %header;
42
43   # First output the header information. Note we'll skip uninteresting stuff
44   for (@header) {
45     last if ($_ eq '' || $_ eq "\cM");
46
47     # Escape "<" and ">"
48     s/\</\&lt\;/;
49     s/\>/\&gt\;/;
50
51     if (/^from:\s*(.*)/i) {
52       $header{From} = $1;
53     } elsif (/^subject:\s*(.*)/i) {
54       $header{Subject} = $1;
55     } elsif (/^date:\s*(.*)/i) {
56       $header{date} = $1;
57     } elsif (/^To:\s*(.*)/i) {
58       $header{to} = $1;
59     } elsif (/^Content-Transfer-Encoding: base64/) {
60       $header{base64} = 1;
61     } # if
62   } # for
63
64   return %header;
65 } # ParseEmail
66
67 sub Body($) {
68   my ($count) = @_;
69
70   $count ||= 1;
71
72   my $handle = FindEmail $sender;
73
74   my ($userid, $sender, $subject, $timestamp, $message);
75
76   # Need to handle multiple messages
77   for (my $i = 0; $i < $count; $i++) {
78     ($userid, $sender, $subject, $timestamp, $message) = GetEmail $handle;
79   } # for
80
81   my $parser = MIME::Parser->new();
82
83   $parser->output_to_core (1);
84
85   my $entity = $parser->parse_data ($message);
86
87   my %header = ParseEmail @{($entity->header)[0]};
88
89   print p . "\n";
90     print start_table ({-align        => "center",
91                         -id           => $table_name,
92                         -border       => 0,
93                         -cellspacing  => 0,
94                         -cellpadding  => 0,
95                         -width        => "100%"});
96     print start_table ({-align        => "center",
97                         -bgcolor      => "#d4d0c8",
98                         -border       => 0,
99                         -cellspacing  => 2,
100                         -cellpadding  => 2,
101                         -width        => "100%"}) . "\n";
102     print "<tbody><tr><td>\n";
103     print start_table ({-align        => "center",
104                         -border       => 0,
105                         -cellspacing  => 0,
106                         -cellpadding  => 2,
107                         -bgcolor      => "#ece9d8",
108                         -width        => "100%"}) . "\n";
109
110     foreach (keys (%header)) {
111       next if /base64/;
112
113       my $str = decode_mimewords ($header{$_});
114
115       print Tr ([
116         th ({-align    => "right",
117              -bgcolor  => "#ece9d8",
118              -width    => "8%"}, "$_:") . "\n" .
119         td ({-bgcolor  => "white"}, $str)
120       ]);
121     } # if
122
123     print end_table;
124     print "</td></tr>";
125     print end_table;
126
127   print start_table ({-align        => "center",
128                       -bgcolor      => "black",
129                       -border       => 0,
130                       -cellspacing  => 0,
131                       -cellpadding  => 2,
132                       -width        => "100%"}) . "\n";
133   print "<tbody><tr><td>\n";
134   print start_table ({-align        => "center",
135                       -border       => 0,
136                       -cellspacing  => 0,
137                       -cellpadding  => 2,
138                       -bgcolor      => "white",
139                       -width        => "100%"}) . "\n";
140   print "<tbody><tr><td>\n";
141
142   my @parts = $entity->parts;
143
144   if (scalar @parts == 0) {
145     if ($entity->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'} and
146         ${$entity->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'}[0]} =~ /base64/) {
147       print $entity->{ME_Bodyhandle}{MBS_Data};
148     } else {
149       print '<pre>';
150       $entity->print_body;
151       print '</pre>';
152     } # if
153   } else {
154     for my $part ($entity->parts) {
155       # We assume here that if this part is multipart/alternative then
156       # there exists at least one part that is text/html and we favor
157       # that (since we're outputing to a web page anyway...
158       if ($part->mime_type eq 'multipart/alternative') {
159         for my $subpart ($part->parts) {
160           if ($subpart->mime_type eq 'text/html') {
161             # There should be an easier way to get this but I couldn't find one.
162             my $encoding = ${$subpart->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'}[0]};
163             if ($encoding =~ /base64/) {
164               $subpart->bodyhandle->print();
165             } else {
166               $subpart->print_body;
167             } # if
168             last;
169           } elsif ($subpart->mime_type eq 'multipart/related') {
170             # This is stupid - multipart/related? When it's really just HTML?!?
171             $subpart->print_body;
172             last;
173           } # if
174         } # for
175       } elsif ($part->mime_type eq 'multipart/related') {
176         # Sometimes parts are 'multipart/relative'...
177         $part->print_body;
178       } else {
179         if ($part->mime_type =~ /text/) {
180           my $encoding = '';
181
182           $encoding = ${$part->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'}[0]}
183             if $part->{mail_inet_head}{mail_hdr_hash}{'Content-Transfer-Encoding'};
184
185           if ($encoding =~ /base64/) {
186             $part->bodyhandle->print();
187           } else {
188             print '<pre>';
189             $part->print_body;
190             print '</pre>';
191           } # if
192         } # if
193       } # if
194     } # for
195   } # if
196
197   print "</td></tr>\n";
198   print end_table;
199   print "</td></tr>\n";
200   print end_table;
201   print end_table;
202 } # Body
203
204 $userid = Heading(
205   'getcookie',
206   '',
207   "Email message from $sender",
208   "Email message from $sender",
209   '',
210   $table_name,
211 );
212
213 SetContext($userid);
214 NavigationBar($userid);
215
216 Body($msg_nbr);
217
218 Footing($table_name);