aboutsummaryrefslogtreecommitdiff
path: root/forged/internal/incoming/ssh
diff options
context:
space:
mode:
Diffstat (limited to 'forged/internal/incoming/ssh')
-rw-r--r--forged/internal/incoming/ssh/ssh.go58
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")
+}