From 204b93d6115a45e1d41b92f525a51af8d82c7fbb Mon Sep 17 00:00:00 2001 From: A R R R Associates Date: Tue, 1 Sep 2026 14:08:46 +0530 Subject: [PATCH] Fix redirect after firm task sync --- app/modules/services/ui.py | 46 +++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/app/modules/services/ui.py b/app/modules/services/ui.py index aee9a97..0478747 100644 --- a/app/modules/services/ui.py +++ b/app/modules/services/ui.py @@ -2557,17 +2557,43 @@ def sync_system_default_tasks_for_firm(request: Request, catalogue_id: int): ) db.commit() - return RedirectResponse( - url=( - f"/services/catalogue/{catalogue_id}/firm-tasks" - f"?sync_success=1" - f"&created={result.created}" - f"&updated={result.updated}" - f"&unchanged={result.unchanged}" - f"&duplicates_disabled={result.duplicates_disabled}" - ), - status_code=303, + # Return to the actual page that submitted the sync action instead of + # assuming a hard-coded firm-task-list URL. This preserves the current + # production routing structure. + from urllib.parse import parse_qsl, urlencode, urlsplit, urlunsplit + + referer = request.headers.get("referer") or f"/services/catalogue/{catalogue_id}" + parsed = urlsplit(referer) + + # Prevent an external/open redirect. For a normal browser form POST the + # Referer is same-origin; if it is not, fall back to the Services page. + request_host = request.headers.get("host", "") + if parsed.netloc and parsed.netloc != request_host: + referer = f"/services/catalogue/{catalogue_id}" + parsed = urlsplit(referer) + + query = dict(parse_qsl(parsed.query, keep_blank_values=True)) + query.update( + { + "sync_success": "1", + "created": str(result.created), + "updated": str(result.updated), + "unchanged": str(result.unchanged), + "duplicates_disabled": str(result.duplicates_disabled), + } ) + + redirect_url = urlunsplit( + ( + parsed.scheme, + parsed.netloc, + parsed.path, + urlencode(query), + parsed.fragment, + ) + ) + + return RedirectResponse(url=redirect_url, status_code=303) except Exception: db.rollback() raise