diff options
Diffstat (limited to 'forged/internal/incoming/ssh/ssh.go')
-rw-r--r-- | forged/internal/incoming/ssh/ssh.go | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/forged/internal/incoming/ssh/ssh.go b/forged/internal/incoming/ssh/ssh.go index 74bd99b..b0269e5 100644 --- a/forged/internal/incoming/ssh/ssh.go +++ b/forged/internal/incoming/ssh/ssh.go @@ -1,6 +1,13 @@ package ssh -type Server struct{} +import ( + "fmt" + "os" + + gliderssh "github.com/gliderlabs/ssh" + "go.lindenii.runxiyu.org/forge/forged/internal/common/misc" + gossh "golang.org/x/crypto/ssh" +) type Config struct { Net string `scfg:"net"` @@ -8,3 +15,52 @@ type Config struct { Key string `scfg:"key"` Root string `scfg:"root"` } + +type Server struct { + gliderServer *gliderssh.Server + privkey gossh.Signer + pubkeyString string + pubkeyFP string + net string + addr string + root string +} + +func New(config Config) (server *Server, err error) { + server = &Server{ + net: config.Net, + addr: config.Addr, + root: config.Root, + } + + var privkeyBytes []byte + if privkeyBytes, err = os.ReadFile(config.Key); err != nil { + return server, fmt.Errorf("read SSH private key: %w", err) + } + if server.privkey, err = gossh.ParsePrivateKey(privkeyBytes); err != nil { + return server, fmt.Errorf("parse SSH private key: %w", err) + } + server.pubkeyString = misc.BytesToString(gossh.MarshalAuthorizedKey(server.privkey.PublicKey())) + server.pubkeyFP = gossh.FingerprintSHA256(server.privkey.PublicKey()) + + server.gliderServer = &gliderssh.Server{ + Handler: handle, + PublicKeyHandler: func(ctx gliderssh.Context, key gliderssh.PublicKey) bool { return true }, + KeyboardInteractiveHandler: func(ctx gliderssh.Context, challenge gossh.KeyboardInteractiveChallenge) bool { return true }, + } + server.gliderServer.AddHostKey(server.privkey) + + return +} + +func (server *Server) Run() (err error) { + listener, err := misc.Listen(server.net, server.addr) + if err = server.gliderServer.Serve(listener); err != nil { + return fmt.Errorf("serve SSH: %w", err) + } + panic("unreachable") +} + +func handle(session gliderssh.Session) { + panic("SSH server handler not implemented yet") +} |