From 3011175cef3087d38b17047ae58377ac4ef0ead3 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 31 Oct 2018 15:39:38 -0400 Subject: [PATCH] Fix "413 on prekey fetch" errors. --- SignalServiceKit/src/Contacts/Contact.m | 5 +++-- .../src/Contacts/SignalRecipient.h | 1 + .../src/Contacts/SignalRecipient.m | 22 +++++++++++-------- .../src/Messages/OWSMessageManager.m | 2 +- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/SignalServiceKit/src/Contacts/Contact.m b/SignalServiceKit/src/Contacts/Contact.m index e461824da..5f6265a64 100644 --- a/SignalServiceKit/src/Contacts/Contact.m +++ b/SignalServiceKit/src/Contacts/Contact.m @@ -212,8 +212,9 @@ NS_ASSUME_NONNULL_BEGIN __block NSMutableArray *result = [NSMutableArray array]; for (PhoneNumber *number in [self.parsedPhoneNumbers sortedArrayUsingSelector:@selector(compare:)]) { - SignalRecipient *_Nullable signalRecipient = - [SignalRecipient registeredRecipientForRecipientId:number.toE164 transaction:transaction]; + SignalRecipient *_Nullable signalRecipient = [SignalRecipient registeredRecipientForRecipientId:number.toE164 + mustHaveDevices:YES + transaction:transaction]; if (signalRecipient) { [result addObject:signalRecipient]; } diff --git a/SignalServiceKit/src/Contacts/SignalRecipient.h b/SignalServiceKit/src/Contacts/SignalRecipient.h index 9826f0475..4c72051c4 100644 --- a/SignalServiceKit/src/Contacts/SignalRecipient.h +++ b/SignalServiceKit/src/Contacts/SignalRecipient.h @@ -21,6 +21,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init NS_UNAVAILABLE; + (nullable instancetype)registeredRecipientForRecipientId:(NSString *)recipientId + mustHaveDevices:(BOOL)mustHaveDevices transaction:(YapDatabaseReadTransaction *)transaction; + (instancetype)getOrBuildUnsavedRecipientForRecipientId:(NSString *)recipientId transaction:(YapDatabaseReadTransaction *)transaction; diff --git a/SignalServiceKit/src/Contacts/SignalRecipient.m b/SignalServiceKit/src/Contacts/SignalRecipient.m index 80b08b854..3b90bceb2 100644 --- a/SignalServiceKit/src/Contacts/SignalRecipient.m +++ b/SignalServiceKit/src/Contacts/SignalRecipient.m @@ -41,8 +41,9 @@ NS_ASSUME_NONNULL_BEGIN { OWSAssertDebug(transaction); OWSAssertDebug(recipientId.length > 0); - - SignalRecipient *_Nullable recipient = [self registeredRecipientForRecipientId:recipientId transaction:transaction]; + + SignalRecipient *_Nullable recipient = + [self registeredRecipientForRecipientId:recipientId mustHaveDevices:NO transaction:transaction]; if (!recipient) { recipient = [[self alloc] initWithTextSecureIdentifier:recipientId]; } @@ -96,16 +97,17 @@ NS_ASSUME_NONNULL_BEGIN } + (nullable instancetype)registeredRecipientForRecipientId:(NSString *)recipientId + mustHaveDevices:(BOOL)mustHaveDevices transaction:(YapDatabaseReadTransaction *)transaction { OWSAssertDebug(transaction); OWSAssertDebug(recipientId.length > 0); SignalRecipient *_Nullable signalRecipient = [self fetchObjectWithUniqueID:recipientId transaction:transaction]; - if (signalRecipient.devices.count > 0) { - return signalRecipient; + if (mustHaveDevices && signalRecipient.devices.count < 1) { + return nil; } - return nil; + return signalRecipient; } - (void)addDevices:(NSSet *)devices @@ -217,8 +219,7 @@ NS_ASSUME_NONNULL_BEGIN + (BOOL)isRegisteredRecipient:(NSString *)recipientId transaction:(YapDatabaseReadTransaction *)transaction { - SignalRecipient *_Nullable instance = [self registeredRecipientForRecipientId:recipientId transaction:transaction]; - return instance.devices.count > 0; + return nil != [self registeredRecipientForRecipientId:recipientId mustHaveDevices:YES transaction:transaction]; } + (SignalRecipient *)markRecipientAsRegisteredAndGet:(NSString *)recipientId @@ -227,7 +228,8 @@ NS_ASSUME_NONNULL_BEGIN OWSAssertDebug(transaction); OWSAssertDebug(recipientId.length > 0); - SignalRecipient *_Nullable instance = [self registeredRecipientForRecipientId:recipientId transaction:transaction]; + SignalRecipient *_Nullable instance = + [self registeredRecipientForRecipientId:recipientId mustHaveDevices:YES transaction:transaction]; if (!instance) { OWSLogDebug(@"creating recipient: %@", recipientId); @@ -262,7 +264,9 @@ NS_ASSUME_NONNULL_BEGIN SignalRecipient *instance = [self getOrBuildUnsavedRecipientForRecipientId:recipientId transaction:transaction]; OWSLogDebug(@"Marking recipient as not registered: %@", recipientId); - [instance removeDevices:instance.devices.set]; + if (instance.devices.count > 0) { + [instance removeDevices:instance.devices.set]; + } [instance saveWithTransaction_internal:transaction]; } diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 8e2180790..68a20d28c 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -1456,7 +1456,7 @@ NS_ASSUME_NONNULL_BEGIN // Consult the device list cache we use for message sending // whether or not we know about this linked device. SignalRecipient *_Nullable recipient = - [SignalRecipient registeredRecipientForRecipientId:localNumber transaction:transaction]; + [SignalRecipient registeredRecipientForRecipientId:localNumber mustHaveDevices:NO transaction:transaction]; if (!recipient) { OWSFailDebug(@"No local SignalRecipient."); } else {