HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/limestate-api/Models/User.php
<?php
class User extends Db_Model
{
    const DEFAULT_GROUP = 4;

    static $table_name = 'users';
    static $table_relations = 'todo_user_relations';
	static $table_groups_relations = 'todo_groups_relations';

    static $roleId = 0;
    static $login = 'guest';
    private static $user;
    static $role;
    static $userColor = array();


    static $colors = array(
        'ff3065', '2abb9f', '9e61b6', 'b24d7d', 'e75555', '30bde6', '3052e6', '7930e6', '30e63d', '9be630'
    );

    /** @deprecated @var array – levels-roles  */
    static $roles = array(
        '0' => 'Гости',
        '1' => 'Суперадминистраторы',
        '2' => 'Администраторы',
        '3' => 'Пользователи'
    );

    static $bands = array(
        'Клиент' => 'Клиент',
        'Менеджер' => 'Менеджер',
        'Менеджер клиента' => 'Менеджер клиента',
        'Партнёр' => 'Партнёр',
        'Поставщик' => 'Поставщик',
        'Разработчик' => 'Разработчик',
        'Финансист' => 'Финансист'
    );

    public static function auth($email, $password, $longSession = false)
    {
        if ( $user = User::findUser($email, $password)) {
            $sid = md5($user->email . 'salt' . $user->password . 'salt');
            $token = Token::generateToken($user->id);

            if ($longSession) {
                setcookie('sid', $sid, time() + 60*60*24*7);
            } else {
                setcookie('sid', $sid, time() + 60*60*24*1);
            }

            $_SESSION['user'] = serialize($user);

            return $token;
        } else {
            return false;
        }
    }

    public static function countReferral($userId = false)
    {
        if (!$userId) {
            $user = User::getUser();
            $userId = $user->id;
        }

        return self::$db->select('COUNT(id)')->from(self::$table_name)->where('referer = ?', $userId)->fetchOne();
    }

    public static function getReferrals($userId = false)
    {
        if (!$userId) {
            $user = User::getUser();
            $userId = $user->id;
        }

        return self::$db->select('id, name')->from(self::$table_name)->where('referer = ?', $userId)->fetchAll();
    }

    public static function restoreSession()
    {
        if (empty($_COOKIE['sid'])) return false;

        $sid = $_COOKIE['sid'];

        $user = User::$db->select()->from(self::$table_name)->where('sid = ?', $sid)->fetchRow();

        if ($user) {
            $_SESSION['user'] = serialize($user);
            Core::redirect($_SERVER['HTTP_REFERER']);
        } else {
            return false;
        }
    }

    public static function remove($id)
    {
        return self::$db->update(self::$table_name, array(
            'deleted' => 1,
            'activated' => 0
        ), array(
            'id' => $id
        ));
    }

    /**
     * Обновляет данные о пользователе
     *
     * @param $data — параметры пользователя
     * @param $where — идентификатор пользователя
     * @return int
     */
    public static function updateUserData($data, $where)
    {
        $data = (array) $data;
        foreach ($data as $key => $value) {
            if (is_null($value)) unset($data[$key]);
        }

        return self::update($data, $where);
    }

    public static function create($data, $returning = false)
    {
        return parent::create($data, $returning
        );
    }

    public static function getGroups($user_id = false)
    {
        if (!$user_id) $user_id = User::getUser()->id;
        return self::$db->select('group_id')->from('todo_groups_relations')->where('user_id = ?', $user_id)->fetchCol();
    }

    public static function getHome()
    {
        return Acl::$homePages[self::$user->level];
    }

    /**
     * Устанавливает или доабвляет группы пользователю
     *
     * @param $userId — идентификатор пользователя
     * @param $groupIds — список идентификаторов групп или одной группы
     * @param bool $only — удалить предыдущие вхождения
     *
     * @return bool — результат операции
     */
    public static function setUserGroups($userId, $groupIds, $only = false)
    {
        try {
            self::$db->begin();

            if ($only) {
                self::$db->delete('todo_groups_relations', array(
                    'user_id' => $userId
                ));
            }

            if (is_array($groupIds)) {
                foreach ($groupIds as $groupId) {
                    $sql = "REPLACE INTO `todo_groups_relations` (`user_id`, `group_id`) VALUES (" . $userId . ", " . $groupId . ") ";
                    self::$db->query($sql);
                }
            } else if (in_numeric($groupIds)) {
                $sql = "REPLACE INTO `todo_groups_relations` (`user_id`, `group_id`) VALUES (" . $userId . ", " . $groupIds . ") ";
                self::$db->query($sql);
            }
            self::$db->commit();
        } catch(Exception $e) {
            self::$db->rollback();
            return false;
        }
        return true;
    }

    /**
     * Возвращает список идентификаторов групп пользователя
     *
     * @param $userId — идентификатор пользователя
     *
     * @return array – список идентификаторов групп пользователя
     */
    public static function getUserGroups($userId = false)
    {
        if (!$userId) {
            $user = User::getUser();
            $userId = $user->id;
        }
        return self::$db->select('group_id')->from('todo_groups_relations')->where('user_id = ?', $userId)->fetchCol();
    }

    public static function randomPassword() {
        $alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
        $pass = '';
        for ($i = 0; $i < 8; $i++) {
            $n = rand(0, mb_strlen($alphabet)-1);
            $pass .= $alphabet[$n];
        }
        return $pass;
    }

    public static function passwordRecovery($email = false)
    {
        $newPassword = self::randomPassword();
	    $hash = password_hash($newPassword, PASSWORD_BCRYPT);

        User::$db->update(User::$table_name, [ 'password' => $hash ], [ 'email' => $email ]);

        $data['status']  = 'success';
        $data['msg'] = '<strong>Отлично.</strong> Новый пароль выслан вам на почту.';

        $message = 'Ваш новый пароль: '. $newPassword;
        Mail::send($email, 'Восстановление пароля ', $message);
    }

    public static function findUser($email, $password)
    {
        $user = self::findUser_byEmail($email);

        if ($user && password_verify($password, $user->password)) {
        	return $user;
        } else {
        	return false;
        }
    }

    public static function findUser_byEmail($email)
    {
        return self::$db->select('*')
            ->from(self::$table_name)
            ->where('email = ?', $email)
            ->fetchRow();
    }

    /**
     * Возвращает объект текущего пользователя
     *
     * @return object — объект текущего пользователя
     */
    public static function getUser()
    {
        return self::$user;
    }

    /**
     * Возвращает идентификатор текущего пользователя
     *
     * @return int — идентификатор текущего пользователя
     */
    public static function getUserId()
    {
        return isset(self::$user->id) ? self::$user->id : 0;
    }


    public static function init()
    {
        if (isset($_SESSION['user'])) {
            $user = (object)unserialize($_SESSION['user']);

            self::$user = $user;
            self::$roleId = $user->level;
            self::$login = $user->login;
            self::$role = $user->level;

            User::updateLastLogin();
        } else {
            User::restoreSession();

            $user = (object) array(
                'level' => 0,
                'role' => 'guest',
                'login' => 'guest'
            );
            self::$user = $user;
            self::$roleId = $user->level;
            self::$login = $user->login;
            self::$role = $user->level;
        }
    }

    /**
     * Проверяет зарегистрирован-ли данный email в системе
     *
     * @param $email – Email пользователя
     * @return bool – зарегистрирован или нет данный email
     */
    public static function isEmailRegistered($email)
    {
        return (bool) User::$db->select('COUNT(id)')
            ->from(self::$table_name)
            ->where('email = ?', $email)
            ->fetchOne();
    }

    /**
     * Регистрирует пользователя в системе
     *
     * @param $userData – данные пользователя
     * @param bool $auth — автоматически авторизоваться под пользователем
     * @return mixed — данные авторизации
     */
    public static function signUp($userData, $auth = true)
    {
	    $userData['password'] = password_hash($userData['password'], PASSWORD_BCRYPT);
        $userId = User::create( $userData );

	    if ($auth) {
		    return self::auth( $userData['email'], $userData['password']);
	    } else {
	    	return $userId;
	    }
    }

    /**
     * Возращает входит-ли текущий пользователь в список ролей
     *
     * @param int|array $roles — список ролей или одна роль
     * @return bool
     */
    public static function isRole($roles)
    {
        if (is_array($roles)) {
            return in_array(self::$role, $roles);
        } else {
            return self::$role == $roles;
        }
    }

    public static function isLogged()
    {
        return self::$roleId != 0;
    }
}