1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
package ssh
import (
"context"
"fmt"
"io/ioutil"
"log"
"net"
"os"
"sync/atomic"
"github.com/armon/go-socks5"
"github.com/gliderlabs/ssh"
"github.com/go-git/go-git/v5/plumbing/transport"
"github.com/go-git/go-git/v5/plumbing/transport/ssh/internal/test"
fixtures "github.com/go-git/go-git-fixtures/v4"
stdssh "golang.org/x/crypto/ssh"
. "gopkg.in/check.v1"
)
type ProxySuite struct {
u UploadPackSuite
fixtures.Suite
}
var _ = Suite(&ProxySuite{})
var socksProxiedRequests int32
func (s *ProxySuite) TestCommand(c *C) {
socksListener, err := net.Listen("tcp", "localhost:0")
c.Assert(err, IsNil)
socksServer, err := socks5.New(&socks5.Config{
AuthMethods: []socks5.Authenticator{socks5.UserPassAuthenticator{
Credentials: socks5.StaticCredentials{
"user": "pass",
},
}},
Rules: TestProxyRule{},
})
c.Assert(err, IsNil)
go func() {
socksServer.Serve(socksListener)
}()
socksProxyAddr := fmt.Sprintf("socks5://localhost:%d", socksListener.Addr().(*net.TCPAddr).Port)
sshListener, err := net.Listen("tcp", "localhost:0")
c.Assert(err, IsNil)
sshServer := &ssh.Server{Handler: test.HandlerSSH}
go func() {
log.Fatal(sshServer.Serve(sshListener))
}()
s.u.port = sshListener.Addr().(*net.TCPAddr).Port
s.u.base, err = ioutil.TempDir(os.TempDir(), fmt.Sprintf("go-git-ssh-%d", s.u.port))
c.Assert(err, IsNil)
DefaultAuthBuilder = func(user string) (AuthMethod, error) {
return &Password{User: user}, nil
}
ep := s.u.prepareRepository(c, fixtures.Basic().One(), "basic.git")
c.Assert(err, IsNil)
ep.Proxy = transport.ProxyOptions{
URL: socksProxyAddr,
Username: "user",
Password: "pass",
}
runner := runner{
config: &stdssh.ClientConfig{
HostKeyCallback: stdssh.InsecureIgnoreHostKey(),
},
}
_, err = runner.Command(transport.UploadPackServiceName, ep, nil)
c.Assert(err, IsNil)
proxyUsed := atomic.LoadInt32(&socksProxiedRequests) > 0
c.Assert(proxyUsed, Equals, true)
}
type TestProxyRule struct{}
func (dr TestProxyRule) Allow(ctx context.Context, req *socks5.Request) (context.Context, bool) {
atomic.AddInt32(&socksProxiedRequests, 1)
return ctx, true
}
|