Merge branch 'master' into noglob

This commit is contained in:
origami11@yandex.ru 2022-11-18 16:07:32 +03:00
commit 7d35a8f3f0
27 changed files with 430 additions and 288 deletions

View file

@ -3,36 +3,41 @@
/**
* Фильтр для проверки авторизации
*
* action: login(password, login)
* action: login(password, login)
* action: logout()
*/
// В класс авторизации передавать обьект для управления пользователем
// В класс авторизации передавать обьект для управления пользователем
// Вынести в отдельный файл
namespace ctiso\Filter;
use ctiso\Filter\Filter,
ctiso\HttpRequest,
ctiso\Settings,
ctiso\Registry,
ctiso\Database,
ctiso\Role\User,
ctiso\Collection;
ctiso\Collection,
ctiso\Path;
class Login extends Filter
{
const SESSION_BROWSER_SIGN_SECRET = '@w3dsju45Msk#';
const SESSION_BROWSER_SIGN_KEYNAME = 'session.app.browser.sign';
const AUTH_MAX_ATTEMPT = 10;
const AUTH_LAST_ATTEMPT_TIMER = 600;
public $mode = 'ajax';
public $user;
public $role/*: User*/;
public $whitelist;
public $role;
public $config;
function __construct($processor, $role, $whitelist = []) {
function __construct($processor, User $role, Registry $config) {
parent::__construct($processor);
$this->role = $role;
$this->whitelist = $whitelist;
$this->config = $config;
}
/**
* Проверка авторизации
* @param HttpRequest $request
* @return Boolean Авторизовани пользователь или нет
*/
public function isLoggin(HttpRequest $request)
@ -41,27 +46,56 @@ class Login extends Filter
session_start();
switch ($request->getAction()) {
// Авторизация по постоянному паролю
case 'login':
$login = $request->get('login');
case 'login':
$login = $request->get('login');
$password = $request->get('password');
$result = $this->role->getUserByLogin($login); // Поиск по логину
if ($result) {
$userPassword = $this->role->getUserPassword($result);
if ($this->role->access == 'site_root' && defined('PARENT_PATH')) {
$s = new Settings(PARENT_PATH . '/settings.json');
$s->read();
$dsn = $s->readKey(array('system', 'dsn'));
$db = Database::getConnection($dsn);
$user = $db->fetchOneArray("SELECT * FROM users WHERE login = :login", ['login' => $login]);
$userPassword = $user['password'];
} /*else if (time() - $result->getInt('lastupdate') > 60*60*24*60) {
// Проверить давность пароля, 60 дней
$request->set('error', true);
$request->set('lastupdate', true);
return false;
}*/
// Проверка на количества попыток авторизации
$lastAttempt = $result;
if ($lastAttempt->get('trie_count') >= self::AUTH_MAX_ATTEMPT /*&& time() - $lastAttempt['trie_time'] < self::AUTH_LAST_ATTEMPT_TIMER*/) {
if (time() - $lastAttempt->get('trie_time') < self::AUTH_LAST_ATTEMPT_TIMER) {
$request->set('timeout_error', true);
break;
} else {
$this->role->resetTries($request->get('login'));
}
}
// Извлечнеие пользователя из родительской CMS, для проверки пароля
if (md5($password) == $userPassword) { // password
$this->enter($result);
return true;
}
} else {
// Обновление количества неудачных попыток входа
$this->role->updateTries($login);
}
}
$request->set('error', true);
break;
case 'logout': // Выход
session_destroy();
break;
// Вход по временному паролю
// Вход по временному паролю, не используется
/*
case 'enter':
$login = $request->get('login');
$login = $request->get('login');
$password = $request->get('sid');
$result = $this->role->getUserByLogin($login); // Поиск по логину
if ($result) {
@ -69,9 +103,10 @@ class Login extends Filter
if ($password == $temp) {
$this->enter($result);
return true;
}
}
}
break;
*/
default:
$hash = $this->getBrowserSign();
// Если $hash не совпадает $_SESSION['hash'] то удаляем сессию
@ -107,9 +142,9 @@ class Login extends Filter
$random = rand(0, 1024 * 1024);
$this->role->setSID($random, $result);
// $_SESSION["group"] = $result->getInt('access');
$_SESSION["access"] = $result->getInt('id_user');
$_SESSION["random"] = $random;
$_SESSION["group"] = $result->getInt('access');
$_SESSION["access"] = $result->getInt('id_user'); // id_user
$_SESSION["random"] = $random; // id_user
$_SESSION[self::SESSION_BROWSER_SIGN_KEYNAME] = $this->getBrowserSign();
$_SESSION["time"] = time();
}
@ -133,15 +168,15 @@ class Login extends Filter
if ($logged) {
return json_encode(array('result' => 'ok', 'message' => "Авторизация успешна"));
} else {
return json_encode(array('result' => 'fail', 'message' => "Неправильное имя пользователя или пароль"));
return json_encode(array('result' => 'fail', 'message' => "Неправильное имя пользователя или пароль"));
}
}
if (!$logged) {
// Параметры при неправильной авторизации
// Действия по умолчанию !! Возможно переход на форму регистрации
// Действия по умолчанию !! Возможно переход на форму регистрации
if ($request->get('mode') == 'ajax') {
if (!$this->requestIsWhite($request, $this->whitelist)) {
if (!$this->requestIsWhite($request)) {
return json_encode(array('result' => 'fail', 'message' =>"NOT_AUTHORIZED"));
}
} else {
@ -159,15 +194,20 @@ class Login extends Filter
$text = $this->processor->execute($request);
return $text;
}
/* ---------------------
* Проверка на попадание реквеста в белый список
*/
public function requestIsWhite(HttpRequest $request, $whiteRequestList){
public function requestIsWhite(Collection $request) {
$module = $request->get('module');
$action = $request->get('action');
foreach ($whiteRequestList as $whiteRequest) {
if ($module == $whiteRequest['module'] && $action == $whiteRequest['action']) {
$moduleDir = explode('_',$module)[0];
$file = Path::join($this->config->get('system', 'path'), 'modules', $moduleDir, 'filters', 'white.json');
if (file_exists($file)) {
$whiteList = json_decode(file_get_contents($file), true);
if (in_array($action, $whiteList)) {
return true;
}
}
@ -175,4 +215,3 @@ class Login extends Filter
return false;
}
}