diff --git a/native/native_rust_library/src/backup.rs b/native/native_rust_library/src/backup.rs --- a/native/native_rust_library/src/backup.rs +++ b/native/native_rust_library/src/backup.rs @@ -284,12 +284,12 @@ } } -pub async fn create_user_keys_compaction( +pub async fn get_encrypted_user_keys( backup_id: String, backup_secret: String, pickle_key: String, pickled_account: String, -) -> Result<(), Box> { +) -> Result, Box> { let mut backup_key = compute_backup_key(backup_secret.as_bytes(), backup_id.as_bytes())?; @@ -305,7 +305,22 @@ pickle_key, pickled_account, }; - let encrypted_user_keys = user_keys.encrypt(&mut backup_key)?; + user_keys.encrypt(&mut backup_key) +} + +pub async fn create_user_keys_compaction( + backup_id: String, + backup_secret: String, + pickle_key: String, + pickled_account: String, +) -> Result<(), Box> { + let encrypted_user_keys = get_encrypted_user_keys( + backup_id.clone(), + backup_secret, + pickle_key, + pickled_account, + ) + .await?; let user_keys_file = get_backup_user_keys_file_path(&backup_id)?; tokio::fs::write(user_keys_file, encrypted_user_keys).await?; @@ -313,6 +328,27 @@ Ok(()) } +pub async fn create_ephemeral_user_keys_compaction( + backup_id: String, + backup_secret: String, + pickle_key: String, + pickled_account: String, +) -> Result, Box> { + let encrypted_user_keys = get_encrypted_user_keys( + backup_id.clone(), + backup_secret, + pickle_key, + pickled_account, + ) + .await?; + + let (future_id, future) = future_manager::new_future::<()>().await; + set_backup_id(&backup_id, future_id); + future.await?; + + Ok(encrypted_user_keys) +} + pub async fn create_siwe_backup_msg_compaction( backup_id: &str, siwe_backup_msg: String, diff --git a/native/native_rust_library/src/identity/login.rs b/native/native_rust_library/src/identity/login.rs --- a/native/native_rust_library/src/identity/login.rs +++ b/native/native_rust_library/src/identity/login.rs @@ -13,8 +13,9 @@ IdentityAuthResult, LogInPasswordUserInfo, LogInWalletUserInfo, RestoreUserInfo, PLATFORM_METADATA, }; +use crate::backup::create_ephemeral_user_keys_compaction; use crate::utils::jsi_callbacks::handle_string_result_as_callback; -use crate::{Error, DEVICE_TYPE, IDENTITY_SOCKET_ADDR, RUNTIME}; +use crate::{Error, StringError, DEVICE_TYPE, IDENTITY_SOCKET_ADDR, RUNTIME}; #[allow(clippy::too_many_arguments)] pub mod ffi { @@ -276,18 +277,32 @@ } async fn restore_user_helper( - wallet_user_info: RestoreUserInfo, + user_info: RestoreUserInfo, ) -> Result { + let user_keys = create_ephemeral_user_keys_compaction( + user_info.backup_id.clone(), + user_info.backup_secret, + user_info.pickle_key, + user_info.pickled_account, + ) + .await + .map_err(|err| Error::Generic(StringError(err.to_string())))?; + + let siwe_backup_msg = if user_info.siwe_backup_msg.is_empty() { + None + } else { + Some(user_info.siwe_backup_msg) + }; + let restore_request = RestoreUserRequest { - user_id: wallet_user_info.user_id, - siwe_message: wallet_user_info.siwe_social_proof_message, - siwe_signature: wallet_user_info.siwe_social_proof_signature, - device_list: wallet_user_info.device_list, - device_key_upload: Some(wallet_user_info.device_keys.into()), - // TODO: Replace empty defaults with actual values - new_backup_id: "".to_string(), - encrypted_user_keys: Vec::::new(), - siwe_backup_msg: None, + user_id: user_info.user_id, + siwe_message: user_info.siwe_social_proof_message, + siwe_signature: user_info.siwe_social_proof_signature, + device_list: user_info.device_list, + device_key_upload: Some(user_info.device_keys.into()), + new_backup_id: user_info.backup_id, + encrypted_user_keys: user_keys, + siwe_backup_msg, }; let mut identity_client = diff --git a/native/native_rust_library/src/lib.rs b/native/native_rust_library/src/lib.rs --- a/native/native_rust_library/src/lib.rs +++ b/native/native_rust_library/src/lib.rs @@ -1,6 +1,7 @@ use comm_opaque2::grpc::opaque_error_to_grpc_status as handle_error; use grpc_clients::identity::protos::unauth::DeviceType; use lazy_static::lazy_static; +use std::error::Error as StdError; use std::sync::Arc; use tokio::runtime::{Builder, Runtime}; use tonic::Status; @@ -540,6 +541,11 @@ } } +#[derive(Debug, derive_more::Display)] +pub struct StringError(String); + +impl StdError for StringError {} + #[derive( Debug, derive_more::Display, derive_more::From, derive_more::Error, )] @@ -552,6 +558,8 @@ MissingResponseData, #[display(fmt = "{}", "_0")] GRPClient(grpc_clients::error::Error), + #[display(fmt = "Generic error: {}", "_0")] + Generic(StringError), } #[cfg(test)]