Switch to golangci-lint

This commit is contained in:
9seconds
2018-07-18 08:37:37 +03:00
parent c1e5c33076
commit c1b862c1e9
19 changed files with 194 additions and 112 deletions
+12
View File
@@ -0,0 +1,12 @@
[run]
concurrency = 4
deadline = "2m"
tests = true
skip-dirs = ["vendor"]
skip-files = ["version.go"]
[output]
format = "colored-line-number"
[linters]
enable-all = true
-4
View File
@@ -1,4 +0,0 @@
{
"aggregate": true,
"vendor": true
}
+2
View File
@@ -10,6 +10,8 @@ go:
- master - master
script: script:
- make prepare
- make all
- make lint - make lint
- make test - make test
Generated
+44 -4
View File
@@ -3,74 +3,97 @@
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:45a787c1adea69a03a5384865b307c7a72bb28bd5844bd57679d889a726a588b"
name = "github.com/alecthomas/template" name = "github.com/alecthomas/template"
packages = [ packages = [
".", ".",
"parse" "parse",
] ]
pruneopts = "UT"
revision = "a0175ee3bccc567396460bf5acd36800cb10c49c" revision = "a0175ee3bccc567396460bf5acd36800cb10c49c"
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:c198fdc381e898e8fb62b8eb62758195091c313ad18e52a3067366e1dda2fb3c"
name = "github.com/alecthomas/units" name = "github.com/alecthomas/units"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "2efee857e7cfd4f3d0138cc3cbb1b4966962b93a" revision = "2efee857e7cfd4f3d0138cc3cbb1b4966962b93a"
[[projects]] [[projects]]
digest = "1:a8d622a8049a4aa420e1c509873bb85d4c45c5107f420d922f919bfcb8d08694"
name = "github.com/beevik/ntp" name = "github.com/beevik/ntp"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "62c80a04de2086884d8296004b6d74ee1846c582" revision = "62c80a04de2086884d8296004b6d74ee1846c582"
version = "v0.2.0" version = "v0.2.0"
[[projects]] [[projects]]
digest = "1:a2c1d0e43bd3baaa071d1b9ed72c27d78169b2b269f71c105ac4ba34b1be4a39"
name = "github.com/davecgh/go-spew" name = "github.com/davecgh/go-spew"
packages = ["spew"] packages = ["spew"]
pruneopts = "UT"
revision = "346938d642f2ec3594ed81d874461961cd0faa76" revision = "346938d642f2ec3594ed81d874461961cd0faa76"
version = "v1.1.0" version = "v1.1.0"
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:6f9339c912bbdda81302633ad7e99a28dfa5a639c864061f1929510a9a64aa74"
name = "github.com/dustin/go-humanize" name = "github.com/dustin/go-humanize"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "9f541cc9db5d55bce703bd99987c9d5cb8eea45e" revision = "9f541cc9db5d55bce703bd99987c9d5cb8eea45e"
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:70107cf7ee5eb9e3c3dabe65bcb220bff22ee42e32d9b7fca988e16b8727cacc"
name = "github.com/juju/errors" name = "github.com/juju/errors"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "c7d06af17c68cd34c835053720b21f6549d9b0ee" revision = "c7d06af17c68cd34c835053720b21f6549d9b0ee"
[[projects]] [[projects]]
digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe"
name = "github.com/pmezard/go-difflib" name = "github.com/pmezard/go-difflib"
packages = ["difflib"] packages = ["difflib"]
pruneopts = "UT"
revision = "792786c7400a136282c1664665ae0a8db921c6c2" revision = "792786c7400a136282c1664665ae0a8db921c6c2"
version = "v1.0.0" version = "v1.0.0"
[[projects]] [[projects]]
digest = "1:274f67cb6fed9588ea2521ecdac05a6d62a8c51c074c1fccc6a49a40ba80e925"
name = "github.com/satori/go.uuid" name = "github.com/satori/go.uuid"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "f58768cc1a7a7e77a3bd49e98cdd21419399b6a3" revision = "f58768cc1a7a7e77a3bd49e98cdd21419399b6a3"
version = "v1.2.0" version = "v1.2.0"
[[projects]] [[projects]]
digest = "1:18752d0b95816a1b777505a97f71c7467a8445b8ffb55631a7bf779f6ba4fa83"
name = "github.com/stretchr/testify" name = "github.com/stretchr/testify"
packages = ["assert"] packages = ["assert"]
pruneopts = "UT"
revision = "f35b8ab0b5a2cef36673838d662e249dd9c94686" revision = "f35b8ab0b5a2cef36673838d662e249dd9c94686"
version = "v1.2.2" version = "v1.2.2"
[[projects]] [[projects]]
digest = "1:3c1a69cdae3501bf75e76d0d86dc6f2b0a7421bc205c0cb7b96b19eed464a34d"
name = "go.uber.org/atomic" name = "go.uber.org/atomic"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "1ea20fb1cbb1cc08cbd0d913a96dead89aa18289" revision = "1ea20fb1cbb1cc08cbd0d913a96dead89aa18289"
version = "v1.3.2" version = "v1.3.2"
[[projects]] [[projects]]
digest = "1:60bf2a5e347af463c42ed31a493d817f8a72f102543060ed992754e689805d1a"
name = "go.uber.org/multierr" name = "go.uber.org/multierr"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "3c4937480c32f4c13a875a1829af76c98ca3d40a" revision = "3c4937480c32f4c13a875a1829af76c98ca3d40a"
version = "v1.1.0" version = "v1.1.0"
[[projects]] [[projects]]
digest = "1:e6d865f90ef1178c14bdb49ea9f244bfcb28c06ea9773dc077492032632de0b8"
name = "go.uber.org/zap" name = "go.uber.org/zap"
packages = [ packages = [
".", ".",
@@ -78,37 +101,54 @@
"internal/bufferpool", "internal/bufferpool",
"internal/color", "internal/color",
"internal/exit", "internal/exit",
"zapcore" "zapcore",
] ]
pruneopts = "UT"
revision = "eeedf312bc6c57391d84767a4cd413f02a917974" revision = "eeedf312bc6c57391d84767a4cd413f02a917974"
version = "v1.8.0" version = "v1.8.0"
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:656046288ed20c53157025a0915f176cad9340ac515501c427806a6f76023d75"
name = "golang.org/x/net" name = "golang.org/x/net"
packages = [ packages = [
"bpf", "bpf",
"internal/iana", "internal/iana",
"internal/socket", "internal/socket",
"ipv4" "ipv4",
] ]
pruneopts = "UT"
revision = "d0887baf81f4598189d4e12a37c6da86f0bba4d0" revision = "d0887baf81f4598189d4e12a37c6da86f0bba4d0"
[[projects]] [[projects]]
digest = "1:c06d9e11d955af78ac3bbb26bd02e01d2f61f689e1a3bce2ef6fb683ef8a7f2d"
name = "gopkg.in/alecthomas/kingpin.v2" name = "gopkg.in/alecthomas/kingpin.v2"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "947dcec5ba9c011838740e680966fd7087a71d0d" revision = "947dcec5ba9c011838740e680966fd7087a71d0d"
version = "v2.2.6" version = "v2.2.6"
[[projects]] [[projects]]
digest = "1:38b469493eb173db9c03321d64adcad4c7991ea0a19b5edc5bdc094f0e8c7384"
name = "gopkg.in/alexcesaro/statsd.v2" name = "gopkg.in/alexcesaro/statsd.v2"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "7fea3f0d2fab1ad973e641e51dba45443a311a90" revision = "7fea3f0d2fab1ad973e641e51dba45443a311a90"
version = "v2.0.0" version = "v2.0.0"
[solve-meta] [solve-meta]
analyzer-name = "dep" analyzer-name = "dep"
analyzer-version = 1 analyzer-version = 1
inputs-digest = "7fad0f62feb7737b064d85cc4333a1a3e9298faec2afd864b4404f515fc7f17c" input-imports = [
"github.com/beevik/ntp",
"github.com/dustin/go-humanize",
"github.com/juju/errors",
"github.com/satori/go.uuid",
"github.com/stretchr/testify/assert",
"go.uber.org/zap",
"go.uber.org/zap/zapcore",
"gopkg.in/alecthomas/kingpin.v2",
"gopkg.in/alexcesaro/statsd.v2",
]
solver-name = "gps-cdcl" solver-name = "gps-cdcl"
solver-version = 1 solver-version = 1
+11 -10
View File
@@ -1,12 +1,13 @@
ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
IMAGE_NAME := mtg IMAGE_NAME := mtg
APP_NAME := $(IMAGE_NAME) APP_NAME := $(IMAGE_NAME)
GOMETALINTER := gometalinter
VENDOR_FILES := $(shell find "$(ROOT_DIR)/vendor" 2>/dev/null || echo -n "vendor") VENDOR_FILES := $(shell find "$(ROOT_DIR)/vendor" 2>/dev/null || echo -n "vendor")
CC_BINARIES := $(shell bash -c "echo -n $(APP_NAME)-{linux,freebsd,openbsd}-{386,amd64} $(APP_NAME)-linux-{arm,arm64}") CC_BINARIES := $(shell bash -c "echo -n $(APP_NAME)-{linux,freebsd,openbsd}-{386,amd64} $(APP_NAME)-linux-{arm,arm64}")
APP_DEPS := version.go $(VENDOR_FILES) APP_DEPS := version.go $(VENDOR_FILES)
GOLANGCI_LINT_VERSION := v1.9.1
COMMON_BUILD_FLAGS := -ldflags="-s -w" COMMON_BUILD_FLAGS := -ldflags="-s -w"
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
@@ -31,7 +32,7 @@ ccbuilds:
version.go: version.go:
@go generate main.go @go generate main.go
vendor: Gopkg.lock Gopkg.toml install-cli vendor: Gopkg.lock Gopkg.toml install-dep
@dep ensure @dep ensure
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
@@ -50,12 +51,12 @@ crosscompile-dir:
@rm -rf "$(CC_DIR)" && mkdir -p "$(CC_DIR)" @rm -rf "$(CC_DIR)" && mkdir -p "$(CC_DIR)"
.PHONY: test .PHONY: test
test: vendor install-cli version.go test: vendor version.go
@go test -v ./... @go test -v ./...
.PHONY: lint .PHONY: lint
lint: vendor install-cli version.go lint: version.go
@$(GOMETALINTER) --deadline=2m ./... @golangci-lint run
.PHONY: clean .PHONY: clean
clean: clean:
@@ -67,14 +68,14 @@ clean:
docker: docker:
@docker build --pull -t "$(IMAGE_NAME)" "$(ROOT_DIR)" @docker build --pull -t "$(IMAGE_NAME)" "$(ROOT_DIR)"
.PHONY: install-cli .PHONY: prepare
install-cli: install-dep install-lint prepare: install-dep install-lint
.PHONY: install-dep .PHONY: install-dep
install-dep: install-dep:
@go get github.com/golang/dep/cmd/dep @go get -u github.com/golang/dep/cmd/dep
.PHONY: install-lint .PHONY: install-lint
install-lint: install-lint:
@go get github.com/alecthomas/gometalinter && \ @curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh \
$(GOMETALINTER) --install >/dev/null | bash -s -- -b $(GOPATH)/bin $(GOLANGCI_LINT_VERSION)
+67 -50
View File
@@ -25,74 +25,90 @@ import (
var ( var (
app = kingpin.New("mtg", "Simple MTPROTO proxy.") app = kingpin.New("mtg", "Simple MTPROTO proxy.")
debug = app.Flag("debug", "Run in debug mode."). debug = app.Flag("debug",
"Run in debug mode.").
Short('d'). Short('d').
Envar("MTG_DEBUG"). Envar("MTG_DEBUG").
Bool() Bool()
verbose = app.Flag("verbose", "Run in verbose mode."). verbose = app.Flag("verbose",
"Run in verbose mode.").
Short('v'). Short('v').
Envar("MTG_VERBOSE"). Envar("MTG_VERBOSE").
Bool() Bool()
bindIP = app.Flag("bind-ip", "Which IP to bind to."). bindIP = app.Flag("bind-ip",
"Which IP to bind to.").
Short('b'). Short('b').
Envar("MTG_IP"). Envar("MTG_IP").
Default("127.0.0.1"). Default("127.0.0.1").
IP() IP()
bindPort = app.Flag("bind-port", "Which port to bind to."). bindPort = app.Flag("bind-port",
Short('p'). "Which port to bind to.").
Envar("MTG_PORT"). Short('p').
Default("3128"). Envar("MTG_PORT").
Uint16() Default("3128").
Uint16()
publicIPv4 = app.Flag("public-ipv4", "Which IPv4 address is public."). publicIPv4 = app.Flag("public-ipv4",
Short('4'). "Which IPv4 address is public.").
Envar("MTG_IPV4"). Short('4').
IP() Envar("MTG_IPV4").
publicIPv4Port = app.Flag("public-ipv4-port", "Which IPv4 port is public. Default is 'bind-port' value."). IP()
Envar("MTG_IPV4_PORT"). publicIPv4Port = app.Flag("public-ipv4-port",
Uint16() "Which IPv4 port is public. Default is 'bind-port' value.").
Envar("MTG_IPV4_PORT").
Uint16()
publicIPv6 = app.Flag("public-ipv6", "Which IPv6 address is public."). publicIPv6 = app.Flag("public-ipv6",
Short('6'). "Which IPv6 address is public.").
Envar("MTG_IPV6"). Short('6').
IP() Envar("MTG_IPV6").
publicIPv6Port = app.Flag("public-ipv6-port", "Which IPv6 port is public. Default is 'bind-port' value."). IP()
Envar("MTG_IPV6_PORT"). publicIPv6Port = app.Flag("public-ipv6-port",
Uint16() "Which IPv6 port is public. Default is 'bind-port' value.").
Envar("MTG_IPV6_PORT").
Uint16()
statsIP = app.Flag("stats-ip", "Which IP bind stats server to."). statsIP = app.Flag("stats-ip",
"Which IP bind stats server to.").
Short('t'). Short('t').
Envar("MTG_STATS_IP"). Envar("MTG_STATS_IP").
Default("127.0.0.1"). Default("127.0.0.1").
IP() IP()
statsPort = app.Flag("stats-port", "Which port bind stats to."). statsPort = app.Flag("stats-port",
Short('q'). "Which port bind stats to.").
Envar("MTG_STATS_PORT"). Short('q').
Default("3129"). Envar("MTG_STATS_PORT").
Uint16() Default("3129").
Uint16()
statsdIP = app.Flag("statsd-ip", "Which IP should we use for working with statsd."). statsdIP = app.Flag("statsd-ip",
Envar("MTG_STATSD_IP"). "Which IP should we use for working with statsd.").
String() Envar("MTG_STATSD_IP").
statsdPort = app.Flag("statsd-port", "Which port should we use for working with statsd."). String()
Envar("MTG_STATSD_PORT"). statsdPort = app.Flag("statsd-port",
Default("8125"). "Which port should we use for working with statsd.").
Uint16() Envar("MTG_STATSD_PORT").
statsdNetwork = app.Flag("statsd-network", "Which network is used to work with statsd. Only 'tcp' and 'udp' are supported."). Default("8125").
Envar("MTG_STATSD_NETWORK"). Uint16()
Default("udp"). statsdNetwork = app.Flag("statsd-network",
String() "Which network is used to work with statsd. Only 'tcp' and 'udp' are supported.").
statsdPrefix = app.Flag("statsd-prefix", "Which bucket prefix should we use for sending stats to statsd."). Envar("MTG_STATSD_NETWORK").
Envar("MTG_STATSD_PREFIX"). Default("udp").
Default("mtg"). String()
String() statsdPrefix = app.Flag("statsd-prefix",
statsdTagsFormat = app.Flag("statsd-tags-format", "Which tag format should we use to send stats metrics. Valid options are 'datadog' and 'influxdb'."). "Which bucket prefix should we use for sending stats to statsd.").
Envar("MTG_STATSD_TAGS_FORMAT"). Envar("MTG_STATSD_PREFIX").
String() Default("mtg").
statsdTags = app.Flag("statsd-tags", "Tags to use for working with statsd (specified as 'key=value')."). String()
Envar("MTG_STATSD_TAGS"). statsdTagsFormat = app.Flag("statsd-tags-format",
StringMap() "Which tag format should we use to send stats metrics. Valid options are 'datadog' and 'influxdb'.").
Envar("MTG_STATSD_TAGS_FORMAT").
String()
statsdTags = app.Flag("statsd-tags",
"Tags to use for working with statsd (specified as 'key=value').").
Envar("MTG_STATSD_TAGS").
StringMap()
secret = app.Arg("secret", "Secret of this proxy.").Required().String() secret = app.Arg("secret", "Secret of this proxy.").Required().String()
adtag = app.Arg("adtag", "ADTag of the proxy.").String() adtag = app.Arg("adtag", "ADTag of the proxy.").String()
@@ -150,7 +166,8 @@ func main() {
zap.S().Warnw("Could not fetch time data from NTP") zap.S().Warnw("Could not fetch time data from NTP")
} else { } else {
if diff >= time.Second { if diff >= time.Second {
usage(fmt.Sprintf("You choose to use middle proxy but your clock drift (%s) is bigger than 1 second. Please, sync your time", diff)) usage(fmt.Sprintf("You choose to use middle proxy but your clock drift (%s) "+
"is bigger than 1 second. Please, sync your time", diff))
} }
go ntp.AutoUpdate() go ntp.AutoUpdate()
} }
+7 -7
View File
@@ -9,13 +9,13 @@ type proxyRequestFlags uint32
const ( const (
proxyRequestFlagsHasAdTag proxyRequestFlags = 0x8 proxyRequestFlagsHasAdTag proxyRequestFlags = 0x8
proxyRequestFlagsEncrypted = 0x2 proxyRequestFlagsEncrypted proxyRequestFlags = 0x2
proxyRequestFlagsMagic = 0x1000 proxyRequestFlagsMagic proxyRequestFlags = 0x1000
proxyRequestFlagsExtMode2 = 0x20000 proxyRequestFlagsExtMode2 proxyRequestFlags = 0x20000
proxyRequestFlagsIntermediate = 0x20000000 proxyRequestFlagsIntermediate proxyRequestFlags = 0x20000000
proxyRequestFlagsAbdridged = 0x40000000 proxyRequestFlagsAbdridged proxyRequestFlags = 0x40000000
proxyRequestFlagsQuickAck = 0x80000000 proxyRequestFlagsQuickAck proxyRequestFlags = 0x80000000
proxyRequestFlagsPad = 0x8000000 proxyRequestFlagsPad proxyRequestFlags = 0x8000000
) )
var proxyRequestFlagsEncryptedPrefix [8]byte var proxyRequestFlagsEncryptedPrefix [8]byte
+2 -1
View File
@@ -64,7 +64,8 @@ func (r *ProxyRequest) MakeHeader(message []byte) (*bytes.Buffer, fmt.Stringer)
} }
// NewProxyRequest build new ProxyRequest data structure. // NewProxyRequest build new ProxyRequest data structure.
func NewProxyRequest(clientAddr, ownAddr *net.TCPAddr, opts *mtproto.ConnectionOpts, adTag []byte) (*ProxyRequest, error) { func NewProxyRequest(clientAddr, ownAddr *net.TCPAddr,
opts *mtproto.ConnectionOpts, adTag []byte) (*ProxyRequest, error) {
flags := proxyRequestFlagsHasAdTag | proxyRequestFlagsMagic | proxyRequestFlagsExtMode2 flags := proxyRequestFlagsHasAdTag | proxyRequestFlagsMagic | proxyRequestFlagsExtMode2
switch opts.ConnectionType { switch opts.ConnectionType {
+4 -4
View File
@@ -47,8 +47,8 @@ func TestObfs2Full(t *testing.T) {
clientFrame := generateFrame(mtproto.ConnectionTypeIntermediate) clientFrame := generateFrame(mtproto.ConnectionTypeIntermediate)
clientHasher := sha256.New() clientHasher := sha256.New()
clientHasher.Write(clientFrame.Key()) clientHasher.Write(clientFrame.Key()) // nolint: errcheck
clientHasher.Write(secret) clientHasher.Write(secret) // nolint: errcheck
clientKey := clientHasher.Sum(nil) clientKey := clientHasher.Sum(nil)
encryptor := makeStreamCipher(clientKey, clientFrame.IV()) encryptor := makeStreamCipher(clientKey, clientFrame.IV())
@@ -58,8 +58,8 @@ func TestObfs2Full(t *testing.T) {
invertedClientFrame := clientFrame.Invert() invertedClientFrame := clientFrame.Invert()
clientHasher = sha256.New() clientHasher = sha256.New()
clientHasher.Write(invertedClientFrame.Key()) clientHasher.Write(invertedClientFrame.Key()) // nolint: errcheck
clientHasher.Write(secret) clientHasher.Write(secret) // nolint: errcheck
invertedClientKey := clientHasher.Sum(nil) invertedClientKey := clientHasher.Sum(nil)
clientDecryptor := makeStreamCipher(invertedClientKey, invertedClientFrame.IV()) clientDecryptor := makeStreamCipher(invertedClientKey, invertedClientFrame.IV())
+2 -1
View File
@@ -106,7 +106,8 @@ func (p *Proxy) getTelegramConn(opts *mtproto.ConnectionOpts, connID string) (wr
return packetConn, nil return packetConn, nil
} }
func (p *Proxy) middlePipe(src wrappers.PacketReadCloser, dst io.WriteCloser, wait *sync.WaitGroup, hacks *mtproto.Hacks) { func (p *Proxy) middlePipe(src wrappers.PacketReadCloser, dst io.WriteCloser,
wait *sync.WaitGroup, hacks *mtproto.Hacks) {
defer func() { defer func() {
src.Close() // nolint: errcheck src.Close() // nolint: errcheck
dst.Close() // nolint: errcheck dst.Close() // nolint: errcheck
+1 -1
View File
@@ -13,7 +13,7 @@ import (
var instance *stats var instance *stats
// Start starts new statisitcs server. // Start starts new statistics server.
func Start(conf *config.Config) error { func Start(conf *config.Config) error {
log := zap.S().Named("stats") log := zap.S().Named("stats")
+21 -18
View File
@@ -13,18 +13,18 @@ import (
var ( var (
directV4Addresses = map[int16][]string{ directV4Addresses = map[int16][]string{
0: []string{"149.154.175.50:443"}, 0: {"149.154.175.50:443"},
1: []string{"149.154.167.51:443"}, 1: {"149.154.167.51:443"},
2: []string{"149.154.175.100:443"}, 2: {"149.154.175.100:443"},
3: []string{"149.154.167.91:443"}, 3: {"149.154.167.91:443"},
4: []string{"149.154.171.5:443"}, 4: {"149.154.171.5:443"},
} }
directV6Addresses = map[int16][]string{ directV6Addresses = map[int16][]string{
0: []string{"[2001:b28:f23d:f001::a]:443"}, 0: {"[2001:b28:f23d:f001::a]:443"},
1: []string{"[2001:67c:04e8:f002::a]:443"}, 1: {"[2001:67c:04e8:f002::a]:443"},
2: []string{"[2001:b28:f23d:f003::a]:443"}, 2: {"[2001:b28:f23d:f003::a]:443"},
3: []string{"[2001:67c:04e8:f004::a]:443"}, 3: {"[2001:67c:04e8:f004::a]:443"},
4: []string{"[2001:b28:f23f:f005::a]:443"}, 4: {"[2001:b28:f23f:f005::a]:443"},
} }
) )
@@ -43,7 +43,8 @@ func (t *directTelegram) Dial(connID string, connOpts *mtproto.ConnectionOpts) (
return t.baseTelegram.dial(dc-1, connID, connOpts.ConnectionProto) return t.baseTelegram.dial(dc-1, connID, connOpts.ConnectionProto)
} }
func (t *directTelegram) Init(connOpts *mtproto.ConnectionOpts, conn wrappers.StreamReadWriteCloser) (wrappers.Wrap, error) { func (t *directTelegram) Init(connOpts *mtproto.ConnectionOpts,
conn wrappers.StreamReadWriteCloser) (wrappers.Wrap, error) {
obfs2, frame := obfuscated2.MakeTelegramObfuscated2Frame(connOpts) obfs2, frame := obfuscated2.MakeTelegramObfuscated2Frame(connOpts)
if _, err := conn.Write(frame); err != nil { if _, err := conn.Write(frame); err != nil {
@@ -56,12 +57,14 @@ func (t *directTelegram) Init(connOpts *mtproto.ConnectionOpts, conn wrappers.St
// NewDirectTelegram returns Telegram instance which connects directly // NewDirectTelegram returns Telegram instance which connects directly
// to Telegram bypassing middleproxies. // to Telegram bypassing middleproxies.
func NewDirectTelegram(conf *config.Config) Telegram { func NewDirectTelegram(conf *config.Config) Telegram {
return &directTelegram{baseTelegram{ return &directTelegram{
dialer: tgDialer{ baseTelegram: baseTelegram{
Dialer: net.Dialer{Timeout: telegramDialTimeout}, dialer: tgDialer{
conf: conf, Dialer: net.Dialer{Timeout: telegramDialTimeout},
conf: conf,
},
v4Addresses: directV4Addresses,
v6Addresses: directV6Addresses,
}, },
v4Addresses: directV4Addresses, }
v6Addresses: directV6Addresses,
}}
} }
+6 -3
View File
@@ -20,7 +20,8 @@ type middleTelegram struct {
conf *config.Config conf *config.Config
} }
func (t *middleTelegram) Init(connOpts *mtproto.ConnectionOpts, conn wrappers.StreamReadWriteCloser) (wrappers.Wrap, error) { func (t *middleTelegram) Init(connOpts *mtproto.ConnectionOpts,
conn wrappers.StreamReadWriteCloser) (wrappers.Wrap, error) {
rpcNonceConn := wrappers.NewMTProtoFrame(conn, rpc.SeqNoNonce) rpcNonceConn := wrappers.NewMTProtoFrame(conn, rpc.SeqNoNonce)
rpcNonceReq, err := t.sendRPCNonceRequest(rpcNonceConn) rpcNonceReq, err := t.sendRPCNonceRequest(rpcNonceConn)
@@ -65,7 +66,8 @@ func (t *middleTelegram) sendRPCNonceRequest(conn io.Writer) (*rpc.NonceRequest,
return rpcNonceReq, nil return rpcNonceReq, nil
} }
func (t *middleTelegram) receiveRPCNonceResponse(conn wrappers.PacketReader, req *rpc.NonceRequest) (*rpc.NonceResponse, error) { func (t *middleTelegram) receiveRPCNonceResponse(conn wrappers.PacketReader,
req *rpc.NonceRequest) (*rpc.NonceResponse, error) {
packet, err := conn.Read() packet, err := conn.Read()
if err != nil { if err != nil {
return nil, errors.Annotate(err, "Cannot read RPC nonce response") return nil, errors.Annotate(err, "Cannot read RPC nonce response")
@@ -91,7 +93,8 @@ func (t *middleTelegram) sendRPCHandshakeRequest(conn io.Writer) (*rpc.Handshake
return req, nil return req, nil
} }
func (t *middleTelegram) receiveRPCHandshakeResponse(conn wrappers.PacketReader, req *rpc.HandshakeRequest) (*rpc.HandshakeResponse, error) { func (t *middleTelegram) receiveRPCHandshakeResponse(conn wrappers.PacketReader,
req *rpc.HandshakeRequest) (*rpc.HandshakeResponse, error) {
packet, err := conn.Read() packet, err := conn.Read()
if err != nil { if err != nil {
return nil, errors.Annotate(err, "Cannot read RPC handshake response") return nil, errors.Annotate(err, "Cannot read RPC handshake response")
+2 -1
View File
@@ -38,7 +38,8 @@ type middleTelegramCaller struct {
httpClient *http.Client httpClient *http.Client
} }
func (t *middleTelegramCaller) Dial(connID string, connOpts *mtproto.ConnectionOpts) (wrappers.StreamReadWriteCloser, error) { func (t *middleTelegramCaller) Dial(connID string,
connOpts *mtproto.ConnectionOpts) (wrappers.StreamReadWriteCloser, error) {
dc := connOpts.DC dc := connOpts.DC
if dc == 0 { if dc == 0 {
dc = 1 dc = 1
+2 -1
View File
@@ -22,7 +22,8 @@ type baseTelegram struct {
v6Addresses map[int16][]string v6Addresses map[int16][]string
} }
func (b *baseTelegram) dial(dcIdx int16, connID string, proto mtproto.ConnectionProtocol) (wrappers.StreamReadWriteCloser, error) { func (b *baseTelegram) dial(dcIdx int16, connID string,
proto mtproto.ConnectionProtocol) (wrappers.StreamReadWriteCloser, error) {
addrs := make([]string, 2) addrs := make([]string, 2)
if proto&mtproto.ConnectionProtocolIPv6 != 0 { if proto&mtproto.ConnectionProtocolIPv6 != 0 {
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"github.com/9seconds/mtg/stats" "github.com/9seconds/mtg/stats"
) )
// ConnPurpose is intented to be identifier of connection purpose. We // ConnPurpose is intended to be identifier of connection purpose. We
// sometimes want to treat client/telegram connection differently (for // sometimes want to treat client/telegram connection differently (for
// logging for example). // logging for example).
type ConnPurpose uint8 type ConnPurpose uint8
+4 -2
View File
@@ -24,7 +24,8 @@ var emptyIP = [4]byte{0x00, 0x00, 0x00, 0x00}
// NewMiddleProxyCipher creates new block cipher to proxy<->telegram // NewMiddleProxyCipher creates new block cipher to proxy<->telegram
// connection. // connection.
func NewMiddleProxyCipher(conn StreamReadWriteCloser, req *rpc.NonceRequest, resp *rpc.NonceResponse, secret []byte) StreamReadWriteCloser { func NewMiddleProxyCipher(conn StreamReadWriteCloser,
req *rpc.NonceRequest, resp *rpc.NonceResponse, secret []byte) StreamReadWriteCloser {
localAddr := conn.LocalAddr() localAddr := conn.LocalAddr()
remoteAddr := conn.RemoteAddr() remoteAddr := conn.RemoteAddr()
@@ -37,7 +38,8 @@ func NewMiddleProxyCipher(conn StreamReadWriteCloser, req *rpc.NonceRequest, res
return NewBlockCipher(conn, enc, dec) return NewBlockCipher(conn, enc, dec)
} }
func deriveKeys(purpose cipherPurpose, req *rpc.NonceRequest, resp *rpc.NonceResponse, client *net.TCPAddr, remote *net.TCPAddr, secret []byte) ([]byte, []byte) { func deriveKeys(purpose cipherPurpose, req *rpc.NonceRequest, resp *rpc.NonceResponse,
client, remote *net.TCPAddr, secret []byte) ([]byte, []byte) {
message := bytes.Buffer{} message := bytes.Buffer{}
message.Write(resp.Nonce[:]) message.Write(resp.Nonce[:])
message.Write(req.Nonce[:]) message.Write(req.Nonce[:])
+2 -1
View File
@@ -61,7 +61,8 @@ func (m *MTProtoFrame) Read() ([]byte, error) { // nolint: gocyclo
"messageLength", messageLength, "messageLength", messageLength,
"sequence_number", m.readSeqNo, "sequence_number", m.readSeqNo,
) )
if messageLength%4 != 0 || messageLength < mtprotoFrameMinMessageLength || messageLength > mtprotoFrameMaxMessageLength { if messageLength%4 != 0 || messageLength < mtprotoFrameMinMessageLength ||
messageLength > mtprotoFrameMaxMessageLength {
return nil, errors.Errorf("Incorrect frame message length %d", messageLength) return nil, errors.Errorf("Incorrect frame message length %d", messageLength)
} }
+4 -3
View File
@@ -56,7 +56,7 @@ func (m *MTProtoProxy) Read() ([]byte, error) {
case bytes.Equal(tag, rpc.TagSimpleAck): case bytes.Equal(tag, rpc.TagSimpleAck):
return m.readSimpleAck(packet) return m.readSimpleAck(packet)
case bytes.Equal(tag, rpc.TagCloseExt): case bytes.Equal(tag, rpc.TagCloseExt):
return m.readCloseExt(packet) return m.readCloseExt()
} }
return nil, errors.Errorf("Unknown RPC answer %v", tag) return nil, errors.Errorf("Unknown RPC answer %v", tag)
@@ -91,7 +91,7 @@ func (m *MTProtoProxy) readSimpleAck(data []byte) ([]byte, error) {
return data, nil return data, nil
} }
func (m *MTProtoProxy) readCloseExt(data []byte) ([]byte, error) { func (m *MTProtoProxy) readCloseExt() ([]byte, error) {
m.logger.Debugw("Read RPC_CLOSE_EXT", "counter", m.readCounter) m.logger.Debugw("Read RPC_CLOSE_EXT", "counter", m.readCounter)
return nil, errors.New("Connection has been closed remotely by RPC call") return nil, errors.New("Connection has been closed remotely by RPC call")
@@ -150,7 +150,8 @@ func (m *MTProtoProxy) Close() error {
} }
// NewMTProtoProxy creates new RPC wrapper. // NewMTProtoProxy creates new RPC wrapper.
func NewMTProtoProxy(conn PacketReadWriteCloser, connOpts *mtproto.ConnectionOpts, adTag []byte) (PacketReadWriteCloser, error) { func NewMTProtoProxy(conn PacketReadWriteCloser, connOpts *mtproto.ConnectionOpts,
adTag []byte) (PacketReadWriteCloser, error) {
req, err := rpc.NewProxyRequest(connOpts.ClientAddr, conn.LocalAddr(), connOpts, adTag) req, err := rpc.NewProxyRequest(connOpts.ClientAddr, conn.LocalAddr(), connOpts, adTag)
if err != nil { if err != nil {
return nil, errors.Annotate(err, "Cannot create new RPC proxy request") return nil, errors.Annotate(err, "Cannot create new RPC proxy request")