Clean up onion request API database interaction

pull/293/head
nielsandriesse 5 years ago
parent 8e5736bec2
commit d659f59480

@ -17,10 +17,7 @@ final class PathStatusView : UIView {
layer.cornerRadius = Values.pathStatusViewSize / 2 layer.cornerRadius = Values.pathStatusViewSize / 2
layer.masksToBounds = false layer.masksToBounds = false
if OnionRequestAPI.paths.count < OnionRequestAPI.pathCount { if OnionRequestAPI.paths.count < OnionRequestAPI.pathCount {
let storage = OWSPrimaryStorage.shared() OnionRequestAPI.paths = Storage.getOnionRequestPaths()
storage.dbReadConnection.read { transaction in
OnionRequestAPI.paths = storage.getOnionRequestPaths(in: transaction)
}
} }
let color = (OnionRequestAPI.paths.count >= OnionRequestAPI.pathCount) ? Colors.accent : Colors.pathsBuilding let color = (OnionRequestAPI.paths.count >= OnionRequestAPI.pathCount) ? Colors.accent : Colors.pathsBuilding
setColor(to: color, isAnimated: false) setColor(to: color, isAnimated: false)

@ -52,10 +52,7 @@ final class IP2Country {
func populateCacheIfNeeded() -> Bool { func populateCacheIfNeeded() -> Bool {
if OnionRequestAPI.paths.count < OnionRequestAPI.pathCount { if OnionRequestAPI.paths.count < OnionRequestAPI.pathCount {
let storage = OWSPrimaryStorage.shared() OnionRequestAPI.paths = Storage.getOnionRequestPaths()
storage.dbReadConnection.read { transaction in
OnionRequestAPI.paths = storage.getOnionRequestPaths(in: transaction)
}
} }
let paths = OnionRequestAPI.paths let paths = OnionRequestAPI.paths
guard paths.count >= OnionRequestAPI.pathCount else { return false } guard paths.count >= OnionRequestAPI.pathCount else { return false }

@ -126,7 +126,7 @@ public enum OnionRequestAPI {
OnionRequestAPI.paths = paths OnionRequestAPI.paths = paths
try! Storage.writeSync { transaction in try! Storage.writeSync { transaction in
print("[Loki] Persisting onion request paths to database.") print("[Loki] Persisting onion request paths to database.")
OWSPrimaryStorage.shared().setOnionRequestPaths(paths, in: transaction) Storage.setOnionRequestPaths(paths, using: transaction)
} }
DispatchQueue.main.async { DispatchQueue.main.async {
NotificationCenter.default.post(name: .pathsBuilt, object: nil) 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.") } guard pathSize >= 1 else { preconditionFailure("Can't build path of size zero.") }
var paths = OnionRequestAPI.paths var paths = OnionRequestAPI.paths
if paths.count < pathCount { if paths.count < pathCount {
Storage.read { transaction in paths = Storage.getOnionRequestPaths()
paths = OWSPrimaryStorage.shared().getOnionRequestPaths(in: transaction) OnionRequestAPI.paths = paths
OnionRequestAPI.paths = paths if paths.count >= pathCount {
if paths.count >= pathCount { guardSnodes.formUnion([ paths[0][0], paths[1][0] ])
guardSnodes.formUnion([ paths[0][0], paths[1][0] ])
}
} }
} }
// randomElement() uses the system's default random generator, which is cryptographically secure // randomElement() uses the system's default random generator, which is cryptographically secure
@ -189,14 +187,14 @@ public enum OnionRequestAPI {
paths = newPaths paths = newPaths
try! Storage.writeSync { transaction in try! Storage.writeSync { transaction in
print("[Loki] Persisting onion request paths to database.") print("[Loki] Persisting onion request paths to database.")
OWSPrimaryStorage.shared().setOnionRequestPaths(newPaths, in: transaction) Storage.setOnionRequestPaths(newPaths, using: transaction)
} }
} }
private static func dropAllPaths() { private static func dropAllPaths() {
paths.removeAll() paths.removeAll()
try! Storage.writeSync { transaction in try! Storage.writeSync { transaction in
OWSPrimaryStorage.shared().clearOnionRequestPaths(in: transaction) Storage.clearOnionRequestPaths(using: transaction)
} }
} }

@ -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)
}
}

@ -53,38 +53,6 @@ public extension OWSPrimaryStorage {
return result 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 // MARK: Session Requests
public func setSessionRequestTimestamp(for publicKey: String, to timestamp: Date, in transaction: YapDatabaseReadWriteTransaction) { public func setSessionRequestTimestamp(for publicKey: String, to timestamp: Date, in transaction: YapDatabaseReadWriteTransaction) {
transaction.setDate(timestamp, forKey: publicKey, inCollection: Storage.sessionRequestTimestampCollection) transaction.setDate(timestamp, forKey: publicKey, inCollection: Storage.sessionRequestTimestampCollection)

@ -13,7 +13,6 @@
return "LokiSwarmCollection-\(publicKey)" return "LokiSwarmCollection-\(publicKey)"
} }
@objc public static let onionRequestPathCollection = "LokiOnionRequestPathCollection"
@objc public static let openGroupCollection = "LokiPublicChatCollection" @objc public static let openGroupCollection = "LokiPublicChatCollection"
@objc public static let openGroupProfilePictureURLCollection = "LokiPublicChatAvatarURLCollection" @objc public static let openGroupProfilePictureURLCollection = "LokiPublicChatAvatarURLCollection"
@objc public static let openGroupUserCountCollection = "LokiPublicChatUserCountCollection" @objc public static let openGroupUserCountCollection = "LokiPublicChatUserCountCollection"

Loading…
Cancel
Save