Added Subject to email address
[clearscm.git] / maps / bin / detail.cgi
1 #!/usr/bin/perl
2 #################################################################################
3 # File:         $RCSfile: detail.cgi,v $
4 # Revision:     $Revision: 1.1 $
5 # Description:  Displays list of email addresses based on report type.
6 # Author:       Andrew@DeFaria.com
7 # Created:      Fri Nov 29 14:17:21  2002
8 # Modified:     $Date: 2013/06/12 14:05:47 $
9 # Language:     perl
10 #
11 # (c) Copyright 2000-2006, Andrew@DeFaria.com, all rights reserved.
12 #
13 ################################################################################use strict;
14 use warnings;
15
16 use MIME::Words qw(:all);
17 use FindBin;
18 $0 = $FindBin::Script;
19
20 use lib $FindBin::Bin;
21
22 use MAPS;
23 use MAPSLog;
24 use MAPSUtil;
25 use MAPSWeb;
26 use CGI qw (:standard *table start_td end_td start_Tr end_Tr start_div end_div);
27 use CGI::Carp 'fatalsToBrowser';
28
29 my $type   = param ('type');
30 my $next   = param ('next');
31 my $lines  = param ('lines');
32 my $date   = param ('date');
33
34 $date ||= '';
35
36 my $userid;
37 my $current;
38 my $last;
39 my $prev;
40 my $total;
41 my $table_name = 'detail';
42
43 my %types = (
44   'blacklist'   => [
45     'Blacklist report',
46     'The following blacklisted users attempted to email you'
47   ],
48   'whitelist'   => [
49     'Delivered report',
50     'Delivered email from the following users'
51   ],
52   'nulllist'    => [
53     'Discarded report',
54     'Discarded messages from the following users'
55   ],
56   'error'       => [
57     'Error report',
58     'Errors detected'
59   ],
60   'mailloop'    => [
61     'MailLoop report',
62     'Automatically detected mail loops from the following users'
63   ],
64   'registered'  => [
65     'Registered report',
66     'The following users have recently registered'
67   ],
68   'returned'    => [
69     'Returned report',
70     'Sent Register reply to the following users'
71   ]
72 );
73
74 sub MakeButtons {
75   my $type = shift;
76
77   my $prev_button = $prev >= 0 ?
78     a ({-href      => "detail.cgi?type=$type;date=$date;next=$prev",
79         -accesskey => 'p',
80     }, '<img src=/maps/images/previous.gif border=0 alt=Previous align=middle>') : '';
81   my $next_button = ($next + $lines) < $total ?
82     a {-href      => "detail.cgi?type=$type;date=$date;next=" . ($next + $lines),
83        -accesskey => 'n',
84     }, '<img src=/maps/images/next.gif border=0 alt=Next align=middle>' : '';
85
86   my $buttons = $prev_button;
87
88   if ($type eq 'whitelist') {
89     $buttons = $buttons .
90       submit ({-name    => 'action',
91                -value   => 'Blacklist Marked',
92                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
93       submit ({-name    => 'action',
94                -value   => 'Nulllist Marked',
95                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
96       submit ({-name    => 'action',
97                -value   => 'Reset Marks',
98                -onClick => 'return ClearAll (document.detail);'});
99   } elsif ($type eq 'blacklist') {
100     $buttons = $buttons .
101       submit ({-name    => 'action',
102                -value   => 'Whitelist Marked',
103                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
104       submit ({-name    => 'action',
105                -value   => 'Nulllist Marked',
106                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
107       submit ({-name    => 'action',
108                -value   => 'Reset Marks',
109                -onClick => 'return ClearAll (document.detail);'});
110   } elsif ($type eq 'nulllist') {
111     $buttons = $buttons .
112       submit ({-name    => 'action',
113                -value   => 'Whitelist Marked',
114                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
115       submit ({-name    => 'action',
116                -value   => 'Blacklist Marked',
117                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
118       submit ({-name    => 'action',
119                -value   => 'Reset Marks',
120                -onClick => 'return ClearAll (document.detail);'});
121   } else {
122     $buttons = $buttons .
123       submit ({-name    => 'action',
124                -value   => 'Whitelist Marked',
125                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
126       submit ({-name    => 'action',
127                -value   => 'Blacklist Marked',
128                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
129       submit ({-name    => 'action',
130                -value   => 'Nulllist Marked',
131                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
132       submit ({-name    => 'action',
133                -value   => 'Reset Marks',
134                -onClick => 'return ClearAll (document.detail);'});
135   } # if
136
137   return $buttons . $next_button;
138 } # MakeButtons
139
140 sub PrintTable {
141   my ($type) = @_;
142
143   my $current = $next + 1;
144
145   print div {-align => 'center'}, b (
146     '(' . $current . '-' . $last . ' of ' . $total . ')');
147   print start_form {
148     -method => 'post',
149     -action => 'processaction.cgi',
150     -name   => 'detail'
151   };
152   print start_table ({-align        => 'center',
153                       -id           => $table_name,
154                       -border       => 0,
155                       -cellspacing  => 0,
156                       -cellpadding  => 0,
157                       -width        => '100%'}) . "\n";
158
159   my $buttons = MakeButtons $type;
160
161   print start_div {-class => 'toolbar'};
162   print
163     Tr [
164       td {-class  => 'tablebordertopleft',
165           -valign => 'middle'},
166       td {-class  => 'tablebordertopright',
167           -valign => 'middle',
168           -align  => 'center'}, $buttons,
169     ];
170   print end_div;
171
172   foreach my $sender (ReturnSenders $userid, $type, $next, $lines, $date) {
173     my @msgs = ReturnMessages $userid, $sender;
174     my @msgs2 = @msgs;
175
176     $next++;
177     print
178       start_Tr {-valign => 'middle'};
179     print
180       td {-class => 'tableborder'}, small ($next,
181         checkbox {-name  => "action$next",
182                   -label => ''}),
183           hidden ({-name     => "email$next",
184                    -default => $sender});
185     print
186       start_td {-align => 'left'};
187     print
188       start_table {-class       => 'tablerightdata',
189                    -cellpadding => 2,
190                    -callspacing => 0,
191                    -border      => 0,
192                    -width       => '100%',
193                    -bgcolor     => '#d4d0c8'};
194     print
195       td {-class   => 'tablelabel',
196           -valign  => 'middle',
197           -width   => '40'}, 'Sender:',
198       td {-class   => 'sender',
199           -valign  => 'middle'},
200         a {-href   => "mailto:$sender?subject=$msgs2[0][0]"}, $sender;
201     print
202       end_table;
203
204     my $messages = 1;
205
206     foreach (@msgs) {
207       my $msg_date = pop @{$_};
208       my $subject  = pop @{$_};
209
210       if ($date eq substr ($msg_date, 0, 10)) {
211         $msg_date = b font {-color => 'green'}, SQLDatetime2UnixDatetime $msg_date;
212       } else {
213         $msg_date = SQLDatetime2UnixDatetime $msg_date;
214       } # if
215
216       $subject = $subject eq '' ? '&lt;Unspecified&gt;' : $subject;
217       $subject = decode_mimewords ($subject);
218       $subject =~ s/\>/&gt;/g;
219       $subject =~ s/\</&lt;/g;
220
221       print
222         start_table {-class       => 'tablerightdata',
223                      -cellpadding => 2,
224                      -cellspacing => 2,
225                      -border      => 0,
226                      -width       => '100%'};
227       my $msg_nbr = $messages;
228       print
229         Tr [
230           td {-class   => 'msgnbr',
231               -valign  => 'middle',
232               -rowspan => 2,
233               -width   => '2%'}, $messages++,
234           td {-class   => 'tablelabel',
235               -valign  => 'middle',
236               -width   => '45'}, 'Subject:',
237           td {-class   => 'subject',
238               -valign  => 'middle',
239               -bgcolor => '#ffffff'},
240            a {-href    => "display.cgi?sender=$sender;msg_nbr=$msg_nbr"}, $subject,
241           td {-class   => 'date',
242               -width   => '130',
243               -valign  => 'middle'}, $msg_date
244         ];
245       print end_table;
246     } # foreach
247     print end_td;
248     print end_Tr;
249   } # foreach
250
251   print start_div {-class => 'toolbar'};
252   print
253     Tr [
254       td {-class  => 'tableborderbottomleft',
255           -valign => 'middle'},
256       td {-class  => 'tableborderbottomright',
257           -valign => 'middle'},
258       $buttons
259     ];
260   print end_div;
261   print end_table;
262   print end_form;
263 } # PrintTable
264
265 # Main
266 my @scripts = ('ListActions.js');
267
268 my $heading_date =$date ne '' ? ' on ' . FormatDate ($date) : '';
269
270 $userid = Heading (
271   'getcookie',
272   '',
273   (ucfirst ($type) . ' Report'),
274   $types {$type} [0],
275   $types {$type} [1] . $heading_date,
276   $table_name,
277   @scripts
278 );
279
280 $userid ||= $ENV{USER};
281
282 SetContext $userid;
283 NavigationBar $userid;
284
285 unless ($lines) {
286   my %options = GetUserOptions $userid;
287   $lines = $options{'Page'};
288 } # unless
289
290 if ($date eq '') {
291   $condition .= "userid = '$userid' and type = '$type'";
292 } else {
293   my $sod = $date . ' 00:00:00';
294   my $eod = $date . ' 23:59:59';
295
296   $condition .= "userid = '$userid' and type = '$type' "
297               . "and timestamp > '$sod' and timestamp < '$eod' ";
298 } # if
299
300 $total = MAPSDB::count_distinct ('log', 'sender', $condition);
301
302 $next ||= 0;
303
304 $last = $next + $lines < $total ? $next + $lines : $total;
305
306 if (($next - $lines) > 0) {
307   $prev = $next - $lines;
308 } else {
309   $prev = $next eq 0 ? -1 : 0;
310 } # if
311
312 PrintTable $type;
313
314 Footing $table_name;
315
316 exit;