← Back to team overview

sts-sponsors team mailing list archive

[Merge] ~emdw/maas:timeout-configuration into maas:master

 

Eline Maaike De Weerd has proposed merging ~emdw/maas:timeout-configuration into maas:master.

Commit message:
added session_timeout to config items, and a maas sessionstore as session_engine in the settings



Requested reviews:
  MAAS Maintainers (maas-maintainers)

For more details, see:
https://code.launchpad.net/~emdw/maas/+git/maas/+merge/435525
-- 
Your team MAAS Maintainers is requested to review the proposed merge of ~emdw/maas:timeout-configuration into maas:master.
diff --git a/src/maasserver/djangosettings/settings.py b/src/maasserver/djangosettings/settings.py
index b838bd1..9cf2d4d 100644
--- a/src/maasserver/djangosettings/settings.py
+++ b/src/maasserver/djangosettings/settings.py
@@ -293,6 +293,7 @@ INSTALLED_APPS = (
     "piston3",
 )
 
+SESSION_ENGINE = "maasserver.sessiontimeout"
 
 # See http://docs.djangoproject.com/en/dev/topics/logging for more details on
 # how to customize the logging configuration. At present all logging config is
diff --git a/src/maasserver/forms/__init__.py b/src/maasserver/forms/__init__.py
index 7c8aca6..4fc8031 100644
--- a/src/maasserver/forms/__init__.py
+++ b/src/maasserver/forms/__init__.py
@@ -1715,6 +1715,7 @@ class MAASForm(ConfigForm):
     maas_name = get_config_field("maas_name")
     theme = get_config_field("theme")
     enable_analytics = get_config_field("enable_analytics")
+    session_length = get_config_field("session_length")
 
 
 class ProxyForm(ConfigForm):
diff --git a/src/maasserver/forms/settings.py b/src/maasserver/forms/settings.py
index ea3598e..8b9bd27 100644
--- a/src/maasserver/forms/settings.py
+++ b/src/maasserver/forms/settings.py
@@ -1054,6 +1054,20 @@ CONFIG_ITEMS = {
             "max_value": 90,
         },
     },
+    "session_length": {
+        "default": 1209600,
+        "form": forms.IntegerField,
+        "form_kwargs": {
+            "label": "Session timeout (seconds)",
+            "required": False,
+            "help_text": (
+                "Configure timeout of session (seconds). "
+                "Minimum 10s, maximum 2 weeks (1209600s)."
+            ),
+            "min_value": 10,
+            "max_value": 1209600,
+        },
+    },
 }
 
 
diff --git a/src/maasserver/forms/tests/test_settings.py b/src/maasserver/forms/tests/test_settings.py
index 010dbfb..a3e854c 100644
--- a/src/maasserver/forms/tests/test_settings.py
+++ b/src/maasserver/forms/tests/test_settings.py
@@ -123,3 +123,14 @@ class TestMAASThemeConfigSettings(MAASServerTestCase):
         value = [1, 2, 3]
         field = get_config_field("theme")
         self.assertEqual(str(value), field.clean(value))
+
+
+class TestMAASSessionTimeoutSettings(MAASServerTestCase):
+    def test_default_value(self):
+        form = get_config_form("session_length")
+        self.assertEqual({"session_length": 1209600}, form.initial)
+
+    def test_session_config(self):
+        value = 300
+        field = get_config_field("session_length")
+        self.assertEqual(value, field.clean(value))
diff --git a/src/maasserver/models/config.py b/src/maasserver/models/config.py
index 55dc312..6f840b1 100644
--- a/src/maasserver/models/config.py
+++ b/src/maasserver/models/config.py
@@ -146,6 +146,8 @@ def get_default_config():
         "vault_enabled": False,
         # Windows settings
         "windows_kms_host": None,
+        # Session timeout length (s)
+        "session_length": 1209600,
     }
 
 
diff --git a/src/maasserver/sessiontimeout.py b/src/maasserver/sessiontimeout.py
new file mode 100644
index 0000000..1c70766
--- /dev/null
+++ b/src/maasserver/sessiontimeout.py
@@ -0,0 +1,19 @@
+""" Custom sessionstore for a user-configurable session timeout. """
+
+from django.contrib.sessions.backends.db import SessionStore as DBStore
+
+from maasserver.models import Config
+
+
+def _get_timeout() -> int:
+    timeout = Config.objects.get_config("session_length")
+    return timeout
+
+
+class SessionStore(DBStore):
+    def __init__(self, session_key=None):
+        super().__init__(session_key)
+        self["_session_expiry"] = _get_timeout()
+
+    def get_session_cookie_age(self) -> int:
+        return _get_timeout()

Follow ups