diff --git a/src/org/thoughtcrime/securesms/components/TypingStatusSender.java b/src/org/thoughtcrime/securesms/components/TypingStatusSender.java index 4aec2e803b..380efc2473 100644 --- a/src/org/thoughtcrime/securesms/components/TypingStatusSender.java +++ b/src/org/thoughtcrime/securesms/components/TypingStatusSender.java @@ -91,7 +91,7 @@ public class TypingStatusSender { return; } - MultiDeviceUtilKt.getAllDevices(context, originalRecipient.getAddress().serialize(), storageAPI, (devicePublicKey, isFriend, friendCount) -> { + MultiDeviceUtilKt.getAllDevicePublicKeys(context, originalRecipient.getAddress().serialize(), storageAPI, (devicePublicKey, isFriend, friendCount) -> { Recipient device = Recipient.from(context, Address.fromSerialized(devicePublicKey), false); long deviceThreadID = threadDatabase.getThreadIdIfExistsFor(device); if (deviceThreadID > -1) { diff --git a/src/org/thoughtcrime/securesms/loki/LokiPreKeyBundleDatabase.kt b/src/org/thoughtcrime/securesms/loki/LokiPreKeyBundleDatabase.kt index e7faf9f6b3..becd442e51 100644 --- a/src/org/thoughtcrime/securesms/loki/LokiPreKeyBundleDatabase.kt +++ b/src/org/thoughtcrime/securesms/loki/LokiPreKeyBundleDatabase.kt @@ -92,7 +92,7 @@ class LokiPreKeyBundleDatabase(context: Context, helper: SQLCipherOpenHelper) : fun hasPreKeyBundle(hexEncodedPublicKey: String): Boolean { val database = databaseHelper.readableDatabase - val cursor = database.query(tableName, null, "${Companion.hexEncodedPublicKey} = ?", arrayOf(hexEncodedPublicKey), null, null, null) + val cursor = database.query(tableName, null, "${Companion.hexEncodedPublicKey} = ?", arrayOf( hexEncodedPublicKey ), null, null, null) return cursor != null && cursor.count > 0 } } \ No newline at end of file diff --git a/src/org/thoughtcrime/securesms/loki/MultiDeviceUtil.kt b/src/org/thoughtcrime/securesms/loki/MultiDeviceUtil.kt index 825ae9fe9a..22f272e59a 100644 --- a/src/org/thoughtcrime/securesms/loki/MultiDeviceUtil.kt +++ b/src/org/thoughtcrime/securesms/loki/MultiDeviceUtil.kt @@ -17,17 +17,13 @@ import org.whispersystems.signalservice.loki.api.LokiStorageAPI import org.whispersystems.signalservice.loki.api.PairingAuthorisation import org.whispersystems.signalservice.loki.messaging.LokiThreadFriendRequestStatus -fun getAllDevices(context: Context, pubKey: String, storageAPI: LokiStorageAPI, block: (devicePubKey: String, isFriend: Boolean, friendCount: Int) -> Unit) { - val ourPubKey = TextSecurePreferences.getLocalNumber(context) - - // Get all the devices and run our logic on them - storageAPI.getAllDevicePublicKeys(pubKey).success { items -> +fun getAllDevicePublicKeys(context: Context, hexEncodedPublicKey: String, storageAPI: LokiStorageAPI, block: (devicePublicKey: String, isFriend: Boolean, friendCount: Int) -> Unit) { + val userHexEncodedPublicKey = TextSecurePreferences.getLocalNumber(context) + storageAPI.getAllDevicePublicKeys(hexEncodedPublicKey).success { items -> val devices = items.toMutableSet() - // Remove our self if we intended this message to go to another recipient - if (pubKey != ourPubKey) { - devices.remove(ourPubKey) + if (hexEncodedPublicKey != userHexEncodedPublicKey) { + devices.remove(userHexEncodedPublicKey) } - val friends = getFriendPublicKeys(context, devices) for (device in devices) { block(device, friends.contains(device), friends.count()) @@ -35,45 +31,30 @@ fun getAllDevices(context: Context, pubKey: String, storageAPI: LokiStorageAPI, } } -fun shouldAutomaticallyBecomeFriendsWithDevice(pubKey: String, context: Context): Promise { +fun shouldAutomaticallyBecomeFriendsWithDevice(publicKey: String, context: Context): Promise { val lokiThreadDatabase = DatabaseFactory.getLokiThreadDatabase(context) - val storageAPI = LokiStorageAPI.shared ?: return Promise.ofSuccess(false) - // we need to check if the sender is a secondary device. - // If it is then we need to check if we have its primary device as our friend - // If so then we add them automatically as a friend - + val storageAPI = LokiStorageAPI.shared val deferred = deferred() - storageAPI.getPrimaryDevicePublicKey(pubKey).success { primaryDevicePubKey -> - // Make sure we have a primary device - if (primaryDevicePubKey == null) { + storageAPI.getPrimaryDevicePublicKey(publicKey).success { primaryDevicePublicKey -> + if (primaryDevicePublicKey == null) { deferred.resolve(false) return@success } - - val ourPubKey = TextSecurePreferences.getLocalNumber(context) - - if (primaryDevicePubKey == ourPubKey) { - // If the friend request is from our secondary device then we need to confirm and check that we have it registered. - // If we do then add it - storageAPI.getSecondaryDevicePublicKeys(ourPubKey).success { secondaryDevices -> - // We should become friends if the pubKey is in our secondary device list - deferred.resolve(secondaryDevices.contains(pubKey)) + val userHexEncodedPublicKey = TextSecurePreferences.getLocalNumber(context) + if (primaryDevicePublicKey == userHexEncodedPublicKey) { + storageAPI.getSecondaryDevicePublicKeys(userHexEncodedPublicKey).success { secondaryDevices -> + deferred.resolve(secondaryDevices.contains(publicKey)) }.fail { deferred.resolve(false) } - return@success } - - // If we have a thread then the id will be >= 0 - val primaryDevice = Recipient.from(context, Address.fromSerialized(primaryDevicePubKey), false) + val primaryDevice = Recipient.from(context, Address.fromSerialized(primaryDevicePublicKey), false) val threadID = DatabaseFactory.getThreadDatabase(context).getThreadIdIfExistsFor(primaryDevice) if (threadID < 0) { deferred.resolve(false) return@success } - - // We should become friends if the primary device is our friend deferred.resolve(lokiThreadDatabase.getFriendRequestStatus(threadID) == LokiThreadFriendRequestStatus.FRIENDS) } @@ -84,22 +65,19 @@ fun sendPairingAuthorisationMessage(context: Context, contactHexEncodedPublicKey val messageSender = ApplicationContext.getInstance(context).communicationModule.provideSignalMessageSender() val address = SignalServiceAddress(contactHexEncodedPublicKey) val message = SignalServiceDataMessage.newBuilder().withBody("").withPairingAuthorisation(authorisation) - // A REQUEST should always act as a friend request. A GRANT should always be replying back as a normal message. if (authorisation.type == PairingAuthorisation.Type.REQUEST) { val preKeyBundle = DatabaseFactory.getLokiPreKeyBundleDatabase(context).generatePreKeyBundle(address.number) message.asFriendRequest(true).withPreKeyBundle(preKeyBundle) } - return try { - Log.d("Loki", "Sending authorisation message to $contactHexEncodedPublicKey") + Log.d("Loki", "Sending authorisation message to: $contactHexEncodedPublicKey.") val result = messageSender.sendMessage(0, address, Optional.absent(), message.build()) if (result.success == null) { val exception = when { - result.isNetworkFailure -> "Failed to send authorisation message because of a Network Error" - else -> "Failed to send authorisation message" + result.isNetworkFailure -> "Failed to send authorisation message due to a network error." + else -> "Failed to send authorisation message." } - throw Exception(exception) } Promise.ofSuccess(Unit) diff --git a/src/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java b/src/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java index 815f716132..d1ece3c076 100644 --- a/src/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java +++ b/src/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java @@ -92,7 +92,7 @@ public class MarkReadReceiver extends BroadcastReceiver { List timestamps = Stream.of(addressMap.get(address)).map(SyncMessageId::getTimetamp).toList(); - MultiDeviceUtilKt.getAllDevices(context, address.serialize(), storageAPI, (devicePublicKey, isFriend, friendCount) -> { + MultiDeviceUtilKt.getAllDevicePublicKeys(context, address.serialize(), storageAPI, (devicePublicKey, isFriend, friendCount) -> { // Loki - This also prevents read receipts from being sent in group chats as they don't maintain a friend request status if (isFriend) { ApplicationContext.getInstance(context).getJobManager().add(new SendReadReceiptJob(Address.fromSerialized(devicePublicKey), timestamps)); diff --git a/src/org/thoughtcrime/securesms/sms/MessageSender.java b/src/org/thoughtcrime/securesms/sms/MessageSender.java index 2d872e64a2..6553931cd8 100644 --- a/src/org/thoughtcrime/securesms/sms/MessageSender.java +++ b/src/org/thoughtcrime/securesms/sms/MessageSender.java @@ -218,7 +218,7 @@ public class MessageSender { return; } - MultiDeviceUtilKt.getAllDevices(context, recipientPublicKey, storageAPI, (devicePublicKey, isFriend, friendCount) -> { + MultiDeviceUtilKt.getAllDevicePublicKeys(context, recipientPublicKey, storageAPI, (devicePublicKey, isFriend, friendCount) -> { Address address = Address.fromSerialized(devicePublicKey); long messageIDToUse = recipientPublicKey.equals(devicePublicKey) ? messageId : -1L; @@ -248,7 +248,7 @@ public class MessageSender { return; } - MultiDeviceUtilKt.getAllDevices(context, recipientPublicKey, storageAPI, (devicePublicKey, isFriend, friendCount) -> { + MultiDeviceUtilKt.getAllDevicePublicKeys(context, recipientPublicKey, storageAPI, (devicePublicKey, isFriend, friendCount) -> { Address address = Address.fromSerialized(devicePublicKey); long messageIDToUse = recipientPublicKey.equals(devicePublicKey) ? messageId : -1L;