diff --git a/Signal/src/Models/AccountManager.swift b/Signal/src/Models/AccountManager.swift index ec36b2fca..94e4132c3 100644 --- a/Signal/src/Models/AccountManager.swift +++ b/Signal/src/Models/AccountManager.swift @@ -13,17 +13,13 @@ import SignalServiceKit @objc public class AccountManager: NSObject { - let textSecureAccountManager: TSAccountManager - var pushManager: PushManager { // dependency injection hack since PushManager has *alot* of dependencies, and would induce a cycle. return PushManager.shared() } @objc - public required init(textSecureAccountManager: TSAccountManager) { - self.textSecureAccountManager = textSecureAccountManager - + public required override init() { super.init() SwiftSingletons.register(self) @@ -39,6 +35,10 @@ public class AccountManager: NSObject { return Environment.shared.preferences } + private var tsAccountManager: TSAccountManager { + return TSAccountManager.sharedInstance() + } + // MARK: registration @objc func register(verificationCode: String, @@ -83,7 +83,7 @@ public class AccountManager: NSObject { private func registerForTextSecure(verificationCode: String, pin: String?) -> Promise { return Promise { fulfill, reject in - self.textSecureAccountManager.verifyAccount(withCode: verificationCode, + tsAccountManager.verifyAccount(withCode: verificationCode, pin: pin, success: fulfill, failure: reject) @@ -99,14 +99,14 @@ public class AccountManager: NSObject { private func completeRegistration() { Logger.info("") - self.textSecureAccountManager.didRegister() + tsAccountManager.didRegister() } // MARK: Message Delivery func updatePushTokens(pushToken: String, voipToken: String) -> Promise { return Promise { fulfill, reject in - self.textSecureAccountManager.registerForPushNotifications(pushToken: pushToken, + tsAccountManager.registerForPushNotifications(pushToken: pushToken, voipToken: voipToken, success: fulfill, failure: reject) @@ -114,7 +114,7 @@ public class AccountManager: NSObject { } func enableManualMessageFetching() -> Promise { - TSAccountManager.sharedInstance().setIsManualMessageFetchEnabled(true) + tsAccountManager.setIsManualMessageFetchEnabled(true) // Try to update the account attributes to reflect this change. let request = OWSRequestFactory.updateAttributesRequest() diff --git a/Signal/src/environment/SignalApp.m b/Signal/src/environment/SignalApp.m index 5607eee0c..1d45aac59 100644 --- a/Signal/src/environment/SignalApp.m +++ b/Signal/src/environment/SignalApp.m @@ -63,7 +63,7 @@ NS_ASSUME_NONNULL_BEGIN OWSAssertDebug(SSKEnvironment.shared.networkManager); OWSAssertDebug(SSKEnvironment.shared.contactsUpdater); - _accountManager = [[AccountManager alloc] initWithTextSecureAccountManager:[TSAccountManager sharedInstance]]; + _accountManager = [[AccountManager alloc] init]; _notificationsManager = [NotificationsManager new]; SSKEnvironment.shared.notificationsManager = self.notificationsManager; diff --git a/SignalServiceKit/src/Account/TSAccountManager.h b/SignalServiceKit/src/Account/TSAccountManager.h index 60ce8557b..755ce2c0d 100644 --- a/SignalServiceKit/src/Account/TSAccountManager.h +++ b/SignalServiceKit/src/Account/TSAccountManager.h @@ -72,8 +72,9 @@ extern NSString *const kNSNotificationName_LocalNumberDidChange; * @return registrationID; */ -+ (uint32_t)getOrGenerateRegistrationId; + (uint32_t)getOrGenerateRegistrationId:(YapDatabaseReadWriteTransaction *)transaction; +- (uint32_t)getOrGenerateRegistrationId; +- (uint32_t)getOrGenerateRegistrationId:(YapDatabaseReadWriteTransaction *)transaction; #pragma mark - Register with phone number diff --git a/SignalServiceKit/src/Account/TSAccountManager.m b/SignalServiceKit/src/Account/TSAccountManager.m index df9c0cd69..1ad4b0fce 100644 --- a/SignalServiceKit/src/Account/TSAccountManager.m +++ b/SignalServiceKit/src/Account/TSAccountManager.m @@ -192,11 +192,6 @@ NSString *const TSAccountManager_ManualMessageFetchKey = @"TSAccountManager_Manu } } -+ (uint32_t)getOrGenerateRegistrationId -{ - return [[self sharedInstance] getOrGenerateRegistrationId]; -} - + (uint32_t)getOrGenerateRegistrationId:(YapDatabaseReadWriteTransaction *)transaction { return [[self sharedInstance] getOrGenerateRegistrationId:transaction]; diff --git a/SignalServiceKit/src/Messages/UD/OWSUDManager.swift b/SignalServiceKit/src/Messages/UD/OWSUDManager.swift index f42d34289..0c362d8f0 100644 --- a/SignalServiceKit/src/Messages/UD/OWSUDManager.swift +++ b/SignalServiceKit/src/Messages/UD/OWSUDManager.swift @@ -35,9 +35,9 @@ public enum OWSUDError: Error { // MARK: - Unrestricted Access - @objc func allowUnrestrictedAccess() -> Bool + @objc func shouldAllowUnrestrictedAccess() -> Bool - @objc func setAllowUnrestrictedAccess(_ value: Bool) + @objc func setShouldAllowUnrestrictedAccess(_ value: Bool) } // MARK: - @@ -179,12 +179,12 @@ public class OWSUDManagerImpl: NSObject, OWSUDManager { // MARK: - Unrestricted Access @objc - public func allowUnrestrictedAccess() -> Bool { + public func shouldAllowUnrestrictedAccess() -> Bool { return dbConnection.bool(forKey: kUDUnrestrictedAccessKey, inCollection: kUDRecipientModeCollection, defaultValue: false) } @objc - public func setAllowUnrestrictedAccess(_ value: Bool) { + public func setShouldAllowUnrestrictedAccess(_ value: Bool) { dbConnection.setBool(value, forKey: kUDUnrestrictedAccessKey, inCollection: kUDRecipientModeCollection) } } diff --git a/SignalServiceKit/src/Network/API/Requests/OWSRequestFactory.m b/SignalServiceKit/src/Network/API/Requests/OWSRequestFactory.m index 7dc4206e3..361dd00da 100644 --- a/SignalServiceKit/src/Network/API/Requests/OWSRequestFactory.m +++ b/SignalServiceKit/src/Network/API/Requests/OWSRequestFactory.m @@ -22,6 +22,30 @@ NS_ASSUME_NONNULL_BEGIN @implementation OWSRequestFactory +#pragma mark - Dependencies + ++ (TSAccountManager *)tsAccountManager +{ + return TSAccountManager.sharedInstance; +} + ++ (OWS2FAManager *)ows2FAManager +{ + return OWS2FAManager.sharedManager; +} + ++ (id)profileManager +{ + return SSKEnvironment.shared.profileManager; +} + ++ (id)udManager +{ + return SSKEnvironment.shared.udManager; +} + +#pragma mark - + + (TSRequest *)enable2FARequestWithPin:(NSString *)pin { OWSAssertDebug(pin.length > 0); @@ -174,11 +198,11 @@ NS_ASSUME_NONNULL_BEGIN { NSString *path = [textSecureAccountsAPI stringByAppendingString:textSecureAttributesAPI]; - NSString *signalingKey = TSAccountManager.signalingKey; + NSString *signalingKey = self.tsAccountManager.signalingKey; OWSAssertDebug(signalingKey.length > 0); - NSString *authKey = TSAccountManager.serverAuthToken; + NSString *authKey = self.tsAccountManager.serverAuthToken; OWSAssertDebug(authKey.length > 0); - NSString *_Nullable pin = [OWS2FAManager.sharedManager pinCode]; + NSString *_Nullable pin = [self.ows2FAManager pinCode]; NSDictionary *accountAttributes = [self accountAttributesWithPin:pin signalingKey:signalingKey authKey:authKey]; @@ -246,17 +270,18 @@ NS_ASSUME_NONNULL_BEGIN { OWSAssertDebug(signalingKey.length > 0); OWSAssertDebug(authKey.length > 0); - uint32_t registrationId = [TSAccountManager getOrGenerateRegistrationId]; + uint32_t registrationId = [self.tsAccountManager getOrGenerateRegistrationId]; - BOOL isManualMessageFetchEnabled = TSAccountManager.sharedInstance.isManualMessageFetchEnabled; + BOOL isManualMessageFetchEnabled = self.tsAccountManager.isManualMessageFetchEnabled; - OWSAES256Key *profileKey = [SSKEnvironment.shared.profileManager localProfileKey]; + OWSAES256Key *profileKey = [self.profileManager localProfileKey]; NSError *error; SMKUDAccessKey *_Nullable udAccessKey = [[SMKUDAccessKey alloc] initWithProfileKey:profileKey.keyData error:&error]; - if (error || !udAccessKey) { - OWSLogError(@"Could not determine UD access key: %@.", error); + if (error || udAccessKey.keyData.length < 1) { + // Crash app if UD cannot be enabled. + OWSFail(@"Could not determine UD access key: %@.", error); } - BOOL allowUnrestrictedUD = [SSKEnvironment.shared.udManager allowUnrestrictedAccess] && udAccessKey != nil; + BOOL allowUnrestrictedUD = [self.udManager shouldAllowUnrestrictedAccess] && udAccessKey != nil; NSMutableDictionary *accountAttributes = [@{ @"signalingKey" : signalingKey, @@ -266,14 +291,14 @@ NS_ASSUME_NONNULL_BEGIN @"fetchesMessages" : @(isManualMessageFetchEnabled), // devices that don't support push must tell the server // they fetch messages manually @"registrationId" : [NSString stringWithFormat:@"%i", registrationId], + @"unidentifiedAccessKey" : udAccessKey.keyData.base64EncodedString, + @"unrestrictedUnidentifiedAccess" : @(allowUnrestrictedUD), } mutableCopy]; + if (pin.length > 0) { accountAttributes[@"pin"] = pin; } - if (udAccessKey.keyData.length > 0) { - accountAttributes[@"unidentifiedAccessKey"] = udAccessKey.keyData.base64EncodedString; - accountAttributes[@"unrestrictedUnidentifiedAccess"] = @(allowUnrestrictedUD); - } + return [accountAttributes copy]; } diff --git a/SignalServiceKit/src/Tests/OWSFakeUDManager.swift b/SignalServiceKit/src/Tests/OWSFakeUDManager.swift index f5442c791..1d372b27c 100644 --- a/SignalServiceKit/src/Tests/OWSFakeUDManager.swift +++ b/SignalServiceKit/src/Tests/OWSFakeUDManager.swift @@ -46,16 +46,16 @@ public class OWSFakeUDManager: NSObject, OWSUDManager { // MARK: - Unrestricted Access - private var _allowUnrestrictedAccess = false + private var _shouldAllowUnrestrictedAccess = false @objc - public func allowUnrestrictedAccess() -> Bool { - return _allowUnrestrictedAccess + public func shouldAllowUnrestrictedAccess() -> Bool { + return _shouldAllowUnrestrictedAccess } @objc - public func setAllowUnrestrictedAccess(_ value: Bool) { - _allowUnrestrictedAccess = value + public func setShouldAllowUnrestrictedAccess(_ value: Bool) { + _shouldAllowUnrestrictedAccess = value } }