1package server
 2
 3import (
 4	"context"
 5	"fmt"
 6
 7	appCfg "github.com/charmbracelet/soft-serve/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 := s.Context()
23				ctx = context.WithValue(ctx, cmd.ConfigCtxKey, ac)
24				ctx = context.WithValue(ctx, cmd.SessionCtxKey, s)
25
26				use := "ssh"
27				port := ac.Port
28				if port != 22 {
29					use += fmt.Sprintf(" -p%d", port)
30				}
31				use += fmt.Sprintf(" %s", ac.Host)
32				cmd := cmd.RootCommand()
33				cmd.Use = use
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}