55 lines
2.3 KiB
Swift
55 lines
2.3 KiB
Swift
//
|
|
// Copyright 2023 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import Foundation
|
|
|
|
public enum ProvisioningRequestFactory {
|
|
|
|
public static func verifySecondaryDeviceRequest(
|
|
verificationCode: String,
|
|
phoneNumber: String,
|
|
authPassword: String,
|
|
attributes: AccountAttributes,
|
|
apnRegistrationId: RegistrationRequestFactory.ApnRegistrationId?,
|
|
prekeyBundles: RegistrationPreKeyUploadBundles,
|
|
) -> TSRequest {
|
|
owsAssertDebug(!verificationCode.isEmpty)
|
|
owsAssertDebug(!phoneNumber.isEmpty)
|
|
owsAssertDebug((apnRegistrationId != nil) != attributes.isManualMessageFetchEnabled)
|
|
|
|
let urlPathComponents = URLPathComponents(
|
|
["v1", "devices", "link"],
|
|
)
|
|
|
|
var urlComponents = URLComponents()
|
|
urlComponents.percentEncodedPath = urlPathComponents.percentEncoded
|
|
let url = urlComponents.url!
|
|
|
|
let jsonEncoder = JSONEncoder()
|
|
let accountAttributesData = try! jsonEncoder.encode(attributes)
|
|
let accountAttributesDict = try! JSONSerialization.jsonObject(with: accountAttributesData, options: .fragmentsAllowed) as! [String: Any]
|
|
|
|
var parameters: [String: Any] = [
|
|
"verificationCode": verificationCode,
|
|
"accountAttributes": accountAttributesDict,
|
|
"aciSignedPreKey": OWSRequestFactory.signedPreKeyRequestParameters(prekeyBundles.aci.signedPreKey),
|
|
"pniSignedPreKey": OWSRequestFactory.signedPreKeyRequestParameters(prekeyBundles.pni.signedPreKey),
|
|
"aciPqLastResortPreKey": OWSRequestFactory.pqPreKeyRequestParameters(prekeyBundles.aci.lastResortPreKey),
|
|
"pniPqLastResortPreKey": OWSRequestFactory.pqPreKeyRequestParameters(prekeyBundles.pni.lastResortPreKey),
|
|
]
|
|
|
|
if let apnRegistrationId {
|
|
let apnRegistrationIdData = try! jsonEncoder.encode(apnRegistrationId)
|
|
let apnRegistrationIdDict = try! JSONSerialization.jsonObject(with: apnRegistrationIdData, options: .fragmentsAllowed) as! [String: Any]
|
|
parameters["apnToken"] = apnRegistrationIdDict
|
|
}
|
|
|
|
var result = TSRequest(url: url, method: "PUT", parameters: parameters)
|
|
// The "verify code" request handles auth differently.
|
|
result.auth = .registration((username: phoneNumber, password: authPassword))
|
|
return result
|
|
}
|
|
}
|