From b1f69539a99b21b1bed9947f7796d0f3febaf079 Mon Sep 17 00:00:00 2001 From: charles Date: Thu, 22 Dec 2022 19:33:33 +1100 Subject: [PATCH] Apply conversation config on messages being converted to protobuf --- .../libsession/messaging/messages/Message.kt | 12 ++++---- .../messaging/messages/control/CallMessage.kt | 2 +- .../control/ClosedGroupControlMessage.kt | 15 ++++++---- .../control/DataExtractionNotification.kt | 2 +- .../messages/control/ExpirationTimerUpdate.kt | 2 +- .../control/MessageRequestResponse.kt | 2 +- .../messaging/messages/control/ReadReceipt.kt | 2 +- .../messages/control/TypingIndicator.kt | 2 +- .../messages/control/UnsendRequest.kt | 2 +- .../messages/visible/VisibleMessage.kt | 2 +- .../MessageSenderClosedGroupHandler.kt | 29 +++++++++---------- 11 files changed, 38 insertions(+), 34 deletions(-) diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/Message.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/Message.kt index c25f4c2a73..7f82f963c0 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/Message.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/Message.kt @@ -39,16 +39,16 @@ abstract class Message { dataMessage.group = groupProto.build() } - fun setExpirationConfigurationIfNeeded(builder: SignalServiceProtos.Content.Builder) { - val config = threadID?.let { MessagingModuleConfiguration.shared.storage.getExpirationConfiguration(it) } + fun SignalServiceProtos.Content.Builder.setExpirationConfigurationIfNeeded(threadId: Long?) { + val config = threadId?.let { MessagingModuleConfiguration.shared.storage.getExpirationConfiguration(it) } ?: run { - builder.expirationTimer = 0 + expirationTimer = 0 return } - builder.expirationTimer = config.durationSeconds - builder.lastDisappearingMessageChangeTimestamp = config.updatedTimestampMs + expirationTimer = config.durationSeconds + lastDisappearingMessageChangeTimestamp = config.updatedTimestampMs if (config.isEnabled) { - builder.expirationType = config.expirationType + expirationType = config.expirationType } } } \ No newline at end of file diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/CallMessage.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/CallMessage.kt index 37b9bb6a3e..7b640b7822 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/control/CallMessage.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/CallMessage.kt @@ -82,7 +82,7 @@ class CallMessage(): ControlMessage() { .setUuid(callId!!.toString()) val content = SignalServiceProtos.Content.newBuilder() - setExpirationConfigurationIfNeeded(content) + content.setExpirationConfigurationIfNeeded(threadID) return content .setCallMessage(callMessage) diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/ClosedGroupControlMessage.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ClosedGroupControlMessage.kt index 510514c827..67f94768e1 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/control/ClosedGroupControlMessage.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ClosedGroupControlMessage.kt @@ -1,18 +1,21 @@ package org.session.libsession.messaging.messages.control import com.google.protobuf.ByteString +import org.session.libsession.messaging.MessagingModuleConfiguration +import org.session.libsession.utilities.Address import org.session.libsignal.crypto.ecc.DjbECPrivateKey import org.session.libsignal.crypto.ecc.DjbECPublicKey import org.session.libsignal.crypto.ecc.ECKeyPair import org.session.libsignal.protos.SignalServiceProtos import org.session.libsignal.protos.SignalServiceProtos.DataMessage -import org.session.libsignal.utilities.removingIdPrefixIfNeeded -import org.session.libsignal.utilities.toHexString import org.session.libsignal.utilities.Hex import org.session.libsignal.utilities.Log +import org.session.libsignal.utilities.removingIdPrefixIfNeeded +import org.session.libsignal.utilities.toHexString class ClosedGroupControlMessage() : ControlMessage() { var kind: Kind? = null + var groupID: String? = null override val defaultTtl: Long get() { return when (kind) { @@ -118,8 +121,9 @@ class ClosedGroupControlMessage() : ControlMessage() { } } - internal constructor(kind: Kind?) : this() { + internal constructor(kind: Kind?, groupID: String? = null) : this() { this.kind = kind + this.groupID = groupID } override fun toProto(): SignalServiceProtos.Content? { @@ -167,11 +171,12 @@ class ClosedGroupControlMessage() : ControlMessage() { val contentProto = SignalServiceProtos.Content.newBuilder() val dataMessageProto = DataMessage.newBuilder() dataMessageProto.closedGroupControlMessage = closedGroupControlMessage.build() - // Expiration timer - setExpirationConfigurationIfNeeded(contentProto) // Group context setGroupContext(dataMessageProto) contentProto.dataMessage = dataMessageProto.build() + // Expiration timer + val threadId = groupID?.let { MessagingModuleConfiguration.shared.storage.getOrCreateThreadIdFor(Address.fromSerialized(it)) } + contentProto.setExpirationConfigurationIfNeeded(threadId) return contentProto.build() } catch (e: Exception) { Log.w(TAG, "Couldn't construct closed group control message proto from: $this.") diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/DataExtractionNotification.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/DataExtractionNotification.kt index a8730f0a50..99ca047bbc 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/control/DataExtractionNotification.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/DataExtractionNotification.kt @@ -64,7 +64,7 @@ class DataExtractionNotification() : ControlMessage() { } val contentProto = SignalServiceProtos.Content.newBuilder() contentProto.dataExtractionNotification = dataExtractionNotification.build() - setExpirationConfigurationIfNeeded(contentProto) + contentProto.setExpirationConfigurationIfNeeded(threadID) return contentProto.build() } catch (e: Exception) { Log.w(TAG, "Couldn't construct data extraction notification proto from: $this") diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/ExpirationTimerUpdate.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ExpirationTimerUpdate.kt index e06b1fcb9b..b79de9a11c 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/control/ExpirationTimerUpdate.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ExpirationTimerUpdate.kt @@ -64,7 +64,7 @@ class ExpirationTimerUpdate() : ControlMessage() { val contentProto = SignalServiceProtos.Content.newBuilder() return try { contentProto.dataMessage = dataMessageProto.build() - setExpirationConfigurationIfNeeded(contentProto) + contentProto.setExpirationConfigurationIfNeeded(threadID) contentProto.build() } catch (e: Exception) { Log.w(TAG, "Couldn't construct expiration timer update proto from: $this") diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/MessageRequestResponse.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/MessageRequestResponse.kt index d9b1de78f8..793d258cba 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/control/MessageRequestResponse.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/MessageRequestResponse.kt @@ -13,7 +13,7 @@ class MessageRequestResponse(val isApproved: Boolean) : ControlMessage() { val contentProto = SignalServiceProtos.Content.newBuilder() return try { contentProto.messageRequestResponse = messageRequestResponseProto.build() - setExpirationConfigurationIfNeeded(contentProto) + contentProto.setExpirationConfigurationIfNeeded(threadID) contentProto.build() } catch (e: Exception) { Log.w(TAG, "Couldn't construct message request response proto from: $this") diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/ReadReceipt.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ReadReceipt.kt index f27e6cf4cb..8084fc82af 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/control/ReadReceipt.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ReadReceipt.kt @@ -41,7 +41,7 @@ class ReadReceipt() : ControlMessage() { val contentProto = SignalServiceProtos.Content.newBuilder() return try { contentProto.receiptMessage = receiptProto.build() - setExpirationConfigurationIfNeeded(contentProto) + contentProto.setExpirationConfigurationIfNeeded(threadID) contentProto.build() } catch (e: Exception) { Log.w(TAG, "Couldn't construct read receipt proto from: $this") diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/TypingIndicator.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/TypingIndicator.kt index f51298336d..be99e5ec7a 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/control/TypingIndicator.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/TypingIndicator.kt @@ -60,7 +60,7 @@ class TypingIndicator() : ControlMessage() { val contentProto = SignalServiceProtos.Content.newBuilder() return try { contentProto.typingMessage = typingIndicatorProto.build() - setExpirationConfigurationIfNeeded(contentProto) + contentProto.setExpirationConfigurationIfNeeded(threadID) contentProto.build() } catch (e: Exception) { Log.w(TAG, "Couldn't construct typing indicator proto from: $this") diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/UnsendRequest.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/UnsendRequest.kt index c9391c2072..74966bd5cd 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/control/UnsendRequest.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/UnsendRequest.kt @@ -45,7 +45,7 @@ class UnsendRequest(): ControlMessage() { val contentProto = SignalServiceProtos.Content.newBuilder() return try { contentProto.unsendRequest = unsendRequestProto.build() - setExpirationConfigurationIfNeeded(contentProto) + contentProto.setExpirationConfigurationIfNeeded(threadID) contentProto.build() } catch (e: Exception) { Log.w(TAG, "Couldn't construct unsend request proto from: $this") diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/visible/VisibleMessage.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/visible/VisibleMessage.kt index 6bc8d9b460..e5d77a0831 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/visible/VisibleMessage.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/visible/VisibleMessage.kt @@ -116,7 +116,7 @@ class VisibleMessage : Message() { dataMessage.addAllAttachments(pointers) // TODO: Contact // Expiration timer - setExpirationConfigurationIfNeeded(proto) + proto.setExpirationConfigurationIfNeeded(threadID) // Group context val storage = MessagingModuleConfiguration.shared.storage if (storage.isClosedGroup(recipient!!)) { diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSenderClosedGroupHandler.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSenderClosedGroupHandler.kt index debe7ab029..64e4d27e47 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSenderClosedGroupHandler.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSenderClosedGroupHandler.kt @@ -15,18 +15,17 @@ import org.session.libsession.utilities.Address import org.session.libsession.utilities.Address.Companion.fromSerialized import org.session.libsession.utilities.GroupUtil import org.session.libsession.utilities.TextSecurePreferences -import org.session.libsession.utilities.recipients.Recipient import org.session.libsignal.crypto.ecc.Curve import org.session.libsignal.crypto.ecc.ECKeyPair -import org.session.libsignal.utilities.guava.Optional import org.session.libsignal.messages.SignalServiceGroup import org.session.libsignal.protos.SignalServiceProtos +import org.session.libsignal.utilities.Hex +import org.session.libsignal.utilities.Log +import org.session.libsignal.utilities.ThreadUtils +import org.session.libsignal.utilities.guava.Optional import org.session.libsignal.utilities.hexEncodedPublicKey import org.session.libsignal.utilities.removingIdPrefixIfNeeded -import org.session.libsignal.utilities.Hex -import org.session.libsignal.utilities.ThreadUtils -import org.session.libsignal.utilities.Log -import java.util.* +import java.util.LinkedList import java.util.concurrent.ConcurrentHashMap const val groupSizeLimit = 100 @@ -49,14 +48,14 @@ fun MessageSender.create(name: String, members: Collection): Promise) // Send the update to the group val memberUpdateKind = ClosedGroupControlMessage.Kind.MembersAdded(newMembersAsData) val sentTime = System.currentTimeMillis() + SnodeAPI.clockOffset - val closedGroupControlMessage = ClosedGroupControlMessage(memberUpdateKind) + val closedGroupControlMessage = ClosedGroupControlMessage(memberUpdateKind, groupID) closedGroupControlMessage.sentTimestamp = sentTime send(closedGroupControlMessage, Address.fromSerialized(groupID)) // Send closed group update messages to any new members individually for (member in membersToAdd) { val closedGroupNewKind = ClosedGroupControlMessage.Kind.New(ByteString.copyFrom(Hex.fromStringCondensed(groupPublicKey)), name, encryptionKeyPair, membersAsData, adminsAsData, expireTimer) - val closedGroupControlMessage = ClosedGroupControlMessage(closedGroupNewKind) + val closedGroupControlMessage = ClosedGroupControlMessage(closedGroupNewKind, groupID) // It's important that the sent timestamp of this message is greater than the sent timestamp // of the `MembersAdded` message above. The reason is that upon receiving this `New` message, // the recipient will update the closed group formation timestamp and ignore any closed group @@ -210,7 +209,7 @@ fun MessageSender.removeMembers(groupPublicKey: String, membersToRemove: List