From 8fad7b1e1fbd3ffc7355fdb9c8ebee757d45efce Mon Sep 17 00:00:00 2001
From: Matthias Mair <code@mjmair.com>
Date: Wed, 26 Jun 2024 12:10:09 +0200
Subject: [PATCH] reimplement session ending

---
 src/backend/InvenTree/InvenTree/urls.py         | 17 +++++++++++------
 src/backend/InvenTree/InvenTree/views.py        | 10 ++++++++++
 .../templates/InvenTree/settings/user.html      |  2 +-
 3 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/src/backend/InvenTree/InvenTree/urls.py b/src/backend/InvenTree/InvenTree/urls.py
index 99b9814d99..62ded2c50f 100644
--- a/src/backend/InvenTree/InvenTree/urls.py
+++ b/src/backend/InvenTree/InvenTree/urls.py
@@ -47,6 +47,7 @@ from .views import (
     AppearanceSelectView,
     CustomConnectionsView,
     CustomEmailView,
+    CustomListUserSessionsView,
     CustomLoginView,
     CustomPasswordResetFromKeyView,
     DatabaseStatsView,
@@ -356,6 +357,12 @@ classic_frontendpatterns = [
     path('about/', AboutView.as_view(), name='about'),
     path('stats/', DatabaseStatsView.as_view(), name='stats'),
     # Single Sign On / allauth
+    path(
+        'accounts/sessions/',
+        view=CustomListUserSessionsView.as_view(),
+        name='usersessions_list',
+    ),
+    path('accounts/', include('allauth.urls')),
     # overrides of urlpatterns
     path('accounts/email/', CustomEmailView.as_view(), name='account_email'),
     path(
@@ -392,21 +399,19 @@ frontendpatterns = []
 if settings.ENABLE_CLASSIC_FRONTEND:
     frontendpatterns += classic_frontendpatterns
 
-# Add auth
-frontendpatterns += [
-    path('accounts/', include('allauth.urls'))  # Always needed as we need providers
-]
-
 if settings.ENABLE_PLATFORM_FRONTEND:
     frontendpatterns += platform_urls
     if not settings.ENABLE_CLASSIC_FRONTEND:
         # Add a redirect for login views
         frontendpatterns += [
+            path(
+                'accounts/', include('allauth.urls')
+            ),  # Still needed for provider login
             path(
                 'accounts/login/',
                 RedirectView.as_view(url=settings.FRONTEND_URL_BASE, permanent=False),
                 name='account_login',
-            )
+            ),
         ]
 
 urlpatterns += frontendpatterns
diff --git a/src/backend/InvenTree/InvenTree/views.py b/src/backend/InvenTree/InvenTree/views.py
index d43383af54..c428be3335 100644
--- a/src/backend/InvenTree/InvenTree/views.py
+++ b/src/backend/InvenTree/InvenTree/views.py
@@ -20,6 +20,7 @@ from allauth.account.models import EmailAddress
 from allauth.account.views import EmailView, LoginView, PasswordResetFromKeyView
 from allauth.socialaccount.forms import DisconnectForm
 from allauth.socialaccount.views import ConnectionsView
+from allauth.usersessions.views import ListUserSessionsView
 from djmoney.contrib.exchange.models import ExchangeBackend, Rate
 
 import common.currency
@@ -582,6 +583,15 @@ class AboutView(AjaxView):
     ajax_form_title = _('About InvenTree')
 
 
+class CustomListUserSessionsView(ListUserSessionsView):
+    """A view to delete all other sessions."""
+
+    def form_valid(self, form):
+        """Delete all other sessions."""
+        super().form_valid(form)
+        return HttpResponseRedirect(reverse_lazy('settings'))
+
+
 class NotificationsView(TemplateView):
     """View for showing notifications."""
 
diff --git a/src/backend/InvenTree/templates/InvenTree/settings/user.html b/src/backend/InvenTree/templates/InvenTree/settings/user.html
index d621b3d5b3..aa06bf3e60 100644
--- a/src/backend/InvenTree/templates/InvenTree/settings/user.html
+++ b/src/backend/InvenTree/templates/InvenTree/settings/user.html
@@ -168,7 +168,7 @@
             {% include "spacer.html" %}
             <div class='btn-group' role='group'>
                 {% if session_list.count > 1 %}
-                <form method="post" action="{% url 'session_delete_other' %}">
+                <form method="post" action="{% url 'usersessions_list' %}">
                     {% csrf_token %}
                     <button type="submit" class="btn btn-sm btn-default btn-danger" title='{% trans "Log out active sessions (except this one)" %}'>
                         <span class='fas fa-sign-out-alt'></span> {% trans "Log Out Active Sessions" %}