Просмотр файла engine/includes/start.php

Размер файла: 15.27Kb
  1. <?php
  2. /**
  3. * @author Patsifist
  4. */
  5.  
  6.  
  7. /**
  8. * @const START для измерения генерации
  9. * @const H объявляем корень
  10. */
  11.  
  12. define('START', microtime(1));
  13. define('H', $_SERVER['DOCUMENT_ROOT'].'/');
  14. define('CPU', memory_get_usage());
  15. define('incDir', H.'engine/includes/');
  16. define('tmpDir', H.'engine/files/tmp/');
  17. define('MAIN', $_SERVER['PHP_SELF'] == '/index.php');
  18.  
  19.  
  20. if (is_file(H.'engine/files/data/settings.ini'))
  21. {
  22. $set = parse_ini_file(H.'engine/files/data/settings.ini');
  23. }
  24. else
  25. exit('<a href="/install/">Установить</a>');
  26.  
  27.  
  28. if (is_file(H . 'engine/files/data/flood_config.swi'))
  29. {
  30. Core::get('floodblocker', 'classes');
  31. $flood = new FloodBlocker;
  32. if (!$flood->CheckFlood())
  33. {
  34. die('Слишком много запросов. Попробуйте позже');
  35. }
  36. unset($flood);
  37. }
  38.  
  39.  
  40. /**
  41. * @var $time время в timestamp
  42. */
  43.  
  44. $time = $_SERVER['REQUEST_TIME'];
  45.  
  46.  
  47. /**
  48. * @var $id , $act чтобы 100 раз не проверять
  49. */
  50.  
  51. $id = isset($_GET['id']) ? (int) $_GET['id'] : 0;
  52. $act = isset($_GET['act']) ? $_GET['act'] : false;
  53. $cur_page = isset($_GET['page']) ? (int) $_GET['page'] : 0;
  54. $sql = include H.'engine/classes/mysqli.class.php';
  55. /**
  56. * Open Graph. Подробнее тут http://help.yandex.ru/webmaster/video/open-graph-markup.xml
  57. */
  58. $meta_og = array(
  59. 'site_name' => 'SecWind',
  60. 'url' => htmlspecialchars('http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']),
  61. 'image' => 'http://' . $_SERVER['SERVER_NAME'] . '/style/sw.png',
  62. 'locale' => 'ru_RU',
  63. 'title' => $set['title'],
  64. 'description' => $set['meta_description']);
  65.  
  66. session_name('Secwind');
  67. session_start();
  68.  
  69. //if (is_callable('ini_set')) {
  70. @set_time_limit(6);
  71. @ini_set('date.timezone', 'Europe/Moscow');
  72. @ini_set('html_errors', 1);
  73. mb_internal_encoding('UTF-8');
  74.  
  75. set_error_handler('error_catch');
  76. spl_autoload_register('autoloader');
  77. function autoloader($class)
  78. {
  79. if (is_file(H . 'engine/classes/'. strtolower($class) . '.class.php'))
  80. {
  81. include H . 'engine/classes/' . strtolower($class) . '.class.php';
  82. }
  83. elseif (is_file(H . 'engine/classes/'. $class . '.class.php'))
  84. {
  85. include H . 'engine/classes/' . $class . '.class.php';
  86. }
  87. elseif (is_file(H . 'engine/classes/'. strtolower($class) . '.php'))
  88. {
  89. include H . 'engine/classes/' . strtolower($class) . '.php';
  90. }
  91. elseif (is_file(H . 'engine/classes/'. $class . '.php'))
  92. {
  93. include H . 'engine/classes/' . $class . '.php';
  94. }
  95. elseif ($class == 'Pclzip')
  96. {
  97. include H . 'engine/classes/zip.php';
  98. }
  99. }
  100.  
  101. /**
  102. * @class Core эдакий контейнер функций
  103. */
  104.  
  105. Class Core
  106. {
  107. static $user_id = 0;
  108.  
  109. function __construct()
  110. {
  111. self::$user_id = isset($_SESSION['user_id']) ? $_SESSION['user_id'] : 0; // self::$user_id = isset($_SESSION['user_id']);
  112. }
  113.  
  114.  
  115. /**
  116. * Кеширование данных пользователей
  117. * @param integer $id id юзера, данные которого нужно получить
  118. * @param boolen $update если указать true, данные обновятся
  119. * @return array
  120. */
  121.  
  122. static function get_user($id, $update = false)
  123. {
  124. if (
  125. $update ||
  126. !file_exists(H.'engine/files/users/cache/'.$id.'.db') ||
  127. filemtime(H.'engine/files/users/cache/'.$id.'.db') > ($_SERVER['REQUEST_TIME'] + 3600)
  128. )
  129. {
  130. global $sql;
  131. $user = $sql->query('select * from `user` where `id` = "' . $id . '" limit 1 ')->fetch();
  132. if (!$user)
  133. return
  134. array('id' => 0, 'nick' => 'Гость', 'pol' => 1);
  135. file_put_contents(H.'engine/files/users/cache/'.$id.'.db', serialize($user));
  136. unset($sql, $user);
  137. }
  138. return
  139. unserialize(file_get_contents(H.'engine/files/users/cache/'.$id.'.db'));
  140. }
  141.  
  142.  
  143. /**
  144. * Перенаправление
  145. * @param string $stop
  146. */
  147. static function stop($page = '/')
  148. {
  149. header('location: '.$page);
  150. exit;
  151. }
  152.  
  153.  
  154. /**
  155. * Сохранение настроек
  156. */
  157.  
  158. static function save_settings($set, $file = 'engine/files/data/settings.ini')
  159. {
  160. include_once H.'engine/classes/ini.class.php';
  161. $ini = new ini(H . $file);
  162. foreach($set as $key => $value)
  163. {
  164. $ini->write($key, '"'.$value.'"');
  165. }
  166. return $ini->updateFile();
  167. }
  168. /**
  169. * Вывод даты
  170. * @param integer $time
  171. */
  172. static function time($time)
  173. {
  174. $year = date('Y', $time);
  175. return strtr(date('H:i, j F', $time), array (
  176. "January" => "января",
  177. "February" => "февраля",
  178. "March" => "марта",
  179. "April" => "апреля",
  180. "May" => "мая",
  181. "June" => "июня",
  182. "July" => "июля",
  183. "August" => "августа",
  184. "September" => "сентября",
  185. "October" => "октября",
  186. "November" => "ноября",
  187. "December" => "декабря")) .
  188. ($year < date('Y') ? ' ' . $year . ' года' : null);
  189. }
  190. /**
  191. * Рекурсивное подключение файлов
  192. * @param mixed $file принимает массив или строку
  193. * @param $path (string) папка файла
  194. */
  195. static function get($file, $path = 'classes')
  196. {
  197. if (is_array($file))
  198. {
  199. foreach($file as $file)
  200. {
  201. self::get($file, $path);
  202. }
  203. }
  204. elseif (file_exists(H.'engine/'.$path.'/'.$file.'.php'))
  205. {
  206. include_once H.'engine/'.$path.'/'.$file.'.php';
  207. }//else die('file engine/'.$path.'/'.$file.'.php not found');
  208. }
  209.  
  210. /**
  211. * Вывод сообщений. Вместо msg() и err() из Dcms
  212. * @param $msg (mixed) выводимое сообщение. Может быть массивом или строкой
  213. * @param $div (string) класс div'а.
  214. */
  215.  
  216. static function msg_show($msg, $div = 'error')
  217. {
  218. if (is_array($msg))
  219. {
  220. foreach($msg as $msg)
  221. {
  222. echo '<div class="'.$div.'">'.$msg.'</div>';
  223. }
  224. }
  225. else
  226. echo '<div class="'.$div.'">'.$msg.'</div>';
  227. }
  228.  
  229. /**
  230. * Вывод пользователя
  231. * @param $user (array) массив юзера
  232. * @param $data (array) $data['post'] текст который выводится снизу. $data['status'] текст который выводится рядом с ником. $data['is_time'] должна true, если $data['status'] - timestamp
  233. */
  234.  
  235. static function user_show($user, $data = array(), $view = 'old')
  236. {
  237. if ($view == 'old')
  238. {
  239. return
  240. self::user_icon($user) .
  241. ' <a href="/pages/user.php?id='.$user['id'].'"> ' .
  242. $user['nick'] . ' </a>'.
  243. (isset($data['status']) ? '<span class="status">(' . (isset($data['is_time']) ? Core::time($data['status']) : $data['status']) . ')</span>' : null) .
  244. '<br />'. (!empty($data['post']) ? $data['post'] : null);
  245. }
  246. return
  247. '<div style="clear:both"><div style="float:left;padding-right: 8px;">'.
  248. self::user_avatar($user['id']) .'</div>'.
  249. self::user_icon($user) . '<a style="clear:both" href="/pages/user.php?id='.$user['id'].'"> ' .
  250. $user['nick'] . ' </a>'.
  251. (isset($data['status']) ? '<span style="float:right">' . (isset($data['is_time']) ? Core::time($data['status']) : $data['status']) . '</span>' : null) .
  252. '</div>'.(!empty($data['post']) ? $data['post'] : null).'<br style="clear:both"/>';
  253.  
  254. }
  255.  
  256. // вывод иконки юзера
  257.  
  258. static function user_icon($user)
  259. {
  260. $pol = $user['pol'] == 1 ? 'man' : 'woman';
  261. $online = $user['date_last'] > ($_SERVER['REQUEST_TIME'] - 300) ? 'on' : 'off';
  262. if ($online == 'off')
  263. {
  264. return '<img src="/style/users/icons/'.$pol.'_'.$online.'.png" alt=""/>';
  265. }
  266. else
  267. {
  268. //$user_id = isset($_SESSION['user_id']) ? $user['id'] : 0;
  269. $group = 'user';
  270. if ($user['group_access'] > 9)
  271. $group = 'creator';
  272. elseif ($user['group_access'] > 2)
  273. $group = 'admin';
  274. elseif ($user['group_access'] > 1)
  275. $group = 'moder';
  276. return '<img src="/style/users/icons/'.$group.'_'.$pol.'_'.$online.'.png" alt=""/>';
  277. }
  278. }
  279.  
  280. // вывод аватара юзера
  281.  
  282. static function user_avatar($ava_id = 0, $return = 'image')
  283. {
  284. if (!$ava_id)
  285. $ava_id = Core::$user_id;
  286. $id = file_exists(H . 'style/users/avatar/'.$ava_id.'.jpg') ? $ava_id : 0;
  287. return $return == 'image' ? '<img src="/style/users/avatar/'.$id.'.jpg"/>' : '/style/users/avatar/'.$id.'.jpg';
  288. }
  289.  
  290.  
  291. // Получение данных о SW
  292.  
  293. static function Secwind($key = false)
  294. {
  295. $inf = unserialize(file_get_contents(H . 'engine/files/data/secwind.db'));
  296. return $key ? $inf[$key] : var_export($inf);
  297. }
  298.  
  299. // Получение фильтрированных данных из $_GET
  300.  
  301. static function Request($key)
  302. {
  303. return
  304. isset($_GET[$key]) ?
  305. is_array($_GET[$key]) ?
  306. $_GET[$key] :
  307. my_esc($_GET[$key], true) :
  308. false;
  309. }
  310.  
  311. static function form($key)
  312. {
  313. return
  314. isset($_POST[$key]) ?
  315. is_array($_POST[$key]) ?
  316. $_POST[$key] :
  317. my_esc($_POST[$key], true) :
  318. false;
  319. }
  320. }
  321.  
  322.  
  323. /**
  324. * функция для фильтрации строки от xss, sql inj
  325. * @todo удалить метод!
  326. */
  327. function my_esc($str, $html = false)
  328. {
  329. global $sql;
  330. if ($html)
  331. $str = htmlspecialchars($str);
  332. return mysqli_real_escape_string($sql->db, $str);
  333. }
  334.  
  335. /**
  336. * Перехват ошибок
  337. */
  338.  
  339. function error_catch($errno, $errstr, $errfile, $errline, $desc, $type = 'php')
  340. {
  341. if ( 0 == error_reporting ())
  342. {
  343. return;
  344. }
  345. global $sql, $creator;
  346.  
  347. if ($type == 'php')
  348. $desc = $errstr . ' | Файл ' . $errfile . ' | Линия - ' . $errline;
  349.  
  350. if ($creator && $type == 'php')
  351. echo $desc . '<br />';
  352.  
  353. $sql->query("
  354. INSERT INTO `errors`
  355. (`user` , `time`, `user_agent`, `ip`, `desc`, `type`, `url`) VALUES
  356. ('".Core::$user_id."', '".time()."', '".my_esc($_SERVER['HTTP_USER_AGENT'], true)."', '".my_esc($_SERVER['REMOTE_ADDR'], true)."', '".my_esc($desc)."', '".$type."', '".my_esc($_SERVER['REQUEST_URI'], true)."');");
  357. }
  358.  
  359.  
  360.  
  361. /**
  362. * Авторизация
  363. */
  364. if (isset($_SESSION['user_id']) && $sql->query('SELECT COUNT(*) FROM `user` WHERE `id` = '.$_SESSION['user_id'].' LIMIT 1')->result() == 1)
  365. {
  366. $user = Core::get_user($_SESSION['user_id']);
  367. $user_id = $user['id'];
  368. if (mt_rand(1, 2) == 1)
  369. $sql->query('UPDATE `user` SET `date_last` = '.$time.' WHERE `id` = '.$user['id'].' LIMIT 1');
  370. }
  371. else
  372. $user_id = 0;
  373.  
  374. if (!$user_id &&
  375. isset($_COOKIE['user_id'], $_COOKIE['pass']) &&
  376. $sql->query("SELECT COUNT(*) FROM `user` WHERE `id` = ".intval($_COOKIE['user_id'])." AND `pass` = '".my_esc($_COOKIE['pass'])."' LIMIT 1")->result() == 1)
  377. {
  378. $user = Core::get_user($_COOKIE['user_id']);
  379. $user_id = $_SESSION['user_id'] = $user['id'];
  380. $sql->query('select `file` from `module_services` where `use_in` = "auth"');
  381. $_SESSION['user_authed'] = 'COOKIE';
  382. }
  383.  
  384.  
  385. /**
  386. * @var $user_id (boolen) вернет true если юзер авторизован
  387. * @var $moder (boolen) вернет true для модератора
  388. * @var $admin (boolen) вернет true для админа
  389. * @var $creator (boolen) вернет true для создателя
  390. * @var $author (boolen) вернет true если юзер - автор
  391. */
  392.  
  393. $user_id = isset($_SESSION['user_id']) ? $user['id'] : 0;
  394. $moder = $user_id && $user['group_access'] > 1;
  395. $admin = $user_id && $user['group_access'] > 2;
  396. $creator = $user_id && $user['group_access'] > 9;
  397. $show_theme = isset($_COOKIE['set_theme']) && ($_COOKIE['set_theme'] == 'default' || $_COOKIE['set_theme'] == 'web')
  398. ? $_COOKIE['set_theme'] :
  399. (!empty($user['set_them']) ? $user['set_them'] : $set['theme']);
  400. //$author = $user_id == $id;
  401.  
  402.  
  403.  
  404. /**
  405. * По дефолту - отключен
  406. * Рекурсивно фильтрует все.
  407. * Даже массивы в массивах :-D
  408. */
  409.  
  410. function helper_awr(&$value, $key)
  411. {
  412. $key = my_esc($value, false);
  413. }
  414.  
  415. function helper_hsc(&$value, $key)
  416. {
  417. $key = htmlspecialchars($value);
  418. }
  419.  
  420. if ($set['filtr_get'])
  421. {
  422. array_walk_recursive($_GET, 'helper_awr');
  423. }
  424.  
  425. if ($set['filtr_post'])
  426. {
  427. array_walk_recursive($_POST, 'helper_awr');
  428. }
  429.  
  430. if ($set['antixss'])
  431. {
  432.  
  433. /*
  434. * Защита/предупреждение XSS-атак
  435. */
  436.  
  437. if (isset($_SERVER['HTTP_REFERER']))
  438. {
  439. $ref = parse_url($_SERVER['HTTP_REFERER']);
  440. if (!substr_count($ref['host'], $_SERVER['HTTP_HOST']))
  441. {
  442. if ($_POST) die('<b>Achtung! XSS attack!</b>');
  443. if ($_GET) die('<b>Achtung! XSS attack?></b><br />Подтвердите переход: <a href="'
  444. . htmlspecialchars($_SERVER['REQUEST_URI']) . '">'
  445. . htmlspecialchars($_SERVER['REQUEST_URI']) . '</a>');
  446. }
  447. }
  448.  
  449. array_walk_recursive($_GET, 'helper_hsc');
  450. array_walk_recursive($_POST, 'helper_hsc');
  451. }
  452.  
  453.  
  454.  
  455. /*
  456. * SecWind?
  457. * Вообще не торгать.
  458. */
  459.  
  460. if (isset($_GET['you_secwind?']))
  461. {
  462. exit(Core::Secwind('version'));
  463. }
  464.  
  465. if ($user_id && $_SERVER['PHP_SELF'] != '/pages/ban.php' && $sql->query('SELECT COUNT(*) FROM `ban` WHERE `user_id` = '.$user_id.' AND `time` > '.$time .' LIMIT 1')->result() == 1)
  466. {
  467. Core::stop('/pages/ban.php');
  468. }
  469. if (isset($compatibility))
  470. {
  471. function completion($set, $sql, $show_theme, $user_id, $moder, $admin, $creator)
  472. {
  473. $time = time();
  474. $meta_og = array();
  475. $user_id = Core::$user_id;
  476. if ($user_id)
  477. {
  478. $user = Core::get_user($user_id);
  479. }
  480. include incDir . 'foot.php';
  481. }
  482. register_shutdown_function('completion', $set, $sql, $show_theme, $user_id, $moder, $admin, $creator);
  483. include H . 'engine/includes/compatibility.php';
  484. }
  485.  
  486. new Core;
  487. ob_start();