From 16a284ca020b8058f30f7d46f4056e11a5a48b5d Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 14 Jun 2019 11:28:04 +1000 Subject: [PATCH] Handle insufficient PoW error --- .../src/Loki/API/LokiAPI+SwarmAPI.swift | 14 ++++++++++++-- SignalServiceKit/src/Loki/API/LokiAPI.swift | 2 ++ .../src/Network/API/TSNetworkManager.m | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift b/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift index 4fc3cca40..a1584b037 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift @@ -106,8 +106,8 @@ internal extension Promise { let oldFailureCount = LokiAPI.failureCount[target] ?? 0 let newFailureCount = oldFailureCount + 1 LokiAPI.failureCount[target] = newFailureCount - print("[Loki] Couldn't reach snode at: \(target.address):\(target.port); setting failure count to: \(newFailureCount).") - if oldFailureCount >= LokiAPI.failureThreshold { + print("[Loki] Couldn't reach snode at: \(target.address):\(target.port); setting failure count to \(newFailureCount).") + if newFailureCount >= LokiAPI.failureThreshold { print("[Loki] Failure threshold reached for: \(target); dropping it.") LokiAPI.dropIfNeeded(target, hexEncodedPublicKey: hexEncodedPublicKey) // Remove it from the swarm cache associated with the given public key LokiAPI.randomSnodePool.remove(target) // Remove it from the random snode pool @@ -116,6 +116,16 @@ internal extension Promise { // The snode isn't associated with the given public key anymore print("[Loki] Invalidating swarm for: \(hexEncodedPublicKey).") LokiAPI.dropIfNeeded(target, hexEncodedPublicKey: hexEncodedPublicKey) + case 432: + if case NetworkManagerError.taskError(_, let underlyingError) = error, let nsError = underlyingError as? NSError, + let data = nsError.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] as? Data, let json = try? JSONSerialization.jsonObject(with: data, options: []) as? JSON, + let powDifficulty = json["difficulty"] as? Int { + print("[Loki] Setting PoW difficulty to \(powDifficulty).") + LokiAPI.powDifficulty = UInt(powDifficulty) + } else { + print("[Loki] Failed to update PoW difficulty.") + } + break default: break } } diff --git a/SignalServiceKit/src/Loki/API/LokiAPI.swift b/SignalServiceKit/src/Loki/API/LokiAPI.swift index 6dd673651..00205c0cf 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI.swift @@ -79,6 +79,8 @@ public final class LokiAPI : NSObject { return Set(swarm.map { sendLokiMessage(lokiMessageWithPoW, to: $0).map { rawResponse in if let json = rawResponse as? JSON, let powDifficulty = json["difficulty"] as? Int { + guard powDifficulty != LokiAPI.powDifficulty else { return rawResponse } + print("[Loki] Setting PoW difficulty to \(powDifficulty).") LokiAPI.powDifficulty = UInt(powDifficulty) } else { print("[Loki] Failed to update PoW difficulty from: \(rawResponse).") diff --git a/SignalServiceKit/src/Network/API/TSNetworkManager.m b/SignalServiceKit/src/Network/API/TSNetworkManager.m index 57f0b08a4..9cdce8624 100644 --- a/SignalServiceKit/src/Network/API/TSNetworkManager.m +++ b/SignalServiceKit/src/Network/API/TSNetworkManager.m @@ -311,7 +311,7 @@ dispatch_queue_t NetworkManagerQueue() [OutageDetection.sharedManager reportConnectionSuccess]; }); }; - TSNetworkManagerSuccess failure = ^(NSURLSessionDataTask *task, NSError *error) { + TSNetworkManagerFailure failure = ^(NSURLSessionDataTask *task, NSError *error) { dispatch_async(NetworkManagerQueue(), ^{ [sessionManagerPool returnToPool:sessionManager]; });