prime8dev

prime8dev
git clone https://git.prime8.dev/prime8dev.git
Log | Files | Refs | README | LICENSE

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 }