Added LoginStart. Doesn't work yet though
This commit is contained in:
parent
c20ff0fea7
commit
887a82564f
89
main.go
89
main.go
@ -18,6 +18,11 @@ const (
|
|||||||
PongResponseID = 0x01
|
PongResponseID = 0x01
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type PrefixedByteArray struct {
|
||||||
|
Length int
|
||||||
|
Data []byte
|
||||||
|
}
|
||||||
|
|
||||||
type HandshakePacket struct {
|
type HandshakePacket struct {
|
||||||
ProtocolVersion int
|
ProtocolVersion int
|
||||||
ServerAddress string
|
ServerAddress string
|
||||||
@ -25,6 +30,11 @@ type HandshakePacket struct {
|
|||||||
NextState int
|
NextState int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type LoginStartPacket struct {
|
||||||
|
SharedSecret PrefixedByteArray
|
||||||
|
VerifyToken PrefixedByteArray
|
||||||
|
}
|
||||||
|
|
||||||
type StatusResponse struct {
|
type StatusResponse struct {
|
||||||
Version VersionInfo `json:"version"`
|
Version VersionInfo `json:"version"`
|
||||||
Players PlayerInfo `json:"players"`
|
Players PlayerInfo `json:"players"`
|
||||||
@ -42,10 +52,6 @@ type PlayerInfo struct {
|
|||||||
Sample []Player `json:"sample"`
|
Sample []Player `json:"sample"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Pong struct {
|
|
||||||
Timestamp int64 `json:"timestamp"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Player struct {
|
type Player struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
@ -129,8 +135,40 @@ func handleConnection(client *ClientState) {
|
|||||||
if client.nextState == 1 {
|
if client.nextState == 1 {
|
||||||
handleStatusRequest(client)
|
handleStatusRequest(client)
|
||||||
} else if client.nextState == 2 {
|
} else if client.nextState == 2 {
|
||||||
fmt.Println("Received status request in the wrong state")
|
fmt.Println("Received Login Start")
|
||||||
|
|
||||||
|
// Login Start
|
||||||
|
loginStart, err := handleLoginStart(packetReader)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error processing login start:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println("Login Start:", loginStart)
|
||||||
|
|
||||||
|
// Send Encryption Request back
|
||||||
|
var packetData bytes.Buffer
|
||||||
|
writeVarInt(&packetData, 1) // Packet length: 1 byte for ID
|
||||||
|
packetData.WriteByte(0x01) // Encryption Request ID
|
||||||
|
|
||||||
|
// Server ID
|
||||||
|
writeString(&packetData, "JustAnotherServer")
|
||||||
|
|
||||||
|
// Public Key
|
||||||
|
writePrefixedByteArray(&packetData, PrefixedByteArray{Length: 0, Data: []byte{}})
|
||||||
|
|
||||||
|
// Verify Token
|
||||||
|
writePrefixedByteArray(&packetData, PrefixedByteArray{Length: 0, Data: []byte{}})
|
||||||
|
|
||||||
|
// Should authenticate (actually a boolean)
|
||||||
|
packetData.WriteByte(1)
|
||||||
|
|
||||||
|
if _, err := client.conn.Write(packetData.Bytes()); err != nil {
|
||||||
|
fmt.Println("Error sending encryption request:", err)
|
||||||
|
} else {
|
||||||
|
fmt.Println("Encryption request sent successfully")
|
||||||
|
}
|
||||||
} else if client.nextState == 3 {
|
} else if client.nextState == 3 {
|
||||||
|
// Transfer
|
||||||
fmt.Println("Received status request in the wrong state")
|
fmt.Println("Received status request in the wrong state")
|
||||||
} else {
|
} else {
|
||||||
handshake, err := handleHandshake(packetReader)
|
handshake, err := handleHandshake(packetReader)
|
||||||
@ -188,6 +226,24 @@ func handleHandshake(reader *bytes.Reader) (HandshakePacket, error) {
|
|||||||
return handshake, nil
|
return handshake, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func handleLoginStart(reader *bytes.Reader) (LoginStartPacket, error) {
|
||||||
|
var packet LoginStartPacket
|
||||||
|
var err error
|
||||||
|
|
||||||
|
packet.SharedSecret, err = readPrefixedByteArray(reader)
|
||||||
|
if err != nil {
|
||||||
|
return packet, err
|
||||||
|
}
|
||||||
|
|
||||||
|
packet.VerifyToken, err = readPrefixedByteArray(reader)
|
||||||
|
if err != nil {
|
||||||
|
return packet, err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Login Start received: %+v\n", packet)
|
||||||
|
return packet, nil
|
||||||
|
}
|
||||||
|
|
||||||
func handleStatusRequest(client *ClientState) {
|
func handleStatusRequest(client *ClientState) {
|
||||||
status := StatusResponse{
|
status := StatusResponse{
|
||||||
Version: VersionInfo{"1.21.4", 769},
|
Version: VersionInfo{"1.21.4", 769},
|
||||||
@ -233,6 +289,16 @@ func writeVarInt(buf *bytes.Buffer, value int) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func writeString(buf *bytes.Buffer, value string) {
|
||||||
|
writeVarInt(buf, len(value))
|
||||||
|
buf.WriteString(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func writePrefixedByteArray(buf *bytes.Buffer, value PrefixedByteArray) {
|
||||||
|
writeVarInt(buf, value.Length)
|
||||||
|
buf.Write(value.Data)
|
||||||
|
}
|
||||||
|
|
||||||
func readVarInt(reader *bytes.Reader) (int, error) {
|
func readVarInt(reader *bytes.Reader) (int, error) {
|
||||||
value, position := 0, 0
|
value, position := 0, 0
|
||||||
for {
|
for {
|
||||||
@ -264,3 +330,16 @@ func readString(reader *bytes.Reader) (string, error) {
|
|||||||
}
|
}
|
||||||
return string(strBuf), nil
|
return string(strBuf), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func readPrefixedByteArray(reader *bytes.Reader) (PrefixedByteArray, error) {
|
||||||
|
length, err := readVarInt(reader)
|
||||||
|
if err != nil {
|
||||||
|
return PrefixedByteArray{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
data := make([]byte, length)
|
||||||
|
if _, err := reader.Read(data); err != nil {
|
||||||
|
return PrefixedByteArray{}, err
|
||||||
|
}
|
||||||
|
return PrefixedByteArray{Length: length, Data: data}, nil
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user