Merged settings into a single page.
This commit is contained in:
parent
1e4dc367fc
commit
8495a83d18
8 changed files with 434 additions and 499 deletions
|
@ -11,31 +11,10 @@ if (!user_session_active()) {
|
||||||
|
|
||||||
$settingsUserId = user_session_current('user_id', 0);
|
$settingsUserId = user_session_current('user_id', 0);
|
||||||
|
|
||||||
if ($settingsUserId !== user_session_current('user_id', 0) && !user_exists($settingsUserId)) {
|
|
||||||
echo render_error(400);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$settingsModes = [
|
|
||||||
'account' => 'Account',
|
|
||||||
'sessions' => 'Sessions',
|
|
||||||
'logs' => 'Logs',
|
|
||||||
];
|
|
||||||
$settingsMode = $_GET['m'] ?? key($settingsModes);
|
|
||||||
|
|
||||||
tpl_vars([
|
tpl_vars([
|
||||||
'settings_user_id' => $settingsUserId,
|
'settings_user_id' => $settingsUserId,
|
||||||
'settings_mode' => $settingsMode,
|
|
||||||
'settings_modes' => $settingsModes,
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if (!array_key_exists($settingsMode, $settingsModes)) {
|
|
||||||
http_response_code(404);
|
|
||||||
tpl_var('settings_title', 'Not Found');
|
|
||||||
echo tpl_render('settings.notfound');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$settingsErrors = [];
|
$settingsErrors = [];
|
||||||
|
|
||||||
$disableAccountOptions = !MSZ_DEBUG
|
$disableAccountOptions = !MSZ_DEBUG
|
||||||
|
@ -163,45 +142,35 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($settingsErrors) && !empty($_POST['user']) && !empty($_SERVER['HTTP_REFERER'])) {
|
|
||||||
header('Location: /profile.php?u=' . ((int)($_POST['user'] ?? 0)));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tpl_vars([
|
tpl_vars([
|
||||||
'settings_title' => $settingsModes[$settingsMode],
|
|
||||||
'settings_errors' => $settingsErrors,
|
'settings_errors' => $settingsErrors,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
switch ($settingsMode) {
|
$getAccountInfo = db_prepare(sprintf('
|
||||||
case 'account':
|
|
||||||
$getAccountInfo = db_prepare(sprintf('
|
|
||||||
SELECT `email`
|
SELECT `email`
|
||||||
FROM `msz_users`
|
FROM `msz_users`
|
||||||
WHERE `user_id` = :user_id
|
WHERE `user_id` = :user_id
|
||||||
'));
|
'));
|
||||||
$getAccountInfo->bindValue('user_id', $settingsUserId);
|
$getAccountInfo->bindValue('user_id', $settingsUserId);
|
||||||
$accountInfo = $getAccountInfo->execute() ? $getAccountInfo->fetch(PDO::FETCH_ASSOC) : [];
|
$accountInfo = $getAccountInfo->execute() ? $getAccountInfo->fetch(PDO::FETCH_ASSOC) : [];
|
||||||
|
|
||||||
tpl_vars([
|
tpl_vars([
|
||||||
'background' => $backgroundProps,
|
'background' => $backgroundProps,
|
||||||
'settings_disable_account_options' => $disableAccountOptions,
|
'settings_disable_account_options' => $disableAccountOptions,
|
||||||
'account_info' => $accountInfo,
|
'account_info' => $accountInfo,
|
||||||
]);
|
]);
|
||||||
break;
|
|
||||||
|
|
||||||
case 'sessions':
|
$getSessionCount = db_prepare('
|
||||||
$getSessionCount = db_prepare('
|
|
||||||
SELECT COUNT(`session_id`)
|
SELECT COUNT(`session_id`)
|
||||||
FROM `msz_sessions`
|
FROM `msz_sessions`
|
||||||
WHERE `user_id` = :user_id
|
WHERE `user_id` = :user_id
|
||||||
');
|
');
|
||||||
$getSessionCount->bindValue('user_id', $settingsUserId);
|
$getSessionCount->bindValue('user_id', $settingsUserId);
|
||||||
$sessionCount = $getSessionCount->execute() ? $getSessionCount->fetchColumn() : 0;
|
$sessionCount = $getSessionCount->execute() ? $getSessionCount->fetchColumn() : 0;
|
||||||
|
|
||||||
$getSessions = db_prepare('
|
$getSessions = db_prepare('
|
||||||
SELECT
|
SELECT
|
||||||
`session_id`, `session_country`, `user_agent`, `created_at`, `expires_on`,
|
`session_id`, `session_country`, `user_agent`, `created_at`, `expires_on`,
|
||||||
INET6_NTOA(`session_ip`) as `session_ip_decoded`
|
INET6_NTOA(`session_ip`) as `session_ip_decoded`
|
||||||
|
@ -209,34 +178,32 @@ switch ($settingsMode) {
|
||||||
WHERE `user_id` = :user_id
|
WHERE `user_id` = :user_id
|
||||||
ORDER BY `session_id` DESC
|
ORDER BY `session_id` DESC
|
||||||
LIMIT :offset, :take
|
LIMIT :offset, :take
|
||||||
');
|
');
|
||||||
$getSessions->bindValue('offset', $queryOffset);
|
$getSessions->bindValue('offset', $queryOffset);
|
||||||
$getSessions->bindValue('take', $queryTake);
|
$getSessions->bindValue('take', $queryTake);
|
||||||
$getSessions->bindValue('user_id', $settingsUserId);
|
$getSessions->bindValue('user_id', $settingsUserId);
|
||||||
$sessions = $getSessions->execute() ? $getSessions->fetchAll() : [];
|
$sessions = $getSessions->execute() ? $getSessions->fetchAll() : [];
|
||||||
|
|
||||||
tpl_vars([
|
tpl_vars([
|
||||||
'active_session_id' => user_session_current('session_id'),
|
'active_session_id' => user_session_current('session_id'),
|
||||||
'user_sessions' => $sessions,
|
'user_sessions' => $sessions,
|
||||||
'sessions_offset' => $queryOffset,
|
'sessions_offset' => $queryOffset,
|
||||||
'sessions_take' => $queryTake,
|
'sessions_take' => $queryTake,
|
||||||
'sessions_count' => $sessionCount,
|
'sessions_count' => $sessionCount,
|
||||||
]);
|
]);
|
||||||
break;
|
|
||||||
|
|
||||||
case 'logs':
|
$loginAttemptsOffset = max(0, $_GET['lo'] ?? 0);
|
||||||
$loginAttemptsOffset = max(0, $_GET['lo'] ?? 0);
|
$auditLogOffset = max(0, $_GET['ao'] ?? 0);
|
||||||
$auditLogOffset = max(0, $_GET['ao'] ?? 0);
|
|
||||||
|
|
||||||
$getLoginAttemptsCount = db_prepare('
|
$getLoginAttemptsCount = db_prepare('
|
||||||
SELECT COUNT(`attempt_id`)
|
SELECT COUNT(`attempt_id`)
|
||||||
FROM `msz_login_attempts`
|
FROM `msz_login_attempts`
|
||||||
WHERE `user_id` = :user_id
|
WHERE `user_id` = :user_id
|
||||||
');
|
');
|
||||||
$getLoginAttemptsCount->bindValue('user_id', $settingsUserId);
|
$getLoginAttemptsCount->bindValue('user_id', $settingsUserId);
|
||||||
$loginAttemptsCount = $getLoginAttemptsCount->execute() ? $getLoginAttemptsCount->fetchColumn() : 0;
|
$loginAttemptsCount = $getLoginAttemptsCount->execute() ? $getLoginAttemptsCount->fetchColumn() : 0;
|
||||||
|
|
||||||
$getLoginAttempts = db_prepare('
|
$getLoginAttempts = db_prepare('
|
||||||
SELECT
|
SELECT
|
||||||
`attempt_id`, `attempt_country`, `was_successful`, `user_agent`, `created_at`,
|
`attempt_id`, `attempt_country`, `was_successful`, `user_agent`, `created_at`,
|
||||||
INET6_NTOA(`attempt_ip`) as `attempt_ip_decoded`
|
INET6_NTOA(`attempt_ip`) as `attempt_ip_decoded`
|
||||||
|
@ -244,20 +211,20 @@ switch ($settingsMode) {
|
||||||
WHERE `user_id` = :user_id
|
WHERE `user_id` = :user_id
|
||||||
ORDER BY `attempt_id` DESC
|
ORDER BY `attempt_id` DESC
|
||||||
LIMIT :offset, :take
|
LIMIT :offset, :take
|
||||||
');
|
');
|
||||||
$getLoginAttempts->bindValue('offset', $loginAttemptsOffset);
|
$getLoginAttempts->bindValue('offset', $loginAttemptsOffset);
|
||||||
$getLoginAttempts->bindValue('take', min(20, max(5, $queryTake)));
|
$getLoginAttempts->bindValue('take', min(20, max(5, $queryTake)));
|
||||||
$getLoginAttempts->bindValue('user_id', $settingsUserId);
|
$getLoginAttempts->bindValue('user_id', $settingsUserId);
|
||||||
$loginAttempts = $getLoginAttempts->execute() ? $getLoginAttempts->fetchAll() : [];
|
$loginAttempts = $getLoginAttempts->execute() ? $getLoginAttempts->fetchAll() : [];
|
||||||
|
|
||||||
$auditLogCount = audit_log_count($settingsUserId);
|
$auditLogCount = audit_log_count($settingsUserId);
|
||||||
$auditLog = audit_log_list(
|
$auditLog = audit_log_list(
|
||||||
$auditLogOffset,
|
$auditLogOffset,
|
||||||
min(20, max(5, $queryTake)),
|
min(20, max(5, $queryTake)),
|
||||||
$settingsUserId
|
$settingsUserId
|
||||||
);
|
);
|
||||||
|
|
||||||
tpl_vars([
|
tpl_vars([
|
||||||
'audit_logs' => $auditLog,
|
'audit_logs' => $auditLog,
|
||||||
'audit_log_count' => $auditLogCount,
|
'audit_log_count' => $auditLogCount,
|
||||||
'audit_log_take' => $queryTake,
|
'audit_log_take' => $queryTake,
|
||||||
|
@ -281,8 +248,6 @@ switch ($settingsMode) {
|
||||||
'login_attempts_offset' => $loginAttemptsOffset,
|
'login_attempts_offset' => $loginAttemptsOffset,
|
||||||
'login_attempts_take' => $queryTake,
|
'login_attempts_take' => $queryTake,
|
||||||
'login_attempts_count' => $loginAttemptsCount,
|
'login_attempts_count' => $loginAttemptsCount,
|
||||||
]);
|
]);
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
echo tpl_render("settings.{$settingsMode}");
|
echo tpl_render('user.settings');
|
||||||
|
|
|
@ -77,14 +77,18 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
{% macro container_title(title, url) %}
|
{% macro container_title(title, url, raw) %}
|
||||||
{% set has_url = url is not null and url|length > 0 %}
|
{% set has_url = url is not null and url|length > 0 %}
|
||||||
|
|
||||||
<div class="container__title">
|
<div class="container__title">
|
||||||
<div class="container__title__background"></div>
|
<div class="container__title__background"></div>
|
||||||
{% if has_url %}<a href="{{ url }}" class="container__title__link">{% endif %}
|
{% if has_url %}<a href="{{ url }}" class="container__title__link">{% endif %}
|
||||||
<div class="container__title__text">
|
<div class="container__title__text">
|
||||||
|
{% if raw %}
|
||||||
|
{{ title|raw }}
|
||||||
|
{% else %}
|
||||||
{{ title }}
|
{{ title }}
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% if has_url %}</a>{% endif %}
|
{% if has_url %}</a>{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,115 +0,0 @@
|
||||||
{% extends 'settings/master.twig' %}
|
|
||||||
{% from 'macros.twig' import container_title %}
|
|
||||||
{% from '_layout/input.twig' import input_hidden, input_csrf, input_text %}
|
|
||||||
|
|
||||||
{% block settings_content %}
|
|
||||||
<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>
|
|
||||||
|
|
||||||
<div class="container container--translucent">
|
|
||||||
{{ container_title('Account') }}
|
|
||||||
|
|
||||||
<form action="" method="post" class="settings__account">
|
|
||||||
{{ input_csrf('settings') }}
|
|
||||||
|
|
||||||
<div class="settings__account__row">
|
|
||||||
{% if settings_disable_account_options %}
|
|
||||||
<div class="settings__account__column settings__account__column--no-margin settings__account__column--disabled">
|
|
||||||
<div class="settings__account__row">
|
|
||||||
<div class="settings__account__column">
|
|
||||||
<div class="settings__account__title">E-mail and Password changing</div>
|
|
||||||
<div class="settings__account__disabled">
|
|
||||||
<a class="input__button" href="https://flashii.net/settings.php?m=account">Go to main site</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% else %}
|
|
||||||
<div class="settings__account__column settings__account__column--no-margin">
|
|
||||||
<div class="settings__account__row">
|
|
||||||
<div class="settings__account__column">
|
|
||||||
<div class="settings__account__title">E-mail</div>
|
|
||||||
|
|
||||||
<label class="settings__account__input">
|
|
||||||
<div class="settings__account__input__name">
|
|
||||||
Current e-mail address
|
|
||||||
</div>
|
|
||||||
<div class="settings__account__input__value">
|
|
||||||
{{ input_text('', 'settings__account__input__value__text', account_info.email) }}
|
|
||||||
</div>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<label class="settings__account__input">
|
|
||||||
<div class="settings__account__input__name">
|
|
||||||
New e-mail Address
|
|
||||||
</div>
|
|
||||||
<div class="settings__account__input__value">
|
|
||||||
{{ input_text('email[new]', 'settings__account__input__value__text') }}
|
|
||||||
</div>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<label class="settings__account__input">
|
|
||||||
<div class="settings__account__input__name">
|
|
||||||
Confirmation
|
|
||||||
</div>
|
|
||||||
<div class="settings__account__input__value">
|
|
||||||
{{ input_text('email[confirm]', 'settings__account__input__value__text') }}
|
|
||||||
</div>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings__account__row">
|
|
||||||
<div class="settings__account__column">
|
|
||||||
<div class="settings__account__title">Password</div>
|
|
||||||
|
|
||||||
<label class="settings__account__input">
|
|
||||||
<div class="settings__account__input__name">
|
|
||||||
New Password
|
|
||||||
</div>
|
|
||||||
<div class="settings__account__input__value">
|
|
||||||
{{ input_text('password[new]', 'settings__account__input__value__text', '', 'password') }}
|
|
||||||
</div>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<label class="settings__account__input">
|
|
||||||
<div class="settings__account__input__name">
|
|
||||||
Confirmation
|
|
||||||
</div>
|
|
||||||
<div class="settings__account__input__value">
|
|
||||||
{{ input_text('password[confirm]', 'settings__account__input__value__text', '', 'password') }}
|
|
||||||
</div>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings__account__row">
|
|
||||||
<div class="settings__account__column">
|
|
||||||
<div class="settings__account__title">Confirmation</div>
|
|
||||||
|
|
||||||
<label class="settings__account__input">
|
|
||||||
<div class="settings__account__input__name">
|
|
||||||
Current Password
|
|
||||||
</div>
|
|
||||||
<div class="settings__account__input__value">
|
|
||||||
{{ input_text('current_password', 'settings__account__input__value__text', '', 'password') }}
|
|
||||||
</div>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% if not settings_disable_account_options %}
|
|
||||||
<div class="settings__account__row settings__account__row--buttons">
|
|
||||||
<button class="input__button">Update</button>
|
|
||||||
<button class="input__button" type="reset">Reset</button>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
|
@ -1,132 +0,0 @@
|
||||||
{% extends 'settings/master.twig' %}
|
|
||||||
{% from 'macros.twig' import pagination, container_title %}
|
|
||||||
|
|
||||||
{% set alpagination = pagination(
|
|
||||||
audit_log_count,
|
|
||||||
audit_log_take,
|
|
||||||
audit_log_offset,
|
|
||||||
'?m=logs'|url_construct({'lo': login_attempts_offset}),
|
|
||||||
false,
|
|
||||||
'ao'
|
|
||||||
) %}
|
|
||||||
{% set lhpagination = pagination(
|
|
||||||
login_attempts_count,
|
|
||||||
login_attempts_take,
|
|
||||||
login_attempts_offset,
|
|
||||||
'?m=logs'|url_construct({'ao': audit_log_offset}),
|
|
||||||
false,
|
|
||||||
'lo'
|
|
||||||
) %}
|
|
||||||
|
|
||||||
{% block settings_content %}
|
|
||||||
<div class="container">
|
|
||||||
{{ container_title('Login History') }}
|
|
||||||
|
|
||||||
<div class="settings__login-history">
|
|
||||||
<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>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{ lhpagination }}
|
|
||||||
|
|
||||||
{% for attempt in user_login_attempts %}
|
|
||||||
<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__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">
|
|
||||||
User Agent
|
|
||||||
</div>
|
|
||||||
<div class="settings__login-history__column__value">
|
|
||||||
{{ attempt.user_agent }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{{ lhpagination }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
{{ container_title('Account Log') }}
|
|
||||||
|
|
||||||
<div class="settings__log">
|
|
||||||
<div class="settings__description">
|
|
||||||
<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>
|
|
||||||
|
|
||||||
{{ 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 class="settings__log__column settings__log__column--date" title="{{ log.log_created|date('r') }}">
|
|
||||||
<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>
|
|
||||||
{% endblock %}
|
|
|
@ -1,34 +0,0 @@
|
||||||
{% extends 'master.twig' %}
|
|
||||||
{% from 'macros.twig' import navigation, container_title %}
|
|
||||||
|
|
||||||
{% set title = 'Settings » ' ~ settings_title %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
{{ navigation(settings_modes|flip, settings_mode, true, '?m=%s') }}
|
|
||||||
|
|
||||||
{% block settings_container %}
|
|
||||||
{% if settings_errors is defined and settings_errors|length > 0 %}
|
|
||||||
<div class="container">
|
|
||||||
{{ container_title('Information') }}
|
|
||||||
|
|
||||||
<div class="container__content">
|
|
||||||
<ul class="settings__errors">
|
|
||||||
{% for error in settings_errors %}
|
|
||||||
<li class="settings__errors__entry">{{ error }}</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% block settings_content %}
|
|
||||||
<div class="container">
|
|
||||||
{{ container_title(title) }}
|
|
||||||
|
|
||||||
<div class="container__content">
|
|
||||||
This is a blank settings page.
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
{% endblock %}
|
|
||||||
{% endblock %}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{% extends 'settings/master.twig' %}
|
|
||||||
|
|
||||||
{% block settings_content %}
|
|
||||||
<p>Could not find what you were looking for.</p>
|
|
||||||
{% endblock %}
|
|
|
@ -1,83 +0,0 @@
|
||||||
{% extends 'settings/master.twig' %}
|
|
||||||
{% from 'macros.twig' import pagination, container_title %}
|
|
||||||
{% from '_layout/input.twig' import input_hidden, input_csrf %}
|
|
||||||
|
|
||||||
{% set spagination = pagination(sessions_count, sessions_take, sessions_offset, '?m=sessions') %}
|
|
||||||
|
|
||||||
{% block settings_content %}
|
|
||||||
<div class="container">
|
|
||||||
{{ container_title('Sessions') }}
|
|
||||||
|
|
||||||
<div class="settings__sessions">
|
|
||||||
<div class="settings__description">
|
|
||||||
<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>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<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 %}
|
|
||||||
<div class="settings__sessions__entry{% if session.session_id == active_session_id %} settings__sessions__entry--current{% endif %}" id="session-{{ session.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>
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{{ spagination }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
335
templates/user/settings.twig
Normal file
335
templates/user/settings.twig
Normal file
|
@ -0,0 +1,335 @@
|
||||||
|
{% extends 'user/master.twig' %}
|
||||||
|
{% from 'macros.twig' import container_title, pagination %}
|
||||||
|
{% from '_layout/input.twig' import input_hidden, input_csrf, input_text %}
|
||||||
|
|
||||||
|
{% set title = 'Settings' %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% 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 %}
|
||||||
|
|
||||||
|
<div class="container" id="account">
|
||||||
|
{{ container_title('<i class="fas fa-user fa-fw"></i> Account', '', true) }}
|
||||||
|
|
||||||
|
<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.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form action="" method="post" class="settings__account">
|
||||||
|
{{ input_csrf('settings') }}
|
||||||
|
|
||||||
|
<div class="settings__account__row">
|
||||||
|
{% if settings_disable_account_options %}
|
||||||
|
<div class="settings__account__column settings__account__column--no-margin settings__account__column--disabled">
|
||||||
|
<div class="settings__account__row">
|
||||||
|
<div class="settings__account__column">
|
||||||
|
<div class="settings__account__title">E-mail and Password changing</div>
|
||||||
|
<div class="settings__account__disabled">
|
||||||
|
<a class="input__button" href="https://flashii.net/settings.php?m=account">Go to main site</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<div class="settings__account__column settings__account__column--no-margin">
|
||||||
|
<div class="settings__account__row">
|
||||||
|
<div class="settings__account__column">
|
||||||
|
<div class="settings__account__title">E-mail</div>
|
||||||
|
|
||||||
|
<label class="settings__account__input">
|
||||||
|
<div class="settings__account__input__name">
|
||||||
|
Current e-mail address
|
||||||
|
</div>
|
||||||
|
<div class="settings__account__input__value">
|
||||||
|
{{ input_text('', 'settings__account__input__value__text', account_info.email) }}
|
||||||
|
</div>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label class="settings__account__input">
|
||||||
|
<div class="settings__account__input__name">
|
||||||
|
New e-mail Address
|
||||||
|
</div>
|
||||||
|
<div class="settings__account__input__value">
|
||||||
|
{{ input_text('email[new]', 'settings__account__input__value__text') }}
|
||||||
|
</div>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label class="settings__account__input">
|
||||||
|
<div class="settings__account__input__name">
|
||||||
|
Confirmation
|
||||||
|
</div>
|
||||||
|
<div class="settings__account__input__value">
|
||||||
|
{{ input_text('email[confirm]', 'settings__account__input__value__text') }}
|
||||||
|
</div>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="settings__account__row">
|
||||||
|
<div class="settings__account__column">
|
||||||
|
<div class="settings__account__title">Password</div>
|
||||||
|
|
||||||
|
<label class="settings__account__input">
|
||||||
|
<div class="settings__account__input__name">
|
||||||
|
New Password
|
||||||
|
</div>
|
||||||
|
<div class="settings__account__input__value">
|
||||||
|
{{ input_text('password[new]', 'settings__account__input__value__text', '', 'password') }}
|
||||||
|
</div>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label class="settings__account__input">
|
||||||
|
<div class="settings__account__input__name">
|
||||||
|
Confirmation
|
||||||
|
</div>
|
||||||
|
<div class="settings__account__input__value">
|
||||||
|
{{ input_text('password[confirm]', 'settings__account__input__value__text', '', 'password') }}
|
||||||
|
</div>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="settings__account__row">
|
||||||
|
<div class="settings__account__column">
|
||||||
|
<div class="settings__account__title">Confirmation</div>
|
||||||
|
|
||||||
|
<label class="settings__account__input">
|
||||||
|
<div class="settings__account__input__name">
|
||||||
|
Current Password
|
||||||
|
</div>
|
||||||
|
<div class="settings__account__input__value">
|
||||||
|
{{ input_text('current_password', 'settings__account__input__value__text', '', 'password') }}
|
||||||
|
</div>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if not settings_disable_account_options %}
|
||||||
|
<div class="settings__account__row settings__account__row--buttons">
|
||||||
|
<button class="input__button">Update</button>
|
||||||
|
<button class="input__button" type="reset">Reset</button>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="container" id="sessions">
|
||||||
|
{{ 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">
|
||||||
|
<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>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="settings__sessions">
|
||||||
|
<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 %}
|
||||||
|
<div class="settings__sessions__entry{% if session.session_id == active_session_id %} settings__sessions__entry--current{% endif %}" id="session-{{ session.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>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{{ spagination }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="container" id="logins">
|
||||||
|
{{ container_title('<i class="fas fa-user-lock fa-fw"></i> Login History', '', true) }}
|
||||||
|
{% set lhpagination = pagination(
|
||||||
|
login_attempts_count,
|
||||||
|
login_attempts_take,
|
||||||
|
login_attempts_offset,
|
||||||
|
'?m=logs'|url_construct({'ao': audit_log_offset}),
|
||||||
|
false,
|
||||||
|
'lo'
|
||||||
|
) %}
|
||||||
|
|
||||||
|
<div class="settings__login-history">
|
||||||
|
<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>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{ lhpagination }}
|
||||||
|
|
||||||
|
{% for attempt in user_login_attempts %}
|
||||||
|
<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__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">
|
||||||
|
User Agent
|
||||||
|
</div>
|
||||||
|
<div class="settings__login-history__column__value">
|
||||||
|
{{ attempt.user_agent }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{{ lhpagination }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="container" id="log">
|
||||||
|
{{ container_title('<i class="fas fa-file-alt fa-fw"></i> Account Log', '', true) }}
|
||||||
|
{% 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__log">
|
||||||
|
<div class="settings__description">
|
||||||
|
<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>
|
||||||
|
|
||||||
|
{{ 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 class="settings__log__column settings__log__column--date" title="{{ log.log_created|date('r') }}">
|
||||||
|
<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>
|
||||||
|
{% endblock %}
|
Loading…
Add table
Reference in a new issue