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

Размер файла: 12.81Kb
  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.  
  74. set_error_handler('error_catch');
  75. spl_autoload_register('autoloader');
  76. function autoloader($class)
  77. {
  78. if (is_file(H . 'engine/classes/'. $class . '.class.php'))
  79. {
  80. include H . 'engine/classes/' . $class . '.class.php';
  81. }
  82. elseif (is_file(H . 'engine/classes/'. $class . '.php'))
  83. {
  84. include H . 'engine/classes/' . $class . '.php';
  85. }
  86. elseif ($class == 'Pclzip')
  87. {
  88. include H . 'engine/classes/zip.php';
  89. }
  90. }
  91.  
  92. /**
  93. * @class Core эдакий контейнер функций
  94. */
  95.  
  96. Class Core
  97. {
  98. static $user_id = 0;
  99.  
  100. function __construct()
  101. {
  102. self::$user_id = isset($_SESSION['user_id']) ? $_SESSION['user_id'] : 0; // self::$user_id = isset($_SESSION['user_id']);
  103. }
  104.  
  105.  
  106. /**
  107. * Кеширование данных пользователей
  108. * @param integer $id id юзера, данные которого нужно получить
  109. * @param boolen $update если указать true, данные обновятся
  110. * @return array
  111. */
  112.  
  113. static function get_user($id, $update = false)
  114. {
  115. if (
  116. $update ||
  117. !file_exists(H.'engine/files/users/cache/'.$id.'.db') ||
  118. filemtime(H.'engine/files/users/cache/'.$id.'.db') > ($_SERVER['REQUEST_TIME'] + 3600)
  119. )
  120. {
  121. global $sql;
  122. $user = $sql->query('select * from `user` where `id` = "' . $id . '" limit 1 ')->fetch();
  123. if (!$user)
  124. return
  125. array('id' => 0, 'nick' => 'Гость', 'pol' => 1);
  126. file_put_contents(H.'engine/files/users/cache/'.$id.'.db', serialize($user));
  127. unset($sql, $user);
  128. }
  129. return
  130. unserialize(file_get_contents(H.'engine/files/users/cache/'.$id.'.db'));
  131. }
  132.  
  133.  
  134. /**
  135. * Перенаправление
  136. * @param string $stop
  137. */
  138. static function stop($page = '/')
  139. {
  140. header('location: '.$page);
  141. exit;
  142. }
  143.  
  144.  
  145. /**
  146. * Сохранение настроек
  147. */
  148.  
  149. static function save_settings($set, $file = 'engine/files/data/settings.ini')
  150. {
  151. include_once H.'engine/classes/ini.class.php';
  152. $ini = new ini(H . $file);
  153. foreach($set as $key => $value)
  154. {
  155. $ini->write($key, '"'.$value.'"');
  156. }
  157. return $ini->updateFile();
  158. }
  159. /**
  160. * Вывод даты
  161. * @param integer $time
  162. */
  163. static function time($time)
  164. {
  165. $year = date('Y', $time);
  166. return strtr(date('H:i, j F', $time), array (
  167. "January" => "января",
  168. "February" => "февраля",
  169. "March" => "марта",
  170. "April" => "апреля",
  171. "May" => "мая",
  172. "June" => "июня",
  173. "July" => "июля",
  174. "August" => "августа",
  175. "September" => "сентября",
  176. "October" => "октября",
  177. "November" => "ноября",
  178. "December" => "декабря")) .
  179. ($year < date('Y') ? ' ' . $year . ' года' : null);
  180. }
  181. /**
  182. * Рекурсивное подключение файлов
  183. * @param mixed $file принимает массив или строку
  184. * @param $path (string) папка файла
  185. */
  186. static function get($file, $path = 'classes')
  187. {
  188. if (is_array($file))
  189. {
  190. foreach($file as $file)
  191. {
  192. self::get($file, $path);
  193. }
  194. }
  195. elseif (file_exists(H.'engine/'.$path.'/'.$file.'.php'))
  196. {
  197. include_once H.'engine/'.$path.'/'.$file.'.php';
  198. }//else die('file engine/'.$path.'/'.$file.'.php not found');
  199. }
  200.  
  201. /**
  202. * Вывод сообщений. Вместо msg() и err() из Dcms
  203. * @param $msg (mixed) выводимое сообщение. Может быть массивом или строкой
  204. * @param $div (string) класс div'а.
  205. */
  206.  
  207. static function msg_show($msg, $div = 'error')
  208. {
  209. if (is_array($msg))
  210. {
  211. foreach($msg as $msg)
  212. {
  213. echo '<div class="'.$div.'">'.$msg.'</div>';
  214. }
  215. }
  216. else
  217. echo '<div class="'.$div.'">'.$msg.'</div>';
  218. }
  219.  
  220. /**
  221. * Вывод пользователя. Сюда и пихаем код медалек
  222. * @param $user (array) массив юзера
  223. * @param $data (array) $data['post'] текст который выводится снизу. $data['status'] текст который выводится рядом с ником. $data['is_time'] должна true, если $data['status'] - timestamp
  224. */
  225.  
  226. static function user_show($user, $data = array())
  227. {
  228. return
  229. self::user_icon($user) .
  230. ' <a href="/pages/user.php?id='.$user['id'].'"> ' .
  231. $user['nick'] . ' </a>'.
  232. (!empty($user['date_last']) && $user['date_last'] > ($_SERVER['REQUEST_TIME'] - 300) ? ' (on) ' : ' (off) ') .
  233. (isset($data['status']) ? '<span class="status">(' . (isset($data['is_time']) ? Core::time($data['status']) : $data['status']) . ')</span>' : null) .
  234. '<br />'. (!empty($data['post']) ? $data['post'] : null);
  235. }
  236.  
  237. // вывод иконки юзера
  238.  
  239. static function user_icon($user)
  240. {
  241. return '<img src="/style/users/icons/'.$user['pol'].'.png" alt=""/>';
  242. }
  243.  
  244.  
  245. // вывод аватара юзера
  246.  
  247. static function user_avatar($ava_id = 0, $return = 'image')
  248. {
  249. if (!$ava_id)
  250. $ava_id = Core::$user_id;
  251. $id = file_exists(H . 'style/users/avatar/'.$ava_id.'.jpg') ? $ava_id : 0;
  252. return $return == 'image' ? '<img src="/style/users/avatar/'.$id.'.jpg"/>' : '/style/users/avatar/'.$id.'.jpg';
  253. }
  254.  
  255.  
  256. // Получение данных о SW
  257.  
  258. static function Secwind($key = false)
  259. {
  260. $inf = unserialize(file_get_contents(H . 'engine/files/data/secwind.db'));
  261. return $key ? $inf[$key] : var_export($inf);
  262. }
  263.  
  264. // Получение фильтрированных данных из $_GET
  265.  
  266. static function Request($key)
  267. {
  268. return
  269. isset($_GET[$key]) ?
  270. is_array($_GET[$key]) ?
  271. $_GET[$key] :
  272. my_esc($_GET[$key], true) :
  273. false;
  274. }
  275.  
  276. static function form($key)
  277. {
  278. return
  279. isset($_POST[$key]) ?
  280. is_array($_POST[$key]) ?
  281. $_POST[$key] :
  282. my_esc($_POST[$key], true) :
  283. false;
  284. }
  285. }
  286.  
  287.  
  288. /**
  289. * функция для фильтрации строки от xss, sql inj
  290. * @todo удалить метод!
  291. */
  292. function my_esc($str, $html = false)
  293. {
  294. global $sql;
  295. if ($html)
  296. $str = htmlspecialchars($str);
  297. return mysqli_real_escape_string($sql->db, $str);
  298. }
  299.  
  300. /**
  301. * Перехват ошибок
  302. */
  303.  
  304. function error_catch($errno, $errstr, $errfile, $errline, $desc, $type = 'php')
  305. {
  306. if ( 0 == error_reporting ())
  307. {
  308. return;
  309. }
  310. global $sql, $creator;
  311.  
  312. if ($type == 'php')
  313. $desc = $errstr . ' | Файл ' . $errfile . ' | Линия - ' . $errline;
  314.  
  315. if ($creator && $type == 'php')
  316. echo $desc . '<br />';
  317.  
  318. $sql->query("
  319. INSERT INTO `errors`
  320. (`user` , `time`, `user_agent`, `ip`, `desc`, `type`, `url`) VALUES
  321. ('".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)."');");
  322. }
  323.  
  324.  
  325.  
  326. /**
  327. * Авторизация
  328. */
  329. if (isset($_SESSION['user_id']) && $sql->query('SELECT COUNT(*) FROM `user` WHERE `id` = '.$_SESSION['user_id'].' LIMIT 1')->result() == 1)
  330. {
  331. $user = Core::get_user($_SESSION['user_id']);
  332. $user_id = $user['id'];
  333. if (mt_rand(1, 2) == 1)
  334. $sql->query('UPDATE `user` SET `date_last` = '.$time.' WHERE `id` = '.$user['id'].' LIMIT 1');
  335. }
  336. else
  337. $user_id = 0;
  338.  
  339. if (!$user_id &&
  340. isset($_COOKIE['user_id'], $_COOKIE['pass']) &&
  341. $sql->query("SELECT COUNT(*) FROM `user` WHERE `id` = ".intval($_COOKIE['user_id'])." AND `pass` = '".my_esc($_COOKIE['pass'])."' LIMIT 1")->result() == 1)
  342. {
  343. $user = Core::get_user($_COOKIE['user_id']);
  344. $user_id = $_SESSION['user_id'] = $user['id'];
  345. $sql->query('select `file` from `module_services` where `use_in` = "auth"');
  346. $_SESSION['user_authed'] = 'COOKIE';
  347. }
  348.  
  349.  
  350. /**
  351. * @var $user_id (boolen) вернет true если юзер авторизован
  352. * @var $moder (boolen) вернет true для модератора
  353. * @var $admin (boolen) вернет true для админа
  354. * @var $creator (boolen) вернет true для создателя
  355. * @var $author (boolen) вернет true если юзер - автор
  356. */
  357.  
  358. $user_id = isset($_SESSION['user_id']) ? $user['id'] : 0;
  359. $moder = $user_id && $user['group_access'] > 1;
  360. $admin = $user_id && $user['group_access'] > 2;
  361. $creator = $user_id && $user['group_access'] > 9;
  362. //$author = $user_id == $id;
  363.  
  364.  
  365.  
  366. /**
  367. * По дефолту - отключен
  368. * Рекурсивно фильтрует все.
  369. * Даже массивы в массивах :-D
  370. */
  371.  
  372. function helper_awr(&$value, $key)
  373. {
  374. $key = my_esc($value, false);
  375. }
  376.  
  377. function helper_hsc(&$value, $key)
  378. {
  379. $key = htmlspecialchars($value);
  380. }
  381.  
  382. if ($set['filtr_get'])
  383. {
  384. array_walk_recursive($_GET, 'helper_awr');
  385. }
  386.  
  387. if ($set['filtr_post'])
  388. {
  389. array_walk_recursive($_POST, 'helper_awr');
  390. }
  391.  
  392. if ($set['antixss'])
  393. {
  394.  
  395. /*
  396. * Защита/предупреждение XSS-атак
  397. */
  398.  
  399. if (isset($_SERVER['HTTP_REFERER']))
  400. {
  401. $ref = parse_url($_SERVER['HTTP_REFERER']);
  402. if (!substr_count($ref['host'], $_SERVER['HTTP_HOST']))
  403. {
  404. if ($_POST) die('<b>Achtung! XSS attack!</b>');
  405. if ($_GET) die('<b>Achtung! XSS attack?></b><br />Подтвердите переход: <a href="'
  406. . htmlspecialchars($_SERVER['REQUEST_URI']) . '">'
  407. . htmlspecialchars($_SERVER['REQUEST_URI']) . '</a>');
  408. }
  409. }
  410.  
  411. array_walk_recursive($_GET, 'helper_hsc');
  412. array_walk_recursive($_POST, 'helper_hsc');
  413. }
  414.  
  415.  
  416.  
  417. /*
  418. * SecWind?
  419. * Вообще не торгать.
  420. */
  421.  
  422. if (isset($_GET['you_secwind?']))
  423. {
  424. exit(Core::Secwind('version'));
  425. }
  426.  
  427. 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)
  428. {
  429. Core::stop('/pages/ban.php');
  430. }
  431.  
  432. new Core;
  433. ob_start();