@@ -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)
@@ -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 {
@@ -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(),
),
}