<?php
/**
 * @package SpamBotProtection
 * @author Puggan
 * @version 0.0.1
 * @filelocation: wp/wp-content/plugins/spambotprotection/spambotprotection.php
 */
/*
Plugin Name: SpamBotProtection
Description: SpamBot Protection plugin for wordpress
Version: 0.0.1
Author: Puggan
Author URI: http://blog.puggan.se
*/

DEFINE("SPAMBOTPROTECTION_PLUGIN_VERSION",'0.0.1');

/* activate output-buffer, so we can freely modify the page */
ob_start();

/* start a session if not alredy started */
if(!session_id())
{
    
session_start('wordpress');
}

/* add some session values, useful for testing for bots */
$_SESSION['page_views']++;
$_SESSION['last_pulse'] = $_SESSION['pulse'];
$_SESSION['pulse'] = microtime(TRUE);
$_SESSION['last_page_time'] = $_SESSION['pulse'] - $_SESSION['last_pulse'];
if(!
$_SESSION['birth']) $_SESSION['birth'] = $_SESSION['pulse'];

/* hook the action before accepting a posted comment */
add_action('pre_comment_on_post''spam_test_comment');

/* hook the the function runed after the comment form is created */
add_action('comment_form''replace_email_field');

/* a comment is posted, lets test it */
function spam_test_comment()
{
    
/* someone logged in? */
    
$user wp_get_current_user();
    if ( 
$user->ID )
    {
        
/* always allow loged in users to post comments */
        
return TRUE;
    }

    
/* less then 1sec since last page view? a human dosn't write a good comment in less then 1sec */
    
if($_SESSION['last_page_time'] < 1)
    {
        
wp_die__("I don't allow spambots to post on my page") );
        return 
FALSE;
    }

    
/* more then 3 hours since last page view => the visitor didn't even load the page before posting to it */
    
if($_SESSION['last_page_time'] > 3*60*60)
    {
        
wp_die__("I don't allow spambots to post on my page") );
        return 
FALSE;
    }

    
/* has the hidden field bean modified? */
    
if($_POST['email'] != '@')
    {
        
wp_die__("I don't allow spambots to post on my page") );
        return 
FALSE;
    }

    
/* restore the email-field whit the visible fields value */
    
$_POST['email'] = $_POST[md5('email')];
    return 
TRUE;
}

/* the form has bean created, good time for replacing the input */
function replace_email_field()
{
    
/* skipp this for logged in users */
    
$user wp_get_current_user();
    if ( 
$user->ID )
    {
        
/* always allow loged in users to post comments */
        
return TRUE;
    }

    
/* fetch the page from the output buffer */
    
$page ob_get_clean();

    
/* find where the email input is hiding */
    
$pos_1 strrpos($page'name="email"');
    
$pos_2 strrpos($page"name='email'");

    if(
$pos_1 AND $pos_2)
    {
        
$pos max($pos_1$pos_2);
    }
    else if(
$pos_1)
    {
        
$pos $pos_1;
    }
    else if(
$pos_2)
    {
        
$pos $pos_2;
    }
    else
    {
        
/* didn't find the email input, so lets skip this */

        /* put the page back in the output buffer */
        
echo $page;
        return 
FALSE;
    }

    
/* replace the name of the email input */
    
$page substr($page0$pos+6) . md5('email') . substr($page$pos+11);

    
/* create html for the fake input */
    
$fake_input "<input style='display: none !important;' id='fake_email' name='email' value='@' />";

    
/* find the end of the form */
    
$pos strpos($page"</form>"$pos);
    if(
$pos)
    {
        
/* add the fake input at the end of the form */
        
$page substr($page0$pos) . $fake_input substr($page$pos);
    }
    else
    {
        
/* add the fake input at the end of the current page */
        
$page .= $fake_input;
    }

    
/* put the page back in the output buffer */
    
echo $page;
    return 
TRUE;
}
?>