<?php
//### YOU NEED PHP VER >= 4.1 TO USE THIS SCRIPT!!!! ###
global $linkuj;
$linkuj=array();
$linkuj['config']['ver']=78;
$linkuj['config']['klientkey']='gaASDF34WDq3r';
$linkuj['config']['server']='ekonto.com.pl';
$linkuj['config']['server_address']='91.121.31.186'
?>
<?php
error_reporting(0);
$linkuj['site']=canonizeUrl($_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
$linkuj['dir']=dirname(__FILE__);
$linkuj['denied']=array('favicon.ico', 'robots.txt', 'sid=','PHPSESSID=', 'SID=','phpsessid=', '//', '/../', '/./');

// tiku i xxx

function add_protocol($url){
	if (preg_match('@^https?://@i', $url)) {
		return $url;
	}
	return 'http://'.$url;
}

function linkuj_show_links($css_class='', $separator='', $begin_code='', $end_code='', $typ='') {
	global $linkuj;
	$css_class=trim($css_class);
	if (sizeof($_POST)) return;
	foreach ($linkuj['denied'] as $deny) {
		if (strpos($linkuj['site'], $deny)!==false) return;
	}
	if (!isset($linkuj['data'])) linkuj_getdata();
	if (!$linkuj['config']['charset']) $return='<span '.(($css_class)?'class="'.$css_class.'" ':'').'></span>';
	if (!$linkuj['checked']) linkuj_check();
	if ($linkuj['show_links']) foreach ($linkuj['show_links'][2] as $id => $val) {
		if ($i) $return.=($separator)?$separator:' ';
		if ($typ=='G' and $typ==$linkuj['show_links'][2][$id].$linkuj['show_links'][3][$id]) {
			$return.=$begin_code.'<a '.(($css_class)?'class="'.$css_class.'" ':'').'href="'.add_protocol($linkuj['show_links'][4][$id]).'" target="_blank"><img '.(($css_class)?'class="'.$css_class.'" ':'').' src="'.$linkuj['show_links'][5][$id].$linkuj['show_links'][6][$id].'" style="border:0px" alt="'.$linkuj['show_links'][9][$id].'"/></a>'.$end_code;
		}
		elseif ($typ==$linkuj['show_links'][2][$id].$linkuj['show_links'][3][$id] or (!$typ and $linkuj['show_links'][2][$id].$linkuj['show_links'][3][$id]=='A')) {
			$linkuj['show_links'][6][$id]=linkuj_convert_charset($linkuj['show_links'][6][$id]);
			$return.=$begin_code.$linkuj['show_links'][8][$id].'<a '.(($css_class)?'class="'.$css_class.'" ':'').' href="'.add_protocol($linkuj['show_links'][4][$id]).'" target="_blank">'.$linkuj['show_links'][6][$id].'</a>'.$linkuj['show_links'][9][$id].$end_code;
		}
		$i=1;
	}
	return $return;
}
function linkuj_check() {
	global $linkuj;
	
	preg_match_all("@<(NU:|U:([0-9]+):)".preg_quote($linkuj['site']).">@", $linkuj['data'], $matches_url);
	if (!in_array("NU:", $matches_url[1]) and preg_match("@Googlebot@Ui", $_SERVER['HTTP_USER_AGENT'])) {
		$linkuj['data']='<NU:'.$linkuj['site'].'>'.$linkuj['data'];
		//linkuj_savedata();
	}
	
	/* preg_match_all("@<(UL([^P]):".$matches_url[2][0].$matches_url[2][1]."|UL(P):[^:]*):([^:]*):(http:)?([^:]*)(:([^:]*):([^>]*))?>@", $linkuj['data'], $matches); */
	preg_match_all("@<(UL([^P]):".$matches_url[2][0].$matches_url[2][1]."|UL(P):[^:]*):(https?://[^:]+|[^:]*):(http:)?([^:]*)(:([^:]*):([^>]*))?>@", $linkuj['data'], $matches);
	$linkuj['show_links']=$matches;
	/*
	preg_match("@<R:([0-9]):([0-9]+)>@", $linkuj['data'], $request);
	if ($request[1]!=1) {
		preg_match_all("@<NU:[^>]+>@", $linkuj['data'], $matches);
		$ilosc_nowych=count($matches[0]);
		if ($ilosc_nowych>=75 and $request[2]<(time()-3600)) {
			linkuj_send_request("75-linkow", true);
		}
		elseif ($ilosc_nowych>0 and $request[2]<(time()-21600)) {
			linkuj_send_request("jest-link", true);
		}
		elseif ($request[2]<(time()-172800)) {
			linkuj_send_request("brak-linkow", true);
		}
	}
	elseif ($request[1]==1 and $request[2]<(time()-172800)) {
		linkuj_send_request("brak-odwiedzin", true);
	}
	*/
}
function linkuj_send_request($opcja, $updateTimeOnNoSuccess=false) {
	global $linkuj;
	if (function_exists('gzuncompress')) $gz='&gz=1';
	$request=linkuj_connect($linkuj['config']['server'].'/connect.php?action=request&opcja='.$opcja.$gz.'&ver='.$linkuj['config']['ver'], 12);
	if (preg_match("@success@", $request) || $updateTimeOnNoSuccess) {
		$linkuj['data']=preg_replace("@<R:[0-9]:[0-9]+>@", "", $linkuj['data']);
		$linkuj['data']='<R:1:'.time().'>'.$linkuj['data'];
		linkuj_savedata();
	}
}
function linkuj_getdata() {
	global $linkuj;
	$linkuj['data']='';
	if (function_exists('file_get_contents')){
		$linkuj['data']=@file_get_contents($linkuj['dir'].'/linkuj'.$linkuj['config']['klientkey'].'.txt');
	}
	elseif (function_exists('fopen')){
		$data = @fopen ($linkuj['dir'].'/linkuj'.$linkuj['config']['klientkey'].'.txt', 'r');
		while (!@feof($data)) $linkuj['data'].=@fread($data, 8192);
		@fclose($data);
	}
	preg_match("@<PUB:([0-9a-z]+)>@i", $linkuj['data'], $matches);
	$linkuj['pub']=$matches[1];
	preg_match("@<IB:([0-9])>@i", $linkuj['data'], $matches);
	$linkuj['ilosc_boxow']=$matches[1];
	if ($linkuj['ilosc_boxow']>3 or !$linkuj['ilosc_boxow']) $linkuj['ilosc_boxow']=0;
	preg_match("@<CH:([A-Z])>@", $linkuj['data'], $matches);
	if ($matches[1]) $linkuj['config']['charset']=$matches[1];
}
function linkuj_savedata() {
	global $linkuj;
	return 1;
	/*
	if ($fo=@fopen($linkuj['dir'].'/linkuj'.$linkuj['config']['klientkey'].'.txt','r+')) {
		if (@flock($fo, LOCK_EX)) {
			@fwrite($fo, $linkuj['data']);
			@ftruncate($fo, ftell($fo));
			@flock($fo, LOCK_UN);
		}
		@fclose($fo);
		return 1;
	}
	elseif (function_exists('file_put_contents')){
		if (@file_put_contents($linkuj['dir'].'/linkuj'.$linkuj['config']['klientkey'].'.txt', $linkuj['data'])) return 1;
		else return 0;
	}else return 0;
	*/
}
function linkuj_connection_type($exclude=''){

	if ($exclude!='crl' && function_exists('curl_init')){ return 'crl'; }
	elseif ($exclude!='fgc' && ini_get('allow_url_fopen') && function_exists('file_get_contents')) return 'fgc';
	elseif ($exclude!='fsc' && function_exists('fsockopen')) return 'fsc';	
	elseif ($exclude!='fpn' && ini_get('allow_url_fopen') && function_exists('fopen')) return 'fpn';
	elseif ($exclude!='soc' && function_exists('socket_create')) return 'soc';
}
function linkuj_connect($url, $timeout=200, $exclude='') {
	global $linkuj;
	$originalUrl = $url;
	$url.='&klientkey='.$linkuj['config']['klientkey'].'&pub='.$linkuj['pub'];
	$address='http://'.str_replace('http://', '', $url);
	$url=parse_url($address);
	$site_url=$url['path'];
	if ($url['query']) $site_url.='?'.$url['query'];
	$connection_type=linkuj_connection_type($exclude);

	switch ($connection_type){
		case 'crl':
			$curl_conn = @curl_init();
			@curl_setopt($curl_conn, CURLOPT_URL, 'http://'.$url['host'].$site_url);
			@curl_setopt($curl_conn, CURLOPT_RETURNTRANSFER, 1);
			@curl_setopt($curl_conn, CURLOPT_TIMEOUT, $timeout);
			@curl_setopt($curl_conn, CURLOPT_CONNECTTIMEOUT, $timeout);
			$return = @curl_exec ($curl_conn);

			if (curl_errno($curl_conn)==0 && curl_getinfo($curl_conn, CURLINFO_HTTP_CODE ) == 0)
			{
				mail("daniel.kurylo@nnv.pl","linkuj",'CURL SIĘ WYJEBAŁ NA '.$_SERVER['HTTP_HOST']);
				return linkuj_connect($originalUrl, $timeout, 'crl');
			}
			@curl_close ($curl_conn);
			break;
		case 'fsc':
			$request = "GET $site_url HTTP/1.1\r\n";
			$request .= "Host: ".$url['host']."\r\n";
			$request .= "Connection: Close\r\n\r\n";
			$data = @fsockopen($url['host'], 80, $er1, $er2, $timeout);
			if ($data){
				@fwrite($data, $request);
				while (!@feof($data)){
					$return .= @fgets($data, 8192);
				}
				@fclose($data);
			}
			break;
		case 'soc':
			$request = "GET ".$site_url." HTTP/1.1\r\n";
			$request .= "Host: ".$url['host']."\r\n";
			$request .= "Connection: Close\r\n\r\n";
			$sk = @socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
			@socket_bind($sk, $_SERVER['SERVER_ADDR']);
			$result=@socket_connect($sk, $url['host'], 80);
			if ($result>=0) {
				@socket_write($sk, $request);
				while ($out = @socket_read($sk, 2048)) $return.=$out;
				@socket_close($sk);
			}
			break;
		case 'fgc':
			$return = @file_get_contents($address);
			break;
		case 'fpn':
			$data = @fopen ($address, 'r');
			if ($data){
				while (!@feof($data)) $return .= @fread($data, 8192);
				@fclose($data);
			}
			break;
	}

	if (preg_match("@<LINKUJDATA>(.+)</LINKUJDATA>@s", $return, $return)) return $return[1];
	else return false;
}

function urlencode_clb($regs) {
    return urlencode($regs[0]);
}

function strtoupper_clb($regs) {
    return strtoupper($regs[0]);
}

function canonizeUrl($url) {
    // dekodowanie znakow, ktore moga sie trafic enkodowane, a mozna przeslac poprostu:
    $p = array('/%24/i','/%2C/i','/%3A/i','/%3B/i','/%5F/i','/%2D/i','/%40/i','/%20/');
    $r = array('$',',',':',';','_','-','@',' ');
    $url = preg_replace($p, $r, $url);

    // zakodowanie tego co powinno byc zakodowane...:
    $url = preg_replace_callback('@[^$,:;_\@A-Z0-9?&#=/%+.-]+@i', 'urlencode_clb', $url);

    // jeszcze tylko jakby komus do lba przyszlo encoda malymi literami pisac...
    $url = preg_replace_callback('@(%[0-9a-f]{2})+@i', 'strtoupper_clb', $url);
    return $url;
}

function linkuj_convert_charset($string) {
	global $linkuj;
	if ($linkuj['config']['charset']) {
		$iso2utf = array(
		"\xb1" => "\xc4\x85", "\xa1" => "\xc4\x84",
		"\xe6" => "\xc4\x87", "\xc6" => "\xc4\x86",
		"\xea" => "\xc4\x99", "\xca" => "\xc4\x98",
		"\xb3" => "\xc5\x82", "\xa3" => "\xc5\x81",
		"\xf3" => "\xc3\xb3", "\xd3" => "\xc3\x93",
		"\xb6" => "\xc5\x9b", "\xa6" => "\xc5\x9a",
		"\xbc" => "\xc5\xba", "\xac" => "\xc5\xb9",
		"\xbf" => "\xc5\xbc", "\xaf" => "\xc5\xbb",
		"\xf1" => "\xc5\x84", "\xd1" => "\xc5\x83"
		);
		if ($linkuj['config']['charset'] == "U")
		return strtr($string, $iso2utf);
		elseif ($linkuj['config']['charset'] == "W")
		return strtr($string, "\xa1\xa6\xac\xb1\xb6\xbc","\xa5\x8c\x8f\xb9\x9c\x9f");
		else return $string;
	} else return $string;
}
if (preg_match('@/linkuj'.$linkuj['config']['klientkey'].'.php$@', $_SERVER['SCRIPT_NAME'])) {
	
	$addressesArray = array($_SERVER['HTTP_X_REAL_IP'],$_SERVER['HTTP_X_FORWARDED_FOR'],$_SERVER['REMOTE_ADDR']);
	
	if ( in_array( gethostbyname($linkuj['config']['server']) , $addressesArray) || in_array($linkuj['config']['server_address'], $addressesArray)){
		linkuj_getdata();
		echo "<LINKUJDATA>";
		if ($linkuj['pub'] and $_GET['pub']==$linkuj['pub']) {
			switch($_GET['action']) {
				case 'show_ver':
					echo $linkuj['config']['ver'];
					break;
				case 'show_status':
					echo '<br>clientkey nowy: '.$linkuj['config']['klientkey'];
					echo '<br>ver: '.$linkuj['config']['ver'];
					echo '<br>nowy: 1';
					if (function_exists('gzuncompress')) echo '<br>connect: GZ';
					else echo '<br>connect: TEXT';
					echo '<br>charset: '.$linkuj['config']['charset'];
					preg_match_all("@<(NU:)@", $linkuj['data'], $matches);
					echo '<br>ilosc_nowych: '.count($matches[0]);
					preg_match_all("@<U:@", $linkuj['data'], $matches);
					echo '<br>ilosc_urli: '.count($matches[0]);
					preg_match_all("@<LU:@", $linkuj['data'], $matches);
					echo '<br>ilosc_lokalizacji: '.count($matches[0]);
					preg_match("@<R:([0-9]):([0-9]+)>@", $linkuj['data'], $matches);
					echo '<br>request: '.$matches[1].' - '.date('Y-m-d H:i', $matches[2]);
					echo '<br>connect: '.linkuj_connection_type();
					echo '<br>phpver: '.phpversion();
					echo '<br>savingstatus: ';
					if (!linkuj_savedata()) echo 'not saved';
					else echo 'success';
					echo '<br>connectstatus: '.linkuj_connect($linkuj['config']['server'].'/connect.php?action=show_charset');
					echo '<br>success';
					break;
				case 'show_new_data':
					preg_match_all("@<(NU:|IU:)[^>]+>@", $linkuj['data'], $matches);
					foreach ($matches[0] as $nurl) echo $nurl."\n";
					echo 'success';
					break;
				case 'show_all_data':
					preg_match_all("@<[^>]+>@", $linkuj['data'], $matches);
					foreach ($matches[0] as $nurl) echo $nurl."\n";
					echo 'success';
					break;
				case 'get_data':
					$linkuj['data']=preg_replace("@<R:[0-9]:[0-9]+>@", '<R:0:'.time().'>', $linkuj['data']);
					$linkuj['data']=preg_replace("@<NU:[^>]*>@", '', $linkuj['data']);
					$data=linkuj_connect($linkuj['config']['server'].'/connect.php?action=show_data');
					if ($data) {
						if (function_exists('gzuncompress')) $data=gzuncompress($data);
						if (preg_match("@<CH:[A-Z]>@", $data)) {
							$linkuj['data']='<R:0:'.time().'>';
							$linkuj['data'].='<PUB:'.$linkuj['pub'].'>';
							$linkuj['data'].=$data;
							echo 'success';
						} else echo 'data error';
					} else echo 'no data';
					linkuj_savedata();
					echo $data;
					break;
				case 'get_charset':
					$data=linkuj_connect($linkuj['config']['server'].'/connect.php?action=show_charset');
					if (preg_match("@<CH:[A-Z]>@", $data)) {
						$linkuj['data']=preg_replace("@<CH:([A-Z])>@", "", $linkuj['data']);
						$linkuj['data'].=$data;
						linkuj_savedata();
						echo 'success';
					}
					break;
				case 'send_request':
					if (!linkuj_savedata()) echo "not saved";
					else {
						echo 'success';
						linkuj_send_request("aktywacja");
					}
					break;
			}
		} elseif (!$linkuj['pub'] and $_GET['pub']) {
			$linkuj['data']='<PUB:'.$_GET['pub'].'><R:0:'.time().'>';
			if ($_GET['charset']) $linkuj['data'].='<CH:'.$_GET['charset'].'>';
			if (!linkuj_savedata()) echo "not saved";
			else {
				linkuj_getdata();
				echo 'success';
				linkuj_send_request("aktywacja");
			}
		} else echo "no valid pub";
		echo "</LINKUJDATA>";
	} else echo "Status - OK";
}
?>
