This commit is contained in:
nielsandriesse 2021-03-24 13:14:06 +11:00
parent 4c9728b4fe
commit a36fa3f4f8
2 changed files with 16 additions and 10 deletions

View File

@ -3,6 +3,7 @@ import SessionSnodeKit
// TODO: Message signature validation
// TODO: Keeping track of moderators
// TODO: Token expiration
public enum OpenGroupAPIV2 {
@ -35,19 +36,21 @@ public enum OpenGroupAPIV2 {
let endpoint: String
let queryParameters: [String:String]
let parameters: JSON
let headers: [String:String]
let isAuthRequired: Bool
/// Always `true` under normal circumstances. You might want to disable
/// this when running over Lokinet.
let useOnionRouting: Bool
init(verb: HTTP.Verb, room: String, server: String, endpoint: String, queryParameters: [String:String] = [:],
parameters: JSON = [:], isAuthRequired: Bool = true, useOnionRouting: Bool = true) {
parameters: JSON = [:], headers: [String:String] = [:], isAuthRequired: Bool = true, useOnionRouting: Bool = true) {
self.verb = verb
self.room = room
self.server = server
self.endpoint = endpoint
self.queryParameters = queryParameters
self.parameters = parameters
self.headers = headers
self.isAuthRequired = isAuthRequired
self.useOnionRouting = useOnionRouting
}
@ -70,12 +73,13 @@ public enum OpenGroupAPIV2 {
guard let url = URL(string: rawURL) else { return Promise(error: Error.invalidURL) }
tsRequest = TSRequest(url: url, method: request.verb.rawValue, parameters: request.parameters)
}
tsRequest.setValue(request.room, forKey: "Room")
tsRequest.allHTTPHeaderFields = request.headers
tsRequest.setValue(request.room, forHTTPHeaderField: "Room")
if request.useOnionRouting {
guard let publicKey = SNMessagingKitConfiguration.shared.storage.getOpenGroupPublicKey(for: request.server) else { return Promise(error: Error.noPublicKey) }
if request.isAuthRequired {
return getAuthToken(for: request.room, on: request.server).then(on: DispatchQueue.global(qos: .default)) { authToken -> Promise<JSON> in
tsRequest.setValue(authToken, forKey: "Authorization")
tsRequest.setValue(authToken, forHTTPHeaderField: "Authorization")
return OnionRequestAPI.sendOnionRequest(tsRequest, to: request.server, using: publicKey)
}
} else {
@ -112,8 +116,9 @@ public enum OpenGroupAPIV2 {
let queryParameters = [ "public_key" : getUserHexEncodedPublicKey() ]
let request = Request(verb: .get, room: room, server: server, endpoint: "auth_token_challenge", queryParameters: queryParameters, isAuthRequired: false)
return send(request).map(on: DispatchQueue.global(qos: .userInitiated)) { json in
guard let base64EncodedCiphertext = json["ciphertext"] as? String, let base64EncodedEphemeralPublicKey = json["ephemeral_public_key"] as? String,
let ciphertext = Data(base64Encoded: base64EncodedCiphertext), let ephemeralPublicKey = Data(base64Encoded: base64EncodedEphemeralPublicKey) else {
guard let challenge = json["challenge"] as? JSON, let base64EncodedCiphertext = challenge["ciphertext"] as? String,
let base64EncodedEphemeralPublicKey = challenge["ephemeral_public_key"] as? String, let ciphertext = Data(base64Encoded: base64EncodedCiphertext),
let ephemeralPublicKey = Data(base64Encoded: base64EncodedEphemeralPublicKey) else {
throw Error.parsingFailed
}
let symmetricKey = try AESGCM.generateSymmetricKey(x25519PublicKey: ephemeralPublicKey, x25519PrivateKey: userKeyPair.privateKey)
@ -123,9 +128,10 @@ public enum OpenGroupAPIV2 {
}
public static func claimAuthToken(_ authToken: String, for room: String, on server: String) -> Promise<String> {
guard let userKeyPair = SNMessagingKitConfiguration.shared.storage.getUserKeyPair() else { return Promise(error: Error.generic) }
let parameters = [ "public_key" : userKeyPair.publicKey.toHexString() ]
let request = Request(verb: .post, room: room, server: server, endpoint: "claim_auth_token", parameters: parameters)
let parameters = [ "public_key" : getUserHexEncodedPublicKey() ]
let headers = [ "Authorization" : authToken ] // Set explicitly here because is isn't in the database yet at this point
let request = Request(verb: .post, room: room, server: server, endpoint: "claim_auth_token",
parameters: parameters, headers: headers, isAuthRequired: false)
return send(request).map(on: DispatchQueue.global(qos: .userInitiated)) { _ in authToken }
}

View File

@ -29,7 +29,7 @@ public final class OpenGroupManagerV2 : NSObject {
}
// MARK: Adding & Removing
public func add(room: String, server: String, name: String, using transaction: Any) -> Promise<Void> {
public func add(room: String, server: String, name: String, using transaction: Any) {
let storage = Storage.shared
storage.removeLastMessageServerID(for: room, on: server, using: transaction)
storage.removeLastDeletionServerID(for: room, on: server, using: transaction)
@ -46,7 +46,7 @@ public final class OpenGroupManagerV2 : NSObject {
}
let poller = OpenGroupPollerV2(for: openGroup)
poller.startIfNeeded()
OpenGroupManager.shared.pollers[openGroup.id] = poller
OpenGroupManagerV2.shared.pollers[openGroup.id] = poller
})
}