622c148620d0c6c5c6cdff23bfe024390b0b12ad
[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     my ($onlist, $rule);
177     $rule = 'none';
178
179     ($onlist, $rule) = OnNulllist $sender;
180
181     unless ($onlist) {
182       ($onlist, $rule) = OnBlacklist $sender;
183
184       unless ($onlist) {
185         ($onlist, $rule) = OnWhitelist $sender;
186       } # unless
187     } # unless
188
189     $next++;
190     print
191       start_Tr {-valign => 'middle'};
192     print
193       td {-class => 'tableborder'}, small ($next,
194         checkbox {-name  => "action$next",
195                   -label => ''}),
196           hidden ({-name    => "email$next",
197                    -default => $sender});
198     print
199       start_td {-align => 'left'};
200     print
201       start_table {-class       => 'tablerightdata',
202                    -cellpadding => 2,
203                    -callspacing => 0,
204                    -border      => 0,
205                    -width       => '100%',
206                    -bgcolor     => '#d4d0c8'};
207     print
208       td {-class   => 'tablelabel',
209           -valign  => 'middle',
210           -width   => '40'}, 'Sender:',
211       td {-class   => 'sender',
212           -valign  => 'middle',
213           -width   => '50%'},
214         a {-href   => "mailto:$sender?subject=$msgs2[0][0]"}, $sender,
215       td {
216           -valign  => 'middle'},
217           $rule;
218     print
219       end_table;
220
221     my $messages = 1;
222
223     foreach (@msgs) {
224       my $msg_date = pop @{$_};
225       my $subject  = pop @{$_};
226
227       if ($date eq substr ($msg_date, 0, 10)) {
228         $msg_date = b font {-color => 'green'}, SQLDatetime2UnixDatetime $msg_date;
229       } else {
230         $msg_date = SQLDatetime2UnixDatetime $msg_date;
231       } # if
232
233       $subject = $subject eq '' ? '&lt;Unspecified&gt;' : $subject;
234       $subject = decode_mimewords ($subject);
235       $subject =~ s/\>/&gt;/g;
236       $subject =~ s/\</&lt;/g;
237
238       print
239         start_table {-class       => 'tablerightdata',
240                      -cellpadding => 2,
241                      -cellspacing => 2,
242                      -border      => 0,
243                      -width       => '100%'};
244       my $msg_nbr = $messages;
245       print
246         Tr [
247           td {-class   => 'msgnbr',
248               -valign  => 'middle',
249               -rowspan => 2,
250               -width   => '2%'}, $messages++,
251           td {-class   => 'tablelabel',
252               -valign  => 'middle',
253               -width   => '45'}, 'Subject:',
254           td {-class   => 'subject',
255               -valign  => 'middle',
256               -bgcolor => '#ffffff'},
257            a {-href    => "display.cgi?sender=$sender;msg_nbr=$msg_nbr"}, $subject,
258           td {-class   => 'date',
259               -width   => '150',
260               -valign  => 'middle'}, $msg_date
261         ];
262       print end_table;
263     } # foreach
264     print end_td;
265     print end_Tr;
266   } # foreach
267
268   print start_div {-class => 'toolbar'};
269   print
270     Tr [
271       td {-class  => 'tableborderbottomleft',
272           -valign => 'middle'},
273       td {-class  => 'tableborderbottomright',
274           -valign => 'middle'},
275       $buttons
276     ];
277   print end_div;
278   print end_table;
279   print end_form;
280 } # PrintTable
281
282 # Main
283 my @scripts = ('ListActions.js');
284
285 my $heading_date =$date ne '' ? ' on ' . FormatDate ($date) : '';
286
287 $userid = Heading (
288   'getcookie',
289   '',
290   (ucfirst ($type) . ' Report'),
291   $types {$type} [0],
292   $types {$type} [1] . $heading_date,
293   $table_name,
294   @scripts
295 );
296
297 $userid ||= $ENV{USER};
298
299 SetContext $userid;
300 NavigationBar $userid;
301
302 unless ($lines) {
303   my %options = GetUserOptions $userid;
304   $lines = $options{'Page'};
305 } # unless
306
307 if ($date eq '') {
308   $condition .= "userid = '$userid' and type = '$type'";
309 } else {
310   my $sod = $date . ' 00:00:00';
311   my $eod = $date . ' 23:59:59';
312
313   $condition .= "userid = '$userid' and type = '$type' "
314               . "and timestamp > '$sod' and timestamp < '$eod' ";
315 } # if
316
317 $total = MAPSDB::count_distinct ('log', 'sender', $condition);
318
319 $next ||= 0;
320
321 $last = $next + $lines < $total ? $next + $lines : $total;
322
323 if (($next - $lines) > 0) {
324   $prev = $next - $lines;
325 } else {
326   $prev = $next eq 0 ? -1 : 0;
327 } # if
328
329 PrintTable $type;
330
331 Footing $table_name;
332
333 exit;