Commit 79fdea24bf

79fdea24bfbc7c2cc4caae15e8ca91ae8949ef14

parent: 4fa1930038

Verified · cmc

cmc <hello@cleberg.net> · 2026-09-28 08:33 UTC

sshd: unregistered-key settings link from the site URL, scheme and port kept

Ref #268

Layout: unified · split

internal/sshd/sshd.go +3 −2
@@ -18,6 +18,7 @@ import (
1818 "path/filepath"
1919 "slices"
2020 "strconv"
21 "strings"
2122 "sync"
2223 "sync/atomic"
2324 "time"
@@ -447,9 +448,9 @@ func (s *Server) runAnonymous(ch ssh.Channel, keyB64, cmdline string) int {
447448 flag := map[string]string{"open": "--email <address>", "invite": "--invite <code>"}[s.cfg.Registration.Mode]
448449 fmt.Fprintf(ch.Stderr(),
449450 "this key (%s) is not registered on %s.\n"+
450 "already have an account? add it at https://%s/settings#keys\n"+
451 "already have an account? add it at %s/settings#keys\n"+
451452 "new here? ssh git@%s register --username <name> %s\n",
452 fp, host, host, host, flag)
453 fp, host, strings.TrimSuffix(s.cfg.Server.SiteURL, "/"), host, flag)
453454 return protocol.ExitDenied
454455 }
455456 return control.RunRegister(s.cfg, s.st, pub, argv, ch, ch.Stderr())
internal/sshd/sshd_test.go +3 −2
@@ -242,7 +242,8 @@ func TestUnregisteredKeyMessageNamesFingerprintAndHost(t *testing.T) {
242242
243243 cfg := config.Default()
244244 cfg.Server.Root = root
245 cfg.Server.SiteURL = "https://forge.test"
245 // The settings link keeps the site URL's scheme and port.
246 cfg.Server.SiteURL = "http://forge.test:8080/"
246247 cfg.Registration.Mode = "open"
247248 srv, err := New(cfg, st)
248249 if err != nil {
@@ -289,7 +290,7 @@ func TestUnregisteredKeyMessageNamesFingerprintAndHost(t *testing.T) {
289290 }
290291
291292 fp := ssh.FingerprintSHA256(signer.PublicKey())
292 for _, want := range []string{fp, "forge.test", "https://forge.test/settings#keys", "ssh git@forge.test register"} {
293 for _, want := range []string{fp, "forge.test", "add it at http://forge.test:8080/settings#keys\n", "ssh git@forge.test register"} {
293294 if !strings.Contains(stderr.String(), want) {
294295 t.Errorf("message missing %q:\n%s", want, stderr.String())
295296 }