From d659f5948090b65c0a50c204cb888a0b652e34e9 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Fri, 9 Oct 2020 08:29:03 +1100 Subject: [PATCH] Clean up onion request API database interaction --- .../src/Loki/Components/PathStatusView.swift | 5 +-- Signal/src/Loki/Utilities/IP2Country.swift | 5 +-- .../API/Onion Requests/OnionRequestAPI.swift | 16 ++++--- .../Storage+OnionRequests.swift | 42 +++++++++++++++++++ .../Deprecated/OWSPrimaryStorage+Loki.swift | 32 -------------- .../Deprecated/Storage+Collections.swift | 1 - 6 files changed, 51 insertions(+), 50 deletions(-) create mode 100644 SignalServiceKit/src/Loki/API/Onion Requests/Storage+OnionRequests.swift diff --git a/Signal/src/Loki/Components/PathStatusView.swift b/Signal/src/Loki/Components/PathStatusView.swift index 548c40741..e1d934bb2 100644 --- a/Signal/src/Loki/Components/PathStatusView.swift +++ b/Signal/src/Loki/Components/PathStatusView.swift @@ -17,10 +17,7 @@ final class PathStatusView : UIView { layer.cornerRadius = Values.pathStatusViewSize / 2 layer.masksToBounds = false if OnionRequestAPI.paths.count < OnionRequestAPI.pathCount { - let storage = OWSPrimaryStorage.shared() - storage.dbReadConnection.read { transaction in - OnionRequestAPI.paths = storage.getOnionRequestPaths(in: transaction) - } + OnionRequestAPI.paths = Storage.getOnionRequestPaths() } let color = (OnionRequestAPI.paths.count >= OnionRequestAPI.pathCount) ? Colors.accent : Colors.pathsBuilding setColor(to: color, isAnimated: false) diff --git a/Signal/src/Loki/Utilities/IP2Country.swift b/Signal/src/Loki/Utilities/IP2Country.swift index 87000b70a..bc8309df1 100644 --- a/Signal/src/Loki/Utilities/IP2Country.swift +++ b/Signal/src/Loki/Utilities/IP2Country.swift @@ -52,10 +52,7 @@ final class IP2Country { func populateCacheIfNeeded() -> Bool { if OnionRequestAPI.paths.count < OnionRequestAPI.pathCount { - let storage = OWSPrimaryStorage.shared() - storage.dbReadConnection.read { transaction in - OnionRequestAPI.paths = storage.getOnionRequestPaths(in: transaction) - } + OnionRequestAPI.paths = Storage.getOnionRequestPaths() } let paths = OnionRequestAPI.paths guard paths.count >= OnionRequestAPI.pathCount else { return false } diff --git a/SignalServiceKit/src/Loki/API/Onion Requests/OnionRequestAPI.swift b/SignalServiceKit/src/Loki/API/Onion Requests/OnionRequestAPI.swift index 409b952b3..8024e30db 100644 --- a/SignalServiceKit/src/Loki/API/Onion Requests/OnionRequestAPI.swift +++ b/SignalServiceKit/src/Loki/API/Onion Requests/OnionRequestAPI.swift @@ -126,7 +126,7 @@ public enum OnionRequestAPI { OnionRequestAPI.paths = paths try! Storage.writeSync { transaction in print("[Loki] Persisting onion request paths to database.") - OWSPrimaryStorage.shared().setOnionRequestPaths(paths, in: transaction) + Storage.setOnionRequestPaths(paths, using: transaction) } DispatchQueue.main.async { NotificationCenter.default.post(name: .pathsBuilt, object: nil) @@ -141,12 +141,10 @@ public enum OnionRequestAPI { guard pathSize >= 1 else { preconditionFailure("Can't build path of size zero.") } var paths = OnionRequestAPI.paths if paths.count < pathCount { - Storage.read { transaction in - paths = OWSPrimaryStorage.shared().getOnionRequestPaths(in: transaction) - OnionRequestAPI.paths = paths - if paths.count >= pathCount { - guardSnodes.formUnion([ paths[0][0], paths[1][0] ]) - } + paths = Storage.getOnionRequestPaths() + OnionRequestAPI.paths = paths + if paths.count >= pathCount { + guardSnodes.formUnion([ paths[0][0], paths[1][0] ]) } } // randomElement() uses the system's default random generator, which is cryptographically secure @@ -189,14 +187,14 @@ public enum OnionRequestAPI { paths = newPaths try! Storage.writeSync { transaction in print("[Loki] Persisting onion request paths to database.") - OWSPrimaryStorage.shared().setOnionRequestPaths(newPaths, in: transaction) + Storage.setOnionRequestPaths(newPaths, using: transaction) } } private static func dropAllPaths() { paths.removeAll() try! Storage.writeSync { transaction in - OWSPrimaryStorage.shared().clearOnionRequestPaths(in: transaction) + Storage.clearOnionRequestPaths(using: transaction) } } diff --git a/SignalServiceKit/src/Loki/API/Onion Requests/Storage+OnionRequests.swift b/SignalServiceKit/src/Loki/API/Onion Requests/Storage+OnionRequests.swift new file mode 100644 index 000000000..3ebeac856 --- /dev/null +++ b/SignalServiceKit/src/Loki/API/Onion Requests/Storage+OnionRequests.swift @@ -0,0 +1,42 @@ + +public extension Storage { + + // MARK: Onion Request Paths + internal static let onionRequestPathCollection = "LokiOnionRequestPathCollection" + + internal static func setOnionRequestPaths(_ paths: [OnionRequestAPI.Path], using transaction: YapDatabaseReadWriteTransaction) { + // FIXME: This approach assumes 2 paths of length 3 each. We should do better than this. + guard paths.count == 2 else { return } + let path0 = paths[0] + let path1 = paths[1] + guard path0.count == 3, path1.count == 3 else { return } + let collection = onionRequestPathCollection + transaction.setObject(path0[0], forKey: "0-0", inCollection: collection) + transaction.setObject(path0[1], forKey: "0-1", inCollection: collection) + transaction.setObject(path0[2], forKey: "0-2", inCollection: collection) + transaction.setObject(path1[0], forKey: "1-0", inCollection: collection) + transaction.setObject(path1[1], forKey: "1-1", inCollection: collection) + transaction.setObject(path1[2], forKey: "1-2", inCollection: collection) + } + + public static func getOnionRequestPaths() -> [OnionRequestAPI.Path] { + var result: [OnionRequestAPI.Path] = [] + read { transaction in + let collection = onionRequestPathCollection + if + let path0Snode0 = transaction.object(forKey: "0-0", inCollection: collection) as? Snode, + let path0Snode1 = transaction.object(forKey: "0-1", inCollection: collection) as? Snode, + let path0Snode2 = transaction.object(forKey: "0-2", inCollection: collection) as? Snode, + let path1Snode0 = transaction.object(forKey: "1-0", inCollection: collection) as? Snode, + let path1Snode1 = transaction.object(forKey: "1-1", inCollection: collection) as? Snode, + let path1Snode2 = transaction.object(forKey: "1-2", inCollection: collection) as? Snode { + result = [ [ path0Snode0, path0Snode1, path0Snode2 ], [ path1Snode0, path1Snode1, path1Snode2 ] ] + } + } + return result + } + + internal static func clearOnionRequestPaths(using transaction: YapDatabaseReadWriteTransaction) { + transaction.removeAllObjects(inCollection: onionRequestPathCollection) + } +} diff --git a/SignalServiceKit/src/Loki/Database/Deprecated/OWSPrimaryStorage+Loki.swift b/SignalServiceKit/src/Loki/Database/Deprecated/OWSPrimaryStorage+Loki.swift index e6f80b104..e9bddf298 100644 --- a/SignalServiceKit/src/Loki/Database/Deprecated/OWSPrimaryStorage+Loki.swift +++ b/SignalServiceKit/src/Loki/Database/Deprecated/OWSPrimaryStorage+Loki.swift @@ -53,38 +53,6 @@ public extension OWSPrimaryStorage { return result } - // MARK: Onion Request Paths - public func setOnionRequestPaths(_ paths: [OnionRequestAPI.Path], in transaction: YapDatabaseReadWriteTransaction) { - // FIXME: This is a bit of a dirty approach that assumes 2 paths of length 3 each. We should do better than this. - guard paths.count == 2 else { return } - let path0 = paths[0] - let path1 = paths[1] - guard path0.count == 3, path1.count == 3 else { return } - let collection = Storage.onionRequestPathCollection - transaction.setObject(path0[0], forKey: "0-0", inCollection: collection) - transaction.setObject(path0[1], forKey: "0-1", inCollection: collection) - transaction.setObject(path0[2], forKey: "0-2", inCollection: collection) - transaction.setObject(path1[0], forKey: "1-0", inCollection: collection) - transaction.setObject(path1[1], forKey: "1-1", inCollection: collection) - transaction.setObject(path1[2], forKey: "1-2", inCollection: collection) - } - - public func getOnionRequestPaths(in transaction: YapDatabaseReadTransaction) -> [OnionRequestAPI.Path] { - let collection = Storage.onionRequestPathCollection - guard - let path0Snode0 = transaction.object(forKey: "0-0", inCollection: collection) as? Snode, - let path0Snode1 = transaction.object(forKey: "0-1", inCollection: collection) as? Snode, - let path0Snode2 = transaction.object(forKey: "0-2", inCollection: collection) as? Snode, - let path1Snode0 = transaction.object(forKey: "1-0", inCollection: collection) as? Snode, - let path1Snode1 = transaction.object(forKey: "1-1", inCollection: collection) as? Snode, - let path1Snode2 = transaction.object(forKey: "1-2", inCollection: collection) as? Snode else { return [] } - return [ [ path0Snode0, path0Snode1, path0Snode2 ], [ path1Snode0, path1Snode1, path1Snode2 ] ] - } - - public func clearOnionRequestPaths(in transaction: YapDatabaseReadWriteTransaction) { - transaction.removeAllObjects(inCollection: Storage.onionRequestPathCollection) - } - // MARK: Session Requests public func setSessionRequestTimestamp(for publicKey: String, to timestamp: Date, in transaction: YapDatabaseReadWriteTransaction) { transaction.setDate(timestamp, forKey: publicKey, inCollection: Storage.sessionRequestTimestampCollection) diff --git a/SignalServiceKit/src/Loki/Database/Deprecated/Storage+Collections.swift b/SignalServiceKit/src/Loki/Database/Deprecated/Storage+Collections.swift index 11cdb6d71..d017cf89d 100644 --- a/SignalServiceKit/src/Loki/Database/Deprecated/Storage+Collections.swift +++ b/SignalServiceKit/src/Loki/Database/Deprecated/Storage+Collections.swift @@ -13,7 +13,6 @@ return "LokiSwarmCollection-\(publicKey)" } - @objc public static let onionRequestPathCollection = "LokiOnionRequestPathCollection" @objc public static let openGroupCollection = "LokiPublicChatCollection" @objc public static let openGroupProfilePictureURLCollection = "LokiPublicChatAvatarURLCollection" @objc public static let openGroupUserCountCollection = "LokiPublicChatUserCountCollection"