diff --git a/lib/tunnelbroker/use-peer-to-peer-message-handler.js b/lib/tunnelbroker/use-peer-to-peer-message-handler.js --- a/lib/tunnelbroker/use-peer-to-peer-message-handler.js +++ b/lib/tunnelbroker/use-peer-to-peer-message-handler.js @@ -10,6 +10,7 @@ import { removePeerUsersActionType } from '../actions/aux-user-actions.js'; import { invalidateTunnelbrokerDeviceTokenActionType } from '../actions/tunnelbroker-actions.js'; import { logOutActionTypes, useBaseLogOut } from '../actions/user-actions.js'; +import { useUserDataRestore } from '../backup/use-user-data-restore.js'; import { logTypes, type OlmDebugLog, @@ -58,6 +59,7 @@ import { getClientMessageIDFromTunnelbrokerMessageID } from '../utils/peer-to-peer-communication-utils.js'; import { useDispatchActionPromise } from '../utils/redux-promise-utils.js'; import { useDispatch, useSelector } from '../utils/redux-utils.js'; +import { fullBackupSupport } from '../utils/services-utils.js'; // When logout is requested by primary device, logging out of Identity Service // is already handled by the primary device @@ -94,6 +96,9 @@ const runDeviceListUpdate = useDeviceListUpdate(); const processDMOperation = useProcessDMOperation(); + const userDataRestore = useUserDataRestore(); + const restoreBackupState = useSelector(state => state.restoreBackupState); + const username = useSelector(state => state.currentUserInfo?.username); return React.useCallback( async ( @@ -170,6 +175,44 @@ }); await sqliteAPI.removeInboundP2PMessages([messageID]); } + } else if ( + userActionMessage.type === userActionsP2PMessageTypes.BACKUP_DATA + ) { + if (!fullBackupSupport) { + console.warn( + 'Received backup data but this device is not supporting UserData backup', + ); + return; + } + + if (restoreBackupState.status !== 'no_backup') { + console.warn( + 'Received backup data but backup action was already dispatched', + ); + await sqliteAPI.removeInboundP2PMessages([messageID]); + return; + } + + const { userID, backupData } = userActionMessage; + const { userID: currentUserID, accessToken } = await getAuthMetadata(); + + if (userID !== currentUserID) { + console.warn('Received backup data from wrong user'); + await sqliteAPI.removeInboundP2PMessages([messageID]); + return; + } + + if (!username || !accessToken) { + return; + } + + await userDataRestore(backupData, { + userID, + accessToken, + username, + }); + + await sqliteAPI.removeInboundP2PMessages([messageID]); } else { console.warn( 'Unsupported P2P user action message:', @@ -184,7 +227,10 @@ primaryDeviceRequestedLogOut, processDMOperation, reBroadcastAccountDeletion, + restoreBackupState.status, runDeviceListUpdate, + userDataRestore, + username, ], ); }