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}