Swiftify SignalRecipient.fetchOrCreate callers

This commit is contained in:
Max Radermacher 2023-03-23 15:03:04 -07:00
parent a254819cc7
commit 3b751ebd50
6 changed files with 37 additions and 49 deletions

View File

@ -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<NSNumber *> *)devicesToAdd
devicesToRemove:(nullable NSArray<NSNumber *> *)devicesToRemove
transaction:(SDSAnyWriteTransaction *)transaction;
- (void)updateWithDevicesToAdd:(nullable NSArray<NSNumber *> *)devicesToAdd
devicesToRemove:(nullable NSArray<NSNumber *> *)devicesToRemove
- (void)updateWithDevicesToAdd:(NSArray<NSNumber *> *)devicesToAdd
devicesToRemove:(NSArray<NSNumber *> *)devicesToRemove
transaction:(SDSAnyWriteTransaction *)transaction;
@property (nonatomic, nullable) NSString *recipientPhoneNumber;

View File

@ -202,22 +202,8 @@ const uint64_t SignalRecipientDistantPastUnregisteredTimestamp = 1;
}
}
+ (void)updateWithAddress:(SignalServiceAddress *)address
devicesToAdd:(nullable NSArray<NSNumber *> *)devicesToAdd
devicesToRemove:(nullable NSArray<NSNumber *> *)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<NSNumber *> *)devicesToAdd
devicesToRemove:(nullable NSArray<NSNumber *> *)devicesToRemove
- (void)updateWithDevicesToAdd:(NSArray<NSNumber *> *)devicesToAdd
devicesToRemove:(NSArray<NSNumber *> *)devicesToRemove
transaction:(SDSAnyWriteTransaction *)transaction
{
OWSAssertDebug(transaction);

View File

@ -51,7 +51,6 @@ extension SignalRecipient {
// MARK: -
@objc
@discardableResult
public class func fetchOrCreate(
for address: SignalServiceAddress,

View File

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

View File

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

View File

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