Date: 2026-03-05
Scope: diff from merge-base c7e840305791774a7a61806588dee045686f2f86 to HEAD
Verification: ./gradlew compileJava passed
Status: reviewed findings below are fixed
Files:
Problem:
- protocol-relative URLs like
//host/...could pass - non-HTTP schemes like
javascript:could pass - same-origin validation only covered
scheme://...inputs
Fix:
- removed the permissive regex-based check
- switched validation to
new URL(url, window.location.href) - now only
http:andhttps:are allowed - navigation is limited to the current origin
- navigation is additionally limited to the current application context path
- double-decoding of
urlwas removed
Result:
- shell navigation via
?url=now accepts only internal app URLs
Files:
Problem:
- when an inner page redirected itself into
app-shell.html, onlypathname + searchwas preserved - deep links to anchors, message IDs, and other in-page targets were lost
Fix:
- redirect URL now preserves
self.location.hashtogether withpathnameandsearch
Result:
- direct links such as
/task/124?thisframe=true#456survive the shell redirect correctly
Files:
Problem:
URLSearchParams.get('url')already returns a decoded value- extra
decodeURIComponent()could corrupt valid encoded URLs or throw on malformed%input
Fix:
- removed the unconditional extra decode
- validation and iframe navigation now use the
URLSearchParamsvalue directly
Result:
- shell bootstrap is stable for encoded internal URLs and malformed double-decoding cases are eliminated
File:
Decision:
- WebDAV support is not needed
- no action required for the removed
/task/webdav/*forwarding path