<?php
/*
* @package LabCMS
* @copyright (c) 2006 Alexander Levin aka Loki (loki_angel@mail.ru)
* @support http://labcms.ru
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/

class login_main extends ModuleTools
{
	public function main()
	{
		Factory::create('login.profile')->login();
		if (!User::i()->isGuest()) return $this->profile();
		self::_setTpl('login');
		addBreadcrumb(_m('Авторизация'));
	}
	
	/**
	* Просмотр профиля пользователя
	**/
	public function profile()
	{
		//если пытаются просматривать гостя
		if (isset($_GET['var1']) && intval($_GET['var1'])<0) return self::_error(_m('Пользователь не найден'));
		//если пытаются просмотреть чужой профиль без прав на это
		if (isset($_GET['var1']) && $_GET['var1'] && $_GET['var1']!=User::i()->id && !access('view_user')) {
			return self::_error(_m('Вы не можете просматривать чужие профили'));
		}
		//или просматриваем свой под гостем
		if (!isset($_GET['var1']) && User::i()->isGuest()) return LabCMS::i()->error403();
		
		$user_id=(isset($_GET['var1']) && $_GET['var1'])?$_GET['var1']:User::i()->id;
		$user = User::getUser($user_id);
		if ($user->isGuest()) return self::_error(_m('Пользователь не найден'));

		//TODO отрефакторить этот фрагмент
		$stat=$this->_getUserStat($user);

		config::set('core.title', "Профиль :: " . $user->login);
		addBreadcrumb($user->login, _url());

		self::_assign("user", $user);
		self::_assign("userStat", $stat);
		self::_setTpl('view');
	}
	
	/**
	* Редактирование данных пользователя
	**/
	public function edit()
	{
		if (User::i()->isGuest()) return LabCMS::i()->error403();
		
		$this->_checkAutologged('edit');
		Factory::create('login.profile')->editInfo();
		
		self::_setTpl('form');
		addBreadcrumb(User::i()->login, _url(false, 'profile'));
		addBreadcrumb(_m('Изменение данных'));

	}
	
	/**
	* Выход из системы
	**/
	public function logout()
	{
		if (User::i()->isGuest()) return $this->main();
		
		User::checkToken();
		User::i()->logout();
		refresh('', $_REQUEST['redirect']);
	}
	
	/**
	* Запрос забытого пароля
	**/
	public function lost()
	{
		if (!config::get('allow_ask_new_pass')
			|| User::i()->isNotGuest()) return $this->main();
		
		Factory::create('login.profile')->lostPassword();
		self::_setTpl('form');
		addBreadcrumb(_m('Напомнить пароль'));
	}
	
	/**
	* Изменение пароля
	**/
	public function change_pass()
	{
		if (User::i()->isGuest()) return LabCMS::i()->error403();
		
		$this->_checkAutologged('change_pass');

		Factory::create('login.profile')->changePass();
		self::_setTpl('form');
		addBreadcrumb(User::i()->login, _url(false, 'profile'));
		addBreadcrumb(_m('Изменение пароля'));
	}
	
	/**
	* Управление openid пользователя
	**/
	public function openid()
	{
		if (User::i()->isGuest()) return LabCMS::i()->error403();
		if (!config::get('use_openid')) return self::_error(_m('Использование OpenId отключено'));
		
		Factory::create('login.profile')->openId();
		self::_setTpl('form');
		addBreadcrumb(User::i()->login, _url(false, 'profile'));
		addBreadcrumb(_m('Управление OpenId'));
	}
	
	/**
	* Добавить openId текущему пользователю
	**/
	public function add_openid()
	{
		if (User::i()->isGuest()) return LabCMS::i()->error403();
		if (!config::get('use_openid')) return self::_error(_m('Использование OpenId отключено'));
		
		if (Factory::create('login.profile')->addOpenId()) refresh('', _url(false, 'openid'));
	}
	
	/**
	* Вход по ссылке восстановления пароля
	**/
	public function retrive()
	{
		if (!config::get('allow_ask_new_pass') || User::i()->isNotGuest()) return $this->main();
		
		Factory::create('login.profile')->retrivePassword();
	}
	
	/**
	* Авторизация через openId
	**/
	public function openid_auth()
	{
		if (!config::get('use_openid')) return self::_error(_m('Использование OpenId отключено'));
		
		Factory::create('login.profile')->authByOpenID();
	}
	
	/**
	* Регистрация
	**/
	public function register()
	{
		if (!config::get('allow_register')) return self::_error(_m('Регистрация запрещена'));
		if (User::i()->isNotGuest()) return $this->main();
		
		Factory::create('login.profile')->register();
		addBreadcrumb(_m('Регистрация'));
		self::_setTpl('form');
	}
	
	/**
	* Последний шаг регистрации через openId
	**/
	public function reg_openid()
	{
		if (!config::get('allow_register')) return self::_error(_m('Регистрация запрещена'));
		if (User::i()->isNotGuest()) return $this->main();
		if (!config::get('use_openid')) return self::_error(_m('Использование OpenId отключено'));
		
		Factory::create('login.profile')->registerByOpenId();
		self::_setTpl('form');
	}
	
	/**
	* Переход по ссылке активации
	**/
	public function activation()
	{
		if (!config::get('activation') || User::i()->isNotGuest()) return $this->main();
		
		Factory::create('login.profile')->activation();
	}
	
	/**
	* Повторно запросить код авторизации
	**/
	public function get_code()
	{
		if (!config::get('activation') || User::i()->isNotGuest()) return $this->main();
		
		Factory::create('login.profile')->reGetCode();
		self::_setTpl('form');
	}
	
	/**
	* Удаление аккаунта
	**/
	public function delete_account()
	{
		if (!config::get('allow_delete_account') || User::i()->isGuest()) return $this->main();

		addBreadcrumb(User::i()->login, _url(false, 'delete_account'));
		addBreadcrumb(_m('Удаление аккаунта'));
		
		if ($_SERVER['REQUEST_METHOD']=='POST'
			&& isset($_POST['delete'])
			&& User::checkToken($_POST['token'])
		) {
			if (Factory::create('login.profile')->deleteAccount(User::i()->id)) {
				User::i()->logout();
				self::_setTpl('');
				LabCMS::i()->setMessage('Аккаунт удален');
				return;
			}
		}
		elseif (isset($_POST['dont'])) refresh('', _url(false, 'profile'));
			
		self::_setTpl('delete_confirm');
	}
	
	public function evercookie()
	{
		Debug_HackerConsole_Main::disable();
		if (isset($_POST['real_id'])) {
			if (User::i()->real_id!=$_POST['real_id']
				&& (User::i()->real_id===0
				|| User::i()->real_id===null)) {
					User::i()->update(array('real_id'=>intval($_POST['real_id'])));
			}
			exit;
		}
	}
	public function evercookie_png()
	{
		require_once dirname(__FILE__).'/class.evercookie.php';
		evercookie::png();
	}
	
	public function evercookie_etag()
	{
		require_once dirname(__FILE__).'/class.evercookie.php';
		evercookie::etag();
	}
	
	public function evercookie_cache()
	{
		require_once dirname(__FILE__).'/class.evercookie.php';
		evercookie::cache();
	}
	
	
	/**
	* Проверяет вошел ли пользователь через автологин и не прошло ли 10 минут с момента входа.
	* Если нет - перебрасывает на форму входа.
	**/
	protected function _checkAutologged($action)
	{
		//если пользователь авторизовался более 10 минут назад или вошел через автологин - требуем повторную авторизацию
		if ($_SESSION['last_login_time'][User::i()->id]<(time()-60*10)) {
			User::i()->logout();
			refresh('', _url(false, false, false, false, _url(false, $action)));
		}
	}
	
	protected function _getUserStat($user)
	{
		if (!is_array(config::get('user_stat_modules'))
			|| !count(config::get('user_stat_modules'))) return false;
			
		if (!isset($this->userStatModules)) {
			$this->userStatModules=Db::i()->select(
				"SELECT module, name, module_id
				FROM ?_modules
				WHERE module IN (?a) AND disable=0",
				config::get('user_stat_modules')
			);
		}
		
		if (!$this->userStatModules) return false;
		
		$stat=array();

		foreach ($this->userStatModules as $module) {
			$classname=$module['module'].'_api';
			Factory::set($classname, $classname, LAB_PATH_MODULES.'/'.$module['module']."/class.api.php");
			$obj=Factory::create($classname);

			if ($result=$obj->getUserStat($user)) {
				$stat=array_merge($stat, $result);
			}
		}
		return $stat;
	}
}