diff --git a/lib/types/sqlite-types.js b/lib/types/sqlite-types.js --- a/lib/types/sqlite-types.js +++ b/lib/types/sqlite-types.js @@ -1,7 +1,9 @@ // @flow +import type { IdentityAuthResult } from './identity-service-types.js'; import type { ClientDBMessageInfo } from './message-types.js'; import type { StoreOperations } from './store-ops-types.js'; +import type { QRAuthBackupData } from './tunnelbroker/qr-code-auth-message-types.js'; import type { ClientDBDMOperation } from '../ops/dm-operations-store-ops.js'; export const outboundP2PMessageStatuses = Object.freeze({ @@ -86,4 +88,10 @@ operations: StoreOperations, userID?: ?string, ) => Promise<void>, + + // backup + +restoreUserData: ( + qrAuthBackupData: QRAuthBackupData, + identityAuthResult: IdentityAuthResult, + ) => Promise<void>, }; diff --git a/lib/utils/__mocks__/config.js b/lib/utils/__mocks__/config.js --- a/lib/utils/__mocks__/config.js +++ b/lib/utils/__mocks__/config.js @@ -47,6 +47,7 @@ searchMessages: jest.fn(), fetchMessages: jest.fn(), fetchDMOperationsByType: jest.fn(), + restoreUserData: jest.fn(), }, encryptedNotifUtilsAPI: { generateAESKey: jest.fn(), diff --git a/native/database/sqlite-api.js b/native/database/sqlite-api.js --- a/native/database/sqlite-api.js +++ b/native/database/sqlite-api.js @@ -4,9 +4,11 @@ import { convertStoreOperationsToClientDBStoreOperations } from 'lib/shared/redux/client-db-utils.js'; import type { SQLiteAPI } from 'lib/types/sqlite-types.js'; import type { StoreOperations } from 'lib/types/store-ops-types'; +import type { QRAuthBackupData } from 'lib/types/tunnelbroker/qr-code-auth-message-types.js'; import { values } from 'lib/utils/objects.js'; import { commCoreModule } from '../native-modules.js'; +import { storeVersion } from '../redux/persist-constants.js'; import { isTaskCancelledError } from '../utils/error-handling.js'; const sqliteAPI: SQLiteAPI = { @@ -61,6 +63,17 @@ commCoreModule.terminate(); } }, + + //backup + async restoreUserData(qrAuthBackupData: QRAuthBackupData): Promise<void> { + const { backupID, backupDataKey, backupLogDataKey } = qrAuthBackupData; + return commCoreModule.restoreBackupData( + backupID, + backupDataKey, + backupLogDataKey, + storeVersion.toString(), + ); + }, }; export { sqliteAPI }; diff --git a/web/database/sqlite-api.js b/web/database/sqlite-api.js --- a/web/database/sqlite-api.js +++ b/web/database/sqlite-api.js @@ -2,6 +2,7 @@ import type { ClientDBDMOperation } from 'lib/ops/dm-operations-store-ops.js'; import { convertStoreOperationsToClientDBStoreOperations } from 'lib/shared/redux/client-db-utils.js'; +import type { IdentityAuthResult } from 'lib/types/identity-service-types.js'; import type { ClientDBMessageInfo } from 'lib/types/message-types.js'; import type { SQLiteAPI, @@ -9,6 +10,8 @@ OutboundP2PMessage, } from 'lib/types/sqlite-types.js'; import type { StoreOperations } from 'lib/types/store-ops-types.js'; +import type { QRAuthBackupData } from 'lib/types/tunnelbroker/qr-code-auth-message-types.js'; +import { getContentSigningKey } from 'lib/utils/crypto-utils.js'; import { entries, values } from 'lib/utils/objects.js'; import { getCommSharedWorker } from '../shared-worker/shared-worker-provider.js'; @@ -210,6 +213,30 @@ } } }, + + //backup + async restoreUserData( + qrAuthBackupData: QRAuthBackupData, + identityAuthResult: IdentityAuthResult, + ): Promise<void> { + const { backupID, backupDataKey, backupLogDataKey } = qrAuthBackupData; + const { userID, accessToken } = identityAuthResult; + const [deviceID, sharedWorker] = await Promise.all([ + getContentSigningKey(), + getCommSharedWorker(), + ]); + await sharedWorker.schedule({ + type: workerRequestMessageTypes.BACKUP_RESTORE, + authMetadata: { + deviceID, + userID, + accessToken, + }, + backupID, + backupDataKey, + backupLogDataKey, + }); + }, }; export { sqliteAPI };