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 @@ -44,6 +44,13 @@ static void setDatabaseStatusAsWorkable(); + // Clearing the main database should recreate a new database from scratch and + // initialize `connectionManager`. + static void clearMainDatabaseSensitiveData(); + // Clearing the backup database should delete all contents and unset + // `connectionManager`. + static void clearRestoredDatabaseSensitiveData(); + public: static const DatabaseQueryExecutor &getQueryExecutor(); static const DatabaseQueryExecutor &getQueryExecutor(DatabaseIdentifier id); 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 @@ -73,11 +73,7 @@ return mainQueryExecutor; } -void DatabaseManager::clearSensitiveData() { - CommSecureStore::set(CommSecureStore::userID, ""); - CommSecureStore::set(CommSecureStore::deviceID, ""); - CommSecureStore::set(CommSecureStore::commServicesAccessToken, ""); - +void DatabaseManager::clearMainDatabaseSensitiveData() { std::string backupDataKey = DatabaseManager::generateBackupDataKey(); std::string backupLogDataKey = DatabaseManager::generateBackupLogDataKey(); @@ -88,7 +84,7 @@ if (SQLiteUtils::fileExists(sqliteFilePath) && std::remove(sqliteFilePath.c_str())) { std::ostringstream errorStream; - errorStream << "Failed to delete database file. Details: " + errorStream << "Failed to delete main database file. Details: " << strerror(errno); Logger::log(errorStream.str()); throw std::system_error(errno, std::generic_category(), errorStream.str()); @@ -99,6 +95,35 @@ DatabaseManager::getQueryExecutor().migrate(); DatabaseManager::mainConnectionManager->initializeConnection(); +} + +void DatabaseManager::clearRestoredDatabaseSensitiveData() { + if (!DatabaseManager::restoredConnectionManager) { + return; + } + DatabaseManager::restoredConnectionManager->closeConnection(); + std::string sqliteFilePath = + DatabaseManager::restoredConnectionManager->getSQLiteFilePath(); + + if (SQLiteUtils::fileExists(sqliteFilePath) && + std::remove(sqliteFilePath.c_str())) { + std::ostringstream errorStream; + errorStream << "Failed to delete restored database file. Details: " + << strerror(errno); + Logger::log(errorStream.str()); + throw std::system_error(errno, std::generic_category(), errorStream.str()); + } + + DatabaseManager::restoredConnectionManager.reset(); +} + +void DatabaseManager::clearSensitiveData() { + CommSecureStore::set(CommSecureStore::userID, ""); + CommSecureStore::set(CommSecureStore::deviceID, ""); + CommSecureStore::set(CommSecureStore::commServicesAccessToken, ""); + + DatabaseManager::clearMainDatabaseSensitiveData(); + DatabaseManager::clearRestoredDatabaseSensitiveData(); PlatformSpecificTools::removeBackupDirectory(); CommMMKV::clearSensitiveData();