diff --git a/native/cpp/CommonCpp/DatabaseManagers/DatabaseManager.h b/native/cpp/CommonCpp/DatabaseManagers/DatabaseManager.h --- a/native/cpp/CommonCpp/DatabaseManagers/DatabaseManager.h +++ b/native/cpp/CommonCpp/DatabaseManagers/DatabaseManager.h @@ -63,11 +63,15 @@ static void setUserDataKeys( const std::string &backupDataKey, const std::string &backupLogDataKey); + static void setBackupLogDataKey(const std::string &backupLogDataKey); // Backup methods static void captureBackupLogs(); static void triggerBackupFileUpload(); - static void createMainCompaction(std::string backupID); + static void createMainCompaction( + std::string backupID, + std::string mainCompactionEncryptionKey, + std::string newLogEncryptionKey); static void restoreFromMainCompaction( std::string mainCompactionPath, std::string mainCompactionEncryptionKey, diff --git a/native/cpp/CommonCpp/DatabaseManagers/DatabaseManager.cpp b/native/cpp/CommonCpp/DatabaseManagers/DatabaseManager.cpp --- a/native/cpp/CommonCpp/DatabaseManagers/DatabaseManager.cpp +++ b/native/cpp/CommonCpp/DatabaseManagers/DatabaseManager.cpp @@ -251,6 +251,27 @@ backupDataKey, backupLogDataKey); } +void DatabaseManager::setBackupLogDataKey(const std::string &backupLogDataKey) { + const auto &connectionManager = DatabaseManager::mainConnectionManager; + + const std::string existingBackupDataKey = + connectionManager->getBackupDataKey(); + + if (existingBackupDataKey.empty()) { + throw std::runtime_error("existing backupDataKey is not set"); + } + if (connectionManager->getBackupLogDataKey().empty()) { + throw std::runtime_error("existing backupLogDataKey is not set"); + } + + if (backupLogDataKey.size() != SQLiteBackup::backupLogDataKeySize) { + throw std::runtime_error("invalid backupLogDataKey size"); + } + + CommSecureStore::set(CommSecureStore::backupLogDataKey, backupLogDataKey); + connectionManager->setNewKeys(existingBackupDataKey, backupLogDataKey); +} + void DatabaseManager::captureBackupLogs() { if (!ServicesUtils::fullBackupSupport) { return; @@ -283,7 +304,10 @@ ::triggerBackupFileUpload(); } -void DatabaseManager::createMainCompaction(std::string backupID) { +void DatabaseManager::createMainCompaction( + std::string backupID, + std::string mainCompactionEncryptionKey, + std::string newLogEncryptionKey) { std::string finalBackupPath = PlatformSpecificTools::getBackupFilePath(backupID, false); std::string finalAttachmentsPath = @@ -315,8 +339,7 @@ sqlite3 *backupDB; sqlite3_open(tempBackupPath.c_str(), &backupDB); - SQLiteUtils::setEncryptionKey( - backupDB, DatabaseManager::mainConnectionManager->getBackupDataKey()); + SQLiteUtils::setEncryptionKey(backupDB, mainCompactionEncryptionKey); DatabaseManager::mainConnectionManager->initializeConnection(); sqlite3_backup *backupObj = sqlite3_backup_init( @@ -389,6 +412,7 @@ DatabaseManager::getQueryExecutor().setMetadata("backupID", backupID); DatabaseManager::getQueryExecutor().clearMetadata("logID"); if (ServicesUtils::fullBackupSupport) { + DatabaseManager::setBackupLogDataKey(newLogEncryptionKey); DatabaseManager::mainConnectionManager->setLogsMonitoring(true); } } diff --git a/native/cpp/CommonCpp/NativeModules/PersistentStorageUtilities/BackupOperationsUtilities/BackupOperationsExecutor.h b/native/cpp/CommonCpp/NativeModules/PersistentStorageUtilities/BackupOperationsUtilities/BackupOperationsExecutor.h --- a/native/cpp/CommonCpp/NativeModules/PersistentStorageUtilities/BackupOperationsUtilities/BackupOperationsExecutor.h +++ b/native/cpp/CommonCpp/NativeModules/PersistentStorageUtilities/BackupOperationsUtilities/BackupOperationsExecutor.h @@ -6,7 +6,11 @@ namespace comm { class BackupOperationsExecutor { public: - static void createMainCompaction(std::string backupID, size_t futureID); + static void createMainCompaction( + std::string backupID, + std::string mainCompactionEncryptionKey, + std::string newLogEncryptionKey, + size_t futureID); static void restoreFromMainCompaction( std::string mainCompactionPath, std::string mainCompactionEncryptionKey, diff --git a/native/cpp/CommonCpp/NativeModules/PersistentStorageUtilities/BackupOperationsUtilities/BackupOperationsExecutor.cpp b/native/cpp/CommonCpp/NativeModules/PersistentStorageUtilities/BackupOperationsUtilities/BackupOperationsExecutor.cpp --- a/native/cpp/CommonCpp/NativeModules/PersistentStorageUtilities/BackupOperationsUtilities/BackupOperationsExecutor.cpp +++ b/native/cpp/CommonCpp/NativeModules/PersistentStorageUtilities/BackupOperationsUtilities/BackupOperationsExecutor.cpp @@ -10,10 +10,13 @@ namespace comm { void BackupOperationsExecutor::createMainCompaction( std::string backupID, + std::string mainCompactionEncryptionKey, + std::string newLogEncryptionKey, size_t futureID) { - taskType job = [backupID, futureID]() { + taskType job = [=]() { try { - DatabaseManager::createMainCompaction(backupID); + DatabaseManager::createMainCompaction( + backupID, mainCompactionEncryptionKey, newLogEncryptionKey); ::resolveUnitFuture(futureID); } catch (const std::exception &e) { ::rejectFuture(futureID, rust::String(e.what())); diff --git a/native/native_rust_library/RustBackupExecutor.h b/native/native_rust_library/RustBackupExecutor.h --- a/native/native_rust_library/RustBackupExecutor.h +++ b/native/native_rust_library/RustBackupExecutor.h @@ -10,7 +10,11 @@ getBackupLogFilePath(rust::Str backupID, rust::Str logID, bool isAttachments); rust::String getBackupUserKeysFilePath(rust::Str backupID); rust::String getSIWEBackupMessagePath(rust::Str backupID); -void createMainCompaction(rust::Str backupID, size_t futureID); +void createMainCompaction( + rust::Str backupID, + rust::Str mainCompactionEncryptionKey, + rust::Str newLogEncryptionKey, + size_t futureID); void restoreFromMainCompaction( rust::Str mainCompactionPath, rust::Str mainCompactionEncryptionKey, diff --git a/native/native_rust_library/RustBackupExecutor.cpp b/native/native_rust_library/RustBackupExecutor.cpp --- a/native/native_rust_library/RustBackupExecutor.cpp +++ b/native/native_rust_library/RustBackupExecutor.cpp @@ -31,9 +31,16 @@ PlatformSpecificTools::getSIWEBackupMessagePath(std::string(backupID))); } -void createMainCompaction(rust::Str backupID, size_t futureID) { +void createMainCompaction( + rust::Str backupID, + rust::Str mainCompactionEncryptionKey, + rust::Str newLogEncryptionKey, + size_t futureID) { BackupOperationsExecutor::createMainCompaction( - std::string(backupID), futureID); + std::string(backupID), + std::string(mainCompactionEncryptionKey), + std::string(newLogEncryptionKey), + futureID); } void setBackupID(rust::Str backupID, size_t futureID) { 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 @@ -95,7 +95,7 @@ pickle_key, pickled_account, siwe_backup_msg.clone(), - false, + true, ) .await else { @@ -103,7 +103,12 @@ }; let (future_id, future) = future_manager::new_future::<()>().await; - create_main_compaction(&backup_id, future_id); + create_main_compaction( + &backup_id, + &backup_data_key, + &backup_log_data_key, + future_id, + ); if let Err(err) = future.await { handle_backup_creation_error(backup_id.clone(), err.to_string()); return; 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 @@ -514,7 +514,12 @@ fn get_siwe_backup_message_path(backup_id: &str) -> Result; #[cxx_name = "createMainCompaction"] - fn create_main_compaction(backup_id: &str, future_id: usize); + fn create_main_compaction( + backup_id: &str, + main_compaction_encryption_key: &str, + new_log_encryption_key: &str, + future_id: usize, + ); #[cxx_name = "restoreFromMainCompaction"] fn restore_from_main_compaction(