diff --git a/assets/less/classes/settings/container.less b/assets/less/classes/settings/container.less
index 38bc6875..af1112f1 100644
--- a/assets/less/classes/settings/container.less
+++ b/assets/less/classes/settings/container.less
@@ -1,4 +1,5 @@
.settings__container {
+ overflow: auto;
&:not(:last-child) {
margin-bottom: 2px;
diff --git a/assets/less/classes/settings/session.less b/assets/less/classes/settings/session.less
index d288d570..9555d315 100644
--- a/assets/less/classes/settings/session.less
+++ b/assets/less/classes/settings/session.less
@@ -1,83 +1,74 @@
-@mio-settings-sessions-mobile: 1000px;
-
.settings__session {
- margin: 1px;
+ margin: 4px;
+ border: 1px solid var(--accent-colour);
+ border-radius: 2px;
+ overflow: hidden;
- &__country {
- vertical-align: middle;
+ &--current {
+ // todo: make this now bad
+ background-image: linear-gradient(0deg, #111c, #111c);
+ background-color: var(--accent-colour);
}
- @media (max-width: @mio-settings-sessions-mobile) {
- &__button {
- width: 100%;
- text-align: center;
- }
+ &__important {
+ display: flex;
+ align-items: 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 {
+ flex: 0 0 auto;
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;
- border: 1px solid var(--accent-colour);
- justify-content: space-between;
- padding: 1px;
flex-wrap: wrap;
-
- &:not(:last-child) {
- margin-bottom: 1px;
- }
-
- &--current {
- background-color: #c2affe;
- }
}
- &__column {
- flex-grow: 1;
+ &__detail {
+ display: inline-block;
+ margin-right: 2px;
+ min-width: 120px;
- &:not(:last-child) {
- margin-left: 5px;
- 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 {
+ &__title {
+ border-bottom: 1px solid var(--accent-colour);
font-weight: 700;
+ padding: 1px 5px;
+ }
+
+ &__value {
+ padding: 1px 5px;
}
}
}
diff --git a/assets/less/classes/settings/sessions.less b/assets/less/classes/settings/sessions.less
new file mode 100644
index 00000000..445bab4c
--- /dev/null
+++ b/assets/less/classes/settings/sessions.less
@@ -0,0 +1,12 @@
+.settings__sessions {
+
+ &__all {
+ display: flex;
+ justify-content: center;
+ margin: 10px;
+ }
+
+ &__pagination {
+ margin: 4px;
+ }
+}
diff --git a/assets/less/main.less b/assets/less/main.less
index 166ebb3e..315fc6af 100644
--- a/assets/less/main.less
+++ b/assets/less/main.less
@@ -127,6 +127,7 @@ body {
@import "classes/settings/log";
@import "classes/settings/login-history";
@import "classes/settings/session";
+@import "classes/settings/sessions";
// News
@import "classes/news/container";
diff --git a/public/settings.php b/public/settings.php
index b8ce5892..fbdd1719 100644
--- a/public/settings.php
+++ b/public/settings.php
@@ -29,31 +29,35 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!csrf_verify('settings', $_POST['csrf'] ?? '')) {
$settingsErrors[] = MSZ_TMP_USER_ERROR_STRINGS['csrf'];
} else {
- if (!empty($_POST['session_action'])) {
- switch ($_POST['session_action']) {
- case 'kill-all':
- user_session_purge_all($settingsUserId);
- audit_log('PERSONAL_SESSION_DESTROY_ALL', $settingsUserId);
- header('Location: /');
- return;
+ if (!empty($_POST['session'])) {
+ $currentSessionKilled = false;
+
+ if (is_array($_POST['session'])) {
+ foreach ($_POST['session'] as $sessionId) {
+ $sessionId = intval($sessionId);
+ $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'])) {
- $session = user_session_find((int)($_POST['session'] ?? 0));
-
- 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'));
+ if ($currentSessionKilled) {
+ header('Location: /');
return;
- } else {
- user_session_delete($session['session_id']);
- audit_log('PERSONAL_SESSION_DESTROY', $settingsUserId, [
- $session['session_id'],
- ]);
}
}
diff --git a/templates/master.twig b/templates/master.twig
index 7d344a44..0f4fb276 100644
--- a/templates/master.twig
+++ b/templates/master.twig
@@ -4,8 +4,8 @@
{% include '_layout/meta.twig' %}
-
+
{% if site_background is defined %}