mirror of
https://github.com/oxen-io/session-ios.git
synced 2023-12-13 21:30:14 +01:00
WIP
This commit is contained in:
parent
2c15cd06f5
commit
55344700d7
4 changed files with 66 additions and 34 deletions
|
@ -5,7 +5,7 @@
|
||||||
<key>BuildDetails</key>
|
<key>BuildDetails</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>CarthageVersion</key>
|
<key>CarthageVersion</key>
|
||||||
<string>0.33.0</string>
|
<string>0.34.0</string>
|
||||||
<key>OSXVersion</key>
|
<key>OSXVersion</key>
|
||||||
<string>10.15.2</string>
|
<string>10.15.2</string>
|
||||||
<key>WebRTCCommit</key>
|
<key>WebRTCCommit</key>
|
||||||
|
|
|
@ -74,6 +74,24 @@ public class LokiDotNetAPI : NSObject {
|
||||||
throw error
|
throw error
|
||||||
}
|
}
|
||||||
// Send the request
|
// Send the request
|
||||||
|
let isLokiFileServer = server.contains("file.lokinet.org") || server.contains("file-dev.lokinet.org")
|
||||||
|
if isLokiFileServer {
|
||||||
|
LokiFileServerProxy(for: server).performLokiFileServerNSURLRequest(request as NSURLRequest).done { responseObject in
|
||||||
|
// Parse the server ID & download URL
|
||||||
|
guard let json = responseObject as? JSON, let data = json["data"] as? JSON, let serverID = data["id"] as? UInt64, let downloadURL = data["url"] as? String else {
|
||||||
|
print("[Loki] Couldn't parse attachment from: \(responseObject).")
|
||||||
|
return seal.reject(Error.parsingFailed)
|
||||||
|
}
|
||||||
|
// Update the attachment
|
||||||
|
attachment.serverId = serverID
|
||||||
|
attachment.isUploaded = true
|
||||||
|
attachment.downloadURL = downloadURL
|
||||||
|
attachment.save()
|
||||||
|
seal.fulfill(())
|
||||||
|
}.catch { error in
|
||||||
|
seal.reject(error)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
let task = AFURLSessionManager(sessionConfiguration: .default).uploadTask(withStreamedRequest: request as URLRequest, progress: { rawProgress in
|
let task = AFURLSessionManager(sessionConfiguration: .default).uploadTask(withStreamedRequest: request as URLRequest, progress: { rawProgress in
|
||||||
// Broadcast progress updates
|
// Broadcast progress updates
|
||||||
let progress = max(0.1, rawProgress.fractionCompleted)
|
let progress = max(0.1, rawProgress.fractionCompleted)
|
||||||
|
@ -105,6 +123,7 @@ public class LokiDotNetAPI : NSObject {
|
||||||
return seal.fulfill(())
|
return seal.fulfill(())
|
||||||
})
|
})
|
||||||
task.resume()
|
task.resume()
|
||||||
|
}
|
||||||
}.catch(on: DispatchQueue.global()) { error in
|
}.catch(on: DispatchQueue.global()) { error in
|
||||||
print("[Loki] Couldn't upload attachment.")
|
print("[Loki] Couldn't upload attachment.")
|
||||||
seal.reject(error)
|
seal.reject(error)
|
||||||
|
|
|
@ -39,6 +39,10 @@ internal class LokiFileServerProxy : LokiHTTPClient {
|
||||||
override internal func perform(_ request: TSRequest, withCompletionQueue queue: DispatchQueue = DispatchQueue.main) -> LokiAPI.RawResponsePromise {
|
override internal func perform(_ request: TSRequest, withCompletionQueue queue: DispatchQueue = DispatchQueue.main) -> LokiAPI.RawResponsePromise {
|
||||||
let isLokiFileServer = server.contains("file.lokinet.org") || server.contains("file-dev.lokinet.org")
|
let isLokiFileServer = server.contains("file.lokinet.org") || server.contains("file-dev.lokinet.org")
|
||||||
guard isLokiFileServer else { return super.perform(request, withCompletionQueue: queue) } // Don't proxy open group requests for now
|
guard isLokiFileServer else { return super.perform(request, withCompletionQueue: queue) } // Don't proxy open group requests for now
|
||||||
|
return performLokiFileServerNSURLRequest(request, withCompletionQueue: queue)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal func performLokiFileServerNSURLRequest(_ request: NSURLRequest, withCompletionQueue queue: DispatchQueue = DispatchQueue.main) -> LokiAPI.RawResponsePromise {
|
||||||
let uncheckedSymmetricKey = try? Curve25519.generateSharedSecret(fromPublicKey: LokiFileServerProxy.fileServerPublicKey, privateKey: keyPair.privateKey)
|
let uncheckedSymmetricKey = try? Curve25519.generateSharedSecret(fromPublicKey: LokiFileServerProxy.fileServerPublicKey, privateKey: keyPair.privateKey)
|
||||||
guard let symmetricKey = uncheckedSymmetricKey else { return Promise(error: Error.symmetricKeyGenerationFailed) }
|
guard let symmetricKey = uncheckedSymmetricKey else { return Promise(error: Error.symmetricKeyGenerationFailed) }
|
||||||
var headers = getCanonicalHeaders(for: request)
|
var headers = getCanonicalHeaders(for: request)
|
||||||
|
@ -50,8 +54,17 @@ internal class LokiFileServerProxy : LokiHTTPClient {
|
||||||
serverURLEndIndex < urlAsString.endIndex else { throw Error.endpointParsingFailed }
|
serverURLEndIndex < urlAsString.endIndex else { throw Error.endpointParsingFailed }
|
||||||
let endpointStartIndex = urlAsString.index(after: serverURLEndIndex)
|
let endpointStartIndex = urlAsString.index(after: serverURLEndIndex)
|
||||||
let endpoint = String(urlAsString[endpointStartIndex..<urlAsString.endIndex])
|
let endpoint = String(urlAsString[endpointStartIndex..<urlAsString.endIndex])
|
||||||
let parametersAsData = try JSONSerialization.data(withJSONObject: request.parameters, options: [])
|
let parametersAsString: String
|
||||||
let parametersAsString = !request.parameters.isEmpty ? String(bytes: parametersAsData, encoding: .utf8)! : "null"
|
if let tsRequest = request as? TSRequest {
|
||||||
|
let parametersAsData = try JSONSerialization.data(withJSONObject: tsRequest.parameters, options: [])
|
||||||
|
parametersAsString = !tsRequest.parameters.isEmpty ? String(bytes: parametersAsData, encoding: .utf8)! : "null"
|
||||||
|
} else {
|
||||||
|
if let parametersAsData = request.httpBody {
|
||||||
|
parametersAsString = "{ \"fileUpload\" : \"\(String(data: parametersAsData.base64EncodedData(), encoding: .utf8) ?? "null")\" }"
|
||||||
|
} else {
|
||||||
|
parametersAsString = "null"
|
||||||
|
}
|
||||||
|
}
|
||||||
let proxyRequestParameters: JSON = [
|
let proxyRequestParameters: JSON = [
|
||||||
"body" : parametersAsString,
|
"body" : parametersAsString,
|
||||||
"endpoint": endpoint,
|
"endpoint": endpoint,
|
||||||
|
|
|
@ -19,7 +19,7 @@ internal class LokiHTTPClient {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal func getCanonicalHeaders(for request: TSRequest) -> [String: Any] {
|
internal func getCanonicalHeaders(for request: NSURLRequest) -> [String:Any] {
|
||||||
guard let headers = request.allHTTPHeaderFields else { return [:] }
|
guard let headers = request.allHTTPHeaderFields else { return [:] }
|
||||||
return headers.mapValues { value in
|
return headers.mapValues { value in
|
||||||
switch value.lowercased() {
|
switch value.lowercased() {
|
||||||
|
|
Loading…
Reference in a new issue