mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-16 10:55:01 -04:00
read legacy signed chat messages
This commit is contained in:
parent
e6bc1babc2
commit
5cceace67b
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Minosoft
|
* 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.
|
* 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)
|
return events.fire(event)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated("events")
|
@Deprecated("events", ReplaceWith("events.unregister(invoker)"))
|
||||||
override fun unregister(invoker: EventListener?) {
|
override fun unregister(invoker: EventListener?) {
|
||||||
events.unregister(invoker)
|
events.unregister(invoker)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated("events")
|
@Deprecated("events", ReplaceWith("events.register(invoker)"))
|
||||||
override fun <T : EventListener> register(invoker: T): T {
|
override fun <T : EventListener> register(invoker: T): T {
|
||||||
return events.register(invoker)
|
return events.register(invoker)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated("events")
|
@Deprecated("events", ReplaceWith("events.register(*invokers)"))
|
||||||
override fun register(vararg invokers: EventListener) {
|
override fun register(vararg invokers: EventListener) {
|
||||||
events.register(*invokers)
|
events.register(*invokers)
|
||||||
}
|
}
|
||||||
|
@ -54,15 +54,27 @@ class SignedChatMessageS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun PlayInByteBuffer.readLegacySignedMessage(): SignedChatMessage {
|
private fun PlayInByteBuffer.readLegacySignedMessage(): SignedChatMessage {
|
||||||
val message = readChatComponent()
|
val parameters: MutableMap<ChatParameter, ChatComponent> = mutableMapOf()
|
||||||
val unsignedContent = if (versionId >= ProtocolVersions.V_22W19A) readOptional { readChatComponent() } else null
|
val message = readString()
|
||||||
var type = readRegistryItem(connection.registries.messageType)
|
parameters[ChatParameter.CONTENT] = TextComponent(message)
|
||||||
val sender = readChatMessageSender()
|
|
||||||
val sendingTime = readInstant()
|
|
||||||
val salt = readLong()
|
|
||||||
val signatureData = readSignatureData()
|
|
||||||
|
|
||||||
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 {
|
fun PlayInByteBuffer.readSignedMessage(): SignedChatMessage {
|
||||||
@ -103,13 +115,7 @@ class SignedChatMessageS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
|
|||||||
val sender = connection.getMessageSender(senderUUID)
|
val sender = connection.getMessageSender(senderUUID)
|
||||||
val received = Instant.now()
|
val received = Instant.now()
|
||||||
|
|
||||||
var error: Exception? = null
|
val error = verifyMessage(sent, received, versionId, salt, message, senderUUID)
|
||||||
if (received.toEpochMilli() - sent.toEpochMilli() > ChatSignatureProperties.MESSAGE_TTL) {
|
|
||||||
// expired
|
|
||||||
error = MessageExpiredError(sent, received)
|
|
||||||
} else {
|
|
||||||
// ToDo: check signature
|
|
||||||
}
|
|
||||||
|
|
||||||
return SignedChatMessage(
|
return SignedChatMessage(
|
||||||
connection = connection,
|
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) {
|
override fun handle(connection: PlayConnection) {
|
||||||
if (message.error != null) {
|
if (message.error != null) {
|
||||||
// failed
|
// failed
|
||||||
|
Loading…
x
Reference in New Issue
Block a user