diff --git a/lib/components/secondary-device-qr-auth-context-provider.react.js b/lib/components/secondary-device-qr-auth-context-provider.react.js --- a/lib/components/secondary-device-qr-auth-context-provider.react.js +++ b/lib/components/secondary-device-qr-auth-context-provider.react.js @@ -28,6 +28,11 @@ import { getContentSigningKey } from '../utils/crypto-utils.js'; import { getMessageForException } from '../utils/errors.js'; import { useSelector } from '../utils/redux-utils.js'; +import { + waitUntilDatabaseDeleted, + databaseResetStatus, + getDatabaseResetStatus, +} from '../utils/wait-until-db-deleted.js'; type Props = { +children: React.Node, @@ -88,6 +93,10 @@ const identityClient = identityContext?.identityClient; const openSecondaryQRAuth = React.useCallback(async () => { + if (getDatabaseResetStatus() !== databaseResetStatus.ready) { + await waitUntilDatabaseDeleted(); + } + const [ed25519, rawAESKey] = await Promise.all([ getContentSigningKey(), generateAESKey(), diff --git a/lib/utils/wait-until-db-deleted.js b/lib/utils/wait-until-db-deleted.js --- a/lib/utils/wait-until-db-deleted.js +++ b/lib/utils/wait-until-db-deleted.js @@ -1,6 +1,22 @@ // @flow +const databaseResetStatus = Object.freeze({ + resetInProgress: 'RESET_IN_PROGRESS', + ready: 'READY', +}); + +export type DatabaseResetStatus = 'RESET_IN_PROGRESS' | 'READY'; + let waitingOnDatabaseDeletion = []; +let currentDatabaseStatus: DatabaseResetStatus = 'READY'; + +function setDatabaseResetStatus(newStatus: DatabaseResetStatus) { + currentDatabaseStatus = newStatus; +} + +function getDatabaseResetStatus(): DatabaseResetStatus { + return currentDatabaseStatus; +} function waitUntilDatabaseDeleted(): Promise { return new Promise(resolve => { @@ -17,4 +33,10 @@ } } -export { waitUntilDatabaseDeleted, reportDatabaseDeleted }; +export { + databaseResetStatus, + setDatabaseResetStatus, + getDatabaseResetStatus, + waitUntilDatabaseDeleted, + reportDatabaseDeleted, +}; diff --git a/native/data/sqlite-data-handler.js b/native/data/sqlite-data-handler.js --- a/native/data/sqlite-data-handler.js +++ b/native/data/sqlite-data-handler.js @@ -30,7 +30,11 @@ import { useDispatchActionPromise } from 'lib/utils/redux-promise-utils.js'; import { useDispatch } from 'lib/utils/redux-utils.js'; import { supportingMultipleKeyservers } from 'lib/utils/services-utils.js'; -import { reportDatabaseDeleted } from 'lib/utils/wait-until-db-deleted.js'; +import { + reportDatabaseDeleted, + databaseResetStatus, + setDatabaseResetStatus, +} from 'lib/utils/wait-until-db-deleted.js'; import { resolveKeyserverSessionInvalidationUsingNativeCredentials } from '../account/legacy-recover-keyserver-session.js'; import { authoritativeKeyserverID } from '../authoritative-keyserver.js'; @@ -44,7 +48,9 @@ async function clearSensitiveData() { try { + setDatabaseResetStatus(databaseResetStatus.resetInProgress); await commCoreModule.clearSensitiveData(); + setDatabaseResetStatus(databaseResetStatus.ready); reportDatabaseDeleted(); } catch (error) { console.log( diff --git a/web/shared-worker/sqlite-data-handler.js b/web/shared-worker/sqlite-data-handler.js --- a/web/shared-worker/sqlite-data-handler.js +++ b/web/shared-worker/sqlite-data-handler.js @@ -5,7 +5,11 @@ import { shouldClearData } from 'lib/shared/data-utils.js'; import { getMessageForException } from 'lib/utils/errors.js'; import { useDispatch } from 'lib/utils/redux-utils.js'; -import { reportDatabaseDeleted } from 'lib/utils/wait-until-db-deleted.js'; +import { + reportDatabaseDeleted, + databaseResetStatus, + setDatabaseResetStatus, +} from 'lib/utils/wait-until-db-deleted.js'; import { getCommSharedWorker } from './shared-worker-provider.js'; import { useSelector } from '../redux/redux-utils.js'; @@ -43,7 +47,9 @@ shouldClearData(sqliteStampedUserID, currentLoggedInUserID) ) { try { + setDatabaseResetStatus(databaseResetStatus.resetInProgress); await sharedWorker.init({ clearDatabase: true }); + setDatabaseResetStatus(databaseResetStatus.ready); reportDatabaseDeleted(); } catch (error) { console.error(