Debug onion request path building

pull/148/head
gmbnt 5 years ago
parent 1f3d13ee3b
commit fcb629cf06

@ -172,8 +172,8 @@ internal enum OnionRequestAPI {
let snodePool = LokiAPI.randomSnodePool let snodePool = LokiAPI.randomSnodePool
return getGuardSnodes().then(on: workQueue) { guardSnodes -> Promise<Set<LokiAPITarget>> in return getGuardSnodes().then(on: workQueue) { guardSnodes -> Promise<Set<LokiAPITarget>> in
var unusedSnodes = snodePool.subtracting(guardSnodes) // Sync on workQueue var unusedSnodes = snodePool.subtracting(guardSnodes) // Sync on workQueue
let minSnodeCount = guardSnodeCount * pathSize - guardSnodeCount let pathSnodeCount = guardSnodeCount * pathSize - guardSnodeCount
guard unusedSnodes.count >= minSnodeCount else { throw Error.insufficientSnodes } guard unusedSnodes.count >= pathSnodeCount else { throw Error.insufficientSnodes }
func getPathSnode() -> Promise<LokiAPITarget> { func getPathSnode() -> Promise<LokiAPITarget> {
// randomElement() uses the system's default random generator, which is cryptographically secure // randomElement() uses the system's default random generator, which is cryptographically secure
guard let candidate = unusedSnodes.randomElement() else { return Promise<LokiAPITarget> { $0.reject(Error.insufficientSnodes) } } guard let candidate = unusedSnodes.randomElement() else { return Promise<LokiAPITarget> { $0.reject(Error.insufficientSnodes) } }
@ -182,14 +182,14 @@ internal enum OnionRequestAPI {
// Loop until a reliable guard snode is found // Loop until a reliable guard snode is found
return testSnode(candidate).map(on: workQueue) { candidate }.recover(on: workQueue) { _ in getPathSnode() } return testSnode(candidate).map(on: workQueue) { candidate }.recover(on: workQueue) { _ in getPathSnode() }
} }
let promises = (0..<guardSnodeCount).map { _ in getPathSnode() } let promises = (0..<pathSnodeCount).map { _ in getPathSnode() }
return when(fulfilled: promises).map(on: workQueue) { Set($0) } return when(fulfilled: promises).map(on: workQueue) { Set($0) }
}.map(on: workQueue) { pathSnodes in }.map(on: workQueue) { pathSnodes in
var pathSnodes = pathSnodes var pathSnodes = pathSnodes
return Set(guardSnodes.map { guardSnode in return Set(guardSnodes.map { guardSnode in
let result = [ guardSnode ] + (0..<(pathSize - 1)).map { _ in let result = [ guardSnode ] + (0..<(pathSize - 1)).map { _ in
// randomElement() uses the system's default random generator, which is cryptographically secure // randomElement() uses the system's default random generator, which is cryptographically secure
let pathSnode = pathSnodes.randomElement()! // Safe because of the minSnodeCount check above let pathSnode = pathSnodes.randomElement()! // Should be safe
pathSnodes.remove(pathSnode) pathSnodes.remove(pathSnode)
return pathSnode return pathSnode
} }
@ -261,11 +261,11 @@ internal enum OnionRequestAPI {
let url = "\(guardSnode.address):\(guardSnode.port)/onion_req" let url = "\(guardSnode.address):\(guardSnode.port)/onion_req"
let encryptionResult = intermediate.encryptionResult let encryptionResult = intermediate.encryptionResult
let onion = encryptionResult.ciphertext let onion = encryptionResult.ciphertext
let symmetricKey = intermediate.symmetricKey
let parameters: JSON = [ let parameters: JSON = [
"ciphertext" : onion.base64EncodedString(), "ciphertext" : onion.base64EncodedString(),
"ephemeral_key" : encryptionResult.ephemeralPublicKey.toHexString() "ephemeral_key" : encryptionResult.ephemeralPublicKey.toHexString()
] ]
let symmetricKey = intermediate.symmetricKey
execute(.post, url, parameters: parameters).done(on: workQueue) { rawResponse in execute(.post, url, parameters: parameters).done(on: workQueue) { rawResponse in
guard let json = rawResponse as? JSON, let base64EncodedIVAndCiphertext = json["result"] as? String, guard let json = rawResponse as? JSON, let base64EncodedIVAndCiphertext = json["result"] as? String,
let ivAndCiphertext = Data(base64Encoded: base64EncodedIVAndCiphertext) else { return seal.reject(Error.invalidJSON) } let ivAndCiphertext = Data(base64Encoded: base64EncodedIVAndCiphertext) else { return seal.reject(Error.invalidJSON) }

Loading…
Cancel
Save