riot-web/playwright/e2e/crypto/test_indexeddb_cryptostore_...
David Langley 69ee8fd96a
Change License: AGPL + Element Commercial (#28856)
* Add commercial licence and update config files

* Update license in headers

* Revert "Update license in headers"

This reverts commit 7ed7949485.

* Update only spdx id

* Remove LicenseRef- from package.json

LicenseRef- no longer allowed in npm v3 package.json
This fixes the warning in the logs and failing build check.
2025-01-06 11:18:54 +00:00
..
README.md
dump.json
index.html
load.js Change License: AGPL + Element Commercial (#28856) 2025-01-06 11:18:54 +00:00

README.md

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.