diff --git a/mRemoteNGTests/Config/Serializers/XmlConnectionsDeserializerTests.cs b/mRemoteNGTests/Config/Serializers/XmlConnectionsDeserializerTests.cs index 68e29239f..38527fe13 100644 --- a/mRemoteNGTests/Config/Serializers/XmlConnectionsDeserializerTests.cs +++ b/mRemoteNGTests/Config/Serializers/XmlConnectionsDeserializerTests.cs @@ -1,8 +1,10 @@ -using System.Collections.Generic; +using System.Collections; +using System.Collections.Generic; using System.Linq; using mRemoteNG.Config.Serializers; using mRemoteNG.Connection; using mRemoteNG.Container; +using mRemoteNG.Security; using mRemoteNG.Tree; using mRemoteNGTests.Properties; using NUnit.Framework; @@ -14,10 +16,12 @@ namespace mRemoteNGTests.Config.Serializers private XmlConnectionsDeserializer _xmlConnectionsDeserializer; private ConnectionTreeModel _connectionTreeModel; - [SetUp] - public void Setup() + public void Setup(string confCons, string password) { - _xmlConnectionsDeserializer = new XmlConnectionsDeserializer(Resources.TestConfCons); + _xmlConnectionsDeserializer = new XmlConnectionsDeserializer(confCons) + { + AuthenticationRequestor = password.ConvertToSecureString + }; _connectionTreeModel = _xmlConnectionsDeserializer.Deserialize(); } @@ -28,56 +32,63 @@ namespace mRemoteNGTests.Config.Serializers _connectionTreeModel = null; } - [Test] - public void DeserializingCreatesRootNode() + [TestCaseSource(typeof(XmlConnectionsDeserializerFixtureData), nameof(XmlConnectionsDeserializerFixtureData.FixtureParams))] + public void DeserializingCreatesRootNode(Datagram testData) { + Setup(testData.ConfCons, testData.Password); Assert.That(_connectionTreeModel.RootNodes, Is.Not.Empty); } - [Test] - public void RootNodeHasThreeChildren() + [TestCaseSource(typeof(XmlConnectionsDeserializerFixtureData), nameof(XmlConnectionsDeserializerFixtureData.FixtureParams))] + public void RootNodeHasThreeChildren(Datagram testData) { + Setup(testData.ConfCons, testData.Password); var connectionRoot = _connectionTreeModel.RootNodes[0]; Assert.That(connectionRoot.Children.Count, Is.EqualTo(3)); } - [Test] - public void RootContainsFolder1() + [TestCaseSource(typeof(XmlConnectionsDeserializerFixtureData), nameof(XmlConnectionsDeserializerFixtureData.FixtureParams))] + public void RootContainsFolder1(Datagram testData) { + Setup(testData.ConfCons, testData.Password); var connectionRoot = _connectionTreeModel.RootNodes[0]; Assert.That(ContainsNodeNamed("Folder1", connectionRoot.Children), Is.True); } - [Test] - public void Folder1ContainsThreeConnections() + [TestCaseSource(typeof(XmlConnectionsDeserializerFixtureData), nameof(XmlConnectionsDeserializerFixtureData.FixtureParams))] + public void Folder1ContainsThreeConnections(Datagram testData) { + Setup(testData.ConfCons, testData.Password); var connectionRoot = _connectionTreeModel.RootNodes[0]; var folder1 = GetFolderNamed("Folder1", connectionRoot.Children); var folder1ConnectionCount = folder1?.Children.Count(node => !(node is ContainerInfo)); Assert.That(folder1ConnectionCount, Is.EqualTo(3)); } - [Test] - public void Folder2ContainsThreeNodes() + [TestCaseSource(typeof(XmlConnectionsDeserializerFixtureData), nameof(XmlConnectionsDeserializerFixtureData.FixtureParams))] + public void Folder2ContainsThreeNodes(Datagram testData) { + Setup(testData.ConfCons, testData.Password); var connectionRoot = _connectionTreeModel.RootNodes[0]; var folder2 = GetFolderNamed("Folder2", connectionRoot.Children); var folder1Count = folder2?.Children.Count(); Assert.That(folder1Count, Is.EqualTo(3)); } - [Test] - public void Folder21HasTwoNodes() + [TestCaseSource(typeof(XmlConnectionsDeserializerFixtureData), nameof(XmlConnectionsDeserializerFixtureData.FixtureParams))] + public void Folder21HasTwoNodes(Datagram testData) { + Setup(testData.ConfCons, testData.Password); var connectionRoot = _connectionTreeModel.RootNodes[0]; var folder2 = GetFolderNamed("Folder2", connectionRoot.Children); var folder21 = GetFolderNamed("Folder2.1", folder2.Children); Assert.That(folder21.Children.Count, Is.EqualTo(2)); } - [Test] - public void Folder211HasOneConnection() + [TestCaseSource(typeof(XmlConnectionsDeserializerFixtureData), nameof(XmlConnectionsDeserializerFixtureData.FixtureParams))] + public void Folder211HasOneConnection(Datagram testData) { + Setup(testData.ConfCons, testData.Password); var connectionRoot = _connectionTreeModel.RootNodes[0]; var folder2 = GetFolderNamed("Folder2", connectionRoot.Children); var folder21 = GetFolderNamed("Folder2.1", folder2.Children); @@ -97,4 +108,39 @@ namespace mRemoteNGTests.Config.Serializers return folder; } } + + public class XmlConnectionsDeserializerFixtureData + { + public static IEnumerable FixtureParams + { + get + { + yield return new TestCaseData(new Datagram("confCons v2.5", Resources.confCons_v2_5, "mR3m")); + yield return new TestCaseData(new Datagram("confCons v2.6", Resources.confCons_v2_6, "mR3m")); + yield return new TestCaseData(new Datagram("confCons v2.6 fullencryption", Resources.confCons_v2_6_fullencryption, "mR3m")); + yield return new TestCaseData(new Datagram("confCons v2.6 custompassword", Resources.confCons_v2_6_passwordis_Password, "Password")); + yield return new TestCaseData(new Datagram("confCons v2.6 custompassword,fullencryption", Resources.confCons_v2_6_passwordis_Password_fullencryption, "Password")); + } + } + } + + public class Datagram + { + private readonly string _testName; + + public string ConfCons { get; set; } + public string Password { get; set; } + + public Datagram(string testName, string confCons, string password) + { + _testName = testName; + ConfCons = confCons; + Password = password; + } + + public override string ToString() + { + return _testName; + } + } } \ No newline at end of file diff --git a/mRemoteNGTests/Properties/Resources.Designer.cs b/mRemoteNGTests/Properties/Resources.Designer.cs index 2048ae029..27b2e75ff 100644 --- a/mRemoteNGTests/Properties/Resources.Designer.cs +++ b/mRemoteNGTests/Properties/Resources.Designer.cs @@ -60,6 +60,60 @@ namespace mRemoteNGTests.Properties { } } + /// + /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?> + ///<Connections Name="Connections" Export="False" Protected="95syzRuZ4mRxpNkZQzoyX8SDpQXLyMq3GncO8o4SyTBoYvn3TAWgn05ZEU2DrjkM" ConfVersion="2.5"> + /// <Node Name="Folder1" Type="Container" Expanded="True" Descr="" Icon="mRemoteNG" Panel="General" Username="" Domain="" Password="" Hostname="" Protocol="ICA" PuttySession="Default Settings" Port="1494" ConnectToConsole="False" UseCredSsp="True" RenderingEngine="IE" ICAEncryptionStrength="Encr128Bit" RDPAuthenticationLevel=" [rest of string was truncated]";. + /// + internal static string confCons_v2_5 { + get { + return ResourceManager.GetString("confCons_v2_5", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?> + ///<Connections Name="Connections" Export="False" EncryptionEngine="AES" BlockCipherMode="GCM" FullFileEncryption="False" Protected="NLfUEqIBqqVWudrTlcyeGJbqCApJ9M2w/+AfkKrY1AMBVJlERgdkuvsb1aiTvqJEddVLs30JTOwOmFEJHRKSJ30O" ConfVersion="2.6"> + /// <Node Name="Folder1" Type="Container" Expanded="True" Descr="" Icon="mRemoteNG" Panel="General" Username="" Domain="" Password="" Hostname="" Protocol="ICA" PuttySession="Default Settings" Port="1494" ConnectToConsole="False" Us [rest of string was truncated]";. + /// + internal static string confCons_v2_6 { + get { + return ResourceManager.GetString("confCons_v2_6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?> + ///<Connections Name="Connections" Export="False" EncryptionEngine="AES" BlockCipherMode="GCM" FullFileEncryption="False" Protected="4S6n3BwoY5Z41KAwolCQr68OQYwsz5Jn71oaiU7TwyVPhfLYei/ivTAhHOIW4fzXnRwVa4YbZN7EzH1Z9yyNofEX" ConfVersion="2.6"> + /// <Node Name="Folder1" Type="Container" Expanded="True" Descr="" Icon="mRemoteNG" Panel="General" Username="" Domain="" Password="" Hostname="" Protocol="ICA" PuttySession="Default Settings" Port="1494" ConnectToConsole="False" Us [rest of string was truncated]";. + /// + internal static string confCons_v2_6_fullencryption { + get { + return ResourceManager.GetString("confCons_v2_6_fullencryption", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?> + ///<Connections Name="Connections" Export="False" EncryptionEngine="AES" BlockCipherMode="GCM" FullFileEncryption="False" Protected="j+pOPbBSME6XB86/zXxI+KOvP4xunGCiSmRCJM3h4L8iY4H6Su/v6Y5GAPG1ZRzoPuZae435aQ8/atLrCDS0" ConfVersion="2.6"> + /// <Node Name="Folder1" Type="Container" Expanded="True" Descr="" Icon="mRemoteNG" Panel="General" Username="" Domain="" Password="" Hostname="" Protocol="ICA" PuttySession="Default Settings" Port="1494" ConnectToConsole="False" UseCre [rest of string was truncated]";. + /// + internal static string confCons_v2_6_passwordis_Password { + get { + return ResourceManager.GetString("confCons_v2_6_passwordis_Password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?> + ///<Connections Name="Connections" Export="False" EncryptionEngine="AES" BlockCipherMode="GCM" FullFileEncryption="True" Protected="BwdQyDnLr2ofyIkwfAJETiMme2RsUhJEnznQ0sKQ4Lq9CpuaP4YFHxWU/NGjnslOyefgaQeS8KTqafNVHsMe" ConfVersion="2.6">A0KwHg+PNf1NITqaOI+IGFJaPojixS5ZwxWy2Zohb428o53ba1NljnwhOWIheI2zomBuHiIzy5oS+g21MyW9IAnF7r3NnhekViSbol3a51TEJO/FW9XSKUZToAjlNZqS5t0xNEaRwSLfhkb83aHTvrap33Smp/Jm9RW09sBJYwA+itE5JXqyHLsCsvMMB9DijomEH9za+x48Xgb68fx/5IaEXbduoVAXbKWNTUJ0wtIIFTj [rest of string was truncated]";. + /// + internal static string confCons_v2_6_passwordis_Password_fullencryption { + get { + return ResourceManager.GetString("confCons_v2_6_passwordis_Password_fullencryption", resourceCulture); + } + } + /// /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-16"?> ///<!-- ****************************************************************--> @@ -194,16 +248,5 @@ namespace mRemoteNGTests.Properties { return ResourceManager.GetString("test_remotedesktopconnection_rdp", resourceCulture); } } - - /// - /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?> - ///<Connections Name="Connections" Export="False" Protected="95syzRuZ4mRxpNkZQzoyX8SDpQXLyMq3GncO8o4SyTBoYvn3TAWgn05ZEU2DrjkM" ConfVersion="2.5"> - /// <Node Name="Folder1" Type="Container" Expanded="True" Descr="" Icon="mRemoteNG" Panel="General" Username="" Domain="" Password="" Hostname="" Protocol="ICA" PuttySession="Default Settings" Port="1494" ConnectToConsole="False" UseCredSsp="True" RenderingEngine="IE" ICAEncryptionStrength="Encr128Bit" RDPAuthenticationLevel=" [rest of string was truncated]";. - /// - internal static string TestConfCons { - get { - return ResourceManager.GetString("TestConfCons", resourceCulture); - } - } } } diff --git a/mRemoteNGTests/Properties/Resources.resx b/mRemoteNGTests/Properties/Resources.resx index 91106699f..c68f0c593 100644 --- a/mRemoteNGTests/Properties/Resources.resx +++ b/mRemoteNGTests/Properties/Resources.resx @@ -118,8 +118,20 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ..\Resources\TestConfCons.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + ..\Resources\confCons_v2_5.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\confCons_v2_6.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\confCons_v2_6_fullencryption.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\confCons_v2_6_passwordis_Password.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\confCons_v2_6_passwordis_Password_fullencryption.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 ..\Resources\test_puttyConnectionManager_database.dat;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16 diff --git a/mRemoteNGTests/Resources/TestConfCons.xml b/mRemoteNGTests/Resources/confCons_v2_5.xml similarity index 100% rename from mRemoteNGTests/Resources/TestConfCons.xml rename to mRemoteNGTests/Resources/confCons_v2_5.xml diff --git a/mRemoteNGTests/Resources/confCons_v2_6.xml b/mRemoteNGTests/Resources/confCons_v2_6.xml new file mode 100644 index 000000000..c7a7128ea --- /dev/null +++ b/mRemoteNGTests/Resources/confCons_v2_6.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mRemoteNGTests/Resources/confCons_v2_6_fullencryption.xml b/mRemoteNGTests/Resources/confCons_v2_6_fullencryption.xml new file mode 100644 index 000000000..5fc7c6c7b --- /dev/null +++ b/mRemoteNGTests/Resources/confCons_v2_6_fullencryption.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mRemoteNGTests/Resources/confCons_v2_6_passwordis_Password.xml b/mRemoteNGTests/Resources/confCons_v2_6_passwordis_Password.xml new file mode 100644 index 000000000..4c67d32e4 --- /dev/null +++ b/mRemoteNGTests/Resources/confCons_v2_6_passwordis_Password.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mRemoteNGTests/Resources/confCons_v2_6_passwordis_Password_fullencryption.xml b/mRemoteNGTests/Resources/confCons_v2_6_passwordis_Password_fullencryption.xml new file mode 100644 index 000000000..3c6acfb03 --- /dev/null +++ b/mRemoteNGTests/Resources/confCons_v2_6_passwordis_Password_fullencryption.xml @@ -0,0 +1,2 @@ + +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 \ No newline at end of file diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index 0fa54b39c..36651ded5 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -168,8 +168,7 @@ - - + @@ -178,7 +177,18 @@ - + + + + + + + + + + + + diff --git a/mRemoteV1/Config/Connections/ConnectionsDecryptor.cs b/mRemoteV1/Config/Connections/ConnectionsDecryptor.cs index 46ca96f94..692430ab5 100644 --- a/mRemoteV1/Config/Connections/ConnectionsDecryptor.cs +++ b/mRemoteV1/Config/Connections/ConnectionsDecryptor.cs @@ -4,7 +4,6 @@ using mRemoteNG.App; using mRemoteNG.Security; using mRemoteNG.Security.Authentication; using mRemoteNG.Security.SymmetricEncryption; -using mRemoteNG.Tools; using mRemoteNG.Tree.Root; @@ -14,6 +13,8 @@ namespace mRemoteNG.Config.Connections { private readonly ICryptographyProvider _cryptographyProvider; + public Func AuthenticationRequestor { get; set; } + public ConnectionsDecryptor() { _cryptographyProvider = new LegacyRijndaelCryptographyProvider(); @@ -49,7 +50,7 @@ namespace mRemoteNG.Config.Connections if (notDecr) { - if (Authenticate(xml)) + if (Authenticate(xml, Runtime.EncryptionKey)) { decryptedContent = _cryptographyProvider.Decrypt(xml, Runtime.EncryptionKey); notDecr = false; @@ -66,42 +67,34 @@ namespace mRemoteNG.Config.Connections return ""; } - public bool ConnectionsFileIsAuthentic(string protectedString, RootNodeInfo rootInfo) + public bool ConnectionsFileIsAuthentic(string protectedString, SecureString password, RootNodeInfo rootInfo) { var connectionsFileIsNotEncrypted = false; try { - connectionsFileIsNotEncrypted = _cryptographyProvider.Decrypt(protectedString, Runtime.EncryptionKey) == "ThisIsNotProtected"; + connectionsFileIsNotEncrypted = _cryptographyProvider.Decrypt(protectedString, password) == "ThisIsNotProtected"; } catch (EncryptionException) { } - return connectionsFileIsNotEncrypted || Authenticate(protectedString, rootInfo); + return connectionsFileIsNotEncrypted || Authenticate(protectedString, password, rootInfo); } - private bool Authenticate(string cipherText, RootNodeInfo rootInfo = null) + private bool Authenticate(string cipherText, SecureString password, RootNodeInfo rootInfo = null) { var authenticator = new PasswordAuthenticator(_cryptographyProvider, cipherText) { - AuthenticationRequestor = PromptForPassword + AuthenticationRequestor = AuthenticationRequestor }; - var authenticated = authenticator.Authenticate(Runtime.EncryptionKey); - - if (authenticated && rootInfo != null) - { - rootInfo.Password = true; - rootInfo.PasswordString = Runtime.EncryptionKey.ConvertToUnsecureString(); - } + var authenticated = authenticator.Authenticate(password); + if (!authenticated) return authenticated; + Runtime.EncryptionKey = authenticator.LastAuthenticatedPassword; + if (rootInfo == null) return authenticated; + rootInfo.Password = true; + rootInfo.PasswordString = Runtime.EncryptionKey.ConvertToUnsecureString(); return authenticated; } - - private SecureString PromptForPassword() - { - var password = MiscTools.PasswordDialog("", false); - Runtime.EncryptionKey = password; - return password; - } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index f0009f5d8..6553fd154 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -1,7 +1,10 @@ +using System.Security; +using mRemoteNG.App; using mRemoteNG.Config.DatabaseConnectors; using mRemoteNG.Config.DataProviders; using mRemoteNG.Config.Putty; using mRemoteNG.Config.Serializers; +using mRemoteNG.Tools; using mRemoteNG.Tree; using mRemoteNG.UI.Forms; @@ -28,7 +31,10 @@ namespace mRemoteNG.Config.Connections { var dataProvider = new FileDataProvider(ConnectionFileName); var xmlString = dataProvider.Load(); - deserializer = new XmlConnectionsDeserializer(xmlString); + deserializer = new XmlConnectionsDeserializer(xmlString) + { + AuthenticationRequestor = PromptForPassword + }; } var connectionTreeModel = deserializer.Deserialize(); @@ -44,5 +50,11 @@ namespace mRemoteNG.Config.Connections return connectionTreeModel; } + + private SecureString PromptForPassword() + { + var password = MiscTools.PasswordDialog("", false); + return password; + } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs b/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs index 03b7393ca..b29a6e659 100644 --- a/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs +++ b/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs @@ -1,5 +1,6 @@ using System; using System.Globalization; +using System.Security; using System.Windows.Forms; using System.Xml; using mRemoteNG.App; @@ -13,7 +14,6 @@ using mRemoteNG.Connection.Protocol.VNC; using mRemoteNG.Container; using mRemoteNG.Messages; using mRemoteNG.Security; -using mRemoteNG.Security.SymmetricEncryption; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; using mRemoteNG.UI.Forms; @@ -31,6 +31,7 @@ namespace mRemoteNG.Config.Serializers private string ConnectionFileName = ""; private const double MaxSupportedConfVersion = 2.6; + public Func AuthenticationRequestor { get; set; } public XmlConnectionsDeserializer(string xml) { @@ -40,7 +41,7 @@ namespace mRemoteNG.Config.Serializers private void LoadXmlConnectionData(string connections) { - _decryptor = new ConnectionsDecryptor(); + CreateDecryptor(); connections = _decryptor.LegacyFullFileDecrypt(connections); _xmlDocument = new XmlDocument(); if (connections != "") @@ -99,7 +100,7 @@ namespace mRemoteNG.Config.Serializers if (_confVersion > 1.3) { var protectedString = _xmlDocument.DocumentElement?.Attributes["Protected"].Value; - if (!_decryptor.ConnectionsFileIsAuthentic(protectedString, rootInfo)) + if (!_decryptor.ConnectionsFileIsAuthentic(protectedString, Runtime.EncryptionKey, rootInfo)) { mRemoteNG.Settings.Default.LoadConsFromCustomLocation = false; mRemoteNG.Settings.Default.CustomConsPath = ""; @@ -147,21 +148,21 @@ namespace mRemoteNG.Config.Serializers return rootInfo; } - private void CreateDecryptor(XmlElement connectionsRootElement) + private void CreateDecryptor(XmlElement connectionsRootElement = null) { if (_confVersion >= 2.6) { BlockCipherEngines engine; - Enum.TryParse(connectionsRootElement.Attributes["EncryptionEngine"].Value, out engine); + Enum.TryParse(connectionsRootElement?.Attributes["EncryptionEngine"].Value, out engine); BlockCipherModes mode; - Enum.TryParse(connectionsRootElement.Attributes["BlockCipherMode"].Value, out mode); + Enum.TryParse(connectionsRootElement?.Attributes["BlockCipherMode"].Value, out mode); - _decryptor = new ConnectionsDecryptor(engine, mode); + _decryptor = new ConnectionsDecryptor(engine, mode) {AuthenticationRequestor = AuthenticationRequestor}; } else { - _decryptor = new ConnectionsDecryptor(); + _decryptor = new ConnectionsDecryptor { AuthenticationRequestor = AuthenticationRequestor }; } } @@ -491,7 +492,7 @@ namespace mRemoteNG.Config.Serializers private bool IsExportFile(XmlElement rootConnectionsNode) { var isExportFile = false; - if (_confVersion < 1.0) return isExportFile; + if (_confVersion < 1.0) return false; if (Convert.ToBoolean(rootConnectionsNode.Attributes["Export"].Value)) isExportFile = true; return isExportFile;