Respond to CR.

This commit is contained in:
Matthew Chen 2018-10-02 13:52:44 -04:00
parent 5da4f7bb57
commit b808c2b33b
2 changed files with 31 additions and 27 deletions

View file

@ -9,6 +9,7 @@ import SignalCoreKit
public enum OWSUDError: Error { public enum OWSUDError: Error {
case assertionError(description: String) case assertionError(description: String)
case invalidData(description: String)
} }
@objc public protocol OWSUDManager: class { @objc public protocol OWSUDManager: class {
@ -71,12 +72,6 @@ public class OWSUDManagerImpl: NSObject, OWSUDManager {
ensureSenderCertificate().retainUntilComplete() ensureSenderCertificate().retainUntilComplete()
} }
// MARK: - Singletons
private var networkManager: TSNetworkManager {
return SSKEnvironment.shared.networkManager
}
// MARK: - Recipient state // MARK: - Recipient state
@objc @objc
@ -138,32 +133,22 @@ public class OWSUDManagerImpl: NSObject, OWSUDManager {
return Promise(value: certificateData) return Promise(value: certificateData)
} }
// Try to obtain a new sender certificate. // 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<Data> { private func requestSenderCertificate() -> Promise<Data> {
let request = OWSRequestFactory.udSenderCertificateRequest() return SignalServiceRestClient().requestUDSenderCertificate().then { (certificateData) in
return self.networkManager.makePromise(request: request) guard self.isValidCertificate(certificateData: certificateData) else {
.then(execute: { (_, responseObject) -> Data in throw OWSUDError.invalidData(description: "Invalid sender certificate returned by server")
let certificateData = try self.parseSenderCertificateResponse(responseObject: responseObject) }
guard self.isValidCertificate(certificateData: certificateData) else { return Promise(value: certificateData)
throw OWSUDError.assertionError(description: "Invalid sender certificate returned by server")
}
// Cache the current sender certificate.
self.setSenderCertificate(certificateData)
return certificateData
})
}
private func parseSenderCertificateResponse(responseObject: Any?) throws -> Data {
guard let parser = ParamParser(responseObject: responseObject) else {
throw OWSUDError.assertionError(description: "Invalid sender certificate response")
} }
return try parser.requiredBase64EncodedData(key: "certificate")
} }
private func isValidCertificate(certificateData: Data) -> Bool { private func isValidCertificate(certificateData: Data) -> Bool {

View file

@ -9,6 +9,7 @@ protocol SignalServiceClient {
func getAvailablePreKeys() -> Promise<Int> func getAvailablePreKeys() -> Promise<Int>
func registerPreKeys(identityKey: IdentityKey, signedPreKeyRecord: SignedPreKeyRecord, preKeyRecords: [PreKeyRecord]) -> Promise<Void> func registerPreKeys(identityKey: IdentityKey, signedPreKeyRecord: SignedPreKeyRecord, preKeyRecords: [PreKeyRecord]) -> Promise<Void>
func setCurrentSignedPreKey(_ signedPreKey: SignedPreKeyRecord) -> Promise<Void> func setCurrentSignedPreKey(_ signedPreKey: SignedPreKeyRecord) -> Promise<Void>
func requestUDSenderCertificate() -> Promise<Data>
} }
/// Based on libsignal-service-java's PushServiceSocket class /// Based on libsignal-service-java's PushServiceSocket class
@ -51,4 +52,22 @@ class SignalServiceRestClient: SignalServiceClient {
let request = OWSRequestFactory.registerSignedPrekeyRequest(with: signedPreKey) let request = OWSRequestFactory.registerSignedPrekeyRequest(with: signedPreKey)
return networkManager.makePromise(request: request).asVoid() return networkManager.makePromise(request: request).asVoid()
} }
public func requestUDSenderCertificate() -> Promise<Data> {
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")
}
} }