You've already forked matrix-js-sdk
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:
@@ -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) {
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user