1package server
2
3import (
4 "context"
5 "fmt"
6
7 appCfg "github.com/charmbracelet/soft-serve/internal/config"
8 "github.com/charmbracelet/soft-serve/server/cmd"
9 "github.com/charmbracelet/wish"
10 "github.com/gliderlabs/ssh"
11)
12
13// softMiddleware is the Soft Serve middleware that handles SSH commands.
14func softMiddleware(ac *appCfg.Config) wish.Middleware {
15 return func(sh ssh.Handler) ssh.Handler {
16 return func(s ssh.Session) {
17 func() {
18 _, _, active := s.Pty()
19 if active {
20 return
21 }
22 ctx := context.WithValue(s.Context(), "config", ac) //nolint:revive
23 ctx = context.WithValue(ctx, "session", s) //nolint:revive
24
25 use := "ssh"
26 port := ac.Port
27 if port != 22 {
28 use += fmt.Sprintf(" -p%d", port)
29 }
30 use += fmt.Sprintf(" %s", ac.Host)
31 cmd := cmd.RootCommand()
32 cmd.Use = use
33 cmd.CompletionOptions.DisableDefaultCmd = true
34 cmd.SetIn(s)
35 cmd.SetOut(s)
36 cmd.SetErr(s.Stderr())
37 cmd.SetArgs(s.Command())
38 err := cmd.ExecuteContext(ctx)
39 if err != nil {
40 _, _ = s.Write([]byte(err.Error()))
41 _ = s.Exit(1)
42 return
43 }
44 }()
45 sh(s)
46 }
47 }
48}