read legacy signed chat messages

This commit is contained in:
Bixilon 2023-01-04 17:42:33 +01:00
parent e6bc1babc2
commit 5cceace67b
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
2 changed files with 47 additions and 19 deletions

View File

@ -1,6 +1,6 @@
/*
* Minosoft
* Copyright (C) 2020-2022 Moritz Zwerger
* Copyright (C) 2020-2023 Moritz Zwerger
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
@ -52,17 +52,17 @@ abstract class Connection : AbstractEventMaster {
return events.fire(event)
}
@Deprecated("events")
@Deprecated("events", ReplaceWith("events.unregister(invoker)"))
override fun unregister(invoker: EventListener?) {
events.unregister(invoker)
}
@Deprecated("events")
@Deprecated("events", ReplaceWith("events.register(invoker)"))
override fun <T : EventListener> register(invoker: T): T {
return events.register(invoker)
}
@Deprecated("events")
@Deprecated("events", ReplaceWith("events.register(*invokers)"))
override fun register(vararg invokers: EventListener) {
events.register(*invokers)
}

View File

@ -54,15 +54,27 @@ class SignedChatMessageS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
}
private fun PlayInByteBuffer.readLegacySignedMessage(): SignedChatMessage {
val message = readChatComponent()
val unsignedContent = if (versionId >= ProtocolVersions.V_22W19A) readOptional { readChatComponent() } else null
var type = readRegistryItem(connection.registries.messageType)
val sender = readChatMessageSender()
val sendingTime = readInstant()
val salt = readLong()
val signatureData = readSignatureData()
val parameters: MutableMap<ChatParameter, ChatComponent> = mutableMapOf()
val message = readString()
parameters[ChatParameter.CONTENT] = TextComponent(message)
TODO("return message, refactor")
val unsigned = if (versionId >= ProtocolVersions.V_22W19A) readOptional { readString() } else null
val type = readRegistryItem(connection.registries.messageType)
val sender = readChatMessageSender()
parameters[ChatParameter.SENDER] = sender.name
sender.team?.let { parameters[ChatParameter.TARGET] = it }
val sent = readInstant()
val salt = readLong()
val signature = readSignatureData()
val received = Instant.now()
val error = verifyMessage(sent, received, versionId, salt, message, sender.uuid)
return SignedChatMessage(connection, message, type, connection.getMessageSender(sender.uuid), parameters, null, error, sent, received)
}
fun PlayInByteBuffer.readSignedMessage(): SignedChatMessage {
@ -103,13 +115,7 @@ class SignedChatMessageS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
val sender = connection.getMessageSender(senderUUID)
val received = Instant.now()
var error: Exception? = null
if (received.toEpochMilli() - sent.toEpochMilli() > ChatSignatureProperties.MESSAGE_TTL) {
// expired
error = MessageExpiredError(sent, received)
} else {
// ToDo: check signature
}
val error = verifyMessage(sent, received, versionId, salt, message, senderUUID)
return SignedChatMessage(
connection = connection,
@ -124,6 +130,28 @@ class SignedChatMessageS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
)
}
private fun checkExpired(sent: Instant, received: Instant): Exception? {
if (received.toEpochMilli() - sent.toEpochMilli() > ChatSignatureProperties.MESSAGE_TTL) {
return MessageExpiredError(sent, received)
}
return null
}
private fun verifyMessage(
sent: Instant,
received: Instant,
versionId: Int,
seed: Long,
content: String,
sender: UUID,
): Exception? {
checkExpired(sent, received)?.let { return it }
// TODO: Verify signature
return null
}
override fun handle(connection: PlayConnection) {
if (message.error != null) {
// failed