Skip to content
Snippets Groups Projects
miscfunctions.lib.php 6.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    // does the opposite of PHP's nl2br()
    function br2nl($string) {
    	$string = preg_replace("/(\r\n|\n|\r)/", "", $string);
    	$string = preg_replace("/<br *\/?>/i", "\n", $string);
    	return $string;
    }
    
    // generate a pseudo-word random password
    function makePassword($length=8)
    {
    	$password = "";
    	$vowels = "aeiouy";
    	$consonants = "bcdfghjklmnprst";
    	$cn = strlen($consonants)-1;
    	$vn = strlen($vowels)-1;
    	// Start on cons or vowel
    	$alt = mt_rand(0, 1);
    	// How many numbers
    	$len = mt_rand($length-3,$length);
    	//add the letters
    	for ($i = 0; $i < $len; $i++)
    	{
    		if ($alt == 1)	{
    			$password .= $consonants[ mt_rand(0,$cn) ];
    			$alt = 0;
    		}
    		else	{
    			$password .= $vowels[ mt_rand(0,$vn) ];
    			$alt = 1;
    		}
    	}
    	//add the numbers
    	for ($i = 0; $i < $length-$len; $i++)
    	{
    		$password .= mt_rand(0,9);
    	}
    	return $password;
    }
    
    $revision = "unknown";
    function startElement($parser, $name, $attrs)
    {
    	global $revision;
    	if($name=="ENTRY" && $attrs['NAME']=="") {
    		$revision = $attrs['REVISION'];
    	}
    }
    
    function endElement($parser, $name){}
    
    function getSVNRevision()
    {
    	global $revision;
    	$xml_parser = xml_parser_create();
    	xml_set_element_handler($xml_parser, "startElement", "endElement");
    	if (!($fp = fopen(".svn/entries", "r"))) {
    		return "unknown - couldn't open SVN XML file.";
    	}
    	while(($data = fread($fp, 1024)) && $revision=="unknown") {
    		if (!xml_parse($xml_parser, $data, feof($fp))) {
    			return "unknown - couldn't parse SVN XML file";
    		}
    	}
    	xml_parser_free($xml_parser);
    	return $revision;
    }
    
    /*
     *
     * Spam Checks
     *
     */
    //Check the Spam URI Realtime Blocklist
    function checkSpamURLs($text) {
    	$spam = false;
    	//find urls, ugly but works
    
    	while (preg_match("/http://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/",$text,$match)) {
    
    		$matches[] = $match[0];
    
    		$text = preg_replace("/".$match[0]."/","",$text); //Can this be replaced with str_replace?
    
    	}
    	//pull in list of two level tlds, make an array from them. from http://spamcheck.freeapp.net/two-level-tlds
    
    	$twoLevelTLD = file("/var/www/sucssite/lib/blog/two-level-tlds");
    
    	foreach($twoLevelTLD as $TLD) {
    		$two_level_tlds[trim($TLD)] = true;
    	}
    	if (!$matches)
    		return;
    	//for each url
    	foreach ($matches as $url) {
    		//break it down
    		$urlBits = explode(".",substr($url, 7));
    		//reverse the oder
    		$bitsURL = array_reverse($urlBits);
    		//if its a two level tld, we want the first 3 bits of the url.. if not just the first 2
    		if ($two_level_tlds[($bitsURL[1].".".$bitsURL[0])]) {
    			$URLstoTest[] = ($bitsURL[2].".".$bitsURL[1].".".$bitsURL[0]);
    		} else {
    			$URLstoTest[] = ($bitsURL[1].".".$bitsURL[0]);
    		}
    	}
    	if (!$URLstoTest)
    		return;
    	//actualy test each of he domains against the surbl
    	foreach($URLstoTest as $url) {
    		$result = gethostbyname($url.'.multi.surbl.org');
    		if ($result != $url.'.multi.surbl.org') {
    			$spam = true;
    		}
    		elseif ($url == "blogspot.com") {
    			$spam = true;
    		}
    	}
    	return $spam;
    }
    //feeds a message body though LinkSleeve (http://www.linksleeve.org/) which at the time of testing seems quite good.
    function checkSpamLinkSleeve ($text) {
    	// Include the Pear XML-RPC Client Package
    	require_once 'XML/RPC.php';
    	// Build the XML-RPC message
    	$params = array(new XML_RPC_Value($text, 'string'));
    	$msg = new XML_RPC_Message('slv', $params);
    	//Send the XML-RPC message
    	$cli = new XML_RPC_Client('/slv.php', 'http://www.linksleeve.org');
    	$resp = $cli->send($msg);
    	//Check for a responce
    	if (!$resp) {
    		echo 'Communication error: ' . $cli->errstr;
    		return false;
    	}
    	//spam?
    	if (!$resp->faultCode()) {
    		$val = $resp->value();
    		if($val->scalarval()=='1') {
    			$spam = false;
    		}
    		else {
    			$spam = true;
    		}
    	} 
    	//Handle Errors
    	else {
    		 echo 'Fault Code: ' . $resp->faultCode() . "\n";
    		 echo 'Fault Reason: ' . $resp->faultString() . "\n";
    	}
    	return $spam;
    }
    
    //checks an ip in several blacklists returns true if its present
    function checkSpamIP($ip) {
    	$spam = false;
    	//reverse the ip
    	$ip = implode('.',array_reverse(explode('.',$ip)));
    	//look up in various rbls
    	$rbl = gethostbyname($ip.'.rbl-plus.mail-abuse.ja.net');
    	$scbl = gethostbynamel($ip.'.bl.spamcop.net');
    	$sorbs = gethostbynamel($ip.'.dnsbl.sorbs.net');
    	$sbl = gethostbynamel($ip.'.sbl.spamhaus.org');
    	$njabl = gethostbynamel($ip.'.dnsbl.njabl.org');
    	$opm = gethostbyname($ip.'.opm.blitzed.org');
    	$cbl = gethostbynamel($ip.'.cbl.abuseat.org');
    
    	//CBL 
    	if ($cbl) {
    		$spam = true;
    	}
    	
    	//OPM
    	if ($opm != $ip.".opm.blitzed.org") {
    		//this bl uses a decimal to represent one catagory of spam source
    		$code = decbin(ip2long($opm));
    		//check for WinGate
    		if ($code[30])
    			$spam = true;
    		//check for SOCKS
    		if ($code[29])
    			$spam = true;
    		//check for HTTP CONNECT
    		if ($code[28])
    			$spam = true;
    		//check for Router
    		if ($code[27])
    			$spam = true;
    		//check for HTTP POST
    		if ($code[26])
    			$spam = true;
    	}
    
    	//RBL+
    	if ($rbl != $ip.".rbl-plus.mail-abuse.ja.net") 	{
    		$code = decbin(ip2long($rbl));
    		//check for rbl
    		if ($code[30])
    			$spam = true;
    		//check for dul
    		if ($code[29])
    			//we dont care about dul
    		//check for rss
    		if ($code[28])
    			$spam = true;
    		//check for ops
    		if ($code[27])
    			$spam = true;
    	}
    	
    	//SpamCop
    	if ($scbl) {
    		$spam = true;
    	}
    	
    	//SORBS
    	if ($sorbs) {
    		foreach($sorbs as $result) {
    			$result = explode('.',$result);
    			//check for http
    			if ($result[3] == 2)
    				$spam = true;
    			//check for socks
    			if ($result[3] == 3)
    				$spam = true;
    			//check for misc
    			if ($result[3] == 4)
    				$spam = true;
    			//check for smtp
    			if ($result[3] == 5)
    				$spam = true;
    			//check for spam
    			if ($result[3] == 6)
    				$spam = true;
    			//check for web
    			if ($result[3] == 7)
    				$spam = true;
    			//check for block
    			if ($result[3] == 8)
    				$spam = true;
    			//check for zombie
    			if ($result[3] == 9)
    				$spam = true;
    			//check for dul
    			if ($result[3] == 10)
    				//dont care about dul
    			//check for badconf
    			if ($result[3] == 11)
    				$spam = true;
    			//check for nomail
    			if ($result[3] == 12)
    				$spam = true;
    		}
    	}
    
    	//NJABL
    	if ($njabl) {
    		foreach($njabl as $result) {
    			$result = explode('.',$result);
    			//check for relay
    			if ($result[3] == 2)
    				$spam = true;
    			//check for dul
    			if ($result[3] == 3) {
    				//dont care about dul
    			}
    			//check for spam
    			if ($result[3] == 4)
    				$spam = true;
    			//check for relay
    			if ($result[3] == 5)
    				$spam = true;
    			//check for web
    			if ($result[3] == 8)
    				$spam = true;
    			//check for proxy
    			if ($result[3] == 9)
    				$spam = true;
    		}
    	}
    
    	//SBL
    	if($sbl) {
    		$spam = true;
    	}
    	return $spam;
    }
    
    # General spam function combining all checks
    function checkSpam($ip, $text) {
    	//Check LinkSleeve first, its a collaborative statistical thing, and will benefit from seeing all messages, spam or not
    	if (checkSpamLinkSleeve($text)) {
    		$spam = true;
    	//Check any URL's the Spam URL Black List
    	} elseif (checkSpamURLs($text)) {
    		$spam = true;
    	//If all else fails lookup the posting IP in all the normal IP Black Lists
    	} elseif (checkSpamIP($ip)) {
    		$spam = true;
    	//Decide its probably not spam
    	} else {
    		$spam = false;
    	}
    	return $spam;
    }