Класс Auth
Объект $Auth:
Объект для работы с аутентификацией пользователя
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 |
аутентифицирован ли пользователь.
|
Возвращает: 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 |
|
$symbols |
|
Возвращает: 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 |
|
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');
}
}