vole
Clone
Read only, no credentials:
https://rodent.software/vole.git
Write over SSH with a registered key:
git clone ssh://git@rodent.software:2222/vole.git
A free and open-source forge that lives in your Git repo.
Store repository secrets encrypted, with a CLI and a settings form
0c40a1d3b48eb0ade37334f62ee526c371ecb61c · Keenan Nemetz · 7d ago · parent 122cbe4f
Store repository secrets encrypted, with a CLI and a settings form A repository has values that cannot live in its code: a deploy key, a registry token, a staging password. They are now stored in data/secrets.db, sealed with AES-256-GCM under data/secrets.key, and read through one store that records every read and every change. The key is a separate file, and secrets_key can move it, so a backup of the data directory can be a backup of ciphertext rather than of plaintext. `vole secret list|set|get|rm` asks the instance over the key the caller already pushes with, since the store is server-side. set reads the value from stdin or a file and never from the argument list; get writes the value and nothing else. The maintainer role is the capability: the accounts that approve work and allow CI own the credentials those jobs will use. The repository's Settings tab gains the same list — names, versions, who changed one, when a value was last read — with set, replace and delete. It never renders a value, and a maintainer who is not an admin now reaches that page for this section alone. Values are limited to what one environment variable can carry: 128 KiB for NAME=value, valid UTF-8 and no NUL. A longer value could never reach a step, and the refusal says so. Slice 1 of #154.
docs/accounts-and-access.md +7−1
| @@ -225,7 +225,7 @@ specific accounts. | |||
| 225 | 225 | | `none` | No access | | |
| 226 | 226 | | `read` | Clone, fetch, and browse the repository | | |
| 227 | 227 | | `contribute` | Read, file issues and comments, push only `refs/heads/contrib/<name>/*`, and open change requests from those branches | | |
| 228 | | `maintain` | Everything the contribute role can do, plus push shared branches, triage issues, and approve change requests | | ||
| 228 | | `maintain` | Everything the contribute role can do, plus push shared branches, triage issues, approve change requests, and manage the repository's secrets | | ||
| 229 | 229 | | `admin` | Everything a maintainer can do, plus manage access, push protected branches, override locks, and repair metadata | | |
| 230 | 230 | ||
| 231 | 231 | Rules are edited with a compare-and-swap. A page or a command that read the rules | |
| @@ -257,6 +257,12 @@ repository-specific role. Access rules and review policy remain instance-admin | |||
| 257 | 257 | operations: instance admins can edit them on the repository's **Settings** tab, | |
| 258 | 258 | or with `vole admin acl`. | |
| 259 | 259 | ||
| 260 | A maintainer who is not an admin also opens that tab, for one section: the | ||
| 261 | repository's secrets. Values a repository keeps out of its code — a deploy key, a | ||
| 262 | registry token, a staging password — belong to the accounts that approve work and allow CI, | ||
| 263 | so the page shows them the names, versions and read times, and the form that sets | ||
| 264 | them. It never shows a value; `vole secret get` prints one when somebody needs it. | ||
| 265 | |||
| 260 | 266 | ## Changing access | |
| 261 | 267 | ||
| 262 | 268 | ```sh | |