jenaDI/LiteTracker-Engine — Issue #1: Class.user.php
Author: jenaDI
Created: 2011-10-08 20:13:38+00:00
State: open

init();
$this->session();
}

/*
*	Определение пользователя в системе
*/
private function init() {
global $config, $memcache , $db;

/*
*	Исходные данные
*/
$uid = (int)$_COOKIE[COOKIE_ID]; //ID пользователя
$pass = $_COOKIE[COOKIE_PASSWORD]; //PASSWORD пользователя
if ( (empty($uid) || empty($pass) ) && (!$uid || strlen($pass) != 32) ) return;

//Информация о пользователе
$row = $this->get_info($uid);
if (!$row) return;

//Проверка пароля
$subnet = explode('.', getip());
$subnet[2] = $subnet[3] = 0;
$subnet = implode('.', $subnet); // 255.255.0.0
if ($pass !== md5($row["password"] . COOKIE_SALT . $subnet)) return;

/*
*	Обновления данных
*/
//Обновляем IP адрес , если он изменился
$ip = ip2long($_SERVER['REMOTE_ADDR']); //IP адрес
if ($ip != $row['ip']) {
$updateset[] = 'ip = "'. $ip . '"';
}

//Обновляем время, если оно изменилось
if (strtotime($row['last_access']) <= strtotime(get_date_time(gmtime() - (10*60)) ) ) {
$updateset[] = 'last_access = "' . $db->safesql(get_date_time()).'"';
}

//Если что-нибудь требует обновлению - обновляем :D
if (sizeof($updateset)) {
// $memcache->delete('user_'.$uid);
$sql = $db->query("UPDATE LOW_PRIORITY users SET ".implode(", ", $updateset)." WHERE id=" . $row["id"]);
// $db->free($sql);
}

/*
*	Присваивание (set('dsd'))
*/
$this->user_information = $row;
//Определяем IP-адрем пользователя
$row['ip'] = $ip;

}

/*
*	Сессия пользователя
*/
function session() {
global $config , $memcache ,$db;

$update = array();

//Определяем session_id
$session_id = session_id();
$update[] = 'session_id="'.$db->safesql($session_id).'"';

//Определяем id пользователя
if($USER) {
$user_id = $this->user_information['id'];
}
else {
$user_id = '-1';
}
$update[] = 'user_id="'.$db->safesql($user_id).'"';

//Определяем время последнее вермя посещения сайта
$last_access = get_date_time(time());
$update[] = 'last_access="'.$last_access.'"';

//Определяем ip
$ip = ip2long($_SERVER['REMOTE_ADDR']);
$update[] = 'ip="'.$ip.'"';

//Определяем user_agent
$user_agent = $_SERVER["HTTP_USER_AGENT"];
$update[] = 'user_agent="'.$db->safesql($user_agent).'"';

//Определяем php_self
$php_self = $_SERVER['PHP_SELF'];
$update[] = 'php_self="'.$db->safesql($php_self).'"';

$db->query("INSERT INTO sessions (session_id, user_id, last_access, ip , user_agent, php_self) VALUES ('{$session_id}', '{$user_id}', '{$last_access}', '{$ip}' , '{$user_agent}', '{$php_self}') ON DUPLICATE KEY UPDATE ".implode(", ", $update));

return;
}

/*
*	Информация о пользователе
*/
function get_info($id) {
global $db , $memcache;

//Если нету id
if(!$id) {
return false;
}

//Запрос к таблице users
if (false === ($row = $memcache->get('user_'.$id)))
{
$sql = $db->query("SELECT * FROM users WHERE id = ".$id);
$row = $db->get_row($sql);
$db->free($sql);
$memcache->set('user_'.$id, $row , 0, rand(1500 , 3000) );
}

return $row;
}

/*
*	Проверка авторизации
*/
public function is_login() {
if(!$this->user_information) {
header("Location: /login.php?referer=".$_SERVER['PHP_SELF']."");
die();
}
}

/*
*	Авторизация
*/
public function login() {
global $memcache , $config;

//Подсеть
$subnet = explode('.', getip());
$subnet[2] = $subnet[3] = 0;
$subnet = implode('.', $subnet); // 255.255.0.0

//Домен
if($config['cookies_mode']) {
// хак от wennet'a
$domain = $_SERVER['HTTP_HOST'];
if ( strtolower( substr($domain, 0, 4) ) == 'www.' )
$domain = substr($domain, 4);	// Fix the domain to accept domains with and without 'www.'.
if ( substr($domain, 0, 1) != '.' )
$domain = '.'.$domain;	// Add the dot prefix to ensure compatibility with subdomains
} else {
$domain = '';
}

//Очищаем старые cookies
$this->logout();

//Добавляем cookies
setcookie(COOKIE_ID, $id, $expires, "/" , $domain , false , true);
setcookie(COOKIE_PASSWORD, md5($password_hash.COOKIE_SALT.$subnet) , $expires, "/" , $domain , false, true);

//Обновляем профиль
$this->update($id);
}

/*
* Выход
*/
public function logout() {
global $memcache , $USER , $config;

//Проверяем информацию о пользователе
if(!$this->user_information) return;

//хак от wennet'a
if($config['cookies_mode']) {
$domain = $_SERVER['HTTP_HOST'];
if ( strtolower( substr($domain, 0, 4) ) == 'www.' )
$domain = substr($domain, 4);	// Fix the domain to accept domains with and without 'www.'.
if ( substr($domain, 0, 1) != '.' )
$domain = '.'.$domain;	// Add the dot prefix to ensure compatibility with subdomains
} else {
$domain = '';
}

//Очищаем cookies
setcookie(COOKIE_ID, "", 0x7fffffff, "/" , $domain , false , true);
setcookie(COOKIE_PASSWORD, "", 0x7fffffff, "/" , $domain , false , true);

//Обновляем профиль
$this->update($this->user_information['id']);
}

/*
*	Обновление информации
*/
public function update($id) {
global $memcache;
$memcache->delete('user_'.$id , 0);
}

/*
*	ArrayAccess методы
*/
public function offsetSet($offset, $value) {
$this->user_information[$offset] = $value;
}
public function offsetExists($offset) {
return isset($this->user_information[$offset]);
}
public function offsetUnset($offset) {
unset($this->user_information[$offset]);
}
public function offsetGet($offset) {
return isset($this->user_information[$offset]) ? $this->user_information[$offset] : null;
}
}
?>