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 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)