Changeset 45

Show
Ignore:
Timestamp:
04/08/05 18:16:30 (4 years ago)
Author:
ogawa
Message:

Add more sophisticated is_spam interface and logging function

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • quasi-spamfilter/trunk/quasi-spamfilter.pl

    r42 r45  
    11# A plugin for filtering Comment and TBPing Spams 
    22# 
    3 # Release 0.18 (Mar 6, 2005) 
     3# Release 0.20 (Apr 8, 2005) 
    44# 
    55# This software is provided as-is. You may use it for commercial or  
     
    88# Copyright (c) 2005 Hirotaka Ogawa 
    99 
     10package MT::Plugin::Quasi_SpamFilter; 
    1011use strict; 
    11 use vars qw($COMMENT_PATTERN $TBPING_PATTERN $COMMENT_METHOD $TBPING_METHOD 
     12use vars qw($COMMENT_PATTERN $COMMENT_METHOD 
     13            $TBPING_PATTERN $TBPING_METHOD 
     14            $ENABLE_LOGGING 
    1215            $URL %comment_methods %tbping_methods); 
    1316 
     
    1922# 'CommentFilter', 'CommentThrottleFilter', 'CommentError', 
    2023# 'CommentLongError', 'CommentRedirect', 'CommentEvilRedirect' 
    21 $COMMENT_METHOD = 'CommentFilter'; 
     24$COMMENT_METHOD = 'CommentError'; 
    2225 
    2326# Choose a method for rejecting Spam Pings from: 
    2427# 'TBPingFilter', 'TBPingThrottleFilter', 'TBPingError' 
    25 $TBPING_METHOD = 'TBPingFilter'; 
     28$TBPING_METHOD = 'TBPingError'; 
    2629 
    2730# Set your Redirect URL (for 'CommentRedirect' and 'CommentEvilRedirect') 
    2831$URL = 'http://www.2ch.net/'; 
     32 
     33# Enable logging? (1/0) 
     34$ENABLE_LOGGING = 1; 
    2935 
    3036eval("use Storable;"); 
     
    3238    require MT::Plugin; 
    3339    my $plugin = new MT::Plugin(); 
    34     $plugin->name("Quasi Spam Filter Plugin, v.0.18"); 
     40    $plugin->name("Quasi Spam Filter Plugin 0.20"); 
    3541    $plugin->description("A Simple filter for Comment & TBPing Spams"); 
    3642    $plugin->doc_link("http://as-is.net/hacks/2005/01/quasi_spam_filter_plugin.html"); 
     
    6975} 
    7076 
     77use MT::Comment; 
     78use MT::TBPing; 
     79 
    7180sub is_comment_spam { 
    72     my $text = shift; 
    73     return ($text =~ /$COMMENT_PATTERN/i); 
     81    my $comment = shift; 
     82    return ($comment->text =~ /$COMMENT_PATTERN/i); 
    7483} 
    7584 
    7685sub is_tbping_spam { 
    77     my $text = shift; 
    78     return ($text =~ /$TBPING_PATTERN/i); 
     86    my $tbping = shift; 
     87    return ($tbping->excerpt =~ /$TBPING_PATTERN/i); 
     88} 
     89 
     90sub _make_pseudo_comment { 
     91    my $app = shift; 
     92    my $q = $app->{query}; 
     93    my $comment = MT::Comment->new; 
     94    $comment->author($q->param('author') || ''); 
     95    $comment->email($q->param('email') || ''); 
     96    $comment->url($q->param('url') || ''); 
     97    $comment->text($q->param('text') || ''); 
     98    $comment->ip($app->remote_ip || ''); 
     99    return $comment; 
     100} 
     101 
     102sub _make_pseudo_tbping { 
     103    my $app = shift; 
     104    my $q = $app->{query}; 
     105    my $tbping = MT::TBPing->new; 
     106    $tbping->title($q->param('title') || ''); 
     107    $tbping->excerpt($q->param('excerpt') || ''); 
     108    $tbping->source_url($q->param('url') || ''); 
     109    $tbping->blog_name($q->param('blog_name') || ''); 
     110    $tbping->ip($app->remote_ip || ''); 
     111    return $tbping; 
    79112} 
    80113 
    81114sub comment_filter { 
    82115    my ($eh, $app, $comment) = @_; 
    83     return !is_comment_spam($comment->text); 
     116    if (is_comment_spam($comment)) { 
     117        $app->log("[QSF] drop a spam comment from " . $comment->author) if $ENABLE_LOGGING; 
     118        return 0; 
     119    } 
     120    return 1; 
    84121} 
    85122 
    86123sub comment_throttle_filter { 
    87124    my ($eh, $app, $entry) = @_; 
    88     my $comment = $app->{query}->param('text'); 
    89     return !is_comment_spam($comment); 
     125    my $comment = _make_pseudo_comment($app); 
     126    if (is_comment_spam($comment)) { 
     127        $app->log("[QSF] drop a spam comment from " . $comment->author) if $ENABLE_LOGGING; 
     128        return 0; 
     129    } 
     130    return 1; 
    90131} 
    91132 
     
    95136    my $mode = $q->param('__mode') || $app->{default_mode}; 
    96137    return if $mode ne 'post'; 
    97     if (is_comment_spam($q->param('text'))) { 
    98         $app->add_methods(post => sub { }); 
    99         $app->error("Spam Comment!"); 
     138    my $comment = _make_pseudo_comment($app); 
     139    if (is_comment_spam($comment)) { 
     140        $app->add_methods(post => sub { }); 
     141        $app->error("Spam Comment!"); 
     142        $app->log("[QSF] drop a spam comment from " . $comment->author) if $ENABLE_LOGGING; 
    100143    } 
    101144} 
     
    106149    my $mode = $q->param('__mode') || $app->{default_mode}; 
    107150    return if $mode ne 'post'; 
    108     if (is_comment_spam($q->param('text'))) { 
    109         $app->add_methods(post => sub { $_[0]->handle_error("Spam Comments!") }); 
     151    my $comment = _make_pseudo_comment($app); 
     152    if (is_comment_spam($comment)) { 
     153        $app->add_methods(post => sub { $_[0]->handle_error("Spam Comments!") }); 
     154        $app->log("[QSF] drop a spam comment from " . $comment->author) if $ENABLE_LOGGING; 
    110155    } 
    111156} 
     
    116161    my $mode = $q->param('__mode') || $app->{default_mode}; 
    117162    return if $mode ne 'post'; 
    118     if (is_comment_spam($q->param('text'))) { 
    119         $app->add_methods(post => sub { }); 
    120         $app->redirect($URL); 
     163    my $comment = _make_pseudo_comment($app); 
     164    if (is_comment_spam($comment)) { 
     165        $app->add_methods(post => sub { }); 
     166        $app->redirect($URL); 
     167        $app->log("[QSF] drop a spam comment from " . $comment->author) if $ENABLE_LOGGING; 
    121168    } 
    122169} 
     
    127174    my $mode = $q->param('__mode') || $app->{default_mode}; 
    128175    return if $mode ne 'post'; 
    129     if (is_comment_spam($q->param('text'))) { 
    130         $app->add_methods(post => sub { }); 
    131         $app->redirect($q->param('url') || $URL); 
     176    my $comment = _make_pseudo_comment($app); 
     177    if (is_comment_spam($comment)) { 
     178        $app->add_methods(post => sub { }); 
     179        $app->redirect($q->param('url') || $URL); 
     180        $app->log("[QSF] drop a spam comment from " . $comment->author) if $ENABLE_LOGGING; 
    132181    } 
    133182} 
    134183 
    135184sub tbping_filter { 
    136     my ($eh, $app, $ping) = @_; 
    137     return !is_tbping_spam($ping->excerpt); 
     185    my ($eh, $app, $tbping) = @_; 
     186    if (is_tbping_spam($tbping)) { 
     187        $app->log("[QSF] drop a spam tbping from " . $tbping->blog_name) if $ENABLE_LOGGING; 
     188        return 0; 
     189    } 
     190    return 1; 
    138191} 
    139192 
    140193sub tbping_throttle_filter { 
    141194    my ($eh, $app, $tb) = @_; 
    142     my $q = $app->{query}; 
    143     return !is_tbping_spam($q->param('excerpt')); 
     195    my $tbping = _make_pseudo_tbping($app); 
     196    if (is_tbping_spam($tbping)) { 
     197        $app->log("[QSF] drop a spam tbping from " . $tbping->blog_name) if $ENABLE_LOGGING; 
     198        return 0; 
     199    } 
     200    return 1; 
    144201} 
    145202 
     
    149206    my $mode = $q->param('__mode') || $app->{default_mode}; 
    150207    return if $mode ne 'ping'; 
    151     if (is_tbping_spam($q->param('excerpt'))) { 
     208    my $tbping = _make_pseudo_tbping($app); 
     209    if (is_tbping_spam($tbping)) { 
    152210        $app->add_methods('ping' => sub { }); 
    153211        $app->_response(Error => 'Spam TBPing!', Code => 403); 
     212        $app->log("[QSF] drop a spam tbping from " . $tbping->blog_name) if $ENABLE_LOGGING; 
    154213    } 
    155214}