|
|
@ -173,41 +173,43 @@ internal enum OnionRequestAPI {
|
|
|
|
// MARK: Internal API
|
|
|
|
// MARK: Internal API
|
|
|
|
/// Sends an onion request to `snode`. Builds new paths as needed.
|
|
|
|
/// Sends an onion request to `snode`. Builds new paths as needed.
|
|
|
|
internal static func invoke(_ method: LokiAPITarget.Method, on snode: LokiAPITarget, parameters: JSON) -> Promise<Any> {
|
|
|
|
internal static func invoke(_ method: LokiAPITarget.Method, on snode: LokiAPITarget, parameters: JSON) -> Promise<Any> {
|
|
|
|
let parameters: JSON = [ "method" : method.rawValue, "params" : parameters ]
|
|
|
|
let (promise, seal) = Promise<Any>.pending()
|
|
|
|
let payload: Data
|
|
|
|
workQueue.async {
|
|
|
|
do {
|
|
|
|
let parameters: JSON = [ "method" : method.rawValue, "params" : parameters ]
|
|
|
|
guard JSONSerialization.isValidJSONObject(parameters) else { return Promise<Any> { $0.reject(Error.invalidJSON) } }
|
|
|
|
let payload: Data
|
|
|
|
payload = try JSONSerialization.data(withJSONObject: parameters, options: [])
|
|
|
|
do {
|
|
|
|
} catch (let error) {
|
|
|
|
guard JSONSerialization.isValidJSONObject(parameters) else { return seal.reject(Error.invalidJSON) }
|
|
|
|
return Promise<Any> { $0.reject(error) }
|
|
|
|
payload = try JSONSerialization.data(withJSONObject: parameters, options: [])
|
|
|
|
}
|
|
|
|
} catch (let error) {
|
|
|
|
return buildOnion(around: payload, targetedAt: snode).then(on: workQueue) { intermediate -> Promise<Any> in
|
|
|
|
return seal.reject(error)
|
|
|
|
let guardSnode = intermediate.guardSnode
|
|
|
|
}
|
|
|
|
let encryptionResult = intermediate.encryptionResult
|
|
|
|
buildOnion(around: payload, targetedAt: snode).done(on: workQueue) { intermediate in
|
|
|
|
let onion = encryptionResult.ciphertext
|
|
|
|
let guardSnode = intermediate.guardSnode
|
|
|
|
let url = URL(string: "\(guardSnode.address):\(guardSnode.port)/onion_req")!
|
|
|
|
let encryptionResult = intermediate.encryptionResult
|
|
|
|
var request = URLRequest(url: url)
|
|
|
|
let onion = encryptionResult.ciphertext
|
|
|
|
request.httpMethod = "POST"
|
|
|
|
let url = URL(string: "\(guardSnode.address):\(guardSnode.port)/onion_req")!
|
|
|
|
let parameters: JSON = [
|
|
|
|
var request = URLRequest(url: url)
|
|
|
|
"ciphertext" : onion.base64EncodedString(),
|
|
|
|
request.httpMethod = "POST"
|
|
|
|
"ephemeral_key" : encryptionResult.ephemeralPublicKey.toHexString()
|
|
|
|
let parameters: JSON = [
|
|
|
|
]
|
|
|
|
"ciphertext" : onion.base64EncodedString(),
|
|
|
|
guard JSONSerialization.isValidJSONObject(parameters) else { throw Error.invalidJSON }
|
|
|
|
"ephemeral_key" : encryptionResult.ephemeralPublicKey.toHexString()
|
|
|
|
request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: [])
|
|
|
|
]
|
|
|
|
request.timeoutInterval = timeout
|
|
|
|
guard JSONSerialization.isValidJSONObject(parameters) else { return seal.reject(Error.invalidJSON) }
|
|
|
|
let (promise, seal) = Promise<Any>.pending()
|
|
|
|
request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: [])
|
|
|
|
print("[Loki] [Onion Request API] Sending onion request.")
|
|
|
|
request.timeoutInterval = timeout
|
|
|
|
let task = urlSession.dataTask(with: request) { response, result, error in
|
|
|
|
print("[Loki] [Onion Request API] Sending onion request.")
|
|
|
|
if let error = error {
|
|
|
|
let task = urlSession.dataTask(with: request) { response, result, error in
|
|
|
|
seal.reject(error)
|
|
|
|
if let error = error {
|
|
|
|
} else if let result = result {
|
|
|
|
seal.reject(error)
|
|
|
|
seal.fulfill(result)
|
|
|
|
} else if let result = result {
|
|
|
|
} else {
|
|
|
|
seal.fulfill(result)
|
|
|
|
seal.reject(Error.generic)
|
|
|
|
} else {
|
|
|
|
|
|
|
|
seal.reject(Error.generic)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
task.resume()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
task.resume()
|
|
|
|
|
|
|
|
return promise
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return promise
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|