Don't send sync message for our own device.

Don't send an auto generated friend request to our own device.
This commit is contained in:
Mikunj 2020-05-05 14:01:07 +10:00
parent cfb3040b72
commit 1786569584
4 changed files with 39 additions and 8 deletions

2
Pods

@ -1 +1 @@
Subproject commit 04c71c59e4c3b060f8ff96b072efca3a74c4980f
Subproject commit a10cec6cd837552a4b0a88462636cf06494644c4

View File

@ -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:)

View File

@ -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.

View File

@ -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
}