diff --git a/cli/proxy.go b/cli/proxy.go index df0bc18..5a85a2e 100644 --- a/cli/proxy.go +++ b/cli/proxy.go @@ -14,7 +14,6 @@ import ( "github.com/9seconds/mtg/obfuscated2" "github.com/9seconds/mtg/proxy" "github.com/9seconds/mtg/stats" - "github.com/9seconds/mtg/telegram" "github.com/9seconds/mtg/utils" ) @@ -79,14 +78,15 @@ func Proxy() error { app := &proxy.Proxy{ Logger: zap.S().Named("proxy"), Context: ctx, + ClientProtocolMaker: obfuscated2.MakeClientProtocol, + TelegramProtocolMaker: obfuscated2.MakeTelegramProtocol, } - if len(config.C.AdTag) == 0 { - app.TelegramProtocolMaker = obfuscated2.MakeTelegramProtocol - app.TelegramDialer = telegram.NewDirectTelegram() - } - if config.C.SecretMode != config.SecretModeTLS { - app.ClientProtocolMaker = obfuscated2.MakeClientProtocol - } + // if len(config.C.AdTag) == 0 { + // app.TelegramProtocolMaker = obfuscated2.MakeTelegramProtocol + // } + // if config.C.SecretMode != config.SecretModeTLS { + // app.ClientProtocolMaker = obfuscated2.MakeClientProtocol + // } app.Serve(proxyListener) diff --git a/obfuscated2/client_protocol.go b/obfuscated2/client_protocol.go index 44a87e3..37d9800 100644 --- a/obfuscated2/client_protocol.go +++ b/obfuscated2/client_protocol.go @@ -20,7 +20,21 @@ import ( const clientProtocolHandshakeTimeout = 10 * time.Second type ClientProtocol struct { - protocol.BaseProtocol + connectionType conntypes.ConnectionType + connectionProtocol conntypes.ConnectionProtocol + dc conntypes.DC +} + +func (c *ClientProtocol) ConnectionType() conntypes.ConnectionType { + return c.connectionType +} + +func (c *ClientProtocol) ConnectionProtocol() conntypes.ConnectionProtocol { + return c.connectionProtocol +} + +func (c *ClientProtocol) DC() conntypes.DC { + return c.dc } func (c *ClientProtocol) Handshake(socket wrappers.StreamReadWriteCloser) (wrappers.StreamReadWriteCloser, error) { @@ -46,23 +60,23 @@ func (c *ClientProtocol) Handshake(socket wrappers.StreamReadWriteCloser) (wrapp magic := decryptedFrame.Magic() switch { case bytes.Equal(magic, conntypes.ConnectionTagAbridged): - c.ConnectionType = conntypes.ConnectionTypeAbridged + c.connectionType = conntypes.ConnectionTypeAbridged case bytes.Equal(magic, conntypes.ConnectionTagIntermediate): - c.ConnectionType = conntypes.ConnectionTypeIntermediate + c.connectionType = conntypes.ConnectionTypeIntermediate case bytes.Equal(magic, conntypes.ConnectionTagSecure): - c.ConnectionType = conntypes.ConnectionTypeSecure + c.connectionType = conntypes.ConnectionTypeSecure default: return nil, errors.New("Unknown connection type") } - c.ConnectionProtocol = conntypes.ConnectionProtocolIPv4 + c.connectionProtocol = conntypes.ConnectionProtocolIPv4 if socket.LocalAddr().IP.To4() == nil { - c.ConnectionProtocol = conntypes.ConnectionProtocolIPv6 + c.connectionProtocol = conntypes.ConnectionProtocolIPv6 } buf := bytes.NewReader(decryptedFrame.DC()) - if err := binary.Read(buf, binary.LittleEndian, &c.DC); err != nil { - c.DC = conntypes.DCDefaultIdx + if err := binary.Read(buf, binary.LittleEndian, &c.dc); err != nil { + c.dc = conntypes.DCDefaultIdx } antiReplayKey := decryptedFrame.Unique() diff --git a/obfuscated2/telegram_protocol.go b/obfuscated2/telegram_protocol.go index cce6cc5..b3b1a45 100644 --- a/obfuscated2/telegram_protocol.go +++ b/obfuscated2/telegram_protocol.go @@ -10,17 +10,13 @@ import ( "github.com/9seconds/mtg/wrappers" ) -type TelegramProtocol struct { - protocol.BaseProtocol - - dialer telegram.Telegram -} +type TelegramProtocol struct{} func (t *TelegramProtocol) Handshake(req *protocol.TelegramRequest) (wrappers.Wrap, error) { - socket, err := t.dialer.Dial(req.Ctx, + socket, err := telegram.Direct.Dial(req.Ctx, req.Cancel, - req.ClientProtocol.GetDC(), - req.ClientProtocol.GetConnectionProtocol()) + req.ClientProtocol.DC(), + req.ClientProtocol.ConnectionProtocol()) if err != nil { return nil, fmt.Errorf("cannot dial to telegram: %w", err) } @@ -43,10 +39,8 @@ func (t *TelegramProtocol) Handshake(req *protocol.TelegramRequest) (wrappers.Wr return wrappers.NewObfuscated2(socket, encryptor, decryptor), nil } -func MakeTelegramProtocol(dialer telegram.Telegram) protocol.TelegramProtocol { - return &TelegramProtocol{ - dialer: dialer, - } +func MakeTelegramProtocol() protocol.TelegramProtocol { + return &TelegramProtocol{} } func generateFrame(cp protocol.ClientProtocol) (fm Frame) { @@ -70,7 +64,7 @@ func generateFrame(cp protocol.ClientProtocol) (fm Frame) { continue } - copy(fm.Magic(), cp.GetConnectionType().Tag()) + copy(fm.Magic(), cp.ConnectionType().Tag()) return } diff --git a/protocol/base_protocol.go b/protocol/base_protocol.go deleted file mode 100644 index 158ee1f..0000000 --- a/protocol/base_protocol.go +++ /dev/null @@ -1,21 +0,0 @@ -package protocol - -import "github.com/9seconds/mtg/conntypes" - -type BaseProtocol struct { - ConnectionType conntypes.ConnectionType - ConnectionProtocol conntypes.ConnectionProtocol - DC conntypes.DC -} - -func (b *BaseProtocol) GetConnectionType() conntypes.ConnectionType { - return b.ConnectionType -} - -func (b *BaseProtocol) GetConnectionProtocol() conntypes.ConnectionProtocol { - return b.ConnectionProtocol -} - -func (b *BaseProtocol) GetDC() conntypes.DC { - return b.DC -} diff --git a/protocol/interfaces.go b/protocol/interfaces.go index 4b81ab7..09f2c59 100644 --- a/protocol/interfaces.go +++ b/protocol/interfaces.go @@ -2,21 +2,19 @@ package protocol import ( "github.com/9seconds/mtg/conntypes" - "github.com/9seconds/mtg/telegram" "github.com/9seconds/mtg/wrappers" ) type ClientProtocol interface { Handshake(wrappers.StreamReadWriteCloser) (wrappers.StreamReadWriteCloser, error) - GetConnectionType() conntypes.ConnectionType - GetConnectionProtocol() conntypes.ConnectionProtocol - GetDC() conntypes.DC + ConnectionType() conntypes.ConnectionType + ConnectionProtocol() conntypes.ConnectionProtocol + DC() conntypes.DC } -type ClientProtocolMaker func() ClientProtocol - type TelegramProtocol interface { Handshake(*TelegramRequest) (wrappers.Wrap, error) } -type TelegramProtocolMaker func(telegram.Telegram) TelegramProtocol +type ClientProtocolMaker func() ClientProtocol +type TelegramProtocolMaker func() TelegramProtocol diff --git a/proxy/proxy.go b/proxy/proxy.go index e4d910f..e11e001 100644 --- a/proxy/proxy.go +++ b/proxy/proxy.go @@ -12,7 +12,6 @@ import ( "github.com/9seconds/mtg/conntypes" "github.com/9seconds/mtg/protocol" "github.com/9seconds/mtg/stats" - "github.com/9seconds/mtg/telegram" "github.com/9seconds/mtg/utils" "github.com/9seconds/mtg/wrappers" ) @@ -24,7 +23,6 @@ type Proxy struct { Context context.Context ClientProtocolMaker protocol.ClientProtocolMaker TelegramProtocolMaker protocol.TelegramProtocolMaker - TelegramDialer telegram.Telegram } func (p *Proxy) Serve(listener net.Listener) { @@ -77,8 +75,8 @@ func (p *Proxy) accept(conn net.Conn) { } defer wrappedConn.Close() - stats.S.ClientConnected(clientProtocol.GetConnectionType(), wrappedConn.RemoteAddr()) - defer stats.S.ClientDisconnected(clientProtocol.GetConnectionType(), wrappedConn.RemoteAddr()) + stats.S.ClientConnected(clientProtocol.ConnectionType(), wrappedConn.RemoteAddr()) + defer stats.S.ClientDisconnected(clientProtocol.ConnectionType(), wrappedConn.RemoteAddr()) logger.Infow("Client connected", "addr", conn.RemoteAddr()) req := &protocol.TelegramRequest{ @@ -100,7 +98,7 @@ func (p *Proxy) accept(conn net.Conn) { } func (p *Proxy) acceptDirectConnection(request *protocol.TelegramRequest) error { - telegramProtocol := p.TelegramProtocolMaker(p.TelegramDialer) + telegramProtocol := p.TelegramProtocolMaker() telegramConnRaw, err := telegramProtocol.Handshake(request) if err != nil { return err diff --git a/telegram/direct.go b/telegram/direct.go index 775a7d8..153143f 100644 --- a/telegram/direct.go +++ b/telegram/direct.go @@ -8,6 +8,8 @@ import ( "github.com/9seconds/mtg/wrappers" ) +var Direct = newDirectTelegram() + const ( directV4DefaultIdx conntypes.DC = 1 directV6DefaultIdx conntypes.DC = 1 @@ -48,7 +50,7 @@ func (d *directTelegram) Dial(ctx context.Context, return d.baseTelegram.dial(ctx, cancel, dc-1, protocol) } -func NewDirectTelegram() Telegram { +func newDirectTelegram() Telegram { return &directTelegram{ baseTelegram: baseTelegram{ dialer: net.Dialer{Timeout: telegramDialTimeout}, diff --git a/telegram/middle.go b/telegram/middle.go index fdc06e0..817b199 100644 --- a/telegram/middle.go +++ b/telegram/middle.go @@ -16,6 +16,8 @@ import ( const middleTelegramBackgroundUpdateEvery = time.Hour +var Middle = NewMiddleTelegram() + type middleTelegram struct { baseTelegram