diff --git a/CHANGELOG.TXT b/CHANGELOG.TXT index 8fa19fbea..558cb9463 100644 --- a/CHANGELOG.TXT +++ b/CHANGELOG.TXT @@ -1,3 +1,16 @@ +1.75 hotfix 1 (2017-03-06): + +General Changes: +---------------- +#437: Modify version numbering scheme + +Fixes: +------ +#422: Uncaught exception when clicking in connection tree whitespace +#312: Resolved KeePass auto-type issue +#427: Export does not respect filtering user/password/domain + + 1.75 (2017-03-01): Known Issue: diff --git a/mRemoteNGTests/Config/Serializers/XmlConnectionNodeSerializerTests.cs b/mRemoteNGTests/Config/Serializers/XmlConnectionNodeSerializerTests.cs index 9136450e7..dc63d79e5 100644 --- a/mRemoteNGTests/Config/Serializers/XmlConnectionNodeSerializerTests.cs +++ b/mRemoteNGTests/Config/Serializers/XmlConnectionNodeSerializerTests.cs @@ -12,13 +12,14 @@ namespace mRemoteNGTests.Config.Serializers public class XmlConnectionNodeSerializerTests { private XmlConnectionNodeSerializer _connectionNodeSerializer; + private ICryptographyProvider _cryptographyProvider; [SetUp] public void Setup() { - var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider( + _cryptographyProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider( BlockCipherEngines.AES, BlockCipherModes.GCM); - _connectionNodeSerializer = new XmlConnectionNodeSerializer(cryptoProvider, "myPassword1".ConvertToSecureString()); + _connectionNodeSerializer = new XmlConnectionNodeSerializer(_cryptographyProvider, "myPassword1".ConvertToSecureString(), new SaveFilter()); } [Test] @@ -48,8 +49,7 @@ namespace mRemoteNGTests.Config.Serializers public void AttributesNotSerializedWhenFiltered(string attributeName, ConnectionInfo connectionInfo) { var saveFilter = new SaveFilter(true); - var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.AES, BlockCipherModes.GCM); - _connectionNodeSerializer = new XmlConnectionNodeSerializer(cryptoProvider, "myPassword1".ConvertToSecureString(), saveFilter); + _connectionNodeSerializer = new XmlConnectionNodeSerializer(_cryptographyProvider, "myPassword1".ConvertToSecureString(), saveFilter); var returnVal = _connectionNodeSerializer.SerializeConnectionInfo(connectionInfo); var targetAttribute = returnVal.Attribute(XName.Get(attributeName)); Assert.That(targetAttribute?.Value, Is.EqualTo(string.Empty)); @@ -59,8 +59,7 @@ namespace mRemoteNGTests.Config.Serializers public void InheritanceNotSerialiedWhenFiltered(string attributeName, ConnectionInfo connectionInfo) { var saveFilter = new SaveFilter(true); - var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.AES, BlockCipherModes.GCM); - _connectionNodeSerializer = new XmlConnectionNodeSerializer(cryptoProvider, "myPassword1".ConvertToSecureString(), saveFilter); + _connectionNodeSerializer = new XmlConnectionNodeSerializer(_cryptographyProvider, "myPassword1".ConvertToSecureString(), saveFilter); var returnVal = _connectionNodeSerializer.SerializeConnectionInfo(connectionInfo); var targetAttribute = returnVal.Attribute(XName.Get(attributeName)); Assert.That(targetAttribute?.Value, Is.EqualTo(false.ToString())); diff --git a/mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentCompilerTests.cs b/mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentCompilerTests.cs index e7ba07be3..69292cc27 100644 --- a/mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentCompilerTests.cs +++ b/mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentCompilerTests.cs @@ -28,7 +28,8 @@ namespace mRemoteNGTests.Config.Serializers public void Setup() { _cryptographyProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.AES, BlockCipherModes.GCM); - _documentCompiler = new XmlConnectionsDocumentCompiler(_cryptographyProvider); + var saveFilter = new SaveFilter(); + _documentCompiler = new XmlConnectionsDocumentCompiler(_cryptographyProvider, saveFilter); _connectionTreeModel = SetupConnectionTreeModel(); } diff --git a/mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentEncryptorTests.cs b/mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentEncryptorTests.cs index ec17d85de..2fbe93311 100644 --- a/mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentEncryptorTests.cs +++ b/mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentEncryptorTests.cs @@ -20,7 +20,8 @@ namespace mRemoteNGTests.Config.Serializers { var connectionTreeModel = SetupConnectionTreeModel(); var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.AES, BlockCipherModes.GCM); - _originalDocument = new XmlConnectionsDocumentCompiler(cryptoProvider).CompileDocument(connectionTreeModel, false, false); + var saveFilter = new SaveFilter(); + _originalDocument = new XmlConnectionsDocumentCompiler(cryptoProvider, saveFilter).CompileDocument(connectionTreeModel, false, false); _documentEncryptor = new XmlConnectionsDocumentEncryptor(cryptoProvider); } diff --git a/mRemoteNGTests/Config/Serializers/XmlConnectionsSerializerTests.cs b/mRemoteNGTests/Config/Serializers/XmlConnectionsSerializerTests.cs index 078a1b9b0..8604ef473 100644 --- a/mRemoteNGTests/Config/Serializers/XmlConnectionsSerializerTests.cs +++ b/mRemoteNGTests/Config/Serializers/XmlConnectionsSerializerTests.cs @@ -1,7 +1,9 @@ using System.Xml; +using System.Xml.Linq; using mRemoteNG.Config.Serializers; using mRemoteNG.Connection; using mRemoteNG.Container; +using mRemoteNG.Security; using mRemoteNG.Security.SymmetricEncryption; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; @@ -45,6 +47,27 @@ namespace mRemoteNGTests.Config.Serializers Assert.That(connectionNode, Is.Not.Null); } + [TestCase("Username", "")] + [TestCase("Domain", "")] + [TestCase("Password", "")] + [TestCase("InheritAutomaticResize", "False")] + public void SerializerRespectsSaveFilterSettings(string attributeName, string expectedValue) + { + _serializer.SaveFilter = new SaveFilter(true); + var connectionInfo = new ConnectionInfo + { + Name = "myConnection", + Username = "somefilteredstuff", + Domain = "somefilteredstuff", + Password = "somefilteredstuff", + Inheritance = {AutomaticResize = true} + }; + var serializedConnections = _serializer.Serialize(connectionInfo); + var xdoc = XDocument.Parse(serializedConnections); + var attributeValue = xdoc.Root?.Element("Node")?.Attribute(attributeName)?.Value; + Assert.That(attributeValue, Is.EqualTo(expectedValue)); + } + private ConnectionTreeModel SetupConnectionTreeModel() { /* diff --git a/mRemoteV1/Config/Serializers/XmlConnectionNodeSerializer.cs b/mRemoteV1/Config/Serializers/XmlConnectionNodeSerializer.cs index 0ec493f24..01b6345bb 100644 --- a/mRemoteV1/Config/Serializers/XmlConnectionNodeSerializer.cs +++ b/mRemoteV1/Config/Serializers/XmlConnectionNodeSerializer.cs @@ -1,4 +1,5 @@ -using System.Security; +using System; +using System.Security; using System.Xml.Linq; using mRemoteNG.Connection; using mRemoteNG.Container; @@ -13,14 +14,15 @@ namespace mRemoteNG.Config.Serializers private readonly SecureString _encryptionKey; private readonly SaveFilter _saveFilter = new SaveFilter(); - public XmlConnectionNodeSerializer(ICryptographyProvider cryptographyProvider, SecureString encryptionKey) - { - _cryptographyProvider = cryptographyProvider; - _encryptionKey = encryptionKey; - } - public XmlConnectionNodeSerializer(ICryptographyProvider cryptographyProvider, SecureString encryptionKey, SaveFilter saveFilter) { + if (cryptographyProvider == null) + throw new ArgumentNullException(nameof(cryptographyProvider)); + if (encryptionKey == null) + throw new ArgumentNullException(nameof(encryptionKey)); + if (saveFilter == null) + throw new ArgumentNullException(nameof(saveFilter)); + _cryptographyProvider = cryptographyProvider; _encryptionKey = encryptionKey; _saveFilter = saveFilter; diff --git a/mRemoteV1/Config/Serializers/XmlConnectionsDocumentCompiler.cs b/mRemoteV1/Config/Serializers/XmlConnectionsDocumentCompiler.cs index 15e14e198..224348e01 100644 --- a/mRemoteV1/Config/Serializers/XmlConnectionsDocumentCompiler.cs +++ b/mRemoteV1/Config/Serializers/XmlConnectionsDocumentCompiler.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Security; using System.Xml.Linq; using mRemoteNG.Connection; @@ -14,10 +15,17 @@ namespace mRemoteNG.Config.Serializers { private readonly ICryptographyProvider _cryptographyProvider; private SecureString _encryptionKey; + private readonly SaveFilter _saveFilter; - public XmlConnectionsDocumentCompiler(ICryptographyProvider cryptographyProvider) + public XmlConnectionsDocumentCompiler(ICryptographyProvider cryptographyProvider, SaveFilter saveFilter) { + if (cryptographyProvider == null) + throw new ArgumentNullException(nameof(cryptographyProvider)); + if (saveFilter == null) + throw new ArgumentNullException(nameof(saveFilter)); + _cryptographyProvider = cryptographyProvider; + _saveFilter = saveFilter; } public XDocument CompileDocument(ConnectionTreeModel connectionTreeModel, bool fullFileEncryption, bool export) @@ -77,7 +85,7 @@ namespace mRemoteNG.Config.Serializers private XElement CompileConnectionInfoNode(ConnectionInfo connectionInfo) { - var connectionSerializer = new XmlConnectionNodeSerializer(_cryptographyProvider, _encryptionKey); + var connectionSerializer = new XmlConnectionNodeSerializer(_cryptographyProvider, _encryptionKey, _saveFilter); return connectionSerializer.SerializeConnectionInfo(connectionInfo); } } diff --git a/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs b/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs index 72a6682fc..183d82c14 100644 --- a/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs +++ b/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs @@ -41,7 +41,7 @@ namespace mRemoteNG.Config.Serializers var xml = ""; try { - var documentCompiler = new XmlConnectionsDocumentCompiler(_cryptographyProvider); + var documentCompiler = new XmlConnectionsDocumentCompiler(_cryptographyProvider, SaveFilter); var xmlDocument = documentCompiler.CompileDocument(serializationTarget, UseFullEncryption, Export); xml = WriteXmlToString(xmlDocument); } diff --git a/mRemoteV1/Properties/AssemblyInfo.cs b/mRemoteV1/Properties/AssemblyInfo.cs index 16ac88715..78163846f 100644 --- a/mRemoteV1/Properties/AssemblyInfo.cs +++ b/mRemoteV1/Properties/AssemblyInfo.cs @@ -33,7 +33,7 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // -[assembly: AssemblyVersion("1.75.*")] +[assembly: AssemblyVersion("1.75.7000.*")] [assembly:NeutralResourcesLanguageAttribute("en")] diff --git a/mRemoteV1/UI/Controls/ConnectionTree/ConnectionTree.cs b/mRemoteV1/UI/Controls/ConnectionTree/ConnectionTree.cs index ea0769394..cb640ba05 100644 --- a/mRemoteV1/UI/Controls/ConnectionTree/ConnectionTree.cs +++ b/mRemoteV1/UI/Controls/ConnectionTree/ConnectionTree.cs @@ -48,6 +48,7 @@ namespace mRemoteNG.UI.Controls { InitializeComponent(); SetupConnectionTreeView(); + UseOverlays = false; } #region ConnectionTree Setup @@ -264,7 +265,7 @@ namespace mRemoteNG.UI.Controls if (mouseEventArgs.Clicks > 1) return; OLVColumn column; var listItem = GetItemAt(mouseEventArgs.X, mouseEventArgs.Y, out column); - var clickedNode = listItem.RowObject as ConnectionInfo; + var clickedNode = listItem?.RowObject as ConnectionInfo; if (clickedNode == null) return; SingleClickHandler.Execute(clickedNode); }