diff --git a/SignalServiceKit/src/Contacts/SignalRecipient.h b/SignalServiceKit/src/Contacts/SignalRecipient.h index 5803b20fe2..559f0f9698 100644 --- a/SignalServiceKit/src/Contacts/SignalRecipient.h +++ b/SignalServiceKit/src/Contacts/SignalRecipient.h @@ -80,13 +80,8 @@ NS_DESIGNATED_INITIALIZER NS_SWIFT_NAME(init(grdbId:uniqueId:devices:recipientPh transaction:(SDSAnyReadTransaction *)transaction NS_SWIFT_NAME(get(address:mustHaveDevices:transaction:)); -+ (void)updateWithAddress:(SignalServiceAddress *)address - devicesToAdd:(nullable NSArray *)devicesToAdd - devicesToRemove:(nullable NSArray *)devicesToRemove - transaction:(SDSAnyWriteTransaction *)transaction; - -- (void)updateWithDevicesToAdd:(nullable NSArray *)devicesToAdd - devicesToRemove:(nullable NSArray *)devicesToRemove +- (void)updateWithDevicesToAdd:(NSArray *)devicesToAdd + devicesToRemove:(NSArray *)devicesToRemove transaction:(SDSAnyWriteTransaction *)transaction; @property (nonatomic, nullable) NSString *recipientPhoneNumber; diff --git a/SignalServiceKit/src/Contacts/SignalRecipient.m b/SignalServiceKit/src/Contacts/SignalRecipient.m index d3fff2dc0c..4b74d57da4 100644 --- a/SignalServiceKit/src/Contacts/SignalRecipient.m +++ b/SignalServiceKit/src/Contacts/SignalRecipient.m @@ -202,22 +202,8 @@ const uint64_t SignalRecipientDistantPastUnregisteredTimestamp = 1; } } -+ (void)updateWithAddress:(SignalServiceAddress *)address - devicesToAdd:(nullable NSArray *)devicesToAdd - devicesToRemove:(nullable NSArray *)devicesToRemove - transaction:(SDSAnyWriteTransaction *)transaction -{ - OWSAssertDebug(transaction); - OWSAssertDebug(devicesToAdd.count > 0 || devicesToRemove.count > 0); - - SignalRecipient *recipient = [self fetchOrCreateFor:address - trustLevel:SignalRecipientTrustLevelLow - transaction:transaction]; - [recipient updateWithDevicesToAdd:devicesToAdd devicesToRemove:devicesToRemove transaction:transaction]; -} - -- (void)updateWithDevicesToAdd:(nullable NSArray *)devicesToAdd - devicesToRemove:(nullable NSArray *)devicesToRemove +- (void)updateWithDevicesToAdd:(NSArray *)devicesToAdd + devicesToRemove:(NSArray *)devicesToRemove transaction:(SDSAnyWriteTransaction *)transaction { OWSAssertDebug(transaction); diff --git a/SignalServiceKit/src/Contacts/SignalRecipient.swift b/SignalServiceKit/src/Contacts/SignalRecipient.swift index c45553df85..f932d9178e 100644 --- a/SignalServiceKit/src/Contacts/SignalRecipient.swift +++ b/SignalServiceKit/src/Contacts/SignalRecipient.swift @@ -51,7 +51,6 @@ extension SignalRecipient { // MARK: - - @objc @discardableResult public class func fetchOrCreate( for address: SignalServiceAddress, diff --git a/SignalServiceKit/src/Messages/MessageSender+SenderKey.swift b/SignalServiceKit/src/Messages/MessageSender+SenderKey.swift index 2991fde3b7..360e54b204 100644 --- a/SignalServiceKit/src/Messages/MessageSender+SenderKey.swift +++ b/SignalServiceKit/src/Messages/MessageSender+SenderKey.swift @@ -647,10 +647,11 @@ extension MessageSender { self.databaseStorage.write { writeTx in for account in responseBody { MessageSender.updateDevices( - address: SignalServiceAddress(uuid: account.uuid), + serviceId: ServiceIdObjC(uuidValue: account.uuid), devicesToAdd: account.devices.missingDevices.map { NSNumber(value: $0) }, devicesToRemove: account.devices.extraDevices.map { NSNumber(value: $0) }, - transaction: writeTx) + transaction: writeTx + ) } } throw SenderKeyError.deviceUpdate diff --git a/SignalServiceKit/src/Messages/MessageSender.m b/SignalServiceKit/src/Messages/MessageSender.m index e540a4938b..c64e45a4f5 100644 --- a/SignalServiceKit/src/Messages/MessageSender.m +++ b/SignalServiceKit/src/Messages/MessageSender.m @@ -978,12 +978,11 @@ NSString *const MessageSenderSpamChallengeResolvedException = @"SpamChallengeRes if ([exception.name isEqualToString:MessageSenderInvalidDeviceException]) { // If we have an invalid device exception, remove this device from // the recipient and suppress the error. - SignalServiceAddress *recipientAddress = [[SignalServiceAddress alloc] initWithServiceIdObjC:serviceId]; DatabaseStorageWrite(self.databaseStorage, ^(SDSAnyWriteTransaction *transaction) { - [MessageSender updateDevicesWithAddress:recipientAddress - devicesToAdd:@[] - devicesToRemove:@[ deviceId ] - transaction:transaction]; + [MessageSender updateDevicesWithServiceId:serviceId + devicesToAdd:@[] + devicesToRemove:@[ deviceId ] + transaction:transaction]; }); } else if ([exception.name isEqualToString:NoSessionForTransientMessageException]) { // When users re-register, we don't want transient messages (like typing diff --git a/SignalServiceKit/src/Messages/MessageSender.swift b/SignalServiceKit/src/Messages/MessageSender.swift index 019a48cddb..024ab20522 100644 --- a/SignalServiceKit/src/Messages/MessageSender.swift +++ b/SignalServiceKit/src/Messages/MessageSender.swift @@ -145,7 +145,7 @@ extension MessageSender { case MessageSenderError.missingDevice: self.databaseStorage.write { transaction in MessageSender.updateDevices( - address: messageSend.address, + serviceId: messageSend.serviceId, devicesToAdd: [], devicesToRemove: [NSNumber(value: deviceId)], transaction: transaction @@ -1122,8 +1122,7 @@ extension MessageSender { } extension MessageSender { - private func handleMismatchedDevices(_ response: MessageSendFailureResponse, - messageSend: OWSMessageSend) { + private func handleMismatchedDevices(_ response: MessageSendFailureResponse, messageSend: OWSMessageSend) { owsAssertDebug(!Thread.isMainThread) let extraDevices: [Int] = response.extraDevices ?? [] @@ -1132,10 +1131,12 @@ extension MessageSender { let devicesToRemove = extraDevices.map { NSNumber(value: $0) } Self.databaseStorage.write { transaction in - MessageSender.updateDevices(address: messageSend.address, - devicesToAdd: devicesToAdd, - devicesToRemove: devicesToRemove, - transaction: transaction) + MessageSender.updateDevices( + serviceId: messageSend.serviceId, + devicesToAdd: devicesToAdd, + devicesToRemove: devicesToRemove, + transaction: transaction + ) } } @@ -1163,10 +1164,12 @@ extension MessageSender { } @objc - public static func updateDevices(address: SignalServiceAddress, - devicesToAdd: [NSNumber], - devicesToRemove: [NSNumber], - transaction: SDSAnyWriteTransaction) { + public static func updateDevices( + serviceId: ServiceIdObjC, + devicesToAdd: [NSNumber], + devicesToRemove: [NSNumber], + transaction: SDSAnyWriteTransaction + ) { owsAssertDebug(!Thread.isMainThread) guard !devicesToAdd.isEmpty || !devicesToRemove.isEmpty else { owsFailDebug("No devices to add or remove.") @@ -1174,22 +1177,27 @@ extension MessageSender { } owsAssertDebug(Set(devicesToAdd).isDisjoint(with: devicesToRemove)) - if !devicesToAdd.isEmpty, address.isLocalAddress { + if !devicesToAdd.isEmpty, SignalServiceAddress(serviceId.wrappedValue).isLocalAddress { deviceManager.setMayHaveLinkedDevices() } - SignalRecipient.update( - with: address, - devicesToAdd: devicesToAdd, - devicesToRemove: devicesToRemove, + let recipient = SignalRecipient.fetchOrCreate( + for: SignalServiceAddress(serviceId.wrappedValue), + trustLevel: .low, transaction: transaction ) + recipient.updateWithDevices(toAdd: devicesToAdd, devicesToRemove: devicesToRemove, transaction: transaction) + if !devicesToRemove.isEmpty { - Logger.info("Archiving sessions for extra devices: \(devicesToRemove), \(devicesToRemove)") + Logger.info("Archiving sessions for extra devices: \(devicesToRemove)") let sessionStore = signalProtocolStore(for: .aci).sessionStore for deviceId in devicesToRemove { - sessionStore.archiveSession(for: address, deviceId: deviceId.int32Value, transaction: transaction) + sessionStore.archiveSession( + for: SignalServiceAddress(serviceId.wrappedValue), + deviceId: deviceId.int32Value, + transaction: transaction + ) } } }