From 9a33fe88839e2f8aa5c8d5200af8ec3b64024eb1 Mon Sep 17 00:00:00 2001 From: jubb Date: Thu, 25 Feb 2021 12:13:31 +1100 Subject: [PATCH] feat: generate serializable Contact info for configuration messages and pass in appropriate list to get current --- .../loki/protocol/MultiDeviceProtocol.kt | 15 ++++++++-- .../messages/control/ConfigurationMessage.kt | 29 ++++++++++++++++++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/MultiDeviceProtocol.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/MultiDeviceProtocol.kt index 614aed7913..14ef924d97 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/MultiDeviceProtocol.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/MultiDeviceProtocol.kt @@ -16,6 +16,7 @@ import org.session.libsignal.utilities.Hex import org.session.libsignal.utilities.logging.Log import org.thoughtcrime.securesms.ApplicationContext import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil +import org.thoughtcrime.securesms.loki.utilities.ContactUtilities import org.thoughtcrime.securesms.loki.utilities.OpenGroupUtilities import java.util.* @@ -28,7 +29,12 @@ object MultiDeviceProtocol { val lastSyncTime = TextSecurePreferences.getLastConfigurationSyncTime(context) val now = System.currentTimeMillis() if (now - lastSyncTime < 2 * 24 * 60 * 60 * 1000) return - val configurationMessage = ConfigurationMessage.getCurrent() + val contacts = ContactUtilities.getAllContacts(context).filter { recipient -> + !recipient.isBlocked && !recipient.name.isNullOrEmpty() && !recipient.isLocalNumber && recipient.address.serialize().isNotEmpty() + }.map { recipient -> + ConfigurationMessage.Contact(recipient.address.serialize(), recipient.name!!, recipient.profileAvatar, recipient.profileKey) + } + val configurationMessage = ConfigurationMessage.getCurrent(contacts) val serializedMessage = configurationMessage.toProto()!!.toByteArray() val messageSender = ApplicationContext.getInstance(context).communicationModule.provideSignalMessageSender() val address = SignalServiceAddress(userPublicKey) @@ -47,7 +53,12 @@ object MultiDeviceProtocol { // TODO: refactor this to use new message sending job fun forceSyncConfigurationNowIfNeeded(context: Context) { val userPublicKey = TextSecurePreferences.getLocalNumber(context) ?: return - val configurationMessage = ConfigurationMessage.getCurrent() + val contacts = ContactUtilities.getAllContacts(context).filter { recipient -> + !recipient.isBlocked && !recipient.name.isNullOrEmpty() && !recipient.isLocalNumber && recipient.address.serialize().isNotEmpty() + }.map { recipient -> + ConfigurationMessage.Contact(recipient.address.serialize(), recipient.name!!, recipient.profileAvatar, recipient.profileKey) + } + val configurationMessage = ConfigurationMessage.getCurrent(contacts) val serializedMessage = configurationMessage.toProto()!!.toByteArray() val messageSender = ApplicationContext.getInstance(context).communicationModule.provideSignalMessageSender() val address = SignalServiceAddress(userPublicKey) diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/control/ConfigurationMessage.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ConfigurationMessage.kt index 4ded41b436..712f40049c 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/control/ConfigurationMessage.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ConfigurationMessage.kt @@ -51,12 +51,39 @@ class ConfigurationMessage(val closedGroups: List, val openGroups: } } + class Contact(val publicKey: String, val name: String, val profilePicture: String?, val profileKey: ByteArray?) { + companion object { + fun fromProto(proto: SignalServiceProtos.ConfigurationMessage.Contact): Contact? { + if (!proto.hasName() || !proto.hasProfileKey()) return null + val publicKey = proto.publicKey.toByteArray().toHexString() + val name = proto.name + val profilePicture = if (proto.hasProfilePicture()) proto.profilePicture else null + val profileKey = if (proto.hasProfileKey()) proto.profileKey.toByteArray() else null + + return Contact(publicKey,name,profilePicture,profileKey) + } + } + + fun toProto(): SignalServiceProtos.ConfigurationMessage.Contact? { + val result = SignalServiceProtos.ConfigurationMessage.Contact.newBuilder() + result.name = this.name + result.publicKey = ByteString.copyFrom(Hex.fromStringCondensed(publicKey)) + if (!this.profilePicture.isNullOrEmpty()) { + result.profilePicture = this.profilePicture + } + if (this.profileKey != null) { + result.profileKey = ByteString.copyFrom(this.profileKey) + } + return result.build() + } + } + override val ttl: Long = 4 * 24 * 60 * 60 * 1000 override val isSelfSendValid: Boolean = true companion object { - fun getCurrent(): ConfigurationMessage { + fun getCurrent(contacts: List): ConfigurationMessage { val closedGroups = mutableListOf() val openGroups = mutableListOf() val sharedConfig = MessagingConfiguration.shared