<?
# псевдонимы функций (Спасает от 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')");
?>