From bc2a7e1fdee764dcb9b0b259451818a7c6bf74c7 Mon Sep 17 00:00:00 2001 From: Franciszek Stachura Date: Fri, 27 Jun 2025 15:54:41 +0200 Subject: [PATCH 1/2] web: use GET for ident search form With POST, if Anubis triggers on search request, user will be redirected back to home page. --- elixir/web.py | 34 +++++++++++++++++++++------------- templates/topbar.html | 2 +- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/elixir/web.py b/elixir/web.py index 23b1265c..edeef66f 100755 --- a/elixir/web.py +++ b/elixir/web.py @@ -271,34 +271,42 @@ def stringify_ident_path(project, version, family, ident) -> str: path = f'{ get_ident_base_url(project, version, family) }/{ parse.quote(ident, safe="") }' return path.rstrip('/') -# Handles redirect on a POST to ident resource +# Handles redirect from ident with form (POST/GET with query parameters) +# to default ident URL format class IdentPostRedirectResource: - def on_get(self, req, resp, project, version, family=None, ident=None): - project, version, _ = validate_project_and_version(req.context, project, version) - resp.status = falcon.HTTP_FOUND - resp.location = stringify_source_path(project, version, "") + def on_get(self, req, resp, project: str, version: str, family: str|None = None, _ident: str|None = None): + get_ident = req.get_param('i', required=False) + get_family = req.get_param('f', required=False) + if get_ident is None: + project, version, _ = validate_project_and_version(req.context, project, version) + resp.status = falcon.HTTP_FOUND + resp.location = stringify_source_path(project, version, "") + else: + return self.handle(req, resp, project, version, get_ident, get_family) def on_post(self, req, resp, project: str, version: str, family: str|None = None, _ident: str|None = None): - project, version, query = validate_project_and_version(req.context, project, version) - form = req.get_media() post_ident = form.get('i') post_family = form.get('f') + return self.handle(req, resp, project, version, post_ident, post_family) - if not validFamily(post_family): - post_family = 'C' + def handle(self, req, resp, project: str, version: str, ident: str, family: str): + project, version, query = validate_project_and_version(req.context, project, version) + + if not validFamily(family): + family = 'C' - if not post_ident: + if not ident: raise ElixirProjectError('Error', 'Invalid identifier', project=project, version=version, query=query, extra_template_args={ - 'searched_ident': parse.unquote(form.get('i')), + 'searched_ident': parse.unquote(ident), 'current_family': family, }) - post_ident = post_ident.strip() + ident = ident.strip() resp.status = falcon.HTTP_MOVED_PERMANENTLY - resp.location = stringify_ident_path(project, version, post_family, post_ident) + resp.location = stringify_ident_path(project, version, family, ident) query.close() diff --git a/templates/topbar.html b/templates/topbar.html index 171b107e..9a20e6f5 100644 --- a/templates/topbar.html +++ b/templates/topbar.html @@ -8,7 +8,7 @@ {% endfor %}