repos / pico

pico services mono repo
git clone https://github.com/picosh/pico.git

commit
5761ff4
parent
fa97ce3
author
Antonio Mika
date
2025-03-10 23:14:55 -0400 EDT
Set command properly
3 files changed,  +66, -18
M pgs/ssh.go
+5, -1
 1@@ -48,9 +48,9 @@ func StartSshServer(cfg *PgsConfig, killCh chan error) {
 2 			PublicKeyCallback: sshAuth.PubkeyAuthHandler,
 3 		},
 4 		Middleware: []pssh.SSHServerMiddleware{
 5+			sftp.Middleware(handler),
 6 			pipe.Middleware(handler, ""),
 7 			list.Middleware(handler),
 8-			sftp.Middleware(handler),
 9 			scp.Middleware(handler),
10 			rsync.Middleware(handler),
11 			auth.Middleware(handler),
12@@ -58,6 +58,10 @@ func StartSshServer(cfg *PgsConfig, killCh chan error) {
13 			Middleware(handler),
14 			pssh.LogMiddleware(handler, handler.Cfg.DB),
15 		},
16+		SubsystemMiddleware: []pssh.SSHServerMiddleware{
17+			sftp.Middleware(handler),
18+			pssh.LogMiddleware(handler, handler.Cfg.DB),
19+		},
20 	})
21 
22 	pemBytes, err := os.ReadFile("ssh_data/term_info_ed25519")
R pssh/sshServer.go => pssh/server.go
+61, -17
  1@@ -5,6 +5,7 @@ import (
  2 	"errors"
  3 	"log/slog"
  4 	"net"
  5+	"strings"
  6 	"sync"
  7 	"time"
  8 
  9@@ -141,7 +142,10 @@ func (sc *SSHServerConn) Handle(chans <-chan ssh.NewChannel, reqs <-chan *ssh.Re
 10 		select {
 11 		case <-sc.Done():
 12 			return nil
 13-		case newChan := <-chans:
 14+		case newChan, ok := <-chans:
 15+			if !ok {
 16+				return nil
 17+			}
 18 			sc.Logger.Info("new channel", "type", newChan.ChannelType(), "extraData", newChan.ExtraData())
 19 			switch newChan.ChannelType() {
 20 			case "session":
 21@@ -156,26 +160,65 @@ func (sc *SSHServerConn) Handle(chans <-chan ssh.NewChannel, reqs <-chan *ssh.Re
 22 						select {
 23 						case <-sc.Done():
 24 							return
 25-						case req := <-requests:
 26-							if req == nil {
 27-								continue
 28+						case req, ok := <-requests:
 29+							if !ok {
 30+								return
 31 							}
 32+
 33 							sc.Logger.Info("new session request", "type", req.Type, "wantReply", req.WantReply, "payload", req.Payload)
 34+							if req.Type == "subsystem" {
 35+								if len(sc.SSHServer.Config.SubsystemMiddleware) == 0 {
 36+									req.Reply(false, nil)
 37+									continue
 38+								}
 39+
 40+								h := func(*SSHServerConnSession) error { return nil }
 41+								for _, m := range sc.SSHServer.Config.SubsystemMiddleware {
 42+									h = m(h)
 43+								}
 44+
 45+								if err := h(&SSHServerConnSession{
 46+									Channel:       channel,
 47+									SSHServerConn: sc,
 48+								}); err != nil {
 49+									req.Reply(false, nil)
 50+									continue
 51+								}
 52+
 53+								req.Reply(true, nil)
 54+							} else if req.Type == "exec" {
 55+								if len(sc.SSHServer.Config.Middleware) == 0 {
 56+									req.Reply(false, nil)
 57+									continue
 58+								}
 59+
 60+								sesh := &SSHServerConnSession{
 61+									Channel:       channel,
 62+									SSHServerConn: sc,
 63+								}
 64+
 65+								sesh.SetValue("command", strings.Fields(string(req.Payload[4:])))
 66+
 67+								h := func(*SSHServerConnSession) error { return nil }
 68+								for _, m := range sc.SSHServer.Config.Middleware {
 69+									h = m(h)
 70+								}
 71+
 72+								if err := h(sesh); err != nil {
 73+									req.Reply(false, nil)
 74+									continue
 75+								}
 76+
 77+								req.Reply(true, nil)
 78+							}
 79 						}
 80 					}
 81 				}()
 82-
 83-				h := func(*SSHServerConnSession) error { return nil }
 84-				for _, m := range sc.SSHServer.Config.Middleware {
 85-					h = m(h)
 86-				}
 87-
 88-				return h(&SSHServerConnSession{
 89-					Channel:       channel,
 90-					SSHServerConn: sc,
 91-				})
 92 			}
 93-		case req := <-reqs:
 94+		case req, ok := <-reqs:
 95+			if !ok {
 96+				return nil
 97+			}
 98 			sc.Logger.Info("new request", "type", req.Type, "wantReply", req.WantReply, "payload", req.Payload)
 99 		}
100 	}
101@@ -211,8 +254,9 @@ type SSHServerMiddleware func(SSHServerHandler) SSHServerHandler
102 
103 type SSHServerConfig struct {
104 	*ssh.ServerConfig
105-	ListenAddr string
106-	Middleware []SSHServerMiddleware
107+	ListenAddr          string
108+	Middleware          []SSHServerMiddleware
109+	SubsystemMiddleware []SSHServerMiddleware
110 }
111 
112 type SSHServer struct {
R pssh/sshServer_test.go => pssh/server_test.go
+0, -0