diff --git a/SignalServiceKit/src/Loki/Database/OWSPrimaryStorage+Loki.m b/SignalServiceKit/src/Loki/Database/OWSPrimaryStorage+Loki.m index 7398f76e7..5ed6a2318 100644 --- a/SignalServiceKit/src/Loki/Database/OWSPrimaryStorage+Loki.m +++ b/SignalServiceKit/src/Loki/Database/OWSPrimaryStorage+Loki.m @@ -228,7 +228,7 @@ - (NSSet *)getAllFriendsWithTransaction:(YapDatabaseReadTransaction *)transaction { NSMutableSet *hexEncodedPublicKeys = [NSMutableSet set]; - [transaction enumerateKeysAndObjectsInCollection:LKFriendRequestCollection usingBlock:^(NSString *hexEncodedPublicKey, NSNumber *status, BOOL * _Nonnull stop) { + [transaction enumerateKeysAndObjectsInCollection:LKFriendRequestCollection usingBlock:^(NSString *hexEncodedPublicKey, NSNumber *status, BOOL *stop) { if ([status integerValue] == LKFriendRequestStatusFriends) { [hexEncodedPublicKeys addObject:hexEncodedPublicKey]; } diff --git a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift index 5c7f76b76..3724a1d09 100644 --- a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift @@ -170,8 +170,8 @@ public final class FriendRequestProtocol : NSObject { @objc(shouldUpdateFriendRequestStatusFromMessage:) public static func shouldUpdateFriendRequestStatus(from message: TSOutgoingMessage) -> Bool { // The order of these checks matters - if (message.thread.isGroupThread()) { return false } - if (message.thread.contactIdentifier() == getUserHexEncodedPublicKey()) { return false } + if message.thread.isGroupThread() { return false } + if message.thread.contactIdentifier() == getUserHexEncodedPublicKey() { return false } if (message as? DeviceLinkMessage)?.kind == .request { return true } if message is SessionRequestMessage { return false } return message is FriendRequestMessage @@ -245,9 +245,8 @@ public final class FriendRequestProtocol : NSObject { // Signal cipher decryption and thus that we have a session with the other person. let friendRequestStatus = storage.getFriendRequestStatus(for: hexEncodedPublicKey, transaction: transaction); // We shouldn't be able to skip from none to friends - guard friendRequestStatus == .requestSending || - friendRequestStatus == .requestSent || - friendRequestStatus == .requestReceived else { return } + guard friendRequestStatus == .requestSending || friendRequestStatus == .requestSent + || friendRequestStatus == .requestReceived else { return } // Become friends storage.setFriendRequestStatus(.friends, for: hexEncodedPublicKey, transaction: transaction) // Send a contact sync message if needed diff --git a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift index d9a980a1c..b12d1741f 100644 --- a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift +++ b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift @@ -622,7 +622,6 @@ class FriendRequestProtocolTests : XCTestCase { } // MARK: - shouldUpdateFriendRequestStatus - func test_shouldUpdateFriendRequestStatusReturnsTheCorrectValue() { let thread = LokiTestUtilities.createContactThread(for: LokiTestUtilities.generateHexEncodedPublicKey()) diff --git a/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift index 30a275246..dad1d2f4b 100644 --- a/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift @@ -36,7 +36,8 @@ public final class SyncMessagesProtocol : NSObject { } public static func syncAllContacts() -> Promise { - // We need to sync over all contacts whom we are friends with. + // We need to sync over all contacts whom we are friends with, even if + // we don't have a thread for them. var hepks: [String] = [] storage.dbReadConnection.read { transaction in hepks = self.storage @@ -44,7 +45,6 @@ public final class SyncMessagesProtocol : NSObject { .filter { ECKeyPair.isValidHexEncodedPublicKey(candidate: $0) } .map { storage.getMasterHexEncodedPublicKey(for: $0, in: transaction) ?? $0 } } - let friends = Set(hepks).map { SignalAccount(recipientId: $0) } let syncManager = SSKEnvironment.shared.syncManager let promises = friends.chunked(by: 3).map { friends -> Promise in // TODO: Does this always fit? @@ -166,10 +166,10 @@ public final class SyncMessagesProtocol : NSObject { public static func handleContactSyncMessageData(_ data: Data, using transaction: YapDatabaseReadWriteTransaction) { let parser = ContactParser(data: data) let hexEncodedPublicKeys = parser.parseHexEncodedPublicKeys() - let ourHexEncodedPublicKey = getUserHexEncodedPublicKey() + let userHexEncodedPublicKey = getUserHexEncodedPublicKey() // Try to establish sessions for hexEncodedPublicKey in hexEncodedPublicKeys { - guard hexEncodedPublicKey != ourHexEncodedPublicKey else { continue } // Skip self + guard hexEncodedPublicKey != userHexEncodedPublicKey else { continue } // Skip self // We don't update the friend request status; that's done in OWSMessageSender.sendMessage(_:) let friendRequestStatus = storage.getFriendRequestStatus(for: hexEncodedPublicKey, transaction: transaction) switch friendRequestStatus { diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index cb2625b6b..1a9838fde 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -384,7 +384,8 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; [allAttachmentIds addObjectsFromArray:[OutgoingMessagePreparer prepareMessageForSending:message transaction:transaction]]; - // Loki - Optimistically update friend request status when we can + // Loki: Optimistically update friend request status when we can. This is used for + // e.g. preventing AFRs from being sent twice on a contact sync. if ([LKFriendRequestProtocol shouldUpdateFriendRequestStatusFromMessage:message]) { [LKFriendRequestProtocol setFriendRequestStatusToSendingIfNeededForHexEncodedPublicKey:message.thread.contactIdentifier transaction:transaction]; }