Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

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.

Add browser auth, contributor access, and gated CI

6c84d387e5f608360e30484a1a5b1cff41076850 · Keenan Nemetz · 16d ago · parent c36d5073

Add browser auth, contributor access, and gated CI

Browser sign-in now uses passkeys. Enrollment links are one-time, sessions are hashed in users.db, and issue/comment/approval writes use the session account. HTTPS public_url is required for WebAuthn.

Add the contributor role between read and maintain. Contributors can discuss and open change requests, and may push only refs/heads/contrib/<account-id>/. Contributor CI is held per commit until a maintainer allows the exact tip from the repository page.

Rename the write role to maintain. write remains accepted as the historical spelling, and access.Write remains as a Go alias so existing callers and ACL rows keep working.

Update the web, CLI, queue schema, and guides for the new flows, and cover the role, namespace, auth, and CI-gating paths in tests.

docs/configuration.md +9−7

@@ -41,9 +41,9 @@ vole admin user list
41 41 | Setting | Default | What it does |
42 42 |---|---:|---|
43 43 | `data_dir` | `"./data"` | Where Vole keeps repositories, databases, stored files, and the audit log |
44 | `http_addr` | `"127.0.0.1:8080"` | Address for the read-only web interface and anonymous Git clone |
45 | `ssh_addr` | `"127.0.0.1:2222"` | Address for SSH, the only way to write |
46 | `public_url` | empty | The address people use in a browser, so the CLI can print useful links |
44 | `http_addr` | `"127.0.0.1:8080"` | Address for the web interface and anonymous Git clone |
45 | `ssh_addr` | `"127.0.0.1:2222"` | Address for SSH, the authenticated Git transport |
46 | `public_url` | empty | Canonical browser address; must be HTTPS to enable passkey login |
47 47 | `max_blob_bytes` | `104857600` (100 MiB) | Largest single file accepted in a push |
48 48 | `receive_max_bytes` | `1073741824` (1 GiB) | Largest whole push Vole will accept |
49 49 | `lfs_object_max_bytes` | `2147483648` (2 GiB) | Largest single LFS object |
@@ -69,7 +69,9 @@ public_url = "https://forge.example.com"
69 69 ```
70 70
71 71 The CLI uses this to print a link to an issue, comment, or release it just
72 created. It does not change how Vole routes requests.
72 created. It is also the WebAuthn relying-party origin: browser login is enabled
73 only when `public_url` is an `https://` URL. Vole does not change how it routes
74 requests based on this setting.
73 75
74 76 ## Running behind a proxy
75 77
@@ -96,12 +98,12 @@ connection intact.
96 98
97 99 | Path | What it is |
98 100 |---|---|
99 | `data/users.db` | Accounts, names, SSH keys, instance admins, access rules, and locks. This is the main user database. |
101 | `data/users.db` | Accounts, names, SSH keys, passkeys, enrollment invites, browser sessions, instance admins, access rules, and locks. This is the main user database. Session and invite tokens are stored only as hashes. |
100 102 | `data/repos/` | Your Git repositories. |
101 103 | `data/index.db` | A rebuildable search index. |
102 | `data/runs.db` | The CI queue and finished-run index. Partly rebuildable. |
104 | `data/runs.db` | The CI queue, finished-run index, and contributor-branch CI approvals. Partly rebuildable; deleting it loses pending work and approvals. |
103 105 | `data/lfs/` | Stored large files, CI logs, and build artifacts. |
104 106 | `data/audit.log` | A record of privileged actions. |
105 | `data/ssh_host_ed25519_key` | The SSH host key. It is the only secret Vole keeps. |
107 | `data/ssh_host_ed25519_key` | The SSH host key. It is Vole's only long-term stored secret; browser credentials are public keys and session tokens are hashed. |
106 108
107 109 See [Operations](operations.md) for backup and recovery.