Browse Source

linting the code

tags/1.0^2
9seconds 6 years ago
parent
commit
5009859a1e
50 changed files with 172 additions and 55 deletions
  1. 1
    5
      Makefile
  2. 1
    0
      cli/generate.go
  3. 10
    2
      cli/proxy.go
  4. 1
    0
      cli/utils.go
  5. 8
    4
      config/config.go
  6. 5
    0
      config/global_ips.go
  7. 1
    0
      config/urls.go
  8. 1
    0
      conntypes/protocol.go
  9. 0
    2
      conntypes/wrappers.go
  10. 2
    0
      hub/connection.go
  11. 5
    1
      hub/connection_hub.go
  12. 2
    0
      hub/ctx_channel.go
  13. 3
    2
      hub/hub.go
  14. 1
    0
      hub/registry.go
  15. 0
    1
      main.go
  16. 11
    5
      mtproto/protocol.go
  17. 4
    3
      mtproto/rpc/handshake_response.go
  18. 1
    0
      mtproto/rpc/nonce_request.go
  19. 6
    4
      mtproto/rpc/nonce_response.go
  20. 7
    0
      mtproto/rpc/proxy_flags.go
  21. 4
    2
      mtproto/rpc/proxy_response.go
  22. 3
    1
      ntp/ntp.go
  23. 5
    2
      obfuscated2/client_protocol.go
  24. 2
    0
      obfuscated2/telegram_protocol.go
  25. 3
    0
      proxy/direct.go
  26. 4
    3
      proxy/middle.go
  27. 6
    1
      proxy/proxy.go
  28. 4
    0
      stats/stats.go
  29. 4
    0
      stats/stats_prometheus.go
  30. 1
    0
      stats/stats_statsd.go
  31. 6
    3
      telegram/api/addresses.go
  32. 3
    1
      telegram/api/api.go
  33. 1
    0
      telegram/api/secret.go
  34. 1
    1
      telegram/base.go
  35. 1
    0
      telegram/middle.go
  36. 2
    0
      utils/init_tcp.go
  37. 1
    0
      utils/read_full.go
  38. 1
    1
      utils/reverse_bytes.go
  39. 1
    0
      utils/rlimit.go
  40. 1
    0
      utils/signal_context.go
  41. 12
    6
      wrappers/packet/mtproto_frame.go
  42. 10
    1
      wrappers/packetack/client_abridged.go
  43. 5
    0
      wrappers/packetack/client_intermediate.go
  44. 4
    1
      wrappers/packetack/client_intermediate_secure.go
  45. 3
    1
      wrappers/packetack/proxy.go
  46. 3
    0
      wrappers/stream/blockcipher.go
  47. 2
    0
      wrappers/stream/conn.go
  48. 6
    2
      wrappers/stream/mtproto_cipher.go
  49. 2
    0
      wrappers/stream/obfuscated2.go
  50. 1
    0
      wrappers/stream/stats_telegram.go

+ 1
- 5
Makefile View File

4
 
4
 
5
 CC_BINARIES  := $(shell bash -c "echo -n $(APP_NAME)-{linux,freebsd,openbsd}-{386,amd64} $(APP_NAME)-linux-{arm,arm64}")
5
 CC_BINARIES  := $(shell bash -c "echo -n $(APP_NAME)-{linux,freebsd,openbsd}-{386,amd64} $(APP_NAME)-linux-{arm,arm64}")
6
 
6
 
7
-GOLANGCI_LINT_VERSION := v1.15.0
7
+GOLANGCI_LINT_VERSION := v1.20.0
8
 
8
 
9
 VERSION_GO         := $(shell go version)
9
 VERSION_GO         := $(shell go version)
10
 VERSION_DATE       := $(shell date -Ru)
10
 VERSION_DATE       := $(shell date -Ru)
51
 crosscompile-dir:
51
 crosscompile-dir:
52
 	@rm -rf "$(CC_DIR)" && mkdir -p "$(CC_DIR)"
52
 	@rm -rf "$(CC_DIR)" && mkdir -p "$(CC_DIR)"
53
 
53
 
54
-.PHONY: test
55
-test: vendor
56
-	@$(MOD_ON) go test -v ./...
57
-
58
 .PHONY: lint
54
 .PHONY: lint
59
 lint: vendor
55
 lint: vendor
60
 	@$(MOD_OFF) golangci-lint run
56
 	@$(MOD_OFF) golangci-lint run

+ 1
- 0
cli/generate.go View File

12
 	if _, err := rand.Read(data); err != nil {
12
 	if _, err := rand.Read(data); err != nil {
13
 		panic(err)
13
 		panic(err)
14
 	}
14
 	}
15
+
15
 	secret := hex.EncodeToString(data)
16
 	secret := hex.EncodeToString(data)
16
 
17
 
17
 	switch secretType {
18
 	switch secretType {

+ 10
- 2
cli/proxy.go View File

19
 	"github.com/9seconds/mtg/utils"
19
 	"github.com/9seconds/mtg/utils"
20
 )
20
 )
21
 
21
 
22
-func Proxy() error {
22
+func Proxy() error { // nolint: funlen
23
 	ctx := utils.GetSignalContext()
23
 	ctx := utils.GetSignalContext()
24
 
24
 
25
 	atom := zap.NewAtomicLevel()
25
 	atom := zap.NewAtomicLevel()
26
+
26
 	switch {
27
 	switch {
27
 	case config.C.Debug:
28
 	case config.C.Debug:
28
 		atom.SetLevel(zapcore.DebugLevel)
29
 		atom.SetLevel(zapcore.DebugLevel)
38
 		zapcore.Lock(os.Stderr),
39
 		zapcore.Lock(os.Stderr),
39
 		atom,
40
 		atom,
40
 	))
41
 	))
42
+
41
 	zap.ReplaceGlobals(logger)
43
 	zap.ReplaceGlobals(logger)
42
 	defer logger.Sync() // nolint: errcheck
44
 	defer logger.Sync() // nolint: errcheck
43
 
45
 
44
 	if err := config.InitPublicAddress(ctx); err != nil {
46
 	if err := config.InitPublicAddress(ctx); err != nil {
45
 		Fatal(err)
47
 		Fatal(err)
46
 	}
48
 	}
49
+
47
 	zap.S().Debugw("Configuration", "config", config.Printable())
50
 	zap.S().Debugw("Configuration", "config", config.Printable())
48
 
51
 
49
 	if len(config.C.AdTag) > 0 {
52
 	if len(config.C.AdTag) > 0 {
50
 		zap.S().Infow("Use middle proxy connection to Telegram")
53
 		zap.S().Infow("Use middle proxy connection to Telegram")
54
+
51
 		diff, err := ntp.Fetch()
55
 		diff, err := ntp.Fetch()
52
 		if err != nil {
56
 		if err != nil {
53
 			Fatal("Cannot fetch time data from NTP")
57
 			Fatal("Cannot fetch time data from NTP")
54
 		}
58
 		}
59
+
55
 		if diff > time.Second {
60
 		if diff > time.Second {
56
 			Fatal("Your local time is skewed and drift is bigger than a second. Please sync your time.")
61
 			Fatal("Your local time is skewed and drift is bigger than a second. Please sync your time.")
57
 		}
62
 		}
63
+
58
 		go ntp.AutoUpdate()
64
 		go ntp.AutoUpdate()
59
 	} else {
65
 	} else {
60
 		zap.S().Infow("Use direct connection to Telegram")
66
 		zap.S().Infow("Use direct connection to Telegram")
62
 
68
 
63
 	PrintJSONStdout(config.GetURLs())
69
 	PrintJSONStdout(config.GetURLs())
64
 
70
 
65
-	antireplay.Init()
66
 	if err := stats.Init(ctx); err != nil {
71
 	if err := stats.Init(ctx); err != nil {
67
 		Fatal(err)
72
 		Fatal(err)
68
 	}
73
 	}
74
+
75
+	antireplay.Init()
69
 	telegram.Init()
76
 	telegram.Init()
70
 	hub.Init(ctx)
77
 	hub.Init(ctx)
71
 
78
 
73
 	if err != nil {
80
 	if err != nil {
74
 		Fatal(err)
81
 		Fatal(err)
75
 	}
82
 	}
83
+
76
 	go func() {
84
 	go func() {
77
 		<-ctx.Done()
85
 		<-ctx.Done()
78
 		proxyListener.Close()
86
 		proxyListener.Close()

+ 1
- 0
cli/utils.go View File

11
 	if value, ok := arg.(error); ok {
11
 	if value, ok := arg.(error); ok {
12
 		arg = fmt.Errorf("fatal error: %+v", value)
12
 		arg = fmt.Errorf("fatal error: %+v", value)
13
 	}
13
 	}
14
+
14
 	PrintStderr(arg)
15
 	PrintStderr(arg)
15
 	os.Exit(1)
16
 	os.Exit(1)
16
 }
17
 }

+ 8
- 4
config/config.go View File

23
 	case SecretModeSecured:
23
 	case SecretModeSecured:
24
 		return "secured"
24
 		return "secured"
25
 	}
25
 	}
26
+
26
 	return "tls"
27
 	return "tls"
27
 }
28
 }
28
 
29
 
135
 			case "influxdb":
136
 			case "influxdb":
136
 				C.StatsdTagsFormat = statsd.InfluxDB
137
 				C.StatsdTagsFormat = statsd.InfluxDB
137
 			default:
138
 			default:
138
-				return fmt.Errorf("Incorrect statsd tag %s", value)
139
+				return fmt.Errorf("incorrect statsd tag %s", value)
139
 			}
140
 			}
140
 		case OptionTypeStatsdTags:
141
 		case OptionTypeStatsdTags:
141
 			C.StatsdTags = opt.Value.(map[string]string)
142
 			C.StatsdTags = opt.Value.(map[string]string)
152
 		case OptionTypeAdtag:
153
 		case OptionTypeAdtag:
153
 			C.AdTag = opt.Value.([]byte)
154
 			C.AdTag = opt.Value.([]byte)
154
 		default:
155
 		default:
155
-			return fmt.Errorf("Unknown tag %v", opt.Option)
156
+			return fmt.Errorf("unknown tag %v", opt.Option)
156
 		}
157
 		}
157
 	}
158
 	}
158
 
159
 
163
 	case len(C.Secret) == SimpleSecretLength:
164
 	case len(C.Secret) == SimpleSecretLength:
164
 		C.SecretMode = SecretModeSimple
165
 		C.SecretMode = SecretModeSimple
165
 	default:
166
 	default:
166
-		return errors.New("Incorrect secret")
167
+		return errors.New("incorrect secret")
167
 	}
168
 	}
168
 
169
 
169
 	return nil
170
 	return nil
173
 	if C.PublicIPv4.Port == 0 {
174
 	if C.PublicIPv4.Port == 0 {
174
 		C.PublicIPv4.Port = C.Bind.Port
175
 		C.PublicIPv4.Port = C.Bind.Port
175
 	}
176
 	}
177
+
176
 	if C.PublicIPv6.Port == 0 {
178
 	if C.PublicIPv6.Port == 0 {
177
 		C.PublicIPv6.Port = C.Bind.Port
179
 		C.PublicIPv6.Port = C.Bind.Port
178
 	}
180
 	}
179
 
181
 
180
 	foundAddress := C.PublicIPv4.IP != nil || C.PublicIPv6.IP != nil
182
 	foundAddress := C.PublicIPv4.IP != nil || C.PublicIPv6.IP != nil
183
+
181
 	if C.PublicIPv4.IP == nil {
184
 	if C.PublicIPv4.IP == nil {
182
 		ip, err := getGlobalIPv4(ctx)
185
 		ip, err := getGlobalIPv4(ctx)
183
 		if err != nil {
186
 		if err != nil {
187
 			foundAddress = true
190
 			foundAddress = true
188
 		}
191
 		}
189
 	}
192
 	}
193
+
190
 	if C.PublicIPv6.IP == nil {
194
 	if C.PublicIPv6.IP == nil {
191
 		ip, err := getGlobalIPv6(ctx)
195
 		ip, err := getGlobalIPv6(ctx)
192
 		if err != nil {
196
 		if err != nil {
198
 	}
202
 	}
199
 
203
 
200
 	if !foundAddress {
204
 	if !foundAddress {
201
-		return errors.New("Cannot resolve any public address")
205
+		return errors.New("cannot resolve any public address")
202
 	}
206
 	}
203
 
207
 
204
 	return nil
208
 	return nil

+ 5
- 0
config/global_ips.go View File

21
 	if err != nil || ip.To4() == nil {
21
 	if err != nil || ip.To4() == nil {
22
 		return nil, fmt.Errorf("cannot find public ipv4 address: %w", err)
22
 		return nil, fmt.Errorf("cannot find public ipv4 address: %w", err)
23
 	}
23
 	}
24
+
24
 	return ip, nil
25
 	return ip, nil
25
 }
26
 }
26
 
27
 
29
 	if err != nil || ip.To4() != nil {
30
 	if err != nil || ip.To4() != nil {
30
 		return nil, fmt.Errorf("cannot find public ipv6 address: %w", err)
31
 		return nil, fmt.Errorf("cannot find public ipv6 address: %w", err)
31
 	}
32
 	}
33
+
32
 	return ip, nil
34
 	return ip, nil
33
 }
35
 }
34
 
36
 
54
 		if resp != nil {
56
 		if resp != nil {
55
 			io.Copy(ioutil.Discard, resp.Body) // nolint: errcheck
57
 			io.Copy(ioutil.Discard, resp.Body) // nolint: errcheck
56
 		}
58
 		}
59
+
57
 		return nil, fmt.Errorf("cannot perform a request: %w", err)
60
 		return nil, fmt.Errorf("cannot perform a request: %w", err)
58
 	}
61
 	}
62
+
59
 	defer resp.Body.Close() // nolint: errcheck
63
 	defer resp.Body.Close() // nolint: errcheck
60
 
64
 
61
 	respDataBytes, err := ioutil.ReadAll(resp.Body)
65
 	respDataBytes, err := ioutil.ReadAll(resp.Body)
62
 	if err != nil {
66
 	if err != nil {
63
 		return nil, fmt.Errorf("cannot read response body: %w", err)
67
 		return nil, fmt.Errorf("cannot read response body: %w", err)
64
 	}
68
 	}
69
+
65
 	respData := strings.TrimSpace(string(respDataBytes))
70
 	respData := strings.TrimSpace(string(respDataBytes))
66
 
71
 
67
 	ip := net.ParseIP(respData)
72
 	ip := net.ParseIP(respData)

+ 1
- 0
config/urls.go View File

22
 
22
 
23
 func GetURLs() (urls IPURLs) {
23
 func GetURLs() (urls IPURLs) {
24
 	secret := ""
24
 	secret := ""
25
+
25
 	switch C.SecretMode {
26
 	switch C.SecretMode {
26
 	case SecretModeSimple:
27
 	case SecretModeSimple:
27
 		secret = hex.EncodeToString(C.Secret)
28
 		secret = hex.EncodeToString(C.Secret)

+ 1
- 0
conntypes/protocol.go View File

9
 	case ConnectionProtocolIPv4:
9
 	case ConnectionProtocolIPv4:
10
 		return "ipv4"
10
 		return "ipv4"
11
 	}
11
 	}
12
+
12
 	return "ipv6"
13
 	return "ipv6"
13
 }
14
 }
14
 
15
 

+ 0
- 2
conntypes/wrappers.go View File

1
-package conntypes
2
-

+ 2
- 0
hub/connection.go View File

47
 		c.pending = 0
47
 		c.pending = 0
48
 		c.mutex.Unlock()
48
 		c.mutex.Unlock()
49
 	}
49
 	}
50
+
50
 	return err
51
 	return err
51
 }
52
 }
52
 
53
 
89
 			logger.Debugw("Failed response", "error", err)
90
 			logger.Debugw("Failed response", "error", err)
90
 			continue
91
 			continue
91
 		}
92
 		}
93
+
92
 		if response.Type == rpc.ProxyResponseTypeCloseExt {
94
 		if response.Type == rpc.ProxyResponseTypeCloseExt {
93
 			logger.Debugw("Proxy has closed connection")
95
 			logger.Debugw("Proxy has closed connection")
94
 			return
96
 			return

+ 5
- 1
hub/connection_hub.go View File

50
 		case conn.closed():
50
 		case conn.closed():
51
 			logger.Debugw("Delete closed socket", "key", key)
51
 			logger.Debugw("Delete closed socket", "key", key)
52
 			delete(c.sockets, key)
52
 			delete(c.sockets, key)
53
-
54
 		case conn.idle():
53
 		case conn.idle():
55
 			logger.Debugw("Delete idle socket", "key", key)
54
 			logger.Debugw("Delete idle socket", "key", key)
56
 			conn.shutdown()
55
 			conn.shutdown()
57
 			delete(c.sockets, key)
56
 			delete(c.sockets, key)
57
+
58
 			return
58
 			return
59
 		}
59
 		}
60
 	}
60
 	}
65
 
65
 
66
 	for key, conn := range c.sockets {
66
 	for key, conn := range c.sockets {
67
 		delete(c.sockets, key)
67
 		delete(c.sockets, key)
68
+
68
 		if !conn.closed() {
69
 		if !conn.closed() {
69
 			logger.Debugw("Choose connection",
70
 			logger.Debugw("Choose connection",
70
 				"id", conn.id,
71
 				"id", conn.id,
71
 				"remote_addr", conn.conn.RemoteAddr())
72
 				"remote_addr", conn.conn.RemoteAddr())
72
 			req.response <- conn
73
 			req.response <- conn
73
 			close(req.response)
74
 			close(req.response)
75
+
74
 			return
76
 			return
75
 		}
77
 		}
76
 	}
78
 	}
81
 			"remote_addr", conn.conn.RemoteAddr())
83
 			"remote_addr", conn.conn.RemoteAddr())
82
 		req.response <- conn
84
 		req.response <- conn
83
 	}
85
 	}
86
+
84
 	close(req.response)
87
 	close(req.response)
85
 }
88
 }
86
 
89
 
93
 	c.logger.Named("return-connection").Debugw("Return connection",
96
 	c.logger.Named("return-connection").Debugw("Return connection",
94
 		"id", conn.id,
97
 		"id", conn.id,
95
 		"remote_addr", conn.conn.RemoteAddr())
98
 		"remote_addr", conn.conn.RemoteAddr())
99
+
96
 	c.sockets[conn.id] = conn
100
 	c.sockets[conn.id] = conn
97
 }
101
 }
98
 
102
 

+ 2
- 0
hub/ctx_channel.go View File

46
 func (c *ctxChannel) Close() error {
46
 func (c *ctxChannel) Close() error {
47
 	c.cancel()
47
 	c.cancel()
48
 	c.channel = nil
48
 	c.channel = nil
49
+
49
 	return nil
50
 	return nil
50
 }
51
 }
51
 
52
 
52
 func newCtxChannel(ctx context.Context) *ctxChannel {
53
 func newCtxChannel(ctx context.Context) *ctxChannel {
53
 	ctx, cancel := context.WithCancel(ctx)
54
 	ctx, cancel := context.WithCancel(ctx)
55
+
54
 	return &ctxChannel{
56
 	return &ctxChannel{
55
 		channel: make(chan *rpc.ProxyResponse),
57
 		channel: make(chan *rpc.ProxyResponse),
56
 		ctx:     ctx,
58
 		ctx:     ctx,

+ 3
- 2
hub/hub.go View File

42
 
42
 
43
 func (h *hub) getHub(req *protocol.TelegramRequest) *connectionHub {
43
 func (h *hub) getHub(req *protocol.TelegramRequest) *connectionHub {
44
 	keyBuilder := strings.Builder{}
44
 	keyBuilder := strings.Builder{}
45
-	binary.Write(&keyBuilder, binary.LittleEndian, int16(req.ClientProtocol.DC()))
45
+	binary.Write(&keyBuilder, binary.LittleEndian, int16(req.ClientProtocol.DC())) // nolint: errcheck
46
 	keyBuilder.WriteRune('_')
46
 	keyBuilder.WriteRune('_')
47
-	binary.Write(&keyBuilder, binary.LittleEndian, uint8(req.ClientProtocol.ConnectionProtocol()))
47
+	binary.Write(&keyBuilder, binary.LittleEndian, uint8(req.ClientProtocol.ConnectionProtocol())) // nolint: errcheck
48
 	key := keyBuilder.String()
48
 	key := keyBuilder.String()
49
 
49
 
50
 	h.mutex.RLock()
50
 	h.mutex.RLock()
60
 			h.logger.Debugw("Create new connection hub",
60
 			h.logger.Debugw("Create new connection hub",
61
 				"dc", req.ClientProtocol.DC(),
61
 				"dc", req.ClientProtocol.DC(),
62
 				"protocol", req.ClientProtocol.ConnectionProtocol())
62
 				"protocol", req.ClientProtocol.ConnectionProtocol())
63
+
63
 			rv = newConnectionHub(h.logger.With(
64
 			rv = newConnectionHub(h.logger.With(
64
 				"dc", req.ClientProtocol.DC(),
65
 				"dc", req.ClientProtocol.DC(),
65
 				"protocol", req.ClientProtocol.ConnectionProtocol(),
66
 				"protocol", req.ClientProtocol.ConnectionProtocol(),

+ 1
- 0
hub/registry.go View File

40
 	if value, ok := r.conns[string(id[:])]; ok {
40
 	if value, ok := r.conns[string(id[:])]; ok {
41
 		return value, true
41
 		return value, true
42
 	}
42
 	}
43
+
43
 	return nil, false
44
 	return nil, false
44
 }
45
 }

+ 0
- 1
main.go View File

119
 	switch kingpin.MustParse(app.Parse(os.Args[1:])) {
119
 	switch kingpin.MustParse(app.Parse(os.Args[1:])) {
120
 	case generateSecretCommand.FullCommand():
120
 	case generateSecretCommand.FullCommand():
121
 		cli.Generate(*generateSecretType)
121
 		cli.Generate(*generateSecretType)
122
-
123
 	case proxyCommand.FullCommand():
122
 	case proxyCommand.FullCommand():
124
 		err := config.Init(
123
 		err := config.Init(
125
 			config.Opt{Option: config.OptionTypeDebug, Value: *proxyDebug},
124
 			config.Opt{Option: config.OptionTypeDebug, Value: *proxyDebug},

+ 11
- 5
mtproto/protocol.go View File

20
 
20
 
21
 	rpcNonceConn := packet.NewMtprotoFrame(conn, rpc.SeqNoNonce)
21
 	rpcNonceConn := packet.NewMtprotoFrame(conn, rpc.SeqNoNonce)
22
 	rpcNonceReq, err := doRPCNonceRequest(rpcNonceConn)
22
 	rpcNonceReq, err := doRPCNonceRequest(rpcNonceConn)
23
+
23
 	if err != nil {
24
 	if err != nil {
24
 		return nil, fmt.Errorf("cannot do nonce request: %w", err)
25
 		return nil, fmt.Errorf("cannot do nonce request: %w", err)
25
 	}
26
 	}
35
 	if err := doRPCHandshakeRequest(frameConn); err != nil {
36
 	if err := doRPCHandshakeRequest(frameConn); err != nil {
36
 		return nil, fmt.Errorf("cannot do handshake request: %w", err)
37
 		return nil, fmt.Errorf("cannot do handshake request: %w", err)
37
 	}
38
 	}
39
+
38
 	if err := getRPCHandshakeResponse(frameConn); err != nil {
40
 	if err := getRPCHandshakeResponse(frameConn); err != nil {
39
 		return nil, fmt.Errorf("cannot get handshake response: %w", err)
41
 		return nil, fmt.Errorf("cannot get handshake response: %w", err)
40
 	}
42
 	}
42
 	return frameConn, nil
44
 	return frameConn, nil
43
 }
45
 }
44
 
46
 
45
-func doRPCNonceRequest(conn conntypes.PacketWriter) (*rpc.NonceRequest, error) {
47
+func doRPCNonceRequest(conn conntypes.BasePacketWriter) (*rpc.NonceRequest, error) {
46
 	rpcNonceReq, err := rpc.NewNonceRequest(telegram.Middle.Secret())
48
 	rpcNonceReq, err := rpc.NewNonceRequest(telegram.Middle.Secret())
47
 	if err != nil {
49
 	if err != nil {
48
 		panic(err)
50
 		panic(err)
49
 	}
51
 	}
52
+
50
 	if err := conn.Write(rpcNonceReq.Bytes()); err != nil {
53
 	if err := conn.Write(rpcNonceReq.Bytes()); err != nil {
51
 		return nil, err
54
 		return nil, err
52
 	}
55
 	}
54
 	return rpcNonceReq, nil
57
 	return rpcNonceReq, nil
55
 }
58
 }
56
 
59
 
57
-func getRPCNonceResponse(conn conntypes.PacketReader, req *rpc.NonceRequest) (*rpc.NonceResponse, error) {
60
+func getRPCNonceResponse(conn conntypes.BasePacketReader, req *rpc.NonceRequest) (*rpc.NonceResponse, error) {
58
 	packet, err := conn.Read()
61
 	packet, err := conn.Read()
59
 	if err != nil {
62
 	if err != nil {
60
 		return nil, fmt.Errorf("cannot read from connection: %w", err)
63
 		return nil, fmt.Errorf("cannot read from connection: %w", err)
62
 
65
 
63
 	resp, err := rpc.NewNonceResponse(packet)
66
 	resp, err := rpc.NewNonceResponse(packet)
64
 	if err != nil {
67
 	if err != nil {
65
-		return nil, fmt.Errorf("cannot build rpc nonce responce: %w", err)
68
+		return nil, fmt.Errorf("cannot build rpc nonce response: %w", err)
66
 	}
69
 	}
70
+
67
 	if err = resp.Valid(req); err != nil {
71
 	if err = resp.Valid(req); err != nil {
68
 		return nil, fmt.Errorf("invalid nonce response: %w", err)
72
 		return nil, fmt.Errorf("invalid nonce response: %w", err)
69
 	}
73
 	}
71
 	return resp, nil
75
 	return resp, nil
72
 }
76
 }
73
 
77
 
74
-func doRPCHandshakeRequest(conn conntypes.PacketWriter) error {
78
+func doRPCHandshakeRequest(conn conntypes.BasePacketWriter) error {
75
 	if err := conn.Write(rpc.HandshakeRequest); err != nil {
79
 	if err := conn.Write(rpc.HandshakeRequest); err != nil {
76
 		return fmt.Errorf("cannot make a request: %w", err)
80
 		return fmt.Errorf("cannot make a request: %w", err)
77
 	}
81
 	}
82
+
78
 	return nil
83
 	return nil
79
 }
84
 }
80
 
85
 
81
-func getRPCHandshakeResponse(conn conntypes.PacketReader) error {
86
+func getRPCHandshakeResponse(conn conntypes.BasePacketReader) error {
82
 	packet, err := conn.Read()
87
 	packet, err := conn.Read()
83
 	if err != nil {
88
 	if err != nil {
84
 		return fmt.Errorf("cannot read a response: %w", err)
89
 		return fmt.Errorf("cannot read a response: %w", err)
88
 	if err != nil {
93
 	if err != nil {
89
 		return fmt.Errorf("cannot build a handshake response: %w", err)
94
 		return fmt.Errorf("cannot build a handshake response: %w", err)
90
 	}
95
 	}
96
+
91
 	if err := resp.Valid(); err != nil {
97
 	if err := resp.Valid(); err != nil {
92
 		return fmt.Errorf("invalid handshake response: %w", err)
98
 		return fmt.Errorf("invalid handshake response: %w", err)
93
 	}
99
 	}

+ 4
- 3
mtproto/rpc/handshake_response.go View File

28
 // Valid checks that handshake response compliments request.
28
 // Valid checks that handshake response compliments request.
29
 func (r *HandshakeResponse) Valid() error {
29
 func (r *HandshakeResponse) Valid() error {
30
 	if !bytes.Equal(r.Type, TagHandshake) {
30
 	if !bytes.Equal(r.Type, TagHandshake) {
31
-		return errors.New("Unexpected handshake tag")
31
+		return errors.New("unexpected handshake tag")
32
 	}
32
 	}
33
+
33
 	if !bytes.Equal(r.PeerPID, HandshakeSenderPID) {
34
 	if !bytes.Equal(r.PeerPID, HandshakeSenderPID) {
34
-		return errors.New("Incorrect sender PID")
35
+		return errors.New("incorrect sender PID")
35
 	}
36
 	}
36
 
37
 
37
 	return nil
38
 	return nil
41
 // data.
42
 // data.
42
 func NewHandshakeResponse(data []byte) (*HandshakeResponse, error) {
43
 func NewHandshakeResponse(data []byte) (*HandshakeResponse, error) {
43
 	if len(data) != 32 {
44
 	if len(data) != 32 {
44
-		return nil, fmt.Errorf("Incorrect handshake response length %d", len(data))
45
+		return nil, fmt.Errorf("incorrect handshake response length %d", len(data))
45
 	}
46
 	}
46
 
47
 
47
 	return &HandshakeResponse{
48
 	return &HandshakeResponse{

+ 1
- 0
mtproto/rpc/nonce_request.go View File

36
 	if _, err := rand.Read(nonce); err != nil {
36
 	if _, err := rand.Read(nonce); err != nil {
37
 		return nil, fmt.Errorf("cannot generate nonce: %w", err)
37
 		return nil, fmt.Errorf("cannot generate nonce: %w", err)
38
 	}
38
 	}
39
+
39
 	copy(keySelector, proxySecret)
40
 	copy(keySelector, proxySecret)
40
 
41
 
41
 	timestamp := time.Now().Truncate(time.Second).Unix() % 4294967296 // 256 ^ 4 - do not know how to name
42
 	timestamp := time.Now().Truncate(time.Second).Unix() % 4294967296 // 256 ^ 4 - do not know how to name

+ 6
- 4
mtproto/rpc/nonce_response.go View File

28
 
28
 
29
 func (r *NonceResponse) Valid(req *NonceRequest) error {
29
 func (r *NonceResponse) Valid(req *NonceRequest) error {
30
 	if !bytes.Equal(r.Type, TagNonce) {
30
 	if !bytes.Equal(r.Type, TagNonce) {
31
-		return errors.New("Unexpected RPC type")
31
+		return errors.New("unexpected RPC type")
32
 	}
32
 	}
33
+
33
 	if !bytes.Equal(r.Crypto, NonceCryptoAES) {
34
 	if !bytes.Equal(r.Crypto, NonceCryptoAES) {
34
-		return errors.New("Unexpected crypto type")
35
+		return errors.New("unexpected crypto type")
35
 	}
36
 	}
37
+
36
 	if !bytes.Equal(r.KeySelector, req.KeySelector) {
38
 	if !bytes.Equal(r.KeySelector, req.KeySelector) {
37
-		return errors.New("Unexpected key selector")
39
+		return errors.New("unexpected key selector")
38
 	}
40
 	}
39
 
41
 
40
 	return nil
42
 	return nil
43
 // NewNonceResponse build new nonce response based on the given data.
45
 // NewNonceResponse build new nonce response based on the given data.
44
 func NewNonceResponse(data []byte) (*NonceResponse, error) {
46
 func NewNonceResponse(data []byte) (*NonceResponse, error) {
45
 	if len(data) != 32 {
47
 	if len(data) != 32 {
46
-		return nil, fmt.Errorf("Unexpected message length %d", len(data))
48
+		return nil, fmt.Errorf("unexpected message length %d", len(data))
47
 	}
49
 	}
48
 
50
 
49
 	return &NonceResponse{
51
 	return &NonceResponse{

+ 7
- 0
mtproto/rpc/proxy_flags.go View File

33
 	if r&ProxyRequestFlagsHasAdTag != 0 {
33
 	if r&ProxyRequestFlagsHasAdTag != 0 {
34
 		flags = append(flags, "HAS_AD_TAG")
34
 		flags = append(flags, "HAS_AD_TAG")
35
 	}
35
 	}
36
+
36
 	if r&ProxyRequestFlagsEncrypted != 0 {
37
 	if r&ProxyRequestFlagsEncrypted != 0 {
37
 		flags = append(flags, "ENCRYPTED")
38
 		flags = append(flags, "ENCRYPTED")
38
 	}
39
 	}
40
+
39
 	if r&ProxyRequestFlagsMagic != 0 {
41
 	if r&ProxyRequestFlagsMagic != 0 {
40
 		flags = append(flags, "MAGIC")
42
 		flags = append(flags, "MAGIC")
41
 	}
43
 	}
44
+
42
 	if r&ProxyRequestFlagsExtMode2 != 0 {
45
 	if r&ProxyRequestFlagsExtMode2 != 0 {
43
 		flags = append(flags, "EXT_MODE_2")
46
 		flags = append(flags, "EXT_MODE_2")
44
 	}
47
 	}
48
+
45
 	if r&ProxyRequestFlagsIntermediate != 0 {
49
 	if r&ProxyRequestFlagsIntermediate != 0 {
46
 		flags = append(flags, "INTERMEDIATE")
50
 		flags = append(flags, "INTERMEDIATE")
47
 	}
51
 	}
52
+
48
 	if r&ProxyRequestFlagsAbdridged != 0 {
53
 	if r&ProxyRequestFlagsAbdridged != 0 {
49
 		flags = append(flags, "ABRIDGED")
54
 		flags = append(flags, "ABRIDGED")
50
 	}
55
 	}
56
+
51
 	if r&ProxyRequestFlagsQuickAck != 0 {
57
 	if r&ProxyRequestFlagsQuickAck != 0 {
52
 		flags = append(flags, "QUICK_ACK")
58
 		flags = append(flags, "QUICK_ACK")
53
 	}
59
 	}
60
+
54
 	if r&ProxyRequestFlagsPad != 0 {
61
 	if r&ProxyRequestFlagsPad != 0 {
55
 		flags = append(flags, "PAD")
62
 		flags = append(flags, "PAD")
56
 	}
63
 	}

+ 4
- 2
mtproto/rpc/proxy_response.go View File

29
 	}
29
 	}
30
 
30
 
31
 	tag := packet[:4]
31
 	tag := packet[:4]
32
+
32
 	switch {
33
 	switch {
33
 	case bytes.Equal(tag, TagProxyAns):
34
 	case bytes.Equal(tag, TagProxyAns):
34
 		response.Type = ProxyResponseTypeAns
35
 		response.Type = ProxyResponseTypeAns
35
 		copy(response.ConnID[:], packet[8:16])
36
 		copy(response.ConnID[:], packet[8:16])
36
 		response.Payload = packet[16:]
37
 		response.Payload = packet[16:]
37
-		return &response, nil
38
 
38
 
39
+		return &response, nil
39
 	case bytes.Equal(tag, TagSimpleAck):
40
 	case bytes.Equal(tag, TagSimpleAck):
40
 		response.Type = ProxyResponseTypeSimpleAck
41
 		response.Type = ProxyResponseTypeSimpleAck
41
 		copy(response.ConnID[:], packet[4:12])
42
 		copy(response.ConnID[:], packet[4:12])
42
 		response.Payload = packet[12:]
43
 		response.Payload = packet[12:]
43
-		return &response, nil
44
 
44
 
45
+		return &response, nil
45
 	case bytes.Equal(tag, TagCloseExt):
46
 	case bytes.Equal(tag, TagCloseExt):
46
 		response.Type = ProxyResponseTypeCloseExt
47
 		response.Type = ProxyResponseTypeCloseExt
48
+
47
 		return &response, nil
49
 		return &response, nil
48
 	}
50
 	}
49
 
51
 

+ 3
- 1
ntp/ntp.go View File

21
 // Fetch fetches the data on time drift.
21
 // Fetch fetches the data on time drift.
22
 func Fetch() (time.Duration, error) {
22
 func Fetch() (time.Duration, error) {
23
 	url := ntpEndpoints[rand.Intn(len(ntpEndpoints))]
23
 	url := ntpEndpoints[rand.Intn(len(ntpEndpoints))]
24
+
24
 	resp, err := ntp.Query(url)
25
 	resp, err := ntp.Query(url)
25
 	if err != nil {
26
 	if err != nil {
26
-		return 0, fmt.Errorf("Cannot fetch NTP server %s: %w", url, err)
27
+		return 0, fmt.Errorf("cannot fetch NTP server %s: %w", url, err)
27
 	}
28
 	}
28
 
29
 
29
 	offsetInt := int64(resp.ClockOffset)
30
 	offsetInt := int64(resp.ClockOffset)
30
 	if offsetInt < 0 {
31
 	if offsetInt < 0 {
31
 		offsetInt = -offsetInt
32
 		offsetInt = -offsetInt
32
 	}
33
 	}
34
+
33
 	offset := time.Duration(offsetInt)
35
 	offset := time.Duration(offsetInt)
34
 
36
 
35
 	return offset, nil
37
 	return offset, nil

+ 5
- 2
obfuscated2/client_protocol.go View File

58
 	decryptor.XORKeyStream(decryptedFrame.Bytes(), fm.Bytes())
58
 	decryptor.XORKeyStream(decryptedFrame.Bytes(), fm.Bytes())
59
 
59
 
60
 	magic := decryptedFrame.Magic()
60
 	magic := decryptedFrame.Magic()
61
+
61
 	switch {
62
 	switch {
62
 	case bytes.Equal(magic, conntypes.ConnectionTagAbridged):
63
 	case bytes.Equal(magic, conntypes.ConnectionTagAbridged):
63
 		c.connectionType = conntypes.ConnectionTypeAbridged
64
 		c.connectionType = conntypes.ConnectionTypeAbridged
66
 	case bytes.Equal(magic, conntypes.ConnectionTagSecure):
67
 	case bytes.Equal(magic, conntypes.ConnectionTagSecure):
67
 		c.connectionType = conntypes.ConnectionTypeSecure
68
 		c.connectionType = conntypes.ConnectionTypeSecure
68
 	default:
69
 	default:
69
-		return nil, errors.New("Unknown connection type")
70
+		return nil, errors.New("unknown connection type")
70
 	}
71
 	}
71
 
72
 
72
 	c.connectionProtocol = conntypes.ConnectionProtocolIPv4
73
 	c.connectionProtocol = conntypes.ConnectionProtocolIPv4
81
 
82
 
82
 	antiReplayKey := decryptedFrame.Unique()
83
 	antiReplayKey := decryptedFrame.Unique()
83
 	if antireplay.Cache.Has(antiReplayKey) {
84
 	if antireplay.Cache.Has(antiReplayKey) {
84
-		return nil, errors.New("Replay attack is detected")
85
+		return nil, errors.New("replay attack is detected")
85
 	}
86
 	}
87
+
86
 	antireplay.Cache.Add(antiReplayKey)
88
 	antireplay.Cache.Add(antiReplayKey)
87
 
89
 
88
 	return stream.NewObfuscated2(socket, encryptor, decryptor), nil
90
 	return stream.NewObfuscated2(socket, encryptor, decryptor), nil
92
 	if _, err = io.ReadFull(handshakeReader{socket}, fm.Bytes()); err != nil {
94
 	if _, err = io.ReadFull(handshakeReader{socket}, fm.Bytes()); err != nil {
93
 		err = fmt.Errorf("cannot extract obfuscated2 frame: %w", err)
95
 		err = fmt.Errorf("cannot extract obfuscated2 frame: %w", err)
94
 	}
96
 	}
97
+
95
 	return
98
 	return
96
 }
99
 }
97
 
100
 

+ 2
- 0
obfuscated2/telegram_protocol.go View File

17
 	if err != nil {
17
 	if err != nil {
18
 		return nil, fmt.Errorf("cannot dial to telegram: %w", err)
18
 		return nil, fmt.Errorf("cannot dial to telegram: %w", err)
19
 	}
19
 	}
20
+
20
 	conn = stream.NewTimeout(conn)
21
 	conn = stream.NewTimeout(conn)
21
 	conn = stream.NewCtx(req.Ctx, req.Cancel, conn)
22
 	conn = stream.NewCtx(req.Ctx, req.Cancel, conn)
22
 	fm := generateFrame(req.ClientProtocol)
23
 	fm := generateFrame(req.ClientProtocol)
45
 		if _, err := rand.Read(data); err != nil {
46
 		if _, err := rand.Read(data); err != nil {
46
 			continue
47
 			continue
47
 		}
48
 		}
49
+
48
 		if data[0] == 0xef {
50
 		if data[0] == 0xef {
49
 			continue
51
 			continue
50
 		}
52
 		}

+ 3
- 0
proxy/direct.go View File

18
 	if err != nil {
18
 	if err != nil {
19
 		return err
19
 		return err
20
 	}
20
 	}
21
+
21
 	telegramConn := telegramConnRaw.(conntypes.StreamReadWriteCloser)
22
 	telegramConn := telegramConnRaw.(conntypes.StreamReadWriteCloser)
23
+
22
 	defer telegramConn.Close()
24
 	defer telegramConn.Close()
23
 
25
 
24
 	wg := &sync.WaitGroup{}
26
 	wg := &sync.WaitGroup{}
25
 	wg.Add(2)
27
 	wg.Add(2)
26
 
28
 
27
 	go directPipe(telegramConn, request.ClientConn, wg, request.Logger)
29
 	go directPipe(telegramConn, request.ClientConn, wg, request.Logger)
30
+
28
 	go directPipe(request.ClientConn, telegramConn, wg, request.Logger)
31
 	go directPipe(request.ClientConn, telegramConn, wg, request.Logger)
29
 
32
 
30
 	wg.Wait()
33
 	wg.Wait()

+ 4
- 3
proxy/middle.go View File

10
 	"github.com/9seconds/mtg/wrappers/packetack"
10
 	"github.com/9seconds/mtg/wrappers/packetack"
11
 )
11
 )
12
 
12
 
13
-func middleConnection(request *protocol.TelegramRequest) error {
13
+func middleConnection(request *protocol.TelegramRequest) {
14
 	telegramConn := packetack.NewProxy(request)
14
 	telegramConn := packetack.NewProxy(request)
15
 	defer telegramConn.Close()
15
 	defer telegramConn.Close()
16
 
16
 
17
 	var clientConn conntypes.PacketAckFullReadWriteCloser
17
 	var clientConn conntypes.PacketAckFullReadWriteCloser
18
+
18
 	switch request.ClientProtocol.ConnectionType() {
19
 	switch request.ClientProtocol.ConnectionType() {
19
 	case conntypes.ConnectionTypeAbridged:
20
 	case conntypes.ConnectionTypeAbridged:
20
 		clientConn = packetack.NewClientAbridged(request.ClientConn)
21
 		clientConn = packetack.NewClientAbridged(request.ClientConn)
30
 	wg.Add(2)
31
 	wg.Add(2)
31
 
32
 
32
 	go middlePipe(telegramConn, clientConn, wg, request.Logger)
33
 	go middlePipe(telegramConn, clientConn, wg, request.Logger)
34
+
33
 	go middlePipe(clientConn, telegramConn, wg, request.Logger)
35
 	go middlePipe(clientConn, telegramConn, wg, request.Logger)
34
 
36
 
35
 	wg.Wait()
37
 	wg.Wait()
36
-
37
-	return nil
38
 }
38
 }
39
 
39
 
40
 func middlePipe(dst conntypes.PacketAckWriteCloser,
40
 func middlePipe(dst conntypes.PacketAckWriteCloser,
50
 	for {
50
 	for {
51
 		acks := conntypes.ConnectionAcks{}
51
 		acks := conntypes.ConnectionAcks{}
52
 		packet, err := src.Read(&acks)
52
 		packet, err := src.Read(&acks)
53
+
53
 		if err != nil {
54
 		if err != nil {
54
 			logger.Debugw("Cannot read packet", "error", err)
55
 			logger.Debugw("Cannot read packet", "error", err)
55
 			return
56
 			return

+ 6
- 1
proxy/proxy.go View File

34
 				continue
34
 				continue
35
 			}
35
 			}
36
 		}
36
 		}
37
+
37
 		go p.accept(conn)
38
 		go p.accept(conn)
38
 	}
39
 	}
39
 }
40
 }
61
 	clientConn := stream.NewClientConn(conn, connID)
62
 	clientConn := stream.NewClientConn(conn, connID)
62
 	clientConn = stream.NewCtx(ctx, cancel, clientConn)
63
 	clientConn = stream.NewCtx(ctx, cancel, clientConn)
63
 	clientConn = stream.NewTimeout(clientConn)
64
 	clientConn = stream.NewTimeout(clientConn)
65
+
64
 	defer clientConn.Close()
66
 	defer clientConn.Close()
65
 
67
 
66
 	clientProtocol := p.ClientProtocolMaker()
68
 	clientProtocol := p.ClientProtocolMaker()
67
 	clientConn, err := clientProtocol.Handshake(clientConn)
69
 	clientConn, err := clientProtocol.Handshake(clientConn)
70
+
68
 	if err != nil {
71
 	if err != nil {
69
 		logger.Warnw("Cannot perform client handshake", "error", err)
72
 		logger.Warnw("Cannot perform client handshake", "error", err)
70
 		return
73
 		return
83
 		ClientProtocol: clientProtocol,
86
 		ClientProtocol: clientProtocol,
84
 	}
87
 	}
85
 
88
 
89
+	err = nil
90
+
86
 	if len(config.C.AdTag) > 0 {
91
 	if len(config.C.AdTag) > 0 {
87
-		err = middleConnection(req)
92
+		middleConnection(req)
88
 	} else {
93
 	} else {
89
 		err = directConnection(req)
94
 		err = directConnection(req)
90
 	}
95
 	}

+ 4
- 0
stats/stats.go View File

20
 	}
20
 	}
21
 
21
 
22
 	stats := []Interface{instancePrometheus}
22
 	stats := []Interface{instancePrometheus}
23
+
23
 	if config.C.StatsdAddr != nil {
24
 	if config.C.StatsdAddr != nil {
24
 		instanceStatsd, err := newStatsStatsd()
25
 		instanceStatsd, err := newStatsStatsd()
25
 		if err != nil {
26
 		if err != nil {
26
 			return fmt.Errorf("cannot inialize statsd: %w", err)
27
 			return fmt.Errorf("cannot inialize statsd: %w", err)
27
 		}
28
 		}
29
+
28
 		stats = append(stats, instanceStatsd)
30
 		stats = append(stats, instanceStatsd)
29
 	}
31
 	}
30
 
32
 
36
 	srv := http.Server{
38
 	srv := http.Server{
37
 		Handler: mux,
39
 		Handler: mux,
38
 	}
40
 	}
41
+
39
 	go srv.Serve(listener) // nolint: errcheck
42
 	go srv.Serve(listener) // nolint: errcheck
43
+
40
 	go func() {
44
 	go func() {
41
 		<-ctx.Done()
45
 		<-ctx.Done()
42
 		srv.Shutdown(context.Background()) // nolint: errcheck
46
 		srv.Shutdown(context.Background()) // nolint: errcheck

+ 4
- 0
stats/stats_prometheus.go View File

122
 	if err := registry.Register(instance.connections); err != nil {
122
 	if err := registry.Register(instance.connections); err != nil {
123
 		return nil, fmt.Errorf("cannot register metrics for connections: %w", err)
123
 		return nil, fmt.Errorf("cannot register metrics for connections: %w", err)
124
 	}
124
 	}
125
+
125
 	if err := registry.Register(instance.telegramConnections); err != nil {
126
 	if err := registry.Register(instance.telegramConnections); err != nil {
126
 		return nil, fmt.Errorf("cannot register metrics for telegram connections: %w", err)
127
 		return nil, fmt.Errorf("cannot register metrics for telegram connections: %w", err)
127
 	}
128
 	}
129
+
128
 	if err := registry.Register(instance.traffic); err != nil {
130
 	if err := registry.Register(instance.traffic); err != nil {
129
 		return nil, fmt.Errorf("cannot register metrics for traffic: %w", err)
131
 		return nil, fmt.Errorf("cannot register metrics for traffic: %w", err)
130
 	}
132
 	}
133
+
131
 	if err := registry.Register(instance.crashes); err != nil {
134
 	if err := registry.Register(instance.crashes); err != nil {
132
 		return nil, fmt.Errorf("cannot register metrics for crashes: %w", err)
135
 		return nil, fmt.Errorf("cannot register metrics for crashes: %w", err)
133
 	}
136
 	}
137
+
134
 	if err := registry.Register(instance.antiReplays); err != nil {
138
 	if err := registry.Register(instance.antiReplays); err != nil {
135
 		return nil, fmt.Errorf("cannot register metrics for anti replays: %w", err)
139
 		return nil, fmt.Errorf("cannot register metrics for anti replays: %w", err)
136
 	}
140
 	}

+ 1
- 0
stats/stats_statsd.go View File

96
 		for k, v := range config.C.StatsdTags {
96
 		for k, v := range config.C.StatsdTags {
97
 			tags = append(tags, k, v)
97
 			tags = append(tags, k, v)
98
 		}
98
 		}
99
+
99
 		options = append(options, statsd.Tags(tags...))
100
 		options = append(options, statsd.Tags(tags...))
100
 	}
101
 	}
101
 
102
 

+ 6
- 3
telegram/api/addresses.go View File

31
 	if err != nil {
31
 	if err != nil {
32
 		return nil, 0, fmt.Errorf("cannot get http response: %w", err)
32
 		return nil, 0, fmt.Errorf("cannot get http response: %w", err)
33
 	}
33
 	}
34
+
34
 	defer resp.Close()
35
 	defer resp.Close()
35
 
36
 
36
 	scanner := bufio.NewScanner(resp)
37
 	scanner := bufio.NewScanner(resp)
37
 	data := map[conntypes.DC][]string{}
38
 	data := map[conntypes.DC][]string{}
39
+	defaultDC := conntypes.DCDefaultIdx
38
 
40
 
39
-	var defaultDC = conntypes.DCDefaultIdx
40
 	for scanner.Scan() {
41
 	for scanner.Scan() {
41
 		text := strings.TrimSpace(scanner.Text())
42
 		text := strings.TrimSpace(scanner.Text())
43
+
42
 		switch {
44
 		switch {
43
 		case strings.HasPrefix(text, "#"):
45
 		case strings.HasPrefix(text, "#"):
44
 			continue
46
 			continue
45
-
46
 		case strings.HasPrefix(text, "proxy_for"):
47
 		case strings.HasPrefix(text, "proxy_for"):
47
 			addr, idx, err := addressesParseProxyFor(text)
48
 			addr, idx, err := addressesParseProxyFor(text)
48
 			if err != nil {
49
 			if err != nil {
49
 				return nil, 0, fmt.Errorf("cannot parse 'proxy_for' section: %w", err)
50
 				return nil, 0, fmt.Errorf("cannot parse 'proxy_for' section: %w", err)
50
 			}
51
 			}
52
+
51
 			if addresses, ok := data[idx]; ok {
53
 			if addresses, ok := data[idx]; ok {
52
 				data[idx] = append(addresses, addr)
54
 				data[idx] = append(addresses, addr)
53
 			} else {
55
 			} else {
54
 				data[idx] = []string{addr}
56
 				data[idx] = []string{addr}
55
 			}
57
 			}
56
-
57
 		case strings.HasPrefix(text, "default"):
58
 		case strings.HasPrefix(text, "default"):
58
 			idx, err := addressesParseDefault(text)
59
 			idx, err := addressesParseDefault(text)
59
 			if err != nil {
60
 			if err != nil {
60
 				return nil, 0, fmt.Errorf("cannot parse 'default' section: %w", err)
61
 				return nil, 0, fmt.Errorf("cannot parse 'default' section: %w", err)
61
 			}
62
 			}
63
+
62
 			defaultDC = idx
64
 			defaultDC = idx
63
 		}
65
 		}
64
 	}
66
 	}
97
 	}
99
 	}
98
 
100
 
99
 	dcString := strings.TrimRight(chunks[1], ";")
101
 	dcString := strings.TrimRight(chunks[1], ";")
102
+
100
 	dc, err := strconv.ParseInt(dcString, 10, 16)
103
 	dc, err := strconv.ParseInt(dcString, 10, 16)
101
 	if err != nil {
104
 	if err != nil {
102
 		return 0, fmt.Errorf("incorrect config '%s': %w", text, err)
105
 		return 0, fmt.Errorf("incorrect config '%s': %w", text, err)

+ 3
- 1
telegram/api/api.go View File

22
 	if err != nil {
22
 	if err != nil {
23
 		panic(err)
23
 		panic(err)
24
 	}
24
 	}
25
+
25
 	req.Header.Set("Accept", "text/plan")
26
 	req.Header.Set("Accept", "text/plan")
26
 	req.Header.Set("User-Agent", apiUserAgent)
27
 	req.Header.Set("User-Agent", apiUserAgent)
27
 
28
 
28
 	resp, err := httpClient.Do(req)
29
 	resp, err := httpClient.Do(req)
29
 	if err != nil {
30
 	if err != nil {
30
 		if resp != nil {
31
 		if resp != nil {
31
-			io.Copy(ioutil.Discard, resp.Body)
32
+			io.Copy(ioutil.Discard, resp.Body) // nolint: errcheck
32
 			resp.Body.Close()
33
 			resp.Body.Close()
33
 		}
34
 		}
35
+
34
 		return nil, fmt.Errorf("cannot perform a request: %w", err)
36
 		return nil, fmt.Errorf("cannot perform a request: %w", err)
35
 	}
37
 	}
36
 
38
 

+ 1
- 0
telegram/api/secret.go View File

12
 	if err != nil {
12
 	if err != nil {
13
 		return nil, fmt.Errorf("cannot access telegram server: %w", err)
13
 		return nil, fmt.Errorf("cannot access telegram server: %w", err)
14
 	}
14
 	}
15
+
15
 	defer resp.Close()
16
 	defer resp.Close()
16
 
17
 
17
 	secret, err := ioutil.ReadAll(resp)
18
 	secret, err := ioutil.ReadAll(resp)

+ 1
- 1
telegram/base.go View File

51
 	dc, defaultDC conntypes.DC) string {
51
 	dc, defaultDC conntypes.DC) string {
52
 	addrs, ok := addresses[dc]
52
 	addrs, ok := addresses[dc]
53
 	if !ok {
53
 	if !ok {
54
-		addrs, _ = addresses[defaultDC]
54
+		addrs = addresses[defaultDC]
55
 	}
55
 	}
56
 
56
 
57
 	switch {
57
 	switch {

+ 1
- 0
telegram/middle.go View File

55
 
55
 
56
 func (m *middleTelegram) backgroundUpdate() {
56
 func (m *middleTelegram) backgroundUpdate() {
57
 	logger := zap.S().Named("telegram")
57
 	logger := zap.S().Named("telegram")
58
+
58
 	for range time.Tick(middleTelegramBackgroundUpdateEvery) {
59
 	for range time.Tick(middleTelegramBackgroundUpdateEvery) {
59
 		if err := m.update(); err != nil {
60
 		if err := m.update(); err != nil {
60
 			logger.Warnw("Cannot update Telegram proxies", "error", err)
61
 			logger.Warnw("Cannot update Telegram proxies", "error", err)

+ 2
- 0
utils/init_tcp.go View File

13
 	if err := tcpConn.SetNoDelay(true); err != nil {
13
 	if err := tcpConn.SetNoDelay(true); err != nil {
14
 		return fmt.Errorf("cannot set TCP_NO_DELAY: %w", err)
14
 		return fmt.Errorf("cannot set TCP_NO_DELAY: %w", err)
15
 	}
15
 	}
16
+
16
 	if err := tcpConn.SetReadBuffer(config.C.ReadBuffer); err != nil {
17
 	if err := tcpConn.SetReadBuffer(config.C.ReadBuffer); err != nil {
17
 		return fmt.Errorf("cannot set read buffer size: %w", err)
18
 		return fmt.Errorf("cannot set read buffer size: %w", err)
18
 	}
19
 	}
20
+
19
 	if err := tcpConn.SetWriteBuffer(config.C.WriteBuffer); err != nil {
21
 	if err := tcpConn.SetWriteBuffer(config.C.WriteBuffer); err != nil {
20
 		return fmt.Errorf("cannot set write buffer size: %w", err)
22
 		return fmt.Errorf("cannot set write buffer size: %w", err)
21
 	}
23
 	}

+ 1
- 0
utils/read_full.go View File

13
 		if err != nil {
13
 		if err != nil {
14
 			return nil, err
14
 			return nil, err
15
 		}
15
 		}
16
+
16
 		rv = append(rv, buf[:n]...)
17
 		rv = append(rv, buf[:n]...)
17
 	}
18
 	}
18
 
19
 

+ 1
- 1
utils/reverse_bytes.go View File

4
 func ReverseBytes(data []byte) []byte {
4
 func ReverseBytes(data []byte) []byte {
5
 	dataLen := len(data)
5
 	dataLen := len(data)
6
 	rv := make([]byte, dataLen)
6
 	rv := make([]byte, dataLen)
7
-
8
 	rv[dataLen/2] = data[dataLen/2]
7
 	rv[dataLen/2] = data[dataLen/2]
8
+
9
 	for i := dataLen/2 - 1; i >= 0; i-- {
9
 	for i := dataLen/2 - 1; i >= 0; i-- {
10
 		opp := dataLen - i - 1
10
 		opp := dataLen - i - 1
11
 		rv[i], rv[opp] = data[opp], data[i]
11
 		rv[i], rv[opp] = data[opp], data[i]

+ 1
- 0
utils/rlimit.go View File

13
 	if err := unix.Getrlimit(unix.RLIMIT_NOFILE, &rLimit); err != nil {
13
 	if err := unix.Getrlimit(unix.RLIMIT_NOFILE, &rLimit); err != nil {
14
 		return fmt.Errorf("cannot get rlimit: %w", err)
14
 		return fmt.Errorf("cannot get rlimit: %w", err)
15
 	}
15
 	}
16
+
16
 	rLimit.Cur = rLimit.Max
17
 	rLimit.Cur = rLimit.Max
17
 
18
 
18
 	if err := unix.Setrlimit(unix.RLIMIT_NOFILE, &rLimit); err != nil {
19
 	if err := unix.Setrlimit(unix.RLIMIT_NOFILE, &rLimit); err != nil {

+ 1
- 0
utils/signal_context.go View File

14
 	sigChan := make(chan os.Signal, 1)
14
 	sigChan := make(chan os.Signal, 1)
15
 
15
 
16
 	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
16
 	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
17
+
17
 	go func() {
18
 	go func() {
18
 		for range sigChan {
19
 		for range sigChan {
19
 			cancel()
20
 			cancel()

+ 12
- 6
wrappers/packet/mtproto_frame.go View File

41
 	writeSeqNo int32
41
 	writeSeqNo int32
42
 }
42
 }
43
 
43
 
44
-func (w *wrapperMtprotoFrame) Read() (conntypes.Packet, error) {
44
+func (w *wrapperMtprotoFrame) Read() (conntypes.Packet, error) { // nolint: funlen
45
 	buf := &bytes.Buffer{}
45
 	buf := &bytes.Buffer{}
46
 	sum := crc32.NewIEEE()
46
 	sum := crc32.NewIEEE()
47
 	writer := io.MultiWriter(buf, sum)
47
 	writer := io.MultiWriter(buf, sum)
49
 	for {
49
 	for {
50
 		buf.Reset()
50
 		buf.Reset()
51
 		sum.Reset()
51
 		sum.Reset()
52
+
52
 		if _, err := io.CopyN(writer, w.parent, 4); err != nil {
53
 		if _, err := io.CopyN(writer, w.parent, 4); err != nil {
53
 			return nil, fmt.Errorf("cannot read frame padding: %w", err)
54
 			return nil, fmt.Errorf("cannot read frame padding: %w", err)
54
 		}
55
 		}
56
+
55
 		if !bytes.Equal(buf.Bytes(), mtprotoFramePadding) {
57
 		if !bytes.Equal(buf.Bytes(), mtprotoFramePadding) {
56
 			break
58
 			break
57
 		}
59
 		}
62
 		"messageLength", messageLength,
64
 		"messageLength", messageLength,
63
 		"sequence_number", w.readSeqNo,
65
 		"sequence_number", w.readSeqNo,
64
 	)
66
 	)
67
+
65
 	if messageLength%4 != 0 || messageLength < mtprotoFrameMinMessageLength ||
68
 	if messageLength%4 != 0 || messageLength < mtprotoFrameMinMessageLength ||
66
 		messageLength > mtprotoFrameMaxMessageLength {
69
 		messageLength > mtprotoFrameMaxMessageLength {
67
-		return nil, fmt.Errorf("Incorrect frame message length %d", messageLength)
70
+		return nil, fmt.Errorf("incorrect frame message length %d", messageLength)
68
 	}
71
 	}
69
 
72
 
70
 	buf.Reset()
73
 	buf.Reset()
71
 	buf.Grow(int(messageLength) - 4 - 4)
74
 	buf.Grow(int(messageLength) - 4 - 4)
75
+
72
 	if _, err := io.CopyN(writer, w.parent, int64(messageLength)-4-4); err != nil {
76
 	if _, err := io.CopyN(writer, w.parent, int64(messageLength)-4-4); err != nil {
73
 		return nil, fmt.Errorf("cannot read the message frame: %w", err)
77
 		return nil, fmt.Errorf("cannot read the message frame: %w", err)
74
 	}
78
 	}
75
 
79
 
76
 	var seqNo int32
80
 	var seqNo int32
77
-	binary.Read(buf, binary.LittleEndian, &seqNo) // nolint: errcheck, gosec
81
+
82
+	binary.Read(buf, binary.LittleEndian, &seqNo) // nolint: errcheck
83
+
78
 	if seqNo != w.readSeqNo {
84
 	if seqNo != w.readSeqNo {
79
 		return nil, fmt.Errorf("unexpected sequence number %d (wait for %d)", seqNo, w.readSeqNo)
85
 		return nil, fmt.Errorf("unexpected sequence number %d (wait for %d)", seqNo, w.readSeqNo)
80
 	}
86
 	}
110
 	buf := &bytes.Buffer{}
116
 	buf := &bytes.Buffer{}
111
 	buf.Grow(messageLength + paddingLength)
117
 	buf.Grow(messageLength + paddingLength)
112
 
118
 
113
-	binary.Write(buf, binary.LittleEndian, uint32(messageLength))
114
-	binary.Write(buf, binary.LittleEndian, w.writeSeqNo)
119
+	binary.Write(buf, binary.LittleEndian, uint32(messageLength)) // nolint: errcheck
120
+	binary.Write(buf, binary.LittleEndian, w.writeSeqNo)          // nolint: errcheck
115
 	buf.Write(p)
121
 	buf.Write(p)
116
 
122
 
117
 	checksum := crc32.ChecksumIEEE(buf.Bytes())
123
 	checksum := crc32.ChecksumIEEE(buf.Bytes())
118
-	binary.Write(buf, binary.LittleEndian, checksum)
124
+	binary.Write(buf, binary.LittleEndian, checksum) // nolint: errcheck
119
 	buf.Write(bytes.Repeat(mtprotoFramePadding, paddingLength/4))
125
 	buf.Write(bytes.Repeat(mtprotoFramePadding, paddingLength/4))
120
 
126
 
121
 	w.logger.Debugw("Write MTProto frame",
127
 	w.logger.Debugw("Write MTProto frame",

+ 10
- 1
wrappers/packetack/client_abridged.go View File

26
 	buf := bytes.Buffer{}
26
 	buf := bytes.Buffer{}
27
 
27
 
28
 	buf.Grow(1)
28
 	buf.Grow(1)
29
+
29
 	if _, err := io.CopyN(&buf, w.parent, 1); err != nil {
30
 	if _, err := io.CopyN(&buf, w.parent, 1); err != nil {
30
 		return nil, fmt.Errorf("cannot read message length: %w", err)
31
 		return nil, fmt.Errorf("cannot read message length: %w", err)
31
 	}
32
 	}
33
+
32
 	msgLength := uint32(buf.Bytes()[0])
34
 	msgLength := uint32(buf.Bytes()[0])
33
 	buf.Reset()
35
 	buf.Reset()
34
 
36
 
39
 
41
 
40
 	if msgLength == clientAbridgedSmallPacketLength {
42
 	if msgLength == clientAbridgedSmallPacketLength {
41
 		buf.Grow(3)
43
 		buf.Grow(3)
44
+
42
 		if _, err := io.CopyN(&buf, w.parent, 3); err != nil {
45
 		if _, err := io.CopyN(&buf, w.parent, 3); err != nil {
43
 			return nil, fmt.Errorf("cannot read correct message length: %w", err)
46
 			return nil, fmt.Errorf("cannot read correct message length: %w", err)
44
 		}
47
 		}
48
+
45
 		number := utils.Uint24{}
49
 		number := utils.Uint24{}
46
 		copy(number[:], buf.Bytes())
50
 		copy(number[:], buf.Bytes())
47
 		msgLength = utils.FromUint24(number)
51
 		msgLength = utils.FromUint24(number)
48
 	}
52
 	}
53
+
49
 	msgLength *= 4
54
 	msgLength *= 4
50
 
55
 
51
 	buf.Reset()
56
 	buf.Reset()
52
 	buf.Grow(int(msgLength))
57
 	buf.Grow(int(msgLength))
58
+
53
 	if _, err := io.CopyN(&buf, w.parent, int64(msgLength)); err != nil {
59
 	if _, err := io.CopyN(&buf, w.parent, int64(msgLength)); err != nil {
54
 		return nil, fmt.Errorf("cannot read message: %w", err)
60
 		return nil, fmt.Errorf("cannot read message: %w", err)
55
 	}
61
 	}
66
 		if _, err := w.parent.Write(utils.ReverseBytes(packet)); err != nil {
72
 		if _, err := w.parent.Write(utils.ReverseBytes(packet)); err != nil {
67
 			return fmt.Errorf("cannot send a simpleacked packet: %w", err)
73
 			return fmt.Errorf("cannot send a simpleacked packet: %w", err)
68
 		}
74
 		}
75
+
69
 		return nil
76
 		return nil
70
 	}
77
 	}
71
 
78
 
72
 	packetLength := len(packet) / 4
79
 	packetLength := len(packet) / 4
80
+
73
 	switch {
81
 	switch {
74
 	case packetLength < clientAbridgedSmallPacketLength:
82
 	case packetLength < clientAbridgedSmallPacketLength:
75
 		data := append([]byte{byte(packetLength)}, packet...)
83
 		data := append([]byte{byte(packetLength)}, packet...)
76
 		if _, err := w.parent.Write(data); err != nil {
84
 		if _, err := w.parent.Write(data); err != nil {
77
 			return fmt.Errorf("cannot send small packet: %w", err)
85
 			return fmt.Errorf("cannot send small packet: %w", err)
78
 		}
86
 		}
79
-		return nil
80
 
87
 
88
+		return nil
81
 	case packetLength < clientAbridgedLargePacketLength:
89
 	case packetLength < clientAbridgedLargePacketLength:
82
 		length24 := utils.ToUint24(uint32(packetLength))
90
 		length24 := utils.ToUint24(uint32(packetLength))
83
 		buf := bytes.Buffer{}
91
 		buf := bytes.Buffer{}
89
 		if _, err := w.parent.Write(buf.Bytes()); err != nil {
97
 		if _, err := w.parent.Write(buf.Bytes()); err != nil {
90
 			return fmt.Errorf("cannot send large packet: %w", err)
98
 			return fmt.Errorf("cannot send large packet: %w", err)
91
 		}
99
 		}
100
+
92
 		return nil
101
 		return nil
93
 	}
102
 	}
94
 
103
 

+ 5
- 0
wrappers/packetack/client_intermediate.go View File

22
 	buf := bytes.Buffer{}
22
 	buf := bytes.Buffer{}
23
 
23
 
24
 	buf.Grow(4)
24
 	buf.Grow(4)
25
+
25
 	if _, err := io.CopyN(&buf, w.parent, 4); err != nil {
26
 	if _, err := io.CopyN(&buf, w.parent, 4); err != nil {
26
 		return nil, fmt.Errorf("cannot read message length: %w", err)
27
 		return nil, fmt.Errorf("cannot read message length: %w", err)
27
 	}
28
 	}
29
+
28
 	length := binary.LittleEndian.Uint32(buf.Bytes())
30
 	length := binary.LittleEndian.Uint32(buf.Bytes())
29
 
31
 
30
 	if length > clientIntermediateQuickAckLength {
32
 	if length > clientIntermediateQuickAckLength {
34
 
36
 
35
 	buf.Reset()
37
 	buf.Reset()
36
 	buf.Grow(int(length))
38
 	buf.Grow(int(length))
39
+
37
 	if _, err := io.CopyN(&buf, w.parent, int64(length)); err != nil {
40
 	if _, err := io.CopyN(&buf, w.parent, int64(length)); err != nil {
38
 		return nil, fmt.Errorf("cannot read the message: %w", err)
41
 		return nil, fmt.Errorf("cannot read the message: %w", err)
39
 	}
42
 	}
46
 		if _, err := w.parent.Write(packet); err != nil {
49
 		if _, err := w.parent.Write(packet); err != nil {
47
 			return fmt.Errorf("cannot send simpleacked packet: %w", err)
50
 			return fmt.Errorf("cannot send simpleacked packet: %w", err)
48
 		}
51
 		}
52
+
49
 		return nil
53
 		return nil
50
 	}
54
 	}
51
 
55
 
55
 	if _, err := w.parent.Write(append(length[:], packet...)); err != nil {
59
 	if _, err := w.parent.Write(append(length[:], packet...)); err != nil {
56
 		return fmt.Errorf("cannot send packet: %w", err)
60
 		return fmt.Errorf("cannot send packet: %w", err)
57
 	}
61
 	}
62
+
58
 	return nil
63
 	return nil
59
 }
64
 }
60
 
65
 

+ 4
- 1
wrappers/packetack/client_intermediate_secure.go View File

20
 	if err != nil {
20
 	if err != nil {
21
 		return nil, err
21
 		return nil, err
22
 	}
22
 	}
23
+
23
 	length := len(data) - (len(data) % 4)
24
 	length := len(data) - (len(data) % 4)
24
 
25
 
25
 	return data[:length], nil
26
 	return data[:length], nil
30
 		if _, err := w.parent.Write(packet); err != nil {
31
 		if _, err := w.parent.Write(packet); err != nil {
31
 			return fmt.Errorf("cannot send simpleacked packet: %w", err)
32
 			return fmt.Errorf("cannot send simpleacked packet: %w", err)
32
 		}
33
 		}
34
+
33
 		return nil
35
 		return nil
34
 	}
36
 	}
35
 
37
 
37
 	paddingLength := rand.Intn(4)
39
 	paddingLength := rand.Intn(4)
38
 	buf.Grow(4 + len(packet) + paddingLength)
40
 	buf.Grow(4 + len(packet) + paddingLength)
39
 
41
 
40
-	binary.Write(&buf, binary.LittleEndian, uint32(len(packet)+paddingLength))
42
+	binary.Write(&buf, binary.LittleEndian, uint32(len(packet)+paddingLength)) // nolint: errcheck
41
 	buf.Write(packet)
43
 	buf.Write(packet)
42
 	buf.Write(make([]byte, paddingLength))
44
 	buf.Write(make([]byte, paddingLength))
43
 
45
 
44
 	if _, err := w.parent.Write(buf.Bytes()); err != nil {
46
 	if _, err := w.parent.Write(buf.Bytes()); err != nil {
45
 		return fmt.Errorf("cannot send packet: %w", err)
47
 		return fmt.Errorf("cannot send packet: %w", err)
46
 	}
48
 	}
49
+
47
 	return nil
50
 	return nil
48
 }
51
 }
49
 
52
 

+ 3
- 1
wrappers/packetack/proxy.go View File

15
 )
15
 )
16
 
16
 
17
 type wrapperProxy struct {
17
 type wrapperProxy struct {
18
-	flags        rpc.ProxyRequestFlags
19
 	request      *protocol.TelegramRequest
18
 	request      *protocol.TelegramRequest
20
 	clientIPPort []byte
19
 	clientIPPort []byte
21
 	ourIPPort    []byte
20
 	ourIPPort    []byte
22
 	channelRead  hub.ChannelReadCloser
21
 	channelRead  hub.ChannelReadCloser
23
 	closeOnce    sync.Once
22
 	closeOnce    sync.Once
23
+	flags        rpc.ProxyRequestFlags
24
 }
24
 }
25
 
25
 
26
 func (w *wrapperProxy) Write(packet conntypes.Packet, acks *conntypes.ConnectionAcks) error {
26
 func (w *wrapperProxy) Write(packet conntypes.Packet, acks *conntypes.ConnectionAcks) error {
30
 	if acks.Quick {
30
 	if acks.Quick {
31
 		flags |= rpc.ProxyRequestFlagsQuickAck
31
 		flags |= rpc.ProxyRequestFlagsQuickAck
32
 	}
32
 	}
33
+
33
 	if bytes.HasPrefix(packet, rpc.ProxyRequestFlagsEncryptedPrefix[:]) {
34
 	if bytes.HasPrefix(packet, rpc.ProxyRequestFlagsEncryptedPrefix[:]) {
34
 		flags |= rpc.ProxyRequestFlagsEncrypted
35
 		flags |= rpc.ProxyRequestFlagsEncrypted
35
 	}
36
 	}
67
 		w.channelRead.Close()
68
 		w.channelRead.Close()
68
 		hub.Registry.Unregister(w.request.ConnID)
69
 		hub.Registry.Unregister(w.request.ConnID)
69
 	})
70
 	})
71
+
70
 	return nil
72
 	return nil
71
 }
73
 }
72
 
74
 

+ 3
- 0
wrappers/stream/blockcipher.go View File

27
 	if err != nil {
27
 	if err != nil {
28
 		return 0, err
28
 		return 0, err
29
 	}
29
 	}
30
+
30
 	return w.parent.Write(encrypted)
31
 	return w.parent.Write(encrypted)
31
 }
32
 }
32
 
33
 
35
 	if err != nil {
36
 	if err != nil {
36
 		return 0, err
37
 		return 0, err
37
 	}
38
 	}
39
+
38
 	return w.parent.WriteTimeout(encrypted, timeout)
40
 	return w.parent.WriteTimeout(encrypted, timeout)
39
 }
41
 }
40
 
42
 
49
 		if err != nil {
51
 		if err != nil {
50
 			return 0, fmt.Errorf("cannot read data: %w", err)
52
 			return 0, fmt.Errorf("cannot read data: %w", err)
51
 		}
53
 		}
54
+
52
 		currentBuffer = append(currentBuffer, rv...)
55
 		currentBuffer = append(currentBuffer, rv...)
53
 	}
56
 	}
54
 
57
 

+ 2
- 0
wrappers/stream/conn.go View File

38
 func (w *wrapperConn) Write(p []byte) (int, error) {
38
 func (w *wrapperConn) Write(p []byte) (int, error) {
39
 	n, err := w.parent.Write(p)
39
 	n, err := w.parent.Write(p)
40
 	w.logger.Debugw("write to stream", "bytes", n, "error", err)
40
 	w.logger.Debugw("write to stream", "bytes", n, "error", err)
41
+
41
 	if err != nil {
42
 	if err != nil {
42
 		w.Close() // nolint: gosec
43
 		w.Close() // nolint: gosec
43
 	}
44
 	}
57
 func (w *wrapperConn) Read(p []byte) (int, error) {
58
 func (w *wrapperConn) Read(p []byte) (int, error) {
58
 	n, err := w.parent.Read(p)
59
 	n, err := w.parent.Read(p)
59
 	w.logger.Debugw("Read from stream", "bytes", n, "error", err)
60
 	w.logger.Debugw("Read from stream", "bytes", n, "error", err)
61
+
60
 	if err != nil {
62
 	if err != nil {
61
 		w.Close()
63
 		w.Close()
62
 	}
64
 	}

+ 6
- 2
wrappers/stream/mtproto_cipher.go View File

4
 	"bytes"
4
 	"bytes"
5
 	"crypto/aes"
5
 	"crypto/aes"
6
 	"crypto/cipher"
6
 	"crypto/cipher"
7
-	"crypto/md5"
8
-	"crypto/sha1"
7
+	"crypto/md5"  // nolint: gosec
8
+	"crypto/sha1" // nolint: gosec
9
 	"encoding/binary"
9
 	"encoding/binary"
10
 	"net"
10
 	"net"
11
 
11
 
61
 
61
 
62
 	clientIPv4 := mtprotoEmptyIP[:]
62
 	clientIPv4 := mtprotoEmptyIP[:]
63
 	serverIPv4 := mtprotoEmptyIP[:]
63
 	serverIPv4 := mtprotoEmptyIP[:]
64
+
64
 	if client.IP.To4() != nil {
65
 	if client.IP.To4() != nil {
65
 		clientIPv4 = utils.ReverseBytes(client.IP.To4())
66
 		clientIPv4 = utils.ReverseBytes(client.IP.To4())
66
 		serverIPv4 = utils.ReverseBytes(remote.IP.To4())
67
 		serverIPv4 = utils.ReverseBytes(remote.IP.To4())
67
 	}
68
 	}
69
+
68
 	message.Write(serverIPv4) // nolint: gosec
70
 	message.Write(serverIPv4) // nolint: gosec
69
 
71
 
70
 	var port [2]byte
72
 	var port [2]byte
73
+
71
 	binary.LittleEndian.PutUint16(port[:], uint16(client.Port))
74
 	binary.LittleEndian.PutUint16(port[:], uint16(client.Port))
72
 	message.Write(port[:]) // nolint: gosec
75
 	message.Write(port[:]) // nolint: gosec
73
 
76
 
90
 		message.Write(client.IP.To16()) // nolint: gosec
93
 		message.Write(client.IP.To16()) // nolint: gosec
91
 		message.Write(remote.IP.To16()) // nolint: gosec
94
 		message.Write(remote.IP.To16()) // nolint: gosec
92
 	}
95
 	}
96
+
93
 	message.Write(req.Nonce) // nolint: gosec
97
 	message.Write(req.Nonce) // nolint: gosec
94
 
98
 
95
 	data := message.Bytes()
99
 	data := message.Bytes()

+ 2
- 0
wrappers/stream/obfuscated2.go View File

22
 	if err != nil {
22
 	if err != nil {
23
 		return 0, fmt.Errorf("cannot read stream ciphered data: %w", err)
23
 		return 0, fmt.Errorf("cannot read stream ciphered data: %w", err)
24
 	}
24
 	}
25
+
25
 	w.decryptor.XORKeyStream(p, p[:n])
26
 	w.decryptor.XORKeyStream(p, p[:n])
26
 
27
 
27
 	return n, nil
28
 	return n, nil
32
 	if err != nil {
33
 	if err != nil {
33
 		return n, err
34
 		return n, err
34
 	}
35
 	}
36
+
35
 	w.decryptor.XORKeyStream(p, p[:n])
37
 	w.decryptor.XORKeyStream(p, p[:n])
36
 
38
 
37
 	return n, nil
39
 	return n, nil

+ 1
- 0
wrappers/stream/stats_telegram.go View File

65
 		parent: parent,
65
 		parent: parent,
66
 		dc:     dc,
66
 		dc:     dc,
67
 	}
67
 	}
68
+
68
 	stats.Stats.TelegramConnected(dc, parent.RemoteAddr())
69
 	stats.Stats.TelegramConnected(dc, parent.RemoteAddr())
69
 
70
 
70
 	return conn
71
 	return conn

Loading…
Cancel
Save