| author | Eric Roberts
<eric@devl.me> 2026-08-26 18:14:51 UTC |
| committer | Stephen Paul Weber
<singpolyma@singpolyma.net> 2026-08-26 18:16:17 UTC |
| parent | 163762d841fabe5488fb5e114a47420cf3fb2ce7 |
| borogove/persistence/Sqlite.hx | +10 | -1 |
| test/TestSqlite.hx | +31 | -0 |
| test/persistence-tests.ts | +38 | -0 |
diff --git a/borogove/persistence/Sqlite.hx b/borogove/persistence/Sqlite.hx index fc0995f..8717921 100644 --- a/borogove/persistence/Sqlite.hx +++ b/borogove/persistence/Sqlite.hx @@ -1547,7 +1547,16 @@ class Sqlite implements Persistence implements KeyValueStore { @HaxeCBridge.noemit public function getOmemoPreKeys(login:String): Promise<Array<PreKey>> { - return Promise.resolve([]); + return db.exec( + "SELECT key_id, private_key, public_key FROM omemo_prekeys WHERE account_id=? ORDER BY key_id", + [login], + ).then(result -> { iterator: () -> result }.map(row -> ({ + keyId: row.key_id, + keyPair: { + privKey: row.private_key, + pubKey: row.public_key, + }, + }))); } @HaxeCBridge.noemit diff --git a/test/TestSqlite.hx b/test/TestSqlite.hx index c1f6c8f..388837e 100644 --- a/test/TestSqlite.hx +++ b/test/TestSqlite.hx @@ -1444,6 +1444,37 @@ class TestSqlite extends utest.Test { }); } + public function testOmemoPreKeys(async: Async) { + final login = "prekeys-existing@example.com"; + final keyPair1 = { + privKey: Bytes.ofHex("000102").getData(), + pubKey: Bytes.ofHex("030405").getData(), + }; + final keyPair2 = { + privKey: Bytes.ofHex("060708").getData(), + pubKey: Bytes.ofHex("090a0b").getData(), + }; + + persistence + .storeOmemoPreKey(login, 2, keyPair1) + .then(_ -> persistence.storeOmemoPreKey(login, 3, keyPair2)) + .then(_ -> persistence.getOmemoPreKeys(login)) + .then(result -> { + Assert.equals(2, result.length); + Assert.equals(2, result[0].keyId); + Assert.equals("000102", Bytes.ofData(result[0].keyPair.privKey).toHex()); + Assert.equals("030405", Bytes.ofData(result[0].keyPair.pubKey).toHex()); + Assert.equals(3, result[1].keyId); + Assert.equals("060708", Bytes.ofData(result[1].keyPair.privKey).toHex()); + Assert.equals("090a0b", Bytes.ofData(result[1].keyPair.pubKey).toHex()); + async.done(); + }) + .catchError(e -> { + Assert.fail(Std.string(e)); + async.done(); + }); + } + public function testOmemoSignedPreKey(async: Async) { final login = "signed-prekey@example.com"; final signedPreKey = { diff --git a/test/persistence-tests.ts b/test/persistence-tests.ts index 8a32158..14c751e 100644 --- a/test/persistence-tests.ts +++ b/test/persistence-tests.ts @@ -1649,6 +1649,44 @@ export function sharedPersistenceTests(test: PersistenceTest) { expect(result.afterRemove).toBeNull(); }); + test("getOmemoPreKeys lists stored pre-keys", async ({ + page, + persistence, + }) => { + const identifier = "omemo-prekeys-existing@example.com"; + const preKeys = [ + { + keyId: 2, + privKey: [0, 1, 2], + pubKey: [3, 4, 5], + }, + { + keyId: 3, + privKey: [6, 7, 8], + pubKey: [9, 10, 11], + }, + ]; + const result = await page.evaluate( + async ({ persistence, identifier, preKeys }) => { + for (const preKey of preKeys) { + await persistence.storeOmemoPreKey(identifier, preKey.keyId, { + privKey: new Uint8Array(preKey.privKey).buffer, + pubKey: new Uint8Array(preKey.pubKey).buffer, + }); + } + const loaded = await persistence.getOmemoPreKeys(identifier); + return loaded.map((preKey) => ({ + keyId: preKey.keyId, + privKey: [...new Uint8Array(preKey.keyPair.privKey)], + pubKey: [...new Uint8Array(preKey.keyPair.pubKey)], + })); + }, + { persistence, identifier, preKeys }, + ); + + expect(result).toEqual(preKeys); + }); + test("storeOmemoSignedPreKey and getOmemoSignedPreKey", async ({ page, persistence,