diff --git a/server/middleware.go b/server/cmd/middleware.go similarity index 68% rename from server/middleware.go rename to server/cmd/middleware.go index a4969f5fe5582929bc7ed6ddca571d225c4514d0..058d2a5e15603272aeb8d6a2d50766e5d88bffc9 100644 --- a/server/middleware.go +++ b/server/cmd/middleware.go @@ -1,17 +1,16 @@ -package server +package cmd import ( "context" "fmt" appCfg "github.com/charmbracelet/soft-serve/config" - "github.com/charmbracelet/soft-serve/server/cmd" "github.com/charmbracelet/wish" "github.com/gliderlabs/ssh" ) -// softMiddleware is the Soft Serve middleware that handles SSH commands. -func softMiddleware(ac *appCfg.Config) wish.Middleware { +// Middleware is the Soft Serve middleware that handles SSH commands. +func Middleware(ac *appCfg.Config) wish.Middleware { return func(sh ssh.Handler) ssh.Handler { return func(s ssh.Session) { func() { @@ -19,8 +18,8 @@ func softMiddleware(ac *appCfg.Config) wish.Middleware { if active { return } - ctx := context.WithValue(s.Context(), cmd.ConfigCtxKey, ac) - ctx = context.WithValue(ctx, cmd.SessionCtxKey, s) + ctx := context.WithValue(s.Context(), ConfigCtxKey, ac) + ctx = context.WithValue(ctx, SessionCtxKey, s) use := "ssh" port := ac.Port @@ -28,7 +27,7 @@ func softMiddleware(ac *appCfg.Config) wish.Middleware { use += fmt.Sprintf(" -p%d", port) } use += fmt.Sprintf(" %s", ac.Host) - cmd := cmd.RootCommand() + cmd := RootCommand() cmd.Use = use cmd.CompletionOptions.DisableDefaultCmd = true cmd.SetIn(s) diff --git a/server/middleware_test.go b/server/cmd/middleware_test.go similarity index 91% rename from server/middleware_test.go rename to server/cmd/middleware_test.go index 6895d3d10d9483fb0b202973a84e388a5f8a6bc8..68efef5a1bd5f82ea0956dba50a8d2b57764e7d6 100644 --- a/server/middleware_test.go +++ b/server/cmd/middleware_test.go @@ -1,4 +1,4 @@ -package server +package cmd import ( "os" @@ -26,7 +26,7 @@ func TestMiddleware(t *testing.T) { }) is.NoErr(err) _ = testsession.New(t, &ssh.Server{ - Handler: softMiddleware(appCfg)(func(s ssh.Session) { + Handler: Middleware(appCfg)(func(s ssh.Session) { t.Run("TestCatConfig", func(t *testing.T) { _, err := s.Write([]byte("cat config/config.json")) if err == nil { diff --git a/server/server.go b/server/server.go index 9b615477432f0b9e7eb5c317a9e07a5f8a90fd05..d79782e110e7293eacccbc86bb9c62f038f1fd6d 100644 --- a/server/server.go +++ b/server/server.go @@ -5,10 +5,9 @@ import ( "fmt" "log" "net" - "path/filepath" - "strings" appCfg "github.com/charmbracelet/soft-serve/config" + cm "github.com/charmbracelet/soft-serve/server/cmd" "github.com/charmbracelet/soft-serve/server/config" gm "github.com/charmbracelet/soft-serve/server/git" "github.com/charmbracelet/wish" @@ -39,30 +38,13 @@ func NewServer(cfg *config.Config) *Server { mw := []wish.Middleware{ rm.MiddlewareWithLogger( cfg.ErrorLog, - softMiddleware(ac), + // BubbleTea middleware. bm.MiddlewareWithProgramHandler(SessionHandler(ac), termenv.ANSI256), + // Command middleware must come after the git middleware. + cm.Middleware(ac), + // Git middleware. gm.Middleware(cfg.RepoPath, ac), - // Note: disable pushing to subdirectories as it can create - // conflicts with existing repos. This only affects the git - // middleware. - // - // This is related to - // https://github.com/charmbracelet/soft-serve/issues/120 - // https://github.com/charmbracelet/wish/commit/8808de520d3ea21931f13113c6b0b6d0141272d4 - func(sh ssh.Handler) ssh.Handler { - return func(s ssh.Session) { - cmds := s.Command() - if len(cmds) == 2 && strings.HasPrefix(cmds[0], "git") { - repo := strings.TrimSuffix(strings.TrimPrefix(cmds[1], "/"), "/") - repo = filepath.Clean(repo) - if n := strings.Count(repo, "/"); n != 0 { - wish.Fatalln(s, fmt.Errorf("invalid repo path: subdirectories not allowed")) - return - } - } - sh(s) - } - }, + // Logging middleware must be last to be executed first. lm.Middleware(), ), }