mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-08-31 22:34:02 +03:00
Fix linters
This commit is contained in:
@@ -7,4 +7,5 @@ import (
|
|||||||
"github.com/9seconds/mtg/config"
|
"github.com/9seconds/mtg/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Init has to initialize client connection based on given config.
|
||||||
type Init func(net.Conn, *config.Config) (int16, io.ReadWriteCloser, error)
|
type Init func(net.Conn, *config.Config) (int16, io.ReadWriteCloser, error)
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
"github.com/9seconds/mtg/wrappers"
|
"github.com/9seconds/mtg/wrappers"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// DirectInit initializes client to access Telegram bypassing middleproxies.
|
||||||
func DirectInit(conn net.Conn, conf *config.Config) (int16, io.ReadWriteCloser, error) {
|
func DirectInit(conn net.Conn, conf *config.Config) (int16, io.ReadWriteCloser, error) {
|
||||||
socket := wrappers.NewTimeoutRWC(conn, conf.TimeoutRead, conf.TimeoutWrite)
|
socket := wrappers.NewTimeoutRWC(conn, conf.TimeoutRead, conf.TimeoutWrite)
|
||||||
frame, err := obfuscated2.ExtractFrame(socket)
|
frame, err := obfuscated2.ExtractFrame(socket)
|
||||||
|
|||||||
@@ -50,6 +50,8 @@ func (t *directTelegram) Init(conn io.ReadWriteCloser) (io.ReadWriteCloser, erro
|
|||||||
return wrappers.NewStreamCipherRWC(conn, obfs2.Encryptor, obfs2.Decryptor), nil
|
return wrappers.NewStreamCipherRWC(conn, obfs2.Encryptor, obfs2.Decryptor), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewDirectTelegram returns Telegram instance which connects directly
|
||||||
|
// to Telegram bypassing middleproxies.
|
||||||
func NewDirectTelegram(conf *config.Config) Telegram {
|
func NewDirectTelegram(conf *config.Config) Telegram {
|
||||||
return &directTelegram{baseTelegram{
|
return &directTelegram{baseTelegram{
|
||||||
dialer: newDialer(conf),
|
dialer: newDialer(conf),
|
||||||
|
|||||||
@@ -7,6 +7,9 @@ import (
|
|||||||
"github.com/juju/errors"
|
"github.com/juju/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Telegram defines an interface to connect to Telegram. This
|
||||||
|
// encapsulates logic of working with middleproxies or direct
|
||||||
|
// connections.
|
||||||
type Telegram interface {
|
type Telegram interface {
|
||||||
Dial(int16) (io.ReadWriteCloser, error)
|
Dial(int16) (io.ReadWriteCloser, error)
|
||||||
Init(io.ReadWriteCloser) (io.ReadWriteCloser, error)
|
Init(io.ReadWriteCloser) (io.ReadWriteCloser, error)
|
||||||
|
|||||||
@@ -1,73 +0,0 @@
|
|||||||
package wrappers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"crypto/cipher"
|
|
||||||
"io"
|
|
||||||
|
|
||||||
"github.com/juju/errors"
|
|
||||||
)
|
|
||||||
|
|
||||||
type BlockCipherReadWriteCloser struct {
|
|
||||||
encryptor cipher.BlockMode
|
|
||||||
decryptor cipher.BlockMode
|
|
||||||
conn io.ReadWriteCloser
|
|
||||||
buf *bytes.Buffer
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *BlockCipherReadWriteCloser) Read(p []byte) (n int, err error) {
|
|
||||||
blockSize := c.decryptor.BlockSize()
|
|
||||||
if len(p) < blockSize {
|
|
||||||
return 0, errors.New("Cannot read less than blocksize")
|
|
||||||
}
|
|
||||||
|
|
||||||
n, err = c.conn.Read(p)
|
|
||||||
c.buf.Write(p[:n])
|
|
||||||
|
|
||||||
wantToRead := c.getFullBlocks(len(p), blockSize)
|
|
||||||
haveBlocks := c.getFullBlocks(c.buf.Len(), blockSize)
|
|
||||||
if haveBlocks < wantToRead {
|
|
||||||
wantToRead = haveBlocks
|
|
||||||
}
|
|
||||||
wantToRead *= blockSize
|
|
||||||
|
|
||||||
data := c.buf.Bytes()
|
|
||||||
c.decryptor.CryptBlocks(p, data[:wantToRead])
|
|
||||||
c.buf = bytes.NewBuffer(data[wantToRead:])
|
|
||||||
|
|
||||||
return wantToRead, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *BlockCipherReadWriteCloser) Write(p []byte) (n int, err error) {
|
|
||||||
blockSize := c.encryptor.BlockSize()
|
|
||||||
if len(p)%blockSize != 0 {
|
|
||||||
return 0, errors.New("Write size should be compatible with block size")
|
|
||||||
}
|
|
||||||
|
|
||||||
buf := make([]byte, len(p))
|
|
||||||
c.encryptor.CryptBlocks(buf, p)
|
|
||||||
|
|
||||||
return c.conn.Write(buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *BlockCipherReadWriteCloser) Close() error {
|
|
||||||
return c.conn.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *BlockCipherReadWriteCloser) getFullBlocks(number, blockSize int) int {
|
|
||||||
blocks := number / blockSize
|
|
||||||
|
|
||||||
if blocks > 0 && number%blockSize != 0 {
|
|
||||||
blocks--
|
|
||||||
}
|
|
||||||
|
|
||||||
return blocks
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewBlockCipherRWC(conn io.ReadWriteCloser, encryptor, decryptor cipher.BlockMode) io.ReadWriteCloser {
|
|
||||||
return &BlockCipherReadWriteCloser{
|
|
||||||
conn: conn,
|
|
||||||
encryptor: encryptor,
|
|
||||||
decryptor: decryptor,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -48,6 +48,8 @@ func (c *CtxReadWriteCloser) Close() error {
|
|||||||
return c.conn.Close()
|
return c.conn.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewCtxRWC returns ReadWriteCloser which respects given context,
|
||||||
|
// cancellation etc.
|
||||||
func NewCtxRWC(ctx context.Context, cancel context.CancelFunc, conn io.ReadWriteCloser) io.ReadWriteCloser {
|
func NewCtxRWC(ctx context.Context, cancel context.CancelFunc, conn io.ReadWriteCloser) io.ReadWriteCloser {
|
||||||
return &CtxReadWriteCloser{
|
return &CtxReadWriteCloser{
|
||||||
conn: conn,
|
conn: conn,
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ func (l *LogReadWriteCloser) Close() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewLogRWC wraps ReadWriteCloser with logger calls.
|
||||||
func NewLogRWC(conn io.ReadWriteCloser, logger *zap.SugaredLogger, sockid string, name string) io.ReadWriteCloser {
|
func NewLogRWC(conn io.ReadWriteCloser, logger *zap.SugaredLogger, sockid string, name string) io.ReadWriteCloser {
|
||||||
return &LogReadWriteCloser{
|
return &LogReadWriteCloser{
|
||||||
conn: conn,
|
conn: conn,
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// StreamCipherReadWriteCloser is a ReadWriteCloser which ciphers
|
||||||
|
// incoming and outgoing data with givem cipher.Stream instances.
|
||||||
type StreamCipherReadWriteCloser struct {
|
type StreamCipherReadWriteCloser struct {
|
||||||
encryptor cipher.Stream
|
encryptor cipher.Stream
|
||||||
decryptor cipher.Stream
|
decryptor cipher.Stream
|
||||||
@@ -41,6 +43,8 @@ func (c *StreamCipherReadWriteCloser) Close() error {
|
|||||||
return c.conn.Close()
|
return c.conn.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewStreamCipherRWC returns wrapper which transparently
|
||||||
|
// encrypts/decrypts traffic with obfuscated2 protocol.
|
||||||
func NewStreamCipherRWC(conn io.ReadWriteCloser, encryptor, decryptor cipher.Stream) io.ReadWriteCloser {
|
func NewStreamCipherRWC(conn io.ReadWriteCloser, encryptor, decryptor cipher.Stream) io.ReadWriteCloser {
|
||||||
return &StreamCipherReadWriteCloser{
|
return &StreamCipherReadWriteCloser{
|
||||||
conn: conn,
|
conn: conn,
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ func (t *TimeoutReadWriteCloser) Close() error {
|
|||||||
return t.conn.Close()
|
return t.conn.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewTimeoutRWC returns wrapper over net.Conn which sets deadlines for
|
||||||
|
// every wrapped Read/Write.
|
||||||
func NewTimeoutRWC(conn net.Conn, readTimeout, writeTimeout time.Duration) io.ReadWriteCloser {
|
func NewTimeoutRWC(conn net.Conn, readTimeout, writeTimeout time.Duration) io.ReadWriteCloser {
|
||||||
return &TimeoutReadWriteCloser{
|
return &TimeoutReadWriteCloser{
|
||||||
conn: conn,
|
conn: conn,
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ func (t *TrafficReadWriteCloser) Close() error {
|
|||||||
return t.conn.Close()
|
return t.conn.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewTrafficRWC wraps ReadWriteCloser to have read/write callbacks.
|
||||||
func NewTrafficRWC(conn io.ReadWriteCloser, readCallback, writeCallback func(int)) io.ReadWriteCloser {
|
func NewTrafficRWC(conn io.ReadWriteCloser, readCallback, writeCallback func(int)) io.ReadWriteCloser {
|
||||||
return &TrafficReadWriteCloser{
|
return &TrafficReadWriteCloser{
|
||||||
conn: conn,
|
conn: conn,
|
||||||
|
|||||||
Reference in New Issue
Block a user