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
15func logError(s ssh.Session, err error) {
16 log.Printf("%s error %v: %s\n", s.RemoteAddr().String(), s.Command(), err)
17}
18
19type Server struct {
20 server *ssh.Server
21 key gossh.PublicKey
22}
23
24func NewServer(port int, keyPath string, mw ...middleware.Middleware) (*Server, error) {
25 s := &Server{server: &ssh.Server{}}
26 s.server.Version = "OpenSSH_7.6p1"
27 s.server.Addr = fmt.Sprintf(":%d", port)
28 s.server.PasswordHandler = s.passHandler
29 s.server.PublicKeyHandler = s.authHandler
30 kps := strings.Split(keyPath, string(filepath.Separator))
31 kp := strings.Join(kps[:len(kps)-1], string(filepath.Separator))
32 n := strings.TrimRight(kps[len(kps)-1], "_ed25519")
33 _, err := keygen.NewSSHKeyPair(kp, n, nil, "ed25519")
34 if err != nil {
35 return nil, err
36 }
37 k := ssh.HostKeyFile(keyPath)
38 err = s.server.SetOption(k)
39 if err != nil {
40 return nil, err
41 }
42 h := func(s ssh.Session) {}
43 for _, m := range mw {
44 h = m(h)
45 }
46 s.server.Handler = h
47 return s, nil
48}
49
50func (srv *Server) sessionHandler(s ssh.Session) {
51}
52
53func (srv *Server) authHandler(ctx ssh.Context, key ssh.PublicKey) bool {
54 return true
55}
56
57func (srv *Server) passHandler(ctx ssh.Context, pass string) bool {
58 return true
59}
60
61func (srv *Server) Start() error {
62 log.Printf("Starting SSH server on %s\n", srv.server.Addr)
63 return srv.server.ListenAndServe()
64}