vole
Clone
Read only, no credentials:
https://rodent.software/git/vole.git
Write over SSH with a registered key:
git clone ssh://git@0.0.0.0:2222/vole.git
A free and open-source forge that lives in your Git repo.
Identify accounts by their registered name
62576fa8157d431dcf2d360f3ebe481de77bda03 · Keenan Nemetz · 14d ago · parent 642e5994
Identify accounts by their registered name Drop the internal account id and display name. Users, keys, passkeys, invites, sessions, ACL entries, approvals, locks and CI records now all use the registered name as the single identity. The roster migrates in place: old id-keyed tables are rebuilt around the name, and access-rule/lock references are rewritten through the same mapping. Display-name editing and whoami --id are removed.
server/hook/checks.go +5−5
| @@ -20,7 +20,7 @@ import ( | |||
| 20 | 20 | // counts when the host has allowed the account that reported it: a required check is | |
| 21 | 21 | // a claim about a commit, and without that rule any writer could satisfy it by | |
| 22 | 22 | // running CI on their own machine and saying it passed. | |
| 23 | func checkGaps(g *git.Repo, runsDB, repo, sha, branch string, a *access.ACL, names func(string) string) ([]string, error) { | ||
| 23 | func checkGaps(g *git.Repo, runsDB, repo, sha, branch string, a *access.ACL) ([]string, error) { | ||
| 24 | 24 | wfs, problems := ci.At(g, sha) | |
| 25 | 25 | if len(problems) > 0 { | |
| 26 | 26 | return nil, fmt.Errorf("cannot read the workflows at %s: %s", format.SHA(sha), strings.Join(problems, "; ")) | |
| @@ -88,8 +88,8 @@ func checkGaps(g *git.Repo, runsDB, repo, sha, branch string, a *access.ACL, nam | |||
| 88 | 88 | "repository (runners: %s) — so the result is recorded and does not count. "+ | |
| 89 | 89 | "An admin can allow that account with `vole admin acl runners %s --add %s`, "+ | |
| 90 | 90 | "or a permitted runner can run the job", | |
| 91 | wf.Path, job.ID, format.SHA(sha), names(att.Signer), | ||
| 92 | runnerSummary(a, names), repo, att.Signer)) | ||
| 91 | wf.Path, job.ID, format.SHA(sha), att.Signer, | ||
| 92 | runnerSummary(a), repo, att.Signer)) | ||
| 93 | 93 | } | |
| 94 | 94 | } | |
| 95 | 95 | } | |
| @@ -98,13 +98,13 @@ func checkGaps(g *git.Repo, runsDB, repo, sha, branch string, a *access.ACL, nam | |||
| 98 | 98 | ||
| 99 | 99 | // runnerSummary renders the allowlist for a message. Admins are named as implicit | |
| 100 | 100 | // because an operator reading the refusal needs to know who already counts. | |
| 101 | func runnerSummary(a *access.ACL, names func(string) string) string { | ||
| 101 | func runnerSummary(a *access.ACL) string { | ||
| 102 | 102 | if len(a.Runners) == 0 { | |
| 103 | 103 | return "none named, so only admins" | |
| 104 | 104 | } | |
| 105 | 105 | out := make([]string, 0, len(a.Runners)) | |
| 106 | 106 | for _, r := range a.Runners { | |
| 107 | out = append(out, names(r)) | ||
| 107 | out = append(out, r) | ||
| 108 | 108 | } | |
| 109 | 109 | return strings.Join(out, ", ") + " and admins" | |
| 110 | 110 | } | |