v0.33.1 9577fee

systemview_policy_test.go RawHistoryFolder

1package webutil
2
3import (
4	"testing"
5	"testing/fstest"
6
7	"github.com/stretchr/testify/assert"
8	"github.com/stretchr/testify/require"
9)
10
11func TestSystemviewTrustAllows(t *testing.T) {
12	trusted := func(raw string) bool { return raw == "dumb://history" }
13	webkit := SystemviewTrust{IsTrustedURL: trusted, OpaqueOriginUsesReferrer: true}
14	cef := SystemviewTrust{IsTrustedURL: trusted}
15
16	tests := []struct {
17		name             string
18		origin, referrer string
19		webkit, cef      bool
20	}{
21		{name: "trusted origin", origin: "dumb://history", webkit: true, cef: true},
22		{name: "untrusted origin wins over trusted referrer", origin: "https://evil.example", referrer: "dumb://history"},
23		{name: "missing origin uses referrer", referrer: "dumb://history", webkit: true, cef: true},
24		{name: "opaque origin uses referrer only when allowed", origin: "null", referrer: "dumb://history", webkit: true},
25		{name: "nothing is untrusted"},
26	}
27	for _, tt := range tests {
28		t.Run(tt.name, func(t *testing.T) {
29			assert.Equal(t, tt.webkit, webkit.Allows(tt.origin, tt.referrer), "webkit")
30			assert.Equal(t, tt.cef, cef.Allows(tt.origin, tt.referrer), "cef")
31		})
32	}
33	assert.False(t, SystemviewTrust{}.Allows("dumb://history", ""), "nil matcher denies")
34}
35
36func TestDumbURLHost(t *testing.T) {
37	for raw, want := range map[string]string{
38		"dumb://history":         "history",
39		"dumb:config":            "config",
40		"DUMB://favorites/x?y=1": "favorites",
41	} {
42		host, ok := DumbURLHost(raw)
43		require.True(t, ok, raw)
44		assert.Equal(t, want, host, raw)
45	}
46	_, ok := DumbURLHost("https://history")
47	assert.False(t, ok)
48}
49
50func TestParseSystemviewFaviconRequest(t *testing.T) {
51	domain, size, err := ParseSystemviewFaviconRequest("dumb://history/api/favicon?domain=%20example.com%20&size=32")
52	require.NoError(t, err)
53	assert.Equal(t, "example.com", domain)
54	assert.Equal(t, SystemviewFaviconSize, size)
55
56	_, _, err = ParseSystemviewFaviconRequest("dumb://history/api/favicon")
57	require.ErrorIs(t, err, ErrFaviconMissingDomain)
58
59	_, _, err = ParseSystemviewFaviconRequest("dumb://history/api/favicon?domain=a&size=64")
60	require.ErrorIs(t, err, ErrFaviconUnsupportedSize)
61
62	_, _, err = ParseSystemviewFaviconRequest("://bad")
63	require.ErrorIs(t, err, ErrFaviconInvalidRequestURL)
64}
65
66func TestReadSystemviewAssetCorruptCompressedIsAnError(t *testing.T) {
67	fsys := fstest.MapFS{
68		"systemviews/systemviews.wasm.br": {Data: []byte("not-brotli")},
69		"systemviews/systemviews.wasm":    {Data: []byte("\x00asm")},
70	}
71
72	_, err := ReadSystemviewAsset(fsys, "systemviews/systemviews.wasm", "systemviews.wasm")
73
74	require.Error(t, err)
75}
76
77func TestSafeSystemviewsAssetPathRejectsTraversal(t *testing.T) {
78	_, _, ok := SafeSystemviewsAssetPath(SystemviewsAssetDir, "../secret")
79	assert.False(t, ok)
80
81	full, rel, ok := SafeSystemviewsAssetPath(SystemviewsAssetDir, "a/../index.html")
82	require.True(t, ok)
83	assert.Equal(t, "systemviews/index.html", full)
84	assert.Equal(t, "index.html", rel)
85}

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