From f02d2bc32e8d05edfd49c755afe7249fc6251d15 Mon Sep 17 00:00:00 2001 From: pycook Date: Mon, 11 Aug 2025 23:38:20 +0800 Subject: [PATCH] fix(backend): resolve gin.Context nil pointer dereference --- backend/internal/sshsrv/handler.go | 42 +++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/backend/internal/sshsrv/handler.go b/backend/internal/sshsrv/handler.go index 492148c..968be9c 100644 --- a/backend/internal/sshsrv/handler.go +++ b/backend/internal/sshsrv/handler.go @@ -22,6 +22,29 @@ import ( "github.com/veops/oneterm/pkg/logger" ) +// testResponseWriter implements http.ResponseWriter for gin.CreateTestContext +type testResponseWriter struct { + headers http.Header + body []byte + status int +} + +func (w *testResponseWriter) Write(b []byte) (int, error) { + w.body = append(w.body, b...) + return len(b), nil +} + +func (w *testResponseWriter) WriteHeader(status int) { + w.status = status +} + +func (w *testResponseWriter) Header() http.Header { + if w.headers == nil { + w.headers = make(http.Header) + } + return w.headers +} + func handler(sess ssh.Session) { defer acl.Logout(sess.Context().Value("session").(*acl.Session)) pty, _, isPty := sess.Pty() @@ -30,14 +53,21 @@ func handler(sess ssh.Session) { return } - ctx := &gin.Context{ - Request: &http.Request{ - RemoteAddr: sess.RemoteAddr().String(), - URL: &url.URL{ - RawQuery: fmt.Sprintf("info=true&w=%d&h=%d", pty.Window.Width, pty.Window.Height), - }, + // Create a properly initialized gin.Context + req := &http.Request{ + RemoteAddr: sess.RemoteAddr().String(), + URL: &url.URL{ + RawQuery: fmt.Sprintf("info=true&w=%d&h=%d", pty.Window.Width, pty.Window.Height), }, + Header: make(http.Header), + Method: "GET", + Host: "localhost", } + + // Use gin.CreateTestContext to create a properly initialized context + rec := &testResponseWriter{} + ctx, _ := gin.CreateTestContext(rec) + ctx.Request = req ctx.Set("sessionType", model.SESSIONTYPE_CLIENT) ctx.Set("session", sess.Context().Value("session"))