Rocket.Chat.ReactNative/ios/Shared/RocketChat/Database.swift

69 lines
1.8 KiB
Swift
Raw Normal View History

[NEW] E2E Encryption push (iOS) (#2463) * link pods to notification service * push encryption poc * decrypt room key poc * read user key from mmkv and cast into a pkcs * push decrypt poc (iOS) * expose needed watermelon methods * watermelon -> database * indent & simple-crypto update * string extensions * storage * toBase64 -> toData * remove a forced unwrap * remove unused import * database driver * improvement * folder structure & watermelon bridge * more improvement stuff * watermelon -> database * reuse database instance * improvement * database fix: bypass watermelon cache * some code improvements * encryption instances * start api stuff * network layer * improve notification service * improve folder structure * watermelon patch * retry fetch logic * rocketchat class * fix try to decrypt without a roomKey * fallback to original content that is translated * some fixes to rocketchat logic * merge develop * remove unnecessary extension * [CHORE] Improve reply notification code (iOS) * undo sign changes * remove mocked value * import direct from library * send message request * reply notification with encrypted message working properly * revert apple sign * fix api onerror * trick to display sender name on group notifications * revert data.host change * fix some multithread issues * use sendername sent by server * small improvement * Bump crypto lib * Update ios/NotificationService/NotificationService.swift * add experimental string * remove trailing slash * remove trailing slash on reply * fix decrypt messages Co-authored-by: Diego Mello <diegolmello@gmail.com>
2020-09-24 18:34:13 +00:00
//
// Database.swift
// NotificationService
//
// Created by Djorkaeff Alexandre Vilela Pereira on 9/14/20.
// Copyright © 2020 Rocket.Chat. All rights reserved.
//
import Foundation
import WatermelonDB
final class Database {
private final var database: WatermelonDB.Database? = nil
private var directory: String? {
if let suiteName = Bundle.main.object(forInfoDictionaryKey: "AppGroup") as? String {
if let directory = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: suiteName) {
return directory.path
}
}
return nil
}
init(server: String) {
if let url = URL(string: server) {
if let domain = url.domain, let directory = directory {
self.database = WatermelonDB.Database(path: "\(directory)/\(domain)-experimental.db")
}
}
}
func readRoomEncryptionKey(rid: String) -> String? {
if let database = database {
if let results = try? database.queryRaw("select * from subscriptions where id == ? limit 1", [rid]) {
guard let record = results.next() else {
return nil
}
if let room = record.resultDictionary as? [String: Any] {
if let e2eKey = room["e2e_key"] as? String {
return e2eKey
}
}
}
}
return nil
}
func readRoomEncrypted(rid: String) -> Bool {
if let database = database {
if let results = try? database.queryRaw("select * from subscriptions where id == ? limit 1", [rid]) {
guard let record = results.next() else {
return false
}
if let room = record.resultDictionary as? [String: Any] {
if let encrypted = room["encrypted"] as? Bool {
return encrypted
}
}
}
}
return false
}
}