Changeset 1291

Show
Ignore:
Timestamp:
08/16/08 19:26:06 (4 months ago)
Author:
_ck_
Message:

0.1.6 bot verification via rdns & now can replace the view count function of bb-topic-views without sessions needed

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • mini-track/trunk/mini-track-admin.php

    r1288 r1291  
    1515 
    1616if (isset($_GET['mini_track_reset'])) {mini_track_activation(); mini_track_init();} 
    17 elseif (isset($_GET['mini_track_ban']) && isset($mini_track[$_GET['mini_track_ban']])) {$mini_track[$_GET['mini_track_ban']]->ban=1; mini_track_save();} 
    18 elseif (isset($_GET['mini_track_unban']) && isset($mini_track[$_GET['mini_track_unban']])) {unset($mini_track[$_GET['mini_track_unban']]->ban); mini_track_save();} 
     17elseif (isset($_GET['mini_track_ban']) && isset($mini_track[$_GET['mini_track_ban']])) {$mini_track[$_GET['mini_track_ban']]->ban=1; $mini_track[$_GET['mini_track_ban']]->ok=0; mini_track_save();} 
     18elseif (isset($_GET['mini_track_unban']) && isset($mini_track[$_GET['mini_track_unban']])) {unset($mini_track[$_GET['mini_track_unban']]->ban); $mini_track[$_GET['mini_track_unban']]->ok=1; mini_track_save();} 
    1919bb_send_headers(); 
    2020echo "<html><head><title>".count($mini_track)." Users Online &laquo; ".bb_get_option('name')."</title> 
     
    6363$actual[7][$counter]=$time-$value->time; 
    6464 
    65 if (isset($value->ban)) {$td[8][$counter]="<span class=bot>banned</span>  [<a href='$uri"."&mini_track_unban=$key'>x</a>]";} 
     65if (isset($value->ok) && $value->ok && isset($value->bot)) {$td[8][$counter]="<span class=new>verified</span>";} 
     66elseif (isset($value->ban)) {$td[8][$counter]="<span class=bot>banned</span>  [<a href='$uri"."&mini_track_unban=$key'>x</a>]";} 
    6667elseif ($value->pages>9 && $bb_current_user->ID!=$value->id) {$td[8][$counter]="<a href='$uri"."&mini_track_ban=$key'>ban?</a>";} 
    6768elseif ($value->pages<3 && $total<2 && $last<2) {$td[8][$counter]="<span class=new>new</span>";} 
     
    107108if (!bb_current_user_can('administrate') || !$_GET['mini_track_ip']) {return;} 
    108109$ip=$_GET['mini_track_ip']; $rdns=gethostbyaddr($ip); if ($rdns==$ip) {$rdns="(no rDNS)";} 
     110bb_send_headers(); 
    109111echo "<html><pre><h2>IP ".$ip."</h2><h3>".$rdns."</h3>";  
    110 $data=mini_track_ip_lookup($ip);  
    111 foreach ($data as $key=>$value) { 
    112 if (eregi("abuse|tech|nettype|comment|remark|ReferralServer|signature|auth|encryption",$key)===false) {echo "$key: $value <br />";} 
    113 
     112$data=mini_track_ip_lookup($ip); 
     113if (!isset($data) || !is_array($data)) {echo "<small>reloading...</small><br />"; sleep(1); $data=mini_track_ip_lookup($ip);}  // try a 2nd time before giving up 
     114if (isset($data) && is_array($data)) {  
     115        foreach ($data as $key=>$value) { 
     116                if (eregi("abuse|tech|nettype|comment|remark|ReferralServer|signature|auth|encryption",$key)===false) { 
     117                        if (intval($key)===$key) {echo "$value <br />";} else {echo "$key: <b>$value</b><br />";} 
     118                } 
     119        } 
     120} else {echo "lookup error, <a href='?mini_track_ip=$ip'>try again?</a>";} 
    114121exit(); 
    115122} 
     
    117124function mini_track_ip_lookup($ip,$server=0) { 
    118125if (!bb_current_user_can('administrate') || !$_GET['mini_track_ip']) {return;} 
     126// error_reporting(E_ALL);  ini_set("display_errors", 1);       // debug 
    119127$host=array('ws.arin.net','wq.apnic.net','www.db.ripe.net','lacnic.net','www.afrinic.net'); 
    120128$keyword=array('arin.net','apnic.net','ripe.net','lacnic.net','afrinic.net'); 
    121129$path=array('/whois/?queryinput=','/apnic-bin/whois.pl?searchtext=','/whois/?form_type=simple&searchtext=','/cgi-bin/lacnic/whois?query=','/cgi-bin/whois?form_type=simple&searchtext='); 
    122 do {unset($data);  
     130do {unset($data); $data=""; 
    123131if ($fp = fsockopen ($host[$server], 80, &$errno, &$errstr, 10)) { 
    124132        $request = "GET $path[$server]$ip HTTP/1.0\r\nHost: $host[$server]\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n\r\n";  
    125         $page=''; fputs ($fp, $request); while (!feof($fp)) {$page.=fgets ($fp,1024);} fclose ($fp);    // echo $page; 
    126         preg_match("/\<pre\>(.*)\<\/pre\>/sim",$page,$temp); $lines=explode("\n",strip_tags($temp[0])); 
    127         foreach ($lines as $line) {$line=trim($line);if ((!ereg('^\#|\%.*$',$line)) && ($line>'')) {$temp=explode(":",$line,2); $data[trim($temp[0])] = trim($temp[1]);}} 
     133        $page=''; fputs ($fp, $request); while (!feof($fp)) {$page.=fgets ($fp,1024);} fclose ($fp);    // echo $page; // debug 
     134        preg_match("/\<pre\>(.*)\<\/pre\>/sim",$page,$temp); $lines=explode("\n",strip_tags($temp[0])); // print_r($temp); // debug 
     135        foreach ($lines as $line) {$line=trim($line);  
     136                if (!empty($line) && !ereg("^(\#|\%)",$line)) {if (strpos($line,":")) {$temp=explode(":",$line,2); $data[trim($temp[0])] = trim($temp[1]);} else {$data[]=$line;}} 
     137        } 
    128138} else {$data['error'] = "$errstr ($errno)\n";}          
    129139$server=0; for ($i = 1; $i <= count($host); $i++){if (isset($data['ReferralServer']) && strpos($data['ReferralServer'],$keyword[$i])){$server=$i;break;}} 
  • mini-track/trunk/mini-track.php

    r1289 r1291  
    66Author: _ck_ 
    77Author URI: http://bbShowcase.org 
    8 Version: 0.1.5 
     8Version: 0.1.6 
    99 
    1010License: CC-GNU-GPL http://creativecommons.org/licenses/GPL/2.0/ 
     
    3838$mini_track_options['fast_index'] = false;                              // false = accurately tracks NAT/proxy/spoofing users  //  true = faster but by IP only 
    3939 
    40 $mini_track_options['ban_speed'] = 50;                          // temporarily ban any user for the track_time if they exceed this many pages per minute  
    41                                                                         // (not recommended to set this lower than 50 ppm because some bots like google move that fast) 
     40$mini_track_options['ban_speed'] = 50;                          // temporarily ban any user for the track_time if they exceed this many pages per minute                                                                         
    4241                                                                        // set to 0 (zero) to disable. 
    43 $mini_track_options['ban_pages'] = 200;                         // temporarily ban any user for the track_time if they exceed this many pages in a single session 
    44                                                                         // (not recommended to set this lower than 200 because some bots like google take that many at once) 
     42$mini_track_options['ban_pages'] = 100;                         // temporarily ban any user for the track_time if they exceed this many pages in a single session                                                                        
    4543                                                                        // set to 0 (zero) to disable. 
    4644                                                                         
    47                                                                         // you will be able to also temporarily ban (or unban) via the realtime display panel 
     45                                                                        // good bots like google are now verified by rdns when they exceed bans and are whitelisted 
     46                                                                        // you can also temporarily ban (or unban) via the realtime display panel 
    4847                                                                        // note about banning: it still loads the bbPress core, just doesn't serve any content 
    4948$mini_track_options['style']=" 
     
    6059/* STOP EDITING HERE */ 
    6160 
    62 $mini_track_options['geoip'] =  false;          // false;        // "ip2c";             // cc lookup ->  false | mysql | ip2c 
    63 $mini_track_options['flags'] =  false;  // false;       // "/images/flags/";    // images instead of cc - path to flags 
     61$mini_track_options['topic_views'] = false;                     // true = replace bb-topic-views plugin, works better as no sessions needed 
     62 
     63$mini_track_options['geoip'] =  false;           // "ip2c";             // cc lookup ->  false | mysql | ip2c 
     64$mini_track_options['flags'] =   false;         // "/images/flags/";    // images instead of cc - path to flags 
    6465 
    6566$mini_track_options['debug'] = false;       // true = shows more info when you hover over IP in display panel - makes saved data very large, don't use regularly 
     
    8687 
    8788// hooks and triggers 
    88 add_action('bb_init','mini_track_init'); 
     89add_action('bb_init','mini_track_init',9);     // 9 so it runs before most other plugins execute 
    8990add_action('bb_foot','mini_track',99); 
    9091add_action('bb_admin_footer', 'mini_track',99); 
     
    102103add_action('user_register','mini_track_statistics_update'); 
    103104 
    104  
    105105// admin hooks 
    106106if (defined('BB_IS_ADMIN') && BB_IS_ADMIN && isset($_GET['action']) && $_GET['action']=="activate" && $_GET['plugin'] && strpos($_GET['action'],basename(__FILE__)) ) { 
     
    115115 
    116116function mini_track_init() {   
    117 global $mini_track, $mini_track_options,  $mini_track_current, $bb_current_user, $bbdb; 
    118  
     117global $mini_track, $mini_track_options, $mini_track_current, $bb_current_user, $bbdb, $topic_id; 
     118 
     119$time=time();                                   // snapshot time for all calculations 
    119120$mini_track=bb_get_option('mini_track');        // start with latest data from db 
    120 $time=time();                                   // snapshot time for all calculations 
     121 
     122if ($mini_track_options['topic_views']) {                       // remove bb-topic-views hook as to not duplicate counts or start sessions 
     123        remove_filter('bb_head', 'update_view_count'); 
     124        remove_action('bb_init', 'views_session_check'); 
     125
    121126 
    122127if (!empty($mini_track)) { 
     
    164169$mini_track[$index]->pages=1; 
    165170} // end of first seen checks 
    166 else { 
     171 
     172else {  // repeat user 
     173 
    167174$mini_track[$index]->pages++;   // count how many pages they've viewed 
    168175 
    169176// check for ban-able activity 
     177if (!isset($mini_track[$index]->ban) && !(isset($mini_track[$index]->ok) && $mini_track[$index]->ok)) { 
    170178$active=$time - $mini_track[$index]->seen;      // seconds active 
    171 if ($mini_track[$index]->pages>30 && $active>30 && !($bb_current_user->ID && bb_current_user_can('administrate'))) { 
    172 if ($mini_track_options['ban_speed'] && ($mini_track[$index]->pages/$active)>$mini_track_options['ban_speed']/60) {$mini_track[$index]->ban=1;} 
    173 if ($mini_track_options['ban_pages'] && $mini_track[$index]->pages>$mini_track_options['ban_pages']) {$mini_track[$index]->ban=1;} 
     179if ( $mini_track[$index]->pages>30 && $active>30 && !($bb_current_user->ID && bb_current_user_can('administrate'))) { 
     180        if ($mini_track_options['ban_speed'] && ($mini_track[$index]->pages/$active)>$mini_track_options['ban_speed']/60) {$mini_track[$index]->ban=1;} 
     181        if ($mini_track_options['ban_pages'] && $mini_track[$index]->pages>$mini_track_options['ban_pages']) {$mini_track[$index]->ban=1;} 
     182        if ($mini_track[$index]->ban==1 && !isset($mini_track[$index]->ok)) { 
     183                $mini_track[$index]->ok=((mini_track_verify($mini_track[$index]->ip)) ? 1 : 0);         // check if it's a legit bot  
     184                if ($mini_track[$index]->ok) {unset($mini_track[$index]->ban);}                         // if so, let it through 
     185        } 
    174186}  
     187} 
    175188 
    176189} // end repeat user 
    177190 
    178191$mini_track[$index]->time=$time;         
    179 $mini_track[$index]->url=mini_track_safe_url($_SERVER['REQUEST_URI']); // current page 
    180 if ($mini_track_options['debug']) {$mini_track[$index]->debug=$debug;}  // save debug info if in debug mode 
     192$mini_track[$index]->url=mini_track_safe_url($_SERVER['REQUEST_URI']);                          // current page 
     193if ($mini_track_options['debug']) {$mini_track[$index]->debug=$debug;}                          // save debug info if in debug mode 
     194 
     195if ($mini_track_options['topic_views'] && is_topic()) {                 // for topic view counts, replacing bb-topic-views plugin 
     196bb_repermalink();   
     197if (empty($mini_track[$index]->topic) || $topic_id!=$mini_track[$index]->topic) {mini_track_update_view_count(); $mini_track[$index]->topic=$topic_id;} 
     198
    181199 
    182200// tally new tracking data for all users 
     
    254272} 
    255273 
     274function mini_track_update_view_count() {       // all this to prevent bbPress's read-before-write on meta data :-( 
     275global $topic, $bb_topic_cache, $bbdb; 
     276if (empty($topic) || empty($topic->topic_id)) {return;} // should never happen but just in case to prevent corrupt data 
     277if (empty($topic->views)) {     // it's a new value to insert, never used before, use post count as initial view count 
     278if (bb_get_option('bb_db_version')>1600) {@$bbdb->query("INSERT INTO $bbdb->meta (object_id, object_type, meta_key, meta_value) VALUES ($topic->topic_id, 'bb_topic', 'views', $topic->topic_posts)");}  
     279else {@$bbdb->query("INSERT INTO $bbdb->topicmeta (topic_id, meta_key, meta_value) VALUES ($topic->topic_id, 'views', $topic->topic_posts)");}  
     280$topic->views=$topic->posts; $bb_topic_cache[$topic->topic_id]->views=$topic->posts; 
     281} else {          // update existing value: we don't force a specific value just in case there's a collision with another user viewing the topic since it was loaded 
     282if (bb_get_option('bb_db_version')>1600) {@$bbdb->query("UPDATE $bbdb->meta SET meta_value=meta_value+1 WHERE object_type='bb_topic' AND object_id=$topic->topic_id AND meta_key='views' LIMIT 1");} 
     283else {@$bbdb->query("UPDATE $bbdb->topicmeta SET meta_value=meta_value+1 WHERE topic_id=$topic->topic_id AND meta_key='views' LIMIT 1");} 
     284$topic->views++; $bb_topic_cache[$topic->topic_id]->views++; 
     285} 
     286} 
     287 
    256288function mini_track_index($id=0) { 
    257289global $mini_track_options; 
     
    274306return $_SERVER['HTTP_X_FORWARDED_FOR']; 
    275307} else {return $_SERVER['REMOTE_ADDR'];}  
     308} 
     309 
     310function mini_track_verify_addr($ip=0) {         
     311if ($rdns=gethostbyaddr($ip) && $rdns!=$ip) { 
     312if (eregi("\.(msn\.com|alexa\.com|yahoo\.net|google\.com|googlebot\.com)$",$rdns)) {return true;} 
     313} 
     314return false; 
    276315} 
    277316 
  • mini-track/trunk/readme.txt

    r1286 r1291  
    141141* temporary ban ability (with automatic/manual action) 
    142142 
     143= Version 0.1.6 (2008-08-16) = 
     144 
     145* bot verification via rdns to allow excessive page counts 
     146 
     147* can replace the view count function of bb-topic-views without using sessions  
     148 
    143149== To Do == 
    144150