1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-11-26 17:03:12 +03:00

Migrate from session store

This commit is contained in:
David Baker
2018-01-12 14:41:08 +00:00
parent 2cdb010cff
commit 6c1087e429
3 changed files with 49 additions and 37 deletions

View File

@@ -59,8 +59,9 @@ const TRACKING_STATUS_UP_TO_DATE = 3;
* @alias module:crypto/DeviceList * @alias module:crypto/DeviceList
*/ */
export default class DeviceList { export default class DeviceList {
constructor(baseApis, cryptoStore, olmDevice) { constructor(baseApis, cryptoStore, sessionStore, olmDevice) {
this._cryptoStore = cryptoStore; this._cryptoStore = cryptoStore;
this._sessionStore = sessionStore;
// userId -> { // userId -> {
// deviceId -> { // deviceId -> {
@@ -96,16 +97,37 @@ export default class DeviceList {
* Load the device tracking state from storage * Load the device tracking state from storage
*/ */
async load() { async load() {
let shouldDeleteSessionStore = false;
await this._cryptoStore.doTxn( await this._cryptoStore.doTxn(
'readonly', [IndexedDBCryptoStore.STORE_DEVICE_DATA], (txn) => { // migrate from session store if there's data there and not here
'readwrite', [IndexedDBCryptoStore.STORE_DEVICE_DATA], (txn) => {
this._cryptoStore.getEndToEndDeviceData(txn, (deviceData) => { this._cryptoStore.getEndToEndDeviceData(txn, (deviceData) => {
this._devices = deviceData ? deviceData.devices : {}, if (deviceData === null) {
this._deviceTrackingStatus = deviceData ? console.log("Migrating e2e device data...");
deviceData.trackingStatus : {}; this._devices = this._sessionStore.getAllEndToEndDevices();
this._syncToken = deviceData ? deviceData.syncToken : null; this._deviceTrackingStatus = this._sessionStore.getEndToEndDeviceTrackingStatus();
this._syncToken = this._sessionStore.getEndToEndDeviceSyncToken();
this._cryptoStore.storeEndToEndDeviceData({
devices: this._devices,
trackingStatus: this._deviceTrackingStatus,
syncToken: this._syncToken,
}, txn);
shouldDeleteSessionStore = true;
} else {
this._devices = deviceData ? deviceData.devices : {},
this._deviceTrackingStatus = deviceData ?
deviceData.trackingStatus : {};
this._syncToken = deviceData ? deviceData.syncToken : null;
}
}); });
}, },
); );
if (shouldDeleteSessionStore) {
// migrated data is now safely persisted: remove from old store
this._sessionStore.removeEndToEndDeviceData();
}
for (const u of Object.keys(this._deviceTrackingStatus)) { for (const u of Object.keys(this._deviceTrackingStatus)) {
// if a download was in progress when we got shut down, it isn't any more. // if a download was in progress when we got shut down, it isn't any more.
if (this._deviceTrackingStatus[u] == TRACKING_STATUS_DOWNLOAD_IN_PROGRESS) { if (this._deviceTrackingStatus[u] == TRACKING_STATUS_DOWNLOAD_IN_PROGRESS) {

View File

@@ -69,7 +69,7 @@ function Crypto(baseApis, sessionStore, userId, deviceId,
this._cryptoStore = cryptoStore; this._cryptoStore = cryptoStore;
this._olmDevice = new OlmDevice(sessionStore, cryptoStore); this._olmDevice = new OlmDevice(sessionStore, cryptoStore);
this._deviceList = new DeviceList(baseApis, cryptoStore, this._olmDevice); this._deviceList = new DeviceList(baseApis, cryptoStore, sessionStore, this._olmDevice);
// the last time we did a check for the number of one-time-keys on the // the last time we did a check for the number of one-time-keys on the
// server. // server.

View File

@@ -68,43 +68,24 @@ WebStorageSessionStore.prototype = {
}, },
/** /**
* Stores the known devices for a user. * Retrieves the known devices for all users.
* @param {string} userId The user's ID. * @return {object} A map from user ID to map of device ID to keys for the device.
* @param {object} devices A map from device ID to keys for the device.
*/ */
storeEndToEndDevicesForUser: function(userId, devices) { getAllEndToEndDevices: function() {
setJsonItem(this.store, keyEndToEndDevicesForUser(userId), devices); const prefix = keyEndToEndDevicesForUser('');
}, const devices = {};
for (let i = 0; i < store.length; ++i) {
/** const key = store.key(i);
* Retrieves the known devices for a user. const userId = key.substr(prefix.length);
* @param {string} userId The user's ID. if (key.startsWith(prefix)) devices[userId] = getJsonItem(this.store, key);
* @return {object} A map from device ID to keys for the device. }
*/ return devices;
getEndToEndDevicesForUser: function(userId) {
return getJsonItem(this.store, keyEndToEndDevicesForUser(userId));
},
storeEndToEndDeviceTrackingStatus: function(statusMap) {
setJsonItem(this.store, KEY_END_TO_END_DEVICE_LIST_TRACKING_STATUS, statusMap);
}, },
getEndToEndDeviceTrackingStatus: function() { getEndToEndDeviceTrackingStatus: function() {
return getJsonItem(this.store, KEY_END_TO_END_DEVICE_LIST_TRACKING_STATUS); return getJsonItem(this.store, KEY_END_TO_END_DEVICE_LIST_TRACKING_STATUS);
}, },
/**
* Store the sync token corresponding to the device list.
*
* This is used when starting the client, to get a list of the users who
* have changed their device list since the list time we were running.
*
* @param {String?} token
*/
storeEndToEndDeviceSyncToken: function(token) {
setJsonItem(this.store, KEY_END_TO_END_DEVICE_SYNC_TOKEN, token);
},
/** /**
* Get the sync token corresponding to the device list. * Get the sync token corresponding to the device list.
* *
@@ -114,6 +95,15 @@ WebStorageSessionStore.prototype = {
return getJsonItem(this.store, KEY_END_TO_END_DEVICE_SYNC_TOKEN); return getJsonItem(this.store, KEY_END_TO_END_DEVICE_SYNC_TOKEN);
}, },
/**
* Removes all end to end device data from the store
*/
removeEndToEndDeviceData: function() {
removeByPrefix(this.store, keyEndToEndDevicesForUser(''));
removeByPrefix(this.store, KEY_END_TO_END_DEVICE_LIST_TRACKING_STATUS);
removeByPrefix(this.store, KEY_END_TO_END_DEVICE_SYNC_TOKEN);
},
/** /**
* Retrieve the end-to-end sessions between the logged-in user and another * Retrieve the end-to-end sessions between the logged-in user and another
* device. * device.