diff --git a/SignalServiceKit/src/Messages/UD/OWSUDManager.swift b/SignalServiceKit/src/Messages/UD/OWSUDManager.swift index 0c923d724..f485903ab 100644 --- a/SignalServiceKit/src/Messages/UD/OWSUDManager.swift +++ b/SignalServiceKit/src/Messages/UD/OWSUDManager.swift @@ -9,6 +9,7 @@ import SignalCoreKit public enum OWSUDError: Error { case assertionError(description: String) + case invalidData(description: String) } @objc public protocol OWSUDManager: class { @@ -71,12 +72,6 @@ public class OWSUDManagerImpl: NSObject, OWSUDManager { ensureSenderCertificate().retainUntilComplete() } - // MARK: - Singletons - - private var networkManager: TSNetworkManager { - return SSKEnvironment.shared.networkManager - } - // MARK: - Recipient state @objc @@ -138,32 +133,22 @@ public class OWSUDManagerImpl: NSObject, OWSUDManager { return Promise(value: certificateData) } // Try to obtain a new sender certificate. - return requestSenderCertificate() + return requestSenderCertificate().then { (certificateData) in + // Cache the current sender certificate. + self.setSenderCertificate(certificateData) + + return Promise(value: certificateData) + } } private func requestSenderCertificate() -> Promise { - let request = OWSRequestFactory.udSenderCertificateRequest() - return self.networkManager.makePromise(request: request) - .then(execute: { (_, responseObject) -> Data in - let certificateData = try self.parseSenderCertificateResponse(responseObject: responseObject) - - guard self.isValidCertificate(certificateData: certificateData) else { - throw OWSUDError.assertionError(description: "Invalid sender certificate returned by server") - } - - // Cache the current sender certificate. - self.setSenderCertificate(certificateData) - - return certificateData - }) - } + return SignalServiceRestClient().requestUDSenderCertificate().then { (certificateData) in + guard self.isValidCertificate(certificateData: certificateData) else { + throw OWSUDError.invalidData(description: "Invalid sender certificate returned by server") + } - private func parseSenderCertificateResponse(responseObject: Any?) throws -> Data { - guard let parser = ParamParser(responseObject: responseObject) else { - throw OWSUDError.assertionError(description: "Invalid sender certificate response") + return Promise(value: certificateData) } - - return try parser.requiredBase64EncodedData(key: "certificate") } private func isValidCertificate(certificateData: Data) -> Bool { diff --git a/SignalServiceKit/src/Network/SignalServiceClient.swift b/SignalServiceKit/src/Network/SignalServiceClient.swift index 978e72435..a14ca48cc 100644 --- a/SignalServiceKit/src/Network/SignalServiceClient.swift +++ b/SignalServiceKit/src/Network/SignalServiceClient.swift @@ -9,6 +9,7 @@ protocol SignalServiceClient { func getAvailablePreKeys() -> Promise func registerPreKeys(identityKey: IdentityKey, signedPreKeyRecord: SignedPreKeyRecord, preKeyRecords: [PreKeyRecord]) -> Promise func setCurrentSignedPreKey(_ signedPreKey: SignedPreKeyRecord) -> Promise + func requestUDSenderCertificate() -> Promise } /// Based on libsignal-service-java's PushServiceSocket class @@ -51,4 +52,22 @@ class SignalServiceRestClient: SignalServiceClient { let request = OWSRequestFactory.registerSignedPrekeyRequest(with: signedPreKey) return networkManager.makePromise(request: request).asVoid() } + + public func requestUDSenderCertificate() -> Promise { + let request = OWSRequestFactory.udSenderCertificateRequest() + return self.networkManager.makePromise(request: request) + .then(execute: { (_, responseObject) -> Data in + let certificateData = try self.parseUDSenderCertificateResponse(responseObject: responseObject) + + return certificateData + }) + } + + private func parseUDSenderCertificateResponse(responseObject: Any?) throws -> Data { + guard let parser = ParamParser(responseObject: responseObject) else { + throw OWSUDError.invalidData(description: "Invalid sender certificate response") + } + + return try parser.requiredBase64EncodedData(key: "certificate") + } }