element-web/playwright/e2e/crypto/test_indexeddb_cryptostore_dump
David Langley 491f0cd08a
Change license (#13)
* Copyright headers 1

* Licence headers 2

* Copyright Headers 3

* Copyright Headers 4

* Copyright Headers 5

* Copyright Headers 6

* Copyright headers 7

* Add copyright headers for html and config file

* Replace license files and update package.json

* Update with CLA

* lint
2024-09-09 13:57:16 +00:00
..
dump.json Show a progress bar while migrating from legacy crypto (#12104) 2024-01-17 07:14:49 +00:00
index.html Show a progress bar while migrating from legacy crypto (#12104) 2024-01-17 07:14:49 +00:00
load.js Change license (#13) 2024-09-09 13:57:16 +00:00
README.md Show a progress bar while migrating from legacy crypto (#12104) 2024-01-17 07:14:49 +00:00

Dump of libolm indexeddb cryptostore

This directory contains, in dump.json, a dump of a real indexeddb store from a session using libolm crypto.

The corresponding pickle key is +1k2Ppd7HIisUY824v7JtV3/oEE4yX0TqtmNPyhaD7o.

This directory also contains, in index.html and load.js, a page which will populate indexeddb with the data (and the pickle key). This can be served via a Playwright Route so as to populate the indexeddb before the main application loads. Note that encrypting the pickle key requires the test User ID and Device ID, so they must be stored in localstorage before loading index.html.

Creation of the dump file

The dump was created by pasting the following into the browser console:

async function exportIndexedDb(name) {
    const db = await new Promise((resolve, reject) => {
        const dbReq = indexedDB.open(name);
        dbReq.onerror = reject;
        dbReq.onsuccess = () => resolve(dbReq.result);
    });

    const storeNames = db.objectStoreNames;
    const exports = {};
    for (const store of storeNames) {
        exports[store] = [];
        const txn = db.transaction(store, "readonly");
        const objectStore = txn.objectStore(store);
        await new Promise((resolve, reject) => {
            const cursorReq = objectStore.openCursor();
            cursorReq.onerror = reject;
            cursorReq.onsuccess = (event) => {
                const cursor = event.target.result;
                if (cursor) {
                    const entry = { value: cursor.value };
                    if (!objectStore.keyPath) {
                        entry.key = cursor.key;
                    }
                    exports[store].push(entry);
                    cursor.continue();
                } else {
                    resolve();
                }
            };
        });
    }
    return exports;
}

window.saveAs(
    new Blob([JSON.stringify(await exportIndexedDb("matrix-js-sdk:crypto"), null, 2)], {
        type: "application/json;charset=utf-8",
    }),
    "dump.json",
);

The pickle key is extracted via mxMatrixClientPeg.get().crypto.olmDevice.pickleKey.