route.go (1196B)
1 package ssh 2 3 import ( 4 "io" 5 "log/slog" 6 7 charmssh "github.com/charmbracelet/ssh" 8 "github.com/charmbracelet/wish" 9 ) 10 11 func routeMiddleware(logger *slog.Logger) wish.Middleware { 12 return func(next charmssh.Handler) charmssh.Handler { 13 return func(sess charmssh.Session) { 14 ip := remoteIP(sess.RemoteAddr()) 15 user := sess.User() 16 17 if service := gitService(sess); service != "" { 18 owner := isOwner(sess) 19 code := serveGit(sess, service, owner) 20 logger.Info("route decision", 21 "user", user, 22 "ip", ip, 23 "result", service, 24 "owner", owner, 25 "command", sess.RawCommand(), 26 "exit", code, 27 ) 28 _ = sess.Exit(code) 29 return 30 } 31 32 if len(sess.Command()) > 0 { 33 _, _ = io.WriteString(sess.Stderr(), "remote command execution is disabled on the public interface\n") 34 logger.Info("route decision", 35 "user", user, 36 "ip", ip, 37 "result", "rejected", 38 "command", sess.RawCommand(), 39 ) 40 _ = sess.Exit(126) 41 return 42 } 43 44 logger.Info("route decision", 45 "user", user, 46 "ip", ip, 47 "result", "accepted", 48 ) 49 next(sess) 50 logger.Info("route decision", 51 "user", user, 52 "ip", ip, 53 "result", "exited", 54 ) 55 } 56 } 57 }