Updated session manager styling.
This commit is contained in:
parent
8786ed10dc
commit
1430b2e692
8 changed files with 355 additions and 379 deletions
|
@ -1,4 +1,5 @@
|
||||||
.settings__container {
|
.settings__container {
|
||||||
|
overflow: auto;
|
||||||
|
|
||||||
&:not(:last-child) {
|
&:not(:last-child) {
|
||||||
margin-bottom: 2px;
|
margin-bottom: 2px;
|
||||||
|
|
|
@ -1,83 +1,74 @@
|
||||||
@mio-settings-sessions-mobile: 1000px;
|
|
||||||
|
|
||||||
.settings__session {
|
.settings__session {
|
||||||
margin: 1px;
|
margin: 4px;
|
||||||
|
border: 1px solid var(--accent-colour);
|
||||||
|
border-radius: 2px;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
&__country {
|
&--current {
|
||||||
vertical-align: middle;
|
// todo: make this now bad
|
||||||
|
background-image: linear-gradient(0deg, #111c, #111c);
|
||||||
|
background-color: var(--accent-colour);
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: @mio-settings-sessions-mobile) {
|
&__important {
|
||||||
&__button {
|
display: flex;
|
||||||
width: 100%;
|
align-items: center;
|
||||||
text-align: center;
|
font-size: 1.4em;
|
||||||
}
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__flag {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
margin: 10px;
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__description {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
margin: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__actions {
|
&__actions {
|
||||||
|
flex: 0 0 auto;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
|
||||||
padding: 6px;
|
|
||||||
border-bottom: 1px solid var(--accent-colour);
|
|
||||||
margin-bottom: 1px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&__entry {
|
&__action {
|
||||||
|
border: 0;
|
||||||
|
background: transparent;
|
||||||
|
color: inherit;
|
||||||
|
font: inherit;
|
||||||
|
text-shadow: inherit;
|
||||||
|
padding: 10px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: color .2s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: var(--accent-colour);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__details {
|
||||||
|
z-index: 1;
|
||||||
|
margin: 10px;
|
||||||
|
margin-top: -5px;
|
||||||
display: flex;
|
display: flex;
|
||||||
border: 1px solid var(--accent-colour);
|
|
||||||
justify-content: space-between;
|
|
||||||
padding: 1px;
|
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
|
|
||||||
&:not(:last-child) {
|
|
||||||
margin-bottom: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&--current {
|
|
||||||
background-color: #c2affe;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&__column {
|
&__detail {
|
||||||
flex-grow: 1;
|
display: inline-block;
|
||||||
|
margin-right: 2px;
|
||||||
|
min-width: 120px;
|
||||||
|
|
||||||
&:not(:last-child) {
|
&__title {
|
||||||
margin-left: 5px;
|
border-bottom: 1px solid var(--accent-colour);
|
||||||
margin-right: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&--ip,
|
|
||||||
&--created,
|
|
||||||
&--expires,
|
|
||||||
&--options {
|
|
||||||
flex-grow: 0;
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: @mio-settings-sessions-mobile) {
|
|
||||||
&--options {
|
|
||||||
text-align: center;
|
|
||||||
flex-grow: 1;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&--user-agent {
|
|
||||||
flex-shrink: 1;
|
|
||||||
flex-grow: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
&--ip {
|
|
||||||
min-width: 200px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&--created,
|
|
||||||
&--expires {
|
|
||||||
min-width: 120px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&__name {
|
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
|
padding: 1px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__value {
|
||||||
|
padding: 1px 5px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
12
assets/less/classes/settings/sessions.less
Normal file
12
assets/less/classes/settings/sessions.less
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
.settings__sessions {
|
||||||
|
|
||||||
|
&__all {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
margin: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__pagination {
|
||||||
|
margin: 4px;
|
||||||
|
}
|
||||||
|
}
|
|
@ -127,6 +127,7 @@ body {
|
||||||
@import "classes/settings/log";
|
@import "classes/settings/log";
|
||||||
@import "classes/settings/login-history";
|
@import "classes/settings/login-history";
|
||||||
@import "classes/settings/session";
|
@import "classes/settings/session";
|
||||||
|
@import "classes/settings/sessions";
|
||||||
|
|
||||||
// News
|
// News
|
||||||
@import "classes/news/container";
|
@import "classes/news/container";
|
||||||
|
|
|
@ -29,31 +29,35 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||||
if (!csrf_verify('settings', $_POST['csrf'] ?? '')) {
|
if (!csrf_verify('settings', $_POST['csrf'] ?? '')) {
|
||||||
$settingsErrors[] = MSZ_TMP_USER_ERROR_STRINGS['csrf'];
|
$settingsErrors[] = MSZ_TMP_USER_ERROR_STRINGS['csrf'];
|
||||||
} else {
|
} else {
|
||||||
if (!empty($_POST['session_action'])) {
|
if (!empty($_POST['session'])) {
|
||||||
switch ($_POST['session_action']) {
|
$currentSessionKilled = false;
|
||||||
case 'kill-all':
|
|
||||||
user_session_purge_all($settingsUserId);
|
if (is_array($_POST['session'])) {
|
||||||
audit_log('PERSONAL_SESSION_DESTROY_ALL', $settingsUserId);
|
foreach ($_POST['session'] as $sessionId) {
|
||||||
header('Location: /');
|
$sessionId = intval($sessionId);
|
||||||
return;
|
$session = user_session_find($sessionId);
|
||||||
|
|
||||||
|
if (!$session || (int)$session['user_id'] !== $settingsUserId) {
|
||||||
|
$settingsErrors[] = "Session #{$sessionId} does not exist.";
|
||||||
|
break;
|
||||||
|
} elseif ((int)$session['session_id'] === user_session_current('session_id')) {
|
||||||
|
$currentSessionKilled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
user_session_delete($session['session_id']);
|
||||||
|
audit_log('PERSONAL_SESSION_DESTROY', $settingsUserId, [
|
||||||
|
$session['session_id'],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
} elseif ($_POST['session'] === 'all') {
|
||||||
|
$currentSessionKilled = true;
|
||||||
|
user_session_purge_all($settingsUserId);
|
||||||
|
audit_log('PERSONAL_SESSION_DESTROY_ALL', $settingsUserId);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($_POST['session']) && is_numeric($_POST['session'])) {
|
if ($currentSessionKilled) {
|
||||||
$session = user_session_find((int)($_POST['session'] ?? 0));
|
header('Location: /');
|
||||||
|
|
||||||
if (!$session) {
|
|
||||||
$settingsErrors[] = 'Invalid session.';
|
|
||||||
} elseif ((int)$session['user_id'] !== $settingsUserId) {
|
|
||||||
$settingsErrors[] = 'You may only end your own sessions.';
|
|
||||||
} elseif ((int)$session['session_id'] === user_session_current('session_id')) {
|
|
||||||
header('Location: /auth.php?m=logout&s=' . csrf_token('logout'));
|
|
||||||
return;
|
return;
|
||||||
} else {
|
|
||||||
user_session_delete($session['session_id']);
|
|
||||||
audit_log('PERSONAL_SESSION_DESTROY', $settingsUserId, [
|
|
||||||
$session['session_id'],
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
{% include '_layout/meta.twig' %}
|
{% include '_layout/meta.twig' %}
|
||||||
<link href="{{ '/css/style.css'|asset_url }}" rel="stylesheet">
|
|
||||||
<link href="{{ '/css/libraries.css'|asset_url }}" rel="stylesheet">
|
<link href="{{ '/css/libraries.css'|asset_url }}" rel="stylesheet">
|
||||||
|
<link href="{{ '/css/style.css'|asset_url }}" rel="stylesheet">
|
||||||
{% if site_background is defined %}
|
{% if site_background is defined %}
|
||||||
<style>
|
<style>
|
||||||
:root {
|
:root {
|
||||||
|
|
|
@ -45,53 +45,67 @@
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
{% macro user_session(session, is_current_session) %}
|
{% macro user_session(session, is_current_session) %}
|
||||||
|
{% from '_layout/input.twig' import input_hidden, input_csrf, input_checkbox_raw %}
|
||||||
{% set browser = get_browser(session.user_agent) %}
|
{% set browser = get_browser(session.user_agent) %}
|
||||||
|
|
||||||
<div class="settings__session{% if is_current_session %} settings__session--current{% endif %}" id="session-{{ session.session_id }}">
|
<div class="settings__session{% if is_current_session %} settings__session--current{% endif %}" id="session-{{ session.session_id }}">
|
||||||
<div class="settings__session__icon settings__session__icon--browser" title="{{ browser.browser }}">
|
<div class="settings__session__important">
|
||||||
{% if browser.browser[:7]|lower == 'firefox' %}
|
<div class="flag flag--{{ session.session_country|lower }} settings__session__flag"></div>
|
||||||
<i class="fab fa-firefox"></i>
|
|
||||||
{% elseif browser.browser[:6]|lower == 'chrome' %}
|
<div class="settings__session__description">
|
||||||
<i class="fab fa-chrome"></i>
|
{{ browser.browser }} on {{ browser.platform }}
|
||||||
{% elseif browser.browser[:4]|lower == 'edge' %}
|
</div>
|
||||||
<i class="fab fa-edge"></i>
|
|
||||||
{% elseif browser.browser[:2]|lower == 'ie' %}
|
<form class="settings__session__actions" method="post" action="/settings.php">
|
||||||
<i class="fab fa-internet-explorer"></i>
|
{{ input_csrf('settings') }}
|
||||||
{% elseif browser.browser[:6]|lower == 'safari' %}
|
{{ input_hidden('session[]', session.session_id) }}
|
||||||
<i class="fab fa-safari"></i>
|
|
||||||
{% elseif browser.browser[:6]|lower == 'opera' %}
|
<button class="settings__session__action" title="{{ is_current_session ? 'Logout' : 'End Session' }}">
|
||||||
<i class="fab fa-opera"></i>
|
{% if is_current_session %}
|
||||||
{% else %}
|
<i class="fas fa-sign-out-alt"></i>
|
||||||
<i class="fas fa-globe"></i>
|
{% else %}
|
||||||
{% endif %}
|
<i class="fas fa-times-circle"></i>
|
||||||
|
{% endif %}
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="settings__session__icon settings__session__icon--device" title="{{ browser.device_type }}">
|
<div class="settings__session__details">
|
||||||
{% if browser.device_type[:7]|lower == 'desktop' %}
|
<div class="settings__session__detail">
|
||||||
<i class="fas fa-desktop"></i>
|
<div class="settings__session__detail__title">
|
||||||
{% elseif browser.device_type[:6]|lower == 'mobile' %}
|
IP Address
|
||||||
<i class="fas fa-mobile-alt"></i>
|
</div>
|
||||||
{% elseif browser.device_type[:6]|lower == 'tablet' %}
|
<div class="settings__session__detail__value">
|
||||||
<i class="fas fa-tablet-alt"></i>
|
{{ session.session_ip_decoded }}
|
||||||
{% else %}
|
</div>
|
||||||
<i class="fas fa-blender-phone"></i>
|
</div>
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings__session__icon settings__session__icon--system" title="{{ browser.platform }}">
|
<div class="settings__session__detail" title="{{ session.created_at|date('r') }}">
|
||||||
{% if browser.platform[:3]|lower == 'win' %}
|
<div class="settings__session__detail__title">
|
||||||
<i class="fab fa-windows"></i>
|
Created
|
||||||
{% elseif browser.platform[:3]|lower == 'ios' or browser.platform[:3]|lower == 'mac' %}
|
</div>
|
||||||
<i class="fab fa-apple"></i>
|
<time class="settings__session__detail__value" datetime="{{ session.created_at|date('c') }}">
|
||||||
{% elseif browser.platform[:7]|lower == 'android' %}
|
{{ session.created_at|time_diff }}
|
||||||
<i class="fab fa-android"></i>
|
</time>
|
||||||
{% else %}
|
</div>
|
||||||
<i class="fab fa-linux"></i>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings__session__description">
|
<div class="settings__session__detail" title="{{ session.expires_on|date('r') }}">
|
||||||
{{ browser.browser }} on {{ browser.platform }}
|
<div class="settings__session__detail__title">
|
||||||
|
Expires
|
||||||
|
</div>
|
||||||
|
<time class="settings__session__detail__value" datetime="{{ session.expires_on|date('c') }}">
|
||||||
|
{{ session.expires_on|time_diff }}
|
||||||
|
</time>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="settings__session__detail">
|
||||||
|
<div class="settings__session__detail__title">
|
||||||
|
User Agent
|
||||||
|
</div>
|
||||||
|
<div class="settings__session__detail__value">
|
||||||
|
{{ session.user_agent|length > 0 ? session.user_agent : 'None' }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
|
@ -6,297 +6,250 @@
|
||||||
{% set title = 'Settings' %}
|
{% set title = 'Settings' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<form action="" method="post">
|
{% if settings_errors is defined and settings_errors|length > 0 %}
|
||||||
|
<div class="warning">
|
||||||
|
<div class="warning__content">
|
||||||
|
{% for error in settings_errors %}
|
||||||
|
{{ error }}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<div class="warning">
|
||||||
|
<div class="warning__content">
|
||||||
|
A few of the elements on this page have been moved to the on-profile editor. To find them, go to your profile and hit the "Edit Profile" button below your avatar.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<form action="" method="post" class="container settings__container" id="account">
|
||||||
|
{{ container_title('<i class="fas fa-user fa-fw"></i> Account', '', true) }}
|
||||||
{{ input_csrf('settings') }}
|
{{ input_csrf('settings') }}
|
||||||
|
|
||||||
{% if settings_errors is defined and settings_errors|length > 0 %}
|
<div class="settings__description">
|
||||||
<div class="warning">
|
<p>Here you can change your e-mail address and/or your password, please make sure your e-mail is accurate and your password is strong in order to protect your account. For convenience your current e-mail address is displayed. You are required to verify yourself by entering your current password to change either value.</p>
|
||||||
<div class="warning__content">
|
</div>
|
||||||
{% for error in settings_errors %}
|
|
||||||
{{ error }}
|
{% if settings_disable_account_options %}
|
||||||
{% endfor %}
|
<div class="settings__disabled">
|
||||||
|
<div class="settings__disabled__notice">
|
||||||
|
E-mail and password changing is only available on the main site for stability reasons.
|
||||||
|
</div>
|
||||||
|
<div class="settings__disabled__options">
|
||||||
|
<a class="input__button" href="https://flashii.net/settings.php">
|
||||||
|
<i class="fas fa-external-link-square-alt fa-fw"></i> Change E-mail or Password on Flashii
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<div class="warning">
|
<div class="settings__account">
|
||||||
<div class="warning__content">
|
<div class="settings__account__section">
|
||||||
A few of the elements on this page have been moved to the on-profile editor. To find them, go to your profile and hit the "Edit Profile" button below your avatar.
|
<label class="settings__account__input">
|
||||||
|
<div class="settings__account__title">
|
||||||
|
New e-mail address
|
||||||
|
</div>
|
||||||
|
{{ input_text('email[new]', 'settings__account__input', '', 'email', account_info.email) }}
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label class="settings__account__input">
|
||||||
|
<div class="settings__account__title">
|
||||||
|
Confirm new e-mail address
|
||||||
|
</div>
|
||||||
|
{{ input_text('email[new]', 'settings__account__input', '', 'email') }}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="settings__account__section">
|
||||||
|
<label class="settings__account__input">
|
||||||
|
<div class="settings__account__title">
|
||||||
|
New password
|
||||||
|
</div>
|
||||||
|
{{ input_text('password[new]', 'settings__account__input', '', 'password') }}
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label class="settings__account__input">
|
||||||
|
<div class="settings__account__title">
|
||||||
|
Confirm new password
|
||||||
|
</div>
|
||||||
|
{{ input_text('password[confirm]', 'settings__account__input', '', 'password') }}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="settings__account__section settings__account__section--confirm">
|
||||||
|
<label class="settings__account__input">
|
||||||
|
<div class="settings__account__title">
|
||||||
|
Current password
|
||||||
|
</div>
|
||||||
|
{{ input_text('current_password', 'settings__account__input', '', 'password') }}
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<div class="settings__account__buttons">
|
||||||
|
<button class="input__button settings__account__button">Update</button>
|
||||||
|
<button class="input__button settings__account__button" type="reset">Reset</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
</form>
|
||||||
|
|
||||||
<div class="container settings__container" id="account">
|
<div class="container settings__container" id="sessions">
|
||||||
{{ container_title('<i class="fas fa-user fa-fw"></i> Account', '', true) }}
|
{{ container_title('<i class="fas fa-key fa-fw"></i> Sessions', '', true) }}
|
||||||
|
{% set spagination = pagination(sessions_count, sessions_take, sessions_offset, '?m=sessions') %}
|
||||||
|
|
||||||
<div class="settings__description">
|
<div class="settings__description">
|
||||||
<p>Here you can change your e-mail address and/or your password, please make sure your e-mail is accurate and your password is strong in order to protect your account. For convenience your current e-mail address is displayed. You are required to verify yourself by entering your current password to change either value.</p>
|
<p>These are the active logins to your account, clicking the Kill button will force a logout on that session. Your current login is highlighted with a different colour so you don't accidentally force yourself to logout.</p>
|
||||||
</div>
|
|
||||||
|
|
||||||
{% if settings_disable_account_options %}
|
|
||||||
<div class="settings__disabled">
|
|
||||||
<div class="settings__disabled__notice">
|
|
||||||
E-mail and password changing is only available on the main site for stability reasons.
|
|
||||||
</div>
|
|
||||||
<div class="settings__disabled__options">
|
|
||||||
<a class="input__button" href="https://flashii.net/settings.php">
|
|
||||||
<i class="fas fa-external-link-square-alt fa-fw"></i> Change E-mail or Password on Flashii
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% else %}
|
|
||||||
<div class="settings__account">
|
|
||||||
<div class="settings__account__section">
|
|
||||||
<label class="settings__account__input">
|
|
||||||
<div class="settings__account__title">
|
|
||||||
New e-mail address
|
|
||||||
</div>
|
|
||||||
{{ input_text('email[new]', 'settings__account__input', '', 'email', account_info.email) }}
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<label class="settings__account__input">
|
|
||||||
<div class="settings__account__title">
|
|
||||||
Confirm new e-mail address
|
|
||||||
</div>
|
|
||||||
{{ input_text('email[new]', 'settings__account__input', '', 'email') }}
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings__account__section">
|
|
||||||
<label class="settings__account__input">
|
|
||||||
<div class="settings__account__title">
|
|
||||||
New password
|
|
||||||
</div>
|
|
||||||
{{ input_text('password[new]', 'settings__account__input', '', 'password') }}
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<label class="settings__account__input">
|
|
||||||
<div class="settings__account__title">
|
|
||||||
Confirm new password
|
|
||||||
</div>
|
|
||||||
{{ input_text('password[confirm]', 'settings__account__input', '', 'password') }}
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings__account__section settings__account__section--confirm">
|
|
||||||
<label class="settings__account__input">
|
|
||||||
<div class="settings__account__title">
|
|
||||||
Current password
|
|
||||||
</div>
|
|
||||||
{{ input_text('current_password', 'settings__account__input', '', 'password') }}
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<div class="settings__account__buttons">
|
|
||||||
<button class="input__button settings__account__button">Update</button>
|
|
||||||
<button class="input__button settings__account__button" type="reset">Reset</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="container settings__container" id="sessions">
|
<div class="settings__sessions">
|
||||||
{{ container_title('<i class="fas fa-key fa-fw"></i> Sessions', '', true) }}
|
<form action="" method="post" class="settings__sessions__all">
|
||||||
{% set spagination = pagination(sessions_count, sessions_take, sessions_offset, '?m=sessions') %}
|
{{ input_csrf('settings') }}
|
||||||
|
{{ input_hidden('session', 'all') }}
|
||||||
|
|
||||||
<div class="settings__description">
|
<button class="input__button">
|
||||||
<p>These are the active logins to your account, clicking the Kill button will force a logout on that session. Your current login is highlighted with a darker purple so you don't accidentally force yourself to logout.</p>
|
<i class="fas fa-bomb"></i> Kill ALL active sessions
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<div class="settings__sessions__pagination">
|
||||||
|
{{ spagination }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="settings__sessions">
|
<div class="settings__sessions__list">
|
||||||
<!--form class="settings__sessions__actions" method="post" action="?m=sessions">
|
|
||||||
{{ input_csrf('settings') }}
|
|
||||||
|
|
||||||
<button class="input__button" name="session_action" value="kill-all">
|
|
||||||
Kill all active sessions
|
|
||||||
</button>
|
|
||||||
</form-->
|
|
||||||
|
|
||||||
{{ spagination }}
|
|
||||||
|
|
||||||
{% for session in user_sessions %}
|
{% for session in user_sessions %}
|
||||||
{{ user_session(session) }}
|
{{ user_session(session, session.session_id == active_session_id) }}
|
||||||
|
|
||||||
|
|
||||||
<div class="settings__sessions__column settings__sessions__column--ip">
|
|
||||||
<div class="settings__sessions__column__name">
|
|
||||||
IP
|
|
||||||
</div>
|
|
||||||
<div class="settings__sessions__column__value">
|
|
||||||
{{ session.session_ip_decoded }}
|
|
||||||
{% if session.session_country != 'XX' %}
|
|
||||||
<div class="flag flag--{{ session.session_country|lower }} settings__sessions__country" title="{{ session.session_country|country_name }}"></div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings__sessions__column settings__sessions__column--created" title="{{ session.created_at|date('r') }}">
|
|
||||||
<div class="settings__sessions__column__name">
|
|
||||||
Created
|
|
||||||
</div>
|
|
||||||
<time class="settings__sessions__column__value" datetime="{{ session.created_at|date('c') }}">
|
|
||||||
{{ session.created_at|time_diff }}
|
|
||||||
</time>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings__sessions__column settings__sessions__column--expires" title="{{ session.expires_on|date('r') }}">
|
|
||||||
<div class="settings__sessions__column__name">
|
|
||||||
Expires
|
|
||||||
</div>
|
|
||||||
<time class="settings__sessions__column__value" datetime="{{ session.expires_on|date('c') }}">
|
|
||||||
{{ session.expires_on|time_diff }}
|
|
||||||
</time>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% if session.user_agent|length > 0 %}
|
|
||||||
<div class="settings__sessions__column settings__sessions__column--user_agent">
|
|
||||||
<div class="settings__sessions__column__name">
|
|
||||||
User Agent
|
|
||||||
</div>
|
|
||||||
<div class="settings__sessions__column__value">
|
|
||||||
{{ session.user_agent }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<!--form class="settings__sessions__column settings__sessions__column--options" method="post" action="?m=sessions">
|
|
||||||
{{ input_hidden('session', session.session_id) }}
|
|
||||||
{{ input_csrf('settings') }}
|
|
||||||
|
|
||||||
<button class="input__button settings__sessions__button">
|
|
||||||
{{ session.session_id == active_session_id ? 'Logout' : 'Kill' }}
|
|
||||||
</button>
|
|
||||||
</form-->
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="settings__sessions__pagination">
|
||||||
{{ spagination }}
|
{{ spagination }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="container settings__container" id="logins">
|
<div class="container settings__container" id="logins">
|
||||||
{{ container_title('<i class="fas fa-user-lock fa-fw"></i> Login History', '', true) }}
|
{{ container_title('<i class="fas fa-user-lock fa-fw"></i> Login History', '', true) }}
|
||||||
{% set lhpagination = pagination(
|
{% set lhpagination = pagination(
|
||||||
login_attempts_count,
|
login_attempts_count,
|
||||||
login_attempts_take,
|
login_attempts_take,
|
||||||
login_attempts_offset,
|
login_attempts_offset,
|
||||||
'?m=logs'|url_construct({'ao': audit_log_offset}),
|
'?m=logs'|url_construct({'ao': audit_log_offset}),
|
||||||
false,
|
false,
|
||||||
'lo'
|
'lo'
|
||||||
) %}
|
) %}
|
||||||
|
|
||||||
<div class="settings__description">
|
<div class="settings__description">
|
||||||
<p>These are all the login attempts to your account. If any attempt that you don't recognise is marked as successful your account may be compromised, ask a staff member for advice in this case.</p>
|
<p>These are all the login attempts to your account. If any attempt that you don't recognise is marked as successful your account may be compromised, ask a staff member for advice in this case.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="settings__login-history">
|
<div class="settings__login-history">
|
||||||
{{ lhpagination }}
|
{{ lhpagination }}
|
||||||
|
|
||||||
{% for attempt in user_login_attempts %}
|
{% for attempt in user_login_attempts %}
|
||||||
<div class="settings__login-history__entry" id="attempt-{{ attempt.attempt_id }}">
|
<div class="settings__login-history__entry" id="attempt-{{ attempt.attempt_id }}">
|
||||||
<div class="settings__login-history__column settings__login-history__column--ip">
|
<div class="settings__login-history__column settings__login-history__column--ip">
|
||||||
|
<div class="settings__login-history__column__name">
|
||||||
|
IP
|
||||||
|
</div>
|
||||||
|
<div class="settings__login-history__column__value">
|
||||||
|
{{ attempt.attempt_ip_decoded }}
|
||||||
|
{% if attempt.attempt_country != 'XX' %}
|
||||||
|
<div class="flag flag--{{ attempt.attempt_country|lower }} settings__login-history__country" title="{{ attempt.attempt_country|country_name }}"></div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="settings__login-history__column settings__login-history__column--success">
|
||||||
|
<div class="settings__login-history__column__name">
|
||||||
|
Was Successful?
|
||||||
|
</div>
|
||||||
|
<div class="settings__login-history__column__value settings__login-history__column__value--{{ attempt.was_successful ? 'successful' : 'failed' }}">
|
||||||
|
{{ attempt.was_successful ? 'Yes' : 'No' }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="settings__login-history__column settings__login-history__column--created" title="{{ attempt.created_at|date('r') }}">
|
||||||
|
<div class="settings__login-history__column__name">
|
||||||
|
Attempted
|
||||||
|
</div>
|
||||||
|
<time class="settings__login-history__column__value" datetime="{{ attempt.created_at|date('c') }}">
|
||||||
|
{{ attempt.created_at|time_diff }}
|
||||||
|
</time>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if attempt.user_agent|length > 0 %}
|
||||||
|
<div class="settings__login-history__column settings__login-history__column--user_agent">
|
||||||
<div class="settings__login-history__column__name">
|
<div class="settings__login-history__column__name">
|
||||||
IP
|
User Agent
|
||||||
</div>
|
</div>
|
||||||
<div class="settings__login-history__column__value">
|
<div class="settings__login-history__column__value">
|
||||||
{{ attempt.attempt_ip_decoded }}
|
{{ attempt.user_agent }}
|
||||||
{% if attempt.attempt_country != 'XX' %}
|
|
||||||
<div class="flag flag--{{ attempt.attempt_country|lower }} settings__login-history__country" title="{{ attempt.attempt_country|country_name }}"></div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
<div class="settings__login-history__column settings__login-history__column--success">
|
{{ lhpagination }}
|
||||||
<div class="settings__login-history__column__name">
|
</div>
|
||||||
Was Successful?
|
</div>
|
||||||
</div>
|
|
||||||
<div class="settings__login-history__column__value settings__login-history__column__value--{{ attempt.was_successful ? 'successful' : 'failed' }}">
|
|
||||||
{{ attempt.was_successful ? 'Yes' : 'No' }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings__login-history__column settings__login-history__column--created" title="{{ attempt.created_at|date('r') }}">
|
<div class="container settings__container" id="log">
|
||||||
<div class="settings__login-history__column__name">
|
{{ container_title('<i class="fas fa-file-alt fa-fw"></i> Account Log', '', true) }}
|
||||||
Attempted
|
{% set alpagination = pagination(
|
||||||
</div>
|
audit_log_count,
|
||||||
<time class="settings__login-history__column__value" datetime="{{ attempt.created_at|date('c') }}">
|
audit_log_take,
|
||||||
{{ attempt.created_at|time_diff }}
|
audit_log_offset,
|
||||||
</time>
|
'?m=logs'|url_construct({'lo': login_attempts_offset}),
|
||||||
</div>
|
false,
|
||||||
|
'ao'
|
||||||
|
) %}
|
||||||
|
|
||||||
{% if attempt.user_agent|length > 0 %}
|
<div class="settings__description">
|
||||||
<div class="settings__login-history__column settings__login-history__column--user_agent">
|
<p>This is a log of all "important" actions that have been done using your account for your review. If you notice anything strange, please alert the staff.</p>
|
||||||
<div class="settings__login-history__column__name">
|
|
||||||
User Agent
|
|
||||||
</div>
|
|
||||||
<div class="settings__login-history__column__value">
|
|
||||||
{{ attempt.user_agent }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{{ lhpagination }}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="container settings__container" id="log">
|
<div class="settings__log">
|
||||||
{{ container_title('<i class="fas fa-file-alt fa-fw"></i> Account Log', '', true) }}
|
{{ alpagination }}
|
||||||
{% set alpagination = pagination(
|
|
||||||
audit_log_count,
|
|
||||||
audit_log_take,
|
|
||||||
audit_log_offset,
|
|
||||||
'?m=logs'|url_construct({'lo': login_attempts_offset}),
|
|
||||||
false,
|
|
||||||
'ao'
|
|
||||||
) %}
|
|
||||||
|
|
||||||
<div class="settings__description">
|
{% for log in audit_logs %}
|
||||||
<p>This is a log of all "important" actions that have been done using your account for your review. If you notice anything strange, please alert the staff.</p>
|
<div class="settings__log__entry" id="log-{{ log.log_id }}">
|
||||||
</div>
|
<div class="settings__log__column settings__login-history__column--ip">
|
||||||
|
<div class="settings__log__column__name">
|
||||||
<div class="settings__log">
|
IP
|
||||||
{{ alpagination }}
|
|
||||||
|
|
||||||
{% for log in audit_logs %}
|
|
||||||
<div class="settings__log__entry" id="log-{{ log.log_id }}">
|
|
||||||
<div class="settings__log__column settings__login-history__column--ip">
|
|
||||||
<div class="settings__log__column__name">
|
|
||||||
IP
|
|
||||||
</div>
|
|
||||||
<div class="settings__log__column__value">
|
|
||||||
{{ log.log_ip }}
|
|
||||||
{% if log.log_country|default('XX') != 'XX' %}
|
|
||||||
<div class="flag flag--{{ log.log_country|lower }} settings__log__country" title="{{ log.log_country|country_name }}"></div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div class="settings__log__column__value">
|
||||||
<div class="settings__log__column settings__log__column--date" title="{{ log.log_created|date('r') }}">
|
{{ log.log_ip }}
|
||||||
<div class="settings__log__column__name">
|
{% if log.log_country|default('XX') != 'XX' %}
|
||||||
Date
|
<div class="flag flag--{{ log.log_country|lower }} settings__log__country" title="{{ log.log_country|country_name }}"></div>
|
||||||
</div>
|
{% endif %}
|
||||||
<time class="settings__log__column__value" datetime="{{ log.log_created|date('c') }}">
|
|
||||||
{{ log.log_created|time_diff }}
|
|
||||||
</time>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings__log__column settings__log__column--action">
|
|
||||||
<div class="settings__log__column__name">
|
|
||||||
Action
|
|
||||||
</div>
|
|
||||||
<div class="settings__log__column__value">
|
|
||||||
{% if log.log_action in log_strings|keys %}
|
|
||||||
{{ log_strings[log.log_action]|vsprintf(log.log_params|json_decode) }}
|
|
||||||
{% else %}
|
|
||||||
{{ log.log_action }}({{ log.log_params }})
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{{ alpagination }}
|
<div class="settings__log__column settings__log__column--date" title="{{ log.log_created|date('r') }}">
|
||||||
</div>
|
<div class="settings__log__column__name">
|
||||||
|
Date
|
||||||
|
</div>
|
||||||
|
<time class="settings__log__column__value" datetime="{{ log.log_created|date('c') }}">
|
||||||
|
{{ log.log_created|time_diff }}
|
||||||
|
</time>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="settings__log__column settings__log__column--action">
|
||||||
|
<div class="settings__log__column__name">
|
||||||
|
Action
|
||||||
|
</div>
|
||||||
|
<div class="settings__log__column__value">
|
||||||
|
{% if log.log_action in log_strings|keys %}
|
||||||
|
{{ log_strings[log.log_action]|vsprintf(log.log_params|json_decode) }}
|
||||||
|
{% else %}
|
||||||
|
{{ log.log_action }}({{ log.log_params }})
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{{ alpagination }}
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
Loading…
Add table
Reference in a new issue