Merge pull request #2975 from matrix-org/dbkr/fix_sso_2

Fix Single Sign-on
pull/21833/head
David Baker 2019-05-15 14:26:55 +01:00 committed by GitHub
commit cfe917e489
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 3 deletions

View File

@ -369,7 +369,7 @@ async function _doSetLoggedIn(credentials, clearStorage) {
// If there's an inconsistency between account data in local storage and the // If there's an inconsistency between account data in local storage and the
// crypto store, we'll be generally confused when handling encrypted data. // crypto store, we'll be generally confused when handling encrypted data.
// Show a modal recommending a full reset of storage. // Show a modal recommending a full reset of storage.
if (results.dataInLocalStorage && !results.dataInCryptoStore) { if (results.dataInLocalStorage && results.cryptoInited && !results.dataInCryptoStore) {
const signOut = await _showStorageEvictedDialog(); const signOut = await _showStorageEvictedDialog();
if (signOut) { if (signOut) {
await _clearStorage(); await _clearStorage();

View File

@ -121,6 +121,7 @@ class MatrixClientPeg {
// check that we have a version of the js-sdk which includes initCrypto // check that we have a version of the js-sdk which includes initCrypto
if (this.matrixClient.initCrypto) { if (this.matrixClient.initCrypto) {
await this.matrixClient.initCrypto(); await this.matrixClient.initCrypto();
StorageManager.setCryptoInitialised(true);
} }
} catch (e) { } catch (e) {
if (e && e.name === 'InvalidCryptoStoreError') { if (e && e.name === 'InvalidCryptoStoreError') {

View File

@ -50,11 +50,15 @@ export async function checkConsistency() {
let dataInLocalStorage = false; let dataInLocalStorage = false;
let dataInCryptoStore = false; let dataInCryptoStore = false;
let cryptoInited = false;
let healthy = true; let healthy = true;
if (localStorage) { if (localStorage) {
dataInLocalStorage = localStorage.length > 0; dataInLocalStorage = localStorage.length > 0;
log(`Local storage contains data? ${dataInLocalStorage}`); log(`Local storage contains data? ${dataInLocalStorage}`);
cryptoInited = localStorage.getItem("mx_crypto_initialised");
log(`Crypto initialised? ${cryptoInited}`);
} else { } else {
healthy = false; healthy = false;
error("Local storage cannot be used on this browser"); error("Local storage cannot be used on this browser");
@ -84,10 +88,11 @@ export async function checkConsistency() {
track("Crypto store disabled"); track("Crypto store disabled");
} }
if (dataInLocalStorage && !dataInCryptoStore) { if (dataInLocalStorage && cryptoInited && !dataInCryptoStore) {
healthy = false; healthy = false;
error( error(
"Data exists in local storage but not in crypto store. " + "Data exists in local storage and crypto is marked as initialised " +
" but no data found in crypto store. " +
"IndexedDB storage has likely been evicted by the browser!", "IndexedDB storage has likely been evicted by the browser!",
); );
track("Crypto store evicted"); track("Crypto store evicted");
@ -104,6 +109,7 @@ export async function checkConsistency() {
return { return {
dataInLocalStorage, dataInLocalStorage,
dataInCryptoStore, dataInCryptoStore,
cryptoInited,
healthy, healthy,
}; };
} }
@ -155,3 +161,17 @@ export function trackStores(client) {
}); });
} }
} }
/**
* Sets whether crypto has ever been successfully
* initialised on this client.
* StorageManager uses this to determine whether indexeddb
* has been wiped by the browser: this flag is saved to localStorage
* and if it is true and not crypto data is found, an error is
* presented to the user.
*
* @param {bool} cryptoInited True if crypto has been set up
*/
export function setCryptoInitialised(cryptoInited) {
localStorage.setItem("mx_crypto_initialised", cryptoInited);
}