@@ -2,6 +2,7 @@ package minecraft
22
33import (
44 "errors"
5+ "io"
56 "time"
67
78 "github.com/layou233/zbproxy/v3/adapter"
@@ -85,6 +86,7 @@ func SniffClientHandshake(conn bufio.PeekConn, metadata *adapter.Metadata) error
8586 }
8687 metadata .Minecraft .NextState = int8 (nextState )
8788
89+ metadata .Minecraft .SniffPosition = conn .CurrentPosition ()
8890 if nextState == mcprotocol .NextStateStatus {
8991 // status packet
9092 conn .SetReadDeadline (time .Now ().Add (10 * time .Second ))
@@ -99,9 +101,6 @@ func SniffClientHandshake(conn bufio.PeekConn, metadata *adapter.Metadata) error
99101 if err != nil {
100102 return common .Cause ("read packet size: " , err )
101103 }
102- if packetSize > 33 { // maximum possible size of this kind of packet
103- return ErrBadPacket
104- }
105104 conn .SetReadDeadline (time .Now ().Add (10 * time .Second ))
106105 packetContent , err = conn .Peek (int (packetSize ))
107106 if err != nil {
@@ -120,11 +119,52 @@ func SniffClientHandshake(conn bufio.PeekConn, metadata *adapter.Metadata) error
120119 if err != nil {
121120 return common .Cause ("read player name: " , err )
122121 }
123- if buffer .Len () == 16 { // UUID exists
124- copy (metadata .Minecraft .UUID [:], buffer .Bytes ())
122+ if metadata .Minecraft .ProtocolVersion >= 764 { // 1.20.2
123+ if buffer .Len () == 16 { // UUID exists
124+ copy (metadata .Minecraft .UUID [:], buffer .Bytes ())
125+ }
126+ } else if metadata .Minecraft .ProtocolVersion >= 761 { // 1.19.3
127+ var hasUUID byte
128+ hasUUID , err = buffer .ReadByte ()
129+ if err != nil {
130+ return common .Cause ("read has UUID: " , err )
131+ }
132+ if hasUUID == mcprotocol .BooleanTrue {
133+ copy (metadata .Minecraft .UUID [:], buffer .Bytes ())
134+ }
135+ } else if metadata .Minecraft .ProtocolVersion >= 759 { // 1.19
136+ var hasSigData byte
137+ hasSigData , err = buffer .ReadByte ()
138+ if err != nil {
139+ return common .Cause ("read has sig data: " , err )
140+ }
141+ if hasSigData == mcprotocol .BooleanTrue {
142+ // skip timestamp
143+ buffer .Advance (8 ) // size of Long
144+ var length int32
145+ // skip public key
146+ length , _ , err = mcprotocol .ReadVarIntFrom (buffer )
147+ if err != nil {
148+ return common .Cause ("read public key length: " , err )
149+ }
150+ buffer .Advance (int (length ))
151+ // skip signature
152+ length , _ , err = mcprotocol .ReadVarIntFrom (buffer )
153+ if err != nil {
154+ return common .Cause ("read signature length: " , err )
155+ }
156+ buffer .Advance (int (length ))
157+ }
158+ var hasUUID byte
159+ hasUUID , err = buffer .ReadByte ()
160+ if err != nil && err != io .EOF {
161+ return common .Cause ("read has UUID: " , err )
162+ }
163+ if hasUUID == mcprotocol .BooleanTrue {
164+ copy (metadata .Minecraft .UUID [:], buffer .Bytes ())
165+ }
125166 }
126167 }
127168
128- metadata .Minecraft .SniffPosition = conn .CurrentPosition ()
129169 return nil
130170}
0 commit comments