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}