114 lines
3.5 KiB
PHP
114 lines
3.5 KiB
PHP
<?php
|
|
|
|
namespace ctiso\Role;
|
|
|
|
use ctiso\Database;
|
|
use ctiso\Database\Statement;
|
|
use ctiso\Database\PDOStatement;
|
|
|
|
// Класс должен быть в библиотеке приложения
|
|
class User implements UserInterface
|
|
{
|
|
const LIFE_TIME = 1800; // = 30min * 60sec;
|
|
|
|
public string $fullname;
|
|
public string $name;
|
|
/** @var string */
|
|
public $access;
|
|
public string $password;
|
|
/** @var int */
|
|
public $id;
|
|
public Database $db;
|
|
public array $groups;
|
|
|
|
function __construct(Database $db, array $groups) {
|
|
$this->db = $db;
|
|
$this->groups = $groups;
|
|
}
|
|
|
|
public function setDB(Database $db) {
|
|
$this->db = $db;
|
|
}
|
|
|
|
public function getName(): string {
|
|
return $this->name;
|
|
}
|
|
|
|
/**
|
|
* @return bool
|
|
*/
|
|
function isLogged() {
|
|
return \ctiso\Filter\Authorization::isLogged();
|
|
}
|
|
|
|
public function getUserByQuery(Statement $stmt): ?PDOStatement
|
|
{
|
|
$result = $stmt->executeQuery();
|
|
if ($result->next()) {
|
|
$this->access = $this->groups[$result->getString('access')];
|
|
$this->name = $result->getString('login');
|
|
$this->id = $result->getInt('id_user');
|
|
$this->password = $result->getString('password');
|
|
$this->fullname = implode(' ', [
|
|
$result->getString('surname'),
|
|
$result->getString('firstname'),
|
|
$result->getString('patronymic')]);
|
|
return $result;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* @param PDOStatement $result
|
|
* @return string
|
|
*/
|
|
function getUserPassword($result) {
|
|
return $result->get('password');
|
|
}
|
|
|
|
public function getUserByLogin(string $login): ?PDOStatement
|
|
{
|
|
$stmt = $this->db->prepareStatement("SELECT * FROM users WHERE login = ?");
|
|
$stmt->setString(1, $login);
|
|
$result = $this->getUserByQuery($stmt);
|
|
if ($result) {
|
|
$time = time();
|
|
$id = $this->id;
|
|
$this->db->executeQuery("UPDATE users SET lasttime = $time WHERE id_user = $id"); // Время входа
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
public function getUserById(int $id): ?PDOStatement
|
|
{
|
|
$stmt = $this->db->prepareStatement("SELECT * FROM users WHERE id_user = ?");
|
|
$stmt->setInt(1, $_SESSION ['access']);
|
|
$result = $this->getUserByQuery($stmt);
|
|
if ($result) {
|
|
$lasttime = $result->getInt('lasttime');
|
|
$time = time();
|
|
if ($time - $lasttime > self::LIFE_TIME) return null; // Вышло время сессии
|
|
$id = $this->id;
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
function setSID(string $random, $result) {
|
|
return $this->db->executeQuery("UPDATE users SET sid = '$random', trie_count = 0 WHERE id_user = " . $result->getInt('id_user'));
|
|
}
|
|
|
|
function resetTries(string $login): void {
|
|
$this->db->executeQuery(
|
|
"UPDATE users SET trie_count = :count WHERE login = :login",
|
|
['count' => 0, 'login' => $login]
|
|
);
|
|
}
|
|
|
|
function updateTries(string $login): void {
|
|
$user = $this->db->fetchOneArray("SELECT id_user, trie_count FROM users WHERE login = :login", ['login' => $login]);
|
|
$this->db->executeQuery(
|
|
"UPDATE users SET trie_time = :cur_time, trie_count = :count WHERE id_user = :id_user",
|
|
['cur_time' => time(), 'count' => $user['trie_count']+1, 'id_user' => $user['id_user']]
|
|
);
|
|
}
|
|
}
|