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);'});
140 return $buttons . $next_button;
146 my $current = $next + 1;
148 print div {-align => 'center'}, b (
149 '(' . $current . '-' . $last . ' of ' . $total . ')');
152 -action => 'processaction.cgi',
155 print start_table({-align => 'center',
160 -width => '100%'}) . "\n";
162 my $buttons = MakeButtons $type;
164 print start_div {-class => 'toolbar'};
167 td {-class => 'tablebordertopleft',
168 -valign => 'middle'},
169 td {-class => 'tablebordertopright',
171 -align => 'center'}, $buttons,
175 for my $sender (ReturnSenders(
182 my $msgs = ReturnMessages(
187 # This is for the purposes of supplying a subject line if the mailto address
188 # is clicked on. It's kludgy because we are simply grabbing the subject line
189 # of the first email sent where there may be many emails from this sender.
190 # Still it is often the right subject (or a good enough one)
192 # A little tricky here because of transliteration. If I test for
193 # $msg->[0]{subject} when $msg->[0] is essentially empty I create the hash
194 # making it non empty. Therefore I need to first test if $msgs->[0] exists
199 $heading = $msgs->[0]{subject} if $msgs->[0]{subject};
207 ($onlist, $rule, $seq, $hit_count) = OnWhitelist($sender, $userid, 0);
210 ($onlist, $rule, $seq, $hit_count) = OnBlacklist($sender, 0);
213 ($onlist, $rule, $seq, $hit_count) = OnNulllist($sender, 0);
218 if ($rule =~ /\((\w+):(\d+)\)\s+"(.*)"/) {
221 my $next = $sequence - 1;
226 $rule = "<a href=\"/maps/php/list.php?type=$list&next=$next\">$list:$sequence</a>/$hit_count $rule";
232 start_Tr {-valign => 'middle'};
234 td {-class => 'tableborder'}, small ($next,
235 checkbox {-name => "action$next",
237 hidden ({-name => "email$next",
238 -default => $sender});
240 start_td {-align => 'left'};
242 start_table {-class => 'tablerightdata',
247 -bgcolor => '#d4d0c8'};
250 $heading = "?subject=$heading" if $heading;
252 td {-class => 'tablelabel',
254 -width => '40'}, 'Sender:',
255 td {-class => 'sender',
258 a {-href => "mailto:$sender$heading"}, $sender,
260 -valign => 'middle'},
267 for my $rec (@$msgs) {
268 if ($date eq substr ($rec->{timestamp}, 0, 10)) {
269 $rec->{date} = b font {-color => 'green'}, SQLDatetime2UnixDatetime $rec->{timestamp};
271 $rec->{date} = SQLDatetime2UnixDatetime $rec->{timestamp};
274 $rec->{subject} //= '<Unspecified>';
275 $rec->{subject} = decode_mimewords ($rec->{subject});
276 $rec->{subject} =~ s/\>/>/g;
277 $rec->{subject} =~ s/\</</g;
280 start_table {-class => 'tablerightdata',
287 td {-class => 'msgnbr',
290 -width => '2%'}, $messages++,
291 td {-class => 'tablelabel',
293 -width => '45'}, 'Subject:',
294 td {-class => 'subject',
296 -bgcolor => '#ffffff'},
297 a {-href => "display.cgi?sender=$sender;msg_date=$rec->{timestamp}"}, $rec->{subject},
298 td {-class => 'date',
300 -valign => 'middle'}, $rec->{date},
308 print start_div {-class => 'toolbar'};
311 td {-class => 'tableborderbottomleft',
312 -valign => 'middle'},
313 td {-class => 'tableborderbottomright',
314 -valign => 'middle'},
326 my @scripts = ('ListActions.js');
328 my $heading_date =$date ne '' ? ' on ' . FormatDate ($date, 1) : '';
333 (ucfirst ($type) . ' Report'),
335 $types{$type} [1] . $heading_date,
340 $userid ||= $ENV{USER};
343 NavigationBar($userid);
346 my %options = GetUserOptions($userid);
347 $lines = $options{'Page'};
351 $condition .= "type = '$type'";
353 my $sod = $date . ' 00:00:00';
354 my $eod = $date . ' 23:59:59';
356 $condition .= "type = '$type' and timestamp > '$sod' and timestamp < '$eod'";
361 additional => $condition,
366 $last = $next + $lines < $total ? $next + $lines : $total;
368 if (($next - $lines) > 0) {
369 $prev = $next - $lines;
371 $prev = $next == 0 ? -1 : 0;
376 Footing($table_name);