From 99610cf37483f75c465bb9ebb1886188ee29c37e Mon Sep 17 00:00:00 2001 From: Ryan Zhao Date: Mon, 16 Jan 2023 11:48:35 +1100 Subject: [PATCH] add snode api endpoint get expiries --- SessionSnodeKit/Models/SnodeAPIEndpoint.swift | 2 +- SessionSnodeKit/SnodeAPI.swift | 40 ++++++++++++++++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/SessionSnodeKit/Models/SnodeAPIEndpoint.swift b/SessionSnodeKit/Models/SnodeAPIEndpoint.swift index e12d66388..8e6e2de83 100644 --- a/SessionSnodeKit/Models/SnodeAPIEndpoint.swift +++ b/SessionSnodeKit/Models/SnodeAPIEndpoint.swift @@ -11,7 +11,7 @@ public enum SnodeAPIEndpoint: String { case getInfo = "info" case clearAllData = "delete_all" case expire = "expire" - case getExipires = "get_expiries" + case getExpiries = "get_expiries" case batch = "batch" case sequence = "sequence" } diff --git a/SessionSnodeKit/SnodeAPI.swift b/SessionSnodeKit/SnodeAPI.swift index 611354e88..25a767eb9 100644 --- a/SessionSnodeKit/SnodeAPI.swift +++ b/SessionSnodeKit/SnodeAPI.swift @@ -494,6 +494,42 @@ public final class SnodeAPI { // MARK: - Retrieve + public static func getExpiries(from snode: Snode, associatedWith publicKey: String, of serverHashes: [String]) -> Promise<[String: UInt64]> { + guard let userED25519KeyPair: Box.KeyPair = Storage.shared.read({ db in Identity.fetchUserEd25519KeyPair(db) }) else { + return Promise(error: SnodeAPIError.noKeyPair) + } + + // Construct signature + let timestamp = UInt64(SnodeAPI.currentOffsetTimestampMs()) + let ed25519PublicKey = userED25519KeyPair.publicKey.toHexString() + + guard + let verificationData = (SnodeAPIEndpoint.getExpiries.rawValue + String(timestamp) + serverHashes.joined()).data(using: String.Encoding.utf8), + let signature = sodium.sign.signature(message: Bytes(verificationData), secretKey: userED25519KeyPair.secretKey) + else { return Promise(error: SnodeAPIError.signingFailed) } + + // Make the request + let parameters: JSON = [ + "pubKey": Features.useTestnet ? publicKey.removingIdPrefixIfNeeded() : publicKey, + "messages": serverHashes, + "timestamp": timestamp, + "pubkey_ed25519": ed25519PublicKey, + "signature": signature.toBase64() + ] + + return invoke(.getExpiries, on: snode, associatedWith: publicKey, parameters: parameters) + .map { responseData -> [String: UInt64] in + guard + let responseJson: JSON = try? JSONSerialization.jsonObject(with: responseData, options: [ .fragmentsAllowed ]) as? JSON, + let expiries: [String: UInt64] = responseJson["expiries"] as? [String: UInt64] + else { + return [:] + } + + return expiries + } + } + // Not in use until we can batch delete and store config messages public static func getConfigMessages(from snode: Snode, associatedWith publicKey: String) -> Promise<([SnodeReceivedMessage], String?)> { let (promise, seal) = Promise<([SnodeReceivedMessage], String?)>.pending() @@ -557,7 +593,7 @@ public final class SnodeAPI { let namespaceVerificationString = (namespace == defaultNamespace ? "" : String(namespace)) guard - let verificationData = ("retrieve" + namespaceVerificationString + String(timestamp)).data(using: String.Encoding.utf8), + let verificationData = (SnodeAPIEndpoint.getMessages.rawValue + namespaceVerificationString + String(timestamp)).data(using: String.Encoding.utf8), let signature = sodium.sign.signature(message: Bytes(verificationData), secretKey: userED25519KeyPair.secretKey) else { return Promise(error: SnodeAPIError.signingFailed) } @@ -657,7 +693,7 @@ public final class SnodeAPI { let ed25519PublicKey = userED25519KeyPair.publicKey.toHexString() guard - let verificationData = ("store" + String(namespace) + String(timestamp)).data(using: String.Encoding.utf8), + let verificationData = (SnodeAPIEndpoint.sendMessage.rawValue + String(namespace) + String(timestamp)).data(using: String.Encoding.utf8), let signature = sodium.sign.signature(message: Bytes(verificationData), secretKey: userED25519KeyPair.secretKey) else { return Promise(error: SnodeAPIError.signingFailed) }