Fix redirect after firm task sync
This commit is contained in:
+36
-10
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user