server.go

 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}