chiark / gitweb /
Merge branch 'master' of /u/webstump/live/
[modbot-ulm.git] / webstump / scripts / filter.lib.pl
1 #
2 #
3 # This library of functions is used for filtering messages.
4 #
5
6
7 # processes approval decision.
8 #
9 # Arguments: 
10 #
11 # Subject, newsgroup, ShortDirectoryName, decision, comment
12
13 sub process_approval_decision {
14   my $cathow = @_>=6 ? pop(@_) : "UNKNOWN";
15   my $comment = pop( @_ );
16   my $decision = pop( @_ );
17   my $ShortDirectoryName = pop( @_ );
18   my $newsgroup = pop( @_ );
19   my $Subject = pop( @_ );
20   my $now = time;
21
22   my $address = $newsgroups_index{$newsgroup};
23
24   my $message = "To: $newsgroups_index{$newsgroup}\n" .
25                 "Subject: $Subject\n" .
26                 "Organization: http://www.algebra.com/~ichudov/stump\n";
27
28   $message .= "\n$decision\n";
29   $message .= "comment $comment\n" if $comment;
30   &email_message( $message, $address );
31
32   my $sanisubj= $Subject;
33   $sanisubj =~ s/.*\:\://;
34
35 print STDERR "DECISION: $newsgroup | $ShortDirectoryName | $decision | $cathow | $now | $sanisubj\n";
36
37   &rmdir_rf( &article_file_name( $ShortDirectoryName ) );
38
39 }
40
41
42 ###################################################################### checkAck
43 # checks the string matches one of the substrings. A name is matched
44 # against the substrings as regexps and substrings as literal substrings.
45 #
46 # Arguments: address, listname
47
48 sub name_is_in_list { # address, listname
49   my $listName = pop( @_ );
50   my $address = pop( @_ );
51
52   my $item = "";
53   my $Result = "";
54
55   open( LIST, &full_config_file_name( $listName ) ) || return "";
56
57   while( $item = <LIST> ) {
58
59     chomp $item;
60
61     next unless $item =~ /\S/;
62     next if $item =~ /^\s*\#/;
63
64     if ($listName eq 'good.posters.list') {
65         if( lc $address eq lc $item ) {
66             $Result = $item;
67         }
68     } else {
69         if( eval { $address =~ /$item/i; } ) {
70             $Result = $item;
71         }
72     }
73   }
74
75   close( LIST );
76
77   return $Result;
78 }
79
80 ######################################################################
81 # reviews incoming message and decides: approve, reject, keep
82 # in queue for human review
83 #
84 # Arguments: Newsgroup, From, Subject, Message, Dir
85 #
86 # RealSubject is the shorter subject from original posting
87 sub review_incoming_message { # Newsgroup, From, Subject, RealSubject, Message, Dir
88   my $dir = pop( @_ );
89   my $message = pop( @_ );
90   my $real_subject = pop( @_ );
91   my $subject = pop( @_ );
92   my $from = pop( @_ );
93   my $newsgroup = pop( @_ );
94
95   if( &name_is_in_list( $from, "bad.posters.list" ) ) {
96     &process_approval_decision( $subject, $newsgroup, $dir, "reject blocklist", "", "auto bad poster" );
97     return;
98   }
99
100   if( &name_is_in_list( $real_subject, "bad.subjects.list" ) ) {
101     &process_approval_decision( $subject, $newsgroup, $dir, "reject thread", "", "auto bad subject" );
102     return;
103   }
104
105   if( &name_is_in_list( $message, "bad.words.list" ) ) {
106     &process_approval_decision( $subject, $newsgroup, $dir, "reject charter", 
107     "Your message has been autorejected because it appears to be off topic
108     based on our filtering criteria. Like everything, filters do not
109     always work perfectly and you can always appeal this decision.",
110                                 "auto bad word" );
111     return;
112   }
113
114   my $warning_file = &article_file_name( $dir ) . "/stump-warning.txt";
115   my $match;
116
117   $ignore_demo_mode = 1;
118
119   if( $match = &name_is_in_list( $from, "watch.posters.list" ) ) {
120     &append_to_file( $warning_file, "Warning: poster '$from' matches '$match' from the list of suspicious posters\n" );
121 print STDERR "Filing Article for review because poster '$from' matches '$match'\n";
122     return; # file message
123   }
124
125   if( $match = &name_is_in_list( $real_subject, "watch.subjects.list" ) ) {
126     &append_to_file( $warning_file, "Warning: subject '$real_subject' matches '$match' from the list of suspicious subjects\n" );
127 print STDERR "Filing Article for review because subject '$subject' matches '$match'\n";
128     return; # file message
129   }
130
131   if( $match = &name_is_in_list( $message, "watch.words.list" ) ) {
132     &append_to_file( $warning_file, "Warning: article matches '$match' from the list of suspicious words\n" );
133 print STDERR "Filing Article for review because article matches '$match'\n";
134     return; # file message
135   }
136
137   if( &name_is_in_list( $from, "good.posters.list" ) ) {
138     &process_approval_decision( $subject, $newsgroup, $dir, "approve", "",
139                                 "auto good poster" );
140     return;
141   }
142
143   if( &name_is_in_list( $real_subject, "good.subjects.list" ) ) {
144     &process_approval_decision( $subject, $newsgroup, $dir, "approve", "",
145                                 "auto good subject" );
146     return;
147   }
148
149   # if the message remains here, it is stored for human review.
150
151 }
152
153 1;