mirror of
https://github.com/oxen-io/session-android.git
synced 2025-01-12 11:03:51 +00:00
commit
024e2d1253
@ -9,11 +9,11 @@ import nl.komponents.kovenant.all
|
|||||||
import nl.komponents.kovenant.functional.map
|
import nl.komponents.kovenant.functional.map
|
||||||
import org.session.libsession.messaging.jobs.MessageReceiveJob
|
import org.session.libsession.messaging.jobs.MessageReceiveJob
|
||||||
import org.session.libsession.messaging.open_groups.OpenGroup
|
import org.session.libsession.messaging.open_groups.OpenGroup
|
||||||
|
import org.session.libsession.messaging.sending_receiving.pollers.ClosedGroupPoller
|
||||||
import org.session.libsession.messaging.sending_receiving.pollers.OpenGroupPoller
|
import org.session.libsession.messaging.sending_receiving.pollers.OpenGroupPoller
|
||||||
import org.session.libsession.snode.SnodeAPI
|
import org.session.libsession.snode.SnodeAPI
|
||||||
import org.session.libsession.utilities.TextSecurePreferences
|
import org.session.libsession.utilities.TextSecurePreferences
|
||||||
import org.session.libsignal.utilities.logging.Log
|
import org.session.libsignal.utilities.logging.Log
|
||||||
import org.thoughtcrime.securesms.ApplicationContext
|
|
||||||
import org.thoughtcrime.securesms.database.DatabaseFactory
|
import org.thoughtcrime.securesms.database.DatabaseFactory
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
@ -79,7 +79,7 @@ class BackgroundPollWorker(val context: Context, params: WorkerParameters) : Wor
|
|||||||
promises.addAll(privateChatsPromise.get())
|
promises.addAll(privateChatsPromise.get())
|
||||||
|
|
||||||
// Closed groups
|
// Closed groups
|
||||||
promises.addAll(ApplicationContext.getInstance(context).closedGroupPoller.pollOnce())
|
promises.addAll(ClosedGroupPoller().pollOnce())
|
||||||
|
|
||||||
// Open Groups
|
// Open Groups
|
||||||
val openGroups = DatabaseFactory.getLokiThreadDatabase(context).getAllPublicChats().map { (_,chat)->
|
val openGroups = DatabaseFactory.getLokiThreadDatabase(context).getAllPublicChats().map { (_,chat)->
|
||||||
|
@ -7,19 +7,8 @@ import org.session.libsession.messaging.messages.Destination
|
|||||||
import org.session.libsession.messaging.messages.control.ConfigurationMessage
|
import org.session.libsession.messaging.messages.control.ConfigurationMessage
|
||||||
import org.session.libsession.messaging.sending_receiving.MessageSender
|
import org.session.libsession.messaging.sending_receiving.MessageSender
|
||||||
import org.session.libsession.messaging.threads.Address
|
import org.session.libsession.messaging.threads.Address
|
||||||
import org.session.libsession.messaging.threads.recipients.Recipient
|
|
||||||
import org.session.libsession.utilities.TextSecurePreferences
|
import org.session.libsession.utilities.TextSecurePreferences
|
||||||
import org.session.libsession.utilities.preferences.ProfileKeyUtil
|
|
||||||
import org.session.libsignal.service.internal.push.SignalServiceProtos
|
|
||||||
import org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage
|
|
||||||
import org.session.libsignal.service.loki.utilities.removing05PrefixIfNeeded
|
|
||||||
import org.session.libsignal.utilities.Base64
|
|
||||||
import org.session.libsignal.utilities.Hex
|
|
||||||
import org.thoughtcrime.securesms.ApplicationContext
|
|
||||||
import org.thoughtcrime.securesms.database.DatabaseFactory
|
|
||||||
import org.thoughtcrime.securesms.jobs.RetrieveProfileAvatarJob
|
|
||||||
import org.thoughtcrime.securesms.loki.utilities.ContactUtilities
|
import org.thoughtcrime.securesms.loki.utilities.ContactUtilities
|
||||||
import org.thoughtcrime.securesms.loki.utilities.OpenGroupUtilities
|
|
||||||
|
|
||||||
object MultiDeviceProtocol {
|
object MultiDeviceProtocol {
|
||||||
|
|
||||||
@ -51,80 +40,4 @@ object MultiDeviceProtocol {
|
|||||||
TextSecurePreferences.setLastConfigurationSyncTime(context, System.currentTimeMillis())
|
TextSecurePreferences.setLastConfigurationSyncTime(context, System.currentTimeMillis())
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: remove this after we migrate to new message receiving pipeline
|
|
||||||
@JvmStatic
|
|
||||||
fun handleConfigurationMessage(context: Context, content: SignalServiceProtos.Content, senderPublicKey: String, timestamp: Long) {
|
|
||||||
synchronized(this) {
|
|
||||||
val userPublicKey = TextSecurePreferences.getLocalNumber(context) ?: return
|
|
||||||
if (TextSecurePreferences.getConfigurationMessageSynced(context) && !TextSecurePreferences.shouldUpdateProfile(context, timestamp)) return
|
|
||||||
if (senderPublicKey != userPublicKey) return
|
|
||||||
TextSecurePreferences.setConfigurationMessageSynced(context, true)
|
|
||||||
TextSecurePreferences.setLastProfileUpdateTime(context, timestamp)
|
|
||||||
|
|
||||||
val configurationMessage = ConfigurationMessage.fromProto(content) ?: return
|
|
||||||
|
|
||||||
val storage = MessagingModuleConfiguration.shared.storage
|
|
||||||
val allClosedGroupPublicKeys = storage.getAllClosedGroupPublicKeys()
|
|
||||||
|
|
||||||
val threadDatabase = DatabaseFactory.getThreadDatabase(context)
|
|
||||||
val recipientDatabase = DatabaseFactory.getRecipientDatabase(context)
|
|
||||||
|
|
||||||
val ourRecipient = Recipient.from(context, Address.fromSerialized(userPublicKey),false)
|
|
||||||
|
|
||||||
for (closedGroup in configurationMessage.closedGroups) {
|
|
||||||
if (allClosedGroupPublicKeys.contains(closedGroup.publicKey)) continue
|
|
||||||
|
|
||||||
val closedGroupUpdate = DataMessage.ClosedGroupControlMessage.newBuilder()
|
|
||||||
closedGroupUpdate.type = DataMessage.ClosedGroupControlMessage.Type.NEW
|
|
||||||
closedGroupUpdate.publicKey = ByteString.copyFrom(Hex.fromStringCondensed(closedGroup.publicKey))
|
|
||||||
closedGroupUpdate.name = closedGroup.name
|
|
||||||
val encryptionKeyPair = SignalServiceProtos.KeyPair.newBuilder()
|
|
||||||
encryptionKeyPair.publicKey = ByteString.copyFrom(closedGroup.encryptionKeyPair!!.publicKey.serialize().removing05PrefixIfNeeded())
|
|
||||||
encryptionKeyPair.privateKey = ByteString.copyFrom(closedGroup.encryptionKeyPair!!.privateKey.serialize())
|
|
||||||
closedGroupUpdate.encryptionKeyPair = encryptionKeyPair.build()
|
|
||||||
closedGroupUpdate.addAllMembers(closedGroup.members.map { ByteString.copyFrom(Hex.fromStringCondensed(it)) })
|
|
||||||
closedGroupUpdate.addAllAdmins(closedGroup.admins.map { ByteString.copyFrom(Hex.fromStringCondensed(it)) })
|
|
||||||
|
|
||||||
ClosedGroupsProtocolV2.handleNewClosedGroup(context, closedGroupUpdate.build(), userPublicKey, timestamp)
|
|
||||||
}
|
|
||||||
val allOpenGroups = storage.getAllOpenGroups().map { it.value.server }
|
|
||||||
for (openGroup in configurationMessage.openGroups) {
|
|
||||||
if (allOpenGroups.contains(openGroup)) continue
|
|
||||||
OpenGroupUtilities.addGroup(context, openGroup, 1)
|
|
||||||
}
|
|
||||||
if (configurationMessage.displayName.isNotEmpty()) {
|
|
||||||
TextSecurePreferences.setProfileName(context, configurationMessage.displayName)
|
|
||||||
recipientDatabase.setProfileName(ourRecipient, configurationMessage.displayName)
|
|
||||||
}
|
|
||||||
if (configurationMessage.profileKey.isNotEmpty()) {
|
|
||||||
val profileKey = Base64.encodeBytes(configurationMessage.profileKey)
|
|
||||||
ProfileKeyUtil.setEncodedProfileKey(context, profileKey)
|
|
||||||
recipientDatabase.setProfileKey(ourRecipient, configurationMessage.profileKey)
|
|
||||||
if (!configurationMessage.profilePicture.isNullOrEmpty() && TextSecurePreferences.getProfilePictureURL(context) != configurationMessage.profilePicture) {
|
|
||||||
TextSecurePreferences.setProfilePictureURL(context, configurationMessage.profilePicture)
|
|
||||||
ApplicationContext.getInstance(context).jobManager.add(RetrieveProfileAvatarJob(ourRecipient, configurationMessage.profilePicture))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (contact in configurationMessage.contacts) {
|
|
||||||
val address = Address.fromSerialized(contact.publicKey)
|
|
||||||
val recipient = Recipient.from(context, address, true)
|
|
||||||
if (!contact.profilePicture.isNullOrEmpty()) {
|
|
||||||
recipientDatabase.setProfileAvatar(recipient, contact.profilePicture)
|
|
||||||
}
|
|
||||||
if (contact.profileKey?.isNotEmpty() == true) {
|
|
||||||
recipientDatabase.setProfileKey(recipient, contact.profileKey)
|
|
||||||
}
|
|
||||||
if (contact.name.isNotEmpty()) {
|
|
||||||
recipientDatabase.setProfileName(recipient, contact.name)
|
|
||||||
}
|
|
||||||
recipientDatabase.setProfileSharing(recipient, true)
|
|
||||||
recipientDatabase.setRegistered(recipient, Recipient.RegisteredState.REGISTERED)
|
|
||||||
// create Thread if needed
|
|
||||||
threadDatabase.getOrCreateThreadIdFor(recipient)
|
|
||||||
}
|
|
||||||
if (configurationMessage.contacts.isNotEmpty()) {
|
|
||||||
threadDatabase.notifyUpdatedFromConfig()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -111,7 +111,7 @@ private fun MessageReceiver.handleDataExtractionNotification(message: DataExtrac
|
|||||||
|
|
||||||
// Configuration message handling
|
// Configuration message handling
|
||||||
|
|
||||||
private fun MessageReceiver.handleConfigurationMessage(message: ConfigurationMessage) {
|
private fun handleConfigurationMessage(message: ConfigurationMessage) {
|
||||||
val context = MessagingModuleConfiguration.shared.context
|
val context = MessagingModuleConfiguration.shared.context
|
||||||
val storage = MessagingModuleConfiguration.shared.storage
|
val storage = MessagingModuleConfiguration.shared.storage
|
||||||
if (TextSecurePreferences.getConfigurationMessageSynced(context) && !TextSecurePreferences.shouldUpdateProfile(context, message.sentTimestamp!!)) return
|
if (TextSecurePreferences.getConfigurationMessageSynced(context) && !TextSecurePreferences.shouldUpdateProfile(context, message.sentTimestamp!!)) return
|
||||||
@ -148,27 +148,25 @@ private fun MessageReceiver.handleConfigurationMessage(message: ConfigurationMes
|
|||||||
fun MessageReceiver.handleVisibleMessage(message: VisibleMessage, proto: SignalServiceProtos.Content, openGroupID: String?) {
|
fun MessageReceiver.handleVisibleMessage(message: VisibleMessage, proto: SignalServiceProtos.Content, openGroupID: String?) {
|
||||||
val storage = MessagingModuleConfiguration.shared.storage
|
val storage = MessagingModuleConfiguration.shared.storage
|
||||||
val context = MessagingModuleConfiguration.shared.context
|
val context = MessagingModuleConfiguration.shared.context
|
||||||
|
val userPublicKey = storage.getUserPublicKey()
|
||||||
// Update profile if needed
|
// Update profile if needed
|
||||||
val newProfile = message.profile
|
val newProfile = message.profile
|
||||||
if (newProfile != null) {
|
if (newProfile != null && openGroupID.isNullOrEmpty() && userPublicKey != message.sender) {
|
||||||
val profileManager = SSKEnvironment.shared.profileManager
|
val profileManager = SSKEnvironment.shared.profileManager
|
||||||
val recipient = Recipient.from(context, Address.fromSerialized(message.sender!!), false)
|
val recipient = Recipient.from(context, Address.fromSerialized(message.sender!!), false)
|
||||||
val displayName = newProfile.displayName!!
|
val displayName = newProfile.displayName!!
|
||||||
val userPublicKey = storage.getUserPublicKey()
|
if (displayName.isNotEmpty()) {
|
||||||
if (openGroupID == null) {
|
|
||||||
if (userPublicKey == message.sender) {
|
|
||||||
// Update the user's local name if the message came from their master device
|
|
||||||
TextSecurePreferences.setProfileName(context, displayName)
|
|
||||||
}
|
|
||||||
profileManager.setDisplayName(context, recipient, displayName)
|
profileManager.setDisplayName(context, recipient, displayName)
|
||||||
}
|
}
|
||||||
if (recipient.profileKey == null || !MessageDigest.isEqual(recipient.profileKey, newProfile.profileKey)) {
|
if (newProfile.profileKey?.isNotEmpty() == true && !MessageDigest.isEqual(recipient.profileKey, newProfile.profileKey)) {
|
||||||
profileManager.setProfileKey(context, recipient, newProfile.profileKey!!)
|
profileManager.setProfileKey(context, recipient, newProfile.profileKey!!)
|
||||||
profileManager.setUnidentifiedAccessMode(context, recipient, Recipient.UnidentifiedAccessMode.UNKNOWN)
|
profileManager.setUnidentifiedAccessMode(context, recipient, Recipient.UnidentifiedAccessMode.UNKNOWN)
|
||||||
val url = newProfile.profilePictureURL.orEmpty()
|
val newUrl = newProfile.profilePictureURL
|
||||||
profileManager.setProfilePictureURL(context, recipient, url)
|
if (!newUrl.isNullOrEmpty()) {
|
||||||
if (userPublicKey == message.sender) {
|
profileManager.setProfilePictureURL(context, recipient, newUrl)
|
||||||
profileManager.updateOpenGroupProfilePicturesIfNeeded(context)
|
if (userPublicKey == message.sender) {
|
||||||
|
profileManager.updateOpenGroupProfilePicturesIfNeeded(context)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user