126 lines
4.2 KiB
JavaScript
126 lines
4.2 KiB
JavaScript
|
/*
|
||
|
Copyright 2018 New Vector Ltd
|
||
|
|
||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
you may not use this file except in compliance with the License.
|
||
|
You may obtain a copy of the License at
|
||
|
|
||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
||
|
Unless required by applicable law or agreed to in writing, software
|
||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
See the License for the specific language governing permissions and
|
||
|
limitations under the License.
|
||
|
*/
|
||
|
|
||
|
const SOURCE_ORIGIN = 'file://';
|
||
|
|
||
|
const IndexedDBCryptoStore = window.matrixcs.IndexedDBCryptoStore;
|
||
|
const cryptoStore = new IndexedDBCryptoStore(window.indexedDB, 'matrix-js-sdk:crypto');
|
||
|
|
||
|
let accountStored = 0;
|
||
|
let sessionsStored = 0;
|
||
|
let inboundGroupSessionsStored = 0;
|
||
|
let deviceDataStored = 0;
|
||
|
let roomsStored = 0;
|
||
|
let localStorageKeysStored = 0;
|
||
|
|
||
|
const promises = [];
|
||
|
|
||
|
async function onMessage(e) {
|
||
|
if (e.origin !== SOURCE_ORIGIN) return;
|
||
|
|
||
|
const data = e.data.data; // bleh, naming clash
|
||
|
switch (e.data.cmd) {
|
||
|
case 'init':
|
||
|
// start with clean stores before we migrate data in
|
||
|
window.localStorage.clear();
|
||
|
await cryptoStore.deleteAllData();
|
||
|
|
||
|
e.source.postMessage({
|
||
|
cmd: 'initOK',
|
||
|
}, SOURCE_ORIGIN);
|
||
|
break;
|
||
|
case 'storeAccount':
|
||
|
promises.push(cryptoStore.doTxn(
|
||
|
'readwrite', [IndexedDBCryptoStore.STORE_ACCOUNT],
|
||
|
(txn) => {
|
||
|
cryptoStore.storeAccount(txn, data);
|
||
|
},
|
||
|
).then(() => {
|
||
|
++accountStored;
|
||
|
}));
|
||
|
break;
|
||
|
case 'storeSessions':
|
||
|
promises.push(cryptoStore.doTxn(
|
||
|
'readwrite', [IndexedDBCryptoStore.STORE_SESSIONS],
|
||
|
(txn) => {
|
||
|
for (const sess of data) {
|
||
|
cryptoStore.storeEndToEndSession(sess.deviceKey, sess.sessionId, sess, txn);
|
||
|
}
|
||
|
},
|
||
|
).then(() => {
|
||
|
sessionsStored += data.length;
|
||
|
}));
|
||
|
break;
|
||
|
case 'storeInboundGroupSessions':
|
||
|
promises.push(cryptoStore.doTxn(
|
||
|
'readwrite', [IndexedDBCryptoStore.STORE_INBOUND_GROUP_SESSIONS],
|
||
|
(txn) => {
|
||
|
for (const sess of data) {
|
||
|
cryptoStore.addEndToEndInboundGroupSession(
|
||
|
sess.senderKey, sess.sessionId, sess.sessionData, txn,
|
||
|
);
|
||
|
}
|
||
|
},
|
||
|
).then(() => {
|
||
|
inboundGroupSessionsStored += data.length;
|
||
|
}));
|
||
|
break;
|
||
|
case 'storeDeviceData':
|
||
|
promises.push(cryptoStore.doTxn(
|
||
|
'readwrite', [IndexedDBCryptoStore.STORE_DEVICE_DATA],
|
||
|
(txn) => {
|
||
|
cryptoStore.storeEndToEndDeviceData(data, txn);
|
||
|
},
|
||
|
).then(() => {
|
||
|
++deviceDataStored;
|
||
|
}));
|
||
|
break;
|
||
|
case 'storeRooms':
|
||
|
promises.push(cryptoStore.doTxn(
|
||
|
'readwrite', [IndexedDBCryptoStore.STORE_ROOMS],
|
||
|
(txn) => {
|
||
|
for (const [roomId, roomInfo] of Object.entries(data)) {
|
||
|
cryptoStore.storeEndToEndRoom(roomId, roomInfo, txn);
|
||
|
}
|
||
|
},
|
||
|
).then(() => {
|
||
|
++roomsStored;
|
||
|
}));
|
||
|
break;
|
||
|
case 'storeLocalStorage':
|
||
|
window.localStorage.setItem(data.key, data.val);
|
||
|
++localStorageKeysStored;
|
||
|
break;
|
||
|
case 'getSummary':
|
||
|
await Promise.all(promises);
|
||
|
e.source.postMessage({
|
||
|
cmd: 'summary',
|
||
|
data: {
|
||
|
accountStored,
|
||
|
sessionsStored,
|
||
|
inboundGroupSessionsStored,
|
||
|
deviceDataStored,
|
||
|
roomsStored,
|
||
|
localStorageKeysStored,
|
||
|
},
|
||
|
}, SOURCE_ORIGIN);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
window.addEventListener('message', onMessage);
|
||
|
|