diff --git a/Pods b/Pods index 04c71c59e..a10cec6cd 160000 --- a/Pods +++ b/Pods @@ -1 +1 @@ -Subproject commit 04c71c59e4c3b060f8ff96b072efca3a74c4980f +Subproject commit a10cec6cd837552a4b0a88462636cf06494644c4 diff --git a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift index ebc7072fa..95ec4e1eb 100644 --- a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift @@ -108,6 +108,8 @@ public final class FriendRequestProtocol : NSObject { print("[Loki] Invalid Session ID: \(hexEncodedPublicKey).") return } + let ourHexEncodedPublicKey = getUserHexEncodedPublicKey() + let ourDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: ourHexEncodedPublicKey, in: transaction) // Accept all outstanding friend requests associated with this user and try to establish sessions with the // subset of their devices that haven't sent a friend request. let linkedDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: hexEncodedPublicKey, in: transaction) @@ -116,9 +118,7 @@ public final class FriendRequestProtocol : NSObject { if friendRequestStatus == .requestReceived { storage.setFriendRequestStatus(.friends, for: device, transaction: transaction) sendFriendRequestAcceptanceMessage(to: device, using: transaction) - } else if friendRequestStatus == .requestSent { - // We sent a friend request to this device before, how can we be sure that it hasn't expired? - } else if friendRequestStatus == .none || friendRequestStatus == .requestExpired { + } else if (friendRequestStatus == .none || friendRequestStatus == .requestExpired) && !ourDevices.contains(device) { // TODO: We should track these so that we can expire them and resend if needed MultiDeviceProtocol.getAutoGeneratedMultiDeviceFRMessageSend(for: device, in: transaction) .done(on: OWSDispatch.sendingQueue()) { autoGeneratedFRMessageSend in @@ -127,10 +127,12 @@ public final class FriendRequestProtocol : NSObject { } } } - // Send a contact sync message - let masterHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: hexEncodedPublicKey, in: transaction) ?? hexEncodedPublicKey - let syncManager = SSKEnvironment.shared.syncManager - syncManager.syncContact(masterHexEncodedPublicKey, transaction: transaction) + // Send a contact sync message if we became friends with another user + if (!ourDevices.contains(hexEncodedPublicKey)) { + let masterHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: hexEncodedPublicKey, in: transaction) ?? hexEncodedPublicKey + let syncManager = SSKEnvironment.shared.syncManager + syncManager.syncContact(masterHexEncodedPublicKey, transaction: transaction) + } } @objc(sendFriendRequestAcceptanceMessageToHexEncodedPublicKey:using:) diff --git a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift index e28e7d7ec..e521076c1 100644 --- a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift +++ b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift @@ -447,6 +447,31 @@ class FriendRequestProtocolTests : XCTestCase { } } + func test_acceptFriendRequestShouldNotSendAFriendRequestMessageToOurOwnDevice() { + let statuses: [LKFriendRequestStatus] = [ .none, .requestExpired ] + for status in statuses { + let ourDevice = LokiTestUtilities.getCurrentUserHexEncodedPublicKey() + storage.dbReadWriteConnection.readWrite { transaction in + self.storage.setFriendRequestStatus(status, for: ourDevice, transaction: transaction) + } + + let expectation = self.expectation(description: "sent message") + + let messageSender = self.messageSender + messageSender.sendMessageWasCalledBlock = { sentMessage in + XCTFail("Expected message to not be sent") + } + + storage.dbReadWriteConnection.readWrite { transaction in + FriendRequestProtocol.acceptFriendRequest(from: ourDevice, using: transaction) + } + + expectation.fulfillAfter(2) + wait(for: [ expectation ], timeout: 2) + messageSender.sendMessageWasCalledBlock = nil + } + } + func test_acceptFriendRequestShouldNotDoAnythingIfRequestHasBeenSent() { // Case: We sent Bob a friend request. // We can't accept because we don't have keys to communicate with Bob. diff --git a/SignalServiceKit/src/Loki/Utilities/LokiTestUtilities.swift b/SignalServiceKit/src/Loki/Utilities/LokiTestUtilities.swift index 1f3187ec3..9a09bd5e6 100644 --- a/SignalServiceKit/src/Loki/Utilities/LokiTestUtilities.swift +++ b/SignalServiceKit/src/Loki/Utilities/LokiTestUtilities.swift @@ -23,6 +23,10 @@ enum LokiTestUtilities { return Curve25519.generateKeyPair() } + public static func getCurrentUserHexEncodedPublicKey() -> String { + return OWSIdentityManager.shared().identityKeyPair()!.hexEncodedPublicKey + } + public static func generateHexEncodedPublicKey() -> String { return generateKeyPair().hexEncodedPublicKey }