diff --git a/native/backup/constants.js b/native/backup/constants.js new file mode 100644 --- /dev/null +++ b/native/backup/constants.js @@ -0,0 +1,3 @@ +// @flow + +export const BACKUP_ID_LENGTH = 32; //256 bits diff --git a/native/backup/use-client-backup.js b/native/backup/use-client-backup.js new file mode 100644 --- /dev/null +++ b/native/backup/use-client-backup.js @@ -0,0 +1,69 @@ +// @flow + +import * as React from 'react'; +import { useSelector } from 'react-redux'; + +import { uintArrayToHexString } from 'lib/media/data-utils.js'; +import { isLoggedIn } from 'lib/selectors/user-selectors.js'; +import type { BackupAuth, UserData, UserKeys } from 'lib/types/backup-types.js'; + +import { uploadBackup } from './api.js'; +import { BACKUP_ID_LENGTH } from './constants.js'; +import { encryptBackup } from './encryption.js'; +import { commCoreModule } from '../native-modules.js'; +import { generateKey } from '../utils/aes-crypto-module.js'; + +type ClientBackup = { + +uploadBackupProtocol: (userData: UserData) => Promise, +}; + +function useClientBackup(): ClientBackup { + const accessToken = useSelector(state => state.commServicesAccessToken); + const currentUserID = useSelector( + state => state.currentUserInfo && state.currentUserInfo.id, + ); + const loggedIn = useSelector(isLoggedIn); + + const uploadBackupProtocol = React.useCallback( + async (userData: UserData) => { + if (!loggedIn || !currentUserID) { + throw new Error('Attempt to upload backup for not logged in user.'); + } + console.info('Start uploading backup...'); + + const backupDataKey = generateKey(); + await commCoreModule.initializeCryptoAccount(); + const { + primaryIdentityPublicKeys: { ed25519 }, + } = await commCoreModule.getUserPublicKey(); + const userKeys: UserKeys = { + backupDataKey: uintArrayToHexString(backupDataKey), + ed25519, + }; + + const backupID = await commCoreModule.generateRandomString( + BACKUP_ID_LENGTH, + ); + + const encryptedBackup = await encryptBackup({ + backupID, + userKeys, + userData, + }); + + const backupAuth: BackupAuth = { + userID: currentUserID, + accessToken: accessToken ? accessToken : '', + deviceID: ed25519, + }; + + await uploadBackup(encryptedBackup, backupAuth); + console.info('Backup uploaded.'); + }, + [accessToken, currentUserID, loggedIn], + ); + + return { uploadBackupProtocol }; +} + +export { useClientBackup };