Respond to CR.

pull/1/head
Matthew Chen 7 years ago
parent 9519e7961a
commit 353f91db64

@ -31,16 +31,6 @@ public class OWSMessageSend: NSObject {
@objc @objc
public var hasWebsocketSendFailed = false 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 @objc
public var unidentifiedAccess: SSKUnidentifiedAccess? public var unidentifiedAccess: SSKUnidentifiedAccess?
@ -85,6 +75,13 @@ public class OWSMessageSend: NSObject {
@objc @objc
public var isUDSend: Bool { 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
}
} }

@ -1040,7 +1040,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
OWSLogDebug(@"UD send failed; failing over to non-UD send."); OWSLogDebug(@"UD send failed; failing over to non-UD send.");
[self.udManager setUnidentifiedAccessMode:UnidentifiedAccessModeDisabled [self.udManager setUnidentifiedAccessMode:UnidentifiedAccessModeDisabled
recipientId:recipient.uniqueId]; recipientId:recipient.uniqueId];
messageSend.hasUDAuthFailed = YES; [messageSend setHasUDAuthFailed];
dispatch_async([OWSDispatch sendingQueue], ^{ dispatch_async([OWSDispatch sendingQueue], ^{
[self sendMessageToRecipient:messageSend]; [self sendMessageToRecipient:messageSend];
}); });
@ -1070,7 +1070,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
OWSLogDebug(@"UD send failed; failing over to non-UD send."); OWSLogDebug(@"UD send failed; failing over to non-UD send.");
[self.udManager setUnidentifiedAccessMode:UnidentifiedAccessModeDisabled [self.udManager setUnidentifiedAccessMode:UnidentifiedAccessModeDisabled
recipientId:recipient.uniqueId]; recipientId:recipient.uniqueId];
messageSend.hasUDAuthFailed = YES; [messageSend setHasUDAuthFailed];
dispatch_async([OWSDispatch sendingQueue], ^{ dispatch_async([OWSDispatch sendingQueue], ^{
[self sendMessageToRecipient:messageSend]; [self sendMessageToRecipient:messageSend];
}); });
@ -1464,8 +1464,6 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
} }
dispatch_semaphore_signal(sema); 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); dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
if (exception) { if (exception) {
@throw exception; @throw exception;
@ -1499,6 +1497,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
} }
} }
} }
- (void)makePrekeyRequestForMessageSend:(OWSMessageSend *)messageSend - (void)makePrekeyRequestForMessageSend:(OWSMessageSend *)messageSend
deviceId:(NSNumber *)deviceId deviceId:(NSNumber *)deviceId
success:(void (^)(PreKeyBundle *_Nullable))success success:(void (^)(PreKeyBundle *_Nullable))success
@ -1541,7 +1540,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
[self.udManager setUnidentifiedAccessMode:UnidentifiedAccessModeDisabled [self.udManager setUnidentifiedAccessMode:UnidentifiedAccessModeDisabled
recipientId:recipient.uniqueId]; recipientId:recipient.uniqueId];
}); });
messageSend.hasUDAuthFailed = YES; [messageSend setHasUDAuthFailed];
// Try again without UD auth. // Try again without UD auth.
[self makePrekeyRequestForMessageSend:messageSend deviceId:deviceId success:success failure:failure]; [self makePrekeyRequestForMessageSend:messageSend deviceId:deviceId success:success failure:failure];
return; return;

@ -94,41 +94,24 @@ public class SignalServiceRestClient: NSObject, SignalServiceClient {
} }
public func retrieveProfile(recipientId: RecipientIdentifier, unidentifiedAccess: SSKUnidentifiedAccess?) -> Promise<SignalServiceProfile> { public func retrieveProfile(recipientId: RecipientIdentifier, unidentifiedAccess: SSKUnidentifiedAccess?) -> Promise<SignalServiceProfile> {
let (promise, resolver) = Promise<(task: URLSessionDataTask, responseObject: Any?)>.pending()
let request = OWSRequestFactory.getProfileRequest(recipientId: recipientId, unidentifiedAccess: unidentifiedAccess) let request = OWSRequestFactory.getProfileRequest(recipientId: recipientId, unidentifiedAccess: unidentifiedAccess)
networkManager.makeRequest(request, return networkManager.makePromise(request: request)
success: { task, responseObject in .recover { (error: Error) -> Promise<(task: URLSessionDataTask, responseObject: Any?)> in
resolver.fulfill((task: task, responseObject: responseObject)) switch error {
}, case NetworkManagerError.taskError(let task, _):
failure: { task, error in let statusCode = task.statusCode()
let statusCode = task.statusCode() if unidentifiedAccess != nil && (statusCode == 401 || statusCode == 403) {
if unidentifiedAccess != nil && (statusCode == 401 || statusCode == 403) { Logger.verbose("REST profile request failing over to non-UD auth.")
Logger.verbose("REST profile request failing over to non-UD auth.")
self.udManager.setUnidentifiedAccessMode(.disabled, recipientId: recipientId)
self.udManager.setUnidentifiedAccessMode(.disabled, recipientId: recipientId)
let nonUDRequest = OWSRequestFactory.getProfileRequest(recipientId: recipientId, unidentifiedAccess: nil)
let nonUDRequest = OWSRequestFactory.getProfileRequest(recipientId: recipientId, unidentifiedAccess: nil) return self.networkManager.makePromise(request: nonUDRequest)
self.networkManager.makeRequest(nonUDRequest, }
success: { task, responseObject in default: break
resolver.fulfill((task: task, responseObject: responseObject)) }
}, throw error
failure: { task, error in }.map { _, responseObject 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 try SignalServiceProfile(recipientId: recipientId, responseObject: responseObject) return try SignalServiceProfile(recipientId: recipientId, responseObject: responseObject)
} }
} }

Loading…
Cancel
Save