-
Notifications
You must be signed in to change notification settings - Fork 0
/
cleanfeed.local.sample
207 lines (184 loc) · 6.87 KB
/
cleanfeed.local.sample
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
# vim: set tabstop=4 shiftwidth=4 expandtab syntax=perl:
######################### IMPORTANT! - READ CAREFULLY ########################
# This file contains some parts of my own cleafeed.local.
# Many of these checks are too much content based than what I feel
# confortable to put in the official source and others are just
# experimental or need site-specific tweaks.
# Before using any of this code please *think*, and be sure you really
# understand what it does.
######################### IMPORTANT! - READ CAREFULLY ########################
my @badaspnntps = (
'PostIT Now',
'Jobsearch Limited',
'AudioWeb', # audioweb.com
'Alex', # sex spam
'Paul Simmons', # OperationIT.com
'Alan', # equest.com
'Digital Media Works', # html sex spam
'Captive Technology', # ccsscorp.com jobs flood
'Computer Horzions ISG', # isgjobs.com jobs flood
'Mike Powers', # ResumeGateway.com jobs flood
);
my %badaspnntp = map { $_ => 1 } @badaspnntps;
undef @badaspnntps;
sub local_flag_localfeed {
return 1 if $hdr{Path} =~ /^not\-for\-mail$/;
return 0;
};
sub local_flag_spamsource {
return 1 if $hdr{'Injection-Info'} =~ /googlegroups\.com/;
return 1 if $hdr{Path} =~ /newsguy\.com!news\d$/;
return 0;
};
sub local_filter_first {
# if ($gr{binary} and not is_binary()) {
# saveart('is_binary')
# };
# local posts
if ($localfeed) {
if ($hdr{Approved}) {
foreach (@groups) {
if (not /^(?:alt|news\.admin\.net-abuse)\./) {
saveart('CF.approved');
return reject("Forged approval in $_ ($hdr{Approved})");
};
};
};
};
if (not $hdr{References}
and $hdr{'X-Trace'} =~ /posting\.google\.com/ and not $gr{reports}) {
if ($hdr{Subject} =~ /
cheap.*wholesale
| wholesale.*cheap
| ^\(CN-CIRCLE
| china.*(?:shoes|sandals|sneakers|clothes|bags|jeans|caps|
watch)
| shoes.*(?:gucci|parda|chanel|puma|hogan|bape|armani|ugg|ice|
versace)
/imx) {
saveart('subject');
return reject('Subject Rejected');
};
};
};
sub local_filter_bot {
if ($hdr{'X-Newsreader'}) {
if ($hdr{'X-Newsreader'} =~ /^AspNNTP \S+ \((.*)\)/) {
return reject('AspNNTP', 'Bot signature')
if exists $badaspnntp{$1};
#saveart('W.aspnntp', $hdr{'X-Newsreader'});
};
};
};
sub local_filter_last {
if (not $hdr{References} and
$hdr{__LINES__} > 25 and
$hdr{__LINES__} < 150 and
scalar @groups > 4 and
scalar @followups > 4) {
if ($hdr{__BODY__} =~ /MI5/ or
$hdr{Subject} =~ /M.{1,3}I.{1,3}5/) {
saveart('mi5');
return reject('MI5 Filter');
};
};
# Unremark this section to log all locally generated articles
#if ($localfeed) {
# saveart('local.post');
#};
if ($config{watch_cancels} and $localpost) {
$LocalPosts{$hdr{'Message-ID'}} = $now;
}
# saveart('W.longsubj') if length $hdr{Subject} > 160;
# saveart('W.space') if $hdr{Subject} =~ / {15,}[^ ]/;
saveart('W.repostnotrej')
if $hdr{Subject} =~ /^REPOST: / and $hdr{Path} =~ /!resurrector!/;
return '';
};
# Unremark this example function to log and reject all locally generated
# cancels.
#sub local_filter_cancel {
# if ($localfeed) {
# saveart('local.cancel');
# return reject('Cancels forbidden');
# };
#};
# here I save some articles I want to check.
sub local_filter_reject {
my ($vr, $sr) = @_;
saveart('local.reject', $vr)
if $hdr{Path} =~ /^not\-for\-mail$/ or
$hdr{Path} =~ /^news\.mixmin\.net!not-for-mail/;
#saveart('w.supersedes') if $vr =~ /^Excessive Supersedes/;
#saveart('cf.newsagent', $vr) if $vr =~ /^NewsAgent/;
#saveart('cf.sex', $vr) if $vr =~ /^Sex spam/ and $lines < 300;
saveart('emp.phn', $vr) if $vr =~ /^EMP\s\(phn/;
saveart('emp.phr', $vr) if $vr =~ /^EMP\s\(phr/;
saveart('emp.phl', $vr) if $vr =~ /^EMP\s\(phl/;
saveart('emp.fsl', $vr) if $vr =~ /^EMP\s\(fsl/;
if (is_binary()) {
saveart('emp.md5.bin', $vr) if $vr =~ /^EMP\s\(md5/;
saveart('cf.scoring', $vr, 2) if $vr =~ /^Scoring filter/;
} else {
saveart('emp.md5', $vr) if $vr =~ /^EMP\s\(md5/;
saveart('cf.scoring', $vr) if $vr =~ /^Scoring filter/;
}
# Save articles rejected by bad_hosts.
saveart('cf.hosts', $vr) if $vr =~ /^Bad\shost/;
# Provide a seed for bad_hosts_central.
saveart('badhosts', $vr, 3) if $vr =~ /^EMP|^Bad\shost|^URL/
and $hdr{'NNTP-Posting-Host'}
and not $gr{alltest};
saveart('cf.uuenc', $vr) if $vr =~ /^UUencoded/;
saveart('cf.binary', $vr) if $vr =~ /^Binary/;
#saveart('r.nanacancel') if $vr eq 'Cancel in forbidden group';
return @_;
}
sub local_config {
%config_local = (
block_late_cancels => 1,
block_user_cancels => 1,
active_file => '/usr/local/news/db/active',
statfile => '/usr/local/news/cleanfeed/cleanfeed.stats',
# html_statfile => '/news/log/cleanfeed.stats.html',
stats_interval => 300,
do_scoring_filter => 0,
do_emp_dump => 1,
emp_dump_file => '/usr/local/news/tmp/empdump',
md5_skips_followups => 0,
debug_batch_directory => '/usr/local/news/cleanfeed/log',
flood_groups => '^sci\.crypt$|^news\.software\.nntp$|^alt\.free\.newsservers',
MD5RateCutoff => 3,
PHNRateBaseInterval => 1800,
PHRRateBaseInterval => 1800,
maxgroups => 6,
low_xpost_maxgroups => 3,
meow_ext_maxgroups => 2,
low_xpost_groups => 'test|jobs|forsale',
reject_suspect_cancels => 1,
);
%config_append = (
allexclude => '^fa\.linux\.kernel|^microsoft\.',
bin_allowed => '^alt\.mag\.',
phn_exempt => 'bristol.highgroove.com',
phn_exclude => 'uk.people.silversurfers',
spam_report_groups => 'local.test',
);
$Restricted_Groups{netscape} = '^netscape\.';
$config{block_user_cancels} = 1;
$config{reject_suspect_cancels} = 1;
$config{watch_cancels} = 0;
if ($config{watch_cancels}) {
eval { require AnyDBM_File; import AnyDBM_File;
require Fcntl; import Fcntl; }; # XXX ugly
if ($@) {
$config{watch_cancels} = undef;
slog('E', 'Cannot load AnyDBM_File: ' . $@);
}
tie %LocalPosts, 'AnyDBM_File', "$config_dir/posts",
&Fcntl::O_CREAT|&Fcntl::O_RDWR, 0666
or slog('E', 'Cannot load AnyDBM_File: ' . $!);
}
}
print $now.$config_dir.$lines.%Restricted_Groups.%Moderated.%config_local.%config_append.@followups if 0; # lint food
1;