Система управления «Сайт PRO»
Версия 20240107

Класс Auth

Объект $Auth: Cms\Root\Auth наследует Cms\Site\Base

Объект для работы с аутентификацией пользователя

Исходный код
class Auth extends \Cms\Site\Base { … }

Свойства

$open

$Auth->open

Способ аутентификации

Исходный код
    var $open;

$login

$Auth->login

Логин пользователя

Исходный код
    var $login;

$password

$Auth->password
Исходный код
    var $password;

$active

$Auth->active
Исходный код
    var $active;

$group

$Auth->group

Группа пользователя

Исходный код
    var $group;

$admin

$Auth->admin

Пользователь обладает правами администратора

Исходный код
    var $admin;

$root

$Auth->root
Исходный код
    var $root;

$email

$Auth->email
Исходный код
    var $email;

$title

$Auth->title
Исходный код
    var $title;

$remember

$Auth->remember

Запомнить

Исходный код
    var $remember;

$session_ttl

$Auth->session_ttl = 999999;

Период хранения сессии в базе данных

Исходный код
    var $session_ttl = 999999;

$remember_ttl

$Auth->remember_ttl = 123456789;

Период хранения cookie в браузере при запоминании логина

Исходный код
    var $remember_ttl = 123456789;

$update_ttl

$Auth->update_ttl = 999;

Период обновления cookie в браузере и сессии в базе данных

Исходный код
    var $update_ttl = 999;

$error_count

$Auth->error_count = 99;

Максимальное количество ошибок ввода пароля

Исходный код
    var $error_count = 99;

$error_ttl

$Auth->error_ttl = 99;

Время хранения ошибок ввода пароля

Исходный код
    var $error_ttl = 99;

$table

$Auth->table = 'sess';

Таблица

Исходный код
    var $table = 'sess';

$user_code_ttl

$Auth->user_code_ttl = 24 * 3600;

Время хранения кода пользователя

Исходный код
    var $user_code_ttl = 24 * 3600;

$user_retry_ttl

$Auth->user_retry_ttl = 99;

Время до повторной отправки кода

Исходный код
    var $user_retry_ttl = 99;

$logout

$Auth->logout
Исходный код
    var $logout;

$cache

$Auth->cache
Исходный код
    var $cache;

$session_cache

$Auth->session_cache
Исходный код
    var $session_cache;

Методы

__construct()

new Auth($open=true);

Конструктор

Параметры:

ИмяОписание
$open

попытаться выполнить аутентификацию сразу

Исходный код
    function __construct($open = true) {
        parent::__construct();
        if ($open) $this->init();
    }

init()

$Auth->init($done=null);

Попытка аутентификации пользователя

Параметры:

ИмяОписание
$done

аутентифицирован ли пользователь. null - не аутентифицирован; true - аутентифицирован; false - вышел из системы

Возвращает: true|false|null

Исходный код
    function init($done = null) {
        if (is_null($done)) {
            $done = $this->openPost();
            if ($done === true) $this->open = "POST";
        }
        if (is_null($done)) {
            $done = $this->openGet();
            if ($done === true) $this->open = "GET";
        }
        if (is_null($done)) {
            $done = $this->openCookie();
            if ($done === true) $this->open = "COOKIE";
        }
        if (is_null($done)) {
            $done = $this->openBasic();
            if ($done === true) $this->open = "BASIC";
        }
        # Успешная аутентификация
        if ($done === true) {
            return $this->login();
        }
        # Выход из системы
        if ($done === false) {
            return $this->logout();
        }
    }

login()

$Auth->login();

Действие в случае успешной аутентификации пользователя

Возвращает: true|null

Исходный код
    function login() {
        if (!$this->login) return;
        $this->authorize();
        $Data = $this->Data();
        $Data->query("UPDATE `user` SET `online`=" . $Data->quote(date("Y-m-d H:i:s")) . " WHERE `id`=" . $Data->quote($this->login));
        $this->sessionStart();
        if (!$_SESSION['login']) $this->sessionMerge($this->login);
        $_SESSION['login'] = $this->login;
        return true;
    }

logout()

$Auth->logout();

Действие в случае выхода из системы

Возвращает: false

Исходный код
    function logout() {
        unset($this->login);
        unset($this->group);
        unset($this->admin);
        $this->sessionStart();
        $this->sessionClose();
        $this->Main()->Request()->redirect("/");
        return false;
    }

logoutAll()

$Auth->logoutAll($login=null);

Завершение всех сессий с указанным логином

Параметры:

ИмяОписание
$login

логин

Исходный код
    function logoutAll($login = null) {
        if (!$login) $login = $this->login;
        $Data = $this->Data();
        if ($login) {
            $Data->query("DELETE FROM `{$this->table}` WHERE `login`={$Data->quote($login)} AND `login`<>`id`");
            unset($this->cache);
        }
    }

authorize()

$Auth->authorize();

Предоставление прав доступа пользователю после аутентификации

Исходный код
    function authorize() {
        if ($this->is("admin")) $this->admin = true;
        if ($this->is("root")) $this->admin = $this->root = true;
    }

sendCookie()

$Auth->sendCookie();

Отправка cookie.

Исходный код
    function sendCookie() {
        $Request = $this->Main()->Request();
        if (strlen($session = $this->session())) {
            if ($this->login) {
                # Запомнить
                if ($this->remember) $expire = time() + $this->remember_ttl;
                # Не запоминать
                else $expire = 0;
            } else {
                # Не аутентифицирован
                $expire = time() + $this->session_ttl;
            }
            $Request->setSession($session, $this->remember, $expire);
        } elseif ($_COOKIE['session']) {
            $Request->setSession(false, false);
        }
    }

openGet()

$Auth->openGet();

Попытка аутентификации через GET.

Возвращает: false|null

Исходный код
    function openGet() {
        if ($_GET['a'] == "logout") {
            $this->logout = true;
            unset($_GET['a']);
            return false;
        }
        if ($_GET && !$_COOKIE) {
            if (isset($_GET['session']) && $this->checkSession($_GET['session'])) $_COOKIE['session'] = $_GET['session'];
        }
    }

openPost()

$Auth->openPost();

Попытка аутентификации через POST.

Возвращает: true|null

Исходный код
    function openPost() {
        if (!isset($_POST['a']) || $_POST['a'] != "login") return;
        if (!isset($_POST['login']) || !$_POST['login']) return;
        if (!isset($_POST['password']) || !strlen($_POST['password'])) return;
        if ($this->checkIpLogin($_SERVER['REMOTE_ADDR'], $_POST['login']) === false) return;
        if ($_POST['remember']) $this->remember = true;
        if ($row = $this->getUserRow(trim($_POST['login']))) {
            if ($this->checkPassword($row, $_POST['password'])) {
                if ($this->checkActive($row)) {
                    unset($_POST['a']);
                    unset($_POST['login']);
                    unset($_POST['password']);
                    unset($_POST['remember']);
                    foreach ($row as $k => $v) $this->$k = $v;
                    return true;
                }
            } else {
                $this->errorIpLogin($_SERVER['REMOTE_ADDR'], $_POST['login']);
            }
        } else {
            $this->checkPassword(array(), $_POST['password']);
        }
    }

openBasic()

$Auth->openBasic();

Попытка аутентификации через PHP_AUTH.

Возвращает: true|null

Исходный код
    function openBasic() {
        if (!isset($_SERVER['PHP_AUTH_USER']) || !$_SERVER['PHP_AUTH_USER']) return;
        if (!isset($_SERVER['PHP_AUTH_PW']) || !strlen($_SERVER['PHP_AUTH_PW'])) return;
        if ($this->checkIpLogin($_SERVER['REMOTE_ADDR'], $_SERVER['PHP_AUTH_USER']) === false) return;
        if ($row = $this->getUserRow($_SERVER['PHP_AUTH_USER'])) {
            if ($this->checkPassword($row, $_SERVER['PHP_AUTH_PW'])) {
                if ($this->checkActive($row)) {
                    foreach ($row as $k => $v) $this->$k = $v;
                    return true;
                }
            } else {
                $this->errorIpLogin($_SERVER['REMOTE_ADDR'], $_SERVER['PHP_AUTH_USER']);
            }
        }
    }

openCookie()

$Auth->openCookie();

Попытка аутентификации через COOKIE.

Возвращает: true|null

Исходный код
    function openCookie() {
        if (!isset($_COOKIE['session']) || !$this->checkSession($_COOKIE['session'])) return;
        if ($_COOKIE['remember']) $this->remember = true;
        $this->sessionStart();
        if (!$_SESSION['login']) return;
        if ($row = $this->getUserRow($_SESSION['login'])) {
            if ($this->checkActive($row)) {
                foreach ($row as $k => $v) $this->$k = $v;
                return true;
            }
        }
    }

getUserRow()

$Auth->getUserRow($login);

Получение массива с информацией о пользователе

Параметры:

ИмяОписание
$login

логин

Возвращает: array|null

Исходный код
    function getUserRow($login) {
        $Conf = $this->Conf();
        $Data = $this->Data();
        foreach ($this->getRootAuth() as $root_login => $root_password) if ($login == $root_login) {
            return array(
                "login" => $root_login,
                "password" => $root_password,
                "group" => "root",
                "email" => $Conf->get("admin_email"),
                "title" => "Администратор",
                "active" => true,
                # Не запоминать аутентификацию Администратора
                "remember" => false,
                # 2018-11-28
                "remote" => true,
            );
        }
        if (mb_strtolower($login) == mb_strtolower($Conf->get("admin_login"))) {
            return array(
                "login" => $Conf->get("admin_login"),
                "password" => $Conf->get("admin_password"),
                "group" => "admin",
                "email" => $Conf->get("admin_email"),
                "title" => "Администратор",
                "active" => true,
            );
        }
        if (false
         || ($row = $Data->getRow("SELECT * FROM `user` WHERE `id`=" . $Data->quote($login)))
         || ($row = $Data->getRow("SELECT * FROM `user` WHERE `id`=" . $Data->quote("/user/$login")))
         || ($row = $Data->getRow("SELECT * FROM `user` WHERE `email`=" . $Data->quote($login) . " AND `password`<>'' ORDER BY `active` DESC"))
        ) {
            return array(
                "login" => $row['id'],
                "password" => $row['password'],
                "group" => $row['group'],
                "email" => $row['email'],
                "title" => $row['title'],
                "active" => $row['active'] ? true : false,
            );
        }
    }

getRootAuth()

$Auth->getRootAuth();

Список логинов и паролей администраторов в виде массива

Возвращает: array

Исходный код
    function getRootAuth() {
        return include(dirname(__FILE__) . "/auth/root.php");
    }

checkPassword()

$Auth->checkPassword($row, $password);

Проверка пароля

Параметры:

ИмяОписание
$row

данные пользователя в виде массива

$password

пароль

Возвращает: true|null

Исходный код
    function checkPassword($row, $password) {
        if (strpos($row['password'], '://') !== false && $row['remote']) {
            if ($this->Main()->fastLoad($row['password'] . '?auth=' . $this->encrypt($row['login'], $password)) === 'OK') return true;
        }
        if (strlen($password) < 32)
        if ($row['password'] == $password) return true;
        if (strlen($row['password']) == 32 && $row['password'] == md5($password)) return true;
        if (strlen($row['password']) == 40 && $row['password'] == sha1($password)) return true;
        if (strlen($row['password']) == 40 && $row['password'] == $this->encrypt($row['login'], $password)) return true;
        if (strlen($row['password']) == 65 && $row['password'][32] == ":") {
            # Joomla!
            $hash = substr($row['password'], 0, 32);
            $salt = substr($row['password'], 33, 32);
            if ($hash == md5($password . $salt)) return true;
        }
        $this->addError("Неверный логин или пароль");
    }

checkActive()

$Auth->checkActive($row);

Проверка является ли пользователь активным

Параметры:

ИмяОписание
$row

данные пользователя в виде массива

Возвращает: true|null

Исходный код
    function checkActive($row) {
        if ($row['active']) return true;
        $this->addError("Ваша учетная запись заблокирована");
    }

checkSession()

$Auth->checkSession($session);

Проверка корректности идентификатора сессии

Параметры:

ИмяОписание
$session

ID сессии

Возвращает: bool

Исходный код
    function checkSession($session) {
        return $session && preg_match("~^\\w{64,}$~", $session);
    }

checkIpLogin()

$Auth->checkIpLogin($ip, $login);

Проверка блокировки пары IP-адреса и логина

Параметры:

ИмяОписание
$ip

IP-адрес

$login

Логин

Возвращает: bool

Исходный код
    function checkIpLogin($ip, $login) {
        $Data = $this->Data();
        $key = "error:$ip:$login";
        if (intval($Data->dLookup("SELECT `data` FROM `{$this->table}` WHERE `id`={$Data->quote($key)}")) > 99) {
            $this->addError("Ваш IP-адрес заблокирован");
            return false;
        }
        return true;
    }

errorIpLogin()

$Auth->errorIpLogin($ip, $login);

Ошибка входа для пары IP-адреса и логина

Параметры:

ИмяОписание
$ip

IP-адрес

$login

Логин

Возвращает: null

Исходный код
    function errorIpLogin($ip, $login) {
        # $this->_log("errorIpLogin($ip, $login)");
        $Data = $this->Data();
        $key = "error:$ip:$login";
        if (intval($Data->dLookup("SELECT `data` FROM `{$this->table}` WHERE `id`={$Data->quote($key)}"))) {
            $Data->query("UPDATE `{$this->table}` SET "
                . "`data`=" . "1+`data`" . ", "
                . "`stamp`=" . $Data->quote(date("Y-m-d H:i:s")) . ", "
                . "`browser`=" . $Data->quote($_SERVER['HTTP_USER_AGENT']) . ", "
                . "`delete`=" . $Data->quote(date("Y-m-d H:i:s", time() + 1000)) . ""
                . " WHERE `id`=" . $Data->quote($key)
                . ""
            );
        } else {
            $Data->query("INSERT INTO `{$this->table}` (`id`, `ip`, `data`, `stamp`, `login`, `browser`, `delete`) VALUES ("
                . $Data->quote($key) . ", "
                . $Data->quote($ip) . ", "
                . $Data->quote(1) . ", "
                . $Data->quote(date("Y-m-d H:i:s")) . ", "
                . $Data->quote($login) . ", "
                . $Data->quote($_SERVER['HTTP_USER_AGENT']) . ", "
                . $Data->quote(date("Y-m-d H:i:s"), time() + 1000) . ""
                . ")"
            );
        }
    }

uniq()

$Auth->uniq();

Генерация уникального идентификатора сессии

Возвращает: string

Исходный код
    function uniq() {
        $Data = $this->Data();
        do {
            $r = hash("sha256", uniqid(microtime(true) . $_SERVER['REMOTE_ADDR']));
        } while ($Data->getRow("SELECT `id` FROM `{$this->table}` WHERE `id`={$Data->quote($r)}"));
        return $r;
    }

generate()

$Auth->generate($length=8, $symbols='abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ123456789');

Генерация пароля

Параметры:

ИмяОписание
$length

int Длина пароля

$symbols

string Допустимые символы

Возвращает: string

Исходный код
    function generate($length = 8, $symbols = 'abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ123456789') {
        $symbolsLength = strlen($symbols);
        while (true) {
            $r = '';
            for ($i = 0; $i < $length; $i ++) {
                if (function_exists('random_int')) {
                    $index = random_int(0, $symbolsLength - 1);
                } else {
                    $index = mt_rand(0, $symbolsLength - 1);
                }
                $r .= $symbols[$index];
            }
            if (!preg_match('~[a-z]~', $r) && preg_match('~[a-z]~', $symbols)) {
                continue;
            }
            if (!preg_match('~[A-Z]~', $r) && preg_match('~[A-Z]~', $symbols)) {
                continue;
            }
            if (!preg_match('~[0-9]~', $r) && preg_match('~[0-9]~', $symbols)) {
                continue;
            }
            return $r;
        }
    }

encrypt()

$Auth->encrypt($login, $password);

Хеш пароля

Параметры:

ИмяОписание
$login

Логин

$password

Пароль

Возвращает: string

Исходный код
    function encrypt($login, $password) {
        return sha1("$login:$password:0.0.0.0");
    }

hash()

$Auth->hash($login, $password);
Исходный код
    function hash($login, $password) {
        return $this->encrypt($login, $password);
    }

encryptJoomla()

$Auth->encryptJoomla($password);

Хеш пароля Joomla!

Параметры:

ИмяОписание
$password

Пароль

Возвращает: string

Исходный код
    function encryptJoomla($password) {
        $salt = md5(uniqid(microtime()));
        return md5($password . $salt) . ":" . $salt;
    }

is()

$Auth->is($group);

Принадлежит ли пользователь к указанной группе

Параметры:

ИмяОписание
$group

Группа

Возвращает: true|false

Исходный код
    function is($group) {
        if (!strlen($group)) return !strlen($this->group);
        if (!strlen($this->group)) return !strlen($group);
        static $is = array();
        $group = mb_strtolower($group);
        if (isset($is[$group])) return $is[$group];
        foreach (explode('|', $this->group) as $_is) if (($_is = mb_strtolower(trim($_is))) !== '') if ($group === $_is) return $is[$group] = true;
        return $is[$group] = false;
    }

me()

$Auth->me();

Пользователь, который вошел в систему

Возвращает: Cms\Root\User |null

Исходный код
    function me() {
        $Main = $this->Main();
        if (!$this->login) return null;
        if ($User = $Main->load($this->login, "user")) {
            $User->open();
        } else {
            $User = $Main->load(array(
                "id" => $this->login,
                "password" => $this->password,
                "parent" => "user",
                "type" => "user",
                "title" => $this->title,
                "email" => $this->email,
                "group" => $this->group,
                "active" => $this->active ? "Y" : "",
            ));
        }
        return $User;
    }

session()

$Auth->session();

ID сессии

Возвращает: string

Исходный код
    function session() {
        return session_id();
    }

sessionStart()

$Auth->sessionStart();

Начало сессии и инициализация данных в $_SESSION.

Возвращает: null

Исходный код
    function sessionStart() {
        if (isset($_SESSION) && $_SESSION) return;
        $Data = $this->Data();
        if (isset($_COOKIE['session']) && $this->checkSession($_COOKIE['session'])) {
            $session = $_COOKIE['session'];
            # 2016-07-04
            # Не обновляем cookie, если запрошен несуществующий ресурс
            if ($_SERVER['REQUEST_METHOD'] == "GET" && !preg_match("~\.(jpe?g|png|gif|svg|css|js|php)(\?|$)~i", $_SERVER['REQUEST_URI']))
            if ($update = $Data->dLookup("SELECT `update` FROM `{$this->table}` WHERE `id`={$Data->quote($session)}")) {
                if ($update < date("Y-m-d H:i:s")) {
                    $_session = $this->uniq();
                    # $this->_log("session_id($session) -> session_id($_session)");
                    if ($Data->query("UPDATE `{$this->table}` SET `id`={$Data->quote($_session)}, `update`={$Data->quote(date('Y-m-d H:i:s', time() + $this->update_ttl))} WHERE `id`={$Data->quote($session)}"))
                    $session = $_session;
                }
            }
        } else {
            $session = $this->uniq();
        }
        ini_set("session.use_cookies", 0);
        ini_set("session.use_trans_sid", 0);
        session_id($session);
        session_name("session");
        session_module_name("files");
        session_cache_expire($this->session_ttl);
        session_cache_limiter(isset($this->session_cache) ? $this->session_cache : "nocache");
        session_set_save_handler(array($this, "sessionInit"), array($this, "sessionFini"), array($this, "sessionRead"), array($this, "sessionWrite"), array($this, "sessionDestroy"), array($this, "sessionClear"));
        session_start();
        # register_shutdown_function("session_write_close");
        $_SESSION['HTTP_USER_AGENT'] = $_SERVER['HTTP_USER_AGENT'];
        $this->sendCookie();
    }

sessionMerge()

$Auth->sessionMerge($session);

Объединение данных текущей сессии с указанной сессией

Параметры:

ИмяОписание
$session

ID сессии

Исходный код
    function sessionMerge($session) {
        # $this->_log("sessionMerge($session)");
        $old = array();
        foreach ($_SESSION as $k => $v) $old[$k] = $v;
        if ($data = $this->sessionRead($this->login)) {
            session_decode($data);
            foreach ($old as $k => $v) if (!$_SESSION[$k]) $_SESSION[$k] = $v;
        }
    }

sessionStore()

$Auth->sessionStore();

Сохранение данных без закрытия сессии

Исходный код
    function sessionStore() {
        if ($_SESSION) return $this->sessionWrite(session_id(), session_encode());
    }

sessionCommit()

$Auth->sessionCommit();

Сохранение данных и закрытие сессии

Исходный код
    function sessionCommit() {
        session_write_close();
    }

sessionClose()

$Auth->sessionClose();

Завершение сессии и сброс сессии в браузере

Исходный код
    function sessionClose() {
        session_destroy();
        $_SESSION = array();
        $this->sendCookie();
    }

sessionInit()

$Auth->sessionInit();

Обратный вызов Save Handler

Возвращает: true

Исходный код
    function sessionInit() {
        return true;
    }

sessionFini()

$Auth->sessionFini();

Обратный вызов Save Handler

Возвращает: true

Исходный код
    function sessionFini() {
        return true;
    }

sessionRead()

$Auth->sessionRead($session);

Обратный вызов Save Handler

Параметры:

ИмяОписание
$session

ID сессии

Возвращает: string

Исходный код
    function sessionRead($session) {
        # $this->_log("sessionRead($session)");
        $Data = $this->Data();
        if (!$row = $Data->getRow("SELECT * FROM `{$this->table}` WHERE `id`={$Data->quote($session)}")) return '';
        if (!isset($this->cache)) $this->cache = array();
        $this->cache[$session] = $row;
        if (!array_key_exists("login", $row)) {
            # Старая структура таблицы
            $this->upgradeTable();
        } elseif ($row['login'] && $row['login'] != $row['id'] && !$row['data']) {
            # Сессия для логина
            return $this->sessionRead($row['login']);
        }
        return isset($row['data']) ? $row['data'] : '';
    }

sessionWrite()

$Auth->sessionWrite($session, $data);

Обратный вызов Save Handler

Параметры:

ИмяОписание
$session

ID сессии

$data

данные сессии

Возвращает: true

Исходный код
    function sessionWrite($session, $data) {
        # $this->_log("sessionWrite($session)");
        # Функция вызвана в конце работы скрипта, когда объекты уже недоступны
        if (!$App = $this->App()) return false;
        if ($this->login && $this->login != $session) {
            # Сессия для логина
            $this->sessionWrite($this->login, $data);
            $data = "";
        }
        $time = time();
        $update = date("Y-m-d H:i:s", $time + $this->update_ttl);
        if (isset($this->cache)) if ($row = $this->cache[$session]) {
            if ($row['data'] === $data && $row['stamp'] > date("Y-m-d H:i:s", $time - $this->update_ttl)) {
                # $this->_log("...skip");
                return true;
            }
            if ($row['update']) $update = $row['update'];
        }
        $Conf = $this->Conf();
        $Data = $this->Data();
        $values = ""
            . $Data->quote($session) . ", "
            . $Data->quote($_SERVER['REMOTE_ADDR'] ? $_SERVER['REMOTE_ADDR'] : "0.0.0.0") . ", "
            . $Data->quote($data) . ", "
            . $Data->quote(date("Y-m-d H:i:s")) . ", "
            . $Data->quote($this->login) . ", "
            . $Data->quote($_SERVER['HTTP_USER_AGENT']) . ", "
            . $Data->quote($update) . ", "
            . $Data->quote(date("Y-m-d H:i:s", $time + ($this->login ? $this->remember_ttl : $this->session_ttl))) . ""
        ;
        if (substr($Conf->get("sql_database", "sqlite"), 0, 6) == "sqlite") {
            if ($Data->data instanceof \PDO) @$Data->data->beginTransaction();
            $Data->query("DELETE FROM `{$this->table}` WHERE `id`=" . $Data->quote($session));
            if (!$Data->query("INSERT INTO `{$this->table}` (`id`, `ip`, `data`, `stamp`, `login`, `browser`, `update`, `delete`) VALUES ($values)")) {
                if ($Data->data instanceof \PDO) @$Data->data->commit();
                $this->upgradeTable();
                if ($Data->data instanceof \PDO) @$Data->data->beginTransaction();
                $Data->query("INSERT INTO `{$this->table}` (`id`, `ip`, `data`, `stamp`, `login`, `browser`, `update`, `delete`) VALUES ($values)");
            }
            if ($Data->data instanceof \PDO) @$Data->data->commit();
        } else {
            if (!$Data->query("REPLACE INTO `{$this->table}` (`id`, `ip`, `data`, `stamp`, `login`, `browser`, `update`, `delete`) VALUES ($values)")) {
                $this->upgradeTable();
                $Data->query("REPLACE INTO `{$this->table}` (`id`, `ip`, `data`, `stamp`, `login`, `browser`, `update`, `delete`) VALUES ($values)");
            }
        }
        return true;
    }

sessionDestroy()

$Auth->sessionDestroy($session);

Обратный вызов Save Handler

Параметры:

ИмяОписание
$session

ID сессии

Возвращает: true

Исходный код
    function sessionDestroy($session) {
        # $this->_log("sessionDestroy($session)");
        $Data = $this->Data();
        $Data->query("DELETE FROM `{$this->table}` WHERE `id`=" . $Data->quote($session));
        return true;
    }

sessionClear()

$Auth->sessionClear();

Обратный вызов Save Handler

Возвращает: true

Исходный код
    function sessionClear() {
        # $this->_log("sessionClear()");
        $Data = $this->Data();
        $Data->query("DELETE FROM `{$this->table}` WHERE `delete`<>'0000-00-00 00:00:00' AND `delete`<" . $Data->quote(date("Y-m-d H:i:s")));
        return true;
    }

upgradeTable()

$Auth->upgradeTable();

Обновление структуры таблицы

Возвращает: null

Исходный код
    function upgradeTable() {
        static $upgradeTable;
        if ($upgradeTable) return;
        $upgradeTable = true;
        # $this->_log("upgradeTable()");
        $Conf = $this->Conf();
        $Data = $this->Data();
        if ($Data->query("SELECT * FROM `{$this->table}` WHERE `login`='' AND `browser`='' AND `update`='' AND `delete`=''")) return;
        if (substr($Conf->get("sql_database", "sqlite"), 0, 6) == "sqlite") {
            $varbinary = "varchar NOT NULL DEFAULT '' COLLATE BINARY";
            $datetime = "datetime NOT NULL DEFAULT '0000-00-00 00:00:00'";
        } else {
            $varbinary = "varbinary(255) NOT NULL DEFAULT ''";
            $datetime = "datetime NOT NULL DEFAULT '0000-00-00 00:00:00'";
        }
        $Data->query("ALTER TABLE `{$this->table}` ADD COLUMN `login` $varbinary");
        $Data->query("ALTER TABLE `{$this->table}` ADD COLUMN `browser` $varbinary");
        $Data->query("ALTER TABLE `{$this->table}` ADD COLUMN `update` $datetime");
        $Data->query("ALTER TABLE `{$this->table}` ADD COLUMN `delete` $datetime");
        $Data->query("DELETE FROM `{$this->table}` WHERE LENGTH(`id`)<64");
    }

_log()

$Auth->_log($data);

Запись отладочной информации в файл

Параметры:

ИмяОписание
$message

string сообщение

Исходный код
    function _log($data) {
        static $F;
        if (!$F) $F = @fopen($this->root() . '/cms/data/auth.log', 'a');
        if ($F) {
            $message = date("[Y-m-d H:i:s]") . " [{$_SERVER['REMOTE_ADDR']}] ";
            if (func_num_args() > 1) $data = func_get_args();
            if (is_scalar($data)) $message .= trim($data) . "\n";
            else $message .= trim(var_export($data, true)) . ";\n";
            fwrite($F, $message);
            fflush($F);
        }
    }

apiGetVars()

$Auth->apiGetVars($params);
Исходный код
    function apiGetVars($params) {
        if (isset($params['href']) && is_string($params['href'])) {
            if ($info = parse_url($params['href'])) {
                if (isset($info['query'])) {
                    parse_str($info['query'], $result);
                    if (is_array($result)) {
                        return $result;
                    }
                }
            }
        }
    }

apiCallForm()

$Auth->apiCallForm($params);
Исходный код
    function apiCallForm($params) {
        switch ($form = strval($params['form'])) {
            case 'enter':
            case 'login':
            case 'register':
            case 'register_code':
            case 'remind':
            case 'remind_code':
            case 'change_email':
            case 'change_email_code':
                break;
            default:
                return;
        }
        $Form = $this->Form();
        $document = $Form->loadDocument($form);
        $html = $Form->display($document, array( 'action' => '', 'id' => 'auth-' . $form . '-form' ));
        if ($form === 'register_code') {
            if (is_array($GET = $this->apiGetVars($params))) $_GET = $GET;
            $this->App()->init();
            $this->userCodeCleanup();
            $exception = new \Exception($this->getUserError('user_register_error', 'Срок действия ссылки истёк. Пожалуйста, повторите процедуру регистрации'));
            if (!isset($_GET['user']) || !isset($_GET['code']) || !is_string($_GET['user']) || !is_string($_GET['code'])) {
                throw $exception;
            }
            if (!$User = $this->userLoad($_GET['user'])) {
                throw $exception;
            }
            if (!$this->userCodeExists($User, 'register', $_GET['code'])) {
                throw $exception;
            }
            if (!$User->active) {
                $this->userActivate($User);
            }
            if (!isset($html)) {
                $this->sessionStart();
                $_SESSION['login'] = $User->id;
                $this->userCodeRemove($User, 'register');
                $html = true;
            }
        }
        if ($form === 'remind_code') {
            if (is_array($GET = $this->apiGetVars($params))) $_GET = $GET;
            $this->App()->init();
            $this->userCodeCleanup();
            $exception = new \Exception($this->getUserError('user_remind_error', 'Срок действия ссылки истёк. Пожалуйста, повторите процедуру восстановления пароля'));
            if (!isset($_GET['user']) || !isset($_GET['code']) || !is_string($_GET['user']) || !is_string($_GET['code'])) {
                throw $exception;
            }
            if (!$User = $this->userLoad($_GET['user'], true)) {
                throw $exception;
            }
            if (!$this->userCodeExists($User, 'remind', $_GET['code'])) {
                throw $exception;
            }
            if (!isset($html)) {
                $this->sessionStart();
                $_SESSION['login'] = $User->id;
                $this->userCodeRemove($User, 'remind');
                $html = true;
            }
        }
        if ($form === 'change_email_code') {
            if (is_array($GET = $this->apiGetVars($params))) $_GET = $GET;
            $this->App()->init();
            $this->userCodeCleanup();
            $exception = new \Exception($this->getUserError('user_change_email_error', 'Срок действия ссылки истёк. Пожалуйста, повторите процедуру изменения e-mail'));
            if (!isset($_GET['user']) || !isset($_GET['code']) || !is_string($_GET['user']) || !is_string($_GET['code'])) {
                throw $exception;
            }
            if (!$User = $this->userLoad($_GET['user'], true)) {
                throw $exception;
            }
            if (!$row = $this->userCodeExists($User, 'change_email', $_GET['code'])) {
                throw $exception;
            }
            if ($row['data'] && is_array($data = json_decode($row['data'], true)) && isset($data['email']) && $Form->checkEmail($email = $data['email'])) {
                $this->userChangeEmail($User, $email);
            }
            if (!isset($html)) {
                $this->sessionStart();
                $_SESSION['login'] = $User->id;
                $this->userCodeRemove($User, 'change_email');
                $html = true;
            }
        }
        return $html;
    }

apiCallLogin()

$Auth->apiCallLogin($params);
Исходный код
    function apiCallLogin($params) {
        if (is_array($params['data'])) $_POST = $params['data'];
        $this->App()->init();
        if ($this->login) return true;
        if ($this->error) throw $this->error;
    }

apiCallRegister()

$Auth->apiCallRegister($params);
Исходный код
    function apiCallRegister($params) {
        if (is_array($params['data'])) $_POST = $params['data'];
        $this->App()->init();
        $this->userCodeCleanup();
        if ($this->login) return true;
        $Data = $this->Data();
        $Main = $this->Main();
        $Form = $this->Form();
        $Email = $Main->Email();
        $Request = $Main->Request();
        $Modules = $Main->Modules();
        if (!$Modules->isModule('user')) $Modules->registerModule('user');
        $User = $Main->create('user');
        $User->page_url = $Main->href(isset($params['href']) && is_string($params['href']) ? '/' . $Request->getSelf($params['href']) : '-');
        $User->created = true;
        $User->active = '';
        $User->open();
        if (!strlen($User->id)) $User->id = $User->getDefaultId();
        $form = 'register';
        $document = $Form->load($form, $User);
        if (!$Form->store($document)) {
            if ($Form->error) {
                throw $Form->error;
            } else {
                throw new \Exception;
            }
        }
        if (strlen($User->email)) {
            if ($Data->getRow("SELECT * FROM `user` WHERE `email`={$Data->quote($User->email)}")) {
                throw new \Exception($this->getUserError('user_email_error', 'E-mail уже зарегистрирован'));
            }
        }
        if ($document && $document->fields && isset($document->fields['password']) && strlen($document->fields['password']->value)) {
            $User->password_text = $User->password;
            $User->password = $this->encrypt($User->id, $User->password);
            $this->logoutAll($User->id);
        }
        if (!$User->saveAll()) {
            throw $User->error;
        }
        if (!$this->userCodeRegister($User)) {
            if ($Data->error) {
                throw $Data->error;
            } else {
                throw new \Exception;
            }
        }
        $this->userNotifyRegister($User);
        return $this->getUserText($User, 'user_register_note', '<p class="notice">Инструкции для завершения регистрации отправлены на ваш e-mail</p>');
    }

apiCallRegisterCode()

$Auth->apiCallRegisterCode($params);
Исходный код
    function apiCallRegisterCode($params) {
        if (is_array($GET = $this->apiGetVars($params))) $_GET = $GET;
        if (is_array($params['data'])) $_POST = $params['data'];
        $this->App()->init();
        $this->userCodeCleanup();
        if ($this->login) return true;
        $Data = $this->Data();
        $Main = $this->Main();
        $Form = $this->Form();
        $Request = $Main->Request();
        $Modules = $Main->Modules();
        if (!$Modules->isModule('user')) $Modules->registerModule('user');
        $exception = new \Exception($this->getUserError('user_register_error', 'Срок действия ссылки истёк. Пожалуйста, повторите процедуру регистрации'));
        if (!isset($_GET['user']) || !isset($_GET['code']) || !is_string($_GET['user']) || !is_string($_GET['code'])) {
            throw $exception;
        }
        if (!$User = $this->userLoad($_GET['user'])) {
            throw $exception;
        }
        if (!$this->userCodeExists($User, 'register', $_GET['code'])) {
            throw $exception;
        }
        if (!$User->active) {
            $this->userActivate($User);
        }
        $User->open();
        $User->page_url = $Main->href(isset($params['href']) && is_string($params['href']) ? '/' . $Request->getSelf($params['href']) : '-');
        $form = 'register_code';
        $document = $Form->load($form, $User);
        if (!$Form->store($document)) {
            if ($Form->error) {
                throw $Form->error;
            } else {
                throw new \Exception;
            }
        }
        if ($document && $document->fields && isset($document->fields['password']) && strlen($document->fields['password']->value)) {
            $User->password_text = $User->password;
            $User->password = $this->encrypt($User->id, $User->password);
            $this->logoutAll($User->id);
        }
        if (!$User->saveAll()) {
            throw $User->error;
        }
        $this->userNotifyChangeProfile($User);
        $this->sessionStart();
        $_SESSION['login'] = $User->id;
        $this->userCodeRemove($User, 'register');
        return true;
    }

apiCallRemind()

$Auth->apiCallRemind($params);
Исходный код
    function apiCallRemind($params) {
        if (is_array($params['data'])) $_POST = $params['data'];
        $this->App()->init();
        $this->userCodeCleanup();
        if ($this->login) return true;
        $Data = $this->Data();
        $Main = $this->Main();
        $Form = $this->Form();
        $Request = $Main->Request();
        $Modules = $Main->Modules();
        if (!$Modules->isModule('user')) $Modules->registerModule('user');
        $user = array();
        $form = 'remind';
        $document = $Form->load($form, $user);
        if (!$Form->store($document)) {
            if ($Form->error) {
                throw $Form->error;
            } else {
                throw new \Exception;
            }
        }
        $login = null;
        foreach ($document->fields as $field) {
            if (strlen($login = strval($user[$field->name]))) break;
        }
        if (!$User = $this->userLoad($login, true)) {
            throw new \Exception($this->getUserError('user_error', 'Пользователь не найден'));
        }
        $User->open();
        $User->page_url = $Main->href(isset($params['href']) && is_string($params['href']) ? '/' . $Request->getSelf($params['href']) : '-');
        $User->remind_code = null;
        if ($row = $this->userCodeExists($User, 'remind')) if ($row['date'] > date('Y-m-d H:i:s', time() - $this->user_retry_ttl)) {
            $User->remind_code = $row['code'];
        }
        if (!isset($User->remind_code)) {
            if (!$this->userCodeRemind($User)) {
                if ($Data->error) {
                    throw $Data->error;
                } else {
                    throw new \Exception;
                }
            }
        }
        $this->userNotifyRemind($User);
        return $this->getUserText($User, 'user_remind_note', '<p class="notice">Инструкции для восстановления пароля отправлены на ваш e-mail</p>');
    }

apiCallRemindCode()

$Auth->apiCallRemindCode($params);
Исходный код
    function apiCallRemindCode($params) {
        if (is_array($GET = $this->apiGetVars($params))) $_GET = $GET;
        if (is_array($params['data'])) $_POST = $params['data'];
        $this->App()->init();
        $this->userCodeCleanup();
        if ($this->login) return true;
        $Data = $this->Data();
        $Main = $this->Main();
        $Form = $this->Form();
        $Request = $Main->Request();
        $Modules = $Main->Modules();
        if (!$Modules->isModule('user')) $Modules->registerModule('user');
        $exception = new \Exception($this->getUserError('user_remind_error', 'Срок действия ссылки истёк. Пожалуйста, повторите процедуру восстановления пароля'));
        if (!isset($_GET['user']) || !isset($_GET['code']) || !is_string($_GET['user']) || !is_string($_GET['code'])) {
            throw $exception;
        }
        if (!$User = $this->userLoad($_GET['user'], true)) {
            throw $exception;
        }
        if (!$this->userCodeExists($User, 'remind', $_GET['code'])) {
            throw $exception;
        }
        $User->open();
        $User->page_url = $Main->href(isset($params['href']) && is_string($params['href']) ? '/' . $Request->getSelf($params['href']) : '-');
        $form = 'remind_code';
        $document = $Form->load($form, $User);
        if (!$Form->store($document)) {
            if ($Form->error) {
                throw $Form->error;
            } else {
                throw new \Exception;
            }
        }
        if ($document && $document->fields && isset($document->fields['password']) && strlen($document->fields['password']->value)) {
            $User->password_text = $User->password;
            $User->password = $this->encrypt($User->id, $User->password);
            $this->logoutAll($User->id);
        }
        if (!$User->saveAll()) {
            throw $User->error;
        }
        $this->userNotifyChangePassword($User);
        $this->sessionStart();
        $_SESSION['login'] = $User->id;
        $this->userCodeRemove($User, 'remind');
        return true;
    }

apiCallChangeEmail()

$Auth->apiCallChangeEmail($params);
Исходный код
    function apiCallChangeEmail($params) {
        if (is_array($params['data'])) $_POST = $params['data'];
        $this->App()->init();
        $this->userCodeCleanup();
        if (!$this->login) return;
        $Data = $this->Data();
        $Main = $this->Main();
        $Form = $this->Form();
        $Request = $Main->Request();
        $Modules = $Main->Modules();
        if (!$Modules->isModule('user')) $Modules->registerModule('user');
        if (!$User = $this->me()) {
            throw new \Exception($this->getUserError('user_error', 'Пользователь не найден'));
        }
        $User->open();
        $User->page_url = $Main->href(isset($params['href']) && is_string($params['href']) ? '/' . $Request->getSelf($params['href']) : '-');
        if (!isset($_POST['email']) || !is_string($_POST['email']) || !$Form->checkEmail($email = mb_strtolower($_POST['email']))) {
            throw new \Exception($this->getUserError('user_email_error', 'Некорректное значение для поля «E-mail»'));
        }
        if (!$this->userCodeChangeEmail($User, $email)) {
            if ($Data->error) {
                throw $Data->error;
            } else {
                throw new \Exception;
            }
        }
        $this->userNotifyChangeEmail($User, $email);
        return $this->getUserText($User, 'user_change_email_note', '<p class="notice">Инструкции по изменению e-mail отправлены на новый e-mail</p>');
    }

apiCallChangeEmailCode()

$Auth->apiCallChangeEmailCode($params);
Исходный код
    function apiCallChangeEmailCode($params) {
        if (is_array($GET = $this->apiGetVars($params))) $_GET = $GET;
        if (is_array($params['data'])) $_POST = $params['data'];
        $this->App()->init();
        $this->userCodeCleanup();
        $Data = $this->Data();
        $Main = $this->Main();
        $Form = $this->Form();
        $Request = $Main->Request();
        $Modules = $Main->Modules();
        if (!$Modules->isModule('user')) $Modules->registerModule('user');
        $exception = new \Exception($this->getUserError('user_change_email_error', 'Срок действия ссылки истёк. Пожалуйста, повторите процедуру изменения e-mail'));
        if (!isset($_GET['user']) || !isset($_GET['code']) || !is_string($_GET['user']) || !is_string($_GET['code'])) {
            throw $exception;
        }
        if (!$User = $this->userLoad($_GET['user'], true)) {
            throw $exception;
        }
        if (!$row = $this->userCodeExists($User, 'change_email', $_GET['code'])) {
            throw $exception;
        }
        $User->open();
        $User->page_url = $Main->href(isset($params['href']) && is_string($params['href']) ? '/' . $Request->getSelf($params['href']) : '-');
        if ($row['data'] && is_array($data = json_decode($row['data'], true)) && isset($data['email']) && $Form->checkEmail($email = $data['email'])) {
            $this->userChangeEmail($User, $email);
        }
        $this->sessionStart();
        $_SESSION['login'] = $User->id;
        $this->userCodeRemove($User, 'change_email');
        return true;
    }

userLoad()

$Auth->userLoad($login, $active=null);
Исходный код
    function userLoad($login, $active = null) {
        if ($row = $this->getUserRow(strval($login))) {
            if ($active) {
                if (!$this->checkActive($row)) {
                    throw $this->error;
                }
            }
            $Data = $this->Data();
            $Main = $this->Main();
            if ($row = $Data->getRow("SELECT * FROM `user` WHERE `id`={$Data->quote($row['login'])} LIMIT 1")) {
                return $Main->load($row);
            }
        }
    }

getUserText()

$Auth->getUserText($User, $key, $default='');
Исходный код
    function getUserText($User, $key, $default = '') {
        $Conf = $this->Conf();
        $Main = $this->Main();
        $Request = $Main->Request();
        $text = $Conf->get($key);
        if (!strlen($text)) $text = $default;
        if (!isset($User->login)) {
            $User->login = basename($User->id);
        }
        if (!isset($User->site)) {
            if (!$User->site = $Conf->get('site')) $User->site = $Request->stripWww($Request->getHost());
        }
        if (!isset($User->host)) {
            if (!$User->host = $Conf->get('host')) $User->host = $Request->getHost();
        }
        if (!isset($User->base_url)) {
            $User->base_url = rtrim($Request->absoluteUrl('/'), '/');
        }
        return preg_replace_callback('~{\\$([^{}]+)}~s', function($m) use ($User) {
            return $User->get($m[1]);
        }, $text);
    }

getUserError()

$Auth->getUserError($key, $default='');
Исходный код
    function getUserError($key, $default = '') {
        $Conf = $this->Conf();
        $error = $Conf->get($key);
        if (!strlen($error)) $error = $default;
        return $error;
    }

userCodeAdd()

$Auth->userCodeAdd($User, $key, $code=null, $date=null, $till=null, $data=null);
Исходный код
    function userCodeAdd($User, $key, $code = null, $date = null, $till = null, $data = null) {
        $Data = $this->Data();
        if (!isset($code)) $code = $this->generate();
        if (!isset($date)) $date = date('Y-m-d H:i:s');
        if (!isset($till)) $till = date('Y-m-d H:i:s', time() + $this->user_code_ttl);
        if (isset($data) && !is_scalar($data)) $data = json_encode($data);
        return $Data->query("INSERT INTO `user_code` (`id`, `key`, `code`, `date`, `till`, `data`) VALUES ("
            . $Data->quote($User->id) . ", "
            . $Data->quote($key) . ", "
            . $Data->quote($code) . ", "
            . $Data->quote($date) . ", "
            . $Data->quote($till) . ", "
            . (isset($data) ? $Data->quote($data) : "NULL")
            . ")"
        );
    }

userCodeRegister()

$Auth->userCodeRegister($User);
Исходный код
    function userCodeRegister($User) {
        $key = 'register';
        $code = $this->generate();
        $User->{$key . '_code'} = $code;
        return $this->userCodeAdd($User, $key, $code);
    }

userCodeRemind()

$Auth->userCodeRemind($User);
Исходный код
    function userCodeRemind($User) {
        $key = 'remind';
        $code = $this->generate();
        $User->{$key . '_code'} = $code;
        return $this->userCodeAdd($User, $key, $code);
    }

userCodeChangeEmail()

$Auth->userCodeChangeEmail($User, $email);
Исходный код
    function userCodeChangeEmail($User, $email) {
        $key = 'change_email';
        $code = $this->generate();
        $User->{$key . '_code'} = $code;
        return $this->userCodeAdd($User, $key, $code, null, null, array( 'email' => $email ));
    }

userCodeExists()

$Auth->userCodeExists($User, $key, $code=null);
Исходный код
    function userCodeExists($User, $key, $code = null) {
        $Data = $this->Data();
        $till = date('Y-m-d H:i:s');
        return $Data->getRow("SELECT * FROM `user_code` WHERE `id`={$Data->quote($User->id)} AND `key`={$Data->quote($key)} AND `till`>='$till'" . (isset($code) ? " AND `code`={$Data->quote($code)}" : "") . " ORDER BY `date` DESC LIMIT 1");
    }

userCodeRemove()

$Auth->userCodeRemove($User, $key);
Исходный код
    function userCodeRemove($User, $key) {
        $Data = $this->Data();
        $Data->query("DELETE FROM `user_code` WHERE `id`={$Data->quote($User->id)} AND `key`={$Data->quote($key)}");
    }

userCodeCleanup()

$Auth->userCodeCleanup();
Исходный код
    function userCodeCleanup() {
        $Data = $this->Data();
        $Main = $this->Main();
        $date = date('Y-m-d H:i:s');
        foreach ($Data->getRows("SELECT `id`, MAX(`till`) `till` FROM `user_code` WHERE `key`='register' GROUP BY `id` HAVING `till`<'$date'") as $row) {
            if ($User = $Main->load($row['id'], 'user')) {
                if (!$User->active) {
                    $User->delete();
                }
            }
        }
        $Data->query("DELETE FROM `user_code` WHERE `till`<'$date'");
    }

userActivate()

$Auth->userActivate($User);
Исходный код
    function userActivate($User) {
        $Auth = $this;
        $Data = $this->Data();
        $Main = $this->Main();
        $Email = $Main->Email();
        $User->active = 'Y';
        if (!$Data->query("UPDATE `user` SET `active`={$Data->quote($User->active)} WHERE `id`={$Data->quote($User->id)}")) return;
        $Auth->userNotifyConfirm($User);
        return true;
    }

userChangeEmail()

$Auth->userChangeEmail($User, $email);
Исходный код
    function userChangeEmail($User, $email) {
        $Auth = $this;
        $Data = $this->Data();
        $User->email = $email;
        if (!$Data->query("UPDATE `user` SET `email`={$Data->quote($User->email)} WHERE `id`={$Data->quote($User->id)}")) return;
        $Auth->userNotifyChangeProfile($User);
        return true;
    }

userChangePassword()

$Auth->userChangePassword($User, $password);
Исходный код
    function userChangePassword($User, $password) {
        $Auth = $this;
        $Data = $this->Data();
        $User->password_text = $password;
        $User->password = $Auth->encrypt($User->id, $password);
        $Auth->logoutAll($User->id);
        if (!$Data->query("UPDATE `user` SET `password`={$Data->quote($User->password)} WHERE `id`={$Data->quote($User->id)}")) return;
        $Auth->userNotifyChangePassword($User);
        return true;
    }

userChangeProfile()

$Auth->userChangeProfile($User);
Исходный код
    function userChangeProfile($User) {
        $Auth = $this;
        $Auth->userNotifyChangeProfile($User);
        return true;
    }

userNotifyConfirm()

$Auth->userNotifyConfirm($User);
Исходный код
    function userNotifyConfirm($User) {
        $Auth = $this;
        $Main = $this->Main();
        $Email = $Main->Email();
        if ($User->email_html = $Auth->getUserText($User, 'user_confirm_mail', ''
            . '<p>Вы зарегистрированы на сайте «<a href="{$base_url}" target="_blank">{$site}</a>».</p>' . "\n"
            . '<p>Ваш адрес e-mail успешно подтвержден.' . "\n"
        )) {
            $User->email_subject = $Auth->getUserText($User, 'user_confirm_subject', 'Учетная запись на сайте {$site}');
            $Email->compose($User->id, $User, 'any');
        }
    }

userNotifyRegister()

$Auth->userNotifyRegister($User);
Исходный код
    function userNotifyRegister($User) {
        $Auth = $this;
        $Main = $this->Main();
        $Email = $Main->Email();
        if ($User->email_html = $Auth->getUserText($User, 'user_register_mail', ''
            . '<p>Вы зарегистрированы на сайте «<a href="{$base_url}" target="_blank">{$site}</a>».</p>' . "\n"
            . '<p>Для завершения регистрации, пожалуйста, перейдите по ссылке:<br>'
            . '<a href="{$base_url}{$page_url}?user={$login}&code={$register_code}#register_code" target="_blank">{$base_url}{$page_url}?user={$login}&code={$register_code}#register_code</a>'
            . '</p>' . "\n"
            . '<p>Ссылка для завершения регистрации действительна в течение суток.</p>' . "\n"
            . '<p>Если регистрировались не вы, то просто проигнорируйте данное сообщение.</p>' . "\n"
        )) {
            $User->email_subject = $Auth->getUserText($User, 'user_register_subject', 'Регистрация на сайте {$site}');
            $Email->compose($User->id, $User, 'any');
        }
    }

userNotifyRemind()

$Auth->userNotifyRemind($User);
Исходный код
    function userNotifyRemind($User) {
        $Auth = $this;
        $Main = $this->Main();
        $Email = $Main->Email();
        if ($User->email_html = $Auth->getUserText($User, 'user_remind_mail', ''
            . '<p>Вы запросили восстановление пароля на сайте «<a href="{$base_url}" target="_blank">{$site}</a>».</p>' . "\n"
            . '<p>Для восстановления пароля, пожалуйста, перейдите по ссылке:<br>'
            . '<a href="{$base_url}{$page_url}?user={$login}&code={$remind_code}#remind_code" target="_blank">{$base_url}{$page_url}?user={$login}&code={$remind_code}#remind_code</a>'
            . '</p>' . "\n"
            . '<p>Ссылка для восстановления пароля действительна в течение суток.</p>' . "\n"
            . '<p>Если вы не запрашивали восстановление пароля, то просто проигнорируйте данное сообщение.</p>' . "\n"
        )) {
            $User->email_subject = $Auth->getUserText($User, 'user_remind_subject', 'Восстановление пароля на сайте {$site}');
            $Email->compose($User->id, $User, 'any');
        }
    }

userNotifyChangeEmail()

$Auth->userNotifyChangeEmail($User, $email);
Исходный код
    function userNotifyChangeEmail($User, $email) {
        $Auth = $this;
        $Main = $this->Main();
        $Email = $Main->Email();
        if ($User->email_html = $Auth->getUserText($User, 'user_change_email_mail', ''
            . '<p>Вы запросили изменение e-mail на сайте «<a href="{$base_url}" target="_blank">{$site}</a>».</p>' . "\n"
            . '<p>Для изменения e-mail, пожалуйста, перейдите по ссылке:<br>'
            . '<a href="{$base_url}{$page_url}?user={$login}&code={$change_email_code}#change_email_code" target="_blank">{$base_url}{$page_url}?user={$login}&code={$change_email_code}#change_email_code</a>'
            . '</p>' . "\n"
            . '<p>Ссылка для изменения e-mail действительна в течение суток.</p>' . "\n"
            . '<p>Если e-mail изменили не вы, то, пожалуйста, проверьте безопасность своего e-mail и самостоятельно измените пароль.</p>' . "\n"
        )) {
            $User->email_subject = $Auth->getUserText($User, 'user_change_email_subject', 'Изменение e-mail на сайте {$site}');
            $Email->compose($email, $User, 'any');
        }
    }

userNotifyChangeProfile()

$Auth->userNotifyChangeProfile($User);
Исходный код
    function userNotifyChangeProfile($User) {
        $Auth = $this;
        $Main = $this->Main();
        $Email = $Main->Email();
        if ($User->email_html = $Auth->getUserText($User, 'user_profile_mail', ''
            . '<p>Вы изменили свой профиль на сайте «<a href="{$base_url}" target="_blank">{$site}</a>».</p>' . "\n"
            . '<p>Если профиль изменили не вы, то, пожалуйста, самостоятельно измените пароль.</p>' . "\n"
        )) {
            $User->email_subject = $Auth->getUserText($User, 'user_profile_subject', 'Изменение профиля на сайте {$site}');
            $Email->compose($User->id, $User, 'any');
        }
    }

userNotifyChangePassword()

$Auth->userNotifyChangePassword($User);
Исходный код
    function userNotifyChangePassword($User) {
        $Auth = $this;
        $Main = $this->Main();
        $Email = $Main->Email();
        if ($User->email_html = $Auth->getUserText($User, 'user_change_password_mail', ''
            . '<p>Вы изменили пароль на сайте «<a href="{$base_url}" target="_blank">{$site}</a>».</p>' . "\n"
            . '<p>Если пароль изменили не вы, то, пожалуйста, проверьте безопасность своего e-mail и самостоятельно измените пароль.</p>' . "\n"
        )) {
            $User->email_subject = $Auth->getUserText($User, 'user_change_password_subject', 'Изменение пароля на сайте {$site}');
            $Email->compose($User->id, $User, 'any');
        }
    }