From 5cceace67b655174c1904fdf88a837ba13f935b0 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Wed, 4 Jan 2023 17:42:33 +0100 Subject: [PATCH] read legacy signed chat messages --- .../protocol/network/connection/Connection.kt | 8 +-- .../s2c/play/chat/SignedChatMessageS2CP.kt | 58 ++++++++++++++----- 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/Connection.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/Connection.kt index 2f3459fbf..fb4c669e6 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/Connection.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/Connection.kt @@ -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 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) } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/chat/SignedChatMessageS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/chat/SignedChatMessageS2CP.kt index a716123e5..4184fa0ea 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/chat/SignedChatMessageS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/chat/SignedChatMessageS2CP.kt @@ -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 = 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