diff --git a/SignalServiceKit/src/Messages/OWSMessageSend.swift b/SignalServiceKit/src/Messages/OWSMessageSend.swift index 2910d18ed..b192f8bf9 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSend.swift +++ b/SignalServiceKit/src/Messages/OWSMessageSend.swift @@ -31,16 +31,6 @@ public class OWSMessageSend: NSObject { @objc public var hasWebsocketSendFailed = false - // We "fail over" to non-UD sends after auth errors sending via UD. - @objc - public var hasUDAuthFailed = false { - didSet { - if hasUDAuthFailed { - unidentifiedAccess = nil - } - } - } - @objc public var unidentifiedAccess: SSKUnidentifiedAccess? @@ -85,6 +75,13 @@ public class OWSMessageSend: NSObject { @objc public var isUDSend: Bool { - return (!hasUDAuthFailed && self.unidentifiedAccess != nil) + return self.unidentifiedAccess != nil } + + @objc + public func setHasUDAuthFailed() { + // We "fail over" to non-UD sends after auth errors sending via UD. + unidentifiedAccess = nil + } + } diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 0e01d790b..efd0e6072 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1040,7 +1040,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; OWSLogDebug(@"UD send failed; failing over to non-UD send."); [self.udManager setUnidentifiedAccessMode:UnidentifiedAccessModeDisabled recipientId:recipient.uniqueId]; - messageSend.hasUDAuthFailed = YES; + [messageSend setHasUDAuthFailed]; dispatch_async([OWSDispatch sendingQueue], ^{ [self sendMessageToRecipient:messageSend]; }); @@ -1070,7 +1070,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; OWSLogDebug(@"UD send failed; failing over to non-UD send."); [self.udManager setUnidentifiedAccessMode:UnidentifiedAccessModeDisabled recipientId:recipient.uniqueId]; - messageSend.hasUDAuthFailed = YES; + [messageSend setHasUDAuthFailed]; dispatch_async([OWSDispatch sendingQueue], ^{ [self sendMessageToRecipient:messageSend]; }); @@ -1464,8 +1464,6 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; } dispatch_semaphore_signal(sema); }]; - // FIXME: Currently this happens within a readwrite transaction - meaning our read-write transaction blocks - // on a network request. dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); if (exception) { @throw exception; @@ -1499,6 +1497,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; } } } + - (void)makePrekeyRequestForMessageSend:(OWSMessageSend *)messageSend deviceId:(NSNumber *)deviceId success:(void (^)(PreKeyBundle *_Nullable))success @@ -1541,7 +1540,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; [self.udManager setUnidentifiedAccessMode:UnidentifiedAccessModeDisabled recipientId:recipient.uniqueId]; }); - messageSend.hasUDAuthFailed = YES; + [messageSend setHasUDAuthFailed]; // Try again without UD auth. [self makePrekeyRequestForMessageSend:messageSend deviceId:deviceId success:success failure:failure]; return; diff --git a/SignalServiceKit/src/Network/SignalServiceClient.swift b/SignalServiceKit/src/Network/SignalServiceClient.swift index 878eaa4a8..843275c40 100644 --- a/SignalServiceKit/src/Network/SignalServiceClient.swift +++ b/SignalServiceKit/src/Network/SignalServiceClient.swift @@ -94,41 +94,24 @@ public class SignalServiceRestClient: NSObject, SignalServiceClient { } public func retrieveProfile(recipientId: RecipientIdentifier, unidentifiedAccess: SSKUnidentifiedAccess?) -> Promise { - let (promise, resolver) = Promise<(task: URLSessionDataTask, responseObject: Any?)>.pending() - let request = OWSRequestFactory.getProfileRequest(recipientId: recipientId, unidentifiedAccess: unidentifiedAccess) - networkManager.makeRequest(request, - success: { task, responseObject in - resolver.fulfill((task: task, responseObject: responseObject)) - }, - failure: { task, error in - let statusCode = task.statusCode() - if unidentifiedAccess != nil && (statusCode == 401 || statusCode == 403) { - Logger.verbose("REST profile request failing over to non-UD auth.") - - self.udManager.setUnidentifiedAccessMode(.disabled, recipientId: recipientId) - - let nonUDRequest = OWSRequestFactory.getProfileRequest(recipientId: recipientId, unidentifiedAccess: nil) - self.networkManager.makeRequest(nonUDRequest, - success: { task, responseObject in - resolver.fulfill((task: task, responseObject: responseObject)) - }, - failure: { task, error in - let nmError = NetworkManagerError.taskError(task: task, underlyingError: error) - let nsError: NSError = nmError as NSError - nsError.isRetryable = (error as NSError).isRetryable - resolver.reject(nsError) - }) - return - } - Logger.info("REST profile request failed.") - let nmError = NetworkManagerError.taskError(task: task, underlyingError: error) - let nsError: NSError = nmError as NSError - nsError.isRetryable = (error as NSError).isRetryable - resolver.reject(nsError) - }) - return promise.map { _, responseObject in - Logger.info("REST profile request succeeded.") + return networkManager.makePromise(request: request) + .recover { (error: Error) -> Promise<(task: URLSessionDataTask, responseObject: Any?)> in + switch error { + case NetworkManagerError.taskError(let task, _): + let statusCode = task.statusCode() + if unidentifiedAccess != nil && (statusCode == 401 || statusCode == 403) { + Logger.verbose("REST profile request failing over to non-UD auth.") + + self.udManager.setUnidentifiedAccessMode(.disabled, recipientId: recipientId) + + let nonUDRequest = OWSRequestFactory.getProfileRequest(recipientId: recipientId, unidentifiedAccess: nil) + return self.networkManager.makePromise(request: nonUDRequest) + } + default: break + } + throw error + }.map { _, responseObject in return try SignalServiceProfile(recipientId: recipientId, responseObject: responseObject) } }