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 %}