Skip to content

Commit 60a6b62

Browse files
authored
Merge pull request #36 from blacknon/develop
Version 0.1.12
2 parents 5223f7b + 8bd7831 commit 60a6b62

File tree

7 files changed

+147
-30
lines changed

7 files changed

+147
-30
lines changed

.github/workflows/test_and_release.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ jobs:
2020
- os: ubuntu-latest
2121
runs-on: ${{ matrix.os }}
2222
steps:
23-
- name: Set up Go 1.17
23+
- name: Set up Go 1.22
2424
uses: actions/setup-go@v1
2525
with:
26-
go-version: 1.17
26+
go-version: 1.22
2727

2828
- name: Check out code into the Go module directory
2929
uses: actions/checkout@v1

auth.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ package sshlib
1313

1414
import (
1515
"fmt"
16-
"io/ioutil"
16+
"os"
1717
"regexp"
1818
"strings"
1919

@@ -46,7 +46,7 @@ func CreateSignerPublicKey(key, password string) (signer ssh.Signer, err error)
4646
key = getAbsPath(key)
4747

4848
// Read PrivateKey file
49-
keyData, err := ioutil.ReadFile(key)
49+
keyData, err := os.ReadFile(key)
5050
if err != nil {
5151
return
5252
}
@@ -86,7 +86,7 @@ func CreateSignerPublicKeyPrompt(key, password string) (signer ssh.Signer, err e
8686
key = getAbsPath(key)
8787

8888
// Read PrivateKey file
89-
keyData, err := ioutil.ReadFile(key)
89+
keyData, err := os.ReadFile(key)
9090
if err != nil {
9191
return
9292
}
@@ -138,7 +138,7 @@ func CreateSignerCertificate(cert string, keySigner ssh.Signer) (certSigner ssh.
138138
cert = getAbsPath(cert)
139139

140140
// Read Cert file
141-
certData, err := ioutil.ReadFile(cert)
141+
certData, err := os.ReadFile(cert)
142142
if err != nil {
143143
return
144144
}

connect.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ type Connect struct {
9595
// Set it before CraeteClient.
9696
ForwardX11Trusted bool
9797

98-
//
98+
// Dynamic forward related logger
9999
DynamicForwardLogger *log.Logger
100100

101101
// shell terminal log flag

forward.go

+58-18
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919

2020
"github.com/armon/go-socks5"
2121
xauth "github.com/blacknon/go-x11auth"
22-
"github.com/elazarl/goproxy"
2322
"golang.org/x/crypto/ssh"
2423
)
2524

@@ -158,8 +157,8 @@ func getX11DisplayNumber(display string) int {
158157
//
159158
// example) "127.0.0.1:22", "abc.com:9977"
160159
func (c *Connect) TCPLocalForward(localAddr, remoteAddr string) (err error) {
161-
// create listner
162-
listner, err := net.Listen("tcp", localAddr)
160+
// create listener
161+
listener, err := net.Listen("tcp", localAddr)
163162
if err != nil {
164163
return
165164
}
@@ -168,7 +167,7 @@ func (c *Connect) TCPLocalForward(localAddr, remoteAddr string) (err error) {
168167
go func() {
169168
for {
170169
// local (type net.Conn)
171-
local, err := listner.Accept()
170+
local, err := listener.Accept()
172171
if err != nil {
173172
return
174173
}
@@ -189,8 +188,8 @@ func (c *Connect) TCPLocalForward(localAddr, remoteAddr string) (err error) {
189188
//
190189
// example) "127.0.0.1:22", "abc.com:9977"
191190
func (c *Connect) TCPRemoteForward(localAddr, remoteAddr string) (err error) {
192-
// create listner
193-
listner, err := c.Client.Listen("tcp", remoteAddr)
191+
// create listener
192+
listener, err := c.Client.Listen("tcp", remoteAddr)
194193
if err != nil {
195194
return
196195
}
@@ -205,7 +204,7 @@ func (c *Connect) TCPRemoteForward(localAddr, remoteAddr string) (err error) {
205204
}
206205

207206
// remote (type net.Conn)
208-
remote, err := listner.Accept()
207+
remote, err := listener.Accept()
209208
if err != nil {
210209
return
211210
}
@@ -291,8 +290,8 @@ func (c *Connect) TCPReverseDynamicForward(address, port string) (err error) {
291290
Logger: c.getDynamicForwardLogger(),
292291
}
293292

294-
// create listner
295-
listner, err := c.Client.Listen("tcp", net.JoinHostPort(address, port))
293+
// create listener
294+
listener, err := c.Client.Listen("tcp", net.JoinHostPort(address, port))
296295
if err != nil {
297296
return
298297
}
@@ -304,25 +303,66 @@ func (c *Connect) TCPReverseDynamicForward(address, port string) (err error) {
304303
}
305304

306305
// Listen
307-
err = s.Serve(listner)
306+
err = s.Serve(listener)
308307
return
309308
}
310309

311310
// HTTPDynamicForward forwarding http data.
312311
// Like Dynamic forward (`ssh -D <port>`). but use http proxy.
313312
func (c *Connect) HTTPDynamicForward(address, port string) (err error) {
314-
// create http proxy. use goproxy
315-
httpProxy := goproxy.NewProxyHttpServer()
313+
// create dial
314+
dial := c.Client.Dial
316315

317-
// set dial
318-
httpProxy.ConnectDial = func(n, addr string) (net.Conn, error) {
319-
return c.Client.Dial(n, addr)
316+
// create listener
317+
listener, err := net.Listen("tcp", net.JoinHostPort(address, port))
318+
if err != nil {
319+
return
320+
}
321+
defer listener.Close()
322+
323+
// create proxy server.
324+
server := &http.Server{
325+
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
326+
if r.Method == http.MethodConnect {
327+
handleHTTPSProxy(dial, w, r)
328+
} else {
329+
handleHTTPProxy(dial, w, r)
330+
}
331+
}),
332+
ErrorLog: c.getDynamicForwardLogger(),
320333
}
321334

322-
// set logger
323-
httpProxy.Logger = c.getDynamicForwardLogger()
335+
// listen
336+
err = server.Serve(listener)
337+
return
338+
}
339+
340+
// HTTPReverseDynamicForward reverse forwarding http data.
341+
// Like Reverse Dynamic forward (`ssh -R <port>`). but use http proxy.
342+
func (c *Connect) HTTPReverseDynamicForward(address, port string) (err error) {
343+
// create dial
344+
dial := net.Dial
345+
346+
// create listener
347+
listener, err := c.Client.Listen("tcp", net.JoinHostPort(address, port))
348+
if err != nil {
349+
return
350+
}
351+
defer listener.Close()
352+
353+
// create proxy server.
354+
server := &http.Server{
355+
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
356+
if r.Method == http.MethodConnect {
357+
handleHTTPSProxy(dial, w, r)
358+
} else {
359+
handleHTTPProxy(dial, w, r)
360+
}
361+
}),
362+
ErrorLog: c.getDynamicForwardLogger(),
363+
}
324364

325365
// listen
326-
err = http.ListenAndServe(net.JoinHostPort(address, port), httpProxy)
366+
err = server.Serve(listener)
327367
return
328368
}

go.mod

+1-5
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@ require (
1212
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e
1313
golang.org/x/net v0.0.0-20220526153639-5463443f8c37
1414
golang.org/x/sys v0.19.0
15-
)
16-
17-
require (
18-
github.com/elazarl/goproxy v0.0.0-20231117061959-7cc037d33fb5
1915
golang.org/x/term v0.19.0
2016
)
2117

@@ -28,6 +24,6 @@ require (
2824
gopkg.in/yaml.v3 v3.0.1 // indirect
2925
)
3026

31-
go 1.22.2
27+
go 1.22.4
3228

3329
replace github.com/ThalesIgnite/crypto11 v1.2.5 => github.com/blacknon/crypto11 v1.2.6

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
6060
golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
6161
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
6262
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
63+
gopkg.in/elazarl/goproxy.v1 v1.0.0-20180725130230-947c36da3153 h1:i2sumy6EgvN2dbX7HPhoDc7hLyoym3OYdU5HlvUUrpE=
64+
gopkg.in/elazarl/goproxy.v1 v1.0.0-20180725130230-947c36da3153/go.mod h1:xzjpkyedLMz3EXUTBbkRuuGPsxfsBX3Sy7J6kC9Gvoc=
6365
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
6466
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
6567
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

http_proxy.go

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// Copyright (c) 2024 Blacknon. All rights reserved.
2+
// Use of this source code is governed by an MIT license
3+
// that can be found in the LICENSE file.
4+
5+
package sshlib
6+
7+
import (
8+
"io"
9+
"net"
10+
"net/http"
11+
"time"
12+
)
13+
14+
// httpTransfer copies data between src and dst
15+
func httpTransfer(dst io.WriteCloser, src io.ReadCloser) {
16+
defer dst.Close()
17+
defer src.Close()
18+
io.Copy(dst, src)
19+
}
20+
21+
// handleHTTPSProxy handles CONNECT method for HTTPS requests
22+
func handleHTTPSProxy(dial func(network, addr string) (net.Conn, error), w http.ResponseWriter, r *http.Request) {
23+
destConn, err := dial("tcp", r.Host)
24+
if err != nil {
25+
http.Error(w, err.Error(), http.StatusServiceUnavailable)
26+
return
27+
}
28+
29+
// Write 200 OK response to the client
30+
w.WriteHeader(http.StatusOK)
31+
32+
// Get underlying connection from ResponseWriter
33+
clientConn, buf, err := w.(http.Hijacker).Hijack()
34+
if err != nil {
35+
http.Error(w, err.Error(), http.StatusServiceUnavailable)
36+
destConn.Close()
37+
return
38+
}
39+
40+
// Make sure to set read/write deadlines for both connections
41+
clientConn.SetDeadline(time.Time{})
42+
destConn.SetDeadline(time.Time{})
43+
44+
go httpTransfer(destConn, clientConn)
45+
go httpTransfer(clientConn, destConn)
46+
47+
// Ensure any buffered data from the client is written to the destination
48+
if buf.Reader.Buffered() > 0 {
49+
io.Copy(destConn, buf)
50+
}
51+
}
52+
53+
// handleHTTPProxy handles HTTP requests
54+
func handleHTTPProxy(dial func(network, addr string) (net.Conn, error), w http.ResponseWriter, r *http.Request) {
55+
r.RequestURI = ""
56+
r.URL.Scheme = "http"
57+
if r.URL.Host == "" {
58+
r.URL.Host = r.Host
59+
}
60+
61+
transport := &http.Transport{
62+
Dial: dial,
63+
}
64+
65+
resp, err := transport.RoundTrip(r)
66+
if err != nil {
67+
http.Error(w, err.Error(), http.StatusServiceUnavailable)
68+
return
69+
}
70+
defer resp.Body.Close()
71+
72+
for key, value := range resp.Header {
73+
for _, v := range value {
74+
w.Header().Add(key, v)
75+
}
76+
}
77+
w.WriteHeader(resp.StatusCode)
78+
io.Copy(w, resp.Body)
79+
}

0 commit comments

Comments
 (0)