3 # This library of functions is used for filtering messages.
7 # processes approval decision.
11 # Subject, newsgroup, ShortDirectoryName, decision, comment
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( @_ );
22 my $address = $newsgroups_index{$newsgroup};
24 my $message = "To: $newsgroups_index{$newsgroup}\n" .
25 "Subject: $Subject\n" .
26 "Organization: http://www.algebra.com/~ichudov/stump\n";
28 $message .= "\n$decision\n";
29 $message .= "comment $comment\n" if $comment;
30 &email_message( $message, $address );
32 my $sanisubj= $Subject;
33 $sanisubj =~ s/.*\:\://;
35 print STDERR "DECISION: $newsgroup | $ShortDirectoryName | $decision | $cathow | $now | $sanisubj\n";
37 &rmdir_rf( &article_file_name( $ShortDirectoryName ) );
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.
46 # Arguments: address, listname
48 sub name_is_in_list { # address, listname
49 my $listName = pop( @_ );
50 my $address = pop( @_ );
55 open( LIST, &full_config_file_name( $listName ) ) || return "";
57 while( $item = <LIST> ) {
61 next unless $item =~ /\S/;
62 next if $item =~ /^\s*\#/;
64 if ($listName eq 'good.posters.list') {
65 if( lc $address eq lc $item ) {
69 if( eval { $address =~ /$item/i; } ) {
80 ######################################################################
81 # reviews incoming message and decides: approve, reject, keep
82 # in queue for human review
84 # Arguments: Newsgroup, From, Subject, Message, Dir
86 # RealSubject is the shorter subject from original posting
87 sub review_incoming_message { # Newsgroup, From, Subject, RealSubject, Message, Dir
89 my $message = pop( @_ );
90 my $real_subject = pop( @_ );
91 my $subject = pop( @_ );
93 my $newsgroup = pop( @_ );
95 if( &name_is_in_list( $from, "bad.posters.list" ) ) {
96 &process_approval_decision( $subject, $newsgroup, $dir, "reject blocklist", "", "auto bad poster" );
100 if( &name_is_in_list( $real_subject, "bad.subjects.list" ) ) {
101 &process_approval_decision( $subject, $newsgroup, $dir, "reject thread", "", "auto bad subject" );
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.",
114 my $warning_file = &article_file_name( $dir ) . "/stump-warning.txt";
117 $ignore_demo_mode = 1;
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
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
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
137 if( &name_is_in_list( $from, "good.posters.list" ) ) {
138 &process_approval_decision( $subject, $newsgroup, $dir, "approve", "",
139 "auto good poster" );
143 if( &name_is_in_list( $real_subject, "good.subjects.list" ) ) {
144 &process_approval_decision( $subject, $newsgroup, $dir, "approve", "",
145 "auto good subject" );
149 # if the message remains here, it is stored for human review.