начало работы над сессиями и там дохуя чего ещё
This commit is contained in:
parent
ed5756d065
commit
b2a78519e4
|
@ -5,8 +5,7 @@
|
|||
"keywords": [
|
||||
"site",
|
||||
"api",
|
||||
"authentication",
|
||||
"auth"
|
||||
"authentication"
|
||||
],
|
||||
"type": "site",
|
||||
"homepage": "https://git.mirzaev.sexy/mirzaev/site-account",
|
||||
|
@ -31,8 +30,8 @@
|
|||
}
|
||||
],
|
||||
"require": {
|
||||
"php": "~8.1",
|
||||
"ext-sodium": "~8.1",
|
||||
"php": "~8.2",
|
||||
"ext-sodium": "~8.2",
|
||||
"mirzaev/minimal": "^2.0.x-dev",
|
||||
"mirzaev/accounts": "~1.2.x-dev",
|
||||
"mirzaev/arangodb": "^1.0.0",
|
||||
|
|
|
@ -61,7 +61,7 @@ class core extends controller
|
|||
$expires = time() + 604800;
|
||||
|
||||
// Инициализация сессии (без журналирования)
|
||||
$this->variables['session'] = session::initialization($_COOKIE["session"] ?? null, $expires) ?? header('Location: https://mirzaev.sexy/error?code=500&text=Не+удалось+инициализировать+сессию');
|
||||
$this->variables['session'] = new session($_COOKIE["session"] ?? null, $expires) ?? header('Location: https://mirzaev.sexy/error?code=500&text=Не+удалось+инициализировать+сессию');
|
||||
|
||||
if ($_COOKIE["session"] ?? null !== $this->variables['session']->hash) {
|
||||
// Изменился хеш сессии (подразумевается, что сессия устарела)
|
||||
|
@ -78,7 +78,7 @@ class core extends controller
|
|||
}
|
||||
|
||||
// Инициализация аккаунта (без журналирования)
|
||||
$this->variables['account'] = session::account($this->variables['session']);
|
||||
$this->variables['account'] = $this->variables['session']->account();
|
||||
|
||||
if ($this->variables['account'] instanceof _document) {
|
||||
// Инициализирован аккаунт
|
||||
|
|
|
@ -39,9 +39,7 @@ final class index_controller extends core
|
|||
];
|
||||
|
||||
// Инициализация аттрибутов бегущей строки
|
||||
$this->variables['hotline']['attributes'] = [
|
||||
|
||||
];
|
||||
$this->variables['hotline']['attributes'] = [];
|
||||
|
||||
// Инициализация элементов бегущей строки
|
||||
$this->variables['hotline']['elements'] = [
|
||||
|
@ -71,13 +69,10 @@ final class index_controller extends core
|
|||
];
|
||||
|
||||
// Инициализация аттрибутов бегущей строки
|
||||
$this->variables['graph']['attributes'] = [
|
||||
|
||||
];
|
||||
$this->variables['graph']['attributes'] = [];
|
||||
|
||||
// Инициализация элементов бегущей строки
|
||||
$this->variables['graph']['elements'] = [
|
||||
];
|
||||
$this->variables['graph']['elements'] = [];
|
||||
|
||||
// Генерация представления
|
||||
return $this->view->render(DIRECTORY_SEPARATOR . 'index.html', $this->variables);
|
||||
|
|
|
@ -31,15 +31,22 @@ final class session_model extends core
|
|||
public const COLLECTION = 'session';
|
||||
|
||||
/**
|
||||
* Инициализация
|
||||
* Данные сессии из базы данных
|
||||
*/
|
||||
public _document $document;
|
||||
|
||||
/**
|
||||
* Конструктор
|
||||
*
|
||||
* Инициализация сессии и запись в свойство $this->document
|
||||
*
|
||||
* @param ?string $hash Хеш сессии в базе данных
|
||||
* @param ?int $expires Дата окончания работы сессии (используется при создании новой сессии)
|
||||
* @param array &$errors Журнал ошибок
|
||||
*
|
||||
* @return ?_document Инстанция сессии, если удалось найти или создать
|
||||
* @return static Инстанция сессии
|
||||
*/
|
||||
public static function initialization(?string $hash = null, ?int $expires = null, array &$errors = []): ?_document
|
||||
public function __construct(?string $hash = null, ?int $expires = null, array &$errors = [])
|
||||
{
|
||||
try {
|
||||
if (collection::init(static::$db->session, self::COLLECTION)) {
|
||||
|
@ -56,8 +63,8 @@ final class session_model extends core
|
|||
))) {
|
||||
// Найдена сессия по хешу
|
||||
|
||||
// Возврат сессии
|
||||
return $session;
|
||||
// Запись в свойство
|
||||
$this->document = $session;
|
||||
} else if ($session = collection::search(static::$db->session, sprintf(
|
||||
<<<AQL
|
||||
FOR d IN %s
|
||||
|
@ -70,8 +77,8 @@ final class session_model extends core
|
|||
))) {
|
||||
// Найдена сессия по данным пользователя
|
||||
|
||||
// Возврат сессии
|
||||
return $session;
|
||||
// Запись в свойство
|
||||
$this->document = $session;
|
||||
} else {
|
||||
// Не найдена сессия
|
||||
|
||||
|
@ -98,7 +105,8 @@ final class session_model extends core
|
|||
if (document::update(static::$db->session, $session)) {
|
||||
// Записано обновление
|
||||
|
||||
return $session;
|
||||
// Запись в свойство
|
||||
$this->document = $session;
|
||||
} else throw new exception('Не удалось записать данные сессии');
|
||||
} else throw new exception('Не удалось создать или найти созданную сессию');
|
||||
}
|
||||
|
@ -112,20 +120,17 @@ final class session_model extends core
|
|||
'stack' => $e->getTrace()
|
||||
];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Связь сессии с аккаунтом
|
||||
*
|
||||
* @param _document $session Инстанция сессии
|
||||
* @param _document $account Инстанция аккаунта
|
||||
* @param array &$errors Журнал ошибок
|
||||
*
|
||||
* @return bool Статус выполнения
|
||||
*/
|
||||
public static function connect(_document $session, _document $account, array &$errors = []): bool
|
||||
public function connect(_document $account, array &$errors = []): bool
|
||||
{
|
||||
try {
|
||||
if (
|
||||
|
@ -136,7 +141,7 @@ final class session_model extends core
|
|||
// Инициализирована коллекция
|
||||
|
||||
if (document::write(static::$db->session, self::COLLECTION . '_edge_' . account::COLLECTION, [
|
||||
'_from' => $session->getId(),
|
||||
'_from' => $this->document->getId(),
|
||||
'_to' => $account->getId()
|
||||
])) {
|
||||
// Создано ребро: session -> account
|
||||
|
@ -160,12 +165,11 @@ final class session_model extends core
|
|||
/**
|
||||
* Поиск связанного аккаунта
|
||||
*
|
||||
* @param _document $session Инстанция сессии
|
||||
* @param array &$errors Журнал ошибок
|
||||
*
|
||||
* @return ?_document Инстанция аккаунта, если удалось найти
|
||||
*/
|
||||
public static function account(_document $session, array &$errors = []): ?_document
|
||||
public function account(array &$errors = []): ?_document
|
||||
{
|
||||
try {
|
||||
if (
|
||||
|
@ -191,7 +195,7 @@ final class session_model extends core
|
|||
AQL,
|
||||
account::COLLECTION,
|
||||
self::COLLECTION . '_edge_' . account::COLLECTION,
|
||||
$session->getId()
|
||||
$this->document->getId()
|
||||
))) {
|
||||
// Найден аккаунт
|
||||
|
||||
|
@ -210,4 +214,36 @@ final class session_model extends core
|
|||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Записать
|
||||
*
|
||||
* Ищет свойство, если не находит, то ищет его в инстанции документа сессии из базы данных,
|
||||
* затем записывает в него переданные данные. Инициализация новых свойств происходит в инстанции
|
||||
* документа сессии из базы данных
|
||||
*
|
||||
* @param string $name Название
|
||||
* @param mixed $value Содержимое
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __set(string $name, mixed $value = null): void
|
||||
{
|
||||
if (isset($this->{$name})) $this->{$name} = $value;
|
||||
else $this->document->{$name} = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Прочитать
|
||||
*
|
||||
* Ищет свойство, если не находит, то ищет его в инстанции документа сессии из базы данных
|
||||
*
|
||||
* @param string $name Название
|
||||
*
|
||||
* @return mixed Данные свойства инстанции сессии или инстанции документа сессии из базы данных
|
||||
*/
|
||||
public function __get(string $name): mixed
|
||||
{
|
||||
return $this->{$name} ?? $this->document->{$name};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
@import url('/fonts/comissioner.ttf');
|
||||
@import url('/fonts/commissioner.ttf');
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
:root {
|
||||
|
|
|
@ -1,53 +0,0 @@
|
|||
{% block css %}
|
||||
<link type="text/css" rel="stylesheet" href="/css/account.css">
|
||||
<link type="text/css" rel="stylesheet" href="/css/gradient.css">
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<section id="authentication">
|
||||
{% if account %}
|
||||
{{ account.getKey() }}
|
||||
{% if vk %}
|
||||
{{ vk.mail }}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<section class="header gradient unselectable">
|
||||
<div class="glare"></div>
|
||||
<img class="avatar unselectable" src="/images/what.png" alt="Пользователь" draggable="false">
|
||||
<a href="https://mirzaev.sexy">Нейрожурнал Мирзаева</a>
|
||||
<div class="red"></div>
|
||||
<div class="green"></div>
|
||||
<div class="blue"></div>
|
||||
<img class="cover unselectable" src="/images/heh.gif" alt="Нейрожурнал Мирзаева" draggable="false"></img>
|
||||
</section>
|
||||
<section class="body">
|
||||
<ul>
|
||||
<li>Подпункт 2.1.</li>
|
||||
<li>Подпункт 2.2.
|
||||
<ul>
|
||||
<li>Подпункт 2.2.1.</li>
|
||||
<li>Подпункт 2.2.2.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Подпункт 2.3.</li>
|
||||
</ul>
|
||||
<div class="buttons">
|
||||
<button class="accept">Разрешить</button>
|
||||
<button>Запретить</button>
|
||||
</div>
|
||||
</section>
|
||||
{% endif %}
|
||||
<svg width="0" height="0">
|
||||
<defs>
|
||||
<clipPath id="authentication-header-mask">
|
||||
<path
|
||||
d="M50,160 L50,130 C22,130 0,107.612 0,80 C0,52 22,30 50,30 L50,3 C50,1.3 51.3,0 53,0 L447,0 C448,0 450,1.5 450,3 L450,160 L50,160 Z" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
</section>
|
||||
{% endblock %}
|
||||
|
||||
{% block js %}
|
||||
<script type="text/javascript" src="/js/account.js"></script>
|
||||
{% endblock %}
|
|
@ -1,6 +1,6 @@
|
|||
{% extends "core.html" %}
|
||||
|
||||
{% use 'account/element.html' with css as account_css, body as account_body, js as account_js %}
|
||||
{% use 'nodes/account.html' with css as account_css, body as account_body, js as account_js %}
|
||||
{% use "core.html" with css as core_css, body as core_body, js as core_js, js_init as core_js_init %}
|
||||
{% use "header.html" with css as header_css, body as header_body, js as header_js, js_init as header_js_init %}
|
||||
{% use "aside.html" with css as aside_css, body as aside_body, js as aside_js, js_init as aside_js_init %}
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
{% block css %}
|
||||
<link type="text/css" rel="stylesheet" href="/css/account.css">
|
||||
<link type="text/css" rel="stylesheet" href="/css/gradient.css">
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<section id="authentication">
|
||||
{% if account %}
|
||||
{{ account.getKey() }}
|
||||
{% if vk %}
|
||||
{{ vk.mail }}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<section class="header gradient unselectable">
|
||||
<div class="glare"></div>
|
||||
<img class="avatar unselectable" src="/images/what.png" alt="Пользователь" draggable="false">
|
||||
<a href="https://mirzaev.sexy">{{ name ?? session.ip ?? session.hash ?? 'Ты кто?'}}</a>
|
||||
<div class="red"></div>
|
||||
<div class="green"></div>
|
||||
<div class="blue"></div>
|
||||
<img class="cover unselectable" src="/images/heh.gif" alt="Нейрожурнал Мирзаева" draggable="false"></img>
|
||||
</section>
|
||||
<section class="body">
|
||||
<ul>
|
||||
<li>Подпункт 2.1.</li>
|
||||
<li>Подпункт 2.2.
|
||||
<ul>
|
||||
<li>Подпункт 2.2.1.</li>
|
||||
<li>Подпункт 2.2.2.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Подпункт 2.3.</li>
|
||||
</ul>
|
||||
<div class="buttons">
|
||||
<button class="accept">Разрешить</button>
|
||||
<button>Запретить</button>
|
||||
</div>
|
||||
</section>
|
||||
{% endif %}
|
||||
<svg width="0" height="0">
|
||||
<defs>
|
||||
<clipPath id="authentication-header-mask">
|
||||
<path
|
||||
d="M50,160 L50,130 C22,130 0,107.612 0,80 C0,52 22,30 50,30 L50,3 C50,1.3 51.3,0 53,0 L447,0 C448,0 450,1.5 450,3 L450,160 L50,160 Z" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
</section>
|
||||
{% endblock %}
|
||||
|
||||
{% block js %}
|
||||
<script type="text/javascript" src="/js/account.js"></script>
|
||||
{% endblock %}
|
|
@ -0,0 +1,53 @@
|
|||
{% block css %}
|
||||
<link type="text/css" rel="stylesheet" href="/css/account.css">
|
||||
<link type="text/css" rel="stylesheet" href="/css/gradient.css">
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<section id="authentication">
|
||||
{% if account %}
|
||||
{{ account.getKey() }}
|
||||
{% if vk %}
|
||||
{{ vk.mail }}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<section class="header gradient unselectable">
|
||||
<div class="glare"></div>
|
||||
<img class="avatar unselectable" src="/images/what.png" alt="Пользователь" draggable="false">
|
||||
<a href="https://mirzaev.sexy">Нейрожурнал Мирзаева</a>
|
||||
<div class="red"></div>
|
||||
<div class="green"></div>
|
||||
<div class="blue"></div>
|
||||
<img class="cover unselectable" src="/images/heh.gif" alt="Нейрожурнал Мирзаева" draggable="false"></img>
|
||||
</section>
|
||||
<section class="body">
|
||||
<ul>
|
||||
<li>Подпункт 2.1.</li>
|
||||
<li>Подпункт 2.2.
|
||||
<ul>
|
||||
<li>Подпункт 2.2.1.</li>
|
||||
<li>Подпункт 2.2.2.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Подпункт 2.3.</li>
|
||||
</ul>
|
||||
<div class="buttons">
|
||||
<button class="accept">Разрешить</button>
|
||||
<button>Запретить</button>
|
||||
</div>
|
||||
</section>
|
||||
{% endif %}
|
||||
<svg width="0" height="0">
|
||||
<defs>
|
||||
<clipPath id="authentication-header-mask">
|
||||
<path
|
||||
d="M50,160 L50,130 C22,130 0,107.612 0,80 C0,52 22,30 50,30 L50,3 C50,1.3 51.3,0 53,0 L447,0 C448,0 450,1.5 450,3 L450,160 L50,160 Z" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
</section>
|
||||
{% endblock %}
|
||||
|
||||
{% block js %}
|
||||
<script type="text/javascript" src="/js/account.js"></script>
|
||||
{% endblock %}
|
Loading…
Reference in New Issue