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 instance user administration
395554f453ca31d3bd325920a7011c91230e961c · Keenan Nemetz · 15d ago · parent 8e93a8f0
Add instance user administration Instance admins get an Admin -> Users surface: create an account from a one-time enrollment link, grant or revoke instance admin, retire an account, refresh its invite, inspect keys and sessions, remove a key, and revoke every session. Account creation uses CreateWithInvite, so the browser never asks an operator to paste somebody else's SSH key. Enrollment links are rendered once with no-store and warn when browser login is disabled. Retiring and admin changes keep the store's last-admin guard and audit trail.
server/server.go +8
| @@ -166,6 +166,14 @@ func (s *Server) routes() *http.ServeMux { | |||
| 166 | 166 | mux.HandleFunc("GET /auth.js", w.AuthJS) | |
| 167 | 167 | mux.HandleFunc("GET /runners", w.RunnersPage) | |
| 168 | 168 | mux.HandleFunc("GET /admin", w.AdminPage) | |
| 169 | mux.HandleFunc("GET /admin/users", w.AdminUsersPage) | ||
| 170 | mux.HandleFunc("POST /admin/users", w.CreateAdminUser) | ||
| 171 | mux.HandleFunc("GET /admin/users/{id}", w.AdminUserPage) | ||
| 172 | mux.HandleFunc("POST /admin/users/{id}/admin", w.SetAdminUser) | ||
| 173 | mux.HandleFunc("POST /admin/users/{id}/retire", w.RetireAdminUser) | ||
| 174 | mux.HandleFunc("POST /admin/users/{id}/invite", w.InviteAdminUser) | ||
| 175 | mux.HandleFunc("POST /admin/users/{id}/sessions/revoke", w.RevokeAdminUserSessions) | ||
| 176 | mux.HandleFunc("POST /admin/users/{id}/keys/remove", w.RemoveAdminUserKey) | ||
| 169 | 177 | mux.HandleFunc("GET /admin/repos/{name}/access", w.AdminAccessPage) | |
| 170 | 178 | mux.HandleFunc("POST /admin/repos/{name}/access", w.SaveAdminAccess) | |
| 171 | 179 | mux.HandleFunc("GET /r/{name}", w.Overview) | |