1package ssh
 2
 3import (
 4	"strings"
 5
 6	"github.com/charmbracelet/log"
 7	"github.com/charmbracelet/soft-serve/server/backend"
 8	"github.com/charmbracelet/soft-serve/server/config"
 9	"github.com/charmbracelet/soft-serve/server/db"
10	"github.com/charmbracelet/soft-serve/server/store"
11	"github.com/charmbracelet/ssh"
12)
13
14// ContextMiddleware adds the config, backend, and logger to the session context.
15func ContextMiddleware(cfg *config.Config, dbx *db.DB, datastore store.Store, be *backend.Backend, logger *log.Logger) func(ssh.Handler) ssh.Handler {
16	return func(sh ssh.Handler) ssh.Handler {
17		return func(s ssh.Session) {
18			s.Context().SetValue(config.ContextKey, cfg)
19			s.Context().SetValue(db.ContextKey, dbx)
20			s.Context().SetValue(store.ContextKey, datastore)
21			s.Context().SetValue(backend.ContextKey, be)
22			s.Context().SetValue(log.ContextKey, logger.WithPrefix("ssh"))
23			sh(s)
24		}
25	}
26}
27
28// CommandMiddleware handles git commands and CLI commands.
29// This middleware must be run after the ContextMiddleware.
30func CommandMiddleware(sh ssh.Handler) ssh.Handler {
31	return func(s ssh.Session) {
32		func() {
33			cmdLine := s.Command()
34			_, _, ptyReq := s.Pty()
35			if ptyReq {
36				return
37			}
38
39			switch {
40			case len(cmdLine) >= 2 && strings.HasPrefix(cmdLine[0], "git-"):
41				handleGit(s)
42			default:
43				handleCli(s)
44			}
45		}()
46		sh(s)
47	}
48}