From 4f56307d39d2af42b6b9ce44dc0b8ce41f1f7be8 Mon Sep 17 00:00:00 2001 From: gmbnt Date: Mon, 6 Apr 2020 11:47:04 +1000 Subject: [PATCH] Fix parsing --- .../src/Loki/API/Onion Requests/OnionRequestAPI.swift | 11 +++++++---- .../API/Onion Requests/OnionRequestAPITests.swift | 6 ++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/SignalServiceKit/src/Loki/API/Onion Requests/OnionRequestAPI.swift b/SignalServiceKit/src/Loki/API/Onion Requests/OnionRequestAPI.swift index eaaa72969..c4368afb7 100644 --- a/SignalServiceKit/src/Loki/API/Onion Requests/OnionRequestAPI.swift +++ b/SignalServiceKit/src/Loki/API/Onion Requests/OnionRequestAPI.swift @@ -178,8 +178,8 @@ internal enum OnionRequestAPI { // MARK: Internal API /// Sends an onion request to `snode`. Builds new paths as needed. - internal static func invoke(_ method: LokiAPITarget.Method, on snode: LokiAPITarget, with parameters: JSON) -> Promise { - let (promise, seal) = Promise.pending() + internal static func invoke(_ method: LokiAPITarget.Method, on snode: LokiAPITarget, with parameters: JSON) -> Promise { + let (promise, seal) = Promise.pending() workQueue.async { let payload: JSON = [ "method" : method.rawValue, "params" : parameters ] buildOnion(around: payload, targetedAt: snode).done(on: workQueue) { intermediate in @@ -200,8 +200,11 @@ internal enum OnionRequestAPI { do { let gcm = GCM(iv: iv.bytes, tagLength: Int(gcmTagSize), mode: .combined) let aes = try AES(key: targetSnodeSymmetricKey.bytes, blockMode: gcm, padding: .noPadding) - let result = try aes.decrypt(ciphertext.bytes) - seal.fulfill(Data(bytes: result)) + let data = Data(try aes.decrypt(ciphertext.bytes)) + guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? JSON, + let bodyAsString = json["body"] as? String, let bodyAsData = bodyAsString.data(using: .utf8), + let body = try JSONSerialization.jsonObject(with: bodyAsData, options: []) as? JSON else { return seal.reject(HTTP.Error.invalidJSON) } + seal.fulfill(body) } catch (let error) { seal.reject(error) } diff --git a/SignalServiceKit/src/Loki/API/Onion Requests/OnionRequestAPITests.swift b/SignalServiceKit/src/Loki/API/Onion Requests/OnionRequestAPITests.swift index 2c9fba639..72761b1a0 100644 --- a/SignalServiceKit/src/Loki/API/Onion Requests/OnionRequestAPITests.swift +++ b/SignalServiceKit/src/Loki/API/Onion Requests/OnionRequestAPITests.swift @@ -5,8 +5,6 @@ import XCTest class OnionRequestAPITests : XCTestCase { - /// Builds a path and then routes the same request through it several times. Logs the number of successes - /// versus the number of failures. func testOnionRequestSending() { let semaphore = DispatchSemaphore(value: 0) var totalSuccessRate: Double = 0 @@ -20,9 +18,9 @@ class OnionRequestAPITests : XCTestCase { let mockSessionID = "0582bc30f11e8a9736407adcaca03b049f4acd4af3ae7eb6b6608d30f0b1e6a20e" let parameters: JSON = [ "pubKey" : mockSessionID ] let (promise, seal) = Promise.pending() - OnionRequestAPI.invoke(.getSwarm, on: snode, with: parameters).done(on: OnionRequestAPI.workQueue) { data in + OnionRequestAPI.invoke(.getSwarm, on: snode, with: parameters).done(on: OnionRequestAPI.workQueue) { json in successCount += 1 - print("[Loki] [Onion Request API] Onion request succeeded with result: \(String(data: data, encoding: .utf8)).") + print("[Loki] [Onion Request API] Onion request succeeded with result: \(json.prettifiedDescription).") seal.fulfill(()) }.catch(on: OnionRequestAPI.workQueue) { error in if case GCM.Error.fail = error {