<?
Class Check{
	var $error 		= "";
	var $version 	= 1.6;
	function run($param){

		$_crypt 	= Serval::build('BritCrypt',$param['scode']);
		$_crypt->type = $param['crypt_type']; 

    $url 			= $param['url'].preg_replace('~[\/]+~u','/',"/".$param['script']);
    $url			= str_replace(array("https://","http://"),"",$url);
		$protocol = $param['protocol']=="https://" ? 'https://' : 'http://';
		if($param['is_test']=="yes"){
			$this->test = true;
		}

		if($result		= $this->request($url,$param['timeout'],array(
			'run'=>'DoCheckThis',
				'crypt_type'=>$param['crypt_type'],
				'data'=>base64_encode($_crypt->encrypt(serialize(array(
						'dirMax'=>($param['dirMax']>0 ? $param['dirMax'] : 100),
						'path'=>$param['rootDir'],
						'listDir'=>$param['listDir'],
						'ext'=>$param['ext'],
						'exc'=>$param['exc'],
						'is_test'=>$param['is_test']
					))))
				))){


				$decrypt 	= $_crypt->decrypt($result);
				$res 			= unserialize(base64_decode($decrypt));
				if(!is_array($res)){
					$result = strip_tags($result);
					
					if(stristr($result,'Fatal error')){
						if(stristr($result,"Allowed memory")){
							$result = "Недостаточно памяти, попробуйте уменьшить параметр \"Максимальное кол-во папок для сканирование (за раз)\"!<br>Ответ сервера: ".$result;
						}
						$res = array('status'=>'error','msg'=>strip_tags($result));
					}
				}
				
				if($res['status']=="ok"){
					if($this->version>$res['version']){
						return array('status'=>'error','msg'=>'Неактуальная версия файла... <br>Пожалуйста, скачайте и загрузите новый файл сканера!');
					}
				}elseif($res['status']=="error"){
						if(stristr($res['msg'],"Allowed memory")){
							$res['msg'] = "Недостаточно памяти, попробуйте уменьшить параметр \"Максимальное кол-во папок для сканирование (за раз)\"<br>Ответ сервера: ".$res['msg'];
						}
				}
				return is_array($res) ? $res : array('status'=>'error','msg'=>'Ошибка передачи данных, попробуйте перезалить файл сканера или поменять тип кодирования!');
		}

		return array('status'=>'error','msg'=>(empty($this->error) ? 'Неизвестная ошибка' : $this->error).'.');
	}
	
	function request($url,$timeout=30,$data){

		$curl	=	curl_init();
		curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
		curl_setopt($curl,CURLOPT_USERAGENT,'Serval/Elites/'.$this->version);
		curl_setopt($curl,CURLOPT_URL,$url);
		curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
		
		if($data && is_array($data) && count($data)>0){
			curl_setopt($curl,CURLOPT_CUSTOMREQUEST,'POST');
			curl_setopt($curl,CURLOPT_POSTFIELDS,$data);
		}
		
		curl_setopt($curl,CURLOPT_HEADER,false);
		curl_setopt($curl,CURLOPT_COOKIEFILE,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
		curl_setopt($curl,CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
		curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,0);
		curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,0);
		$out=curl_exec($curl);
		$code=curl_getinfo($curl,CURLINFO_HTTP_CODE);
		curl_close($curl);

	  switch($code){
			case '200':
			case '500':
				return $out;
			break;
			case '502':
				$out = strip_tags($out);
				if(stristr($out,'nginx')){
				  $this->error = "Сервер ответил кодом {$code}, на сервере установлен nginx, попробуйте уменьшить параметр \"Максимальное кол-во папок для сканирование (за раз)\" у проекта";
				}else{
					$this->error = "Сервер ответил кодом {$code}, попробуйте изменить тип кодирования у проекта или уменьшить параметр \"Максимальное кол-во папок для сканирование (за раз)\"";
				}
			break;
			case '504':
			  return "Сервер ответил кодом {$code}, попробуйте уменьшить кол-во папок за раз у проекта";
			break;
			case '301':
			case '302':
			  $this->error = "Сервер ответил кодом {$code}, укажите правильный путь до скрипта";
			break;
			case '100':
			  $this->error = "Serval не дождался ответа, попробуйте изменить настройки системы параметр \"Таймаут сканера (curl) по умолчанию\"";
			break;
			default:
				$this->error = "Произошла ошибка код {$code}, проверьте наличие PHP-файла по пути!";
		}
		unset($out);
    return false;
	}

}
?>