Respond to CR.

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

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

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

@ -94,41 +94,24 @@ public class SignalServiceRestClient: NSObject, SignalServiceClient {
}
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)
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)
}
}

Loading…
Cancel
Save