From f22cd39ebff5404f53438dc8a0b3fd1f13314d60 Mon Sep 17 00:00:00 2001 From: Maximilian Moser <maximilian.moser@tuwien.ac.at> Date: Tue, 4 Feb 2025 11:59:50 +0100 Subject: [PATCH 1/2] Override Flask URL adapter behavior regarding `SERVER_NAME` * to fix our multi-domain setup with Flask 2.x and 3.0 * see: https://github.com/pallets/flask/pull/5634 * this can be removed once we get Flask 3.1+ in --- invenio_config_tuw/startup.py | 54 +++++++++++++++++++++++++++++++++++ pyproject.toml | 2 ++ 2 files changed, 56 insertions(+) diff --git a/invenio_config_tuw/startup.py b/invenio_config_tuw/startup.py index 03c5677..4fa84a4 100644 --- a/invenio_config_tuw/startup.py +++ b/invenio_config_tuw/startup.py @@ -16,6 +16,7 @@ initialized, and thus we can rely on them being already available. from logging import ERROR from logging.handlers import SMTPHandler +import importlib_metadata from invenio_rdm_records.services.search_params import MyDraftsParam from invenio_requests.proxies import current_request_type_registry @@ -106,3 +107,56 @@ def register_menu_entries(app): def customize_curation_request_type(app): """Override the rdm-curations request type with our own version.""" current_request_type_registry.register_type(TUWCurationRequest(), force=True) + + +def patch_flask_create_url_adapter(app): + """Patch Flask's {host,subdomain}_matching with 3.1 behavior. + + See: https://github.com/pallets/flask/pull/5634 + + This can be removed once we get Flask 3.1+ in. + """ + flask_version = importlib_metadata.version("flask").split(".", 2) + major = int(flask_version[0]) + minor = int(flask_version[1]) + if (major == 3 and minor >= 1) or (major > 3): + app.logger.info( + f"Flask version is {flask_version} (>= 3.1). " + "Skipping monkey patching app.create_url_adapter()." + ) + return + + def create_url_adapter(self, request): + """Create a URL adapter for the given request. + + This function is from Flask 3.1, which is licensed under the 3-clause BSD. + """ + if request is not None: + subdomain = None + server_name = self.config["SERVER_NAME"] + + if self.url_map.host_matching: + # Don't pass SERVER_NAME, otherwise it's used and the actual + # host is ignored, which breaks host matching. + server_name = None + elif not self.subdomain_matching: + # Werkzeug doesn't implement subdomain matching yet. Until then, + # disable it by forcing the current subdomain to the default, or + # the empty string. + subdomain = self.url_map.default_subdomain or "" + + return self.url_map.bind_to_environ( + request.environ, server_name=server_name, subdomain=subdomain + ) + + # Need at least SERVER_NAME to match/build outside a request. + if self.config["SERVER_NAME"] is not None: + return self.url_map.bind( + self.config["SERVER_NAME"], + script_name=self.config["APPLICATION_ROOT"], + url_scheme=self.config["PREFERRED_URL_SCHEME"], + ) + + return None + + app.create_url_adapter = create_url_adapter.__get__(app, type(app)) diff --git a/pyproject.toml b/pyproject.toml index a754736..e3e12da 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -81,11 +81,13 @@ invenio_config_tuw_mail_handler = "invenio_config_tuw.startup:register_smtp_erro invenio_config_tuw_search_drafts = "invenio_config_tuw.startup:override_search_drafts_options" invenio_config_tuw_curation_settings = "invenio_config_tuw.startup:register_menu_entries" invenio_config_tuw_curation_request = "invenio_config_tuw.startup:customize_curation_request_type" +invenio_config_tuw_patch_flask = "invenio_config_tuw.startup:patch_flask_create_url_adapter" [project.entry-points."invenio_base.api_finalize_app"] invenio_config_tuw_mail_handler = "invenio_config_tuw.startup:register_smtp_error_handler" invenio_config_tuw_search_drafts = "invenio_config_tuw.startup:override_search_drafts_options" invenio_config_tuw_curation_request = "invenio_config_tuw.startup:customize_curation_request_type" +invenio_config_tuw_patch_flask = "invenio_config_tuw.startup:patch_flask_create_url_adapter" [project.entry-points."invenio_celery.tasks"] invenio_config_tuw = "invenio_config_tuw.tasks" -- GitLab From 231f2913e7877607a7b60d30c9b95d056ce76098 Mon Sep 17 00:00:00 2001 From: Maximilian Moser <maximilian.moser@tuwien.ac.at> Date: Tue, 4 Feb 2025 12:05:08 +0100 Subject: [PATCH 2/2] Bump version to v2025.1.1 --- CHANGES.rst | 6 ++++++ invenio_config_tuw/__init__.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 62e3a6c..dd8daae 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -8,6 +8,12 @@ Changes ======= + +Version 2025.1.1 (released 2025-02-04) + +- Override `Flask.create_url_adapter()` to match v3.1 regarding `SERVER_NAME` + + Version 2025.1.0 (released 2025-01-31) - Add `Invenio-Curations` as a dependency diff --git a/invenio_config_tuw/__init__.py b/invenio_config_tuw/__init__.py index 300d048..0e0113e 100644 --- a/invenio_config_tuw/__init__.py +++ b/invenio_config_tuw/__init__.py @@ -9,6 +9,6 @@ from .ext import InvenioConfigTUW -__version__ = "2025.1.0" +__version__ = "2025.1.1" __all__ = ("__version__", "InvenioConfigTUW") -- GitLab