Quellcode durchsuchen

Merge remote-tracking branch 'origin/master' into stable

tags/v0.13^0
9seconds vor 7 Jahren
Ursprung
Commit
84f4a37d11

+ 1
- 6
.travis.yml Datei anzeigen

@@ -5,8 +5,7 @@ sudo: false
5 5
 dist: trusty
6 6
 
7 7
 go:
8
-  - "1.9.x"
9
-  - "1.10.x"
8
+  - "1.11.x"
10 9
   - master
11 10
 
12 11
 before_script: make prepare
@@ -17,10 +16,6 @@ script:
17 16
   - make critic
18 17
   - make test
19 18
 
20
-cache:
21
-  directories:
22
-    - vendor
23
-
24 19
 matrix:
25 20
   allow_failures:
26 21
     - go: master

+ 2
- 9
Dockerfile Datei anzeigen

@@ -1,7 +1,7 @@
1 1
 ###############################################################################
2 2
 # BUILD STAGE
3 3
 
4
-FROM golang:alpine
4
+FROM golang:1.11-alpine
5 5
 
6 6
 RUN set -x \
7 7
   && apk --no-cache --update add \
@@ -13,14 +13,7 @@ RUN set -x \
13 13
     upx \
14 14
   && update-ca-certificates
15 15
 
16
-COPY Gopkg.toml Gopkg.lock Makefile /go/src/github.com/9seconds/mtg/
17
-
18
-RUN set -x && \
19
-  cd /go/src/github.com/9seconds/mtg && \
20
-  make -j 4 prepare && \
21
-  make vendor
22
-
23
-COPY . /go/src/github.com/9seconds/mtg
16
+COPY . /go/src/github.com/9seconds/mtg/
24 17
 
25 18
 RUN set -x \
26 19
   && cd /go/src/github.com/9seconds/mtg \

+ 0
- 154
Gopkg.lock Datei anzeigen

@@ -1,154 +0,0 @@
1
-# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
2
-
3
-
4
-[[projects]]
5
-  branch = "master"
6
-  digest = "1:315c5f2f60c76d89b871c73f9bd5fe689cad96597afd50fb9992228ef80bdd34"
7
-  name = "github.com/alecthomas/template"
8
-  packages = [
9
-    ".",
10
-    "parse",
11
-  ]
12
-  pruneopts = "UT"
13
-  revision = "a0175ee3bccc567396460bf5acd36800cb10c49c"
14
-
15
-[[projects]]
16
-  branch = "master"
17
-  digest = "1:c198fdc381e898e8fb62b8eb62758195091c313ad18e52a3067366e1dda2fb3c"
18
-  name = "github.com/alecthomas/units"
19
-  packages = ["."]
20
-  pruneopts = "UT"
21
-  revision = "2efee857e7cfd4f3d0138cc3cbb1b4966962b93a"
22
-
23
-[[projects]]
24
-  digest = "1:a8d622a8049a4aa420e1c509873bb85d4c45c5107f420d922f919bfcb8d08694"
25
-  name = "github.com/beevik/ntp"
26
-  packages = ["."]
27
-  pruneopts = "UT"
28
-  revision = "62c80a04de2086884d8296004b6d74ee1846c582"
29
-  version = "v0.2.0"
30
-
31
-[[projects]]
32
-  digest = "1:a2c1d0e43bd3baaa071d1b9ed72c27d78169b2b269f71c105ac4ba34b1be4a39"
33
-  name = "github.com/davecgh/go-spew"
34
-  packages = ["spew"]
35
-  pruneopts = "UT"
36
-  revision = "346938d642f2ec3594ed81d874461961cd0faa76"
37
-  version = "v1.1.0"
38
-
39
-[[projects]]
40
-  branch = "master"
41
-  digest = "1:6f9339c912bbdda81302633ad7e99a28dfa5a639c864061f1929510a9a64aa74"
42
-  name = "github.com/dustin/go-humanize"
43
-  packages = ["."]
44
-  pruneopts = "UT"
45
-  revision = "9f541cc9db5d55bce703bd99987c9d5cb8eea45e"
46
-
47
-[[projects]]
48
-  branch = "master"
49
-  digest = "1:53bd4347b151fcbedcdda527f7ebf4924f0e21d672131812f857175d8c7a1051"
50
-  name = "github.com/juju/errors"
51
-  packages = ["."]
52
-  pruneopts = "UT"
53
-  revision = "812b06ada1776ad4dd95d575e18ffffe3a9ac34a"
54
-
55
-[[projects]]
56
-  digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe"
57
-  name = "github.com/pmezard/go-difflib"
58
-  packages = ["difflib"]
59
-  pruneopts = "UT"
60
-  revision = "792786c7400a136282c1664665ae0a8db921c6c2"
61
-  version = "v1.0.0"
62
-
63
-[[projects]]
64
-  digest = "1:274f67cb6fed9588ea2521ecdac05a6d62a8c51c074c1fccc6a49a40ba80e925"
65
-  name = "github.com/satori/go.uuid"
66
-  packages = ["."]
67
-  pruneopts = "UT"
68
-  revision = "f58768cc1a7a7e77a3bd49e98cdd21419399b6a3"
69
-  version = "v1.2.0"
70
-
71
-[[projects]]
72
-  digest = "1:18752d0b95816a1b777505a97f71c7467a8445b8ffb55631a7bf779f6ba4fa83"
73
-  name = "github.com/stretchr/testify"
74
-  packages = ["assert"]
75
-  pruneopts = "UT"
76
-  revision = "f35b8ab0b5a2cef36673838d662e249dd9c94686"
77
-  version = "v1.2.2"
78
-
79
-[[projects]]
80
-  digest = "1:3c1a69cdae3501bf75e76d0d86dc6f2b0a7421bc205c0cb7b96b19eed464a34d"
81
-  name = "go.uber.org/atomic"
82
-  packages = ["."]
83
-  pruneopts = "UT"
84
-  revision = "1ea20fb1cbb1cc08cbd0d913a96dead89aa18289"
85
-  version = "v1.3.2"
86
-
87
-[[projects]]
88
-  digest = "1:60bf2a5e347af463c42ed31a493d817f8a72f102543060ed992754e689805d1a"
89
-  name = "go.uber.org/multierr"
90
-  packages = ["."]
91
-  pruneopts = "UT"
92
-  revision = "3c4937480c32f4c13a875a1829af76c98ca3d40a"
93
-  version = "v1.1.0"
94
-
95
-[[projects]]
96
-  digest = "1:d9a420eae5f76973feeb733fbf58f6a89173255b63b27a7ae4b2124a73dc6c5b"
97
-  name = "go.uber.org/zap"
98
-  packages = [
99
-    ".",
100
-    "buffer",
101
-    "internal/bufferpool",
102
-    "internal/color",
103
-    "internal/exit",
104
-    "zapcore",
105
-  ]
106
-  pruneopts = "UT"
107
-  revision = "4d45f9617f7d90f7a663ff21c7a4321dbe78098b"
108
-  version = "v1.9.0"
109
-
110
-[[projects]]
111
-  branch = "master"
112
-  digest = "1:becb2131aece71c64ebca5ddfd38cf631784fbb3a678d73ead3b42107c9f41ce"
113
-  name = "golang.org/x/net"
114
-  packages = [
115
-    "bpf",
116
-    "internal/iana",
117
-    "internal/socket",
118
-    "ipv4",
119
-  ]
120
-  pruneopts = "UT"
121
-  revision = "3673e40ba22529d22c3fd7c93e97b0ce50fa7bdd"
122
-
123
-[[projects]]
124
-  digest = "1:c06d9e11d955af78ac3bbb26bd02e01d2f61f689e1a3bce2ef6fb683ef8a7f2d"
125
-  name = "gopkg.in/alecthomas/kingpin.v2"
126
-  packages = ["."]
127
-  pruneopts = "UT"
128
-  revision = "947dcec5ba9c011838740e680966fd7087a71d0d"
129
-  version = "v2.2.6"
130
-
131
-[[projects]]
132
-  digest = "1:38b469493eb173db9c03321d64adcad4c7991ea0a19b5edc5bdc094f0e8c7384"
133
-  name = "gopkg.in/alexcesaro/statsd.v2"
134
-  packages = ["."]
135
-  pruneopts = "UT"
136
-  revision = "7fea3f0d2fab1ad973e641e51dba45443a311a90"
137
-  version = "v2.0.0"
138
-
139
-[solve-meta]
140
-  analyzer-name = "dep"
141
-  analyzer-version = 1
142
-  input-imports = [
143
-    "github.com/beevik/ntp",
144
-    "github.com/dustin/go-humanize",
145
-    "github.com/juju/errors",
146
-    "github.com/satori/go.uuid",
147
-    "github.com/stretchr/testify/assert",
148
-    "go.uber.org/zap",
149
-    "go.uber.org/zap/zapcore",
150
-    "gopkg.in/alecthomas/kingpin.v2",
151
-    "gopkg.in/alexcesaro/statsd.v2",
152
-  ]
153
-  solver-name = "gps-cdcl"
154
-  solver-version = 1

+ 0
- 58
Gopkg.toml Datei anzeigen

@@ -1,58 +0,0 @@
1
-# Gopkg.toml example
2
-#
3
-# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
4
-# for detailed Gopkg.toml documentation.
5
-#
6
-# required = ["github.com/user/thing/cmd/thing"]
7
-# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
8
-#
9
-# [[constraint]]
10
-#   name = "github.com/user/project"
11
-#   version = "1.0.0"
12
-#
13
-# [[constraint]]
14
-#   name = "github.com/user/project2"
15
-#   branch = "dev"
16
-#   source = "github.com/myfork/project2"
17
-#
18
-# [[override]]
19
-#   name = "github.com/x/y"
20
-#   version = "2.4.0"
21
-#
22
-# [prune]
23
-#   non-go = false
24
-#   go-tests = true
25
-#   unused-packages = true
26
-
27
-
28
-[prune]
29
-  go-tests = true
30
-  unused-packages = true
31
-
32
-[[constraint]]
33
-  name = "gopkg.in/alecthomas/kingpin.v2"
34
-  version = "2.2.6"
35
-
36
-[[constraint]]
37
-  branch = "master"
38
-  name = "github.com/juju/errors"
39
-
40
-[[constraint]]
41
-  name = "github.com/stretchr/testify"
42
-  version = "1.2.1"
43
-
44
-[[constraint]]
45
-  name = "github.com/satori/go.uuid"
46
-  version = "1.2.0"
47
-
48
-[[constraint]]
49
-  branch = "master"
50
-  name = "github.com/dustin/go-humanize"
51
-
52
-[[constraint]]
53
-  name = "github.com/beevik/ntp"
54
-  version = "0.2.0"
55
-
56
-[[constraint]]
57
-  name = "gopkg.in/alexcesaro/statsd.v2"
58
-  version = "2.0.0"

+ 20
- 22
Makefile Datei anzeigen

@@ -2,26 +2,28 @@ ROOT_DIR     := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
2 2
 IMAGE_NAME   := mtg
3 3
 APP_NAME     := $(IMAGE_NAME)
4 4
 
5
-VENDOR_FILES := $(shell find "$(ROOT_DIR)/vendor" 2>/dev/null || echo -n "vendor")
6 5
 CC_BINARIES  := $(shell bash -c "echo -n $(APP_NAME)-{linux,freebsd,openbsd}-{386,amd64} $(APP_NAME)-linux-{arm,arm64}")
7
-APP_DEPS     := version.go $(VENDOR_FILES)
6
+APP_DEPS     := version.go
8 7
 
9
-GOLANGCI_LINT_VERSION := v1.9.2
8
+GOLANGCI_LINT_VERSION := v1.10.2
10 9
 
11 10
 COMMON_BUILD_FLAGS := -ldflags="-s -w"
12 11
 
12
+MOD_ON  := env GO111MODULE=on
13
+MOD_OFF := env GO111MODULE=auto
14
+
13 15
 # -----------------------------------------------------------------------------
14 16
 
15 17
 $(APP_NAME): $(APP_DEPS)
16
-	@go build $(COMMON_BUILD_FLAGS) -o "$(APP_NAME)"
18
+	@$(MOD_ON) go build $(COMMON_BUILD_FLAGS) -o "$(APP_NAME)"
17 19
 
18 20
 static-$(APP_NAME): $(APP_DEPS)
19
-	@env CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo $(COMMON_BUILD_FLAGS) -o "$(APP_NAME)"
21
+	@$(MOD_ON) env CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo $(COMMON_BUILD_FLAGS) -o "$(APP_NAME)"
20 22
 
21 23
 $(APP_NAME)-%: GOOS=$(shell echo -n "$@" | sed 's?$(APP_NAME)-??' | cut -f1 -d-)
22 24
 $(APP_NAME)-%: GOARCH=$(shell echo -n "$@" | sed 's?$(APP_NAME)-??' | cut -f2 -d-)
23 25
 $(APP_NAME)-%: $(APP_DEPS) ccbuilds
24
-	@env "GOOS=$(GOOS)" "GOARCH=$(GOARCH)" \
26
+	@$(MOD_ON) env "GOOS=$(GOOS)" "GOARCH=$(GOARCH)" \
25 27
 		go build \
26 28
 		$(COMMON_BUILD_FLAGS) \
27 29
 		-o "./ccbuilds/$(APP_NAME)-$(GOOS)-$(GOARCH)"
@@ -30,10 +32,10 @@ ccbuilds:
30 32
 	@rm -rf ./ccbuilds && mkdir -p ./ccbuilds
31 33
 
32 34
 version.go:
33
-	@go generate main.go
35
+	@$(MOD_ON) go generate main.go
34 36
 
35
-vendor: Gopkg.lock Gopkg.toml
36
-	@dep ensure --vendor-only
37
+vendor: go.mod go.sum
38
+	@$(MOD_ON) go mod vendor
37 39
 
38 40
 # -----------------------------------------------------------------------------
39 41
 
@@ -51,16 +53,16 @@ crosscompile-dir:
51 53
 	@rm -rf "$(CC_DIR)" && mkdir -p "$(CC_DIR)"
52 54
 
53 55
 .PHONY: test
54
-test: vendor version.go
55
-	@go test -v ./...
56
+test: vendor $(APP_DEPS)
57
+	@$(MOD_ON) go test -v ./...
56 58
 
57 59
 .PHONY: lint
58
-lint: version.go
59
-	@golangci-lint run
60
+lint: vendor $(APP_DEPS)
61
+	@$(MOD_OFF) golangci-lint run
60 62
 
61 63
 .PHONY: critic
62
-critic: version.go
63
-	@gocritic check-project "$(ROOT_DIR)"
64
+critic: vendor $(APP_DEPS)
65
+	@$(MOD_OFF) gocritic check-project "$(ROOT_DIR)"
64 66
 
65 67
 .PHONY: clean
66 68
 clean:
@@ -73,17 +75,13 @@ docker:
73 75
 	@docker build --pull -t "$(IMAGE_NAME)" "$(ROOT_DIR)"
74 76
 
75 77
 .PHONY: prepare
76
-prepare: install-dep install-lint install-critic
77
-
78
-.PHONY: install-dep
79
-install-dep:
80
-	@go get -u github.com/golang/dep/cmd/dep
78
+prepare: install-lint install-critic
81 79
 
82 80
 .PHONY: install-lint
83 81
 install-lint:
84 82
 	@curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh \
85
-		| bash -s -- -b $(GOPATH)/bin $(GOLANGCI_LINT_VERSION)
83
+		| $(MOD_OFF) bash -s -- -b $(GOPATH)/bin $(GOLANGCI_LINT_VERSION)
86 84
 
87 85
 .PHONY: install-critic
88 86
 install-critic:
89
-	@go get -u github.com/go-critic/go-critic/...
87
+	@$(MOD_OFF) go get -u github.com/go-critic/go-critic/...

+ 2
- 2
client/direct.go Datei anzeigen

@@ -30,12 +30,12 @@ func DirectInit(ctx context.Context, cancel context.CancelFunc, socket net.Conn,
30 30
 		return nil, nil, errors.Annotate(err, "Cannot set write buffer size of client socket")
31 31
 	}
32 32
 
33
-	socket.SetReadDeadline(time.Now().Add(handshakeTimeout)) // nolint: errcheck
33
+	socket.SetReadDeadline(time.Now().Add(handshakeTimeout)) // nolint: errcheck, gosec
34 34
 	frame, err := obfuscated2.ExtractFrame(socket)
35 35
 	if err != nil {
36 36
 		return nil, nil, errors.Annotate(err, "Cannot extract frame")
37 37
 	}
38
-	socket.SetReadDeadline(time.Time{}) // nolint: errcheck
38
+	socket.SetReadDeadline(time.Time{}) // nolint: errcheck, gosec
39 39
 
40 40
 	conn := wrappers.NewConn(ctx, cancel, socket, connID, wrappers.ConnPurposeClient, conf.PublicIPv4, conf.PublicIPv6)
41 41
 	obfs2, connOpts, err := obfuscated2.ParseObfuscated2ClientFrame(conf.Secret, frame)

+ 26
- 0
go.mod Datei anzeigen

@@ -0,0 +1,26 @@
1
+module github.com/9seconds/mtg
2
+
3
+require (
4
+	github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc // indirect
5
+	github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf // indirect
6
+	github.com/beevik/ntp v0.2.0
7
+	github.com/davecgh/go-spew v1.1.1 // indirect
8
+	github.com/dustin/go-humanize v0.0.0-20180713052910-9f541cc9db5d
9
+	github.com/gofrs/uuid v3.1.0+incompatible
10
+	github.com/juju/errors v0.0.0-20180806074554-22422dad46e1
11
+	github.com/juju/loggo v0.0.0-20180524022052-584905176618 // indirect
12
+	github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073 // indirect
13
+	github.com/kr/pretty v0.1.0 // indirect
14
+	github.com/pkg/errors v0.8.0 // indirect
15
+	github.com/pmezard/go-difflib v1.0.0 // indirect
16
+	github.com/stretchr/testify v1.2.2
17
+	go.uber.org/atomic v1.3.2 // indirect
18
+	go.uber.org/multierr v1.1.0 // indirect
19
+	go.uber.org/zap v1.9.1
20
+	golang.org/x/net v0.0.0-20180921000356-2f5d2388922f // indirect
21
+	gopkg.in/alecthomas/kingpin.v2 v2.2.6
22
+	gopkg.in/alexcesaro/statsd.v2 v2.0.0
23
+	gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
24
+	gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce // indirect
25
+	gopkg.in/yaml.v2 v2.2.1 // indirect
26
+)

+ 48
- 0
go.sum Datei anzeigen

@@ -0,0 +1,48 @@
1
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU=
2
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
3
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY=
4
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
5
+github.com/beevik/ntp v0.2.0 h1:sGsd+kAXzT0bfVfzJfce04g+dSRfrs+tbQW8lweuYgw=
6
+github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg=
7
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
8
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9
+github.com/dustin/go-humanize v0.0.0-20180713052910-9f541cc9db5d h1:lDrio3iIdNb0Gw9CgH7cQF+iuB5mOOjdJ9ERNJCBgb4=
10
+github.com/dustin/go-humanize v0.0.0-20180713052910-9f541cc9db5d/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
11
+github.com/gofrs/uuid v3.1.0+incompatible h1:q2rtkjaKT4YEr6E1kamy0Ha4RtepWlQBedyHx0uzKwA=
12
+github.com/gofrs/uuid v3.1.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
13
+github.com/juju/errors v0.0.0-20180806074554-22422dad46e1 h1:wnhMXidtb70kDZCeLt/EfsVtkXS5c8zLnE9y/6DIRAU=
14
+github.com/juju/errors v0.0.0-20180806074554-22422dad46e1/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
15
+github.com/juju/loggo v0.0.0-20180524022052-584905176618 h1:MK144iBQF9hTSwBW/9eJm034bVoG30IshVm688T2hi8=
16
+github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U=
17
+github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073 h1:WQM1NildKThwdP7qWrNAFGzp4ijNLw8RlgENkaI4MJs=
18
+github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA=
19
+github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
20
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
21
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
22
+github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
23
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
24
+github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
25
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
26
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
27
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
28
+github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
29
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
30
+go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4=
31
+go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
32
+go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
33
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
34
+go.uber.org/zap v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o=
35
+go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
36
+golang.org/x/net v0.0.0-20180921000356-2f5d2388922f h1:QM2QVxvDoW9PFSPp/zy9FgxJLfaWTZlS61KEPtBwacM=
37
+golang.org/x/net v0.0.0-20180921000356-2f5d2388922f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
38
+gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
39
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
40
+gopkg.in/alexcesaro/statsd.v2 v2.0.0 h1:FXkZSCZIH17vLCO5sO2UucTHsH9pc+17F6pl3JVCwMc=
41
+gopkg.in/alexcesaro/statsd.v2 v2.0.0/go.mod h1:i0ubccKGzBVNBpdGV5MocxyA/XlLUJzA7SLonnE4drU=
42
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
43
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
44
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
45
+gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU=
46
+gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
47
+gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
48
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

+ 1
- 1
main.go Datei anzeigen

@@ -227,6 +227,6 @@ func printURLs(data interface{}) {
227 227
 }
228 228
 
229 229
 func usage(msg string) {
230
-	io.WriteString(os.Stderr, msg+"\n") // nolint: errcheck
230
+	io.WriteString(os.Stderr, msg+"\n") // nolint: errcheck, gosec
231 231
 	os.Exit(1)
232 232
 }

+ 4
- 4
mtproto/rpc/handshake_request.go Datei anzeigen

@@ -12,10 +12,10 @@ func (r *HandshakeRequest) Bytes() []byte {
12 12
 	buf := &bytes.Buffer{}
13 13
 	buf.Grow(len(TagHandshake) + len(HandshakeFlags) + len(HandshakeSenderPID) + len(HandshakePeerPID))
14 14
 
15
-	buf.Write(TagHandshake)
16
-	buf.Write(HandshakeFlags)
17
-	buf.Write(HandshakeSenderPID)
18
-	buf.Write(HandshakePeerPID)
15
+	buf.Write(TagHandshake)       // nolint: gosec
16
+	buf.Write(HandshakeFlags)     // nolint: gosec
17
+	buf.Write(HandshakeSenderPID) // nolint: gosec
18
+	buf.Write(HandshakePeerPID)   // nolint: gosec
19 19
 
20 20
 	return buf.Bytes()
21 21
 }

+ 4
- 4
mtproto/rpc/handshake_response.go Datei anzeigen

@@ -19,10 +19,10 @@ type HandshakeResponse struct {
19 19
 func (r *HandshakeResponse) Bytes() []byte {
20 20
 	buf := &bytes.Buffer{}
21 21
 
22
-	buf.Write(r.Type)
23
-	buf.Write(r.Flags)
24
-	buf.Write(r.SenderPID)
25
-	buf.Write(r.PeerPID)
22
+	buf.Write(r.Type)      // nolint: gosec
23
+	buf.Write(r.Flags)     // nolint: gosec
24
+	buf.Write(r.SenderPID) // nolint: gosec
25
+	buf.Write(r.PeerPID)   // nolint: gosec
26 26
 
27 27
 	return buf.Bytes()
28 28
 }

+ 5
- 5
mtproto/rpc/nonce_request.go Datei anzeigen

@@ -21,11 +21,11 @@ type NonceRequest struct {
21 21
 func (r *NonceRequest) Bytes() []byte {
22 22
 	buf := &bytes.Buffer{}
23 23
 
24
-	buf.Write(TagNonce)
25
-	buf.Write(r.KeySelector)
26
-	buf.Write(NonceCryptoAES)
27
-	buf.Write(r.CryptoTS)
28
-	buf.Write(r.Nonce)
24
+	buf.Write(TagNonce)       // nolint: gosec
25
+	buf.Write(r.KeySelector)  // nolint: gosec
26
+	buf.Write(NonceCryptoAES) // nolint: gosec
27
+	buf.Write(r.CryptoTS)     // nolint: gosec
28
+	buf.Write(r.Nonce)        // nolint: gosec
29 29
 
30 30
 	return buf.Bytes()
31 31
 }

+ 5
- 5
mtproto/rpc/nonce_response.go Datei anzeigen

@@ -18,11 +18,11 @@ type NonceResponse struct {
18 18
 func (r *NonceResponse) Bytes() []byte {
19 19
 	buf := &bytes.Buffer{}
20 20
 
21
-	buf.Write(r.Type)
22
-	buf.Write(r.KeySelector)
23
-	buf.Write(r.Crypto)
24
-	buf.Write(r.CryptoTS)
25
-	buf.Write(r.Nonce)
21
+	buf.Write(r.Type)        // nolint: gosec
22
+	buf.Write(r.KeySelector) // nolint: gosec
23
+	buf.Write(r.Crypto)      // nolint: gosec
24
+	buf.Write(r.CryptoTS)    // nolint: gosec
25
+	buf.Write(r.Nonce)       // nolint: gosec
26 26
 
27 27
 	return buf.Bytes()
28 28
 }

+ 10
- 10
mtproto/rpc/proxy_request.go Datei anzeigen

@@ -49,16 +49,16 @@ func (r *ProxyRequest) MakeHeader(message []byte) (*bytes.Buffer, fmt.Stringer)
49 49
 		flags |= proxyRequestFlagsEncrypted
50 50
 	}
51 51
 
52
-	buf.Write(TagProxyRequest)
53
-	buf.Write(flags.Bytes())
54
-	buf.Write(r.ConnectionID)
55
-	buf.Write(r.ClientIPPort)
56
-	buf.Write(r.OurIPPort)
57
-	buf.Write(ProxyRequestExtraSize)
58
-	buf.Write(ProxyRequestProxyTag)
59
-	buf.WriteByte(byte(len(r.ADTag)))
60
-	buf.Write(r.ADTag)
61
-	buf.Write(make([]byte, (4-buf.Len()%4)%4))
52
+	buf.Write(TagProxyRequest)                 // nolint: gosec
53
+	buf.Write(flags.Bytes())                   // nolint: gosec
54
+	buf.Write(r.ConnectionID)                  // nolint: gosec
55
+	buf.Write(r.ClientIPPort)                  // nolint: gosec
56
+	buf.Write(r.OurIPPort)                     // nolint: gosec
57
+	buf.Write(ProxyRequestExtraSize)           // nolint: gosec
58
+	buf.Write(ProxyRequestProxyTag)            // nolint: gosec
59
+	buf.WriteByte(byte(len(r.ADTag)))          // nolint: gosec
60
+	buf.Write(r.ADTag)                         // nolint: gosec
61
+	buf.Write(make([]byte, (4-buf.Len()%4)%4)) // nolint: gosec
62 62
 
63 63
 	return buf, flags
64 64
 }

+ 1
- 1
obfuscated2/frame.go Datei anzeigen

@@ -113,7 +113,7 @@ func generateFrame(connectionType mtproto.ConnectionType) Frame {
113 113
 		}
114 114
 
115 115
 		// error has to be checked before calling this function
116
-		tag, _ := connectionType.Tag() // nolint: errcheck
116
+		tag, _ := connectionType.Tag() // nolint: errcheck, gosec
117 117
 		copy(frame.Magic(), tag)
118 118
 
119 119
 		return frame

+ 5
- 5
obfuscated2/obfuscated2.go Datei anzeigen

@@ -23,14 +23,14 @@ type Obfuscated2 struct {
23 23
 // Beware, link above is in russian.
24 24
 func ParseObfuscated2ClientFrame(secret []byte, frame Frame) (*Obfuscated2, *mtproto.ConnectionOpts, error) {
25 25
 	decHasher := sha256.New()
26
-	decHasher.Write(frame.Key()) // nolint: errcheck
27
-	decHasher.Write(secret)      // nolint: errcheck
26
+	decHasher.Write(frame.Key()) // nolint: errcheck, gosec
27
+	decHasher.Write(secret)      // nolint: errcheck, gosec
28 28
 	decryptor := makeStreamCipher(decHasher.Sum(nil), frame.IV())
29 29
 
30 30
 	invertedFrame := frame.Invert()
31 31
 	encHasher := sha256.New()
32
-	encHasher.Write(invertedFrame.Key()) // nolint: errcheck
33
-	encHasher.Write(secret)              // nolint: errcheck
32
+	encHasher.Write(invertedFrame.Key()) // nolint: errcheck, gosec
33
+	encHasher.Write(secret)              // nolint: errcheck, gosec
34 34
 	encryptor := makeStreamCipher(encHasher.Sum(nil), invertedFrame.IV())
35 35
 
36 36
 	decryptedFrame := make(Frame, FrameLen)
@@ -76,6 +76,6 @@ func MakeTelegramObfuscated2Frame(opts *mtproto.ConnectionOpts) (*Obfuscated2, F
76 76
 }
77 77
 
78 78
 func makeStreamCipher(key, iv []byte) cipher.Stream {
79
-	block, _ := aes.NewCipher(key)
79
+	block, _ := aes.NewCipher(key) // nolint: gosec
80 80
 	return cipher.NewCTR(block, iv)
81 81
 }

+ 4
- 4
obfuscated2/obfuscated2_test.go Datei anzeigen

@@ -47,8 +47,8 @@ func TestObfs2Full(t *testing.T) {
47 47
 
48 48
 	clientFrame := generateFrame(mtproto.ConnectionTypeIntermediate)
49 49
 	clientHasher := sha256.New()
50
-	clientHasher.Write(clientFrame.Key()) // nolint: errcheck
51
-	clientHasher.Write(secret)            // nolint: errcheck
50
+	clientHasher.Write(clientFrame.Key()) // nolint: errcheck, gosec
51
+	clientHasher.Write(secret)            // nolint: errcheck, gosec
52 52
 	clientKey := clientHasher.Sum(nil)
53 53
 
54 54
 	encryptor := makeStreamCipher(clientKey, clientFrame.IV())
@@ -58,8 +58,8 @@ func TestObfs2Full(t *testing.T) {
58 58
 
59 59
 	invertedClientFrame := clientFrame.Invert()
60 60
 	clientHasher = sha256.New()
61
-	clientHasher.Write(invertedClientFrame.Key()) // nolint: errcheck
62
-	clientHasher.Write(secret)                    // nolint: errcheck
61
+	clientHasher.Write(invertedClientFrame.Key()) // nolint: errcheck, gosec
62
+	clientHasher.Write(secret)                    // nolint: errcheck, gosec
63 63
 	invertedClientKey := clientHasher.Sum(nil)
64 64
 	clientDecryptor := makeStreamCipher(invertedClientKey, invertedClientFrame.IV())
65 65
 

+ 9
- 9
proxy/proxy.go Datei anzeigen

@@ -6,8 +6,8 @@ import (
6 6
 	"net"
7 7
 	"sync"
8 8
 
9
+	"github.com/gofrs/uuid"
9 10
 	"github.com/juju/errors"
10
-	uuid "github.com/satori/go.uuid"
11 11
 	"go.uber.org/zap"
12 12
 
13 13
 	"github.com/9seconds/mtg/client"
@@ -42,13 +42,13 @@ func (p *Proxy) Serve() error {
42 42
 }
43 43
 
44 44
 func (p *Proxy) accept(conn net.Conn) {
45
-	connID := uuid.NewV4().String()
45
+	connID := uuid.Must(uuid.NewV4()).String()
46 46
 	log := zap.S().With("connection_id", connID).Named("main")
47 47
 	ctx, cancel := context.WithCancel(context.Background())
48 48
 
49 49
 	defer func() {
50 50
 		cancel()
51
-		conn.Close() // nolint: errcheck
51
+		conn.Close() // nolint: errcheck, gosec
52 52
 
53 53
 		if err := recover(); err != nil {
54 54
 			stats.NewCrash()
@@ -77,8 +77,8 @@ func (p *Proxy) accept(conn net.Conn) {
77 77
 
78 78
 	go func() {
79 79
 		<-ctx.Done()
80
-		serverConn.(io.Closer).Close()
81
-		clientConn.(io.Closer).Close()
80
+		serverConn.(io.Closer).Close() // nolint: gosec
81
+		clientConn.(io.Closer).Close() // nolint: gosec
82 82
 	}()
83 83
 
84 84
 	wait := &sync.WaitGroup{}
@@ -119,8 +119,8 @@ func (p *Proxy) getTelegramConn(ctx context.Context, cancel context.CancelFunc,
119 119
 func (p *Proxy) middlePipe(src wrappers.PacketReadCloser, dst io.WriteCloser,
120 120
 	wait *sync.WaitGroup, hacks *mtproto.Hacks) {
121 121
 	defer func() {
122
-		src.Close() // nolint: errcheck
123
-		dst.Close() // nolint: errcheck
122
+		src.Close() // nolint: errcheck, gosec
123
+		dst.Close() // nolint: errcheck, gosec
124 124
 		wait.Done()
125 125
 	}()
126 126
 
@@ -143,8 +143,8 @@ func (p *Proxy) middlePipe(src wrappers.PacketReadCloser, dst io.WriteCloser,
143 143
 func (p *Proxy) directPipe(src wrappers.StreamReadCloser, dst io.WriteCloser,
144 144
 	wait *sync.WaitGroup, bufferSize int) {
145 145
 	defer func() {
146
-		src.Close() // nolint: errcheck
147
-		dst.Close() // nolint: errcheck
146
+		src.Close() // nolint: errcheck, gosec
147
+		dst.Close() // nolint: errcheck, gosec
148 148
 		wait.Done()
149 149
 	}()
150 150
 

+ 1
- 1
stats/server.go Datei anzeigen

@@ -49,7 +49,7 @@ func Start(conf *config.Config) error {
49 49
 		}
50 50
 
51 51
 		interm := map[string]interface{}{}
52
-		json.Unmarshal(first, &interm) // nolint: errcheck
52
+		json.Unmarshal(first, &interm) // nolint: errcheck, gosec
53 53
 
54 54
 		encoder := json.NewEncoder(w)
55 55
 		encoder.SetEscapeHTML(false)

+ 9
- 2
telegram/direct.go Datei anzeigen

@@ -12,6 +12,11 @@ import (
12 12
 	"github.com/9seconds/mtg/wrappers"
13 13
 )
14 14
 
15
+const (
16
+	directV4DefaultIdx = 1
17
+	directV6DefaultIdx = 1
18
+)
19
+
15 20
 var (
16 21
 	directV4Addresses = map[int16][]string{
17 22
 		0: {"149.154.175.50:443"},
@@ -65,8 +70,10 @@ func NewDirectTelegram(conf *config.Config) Telegram {
65 70
 				Dialer: net.Dialer{Timeout: telegramDialTimeout},
66 71
 				conf:   conf,
67 72
 			},
68
-			v4Addresses: directV4Addresses,
69
-			v6Addresses: directV6Addresses,
73
+			v4DefaultIdx: directV4DefaultIdx,
74
+			v6DefaultIdx: directV6DefaultIdx,
75
+			v4Addresses:  directV4Addresses,
76
+			v6Addresses:  directV6Addresses,
70 77
 		},
71 78
 	}
72 79
 }

+ 64
- 27
telegram/middle_caller.go Datei anzeigen

@@ -65,18 +65,20 @@ func (t *middleTelegramCaller) update() error {
65 65
 		return errors.Annotate(err, "Cannot get proxy secret")
66 66
 	}
67 67
 
68
-	v4Addresses, err := t.getTelegramAddresses(tgAddrProxyV4)
68
+	v4Addresses, v4DefaultIdx, err := t.getTelegramAddresses(tgAddrProxyV4)
69 69
 	if err != nil {
70 70
 		return errors.Annotate(err, "Cannot get ipv4 addresses")
71 71
 	}
72 72
 
73
-	v6Addresses, err := t.getTelegramAddresses(tgAddrProxyV6)
73
+	v6Addresses, v6DefaultIdx, err := t.getTelegramAddresses(tgAddrProxyV6)
74 74
 	if err != nil {
75 75
 		return errors.Annotate(err, "Cannot get ipv6 addresses")
76 76
 	}
77 77
 
78 78
 	t.dialerMutex.Lock()
79 79
 	t.proxySecret = secret
80
+	t.v4DefaultIdx = v4DefaultIdx
81
+	t.v6DefaultIdx = v6DefaultIdx
80 82
 	t.v4Addresses = v4Addresses
81 83
 	t.v6Addresses = v6Addresses
82 84
 	t.dialerMutex.Unlock()
@@ -101,52 +103,87 @@ func (t *middleTelegramCaller) getTelegramProxySecret() ([]byte, error) {
101 103
 	return secret, nil
102 104
 }
103 105
 
104
-func (t *middleTelegramCaller) getTelegramAddresses(url string) (map[int16][]string, error) {
106
+func (t *middleTelegramCaller) getTelegramAddresses(url string) (map[int16][]string, int16, error) { // nolint: gocyclo
105 107
 	resp, err := t.call(url)
106 108
 	if err != nil {
107
-		return nil, errors.Annotate(err, "Cannot access telegram server")
109
+		return nil, 0, errors.Annotate(err, "Cannot access telegram server")
108 110
 	}
109 111
 	defer resp.Body.Close() // nolint: errcheck
110 112
 
111 113
 	scanner := bufio.NewScanner(resp.Body)
112 114
 	data := map[int16][]string{}
115
+
116
+	var defaultIdx int16 = 1
113 117
 	for scanner.Scan() {
114 118
 		text := strings.TrimSpace(scanner.Text())
115
-		if strings.HasPrefix(text, "#") {
119
+		switch {
120
+		case strings.HasPrefix(text, "#"):
116 121
 			continue
122
+		case strings.HasPrefix(text, "proxy_for"):
123
+			addr, idx, err2 := t.parseProxyFor(text)
124
+			if err2 != nil {
125
+				return nil, 0, errors.Annotate(err2, "Cannot parse 'proxy_for' section")
126
+			}
127
+			if addresses, ok := data[idx]; ok {
128
+				data[idx] = append(addresses, addr)
129
+			} else {
130
+				data[idx] = []string{addr}
131
+			}
132
+		case strings.HasPrefix(text, "default"):
133
+			idx, err2 := t.parseDefault(text)
134
+			if err2 != nil {
135
+				return nil, 0, errors.Annotate(err2, "Cannot parse 'default' section")
136
+			}
137
+			defaultIdx = idx
138
+		default:
139
+			return nil, 0, errors.Errorf("Unknown config string '%s'", text)
117 140
 		}
141
+	}
118 142
 
119
-		chunks := middleTelegramProxyConfigSplitter.Split(text, 3)
120
-		if len(chunks) != 3 || chunks[0] != "proxy_for" {
121
-			return nil, errors.Errorf("Incorrect config '%s'", text)
122
-		}
123
-		dcIdx64, err2 := strconv.ParseInt(chunks[1], 10, 16)
124
-		if err2 != nil {
125
-			return nil, errors.Errorf("Incorrect config '%s'", text)
126
-		}
127
-		dcIdx := int16(dcIdx64)
143
+	err = scanner.Err()
144
+	if err != nil {
145
+		return nil, 0, errors.Annotate(err, "Cannot read response from the telegram")
146
+	}
128 147
 
129
-		addr := strings.TrimRight(chunks[2], ";")
130
-		if _, _, err2 = net.SplitHostPort(addr); err != nil {
131
-			return nil, errors.Annotatef(err2, "Incorrect config '%s'", text)
132
-		}
148
+	return data, defaultIdx, nil
149
+}
133 150
 
134
-		if addresses, ok := data[dcIdx]; ok {
135
-			data[dcIdx] = append(addresses, addr)
136
-		} else {
137
-			data[dcIdx] = []string{addr}
138
-		}
151
+func (t *middleTelegramCaller) parseProxyFor(text string) (string, int16, error) {
152
+	chunks := middleTelegramProxyConfigSplitter.Split(text, 3)
153
+	if len(chunks) != 3 || chunks[0] != "proxy_for" {
154
+		return "", 0, errors.Errorf("Incorrect config '%s'", text)
139 155
 	}
140
-	err = scanner.Err()
156
+
157
+	dcIdx, err := strconv.ParseInt(chunks[1], 10, 16)
158
+	if err != nil {
159
+		return "", 0, errors.Annotatef(err, "Incorrect config '%s'", text)
160
+	}
161
+
162
+	addr := strings.TrimRight(chunks[2], ";")
163
+	if _, _, err = net.SplitHostPort(addr); err != nil {
164
+		return "", 0, errors.Annotatef(err, "Incorrect config '%s'", text)
165
+	}
166
+
167
+	return addr, int16(dcIdx), nil
168
+}
169
+
170
+func (t *middleTelegramCaller) parseDefault(text string) (int16, error) {
171
+	chunks := middleTelegramProxyConfigSplitter.Split(text, 2)
172
+	if len(chunks) != 2 || chunks[0] != "default" {
173
+		return 0, errors.Errorf("Incorrect config '%s'", text)
174
+	}
175
+
176
+	dcIdxString := strings.TrimRight(chunks[1], ";")
177
+	dcIdx, err := strconv.ParseInt(dcIdxString, 10, 16)
141 178
 	if err != nil {
142
-		return nil, errors.Annotate(err, "Cannot read response from the telegram")
179
+		return 0, errors.Annotatef(err, "Incorrect config '%s'", text)
143 180
 	}
144 181
 
145
-	return data, nil
182
+	return int16(dcIdx), nil
146 183
 }
147 184
 
148 185
 func (t *middleTelegramCaller) call(url string) (*http.Response, error) {
149
-	req, _ := http.NewRequest("GET", url, nil)
186
+	req, _ := http.NewRequest("GET", url, nil) // nolint: gosec
150 187
 	req.Header.Set("Accept", "text/plain")
151 188
 	req.Header.Set("User-Agent", tgUserAgent)
152 189
 

+ 26
- 6
telegram/telegram.go Datei anzeigen

@@ -19,8 +19,10 @@ type Telegram interface {
19 19
 type baseTelegram struct {
20 20
 	dialer tgDialer
21 21
 
22
-	v4Addresses map[int16][]string
23
-	v6Addresses map[int16][]string
22
+	v4DefaultIdx int16
23
+	v6DefaultIdx int16
24
+	v4Addresses  map[int16][]string
25
+	v6Addresses  map[int16][]string
24 26
 }
25 27
 
26 28
 func (b *baseTelegram) dial(ctx context.Context, cancel context.CancelFunc, dcIdx int16, connID string,
@@ -28,13 +30,13 @@ func (b *baseTelegram) dial(ctx context.Context, cancel context.CancelFunc, dcId
28 30
 	addrs := make([]string, 2)
29 31
 
30 32
 	if proto&mtproto.ConnectionProtocolIPv6 != 0 {
31
-		if addr, ok := b.v6Addresses[dcIdx]; ok && len(addr) > 0 {
32
-			addrs = append(addrs, addr[rand.Intn(len(addr))])
33
+		if addr := b.chooseAddress(b.v6Addresses, dcIdx, b.v6DefaultIdx); addr != "" {
34
+			addrs = append(addrs, addr)
33 35
 		}
34 36
 	}
35 37
 	if proto&mtproto.ConnectionProtocolIPv4 != 0 {
36
-		if addr, ok := b.v4Addresses[dcIdx]; ok && len(addr) > 0 {
37
-			addrs = append(addrs, addr[rand.Intn(len(addr))])
38
+		if addr := b.chooseAddress(b.v4Addresses, dcIdx, b.v4DefaultIdx); addr != "" {
39
+			addrs = append(addrs, addr)
38 40
 		}
39 41
 	}
40 42
 
@@ -46,3 +48,21 @@ func (b *baseTelegram) dial(ctx context.Context, cancel context.CancelFunc, dcId
46 48
 
47 49
 	return nil, errors.New("Cannot connect to Telegram")
48 50
 }
51
+
52
+func (b *baseTelegram) chooseAddress(addresses map[int16][]string, idx, defaultIdx int16) string {
53
+	if addr, ok := addresses[idx]; ok {
54
+		return b.chooseRandomAddress(addr)
55
+	} else if addr, ok := addresses[defaultIdx]; ok {
56
+		return b.chooseRandomAddress(addr)
57
+	}
58
+
59
+	return ""
60
+}
61
+
62
+func (b *baseTelegram) chooseRandomAddress(addresses []string) string {
63
+	if len(addresses) > 0 {
64
+		return addresses[rand.Intn(len(addresses))]
65
+	}
66
+
67
+	return ""
68
+}

+ 1
- 1
wrappers/blockcipher.go Datei anzeigen

@@ -40,7 +40,7 @@ func (b *BlockCipher) Read(p []byte) (int, error) {
40 40
 	}
41 41
 
42 42
 	b.decryptor.CryptBlocks(buf, buf)
43
-	b.buf.Write(buf)
43
+	b.buf.Write(buf) // nolint: gosec
44 44
 
45 45
 	return b.flush(p)
46 46
 }

+ 3
- 3
wrappers/conn.go Datei anzeigen

@@ -99,15 +99,15 @@ func (c *Conn) doIO(callback ioFunc, p []byte, timeout time.Duration) (int, erro
99 99
 	case res := <-resChan:
100 100
 		timer.Stop()
101 101
 		if res.err != nil {
102
-			c.Close()
102
+			c.Close() // nolint: gosec
103 103
 		}
104 104
 		return res.n, res.err
105 105
 	case <-c.ctx.Done():
106 106
 		timer.Stop()
107
-		c.Close()
107
+		c.Close() // nolint: gosec
108 108
 		return 0, errors.Annotate(c.ctx.Err(), "Cannot do IO because context is closed")
109 109
 	case <-timer.C:
110
-		c.Close()
110
+		c.Close() // nolint: gosec
111 111
 		return 0, errors.Annotate(c.ctx.Err(), "Timeout on IO operation")
112 112
 	}
113 113
 }

+ 3
- 3
wrappers/mtproto_abridged.go Datei anzeigen

@@ -119,9 +119,9 @@ func (m *MTProtoAbridged) Write(p []byte) (int, error) {
119 119
 		buf := &bytes.Buffer{}
120 120
 		buf.Grow(1 + 3 + len(p))
121 121
 
122
-		buf.WriteByte(byte(mtprotoAbridgedSmallPacketLength))
123
-		buf.Write(length24[:])
124
-		buf.Write(p)
122
+		buf.WriteByte(byte(mtprotoAbridgedSmallPacketLength)) // nolint: gosec
123
+		buf.Write(length24[:])                                // nolint: gosec
124
+		buf.Write(p)                                          // nolint: gosec
125 125
 
126 126
 		return m.conn.Write(buf.Bytes())
127 127
 	}

+ 17
- 17
wrappers/mtproto_cipher.go Datei anzeigen

@@ -4,8 +4,8 @@ import (
4 4
 	"bytes"
5 5
 	"crypto/aes"
6 6
 	"crypto/cipher"
7
-	"crypto/md5" // nolint: gas
8
-	"crypto/sha1"
7
+	"crypto/md5"  // nolint: gas
8
+	"crypto/sha1" // nolint: gosec
9 9
 	"encoding/binary"
10 10
 	"net"
11 11
 
@@ -41,9 +41,9 @@ func NewMiddleProxyCipher(conn StreamReadWriteCloser,
41 41
 func deriveKeys(purpose cipherPurpose, req *rpc.NonceRequest, resp *rpc.NonceResponse,
42 42
 	client, remote *net.TCPAddr, secret []byte) ([]byte, []byte) {
43 43
 	message := bytes.Buffer{}
44
-	message.Write(resp.Nonce)
45
-	message.Write(req.Nonce)
46
-	message.Write(req.CryptoTS)
44
+	message.Write(resp.Nonce)   // nolint: gosec
45
+	message.Write(req.Nonce)    // nolint: gosec
46
+	message.Write(req.CryptoTS) // nolint: gosec
47 47
 
48 48
 	clientIPv4 := emptyIP[:]
49 49
 	serverIPv4 := emptyIP[:]
@@ -51,36 +51,36 @@ func deriveKeys(purpose cipherPurpose, req *rpc.NonceRequest, resp *rpc.NonceRes
51 51
 		clientIPv4 = utils.ReverseBytes(client.IP.To4())
52 52
 		serverIPv4 = utils.ReverseBytes(remote.IP.To4())
53 53
 	}
54
-	message.Write(serverIPv4)
54
+	message.Write(serverIPv4) // nolint: gosec
55 55
 
56 56
 	var port [2]byte
57 57
 	binary.LittleEndian.PutUint16(port[:], uint16(client.Port))
58
-	message.Write(port[:])
58
+	message.Write(port[:]) // nolint: gosec
59 59
 
60 60
 	switch purpose {
61 61
 	case cipherPurposeClient:
62
-		message.WriteString("CLIENT")
62
+		message.WriteString("CLIENT") // nolint: gosec
63 63
 	case cipherPurposeServer:
64
-		message.WriteString("SERVER")
64
+		message.WriteString("SERVER") // nolint: gosec
65 65
 	default:
66 66
 		panic("Unexpected cipher purpose")
67 67
 	}
68 68
 
69
-	message.Write(clientIPv4)
69
+	message.Write(clientIPv4) // nolint: gosec
70 70
 	binary.LittleEndian.PutUint16(port[:], uint16(remote.Port))
71
-	message.Write(port[:])
72
-	message.Write(secret)
73
-	message.Write(resp.Nonce)
71
+	message.Write(port[:])    // nolint: gosec
72
+	message.Write(secret)     // nolint: gosec
73
+	message.Write(resp.Nonce) // nolint: gosec
74 74
 
75 75
 	if client.IP.To4() == nil {
76
-		message.Write(client.IP.To16())
77
-		message.Write(remote.IP.To16())
76
+		message.Write(client.IP.To16()) // nolint: gosec
77
+		message.Write(remote.IP.To16()) // nolint: gosec
78 78
 	}
79
-	message.Write(req.Nonce)
79
+	message.Write(req.Nonce) // nolint: gosec
80 80
 
81 81
 	data := message.Bytes()
82 82
 	md5sum := md5.Sum(data[1:]) // nolint: gas
83
-	sha1sum := sha1.Sum(data)
83
+	sha1sum := sha1.Sum(data)   // nolint: gosec
84 84
 
85 85
 	key := append(md5sum[:12], sha1sum[:]...)
86 86
 	iv := md5.Sum(data[2:]) // nolint: gas

+ 7
- 7
wrappers/mtproto_frame.go Datei anzeigen

@@ -73,12 +73,12 @@ func (m *MTProtoFrame) Read() ([]byte, error) { // nolint: gocyclo
73 73
 	}
74 74
 
75 75
 	var seqNo int32
76
-	binary.Read(buf, binary.LittleEndian, &seqNo) // nolint: errcheck
76
+	binary.Read(buf, binary.LittleEndian, &seqNo) // nolint: errcheck, gosec
77 77
 	if seqNo != m.readSeqNo {
78 78
 		return nil, errors.Errorf("Unexpected sequence number %d (wait for %d)", seqNo, m.readSeqNo)
79 79
 	}
80 80
 
81
-	data, _ := ioutil.ReadAll(buf)
81
+	data, _ := ioutil.ReadAll(buf) // nolint: gosec
82 82
 	buf.Reset()
83 83
 	// write to buf, not to writer. This is because we are going to fetch
84 84
 	// crc32 checksum.
@@ -109,13 +109,13 @@ func (m *MTProtoFrame) Write(p []byte) (int, error) {
109 109
 	buf := &bytes.Buffer{}
110 110
 	buf.Grow(messageLength + paddingLength)
111 111
 
112
-	binary.Write(buf, binary.LittleEndian, uint32(messageLength)) // nolint: errcheck
113
-	binary.Write(buf, binary.LittleEndian, m.writeSeqNo)          // nolint: errcheck
114
-	buf.Write(p)
112
+	binary.Write(buf, binary.LittleEndian, uint32(messageLength)) // nolint: errcheck, gosec
113
+	binary.Write(buf, binary.LittleEndian, m.writeSeqNo)          // nolint: errcheck, gosec
114
+	buf.Write(p)                                                  // nolint: gosec
115 115
 
116 116
 	checksum := crc32.ChecksumIEEE(buf.Bytes())
117
-	binary.Write(buf, binary.LittleEndian, checksum) // nolint: errcheck
118
-	buf.Write(bytes.Repeat(mtprotoFramePadding, paddingLength/4))
117
+	binary.Write(buf, binary.LittleEndian, checksum)              // nolint: errcheck, gosec
118
+	buf.Write(bytes.Repeat(mtprotoFramePadding, paddingLength/4)) // nolint: gosec
119 119
 
120 120
 	m.logger.Debugw("Write MTProto frame",
121 121
 		"length", len(p),

+ 3
- 3
wrappers/mtproto_intermediate_secure.go Datei anzeigen

@@ -44,9 +44,9 @@ func (m *MTProtoIntermediateSecure) Write(p []byte) (int, error) {
44 44
 	paddingLength := rand.Intn(4)
45 45
 	buf.Grow(4 + len(p) + paddingLength)
46 46
 
47
-	binary.Write(buf, binary.LittleEndian, uint32(len(p)+paddingLength)) // nolint: errcheck
48
-	buf.Write(p)
49
-	buf.Write(make([]byte, paddingLength))
47
+	binary.Write(buf, binary.LittleEndian, uint32(len(p)+paddingLength)) // nolint: errcheck, gosec
48
+	buf.Write(p)                                                         // nolint: gosec
49
+	buf.Write(make([]byte, paddingLength))                               // nolint: gosec
50 50
 
51 51
 	m.logger.Debugw("Write packet with padding",
52 52
 		"simple_ack", m.opts.WriteHacks.SimpleAck,

+ 1
- 1
wrappers/mtproto_proxy.go Datei anzeigen

@@ -120,7 +120,7 @@ func (m *MTProtoProxy) Write(p []byte) (int, error) {
120 120
 			zap.Stringer("flags", flags),
121 121
 		)
122 122
 	}
123
-	header.Write(p)
123
+	header.Write(p) // nolint: gosec
124 124
 
125 125
 	if _, err := m.conn.Write(header.Bytes()); err != nil {
126 126
 		return 0, err

+ 1
- 1
wrappers/streamcipher.go Datei anzeigen

@@ -34,7 +34,7 @@ func (s *StreamCipher) Write(p []byte) (int, error) {
34 34
 
35 35
 	buf.Reset()
36 36
 	buf.Grow(len(p))
37
-	buf.Write(p)
37
+	buf.Write(p) // nolint: gosec
38 38
 
39 39
 	data := buf.Bytes()
40 40
 	s.encryptor.XORKeyStream(data, data)

Laden…
Abbrechen
Speichern