<?
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" || $_GET['type']=="all" ){
			$this->test = true;
		}

		if($result		= $this->request($protocol.$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'],
						'excf'=>$param['excf'],
						'maxtime'=>$param['maxtime'],
						'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->httpcode.']' : $this->error));
	}
	
	function request($url,$timeout=30,$data){
		global $config;  
			$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,$config['root'].'/tmp/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
			curl_setopt($curl,CURLOPT_COOKIEJAR,$config['root'].'/tmp/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);

			$this->httpcode = $code; 
			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;
	}

}
?>