v0.5.0 22211fd

token_test.go RawHistoryFolder

1// SPDX-License-Identifier: MIT
2
3package executor
4
5import (
6	"encoding/base64"
7	"strings"
8	"testing"
9)
10
11// Recorded on github.com (ctx-inputs-vars): secrets.GITHUB_TOKEN is set and
12// equals github.token. The token comes from the github context the server
13// sends; it is masked in the log.
14func TestSecretsHoldTheGithubToken(t *testing.T) {
15	needTools(t, "bash")
16	const tok = "ghs_testtoken123"
17	yaml := `on: push
18jobs:
19  main:
20    runs-on: ubuntu-24.04
21    steps:
22      - name: absent values
23        env:
24          V_SET: ${{ secrets.GITHUB_TOKEN != '' }}
25          V_EQ: ${{ secrets.GITHUB_TOKEN == github.token }}
26          V_NONE: ${{ secrets.NOT_DEFINED }}
27          V_TOKEN: ${{ secrets.GITHUB_TOKEN }}
28        run: |
29          echo "V_SET=$V_SET V_EQ=$V_EQ V_NONE=$V_NONE"
30          echo "token=$V_TOKEN b64=` + base64.StdEncoding.EncodeToString([]byte("x-access-token:"+tok)) + `"
31`
32	rec, res := runLocal(t, yaml, "main", func(c *Config) {
33		c.ContextsJSON = strings.Replace(testGitHubContext("main"), `"github":{`, `"github":{"token":"`+tok+`",`, 1)
34	})
35	if res.Conclusion != ConclusionSuccess {
36		t.Fatalf("%+v", res)
37	}
38	log := logOf(rec.step(t, "absent values"))
39	if !strings.Contains(log, "V_SET=true V_EQ=true V_NONE=\n") {
40		t.Errorf("log:\n%s", log)
41	}
42	if strings.Contains(log, tok) || strings.Contains(log, "eC1hY2Nlc3MtdG9rZW46") {
43		t.Errorf("the token leaked into the log:\n%s", log)
44	}
45	if !strings.Contains(log, "  V_TOKEN: ***") || !strings.Contains(log, "token=*** b64=***") {
46		t.Errorf("the token must be masked:\n%s", log)
47	}
48}
49
50// Without a token from the server the secrets context is empty and nothing is
51// masked.
52func TestSecretsWithoutToken(t *testing.T) {
53	s := newTestState(t)
54	if d := s.Values(nil)["secrets"]; d == nil || len(s.Secrets()) != 0 {
55		t.Fatalf("%v %v", d, s.Secrets())
56	}
57}

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 4

Tags 11

↑↓ moveenter openesc close