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.SetIn(s)
34				cmd.SetOut(s)
35				cmd.SetErr(s.Stderr())
36				cmd.SetArgs(s.Command())
37				err := cmd.ExecuteContext(ctx)
38				if err != nil {
39					_, _ = s.Write([]byte(err.Error()))
40					_ = s.Exit(1)
41					return
42				}
43			}()
44			sh(s)
45		}
46	}
47}