From 14fee0da1ab5a60f361bc3e1eb317cebab3c222b Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Sat, 2 Sep 2023 01:37:52 +0200 Subject: Linux/macOS: preserve unknown entries in configuration file This helps to preserve unknown entries that may be used by future versions of VeraCrypt (forward compatibility) or entries used by old versions that were removed from current version (backward compatibility) --- src/Main/UserPreferences.cpp | 34 ++++++++++++++++++++++++---------- src/Main/UserPreferences.h | 4 ++++ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/Main/UserPreferences.cpp b/src/Main/UserPreferences.cpp index 9dbd35f6..b5a1f42c 100644 --- a/src/Main/UserPreferences.cpp +++ b/src/Main/UserPreferences.cpp @@ -58,6 +58,9 @@ namespace VeraCrypt void UserPreferences::Load() { + // first we clear the unknown config map entries + UnknownConfigMapEntries.clear(); + // Preferences FilePath cfgPath = Application::GetConfigFilePath (GetPreferencesFileName()); if (cfgPath.IsFile()) @@ -68,14 +71,14 @@ namespace VeraCrypt configMap[node.Attributes[L"key"]] = node.InnerText; } -#define TC_CONFIG_SET(NAME) SetValue (configMap[L###NAME], NAME) +#define TC_CONFIG_SET(NAME) if (configMap.count(L###NAME) > 0) { SetValue (configMap[L###NAME], NAME); configMap.erase (L###NAME); } TC_CONFIG_SET (BackgroundTaskEnabled); TC_CONFIG_SET (BackgroundTaskMenuDismountItemsEnabled); TC_CONFIG_SET (BackgroundTaskMenuMountItemsEnabled); TC_CONFIG_SET (BackgroundTaskMenuOpenItemsEnabled); TC_CONFIG_SET (BeepAfterHotkeyMountDismount); - SetValue (configMap[L"CachePasswords"], DefaultMountOptions.CachePassword); + if (configMap.count(L"CachePasswords") > 0) { SetValue (configMap[L"CachePasswords"], DefaultMountOptions.CachePassword); configMap.erase (L"CachePasswords"); } TC_CONFIG_SET (CloseBackgroundTaskOnNoVolumes); TC_CONFIG_SET (CloseExplorerWindowsOnDismount); TC_CONFIG_SET (CloseSecurityTokenSessionsAfterMount); @@ -87,7 +90,7 @@ namespace VeraCrypt TC_CONFIG_SET (DismountOnScreenSaver); TC_CONFIG_SET (DisplayMessageAfterHotkeyDismount); TC_CONFIG_SET (BackgroundTaskEnabled); - SetValue (configMap[L"FilesystemOptions"], DefaultMountOptions.FilesystemOptions); + if (configMap.count(L"FilesystemOptions") > 0) { SetValue (configMap[L"FilesystemOptions"], DefaultMountOptions.FilesystemOptions); configMap.erase (L"FilesystemOptions"); } TC_CONFIG_SET (ForceAutoDismount); TC_CONFIG_SET (LastSelectedSlotNumber); TC_CONFIG_SET (MaxVolumeIdleTime); @@ -95,24 +98,26 @@ namespace VeraCrypt TC_CONFIG_SET (MountFavoritesOnLogon); bool readOnly = false; - SetValue (configMap[L"MountVolumesReadOnly"], readOnly); + if (configMap.count(L"MountVolumesReadOnly") > 0) { SetValue (configMap[L"MountVolumesReadOnly"], readOnly); configMap.erase (L"MountVolumesReadOnly"); } DefaultMountOptions.Protection = readOnly ? VolumeProtection::ReadOnly : VolumeProtection::None; - SetValue (configMap[L"MountVolumesRemovable"], DefaultMountOptions.Removable); - SetValue (configMap[L"NoHardwareCrypto"], DefaultMountOptions.NoHardwareCrypto); - SetValue (configMap[L"NoKernelCrypto"], DefaultMountOptions.NoKernelCrypto); + if (configMap.count(L"MountVolumesRemovable") > 0) { SetValue (configMap[L"MountVolumesRemovable"], DefaultMountOptions.Removable); configMap.erase (L"MountVolumesRemovable"); } + if (configMap.count(L"NoHardwareCrypto") > 0) { SetValue (configMap[L"NoHardwareCrypto"], DefaultMountOptions.NoHardwareCrypto); configMap.erase (L"NoHardwareCrypto"); } + if (configMap.count(L"NoKernelCrypto") > 0) { SetValue (configMap[L"NoKernelCrypto"], DefaultMountOptions.NoKernelCrypto); configMap.erase (L"NoKernelCrypto"); } TC_CONFIG_SET (OpenExplorerWindowAfterMount); - SetValue (configMap[L"PreserveTimestamps"], DefaultMountOptions.PreserveTimestamps); + if (configMap.count(L"PreserveTimestamps") > 0) { SetValue (configMap[L"PreserveTimestamps"], DefaultMountOptions.PreserveTimestamps); configMap.erase (L"PreserveTimestamps"); } TC_CONFIG_SET (SaveHistory); - SetValue (configMap[L"SecurityTokenLibrary"], SecurityTokenModule); + if (configMap.count(L"SecurityTokenLibrary") > 0) { SetValue (configMap[L"SecurityTokenLibrary"], SecurityTokenModule); configMap.erase (L"SecurityTokenLibrary"); } TC_CONFIG_SET (StartOnLogon); TC_CONFIG_SET (UseKeyfiles); TC_CONFIG_SET (WipeCacheOnAutoDismount); TC_CONFIG_SET (WipeCacheOnClose); wstring defaultPrf; - SetValue (configMap[L"DefaultPRF"], defaultPrf); + if (configMap.count(L"DefaultPRF") > 0) { SetValue (configMap[L"DefaultPRF"], defaultPrf); configMap.erase (L"DefaultPRF"); } + if (defaultPrf.empty()) + defaultPrf = L"autodetection"; shared_ptr savedKdf; try { @@ -125,6 +130,9 @@ namespace VeraCrypt DefaultMountOptions.Kdf = savedKdf; DefaultMountOptions.ProtectionKdf = savedKdf; + + // at this point, the configMap should be empty, if not, we have unknown config entries that we need to store + UnknownConfigMapEntries = configMap; } // Default keyfiles @@ -228,6 +236,12 @@ namespace VeraCrypt defaultPrf = DefaultMountOptions.Kdf->GetName (); formatter.AddEntry (L"DefaultPRF", defaultPrf); + // add unknown config entries by iterating over all elements of the UnknownConfigMapEntries map + for (map::const_iterator it = UnknownConfigMapEntries.begin(); it != UnknownConfigMapEntries.end(); ++it) + { + formatter.AddEntry(it->first.c_str(), it->second); + } + XmlWriter writer (Application::GetConfigFilePath (GetPreferencesFileName(), true)); writer.WriteNode (formatter.XmlConfig); writer.Close(); diff --git a/src/Main/UserPreferences.h b/src/Main/UserPreferences.h index 6d53fb5f..3f60b533 100644 --- a/src/Main/UserPreferences.h +++ b/src/Main/UserPreferences.h @@ -96,6 +96,10 @@ namespace VeraCrypt bool WipeCacheOnAutoDismount; bool WipeCacheOnClose; + // A map used to store unknown entries from the configuration file in order to preserve them when saving the configuration. + // This helps to preserve unknown entries that may be used by future versions of VeraCrypt or entries used by old versions that were removed from current version. + map UnknownConfigMapEntries; + protected: wxString GetDefaultKeyfilesFileName () const { return L"Default Keyfiles.xml"; } #ifdef TC_PROTOTYPE -- cgit v1.2.3