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

Размер файла: 12.25Kb
<?php
    
   /**
	 * @author DESURE
	 * @author Tadochi
     */


   /**
	 * @const START for Generation
     * @const H for Inlcudes
     */

    define('START', microtime(1));
	define('H', $_SERVER['DOCUMENT_ROOT'].'/');
	define('CPU', memory_get_usage());
	define('incDir', H.'engine/includes/'); // так я захотел
    define('tmpDir', H.'engine/files/tmp/');
	define('MAIN', $_SERVER['PHP_SELF'] == '/index.php');


	if (is_file(H.'engine/files/data/settings.ini'))
	{
    	$set = parse_ini_file(H.'engine/files/data/settings.ini');
	}
	else
	    exit('<a href="/install/">Установить</a>');


	if (is_file(H . 'engine/files/data/flood_config.swi'))
	{
		Core::get('floodblocker', 'classes');
		$flood = new FloodBlocker;
		if (!$flood->CheckFlood())
		{
			die('Слишком много запросов. Попробуйте позже');
		}
		unset($flood);
	}


    /**
	 * @var $time время в timestamp. осталось из Dcms 6.6.4
     */

    $time = $_SERVER['REQUEST_TIME'];


   /**
	 * @var $id , $act чтобы 100 раз не проверять
     */

    $id = isset($_GET['id']) ? (int) $_GET['id'] : 0;
	$act = isset($_GET['act']) ? $_GET['act'] : false;
	$cur_page = isset($_GET['page']) ? (int) $_GET['page'] : 0;
	$sql = include H.'engine/classes/mysqli.class.php';

	
	/**
	* Open Graph
	*/
	
	$meta_og = array(
		'site_name' => 'SecWind',
		'url' => htmlspecialchars('http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']),
		'image' => 'http://' . $_SERVER['SERVER_NAME'] . '/style/sw.png', 
		'locale' => 'ru_RU',
		'title' => $set['title'],
		'description' => $set['meta_description']);
	

	session_name('Secwind');
	session_start();

	//if (is_callable('ini_set')) {
	@set_time_limit(6);
	@ini_set('date.timezone', 'Europe/Moscow');
	@ini_set('html_errors', 1);

    set_error_handler('error_catch');


	/**
     * @class Core эдакий контейнер функций
	 * @author Tadochi
	 */

	Class Core
	{
        static $user_id = 0;

        function __construct()
        { 
            self::$user_id = isset($_SESSION['user_id']) ? $_SESSION['user_id'] : 0; // self::$user_id = isset($_SESSION['user_id']);
        }


        /**
		 * Cache юзеров. 
		 * 1000 юзеров = 1000 файлов  =)
		 * @param integer $id id юзера, данные которого нужно получить
		 * @param boolen $update если указать true, данные обновятся
		 * @return array 
		 */

		static function get_user($id, $update = false)
		{
		    if (
			        $update || 
				    !file_exists(H.'engine/files/users/cache/'.$id.'.db') || 
				    filemtime(H.'engine/files/users/cache/'.$id.'.db') > ($_SERVER['REQUEST_TIME'] + 3600)
				)
			{
			    global $sql;
				$user = $sql->query('select * from `user` where `id` = "' . $id . '" limit 1 ')->fetch();
				
				if (!$user)
				    return
                        array('id' => 0, 'nick' => 'Гость', 'pol' => 1);
					
				file_put_contents(H.'engine/files/users/cache/'.$id.'.db', serialize($user));
				unset($sql, $user);
			}
			return
			    unserialize(file_get_contents(H.'engine/files/users/cache/'.$id.'.db'));
		}


		/**
		 * Перенаправление
		 * @param string $stop
		 */
		
		static function stop($page = '/')
		{
		    header('location: '.$page); 
            exit;
		}


        /**
         * Сохранение настроек
         */

        static function save_settings($set, $file = 'engine/files/data/settings.ini')
	    {
            include_once H.'engine/classes/ini.class.php';
            $ini = new ini(H . $file);
		    foreach($set as $key => $value)
            {
                $ini->write($key, '"'.$value.'"');
            }
            return $ini->updateFile();
	    }
		
		/**
		 * Вывод даты
		 * @param integer $time
		 */
		
		static function time($time)
		{
		    return date('d.m.Y / H:i', $time);
		}
		
		/**
		 * Рекурсивное подключение файлов
		 * @param mixed $file принимает массив или строку
         * @param $path (string) папка файла
		 */
		
		static function get($file, $path = 'classes')
		{
	        if (is_array($file))
			{
			    foreach($file as $file)
				{
				    self::get($file, $path);
				}
			}
			elseif (file_exists(H.'engine/'.$path.'/'.$file.'.php'))
		    {
		        include_once H.'engine/'.$path.'/'.$file.'.php';
		    }//else die('file engine/'.$path.'/'.$file.'.php not found');
		}
		

        /**
         * Вывод сообщений. Вместо msg() и err() из Dcms 
         * @param $msg (mixed) выводимое сообщение. Может быть массивом или строкой
         * @param $div (string) класс div'а. 
         */

        static function msg_show($msg, $div = 'error')
        {
            if (is_array($msg))
            {
                foreach($msg as $msg)
                {
                    echo '<div class="'.$div.'">'.$msg.'</div>';
                }
            }
            else
                echo '<div class="'.$div.'">'.$msg.'</div>';
        }

        
        /**
         * Вывод пользователя. Сюда и пихаем код медалек
         * @param $user (array) массив юзера
         * @param $data (array) $data['post'] текст который выводится снизу. $data['status'] текст который выводится рядом с ником. $data['is_time'] должна true, если $data['status'] - timestamp
         */

        static function user_show($user, $data = array())
        {
            return
                self::user_icon($user) .
                ' <a href="/pages/user.php?id='.$user['id'].'"> ' . 
                $user['nick'] . ' </a>'. 
				(!empty($user['date_last']) && $user['date_last'] > ($_SERVER['REQUEST_TIME'] - 300) ? ' (on) ' : ' (off) ')   .
                (isset($data['status']) ? '<span class="status">(' . (isset($data['is_time']) ? Core::time($data['status']) : $data['status']) . ')</span>' : null) . 
                '<br />'. (!empty($data['post']) ? $data['post'] : null);
        }

		
		// вывод иконки юзера

        static function user_icon($user)
        {
            return '<img src="/style/users/icons/'.$user['pol'].'.png" alt=""/>';
        }


		// вывод аватара юзера

        static function user_avatar($ava_id = 0, $return = 'image')
        {
            if (!$ava_id)
                $ava_id = Core::$user_id;
            $id = file_exists(H . 'style/users/avatar/'.$ava_id.'.jpg') ? $ava_id : 0;
            return $return == 'image' ? '<img src="/style/users/avatar/'.$id.'.jpg"/>' : '/style/users/avatar/'.$id.'.jpg';
        }


		// Получение данных о SW

		static function Secwind($key = false)
		{
			$inf = unserialize(file_get_contents(H . 'engine/files/data/secwind.db'));
			return $key ? $inf[$key] : var_export($inf);
		}

		
		// Получение фильтрированных данных из $_GET

		static function Request($key)
		{
			return 
				isset($_GET[$key]) ? 
					is_array($_GET[$key]) ? 
						$_GET[$key] : 
						my_esc($_GET[$key], true) :
					false;
		}

		static function form($key)
		{
			return 
				isset($_POST[$key]) ? 
					is_array($_POST[$key]) ? 
						$_POST[$key] : 
						my_esc($_POST[$key], true) :
					false;
		}
	}


	/**
	 * Дабы все не заменять)) осталось из Dcms 6.6.4
	 */
	
	function my_esc($str, $html = false)
	{
	    global $sql;
        if ($html)
            $str = htmlspecialchars($str);
		return mysqli_real_escape_string($sql->db, $str);
	}
	

    /**
     * Перехват ошибок
     * строка 27
     */

    function error_catch($errno, $errstr, $errfile, $errline, $desc, $type = 'php')
    {
		if ( 0 == error_reporting ())
		{
			return;
		}
		
        global $sql, $creator;

        if ($type == 'php')
            $desc = $errstr .  ' | Файл ' . $errfile . '  | Линия - ' . $errline;

		if ($creator && $type == 'php')
			echo $desc . '<br />';

        $sql->query("
            INSERT INTO `errors`
            (`user` , `time`, `user_agent`, `ip`, `desc`, `type`, `url`) VALUES 
            ('".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)."');");
    }



  /**
	* Авторизация
	*/
	
	if (isset($_SESSION['user_id']) && $sql->query('SELECT COUNT(*) FROM `user` WHERE `id` = '.$_SESSION['user_id'].' LIMIT 1')->result() == 1)
	{
	    $user = Core::get_user($_SESSION['user_id']);
		$user_id = $user['id'];
		if (mt_rand(0, 5) == 4)
		    $sql->query('UPDATE `user` SET `date_last` = '.$time.' WHERE `id` = '.$user['id'].' LIMIT 1');
	}
	else
	    $user_id = 0;

	if (!$user_id && 
		isset($_COOKIE['user_id'], $_COOKIE['pass']) && 
		$sql->query("SELECT COUNT(*) FROM `user` WHERE `id` = ".intval($_COOKIE['user_id'])." AND `pass` = '".my_esc($_COOKIE['pass'])."' LIMIT 1")->result() == 1)
	{
	    $user = Core::get_user($_COOKIE['user_id']);
		$user_id = $_SESSION['user_id'] = $user['id'];
		$sql->query('select `file` from `module_services` where `use_in` = "auth"');
		$_SESSION['user_authed'] = 'COOKIE';
	}


   /**
     * @var $user_id (boolen) вернет true если юзер авторизован
     * @var $moder (boolen) вернет true для модератора
     * @var $admin (boolen) вернет true для админа
     * @var $creator (boolen) вернет true для создателя
     * @var $author (boolen) вернет true если юзер - автор 
     */

    $user_id = isset($_SESSION['user_id']) ? $user['id'] : 0;
    $moder = $user_id && $user['group_access'] > 1;
    $admin = $user_id && $user['group_access'] > 2;
    $creator = $user_id && $user['group_access'] > 9;
    //$author = $user_id == $id;



  /**
	* @author Tadochi
	* @package AntiHack =)
	*
	* По дефолту - отключен
	* Рекурсивно фильтрует все.
	* Даже массивы в массивах :-D :зар:
	* Не тот быдлокод который гуляет по паблу. 
	* Пабличные только мешают . Своим присутствием
	* И вспомните dcms-fiera. "Опросы" ведь выпилены из за антихака =)
	*
	* Запрещено использовать где-либо, кроме SecWind. 
	*/

	function helper_awr(&$value, $key)
    {
        $key = my_esc($value, false);
    }

	function helper_hsc(&$value, $key)
    {
        $key = htmlspecialchars($value);
    }

    if ($set['filtr_get'])
    {
        array_walk_recursive($_GET, 'helper_awr');
    }

    if ($set['filtr_post'])
    {
        array_walk_recursive($_POST, 'helper_awr');
    }

    if ($set['antixss'])
    {

	   /*
		* Защита/предупреждение XSS-атак
		* Author: Yuri 'Bela' Belotitski
		*/

		if (isset($_SERVER['HTTP_REFERER']))
		{
			$ref = parse_url($_SERVER['HTTP_REFERER']);
			if (!substr_count($ref['host'], $_SERVER['HTTP_HOST']))
			{
				if ($_POST) die('<b>Achtung! XSS attack!</b>');
				if ($_GET)  die('<b>Achtung! XSS attack?></b><br />Подтвердите переход: <a href="' 
						. htmlspecialchars($_SERVER['REQUEST_URI']) . '">' 
						. htmlspecialchars($_SERVER['REQUEST_URI']) . '</a>');
			}
		}

		
		// а это уже мое

		array_walk_recursive($_GET, 'helper_hsc');
        array_walk_recursive($_POST, 'helper_hsc');
    }



    /*
	* SecWind?
	* Вообще не торгать. 
	*/

	if (isset($_GET['you_secwind?']))
	{
		exit(Core::Secwind('version'));
	}

	if ($user_id && $_SERVER['PHP_SELF'] != '/pages/ban.php' && $sql->query('SELECT COUNT(*) FROM `ban` WHERE `user_id` = '.$user_id.' AND `time` > '.$time)->result() == 1)
	{
		Core::stop('/pages/ban.php');
	}

	new Core;
	ob_start();