mirror of
https://github.com/oxen-io/session-ios.git
synced 2023-12-13 21:30:14 +01:00
Updated the SharedConfigMessage type to have a TTL of 30 days Updated the SnodeAPI to have a 'poll' method to be more consistent with the OpenGroupAPI (it also does multiple things now so is cleaner) Added logic to limit the number of config messages to be retrieved per poll Added the 'ValidatableResponse' protocol to standardise SnodeAPI response validation Added the libSession version to the logs Fixed an issue where the user profile pic wouldn't get synced correctly due to memory going out of scope Fixed some threading issues Refactored the thread variants to follow the updated terminology (will think about refactoring other code areas later) Cleaned up the Combine error handling Started fixing broken unit tests
57 lines
2.2 KiB
Swift
57 lines
2.2 KiB
Swift
// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
|
|
|
|
import Foundation
|
|
import Sodium
|
|
import SessionUtilitiesKit
|
|
|
|
public class DeleteAllBeforeResponse: SnodeRecursiveResponse<DeleteAllMessagesResponse.SwarmItem> {}
|
|
|
|
// MARK: - ValidatableResponse
|
|
|
|
extension DeleteAllBeforeResponse: ValidatableResponse {
|
|
typealias ValidationData = UInt64
|
|
typealias ValidationResponse = Bool
|
|
|
|
/// Just one response in the swarm must be valid
|
|
internal static var requiredSuccessfulResponses: Int { 1 }
|
|
|
|
internal func validResultMap(
|
|
sodium: Sodium,
|
|
userX25519PublicKey: String,
|
|
validationData: UInt64
|
|
) throws -> [String: Bool] {
|
|
let validationMap: [String: Bool] = swarm.reduce(into: [:]) { result, next in
|
|
guard
|
|
!next.value.failed,
|
|
let signatureBase64: String = next.value.signatureBase64,
|
|
let encodedSignature: Data = Data(base64Encoded: signatureBase64)
|
|
else {
|
|
result[next.key] = false
|
|
|
|
if let reason: String = next.value.reason, let statusCode: Int = next.value.code {
|
|
SNLog("Couldn't delete data from: \(next.key) due to error: \(reason) (\(statusCode)).")
|
|
}
|
|
else {
|
|
SNLog("Couldn't delete data from: \(next.key).")
|
|
}
|
|
return
|
|
}
|
|
|
|
/// Signature of `( PUBKEY_HEX || BEFORE || DELETEDHASH[0] || ... || DELETEDHASH[N] )`
|
|
/// signed by the node's ed25519 pubkey. When doing a multi-namespace delete the `DELETEDHASH`
|
|
/// values are totally ordered (i.e. among all the hashes deleted regardless of namespace)
|
|
let verificationBytes: [UInt8] = userX25519PublicKey.bytes
|
|
.appending(contentsOf: "\(validationData)".data(using: .ascii)?.bytes)
|
|
.appending(contentsOf: next.value.deleted.joined().bytes)
|
|
|
|
result[next.key] = sodium.sign.verify(
|
|
message: verificationBytes,
|
|
publicKey: Data(hex: next.key).bytes,
|
|
signature: encodedSignature.bytes
|
|
)
|
|
}
|
|
|
|
return try Self.validated(map: validationMap)
|
|
}
|
|
}
|