1package server
2
3import (
4 "fmt"
5 "log"
6 "path/filepath"
7 "smoothie/server/middleware"
8 "strings"
9
10 "github.com/charmbracelet/charm/keygen"
11 "github.com/gliderlabs/ssh"
12 gossh "golang.org/x/crypto/ssh"
13)
14
15type Server struct {
16 server *ssh.Server
17 key gossh.PublicKey
18}
19
20func NewServer(port int, keyPath string, mw ...middleware.Middleware) (*Server, error) {
21 s := &Server{server: &ssh.Server{}}
22 s.server.Version = "OpenSSH_7.6p1"
23 s.server.Addr = fmt.Sprintf(":%d", port)
24 s.server.PasswordHandler = s.passHandler
25 s.server.PublicKeyHandler = s.authHandler
26 kps := strings.Split(keyPath, string(filepath.Separator))
27 kp := strings.Join(kps[:len(kps)-1], string(filepath.Separator))
28 n := strings.TrimRight(kps[len(kps)-1], "_ed25519")
29 _, err := keygen.NewSSHKeyPair(kp, n, nil, "ed25519")
30 if err != nil {
31 return nil, err
32 }
33 k := ssh.HostKeyFile(keyPath)
34 err = s.server.SetOption(k)
35 if err != nil {
36 return nil, err
37 }
38 h := func(s ssh.Session) {}
39 for _, m := range mw {
40 h = m(h)
41 }
42 s.server.Handler = h
43 return s, nil
44}
45
46func (srv *Server) authHandler(ctx ssh.Context, key ssh.PublicKey) bool {
47 return true
48}
49
50func (srv *Server) passHandler(ctx ssh.Context, pass string) bool {
51 return true
52}
53
54func (srv *Server) Start() error {
55 log.Printf("Starting SSH server on %s\n", srv.server.Addr)
56 return srv.server.ListenAndServe()
57}