detached d823634

fix: allow webkit config api opaque origin

commit
d8236344e7e18e56d535616acd15ec584501a44b
author
brice · · 2026-06-24 04:29 UTC
parent
13cc5a8
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
2 files · +27 -1
M internal/infrastructure/webkit/scheme_handler.go +1 -1
@@ -265,7 +265,7 @@ func isTrustedSystemviewAPIRequest(req *SchemeRequest) bool {
265265 return false
266266 }
267267 origin := strings.TrimSpace(req.Origin)
268- if origin != "" {
268+ if origin != "" && !strings.EqualFold(origin, "null") {
269269 return isTrustedSystemviewURL(origin)
270270 }
271271 return isTrustedSystemviewURL(req.Referer)
@@ -265,7 +265,7 @@ func isTrustedSystemviewAPIRequest(req *SchemeRequest) bool {
265 return false265 return false
266 }266 }
267 origin := strings.TrimSpace(req.Origin)267 origin := strings.TrimSpace(req.Origin)
268- if origin != "" {268+ if origin != "" && !strings.EqualFold(origin, "null") {
269 return isTrustedSystemviewURL(origin)269 return isTrustedSystemviewURL(origin)
270 }270 }
271 return isTrustedSystemviewURL(req.Referer)271 return isTrustedSystemviewURL(req.Referer)
M internal/infrastructure/webkit/scheme_handler_test.go +26 -0
@@ -242,6 +242,32 @@ func TestConfigHandlersRejectUntrustedRequests(t *testing.T) {
242242 }
243243 }
244244
245+func TestConfigHandlersAllowOpaqueOriginWithTrustedReferer(t *testing.T) {
246+ h := NewDumbSchemeHandler(context.Background())
247+ h.SetConfigPayloadBuilders(
248+ func() ([]byte, error) { return []byte(`{"current":true}`), nil },
249+ func() ([]byte, error) { return []byte(`{"default":true}`), nil },
250+ )
251+
252+ h.mu.RLock()
253+ currentHandler := h.handlers["/api/config"]
254+ h.mu.RUnlock()
255+ require.NotNil(t, currentHandler)
256+
257+ resp := currentHandler.Handle(&SchemeRequest{
258+ URI: "dumb://config/api/config",
259+ Path: "/api/config",
260+ Method: http.MethodGet,
261+ Scheme: "dumb",
262+ Origin: "null",
263+ Referer: "dumb://config",
264+ })
265+
266+ require.NotNil(t, resp)
267+ assert.Equal(t, http.StatusOK, resp.StatusCode)
268+ assert.Equal(t, []byte(`{"current":true}`), resp.Data)
269+}
270+
245271 func TestShouldAddCORSHeaders(t *testing.T) {
246272 t.Parallel()
247273
@@ -242,6 +242,32 @@ func TestConfigHandlersRejectUntrustedRequests(t *testing.T) {
242 }242 }
243 }243 }
244 244
245+func TestConfigHandlersAllowOpaqueOriginWithTrustedReferer(t *testing.T) {
246+ h := NewDumbSchemeHandler(context.Background())
247+ h.SetConfigPayloadBuilders(
248+ func() ([]byte, error) { return []byte(`{"current":true}`), nil },
249+ func() ([]byte, error) { return []byte(`{"default":true}`), nil },
250+ )
251+
252+ h.mu.RLock()
253+ currentHandler := h.handlers["/api/config"]
254+ h.mu.RUnlock()
255+ require.NotNil(t, currentHandler)
256+
257+ resp := currentHandler.Handle(&SchemeRequest{
258+ URI: "dumb://config/api/config",
259+ Path: "/api/config",
260+ Method: http.MethodGet,
261+ Scheme: "dumb",
262+ Origin: "null",
263+ Referer: "dumb://config",
264+ })
265+
266+ require.NotNil(t, resp)
267+ assert.Equal(t, http.StatusOK, resp.StatusCode)
268+ assert.Equal(t, []byte(`{"current":true}`), resp.Data)
269+}
270+
245 func TestShouldAddCORSHeaders(t *testing.T) {271 func TestShouldAddCORSHeaders(t *testing.T) {
246 t.Parallel()272 t.Parallel()
247 273

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close