prudp: Support legacy NEX 1 clients

This commit is contained in:
Daniel López Guimaraes 2024-02-11 00:56:06 +00:00
parent 3b90bdc96b
commit 857fb68f62
No known key found for this signature in database
GPG key ID: 6AC74DE3DEF050E0
3 changed files with 42 additions and 4 deletions

View file

@ -24,6 +24,7 @@ type PRUDPEndPoint struct {
ServerAccount *Account
AccountDetailsByPID func(pid *types.PID) (*Account, *Error)
AccountDetailsByUsername func(username string) (*Account, *Error)
IsSecureEndpoint bool
}
// RegisterServiceProtocol registers a NEX service with the endpoint
@ -289,10 +290,25 @@ func (pep *PRUDPEndPoint) handleConnect(packet PRUDPPacketInterface) {
payload := make([]byte, 0)
if len(packet.Payload()) != 0 {
sessionKey, pid, checkValue, err := pep.readKerberosTicket(packet.Payload())
if pep.IsSecureEndpoint {
var decryptedPayload []byte
if pep.Server.PRUDPV0Settings.EncryptedConnect {
decryptedPayload = packet.decryptPayload()
} else {
decryptedPayload = packet.Payload()
}
decompressedPayload, err := connection.StreamSettings.CompressionAlgorithm.Decompress(decryptedPayload)
if err != nil {
logger.Error(err.Error())
return
}
sessionKey, pid, checkValue, err := pep.readKerberosTicket(decompressedPayload)
if err != nil {
logger.Error(err.Error())
return
}
connection.SetPID(pid)
@ -311,7 +327,24 @@ func (pep *PRUDPEndPoint) handleConnect(packet PRUDPPacketInterface) {
payload = stream.Bytes()
}
ack.SetPayload(payload)
compressedPayload, err := connection.StreamSettings.CompressionAlgorithm.Compress(payload)
if err != nil {
logger.Error(err.Error())
return
}
var encryptedPayload []byte
if pep.Server.PRUDPV0Settings.EncryptedConnect {
encryptedPayload, err = connection.StreamSettings.EncryptionAlgorithm.Encrypt(compressedPayload)
if err != nil {
logger.Error(err.Error())
return
}
} else {
encryptedPayload = compressedPayload
}
ack.SetPayload(encryptedPayload)
ack.setSignature(ack.calculateSignature([]byte{}, packet.getConnectionSignature()))
pep.emit("connect", ack)
@ -645,5 +678,6 @@ func NewPRUDPEndPoint(streamID uint8) *PRUDPEndPoint {
packetEventHandlers: make(map[string][]func(PacketInterface)),
connectionEndedEventHandlers: make([]func(connection *PRUDPConnection), 0),
ConnectionIDCounter: NewCounter[uint32](0),
IsSecureEndpoint: false,
}
}

View file

@ -309,7 +309,7 @@ func defaultPRUDPv0ConnectionSignature(packet *PRUDPPacketV0, addr net.Addr) ([]
}
func defaultPRUDPv0CalculateSignature(packet *PRUDPPacketV0, sessionKey, connectionSignature []byte) []byte {
if !packet.server.PRUDPV0Settings.IsQuazalMode {
if !packet.server.PRUDPV0Settings.LegacyConnectionSignature {
if packet.packetType == DataPacket {
return packet.server.PRUDPV0Settings.DataSignatureCalculator(packet, sessionKey)
}

View file

@ -7,6 +7,8 @@ import "net"
// PRUDPV0Settings defines settings for how to handle aspects of PRUDPv0 packets
type PRUDPV0Settings struct {
IsQuazalMode bool
EncryptedConnect bool
LegacyConnectionSignature bool
UseEnhancedChecksum bool
ConnectionSignatureCalculator func(packet *PRUDPPacketV0, addr net.Addr) ([]byte, error)
SignatureCalculator func(packet *PRUDPPacketV0, sessionKey, connectionSignature []byte) []byte
@ -18,6 +20,8 @@ type PRUDPV0Settings struct {
func NewPRUDPV0Settings() *PRUDPV0Settings {
return &PRUDPV0Settings{
IsQuazalMode: false,
EncryptedConnect: false,
LegacyConnectionSignature: false,
UseEnhancedChecksum: false,
ConnectionSignatureCalculator: defaultPRUDPv0ConnectionSignature,
SignatureCalculator: defaultPRUDPv0CalculateSignature,