Файл: core/classes/user.class.php
Строк: 1480
<?php
/******************************************************************************/
// //
// InstantCMS v1.10 //
// http://www.instantcms.ru/ //
// //
// written by InstantCMS Team, 2007-2012 //
// produced by InstantSoft, (www.instantsoft.ru) //
// //
// LICENSED BY GNU/GPL v2 //
// //
/******************************************************************************/
class cmsUser {
const PROFILE_LINK_PREFIX = 'users/';
const MAXIMUM_TOKENS_COUNT = 30;
private static $csrf_token = '';
private $friends = array();
private $new_msg = array();
private static $instance;
private static $guest_group_info = array();
private static $cache = array();
private $is_banned = array();
private $loads_users = array();
public $id = 0;
public $is_admin = 0;
public $online_users;
public $online_users_ids;
private function __construct() {
$this->loadOnlineUsers();
}
private function __clone() {}
// ============================================================================ //
// ============================================================================ //
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self;
}
return self::$instance;
}
// ============================================================================ //
// ============================================================================ //
/**
* Обновляет данные пользователя, если он не забанен
* заполняя ими свойства объекта
* @return bool
*/
public function update() {
// привязка ip адреса к сессии
if(!$this->checkSpoofingSession()){
$this->logout();
cmsCore::redirectBack();
}
$user_id = (int)(isset($_SESSION['user']['id']) ? $_SESSION['user']['id'] : 0);
// Свойства для гостя
if (!$user_id){
self::setUserLogdate();
$guest_info = self::getGuestInfo();
foreach($guest_info as $key=>$value){
$this->{$key} = $value;
}
return true;
}
// свойства для авторизованного пользователя
$info = $this->loadUser($user_id);
if (!$info){ return false; }
foreach($info as $key=>$value){
$this->{$key} = $value;
}
$this->logdate = self::getUserLogdate();
// проверяем бан
$this->checkBan();
return true;
}
// ============================================================================ //
// ============================================================================ //
private function checkSpoofingSession() {
// первый раз зашли
if(!isset($_SESSION['user_net'])) {
$octets = explode('.', $_SERVER['REMOTE_ADDR']);
$_SESSION['user_net'] = rtrim($_SERVER['REMOTE_ADDR'], end($octets));
return true;
}
return mb_strstr($_SERVER['REMOTE_ADDR'], $_SESSION['user_net']);
}
// ============================================================================ //
// ============================================================================ //
/**
* Загружает данные пользователя из базы
* @param int $user_id
* @return array
*/
public function loadUser($user_id, $where='') {
if($user_id){
if(isset($this->loads_users[$user_id])) { return $this->loads_users[$user_id]; }
}
$where = $user_id ? "u.id = '$user_id'" : $where;
if(!$where) { return false; }
$inDB = cmsDatabase::getInstance();
$sql = "SELECT u.*, g.is_admin, g.alias, g.access, p.imageurl as imageurl, p.imageurl as orig_imageurl, p.karma
FROM cms_users u
INNER JOIN cms_user_groups g ON g.id = u.group_id
INNER JOIN cms_user_profiles p ON p.user_id = u.id
WHERE {$where} AND u.is_deleted = 0 AND u.is_locked = 0 LIMIT 1";
$result = $inDB->query($sql);
if($inDB->num_rows($result) !== 1) { return false; }
$info = $inDB->fetch_assoc($result);
$info['ip'] = cmsCore::strClear($_SERVER['REMOTE_ADDR']);
$info['imageurl'] = self::getUserAvatarUrl($info['id'], 'small', $info['imageurl'], $info['is_deleted']);
$info['access'] = explode(',', str_replace(', ', ',', $info['access']));
return $this->loads_users[$info['id']] = cmsCore::callEvent('LOAD_USER', $info);
}
// ============================================================================ //
// ============================================================================ //
/**
* Проверяет, находится ли текущий посетитель в бан-листе
* Если да, то показывает сообщение и завершает работу
*/
public function checkBan(){
$inDB = cmsDatabase::getInstance();
// Проверяем бан по ip
$ban = $inDB->get_fields('cms_banlist', "ip = '{$this->ip}' AND status=1", 'int_num, int_period, autodelete, id, status, bandate, user_id');
if(!$ban) {return; }
$interval = $ban['int_num'] . ' ' .$ban['int_period'];
// проверяем истек ли срок бана
if ($inDB->rows_count('cms_banlist', "id = '{$ban['id']}' AND bandate <= DATE_SUB(NOW(), INTERVAL $interval) AND int_num > 0")){
// если истек и флаг автоудаления есть, удаляем
if ($ban['autodelete']){
$inDB->query("DELETE FROM cms_banlist WHERE id={$ban['id']}");
} else {
$inDB->query("UPDATE cms_banlist SET status=0 WHERE id='{$ban['id']}'");
}
// запоминаем, что пользователь не забанен
if($ban['user_id']){
$this->is_banned[$ban['user_id']] = 0;
}
} else {
global $_LANG;
$ban['bandate'] = cmsCore::dateformat($ban['bandate']);
$ban['enddate'] = cmsCore::spellCount($ban['int_num'], $_LANG[$ban['int_period'].'1'], $_LANG[$ban['int_period'].'2'], $_LANG[$ban['int_period'].'10']);
cmsPage::includeTemplateFile('special/bantext.php', array('ban' => $ban));
cmsCore::halt();
}
}
// ============================================================================ //
// ============================================================================ //
/**
* Проверяет, находится ли указанный пользователь в бан-листе
* @param int $user_id
* @return bool
*/
public function isBanned($user_id){
if(isset($this->is_banned[$user_id])) { return (bool)$this->is_banned[$user_id]; }
return (bool)($this->is_banned[$user_id] = cmsDatabase::getInstance()->rows_count('cms_banlist', "user_id = '$user_id' AND status=1 LIMIT 1"));
}
// ============================================================================ //
// ============================================================================ //
/**
* Проверяет наличие кукиса "запомнить меня" и если он найден - авторизует пользователя
* @return bool
*/
public function autoLogin(){
$user_id = isset($_SESSION['user']['id']) ? $_SESSION['user']['id'] : 0;
if (cmsCore::getCookie('userid') && !$user_id){
$cookie_code = cmsCore::getCookie('userid');
if (!preg_match('/^([0-9a-zA-Z]{32})$/ui', $cookie_code)){ return false; }
$user = $this->loadUser(0, "md5(CONCAT(u.id, u.password)) = '$cookie_code'");
if($user){
$_SESSION['user'] = $user;
cmsCore::callEvent('USER_LOGIN', $_SESSION['user']);
self::setUserLogdate($user['id']);
} else {
cmsCore::unsetCookie('user_id');
}
}
return true;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает url аватара пользователя
* @param int $user_id
* @param str $size
* @param str $file_name
* @param int $usr_is_deleted
* @return str
*/
public static function getUserAvatarUrl($user_id, $size='small', $file_name='', $usr_is_deleted=0) {
// службы обновлений и рассылки
if ($user_id == -1) { return '/images/messages/update.jpg'; }
if ($user_id == -2) { return '/images/messages/massmail.jpg'; }
// пользователь без аватара
if (!$file_name || !file_exists(PATH.'/images/users/avatars/'.$file_name)){
if ($size == 'small'){
return '/images/users/avatars/small/nopic.jpg';
} else {
return '/images/users/avatars/nopic.jpg';
}
}
if($usr_is_deleted){
if ($size == 'small'){
return '/images/users/avatars/small/noprofile.jpg';
} else {
return '/images/users/avatars/noprofile.jpg';
}
} else {
if ($size == 'small'){
return '/images/users/avatars/small/'.$file_name;
} else {
return '/images/users/avatars/'.$file_name;
}
}
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает некешированный рейтинг пользователя
* @param int $user_id ID пользователя
* @return int
*/
public static function getRating($user_id) {
$inDB = cmsDatabase::getInstance();
$rating = 0;
$targets = $inDB->get_table('cms_rating_targets', 'is_user_affect = 1 ORDER BY user_weight', 'target, user_weight, target_table');
if(!$targets) { return $rating; }
$start_sql = "SELECT SUM( r.total_rating ) AS rating FROM cms_ratings_total r n";
foreach($targets as $target){
$sql = "INNER JOIN {$target['target_table']} {$target['target']} ON
r.item_id = {$target['target']}.id AND
r.target = '{$target['target']}' AND
{$target['target']}.user_id = '{$user_id}' n";
$result = $inDB->query($start_sql . $sql);
$data = $inDB->fetch_assoc($result);
$rating += (int)@$data['rating'] * (int)$target['user_weight'];
}
return $rating;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает некешированное значение кармы пользователя
* @param int $user_id
* @return int
*/
public static function getKarma($user_id){
$inDB = cmsDatabase::getInstance();
$sql = "SELECT SUM(points) as karma FROM cms_user_karma WHERE user_id = '$user_id' GROUP BY user_id";
$result = $inDB->query($sql);
if (!$inDB->num_rows($result)){ return 0; }
$data = $inDB->fetch_assoc($result);
return (int)$data['karma'];
}
/**
* Изменяет карму пользователя
* @param int $to_user_id Кому изменяем карму
* @param int $points На сколько
* @param int $from_user_id Кто изменяет карму
* @return int
*/
public static function changeKarmaUser($to_user_id, $points, $from_user_id=0){
$inDB = cmsDatabase::getInstance();
$from_user_id = $from_user_id ? $from_user_id : self::getInstance()->id;
$inDB->query("INSERT INTO cms_user_karma (user_id, sender_id, points, senddate) VALUES ('$to_user_id', '$from_user_id', '$points', NOW())");
$user_karma = self::getKarma($to_user_id);
$inDB->query("UPDATE cms_user_profiles SET karma = '$user_karma' WHERE user_id = '$to_user_id'");
self::checkAwards($to_user_id);
return $user_karma;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает ссылки на профили именниников
* @return html
*/
public static function getBirthdayUsers() {
$inDB = cmsDatabase::getInstance();
$today = date("d-m");
$sql = "SELECT u.id as id, u.nickname as nickname, u.login as login, u.birthdate, p.gender as gender
FROM cms_users u
LEFT JOIN cms_user_profiles p ON p.user_id = u.id
WHERE u.is_locked = 0 AND u.is_deleted = 0 AND p.showbirth = 1 AND DATE_FORMAT(u.birthdate, '%d-%m')='$today'";
$rs = $inDB->query($sql);
$total = $inDB->num_rows($rs);
$now=0; $html = '';
if (!$total){ return false; }
while($usr = $inDB->fetch_assoc($rs)){
$html .= self::getGenderLink($usr['id'], $usr['nickname'], $usr['gender'], $usr['login']);
if ($now < $total-1) { $html .= ', '; }
$now ++;
}
return $html;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает элементы <option> для списка пользователей
* @param int $selected
* @param array $exclude
* @return html
*/
public static function getUsersList($selected=0, $exclude=array()){
$inDB = cmsDatabase::getInstance();
$html = '';
$sql = "SELECT id, nickname FROM cms_users WHERE is_locked = 0 AND is_deleted = 0 ORDER BY nickname";
$rs = $inDB->query($sql);
if (!$inDB->num_rows($rs)){ return; }
while($u = $inDB->fetch_assoc($rs)){
if(!in_array($u['id'], $exclude)){
if ($selected){
if ($u['id'] == $selected){
$html .= '<option value="'.$u['id'].'" selected="selected">'.$u['nickname'].'</option>';
} else {
$html .= '<option value="'.$u['id'].'">'.$u['nickname'].'</option>';
}
} else {
$html .= '<option value="'.$u['id'].'">'.$u['nickname'].'</option>';
}
}
}
return $html;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает элементы <option> для списка пользователей
* @param int $selected
* @param array $exclude
* @return html
*/
public static function getAuthorsList($authors, $selected=''){
if (!$authors) { return; }
$inDB = cmsDatabase::getInstance();
$html = '';
$sql = "SELECT id, nickname FROM cms_users WHERE ";
$a_list = rtrim(implode(',', $authors), ',');
if ($a_list){
$sql .= "id IN ({$a_list})";
} else {
$sql .= '1=0';
}
$rs = $inDB->query($sql);
if ($inDB->num_rows($rs)){
while($u = $inDB->fetch_assoc($rs)){
if ($selected){
if (in_array($u['id'], $selected)){
$html .= '<option value="'.$u['id'].'" selected="selected">'.$u['nickname'].'</option>';
} else {
$html .= '<option value="'.$u['id'].'">'.$u['nickname'].'</option>';
}
} else {
$html .= '<option value="'.$u['id'].'">'.$u['nickname'].'</option>';
}
}
}
return $html;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает массив картинок наград
* @param str $dir
* @return array
*/
public static function getAwardsImages($dir = '/images/users/awards'){
$images = array();
if ($handle = opendir(PATH.$dir)) {
while (false !== ($file = readdir($handle))) {
if ($file != '.' && $file != '..' && mb_strstr($file, '.gif')){
$tag = str_replace('.gif', '', $file);
$images[] = htmlspecialchars($tag.'.gif');
}
}
closedir($handle);
}
return $images;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает элементы <option> для списка друзей пользователя
* @param int $user_id
* @param int $selected
* @return html
*/
public static function getFriendsList($user_id, $selected=0){
$inDB = cmsDatabase::getInstance();
$html = '';
$sql = "SELECT
CASE
WHEN f.from_id = $user_id
THEN f.to_id
WHEN f.to_id = $user_id
THEN f.from_id
END AS id, u.nickname as nickname
FROM cms_user_friends f
LEFT JOIN cms_users u ON u.id = CASE WHEN f.from_id = $user_id THEN f.to_id WHEN f.to_id = $user_id THEN f.from_id END
WHERE (from_id = $user_id OR to_id = $user_id) AND is_accepted =1";
$result = $inDB->query($sql);
if ($inDB->num_rows($result)){
while($friend = $inDB->fetch_assoc($result)){
if (@$selected==$friend['id']){
$s = 'selected';
} else {
$s = '';
}
$html .= '<option value="'.$friend['id'].'" '.$s.'>'.$friend['nickname'].'</option>';
}
} else {
$html = '<option value="0" selected>-- Нет друзей --</option>';
}
return $html;
}
/* ========================================================================== */
/* ========================================================================== */
/**
* Проверяет дружбу текущего пользователя с $user_id
* @return bool
*/
public static function isFriend($user_id=0){
if (!$user_id) { return false; }
$my_id = self::getInstance()->id;
if (!$my_id) { return false; }
$my_friends = cmsUser::getFriends($my_id);
if(!$my_friends) { return false; }
$is_friend = false;
foreach($my_friends as $friend){
if($friend['id'] == $user_id){
$is_friend = true;
break;
}else{
$is_friend = false;
}
}
return $is_friend;
}
/* ========================================================================== */
/* ========================================================================== */
/**
* Создает запрос на добавление текущего пользователя в друзья к $user_id
* @param int $user_id
* @return bool
*/
public static function addFriend($user_id=0){
if (!$user_id) { return false; }
cmsCore::callEvent('ADD_FRIEND', $user_id);
$my_id = self::getInstance()->id;
if (!$my_id) { return false; }
return cmsDatabase::getInstance()->insert('cms_user_friends', array('to_id'=>$user_id,
'from_id'=>$my_id,
'logdate'=>date('Y-m-d H:i:s'),
'is_accepted'=>0));
}
/* ========================================================================== */
/* ========================================================================== */
/**
* Удаляет пользователя $user_id из списка друзей текущего пользователя
* @param int $user_id
* @return bool
*/
public static function deleteFriend($user_id=0){
if (!$user_id) { return false; }
$friend_field_id = self::getFriendFieldId($user_id);
if($friend_field_id){
cmsCore::callEvent('DELETE_FRIEND', $user_id);
cmsDatabase::getInstance()->query("DELETE FROM cms_user_friends WHERE id = '{$friend_field_id}'");
cmsActions::removeObjectLog('add_friend', $friend_field_id);
cmsUser::clearSessionFriends();
return true;
}
return false;
}
/* ========================================================================== */
/* ========================================================================== */
/**
* Возвращает ID записи, где указана ваша дружба с $user_id
* @param int $user_id
* @param mixed $acepted Возможные значения: false, 0, 1
* @return bool
*/
public static function getFriendFieldId($user_id=0, $accepted=false, $to_from=false){
if (!$user_id) { return false; }
$my_id = self::getInstance()->id;
if (!$my_id) { return false; }
if($to_from === false){
$where = "to_id IN ($user_id, $my_id) AND from_id IN ($my_id, $user_id)";
} else {
// Если ко мне в друзья просились
if($to_from == 'to_me'){
$where = "to_id = '{$my_id}' AND from_id = '{$user_id}'";
} else { // я просился в друзья
$where = "to_id = '{$user_id}' AND from_id = '{$my_id}'";
}
}
if($accepted !== false){
$where .= $accepted ? 'AND is_accepted = 1' : 'AND is_accepted = 0';
}
return cmsDatabase::getInstance()->get_field('cms_user_friends', $where, 'id');
}
/* ========================================================================== */
/* ========================================================================== */
/**
* Возвращает количество друзей пользователя
* @param int $user_id
* @return int
*/
public static function getFriendsCount($user_id=0){
if (!$user_id) { return 0; }
return cmsDatabase::getInstance()->rows_count('cms_user_friends', "(from_id = '$user_id' OR to_id = '$user_id') AND is_accepted =1");
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает список друзей пользователя
* и помещает в текущую сессию
* @param int $user_id
* @return array
*/
public static function getFriends($user_id=0){
if(!$user_id) { return array(); }
// уже полученных друзей отдаем сразу
if(isset(self::getInstance()->friends[$user_id])){
return self::getInstance()->friends[$user_id];
}
$is_me = (@$_SESSION['user']['id'] == $user_id);
//Если список уже в сессии, возвращаем
if ($is_me && self::sessionGet('friends') !== false) { return self::sessionGet('friends'); }
//иначе получаем список из базы, кладем в сессию и возвращаем
$inDB = cmsDatabase::getInstance();
$friends = array();
$sql = "SELECT
CASE
WHEN f.from_id = $user_id
THEN f.to_id
WHEN f.to_id = $user_id
THEN f.from_id
END AS id, u.nickname as nickname, u.login as login, u.is_deleted, u.status, u.logdate, p.imageurl
FROM cms_user_friends f
LEFT JOIN cms_users u ON u.id = CASE WHEN f.from_id = $user_id THEN f.to_id WHEN f.to_id = $user_id THEN f.from_id END
INNER JOIN cms_user_profiles p ON p.user_id = u.id
WHERE (from_id = $user_id OR to_id = $user_id) AND is_accepted =1 ORDER BY u.logdate DESC";
$result = $inDB->query($sql);
if ($inDB->num_rows($result)){
while($friend = $inDB->fetch_assoc($result)){
$friend['avatar'] = self::getUserAvatarUrl($friend['id'], 'small', $friend['imageurl'], $friend['is_deleted']);
$friend['is_online'] = self::isOnline($friend['id']);
$friend['flogdate'] = self::getOnlineStatus($friend['id'], $friend['logdate']);
$friends[$friend['id']] = $friend;
}
}
// своих друзей кладем в сессию
if ($is_me) { self::sessionPut('friends', $friends); }
// Запоминаем список друзей пользователя
self::getInstance()->friends[$user_id] = $friends;
return $friends;
}
// ============================================================================ //
// ============================================================================ //
/*
* Очищает список друзей в сессии
*/
public static function clearSessionFriends(){
self::sessionDel('friends');
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает html стены пользователя
* @param int $selected
* @param array $exclude
* @return html
*/
public static function getUserWall($target_id, $component='users', $my_profile=0, $is_admin=0){
$inDB = cmsDatabase::getInstance();
$inCore = cmsCore::getInstance();
$inUser = self::getInstance();
cmsCore::loadLanguage('components/users');
if(!$my_profile && !$is_admin) { $my_profile = $inUser->is_admin; }
$records = array();
//получаем общее число записей на стене этого пользователя
$total = $inDB->rows_count('cms_user_wall', "user_id = '$target_id' AND usertype = '$component'");
if ($total){
$sql = "SELECT w.*, g.gender, g.imageurl, u.nickname as author, u.login as author_login, u.is_deleted, w.pubdate
FROM cms_user_wall w
INNER JOIN cms_users u ON u.id = w.author_id
INNER JOIN cms_user_profiles g ON g.user_id = u.id
WHERE w.user_id = '$target_id' AND w.usertype = '$component'
ORDER BY w.pubdate DESCn";
if ($inDB->limit){
$sql .= "LIMIT {$inDB->limit}";
}
$result = $inDB->query($sql);
$inDB->resetConditions();
while($record = $inDB->fetch_assoc($result)){
$record['is_today'] = time() - strtotime($record['pubdate']) < 86400;
$record['fpubdate'] = $record['is_today'] ? cmsCore::dateDiffNow($record['pubdate']) : cmsCore::dateFormat($record['pubdate']);
$record['avatar'] = cmsUser::getUserAvatarUrl($record['author_id'], 'small', $record['imageurl'], $record['is_deleted']);
$records[] = $record;
}
$records = cmsCore::callEvent('GET_WALL_POSTS', $records);
}
ob_start();
$smarty = $inCore->initSmarty('components', 'com_users_wall.tpl');
$smarty->assign('records', $records);
$smarty->assign('user_id', $inUser->id);
$smarty->assign('target_id', $target_id);
$smarty->assign('my_profile', $my_profile);
$smarty->assign('is_admin', $is_admin);
$smarty->assign('component', $component);
$smarty->assign('total', $total);
$smarty->assign('pagebar', cmsPage::getPagebar($total, $inDB->page, $inDB->perpage, 'javascript:wallPage(%page%)'));
$smarty->display('com_users_wall.tpl');
return ob_get_clean();
}
// ============================================================================ //
// ============================================================================ //
/**
* Проверяет доступ авторизованного пользователя к чему-либо
* @param str $allow_who
* @return bool
*/
public static function checkUserContentAccess($allow_who, $user_id){
$access = false;
$inUser = self::getInstance();
// автору показываем всегда
if ($inUser->id == $user_id) { return true; }
// администраторам показываем всегда
if ($inUser->is_admin) { return true; }
switch ($allow_who){
case 'all': $access = true; break;
case 'registered': $access = $inUser->id ? true : false; break;
case 'nobody': $access = $inUser->id == $user_id ? true : false; break;
case 'friends': $access = $inUser->isFriend($user_id); break;
default: $access = false;
}
return $access;
}
// ============================================================================ //
// ============================================================================ //
/**
* Проверяет, голосовал ли пользователь за указанную цель
* @return int
*/
public static function isRateUser($target='', $user_id=0, $item_id=0){
// если на входе одноги из параметров нет, считаем, что пользователь голосовал
if(!$target || !$user_id || !$item_id) { return true; }
// если для этого запроса есть кеш, возвращаем значение из кеша
if(isset(self::$cache[$target][$item_id][$user_id])){ return self::$cache[$target][$item_id][$user_id]; }
$is_rate = cmsDatabase::getInstance()->rows_count('cms_ratings', "item_id = '$item_id' AND target = '$target' AND user_id = '$user_id'");
// возвращаем и кешируем значение
return self::$cache[$target][$item_id][$user_id] = $is_rate;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает массив информации для пользователя "Гость"
* @return array
*/
public static function getGuestInfo($field = ''){
if (!self::$guest_group_info){
$data = cmsDatabase::getInstance()->get_fields('cms_user_groups', "alias = 'guest'", 'id, access');
if ($data){
$data['group_id'] = $data['id'];
$data['access'] = explode(',', str_replace(', ', ',', $data['access']));
$data['id'] = 0;
$data['ip'] = cmsCore::strClear($_SERVER['REMOTE_ADDR']);
$data['is_admin'] = 0;
$data['karma'] = -1000000;
$data['logdate'] = self::getUserLogdate();
self::$guest_group_info = cmsCore::callEvent('GET_GUEST', $data);
} else {
self::$guest_group_info = array();
}
}
// если запрашивали конкретное что то, возвращаем если есть
// иначе возвращаем массив
if($field){
return isset(self::$guest_group_info[$field]) ? self::$guest_group_info[$field] : false;
} else {
return self::$guest_group_info;
}
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает дату последнего посещения пользователя
* @return str
*/
public static function getUserLogdate(){
// получаем значение из сессии
$ses_logdate = self::sessionGet('logdate');
// если есть, возвращаем
if($ses_logdate) { return date('Y-m-d H:i:s', $ses_logdate); }
// Получаем время визита из куков
$cookie_logdate = cmsCore::getCookie('logdate');
// если есть, возвращаем
if($cookie_logdate) { return date('Y-m-d H:i:s', $cookie_logdate); }
// Иначе возвращаем текущую дату
return date('Y-m-d H:i:s');
}
/**
* Устанавливает дату последнего посещения пользователя
* @return str
*/
public static function setUserLogdate($user_id = 0){
$ses_logdate = self::sessionGet('logdate');
// Если нет в сессии, кладем в сессию предыдущее значение
// из куков, если там тоже нет, то текущее
if(!$ses_logdate){
$cookie_logdate = cmsCore::getCookie('logdate');
self::sessionPut('logdate', ($cookie_logdate ? $cookie_logdate : time()));
cmsCore::setCookie('logdate', time(), time()+60*60*24*30);
}
if($user_id){
cmsDatabase::getInstance()->query("UPDATE cms_users SET logdate = CURRENT_TIMESTAMP WHERE id = '$user_id'");
}
return true;
}
// ============================================================================ //
// ============================================================================ //
private function loadOnlineUsers() {
if(!isset($this->online_users)){
$this->online_users = cmsDatabase::getInstance()->get_table('cms_online');
}
}
/**
* Возвращает массив с количеством гостей и пользователей онлайн
* @return array
*/
public static function getOnlineCount(){
$ou = self::getInstance()->online_users;
$guests = 0;
$online = array();
foreach ($ou as $o) {
if ($o['user_id'] == 0 || $o['user_id'] == ''){
$guests++;
} else {
$online[$o['user_id']][] = $o;
}
}
$people['guests'] = $guests;
$people['users'] = sizeof($online);
return $people;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает отформатированную дату последнего визита
* @param int $user_id ID пользователя
* @param str $logdate Дата последнего визита
* @return str
*/
public static function getOnlineStatus($user_id, $logdate=''){
global $_LANG;
if (self::isOnline($user_id)){
$status = '<span class="online">'.$_LANG['ONLINE'].'</span>';
} else {
if ($logdate){
$status = '<span class="logdate">'.cmsCore::dateDiffNow($logdate).' '.$_LANG['BACK'].'</span>';
} else {
$status = '<span class="offline">'.$_LANG['OFFLINE'].'</span>';
}
}
return $status;
}
// ============================================================================ //
// ============================================================================ //
/**
* Проверяет, на сайте ли указанный пользователь
* @param int $user_id
* @return bool
*/
public static function isOnline($user_id){
if($user_id<=0) { return false; }
$inUser = self::getInstance();
$online_users = array();
if(!isset($inUser->online_users_ids)){
$ou = $inUser->online_users;
foreach ($ou as $data) {
if($data['user_id']){
$online_users[] = $data['user_id'];
}
}
$inUser->online_users_ids = $online_users;
} else {
$online_users = $inUser->online_users_ids;
}
return in_array($user_id, $online_users);
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает массив количества новых сообщений и уведомлений
* @param int $user_id
* @return array
*/
public static function getNewMessages($user_id){
$inUser = self::getInstance();
$inDB = cmsDatabase::getInstance();
if($inUser->new_msg) { return $inUser->new_msg; }
$sql = "SELECT from_id FROM cms_user_msg WHERE to_id = '$user_id' AND to_del = 0 AND is_new = 1";
$result = $inDB->query($sql);
$messages = 0;
$notices = 0;
while($o = $inDB->fetch_assoc($result)){
if ($o['from_id'] < 0){
$notices++;
} else {
$messages++;
}
}
$counts['messages'] = $messages;
$counts['notices'] = $notices;
$counts['total'] = $notices+$messages;
return $inUser->new_msg = $counts;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает список наград пользователя
* @param int $user_id
* @return array
*/
public static function getAwardsList($user_id){
if(!$user_id){ return array(); }
if(isset(self::$cache['users_awards'][$user_id])) { return self::$cache['users_awards'][$user_id]; }
$aw = cmsDatabase::getInstance()->get_table('cms_user_awards', "user_id = '$user_id'", '*');
return self::$cache['users_awards'][$user_id] = $aw;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает предустановленные награды
* @return array
*/
public static function getAutoAwards(){
return cmsDatabase::getInstance()->get_table('cms_user_autoawards', "published = 1 ORDER BY title", '*');
}
// ============================================================================ //
// ============================================================================ //
/**
* Проверяет условия получения наград и выдает награду пользователю, если нужно
* @param int $user_id
* @return bool
*/
public static function checkAwards($user_id=0){
if (!$user_id){ return false; }
$inDB = cmsDatabase::getInstance();
$awards = self::getAutoAwards();
if (!$awards){ return false; }
$p_content = $inDB->rows_count('cms_content', "user_id='$user_id' AND published = 1");
$p_comment = $inDB->rows_count('cms_comments', "user_id='$user_id' AND published = 1");
$p_blog = $inDB->rows_count('cms_blog_posts', "user_id='$user_id' AND published = 1");
$p_forum = $inDB->rows_count('cms_forum_posts', "user_id='$user_id'");
$p_photo = $inDB->rows_count('cms_photo_files', "user_id='$user_id' AND published = 1");
$p_privphoto = $inDB->rows_count('cms_user_photos', "user_id='$user_id'");
$p_karma = $inDB->get_field('cms_user_profiles', "user_id='$user_id'", 'karma');
foreach ($awards as $award) {
if ($inDB->rows_count('cms_user_awards', "user_id = '$user_id' AND award_id = '{$award['id']}'")) { continue; }
$granted = ($award['p_content'] <= $p_content) &&
($award['p_comment'] <= $p_comment) &&
($award['p_blog'] <= $p_blog) &&
($award['p_forum'] <= $p_forum) &&
($award['p_photo'] <= $p_photo) &&
($award['p_privphoto'] <= $p_privphoto) &&
($award['p_karma'] <= $p_karma);
if (!$granted){ continue; }
self::giveAward($award, $user_id);
}
return true;
}
// ============================================================================ //
// ============================================================================ //
/**
* Выдает награду
* @param array $award
* @param int $user_id
* @return int $award_id
*/
public static function giveAward($award, $user_id){
if(!$award || !$user_id) { return false; }
global $_LANG;
$inDB = cmsDatabase::getInstance();
$user = self::getShortUserData($user_id);
if(!$user){ return false; }
if(!file_exists(PATH.'/images/users/awards/'.$award['imageurl'])){ return false; }
$award = $inDB->escape_string($award);
$sql = "INSERT INTO cms_user_awards (user_id, pubdate, title, description, imageurl, from_id, award_id)
VALUES ('$user_id', NOW(), '{$award['title']}', '{$award['description']}', '{$award['imageurl']}', '{$award['from_id']}', '{$award['id']}')";
$inDB->query($sql);
$award_id = $inDB->get_last_id('cms_user_awards');
if(!$award_id){ return false; }
cmsActions::log('add_award', array(
'object' => '"'.$award['title'].'"',
'user_id' => $user_id,
'object_url' => '',
'object_id' => $award['id'],
'target' => '',
'target_url' => '',
'target_id' => 0,
'description' => '<img src="/images/users/awards/'.$award['imageurl'].'" border="0" alt="'.htmlspecialchars($award['description']).'">'
));
self::sendMessage(USER_UPDATER, $user_id, '<b>'.$_LANG['RECEIVED_AWARD'].':</b> <a href="'.cmsUser::getProfileURL($user['login']).'#upr_awards">'.$award['title'].'</a>');
return cmsCore::callEvent('GIVE_AWARD', $award_id);
}
// ============================================================================ //
// ============================================================================ //
/**
* Отправляет личное сообщение пользователю
* @param int $sender_id
* @param int $receiver_id
* @param string $message
* @return bool
*/
public static function sendMessage($sender_id, $receiver_id, $message){
$inDB = cmsDatabase::getInstance();
$message = $inDB->escape_string($message);
$sql = "INSERT INTO cms_user_msg (to_id, from_id, senddate, is_new, message)
VALUES ('$receiver_id', '$sender_id', NOW(), 1, '$message')";
$inDB->query($sql);
$msg_id = $inDB->get_last_id('cms_user_msg');
return $msg_id ? $msg_id : false;
}
// ============================================================================ //
// ============================================================================ //
/**
* Отправляет личное сообщение списку пользователей
* @param int $sender_id
* @param array $receiver_ids
* @param string $message
* @return int
*/
public static function sendMessages($sender_id, $receiver_ids, $message){
if(!is_array($receiver_ids) || !$receiver_ids) { return false; }
$msg = array();
foreach ($receiver_ids as $receiver_id){
$msg[] = self::sendMessage($sender_id, $receiver_id, $message);
}
return count($msg); // возвращаем количество отправленных сообщений
}
/**
* Отправляет личное сообщение группе(ам) пользователей
* @param int $sender_id
* @param array or int $group
* @param string $message
* @return int
*/
public static function sendMessageToGroup($sender_id, $group, $message){
// если отсылаем нескольким группам
if(is_array($group)){
$count = 0;
foreach ($group as $group_id){
$count += self::sendMessageToGroup($sender_id, $group_id, $message);
}
} else { // отсылаем одной группе
// получаем участников групппы
$user_list = self::getGroupMembers($group);
if(!$user_list) { return false; }
// получаем id пользователей
$user_ids = array_keys($user_list);
return self::sendMessages($sender_id, $user_ids, $message);
}
return $count;
}
// ============================================================================ //
// ============================================================================ //
/**
* Проверяет подписан ли пользователь на обновления контента
* @param int $user_id
* @param string $target
* @param int $target_id
* @return bool
*/
public static function isSubscribed($user_id, $target, $target_id){
if(!$user_id){ return false; }
return (bool)cmsDatabase::getInstance()->rows_count('cms_subscribe', "user_id = '$user_id' AND target = '$target' AND target_id = '$target_id'");
}
// ============================================================================ //
// ============================================================================ //
/**
* Добавляет/удаляет подписку пользователя на обновления контента
* @param int $user_id
* @param string $target
* @param int $target_id
* @param bool $subscribe
* @return bool
*/
public static function subscribe($user_id, $target, $target_id, $subscribe=true){
$inDB = cmsDatabase::getInstance();
if ($subscribe){
if (!$inDB->rows_count('cms_subscribe', "user_id = $user_id AND target = '$target' AND target_id = $target_id")){
$sql = "INSERT INTO cms_subscribe (user_id, target, target_id, pubdate)
VALUES ('{$user_id}', '{$target}', '{$target_id}', NOW())";
$inDB->query($sql) ;
}
} else {
$sql = "DELETE FROM cms_subscribe WHERE user_id = $user_id AND target = '$target' AND target_id = $target_id";
$inDB->query($sql) ;
}
return true;
}
// ============================================================================ //
// ============================================================================ //
/**
* Рассылает личные сообщения с уведомлениями о новом комментарии
* @param string $target
* @param int $target_id
* @return bool
*/
public static function sendUpdateNotify($target, $target_id){
$inUser = cmsUser::getInstance();
$inCore = cmsCore::getInstance();
$inDB = cmsDatabase::getInstance();
$inConf = cmsConfig::getInstance();
//получаем последний комментарий и автора
if ($target != 'forum'){
$comment_sql = "SELECT c.target_title as target_title,
c.target_link as target_link,
c.id as id,
IFNULL(u.nickname, c.guestname) as author
FROM cms_comments c
LEFT JOIN cms_users u ON c.user_id = u.id
WHERE c.target='{$target}' AND c.target_id='{$target_id}'
ORDER BY c.pubdate DESC
LIMIT 1";
}
//либо получаем нужную тему форума и автора последнего сообщения
if ($target == 'forum'){
$comment_sql = "SELECT ft.title as target_title,
ft.id as thread_id,
ft.post_count,
fp.id as post_id,
u.nickname as author
FROM cms_forum_threads ft, cms_forum_posts fp, cms_users u
WHERE fp.thread_id='{$target_id}' AND fp.thread_id=ft.id AND fp.user_id = u.id
ORDER BY fp.pubdate DESC
LIMIT 1";
$f_c = $inCore->loadComponentConfig('forum');
}
$comment_result = $inDB->query($comment_sql);
if (!$inDB->num_rows($comment_result)){ return false; }
$comment = $inDB->fetch_assoc($comment_result);
//получаем список подписанных пользователей
$users_sql = "SELECT p.cm_subscribe as subscribe_type,
u.email as email,
u.id as id
FROM cms_subscribe s, cms_users u, cms_user_profiles p
WHERE p.user_id = u.id AND
s.user_id = u.id AND
s.target = '{$target}' AND
s.target_id = '{$target_id}'";
$users_result = $inDB->query($users_sql);
if (!$inDB->num_rows($users_result)){ return false; }
$postdate = date('d/m/Y H:i:s');
$letter_title = ($target=='forum' ? 'Новое сообщение на форуме' : 'Новый комментарий');
$letter_file = ($target=='forum' ? 'newforumpost.txt' : 'newcomment.txt');
$letter_path = PATH.'/includes/letters/'.$letter_file;
$letter = file_get_contents($letter_path);
if ($target == 'forum'){
$comment['lastpage'] = ceil($comment['post_count'] / $f_c['pp_thread']);
$comment['target_link'] = '/forum/thread'.$comment['thread_id'].'-'.$comment['lastpage'].'.html#'.$comment['post_id'];
} else {
$comment['target_link'] = $comment['target_link'].'#c'.$comment['id'];
}
while ($user = $inDB->fetch_assoc($users_result)){
if ($user['id'] == $inUser->id) { continue; }
if ($user['subscribe_type']=='priv' || $user['subscribe_type']=='both'){
$message = 'Произошло обновление: <a href="'.$comment['target_link'].'">'.$comment['target_title'].'</a>';
self::sendMessage(USER_UPDATER, $user['id'], $message);
}
if ($user['subscribe_type']=='mail' || $user['subscribe_type']=='both'){
if (!$user['email']) { continue; }
$user_letter = str_replace('{sitename}', $inConf->sitename, $letter);
$user_letter = str_replace('{answerlink}', HOST.$comment['target_link'], $user_letter);
$user_letter = str_replace('{pagetitle}', $comment['target_title'], $user_letter);
$user_letter = str_replace('{date}', $postdate, $user_letter);
$user_letter = str_replace('{author}', $comment['author'], $user_letter);
$inCore->mailText($user['email'], $letter_title.' - '.$inConf->sitename, $user_letter);
unset($user_letter);
}
}
return;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает тег ссылки на профиль пользователя с иконкой его пола
* @param int $user_id
* @param string $nickname
* @param char $gender m / f
* @param string $login
* @param string $css_style
* @return html
*/
public static function getGenderLink($user_id, $nickname='', $gender='', $login='', $css_style=''){
$inDB = cmsDatabase::getInstance();
if (!$gender){
$gender = $inDB->get_field('cms_user_profiles', "user_id = '$user_id'", 'gender');
}
if (!$nickname || !$login){
$user = $inDB->get_fields('cms_users', "id = '$user_id'", 'nickname, login');
$nickname = $user['nickname'];
$login = $user['login'];
}
return '<a href="'.cmsUser::getProfileURL($login).'" class="user_gender_'.$gender.'" style="'.$css_style.'">'.$nickname.'</a>';
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает список <select> с фотографиями из личного альбома указанного пользователя
* @param int $user_id
* @return html
*/
public static function getPhotosList($user_id){
$inDB = cmsDatabase::getInstance();
$sql = "SELECT imageurl, title
FROM cms_user_photos
WHERE user_id = $user_id
ORDER BY title ASC";
$rs = $inDB->query($sql);
if ($inDB->num_rows($rs)){
$html = '<select name="photolist" id="photolist">'."n";
while($photo = $inDB->fetch_assoc($rs)){
$html .= '<option value="'.$photo['imageurl'].'">'.$photo['title'].'</option>'."n";
}
$html .= '</select>'."n";
} else {
$html = '<span style="padding-left:5px;padding:right:5px">В вашем альбоме нет фотографий</span>'."n";
}
return $html;
}
// ============================================================================ //
// ============================================================================ //
public static function getProfileURL($user_login) {
if(!$user_login){
global $_LANG;
return 'javascript:core.alert(''.$_LANG['USER_IS_DELETE'].'',''.$_LANG['ATTENTION'].'');';
}
return '/' . self::PROFILE_LINK_PREFIX . urlencode($user_login);
}
// ============================================================================ //
// ============================================================================ //
public static function getProfileLink($user_login, $user_nickname) {
if(!$user_login){
global $_LANG;
return $_LANG['USER_IS_DELETE'];
}
return '<a href="'.self::getProfileURL($user_login).'" title="'.htmlspecialchars($user_nickname).'">'.$user_nickname.'</a>';
}
// ============================================================================ //
// ============================================================================ //
/**
* Запоминает текущий URI в сессии и перенаправляет пользователя на форму логина
*/
public static function goToLogin(){
self::sessionPut('auth_back_url', cmsCore::strClear($_SERVER['REQUEST_URI']));
cmsCore::redirect('/login');
}
// ============================================================================ //
// ============================================================================ //
/**
* Сохраняет переменную в сессии
* @param str $param Название переменной
* @param mixed $value Значение
* @return bool
*/
public static function sessionPut($param, $value, $box = 'icms'){
$_SESSION[$box][$param] = $value;
return $value;
}
/**
* Извлекает переменную из сессии
* @param str $param Название переменной
* @return bool
*/
public static function sessionGet($param, $box = 'icms'){
if (isset($_SESSION[$box][$param])){
return $_SESSION[$box][$param];
} else {
return false;
}
}
/**
* Удаляет переменную из сессии
* @param str $param Название переменной
*/
public static function sessionDel($param, $box = 'icms'){
unset($_SESSION[$box][$param]);
}
/**
* Очищает весь массив icms сессии
*/
public static function sessionClearAll($box = 'icms'){
unset($_SESSION[$box]);
}
// ============================================================================ //
// ============================================================================ //
public static function getCsrfToken(){
if(!self::$csrf_token){
$token = md5(uniqid().time());
$tokens = self::sessionGet('csrf_tokens', 'security');
if(is_array($tokens)){
$count_tokens = array_push($tokens, $token);
if($count_tokens > self::MAXIMUM_TOKENS_COUNT){
array_shift($tokens);
}
} else {
$tokens = array($token);
}
self::sessionPut('csrf_tokens', $tokens, 'security');
self::$csrf_token = $token;
}
return self::$csrf_token;
}
public static function checkCsrfToken(){
if(isset($_POST['csrf_token'])) {
$tokens = self::sessionGet('csrf_tokens', 'security');
if(is_array($tokens)){
$key = array_search($_POST['csrf_token'], $tokens);
if($key !== false){
unset($tokens[$key]);
ksort($tokens);
self::sessionPut('csrf_tokens', $tokens, 'security');
return true;
}
}
}
return false;
}
/**
* ====== DEPRECATED =========
*/
public static function clearCsrfToken(){
return true;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает список всех активных пользователей
* @return array
*/
public static function getAllUsers(){
return cmsDatabase::getInstance()->get_table('cms_users', 'id > 0 AND is_locked = 0 AND is_deleted = 0');
}
/**
* Возвращает количество всех активных пользователей
* @return int
*/
public static function getCountAllUsers(){
return cmsDatabase::getInstance()->rows_count('cms_users', 'id > 0 AND is_locked=0 AND is_deleted=0');;
}
/**
* Возвращает данные из cms_users пользователя по логину, email или id
* @param str $id
* @return array
*/
public static function getShortUserData($id='') {
if(!$id){ return false; }
$inUser = self::getInstance();
// для текущего юзера смысла данные из базы брать нет
if ($inUser->id && in_array($id, array($inUser->login, $inUser->id))) {
return get_object_vars($inUser);
}
if(isset(self::$cache['get_short_user'][$id])){ return self::$cache['get_short_user'][$id]; }
if(is_numeric($id)){
$where = "id = '$id'";
} else {
if(preg_match("/^([a-zA-Z0-9._-]+)@([a-zA-Z0-9._-]+).([a-zA-Z]{2,4})$/ui", $id)){
$where = "email = '$id'";
} else {
$where = "login = '$id'";
}
}
return self::$cache['get_short_user'][$id] = cmsDatabase::getInstance()->get_fields('cms_users', $where, '*', 'id DESC');
}
/**
* Возвращает массив id групп администраторов
* @return array
*/
public static function getAdminGroups(){
$inDB = cmsDatabase::getInstance();
$groups = array();
$result = $inDB->query("SELECT id FROM cms_user_groups WHERE is_admin = 1");
if ($inDB->num_rows($result)){
while($group = $inDB->fetch_assoc($result)){
$groups[] = $group['id'];
}
}
return $groups;
}
/**
* Возвращает id группы пользователя
* @param int $user_id
* @return int
*/
public static function getGroupIdByUserId($user_id){
return cmsDatabase::getInstance()->get_field('cms_users', "id='{$user_id}'", 'group_id');
}
/**
* Возвращает название группы пользователей
* @param int $group_id
* @return str
*/
public static function getGroupTitle($group_id){
return cmsDatabase::getInstance()->get_field('cms_user_groups', "id='{$group_id}'", 'title');
}
/**
* Возвращает список групп пользователей
* @param bool $no_guests Если TRUE, группа "Гости" не выводится
* @return array
*/
public static function getGroups($no_guests=false){
$inDB = cmsDatabase::getInstance();
$groups = array();
$sql = "SELECT id, title, alias, is_admin, access
FROM cms_user_groupsn";
if ($no_guests){
$sql .= "WHERE alias <> 'guest'n";
}
$sql .= "ORDER BY is_admin ASC";
$result = $inDB->query($sql);
if ($inDB->num_rows($result)){
while($group = $inDB->fetch_assoc($result)){
$groups[] = $group;
}
}
return $groups;
}
/**
* Возвращает пользователей в указанной группе
* @param int $group_id
* @return array
*/
public static function getGroupMembers($group_id){
$inDB = cmsDatabase::getInstance();
$users = array();
$sql = "SELECT id, nickname, login
FROM cms_users
WHERE group_id='{$group_id}' AND is_deleted=0";
$result = $inDB->query($sql);
if ($inDB->num_rows($result)){
while($user = $inDB->fetch_assoc($result)){
$users[$user['id']] = $user;
}
}
return $users;
}
/**
* Удаляет тип доступа группы
* @param str $access_type
* @return bool
*/
public static function deleteGroupAccessType($access_type=''){
return cmsDatabase::getInstance()->query("DELETE FROM cms_user_groups_access WHERE access_type = '{$access_type}'");
}
/**
* Добавляет тип доступа группы
* @param str $access_type
* @param str $access_name
* @return bool
*/
public static function registerGroupAccessType($access_type='', $access_name=''){
if(!$access_type || !$access_name) { return false; }
$sql = "INSERT IGNORE INTO cms_user_groups_access (access_type, access_name)
VALUES ('$access_type', '$access_name')";
return cmsDatabase::getInstance()->query($sql);
}
// ============================================================================ //
// ============================================================================ //
/**
* Авторизует пользователя
* возвращает url для редиректа
* @param str $login
* @param str $passw
* @param int $remember_pass
* @return srt $back_url
*/
public function signInUser($login = '', $passw = '', $remember_pass = 1, $pass_in_md5 = 0){
if($this->id) { return cmsCore::getBackURL(); }
$default_back_url = '/auth/error.html';
if(!$login || !$passw) { return $default_back_url; }
$inDB = cmsDatabase::getInstance();
$inCore = cmsCore::getInstance();
// Авторизация по логину или e-mail
if (!preg_match("/^([a-zA-Z0-9._-]+)@([a-zA-Z0-9._-]+).([a-zA-Z]{2,4})$/ui", $login)){
$where_login = "u.login = '{$login}'";
} else {
$where_login = "u.email = '{$login}'";
}
$where_pass = $pass_in_md5 ? "u.password = '$passw'" : "u.password = md5('$passw')";
// Проверяем локальную пару логин + пароль
$user = $this->loadUser(0, "$where_login AND $where_pass");
// иначе пытаемся авторизоваться через плагины
if(!$user) {
$user = cmsCore::callEvent('SIGNIN_USER', array('login'=>$login,'pass'=>$passw));
}
if(!$user) { return $default_back_url; }
// При наличии пользователя в банлисте - ошиибка авторизации
if ($this->isBanned($user['id'])) {
$inDB->query("UPDATE cms_banlist SET ip = '{$this->ip}' WHERE user_id = '{$user['id']}' AND status = 1");
return $default_back_url;
}
$_SESSION['user'] = $user;
cmsCore::callEvent('USER_LOGIN', $_SESSION['user']);
if ($remember_pass){
$cookie_code = md5($user['id'] . $user['password']);
cmsCore::setCookie('userid', $cookie_code, time()+60*60*24*30);
}
// Флаг первой авторизации
$first_time_auth = !$user['is_logged_once'];
// обновляем дату последнего визита, ip
self::setUserLogdate($user['id']);
$inDB->query("UPDATE cms_users SET last_ip = '{$this->ip}', is_logged_once = 1 WHERE id = '{$user['id']}'");
////////////// юзер уже авторизован //////////////////////////
// Формируем url редиректа после авторизации
// Получаем настройки что делать после авторизации
$cfg = $inCore->loadComponentConfig('registration');
// Получаем URL, предыдущий перед формой логина
$auth_back_url = cmsUser::sessionGet('auth_back_url');
$auth_back_url = $auth_back_url ? $auth_back_url : cmsCore::getBackURL();
if(!mb_strstr($auth_back_url, str_replace('http://', '', HOST))) { $auth_back_url = '/'; }
cmsUser::sessionDel('auth_back_url');
// Авторизация в админку
if($_SESSION['user']['is_admin'] && cmsCore::inRequest('is_admin')){
return '/admin/';
}
// Остальные пользователи
if($_SESSION['user']['id']){
if ($first_time_auth) { $cfg['auth_redirect'] = $cfg['first_auth_redirect']; }
switch($cfg['auth_redirect']){
case 'none': $url = $auth_back_url; break;
case 'index': $url = '/'; break;
case 'profile': $url = cmsUser::getProfileURL($user['login']); break;
case 'editprofile': $url = '/users/'.$user['id'].'/editprofile.html'; break;
}
return $url;
}
return $default_back_url;
}
// ============================================================================ //
// ============================================================================ //
/**
* Разлогинивает пользователя
* @return bool
*/
public function logout(){
$inDB = cmsDatabase::getInstance();
cmsCore::unsetCookie('userid');
$user_id = self::getInstance()->id;
$sess_id = session_id();
cmsCore::callEvent('USER_LOGOUT', $user_id);
self::setUserLogdate($user_id);
$inDB->query("DELETE FROM cms_online WHERE user_id = '$user_id'");
$inDB->query("DELETE FROM cms_search WHERE session_id = '$sess_id'");
session_destroy();
}
// ============================================================================ //
// ============================================================================ //
/**
* Проверяет, является ли пользователь администратором
* @param int $userid
* @return bool
*/
public static function userIsAdmin($user_id){
if (!$user_id) { return false; }
$inUser = self::getInstance();
if ($user_id == $inUser->id){
return $inUser->is_admin;
} else {
if(isset(self::$cache['is_admin'][$user_id])){ return self::$cache['is_admin'][$user_id]; }
$is_admin = cmsDatabase::getInstance()->get_field('cms_users u LEFT JOIN cms_user_groups g ON g.id = u.group_id', "u.id = '$user_id'", 'g.is_admin');
return self::$cache['is_admin'][$user_id] = $is_admin;
}
}
// ============================================================================ //
// ============================================================================ //
/**
* Проверяет, является ли пользователь редактором статей
* Возвращает массив id категорий, где пользователь редактор
* @param int $userid
* @return array
*/
public static function userIsEditor($userid=0){
$inUser = self::getInstance();
// если проверяем текущего пользователя
if(!$userid || $userid == $inUser->id){
if(!$inUser->id) { return false; }
$group_id = $inUser->group_id;
} elseif($userid) {
$group_id = self::getGroupIdByUserId($userid);
}
if(!@$group_id) { return false; }
$cat = cmsDatabase::getInstance()->get_table('cms_category', "modgrp_id = '{$group_id}'", 'id');
return $cat ? $cat : false;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает массив с администраторскими правами доступа текущего пользователя
* @return array
*/
public static function getAdminAccess(){
$inUser = self::getInstance();
if($inUser->id) { return $inUser->access; }
$access = cmsDatabase::getInstance()->get_field('cms_user_groups', "id = '{$inUser->group_id}'", 'access');
if ($access){
$access = str_replace(', ', ',', $access);
$access = explode(',', $access);
return $access;
}
return false;
}
// ============================================================================ //
// ============================================================================ //
/**
* Проверяет что администратор имеет право на указанное действие
* $access_type like "admin/modules" or "admin/users"
* @param string $access_type
* @param array $access_list
* @return bool
*/
public static function isAdminCan($access_type, $access_list){
$inUser = self::getInstance();
if (!$inUser->is_admin){ return false; }
if($inUser->id==1) { return true; }
if (in_array($access_type, $access_list)){ return true; }
return false;
}
// ============================================================================ //
// ============================================================================ //
/**
* Проверяет что пользователь имеет право на указанное действие
* $access_type like "comments/delete" or "photo/edit"
* @param string $access_type
* @return bool
*/
public static function isUserCan($access_type){
$inUser = self::getInstance();
if($inUser->is_admin) { return true; }
return in_array($access_type, $inUser->access);
}
// ============================================================================ //
// ============================================================================ //
}
?>