diff --git a/SignalServiceKit/src/Account/CreatePreKeysOperation.swift b/SignalServiceKit/src/Account/CreatePreKeysOperation.swift new file mode 100644 index 000000000..020613a5a --- /dev/null +++ b/SignalServiceKit/src/Account/CreatePreKeysOperation.swift @@ -0,0 +1,46 @@ +// +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// + +import Foundation +import PromiseKit + +@objc(SSKCreatePreKeysOperation) +public class CreatePreKeysOperation: OWSOperation { + private var accountManager: AccountManager { + return AccountManager.shared + } + private var primaryStorage: OWSPrimaryStorage { + return OWSPrimaryStorage.shared() + } + + private var identityKeyManager: OWSIdentityManager { + return OWSIdentityManager.shared() + } + + public override func run() { + Logger.debug("") + + if self.identityKeyManager.identityKeyPair() == nil { + self.identityKeyManager.generateNewIdentityKey() + } + let identityKey: Data = self.identityKeyManager.identityKeyPair()!.publicKey + let signedPreKeyRecord: SignedPreKeyRecord = self.primaryStorage.generateRandomSignedRecord() + let preKeyRecords: [PreKeyRecord] = self.primaryStorage.generatePreKeyRecords() + + firstly { + self.primaryStorage.storeSignedPreKey(signedPreKeyRecord.id, signedPreKeyRecord: signedPreKeyRecord) + self.primaryStorage.storePreKeyRecords(preKeyRecords) + + return self.accountManager.setPreKeys(identityKey: identityKey, signedPreKeyRecord: signedPreKeyRecord, preKeyRecords: preKeyRecords) + }.then { () -> Void in + signedPreKeyRecord.markAsAcceptedByService() + self.primaryStorage.setCurrentSignedPrekeyId(signedPreKeyRecord.id) + }.then { () -> Void in + Logger.debug("done") + self.reportSuccess() + }.catch { error in + self.reportError(error) + }.retainUntilComplete() + } +} diff --git a/SignalServiceKit/src/Account/PreKeyRefreshOperation.swift b/SignalServiceKit/src/Account/PreKeyRefreshOperation.swift index 85d856cff..3129df4b9 100644 --- a/SignalServiceKit/src/Account/PreKeyRefreshOperation.swift +++ b/SignalServiceKit/src/Account/PreKeyRefreshOperation.swift @@ -9,108 +9,6 @@ import PromiseKit // whenever ~2/3 of them have been consumed. let kEphemeralPreKeysMinimumCount: UInt = 35 -@objc(SSKCreatePreKeysOperation) -public class CreatePreKeysOperation: OWSOperation { - private var accountManager: AccountManager { - return AccountManager.shared - } - private var primaryStorage: OWSPrimaryStorage { - return OWSPrimaryStorage.shared() - } - - private var identityKeyManager: OWSIdentityManager { - return OWSIdentityManager.shared() - } - - public override func run() { - Logger.debug("") - - if self.identityKeyManager.identityKeyPair() == nil { - self.identityKeyManager.generateNewIdentityKey() - } - let identityKey: Data = self.identityKeyManager.identityKeyPair()!.publicKey - let signedPreKeyRecord: SignedPreKeyRecord = self.primaryStorage.generateRandomSignedRecord() - let preKeyRecords: [PreKeyRecord] = self.primaryStorage.generatePreKeyRecords() - - firstly { - self.primaryStorage.storeSignedPreKey(signedPreKeyRecord.id, signedPreKeyRecord: signedPreKeyRecord) - self.primaryStorage.storePreKeyRecords(preKeyRecords) - - return self.accountManager.setPreKeys(identityKey: identityKey, signedPreKeyRecord: signedPreKeyRecord, preKeyRecords: preKeyRecords) - }.then { () -> Void in - signedPreKeyRecord.markAsAcceptedByService() - self.primaryStorage.setCurrentSignedPrekeyId(signedPreKeyRecord.id) - }.then { () -> Void in - Logger.debug("done") - self.reportSuccess() - }.catch { error in - self.reportError(error) - }.retainUntilComplete() - } -} - -@objc(SSKRotateSignedPreKeyOperation) -public class RotateSignedPreKeyOperation: OWSOperation { - private var tsAccountManager: TSAccountManager { - return TSAccountManager.sharedInstance() - } - - private var accountManager: AccountManager { - return AccountManager.shared - } - - private var primaryStorage: OWSPrimaryStorage { - return OWSPrimaryStorage.shared() - } - - public override func run() { - Logger.debug("") - - guard tsAccountManager.isRegistered() else { - Logger.debug("skipping - not registered") - return - } - - let signedPreKeyRecord: SignedPreKeyRecord = self.primaryStorage.generateRandomSignedRecord() - - firstly { - self.primaryStorage.storeSignedPreKey(signedPreKeyRecord.id, signedPreKeyRecord: signedPreKeyRecord) - return self.accountManager.setSignedPreKey(signedPreKeyRecord) - }.then(on: DispatchQueue.global()) { () -> Void in - Logger.info("Successfully uploaded signed PreKey") - signedPreKeyRecord.markAsAcceptedByService() - self.primaryStorage.setCurrentSignedPrekeyId(signedPreKeyRecord.id) - - TSPreKeyManager.clearPreKeyUpdateFailureCount() - TSPreKeyManager.clearSignedPreKeyRecords() - }.then { () -> Void in - Logger.debug("done") - self.reportSuccess() - }.catch { error in - self.reportError(error) - }.retainUntilComplete() - } - - override public func didFail(error: Error) { - switch error { - case let networkManagerError as NetworkManagerError: - guard !networkManagerError.isNetworkError else { - Logger.debug("don't report SPK rotation failure w/ network error") - return - } - - guard networkManagerError.statusCode >= 400 && networkManagerError.statusCode <= 599 else { - Logger.debug("don't report SPK rotation failure w/ non application error") - return - } - - TSPreKeyManager.incrementPreKeyUpdateFailureCount() - default: - Logger.debug("don't report SPK rotation failure w/ non NetworkManager error: \(error)") - } - } -} - @objc(SSKRefreshPreKeysOperation) public class RefreshPreKeysOperation: OWSOperation { diff --git a/SignalServiceKit/src/Account/RotateSignedKeyOperation.swift b/SignalServiceKit/src/Account/RotateSignedKeyOperation.swift new file mode 100644 index 000000000..1dc893258 --- /dev/null +++ b/SignalServiceKit/src/Account/RotateSignedKeyOperation.swift @@ -0,0 +1,68 @@ +// +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// + +import Foundation +import PromiseKit + +@objc(SSKRotateSignedPreKeyOperation) +public class RotateSignedPreKeyOperation: OWSOperation { + private var tsAccountManager: TSAccountManager { + return TSAccountManager.sharedInstance() + } + + private var accountManager: AccountManager { + return AccountManager.shared + } + + private var primaryStorage: OWSPrimaryStorage { + return OWSPrimaryStorage.shared() + } + + public override func run() { + Logger.debug("") + + guard tsAccountManager.isRegistered() else { + Logger.debug("skipping - not registered") + return + } + + let signedPreKeyRecord: SignedPreKeyRecord = self.primaryStorage.generateRandomSignedRecord() + + firstly { + self.primaryStorage.storeSignedPreKey(signedPreKeyRecord.id, signedPreKeyRecord: signedPreKeyRecord) + return self.accountManager.setSignedPreKey(signedPreKeyRecord) + }.then(on: DispatchQueue.global()) { () -> Void in + Logger.info("Successfully uploaded signed PreKey") + signedPreKeyRecord.markAsAcceptedByService() + self.primaryStorage.setCurrentSignedPrekeyId(signedPreKeyRecord.id) + + TSPreKeyManager.clearPreKeyUpdateFailureCount() + TSPreKeyManager.clearSignedPreKeyRecords() + }.then { () -> Void in + Logger.debug("done") + self.reportSuccess() + }.catch { error in + self.reportError(error) + }.retainUntilComplete() + } + + override public func didFail(error: Error) { + switch error { + case let networkManagerError as NetworkManagerError: + guard !networkManagerError.isNetworkError else { + Logger.debug("don't report SPK rotation failure w/ network error") + return + } + + guard networkManagerError.statusCode >= 400 && networkManagerError.statusCode <= 599 else { + Logger.debug("don't report SPK rotation failure w/ non application error") + return + } + + TSPreKeyManager.incrementPreKeyUpdateFailureCount() + default: + Logger.debug("don't report SPK rotation failure w/ non NetworkManager error: \(error)") + } + } +}