From 28ed6ddfd7e48a8f9ec4f83d49a85156dc3d5e93 Mon Sep 17 00:00:00 2001 From: greysoh Date: Mon, 2 Dec 2024 19:15:43 -0500 Subject: [PATCH] feature: Gets initial SSH backend working (this time with the rest of the code). --- api/gosrc/backendutil/application.go | 90 ++++++++++++++++++++++++++-- api/gosrc/commonbackend/constants.go | 3 - api/gosrc/go.mod | 4 ++ api/gosrc/go.sum | 8 +++ api/gosrc/sshbackend/main.go | 10 ++-- 5 files changed, 104 insertions(+), 11 deletions(-) diff --git a/api/gosrc/backendutil/application.go b/api/gosrc/backendutil/application.go index 84bc7bc..b463381 100644 --- a/api/gosrc/backendutil/application.go +++ b/api/gosrc/backendutil/application.go @@ -45,8 +45,35 @@ func (helper *BackendApplicationHelper) Start() error { return fmt.Errorf("failed to typecast") } - // ok, err := - _, _ = helper.Backend.StartBackend(command.Arguments) + ok, err = helper.Backend.StartBackend(command.Arguments) + + var ( + message string + statusCode int + ) + + if err != nil { + message = err.Error() + statusCode = commonbackend.StatusFailure + } else { + statusCode = commonbackend.StatusSuccess + } + + response := &commonbackend.BackendStatusResponse{ + Type: "backendStatusResponse", + IsRunning: ok, + StatusCode: statusCode, + Message: message, + } + + responseMarshalled, err := commonbackend.Marshal(response.Type, response) + + if err != nil { + log.Error("failed to marshal response: %s", err.Error()) + continue + } + + helper.socket.Write(responseMarshalled) case "stop": // TODO: implement response logic _, ok := commandRaw.(*commonbackend.Stop) @@ -55,7 +82,35 @@ func (helper *BackendApplicationHelper) Start() error { return fmt.Errorf("failed to typecast") } - _, _ = helper.Backend.StopBackend() + ok, err = helper.Backend.StopBackend() + + var ( + message string + statusCode int + ) + + if err != nil { + message = err.Error() + statusCode = commonbackend.StatusFailure + } else { + statusCode = commonbackend.StatusSuccess + } + + response := &commonbackend.BackendStatusResponse{ + Type: "backendStatusResponse", + IsRunning: !ok, + StatusCode: statusCode, + Message: message, + } + + responseMarshalled, err := commonbackend.Marshal(response.Type, response) + + if err != nil { + log.Error("failed to marshal response: %s", err.Error()) + continue + } + + helper.socket.Write(responseMarshalled) case "addProxy": // TODO: implement response logic command, ok := commandRaw.(*commonbackend.AddProxy) @@ -64,7 +119,34 @@ func (helper *BackendApplicationHelper) Start() error { return fmt.Errorf("failed to typecast") } - _, _ = helper.Backend.StartProxy(command) + ok, err = helper.Backend.StartProxy(command) + var hasAnyFailed bool + + if !ok { + log.Warnf("failed to add proxy (%s:%d -> remote:%d): StartProxy returned into failure state", command.SourceIP, command.SourcePort, command.DestPort) + hasAnyFailed = true + } else if err != nil { + log.Warnf("failed to add proxy (%s:%d -> remote:%d): %s", command.SourceIP, command.SourcePort, command.DestPort, err.Error()) + hasAnyFailed = true + } + + response := &commonbackend.ProxyStatusResponse{ + Type: "proxyStatusResponse", + SourceIP: command.SourceIP, + SourcePort: command.SourcePort, + DestPort: command.DestPort, + Protocol: command.Protocol, + IsActive: !hasAnyFailed, + } + + responseMarshalled, err := commonbackend.Marshal(response.Type, response) + + if err != nil { + log.Error("failed to marshal response: %s", err.Error()) + continue + } + + helper.socket.Write(responseMarshalled) case "removeProxy": // TODO: implement response logic command, ok := commandRaw.(*commonbackend.RemoveProxy) diff --git a/api/gosrc/commonbackend/constants.go b/api/gosrc/commonbackend/constants.go index 98e23b8..cdb68f2 100644 --- a/api/gosrc/commonbackend/constants.go +++ b/api/gosrc/commonbackend/constants.go @@ -1,8 +1,5 @@ package commonbackend -// TODO (imterah): Rename AddConnectionCommand/RemoveConnectionCommand to AddProxyCommand/RemoveProxyCommand -// and their associated function calls - type Start struct { Type string // Will be 'start' always Arguments []byte diff --git a/api/gosrc/go.mod b/api/gosrc/go.mod index 1df32b6..13f7b5e 100644 --- a/api/gosrc/go.mod +++ b/api/gosrc/go.mod @@ -6,6 +6,7 @@ require ( github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/charmbracelet/lipgloss v0.10.0 // indirect github.com/charmbracelet/log v0.4.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/mattn/go-isatty v0.0.18 // indirect @@ -13,6 +14,9 @@ require ( github.com/muesli/reflow v0.3.0 // indirect github.com/muesli/termenv v0.15.2 // indirect github.com/rivo/uniseg v0.4.7 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/urfave/cli/v2 v2.27.5 // indirect + github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect golang.org/x/crypto v0.29.0 // indirect golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect golang.org/x/sys v0.27.0 // indirect diff --git a/api/gosrc/go.sum b/api/gosrc/go.sum index c6ca623..b0830af 100644 --- a/api/gosrc/go.sum +++ b/api/gosrc/go.sum @@ -4,6 +4,8 @@ github.com/charmbracelet/lipgloss v0.10.0 h1:KWeXFSexGcfahHX+54URiZGkBFazf70JNMt github.com/charmbracelet/lipgloss v0.10.0/go.mod h1:Wig9DSfvANsxqkRsqj6x87irdy123SR4dOXlKa91ciE= github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8ZM= github.com/charmbracelet/log v0.4.0/go.mod h1:63bXt/djrizTec0l11H20t8FDSvA4CRZJ1KH22MdptM= +github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= +github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= @@ -21,6 +23,12 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w= +github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= diff --git a/api/gosrc/sshbackend/main.go b/api/gosrc/sshbackend/main.go index 5fbb8f9..ec9b88b 100644 --- a/api/gosrc/sshbackend/main.go +++ b/api/gosrc/sshbackend/main.go @@ -64,7 +64,8 @@ func (backend *SSHBackend) StartBackend(bytes []byte) (bool, error) { auth := ssh.PublicKeys(signer) config := &ssh.ClientConfig{ - User: backendData.Username, + HostKeyCallback: ssh.InsecureIgnoreHostKey(), + User: backendData.Username, Auth: []ssh.AuthMethod{ auth, }, @@ -140,8 +141,9 @@ func (backend *SSHBackend) StartProxy(command *commonbackend.AddProxy) (bool, er continue } - clientIP := forwardedConn.RemoteAddr().String() - clientPort, err := strconv.Atoi(clientIP[strings.Index(clientIP, ":"):]) + clientIPAndPort := forwardedConn.RemoteAddr().String() + clientIP := clientIPAndPort[:strings.LastIndex(clientIPAndPort, ":")] + clientPort, err := strconv.Atoi(clientIPAndPort[strings.LastIndex(clientIPAndPort, ":")+1:]) if err != nil { log.Warnf("failed to parse client port: %s", err.Error()) @@ -152,7 +154,7 @@ func (backend *SSHBackend) StartProxy(command *commonbackend.AddProxy) (bool, er SourceIP: command.SourceIP, SourcePort: command.SourcePort, DestPort: command.DestPort, - ClientIP: clientIP[:strings.Index(clientIP, ":")], + ClientIP: clientIP, ClientPort: uint16(clientPort), // FIXME (imterah): shouldn't protocol be in here?