diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 15b26e7..075e662 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -30,10 +30,7 @@ jobs: strategy: matrix: go_version: - - ~1.14 - - ~1.15 - - ~1.16 - - ^1.17 + - ^1.18 steps: - name: Checkout uses: actions/checkout@v2 @@ -73,12 +70,12 @@ jobs: - name: Run linter uses: golangci/golangci-lint-action@v2 with: - version: v1.42.0 + version: v1.45.0 docker: name: Docker runs-on: ubuntu-latest - timeout-minutes: 15 + timeout-minutes: 20 steps: - name: Checkout uses: actions/checkout@v2 diff --git a/.golangci.toml b/.golangci.toml index 04dcc43..a595c75 100644 --- a/.golangci.toml +++ b/.golangci.toml @@ -3,11 +3,10 @@ concurrency = 4 deadline = "2m" tests = true skip-dirs = ["vendor"] -skip-files = ["version.go"] [output] format = "colored-line-number" [linters] enable-all = true -disable = ["gochecknoglobals", "gas", "gomnd", "goerr113", "exhaustivestruct"] +disable = ["thelper", "ireturn", "varnamelen", "gochecknoglobals", "gas", "goerr113", "exhaustivestruct", "containedctx"] diff --git a/Dockerfile b/Dockerfile index a689217..93fe091 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ ############################################################################### # BUILD STAGE -FROM golang:1.17-alpine AS build +FROM golang:1.18-alpine AS build RUN set -x \ && apk --no-cache --update add \ diff --git a/Makefile b/Makefile index 7a9fa1e..d82d8d1 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ APP_NAME := $(IMAGE_NAME) CC_BINARIES := $(shell bash -c "echo -n $(APP_NAME)-{linux,freebsd,openbsd}-{386,amd64} $(APP_NAME)-linux-{arm,arm64}") -GOLANGCI_LINT_VERSION := v1.42.0 +GOLANGCI_LINT_VERSION := v1.45.0 VERSION_GO := $(shell go version) VERSION_DATE := $(shell date -Ru) @@ -73,8 +73,12 @@ docker: doc: @$(GOTOOL) godoc -http 0.0.0.0:10000 +.PHONY: fmt +fmt: + @$(GOTOOL) gofumpt -w -extra "$(ROOT_DIR)" + .PHONY: install-tools -install-tools: install-tools-lint install-tools-godoc +install-tools: install-tools-lint install-tools-godoc install-tools-gofumpt .PHONY: install-tools-lint install-tools-lint: @@ -87,6 +91,10 @@ install-tools-godoc: @mkdir -p "$(GOBIN)" || true && \ $(GOTOOL) go get -u golang.org/x/tools/cmd/godoc +.PHONY: install-tools-gofumpt +install-tools-gofumpt: .bin + @$(GOTOOL) go install mvdan.cc/gofumpt@latest + .PHONY: update-deps upgrade-deps: $go get -u && go mod tidy diff --git a/config/config.go b/config/config.go index b5a0209..ab8c2f2 100644 --- a/config/config.go +++ b/config/config.go @@ -146,7 +146,7 @@ func (c *Config) adjustProxyValue(value int) int { fvalue := float64(value) - newValue := fvalue * 2 * math.Log(float64(c.MultiplexPerConnection)) + newValue := fvalue * 2 * math.Log(float64(c.MultiplexPerConnection)) // nolint: gomnd newValue = math.Ceil(newValue) newValue = math.Max(fvalue, newValue) @@ -208,15 +208,15 @@ func Init(options ...Opt) error { // nolint: gocyclo, funlen, cyclop case OptionTypeStatsdTags: C.StatsdTags = opt.Value.(map[string]string) // nolint: forcetypeassert case OptionTypeWriteBufferSize: - C.WriteBuffer = int(opt.Value.(units.Base2Bytes)) + C.WriteBuffer = int(opt.Value.(units.Base2Bytes)) // nolint: forcetypeassert case OptionTypeReadBufferSize: - C.ReadBuffer = int(opt.Value.(units.Base2Bytes)) + C.ReadBuffer = int(opt.Value.(units.Base2Bytes)) // nolint: forcetypeassert case OptionTypeCloakPort: - C.CloakPort = int(opt.Value.(uint16)) + C.CloakPort = int(opt.Value.(uint16)) // nolint: forcetypeassert case OptionTypeAntiReplayMaxSize: - C.AntiReplayMaxSize = int(opt.Value.(units.Base2Bytes)) + C.AntiReplayMaxSize = int(opt.Value.(units.Base2Bytes)) // nolint: forcetypeassert case OptionTypeMultiplexPerConnection: - C.MultiplexPerConnection = int(opt.Value.(uint)) + C.MultiplexPerConnection = int(opt.Value.(uint)) // nolint: forcetypeassert case OptionTypeNTPServers: C.NTPServers = opt.Value.([]string) // nolint: forcetypeassert if len(C.NTPServers) == 0 { diff --git a/faketls/cloak.go b/faketls/cloak.go index b134de8..fb9f5e4 100644 --- a/faketls/cloak.go +++ b/faketls/cloak.go @@ -26,7 +26,7 @@ func cloak(one, another io.ReadWriteCloser) { another = rwc.NewPing(ctx, another, channelPing) wg := &sync.WaitGroup{} - wg.Add(2) + wg.Add(2) // nolint: gomnd go cloakPipe(one, another, wg) diff --git a/go.mod b/go.mod index fe48397..4447ee8 100644 --- a/go.mod +++ b/go.mod @@ -13,10 +13,10 @@ require ( github.com/smira/go-statsd v1.3.2 go.uber.org/multierr v1.7.0 // indirect go.uber.org/zap v1.19.0 - golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 - golang.org/x/net v0.0.0-20210525063256-abc453219eb5 // indirect - golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40 - golang.org/x/tools v0.1.0 // indirect + golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 + golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect + golang.org/x/sys v0.0.0-20220318055525-2edf467146b5 + golang.org/x/tools v0.1.10 // indirect google.golang.org/protobuf v1.27.1 // indirect gopkg.in/alecthomas/kingpin.v2 v2.2.6 ) @@ -28,5 +28,8 @@ require ( github.com/golang/protobuf v1.5.2 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/prometheus/client_model v0.2.0 // indirect + github.com/yuin/goldmark v1.4.10 // indirect go.uber.org/atomic v1.9.0 // indirect + golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect ) diff --git a/go.sum b/go.sum index 21eb9b6..2903a22 100644 --- a/go.sum +++ b/go.sum @@ -206,6 +206,8 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.10 h1:+WgKGo8CQrlMTRJpGCFCyNddOhW801TKC2QijVV9QVg= +github.com/yuin/goldmark v1.4.10/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -229,6 +231,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -260,6 +264,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -291,6 +297,8 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -347,6 +355,8 @@ golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40 h1:JWgyZ1qgdTaF3N3oxC+MdTV7qvEEgHo3otj+HB5CM7Q= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220318055525-2edf467146b5 h1:saXMvIOKvRFwbOMicHXr0B1uwoxq9dGmLe5ExMES6c4= +golang.org/x/sys v0.0.0-20220318055525-2edf467146b5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -401,6 +411,8 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/hub/hub.go b/hub/hub.go index db81ded..3be2560 100644 --- a/hub/hub.go +++ b/hub/hub.go @@ -18,7 +18,7 @@ func (h *hub) Register(req *protocol.TelegramRequest) (*ProxyConn, error) { } func (h *hub) getMux(req *protocol.TelegramRequest) *mux { - key := 32767 + int32(req.ClientProtocol.DC()) + 100000*int32(req.ClientProtocol.ConnectionProtocol()) + key := 32767 + int32(req.ClientProtocol.DC()) + 100000*int32(req.ClientProtocol.ConnectionProtocol()) // nolint: gomnd h.mutex.RLock() m, ok := h.muxes[key] diff --git a/mtproto/rpc/handshake_response.go b/mtproto/rpc/handshake_response.go index dc25109..8eed5c5 100644 --- a/mtproto/rpc/handshake_response.go +++ b/mtproto/rpc/handshake_response.go @@ -41,7 +41,7 @@ func (r *HandshakeResponse) Valid() error { // NewHandshakeResponse constructs new handshake response from the given // data. func NewHandshakeResponse(data []byte) (*HandshakeResponse, error) { - if len(data) != 32 { + if len(data) != 32 { // nolint: gomnd return nil, fmt.Errorf("incorrect handshake response length %d", len(data)) } diff --git a/mtproto/rpc/nonce_request.go b/mtproto/rpc/nonce_request.go index 8a06c26..393b30c 100644 --- a/mtproto/rpc/nonce_request.go +++ b/mtproto/rpc/nonce_request.go @@ -29,17 +29,17 @@ func (r *NonceRequest) Bytes() []byte { // NewNonceRequest builds new none request based on proxy secret. func NewNonceRequest(proxySecret []byte) (*NonceRequest, error) { - nonce := make([]byte, 16) - keySelector := make([]byte, 4) - cryptoTS := make([]byte, 4) + nonce := make([]byte, 16) // nolint: gomnd + keySelector := make([]byte, 4) // nolint: gomnd + cryptoTS := make([]byte, 4) // nolint: gomnd if _, err := rand.Read(nonce); err != nil { return nil, fmt.Errorf("cannot generate nonce: %w", err) } copy(keySelector, proxySecret) - - timestamp := time.Now().Truncate(time.Second).Unix() % 4294967296 // 256 ^ 4 - do not know how to name + // 256 ^ 4 - do not know how to name + timestamp := time.Now().Truncate(time.Second).Unix() % 4294967296 // nolint: gomnd binary.LittleEndian.PutUint32(cryptoTS, uint32(timestamp)) return &NonceRequest{ diff --git a/mtproto/rpc/nonce_response.go b/mtproto/rpc/nonce_response.go index a6d831e..2b0a96c 100644 --- a/mtproto/rpc/nonce_response.go +++ b/mtproto/rpc/nonce_response.go @@ -44,7 +44,7 @@ func (r *NonceResponse) Valid(req *NonceRequest) error { // NewNonceResponse build new nonce response based on the given data. func NewNonceResponse(data []byte) (*NonceResponse, error) { - if len(data) != 32 { + if len(data) != 32 { // nolint: gomnd return nil, fmt.Errorf("unexpected message length %d", len(data)) } diff --git a/mtproto/rpc/proxy_flags.go b/mtproto/rpc/proxy_flags.go index 2179c66..995d55e 100644 --- a/mtproto/rpc/proxy_flags.go +++ b/mtproto/rpc/proxy_flags.go @@ -21,14 +21,14 @@ const ( var ProxyRequestFlagsEncryptedPrefix [8]byte func (r ProxyRequestFlags) Bytes() []byte { - converted := make([]byte, 4) + converted := make([]byte, 4) // nolint: gomnd binary.LittleEndian.PutUint32(converted, uint32(r)) return converted } func (r ProxyRequestFlags) String() string { - flags := make([]string, 0, 7) + flags := make([]string, 0, 7) // nolint: gomnd if r&ProxyRequestFlagsHasAdTag != 0 { flags = append(flags, "HAS_AD_TAG") diff --git a/mtproto/rpc/proxy_response.go b/mtproto/rpc/proxy_response.go index 5366f34..f00361c 100644 --- a/mtproto/rpc/proxy_response.go +++ b/mtproto/rpc/proxy_response.go @@ -24,7 +24,7 @@ type ProxyResponse struct { func ParseProxyResponse(packet conntypes.Packet) (*ProxyResponse, error) { var response ProxyResponse - if len(packet) < 4 { + if len(packet) < 4 { // nolint: gomnd return nil, fmt.Errorf("incorrect packet length: %d", len(packet)) } diff --git a/obfuscated2/telegram_protocol.go b/obfuscated2/telegram_protocol.go index cf17099..ce25730 100644 --- a/obfuscated2/telegram_protocol.go +++ b/obfuscated2/telegram_protocol.go @@ -47,17 +47,17 @@ func generateFrame(cp protocol.ClientProtocol) (fm Frame) { continue } - if data[0] == 0xef { + if data[0] == 0xef { // nolint: gomnd continue } - val := (uint32(data[3]) << 24) | (uint32(data[2]) << 16) | (uint32(data[1]) << 8) | uint32(data[0]) - if val == 0x44414548 || val == 0x54534f50 || val == 0x20544547 || val == 0x4954504f || val == 0xeeeeeeee { + val := (uint32(data[3]) << 24) | (uint32(data[2]) << 16) | (uint32(data[1]) << 8) | uint32(data[0]) // nolint: gomnd, lll + if val == 0x44414548 || val == 0x54534f50 || val == 0x20544547 || val == 0x4954504f || val == 0xeeeeeeee { // nolint: lll continue } - val = (uint32(data[7]) << 24) | (uint32(data[6]) << 16) | (uint32(data[5]) << 8) | uint32(data[4]) - if val == 0x00000000 { + val = (uint32(data[7]) << 24) | (uint32(data[6]) << 16) | (uint32(data[5]) << 8) | uint32(data[4]) // nolint: gomnd + if val == 0x00000000 { // nolint: gomnd continue } diff --git a/proxy/direct.go b/proxy/direct.go index 8a817bd..981ad2a 100644 --- a/proxy/direct.go +++ b/proxy/direct.go @@ -20,7 +20,7 @@ func directConnection(request *protocol.TelegramRequest) error { defer telegramConnRaw.Close() wg := &sync.WaitGroup{} - wg.Add(2) + wg.Add(2) // nolint: gomnd go directPipe(telegramConnRaw, request.ClientConn, wg, request.Logger) diff --git a/proxy/middle.go b/proxy/middle.go index 7f56991..ce83238 100644 --- a/proxy/middle.go +++ b/proxy/middle.go @@ -32,7 +32,7 @@ func middleConnection(request *protocol.TelegramRequest) { } wg := &sync.WaitGroup{} - wg.Add(2) + wg.Add(2) // nolint: gomnd go middlePipe(telegramConn, clientConn, wg, request.Logger) @@ -44,7 +44,8 @@ func middleConnection(request *protocol.TelegramRequest) { func middlePipe(dst conntypes.PacketAckWriteCloser, src conntypes.PacketAckReadCloser, wg *sync.WaitGroup, - logger *zap.SugaredLogger) { + logger *zap.SugaredLogger, +) { defer func() { dst.Close() src.Close() diff --git a/stats/stats.go b/stats/stats.go index 80a3250..f856148 100644 --- a/stats/stats.go +++ b/stats/stats.go @@ -32,7 +32,7 @@ func Init(ctx context.Context) error { go func() { <-ctx.Done() - srv.Shutdown(context.Background()) // nolint: errcheck + srv.Shutdown(context.Background()) // nolint: errcheck, contextcheck }() Stats = multiStats(stats) diff --git a/stats/stats_prometheus.go b/stats/stats_prometheus.go index 687c635..adb46d8 100644 --- a/stats/stats_prometheus.go +++ b/stats/stats_prometheus.go @@ -39,7 +39,8 @@ func (s *statsPrometheus) ClientDisconnected(connectionType conntypes.Connection func (s *statsPrometheus) changeConnections(connectionType conntypes.ConnectionType, addr *net.TCPAddr, - increment float64) { + increment float64, +) { labels := [...]string{ "intermediate", "ipv4", diff --git a/stats/stats_statsd.go b/stats/stats_statsd.go index 26fce1c..9f12153 100644 --- a/stats/stats_statsd.go +++ b/stats/stats_statsd.go @@ -83,7 +83,7 @@ func (s *statsStatsd) ClientDisconnected(connectionType conntypes.ConnectionType } func (s *statsStatsd) changeConnections(connectionType conntypes.ConnectionType, addr *net.TCPAddr, increment int64) { - tags := make([]*statsStatsdTag, 0, 2) + tags := make([]*statsStatsdTag, 0, 2) // nolint: gomnd switch connectionType { case conntypes.ConnectionTypeAbridged: @@ -194,8 +194,8 @@ func newStatsStatsd() Interface { return &statsStatsd{ seen: make(map[string]struct{}), client: statsd.NewClient(config.C.StatsdAddr.String(), - statsd.SendLoopCount(2), - statsd.ReconnectInterval(10*time.Second), + statsd.SendLoopCount(2), // nolint: gomnd + statsd.ReconnectInterval(10*time.Second), // nolint: gomnd statsd.Logger(logger), statsd.MetricPrefix(prefix), statsd.TagStyle(config.C.StatsdTagsFormat), diff --git a/telegram/api/addresses.go b/telegram/api/addresses.go index c7573e4..a6737e3 100644 --- a/telegram/api/addresses.go +++ b/telegram/api/addresses.go @@ -74,12 +74,12 @@ func getAddresses(url string) (map[conntypes.DC][]string, conntypes.DC, error) { } func addressesParseProxyFor(text string) (string, conntypes.DC, error) { - chunks := addressesProxyForSplitter.Split(text, 3) + chunks := addressesProxyForSplitter.Split(text, 3) // nolint: gomnd if len(chunks) != 3 || chunks[0] != "proxy_for" { return "", 0, fmt.Errorf("incorrect config %s", text) } - dc, err := strconv.ParseInt(chunks[1], 10, 16) + dc, err := strconv.ParseInt(chunks[1], 10, 16) // nolint: gomnd if err != nil { return "", 0, fmt.Errorf("incorrect config '%s': %w", text, err) } @@ -93,14 +93,14 @@ func addressesParseProxyFor(text string) (string, conntypes.DC, error) { } func addressesParseDefault(text string) (conntypes.DC, error) { - chunks := addressesProxyForSplitter.Split(text, 2) + chunks := addressesProxyForSplitter.Split(text, 2) // nolint: gomnd if len(chunks) != 2 || chunks[0] != "default" { return 0, fmt.Errorf("incorrect config '%s'", text) } dcString := strings.TrimRight(chunks[1], ";") - dc, err := strconv.ParseInt(dcString, 10, 16) + dc, err := strconv.ParseInt(dcString, 10, 16) // nolint: gomnd if err != nil { return 0, fmt.Errorf("incorrect config '%s': %w", text, err) } diff --git a/telegram/base.go b/telegram/base.go index 4a6c383..f741c9a 100644 --- a/telegram/base.go +++ b/telegram/base.go @@ -28,7 +28,8 @@ func (b *baseTelegram) Secret() []byte { } func (b *baseTelegram) dial(dc conntypes.DC, - protocol conntypes.ConnectionProtocol) (conntypes.StreamReadWriteCloser, error) { + protocol conntypes.ConnectionProtocol, +) (conntypes.StreamReadWriteCloser, error) { for _, addr := range b.getAddresses(dc, protocol) { conn, err := b.dialer.Dial("tcp", addr) if err != nil { @@ -50,7 +51,7 @@ func (b *baseTelegram) dial(dc conntypes.DC, } func (b *baseTelegram) getAddresses(dc conntypes.DC, protocol conntypes.ConnectionProtocol) []string { - addresses := make([]string, 0, 2) + addresses := make([]string, 0, 2) // nolint: gomnd protos := []conntypes.ConnectionProtocol{ conntypes.ConnectionProtocolIPv6, conntypes.ConnectionProtocolIPv4, @@ -74,7 +75,8 @@ func (b *baseTelegram) getAddresses(dc conntypes.DC, protocol conntypes.Connecti } func (b *baseTelegram) chooseAddress(addresses map[conntypes.DC][]string, - dc, defaultDC conntypes.DC) string { + dc, defaultDC conntypes.DC, +) string { addrs, ok := addresses[dc] if !ok { addrs = addresses[defaultDC] diff --git a/telegram/direct.go b/telegram/direct.go index 5a7183c..34a8bd6 100644 --- a/telegram/direct.go +++ b/telegram/direct.go @@ -29,7 +29,8 @@ type directTelegram struct { } func (d *directTelegram) Dial(dc conntypes.DC, - protocol conntypes.ConnectionProtocol) (conntypes.StreamReadWriteCloser, error) { + protocol conntypes.ConnectionProtocol, +) (conntypes.StreamReadWriteCloser, error) { switch { case dc < 0: dc = -dc diff --git a/telegram/middle.go b/telegram/middle.go index 3683f4d..556082f 100644 --- a/telegram/middle.go +++ b/telegram/middle.go @@ -63,7 +63,8 @@ func (m *middleTelegram) backgroundUpdate() { } func (m *middleTelegram) Dial(dc conntypes.DC, - protocol conntypes.ConnectionProtocol) (conntypes.StreamReadWriteCloser, error) { + protocol conntypes.ConnectionProtocol, +) (conntypes.StreamReadWriteCloser, error) { if dc == 0 { dc = conntypes.DCDefaultIdx } diff --git a/tlstypes/server_hello.go b/tlstypes/server_hello.go index e1000af..be5cca1 100644 --- a/tlstypes/server_hello.go +++ b/tlstypes/server_hello.go @@ -36,7 +36,7 @@ func (s ServerHello) WelcomePacket() []byte { } recChangeCipher.WriteBytes(buf) - hostCert := make([]byte, 1024+mrand.Intn(3092)) // nolint: gosec + hostCert := make([]byte, 1024+mrand.Intn(3092)) // nolint: gosec, gomnd rand.Read(hostCert) // nolint: errcheck recData := Record{ @@ -67,7 +67,7 @@ func NewServerHello(clientHello *ClientHello) *ServerHello { copy(rv.SessionID, clientHello.SessionID) tail := bytes.NewBuffer(CipherSuiteType_TLS_AES_128_GCM_SHA256_Bytes) - tail.WriteByte(0x00) // no compression + tail.WriteByte(0x00) // nolint: gomnd // no compression makeTLSExtensions(tail) rv.Tail = RawBytes(tail.Bytes()) diff --git a/utils/init_tcp.go b/utils/init_tcp.go index 2152759..69dc67d 100644 --- a/utils/init_tcp.go +++ b/utils/init_tcp.go @@ -5,7 +5,7 @@ import ( "net" ) -func InitTCP(conn net.Conn, readBufferSize int, writeBufferSize int) error { +func InitTCP(conn net.Conn, readBufferSize, writeBufferSize int) error { tcpConn := conn.(*net.TCPConn) // nolint: forcetypeassert if err := tcpConn.SetNoDelay(true); err != nil { diff --git a/utils/reverse_bytes.go b/utils/reverse_bytes.go index 87ad8f6..d1a9496 100644 --- a/utils/reverse_bytes.go +++ b/utils/reverse_bytes.go @@ -6,7 +6,7 @@ func ReverseBytes(data []byte) []byte { rv := make([]byte, dataLen) rv[dataLen/2] = data[dataLen/2] - for i := dataLen/2 - 1; i >= 0; i-- { + for i := dataLen/2 - 1; i >= 0; i-- { // nolint: gomnd opp := dataLen - i - 1 rv[i], rv[opp] = data[opp], data[i] } diff --git a/utils/uint24.go b/utils/uint24.go index 350f3d5..cf7516c 100644 --- a/utils/uint24.go +++ b/utils/uint24.go @@ -3,9 +3,9 @@ package utils type Uint24 [3]byte func ToUint24(number uint32) Uint24 { - return Uint24{byte(number), byte(number >> 8), byte(number >> 16)} + return Uint24{byte(number), byte(number >> 8), byte(number >> 16)} // nolint: gomnd } func FromUint24(number Uint24) uint32 { - return uint32(number[0]) + (uint32(number[1]) << 8) + (uint32(number[2]) << 16) + return uint32(number[0]) + (uint32(number[1]) << 8) + (uint32(number[2]) << 16) // nolint: gomnd } diff --git a/wrappers/packet/mtproto_frame.go b/wrappers/packet/mtproto_frame.go index 0051c2e..79050b3 100644 --- a/wrappers/packet/mtproto_frame.go +++ b/wrappers/packet/mtproto_frame.go @@ -50,7 +50,7 @@ func (w *wrapperMtprotoFrame) Read() (conntypes.Packet, error) { // nolint: funl buf.Reset() sum.Reset() - if _, err := io.CopyN(writer, w.parent, 4); err != nil { + if _, err := io.CopyN(writer, w.parent, 4); err != nil { // nolint: gomnd return nil, fmt.Errorf("cannot read frame padding: %w", err) } @@ -72,7 +72,7 @@ func (w *wrapperMtprotoFrame) Read() (conntypes.Packet, error) { // nolint: funl buf.Reset() - if _, err := io.CopyN(writer, w.parent, int64(messageLength)-4-4); err != nil { + if _, err := io.CopyN(writer, w.parent, int64(messageLength)-4-4); err != nil { // nolint: gomnd return nil, fmt.Errorf("cannot read the message frame: %w", err) } @@ -88,7 +88,7 @@ func (w *wrapperMtprotoFrame) Read() (conntypes.Packet, error) { // nolint: funl buf.Reset() // write to buf, not to writer. This is because we are going to fetch // crc32 checksum. - if _, err := io.CopyN(buf, w.parent, 4); err != nil { + if _, err := io.CopyN(buf, w.parent, 4); err != nil { // nolint: gomnd return nil, fmt.Errorf("cannot read checksum: %w", err) } @@ -109,7 +109,7 @@ func (w *wrapperMtprotoFrame) Read() (conntypes.Packet, error) { // nolint: funl } func (w *wrapperMtprotoFrame) Write(p conntypes.Packet) error { - messageLength := 4 + 4 + len(p) + 4 + messageLength := 4 + 4 + len(p) + 4 // nolint: gomnd paddingLength := (aes.BlockSize - messageLength%aes.BlockSize) % aes.BlockSize buf := &bytes.Buffer{} @@ -119,8 +119,8 @@ func (w *wrapperMtprotoFrame) Write(p conntypes.Packet) error { buf.Write(p) checksum := crc32.ChecksumIEEE(buf.Bytes()) - binary.Write(buf, binary.LittleEndian, checksum) // nolint: errcheck - buf.Write(bytes.Repeat(mtprotoFramePadding, paddingLength/4)) + binary.Write(buf, binary.LittleEndian, checksum) // nolint: errcheck + buf.Write(bytes.Repeat(mtprotoFramePadding, paddingLength/4)) // nolint: gomnd w.logger.Debugw("Write MTProto frame", "length", len(p), diff --git a/wrappers/packetack/client_abridged.go b/wrappers/packetack/client_abridged.go index 6125604..054a559 100644 --- a/wrappers/packetack/client_abridged.go +++ b/wrappers/packetack/client_abridged.go @@ -39,9 +39,9 @@ func (w *wrapperClientAbridged) Read(acks *conntypes.ConnectionAcks) (conntypes. } if msgLength == clientAbridgedSmallPacketLength { - buf.Grow(3) + buf.Grow(3) // nolint: gomnd - if _, err := io.CopyN(&buf, w.parent, 3); err != nil { + if _, err := io.CopyN(&buf, w.parent, 3); err != nil { // nolint: gomnd return nil, fmt.Errorf("cannot read correct message length: %w", err) } @@ -75,7 +75,7 @@ func (w *wrapperClientAbridged) Write(packet conntypes.Packet, acks *conntypes.C return nil } - packetLength := len(packet) / 4 + packetLength := len(packet) / 4 // nolint: gomnd switch { case packetLength < clientAbridgedSmallPacketLength: diff --git a/wrappers/packetack/client_intermediate.go b/wrappers/packetack/client_intermediate.go index c4d69a6..fb51ad1 100644 --- a/wrappers/packetack/client_intermediate.go +++ b/wrappers/packetack/client_intermediate.go @@ -20,9 +20,9 @@ type wrapperClientIntermediate struct { func (w *wrapperClientIntermediate) Read(acks *conntypes.ConnectionAcks) (conntypes.Packet, error) { buf := bytes.Buffer{} - buf.Grow(4) + buf.Grow(4) // nolint: gomnd - if _, err := io.CopyN(&buf, w.parent, 4); err != nil { + if _, err := io.CopyN(&buf, w.parent, 4); err != nil { // nolint: gomnd return nil, fmt.Errorf("cannot read message length: %w", err) } diff --git a/wrappers/packetack/client_intermediate_secure.go b/wrappers/packetack/client_intermediate_secure.go index 1151a37..aa7085a 100644 --- a/wrappers/packetack/client_intermediate_secure.go +++ b/wrappers/packetack/client_intermediate_secure.go @@ -20,7 +20,7 @@ func (w *wrapperClientIntermediateSecure) Read(acks *conntypes.ConnectionAcks) ( return nil, err } - length := len(data) - (len(data) % 4) + length := len(data) - (len(data) % 4) // nolint: gomnd return data[:length], nil } @@ -35,7 +35,7 @@ func (w *wrapperClientIntermediateSecure) Write(packet conntypes.Packet, acks *c } buf := &bytes.Buffer{} - paddingLength := rand.Intn(4) // nolint: gosec + paddingLength := rand.Intn(4) // nolint: gosec, gomnd buf.Grow(4 + len(packet) + paddingLength) diff --git a/wrappers/packetack/proxy.go b/wrappers/packetack/proxy.go index 6910123..9426fd8 100644 --- a/wrappers/packetack/proxy.go +++ b/wrappers/packetack/proxy.go @@ -42,7 +42,7 @@ func (w *wrapperProxy) Write(packet conntypes.Packet, acks *conntypes.Connection buf.Write(rpc.ProxyRequestProxyTag) buf.WriteByte(byte(len(config.C.AdTag))) buf.Write(config.C.AdTag) - buf.Write(make([]byte, (4-buf.Len()%4)%4)) + buf.Write(make([]byte, (4-buf.Len()%4)%4)) // nolint: gomnd buf.Grow(len(packet)) buf.Write(packet) diff --git a/wrappers/stream/blockcipher.go b/wrappers/stream/blockcipher.go index 9423d65..19582c8 100644 --- a/wrappers/stream/blockcipher.go +++ b/wrappers/stream/blockcipher.go @@ -70,7 +70,8 @@ func (w *wrapperBlockCipher) RemoteAddr() *net.TCPAddr { } func newBlockCipher(parent conntypes.StreamReadWriteCloser, - encryptor, decryptor cipher.BlockMode) conntypes.StreamReadWriteCloser { + encryptor, decryptor cipher.BlockMode, +) conntypes.StreamReadWriteCloser { cipher := &wrapperBlockCipher{ parent: parent, encryptor: encryptor, diff --git a/wrappers/stream/conn.go b/wrappers/stream/conn.go index f1056d3..ba6bcd4 100644 --- a/wrappers/stream/conn.go +++ b/wrappers/stream/conn.go @@ -91,10 +91,11 @@ func (w *wrapperConn) RemoteAddr() *net.TCPAddr { func newConn(parent net.Conn, connID conntypes.ConnID, - purpose connPurpose) conntypes.StreamReadWriteCloser { - localAddr := *parent.LocalAddr().(*net.TCPAddr) + purpose connPurpose, +) conntypes.StreamReadWriteCloser { + localAddr := *parent.LocalAddr().(*net.TCPAddr) // nolint: forcetypeassert - if parent.RemoteAddr().(*net.TCPAddr).IP.To4() != nil { + if parent.RemoteAddr().(*net.TCPAddr).IP.To4() != nil { // nolint: forcetypeassert if config.C.PublicIPv4.IP != nil { localAddr.IP = config.C.PublicIPv4.IP } @@ -117,7 +118,7 @@ func newConn(parent net.Conn, parent: parent, connID: connID, logger: logger, - remoteAddr: parent.RemoteAddr().(*net.TCPAddr), + remoteAddr: parent.RemoteAddr().(*net.TCPAddr), // nolint: forcetypeassert localAddr: &localAddr, } } diff --git a/wrappers/stream/ctx.go b/wrappers/stream/ctx.go index e948d2c..9a6bb5b 100644 --- a/wrappers/stream/ctx.go +++ b/wrappers/stream/ctx.go @@ -84,7 +84,8 @@ func (w *wrapperCtx) RemoteAddr() *net.TCPAddr { func NewCtx(ctx context.Context, cancel context.CancelFunc, - parent conntypes.StreamReadWriteCloser) conntypes.StreamReadWriteCloser { + parent conntypes.StreamReadWriteCloser, +) conntypes.StreamReadWriteCloser { return &wrapperCtx{ parent: parent, ctx: ctx, diff --git a/wrappers/stream/mtproto_cipher.go b/wrappers/stream/mtproto_cipher.go index 5a59f7c..7e28ba8 100644 --- a/wrappers/stream/mtproto_cipher.go +++ b/wrappers/stream/mtproto_cipher.go @@ -26,7 +26,8 @@ var mtprotoEmptyIP = [4]byte{0x00, 0x00, 0x00, 0x00} func NewMiddleProxyCipher(parent conntypes.StreamReadWriteCloser, req *rpc.NonceRequest, resp *rpc.NonceResponse, - secret []byte) conntypes.StreamReadWriteCloser { + secret []byte, +) conntypes.StreamReadWriteCloser { localAddr := parent.LocalAddr() remoteAddr := parent.RemoteAddr() @@ -53,7 +54,8 @@ func mtprotoDeriveKeys(purpose mtprotoCipherPurpose, req *rpc.NonceRequest, resp *rpc.NonceResponse, client, remote *net.TCPAddr, - secret []byte) ([]byte, []byte) { + secret []byte, +) ([]byte, []byte) { message := bytes.Buffer{} message.Write(resp.Nonce) diff --git a/wrappers/stream/obfuscated2.go b/wrappers/stream/obfuscated2.go index 6e7cc8e..690cef9 100644 --- a/wrappers/stream/obfuscated2.go +++ b/wrappers/stream/obfuscated2.go @@ -84,7 +84,8 @@ func (w *wrapperObfuscated2) Close() error { } func NewObfuscated2(socket conntypes.StreamReadWriteCloser, - encryptor, decryptor cipher.Stream) conntypes.StreamReadWriteCloser { + encryptor, decryptor cipher.Stream, +) conntypes.StreamReadWriteCloser { return &wrapperObfuscated2{ parent: socket, encryptor: encryptor,