Fix "413 on prekey fetch" errors.

This commit is contained in:
Matthew Chen 2018-10-31 15:39:38 -04:00
parent e89d8b40d7
commit 3011175cef
4 changed files with 18 additions and 12 deletions

View File

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

View File

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

View File

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

View File

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