diff --git a/poetry.lock b/poetry.lock index b536628..9822038 100644 --- a/poetry.lock +++ b/poetry.lock @@ -52,6 +52,14 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +[[package]] +name = "cachelib" +version = "0.9.0" +description = "A collection of cache libraries in the same API interface." +category = "main" +optional = false +python-versions = ">=3.7" + [[package]] name = "certifi" version = "2022.12.7" @@ -324,6 +332,18 @@ importlib-resources = "*" oic = ">=1.4.0" requests = "*" +[[package]] +name = "flask-session" +version = "0.4.0" +description = "Adds server-side session support to your Flask application" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +cachelib = "*" +Flask = ">=0.8" + [[package]] name = "flask-sqlalchemy" version = "3.0.2" @@ -1051,7 +1071,7 @@ test = ["flake8", "pytest", "pytest-cov", "tox", "tox-docker"] [metadata] lock-version = "1.1" python-versions = ">=3.9,<3.10" -content-hash = "da0623cd9b5bbeab4e35b6238ea292d02912197dd70c0daa4aa60db53889e244" +content-hash = "396bb70834873422f83a21bf4b3b0187897af25e4f99f456d77e4dc4c633c882" [metadata.files] alembic = [ @@ -1064,6 +1084,10 @@ attrs = [ ] automat = [] blinker = [] +cachelib = [ + {file = "cachelib-0.9.0-py3-none-any.whl", hash = "sha256:811ceeb1209d2fe51cd2b62810bd1eccf70feba5c52641532498be5c675493b3"}, + {file = "cachelib-0.9.0.tar.gz", hash = "sha256:38222cc7c1b79a23606de5c2607f4925779e37cdcea1c2ad21b8bae94b5425a5"}, +] certifi = [ {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, @@ -1196,6 +1220,10 @@ flask-pydantic = [] flask-pyoidc = [ {file = "Flask_pyoidc-3.11.0-py3-none-any.whl", hash = "sha256:3aff4a9d5be08eaafe890a1bccdf3869eacf294ba9712c577e25bc11edbd72a7"}, ] +flask-session = [ + {file = "Flask-Session-0.4.0.tar.gz", hash = "sha256:c9ed54321fa8c4ca0132ffd3369582759eda7252fb4b3bee480e690d1ba41f46"}, + {file = "Flask_Session-0.4.0-py2.py3-none-any.whl", hash = "sha256:1e3f8a317005db72c831f85d884a5a9d23145f256c730d80b325a3150a22c3db"}, +] flask-sqlalchemy = [] future = [ {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, diff --git a/pyproject.toml b/pyproject.toml index 9a23318..2124a80 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,6 +43,7 @@ Flask-Pydantic = "^0.11.0" email-validator = "^1.3.0" python-ldap = "^3.4.3" Flask-pyoidc = "^3.11.0" +Flask-Session = "^0.4.0" [tool.poetry.extras] test = [ diff --git a/resultsdb/__init__.py b/resultsdb/__init__.py index 99669f6..f1c3090 100644 --- a/resultsdb/__init__.py +++ b/resultsdb/__init__.py @@ -32,6 +32,7 @@ ProviderMetadata, ) from flask_pyoidc.user_session import UserSession +from flask_session import Session from resultsdb.proxy import ReverseProxied from resultsdb.controllers.main import main @@ -103,6 +104,9 @@ def create_app(config_obj=None): db.init_app(app) + app.config["SESSION_SQLALCHEMY"] = db + app.server_session = Session(app) + register_handlers(app) if app.config["AUTH_MODULE"] == "oidc": diff --git a/resultsdb/config.py b/resultsdb/config.py index f282270..910d842 100644 --- a/resultsdb/config.py +++ b/resultsdb/config.py @@ -89,6 +89,12 @@ class Config(object): OIDC_SESSION_PERMANENT = False PERMANENT_SESSION_LIFETIME = 300 + SESSION_TYPE = "sqlalchemy" + SESSION_PERMANENT = True + SESSION_USE_SIGNER = True + SESSION_COOKIE_SECURE = True + SESSION_COOKIE_SAMESITE = "Lax" + FEDMENU_URL = "https://apps.fedoraproject.org/fedmenu" FEDMENU_DATA_URL = "https://apps.fedoraproject.org/js/data.js" diff --git a/testing/functest_api_v20.py b/testing/functest_api_v20.py index d07242f..d6601e3 100644 --- a/testing/functest_api_v20.py +++ b/testing/functest_api_v20.py @@ -22,6 +22,7 @@ import os import copy from unittest import TestCase +from unittest.mock import patch from flask import current_app as app @@ -1178,8 +1179,9 @@ def test_healthcheck_success(self): assert data.get("message") == "Health check OK" def test_healthcheck_fail(self): - db.drop_all() - r = self.app.get("/api/v2.0/healthcheck") + with patch("resultsdb.controllers.api_v2.db") as db: + db.session.execute.side_effect = RuntimeError("Testing DB outage") + r = self.app.get("/api/v2.0/healthcheck") assert r.status_code == 503 data = json.loads(r.data)