Remove _RegistrationCoordinator_PreKeyManagerShim

This commit is contained in:
Max Radermacher 2025-08-19 09:18:39 -05:00 committed by GitHub
parent 204546a3a7
commit e34d65d94d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 69 additions and 116 deletions

View File

@ -20,7 +20,6 @@ extension RegistrationCoordinatorImpl {
public typealias MessagePipelineSupervisor = _RegistrationCoordinator_MessagePipelineSupervisorShim
public typealias MessageProcessor = _RegistrationCoordinator_MessageProcessorShim
public typealias OWS2FAManager = _RegistrationCoordinator_OWS2FAManagerShim
public typealias PreKeyManager = _RegistrationCoordinator_PreKeyManagerShim
public typealias ProfileManager = _RegistrationCoordinator_ProfileManagerShim
public typealias PushRegistrationManager = _RegistrationCoordinator_PushRegistrationManagerShim
typealias QuickRestoreManager = _RegistrationCoordinator_QuickRestoreManagerShim
@ -40,7 +39,6 @@ extension RegistrationCoordinatorImpl {
public typealias MessagePipelineSupervisor = _RegistrationCoordinator_MessagePipelineSupervisorWrapper
public typealias MessageProcessor = _RegistrationCoordinator_MessageProcessorWrapper
public typealias OWS2FAManager = _RegistrationCoordinator_OWS2FAManagerWrapper
public typealias PreKeyManager = _RegistrationCoordinator_PreKeyManagerWrapper
public typealias ProfileManager = _RegistrationCoordinator_ProfileManagerWrapper
public typealias PushRegistrationManager = _RegistrationCoordinator_PushRegistrationManagerWrapper
typealias QuickRestoreManager = _RegistrationCoordinator_QuickRestoreManagerWrapper
@ -282,54 +280,6 @@ public class _RegistrationCoordinator_OWS2FAManagerWrapper: _RegistrationCoordin
}
}
// MARK: - PreKeyManager
// TODO: Remove this layer of abstraction; it's no longer necessary.
public protocol _RegistrationCoordinator_PreKeyManagerShim {
func createPreKeysForRegistration() async throws -> RegistrationPreKeyUploadBundles
func finalizeRegistrationPreKeys(
_ prekeyBundles: RegistrationPreKeyUploadBundles,
uploadDidSucceed: Bool
) async throws
func rotateOneTimePreKeysForRegistration(auth: ChatServiceAuth) async throws
func setIsChangingNumber(_ isChangingNumber: Bool)
}
public class _RegistrationCoordinator_PreKeyManagerWrapper: _RegistrationCoordinator_PreKeyManagerShim {
private let preKeyManager: PreKeyManager
public init(_ preKeyManager: PreKeyManager) {
self.preKeyManager = preKeyManager
}
public func createPreKeysForRegistration() async throws -> RegistrationPreKeyUploadBundles {
return try await preKeyManager.createPreKeysForRegistration().value
}
public func finalizeRegistrationPreKeys(
_ prekeyBundles: RegistrationPreKeyUploadBundles,
uploadDidSucceed: Bool
) async throws {
return try await preKeyManager.finalizeRegistrationPreKeys(
prekeyBundles,
uploadDidSucceed: uploadDidSucceed
).value
}
public func rotateOneTimePreKeysForRegistration(auth: ChatServiceAuth) async throws {
return try await preKeyManager.rotateOneTimePreKeysForRegistration(auth: auth).value
}
public func setIsChangingNumber(_ isChangingNumber: Bool) {
preKeyManager.setIsChangingNumber(isChangingNumber)
}
}
// MARK: - ProfileManager
public protocol _RegistrationCoordinator_ProfileManagerShim {

View File

@ -27,7 +27,7 @@ public struct RegistrationCoordinatorDependencies {
let networkManager: any NetworkManagerProtocol
public let ows2FAManager: RegistrationCoordinatorImpl.Shims.OWS2FAManager
public let phoneNumberDiscoverabilityManager: PhoneNumberDiscoverabilityManager
public let preKeyManager: RegistrationCoordinatorImpl.Shims.PreKeyManager
public let preKeyManager: any PreKeyManager
public let profileManager: RegistrationCoordinatorImpl.Shims.ProfileManager
public let pushRegistrationManager: RegistrationCoordinatorImpl.Shims.PushRegistrationManager
let quickRestoreManager: RegistrationCoordinatorImpl.Shims.QuickRestoreManager
@ -67,9 +67,7 @@ public struct RegistrationCoordinatorDependencies {
networkManager: SSKEnvironment.shared.networkManagerRef,
ows2FAManager: RegistrationCoordinatorImpl.Wrappers.OWS2FAManager(SSKEnvironment.shared.ows2FAManagerRef),
phoneNumberDiscoverabilityManager: DependenciesBridge.shared.phoneNumberDiscoverabilityManager,
preKeyManager: RegistrationCoordinatorImpl.Wrappers.PreKeyManager(
DependenciesBridge.shared.preKeyManager
),
preKeyManager: DependenciesBridge.shared.preKeyManager,
profileManager: RegistrationCoordinatorImpl.Wrappers.ProfileManager(SSKEnvironment.shared.profileManagerRef),
pushRegistrationManager: RegistrationCoordinatorImpl.Wrappers.PushRegistrationManager(AppEnvironment.shared.pushRegistrationManagerRef),
quickRestoreManager: RegistrationCoordinatorImpl.Wrappers.QuickRestoreManager(AppEnvironment.shared.quickRestoreManager),

View File

@ -3293,7 +3293,7 @@ public class RegistrationCoordinatorImpl: RegistrationCoordinator {
// But we should still upload one-time prekeys, as that is not part
// of account creation.
do {
try await deps.preKeyManager.rotateOneTimePreKeysForRegistration(auth: accountIdentity.chatServiceAuth)
try await deps.preKeyManager.rotateOneTimePreKeysForRegistration(auth: accountIdentity.chatServiceAuth).value
self.db.write { tx in
self.updatePersistedState(tx) {
// No harm marking both down as done even though
@ -4262,7 +4262,7 @@ public class RegistrationCoordinatorImpl: RegistrationCoordinator {
let prekeyBundles: RegistrationPreKeyUploadBundles
do {
prekeyBundles = try await deps.preKeyManager.createPreKeysForRegistration()
prekeyBundles = try await deps.preKeyManager.createPreKeysForRegistration().value
} catch {
return .showErrorSheet(.genericError)
}
@ -4293,7 +4293,7 @@ public class RegistrationCoordinatorImpl: RegistrationCoordinator {
try await deps.preKeyManager.finalizeRegistrationPreKeys(
prekeyBundles,
uploadDidSucceed: isPrekeyUploadSuccess
)
).value
} catch {
// Finalizing is best effort.
Logger.error("Unable to finalize prekeys, ignoring and continuing")

View File

@ -318,11 +318,11 @@ public class RegistrationCoordinatorTest {
// It needs an apns token to register.
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
// It needs prekeys as well.
preKeyManagerMock.addCreatePreKeysMock({ return .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
// And will finalize prekeys after success.
preKeyManagerMock.addFinalizePreKeyMock { didSucceed in
#expect(didSucceed)
return .value(())
return Task {}
}
let identityResponse = Stubs.accountIdentityResponse()
@ -362,7 +362,7 @@ public class RegistrationCoordinatorTest {
// When registered, we should create pre-keys.
preKeyManagerMock.addRotateOneTimePreKeyMock({ auth in
#expect(auth == expectedAuthedAccount().chatServiceAuth)
return .value(())
return Task {}
})
if wasReglockEnabled {
@ -472,11 +472,11 @@ public class RegistrationCoordinatorTest {
// It needs an apns token to register.
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
// Every time we register we also ask for prekeys.
preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
// And we finalize them after.
preKeyManagerMock.addFinalizePreKeyMock { didSucceed in
#expect(didSucceed)
return .value(())
return Task {}
}
let identityResponse = Stubs.accountIdentityResponse()
@ -509,7 +509,7 @@ public class RegistrationCoordinatorTest {
// When registered, we should create pre-keys.
preKeyManagerMock.addRotateOneTimePreKeyMock({ auth in
#expect(auth == expectedAuthedAccount().chatServiceAuth)
return .value(())
return Task {}
})
// We haven't done a SVR backup; that should happen now.
@ -613,18 +613,18 @@ public class RegistrationCoordinatorTest {
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
// Every time we register we also ask for prekeys.
preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
// And we finalize them after.
// Set up a list of mocks that should be returned in order
preKeyManagerMock.addFinalizePreKeyMock { didSucceed in
#expect(didSucceed.negated)
return .value(())
return Task {}
}
preKeyManagerMock.addFinalizePreKeyMock { didSucceed in
#expect(didSucceed)
return .value(())
return Task {}
}
// Fail the request; the reg recovery pw is invalid.
@ -718,17 +718,17 @@ public class RegistrationCoordinatorTest {
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
preKeyManagerMock.addFinalizePreKeyMock { didSucceed in
#expect(didSucceed.negated)
return .value(())
return Task {}
}
preKeyManagerMock.addFinalizePreKeyMock { didSucceed in
#expect(didSucceed.negated)
return .value(())
return Task {}
}
// Fail the first request; the reglock is invalid.
@ -817,17 +817,17 @@ public class RegistrationCoordinatorTest {
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
// Every time we register we also ask for prekeys.
preKeyManagerMock.addCreatePreKeysMock({ return .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ return .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
// And we finalize them after.
preKeyManagerMock.addFinalizePreKeyMock { didSucceed in
#expect(didSucceed.negated)
return .value(())
return Task {}
}
preKeyManagerMock.addFinalizePreKeyMock { didSucceed in
#expect(didSucceed)
return .value(())
return Task {}
}
// Fail the request with a network error.
@ -877,7 +877,7 @@ public class RegistrationCoordinatorTest {
// When registered, it should try and sync pre-keys.
preKeyManagerMock.addRotateOneTimePreKeyMock({ auth in
#expect(auth == expectedAuthedAccount().chatServiceAuth)
return .value(())
return Task {}
})
// We haven't done a SVR backup; that should happen.
@ -1032,11 +1032,11 @@ public class RegistrationCoordinatorTest {
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
preKeyManagerMock.addFinalizePreKeyMock({ _ in .value(()) })
preKeyManagerMock.addFinalizePreKeyMock({ _ in .value(()) })
preKeyManagerMock.addFinalizePreKeyMock({ _ in Task {} })
preKeyManagerMock.addFinalizePreKeyMock({ _ in Task {} })
// Fail the first request;
let expectedRecoveryPwRequest = createAccountWithRecoveryPw(masterKey)
@ -1184,16 +1184,16 @@ public class RegistrationCoordinatorTest {
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
preKeyManagerMock.addFinalizePreKeyMock { didSucceed in
#expect(didSucceed.negated)
return .value(())
return Task {}
}
preKeyManagerMock.addFinalizePreKeyMock { didSucceed in
#expect(didSucceed)
return .value(())
return Task {}
}
// Fail the first request; the reglock is invalid.
@ -1237,7 +1237,7 @@ public class RegistrationCoordinatorTest {
// When registered, we should create pre-keys.
preKeyManagerMock.addRotateOneTimePreKeyMock({ auth in
#expect(auth == expectedAuthedAccount().chatServiceAuth)
return .value(())
return Task {}
})
// If we had reglock before registration, it should be re-enabled.
@ -1394,13 +1394,13 @@ public class RegistrationCoordinatorTest {
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
preKeyManagerMock.addFinalizePreKeyMock({ _ in .value(()) })
preKeyManagerMock.addFinalizePreKeyMock({ _ in .value(()) })
preKeyManagerMock.addFinalizePreKeyMock({ _ in .value(()) })
preKeyManagerMock.addFinalizePreKeyMock({ _ in Task {} })
preKeyManagerMock.addFinalizePreKeyMock({ _ in Task {} })
preKeyManagerMock.addFinalizePreKeyMock({ _ in Task {} })
// Fail the first request; the local key is invalid.
let expectedRecoveryPwRequest = createAccountWithRecoveryPw(masterKey)
@ -1523,12 +1523,12 @@ public class RegistrationCoordinatorTest {
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
// Every time we register we also ask for prekeys.
preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
// And we finalize them after.
preKeyManagerMock.addFinalizePreKeyMock { didSucceed in
#expect(didSucceed)
return .value(())
return Task {}
}
// Now still at it should make a reg recovery pw request
@ -1560,7 +1560,7 @@ public class RegistrationCoordinatorTest {
// When registered, it should try and create pre-keys.
preKeyManagerMock.addRotateOneTimePreKeyMock({ auth in
#expect(auth == expectedAuthedAccount().chatServiceAuth)
return .value(())
return Task {}
})
// Once we create pre-keys, we should back up to svr.
@ -1834,7 +1834,7 @@ public class RegistrationCoordinatorTest {
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
// It should also fetch the prekeys for account creation
preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) })
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
let expectedRequest = createAccountWithSession(newMasterKey)
mockURLSession.addResponse(
@ -1861,14 +1861,14 @@ public class RegistrationCoordinatorTest {
// Once we are registered, we should finalize prekeys.
preKeyManagerMock.addFinalizePreKeyMock { didSucceed in
#expect(didSucceed)
return .value(())
return Task {}
}
// Then we should try and create one time pre-keys
// with the credentials we got in the identity response.
preKeyManagerMock.addRotateOneTimePreKeyMock({ auth in
#expect(auth == expectedAuthedAccount().chatServiceAuth)
return .value(())
return Task {}
})
// Finish the validation.
@ -2863,9 +2863,7 @@ public class RegistrationCoordinatorTest {
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
// It should also fetch the prekeys for account creation
preKeyManagerMock.addCreatePreKeysMock({
return .value(Stubs.prekeyBundles())
})
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
let expectedRequest = createAccountWithSession(newMasterKey)
mockURLSession.addResponse(
@ -2896,14 +2894,14 @@ public class RegistrationCoordinatorTest {
// Once we are registered, we should finalize prekeys.
preKeyManagerMock.addFinalizePreKeyMock { didSucceed in
#expect(didSucceed)
return .value(())
return Task {}
}
// Then we should try and create one time pre-keys
// with the credentials we got in the identity response.
preKeyManagerMock.addRotateOneTimePreKeyMock({ auth in
#expect(auth == expectedAuthedAccount().chatServiceAuth)
return .value(())
return Task {}
})
// When we skip the pin, it should skip any SVR backups.
@ -3006,7 +3004,7 @@ public class RegistrationCoordinatorTest {
pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) })
// It should also fetch the prekeys for account creation
preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles())})
preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } })
let expectedRequest = createAccountWithSession(newMasterKey)
mockURLSession.addResponse(
@ -3033,14 +3031,14 @@ public class RegistrationCoordinatorTest {
// Once we are registered, we should finalize prekeys.
preKeyManagerMock.addFinalizePreKeyMock { didSucceed in
#expect(didSucceed)
return .value(())
return Task {}
}
// Then we should try and create one time pre-keys
// with the credentials we got in the identity response.
preKeyManagerMock.addRotateOneTimePreKeyMock({ auth in
#expect(auth == expectedAuthedAccount().chatServiceAuth)
return .value(())
return Task {}
})
// When we skip the pin, it should skip any SVR backups.

View File

@ -185,34 +185,41 @@ public class _RegistrationCoordinator_OWS2FAManagerMock: _RegistrationCoordinato
// MARK: - PreKeyManager
public class _RegistrationCoordinator_PreKeyManagerMock: _RegistrationCoordinator_PreKeyManagerShim {
public class _RegistrationCoordinator_PreKeyManagerMock: PreKeyManager {
var run: RegistrationCoordinatorTest.RegistrationTestRun
init(run: RegistrationCoordinatorTest.RegistrationTestRun) {
self.run = run
}
public typealias CreatePreKeysMock = (() -> Promise<RegistrationPreKeyUploadBundles>)
public func isAppLockedDueToPreKeyUpdateFailures(tx: DBReadTransaction) -> Bool { fatalError() }
public func checkPreKeysIfNecessary(tx: DBReadTransaction) { fatalError() }
public func rotatePreKeysOnUpgradeIfNecessary(for identity: OWSIdentity) async throws { fatalError() }
public func createPreKeysForProvisioning(aciIdentityKeyPair: ECKeyPair, pniIdentityKeyPair: ECKeyPair) -> Task<RegistrationPreKeyUploadBundles, any Error> { fatalError() }
public func rotateSignedPreKeysIfNeeded() -> Task<Void, any Error> { fatalError() }
public func refreshOneTimePreKeys(forIdentity identity: OWSIdentity, alsoRefreshSignedPreKey shouldRefreshSignedPreKey: Bool) { fatalError() }
public typealias CreatePreKeysMock = (() -> Task<RegistrationPreKeyUploadBundles, any Error>)
private var createPreKeysMocks = [CreatePreKeysMock]()
public func addCreatePreKeysMock(_ mock: @escaping CreatePreKeysMock) { createPreKeysMocks.append(mock) }
public func createPreKeysForRegistration() async throws -> RegistrationPreKeyUploadBundles {
public func createPreKeysForRegistration() -> Task<RegistrationPreKeyUploadBundles, any Error> {
run.addObservedStep(.createPreKeys)
return try await createPreKeysMocks.removeFirst()().awaitable()
return createPreKeysMocks.removeFirst()()
}
public typealias FinalizePreKeysMock = ((Bool) -> Promise<Void>)
public typealias FinalizePreKeysMock = ((Bool) -> Task<Void, any Error>)
private var finalizePreKeysMocks = [FinalizePreKeysMock]()
public func addFinalizePreKeyMock(_ mock: @escaping FinalizePreKeysMock) { finalizePreKeysMocks.append(mock) }
public func finalizeRegistrationPreKeys(_ bundles: RegistrationPreKeyUploadBundles, uploadDidSucceed: Bool) async throws {
public func finalizeRegistrationPreKeys(_ bundles: RegistrationPreKeyUploadBundles, uploadDidSucceed: Bool) -> Task<Void, any Error> {
run.addObservedStep(.finalizePreKeys)
return try await finalizePreKeysMocks.removeFirst()(uploadDidSucceed).awaitable()
return finalizePreKeysMocks.removeFirst()(uploadDidSucceed)
}
public typealias RotateOneTimePreKeysMock = ((ChatServiceAuth) -> Promise<Void>)
public typealias RotateOneTimePreKeysMock = ((ChatServiceAuth) -> Task<Void, any Error>)
private var rotateOneTimePreKeysMocks = [RotateOneTimePreKeysMock]()
public func addRotateOneTimePreKeyMock(_ mock: @escaping RotateOneTimePreKeysMock) { rotateOneTimePreKeysMocks.append(mock) }
public func rotateOneTimePreKeysForRegistration(auth: ChatServiceAuth) async throws {
public func rotateOneTimePreKeysForRegistration(auth: ChatServiceAuth) -> Task<Void, any Error> {
run.addObservedStep(.rotateOneTimePreKeys)
return try await rotateOneTimePreKeysMocks.removeFirst()(auth).awaitable()
return rotateOneTimePreKeysMocks.removeFirst()(auth)
}
public func setIsChangingNumber(_ isChangingNumber: Bool) {