diff --git a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift index f7c90a434..b31609720 100644 --- a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift @@ -108,8 +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) + let userHexEncodedPublicKey = getUserHexEncodedPublicKey() + let userLinkedDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: userHexEncodedPublicKey, 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) @@ -119,13 +119,13 @@ public final class FriendRequestProtocol : NSObject { storage.setFriendRequestStatus(.friends, for: device, transaction: transaction) sendFriendRequestAcceptanceMessage(to: device, using: transaction) // Send a contact sync message if needed - guard !ourDevices.contains(hexEncodedPublicKey) else { return } + guard !userLinkedDevices.contains(hexEncodedPublicKey) else { return } let masterHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: hexEncodedPublicKey, in: transaction) ?? hexEncodedPublicKey let syncManager = SSKEnvironment.shared.syncManager syncManager.syncContact(masterHexEncodedPublicKey, transaction: 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 && !ourDevices.contains(device) { + } else if friendRequestStatus == .none || friendRequestStatus == .requestExpired { // 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 @@ -169,10 +169,10 @@ public final class FriendRequestProtocol : NSObject { @objc(shouldUpdateFriendRequestStatusFromMessage:) public static func shouldUpdateFriendRequestStatus(from message: TSOutgoingMessage) -> Bool { - let isFriendRequestMessage = message is FriendRequestMessage - let isSessionRequestMessage = message is SessionRequestMessage - let isDeviceLinkRequestMessage = message is DeviceLinkMessage && (message as! DeviceLinkMessage).kind == .request - return (isFriendRequestMessage && !isSessionRequestMessage) || isDeviceLinkRequestMessage; + // The order of these checks matters + if (message as? DeviceLinkMessage)?.kind == .request { return true } + if message is SessionRequestMessage { return false } + return message is FriendRequestMessage } @objc(setFriendRequestStatusToSendingIfNeededForHexEncodedPublicKey:transaction:) diff --git a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift index e521076c1..e7c066bc5 100644 --- a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift +++ b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocolTests.swift @@ -428,7 +428,7 @@ class FriendRequestProtocolTests : XCTestCase { self.storage.setFriendRequestStatus(status, for: bob, transaction: transaction) } - let expectation = self.expectation(description: "sent message") + let expectation = self.expectation(description: "Send message") let messageSender = self.messageSender messageSender.sendMessageWasCalledBlock = { sentMessage in @@ -451,15 +451,16 @@ class FriendRequestProtocolTests : XCTestCase { 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 expectation = self.expectation(description: "Send message") let messageSender = self.messageSender messageSender.sendMessageWasCalledBlock = { sentMessage in - XCTFail("Expected message to not be sent") + XCTFail("Expected message not to be sent.") } storage.dbReadWriteConnection.readWrite { transaction in @@ -625,7 +626,7 @@ class FriendRequestProtocolTests : XCTestCase { let thread = LokiTestUtilities.createContactThread(for: LokiTestUtilities.generateHexEncodedPublicKey()) let message = TSOutgoingMessage(in: thread, messageBody: nil, attachmentId: nil) - let friendRequest = FriendRequestMessage(outgoingMessageWithTimestamp: 1, in: thread, messageBody: "") + let friendRequest = FriendRequestMessage(timestamp: 1, thread: thread, body: "") let sessionRequest = SessionRequestMessage(thread: thread) guard let deviceLinkRequest = DeviceLinkMessage(in: thread, masterHexEncodedPublicKey: "", slaveHexEncodedPublicKey: "", masterSignature: nil, slaveSignature: Data(capacity: 0)), let deviceLinkAuthorisation = DeviceLinkMessage(in: thread, masterHexEncodedPublicKey: "", slaveHexEncodedPublicKey: "", masterSignature: Data(capacity: 0), slaveSignature: Data(capacity: 0)) else { return XCTFail() } diff --git a/SignalServiceKit/src/Loki/Protocol/Friend Requests/LKFriendRequestMessage.h b/SignalServiceKit/src/Loki/Protocol/Friend Requests/LKFriendRequestMessage.h index 36c70cfac..bab75524c 100644 --- a/SignalServiceKit/src/Loki/Protocol/Friend Requests/LKFriendRequestMessage.h +++ b/SignalServiceKit/src/Loki/Protocol/Friend Requests/LKFriendRequestMessage.h @@ -4,8 +4,6 @@ NS_SWIFT_NAME(FriendRequestMessage) @interface LKFriendRequestMessage : TSOutgoingMessage -- (_Nonnull instancetype)initOutgoingMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread - messageBody:(nullable NSString *)body; +- (_Nonnull instancetype)initWithTimestamp:(uint64_t)timestamp thread:(nullable TSThread *)thread body:(nullable NSString *)body; @end diff --git a/SignalServiceKit/src/Loki/Protocol/Friend Requests/LKFriendRequestMessage.m b/SignalServiceKit/src/Loki/Protocol/Friend Requests/LKFriendRequestMessage.m index b7070bedf..c1be09c3f 100644 --- a/SignalServiceKit/src/Loki/Protocol/Friend Requests/LKFriendRequestMessage.m +++ b/SignalServiceKit/src/Loki/Protocol/Friend Requests/LKFriendRequestMessage.m @@ -9,19 +9,10 @@ @implementation LKFriendRequestMessage -- (instancetype)initOutgoingMessageWithTimestamp:(uint64_t)timestamp - inThread:(nullable TSThread *)thread - messageBody:(nullable NSString *)body { - return [self initOutgoingMessageWithTimestamp:timestamp - inThread:thread - messageBody:body - attachmentIds:@[] - expiresInSeconds:0 expireStartedAt:0 - isVoiceMessage:false - groupMetaMessage:TSGroupMetaMessageUnspecified - quotedMessage:nil - contactShare:nil - linkPreview:nil]; +#pragma mark Initialization +- (instancetype)initWithTimestamp:(uint64_t)timestamp thread:(nullable TSThread *)thread body:(nullable NSString *)body { + return [self initOutgoingMessageWithTimestamp:timestamp inThread:thread messageBody:body attachmentIds:@[] expiresInSeconds:0 expireStartedAt:0 + isVoiceMessage:false groupMetaMessage:TSGroupMetaMessageUnspecified quotedMessage:nil contactShare:nil linkPreview:nil]; } #pragma mark Building diff --git a/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift index ac41dcd0c..ce8f31eec 100644 --- a/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift @@ -151,7 +151,7 @@ public final class MultiDeviceProtocol : NSObject { @objc(getAutoGeneratedMultiDeviceFRMessageForHexEncodedPublicKey:in:) public static func getAutoGeneratedMultiDeviceFRMessage(for hexEncodedPublicKey: String, in transaction: YapDatabaseReadWriteTransaction) -> FriendRequestMessage { let thread = TSContactThread.getOrCreateThread(withContactId: hexEncodedPublicKey, transaction: transaction) - let result = FriendRequestMessage(outgoingMessageWithTimestamp: NSDate.ows_millisecondTimeStamp(), in: thread, messageBody: "Please accept to enable messages to be synced across devices") + let result = FriendRequestMessage(timestamp: NSDate.ows_millisecondTimeStamp(), thread: thread, body: "Please accept to enable messages to be synced across devices") result.skipSave = true // TODO: Why is this necessary again? return result } diff --git a/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift index 6e856ca9f..15a404543 100644 --- a/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift @@ -163,7 +163,6 @@ public final class SyncMessagesProtocol : NSObject { } public static func handleContactSyncMessageData(_ data: Data, using transaction: YapDatabaseReadWriteTransaction) { - let parser = ContactParser(data: data) let hexEncodedPublicKeys = parser.parseHexEncodedPublicKeys() // Try to establish sessions diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 7233d4548..2ddafcd1c 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1178,13 +1178,13 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; uint64_t ttl = ((NSNumber *)signalMessageInfo[@"ttl"]).unsignedIntegerValue; BOOL isPing = ((NSNumber *)signalMessageInfo[@"isPing"]).boolValue; LKSignalMessage *signalMessage = [[LKSignalMessage alloc] initWithType:type timestamp:timestamp senderID:senderID senderDeviceID:senderDeviceID content:content recipientID:recipientID ttl:ttl isPing:isPing]; - BOOL shouldUpdateFriendRequest = [LKFriendRequestProtocol shouldUpdateFriendRequestStatusFromMessage:message]; + BOOL shouldUpdateFriendRequestStatus = [LKFriendRequestProtocol shouldUpdateFriendRequestStatusFromMessage:message]; [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { if (!message.skipSave) { // Update the PoW calculation status [message saveIsCalculatingProofOfWork:YES withTransaction:transaction]; } - if (shouldUpdateFriendRequest) { + if (shouldUpdateFriendRequestStatus) { [LKFriendRequestProtocol setFriendRequestStatusToSendingIfNeededForHexEncodedPublicKey:recipientID transaction:transaction]; } }]; @@ -1196,7 +1196,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; // Update the PoW calculation status [message saveIsCalculatingProofOfWork:NO withTransaction:transaction]; } - if (shouldUpdateFriendRequest) { + if (shouldUpdateFriendRequestStatus) { [LKFriendRequestProtocol setFriendRequestStatusToFailedIfNeededForHexEncodedPublicKey:recipientID transaction:transaction]; } }]; @@ -1216,7 +1216,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; if (isSuccess) { return; } // Succeed as soon as the first promise succeeds [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.messageSent object:[[NSNumber alloc] initWithUnsignedLongLong:signalMessage.timestamp]]; isSuccess = YES; - if (shouldUpdateFriendRequest) { + if (shouldUpdateFriendRequestStatus) { [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { if (!message.skipSave) { // Update the message