From 6f46bbefbeb0a90d3515bf179eaecb8a49f10968 Mon Sep 17 00:00:00 2001 From: Harris Date: Wed, 14 Apr 2021 23:25:38 +1000 Subject: [PATCH] feat: add more opengroupv2 functions and classes --- .../messaging/opengroups/OpenGroupAPIV2.kt | 13 ++--- .../opengroups/OpenGroupV2Message.kt | 52 +++++++++++++++++++ .../pollers/OpenGroupV2Poller.kt | 2 +- 3 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 libsession/src/main/java/org/session/libsession/messaging/opengroups/OpenGroupV2Message.kt diff --git a/libsession/src/main/java/org/session/libsession/messaging/opengroups/OpenGroupAPIV2.kt b/libsession/src/main/java/org/session/libsession/messaging/opengroups/OpenGroupAPIV2.kt index c9bacb0d87..a0ee35bc9b 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/opengroups/OpenGroupAPIV2.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/opengroups/OpenGroupAPIV2.kt @@ -1,10 +1,11 @@ package org.session.libsession.messaging.opengroups +import nl.komponents.kovenant.Promise import org.session.libsession.messaging.opengroups.OpenGroupAPIV2.Error import org.session.libsession.messaging.utilities.DotNetAPI import java.util.* -class OpenGroupAPIV2: DotNetAPI() { +object OpenGroupAPIV2: DotNetAPI() { enum class Error { GENERIC, @@ -15,13 +16,13 @@ class OpenGroupAPIV2: DotNetAPI() { NO_PUBLIC_KEY } - companion object { - private val moderators: HashMap>> = hashMapOf() // Server URL to (channel ID to set of moderator IDs) - const val DEFAULT_SERVER = "https://sessionopengroup.com" - const val DEFAULT_SERVER_PUBLIC_KEY = "658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231b" - } + private val moderators: HashMap>> = hashMapOf() // Server URL to (channel ID to set of moderator IDs) + const val DEFAULT_SERVER = "https://sessionopengroup.com" + const val DEFAULT_SERVER_PUBLIC_KEY = "658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231b" + fun getMessages(room: String, server: String): Promise, Exception> { + } } diff --git a/libsession/src/main/java/org/session/libsession/messaging/opengroups/OpenGroupV2Message.kt b/libsession/src/main/java/org/session/libsession/messaging/opengroups/OpenGroupV2Message.kt new file mode 100644 index 0000000000..a40bd53bf5 --- /dev/null +++ b/libsession/src/main/java/org/session/libsession/messaging/opengroups/OpenGroupV2Message.kt @@ -0,0 +1,52 @@ +package org.session.libsession.messaging.opengroups + +import org.session.libsession.messaging.MessagingConfiguration +import org.session.libsignal.utilities.Base64 +import org.session.libsignal.utilities.logging.Log +import org.whispersystems.curve25519.Curve25519 + +data class OpenGroupV2Message( + val serverID: Long?, + val sender: String?, + val sentTimestamp: Long, + // The serialized protobuf in base64 encoding + val base64EncodedData: String, + // When sending a message, the sender signs the serialized protobuf with their private key so that + // a receiving user can verify that the message wasn't tampered with. + val base64EncodedSignature: String? +) { + + companion object { + private val curve = Curve25519.getInstance(Curve25519.BEST) + } + + fun sign(): OpenGroupV2Message? { + if (base64EncodedData.isEmpty()) return null + val (publicKey, privateKey) = MessagingConfiguration.shared.storage.getUserKeyPair() ?: return null + + if (sender != publicKey) return null // only sign our own messages? + + val signature = try { + curve.calculateSignature(privateKey, Base64.decode(base64EncodedData)) + } catch (e: Exception) { + Log.e("Loki", "Couldn't sign OpenGroupV2Message", e) + return null + } + + return copy(base64EncodedSignature = Base64.encodeBytes(signature)) + } + + fun toJSON(): Map { + val jsonMap = mutableMapOf("data" to base64EncodedData, "timestamp" to sentTimestamp) + serverID?.let { jsonMap["server_id"] = serverID } + sender?.let { jsonMap["public_key"] = sender } + base64EncodedSignature?.let { jsonMap["signature"] = base64EncodedSignature } + } + + fun fromJSON(json: Map): OpenGroupV2Message? { + if (!json.containsKey("data") || !json.containsKey("timestamp")) return null + + } + + +} \ No newline at end of file diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupV2Poller.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupV2Poller.kt index 21e0c0d0cb..d1480670b9 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupV2Poller.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupV2Poller.kt @@ -76,7 +76,7 @@ class OpenGroupV2Poller(private val openGroup: OpenGroupV2, private val executor fun generateDisplayName(rawDisplayName: String): String { return "$rawDisplayName (...${senderPublicKey.takeLast(8)})" } - val senderDisplayName = MessagingConfiguration.shared.storage.getOpenGroupDisplayName(senderPublicKey, openGroup.channel, openGroup.server) ?: generateDisplayName(message.displayName) + val senderDisplayName = MessagingConfiguration.shared.storage.getOpenGroupDisplayName(senderPublicKey, openGroup.room, openGroup.server) ?: generateDisplayName(message.displayName) val id = openGroup.id.toByteArray() // Main message val dataMessageProto = SignalServiceProtos.DataMessage.newBuilder()