Parcourir la source

linting the code

tags/1.0^2
9seconds il y a 6 ans
Parent
révision
5009859a1e
50 fichiers modifiés avec 172 ajouts et 55 suppressions
  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 Voir le fichier

@@ -4,7 +4,7 @@ APP_NAME     := $(IMAGE_NAME)
4 4
 
5 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 9
 VERSION_GO         := $(shell go version)
10 10
 VERSION_DATE       := $(shell date -Ru)
@@ -51,10 +51,6 @@ crosscompile: $(CC_BINARIES)
51 51
 crosscompile-dir:
52 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 54
 .PHONY: lint
59 55
 lint: vendor
60 56
 	@$(MOD_OFF) golangci-lint run

+ 1
- 0
cli/generate.go Voir le fichier

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

+ 10
- 2
cli/proxy.go Voir le fichier

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

+ 1
- 0
cli/utils.go Voir le fichier

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

+ 8
- 4
config/config.go Voir le fichier

@@ -23,6 +23,7 @@ func (s SecretMode) String() string {
23 23
 	case SecretModeSecured:
24 24
 		return "secured"
25 25
 	}
26
+
26 27
 	return "tls"
27 28
 }
28 29
 
@@ -135,7 +136,7 @@ func Init(options ...Opt) error { // nolint: gocyclo, funlen
135 136
 			case "influxdb":
136 137
 				C.StatsdTagsFormat = statsd.InfluxDB
137 138
 			default:
138
-				return fmt.Errorf("Incorrect statsd tag %s", value)
139
+				return fmt.Errorf("incorrect statsd tag %s", value)
139 140
 			}
140 141
 		case OptionTypeStatsdTags:
141 142
 			C.StatsdTags = opt.Value.(map[string]string)
@@ -152,7 +153,7 @@ func Init(options ...Opt) error { // nolint: gocyclo, funlen
152 153
 		case OptionTypeAdtag:
153 154
 			C.AdTag = opt.Value.([]byte)
154 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,7 +164,7 @@ func Init(options ...Opt) error { // nolint: gocyclo, funlen
163 164
 	case len(C.Secret) == SimpleSecretLength:
164 165
 		C.SecretMode = SecretModeSimple
165 166
 	default:
166
-		return errors.New("Incorrect secret")
167
+		return errors.New("incorrect secret")
167 168
 	}
168 169
 
169 170
 	return nil
@@ -173,11 +174,13 @@ func InitPublicAddress(ctx context.Context) error {
173 174
 	if C.PublicIPv4.Port == 0 {
174 175
 		C.PublicIPv4.Port = C.Bind.Port
175 176
 	}
177
+
176 178
 	if C.PublicIPv6.Port == 0 {
177 179
 		C.PublicIPv6.Port = C.Bind.Port
178 180
 	}
179 181
 
180 182
 	foundAddress := C.PublicIPv4.IP != nil || C.PublicIPv6.IP != nil
183
+
181 184
 	if C.PublicIPv4.IP == nil {
182 185
 		ip, err := getGlobalIPv4(ctx)
183 186
 		if err != nil {
@@ -187,6 +190,7 @@ func InitPublicAddress(ctx context.Context) error {
187 190
 			foundAddress = true
188 191
 		}
189 192
 	}
193
+
190 194
 	if C.PublicIPv6.IP == nil {
191 195
 		ip, err := getGlobalIPv6(ctx)
192 196
 		if err != nil {
@@ -198,7 +202,7 @@ func InitPublicAddress(ctx context.Context) error {
198 202
 	}
199 203
 
200 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 208
 	return nil

+ 5
- 0
config/global_ips.go Voir le fichier

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

+ 1
- 0
config/urls.go Voir le fichier

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

+ 1
- 0
conntypes/protocol.go Voir le fichier

@@ -9,6 +9,7 @@ func (c ConnectionProtocol) String() string {
9 9
 	case ConnectionProtocolIPv4:
10 10
 		return "ipv4"
11 11
 	}
12
+
12 13
 	return "ipv6"
13 14
 }
14 15
 

+ 0
- 2
conntypes/wrappers.go Voir le fichier

@@ -1,2 +0,0 @@
1
-package conntypes
2
-

+ 2
- 0
hub/connection.go Voir le fichier

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

+ 5
- 1
hub/connection_hub.go Voir le fichier

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

+ 2
- 0
hub/ctx_channel.go Voir le fichier

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

+ 3
- 2
hub/hub.go Voir le fichier

@@ -42,9 +42,9 @@ func (h *hub) Write(packet conntypes.Packet, req *protocol.TelegramRequest) erro
42 42
 
43 43
 func (h *hub) getHub(req *protocol.TelegramRequest) *connectionHub {
44 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 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 48
 	key := keyBuilder.String()
49 49
 
50 50
 	h.mutex.RLock()
@@ -60,6 +60,7 @@ func (h *hub) getHub(req *protocol.TelegramRequest) *connectionHub {
60 60
 			h.logger.Debugw("Create new connection hub",
61 61
 				"dc", req.ClientProtocol.DC(),
62 62
 				"protocol", req.ClientProtocol.ConnectionProtocol())
63
+
63 64
 			rv = newConnectionHub(h.logger.With(
64 65
 				"dc", req.ClientProtocol.DC(),
65 66
 				"protocol", req.ClientProtocol.ConnectionProtocol(),

+ 1
- 0
hub/registry.go Voir le fichier

@@ -40,5 +40,6 @@ func (r *registry) getChannel(id conntypes.ConnID) (*ctxChannel, bool) {
40 40
 	if value, ok := r.conns[string(id[:])]; ok {
41 41
 		return value, true
42 42
 	}
43
+
43 44
 	return nil, false
44 45
 }

+ 0
- 1
main.go Voir le fichier

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

+ 11
- 5
mtproto/protocol.go Voir le fichier

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

+ 4
- 3
mtproto/rpc/handshake_response.go Voir le fichier

@@ -28,10 +28,11 @@ func (r *HandshakeResponse) Bytes() []byte {
28 28
 // Valid checks that handshake response compliments request.
29 29
 func (r *HandshakeResponse) Valid() error {
30 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 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 38
 	return nil
@@ -41,7 +42,7 @@ func (r *HandshakeResponse) Valid() error {
41 42
 // data.
42 43
 func NewHandshakeResponse(data []byte) (*HandshakeResponse, error) {
43 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 48
 	return &HandshakeResponse{

+ 1
- 0
mtproto/rpc/nonce_request.go Voir le fichier

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

+ 6
- 4
mtproto/rpc/nonce_response.go Voir le fichier

@@ -28,13 +28,15 @@ func (r *NonceResponse) Bytes() []byte {
28 28
 
29 29
 func (r *NonceResponse) Valid(req *NonceRequest) error {
30 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 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 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 42
 	return nil
@@ -43,7 +45,7 @@ func (r *NonceResponse) Valid(req *NonceRequest) error {
43 45
 // NewNonceResponse build new nonce response based on the given data.
44 46
 func NewNonceResponse(data []byte) (*NonceResponse, error) {
45 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 51
 	return &NonceResponse{

+ 7
- 0
mtproto/rpc/proxy_flags.go Voir le fichier

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

+ 4
- 2
mtproto/rpc/proxy_response.go Voir le fichier

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

+ 3
- 1
ntp/ntp.go Voir le fichier

@@ -21,15 +21,17 @@ var ntpEndpoints = [...]string{
21 21
 // Fetch fetches the data on time drift.
22 22
 func Fetch() (time.Duration, error) {
23 23
 	url := ntpEndpoints[rand.Intn(len(ntpEndpoints))]
24
+
24 25
 	resp, err := ntp.Query(url)
25 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 30
 	offsetInt := int64(resp.ClockOffset)
30 31
 	if offsetInt < 0 {
31 32
 		offsetInt = -offsetInt
32 33
 	}
34
+
33 35
 	offset := time.Duration(offsetInt)
34 36
 
35 37
 	return offset, nil

+ 5
- 2
obfuscated2/client_protocol.go Voir le fichier

@@ -58,6 +58,7 @@ func (c *ClientProtocol) Handshake(socket conntypes.StreamReadWriteCloser) (conn
58 58
 	decryptor.XORKeyStream(decryptedFrame.Bytes(), fm.Bytes())
59 59
 
60 60
 	magic := decryptedFrame.Magic()
61
+
61 62
 	switch {
62 63
 	case bytes.Equal(magic, conntypes.ConnectionTagAbridged):
63 64
 		c.connectionType = conntypes.ConnectionTypeAbridged
@@ -66,7 +67,7 @@ func (c *ClientProtocol) Handshake(socket conntypes.StreamReadWriteCloser) (conn
66 67
 	case bytes.Equal(magic, conntypes.ConnectionTagSecure):
67 68
 		c.connectionType = conntypes.ConnectionTypeSecure
68 69
 	default:
69
-		return nil, errors.New("Unknown connection type")
70
+		return nil, errors.New("unknown connection type")
70 71
 	}
71 72
 
72 73
 	c.connectionProtocol = conntypes.ConnectionProtocolIPv4
@@ -81,8 +82,9 @@ func (c *ClientProtocol) Handshake(socket conntypes.StreamReadWriteCloser) (conn
81 82
 
82 83
 	antiReplayKey := decryptedFrame.Unique()
83 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 88
 	antireplay.Cache.Add(antiReplayKey)
87 89
 
88 90
 	return stream.NewObfuscated2(socket, encryptor, decryptor), nil
@@ -92,6 +94,7 @@ func (c *ClientProtocol) ReadFrame(socket conntypes.StreamReader) (fm Frame, err
92 94
 	if _, err = io.ReadFull(handshakeReader{socket}, fm.Bytes()); err != nil {
93 95
 		err = fmt.Errorf("cannot extract obfuscated2 frame: %w", err)
94 96
 	}
97
+
95 98
 	return
96 99
 }
97 100
 

+ 2
- 0
obfuscated2/telegram_protocol.go Voir le fichier

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

+ 3
- 0
proxy/direct.go Voir le fichier

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

+ 4
- 3
proxy/middle.go Voir le fichier

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

+ 6
- 1
proxy/proxy.go Voir le fichier

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

+ 4
- 0
stats/stats.go Voir le fichier

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

+ 4
- 0
stats/stats_prometheus.go Voir le fichier

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

+ 1
- 0
stats/stats_statsd.go Voir le fichier

@@ -96,6 +96,7 @@ func newStatsStatsd() (Interface, error) {
96 96
 		for k, v := range config.C.StatsdTags {
97 97
 			tags = append(tags, k, v)
98 98
 		}
99
+
99 100
 		options = append(options, statsd.Tags(tags...))
100 101
 	}
101 102
 

+ 6
- 3
telegram/api/addresses.go Voir le fichier

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

+ 3
- 1
telegram/api/api.go Voir le fichier

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

+ 1
- 0
telegram/api/secret.go Voir le fichier

@@ -12,6 +12,7 @@ func Secret() ([]byte, error) {
12 12
 	if err != nil {
13 13
 		return nil, fmt.Errorf("cannot access telegram server: %w", err)
14 14
 	}
15
+
15 16
 	defer resp.Close()
16 17
 
17 18
 	secret, err := ioutil.ReadAll(resp)

+ 1
- 1
telegram/base.go Voir le fichier

@@ -51,7 +51,7 @@ func (b *baseTelegram) chooseAddress(addresses map[conntypes.DC][]string,
51 51
 	dc, defaultDC conntypes.DC) string {
52 52
 	addrs, ok := addresses[dc]
53 53
 	if !ok {
54
-		addrs, _ = addresses[defaultDC]
54
+		addrs = addresses[defaultDC]
55 55
 	}
56 56
 
57 57
 	switch {

+ 1
- 0
telegram/middle.go Voir le fichier

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

+ 2
- 0
utils/init_tcp.go Voir le fichier

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

+ 1
- 0
utils/read_full.go Voir le fichier

@@ -13,6 +13,7 @@ func ReadFull(src io.Reader) (rv []byte, err error) {
13 13
 		if err != nil {
14 14
 			return nil, err
15 15
 		}
16
+
16 17
 		rv = append(rv, buf[:n]...)
17 18
 	}
18 19
 

+ 1
- 1
utils/reverse_bytes.go Voir le fichier

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

+ 1
- 0
utils/rlimit.go Voir le fichier

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

+ 1
- 0
utils/signal_context.go Voir le fichier

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

+ 12
- 6
wrappers/packet/mtproto_frame.go Voir le fichier

@@ -41,7 +41,7 @@ type wrapperMtprotoFrame struct {
41 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 45
 	buf := &bytes.Buffer{}
46 46
 	sum := crc32.NewIEEE()
47 47
 	writer := io.MultiWriter(buf, sum)
@@ -49,9 +49,11 @@ func (w *wrapperMtprotoFrame) Read() (conntypes.Packet, error) {
49 49
 	for {
50 50
 		buf.Reset()
51 51
 		sum.Reset()
52
+
52 53
 		if _, err := io.CopyN(writer, w.parent, 4); err != nil {
53 54
 			return nil, fmt.Errorf("cannot read frame padding: %w", err)
54 55
 		}
56
+
55 57
 		if !bytes.Equal(buf.Bytes(), mtprotoFramePadding) {
56 58
 			break
57 59
 		}
@@ -62,19 +64,23 @@ func (w *wrapperMtprotoFrame) Read() (conntypes.Packet, error) {
62 64
 		"messageLength", messageLength,
63 65
 		"sequence_number", w.readSeqNo,
64 66
 	)
67
+
65 68
 	if messageLength%4 != 0 || messageLength < mtprotoFrameMinMessageLength ||
66 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 73
 	buf.Reset()
71 74
 	buf.Grow(int(messageLength) - 4 - 4)
75
+
72 76
 	if _, err := io.CopyN(writer, w.parent, int64(messageLength)-4-4); err != nil {
73 77
 		return nil, fmt.Errorf("cannot read the message frame: %w", err)
74 78
 	}
75 79
 
76 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 84
 	if seqNo != w.readSeqNo {
79 85
 		return nil, fmt.Errorf("unexpected sequence number %d (wait for %d)", seqNo, w.readSeqNo)
80 86
 	}
@@ -110,12 +116,12 @@ func (w *wrapperMtprotoFrame) Write(p conntypes.Packet) error {
110 116
 	buf := &bytes.Buffer{}
111 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 121
 	buf.Write(p)
116 122
 
117 123
 	checksum := crc32.ChecksumIEEE(buf.Bytes())
118
-	binary.Write(buf, binary.LittleEndian, checksum)
124
+	binary.Write(buf, binary.LittleEndian, checksum) // nolint: errcheck
119 125
 	buf.Write(bytes.Repeat(mtprotoFramePadding, paddingLength/4))
120 126
 
121 127
 	w.logger.Debugw("Write MTProto frame",

+ 10
- 1
wrappers/packetack/client_abridged.go Voir le fichier

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

+ 5
- 0
wrappers/packetack/client_intermediate.go Voir le fichier

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

+ 4
- 1
wrappers/packetack/client_intermediate_secure.go Voir le fichier

@@ -20,6 +20,7 @@ func (w *wrapperClientIntermediateSecure) Read(acks *conntypes.ConnectionAcks) (
20 20
 	if err != nil {
21 21
 		return nil, err
22 22
 	}
23
+
23 24
 	length := len(data) - (len(data) % 4)
24 25
 
25 26
 	return data[:length], nil
@@ -30,6 +31,7 @@ func (w *wrapperClientIntermediateSecure) Write(packet conntypes.Packet, acks *c
30 31
 		if _, err := w.parent.Write(packet); err != nil {
31 32
 			return fmt.Errorf("cannot send simpleacked packet: %w", err)
32 33
 		}
34
+
33 35
 		return nil
34 36
 	}
35 37
 
@@ -37,13 +39,14 @@ func (w *wrapperClientIntermediateSecure) Write(packet conntypes.Packet, acks *c
37 39
 	paddingLength := rand.Intn(4)
38 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 43
 	buf.Write(packet)
42 44
 	buf.Write(make([]byte, paddingLength))
43 45
 
44 46
 	if _, err := w.parent.Write(buf.Bytes()); err != nil {
45 47
 		return fmt.Errorf("cannot send packet: %w", err)
46 48
 	}
49
+
47 50
 	return nil
48 51
 }
49 52
 

+ 3
- 1
wrappers/packetack/proxy.go Voir le fichier

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

+ 3
- 0
wrappers/stream/blockcipher.go Voir le fichier

@@ -27,6 +27,7 @@ func (w *wrapperBlockCipher) Write(p []byte) (int, error) {
27 27
 	if err != nil {
28 28
 		return 0, err
29 29
 	}
30
+
30 31
 	return w.parent.Write(encrypted)
31 32
 }
32 33
 
@@ -35,6 +36,7 @@ func (w *wrapperBlockCipher) WriteTimeout(p []byte, timeout time.Duration) (int,
35 36
 	if err != nil {
36 37
 		return 0, err
37 38
 	}
39
+
38 40
 	return w.parent.WriteTimeout(encrypted, timeout)
39 41
 }
40 42
 
@@ -49,6 +51,7 @@ func (w *wrapperBlockCipher) Read(p []byte) (int, error) {
49 51
 		if err != nil {
50 52
 			return 0, fmt.Errorf("cannot read data: %w", err)
51 53
 		}
54
+
52 55
 		currentBuffer = append(currentBuffer, rv...)
53 56
 	}
54 57
 

+ 2
- 0
wrappers/stream/conn.go Voir le fichier

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

+ 6
- 2
wrappers/stream/mtproto_cipher.go Voir le fichier

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

+ 2
- 0
wrappers/stream/obfuscated2.go Voir le fichier

@@ -22,6 +22,7 @@ func (w *wrapperObfuscated2) ReadTimeout(p []byte, timeout time.Duration) (int,
22 22
 	if err != nil {
23 23
 		return 0, fmt.Errorf("cannot read stream ciphered data: %w", err)
24 24
 	}
25
+
25 26
 	w.decryptor.XORKeyStream(p, p[:n])
26 27
 
27 28
 	return n, nil
@@ -32,6 +33,7 @@ func (w *wrapperObfuscated2) Read(p []byte) (int, error) {
32 33
 	if err != nil {
33 34
 		return n, err
34 35
 	}
36
+
35 37
 	w.decryptor.XORKeyStream(p, p[:n])
36 38
 
37 39
 	return n, nil

+ 1
- 0
wrappers/stream/stats_telegram.go Voir le fichier

@@ -65,6 +65,7 @@ func NewTelegramStats(dc conntypes.DC, parent conntypes.StreamReadWriteCloser) c
65 65
 		parent: parent,
66 66
 		dc:     dc,
67 67
 	}
68
+
68 69
 	stats.Stats.TelegramConnected(dc, parent.RemoteAddr())
69 70
 
70 71
 	return conn

Chargement…
Annuler
Enregistrer