diff --git a/ConversationsClassic/AppData/Client/Client+MartinOMEMO.swift b/ConversationsClassic/AppData/Client/Client+MartinOMEMO.swift index b5749f5..2cc0236 100644 --- a/ConversationsClassic/AppData/Client/Client+MartinOMEMO.swift +++ b/ConversationsClassic/AppData/Client/Client+MartinOMEMO.swift @@ -145,31 +145,124 @@ extension ClientMartinOMEMO: SignalSessionStoreProtocol { // MARK: - PreKey extension ClientMartinOMEMO: SignalPreKeyStoreProtocol { func currentPreKeyId() -> UInt32 { - 0 + do { + let data = try Database.shared.dbQueue.read { db in + try Row.fetchOne( + db, + sql: "SELECT max(id) FROM omemo_pre_keys WHERE account = :account", + arguments: ["account": credentials.bareJid] + ) + } + return data?["id"] ?? 0 + } catch { + logIt(.error, "Error fetching chats: \(error.localizedDescription)") + return 0 + } } func loadPreKey(withId: UInt32) -> Data? { - print(withId) - return nil + do { + let data = try Database.shared.dbQueue.read { db in + try Row.fetchOne( + db, + sql: "SELECT key FROM omemo_pre_keys WHERE account = :account AND id = :id", + arguments: ["account": credentials.bareJid, "id": withId] + ) + } + return data?["key"] + } catch { + logIt(.error, "Error fetching chats: \(error.localizedDescription)") + return nil + } } func storePreKey(_ data: Data, withId: UInt32) -> Bool { - print(data, withId) - return false + do { + try Database.shared.dbQueue.write { db in + try db.execute( + sql: "INSERT INTO omemo_pre_keys (account, id, key) VALUES (:account, :id, :key)", + arguments: ["account": credentials.bareJid, "id": withId, "key": data] + ) + } + return true + } catch { + logIt(.error, "Error fetching chats: \(error.localizedDescription)") + return false + } } func containsPreKey(withId: UInt32) -> Bool { - print(withId) - return false + do { + let rec = try Database.shared.dbQueue.read { db in + try Row.fetchOne( + db, + sql: "SELECT key FROM omemo_pre_keys WHERE account = :account AND id = :id", + arguments: ["account": credentials.bareJid, "id": withId] + ) + } + return rec != nil + } catch { + logIt(.error, "Error fetching chats: \(error.localizedDescription)") + return false + } } func deletePreKey(withId: UInt32) -> Bool { - print(withId) - return false + do { + try Database.shared.dbQueue.write { db in + try db.execute( + sql: "DELETE FROM omemo_pre_keys WHERE account = :account AND id = :id", + arguments: ["account": credentials.bareJid, "id": withId] + ) + } + return true + } catch { + logIt(.error, "Error fetching chats: \(error.localizedDescription)") + return false + } } + // TODO: Check logic of this function carefully!!! func flushDeletedPreKeys() -> Bool { - false + do { + try Database.shared.dbQueue.write { db in + try db.execute( + sql: """ + DELETE FROM omemo_pre_keys + WHERE account = :account + AND id IN + (SELECT id + FROM omemo_pre_keys + WHERE account = :account + AND id NOT IN ( + SELECT id + FROM omemo_pre_keys + WHERE account = :account + ORDER BY id DESC + LIMIT 100) + ) + """, + arguments: ["account": credentials.bareJid] + ) + } + return true + } catch { + logIt(.error, "Error fetching chats: \(error.localizedDescription)") + return false + } + } + + func preKeysWipe() { + do { + try Database.shared.dbQueue.write { db in + try db.execute( + sql: "DELETE FROM omemo_pre_keys WHERE account = :account", + arguments: ["account": credentials.bareJid] + ) + } + } catch { + logIt(.error, "Error fetching chats: \(error.localizedDescription)") + } } }