OSDN Git Service

2f2b338f343c8de537f25c8bbec95d95c128260b
[fswiki/fswiki.git] / plugin / core / SpamFilter.pm
1 ###############################################################################
2 #
3 # ¥¹¥Ñ¥àÅê¹Æ¤ò¥Õ¥£¥ë¥¿¥ê¥ó¥°¤¹¤ë¥Õ¥Ã¥¯¥×¥é¥°¥¤¥ó¡£
4 #
5 ###############################################################################
6 package plugin::core::SpamFilter;
7 use strict;
8 #==============================================================================
9 # ¥³¥ó¥¹¥È¥é¥¯¥¿
10 #==============================================================================
11 sub new {
12         my $class = shift;
13         my $self = {};
14         return bless $self,$class;
15 }
16 #==============================================================================
17 # ¥Õ¥Ã¥¯¥á¥½¥Ã¥É
18 #==============================================================================
19 sub hook {
20         my $self = shift;
21         my $wiki = shift;
22         my $cgi  = $wiki->get_CGI();
23         
24         my $content = $cgi->param("content");
25         return if($content eq '');
26         
27         my $rule = &Util::load_config_text($wiki,'spam_rules.dat');
28         foreach my $line (split(/\n/, $rule)){
29                 chomp($line);
30                 my $result = 1;
31                 $result = RULE_MULTI_URL($content)    if($line eq 'RULE_MULTI_URL');
32                 $result = RULE_NO_USERAGENT($content) if($line eq 'RULE_NO_USERAGENT');
33                 $wiki->redirect($cgi->param("page")) unless $result;
34         }
35         
36         my $spam = Util::load_config_text($wiki,"spam.dat");
37         foreach my $spam_line (split(/\n/,$spam)){
38                 chomp($spam_line);
39                 if(index($content,$spam_line)!=-1){
40                         $wiki->redirect($cgi->param("page"));
41                 }
42         }
43         
44         my $client = $ENV{'REMOTE_ADDR'};
45         my $ip_list = &Util::load_config_text($wiki,'spam_ip.dat');
46         foreach my $line (split(/\n/, $ip_list)){
47                 my ($from, $to) = split(/-/, $line);
48                 $to = $from if($to eq '');
49                 unless(&ip_check($client, Util::trim($from), Util::trim($to))){
50                         $wiki->redirect($cgi->param("page"));
51                 }
52         }
53         
54 }
55
56 #==============================================================================
57 # IP¥¢¥É¥ì¥¹¤Î¥Á¥§¥Ã¥¯
58 #==============================================================================
59 sub ip_check {
60         my $client = shift;
61         my $from   = shift;
62         my $to     = shift;
63         
64         my @client_dim = split(/\./, $client);
65         my @from_dim   = split(/\./, $from);
66         my @to_dim     = split(/\./, $to);
67         
68         foreach my $part (@client_dim){
69                 unless((shift @from_dim) <= $part && $part <= (shift @to_dim)){
70                         return 1;
71                 }
72         }
73         return 0;
74 }
75
76 #==============================================================================
77 # 1¹Ô¤ËÂçÎ̤ÎURL¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤ËÊݸ¤òµñÈݤ¹¤ë¥ë¡¼¥ë
78 #==============================================================================
79 sub RULE_MULTI_URL {
80         my $source = shift;
81         foreach my $line (split(/\n/, $source)){
82                 if($line =~ /(http:.*){5,}?/){
83                         return 0;
84                 }
85         }
86         return 1;
87 }
88 #==============================================================================
89 # USER-AGENT¤Ê¤·¤Î¾ì¹ç¤ËÊݸ¤òµñÈݤ¹¤ë¥ë¡¼¥ë
90 #==============================================================================
91 sub RULE_NO_USERAGENT {
92         return ($ENV{'HTTP_USER_AGENT'} ne '');
93 }
94
95 1;
96