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 @@ -464,7 +464,8 @@ void DatabaseManager::copyContentFromBackupDatabase() { DatabaseManager::getQueryExecutor().copyContentFromDatabase( - DatabaseManager::restoredConnectionManager->getSQLiteFilePath()); + DatabaseManager::restoredConnectionManager->getSQLiteFilePath(), + DatabaseManager::restoredConnectionManager->getBackupDataKey()); } } // namespace comm diff --git a/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h b/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h --- a/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h +++ b/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h @@ -147,8 +147,9 @@ virtual std::string getMetadata(std::string entryName) const = 0; virtual void restoreFromBackupLog(const std::vector &backupLog) const = 0; - virtual void - copyContentFromDatabase(const std::string databasePath) const = 0; + virtual void copyContentFromDatabase( + const std::string databasePath, + std::optional encryptionKey) const = 0; virtual void addOutboundP2PMessages( const std::vector &messages) const = 0; virtual std::vector diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h --- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h +++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h @@ -144,7 +144,9 @@ std::string getMetadata(std::string entryName) const override; void restoreFromBackupLog( const std::vector &backupLog) const override; - void copyContentFromDatabase(const std::string databasePath) const override; + void copyContentFromDatabase( + const std::string databasePath, + std::optional encryptionKey) const override; void addOutboundP2PMessages( const std::vector &messages) const override; std::vector getOutboundP2PMessagesByID( diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp --- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp +++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp @@ -1512,7 +1512,8 @@ } void SQLiteQueryExecutor::copyContentFromDatabase( - const std::string sourceDatabasePath) const { + const std::string sourceDatabasePath, + std::optional encryptionKey) const { std::vector tableNames( SQLiteBackup::tablesAllowlist.begin(), SQLiteBackup::tablesAllowlist.end()); @@ -1525,8 +1526,14 @@ throw std::runtime_error(errorMessage.str()); } + std::string keyString = "KEY ''"; + if (encryptionKey.has_value()) { + keyString = "KEY \"x'" + encryptionKey.value() + "'\""; + } + std::ostringstream sql; - sql << "ATTACH DATABASE '" << sourceDatabasePath << "' AS sourceDB KEY '';"; + sql << "ATTACH DATABASE '" << sourceDatabasePath << "' AS sourceDB " + << keyString << ";"; for (const auto &tableName : tableNames) { sql << "INSERT OR IGNORE INTO " << tableName << " SELECT *" << " FROM sourceDB." << tableName << ";" << std::endl; diff --git a/web/shared-worker/_generated/comm_query_executor.wasm b/web/shared-worker/_generated/comm_query_executor.wasm index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@ d.key === draftKey); expect(draft).toBeUndefined(); - mainQueryExecutor.copyContentFromDatabase(BACKUP_FILE_PATH); + mainQueryExecutor.copyContentFromDatabase(BACKUP_FILE_PATH, null); // present in backup draft = backupQueryExecutor.getAllDrafts().find(d => d.key === draftKey); expect(draft?.text).toBe(draftContent); @@ -104,7 +104,7 @@ mainQueryExecutor.updateDraft(draftKey, mainDraftContent); backupQueryExecutor.updateDraft(draftKey, backupDraftContent); - mainQueryExecutor.copyContentFromDatabase(BACKUP_FILE_PATH); + mainQueryExecutor.copyContentFromDatabase(BACKUP_FILE_PATH, null); const mainDraft = mainQueryExecutor .getAllDrafts() diff --git a/web/shared-worker/types/sqlite-query-executor.js b/web/shared-worker/types/sqlite-query-executor.js --- a/web/shared-worker/types/sqlite-query-executor.js +++ b/web/shared-worker/types/sqlite-query-executor.js @@ -178,7 +178,7 @@ restoreFromBackupLog(backupLog: Uint8Array): void; - copyContentFromDatabase(databasePath: string): void; + copyContentFromDatabase(databasePath: string, encryptionKey: ?string): void; addOutboundP2PMessages(messages: $ReadOnlyArray): void; removeOutboundP2PMessage(confirmedMessageID: string, deviceID: string): void; diff --git a/web/shared-worker/worker/shared-worker.js b/web/shared-worker/worker/shared-worker.js --- a/web/shared-worker/worker/shared-worker.js +++ b/web/shared-worker/worker/shared-worker.js @@ -529,7 +529,10 @@ } else if ( message.type === workerRequestMessageTypes.COPY_CONTENT_FROM_BACKUP_DB ) { - sqliteQueryExecutor.copyContentFromDatabase(SQLITE_RESTORE_DATABASE_PATH); + sqliteQueryExecutor.copyContentFromDatabase( + SQLITE_RESTORE_DATABASE_PATH, + null, + ); } persistNeeded = true;