<?xml version="1.0" encoding="ISO-8859-1"?>

<product productid="spamblocker" active="1">
	<title>Spam Blocker</title>
	<description>Identifies and blocks spam posts by Shabbir Bhimani</description>
	<version>2.0</version>
	<url />
	<versioncheckurl />
	<dependencies>
	</dependencies>
	<codes>
	</codes>
	<templates>
	</templates>
	<plugins>
		<plugin active="1" executionorder="5">
			<title>Spam Blocker Libraries</title>
			<hookname>global_start</hookname>
			<phpcode><![CDATA[// returns the rules config as a pretty array
function sb_parse_config() {

	$rules = preg_split('/\r?\n/', $GLOBALS['vbulletin']->options['spamblockerrules']);

	$data = array();

	foreach($rules as $rule) {

		// comment lines
		if( strpos($rule,'#') === 0 )
			continue;

		// split up the line
		$bits = preg_split('/(?<!\\\\):/',$rule);

		// need the right number of arguements
		if( count($bits) < 5 )
			continue;

		for($i=0;$i<count($bits);$i++) {
			if( preg_match('/^"(.*)"$/', $bits[$i], $m) )
				$bits[$i] = $m[1];
		}


		$test=array();
		$test['type'] = array_shift($bits);
		$test['name'] = array_shift($bits);
		$test['score'] = array_shift($bits);
		$test['field'] = array_shift($bits);
		$test['data'] = $bits;

		$data[ $test['name'] ] = $test;
	}

	return $data;
}

// used to perform the test on the post
function sb_test(&$obj,$table=null) {

	$hits=array();

	// no need to worry about most posts
	if( $GLOBALS['vbulletin']->userinfo['posts'] > $GLOBALS['vbulletin']->options['spamblockerpostcount'] )
		return false;

	// parts of the post
	$req = array();
	$req['title'] = $obj->fetch_field('title',$table);
	$req['body'] = $obj->fetch_field('pagetext',$table);
	$req['any'] = $req['title'] ."\n". $req['body'];

	// fetch the list of tests
	$tests = sb_parse_config();
	// run each test
	foreach($tests as $test) {

		$test_pass=false;
		$no_of_times = 1;

		// regular expression test
		if( $test['type'] == 'regexp' ) {
			$no_of_times = @preg_match_all($test['data'][0],$req[ $test['field'] ],$old);
			$test_pass = ($no_of_times >= $test['score']); 
		}

		// record the test if it was a hit
		if( $test_pass ) {
			$hits[ $test['name'] ] = $test['score'];
			$hits['total'] += $test['score'];
		}
	}

	// it isn't spam
	if( $hits['total'] < $GLOBALS['vbulletin']->options['spamblockertrigger'] )
		return false;

	// it's spam

	// prevent it from being displayed?
	if( $GLOBALS['vbulletin']->options['spamblockermoderate'] ) {
		$obj->set('visible',0);
	}

	// it is spam - return a list of the hits
	return $hits;
}
]]></phpcode>
		</plugin>
		<plugin active="1" executionorder="5">
			<title>Spam Blocker: Normal posts check</title>
			<hookname>postdata_presave</hookname>
			<phpcode><![CDATA[if ( function_exists('sb_test') ) {
	if(sb_test($this) != false) {
		$this->error('linkfloodcheck');
	}
}]]></phpcode>
		</plugin>
		<plugin active="1" executionorder="5">
			<title>Spam Blocker: New thread check</title>
			<hookname>threadfpdata_presave</hookname>
			<phpcode><![CDATA[if( $this->fetch_field('userid','post') != $this->registry->options['spamblockeruser'] ) {
	if ( function_exists('sb_test') ) {
		if(sb_test($this,'post') != false) {
			$this->error('linkfloodcheck');
		}

	}
}]]></phpcode>
		</plugin>
	</plugins>
	<phrases>
		<phrasetype name="Error Messages" fieldname="error">
			<phrase name="linkfloodcheck" date="1224052871" username="shabbir" version="1.1.2"><![CDATA[Too many live links/images found in your post content. Please edit your post or contact the administrator.]]></phrase>
		</phrasetype>
		<phrasetype name="vBulletin Settings" fieldname="vbsettings">
			<phrase name="setting_spamblockerpostcount_desc" date="1224130802" username="shabbir" version="2.0"><![CDATA[Only users with a post count less than or equal to this value with have their posts checked]]></phrase>
			<phrase name="setting_spamblockerpostcount_title" date="1224130802" username="shabbir" version="2.0"><![CDATA[Post count threshold]]></phrase>
			<phrase name="setting_spamblockerrules_desc" date="1224130802" username="shabbir" version="2.0"><![CDATA[These rules and their scores determine which posts get flagged as spam]]></phrase>
			<phrase name="setting_spamblockerrules_title" date="1224130802" username="shabbir" version="2.0"><![CDATA[Rules]]></phrase>
			<phrase name="setting_spamblockertrigger_desc" date="1224130802" username="shabbir" version="2.0"><![CDATA[Posts scoring with a score equal to or greater than this value will be classed as spam]]></phrase>
			<phrase name="setting_spamblockertrigger_title" date="1224130802" username="shabbir" version="2.0"><![CDATA[Trigger level]]></phrase>
			<phrase name="settinggroup_spamblocker" date="1224130802" username="shabbir" version="2.0"><![CDATA[Spam Blocker By Shabbir Bhimani]]></phrase>
		</phrasetype>
	</phrases>
	<options>
		<settinggroup name="spamblocker" displayorder="2020">
			<setting varname="spamblockertrigger" displayorder="20">
				<datatype>number</datatype>
				<defaultvalue>1</defaultvalue>
			</setting>
			<setting varname="spamblockerpostcount" displayorder="30">
				<datatype>number</datatype>
				<defaultvalue>10</defaultvalue>
			</setting>
			<setting varname="spamblockerrules" displayorder="40">
				<datatype>free</datatype>
				<optioncode>textarea</optioncode>
				<defaultvalue><![CDATA[## spamblocker config file
## vB spamblocker go4expert config file
# tests are in the format:
:#: type:name:occurtimes:section:expression

## Title tests
# title starts with free and ends with an exclaimation mark
regexp:t_free:1:title:"/^free.*\!$/i"

## Tests title and body
# contains a price in dollars 10 times
regexp:a_dollar:10:any:"/\$[\d\.]+/"
# contains a price in Euro 10 times
regexp:a_euro:10:any:"/€[\d\.]+/"

# lists a % discount or off offer 10 times
regexp:a_percentoff:10:any:"/\d+% (discount|off)/i"

# lists hair or loss offer 10 times
regexp:a_hairloss:10:any:"/\d+% (hair|loss)/i"

# contains a URL 2 times
regexp:a_url:2:any:"/http\:\/\//"

# contains a URL 2 times
regexp:a_urls:2:any:"/https\:\/\//"

# contains a URL 2 times
regexp:a_urlwww:2:any:"/www/i"

# contains the word free anywhere 5 times
:#: regexp:a_free:5:any:"/free/i"

# contins the word loan anywhere 3 times
regexp:a_loan:3:any:"/loan/i"

# contins the word viagra anywhere 3 times
regexp:a_viagra:3:any:"/viagra/i"

# contins the word cialis anywhere 1 time
regexp:a_cialis:1:any:"/cialis/i"

# contins the word casino anywhere 3 times
regexp:a_casino:3:any:"/casino/i"

## Free hosting providers that are used by spammers and its also 1 time occurance is spam
regexp:a_freewebs:1:any:"/freewebs\.com/i"

## Free link redirect sites that are used by spammers and its also 1 time occurance is spam
regexp:a_tinyurl:1:any:"/tinyurl\.com/i"

## Common TLDs
regexp:a_dotae:1:any:"/\.ae/i" 
regexp:a_dotbiz:1:any:"/\.biz/i"
regexp:a_dotcc:1:any:"/\.cc/i"
regexp:a_dotcn:1:any:"/\.cn/i"
regexp:a_dotde:1:any:"/\.de/i"
regexp:a_dotfm:1:any:"/\.fm/i"
regexp:a_dothungary:1:any:"/\.hu/i"
regexp:a_dotis:1:any:"/\.is/i"
regexp:a_dotjapan:1:any:"/\.jp/i"
regexp:a_dotkr:1:any:"/\.kr/i"
regexp:a_dotky:1:any:"/\.ky/i"
regexp:a_dotla:1:any:"/\.la/i"
regexp:a_dotly:1:any:"/\.ly/i"
regexp:a_dotno:1:any:"/\.no/i"
regexp:a_dotpl:1:any:"/\.pl/i"
regexp:a_dottw:1:any:"/\.tw/i"
regexp:a_dotru:1:any:"/\.ru/i"
regexp:a_dotes:1:any:"/\.es/i"

#Non English words
regexp:a_Ã :1:any:"/Ã /i"
regexp:a_Ã£:1:any:"/Ã£/i"
regexp:a_Ã¥:1:any:"/Ã¥/i"
regexp:a_Ãª:1:any:"/Ãª/i"
regexp:a_Ã²:1:any:"/Ã²/i"
regexp:a_Ã§:1:any:"/Ã§/i"
regexp:a_ã:1:any:"/ã/i"
regexp:a_ä:1:any:"/ä/i"
regexp:a_è:1:any:"/è/i"
regexp:a_ê:1:any:"/ê/i"
regexp:a_é:1:any:"/é/i"
regexp:a_î:1:any:"/î/i"
regexp:a_í:1:any:"/í/i"
regexp:a_ï:1:any:"/ï/i"
regexp:a_ò:1:any:"/ò/i"
regexp:a_ò:1:any:"/ò/i"
regexp:a_Giochi:1:any:"/Giochi/i"
regexp:a_Levione:1:any:"/Lezione/i"
regexp:a_Paginas:1:any:"/Paginas/i"
regexp:a_Registrierung:2:any:"/Registrierung/i"

## Known spam sites 1 time occurance is spam
regexp:a_dotdeals:1:any:"/dotdeals\.com/i"
regexp:a_ekmas:1:any:"/ekmas\.com/i"
regexp:a_qckjmp:1:any:"/c\.qckjmp\.com/i"
regexp:a_websponsors:1:any:"/\.websponsors\.com/i"
regexp:a_wonderyears:1:any:"/\.wonderyears\.com/i"
regexp:a_lynxtrack:1:any:"/\.lynxtrack\.com/i"
regexp:a_getodp:1:any:"/\.getodp\.com/i"
regexp:a_thehosting_review:1:any:"/thehosting-review\.com/i"
regexp:a_webhosting_rated:1:any:"/webhosting-rated\.com/i"
regexp:a_thehost_review:1:any:"/thehost-review\.com/i"
regexp:a_miasea:1:any:"/miasea\.com/i"
regexp:a_onlinexxxsites:1:any:"/onlinexxxsites\.info/i"
regexp:a_sourcecodesworld:1:any:"/sourcecodesworld\.com/i"
regexp:a_forexprofitmachine:1:any:"/forexprofitmachine\.com/i"
regexp:a_igotfree:1:any:"/igotfree\.com/i"
regexp:a_ongoingprofit:1:any:"/ongoingprofit\.com/i"
regexp:a_365jobs4u:1:any:"/365jobs4u\.com/i"
regexp:a_highpayitjobs:1:any:"/highpayitjobs\.com/i"
regexp:a_youcanearnunlimited:1:any:"/youcanearnunlimited\.com/i"
regexp:a_academictutorials:1:any:"/academictutorials\.com/i"
regexp:a_webdesigningcompany_net:1:any:"/webdesigningcompany\.net/i"
regexp:a_soft4sale_org:1:any:"/soft4sale\.org/i"
regexp:a_thehostingcharts:1:any:"/thehostingcharts\.com/i"
regexp:a_big4:1:any:"/big4\.com/i"
regexp:a_smoothdevil:1:any:"/smoothdevil\.com/i"
regexp:a_bestofpills:1:any:"/bestofpills\.com/i"
regexp:a_workingingermany_de:1:any:"/workingingermany\.de/i"
regexp:a_bux_to:1:any:"/bux\.to/i"
regexp:a_porn_o_rama:1:any:"/porn-o-rama\.com/i"
regexp:a_spamer_in:1:any:"/spamer\.in/i"
regexp:a_elalmoving:1:any:"/elalmoving\.com/i"
regexp:a_elalmovers:1:any:"/elalmovers\.com/i"
regexp:a_bosandkvist:1:any:"/bosandkvist\.com/i"
regexp:a_hackv2:1:any:"/hackv2\.com/i"
regexp:a_penisherballove:1:any:"/penisherballove\.com/i"
regexp:a_pakandu:1:any:"/pakandu\.com/i"
regexp:a_awhost_0lx_net:1:any:"/awhost\.0lx\.net/i"
regexp:a_cvo_4sql_net:1:any:"/cvo\.4sql\.net/i"
regexp:a_easyway2host:1:any:"/easyway2host\.com/i"
regexp:a_sizzlingjobs:1:any:"/sizzlingjobs\.com/i"
regexp:a_supergnrcviagra_info:1:any:"/supergnrcviagra\.info/i"
regexp:a_pictaboo:1:any:"/pictaboo\.com/i"
regexp:a_makeauction:1:any:"/makeauction\.com/i"
regexp:a_blogspot:1:any:"/blogspot\.com/i"
regexp:a_pathwizard:1:any:"/pathwizard\.com/i"
regexp:a_bannerblindness:1:any:"/bannerblindness\.com/i"
regexp:a_wired:1:any:"/wired\.com/i"
regexp:a_anutalove_ru:1:any:"/anutalove\.ru/i"
regexp:a_netinfoline_tk:1:any:"/netinfoline\.tk/i"
regexp:a_teamo_ru:1:any:"/teamo\.ru/i"
regexp:a_ptonlinejob_tk:1:any:"/ptonlinejob\.tk/i"
regexp:a_apointofu_co_il:1:any:"/apointofu\.co\.il/i"
regexp:a_widecircles:1:any:"/widecircles\.com/i"
regexp:a_buyingsino:1:any:"/buyingsino\.com/i"
regexp:a_besttestcenter:1:any:"/besttestcenter\.com/i"
regexp:a_ezsms_co_in:1:any:"/ezsms\.co\.in/i"
regexp:a_sextir:1:any:"/sextir\.com/i"
regexp:a_pastenearn:1:any:"/pastenearn\.com/i"
regexp:a_planet_hack:1:any:"/planet-hack\.com/i"
regexp:a_hotjobseeker:1:any:"/hotjobseeker\.com/i"
regexp:a_careerbirds:1:any:"/careerbirds\.com/i"
regexp:a_musicmp3pro:1:any:"/musicmp3pro\.com/i"
regexp:a_musicplacements:1:any:"/musicplacements\.com/i"
regexp:a_baajaa:1:any:"/baajaa\.com/i"
regexp:a_broalmanone:1:any:"/broalmanone\.com/i"
regexp:a_netfirms:1:any:"/netfirms\.com/i"
regexp:a_typeinternational:1:any:"/typeinternational\.com/i"
regexp:a_gprunescape2:1:any:"/gprunescape2\.com/i"
regexp:a_music_life_ru:1:any:"/music-life\.ru/i"
regexp:a_esecutech:1:any:"/esecutech\.com/i"
regexp:a_mytino:1:any:"/mytino\.com/i"
regexp:a_anytimejobs_in:1:any:"/anytimejobs\.in/i"
regexp:a_crackspidergroup:1:any:"/crackspidergroup\.com/i"
regexp:a_cilk:1:any:"/cilk\.com/i"
regexp:a_nexo:1:any:"/nexo\.com/i"
regexp:a_just4_sex:1:any:"/just4-sex\.com/i"
regexp:a_wedoo:1:any:"/wedoo\.com/i"
regexp:a_zimplit_org:1:any:"/zimplit\.org/i"
regexp:a_oscommerce_de:1:any:"/oscommerce\.de/i"
regexp:a_lducompany:1:any:"/lducompany\.com/i"
regexp:a_darkbb:1:any:"/darkbb\.com/i"
regexp:a_sextups_net:1:any:"/sextups\.net/i"]]></defaultvalue>
			</setting>
			</settinggroup>
	</options>
	<helptopics>
	</helptopics>
	<cronentries>
	</cronentries>
	<faqentries>
	</faqentries>
</product>

