Merge tag '2.31.0.37' into release/2.32.0

pull/1/head
Michael Kirk 7 years ago
commit 12b916ad36

@ -198,9 +198,9 @@ private
private func acknowledgeDelivery(envelope: SSKProtoEnvelope) { private func acknowledgeDelivery(envelope: SSKProtoEnvelope) {
let request: TSRequest let request: TSRequest
if let serverGuid = envelope.serverGuid, envelope.hasServerTimestamp { if let serverGuid = envelope.serverGuid, envelope.hasServerTimestamp, serverGuid.count > 0, envelope.serverTimestamp > 0 {
request = OWSRequestFactory.acknowledgeMessageDeliveryRequest(withServerGuid: serverGuid, serverTimestamp: envelope.serverTimestamp) request = OWSRequestFactory.acknowledgeMessageDeliveryRequest(withServerGuid: serverGuid, serverTimestamp: envelope.serverTimestamp)
} else if let source = envelope.source { } else if let source = envelope.source, source.count > 0, envelope.timestamp > 0 {
request = OWSRequestFactory.acknowledgeMessageDeliveryRequest(withSource: source, timestamp: envelope.timestamp) request = OWSRequestFactory.acknowledgeMessageDeliveryRequest(withSource: source, timestamp: envelope.timestamp)
} else { } else {
owsFailDebug("Cannot ACK message which has neither source, nor server GUID and timestamp.") owsFailDebug("Cannot ACK message which has neither source, nor server GUID and timestamp.")

@ -137,6 +137,11 @@ NS_ASSUME_NONNULL_BEGIN
[Environment.shared.contactsManager requestSystemContactsOnce]; [Environment.shared.contactsManager requestSystemContactsOnce];
}]]; }]];
[items addObject:[OWSTableItem itemWithTitle:@"Cycle websockets"
actionBlock:^() {
[SSKEnvironment.shared.socketManager cycleSocket];
}]];
return [OWSTableSection sectionWithTitle:self.name items:items]; return [OWSTableSection sectionWithTitle:self.name items:items];
} }

@ -17,7 +17,7 @@ extern uint32_t const OWSDevicePrimaryDeviceId;
- (BOOL)mayHaveLinkedDevices:(YapDatabaseConnection *)dbConnection; - (BOOL)mayHaveLinkedDevices:(YapDatabaseConnection *)dbConnection;
- (void)setMayHaveLinkedDevices; - (void)setMayHaveLinkedDevices;
- (void)clearMayHaveLinkedDevicesIfNotSet; - (void)clearMayHaveLinkedDevices;
- (BOOL)hasReceivedSyncMessageInLastSeconds:(NSTimeInterval)intervalSeconds; - (BOOL)hasReceivedSyncMessageInLastSeconds:(NSTimeInterval)intervalSeconds;
- (void)setHasReceivedSyncMessage; - (void)setHasReceivedSyncMessage;

@ -62,17 +62,14 @@ NSString *const kOWSPrimaryStorage_MayHaveLinkedDevices = @"kTSStorageManager_Ma
// to avoid unnecessary message sends for sync messages until we learn // to avoid unnecessary message sends for sync messages until we learn
// of a linked device (e.g. through the device linking UI or by receiving // of a linked device (e.g. through the device linking UI or by receiving
// a sync message, etc.). // a sync message, etc.).
- (void)clearMayHaveLinkedDevicesIfNotSet - (void)clearMayHaveLinkedDevices
{ {
// Note that we write async to avoid opening transactions within transactions. // Note that we write async to avoid opening transactions within transactions.
[OWSPrimaryStorage.sharedManager.newDatabaseConnection [OWSPrimaryStorage.sharedManager.newDatabaseConnection
asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) {
if (![transaction objectForKey:kOWSPrimaryStorage_MayHaveLinkedDevices
inCollection:kOWSPrimaryStorage_OWSDeviceCollection]) {
[transaction setObject:@(NO) [transaction setObject:@(NO)
forKey:kOWSPrimaryStorage_MayHaveLinkedDevices forKey:kOWSPrimaryStorage_MayHaveLinkedDevices
inCollection:kOWSPrimaryStorage_OWSDeviceCollection]; inCollection:kOWSPrimaryStorage_OWSDeviceCollection];
}
}]; }];
} }

@ -1093,8 +1093,10 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
[[requestMaker makeRequestObjc] [[requestMaker makeRequestObjc]
.then(^(OWSRequestMakerResult *result) { .then(^(OWSRequestMakerResult *result) {
dispatch_async([OWSDispatch sendingQueue], ^{ dispatch_async([OWSDispatch sendingQueue], ^{
const BOOL wasSentByUD = result.wasSentByUD; [self messageSendDidSucceed:messageSend
[self messageSendDidSucceed:messageSend deviceMessages:deviceMessages wasSentByUD:wasSentByUD]; deviceMessages:deviceMessages
wasSentByUD:result.wasSentByUD
wasSentByWebsocket:result.wasSentByWebsocket];
}); });
}) })
.catch(^(NSError *error) { .catch(^(NSError *error) {
@ -1130,7 +1132,9 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
- (void)messageSendDidSucceed:(OWSMessageSend *)messageSend - (void)messageSendDidSucceed:(OWSMessageSend *)messageSend
deviceMessages:(NSArray<NSDictionary *> *)deviceMessages deviceMessages:(NSArray<NSDictionary *> *)deviceMessages
wasSentByUD:(BOOL)wasSentByUD { wasSentByUD:(BOOL)wasSentByUD
wasSentByWebsocket:(BOOL)wasSentByWebsocket
{
OWSAssertDebug(messageSend); OWSAssertDebug(messageSend);
OWSAssertDebug(deviceMessages); OWSAssertDebug(deviceMessages);
@ -1148,7 +1152,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
// to avoid unnecessary message sends for sync messages until we learn // to avoid unnecessary message sends for sync messages until we learn
// of a linked device (e.g. through the device linking UI or by receiving // of a linked device (e.g. through the device linking UI or by receiving
// a sync message, etc.). // a sync message, etc.).
[OWSDeviceManager.sharedManager clearMayHaveLinkedDevicesIfNotSet]; [OWSDeviceManager.sharedManager clearMayHaveLinkedDevices];
} }
dispatch_async([OWSDispatch sendingQueue], ^{ dispatch_async([OWSDispatch sendingQueue], ^{

@ -23,11 +23,16 @@ public class RequestMakerResult: NSObject {
@objc @objc
public let wasSentByUD: Bool public let wasSentByUD: Bool
@objc
public let wasSentByWebsocket: Bool
@objc @objc
public init(responseObject: Any?, public init(responseObject: Any?,
wasSentByUD: Bool) { wasSentByUD: Bool,
wasSentByWebsocket: Bool) {
self.responseObject = responseObject self.responseObject = responseObject
self.wasSentByUD = wasSentByUD self.wasSentByUD = wasSentByUD
self.wasSentByWebsocket = wasSentByWebsocket
} }
} }
@ -114,12 +119,11 @@ public class RequestMaker: NSObject {
} }
let isUDRequest: Bool = udAccessForRequest != nil let isUDRequest: Bool = udAccessForRequest != nil
let request: TSRequest = requestFactoryBlock(udAccessForRequest?.udAccessKey) let request: TSRequest = requestFactoryBlock(udAccessForRequest?.udAccessKey)
let webSocketType: OWSWebSocketType = (isUDRequest ? .UD : .default) let canMakeWebsocketRequests = (socketManager.canMakeRequests() && !skipWebsocket && !isUDRequest)
let canMakeWebsocketRequests = (socketManager.canMakeRequests(of: webSocketType) && !skipWebsocket)
if canMakeWebsocketRequests { if canMakeWebsocketRequests {
return Promise { resolver in return Promise { resolver in
socketManager.make(request, webSocketType: webSocketType, success: { (responseObject: Any?) in socketManager.make(request, success: { (responseObject: Any?) in
if self.udManager.isUDVerboseLoggingEnabled() { if self.udManager.isUDVerboseLoggingEnabled() {
if isUDRequest { if isUDRequest {
Logger.debug("UD websocket request '\(self.label)' succeeded.") Logger.debug("UD websocket request '\(self.label)' succeeded.")
@ -130,7 +134,9 @@ public class RequestMaker: NSObject {
self.requestSucceeded(udAccess: udAccessForRequest) self.requestSucceeded(udAccess: udAccessForRequest)
resolver.fulfill(RequestMakerResult(responseObject: responseObject, wasSentByUD: isUDRequest)) resolver.fulfill(RequestMakerResult(responseObject: responseObject,
wasSentByUD: isUDRequest,
wasSentByWebsocket: true))
}) { (statusCode: Int, responseData: Data?, error: Error) in }) { (statusCode: Int, responseData: Data?, error: Error) in
resolver.reject(RequestMakerError.websocketRequestError(statusCode: statusCode, responseData: responseData, underlyingError: error)) resolver.reject(RequestMakerError.websocketRequestError(statusCode: statusCode, responseData: responseData, underlyingError: error))
} }
@ -179,7 +185,9 @@ public class RequestMaker: NSObject {
self.requestSucceeded(udAccess: udAccessForRequest) self.requestSucceeded(udAccess: udAccessForRequest)
// Unwrap the network manager promise into a request maker promise. // Unwrap the network manager promise into a request maker promise.
return RequestMakerResult(responseObject: networkManagerResult.responseObject, wasSentByUD: isUDRequest) return RequestMakerResult(responseObject: networkManagerResult.responseObject,
wasSentByUD: isUDRequest,
wasSentByWebsocket: false)
}.recover { (error: Error) -> Promise<RequestMakerResult> in }.recover { (error: Error) -> Promise<RequestMakerResult> in
switch error { switch error {
case NetworkManagerError.taskError(let task, _): case NetworkManagerError.taskError(let task, _):

@ -419,6 +419,8 @@ NS_ASSUME_NONNULL_BEGIN
// Don't bother with the default cookie store; // Don't bother with the default cookie store;
// these cookies are ephemeral. // these cookies are ephemeral.
//
// NOTE: TSNetworkManager now separately disables default cookie handling for all requests.
[request setHTTPShouldHandleCookies:NO]; [request setHTTPShouldHandleCookies:NO];
return request; return request;
@ -451,6 +453,8 @@ NS_ASSUME_NONNULL_BEGIN
// Don't bother with the default cookie store; // Don't bother with the default cookie store;
// these cookies are ephemeral. // these cookies are ephemeral.
//
// NOTE: TSNetworkManager now separately disables default cookie handling for all requests.
[request setHTTPShouldHandleCookies:NO]; [request setHTTPShouldHandleCookies:NO];
// Set the cookie header. // Set the cookie header.
OWSAssertDebug(request.allHTTPHeaderFields.count == 0); OWSAssertDebug(request.allHTTPHeaderFields.count == 0);
@ -489,6 +493,8 @@ NS_ASSUME_NONNULL_BEGIN
// Add UD auth header. // Add UD auth header.
[request setValue:[udAccessKey.keyData base64EncodedString] forHTTPHeaderField:@"Unidentified-Access-Key"]; [request setValue:[udAccessKey.keyData base64EncodedString] forHTTPHeaderField:@"Unidentified-Access-Key"];
request.isUDRequest = YES;
} }
@end @end

@ -6,6 +6,7 @@
@interface TSRequest : NSMutableURLRequest @interface TSRequest : NSMutableURLRequest
@property (nonatomic) BOOL isUDRequest;
@property (nonatomic) BOOL shouldHaveAuthorizationHeaders; @property (nonatomic) BOOL shouldHaveAuthorizationHeaders;
@property (atomic, nullable) NSString *authUsername; @property (atomic, nullable) NSString *authUsername;
@property (atomic, nullable) NSString *authPassword; @property (atomic, nullable) NSString *authPassword;

@ -25,12 +25,20 @@ BOOL IsNSErrorNetworkFailure(NSError *_Nullable error)
@interface TSNetworkManager () @interface TSNetworkManager ()
// This property should only be accessed on udSerialQueue.
@property (atomic, readonly) AFHTTPSessionManager *udSessionManager;
@property (atomic, readonly) dispatch_queue_t udSerialQueue;
typedef void (^failureBlock)(NSURLSessionDataTask *task, NSError *error); typedef void (^failureBlock)(NSURLSessionDataTask *task, NSError *error);
@end @end
@implementation TSNetworkManager @implementation TSNetworkManager
@synthesize udSessionManager = _udSessionManager;
@synthesize udSerialQueue = _udSerialQueue;
#pragma mark Singleton implementation #pragma mark Singleton implementation
+ (instancetype)sharedManager + (instancetype)sharedManager
@ -47,6 +55,8 @@ typedef void (^failureBlock)(NSURLSessionDataTask *task, NSError *error);
return self; return self;
} }
_udSerialQueue = dispatch_queue_create("org.whispersystems.networkManager.udQueue", DISPATCH_QUEUE_SERIAL);
OWSSingletonAssert(); OWSSingletonAssert();
return self; return self;
@ -70,9 +80,15 @@ typedef void (^failureBlock)(NSURLSessionDataTask *task, NSError *error);
OWSAssertDebug(successBlock); OWSAssertDebug(successBlock);
OWSAssertDebug(failureBlock); OWSAssertDebug(failureBlock);
if (request.isUDRequest) {
dispatch_async(self.udSerialQueue, ^{
[self makeUDRequestSync:request success:successBlock failure:failureBlock];
});
} else {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self makeRequestSync:request completionQueue:completionQueue success:successBlock failure:failureBlock]; [self makeRequestSync:request completionQueue:completionQueue success:successBlock failure:failureBlock];
}); });
}
} }
- (void)makeRequestSync:(TSRequest *)request - (void)makeRequestSync:(TSRequest *)request
@ -84,11 +100,11 @@ typedef void (^failureBlock)(NSURLSessionDataTask *task, NSError *error);
OWSAssertDebug(successBlock); OWSAssertDebug(successBlock);
OWSAssertDebug(failureBlock); OWSAssertDebug(failureBlock);
OWSLogInfo(@"Making request: %@", request); OWSLogInfo(@"Making Non-UD request: %@", request);
// TODO: Remove this logging when the call connection issues have been resolved. // TODO: Remove this logging when the call connection issues have been resolved.
TSNetworkManagerSuccess success = ^(NSURLSessionDataTask *task, _Nullable id responseObject) { TSNetworkManagerSuccess success = ^(NSURLSessionDataTask *task, _Nullable id responseObject) {
OWSLogInfo(@"request succeeded : %@", request); OWSLogInfo(@"Non-UD request succeeded : %@", request);
if (request.shouldHaveAuthorizationHeaders) { if (request.shouldHaveAuthorizationHeaders) {
[TSAccountManager.sharedInstance setIsDeregistered:NO]; [TSAccountManager.sharedInstance setIsDeregistered:NO];
@ -110,17 +126,71 @@ typedef void (^failureBlock)(NSURLSessionDataTask *task, NSError *error);
password:request.authPassword]; password:request.authPassword];
} }
// Honor the request's preferences about default cookie handling. // Honor the request's headers.
// for (NSString *headerField in request.allHTTPHeaderFields) {
// Default is YES. NSString *headerValue = request.allHTTPHeaderFields[headerField];
sessionManager.requestSerializer.HTTPShouldHandleCookies = request.HTTPShouldHandleCookies; [sessionManager.requestSerializer setValue:headerValue forHTTPHeaderField:headerField];
}
[self performRequest:request sessionManager:sessionManager success:success failure:failure];
}
// This method should only be invoked on udSerialQueue.
- (AFHTTPSessionManager *)udSessionManager
{
if (!_udSessionManager) {
_udSessionManager = [OWSSignalService sharedInstance].signalServiceSessionManager;
_udSessionManager.completionQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// NOTE: We could enable HTTPShouldUsePipelining here.
}
return _udSessionManager;
}
- (void)makeUDRequestSync:(TSRequest *)request
success:(TSNetworkManagerSuccess)successBlock
failure:(TSNetworkManagerFailure)failureBlock
{
OWSAssertDebug(request);
OWSAssert(!request.shouldHaveAuthorizationHeaders);
OWSAssertDebug(successBlock);
OWSAssertDebug(failureBlock);
OWSLogInfo(@"Making UD request: %@", request);
TSNetworkManagerSuccess success = ^(NSURLSessionDataTask *task, _Nullable id responseObject) {
OWSLogInfo(@"UD request succeeded : %@", request);
successBlock(task, responseObject);
[OutageDetection.sharedManager reportConnectionSuccess];
};
TSNetworkManagerFailure failure = [TSNetworkManager errorPrettifyingForFailureBlock:failureBlock request:request];
AFHTTPSessionManager *sessionManager = self.udSessionManager;
// Honor the request's headers. // Honor the request's headers.
for (NSString *headerField in sessionManager.requestSerializer.HTTPRequestHeaders.allKeys.copy) {
[sessionManager.requestSerializer setValue:nil forHTTPHeaderField:headerField];
}
for (NSString *headerField in request.allHTTPHeaderFields) { for (NSString *headerField in request.allHTTPHeaderFields) {
NSString *headerValue = request.allHTTPHeaderFields[headerField]; NSString *headerValue = request.allHTTPHeaderFields[headerField];
[sessionManager.requestSerializer setValue:headerValue forHTTPHeaderField:headerField]; [sessionManager.requestSerializer setValue:headerValue forHTTPHeaderField:headerField];
} }
[self performRequest:request sessionManager:sessionManager success:success failure:failure];
}
- (void)performRequest:(TSRequest *)request
sessionManager:(AFHTTPSessionManager *)sessionManager
success:(TSNetworkManagerSuccess)success
failure:(TSNetworkManagerFailure)failure
{
OWSAssertDebug(request);
OWSAssertDebug(sessionManager);
OWSAssertDebug(success);
OWSAssertDebug(failure);
if ([request.HTTPMethod isEqualToString:@"GET"]) { if ([request.HTTPMethod isEqualToString:@"GET"]) {
[sessionManager GET:request.URL.absoluteString [sessionManager GET:request.URL.absoluteString
parameters:request.parameters parameters:request.parameters

@ -168,6 +168,8 @@ NSString *const kNSNotificationName_IsCensorshipCircumventionActiveDidChange =
sessionManager.securityPolicy = [OWSHTTPSecurityPolicy sharedPolicy]; sessionManager.securityPolicy = [OWSHTTPSecurityPolicy sharedPolicy];
sessionManager.requestSerializer = [AFJSONRequestSerializer serializer]; sessionManager.requestSerializer = [AFJSONRequestSerializer serializer];
sessionManager.responseSerializer = [AFJSONResponseSerializer serializer]; sessionManager.responseSerializer = [AFJSONResponseSerializer serializer];
// Disable default cookie handling for all requests.
sessionManager.requestSerializer.HTTPShouldHandleCookies = NO;
return sessionManager; return sessionManager;
} }
@ -186,6 +188,8 @@ NSString *const kNSNotificationName_IsCensorshipCircumventionActiveDidChange =
sessionManager.requestSerializer = [AFJSONRequestSerializer serializer]; sessionManager.requestSerializer = [AFJSONRequestSerializer serializer];
[sessionManager.requestSerializer setValue:self.censorshipConfiguration.signalServiceReflectorHost forHTTPHeaderField:@"Host"]; [sessionManager.requestSerializer setValue:self.censorshipConfiguration.signalServiceReflectorHost forHTTPHeaderField:@"Host"];
sessionManager.responseSerializer = [AFJSONResponseSerializer serializer]; sessionManager.responseSerializer = [AFJSONResponseSerializer serializer];
// Disable default cookie handling for all requests.
sessionManager.requestSerializer.HTTPShouldHandleCookies = NO;
return sessionManager; return sessionManager;
} }

@ -8,11 +8,6 @@ static void *OWSWebSocketStateObservationContext = &OWSWebSocketStateObservation
extern NSString *const kNSNotification_OWSWebSocketStateDidChange; extern NSString *const kNSNotification_OWSWebSocketStateDidChange;
typedef NS_ENUM(NSUInteger, OWSWebSocketType) {
OWSWebSocketTypeDefault,
OWSWebSocketTypeUD,
};
typedef NS_ENUM(NSUInteger, OWSWebSocketState) { typedef NS_ENUM(NSUInteger, OWSWebSocketState) {
OWSWebSocketStateClosed, OWSWebSocketStateClosed,
OWSWebSocketStateConnecting, OWSWebSocketStateConnecting,
@ -29,8 +24,7 @@ typedef void (^TSSocketMessageFailure)(NSInteger statusCode, NSData *_Nullable r
@property (nonatomic, readonly) OWSWebSocketState state; @property (nonatomic, readonly) OWSWebSocketState state;
- (instancetype)init NS_UNAVAILABLE; - (instancetype)init NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithWebSocketType:(OWSWebSocketType)webSocketType NS_DESIGNATED_INITIALIZER;
// If the app is in the foreground, we'll try to open the socket unless it's already // If the app is in the foreground, we'll try to open the socket unless it's already
// open or connecting. // open or connecting.

@ -143,21 +143,9 @@ NSString *const kNSNotification_OWSWebSocketStateDidChange = @"kNSNotification_O
#pragma mark - #pragma mark -
NSString *NSStringFromOWSWebSocketType(OWSWebSocketType type)
{
switch (type) {
case OWSWebSocketTypeDefault:
return @"Default";
case OWSWebSocketTypeUD:
return @"UD";
}
}
// OWSWebSocket's properties should only be accessed from the main thread. // OWSWebSocket's properties should only be accessed from the main thread.
@interface OWSWebSocket () <SRWebSocketDelegate> @interface OWSWebSocket () <SRWebSocketDelegate>
@property (nonatomic) OWSWebSocketType webSocketType;
// This class has a few "tiers" of state. // This class has a few "tiers" of state.
// //
// The first tier is the actual websocket and the timers used // The first tier is the actual websocket and the timers used
@ -216,7 +204,7 @@ NSString *NSStringFromOWSWebSocketType(OWSWebSocketType type)
@implementation OWSWebSocket @implementation OWSWebSocket
- (instancetype)initWithWebSocketType:(OWSWebSocketType)webSocketType - (instancetype)init
{ {
self = [super init]; self = [super init];
@ -226,7 +214,6 @@ NSString *NSStringFromOWSWebSocketType(OWSWebSocketType type)
OWSAssertIsOnMainThread(); OWSAssertIsOnMainThread();
_webSocketType = webSocketType;
_state = OWSWebSocketStateClosed; _state = OWSWebSocketStateClosed;
_socketMessageMap = [NSMutableDictionary new]; _socketMessageMap = [NSMutableDictionary new];
@ -573,12 +560,11 @@ NSString *NSStringFromOWSWebSocketType(OWSWebSocketType type)
[socketMessage didFailBeforeSending]; [socketMessage didFailBeforeSending];
return; return;
} }
OWSLogInfo(@"making request: %llu, %@: %@, jsonData.length: %zd, socketType: %@", OWSLogInfo(@"making request: %llu, %@: %@, jsonData.length: %zd",
socketMessage.requestId, socketMessage.requestId,
request.HTTPMethod, request.HTTPMethod,
requestPath, requestPath,
jsonData.length, jsonData.length);
NSStringFromOWSWebSocketType(self.webSocketType));
const int64_t kSocketTimeoutSeconds = 10; const int64_t kSocketTimeoutSeconds = 10;
__weak TSSocketMessage *weakSocketMessage = socketMessage; __weak TSSocketMessage *weakSocketMessage = socketMessage;
@ -650,7 +636,7 @@ NSString *NSStringFromOWSWebSocketType(OWSWebSocketType type)
[socketMessage didSucceedWithResponseObject:responseObject]; [socketMessage didSucceedWithResponseObject:responseObject];
} else { } else {
if (responseStatus == 403 && self.webSocketType == OWSWebSocketTypeDefault) { if (responseStatus == 403) {
// This should be redundant with our check for the socket // This should be redundant with our check for the socket
// failing due to 403, but let's be thorough. // failing due to 403, but let's be thorough.
[self.tsAccountManager setIsDeregistered:YES]; [self.tsAccountManager setIsDeregistered:YES];
@ -718,7 +704,7 @@ NSString *NSStringFromOWSWebSocketType(OWSWebSocketType type)
if ([error.domain isEqualToString:SRWebSocketErrorDomain] && error.code == 2132) { if ([error.domain isEqualToString:SRWebSocketErrorDomain] && error.code == 2132) {
NSNumber *_Nullable statusCode = error.userInfo[SRHTTPResponseErrorKey]; NSNumber *_Nullable statusCode = error.userInfo[SRHTTPResponseErrorKey];
if (statusCode.unsignedIntegerValue == 403 && self.webSocketType == OWSWebSocketTypeDefault) { if (statusCode.unsignedIntegerValue == 403) {
[self.tsAccountManager setIsDeregistered:YES]; [self.tsAccountManager setIsDeregistered:YES];
} }
} }
@ -910,16 +896,9 @@ NSString *NSStringFromOWSWebSocketType(OWSWebSocketType type)
- (NSString *)webSocketAuthenticationString - (NSString *)webSocketAuthenticationString
{ {
switch (self.webSocketType) { return [NSString stringWithFormat:@"?login=%@&password=%@",
case OWSWebSocketTypeUD:
// UD socket is unauthenticated.
return @"";
case OWSWebSocketTypeDefault:
return
[NSString stringWithFormat:@"?login=%@&password=%@",
[[TSAccountManager localNumber] stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"], [[TSAccountManager localNumber] stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"],
[TSAccountManager serverAuthToken]]; [TSAccountManager serverAuthToken]];
}
} }
#pragma mark - Socket LifeCycle #pragma mark - Socket LifeCycle
@ -1149,9 +1128,7 @@ NSString *NSStringFromOWSWebSocketType(OWSWebSocketType type)
{ {
OWSAssertIsOnMainThread(); OWSAssertIsOnMainThread();
if (self.webSocketType == OWSWebSocketTypeDefault) {
[self cycleSocket]; [self cycleSocket];
}
} }
@end @end

@ -39,10 +39,9 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Message Sending #pragma mark - Message Sending
- (BOOL)canMakeRequestsOfType:(OWSWebSocketType)webSocketType; - (BOOL)canMakeRequests;
- (void)makeRequest:(TSRequest *)request - (void)makeRequest:(TSRequest *)request
webSocketType:(OWSWebSocketType)webSocketType
success:(TSSocketMessageSuccess)success success:(TSSocketMessageSuccess)success
failure:(TSSocketMessageFailure)failure; failure:(TSSocketMessageFailure)failure;

@ -9,8 +9,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface TSSocketManager () @interface TSSocketManager ()
@property (nonatomic) OWSWebSocket *websocketDefault; @property (nonatomic) OWSWebSocket *websocket;
@property (nonatomic) OWSWebSocket *websocketUD;
@end @end
@ -28,8 +27,7 @@ NS_ASSUME_NONNULL_BEGIN
OWSAssertIsOnMainThread(); OWSAssertIsOnMainThread();
_websocketDefault = [[OWSWebSocket alloc] initWithWebSocketType:OWSWebSocketTypeDefault]; _websocket = [[OWSWebSocket alloc] init];
_websocketUD = [[OWSWebSocket alloc] initWithWebSocketType:OWSWebSocketTypeUD];
OWSSingletonAssert(); OWSSingletonAssert();
@ -48,51 +46,31 @@ NS_ASSUME_NONNULL_BEGIN
return SSKEnvironment.shared.socketManager; return SSKEnvironment.shared.socketManager;
} }
- (OWSWebSocket *)webSocketOfType:(OWSWebSocketType)webSocketType - (BOOL)canMakeRequests
{ {
switch (webSocketType) { return self.websocket.canMakeRequests;
case OWSWebSocketTypeDefault:
return self.websocketDefault;
case OWSWebSocketTypeUD:
return self.websocketUD;
}
}
- (BOOL)canMakeRequestsOfType:(OWSWebSocketType)webSocketType
{
return [self webSocketOfType:webSocketType].canMakeRequests;
} }
- (void)makeRequest:(TSRequest *)request - (void)makeRequest:(TSRequest *)request
webSocketType:(OWSWebSocketType)webSocketType
success:(TSSocketMessageSuccess)success success:(TSSocketMessageSuccess)success
failure:(TSSocketMessageFailure)failure failure:(TSSocketMessageFailure)failure
{ {
[[self webSocketOfType:webSocketType] makeRequest:request success:success failure:failure]; [self.websocket makeRequest:request success:success failure:failure];
} }
- (void)requestSocketOpen - (void)requestSocketOpen
{ {
[self.websocketDefault requestSocketOpen]; [self.websocket requestSocketOpen];
[self.websocketUD requestSocketOpen];
} }
- (void)cycleSocket - (void)cycleSocket
{ {
[self.websocketDefault cycleSocket]; [self.websocket cycleSocket];
[self.websocketUD cycleSocket];
} }
- (OWSWebSocketState)highestSocketState - (OWSWebSocketState)highestSocketState
{ {
if (self.websocketDefault.state == OWSWebSocketStateOpen || self.websocketUD.state == OWSWebSocketStateOpen) { return self.websocket.state;
return OWSWebSocketStateOpen;
} else if (self.websocketDefault.state == OWSWebSocketStateConnecting
|| self.websocketUD.state == OWSWebSocketStateConnecting) {
return OWSWebSocketStateConnecting;
} else {
return OWSWebSocketStateClosed;
}
} }
@end @end

Loading…
Cancel
Save