View file sys/inc/fnc.php

File size: 15.34Kb
<?
	# псевдонимы функций (Спасает от sql inj)
	function my_esc($str){
	return mysql_real_escape_string($str);
	}
	
	# Защита от частых запросов с одного IP
	if ($set['antidos'])
	{
		
		$antidos[] = array('time'=> $time);
		$k_loads=0;
		if (is_file(H.'sys/tmp/antidos_'.$iplong.'.dat'))
		{
			$antidos_dat=unserialize(file_get_contents(H.'sys/tmp/antidos_'.$iplong.'.dat'));
			for ($i = 0; $i < 150 and $i < sizeof($antidos_dat); ++$i)
			{
			if($antidos_dat[$i]['time'] > $time-5)
			{
			$k_loads++;
			$antidos[] = $antidos_dat[$i];
			}
		}
	}



	# бан по IP
	if (!isset($ban_ip_page) and mysql_result(query("SELECT COUNT(*) FROM `ban_ip` WHERE 
	`min` <= '$iplong' AND 
	`max` >= '$iplong'"), 0) != 0)
	exit(header('Location: /ban_ip.php'));
	

	if (isset($ip2['cl']) and !isset($ban_ip_page) and 
	mysql_result(query("SELECT COUNT(*) FROM `ban_ip` WHERE 
	`min` <= '".ip2long($ip2['cl'])."' AND 
	`max` >= '".ip2long($ip2['cl'])."'"), 0) != 0)	
	exit(header('Location: /ban_ip.php'));
	

	if (!isset($ban_ip_page) AND isset($ip2['xff']) and	mysql_result(query("SELECT COUNT(*) FROM `ban_ip` WHERE 
	`min` <= '".ip2long($ip2['xff'])."' AND 
	`max` >= '".ip2long($ip2['xff'])."'"), 0) != 0)
	exit(header("Location: /ban_ip.php"));





  if ( $k_loads > 100 and mysql_result(query("SELECT COUNT(*) FROM `ban_ip` WHERE 
    `min` <= '$iplong' AND 
    `max` >= '$iplong'"), 0)==0)
	query("INSERT INTO `ban_ip` (`min`, `max`, `prich`) values('$iplong', '$iplong', 'AntiDos')");

	@file_put_contents(H.'sys/tmp/antidos_'.$iplong.'.dat', serialize($antidos));
	@chmod(H.'sys/tmp/antidos_'.$iplong.'.dat', 0777);
	}

	# антимат сделает автоматическое предупреждение, а затем бан
	function antimat($str)
	{
	global $user,$time,$set;
	if ($set['antimat'])
	{
		$antimat = empty($_SESSION['antimat']) ? null : $_SESSION['antimat'];
		require H.'sys/inc/censure.php';
		$censure = censure($str);
		if ($censure)
		{
			$antimat[$censure]=$time;
			if (count($antimat) > 3 and isset($user) and $user['level']) // если сделано больше 3-х предупреждений
			{
				$prich="Обнаружен мат: $censure";
				$timeban=$time+60*60; // бан на час
				query("INSERT INTO `ban` (`id_user`, `id_ban`, `prich`, `time`) VALUES ('$user[id]', '0', '$prich', '$timeban')");
				admin_log('Пользователи','Бан',"Бан пользователя '[url=/amd_panel/ban.php?id=$user[id]]$user[nick][/url]' (id#$user[id]) до ".vremja($timeban)." по причине '$prich'");
				exit(header('Location: /ban.php?'));
			}
			return $censure;
		}
		else return false;
	}
	else return false;
	}







// рекурсивное удаление папки
	function delete_dir($dir){
	if (is_dir($dir)){
	$od=opendir($dir);
	while ($rd=readdir($od))
	{
			//пропускаем
			if ($rd == '.' || $rd == '..') continue;
			if (is_dir("$dir/$rd"))
			{
				@chmod("$dir/$rd", 0777);
				delete_dir("$dir/$rd");
			}
			else
			{
				@chmod("$dir/$rd", 0777);
				@unlink("$dir/$rd");}}
				closedir($od);
				@chmod("$dir", 0777);
				return @rmdir("$dir");
			}
			else
			{
				@chmod("$dir", 0777);
				@unlink("$dir");
			}
	}



	# Подведение итогов статистики
	if (!isset($hard_process))
	{
		$q = query("SELECT * FROM `cron` WHERE `id` = 'visit' LIMIT 1");
		if (mysql_num_rows($q)==0)
		query("INSERT INTO `cron` (`id`, `time`) VALUES ('visit', '$time')");
		$visit = mysql_fetch_assoc($q);
		if ($visit['time'] == NULL or $visit['time'] < time() - 60 * 60 * 24)
		{
		if (function_exists('set_time_limit'))	@set_time_limit(60); 
			$last_day = mktime(0, 0, 0, date('m'), date('d')-1); // начало вчерашних суток
			$today_time = mktime(0, 0, 0); // начало сегодняшних суток
			if (mysql_result(query("SELECT COUNT(*) FROM `visit_everyday` WHERE `time` = '$last_day'"),0)==0){
			$hard_process = true;
			# записываем общие данные за вчерашние сутки в отдельную таблицу
			query("INSERT INTO `visit_everyday` (`host` , `host_ip_ua`, `hit`, `time`) VALUES ((SELECT COUNT(DISTINCT `ip`) FROM `visit_today` WHERE `time` < '$today_time'),(SELECT COUNT(DISTINCT `ip`, `ua`) FROM `visit_today` WHERE `time` < '$today_time'),(SELECT COUNT(*) FROM `visit_today` WHERE `time` < '$today_time'),'$last_day')");
			query('DELETE FROM `visit_today` WHERE `time` < '.$today_time);
			}
		}
	}



	# запись о переходах на сайт
	if (isset($_SERVER['HTTP_REFERER']) and !preg_match('#'.preg_quote($_SERVER['HTTP_HOST']).'#', $_SERVER['HTTP_REFERER']) and $ref = @parse_url($_SERVER['HTTP_REFERER']))
	{
		if (isset($ref['host'])) 
		$_SESSION['http_referer'] = $ref['host'];
	}



	#  переносы строк
	function br($msg,$br='<br />')
	{
		return preg_replace("#((<br( ?/?)>)|\n|\r)+#i",$br, $msg);
	}

	
	
	
	# Вырезает все нечитаемые символы
	function esc($text,$br=NULL)
	{ 
	if ($br!=NULL)
		for ($i=0;$i<=31;$i++)$text=str_replace(chr($i), NULL, $text);
	else	
	{
		for ($i=0;$i<10;$i++)$text=str_replace(chr($i), NULL, $text);
		for ($i=11;$i<20;$i++)$text=str_replace(chr($i), NULL, $text);
		for ($i=21;$i<=31;$i++)$text=str_replace(chr($i), NULL, $text);
	}
		return $text;
	}





#	 получаем данные пользователя и уровень прав (+ кеширование)


/*

Функция кэшируется в json
собственно тут все просто .как небудь позже опишу подробно ....

*/

function get_user($user_id=0)
	{
	
	$user_id = (int) $user_id;
	
	global $users,$set;
	
	if (!empty($users[$user_id]))
	{
		return $users[$user_id];
	}	else	
	if ($user_id==0)
	{
		$ank2['id']= $set['id_system'];
		$ank2['nick'] ='  '.$set['nick_system'].'  ';#Так надо
		$ank2['level']=999;
		$ank2['pol']=1;
		$ank2['group_name']='Системный робот';
		$ank2['group_access']=0;
		$ank2['ank_o_sebe']='Создан для уведомлений';
		return $ank2;
	}		
	else
	{
		$file = H.'sys/cache/users/'.$user_id.'.json';
		
		if (file_exists($file) and (time() - filemtime($file) < $set['cache_get_user']))
		$cache = false;
		else 
		$cache = true;
		
		if ($cache)
		{
			$u = mysql_fetch_assoc(query("SELECT * FROM `user` WHERE `id` = '".$user_id."' LIMIT 1"));
			$tmp_us = mysql_fetch_assoc(query("SELECT `level`,`name` AS `group_name` FROM `user_group` WHERE `id` = '".$u['group_access']."' LIMIT 1"));
			if (!$tmp_us['group_name']) 
			{
				$u['level'] = (string) 0;
				$u['group_name'] = 'Пользователь';
			}	
			else
			{
				$u['level'] = (string) $tmp_us['level'];
				$u['group_name'] = $tmp_us['group_name'];
			}
			file_put_contents ($file, json_encode($u));
		}
		$users[$user_id] = empty($temp_us) ? json_decode (file_get_contents ($file), true): $temp_us;
		return $users[$user_id];
	}
}







#	Крон :: отчистка папки с кэшем файлов get_user()
if (!isset($hard_process))
{


	$clear_dir = mysql_fetch_assoc(query("SELECT * FROM `cron` WHERE `id` = 'clear_user_cache'"));
     if ($clear_dir['time']==NULL or $clear_dir['time'] < $time - $set['cache_get_user_time']){
     $hard_process=true;
     query("UPDATE `cron` SET `time` = '$time' WHERE `id` = 'clear_user_cache' LIMIT 1");
     $od = opendir(H.'sys/cache/users/');

          while ($rd=readdir($od))
          {
               if (!preg_match('#^\.#',$rd) and filectime(H.'sys/cache/users/'.$rd) < $time - $set['cache_get_user_time'])
               @delete_dir(H.'sys/cache/users/'.$rd);
            
          }
          closedir($od);
     }
}






#	Крон :: очистка временной папки
if (!isset($hard_process))
{


	$clear_dir = mysql_fetch_assoc(query("SELECT * FROM `cron` WHERE `id` = 'clear_tmp_dir'"));
     if ($clear_dir['time']==NULL || $clear_dir['time']<$time-60*60*24)
     {
     $hard_process=true;
     query("UPDATE `cron` SET `time` = '$time' WHERE `id` = 'clear_tmp_dir' LIMIT 1");
     $od = opendir(H.'sys/tmp/');

          while ($rd=readdir($od))
          {
               if (!preg_match('#^\.#',$rd) and filectime(H.'sys/tmp/'.$rd)<$time-60*60*24)
               @delete_dir(H.'sys/tmp/'.$rd);
          }
          closedir($od);
     }
}



#	Крон :: бекапа базы
if (!isset($hard_process) and $set['db_backup_cron_msg_id'] > 0 and  $set['mail_backup'] >0)
{

	 $db_backup_cron = mysql_fetch_assoc(query("SELECT * FROM `cron` WHERE `id` = 'db_backup'"));
     if ($db_backup_cron['time'] == null or $db_backup_cron['time'] < time() - $set['db_backup_cron'])
     {
     $hard_process=true;
	 #	что б тут не писать тонны кода
	 include_once H.'sys/inc/backup.php';
	 #	шлем на почту сообщение 	
	 if ($set['db_backup_cron_msg']==1)
	 query("INSERT INTO `mail` (`id_user`, `id_kont`, `msg`, `time`)
	 values('0', '".($set['db_backup_cron_msg_id']>0 ? $set['db_backup_cron_msg_id'] : 1)."',
	 '".my_esc('Ежедневный бекап базы данных создан и отправлен вам на ваш почтовый ящик '.$set['mail_backup'])."',
	 '".time()."')");
	 #	если не указан айди или он меньше 0 то шлем на бетоне на айди 1
     } 
}


 



	# opsos() :: определение оператора
	function opsos($ips=NULL){
	global $ip;
		if ($ips==NULL) $ips = $ip;
		$ipl = ip2long($ips);
	if (mysql_result(query("SELECT COUNT(*) FROM `opsos` WHERE `min` <= '$ipl' AND `max` >= '$ipl'"), 0) != 0)
	{
		$opsos=mysql_fetch_assoc(query("SELECT opsos FROM `opsos` WHERE `min` <= '$ipl' AND `max` >= '$ipl' LIMIT 1"));
		return stripcslashes(htmlspecialchars($opsos['opsos']));
	}
		else return false;
	}




	function vremja($time=NULL)
	{
	global $user;
	if ($time==NULL)
	$time = time();
	if (isset($user))
		$time = $time + $user['set_timesdvig'] * 60 * 60;
		$timep=date('j M Y в H:i', $time) ;
		$time_p[0] = date('j n Y', $time);
		$time_p[1] = date('H:i', $time);
	if ($time_p[0] == date('j n Y'))
		$timep = date('H:i:s', $time);
	if (isset($user))
	{
		if ($time_p[0] == date('j n Y', time() + $user['set_timesdvig']*60*60))
		$timep = date('H:i:s', $time);
			
		if ($time_p[0] == date('j n Y', time()-60*60*(24 - $user['set_timesdvig'])))
		$timep="Вчера в $time_p[1]";
	}
	else
	{
		if ($time_p[0] == date('j n Y'))
		$timep = date('H:i:s', $time);
		if ($time_p[0] == date('j n Y', time()-60*60*24))
		$timep = "Вчера в $time_p[1]";
	}
	$timep = str_replace(
		array('Jan', 'Feb', 'Mar', 'May', 'Apr', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'), 
		array ('Янв', 'Фев', 'Марта', 'Мая', 'Апр', 'Июня', 'Июля', 'Авг', 'Сент', 'Окт', 'Ноября', 'Дек') , $timep);
	return $timep;
	}




	# только для зарегистрированых
	function only_reg($link = NULL) 
	{
	global $user;
		if (!isset($user))
		{
			if ($link == NULL) $link = '/';
			exit(header('Location: '.$link));
		}
	}

	# только для незарегистрированых
	function only_unreg($link = NULL)
	{
	global $user;
	if (isset($user))
	{
		if ($link == NULL)$link='/';
		exit(header('Location: '.$link));
	}

	
	# только для тех, у кого уровень доступа больше или равен $level
	function only_level($level=0,$link = NULL)
	{
	global $user;
	if (!isset($user) or $user['level'] < $level)
	{
		if ($link == NULL)$link='/';
		exit(header('Location: '.$link));
	}
	}





	if (!isset($hard_process))
	{
	$q = query("SELECT * FROM `cron` WHERE `id` = 'everyday'");

	$everyday = mysql_fetch_assoc($q);
	if ($everyday['time']==NULL or $everyday['time'] < time()-60*60*24)
	{
		$hard_process = true;
		if (function_exists('set_time_limit'))
		@set_time_limit(60); 
			query("UPDATE `cron` SET `time` = '".time()."' WHERE `id` = 'everyday'");
			query("DELETE FROM `guests` WHERE `date_last` < '".(time()-600)."'");
			query("DELETE FROM `chat_post` WHERE `time` < '".(time()-60*60*24)."'"); // удаление старых постов в чате
			query("DELETE FROM `user` WHERE `activation` != null AND `time_reg` < '".(time()-60*60*24)."'"); // удаление неактивированных аккаунтов

	# удаляем все контакты, помеченные на удаление более месяца назад
	$qd = query("SELECT * FROM `users_konts` WHERE 
	`type` = 'deleted' AND
	`time` < ".(time()-60*60*24*30));
	while ($deleted=mysql_fetch_array($qd))
	{
		query("DELETE FROM `users_konts` WHERE `id_user` = '$deleted[id_user]' AND `id_kont` = '$deleted[id_kont]'");
		# если юзер не находится в контакте у другого, то удаляем и все сообщения
		if (mysql_result(query("SELECT COUNT(*) FROM `users_konts` WHERE 
		`id_kont` = '$deleted[id_user]' AND 
		`id_user` = '$deleted[id_kont]'"),0) == 0)
		query("DELETE FROM `mail` WHERE `id_user` = '$deleted[id_user]' AND 
		`id_kont` = '$deleted[id_kont]' OR 
		`id_kont` = '$deleted[id_user]' AND 
		`id_user` = '$deleted[id_kont]'");
	}
	}


	}
	}




	# вывод ошибок
	function err(){
	global $err;
	if (isset($err))
	{
		if (is_array($err))
		{
			foreach ($err as $key=> $value) 
			{
				echo "<div class='err'>$value</div>";
			}
		}
		else echo "<div class='err'>$err</div>";
		}
	}



	# вывод сообщений
	function msg($msg)
	{
		echo "<div class='msg'>". $msg ."</div>";
	} 


	# отправка запланированных писем
	$q = query("SELECT * FROM `mail_to_send` LIMIT 1");
	if (mysql_num_rows($q) != 0)
	{
		$mail = mysql_fetch_assoc($q);
		$adds="From: \"admin@$_SERVER[HTTP_HOST]\" <admin@$_SERVER[HTTP_HOST]>\n";
		$adds .= "Content-Type: text/html; charset=utf-8\n";
		mail($mail['mail'],'=?utf-8?B?'.base64_encode($mail['them']).'?=',$mail['msg'],$adds);
		query("DELETE FROM `mail_to_send` WHERE `id` = '$mail[id]'");
	}


	# сохранение настроек системы
	function save_settings($set){
	unset($set['web']);
	if ($fopen=@fopen(H.'sys/dat/settings_6.2.dat', 'w'))
	{
		@fputs($fopen, serialize($set));
		@fclose($fopen);
		@chmod(H.'sys/dat/settings_6.2.dat', 0777);
	return true;
	}
	else 
	return false;
	}


	#	запись действий администрации
	function admin_log($mod,$act,$opis)
	{
	global $user;
	$sql = query("SELECT * FROM `admin_log_mod` WHERE `name` = '".my_esc($mod)."' LIMIT 1");
	if (mysql_num_rows($sql)==0)
	{
	query("INSERT INTO `admin_log_mod` (`name`) VALUES ('". my_esc($mod) ."')");
	$id_mod=mysql_insert_id();
	}
	else
	$id_mod = mysql_result($sql, 0);

	$sqls = query("SELECT * FROM `admin_log_act` WHERE `name` = '".my_esc($act)."' AND `id_mod` = '$id_mod' LIMIT 1");
	if (mysql_num_rows($sqls)==0)
	{
		query("INSERT INTO `admin_log_act` (`name`, `id_mod`) VALUES ('".my_esc($act)."', '$id_mod')");
		$id_act = mysql_insert_id();
	}
	else
		$id_act = mysql_result($sqls, 0);
		query("INSERT INTO `admin_log` (`time`, `id_user`, `mod`, `act`, `opis`) VALUES 
		('".time()."','$user[id]', '$id_mod', '$id_act', '".my_esc($opis)."')");
	}



	# Загрузка остальных функций из папки "sys/core"

	$Search = glob(H.'sys/core/*.php'); 
	foreach($Search as $function) 
	{
		include_once $function; 
	}
		


	# запись о посещении
	query("INSERT INTO `visit_today` (`ip` , `ua`, `time`) VALUES ('$iplong', '".@my_esc($_SERVER['HTTP_USER_AGENT'])."', '$time')");

?>