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/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.

Create accounts with a key and find the instance config

c36d507302c0f7fb24af6eba390c4121d67318c3 · Keenan Nemetz · 16d ago · parent 3abbe749

Create accounts with a key and find the instance config

An account is now written with its first key in one transaction, so a name cannot be claimed without a credential. add-key remains for additional keys, and remote user create forwards the key on stdin.

Local commands now resolve the config from --config, VOLE_CONFIG, ./vole.toml, or ~/.vole/vole.toml before falling back to defaults. init prints --config in its next steps when the instance will not be discovered automatically.

server/ssh/admin.go +9−3

@@ -161,15 +161,21 @@ func (s *Server) adminUser(action string, args []string, actor string, in io.Rea
161 161
162 162 case "create":
163 163 if len(args) != 1 {
164 return nil, nil, &adminUsageError{msg: "usage: vole-admin user create <name>"}
164 return nil, nil, &adminUsageError{msg: "usage: vole-admin user create <name> (public key on stdin)"}
165 165 }
166 a, err := s.cfg.Identity.Create(args[0], actor)
166 key, err := readAdminKey(in)
167 if err != nil {
168 return nil, nil, err
169 }
170 a, err := s.cfg.Identity.Create(args[0], key, actor)
167 171 if err != nil {
168 172 return nil, nil, err
169 173 }
170 174 return userData(a), func(out, errOut io.Writer) {
171 175 fmt.Fprintf(out, "%s\t%s\n", a.Name, a.ID)
172 fmt.Fprintln(errOut, "no keys yet: this account cannot authenticate until you add one")
176 if len(a.Keys) > 0 {
177 fmt.Fprintf(errOut, "key %s\n", a.Keys[0].Fingerprint)
178 }
173 179 }, nil
174 180
175 181 case "add-key":