2 ################################################################################
4 # File: $RCSfile: detail.cgi,v $
5 # Revision: $Revision: 1.1 $
6 # Description: Displays list of email addresses based on report type.
7 # Author: Andrew@DeFaria.com
8 # Created: Fri Nov 29 14:17:21 2002
9 # Modified: $Date: 2013/06/12 14:05:47 $
12 # (c) Copyright 2000-2006, Andrew@DeFaria.com, all rights reserved.
14 ################################################################################
18 use MIME::Words qw(:all);
20 use CGI qw(:standard *table start_td end_td start_Tr end_Tr start_div end_div);
21 use CGI::Carp 'fatalsToBrowser';
25 local $0 = $FindBin::Script;
27 use lib "$FindBin::Bin/../lib";
28 use lib "$FindBin::Bin/../../lib";
35 my $type = param 'type';
36 my $next = param 'next';
37 my $lines = param 'lines';
38 my $date = param 'date';
42 my ($userid, $current, $last, $prev, $total);
44 my $table_name = 'detail';
49 'The following blacklisted users attempted to email you'
53 'Delivered email from the following users'
57 'Discarded messages from the following users'
65 'Automatically detected mail loops from the following users'
69 'The following users have recently registered'
73 'Sent Register reply to the following users'
80 my $prev_button = $prev >= 0 ?
81 a ({-href => "detail.cgi?type=$type;date=$date;next=$prev",
83 }, '<img src=/maps/images/previous.gif border=0 alt=Previous align=middle>') : '';
84 my $next_button = ($next + $lines) < $total ?
85 a {-href => "detail.cgi?type=$type;date=$date;next=" . ($next + $lines),
87 }, '<img src=/maps/images/next.gif border=0 alt=Next align=middle>' : '';
89 my $buttons = $prev_button;
91 if ($type eq 'whitelist') {
93 submit ({-name => 'action',
94 -value => 'Blacklist',
95 -onClick => 'return CheckAtLeast1Checked (document.detail);'}) . ' ' .
96 submit ({-name => 'action',
98 -onClick => 'return CheckAtLeast1Checked (document.detail);'}) . ' ' .
99 submit ({-name => 'action',
101 -onClick => 'return ClearAll (document.detail);'});
102 } elsif ($type eq 'blacklist') {
103 $buttons = $buttons .
104 submit ({-name => 'action',
105 -value => 'Whitelist',
106 -onClick => 'return CheckAtLeast1Checked (document.detail);'}) . ' ' .
107 submit ({-name => 'action',
108 -value => 'Nulllist',
109 -onClick => 'return CheckAtLeast1Checked (document.detail);'}) . ' ' .
110 submit ({-name => 'action',
112 -onClick => 'return ClearAll (document.detail);'});
113 } elsif ($type eq 'nulllist') {
114 $buttons = $buttons .
115 submit ({-name => 'action',
116 -value => 'Whitelist',
117 -onClick => 'return CheckAtLeast1Checked (document.detail);'}) . ' ' .
118 submit ({-name => 'action',
119 -value => 'Blacklist',
120 -onClick => 'return CheckAtLeast1Checked (document.detail);'}) . ' ' .
121 submit ({-name => 'action',
123 -onClick => 'return ClearAll (document.detail);'});
125 $buttons = $buttons .
126 submit ({-name => 'action',
127 -value => 'Whitelist',
128 -onClick => 'return CheckAtLeast1Checked (document.detail);'}) . ' ' .
129 submit ({-name => 'action',
130 -value => 'Blacklist',
131 -onClick => 'return CheckAtLeast1Checked (document.detail);'}) . ' ' .
132 submit ({-name => 'action',
133 -value => 'Nulllist',
134 -onClick => 'return CheckAtLeast1Checked (document.detail);'}) . ' ' .
135 submit ({-name => 'action',
137 -onClick => 'return ClearAll (document.detail);'});
143 }, $buttons . $next_button;
151 my $current = $next + 1;
153 print div {-align => 'center'}, b (
154 '(' . $current . '-' . $last . ' of ' . $total . ')');
157 -action => 'processaction.cgi',
163 print start_table({-align => 'center',
168 -width => '100%'}) . "\n";
172 td {-class => 'tablebordertopleft'}, ' ',
173 th {-class => 'tableborder'}, 'Sender',
174 th {-class => 'tableborder'}, 'List',
175 th {-class => 'tableborder'}, 'Hit Count',
176 th {-class => 'tableborder'}, 'Rule',
177 th {-class => 'tablebordertopright'}, 'Comment',
180 for my $sender (ReturnSenders(
187 my $msgs = ReturnMessages(
192 # This is for the purposes of supplying a subject line if the mailto address
193 # is clicked on. It's kludgy because we are simply grabbing the subject line
194 # of the first email sent where there may be many emails from this sender.
195 # Still it is often the right subject (or a good enough one)
197 # A little tricky here because of transliteration. If I test for
198 # $msg->[0]{subject} when $msg->[0] is essentially empty I create the hash
199 # making it non empty. Therefore I need to first test if $msgs->[0] exists
204 $heading = $msgs->[0]{subject} if $msgs->[0]{subject};
212 ($onlist, $rule, $seq, $hit_count) = OnWhitelist($sender, $userid, 0);
215 ($onlist, $rule, $seq, $hit_count) = OnBlacklist($sender, 0);
218 ($onlist, $rule, $seq, $hit_count) = OnNulllist($sender, 0);
222 my ($list, $sequence, $comment);
226 if ($rule =~ /\((\w+):(\d+)\)\s+"(\S*)"/) {
231 } elsif ($rule =~ /\((\w+):(\d+)\)\s+"(\S*) - (.*)"/) {
244 my $rowspan = @$msgs + 1;
246 print start_Tr {-valign => 'middle'};
248 -class => 'tableborder',
249 -rowspan => $rowspan,
252 -name => "action$next",
255 -name => "email$next",
260 $heading = "?subject=$heading" if $heading;
265 -href => "mailto:$sender$heading",
268 my $listlink = ($list and $sequence) ? "$list:$sequence" : ' ';
271 -class => 'tabledata',
274 href => "/maps/php/list.php?type=$list&next=" . ($sequence - 1),
277 -class => 'tabledata',
279 }, "$hit_count ",
281 -class => 'tabledata',
284 -class => 'tablerightdata',
288 for my $rec (@$msgs) {
289 if ($date eq substr ($rec->{timestamp}, 0, 10)) {
290 $rec->{date} = b font {-color => 'green'}, SQLDatetime2UnixDatetime $rec->{timestamp};
292 $rec->{date} = SQLDatetime2UnixDatetime $rec->{timestamp};
295 $rec->{subject} //= '<Unspecified>';
296 $rec->{subject} = decode_mimewords ($rec->{subject});
297 $rec->{subject} =~ s/\>/>/g;
298 $rec->{subject} =~ s/\</</g;
305 -bgcolor => '#ffffff',
307 }, a {-href => "display.cgi?sender=$sender;msg_date=$rec->{timestamp}"
308 }, ' ' . $rec->{subject},
309 td {-class => 'tablerightdata',
312 -align => 'right'}, span {-class => 'date'}, $rec->{date},
319 td {-class => 'tableborderbottomleft'}, ' ',
320 th {-class => 'tableborder'}, ' ',
321 th {-class => 'tableborder'}, ' ',
322 th {-class => 'tableborder'}, ' ',
323 th {-class => 'tableborder'}, ' ',
324 th {-class => 'tableborderbottomright'}, ' '
336 my @scripts = ('ListActions.js');
338 my $heading_date =$date ne '' ? ' on ' . FormatDate ($date, 1) : '';
343 (ucfirst ($type) . ' Report'),
345 $types{$type} [1] . $heading_date,
350 $userid ||= $ENV{USER};
353 NavigationBar($userid);
356 my %options = GetUserOptions($userid);
357 $lines = $options{'Page'};
361 $condition .= "type = '$type'";
363 my $sod = $date . ' 00:00:00';
364 my $eod = $date . ' 23:59:59';
366 $condition .= "type = '$type' and timestamp > '$sod' and timestamp < '$eod'";
371 additional => $condition,
376 $last = $next + $lines < $total ? $next + $lines : $total;
378 if (($next - $lines) > 0) {
379 $prev = $next - $lines;
381 $prev = $next == 0 ? -1 : 0;
386 Footing($table_name);