Bladeren bron

Send correct proxy header

tags/0.9
9seconds 7 jaren geleden
bovenliggende
commit
76e88edac3
4 gewijzigde bestanden met toevoegingen van 37 en 5 verwijderingen
  1. 2
    0
      client/direct.go
  2. 14
    3
      mtproto/rpc/proxy_request.go
  3. 7
    1
      telegram/middle.go
  4. 14
    1
      wrappers/mtproto_proxy.go

+ 2
- 0
client/direct.go Bestand weergeven

@@ -36,5 +36,7 @@ func DirectInit(socket net.Conn, connID string, conf *config.Config) (wrappers.W
36 36
 
37 37
 	conn = wrappers.NewStreamCipher(conn, obfs2.Encryptor, obfs2.Decryptor)
38 38
 
39
+	conn.Logger().Infow("Client connection initialized")
40
+
39 41
 	return conn, connOpts, nil
40 42
 }

+ 14
- 3
mtproto/rpc/proxy_request.go Bestand weergeven

@@ -20,8 +20,20 @@ type ProxyRequest struct {
20 20
 	Options      *mtproto.ConnectionOpts
21 21
 }
22 22
 
23
-func (r *ProxyRequest) Bytes(message []byte) []byte {
23
+func (r *ProxyRequest) MakeHeader(message []byte) *bytes.Buffer {
24
+	bufferLength := len(TagProxyRequest) +
25
+		4 + // len(flags)
26
+		len(r.ConnectionID) +
27
+		len(r.ClientIPPort) +
28
+		len(r.OurIPPort) +
29
+		len(ProxyRequestExtraSize) +
30
+		len(ProxyRequestProxyTag) +
31
+		1 + // len(AdTag)
32
+		len(r.ADTag)
33
+	bufferLength += bufferLength % 4
34
+
24 35
 	buf := &bytes.Buffer{}
36
+	buf.Grow(bufferLength)
25 37
 
26 38
 	flags := r.Flags
27 39
 	if r.Options.ReadHacks.QuickAck {
@@ -42,9 +54,8 @@ func (r *ProxyRequest) Bytes(message []byte) []byte {
42 54
 	buf.WriteByte(byte(len(r.ADTag)))
43 55
 	buf.Write(r.ADTag)
44 56
 	buf.Write(make([]byte, (4-buf.Len()%4)%4))
45
-	buf.Write(message)
46 57
 
47
-	return buf.Bytes()
58
+	return buf
48 59
 }
49 60
 
50 61
 func NewProxyRequest(clientAddr, ownAddr *net.TCPAddr, opts *mtproto.ConnectionOpts, adTag []byte) (*ProxyRequest, error) {

+ 7
- 1
telegram/middle.go Bestand weergeven

@@ -43,7 +43,13 @@ func (t *MiddleTelegram) Init(connOpts *mtproto.ConnectionOpts, conn wrappers.St
43 43
 		return nil, err
44 44
 	}
45 45
 
46
-	return wrappers.NewMTProtoProxy(frameConn, connOpts, t.conf.AdTag)
46
+	proxyConn, err := wrappers.NewMTProtoProxy(frameConn, connOpts, t.conf.AdTag)
47
+	if err != nil {
48
+		return nil, err
49
+	}
50
+	proxyConn.Logger().Infow("Telegram connection initialized")
51
+
52
+	return proxyConn, nil
47 53
 }
48 54
 
49 55
 func (t *MiddleTelegram) sendRPCNonceRequest(conn wrappers.PacketWriter) (*rpc.NonceRequest, error) {

+ 14
- 1
wrappers/mtproto_proxy.go Bestand weergeven

@@ -2,6 +2,7 @@ package wrappers
2 2
 
3 3
 import (
4 4
 	"bytes"
5
+	"fmt"
5 6
 	"net"
6 7
 
7 8
 	"github.com/juju/errors"
@@ -100,7 +101,19 @@ func (m *MTProtoProxy) Write(p []byte) (int, error) {
100 101
 	)
101 102
 	m.writeCounter++
102 103
 
103
-	if _, err := m.conn.Write(p); err != nil {
104
+	header := m.req.MakeHeader(p)
105
+	if ce := m.logger.Desugar().Check(zap.DebugLevel, "RPC_PROXY_REQ header"); ce != nil {
106
+		ce.Write(
107
+			zap.Int("length", len(p)),
108
+			zap.Uint32("counter", m.writeCounter),
109
+			zap.Bool("simple_ack", m.req.Options.ReadHacks.QuickAck),
110
+			zap.Bool("quick_ack", m.req.Options.ReadHacks.SimpleAck),
111
+			zap.String("header", fmt.Sprintf("%v", header.Bytes())),
112
+		)
113
+	}
114
+	header.Write(p)
115
+
116
+	if _, err := m.conn.Write(header.Bytes()); err != nil {
104 117
 		return 0, err
105 118
 	}
106 119
 

Laden…
Annuleren
Opslaan