Skip to content

Commit

Permalink
Add MAINTENANCE_MODE_LOGOUT_AUTHENTICATED_USER setting support. #139
Browse files Browse the repository at this point in the history
  • Loading branch information
fabiocaccamo committed Dec 11, 2023
1 parent c7386db commit 1761b24
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 12 deletions.
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,11 @@ MAINTENANCE_MODE_IGNORE_URLS = ()
MAINTENANCE_MODE_IGNORE_TESTS = False
```

```python
# if True authenticated users will be logged out from their current session
MAINTENANCE_MODE_LOGOUT_AUTHENTICATED_USER = False
```

```python
# the absolute url where users will be redirected to during maintenance-mode
MAINTENANCE_MODE_REDIRECT_URL = None
Expand Down
7 changes: 6 additions & 1 deletion maintenance_mode/http.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import sys

from django.conf import settings
from django.contrib.auth import logout
from django.core.exceptions import ImproperlyConfigured
from django.shortcuts import redirect, render
from django.urls import NoReverseMatch, Resolver404, resolve, reverse
Expand Down Expand Up @@ -39,7 +40,7 @@ def get_maintenance_response(request):
request,
settings.MAINTENANCE_MODE_TEMPLATE,
status=settings.MAINTENANCE_MODE_STATUS_CODE,
**kwargs
**kwargs,
)
response["Retry-After"] = settings.MAINTENANCE_MODE_RETRY_AFTER
add_never_cache_headers(response)
Expand Down Expand Up @@ -87,6 +88,10 @@ def _need_maintenance_ignore_users(request):

user = request.user

if settings.MAINTENANCE_MODE_LOGOUT_AUTHENTICATED_USER and user.is_authenticated:
logout(request)
user = request.user

if settings.MAINTENANCE_MODE_IGNORE_ANONYMOUS_USER and user.is_anonymous:
return False

Expand Down
3 changes: 3 additions & 0 deletions maintenance_mode/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@
if not hasattr(settings, "MAINTENANCE_MODE_IGNORE_URLS"):
settings.MAINTENANCE_MODE_IGNORE_URLS = None

if not hasattr(settings, "MAINTENANCE_MODE_LOGOUT_AUTHENTICATED_USER"):
settings.MAINTENANCE_MODE_LOGOUT_AUTHENTICATED_USER = False

if not hasattr(settings, "MAINTENANCE_MODE_REDIRECT_URL"):
settings.MAINTENANCE_MODE_REDIRECT_URL = None

Expand Down
48 changes: 37 additions & 11 deletions tests/tests.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import os
import re
import sys
from importlib import import_module
from io import StringIO
from tempfile import mkstemp
from unittest.mock import patch
Expand Down Expand Up @@ -99,30 +100,32 @@ def tearDown(self):

def assertMaintenanceResponse(self, response):
self.assertTemplateUsed(settings.MAINTENANCE_MODE_TEMPLATE)
self.assertTrue(response is not None)
self.assertEqual(response.status_code, settings.MAINTENANCE_MODE_STATUS_CODE)

def assertOkResponse(self, response):
self.assertTrue(response is not None)
self.assertEqual(response.status_code, 200)

def __get_anonymous_user_request(self, url):
def __get_request_for_user_and_url(self, user, url):
request = self.request_factory.get(url)
request.user = self.anonymous_user
request.user = user
engine = import_module(settings.SESSION_ENGINE)
request.session = engine.SessionStore()
request.session.save()
return request

def __get_anonymous_user_request(self, url):
return self.__get_request_for_user_and_url(self.anonymous_user, url)

def __get_authenticated_user_request(self, url):
request = self.request_factory.get(url)
request.user = self.authenticated_user
return request
return self.__get_request_for_user_and_url(self.authenticated_user, url)

def __get_staff_user_request(self, url):
request = self.request_factory.get(url)
request.user = self.staff_user
return request
return self.__get_request_for_user_and_url(self.staff_user, url)

def __get_superuser_request(self, url):
request = self.request_factory.get(url)
request.user = self.superuser
return request
return self.__get_request_for_user_and_url(self.superuser, url)

def __login_staff_user(self):
self.client.login(username="staff-user", password="test")
Expand Down Expand Up @@ -826,6 +829,29 @@ def test_middleware_ignore_ip_addresses_get_client_ip_address(self):
response = self.middleware.process_request(request)
self.assertMaintenanceResponse(response)

def test_middleware_logout_authenticated_user(self):
self.__reset_state()

settings.MAINTENANCE_MODE = True

settings.MAINTENANCE_MODE_IGNORE_ANONYMOUS_USER = True
settings.MAINTENANCE_MODE_LOGOUT_AUTHENTICATED_USER = True
request = self.__get_authenticated_user_request("/")
response = self.middleware.process_request(request)
self.assertEqual(response, None)

settings.MAINTENANCE_MODE_IGNORE_ANONYMOUS_USER = False
settings.MAINTENANCE_MODE_LOGOUT_AUTHENTICATED_USER = True
request = self.__get_authenticated_user_request("/")
response = self.middleware.process_request(request)
self.assertMaintenanceResponse(response)

settings.MAINTENANCE_MODE_IGNORE_ANONYMOUS_USER = False
settings.MAINTENANCE_MODE_LOGOUT_AUTHENTICATED_USER = False
request = self.__get_authenticated_user_request("/")
response = self.middleware.process_request(request)
self.assertMaintenanceResponse(response)

def test_middleware_ignore_anonymous_user(self):
self.__reset_state()

Expand Down

0 comments on commit 1761b24

Please sign in to comment.