diff --git a/CHANGELOG.TXT b/CHANGELOG.TXT index c15c16a6..7c7b1ecd 100644 --- a/CHANGELOG.TXT +++ b/CHANGELOG.TXT @@ -3,6 +3,22 @@ Features/Enhancements: ---------------------- Added more logging/notifications options +#429: Added Czech translation + + + + +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 diff --git a/CREDITS.TXT b/CREDITS.TXT index 2b5922af..7ea45417 100644 --- a/CREDITS.TXT +++ b/CREDITS.TXT @@ -44,6 +44,7 @@ Robert Siwiec Hayato Iriumi Sebastien Thieury (github.com/SebThieu) Riza Emet +Lukas Plachy Included Source Code @@ -118,3 +119,8 @@ VncSharp 1.1 Copyright 2004-2009 David Humphrey GNU General Public License (GPL) Version 2 https://github.com/humphd/VncSharp + +ObjectListView 2.9 +Copyright 2006-2015 Phillip Piper +GNU General Public License (GPL) Version 3 +https://sourceforge.net/projects/objectlistview/ \ No newline at end of file diff --git a/InstallerProjects/Installer/Installer.wixproj b/InstallerProjects/Installer/Installer.wixproj index f5f28af7..33ffb222 100644 --- a/InstallerProjects/Installer/Installer.wixproj +++ b/InstallerProjects/Installer/Installer.wixproj @@ -114,22 +114,6 @@ HarvestPath=$(SolutionDir)mRemoteV1\bin\Release Portable;HelpFilesHarvestPath=$(SolutionDir)mRemoteV1\Resources\Help - - set /p buildenv=<buildenv.tmp - -REM Sign MSI -IF EXIST C:\mRemoteNG_code_signing_cert.pfx ( - IF %25buildenv: Portable=%25==Release ( - powershell "&""$(SolutionDir)Tools\signfiles.ps1""" %27%25cd%25%27 - ) -) - -REM Rename MSI to include version number -powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\rename_installer_with_version.ps1" $(SolutionDir) - -REM Copy MSI to Release folder -IF %25buildenv: Portable=%25==Release (powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\copy_release_installer.ps1" $(TargetDir) $(SolutionDir)Release) - REM Clean the TargetDir rmdir /S /Q "$(TargetDir)" @@ -142,4 +126,20 @@ call "$(WIX)bin\heat.exe" dir "$(SolutionDir)mRemoteV1\bin\$(Configuration)" -ag REM Convert the license file "COPYING.TXT" to "License.rtf" to be shown in the installer GUI call "$(ProjectDir)Resources\Pandoc\pandoc.exe" -s -t rtf -o "$(ProjectDir)\Resources\License.rtf" "$(SolutionDir)COPYING.TXT" + + set /p buildenv=<buildenv.tmp + +REM Sign MSI +IF EXIST C:\mRemoteNG_code_signing_cert.pfx ( + IF %25buildenv: Portable=%25==Release ( + powershell -File "$(SolutionDir)Tools\signfiles.ps1" -PathToSignableFiles %25cd%25 + ) +) + +REM Rename MSI to include version number +powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\rename_installer_with_version.ps1" $(SolutionDir) + +REM Copy MSI to Release folder +IF %25buildenv: Portable=%25==Release (powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\copy_release_installer.ps1" $(TargetDir) $(SolutionDir)Release) + \ No newline at end of file diff --git a/README.MD b/README.MD index 539b9861..36b95dd6 100644 --- a/README.MD +++ b/README.MD @@ -10,8 +10,8 @@ | Update Channel | Build Status | Downloads | | ---------------|--------------|-----------| -| Stable | [![Build Status](https://jenkins.mremoteng.org/buildStatus/icon?job=mRemoteNG/mRemoteNG/master)](https://jenkins.mremoteng.org/job/mRemoteNG/job/mRemoteNG/job/master/) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.74/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.74) | -| Beta | [![Build Status](https://jenkins.mremoteng.org/buildStatus/icon?job=mRemoteNG/mRemoteNG/beta_channel)](https://jenkins.mremoteng.org/job/mRemoteNG/job/mRemoteNG/job/beta_channel/) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.75Beta3/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.75Beta3) | +| Stable | [![Build Status](https://jenkins.mremoteng.org/buildStatus/icon?job=mRemoteNG/mRemoteNG/master)](https://jenkins.mremoteng.org/job/mRemoteNG/job/mRemoteNG/job/master/) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.75Hotfix1/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.75Hotfix1) | +| Beta | [![Build Status](https://jenkins.mremoteng.org/buildStatus/icon?job=mRemoteNG/mRemoteNG/beta_channel)](https://jenkins.mremoteng.org/job/mRemoteNG/job/mRemoteNG/job/beta_channel/) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.75Hotfix1/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.75Hotfix1) | | Development | [![Build Status](https://jenkins.mremoteng.org/buildStatus/icon?job=mRemoteNG/mRemoteNG/develop)](https://jenkins.mremoteng.org/job/mRemoteNG/job/mRemoteNG/job/develop/) | - | diff --git a/Tools/signfiles.ps1 b/Tools/signfiles.ps1 index 49c60c72..5b59cd1e 100644 --- a/Tools/signfiles.ps1 +++ b/Tools/signfiles.ps1 @@ -1,13 +1,31 @@ -$timeserver = "http://timestamp.verisign.com/scripts/timstamp.dll" -$certPath = "C:\mRemoteNG_code_signing_cert.pfx" -$certPassword = (Get-Credential -Message "Enter the password for the certificate" -UserName "USERNAME NOT NEEDED").Password -$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($certPath, $certPassword) -$targetPath = $args[0] +param( + [string] + [Parameter(Mandatory=$true)] + # Folder path that contains the files you would like to sign. Recursive. + $PathToSignableFiles, + + [string] + # The code signing certificate to use when signing the files. + $CertificatePath = "C:\mRemoteNG_code_signing_cert.pfx", + + [SecureString] + # Password to unlock the code signing certificate. + $CertificatePassword = (Get-Credential -Message "Enter password for the mRemoteNG code signing certificate" -UserName "USERNAME NOT NEEDED").Password, + + [string[]] + # File names to exclude from signing + $Exclude +) -Write-Output "Getting files from path: $targetPath" -$signableFiles = Get-ChildItem -Path $targetPath -Recurse | ?{$_.Extension -match "dll|exe|msi"} +$timeserver = "http://timestamp.verisign.com/scripts/timstamp.dll" +$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertificatePath, $CertificatePassword) + + +Write-Output "Getting files from path: $PathToSignableFiles" +$signableFiles = Get-ChildItem -Path $PathToSignableFiles -Recurse | ?{$_.Extension -match "dll|exe|msi"} | ?{$Exclude -notcontains $_.Name} Write-Output "Signable files count: $($signableFiles.Count)" + foreach ($file in $signableFiles) { Set-AuthenticodeSignature -Certificate $cert -TimestampServer $timeserver -IncludeChain all -FilePath $file.FullName } \ No newline at end of file diff --git a/mRemoteNGTests/Config/CredentialHarvesterTests.cs b/mRemoteNGTests/Config/CredentialHarvesterTests.cs index 8f11fb74..97d54e47 100644 --- a/mRemoteNGTests/Config/CredentialHarvesterTests.cs +++ b/mRemoteNGTests/Config/CredentialHarvesterTests.cs @@ -120,7 +120,7 @@ namespace mRemoteNGTests.Config { var rootNode = new RootNodeInfo(RootNodeType.Connection) {PasswordString = _key.ConvertToUnsecureString()}; rootNode.AddChild(connectionInfo); - var nodeSerializer = new XmlConnectionNodeSerializer26(_cryptographyProvider, _key); + var nodeSerializer = new XmlConnectionNodeSerializer26(_cryptographyProvider, _key, new SaveFilter()); var serializer = new XmlConnectionsSerializer(_cryptographyProvider, nodeSerializer); var serializedData = serializer.Serialize(rootNode); return XDocument.Parse(serializedData); diff --git a/mRemoteNGTests/Config/Serializers/CsvConnectionsSerializerMremotengFormatTests.cs b/mRemoteNGTests/Config/Serializers/CsvConnectionsSerializerMremotengFormatTests.cs new file mode 100644 index 00000000..1bdd88d2 --- /dev/null +++ b/mRemoteNGTests/Config/Serializers/CsvConnectionsSerializerMremotengFormatTests.cs @@ -0,0 +1,87 @@ +using System; +using mRemoteNG.Config.Serializers; +using mRemoteNG.Connection; +using mRemoteNG.Credential; +using mRemoteNG.Security; +using mRemoteNG.Tree; +using NSubstitute; +using NUnit.Framework; + +namespace mRemoteNGTests.Config.Serializers +{ + public class CsvConnectionsSerializerMremotengFormatTests + { + private const string ConnectionName = "myconnection"; + private const string Username = "myuser"; + private const string Domain = "mydomain"; + private const string Password = "mypass123"; + + [TestCase(Username)] + [TestCase(Domain)] + [TestCase(Password)] + [TestCase("InheritColors")] + public void CreatesCsv(string valueThatShouldExist) + { + var serializer = new CsvConnectionsSerializerMremotengFormat(new SaveFilter()); + var connectionInfo = BuildConnectionInfo(); + var csv = serializer.Serialize(connectionInfo); + Assert.That(csv, Does.Match(valueThatShouldExist)); + } + + [TestCase(Username)] + [TestCase(Domain)] + [TestCase(Password)] + [TestCase("InheritColors")] + public void SerializerRespectsSaveFilterSettings(string valueThatShouldntExist) + { + var saveFilter = new SaveFilter(true); + var serializer = new CsvConnectionsSerializerMremotengFormat(saveFilter); + var connectionInfo = BuildConnectionInfo(); + var csv = serializer.Serialize(connectionInfo); + Assert.That(csv, Does.Not.Match(valueThatShouldntExist)); + } + + [Test] + public void CanSerializeEmptyConnectionInfo() + { + var serializer = new CsvConnectionsSerializerMremotengFormat(new SaveFilter()); + var connectionInfo = new ConnectionInfo(); + var csv = serializer.Serialize(connectionInfo); + Assert.That(csv, Is.Not.Empty); + } + + [Test] + public void CantPassNullToConstructor() + { + Assert.Throws(() => new CsvConnectionsSerializerMremotengFormat(null)); + } + + [Test] + public void CantPassNullToSerializeConnectionInfo() + { + var serializer = new CsvConnectionsSerializerMremotengFormat(new SaveFilter()); + Assert.Throws(() => serializer.Serialize((ConnectionInfo)null)); + } + + [Test] + public void CantPassNullToSerializeConnectionTreeModel() + { + var serializer = new CsvConnectionsSerializerMremotengFormat(new SaveFilter()); + Assert.Throws(() => serializer.Serialize((ConnectionTreeModel)null)); + } + + private ConnectionInfo BuildConnectionInfo() + { + var credRecord = Substitute.For(); + credRecord.Username.Returns(Username); + credRecord.Domain.Returns(Domain); + credRecord.Password.Returns(Password.ConvertToSecureString()); + return new ConnectionInfo + { + Name = ConnectionName, + CredentialRecord = credRecord, + Inheritance = {Colors = true} + }; + } + } +} \ No newline at end of file diff --git a/mRemoteNGTests/Config/Serializers/XmlConnectionNodeSerializer27Tests.cs b/mRemoteNGTests/Config/Serializers/XmlConnectionNodeSerializer27Tests.cs index 332816f3..2bd6f3a2 100644 --- a/mRemoteNGTests/Config/Serializers/XmlConnectionNodeSerializer27Tests.cs +++ b/mRemoteNGTests/Config/Serializers/XmlConnectionNodeSerializer27Tests.cs @@ -3,7 +3,9 @@ using System.Xml.Linq; using mRemoteNG.Config.Serializers; using mRemoteNG.Connection; using mRemoteNG.Container; +using mRemoteNG.Credential; using mRemoteNG.Security; +using NSubstitute; using NUnit.Framework; @@ -12,13 +14,14 @@ namespace mRemoteNGTests.Config.Serializers public class XmlConnectionNodeSerializer27Tests { private XmlConnectionNodeSerializer27 _connectionNodeSerializer; + private ICryptographyProvider _cryptographyProvider; [SetUp] public void Setup() { - var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider( + _cryptographyProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider( BlockCipherEngines.AES, BlockCipherModes.GCM); - _connectionNodeSerializer = new XmlConnectionNodeSerializer27(cryptoProvider, "myPassword1".ConvertToSecureString()); + _connectionNodeSerializer = new XmlConnectionNodeSerializer27(_cryptographyProvider, "myPassword1".ConvertToSecureString(), new SaveFilter()); } [Test] @@ -75,6 +78,7 @@ namespace mRemoteNGTests.Config.Serializers Username = "myuser", Domain = "superdomain", Password = "pass", + CredentialRecord = Substitute.For(), Hostname = "somehost", ExtApp = "myextapp", PreExtApp = "preext1", @@ -107,6 +111,7 @@ namespace mRemoteNGTests.Config.Serializers yield return new TestCaseData("RDGatewayPassword", ConnectionInfo); yield return new TestCaseData("VNCProxyUsername", ConnectionInfo); yield return new TestCaseData("VNCProxyPassword", ConnectionInfo); + yield return new TestCaseData("CredentialId", ConnectionInfo); } } diff --git a/mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentCompilerTests.cs b/mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentCompilerTests.cs index b863deea..4e5aaec4 100644 --- a/mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentCompilerTests.cs +++ b/mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentCompilerTests.cs @@ -30,7 +30,10 @@ namespace mRemoteNGTests.Config.Serializers { _connectionTreeModel = SetupConnectionTreeModel(); _cryptographyProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.AES, BlockCipherModes.GCM); - var connectionNodeSerializer = new XmlConnectionNodeSerializer27(_cryptographyProvider, _connectionTreeModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString()); + var connectionNodeSerializer = new XmlConnectionNodeSerializer27( + _cryptographyProvider, + _connectionTreeModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), + new SaveFilter()); _documentCompiler = new XmlConnectionsDocumentCompiler(_cryptographyProvider, connectionNodeSerializer); } diff --git a/mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentEncryptorTests.cs b/mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentEncryptorTests.cs index 5f485bed..2fc3d9a8 100644 --- a/mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentEncryptorTests.cs +++ b/mRemoteNGTests/Config/Serializers/XmlConnectionsDocumentEncryptorTests.cs @@ -21,7 +21,10 @@ namespace mRemoteNGTests.Config.Serializers { var connectionTreeModel = SetupConnectionTreeModel(); var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.AES, BlockCipherModes.GCM); - var connectionNodeSerializer = new XmlConnectionNodeSerializer27(cryptoProvider, connectionTreeModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString()); + var connectionNodeSerializer = new XmlConnectionNodeSerializer27( + cryptoProvider, + connectionTreeModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), + new SaveFilter()); _originalDocument = new XmlConnectionsDocumentCompiler(cryptoProvider, connectionNodeSerializer).CompileDocument(connectionTreeModel, false); _documentEncryptor = new XmlConnectionsDocumentEncryptor(cryptoProvider); } diff --git a/mRemoteNGTests/Config/Serializers/XmlConnectionsSerializerTests.cs b/mRemoteNGTests/Config/Serializers/XmlConnectionsSerializerTests.cs index 94f6e733..86a5ea48 100644 --- a/mRemoteNGTests/Config/Serializers/XmlConnectionsSerializerTests.cs +++ b/mRemoteNGTests/Config/Serializers/XmlConnectionsSerializerTests.cs @@ -1,5 +1,6 @@ using System.Linq; using System.Xml; +using System.Xml.Linq; using mRemoteNG.Config.Serializers; using mRemoteNG.Connection; using mRemoteNG.Container; @@ -16,15 +17,19 @@ namespace mRemoteNGTests.Config.Serializers { private XmlConnectionsSerializer _serializer; private ConnectionTreeModel _connectionTreeModel; + private ICryptographyProvider _cryptographyProvider; [SetUp] public void Setup() { _connectionTreeModel = SetupConnectionTreeModel(); - var encryptor = new AeadCryptographyProvider(); - var connectionNodeSerializer = new XmlConnectionNodeSerializer27(encryptor, _connectionTreeModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString()); - _serializer = new XmlConnectionsSerializer(encryptor, connectionNodeSerializer); + _cryptographyProvider = new AeadCryptographyProvider(); + var connectionNodeSerializer = new XmlConnectionNodeSerializer27( + _cryptographyProvider, + _connectionTreeModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), + new SaveFilter()); + _serializer = new XmlConnectionsSerializer(_cryptographyProvider, connectionNodeSerializer); } [Test] @@ -48,6 +53,26 @@ namespace mRemoteNGTests.Config.Serializers Assert.That(connectionNode, Is.Not.Null); } + [TestCase("CredentialId", "")] + [TestCase("InheritAutomaticResize", "False")] + public void SerializerRespectsSaveFilterSettings(string attributeName, string expectedValue) + { + var connectionNodeSerializer = new XmlConnectionNodeSerializer27( + _cryptographyProvider, + _connectionTreeModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), + new SaveFilter(true)); + var serializer = new XmlConnectionsSerializer(_cryptographyProvider, connectionNodeSerializer); + var connectionInfo = new ConnectionInfo + { + Name = "myConnection", + 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/mRemoteNGTests/IntegrationTests/XmlSerializationLifeCycleTests.cs b/mRemoteNGTests/IntegrationTests/XmlSerializationLifeCycleTests.cs index 645f6710..5ff13fe0 100644 --- a/mRemoteNGTests/IntegrationTests/XmlSerializationLifeCycleTests.cs +++ b/mRemoteNGTests/IntegrationTests/XmlSerializationLifeCycleTests.cs @@ -22,7 +22,10 @@ namespace mRemoteNGTests.IntegrationTests { _originalModel = SetupConnectionTreeModel(); var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.AES, BlockCipherModes.GCM); - var nodeSerializer = new XmlConnectionNodeSerializer27(cryptoProvider, _originalModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString()); + var nodeSerializer = new XmlConnectionNodeSerializer27( + cryptoProvider, + _originalModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), + new SaveFilter()); _serializer = new XmlConnectionsSerializer(cryptoProvider, nodeSerializer); } @@ -73,7 +76,10 @@ namespace mRemoteNGTests.IntegrationTests { var cryptoProvider = new CryptographyProviderFactory().CreateAeadCryptographyProvider(BlockCipherEngines.AES, BlockCipherModes.GCM); cryptoProvider.KeyDerivationIterations = 5000; - var nodeSerializer = new XmlConnectionNodeSerializer27(cryptoProvider, _originalModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString()); + var nodeSerializer = new XmlConnectionNodeSerializer27( + cryptoProvider, + _originalModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), + new SaveFilter()); _serializer = new XmlConnectionsSerializer(cryptoProvider, nodeSerializer); var serializedContent = _serializer.Serialize(_originalModel); _deserializer = new XmlConnectionsDeserializer(serializedContent, new ICredentialRecord[0]); diff --git a/mRemoteNGTests/UI/Controls/SecureTextBoxTests.cs b/mRemoteNGTests/UI/Controls/SecureTextBoxTests.cs index 4ae5a32d..b3d5da7d 100644 --- a/mRemoteNGTests/UI/Controls/SecureTextBoxTests.cs +++ b/mRemoteNGTests/UI/Controls/SecureTextBoxTests.cs @@ -29,7 +29,7 @@ namespace mRemoteNGTests.UI.Controls var textBox = new SecureTextBoxTester(_testForm.secureTextBox1.Name); const string textToSend = "abc123"; textBox.Properties.Text = textToSend; - Assert.That(textBox.Properties.SecureString.ConvertToUnsecureString(), Is.EqualTo(textToSend)); + Assert.That(textBox.Properties.SecString.ConvertToUnsecureString(), Is.EqualTo(textToSend)); } } } \ No newline at end of file diff --git a/mRemoteNGTests/UI/WindowListTests.cs b/mRemoteNGTests/UI/WindowListTests.cs index 4554966d..398e7f27 100644 --- a/mRemoteNGTests/UI/WindowListTests.cs +++ b/mRemoteNGTests/UI/WindowListTests.cs @@ -1,4 +1,5 @@ using System; +using mRemoteNG.UI; using NUnit.Framework; using mRemoteNG.UI.Window; diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index fcea36a8..69533b39 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -62,12 +62,12 @@ False ..\mRemoteV1\References\log4net.dll - - ..\packages\NSubstitute.1.10.0.0\lib\net45\NSubstitute.dll + + ..\packages\NSubstitute.2.0.2\lib\net45\NSubstitute.dll True - - ..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll + + ..\packages\NUnit.3.6.1\lib\net45\nunit.framework.dll True @@ -113,6 +113,7 @@ + diff --git a/mRemoteNGTests/packages.config b/mRemoteNGTests/packages.config index dae9c3c8..49336542 100644 --- a/mRemoteNGTests/packages.config +++ b/mRemoteNGTests/packages.config @@ -1,9 +1,10 @@  - - - - - - + + + + + + + \ No newline at end of file diff --git a/mRemoteV1.sln b/mRemoteV1.sln index 5ebe3242..7b2713ae 100644 --- a/mRemoteV1.sln +++ b/mRemoteV1.sln @@ -1,8 +1,8 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25123.0 -MinimumVisualStudioVersion = 10.0.40219.1 +# Visual Studio 15 +VisualStudioVersion = 15.0.26228.4 +MinimumVisualStudioVersion = 14.0.25420.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mRemoteV1", "mRemoteV1\mRemoteV1.csproj", "{4934A491-40BC-4E5B-9166-EA1169A220F6}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mRemoteNGTests", "mRemoteNGTests\mRemoteNGTests.csproj", "{1453B37F-8621-499E-B0B2-6091F76DC0BB}" diff --git a/mRemoteV1/App/Export.cs b/mRemoteV1/App/Export.cs index 10e2df27..f7392265 100644 --- a/mRemoteV1/App/Export.cs +++ b/mRemoteV1/App/Export.cs @@ -20,7 +20,7 @@ namespace mRemoteNG.App { try { - var saveSecurity = new SaveFilter(); + var saveFilter = new SaveFilter(); using (var exportForm = new ExportForm()) { @@ -50,18 +50,19 @@ namespace mRemoteNG.App break; } - saveSecurity.SaveUsername = exportForm.IncludeUsername; - saveSecurity.SavePassword = exportForm.IncludePassword; - saveSecurity.SaveDomain = exportForm.IncludeDomain; - saveSecurity.SaveInheritance = exportForm.IncludeInheritance; + saveFilter.SaveUsername = exportForm.IncludeUsername; + saveFilter.SavePassword = exportForm.IncludePassword; + saveFilter.SaveDomain = exportForm.IncludeDomain; + saveFilter.SaveInheritance = exportForm.IncludeInheritance; + saveFilter.SaveCredentialId = exportForm.IncludeAssignedCredential; - SaveExportFile(exportForm.FileName, exportForm.SaveFormat, saveSecurity, exportTarget); + SaveExportFile(exportForm.FileName, exportForm.SaveFormat, saveFilter, exportTarget); } } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage("App.Export.ExportToFile() failed.", ex, logOnly: true); + Runtime.MessageCollector.AddExceptionMessage("App.Export.ExportToFile() failed.", ex); } } @@ -77,17 +78,14 @@ namespace mRemoteNG.App var cryptographyProvider = factory.CreateAeadCryptographyProvider(Settings.Default.EncryptionEngine, Settings.Default.EncryptionBlockCipherMode); cryptographyProvider.KeyDerivationIterations = Settings.Default.EncryptionKeyDerivationIterations; var rootNode = exportTarget.GetRootParent() as RootNodeInfo; - var connectionNodeSerializer = new XmlConnectionNodeSerializer27(cryptographyProvider, rootNode?.PasswordString.ConvertToSecureString() ?? new RootNodeInfo(RootNodeType.Connection).PasswordString.ConvertToSecureString()); - serializer = new XmlConnectionsSerializer(cryptographyProvider, connectionNodeSerializer) - { - SaveFilter = saveFilter - }; + var connectionNodeSerializer = new XmlConnectionNodeSerializer27( + cryptographyProvider, + rootNode?.PasswordString.ConvertToSecureString() ?? new RootNodeInfo(RootNodeType.Connection).PasswordString.ConvertToSecureString(), + saveFilter); + serializer = new XmlConnectionsSerializer(cryptographyProvider, connectionNodeSerializer); break; case ConnectionsSaver.Format.mRCSV: - serializer = new CsvConnectionsSerializerMremotengFormat - { - SaveFilter = saveFilter - }; + serializer = new CsvConnectionsSerializerMremotengFormat(saveFilter); break; default: throw new ArgumentOutOfRangeException(nameof(saveFormat), saveFormat, null); diff --git a/mRemoteV1/App/Import.cs b/mRemoteV1/App/Import.cs index c565bc14..41b259e5 100644 --- a/mRemoteV1/App/Import.cs +++ b/mRemoteV1/App/Import.cs @@ -75,7 +75,7 @@ namespace mRemoteNG.App { MessageBox.Show(string.Format(Language.strImportFileFailedContent, fileName), Language.strImportFileFailedMainInstruction, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1); - Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromFile() failed:1", ex, logOnly: true); + Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromFile() failed:1", ex); } } @@ -84,7 +84,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromFile() failed:2", ex, logOnly: true); + Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromFile() failed:2", ex); } } @@ -97,7 +97,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromActiveDirectory() failed.", ex, logOnly: true); + Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromActiveDirectory() failed.", ex); } } @@ -111,8 +111,7 @@ namespace mRemoteNG.App } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromPortScan() failed.", ex, - logOnly: true); + Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromPortScan() failed.", ex); } } #endregion diff --git a/mRemoteV1/App/Logger.cs b/mRemoteV1/App/Logger.cs index 697c5f59..3413ddd5 100644 --- a/mRemoteV1/App/Logger.cs +++ b/mRemoteV1/App/Logger.cs @@ -54,6 +54,7 @@ namespace mRemoteNG.App var logFilePath = Application.StartupPath; #endif var logFileName = Path.ChangeExtension(Application.ProductName, ".log"); + if (logFileName == null) return "mRemoteNG.log"; var logFile = Path.Combine(logFilePath, logFileName); return logFile; } diff --git a/mRemoteV1/App/NativeMethods.cs b/mRemoteV1/App/NativeMethods.cs index f5425fa8..264cde74 100644 --- a/mRemoteV1/App/NativeMethods.cs +++ b/mRemoteV1/App/NativeMethods.cs @@ -47,10 +47,10 @@ namespace mRemoteNG.App internal static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, StringBuilder lParam); [DllImport("user32.dll", CharSet = CharSet.Unicode)] - public static extern IntPtr SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, string lParam); + internal static extern IntPtr SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, string lParam); [DllImport("user32.dll", CharSet = CharSet.Unicode)] - public static extern IntPtr SendMessage([In] IntPtr hWnd, [In] uint msg, [Out] StringBuilder wParam, [In] IntPtr lParam); + internal static extern IntPtr SendMessage([In] IntPtr hWnd, [In] uint msg, [Out] StringBuilder wParam, [In] IntPtr lParam); [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)] internal static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer); diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 7a2e4f96..6f941e90 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -22,6 +22,7 @@ using mRemoteNG.Credential; using mRemoteNG.Messages.MessageWriters; using mRemoteNG.Security; using mRemoteNG.Security.SymmetricEncryption; +using mRemoteNG.UI; using mRemoteNG.UI.Forms; using mRemoteNG.UI.Forms.Input; using mRemoteNG.UI.TaskDialog; diff --git a/mRemoteV1/App/Update/AppUpdater.cs b/mRemoteV1/App/Update/AppUpdater.cs index 94462bce..38515ad8 100644 --- a/mRemoteV1/App/Update/AppUpdater.cs +++ b/mRemoteV1/App/Update/AppUpdater.cs @@ -272,7 +272,7 @@ namespace mRemoteNG.App.Update throw updateAuthenticode.Exception; } - throw new Exception(updateAuthenticode.StatusMessage); + throw new Exception(updateAuthenticode.GetStatusMessage()); } #endif diff --git a/mRemoteV1/App/Windows.cs b/mRemoteV1/App/Windows.cs index 0fdc9c75..1a9804ee 100644 --- a/mRemoteV1/App/Windows.cs +++ b/mRemoteV1/App/Windows.cs @@ -16,77 +16,87 @@ namespace mRemoteNG.App private static UltraVNCWindow _ultravncscForm; private static ComponentsCheckWindow _componentscheckForm; - public static ConnectionTreeWindow TreeForm { get; set; } = new ConnectionTreeWindow(); - public static ConfigWindow ConfigForm { get; set; } = new ConfigWindow(); - public static ErrorAndInfoWindow ErrorsForm { get; set; } = new ErrorAndInfoWindow(); - public static ScreenshotManagerWindow ScreenshotForm { get; set; } = new ScreenshotManagerWindow(); - public static UpdateWindow UpdateForm { get; set; } = new UpdateWindow(); - public static SSHTransferWindow SshtransferForm { get; set; } - - + internal static ConnectionTreeWindow TreeForm { get; set; } = new ConnectionTreeWindow(); + internal static ConfigWindow ConfigForm { get; set; } = new ConfigWindow(); + internal static ErrorAndInfoWindow ErrorsForm { get; set; } = new ErrorAndInfoWindow(); + internal static ScreenshotManagerWindow ScreenshotForm { get; set; } = new ScreenshotManagerWindow(); + private static UpdateWindow UpdateForm { get; set; } = new UpdateWindow(); + internal static SSHTransferWindow SshtransferForm { get; private set; } = new SSHTransferWindow(); + + + public static void Show(WindowType windowType) { try { - if (windowType.Equals(WindowType.About)) + // ReSharper disable once SwitchStatementMissingSomeCases + switch (windowType) { - if (_aboutForm == null || _aboutForm.IsDisposed) - _aboutForm = new AboutWindow(); - _aboutForm.Show(FrmMain.Default.pnlDock); - } - else if (windowType.Equals(WindowType.ActiveDirectoryImport)) - { - if (_adimportForm == null || _adimportForm.IsDisposed) - _adimportForm = new ActiveDirectoryImportWindow(); - _adimportForm.Show(FrmMain.Default.pnlDock); - } - else if (windowType.Equals(WindowType.Options)) - { - using (var optionsForm = new frmOptions()) - { - optionsForm.ShowDialog(FrmMain.Default.pnlDock); - } - } - else if (windowType.Equals(WindowType.SSHTransfer)) - { - SshtransferForm = new SSHTransferWindow(); - SshtransferForm.Show(FrmMain.Default.pnlDock); - } - else if (windowType.Equals(WindowType.Update)) - { - if (UpdateForm == null || UpdateForm.IsDisposed) - UpdateForm = new UpdateWindow(); - UpdateForm.Show(FrmMain.Default.pnlDock); - } - else if (windowType.Equals(WindowType.Help)) - { - if (_helpForm == null || _helpForm.IsDisposed) - _helpForm = new HelpWindow(); - _helpForm.Show(FrmMain.Default.pnlDock); - } - else if (windowType.Equals(WindowType.ExternalApps)) - { - if (_externalappsForm == null || _externalappsForm.IsDisposed) - _externalappsForm = new ExternalToolsWindow(); - _externalappsForm.Show(FrmMain.Default.pnlDock); - } - else if (windowType.Equals(WindowType.PortScan)) - { - _portscanForm = new PortScanWindow(); - _portscanForm.Show(FrmMain.Default.pnlDock); - } - else if (windowType.Equals(WindowType.UltraVNCSC)) - { - if (_ultravncscForm == null || _ultravncscForm.IsDisposed) - _ultravncscForm = new UltraVNCWindow(); - _ultravncscForm.Show(FrmMain.Default.pnlDock); - } - else if (windowType.Equals(WindowType.ComponentsCheck)) - { - Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "Showing ComponentsCheck window", true); - if (_componentscheckForm == null || _componentscheckForm.IsDisposed) - _componentscheckForm = new ComponentsCheckWindow(); - _componentscheckForm.Show(FrmMain.Default.pnlDock); + case WindowType.About: + if (_aboutForm == null || _aboutForm.IsDisposed) + _aboutForm = new AboutWindow(); + _aboutForm.Show(FrmMain.Default.pnlDock); + break; + case WindowType.ActiveDirectoryImport: + if (_adimportForm == null || _adimportForm.IsDisposed) + _adimportForm = new ActiveDirectoryImportWindow(); + _adimportForm.Show(FrmMain.Default.pnlDock); + break; + case WindowType.Options: + using (var optionsForm = new frmOptions()) + { + optionsForm.ShowDialog(FrmMain.Default.pnlDock); + } + break; + case WindowType.SSHTransfer: + if (SshtransferForm == null || SshtransferForm.IsDisposed) + SshtransferForm = new SSHTransferWindow(); + SshtransferForm.Show(FrmMain.Default.pnlDock); + break; + case WindowType.Update: + if (UpdateForm == null || UpdateForm.IsDisposed) + UpdateForm = new UpdateWindow(); + UpdateForm.Show(FrmMain.Default.pnlDock); + break; + case WindowType.Help: + if (_helpForm == null || _helpForm.IsDisposed) + _helpForm = new HelpWindow(); + _helpForm.Show(FrmMain.Default.pnlDock); + break; + case WindowType.ExternalApps: + if (_externalappsForm == null || _externalappsForm.IsDisposed) + _externalappsForm = new ExternalToolsWindow(); + _externalappsForm.Show(FrmMain.Default.pnlDock); + break; + case WindowType.PortScan: + _portscanForm = new PortScanWindow(); + _portscanForm.Show(FrmMain.Default.pnlDock); + break; + case WindowType.UltraVNCSC: + if (_ultravncscForm == null || _ultravncscForm.IsDisposed) + _ultravncscForm = new UltraVNCWindow(); + _ultravncscForm.Show(FrmMain.Default.pnlDock); + break; + case WindowType.ComponentsCheck: + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "Showing ComponentsCheck window", true); + if (_componentscheckForm == null || _componentscheckForm.IsDisposed) + _componentscheckForm = new ComponentsCheckWindow(); + _componentscheckForm.Show(FrmMain.Default.pnlDock); + break; + /* + case WindowType.Tree: + break; + case WindowType.Connection: + break; + case WindowType.Config: + break; + case WindowType.ErrorsAndInfos: + break; + case WindowType.ScreenshotManager: + break; + default: + throw new ArgumentOutOfRangeException(nameof(windowType), windowType, null); + */ } } catch (Exception ex) diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index cdcf7e19..4904166a 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -243,10 +243,12 @@ namespace mRemoteNG.Config.Connections var factory = new CryptographyProviderFactory(); var cryptographyProvider = factory.CreateAeadCryptographyProvider(mRemoteNG.Settings.Default.EncryptionEngine, mRemoteNG.Settings.Default.EncryptionBlockCipherMode); cryptographyProvider.KeyDerivationIterations = mRemoteNG.Settings.Default.EncryptionKeyDerivationIterations; - var connectionNodeSerializer = new XmlConnectionNodeSerializer27(cryptographyProvider, ConnectionTreeModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString()); + var connectionNodeSerializer = new XmlConnectionNodeSerializer27( + cryptographyProvider, + ConnectionTreeModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), + SaveFilter); var xmlConnectionsSerializer = new XmlConnectionsSerializer(cryptographyProvider, connectionNodeSerializer) { - SaveFilter = SaveFilter, UseFullEncryption = mRemoteNG.Settings.Default.EncryptCompleteConnectionsFile }; var xml = xmlConnectionsSerializer.Serialize(ConnectionTreeModel); @@ -262,7 +264,7 @@ namespace mRemoteNG.Config.Connections private void SaveToMremotengFormattedCsv() { - var csvConnectionsSerializer = new CsvConnectionsSerializerMremotengFormat { SaveFilter = SaveFilter }; + var csvConnectionsSerializer = new CsvConnectionsSerializerMremotengFormat(SaveFilter); var dataProvider = new FileDataProvider(ConnectionFileName); var csvContent = csvConnectionsSerializer.Serialize(ConnectionTreeModel); dataProvider.Save(csvContent); diff --git a/mRemoteV1/Config/Import/ActiveDirectoryImporter.cs b/mRemoteV1/Config/Import/ActiveDirectoryImporter.cs index fb79d1df..ad4cd0fa 100644 --- a/mRemoteV1/Config/Import/ActiveDirectoryImporter.cs +++ b/mRemoteV1/Config/Import/ActiveDirectoryImporter.cs @@ -29,7 +29,7 @@ namespace mRemoteNG.Config.Import } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage("Config.Import.ActiveDirectory.Import() failed.", ex, logOnly: true); + Runtime.MessageCollector.AddExceptionMessage("Config.Import.ActiveDirectory.Import() failed.", ex); } } } diff --git a/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs b/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs index a365e916..3d04ef90 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs @@ -101,7 +101,7 @@ namespace mRemoteNG.Config.Putty } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage("PuttySessions.Watcher.StartWatching() failed.", ex, MessageClass.WarningMsg, true); + Runtime.MessageCollector.AddExceptionMessage("PuttySessions.Watcher.StartWatching() failed.", ex, MessageClass.WarningMsg); } } diff --git a/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs index b969ef48..87cb5d2f 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs @@ -147,7 +147,7 @@ namespace mRemoteNG.Config.Putty } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage("XmingPortablePuttySessions.Watcher.StartWatching() failed.", ex, MessageClass.WarningMsg, true); + Runtime.MessageCollector.AddExceptionMessage("XmingPortablePuttySessions.Watcher.StartWatching() failed.", ex, MessageClass.WarningMsg); } } @@ -267,7 +267,7 @@ namespace mRemoteNG.Config.Putty } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage("PuttyConfFileReader.LoadConfiguration() failed.", ex, MessageClass.ErrorMsg, true); + Runtime.MessageCollector.AddExceptionMessage("PuttyConfFileReader.LoadConfiguration() failed.", ex); } } @@ -322,7 +322,7 @@ namespace mRemoteNG.Config.Putty } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage("SessionFileReader.LoadSessionInfo() failed.", ex, MessageClass.ErrorMsg, true); + Runtime.MessageCollector.AddExceptionMessage("SessionFileReader.LoadSessionInfo() failed.", ex); } } diff --git a/mRemoteV1/Config/Serializers/ConnectionSerializers/XmlConnectionNodeSerializer26.cs b/mRemoteV1/Config/Serializers/ConnectionSerializers/XmlConnectionNodeSerializer26.cs index 7fc8972d..2c693800 100644 --- a/mRemoteV1/Config/Serializers/ConnectionSerializers/XmlConnectionNodeSerializer26.cs +++ b/mRemoteV1/Config/Serializers/ConnectionSerializers/XmlConnectionNodeSerializer26.cs @@ -14,16 +14,17 @@ namespace mRemoteNG.Config.Serializers { private readonly ICryptographyProvider _cryptographyProvider; private readonly SecureString _encryptionKey; - private readonly SaveFilter _saveFilter = new SaveFilter(); - - public XmlConnectionNodeSerializer26(ICryptographyProvider cryptographyProvider, SecureString encryptionKey) - { - _cryptographyProvider = cryptographyProvider; - _encryptionKey = encryptionKey; - } + private readonly SaveFilter _saveFilter; public XmlConnectionNodeSerializer26(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/ConnectionSerializers/XmlConnectionNodeSerializer27.cs b/mRemoteV1/Config/Serializers/ConnectionSerializers/XmlConnectionNodeSerializer27.cs index 0d1b850c..142cc96e 100644 --- a/mRemoteV1/Config/Serializers/ConnectionSerializers/XmlConnectionNodeSerializer27.cs +++ b/mRemoteV1/Config/Serializers/ConnectionSerializers/XmlConnectionNodeSerializer27.cs @@ -11,13 +11,8 @@ namespace mRemoteNG.Config.Serializers { private readonly ICryptographyProvider _cryptographyProvider; private readonly SecureString _encryptionKey; - private readonly SaveFilter _saveFilter = new SaveFilter(); + private readonly SaveFilter _saveFilter; - public XmlConnectionNodeSerializer27(ICryptographyProvider cryptographyProvider, SecureString encryptionKey) - { - _cryptographyProvider = cryptographyProvider; - _encryptionKey = encryptionKey; - } public XmlConnectionNodeSerializer27(ICryptographyProvider cryptographyProvider, SecureString encryptionKey, SaveFilter saveFilter) { @@ -46,7 +41,9 @@ namespace mRemoteNG.Config.Serializers element.Add(new XAttribute("Panel", connectionInfo.Panel)); element.Add(new XAttribute("Id", connectionInfo.ConstantID)); - element.Add(new XAttribute("CredentialId", connectionInfo.CredentialRecord?.Id.ToString() ?? "")); + element.Add(_saveFilter.SaveCredentialId + ? new XAttribute("CredentialId", connectionInfo.CredentialRecord?.Id.ToString() ?? "") + : new XAttribute("CredentialId", "")); element.Add(new XAttribute("Hostname", connectionInfo.Hostname)); element.Add(new XAttribute("Protocol", connectionInfo.Protocol)); diff --git a/mRemoteV1/Config/Serializers/ConnectionSerializers/XmlConnectionsDocumentCompiler.cs b/mRemoteV1/Config/Serializers/ConnectionSerializers/XmlConnectionsDocumentCompiler.cs index 7a942fa1..d640d49d 100644 --- a/mRemoteV1/Config/Serializers/ConnectionSerializers/XmlConnectionsDocumentCompiler.cs +++ b/mRemoteV1/Config/Serializers/ConnectionSerializers/XmlConnectionsDocumentCompiler.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Security; using System.Xml.Linq; using mRemoteNG.Connection; @@ -18,6 +19,11 @@ namespace mRemoteNG.Config.Serializers public XmlConnectionsDocumentCompiler(ICryptographyProvider cryptographyProvider, ISerializer connectionNodeSerializer) { + if (cryptographyProvider == null) + throw new ArgumentNullException(nameof(cryptographyProvider)); + if (connectionNodeSerializer == null) + throw new ArgumentNullException(nameof(connectionNodeSerializer)); + _cryptographyProvider = cryptographyProvider; _connectionNodeSerializer = connectionNodeSerializer; } diff --git a/mRemoteV1/Config/Serializers/ConnectionSerializers/XmlConnectionsSerializer.cs b/mRemoteV1/Config/Serializers/ConnectionSerializers/XmlConnectionsSerializer.cs index 32cc7cf5..80298edc 100644 --- a/mRemoteV1/Config/Serializers/ConnectionSerializers/XmlConnectionsSerializer.cs +++ b/mRemoteV1/Config/Serializers/ConnectionSerializers/XmlConnectionsSerializer.cs @@ -17,7 +17,6 @@ namespace mRemoteNG.Config.Serializers private readonly ICryptographyProvider _cryptographyProvider; private readonly ISerializer _connectionNodeSerializer; - public SaveFilter SaveFilter { get; set; } = new SaveFilter(); public bool UseFullEncryption { get; set; } public XmlConnectionsSerializer(ICryptographyProvider cryptographyProvider, ISerializer connectionNodeSerializer) diff --git a/mRemoteV1/Config/Serializers/MiscSerializers/ActiveDirectoryDeserializer.cs b/mRemoteV1/Config/Serializers/MiscSerializers/ActiveDirectoryDeserializer.cs index f34b93bd..986eb02b 100644 --- a/mRemoteV1/Config/Serializers/MiscSerializers/ActiveDirectoryDeserializer.cs +++ b/mRemoteV1/Config/Serializers/MiscSerializers/ActiveDirectoryDeserializer.cs @@ -77,7 +77,7 @@ namespace mRemoteNG.Config.Serializers } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage("Config.Import.ActiveDirectory.ImportComputers() failed.", ex, logOnly: true); + Runtime.MessageCollector.AddExceptionMessage("Config.Import.ActiveDirectory.ImportComputers() failed.", ex); } } diff --git a/mRemoteV1/Config/Serializers/MiscSerializers/CsvConnectionsSerializerMremotengFormat.cs b/mRemoteV1/Config/Serializers/MiscSerializers/CsvConnectionsSerializerMremotengFormat.cs index efd7207b..b9f070dd 100644 --- a/mRemoteV1/Config/Serializers/MiscSerializers/CsvConnectionsSerializerMremotengFormat.cs +++ b/mRemoteV1/Config/Serializers/MiscSerializers/CsvConnectionsSerializerMremotengFormat.cs @@ -12,17 +12,30 @@ namespace mRemoteNG.Config.Serializers { private string _csv = ""; private ConnectionInfo _serializationTarget; + private readonly SaveFilter _saveFilter; - public SaveFilter SaveFilter { get; set; } + + public CsvConnectionsSerializerMremotengFormat(SaveFilter saveFilter) + { + if (saveFilter == null) + throw new ArgumentNullException(nameof(saveFilter)); + _saveFilter = saveFilter; + } public string Serialize(ConnectionTreeModel connectionTreeModel) { + if (connectionTreeModel == null) + throw new ArgumentNullException(nameof(connectionTreeModel)); + var rootNode = connectionTreeModel.RootNodes.First(node => node is RootNodeInfo); return Serialize(rootNode); } public string Serialize(ConnectionInfo serializationTarget) { + if (serializationTarget == null) + throw new ArgumentNullException(nameof(serializationTarget)); + _csv = ""; _serializationTarget = serializationTarget; WriteCsvHeader(); @@ -34,14 +47,14 @@ namespace mRemoteNG.Config.Serializers { var csvHeader = string.Empty; csvHeader += "Name;Folder;Description;Icon;Panel;"; - if (SaveFilter.SaveUsername) + if (_saveFilter.SaveUsername) csvHeader += "Username;"; - if (SaveFilter.SavePassword) + if (_saveFilter.SavePassword) csvHeader += "Password;"; - if (SaveFilter.SaveDomain) + if (_saveFilter.SaveDomain) csvHeader += "Domain;"; csvHeader += "Hostname;Protocol;PuttySession;Port;ConnectToConsole;UseCredSsp;RenderingEngine;ICAEncryptionStrength;RDPAuthenticationLevel;LoadBalanceInfo;Colors;Resolution;AutomaticResize;DisplayWallpaper;DisplayThemes;EnableFontSmoothing;EnableDesktopComposition;CacheBitmaps;RedirectDiskDrives;RedirectPorts;RedirectPrinters;RedirectSmartCards;RedirectSound;RedirectKeys;PreExtApp;PostExtApp;MacAddress;UserField;ExtApp;VNCCompression;VNCEncoding;VNCAuthMode;VNCProxyType;VNCProxyIP;VNCProxyPort;VNCProxyUsername;VNCProxyPassword;VNCColors;VNCSmartSizeMode;VNCViewOnly;RDGatewayUsageMethod;RDGatewayHostname;RDGatewayUseConnectionCredentials;RDGatewayUsername;RDGatewayPassword;RDGatewayDomain;"; - if (SaveFilter.SaveInheritance) + if (_saveFilter.SaveInheritance) csvHeader += "InheritCacheBitmaps;InheritColors;InheritDescription;InheritDisplayThemes;InheritDisplayWallpaper;InheritEnableFontSmoothing;InheritEnableDesktopComposition;InheritDomain;InheritIcon;InheritPanel;InheritPassword;InheritPort;InheritProtocol;InheritPuttySession;InheritRedirectDiskDrives;InheritRedirectKeys;InheritRedirectPorts;InheritRedirectPrinters;InheritRedirectSmartCards;InheritRedirectSound;InheritResolution;InheritAutomaticResize;InheritUseConsoleSession;InheritUseCredSsp;InheritRenderingEngine;InheritUsername;InheritICAEncryptionStrength;InheritRDPAuthenticationLevel;InheritLoadBalanceInfo;InheritPreExtApp;InheritPostExtApp;InheritMacAddress;InheritUserField;InheritExtApp;InheritVNCCompression;InheritVNCEncoding;InheritVNCAuthMode;InheritVNCProxyType;InheritVNCProxyIP;InheritVNCProxyPort;InheritVNCProxyUsername;InheritVNCProxyPassword;InheritVNCColors;InheritVNCSmartSizeMode;InheritVNCViewOnly;InheritRDGatewayUsageMethod;InheritRDGatewayHostname;InheritRDGatewayUseConnectionCredentials;InheritRDGatewayUsername;InheritRDGatewayPassword;InheritRDGatewayDomain"; _csv += csvHeader; } @@ -70,18 +83,64 @@ namespace mRemoteNG.Config.Serializers csvLine += con.Name + ";" + GetNodePath(con) + ";" + con.Description + ";" + con.Icon + ";" + con.Panel + ";"; - if (SaveFilter.SaveUsername) - csvLine += con.Username + ";"; + if (_saveFilter.SaveUsername) + csvLine += con.CredentialRecord?.Username + ";"; - if (SaveFilter.SavePassword) - csvLine += con.Password + ";"; + if (_saveFilter.SavePassword) + csvLine += con.CredentialRecord?.Password.ConvertToUnsecureString() + ";"; - if (SaveFilter.SaveDomain) - csvLine += con.Domain + ";"; + if (_saveFilter.SaveDomain) + csvLine += con.CredentialRecord?.Domain + ";"; - csvLine += con.Hostname + ";" + con.Protocol + ";" + con.PuttySession + ";" + Convert.ToString(con.Port) + ";" + Convert.ToString(con.UseConsoleSession) + ";" + Convert.ToString(con.UseCredSsp) + ";" + con.RenderingEngine + ";" + con.ICAEncryptionStrength + ";" + con.RDPAuthenticationLevel + ";" + con.LoadBalanceInfo + ";" + con.Colors + ";" + con.Resolution + ";" + Convert.ToString(con.AutomaticResize) + ";" + Convert.ToString(con.DisplayWallpaper) + ";" + Convert.ToString(con.DisplayThemes) + ";" + Convert.ToString(con.EnableFontSmoothing) + ";" + Convert.ToString(con.EnableDesktopComposition) + ";" + Convert.ToString(con.CacheBitmaps) + ";" + Convert.ToString(con.RedirectDiskDrives) + ";" + Convert.ToString(con.RedirectPorts) + ";" + Convert.ToString(con.RedirectPrinters) + ";" + Convert.ToString(con.RedirectSmartCards) + ";" + con.RedirectSound + ";" + Convert.ToString(con.RedirectKeys) + ";" + con.PreExtApp + ";" + con.PostExtApp + ";" + con.MacAddress + ";" + con.UserField + ";" + con.ExtApp + ";" + con.VNCCompression + ";" + con.VNCEncoding + ";" + con.VNCAuthMode + ";" + con.VNCProxyType + ";" + con.VNCProxyIP + ";" + Convert.ToString(con.VNCProxyPort) + ";" + con.VNCProxyUsername + ";" + con.VNCProxyPassword + ";" + con.VNCColors + ";" + con.VNCSmartSizeMode + ";" + Convert.ToString(con.VNCViewOnly) + ";"; + csvLine += con.Hostname + ";" + + con.Protocol + ";" + + con.PuttySession + ";" + + Convert.ToString(con.Port) + ";" + + Convert.ToString(con.UseConsoleSession) + ";" + + Convert.ToString(con.UseCredSsp) + ";" + + con.RenderingEngine + ";" + + con.ICAEncryptionStrength + ";" + + con.RDPAuthenticationLevel + ";" + + con.LoadBalanceInfo + ";" + + con.Colors + ";" + + con.Resolution + ";" + + Convert.ToString(con.AutomaticResize) + ";" + + Convert.ToString(con.DisplayWallpaper) + ";" + + Convert.ToString(con.DisplayThemes) + ";" + + Convert.ToString(con.EnableFontSmoothing) + ";" + + Convert.ToString(con.EnableDesktopComposition) + ";" + + Convert.ToString(con.CacheBitmaps) + ";" + + Convert.ToString(con.RedirectDiskDrives) + ";" + + Convert.ToString(con.RedirectPorts) + ";" + + Convert.ToString(con.RedirectPrinters) + ";" + + Convert.ToString(con.RedirectSmartCards) + ";" + + con.RedirectSound + ";" + + Convert.ToString(con.RedirectKeys) + ";" + + con.PreExtApp + ";" + + con.PostExtApp + ";" + + con.MacAddress + ";" + + con.UserField + ";" + + con.ExtApp + ";" + + con.VNCCompression + ";" + + con.VNCEncoding + ";" + + con.VNCAuthMode + ";" + + con.VNCProxyType + ";" + + con.VNCProxyIP + ";" + + Convert.ToString(con.VNCProxyPort) + ";" + + con.VNCProxyUsername + ";" + + con.VNCProxyPassword + ";" + + con.VNCColors + ";" + + con.VNCSmartSizeMode + ";" + + Convert.ToString(con.VNCViewOnly) + ";" + + con.RDGatewayUsageMethod + ";" + + con.RDGatewayHostname + ";" + + con.RDGatewayUseConnectionCredentials + ";" + + con.RDGatewayUsername + ";" + + con.RDGatewayPassword + ";" + + con.RDGatewayDomain + ";"; - if (SaveFilter.SaveInheritance) + + if (_saveFilter.SaveInheritance) { csvLine += con.Inheritance.CacheBitmaps + ";" + con.Inheritance.Colors + ";" + @@ -127,7 +186,13 @@ namespace mRemoteNG.Config.Serializers con.Inheritance.VNCProxyPassword + ";" + con.Inheritance.VNCColors + ";" + con.Inheritance.VNCSmartSizeMode + ";" + - con.Inheritance.VNCViewOnly; + con.Inheritance.VNCViewOnly + + con.Inheritance.RDGatewayUsageMethod + ";" + + con.Inheritance.RDGatewayHostname + ";" + + con.Inheritance.RDGatewayUseConnectionCredentials + ";" + + con.Inheritance.RDGatewayUsername + ";" + + con.Inheritance.RDGatewayPassword + ";" + + con.Inheritance.RDGatewayDomain + ";"; } _csv += csvLine; @@ -137,6 +202,7 @@ namespace mRemoteNG.Config.Serializers { var nodePath = ""; var container = connectionInfo.Parent; + if (container == null) return nodePath; while (container != _serializationTarget) { container = container.Parent; diff --git a/mRemoteV1/Connection/Protocol/Http/Connection.Protocol.HTTP.cs b/mRemoteV1/Connection/Protocol/Http/Connection.Protocol.HTTP.cs index 5c87f26e..cbdaca2f 100644 --- a/mRemoteV1/Connection/Protocol/Http/Connection.Protocol.HTTP.cs +++ b/mRemoteV1/Connection/Protocol/Http/Connection.Protocol.HTTP.cs @@ -5,15 +5,9 @@ namespace mRemoteNG.Connection.Protocol.Http public ProtocolHTTP(RenderingEngine RenderingEngine) : base(RenderingEngine) { - } - - public override void NewExtended() - { - base.NewExtended(); - - httpOrS = "http"; - defaultPort = (int)Defaults.Port; - } + httpOrS = "http"; + defaultPort = (int)Defaults.Port; + } public enum Defaults { diff --git a/mRemoteV1/Connection/Protocol/Http/Connection.Protocol.HTTPBase.cs b/mRemoteV1/Connection/Protocol/Http/Connection.Protocol.HTTPBase.cs index 78362d5a..75206bac 100644 --- a/mRemoteV1/Connection/Protocol/Http/Connection.Protocol.HTTPBase.cs +++ b/mRemoteV1/Connection/Protocol/Http/Connection.Protocol.HTTPBase.cs @@ -5,21 +5,20 @@ using mRemoteNG.Tools; using mRemoteNG.App; using TabPage = Crownwood.Magic.Controls.TabPage; -//using SHDocVw; - namespace mRemoteNG.Connection.Protocol.Http { public class HTTPBase : ProtocolBase { #region Private Properties private Control wBrowser; - public string httpOrS; - public int defaultPort; + protected string httpOrS; + protected int defaultPort; private string tabTitle; #endregion #region Public Methods - public HTTPBase(RenderingEngine RenderingEngine) + + protected HTTPBase(RenderingEngine RenderingEngine) { try { @@ -34,18 +33,12 @@ namespace mRemoteNG.Connection.Protocol.Http { Control = new WebBrowser(); } - - NewExtended(); } catch (Exception ex) { Runtime.MessageCollector.AddExceptionStackTrace(Language.strHttpConnectionFailed, ex); } } - - public virtual void NewExtended() - { - } public override bool Initialize() { @@ -71,13 +64,16 @@ namespace mRemoteNG.Connection.Protocol.Http if (GeckoBrowser != null) { GeckoBrowser.DocumentTitleChanged += geckoBrowser_DocumentTitleChanged; - //GeckoBrowser.Tab.LastTabRemoved += wBrowser_LastTabRemoved; + GeckoBrowser.NSSError += CertEvent.GeckoBrowser_NSSError; + } + else + { + throw new Exception("Failed to initialize Gecko Rendering Engine."); } } else { var objWebBrowser = (WebBrowser)wBrowser; - //SHDocVw.WebBrowserClass objAxWebBrowser = (SHDocVw.WebBrowserClass)objWebBrowser.ActiveXInstance; objWebBrowser.ScrollBarsEnabled = true; // http://stackoverflow.com/questions/4655662/how-to-ignore-script-errors-in-webbrowser @@ -85,8 +81,6 @@ namespace mRemoteNG.Connection.Protocol.Http objWebBrowser.Navigated += wBrowser_Navigated; objWebBrowser.DocumentTitleChanged += wBrowser_DocumentTitleChanged; - //objWebBrowser.NewWindow3 += wBrowser_NewWindow3; - //objAxWebBrowser.NewWindow3 += wBrowser_NewWindow3; } return true; @@ -178,24 +172,6 @@ namespace mRemoteNG.Connection.Protocol.Http objWebBrowser.Navigated -= wBrowser_Navigated; } -#if false - private void wBrowser_NewWindow3(ref object ppDisp, ref bool Cancel, uint dwFlags, string bstrUrlContext, string bstrUrl) - { - if ((dwFlags & (long)NWMF.NWMF_OVERRIDEKEY) > 0) - { - Cancel = false; - } - else - { - Cancel = true; - } - } - - private void wBrowser_LastTabRemoved(object sender) - { - Close(); - } -#endif private void wBrowser_DocumentTitleChanged(object sender, EventArgs e) { try @@ -301,27 +277,6 @@ namespace mRemoteNG.Connection.Protocol.Http Gecko = 2 } -#if false - private enum NWMF - { - // ReSharper disable InconsistentNaming - NWMF_UNLOADING = 0x1, - NWMF_USERINITED = 0x2, - NWMF_FIRST = 0x4, - NWMF_OVERRIDEKEY = 0x8, - NWMF_SHOWHELP = 0x10, - NWMF_HTMLDIALOG = 0x20, - NWMF_FROMDIALOGCHILD = 0x40, - NWMF_USERREQUESTED = 0x80, - NWMF_USERALLOWED = 0x100, - NWMF_FORCEWINDOW = 0x10000, - NWMF_FORCETAB = 0x20000, - NWMF_SUGGESTWINDOW = 0x40000, - NWMF_SUGGESTTAB = 0x80000, - NWMF_INACTIVETAB = 0x100000 - // ReSharper restore InconsistentNaming - } -#endif #endregion } } diff --git a/mRemoteV1/Connection/Protocol/Http/Connection.Protocol.HTTPS.CertEvent.cs b/mRemoteV1/Connection/Protocol/Http/Connection.Protocol.HTTPS.CertEvent.cs new file mode 100644 index 00000000..086d8b49 --- /dev/null +++ b/mRemoteV1/Connection/Protocol/Http/Connection.Protocol.HTTPS.CertEvent.cs @@ -0,0 +1,74 @@ +using Gecko; +using Gecko.Events; +using mRemoteNG.App; +using mRemoteNG.App.Info; +using mRemoteNG.Messages; +using mRemoteNG.UI.TaskDialog; +// ReSharper disable RedundantAssignment + +namespace mRemoteNG.Connection.Protocol.Http +{ + internal abstract class CertEvent + { + //Refernce: https://bitbucket.org/geckofx/geckofx-33.0/issues/90/invalid-security-certificate-error-on + internal static void GeckoBrowser_NSSError(object sender, GeckoNSSErrorEventArgs e) + { + /* some messages say "Certificate", some say "certificate" + * I'm guessing that this is going to be a localization issue... + * Log a message so we can try to find a better solution if problems are reported in the future... + */ + if (!e.Message.ToLower().Contains("certificate")) + { + Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, $"Unhandled NSSError: {e.Message}"); + e.Handled = false; + return; + } + + string[] commandButtons = + { + Language.strHttpsInsecureAllowOnce, // 0 + Language.strHttpsInsecureAllowAlways, // 1 + Language.strHttpsInsecureDontAllow // 2 + }; + + CTaskDialog.ShowTaskDialogBox(null, GeneralAppInfo.ProductName, Language.strHttpsInsecurePromptTitle, + string.Format(Language.strHttpsInsecurePrompt, e.Uri.AbsoluteUri), "", "", "", "", + string.Join(" | ", commandButtons), ETaskDialogButtons.None, ESysIcons.Question, ESysIcons.Question); + + var allow = false; + var temporary = true; + // ReSharper disable once SwitchStatementMissingSomeCases + switch (CTaskDialog.CommandButtonResult) + { + case 0: + allow = true; + temporary = true; + break; + case 1: + allow = true; + temporary = false; + break; + case 2: + allow = false; + temporary = true; // just to be safe + break; + } + + if (!allow) + { + Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, $"User did not allow navigation to {e.Uri.AbsoluteUri} with an insecure certificate: {e.Message}"); + return; + } + + /* "temporary == false" (aka always) might not work: + * https://bitbucket.org/geckofx/geckofx-45.0/issues/152/remembervalidityoverride-doesnt-save-in + * However, my testing was successful in Gecko 45.0.22 + */ + CertOverrideService.GetService().RememberValidityOverride(e.Uri, e.Certificate, + CertOverride.Mismatch | CertOverride.Time | CertOverride.Untrusted, temporary); + + e.Handled = true; + ((GeckoWebBrowser)sender).Navigate(e.Uri.AbsoluteUri); + } + } +} diff --git a/mRemoteV1/Connection/Protocol/Http/Connection.Protocol.HTTPS.cs b/mRemoteV1/Connection/Protocol/Http/Connection.Protocol.HTTPS.cs index a8cff0f1..08f28a92 100644 --- a/mRemoteV1/Connection/Protocol/Http/Connection.Protocol.HTTPS.cs +++ b/mRemoteV1/Connection/Protocol/Http/Connection.Protocol.HTTPS.cs @@ -5,14 +5,9 @@ namespace mRemoteNG.Connection.Protocol.Http public ProtocolHTTPS(RenderingEngine RenderingEngine) : base(RenderingEngine) { - } - - public override void NewExtended() - { - base.NewExtended(); - httpOrS = "https"; - defaultPort = (int)Defaults.Port; - } + httpOrS = "https"; + defaultPort = (int)Defaults.Port; + } public enum Defaults { diff --git a/mRemoteV1/Messages/Message.cs b/mRemoteV1/Messages/Message.cs index 66d1caff..d70a8f34 100644 --- a/mRemoteV1/Messages/Message.cs +++ b/mRemoteV1/Messages/Message.cs @@ -12,7 +12,7 @@ namespace mRemoteNG.Messages public Message() - : this(MessageClass.InformationMsg, "", false) + : this(MessageClass.InformationMsg, "") { } diff --git a/mRemoteV1/Properties/AssemblyInfo.cs b/mRemoteV1/Properties/AssemblyInfo.cs index f5dfcd13..e149ed4c 100644 --- a/mRemoteV1/Properties/AssemblyInfo.cs +++ b/mRemoteV1/Properties/AssemblyInfo.cs @@ -33,6 +33,5 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // -[assembly: AssemblyVersion("1.76.*")] - +[assembly: AssemblyVersion("1.76.0.*")] [assembly: NeutralResourcesLanguage("en")] \ No newline at end of file diff --git a/mRemoteV1/Properties/Settings.Designer.cs b/mRemoteV1/Properties/Settings.Designer.cs index c2e8ee05..108bd919 100644 --- a/mRemoteV1/Properties/Settings.Designer.cs +++ b/mRemoteV1/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace mRemoteNG { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.0.1.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -1811,16 +1811,6 @@ namespace mRemoteNG { } } - [global::System.Configuration.ApplicationScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("de,el,en,en-US,es-AR,es,fr,hu,it,ja-JP,nb-NO,nl,pt,pt-BR,pl,ru,uk,tr-TR,zh-CN,zh-" + - "TW")] - public string SupportedUICultures { - get { - return ((string)(this["SupportedUICultures"])); - } - } - [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] @@ -2530,5 +2520,15 @@ namespace mRemoteNG { this["LogToApplicationDirectory"] = value; } } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("cs-CZ,de,el,en,en-US,es-AR,es,fr,hu,it,ja-JP,nb-NO,nl,pt,pt-BR,pl,ru,uk,tr-TR,zh-" + + "CN,zh-TW")] + public string SupportedUICultures { + get { + return ((string)(this["SupportedUICultures"])); + } + } } } diff --git a/mRemoteV1/Properties/Settings.settings b/mRemoteV1/Properties/Settings.settings index 12db6739..b7ee277d 100644 --- a/mRemoteV1/Properties/Settings.settings +++ b/mRemoteV1/Properties/Settings.settings @@ -449,9 +449,6 @@ - - de,el,en,en-US,es-AR,es,fr,hu,it,ja-JP,nb-NO,nl,pt,pt-BR,pl,ru,uk,tr-TR,zh-CN,zh-TW - @@ -629,5 +626,8 @@ True + + cs-CZ,de,el,en,en-US,es-AR,es,fr,hu,it,ja-JP,nb-NO,nl,pt,pt-BR,pl,ru,uk,tr-TR,zh-CN,zh-TW + \ No newline at end of file diff --git a/mRemoteV1/References/log4net.dll b/mRemoteV1/References/log4net.dll deleted file mode 100644 index 9a653d6c..00000000 Binary files a/mRemoteV1/References/log4net.dll and /dev/null differ diff --git a/mRemoteV1/Resources/Language/Language.Designer.cs b/mRemoteV1/Resources/Language/Language.Designer.cs index aef88f01..2b6403ae 100644 --- a/mRemoteV1/Resources/Language/Language.Designer.cs +++ b/mRemoteV1/Resources/Language/Language.Designer.cs @@ -258,6 +258,15 @@ namespace mRemoteNG { } } + /// + /// Looks up a localized string similar to Assigned Credential. + /// + internal static string strAssignedCredential { + get { + return ResourceManager.GetString("strAssignedCredential", resourceCulture); + } + } + /// /// Looks up a localized string similar to Automatically get session information. /// @@ -2190,6 +2199,51 @@ namespace mRemoteNG { } } + /// + /// Looks up a localized string similar to Allow Always. + /// + internal static string strHttpsInsecureAllowAlways { + get { + return ResourceManager.GetString("strHttpsInsecureAllowAlways", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Allow Once. + /// + internal static string strHttpsInsecureAllowOnce { + get { + return ResourceManager.GetString("strHttpsInsecureAllowOnce", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Don't Allow. + /// + internal static string strHttpsInsecureDontAllow { + get { + return ResourceManager.GetString("strHttpsInsecureDontAllow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Allow Insecure Certificate for URL: {0}?. + /// + internal static string strHttpsInsecurePrompt { + get { + return ResourceManager.GetString("strHttpsInsecurePrompt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Allow Insecure Certificate?. + /// + internal static string strHttpsInsecurePromptTitle { + get { + return ResourceManager.GetString("strHttpsInsecurePromptTitle", resourceCulture); + } + } + /// /// Looks up a localized string similar to ICA. /// diff --git a/mRemoteV1/Resources/Language/Language.cs-CZ.resx b/mRemoteV1/Resources/Language/Language.cs-CZ.resx new file mode 100644 index 00000000..2fa5236a --- /dev/null +++ b/mRemoteV1/Resources/Language/Language.cs-CZ.resx @@ -0,0 +1,2523 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + O Aplikaci + + + Aktuální + + + Aktuální složka + + + Aktivita + + + Nové připojení + + + Nová složka + + + Operace přidání uzlu (AddNodeFromXML) selhala! + + + Operace přidání uzlu (AddNodesFromSQL) selhala! + + + Umožnit spuštění jen jedné instance aplikace (bude potřeba restartovat mRemoteNG) + + + Vždy + + + Vždy připojit, i když autentizace selže + + + Při navázání spojení vždy nabídnout výběr panelu + + + Vždy zobrazovat záložky (taby) panelů + + + Vždy zobrazit notifikační ikonu + + + Zeptat se na nastavení později + + + Upravit nastavení teď + + + Použít doporučená nastavení + + + {0} může automaticky hledat aktualizace, které mohou obsahovat nové funkce a opravy chyb. Doporučuje se, abyste dovolili {0} hledat aktualizace každý týden. + + + Natavení automatických aktualizací + + + Poměr stran + + + Automaticky získat informace o sezení + + + Automaticky ukládat každých: + + + Minut(y) (0 = vypnuto) + + + Poslední verze + + + &Procházet... + + + &Storno + + + Změnit + + + &Zavřít + + + Výchozí převezetí z nadřízené + + + Výchozí vlastnosti + + + Odpojit + + + Ikona + + + &Importovat + + + Z nadřazené + + + &Spustit + + + Spustit PuTTY + + + &Nový + + + &OK + + + Vlastnosti + + + &Scanovat + + + &Stop + + + Test Proxy + + + Hlavní soubor s nastavenými spojeními nelze importovat. You cannot import a normal connection file. +Prosím použijte Soubor - Otevřít seznam spojení... pro načtení souboru s nastavením spojení! + + + Nelze scanovat porty, IP adresa má nesprávný tvar! + + + Vzhled + + + Spojení + + + Autentizace + + + Zobrazení + + + Brána + + + Všeobecné + + + Různé + + + Protokol + + + Přesměrování + + + Vždy zobrazit tento dialog při startu + + + Obnovit + + + Kontrola selhala! + + + Kontrola úspěšná! + + + Funckionalita pro (RDP) sezení vyžaduje, abyste měli ve Vašem systému zaregistrovánu knihovnu eolwtscom.dll . +mRemoteNG je sice s touto komponentou dodáváno, avšak pokud jej nenainstalujete s pomocí Instalátoru, není knihovna automaticky zaregistrována. +Pro provedení registrace ručně spusťe následující příkaz v konzoli příkazového řádku (Start->Spustit->cmd) v administrátorském režimu(!) : regsvr32 "C:\Program Files\mRemoteNG\eolwtscom.dll" (kde C:\Program Files\mRemoteNG\ is je cesta ke složce Vaší kopie mRemoteNG ). +Pokud tato kontrola stále selhává nebo nejste schopni používat funkcionalitu RDP v mRemoteNG, prosím obraťte se na diskuzní fórum mRemoteNG na adrese http://forum.mremoteng.org/. + + + Knihovna EOLWTSCOM byla nalezena a zdá se, že je správně zaregistrována. + + + Pro využití Gecko Rendering Engine musíte mít nainstalovaný XULrunner 1.8.1.x a nastavenou cestu k jeho instalační složce v Možnostech Nastavení. +XULrunner 1.8.1.3 lze stáhnout zde: ftp://ftp.mozilla.org/pub/xulrunner/releases/1.8.1.3/contrib/win32/ +Až jej stáhnete, rozbalte balíček do libovolné složky. Pak zvolte v mRemoteNG menu Nástroje -> Možnosti -> Pokročilé a zadejte cestu do políčka "Cesta ke složce XULrunner". +Pokud tato kontrola stále selhává nebo nejste schopni používat funkcionalitu Gecko rendering Engine v mRemoteNG, prosím obraťte se na diskuzní fórum mRemoteNG na adrese http://forum.mremoteng.org/. + + + GeckoFx byla nalezena a zdá se, že je správně nainstalována. + + + Funkcionalita ICA vyžaduje, aby byl nainstalován XenDesktop Online Plugin a knihovna wfica.ocx byla zaregistrována. Klienta můžete stáhnout zde: http://www.citrix.com/download/ +Pokud máte XenDesktop Online Plugin nainstalován a kontrola stále selhává, pokuste se zaregistrovat wfica.ocx ručně. +K tomu otevřete dialog "Spustit" (Start->Spustit) a zadejte následující text: regsvr32 "c:\Program Files\Citrix\ICA Client\wfica.ocx" (kde c:\Program Files\Citrix\ICA Client\ je cesta ke složce s Vaší instalací XenDesktop Online Plugin). +Pokud tato kontrola stále selhává nebo nejste schopni používat funkcionalitu ICA v mRemoteNG, prosím obraťte se na diskuzní fórum mRemoteNG na adrese http://forum.mremoteng.org/. + + + Všechny komponenty ICA byly nalezeny a zdají se být řádně zaregistrovány. +Citrix ICA Client Control verze {0} + + + není správně instalováno + + + Protokoly SSH, Telnet, Rlogin and RAW potřebují ke své práci program PuTTY. PuTTY je součástí každého balíčku s mRemoteNG a je k nalezení ve složce, kde je mRemoteNG nainstalován. +Prosím ujistěte se, že budťo máte soubor Putty.exe ve složce vašeho mRemoteNG (výchozí je: c:\Program Files\mRemoteNG\) nebo že jste zadali správnou cestu ke složce obsahující program PuTTY v Nástrojích (menu Nástroje -> Možnosti -> Pokročilé -> Vlastní cesta k PuTTY) + + + Program PuTTY byl nalezen a měl by být připraven k použití. + + + Aby RDP fungovalo, musíte mí nainstlaovanou poslední verzi Remote Desktop Connection (Terminal Services) Client 8.0. Můžete jej stáhnout zde : http://support.microsoft.com/kb/925876 +Pokud tato kontrola stále selhává nebo nejste schopni používat RDP v mRemoteNG, prosím prosím obraťte se na diskuzní fórum mRemoteNG na adrese http://forum.mremoteng.org/. + + + Všechny komponenty RDP byly nalezeny a zdají se být řádně zaregistrovány. +Remote Desktop Connection Control verze {0} + + + Funkcionalita VNC vyžaduje knihovnu VncSharp.dll ve složce s vaší instalací mRemoteNG. +Prosím ujistěte se, že máte v aplikační složce vaší instalace mRemoteNG soubor VncSharp.dll (zpravidla složka C:\Program Files\mRemoteNG\). +Pokud tato kontrola stále selhává nebo nejste schopni používat VNC v mRemoteNG, prosím prosím obraťte se na diskuzní fórum mRemoteNG na adrese http://forum.mremoteng.org/. + + + Všechny VNC součásti byly nalezeny a zdají se být řádně zaregistrovány. +VncSharp Control verze {0} + + + Automaticky obnovit připojení v případě přerušení spojení se serverem(pouze RDP && ICA) + + + Doména + + + Tuto zprávu příště nezobrazovat. + + + Dle nadřazené + + + Heslo + + + Tento proxy server vyžaduje autentizaci + + + Vlastní cesta k PuTTY: + + + Obnovit spojení jakmile je připraveno + + + Pro spojení použít proxy server + + + Login + + + Čekat na logout + + + Opakovat kontrolu + + + Zkontroluj aktualizace při spuštění + + + Zkontrolovat nyní + + + Zkontroluj komponenty při spuštění + + + Před připojením vybrat panel + + + Zavřené porty + + + Sbalit vše + + + Přepínače (parametry) + + + Zobrazené jméno + + + Jméno souboru + + + Host/IP + + + Zpráva + + + Login + + + Čekat na logout + + + E&xit {0} + + + Nemohl jsem zpracovat přepínače z příkazového řádku! + + + &Otevřít seznam spojení + + + &Zkusit znovu + + + {0} detekoval v systému běžící aplikaci Lenovo Auto Scroll Utility. Tato aplikace je známá jako zdroj problémů s {0}. Doporučujeme ji uzavřít nebo odinstalovat. + + + Detekován porblém s kompatibilitou + + + Kontrola komponent + + + Operace btnIcon_Click selhala! + + + Operace ShowHideGridItems selhala! + + + Operace IconMenu_Click selhala! + + + Operace vlastností (Property Grid object) selhala! + + + Operace SetHostStatus selhala! + + + Operace pGrid_PopertyValueChanged selhala! + + + Operace Config UI load selhala! + + + Přejete si uzavřít spojení: +"{0}"? + + + Opravdu chcete zavřít panel "{0}"? Všechna spojení v něm obsažená budou také uzavřena. + + + Jste si jisti, že si přejete smazat externí nástroj "{0}"? + + + Jste si jisti, že si přejete smazat {0} vybraných externích nástorojů? + + + Jste si jisti, že si přejete smazat spojení "{0}"? + + + Jste si jisti, že si přejete smazat prázdnou složku "{0}"? + + + Jste si jisti, že si přejete smazat složku "{0}"? Všechny složky a spojení v ní obsažené budou smazány také!!!! + + + Přejte si zavřít všechna otevřená spojení? + + + Jste si jisti, že si přejete obnovit výchozí rozložení panelů? + + + Připojit + + + Připojit na celou obrazovku + + + Připojuji... + + + Protokol událostí připojen + + + Připojení k "{0}" přes "{1}" bylo provedeno uživatelem "{2}" (Popis: "{3}"; Login: "{4}") + + + Připojení selhalo! + + + Chyba protokolu (či horizontu?) událostí + + + Otevření spojení selhalo! + + + Nemohu navázat spojení: Nebyla specifikována adresa či jméno hostitele! + + + Chyba RDP! +Kód chyby: {0} +Popis: {1} + + + Spojení + + + nastavit výchozí port! + + + Nepovedlo se vytvořit zálohu souboru seznamu spojení! + + + Nepovedlo se naimportovat soubor se seznamem spojení! + + + Nepovedlo se načíst soubor seznamu spojení "{0}"! + + + Nepovedlo se načíst soubor seznamu spojení "{0}"! +Otevírám nový prázdný soubor seznamu spojení. + + + Nepovedlo se uložit soubor seznamu spojení! + + + Nepovedlo se uložit soubor seznamu spojení "{0}"! + + + Připojit bez loginu + + + Připojit k otevřenému sezení konzole + + + Připojit (s možnostmi) + + + Připojení k {0} přes {1} uzavřeno uživatelem {2}. + + + Připojení k {0} přes {1} uzavřeno uživatelem {2}. (Popis: "{3}"; Uživatel: "{4}") + + + Událost uzavření spojení + + + Události uzavření spojení selhala! + + + Nepovedlo se vytvořit nový soubor seznamu připojení! + + + Nepovedlo se najít ovládací prvek ToolStrip control v objektu FilteredPropertyGrid. + + + Instalovaná verze + + + Výchozí vzhled + + + Detekovat + + + Nepovedlo se připojit do sezení konzole + + + Nepřipojovat pokud autentizace selže + + + Zavřít tab dvojklikem na něj + + + Stáhnout a nainstalovat + + + Duplikovat + + + Přejete si pokračovat bez hesla? + + + Pro prázdná políčka Login, Heslo nebo Doména použít: + + + 128-bit + + + 128-bit (jen pro logon) + + + 40-bit + + + 56-bit + + + Basic + + + Zakódovat celý soubor seznamu připojení + + + Koncová IP + + + Skončit portem + + + Metoda AddExternalToolsToToolBar (frmMain) selhala. {0} + + + Metoda AddFolder (UI.Window.ConnectionTreeWindow) selhala. {0} + + + Tato verze databáze {0} není kompatibilní s touto verzí {1}. + + + Metoda CloneNode (Tree.Node) selhala. {0} + + + Kód chyby {0}. + + + Seznam připojení nemohl být uložen. + + + Spuštění PuTTY se nezdařilo. + + + Dešifrování se nezdařilo. {0} + + + Začifrování se nezdařilo. {0} + + + V nastavení politik zabezepčení systému Windows je aktivována možnost "System cryptography: Use FIPS compliant algorithms for encryption, hashing, and signing" (Systémová kryptografie: Pro šifrování, hashe a podpisy využívat algoritmy odpovídají FIPS") Toto nastavení není kompatibilní s {0}. + +Pro další informace navštivte článek podpory fy. Microsoft na http://support.microsoft.com/kb/811833 + +{0} se nyní ukončí. + + + Chyby + + + Výchozí soubor seznamu spojení se nepodařilo načíst.{0}{0}{2}{0}{3}{0}{0}Aby se zabránilo ztrátě dat, {1} se nyní ukončí. + + + Metoda VerifyDatabaseVersion (Config.Connections.Save) selhala. {0} + + + Rozbalit vše + + + Experimentální + + + Exportovat + + + Exportovat vše + + + Exportovat soubor + + + Exportovat položky + + + Exportovat mRemote/mRemoteNG XML + + + Exportovat vlastnosti + + + Exportuj vybrané spojení + + + Export vybranou složku + + + &Exportovat do souboru... + + + Ext. App + + + Nový Externí Nástroj + + + Obsahuje ikony od [FAMFAMFAM] + + + http://www.famfamfam.com/ + + + &Formát souboru: + + + Všechny soubory (*.*) + + + Všechny importovatelné soubory + + + Soubory aplikací (*.exe) + + + Soubory mRemote CSV (*.csv) + + + Soubory mRemote XML (*.xml) + + + Soubory PuTTY Connection Manager + + + Soubory Remote Desktop Connection Manager (*.rdg) + + + Soubory RDP (*.rdp) + + + Soubory visionapp Remote Desktop 2008 CSV (*.csv) + + + Převzít {0} + + + Popis převzaté vlastnosti: {0} + + + Uvolnit + + + Celá obrazovka + + + Všeobecné + + + Získání informací o spojení z SQL selhalo (Get Connection Info From SQL) + + + Došlo k chybě při čtení tohoto nastavení připojení "{0}" z "{1}". {2} + + + Automaticky obnovit spojení + + + Spojení + + + Vlastnosti externích nástrojů + + + Soubory + + + Hostitel + + + HTTP + + + Spojení HTTP selhalo! + + + Nezdařilo se vytvoření noebého spojení HTTP! + + + Změna nadpisu dokumentu HTTP selhala! + + + Gecko (Firefox) + + + Internet Explorer + + + HTTPS + + + Nastavení vlast. HTTP selhalo! + + + ICA + + + Nepovedo se vytvořit nové spojení ICA! + + + Načtení pluginu ICA Plugin selhalo! + + + Metoda ICA SetCredentials selhala! + + + Metoda ICA Set Event Handlers selhala! + + + Metoda ICA (nastavení vlastností) Set Props selhala! + + + Metoda ICA Set Resolution (nastavení rozlišení) selhala! + + + Označ záložky rychlého připojení prefixem "Quick:" + + + Import z Active Directory + + + Import/Export + + + Při importování souboru "{0}" došlo k chybě. + + + Import selhal + + + Import ze &souboru... + + + V rámci kořenu{0}{1}|V rámci vybrané složky{0}{2} + + + Kam mají být umístěny importované položky? + + + Umístění importu + + + &Import + + + Importovat mRemote/mRemoteNG XML + + + Importovat ze scanu portů + + + Importovat z .RDP soburu/ů + + + Neaktivní + + + Informace + + + mRemoteNG je aktuální + + + Spojení selhalo! + + + Zrušení procesu Int App process selhalo! + + + Metoda Int App Focus selhala! + + + Int App Handle: {0} + + + Ukončení Int App Process selhalo! + + + Handler Panelu : {0} + + + Metoda Int App Resize selhala! + + + --- IntApp výstup --- + + + Int App Název: {0} + + + CTRL-ALT-DEL + + + CTRL-ESC + + + Adresa: + + + Parametry: + + + Change Log: + + + Když se ukončují spojení: + + + &Připojit: + + + Zobrazený název: + + + Doména: + + + Název souboru: + + + Hostitel: + + + Možnosti: + + + Heso: + + + Port: + + + Přenosná verze + + + Protokol: + + + Pro konfiguraci sezení PuTTY stiskněte toto tlačítko: + + + Maximální doba čekání na PuTTY a integrované externí nástroje: + + + Vydáno pod GNU General Public License (GPL) + + + sekund + + + Z níže uvedeného seznamu vyberte panel nebo stiskněte "Nový" pro přidání nového. Pro pokračování stiskněte "OK". + + + Stav Serveru: + + + Databáze: + + + Databáze: + + + Login: + + + Verifikuj: + + + Jazyk + + + (Automaticky) + + + Aby se projevila změna jazyka, musí být {0} restartován. + + + Načtení z SQL selhalo + + + Informace o spojení nemohly být načteny z SQL serveru. + + + Načtení z XML selhalo! + + + Lokální soubor + + + Lokální soubor neexistuje! + + + Logoff + + + Zápis do souboru reportu selhalo! + + + Nebylo možné uložit report do požadovaného umístění. + + + Využívá "Magic library" od [Crownwood Software] + + + http://www.dotnetmagic.com/ + + + O aplikaci + + + Nový panel spojení + + + Vyhledat aktualizace + + + Nastavení + + + Připojit + + + Panely + + + Spojení + + + Nastavení spojení + + + Kopírovat + + + Ctrl-Alt-Del + + + Ctrl-Esc + + + Smazat... + + + Smazat spojení... + + + Smazat vnější nástroj... + + + Smazat složku... + + + Odpojit + + + Přispějte + + + Klonovat + + + Klonovat připojení + + + Klonovat složku + + + Klonovat záložku tabu + + + Exit + + + Externí nástroje + + + Nástrojová lišta externích nástrojů + + + &Soubor + + + Celá obrazovka + + + Celá obrazovka (RDP) + + + &Nápověda + + + Nápověda mRemoteNG + + + Jít na + + + Spustit externí nástroj + + + Nový soubor seznamu spojení + + + Nový externí nástroj + + + Varovné zprávy + + + Kopírovat vše + + + Smazat + + + Smazat vše + + + Otevřít soubor seznamu spojení... + + + Možnosti + + + Vložit + + + Scan portů + + + Nástrojová lišta rychlého připojení + + + Obnovit připojení + + + Obnovit obraz (VNC) + + + Přejmenovat + + + Přejmenovat spojení + + + Přejmenovat složku + + + Přejmonovat záložku tabu + + + Nahlásit chybu + + + Výchozí vzhled + + + Uložit seznam spojení + + + Uložit seznam spojení jako... + + + Snímek obrazovky + + + Správa snímků obrazovek + + + Poslat speciální stisk kláves (VNC) + + + Získat + + + Sezení + + + Sezení a snímky obrazovek + + + &Zobraz texty nápovedy + + + Zobraz text + + + Automatická velikost (RDP/VNC) + + + SSH přenos souborů + + + Spustit (VNC) chat + + + Diskuzní fórum podpory + + + &Nástroje + + + Přenos souboru (SSH) + + + &Zobrazení + + + Pouze prohlížet (VNC) + + + Webová stránka + + + Minimizovat do oznamovací oblasti + + + Přesunout dolů + + + Přesunout nahoru + + + mRemoteNG CSV + + + mRemoteNG XML + + + Aktivní přihl. údaje (z Windows logon) + + + Nikdy + + + Nové spojení + + + Nová složka + + + Nový panel + + + Nový kořen + + + Nový popisek + + + Ne + + + Bez komprimace + + + Nebyla specifikována ext. aplikace. + + + (žádné) + + + (žádné) + + + Normal + + + Ne automatickou velikost + + + Nejsou k dispozici žádné aktualizace + + + Pokoušíte se načíst soubor seznamu spojení, který byl vytvořen pomocí velmi ranné verze mRemote, což by mohlo vést k běhové chybě. +Pokud k takové chybě dojde, prosím vytvořte nový soubor se seznamem spojení! + + + Otevřít novou záložku tabu vpravo od právě vybraného + + + Otevřené porty + + + &Smazat + + + &Nové + + + &Resetovat na výchozí + + + Resetovat &všechny na výchozí + + + Taby + + + Další tab + + + Předchozí tab + + + Uprav zkratku + + + Klévesové zkratky + + + Ověřuji... + + + Klávesnice + + + Vzhled + + + &Odstranit + + + &Nový + + + Název panelu + + + Chránit heslem + + + Obě hesla musejí být stejná. + + + helso musí být dlouhé alespoň 3 znaky. + + + Prosím vyplňte všechna vstupní pole + + + Scanování portů dokončeno. + + + Nezdařilo se otevřít panel PortScan! + + + (Tyto vlastnosti se uloží pouze tehdy, pokud vyberete formát výstupního souboru typu "mRemote" nebo "mRemoteNG XML"!) + + + zadejte název hostitele nebo jeho IP adresu ke které se chcete připojit. + + + Změnit všude převzetí z nadřazené. + + + Vyberte jakou úroveň autentizace má toto spojení použít. + + + Vyberte jak se chcete autentizovat VNC serveru. + + + Vyberte zda si přejete autoamticky změnit velikost virtuální obrazovky v rámci spojení když se změní velikost okna nebo je zapnut režim celé obrazovky. Toto vyžaduje RDC ve verzi 8.0 nebo vyšší. + + + Vyberte zda chcete využívat mezipamět bitmapových dat či nikoliv. + + + Vyberte barevnou hloubku. + + + Vyberete úroveň komprese. + + + Sem zadejte své poznámky nebo popis hostitele. + + + Zvolte "ano" pokud má být použit vzhled (téma) nastavený na vzdáleném hostiteli. + + + Zvolte "ano" pokud se má zobrazovat pozadí plochy dle nastavení na vzdáleném hosititeli. + + + Zadejte doménu pod kterou spadají uživatelské přihlašovací údaje (NETBIOSNAME před '\') . + + + Vyberte zda použít pokročilé prvky rozhraní (Aero etc.) nebo ne. + + + Vyberte zda použít vyhlazování písem. + + + Vyberte způsob kódování přenosu. + + + Vyberte požadovanou sílu šifrování vzdáleného hostitele. + + + Vyberte externí nástroj, který má být spuštěn. + + + Vyberte externí nástroj, který má být spuštěn po odpojení od vzdáleného hostitele. + + + Vyberte externí nástroj, který má být spuštěn před spojením se vzdáleným hostitelem. + + + Vyberte ikonu zobrazovanou pro toto spojení. + + + Specifikuje pomocné informace pro rozkladače zátěže (load balancery - NLB) pro výběr nejlepšího serveru. + + + Pokud se využívá v externím nástroji, zadejte sem MAC adresu vzdáleného hostitele. + + + Toto jméno bude zobrazeno ve stromě seznamu spojení a jejich složek. + + + Zadaný název určí panel, ve kterém se má spojení otevřít. + + + Sem zadejte Vaše heslo. + + + Zadejte port typu protokolu, na kterém poslouchá server/hostitel, ke kterému se připojujete. + + + Vyberte jakým způsobem (typem spojení) se má mRemoteNG spojit s tímto hostitelem. + + + Vyberte uložené sezení PuTTY, které se použije pro toto spojení. + + + Specifikuje doménové jměno, které uživatel předává při spojení s bránou vzdálené plochy (RD Gateway server). + + + Specifikuje název hostitele serveru brány vzdálené plochy (Remote Desktop Gateway server), přes kterého má být toto spojení zprostředkováno. + + + Specifikuje kdy má být použít server brány vzdálené plochy (Remote Desktop Gateway = RD Gateway). + + + Specifikuje, zda pro přihlášení k serveru brány vzdálené plochy použít stejné jméno a heslo jako je hlavní login pro toto spojení. + + + Specifikuje uživatelské jméno (login) odlišné od hlavního, které se použije pouze pro spojení se serverem brány vzdálené plochy (RD Gateway server). + + + Specifikuje, zda mají být lokální disky na tomto počítači připojeny ke vzdálenému hostiteli. + + + Vyberte, zda mají být složené stisky kláves (např. Alt-Tab) přesměrovány na vzdáleného hostitele, když je okno mRemote aktivní (má focus). + + + Specifikuje, zda mají být lokální hardwarové porty (COM, LPT - paralelní) z tohoto počítače připojeny ke vzdálenému hostiteli. + + + Specifikuje, zda mají být tiskárny lokálně připojené (nainstalované na tomto počítači) připojeny ke vzdálenému hostiteli. + + + Specifikuje, zda mají být čipové karty disponibilní na tomto počítači zprostředkovány také vzdálenému hostiteli. + + + Vyberte, jak mají být přesměrovány zvuky ze vzdáleného hostitele. + + + Vyberte který vykreslovací engine má zobrazovat webové stránky HTML. + + + Vyberte rozlišení nebo režim, ve kterém se toto spojení otevře. + + + Vyberte zda má být použita automatická změna velikosti (rozlišení). + + + Připojit se ke konzoli (příkazovému řádku) vzdáleného hostitele (pokud podporuje více variant). + + + V případě jeho dostupnosti, použít při autentizaci poskytovatele podpory bezpečných přihlašovacích údajů (Credential Security Support Provider - CredSSP). + + + Sem můžete zadat jakékoliv informace uznáte za vhodné. + + + Sem vložte své uživatelské (přihlašovací) jméno = login. + + + Pokud si přejete připojit se k hostiteli v režimu pouze prohlížení (bez ovládání), vyberte "ano". + + + Vložte adresu proxy serveru, přes který má spojení probíhat. + + + Zadejte heslo k proxy serveru, který má spojení zprostředkovat. + + + Zadejte port, na kterém proxy server naslouchá. + + + Pokud používáte proxy pro zprostřekování (tunelování) VNC psojení, zadejte jakým typem proxy tak činíte. + + + Vložte vaše uživatelské jméno pro autentizaci vůči proxy serveru. + + + Hostname/DN/IP + + + Vše + + + Po autentizaci + + + Režim autentizace + + + Automatické rozlišení + + + Mezipaměť bitmap + + + Bar. hloubka + + + Komprese + + + Popis + + + Použít téma vzhledu + + + Pozadí plochy + + + Doména + + + Pokroč. plocha (Aero) + + + Vyhlazování písem + + + Kódování + + + Síla šifrování + + + Externí nástroj + + + Externí nástroj po odp. + + + Externí nástroj před spoj. + + + Ikona + + + Load Balance Info + + + Adresa MAC + + + Jméno + + + Panel + + + Heslo + + + Port + + + Protokol + + + Konfigurace PuTTY + + + Doména (RD brána) + + + Host/DN/IP (RD brána) + + + Heslo (RD brána) + + + Použít RD bránu + + + Přihl. údaje brány + + + Login brány + + + Připojit lok. disky + + + Posílat kláv. zkr. + + + Připoj COM/LPT + + + Připoj tiskárny + + + Poskytuj karty + + + Zvuky + + + Vykreslovací engine + + + Rozlišení + + + Režim resize + + + Připoj k příkazové konzoli + + + Použít CredSSP + + + Poznámka + + + Login jméno + + + Jen sledovat + + + Adresa proxy + + + Heslo proxy + + + Port proxy + + + Typ proxy + + + Login k proxy + + + Událost prokolu Odpojeno. +Zpráva: +{0} + + + Událost protokolu "Odpojeno" selhala. +{0} + + + Protocol k importu + + + Test proxy selhal! + + + Test proxy uspěl! + + + Spojení selhalo! + + + Odstranění procesu PuTTY selhalo! + + + Nemohu aktivovat okno (focus)! + + + Získání seznamu konfigurací sezení/spojení PuTTY selhalo! + + + PuTTY Handle: {0} + + + Ukončení procesu PuTTY selhalo! + + + Panel Handle: {0} + + + Změna rozlišení okna PuTTY selhala! + + + Uložená sezení/spojení PuTTY + + + Nastavení PuTTY sezení/spojení + + + Nastavení PuTTY + + + Příkaz na zobrazení dialogového okna PuTTY Nastavení selhal! + + + Spuštění PuTTY selhalo! + + + --- PuTTY výstup --- + + + PuTTY název okna: {0} + + + Quick: {0} + + + Rychlé spojení + + + Přidání rychlého spojení selhalo! + + + Vytvoření rychlého spojení selhalo + + + &Varuj mě, když zavírám spojení + + + Varuj mě jen, když u&končuji mRemoteNG + + + Varuj mě jen, když zavírám více&násobná spojení + + + Neva&ruj mě, když zavírám spojení + + + RAW + + + RDP + + + 16777216 barev (24-bit) + + + 256 barev (8-bit) + + + 32768 barev (15-bit) + + + 16777216 barev (32-bit) + + + 65536 barev (16-bit) + + + Metoda RDP Add Resolution selhala! + + + Metoda RDP Add Resolutions selhala! + + + Metoda Add Session selhala + + + Metoda Close RDP Connection selhala! + + + Navázání spojení selhalo! + + + Nebylo možné aktivovat ovládací prvek okna RDP, prosím zkontrolujte požadavky mRemoteNG na prerekvizity. + + + Vypnout blikání kurzoru + + + Vypnout stín kurzoru + + + Vypnout přetahování celého okna (Full Window) + + + Vypnout animace menu + + + Vypnout nastavení vzhledu + + + Vypnout pozadí plochy + + + RDP odpojeno! + + + Pokud o odpojední RDP selhal, zkouším uzavřít! + + + Interní chyba kód 1. + + + Interní chyba kód 2. + + + Interní chyba kód 3. Toto není validní stav. + + + Interní chyba kód 4. + + + Během připojování klienta došlo k nepominutelné chybě. + + + Metoda GetError selhala (FatalErrors) + + + Došlo k neznámé nepominutelné chybě RDP. Kód chyby {0}. + + + Došlo k chybě "nedostatek paměti". + + + Došlo k neznámé chybě. + + + Došlo k chybě při vytváření okna. + + + Chyba inicializace Winsock. + + + Nezdařil se import souboru rdb! + + + Přizpůsobit panelu + + + Aktivace RDP okna (focus) selhala! + + + Brána RD (RD Gateway) je podporována. + + + Brána RD (RD Gateway) NENÍ podporována! + + + Metoda GetSessions selhala! + + + Otevření spojení RDP selhalo! + + + Počet pokusů o znovunavázání spojení RDP: + + + Metoda RDP SetAuthenticationLevel selhala! + + + Metoda RDP SetUseConsoleSession selhala! + + + Nastavuji přepínací parametr konzole Setting RDC {0}. + + + Metoda RDP SetCredentials selhala! + + + Metoda RDP SetEventHandlers selhala! + + + Metoda RDP SetRDGateway selhala! + + + Metoda RDP SetPerformanceFlags selhala! + + + Metoda RDP SetPort selhala! + + + Metoda RDP SetProps selhala! + + + Metoda Rdp Set Redirection selhala! + + + Nastavení přesměrování klávesových zkratek (Rdp Set Redirect Keys) selhalo! + + + Metoda RDP SetResolution selhala! + + + Autom. velikost + + + Přehrávat v místním počítači + + + Vůbec nepřehrávat + + + Přehrávat na vzdáleném počítači + + + Metoda RDP ToggleFullscreen selhala! + + + Metoda RDP ToggleSmartSize selhala! + + + Znovu se připojit k předchozím otevřeným relacím při startu aplikace + + + Obnovit + + + Vzdálený soubor + + + Odstranit vše + + + Přejmenovat + + + Rlogin + + + Uložit + + + Uložit vše + + + Přejete si uložit stávající soubor seznamu připojení před načtením jiného? + + + Ukládat spojení při ukončení aplikace + + + Soubor Graphics Interchange Format (.gif)|*.gif|Soubor Joint Photographic Experts Group (.jpeg)|*.jpeg|Soubor Joint Photographic Experts Group (.jpg)|*.jpg|Soubor Portable Network Graphics (.png)|*.png + + + Obrazovka + + + Snímek obrazovky + + + Snímky obrazovek + + + Hledat + + + Odeslat.. + + + Metoda Get Sessions Background selhala + + + Odstranění (Session Background) selhalo + + + Při konfiguraci spojení vyplnit DN hostitele podle zadaného názvu spojení + + + Nastavení textu hlavního formuláře selhalo + + + Nebylo možné uložti nastavení nebo zrušit ikonu v oznamovací oblasti! + + + Zobrazovat "popis" jako tooltip v seznamu spojení + + + V názvu okna zobrazovat úplnou cestu k souboru seznamu spojení + + + Zobrazovat v názvu záložek (tabech) informace o loginu + + + Zobrazovat v názvu záložek (tabech) protokol (typ spojení) + + + Otevírat spojením jedním klikem v seznamu + + + Kliknutím na již otevřené spojení v seznamu přepne na jeho tab záložku + + + Konst. poměr stran + + + Volné + + + Nepoužívat auto resize + + + Socks 5 + + + Řazení + + + Vzestupně (A-Z) + + + Sestupně (Z-A) + + + Klávesové zkratky + + + Prosím navštivte nápovědu - Začínáme - Konfigurace SQL pro získání dalších informací! + + + SQL Server + + + Vyhledávání aktualizací SQL ukončeno a aktualizace jsou k dispozici. Budu aktualizovat seznam spojení. + + + SSH ver 1 + + + SSH ver 2 + + + Selhal přenos na pozadí přes SSH! + + + Přenos úspěšně dokončen! + + + Selhala metoda SSH Transfer End (UI.Window.SSHTransfer)! + + + Selhal přenos přes SSH. + + + Počáteční IP + + + Počáteční Port + + + Startup/Exit + + + Stav + + + Přepnout do notifikačního panelu při: + + + Pokročilé + + + Vzhled + + + Taby && Panely + + + Aktualizace + + + Telnet + + + Následující: + + + Konfigurační panel + + + Panel spojení + + + Všeobecné + + + Barva pozadí konfiguračního panelu. + + + Barva textu nadpisů kategorií v konfiguračním panelu. + + + Barva ohraničení tabulky v konfiguračním panelu + + + Barva pozadí nápovědy v konfiguračním panelu. + + + Barva textu nápovědy v konfiguračním panelu. + + + Barva textu v konfiguračním panelu. + + + Barva pozadí v panelu seznamu spojení. + + + Barva textu v panelu seznamu spojení. + + + Barva čar stromu seznamu v panelu spojení. + + + Barva pozadí v nabídkách (menu). + + + Barva textu v nabídkách (menu). + + + Barva pozadí v políčku pro vyhledávání. + + + Barva textu v políčku pro vyhledávání. + + + Barva vyskakujícího textu v políčku pro vyhledávání. + + + Barva pozadí nástrojových lišt (toolbar). + + + barva textu nástrojových lišt (toolbar). + + + Barva pozadí hlavního okna aplikace. + + + Barva pozadí konfiguračního panelu + + + Barva textu konfiguračního panelu + + + Barva ohraničení tabulek konfiguračního panelu + + + Barva pozadí nápovědy konfiguračního panelu + + + Barva textu nápovědy konfiguračního panelu + + + Barva textu konfiguračního panelu + + + Barva pozadí panelu seznamu připojení + + + Barva textu panelu seznamu připojení + + + Barva čar stromu seznamu připojení + + + Barva pozadí nabídek + + + Barva textu nabídek + + + Barva pozadí pole vyhledávání + + + Barva textu pole vyhledávání + + + Barva textu nabídky v poli vyhledávání + + + Barva pozadí nástrojové lišty + + + Barva textu nástrojové lišty + + + Barva pozadí okna + + + Chyba ({0}) + + + Informace ({0}) + + + Heslo + + + Heslo pro {0} + + + Vybrat panel + + + Varování ({0}) + + + Přenést + + + Přenos selhal! + + + Zkouším integrovat + + + Typ + + + Ultra VNC Repeater + + + UltraVNC SingleClick port: + + + Nezaškrtávejte ty vlastnosti, které nechcete uložit! + + + Vzhled be názvu + + + mRemoteNG vyžaduje aktualizaci + + + mRemoteNG se může pravidelně připojovat k webu mRemoteNG aby zkontroloval aktualizace. + + + Informace o aktualizacích nemohly být staženy. + + + Vyhledání aktualizací selhalo! + + + Vyhledávám aktualizace... + + + mRemoteNG Portable Edition nyní nepodporuje automatické aktualizace. + + + Stahování ukončeno! +mRemoteNG se nyní ukončí a zahájí instalaci. + + + Aktualizaci se nepodařilo stáhnout. + + + Stahování aktualizací se nepodařilo zahájit. + + + Každý(ch) {0} dnů + + + Denně + + + Měsíčně + + + Týdně + + + Seznam informací o změnách se nepodařilo stáhnout. + + + Použít jiné uživatelské jméno (login) a heslo + + + Uživatel + + + Použít stejné uživatelské jméno (login) a heslo + + + Použít čipovou kartu + + + Použít SQL Server ke stažení && uloženho seznamu spojení + + + Verze + + + VNC + + + Odpojení VNC selhalo! + + + Navázání spojení VNC selhalo! + + + Obnovení obrazovky VNC selhalo! + + + VNC zaslat klávesovou zkratku selhalo! + + + Selhala metoda VNC Set Event Handlers! + + + Nastavení VNC Set Props selhalo! + + + Volání VNC Start Chat selhalo! + + + Přepnutí VNC automatické velikosti (SmartSize) selhalo! + + + Přepnutí VNC do režimu ViewOnly selhalo! + + + Varuj mě pokud autentizace selže + + + Varování + + + Využívá DockPanel Suite od [Weifen Luo] + + + http://sourceforge.net/projects/dockpanelsuite/ + + + Složka umístění XULrunner: + + + Ano + + + Obnovit všechna otevřená spojení + + + Čas čekání (timeout) na RDP spojení + + + Tento uzel již v této složce existuje. + + + Nelze přetáhnout uzel na sebe sama. + + + Nelze přetáhnout nadřazený uzel na jeho potomka. + + + Tento uzel nelze přetahovat myší. + + + Režim blokové šifry + + + Šifrovací metody + + + Bezpečnost + + + Počet iterací funkce derivující klíč + + + Variabilní + + + Vysoká + + + Střední + + + Vyberte si jednu z kvalit zvuku poskytovanou protokolem: Variabilní, Střední, Vvysoká + + + Kvalita zvuku + + + Stahování přenosné verze dokončeno! + + + Stáhnout + + + Počet minut neaktivity v sezení RDP než bude automaticky odpojeno (0 = bez omezení) + + + Minut neaktivity do odp. + + + Akceptovat + + + Přidat + + + Editor přihlašovacích údajů + + + Správce přihlašovacích údajů + + + ID + + + Odstranit + + + Název + + + Vyberte jaké přihlašovací údaje použít pro toto spojení. + + + Jste si jisti že chcete odstranit záznam přihlašovacích údajů {0}? + + + Přihlašovací údaje s ID "{0}" nebyly nalezeny pro pozužití ve spojení jménem "{1}". + + + Zapsat zprávu logu když se RDP sezení odpojí kvůli neaktivitě. + + + Upozornit při odpojení z neaktivity + + + Heslo musí obsahovat alespoň {0} z těchto písmen: {1} + + + Heslo musí obsahovat alespoň {0} malých písmen. + + + Heslo musí obsahovat alespoň {0} číslic. + + + Heslo musí obsahovat alespoň {0} velkých písmen. + + + Delká hesla musí být alespoň {0} a nejvýše {1} znaků. + + + Vyberte cestu k souboru logu aplikace mRemoteNG. + + + Debugging + + + Zobrazovat tyto zprávy + + + Cesta k souboru logu + + + Logovat tyto typy zpráv + + + Vybrat cestu + + + Otevřít soubor + + + Použít výchozí + + + Logování + + + Zprávy logu + + + Logovat do adresáře kde je aplikace umístěna. + + ++ Zvolte jak bude přesměrováno vstupní zvukové zařízení ++ ++ ++ Vstupní zvuková zařízení ++ ++ ++ Ponechat vstup na místním počítači ++ ++ ++ Vstup zaslat na vzdálený počítač ++ + + Přiřazené přihlašovací informace + + \ No newline at end of file diff --git a/mRemoteV1/Resources/Language/Language.resx b/mRemoteV1/Resources/Language/Language.resx index 538b6530..99c877f5 100644 --- a/mRemoteV1/Resources/Language/Language.resx +++ b/mRemoteV1/Resources/Language/Language.resx @@ -2505,4 +2505,22 @@ mRemoteNG will now quit and begin with the installation. Log to application directory + + Assigned Credential + + + Allow Always + + + Allow Once + + + Don't Allow + + + Allow Insecure Certificate for URL: {0}? + + + Allow Insecure Certificate? + \ No newline at end of file diff --git a/mRemoteV1/Resources/PuTTYNG.exe b/mRemoteV1/Resources/PuTTYNG.exe index b686b1d7..5749a78b 100644 Binary files a/mRemoteV1/Resources/PuTTYNG.exe and b/mRemoteV1/Resources/PuTTYNG.exe differ diff --git a/mRemoteV1/Security/SaveFilter.cs b/mRemoteV1/Security/SaveFilter.cs index 24d65eec..7216e82d 100644 --- a/mRemoteV1/Security/SaveFilter.cs +++ b/mRemoteV1/Security/SaveFilter.cs @@ -9,7 +9,8 @@ namespace mRemoteNG.Security SaveUsername = true; SavePassword = true; SaveDomain = true; - SaveInheritance = true; + SaveCredentialId = true; + SaveInheritance = true; } public bool SaveUsername { get; set; } @@ -18,6 +19,8 @@ namespace mRemoteNG.Security public bool SaveDomain { get; set; } + public bool SaveCredentialId { get; set; } + public bool SaveInheritance { get; set; } } } \ No newline at end of file diff --git a/mRemoteV1/Tools/Authenticode.cs b/mRemoteV1/Tools/Authenticode.cs index 4bcf5372..6a60b9bd 100644 --- a/mRemoteV1/Tools/Authenticode.cs +++ b/mRemoteV1/Tools/Authenticode.cs @@ -1,3 +1,4 @@ +#if !PORTABLE using System; using System.Windows.Forms; using System.IO; @@ -79,6 +80,7 @@ namespace mRemoteNG.Tools var windowHandle = DisplayParentForm?.Handle ?? IntPtr.Zero; _trustProviderErrorCode = NativeMethods.WinVerifyTrust(windowHandle, NativeMethods.WINTRUST_ACTION_GENERIC_VERIFY_V2, trustDataPointer); + // ReSharper disable once SwitchStatementMissingSomeCases switch (_trustProviderErrorCode) { case NativeMethods.TRUST_E_NOSIGNATURE: @@ -139,54 +141,51 @@ namespace mRemoteNG.Tools private DisplayContextValue DisplayContext {get; set;} private Form DisplayParentForm {get; set;} - internal Exception Exception {get; set;} + internal Exception Exception {get; private set;} private string FilePath {get; set;} - internal bool RequireThumbprintMatch { get; set;} + internal bool RequireThumbprintMatch { get; set;} - internal StatusValue Status { get; set; } + internal StatusValue Status { get; private set; } - public string StatusMessage - { - get - { - // ReSharper disable once SwitchStatementMissingSomeCases - switch (Status) - { - case StatusValue.Verified: - return "The file was verified successfully."; - case StatusValue.FileNotExist: - return "The specified file does not exist."; - case StatusValue.FileEmpty: - return "The specified file is empty."; - case StatusValue.NoSignature: - return "The specified file is not digitally signed."; - case StatusValue.NoThumbprintToMatch: - return "A thumbprint match is required but no thumbprint to match against was specified."; - case StatusValue.ThumbprintNotMatch: - /* (char)0x2260 == the "not equal to" symbol (which I cannot print in here without changing the encoding of the file) - * Fancy... - * - * "<>" is fiarly cryptic for non-programers - * So is "!=" - * "=/=" gets the job done, no? - * What about plain old English (or localized value): X is not equal to Y? - * :P - */ - return $"The thumbprint does not match. {_thumbprint} {(char)0x2260} {ThumbprintToMatch}."; - case StatusValue.TrustProviderError: - var ex = new Win32Exception(_trustProviderErrorCode); - return $"The trust provider returned an error. {ex.Message}"; - case StatusValue.UnhandledException: - return $"An unhandled exception occurred. {Exception.Message}"; - default: - return "The status is unknown."; - } - } - } + public string GetStatusMessage() + { + // ReSharper disable once SwitchStatementMissingSomeCases + switch (Status) + { + case StatusValue.Verified: + return "The file was verified successfully."; + case StatusValue.FileNotExist: + return "The specified file does not exist."; + case StatusValue.FileEmpty: + return "The specified file is empty."; + case StatusValue.NoSignature: + return "The specified file is not digitally signed."; + case StatusValue.NoThumbprintToMatch: + return "A thumbprint match is required but no thumbprint to match against was specified."; + case StatusValue.ThumbprintNotMatch: + /* (char)0x2260 == the "not equal to" symbol (which I cannot print in here without changing the encoding of the file) + * Fancy... + * + * "<>" is fiarly cryptic for non-programers + * So is "!=" + * "=/=" gets the job done, no? + * What about plain old English (or localized value): X is not equal to Y? + * :P + */ + return $"The thumbprint does not match. {_thumbprint} {(char) 0x2260} {ThumbprintToMatch}."; + case StatusValue.TrustProviderError: + var ex = new Win32Exception(_trustProviderErrorCode); + return $"The trust provider returned an error. {ex.Message}"; + case StatusValue.UnhandledException: + return $"An unhandled exception occurred. {Exception.Message}"; + default: + return "The status is unknown."; + } + } private string _thumbprint; - internal string ThumbprintToMatch { get; set;} + internal string ThumbprintToMatch { get; set;} private int _trustProviderErrorCode; @@ -293,4 +292,5 @@ namespace mRemoteNG.Tools } #endregion } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/mRemoteV1/Tools/ConnectionsTreeToMenuItemsConverter.cs b/mRemoteV1/Tools/ConnectionsTreeToMenuItemsConverter.cs index 0fb2db78..46347eea 100644 --- a/mRemoteV1/Tools/ConnectionsTreeToMenuItemsConverter.cs +++ b/mRemoteV1/Tools/ConnectionsTreeToMenuItemsConverter.cs @@ -5,7 +5,6 @@ using System.Windows.Forms; using mRemoteNG.App; using mRemoteNG.Connection; using mRemoteNG.Container; -using mRemoteNG.Messages; using mRemoteNG.Tree; @@ -31,7 +30,7 @@ namespace mRemoteNG.Tools } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage("frmMain.AddNodeToMenu() failed", ex, MessageClass.ErrorMsg, true); + Runtime.MessageCollector.AddExceptionMessage("frmMain.AddNodeToMenu() failed", ex); } return dropDownList; } diff --git a/mRemoteV1/Tools/IeBrowserEmulation.cs b/mRemoteV1/Tools/IeBrowserEmulation.cs index 5de20ca8..11a0fe10 100644 --- a/mRemoteV1/Tools/IeBrowserEmulation.cs +++ b/mRemoteV1/Tools/IeBrowserEmulation.cs @@ -4,7 +4,6 @@ using System.IO; using System.Security.AccessControl; using Microsoft.Win32; using mRemoteNG.App; -using mRemoteNG.Messages; namespace mRemoteNG.Tools { @@ -18,36 +17,38 @@ namespace mRemoteNG.Tools if (Environment.Is64BitOperatingSystem) { - using (RegistryKey key = Registry.CurrentUser.CreateSubKey(string.Concat("Software\\Wow6432Node\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\", feature), RegistryKeyPermissionCheck.ReadWriteSubTree)) + using (var key = Registry.CurrentUser.CreateSubKey(string.Concat("Software\\Wow6432Node\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\", feature), RegistryKeyPermissionCheck.ReadWriteSubTree)) { key?.SetValue(appName, value, RegistryValueKind.DWord); } } - using (RegistryKey key = Registry.CurrentUser.CreateSubKey(string.Concat("Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\", feature), RegistryKeyPermissionCheck.ReadWriteSubTree)) + using (var key = Registry.CurrentUser.CreateSubKey(string.Concat("Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\", feature), RegistryKeyPermissionCheck.ReadWriteSubTree)) { key?.SetValue(appName, value, RegistryValueKind.DWord); } } +#if PORTABLE private static void DeleteBrowserFeatureControlKey(string feature, string appName) { if (Environment.Is64BitOperatingSystem) { - using (RegistryKey key = Registry.CurrentUser.OpenSubKey(string.Concat("Software\\Wow6432Node\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\", feature), RegistryKeyPermissionCheck.ReadWriteSubTree)) + using (var key = Registry.CurrentUser.OpenSubKey(string.Concat("Software\\Wow6432Node\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\", feature), RegistryKeyPermissionCheck.ReadWriteSubTree)) { key?.DeleteValue(appName); } } - using (RegistryKey key = Registry.CurrentUser.CreateSubKey(string.Concat("Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\", feature), RegistryKeyPermissionCheck.ReadWriteSubTree)) + using (var key = Registry.CurrentUser.CreateSubKey(string.Concat("Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\", feature), RegistryKeyPermissionCheck.ReadWriteSubTree)) { key?.DeleteValue(appName); } } +#endif private static void SetBrowserFeatureControl() { @@ -56,7 +57,7 @@ namespace mRemoteNG.Tools // FeatureControl settings are per-process var fileName = Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName); - // make the control is not running inside Visual Studio Designer + // make sure the control is not running inside Visual Studio Designer if (string.Compare(fileName, "devenv.exe", StringComparison.OrdinalIgnoreCase) == 0 || string.Compare(fileName, "XDesProc.exe", StringComparison.OrdinalIgnoreCase) == 0) { return; @@ -89,6 +90,7 @@ namespace mRemoteNG.Tools SetBrowserFeatureControlKey("FEATURE_XMLHTTP", fileName, 1); } +#if PORTABLE private static void DeleteBrowserFeatureControl() { // http://msdn.microsoft.com/en-us/library/ee330720(v=vs.85).aspx @@ -96,7 +98,7 @@ namespace mRemoteNG.Tools // FeatureControl settings are per-process var fileName = Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName); - // make the control is not running inside Visual Studio Designer + // make sure the control is not running inside Visual Studio Designer if (string.Compare(fileName, "devenv.exe", StringComparison.OrdinalIgnoreCase) == 0 || string.Compare(fileName, "XDesProc.exe", StringComparison.OrdinalIgnoreCase) == 0) { return; @@ -128,6 +130,7 @@ namespace mRemoteNG.Tools DeleteBrowserFeatureControlKey("FEATURE_WINDOW_RESTRICTIONS", fileName); DeleteBrowserFeatureControlKey("FEATURE_XMLHTTP", fileName); } +#endif private static uint GetBrowserEmulationMode() { @@ -136,7 +139,7 @@ namespace mRemoteNG.Tools var browserVersion = 9; // default to IE9. - using (RegistryKey ieKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Internet Explorer", RegistryKeyPermissionCheck.ReadSubTree, RegistryRights.QueryValues)) + using (var ieKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Internet Explorer", RegistryKeyPermissionCheck.ReadSubTree, RegistryRights.QueryValues)) { if (ieKey != null) { @@ -202,7 +205,7 @@ namespace mRemoteNG.Tools } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage("IeBrowserEmulation.Register() failed.", ex, MessageClass.ErrorMsg, true); + Runtime.MessageCollector.AddExceptionMessage("IeBrowserEmulation.Register() failed.", ex); } } @@ -216,7 +219,7 @@ namespace mRemoteNG.Tools } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage("IeBrowserEmulation.Unregister() failed.", ex, MessageClass.ErrorMsg, true); + Runtime.MessageCollector.AddExceptionMessage("IeBrowserEmulation.Unregister() failed.", ex); } #endif } diff --git a/mRemoteV1/UI/Controls/ConnectionTree/ConnectionTree.cs b/mRemoteV1/UI/Controls/ConnectionTree/ConnectionTree.cs index 68689dfb..4854b5cc 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 diff --git a/mRemoteV1/UI/Controls/ExternalToolsToolStrip.cs b/mRemoteV1/UI/Controls/ExternalToolsToolStrip.cs index 9c2d31b8..e7ba9d37 100644 --- a/mRemoteV1/UI/Controls/ExternalToolsToolStrip.cs +++ b/mRemoteV1/UI/Controls/ExternalToolsToolStrip.cs @@ -116,13 +116,14 @@ namespace mRemoteNG.UI.Controls } #endregion - + // CodeAyalysis doesn't like null propagation + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "components")] protected override void Dispose(bool disposing) { try { - if (disposing) - components?.Dispose(); + if (!disposing) return; + components?.Dispose(); } finally { diff --git a/mRemoteV1/UI/Controls/NewPasswordWithVerification.cs b/mRemoteV1/UI/Controls/NewPasswordWithVerification.cs index 014fd7df..16b5faa8 100644 --- a/mRemoteV1/UI/Controls/NewPasswordWithVerification.cs +++ b/mRemoteV1/UI/Controls/NewPasswordWithVerification.cs @@ -59,9 +59,9 @@ namespace mRemoteNG.UI.Controls private bool Verify() { - return secureTextBox1.SecureString.Length == secureTextBox2.SecureString.Length && - secureTextBox1.SecureString.ConvertToUnsecureString() == - secureTextBox2.SecureString.ConvertToUnsecureString(); + return secureTextBox1.SecString.Length == secureTextBox2.SecString.Length && + secureTextBox1.SecString.ConvertToUnsecureString() == + secureTextBox2.SecString.ConvertToUnsecureString(); } private void TogglePasswordMatchIndicator(bool passwordsMatch) @@ -85,7 +85,7 @@ namespace mRemoteNG.UI.Controls if (Verify() && !PasswordsMatch) { PasswordsMatch = true; - SecureString = secureTextBox1.SecureString; + SecureString = secureTextBox1.SecString; RaiseVerifiedEvent(); } else diff --git a/mRemoteV1/UI/Controls/QuickConnectToolStrip.cs b/mRemoteV1/UI/Controls/QuickConnectToolStrip.cs index 2961dbbd..48f74b8e 100644 --- a/mRemoteV1/UI/Controls/QuickConnectToolStrip.cs +++ b/mRemoteV1/UI/Controls/QuickConnectToolStrip.cs @@ -8,6 +8,7 @@ using mRemoteNG.Connection.Protocol; using mRemoteNG.Container; using mRemoteNG.Themes; using mRemoteNG.Tools; +using mRemoteNG.UI.Forms; namespace mRemoteNG.UI.Controls { @@ -20,15 +21,10 @@ namespace mRemoteNG.UI.Controls private ContextMenuStrip _mnuQuickConnectProtocol; private QuickConnectComboBox _cmbQuickConnect; private ContextMenuStrip _mnuConnections; - private readonly IConnectionInitiator _connectionInitiator; - public QuickConnectToolStrip(IConnectionInitiator connectionInitiator) + public QuickConnectToolStrip() { - if (connectionInitiator == null) - throw new ArgumentNullException(nameof(connectionInitiator)); - - _connectionInitiator = connectionInitiator; Initialize(); ApplyThemes(); PopulateQuickConnectProtocolMenu(); @@ -169,7 +165,7 @@ namespace mRemoteNG.UI.Controls return; } _cmbQuickConnect.Add(connectionInfo); - _connectionInitiator.OpenConnection(connectionInfo, ConnectionInfo.Force.DoNotJump); + FrmMain.Default._connectionInitiator.OpenConnection(connectionInfo, ConnectionInfo.Force.DoNotJump); } catch (Exception ex) { @@ -219,17 +215,19 @@ namespace mRemoteNG.UI.Controls var tag = ((ToolStripMenuItem)sender).Tag as ConnectionInfo; if (tag != null) { - _connectionInitiator.OpenConnection(tag); + FrmMain.Default._connectionInitiator.OpenConnection(tag); } } #endregion + // CodeAyalysis doesn't like null propagation + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "components")] protected override void Dispose(bool disposing) { try { - if (disposing) - components?.Dispose(); + if (!disposing) return; + components?.Dispose(); } finally { diff --git a/mRemoteV1/UI/Controls/SecureTextBox.Designer.cs b/mRemoteV1/UI/Controls/SecureTextBox.Designer.cs index 67bdcf78..c0e72fce 100644 --- a/mRemoteV1/UI/Controls/SecureTextBox.Designer.cs +++ b/mRemoteV1/UI/Controls/SecureTextBox.Designer.cs @@ -11,13 +11,21 @@ /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. + // CodeAnalysis doesn't like null propagation, and possibly IDisposable auto properties (like SecString). + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "components")] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "k__BackingField")] protected override void Dispose(bool disposing) { - if (disposing && (components != null)) + try { - components.Dispose(); + if (!disposing) return; + components?.Dispose(); + SecString?.Dispose(); + } + finally + { + base.Dispose(disposing); } - base.Dispose(disposing); } #region Component Designer generated code diff --git a/mRemoteV1/UI/Controls/SecureTextBox.cs b/mRemoteV1/UI/Controls/SecureTextBox.cs index 10ec694d..3af29b64 100644 --- a/mRemoteV1/UI/Controls/SecureTextBox.cs +++ b/mRemoteV1/UI/Controls/SecureTextBox.cs @@ -7,7 +7,7 @@ namespace mRemoteNG.UI.Controls { public partial class SecureTextBox : TextBox { - public SecureString SecureString { get; private set; } = new SecureString(); + public SecureString SecString { get; private set; } = new SecureString(); public SecureTextBox() { @@ -17,7 +17,7 @@ namespace mRemoteNG.UI.Controls private void SecureTextBox_TextChanged(object sender, System.EventArgs e) { - SecureString = Text.ConvertToSecureString(); + SecString = Text.ConvertToSecureString(); } } } \ No newline at end of file diff --git a/mRemoteV1/UI/Forms/ExportForm.Designer.cs b/mRemoteV1/UI/Forms/ExportForm.Designer.cs index eb040fa4..928ce9bb 100644 --- a/mRemoteV1/UI/Forms/ExportForm.Designer.cs +++ b/mRemoteV1/UI/Forms/ExportForm.Designer.cs @@ -18,6 +18,7 @@ namespace mRemoteNG.UI.Forms this.txtFileName = new System.Windows.Forms.TextBox(); this.btnBrowse = new System.Windows.Forms.Button(); this.grpProperties = new System.Windows.Forms.GroupBox(); + this.chkAssignedCredential = new System.Windows.Forms.CheckBox(); this.grpFile = new System.Windows.Forms.GroupBox(); this.lblFileFormat = new System.Windows.Forms.Label(); this.lblFileName = new System.Windows.Forms.Label(); @@ -131,6 +132,7 @@ namespace mRemoteNG.UI.Forms // // grpProperties // + this.grpProperties.Controls.Add(this.chkAssignedCredential); this.grpProperties.Controls.Add(this.lblUncheckProperties); this.grpProperties.Controls.Add(this.chkInheritance); this.grpProperties.Controls.Add(this.chkUsername); @@ -143,6 +145,18 @@ namespace mRemoteNG.UI.Forms this.grpProperties.TabStop = false; this.grpProperties.Text = "Export Properties"; // + // chkAssignedCredential + // + this.chkAssignedCredential.AutoSize = true; + this.chkAssignedCredential.Checked = true; + this.chkAssignedCredential.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkAssignedCredential.Location = new System.Drawing.Point(143, 32); + this.chkAssignedCredential.Name = "chkAssignedCredential"; + this.chkAssignedCredential.Size = new System.Drawing.Size(119, 17); + this.chkAssignedCredential.TabIndex = 5; + this.chkAssignedCredential.Text = "Assigned Credential"; + this.chkAssignedCredential.UseVisualStyleBackColor = true; + // // grpFile // this.grpFile.Controls.Add(this.lblFileFormat); @@ -183,6 +197,7 @@ namespace mRemoteNG.UI.Forms this.cboFileFormat.Name = "cboFileFormat"; this.cboFileFormat.Size = new System.Drawing.Size(294, 21); this.cboFileFormat.TabIndex = 4; + this.cboFileFormat.SelectedIndexChanged += new System.EventHandler(this.cboFileformat_SelectedIndexChanged); // // grpItems // @@ -299,5 +314,7 @@ namespace mRemoteNG.UI.Forms private System.Windows.Forms.RadioButton rdoExportSelectedFolder; private System.Windows.Forms.RadioButton rdoExportEverything; #endregion - } + + private CheckBox chkAssignedCredential; + } } diff --git a/mRemoteV1/UI/Forms/ExportForm.cs b/mRemoteV1/UI/Forms/ExportForm.cs index a7a74c3b..2a4a5c79 100644 --- a/mRemoteV1/UI/Forms/ExportForm.cs +++ b/mRemoteV1/UI/Forms/ExportForm.cs @@ -47,20 +47,13 @@ namespace mRemoteNG.UI.Forms { get { - if (rdoExportSelectedFolder.Checked) - { + if (rdoExportSelectedFolder.Checked) return ExportScope.SelectedFolder; - } - else if (rdoExportSelectedConnection.Checked) - { - return ExportScope.SelectedConnection; - } - else - { - return ExportScope.Everything; - } + if (rdoExportSelectedConnection.Checked) + return ExportScope.SelectedConnection; + return ExportScope.Everything; } - set + set { switch (value) { @@ -142,7 +135,13 @@ namespace mRemoteNG.UI.Forms chkDomain.Checked = value; } } - + + public bool IncludeAssignedCredential + { + get { return chkAssignedCredential.Checked; } + set { chkAssignedCredential.Checked = value; } + } + public bool IncludeInheritance { get @@ -160,19 +159,15 @@ namespace mRemoteNG.UI.Forms public ExportForm() { InitializeComponent(); - Runtime.FontOverride(this); - SelectedFolder = null; SelectedConnection = null; - btnOK.Enabled = false; } #endregion #region Private Methods #region Event Handlers - private void ExportForm_Load(object sender, EventArgs e) { cboFileFormat.Items.Clear(); @@ -225,6 +220,24 @@ namespace mRemoteNG.UI.Forms { DialogResult = DialogResult.Cancel; } + + private void cboFileformat_SelectedIndexChanged(object sender, EventArgs e) + { + if (SaveFormat == ConnectionsSaver.Format.mRXML) + { + chkUsername.Enabled = false; + chkPassword.Enabled = false; + chkDomain.Enabled = false; + chkAssignedCredential.Enabled = true; + } + else + { + chkUsername.Enabled = true; + chkPassword.Enabled = true; + chkDomain.Enabled = true; + chkAssignedCredential.Enabled = false; + } + } #endregion private void ApplyLanguage() @@ -245,6 +258,7 @@ namespace mRemoteNG.UI.Forms chkUsername.Text = Language.strCheckboxUsername; chkPassword.Text = Language.strCheckboxPassword; chkDomain.Text = Language.strCheckboxDomain; + chkAssignedCredential.Text = Language.strAssignedCredential; chkInheritance.Text = Language.strCheckboxInheritance; lblUncheckProperties.Text = Language.strUncheckProperties; diff --git a/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs b/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs index d0a263ee..832dc54e 100644 --- a/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs +++ b/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs @@ -132,7 +132,7 @@ namespace mRemoteNG.UI.Forms.OptionsPages { MessageBox.Show(Language.strErrorCouldNotLaunchPutty, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1); - Runtime.MessageCollector.AddExceptionMessage(Language.strErrorCouldNotLaunchPutty, ex, logOnly: true); + Runtime.MessageCollector.AddExceptionMessage(Language.strErrorCouldNotLaunchPutty, ex); } } diff --git a/mRemoteV1/UI/Forms/frmMain.Designer.cs b/mRemoteV1/UI/Forms/frmMain.Designer.cs index a14cbf48..50811327 100644 --- a/mRemoteV1/UI/Forms/frmMain.Designer.cs +++ b/mRemoteV1/UI/Forms/frmMain.Designer.cs @@ -1,3 +1,5 @@ +using mRemoteNG.UI.Controls; + namespace mRemoteNG.UI.Forms { public partial class FrmMain : System.Windows.Forms.Form @@ -36,6 +38,12 @@ namespace mRemoteNG.UI.Forms this.mMenSep3 = new System.Windows.Forms.ToolStripSeparator(); this.tsContainer = new System.Windows.Forms.ToolStripContainer(); this.tmrAutoSave = new System.Windows.Forms.Timer(this.components); + this._externalToolsToolStrip = new mRemoteNG.UI.Controls.ExternalToolsToolStrip(); + this._quickConnectToolStrip = new mRemoteNG.UI.Controls.QuickConnectToolStrip(); + this.mainFileMenu1 = new mRemoteNG.UI.Menu.MainFileMenu(); + this.viewMenu1 = new mRemoteNG.UI.Menu.ViewMenu(); + this.toolsMenu1 = new mRemoteNG.UI.Menu.ToolsMenu(); + this.helpMenu1 = new mRemoteNG.UI.Menu.HelpMenu(); this.msMain.SuspendLayout(); this.tsContainer.ContentPanel.SuspendLayout(); this.tsContainer.TopToolStripPanel.SuspendLayout(); @@ -50,23 +58,48 @@ namespace mRemoteNG.UI.Forms this.pnlDock.DockRightPortion = 230D; this.pnlDock.DocumentStyle = WeifenLuo.WinFormsUI.Docking.DocumentStyle.DockingSdi; this.pnlDock.Location = new System.Drawing.Point(0, 0); + this.pnlDock.Margin = new System.Windows.Forms.Padding(4); this.pnlDock.Name = "pnlDock"; - this.pnlDock.Size = new System.Drawing.Size(966, 449); + this.pnlDock.Size = new System.Drawing.Size(1288, 594); this.pnlDock.TabIndex = 13; this.pnlDock.ActiveDocumentChanged += new System.EventHandler(this.pnlDock_ActiveDocumentChanged); // // msMain // - this.msMain.Dock = System.Windows.Forms.DockStyle.None; this.msMain.GripMargin = new System.Windows.Forms.Padding(0); + this.msMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mainFileMenu1, + this.viewMenu1, + this.toolsMenu1, + this.helpMenu1}); this.msMain.Location = new System.Drawing.Point(3, 0); this.msMain.Name = "msMain"; this.msMain.Padding = new System.Windows.Forms.Padding(2, 2, 0, 2); - this.msMain.Size = new System.Drawing.Size(269, 24); + this.msMain.Size = new System.Drawing.Size(268, 24); this.msMain.Stretch = false; this.msMain.TabIndex = 16; this.msMain.Text = "Main Toolbar"; // + // mMenFile + // + this.mMenFile.Name = "mMenFile"; + this.mMenFile.Size = new System.Drawing.Size(32, 19); + // + // mMenView + // + this.mMenView.Name = "mMenView"; + this.mMenView.Size = new System.Drawing.Size(32, 19); + // + // mMenTools + // + this.mMenTools.Name = "mMenTools"; + this.mMenTools.Size = new System.Drawing.Size(32, 19); + // + // mMenInfo + // + this.mMenInfo.Name = "mMenInfo"; + this.mMenInfo.Size = new System.Drawing.Size(32, 19); + // // mMenSep3 // this.mMenSep3.Name = "mMenSep3"; @@ -78,16 +111,20 @@ namespace mRemoteNG.UI.Forms // tsContainer.ContentPanel // this.tsContainer.ContentPanel.Controls.Add(this.pnlDock); - this.tsContainer.ContentPanel.Size = new System.Drawing.Size(966, 449); + this.tsContainer.ContentPanel.Margin = new System.Windows.Forms.Padding(4); + this.tsContainer.ContentPanel.Size = new System.Drawing.Size(1288, 594); this.tsContainer.Dock = System.Windows.Forms.DockStyle.Fill; this.tsContainer.Location = new System.Drawing.Point(0, 0); + this.tsContainer.Margin = new System.Windows.Forms.Padding(4); this.tsContainer.Name = "tsContainer"; - this.tsContainer.Size = new System.Drawing.Size(966, 523); + this.tsContainer.Size = new System.Drawing.Size(1288, 644); this.tsContainer.TabIndex = 17; this.tsContainer.Text = "ToolStripContainer1"; // // tsContainer.TopToolStripPanel // + this.tsContainer.TopToolStripPanel.Controls.Add(this._externalToolsToolStrip); + this.tsContainer.TopToolStripPanel.Controls.Add(this._quickConnectToolStrip); this.tsContainer.TopToolStripPanel.Controls.Add(this.msMain); // // tmrAutoSave @@ -95,14 +132,70 @@ namespace mRemoteNG.UI.Forms this.tmrAutoSave.Interval = 10000; this.tmrAutoSave.Tick += new System.EventHandler(this.tmrAutoSave_Tick); // - // frmMain + // _externalToolsToolStrip // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this._externalToolsToolStrip.BackColor = System.Drawing.SystemColors.Control; + this._externalToolsToolStrip.ForeColor = System.Drawing.SystemColors.ControlText; + this._externalToolsToolStrip.Location = new System.Drawing.Point(271, 0); + this._externalToolsToolStrip.MaximumSize = new System.Drawing.Size(0, 25); + this._externalToolsToolStrip.Name = "_externalToolsToolStrip"; + this._externalToolsToolStrip.Size = new System.Drawing.Size(111, 25); + this._externalToolsToolStrip.TabIndex = 17; + // + // _quickConnectToolStrip + // + this._quickConnectToolStrip.BackColor = System.Drawing.SystemColors.Control; + this._quickConnectToolStrip.ForeColor = System.Drawing.SystemColors.ControlText; + this._quickConnectToolStrip.Location = new System.Drawing.Point(3, 25); + this._quickConnectToolStrip.MaximumSize = new System.Drawing.Size(0, 25); + this._quickConnectToolStrip.Name = "_quickConnectToolStrip"; + this._quickConnectToolStrip.Size = new System.Drawing.Size(364, 25); + this._quickConnectToolStrip.TabIndex = 18; + // + // mainFileMenu1 + // + this.mainFileMenu1.ConnectionInitiator = null; + this.mainFileMenu1.Name = "mMenFile"; + this.mainFileMenu1.Size = new System.Drawing.Size(37, 20); + this.mainFileMenu1.Text = "&File"; + this.mainFileMenu1.TreeWindow = null; + this.mainFileMenu1.DropDownOpening += new System.EventHandler(this.mainFileMenu1_DropDownOpening); + // + // viewMenu1 + // + this.viewMenu1.FullscreenHandler = null; + this.viewMenu1.MainForm = null; + this.viewMenu1.Name = "mMenView"; + this.viewMenu1.Size = new System.Drawing.Size(44, 20); + this.viewMenu1.Text = "&View"; + this.viewMenu1.TsExternalTools = null; + this.viewMenu1.TsQuickConnect = null; + this.viewMenu1.DropDownOpening += new System.EventHandler(this.ViewMenu_Opening); + // + // toolsMenu1 + // + this.toolsMenu1.CredentialProviderCatalog = null; + this.toolsMenu1.MainForm = null; + this.toolsMenu1.Name = "mMenTools"; + this.toolsMenu1.Size = new System.Drawing.Size(47, 20); + this.toolsMenu1.Text = "&Tools"; + // + // helpMenu1 + // + this.helpMenu1.Name = "mMenInfo"; + this.helpMenu1.Size = new System.Drawing.Size(44, 20); + this.helpMenu1.Text = "&Help"; + this.helpMenu1.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal; + // + // FrmMain + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(966, 523); + this.ClientSize = new System.Drawing.Size(1288, 644); this.Controls.Add(this.tsContainer); this.Icon = global::mRemoteNG.Resources.mRemote_Icon; this.MainMenuStrip = this.msMain; + this.Margin = new System.Windows.Forms.Padding(4); this.Name = "FrmMain"; this.Opacity = 0D; this.Text = "mRemoteNG"; @@ -132,5 +225,11 @@ namespace mRemoteNG.UI.Forms internal System.Windows.Forms.Timer tmrAutoSave; internal System.Windows.Forms.ToolStripSeparator mMenSep3; private System.ComponentModel.IContainer components; + private Menu.MainFileMenu mainFileMenu1; + private Menu.ViewMenu viewMenu1; + private Menu.ToolsMenu toolsMenu1; + private Menu.HelpMenu helpMenu1; + internal mRemoteNG.UI.Controls.QuickConnectToolStrip _quickConnectToolStrip; + internal mRemoteNG.UI.Controls.ExternalToolsToolStrip _externalToolsToolStrip; } } diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index 049ac048..9e1a388f 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -20,12 +20,12 @@ using mRemoteNG.Credential; using mRemoteNG.Messages; using mRemoteNG.Themes; using mRemoteNG.Tools; -using mRemoteNG.UI.Controls; using mRemoteNG.UI.Menu; using mRemoteNG.UI.TaskDialog; using mRemoteNG.UI.Window; using Microsoft.Win32; using WeifenLuo.WinFormsUI.Docking; + // ReSharper disable MemberCanBePrivate.Global namespace mRemoteNG.UI.Forms @@ -44,9 +44,8 @@ namespace mRemoteNG.UI.Forms private readonly ScreenSelectionSystemMenu _screenSystemMenu; private ConnectionInfo _selectedConnection; internal FullscreenHandler _fullscreen { get; set; } - private readonly QuickConnectToolStrip _quickConnectToolStrip; - private readonly ExternalToolsToolStrip _externalToolsToolStrip; - private readonly IConnectionInitiator _connectionInitiator = new ConnectionInitiator(); + + internal readonly IConnectionInitiator _connectionInitiator = new ConnectionInitiator(); private readonly string _credentialFilePath = Path.Combine(CredentialsFileInfo.CredentialsPath, CredentialsFileInfo.CredentialsFile); @@ -57,8 +56,7 @@ namespace mRemoteNG.UI.Forms _fullscreen = new FullscreenHandler(this); pnlDock.Theme = new VS2012LightTheme(); _screenSystemMenu = new ScreenSelectionSystemMenu(this); - _quickConnectToolStrip = new QuickConnectToolStrip(_connectionInitiator); - _externalToolsToolStrip = new ExternalToolsToolStrip(); + } static FrmMain() @@ -136,13 +134,7 @@ namespace mRemoteNG.UI.Forms Startup.Instance.InitializeProgram(messageCollector); - msMain.Items.AddRange(new ToolStripItem[] - { - new MainFileMenu(Windows.TreeForm, _connectionInitiator), - new ViewMenu(_externalToolsToolStrip, _quickConnectToolStrip, _fullscreen, this), - new ToolsMenu(this, Runtime.CredentialProviderCatalog), - new HelpMenu() - }); + SetMenuDependencies(); var settingsLoader = new SettingsLoader(this, messageCollector, _quickConnectToolStrip, _externalToolsToolStrip); settingsLoader.LoadSettings(); @@ -173,6 +165,20 @@ namespace mRemoteNG.UI.Forms Opacity = 1; } + private void SetMenuDependencies() + { + mainFileMenu1.TreeWindow = Windows.TreeForm; + mainFileMenu1.ConnectionInitiator = _connectionInitiator; + + viewMenu1.TsExternalTools = _externalToolsToolStrip; + viewMenu1.TsQuickConnect = _quickConnectToolStrip; + viewMenu1.FullscreenHandler = _fullscreen; + viewMenu1.MainForm = this; + + toolsMenu1.MainForm = this; + toolsMenu1.CredentialProviderCatalog = Runtime.CredentialProviderCatalog; + } + private void ApplyThemes() { pnlDock.DockBackColor = ThemeManager.ActiveTheme.WindowBackgroundColor; @@ -550,5 +556,15 @@ namespace mRemoteNG.UI.Forms } } #endregion + + private void ViewMenu_Opening(object sender, EventArgs e) + { + viewMenu1.mMenView_DropDownOpening(sender, e); + } + + private void mainFileMenu1_DropDownOpening(object sender, EventArgs e) + { + mainFileMenu1.mMenFile_DropDownOpening(sender, e); + } } } \ No newline at end of file diff --git a/mRemoteV1/UI/Forms/frmMain.resx b/mRemoteV1/UI/Forms/frmMain.resx index e8299835..a5d8732f 100644 --- a/mRemoteV1/UI/Forms/frmMain.resx +++ b/mRemoteV1/UI/Forms/frmMain.resx @@ -118,24 +118,15 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 375, 17 + + + 197, 17 + + 17, 17 - - 112, 17 - - - 591, 17 - - - 724, 17 - - - 249, 17 - - - 447, 17 - - 891, 17 + 470, 17 \ No newline at end of file diff --git a/mRemoteV1/UI/Menu/MainFileMenu.cs b/mRemoteV1/UI/Menu/MainFileMenu.cs index 60e39ae1..ebdb714a 100644 --- a/mRemoteV1/UI/Menu/MainFileMenu.cs +++ b/mRemoteV1/UI/Menu/MainFileMenu.cs @@ -35,18 +35,11 @@ namespace mRemoteNG.UI.Menu private ToolStripMenuItem _mMenFileImport; private ToolStripMenuItem _mMenReconnectAll; - private readonly ConnectionTreeWindow _connectionTreeWindow; - private readonly IConnectionInitiator _connectionInitiator; + public ConnectionTreeWindow TreeWindow { get; set; } + public IConnectionInitiator ConnectionInitiator { get; set; } - public MainFileMenu(ConnectionTreeWindow connectionTreeWindow, IConnectionInitiator connectionInitiator) + public MainFileMenu() { - if (connectionTreeWindow == null) - throw new ArgumentNullException(nameof(connectionTreeWindow)); - if (connectionInitiator == null) - throw new ArgumentNullException(nameof(connectionInitiator)); - - _connectionTreeWindow = connectionTreeWindow; - _connectionInitiator = connectionInitiator; Initialize(); } @@ -100,7 +93,7 @@ namespace mRemoteNG.UI.Menu Name = "mMenFile"; Size = new System.Drawing.Size(37, 20); Text = Language.strMenuFile; - DropDownOpening += mMenFile_DropDownOpening; + //DropDownOpening += mMenFile_DropDownOpening; // // mMenFileNewConnection // @@ -263,9 +256,9 @@ namespace mRemoteNG.UI.Menu } #region File - private void mMenFile_DropDownOpening(object sender, EventArgs e) + internal void mMenFile_DropDownOpening(object sender, EventArgs e) { - var selectedNodeType = _connectionTreeWindow.SelectedNode?.GetTreeNodeType(); + var selectedNodeType = TreeWindow.SelectedNode?.GetTreeNodeType(); // ReSharper disable once SwitchStatementMissingSomeCases switch (selectedNodeType) { @@ -335,13 +328,13 @@ namespace mRemoteNG.UI.Menu private void mMenFileNewConnection_Click(object sender, EventArgs e) { - _connectionTreeWindow.ConnectionTree.AddConnection(); + TreeWindow.ConnectionTree.AddConnection(); Runtime.SaveConnectionsAsync(); } private void mMenFileNewFolder_Click(object sender, EventArgs e) { - _connectionTreeWindow.ConnectionTree.AddFolder(); + TreeWindow.ConnectionTree.AddFolder(); Runtime.SaveConnectionsAsync(); } @@ -387,19 +380,19 @@ namespace mRemoteNG.UI.Menu private void mMenFileDelete_Click(object sender, EventArgs e) { - _connectionTreeWindow.ConnectionTree.DeleteSelectedNode(); + TreeWindow.ConnectionTree.DeleteSelectedNode(); Runtime.SaveConnectionsAsync(); } private void mMenFileRename_Click(object sender, EventArgs e) { - _connectionTreeWindow.ConnectionTree.RenameSelectedNode(); + TreeWindow.ConnectionTree.RenameSelectedNode(); Runtime.SaveConnectionsAsync(); } private void mMenFileDuplicate_Click(object sender, EventArgs e) { - _connectionTreeWindow.ConnectionTree.DuplicateSelectedNode(); + TreeWindow.ConnectionTree.DuplicateSelectedNode(); Runtime.SaveConnectionsAsync(); } @@ -425,7 +418,7 @@ namespace mRemoteNG.UI.Menu foreach (var i in icList) { i.Protocol.Close(); - _connectionInitiator.OpenConnection(i.Info, ConnectionInfo.Force.DoNotJump); + ConnectionInitiator.OpenConnection(i.Info, ConnectionInfo.Force.DoNotJump); } // throw it on the garbage collector @@ -436,7 +429,7 @@ namespace mRemoteNG.UI.Menu private void mMenFileImportFromFile_Click(object sender, EventArgs e) { - var selectedNode = _connectionTreeWindow.SelectedNode; + var selectedNode = TreeWindow.SelectedNode; ContainerInfo importDestination; if (selectedNode == null) importDestination = Runtime.ConnectionTreeModel.RootNodes.First(); diff --git a/mRemoteV1/UI/Menu/ToolsMenu.cs b/mRemoteV1/UI/Menu/ToolsMenu.cs index 12eb4d90..3a55017e 100644 --- a/mRemoteV1/UI/Menu/ToolsMenu.cs +++ b/mRemoteV1/UI/Menu/ToolsMenu.cs @@ -17,13 +17,12 @@ namespace mRemoteNG.UI.Menu private ToolStripMenuItem _mMenToolsUvncsc; private ToolStripMenuItem _mMenToolsComponentsCheck; private ToolStripMenuItem _credentialManagerToolStripMenuItem; - private readonly ICredentialRepositoryList _credentialProviderCatalog; - private readonly Form _form; - public ToolsMenu(Form form, ICredentialRepositoryList credentialProviderCatalog) + public Form MainForm { get; set; } + public ICredentialRepositoryList CredentialProviderCatalog { get; set; } + + public ToolsMenu() { - _form = form; - _credentialProviderCatalog = credentialProviderCatalog; Initialize(); } @@ -122,14 +121,15 @@ namespace mRemoteNG.UI.Menu { var pages = new UserControl[] { - new CredentialListPage(_credentialProviderCatalog) + new CredentialListPage(CredentialProviderCatalog) { DeletionConfirmer = new CredentialDeletionMsgBoxConfirmer(MessageBox.Show) }, - new CredentialRepositoriesPage(_credentialProviderCatalog) + new CredentialRepositoriesPage(CredentialProviderCatalog) }; + var credentialManagerForm = new CredentialManagerForm(pages); - credentialManagerForm.CenterOnTarget(_form); + credentialManagerForm.CenterOnTarget(MainForm); credentialManagerForm.Show(); } diff --git a/mRemoteV1/UI/Menu/ViewMenu.cs b/mRemoteV1/UI/Menu/ViewMenu.cs index dcd26c3f..432d4d5d 100644 --- a/mRemoteV1/UI/Menu/ViewMenu.cs +++ b/mRemoteV1/UI/Menu/ViewMenu.cs @@ -25,19 +25,15 @@ namespace mRemoteNG.UI.Menu private ToolStripMenuItem _mMenViewJumpToErrorsInfos; private ToolStripMenuItem _mMenViewResetLayout; private ToolStripSeparator _toolStripSeparator1; - private readonly ToolStrip _tsExternalTools; - private readonly ToolStrip _tsQuickConnect; - private readonly FullscreenHandler _fullscreenHandler; - private readonly FrmMain _mainForm; + + public ToolStrip TsExternalTools { get; set; } + public ToolStrip TsQuickConnect { get; set; } + public FullscreenHandler FullscreenHandler { get; set; } + public FrmMain MainForm { get; set; } - public ViewMenu(ToolStrip tsExternalTools, ToolStrip tsQuickConnect, FullscreenHandler fullscreenHandler, FrmMain mainForm) + public ViewMenu() { - _tsExternalTools = tsExternalTools; - _tsQuickConnect = tsQuickConnect; - _fullscreenHandler = fullscreenHandler; - _mainForm = mainForm; - Initialize(); ApplyLanguage(); } @@ -84,7 +80,7 @@ namespace mRemoteNG.UI.Menu Name = "mMenView"; Size = new System.Drawing.Size(44, 20); Text = Language.strMenuView; - DropDownOpening += mMenView_DropDownOpening; + //DropDownOpening += mMenView_DropDownOpening; // // mMenViewAddConnectionPanel // @@ -242,15 +238,15 @@ namespace mRemoteNG.UI.Menu } #region View - private void mMenView_DropDownOpening(object sender, EventArgs e) + internal void mMenView_DropDownOpening(object sender, EventArgs e) { _mMenViewConnections.Checked = !Windows.TreeForm.IsHidden; _mMenViewConfig.Checked = !Windows.ConfigForm.IsHidden; _mMenViewErrorsAndInfos.Checked = !Windows.ErrorsForm.IsHidden; _mMenViewScreenshotManager.Checked = !Windows.ScreenshotForm.IsHidden; - _mMenViewExtAppsToolbar.Checked = _tsExternalTools.Visible; - _mMenViewQuickConnectToolbar.Checked = _tsQuickConnect.Visible; + _mMenViewExtAppsToolbar.Checked = TsExternalTools.Visible; + _mMenViewQuickConnectToolbar.Checked = TsQuickConnect.Visible; _mMenViewConnectionPanels.DropDownItems.Clear(); @@ -267,7 +263,7 @@ namespace mRemoteNG.UI.Menu private void ConnectionPanelMenuItem_Click(object sender, EventArgs e) { - ((BaseWindow)((ToolStripMenuItem)sender).Tag).Show(_mainForm.pnlDock); + ((BaseWindow)((ToolStripMenuItem)sender).Tag).Show(MainForm.pnlDock); ((BaseWindow)((ToolStripMenuItem)sender).Tag).Focus(); } @@ -275,7 +271,7 @@ namespace mRemoteNG.UI.Menu { if (_mMenViewConnections.Checked == false) { - Windows.TreeForm.Show(_mainForm.pnlDock); + Windows.TreeForm.Show(MainForm.pnlDock); _mMenViewConnections.Checked = true; } else @@ -289,7 +285,7 @@ namespace mRemoteNG.UI.Menu { if (_mMenViewConfig.Checked == false) { - Windows.ConfigForm.Show(_mainForm.pnlDock); + Windows.ConfigForm.Show(MainForm.pnlDock); _mMenViewConfig.Checked = true; } else @@ -303,7 +299,7 @@ namespace mRemoteNG.UI.Menu { if (_mMenViewErrorsAndInfos.Checked == false) { - Windows.ErrorsForm.Show(_mainForm.pnlDock); + Windows.ErrorsForm.Show(MainForm.pnlDock); _mMenViewErrorsAndInfos.Checked = true; } else @@ -317,7 +313,7 @@ namespace mRemoteNG.UI.Menu { if (_mMenViewScreenshotManager.Checked == false) { - Windows.ScreenshotForm.Show(_mainForm.pnlDock); + Windows.ScreenshotForm.Show(MainForm.pnlDock); _mMenViewScreenshotManager.Checked = true; } else @@ -329,7 +325,7 @@ namespace mRemoteNG.UI.Menu private void mMenViewJumpToConnectionsConfig_Click(object sender, EventArgs e) { - if (_mainForm.pnlDock.ActiveContent == Windows.TreeForm) + if (MainForm.pnlDock.ActiveContent == Windows.TreeForm) { Windows.ConfigForm.Activate(); } @@ -350,7 +346,7 @@ namespace mRemoteNG.UI.Menu MessageBoxIcon.Question); if (msgBoxResult == DialogResult.Yes) { - _mainForm.SetDefaultLayout(); + MainForm.SetDefaultLayout(); } } @@ -363,12 +359,12 @@ namespace mRemoteNG.UI.Menu { if (_mMenViewExtAppsToolbar.Checked == false) { - _tsExternalTools.Visible = true; + TsExternalTools.Visible = true; _mMenViewExtAppsToolbar.Checked = true; } else { - _tsExternalTools.Visible = false; + TsExternalTools.Visible = false; _mMenViewExtAppsToolbar.Checked = false; } } @@ -377,20 +373,20 @@ namespace mRemoteNG.UI.Menu { if (_mMenViewQuickConnectToolbar.Checked == false) { - _tsQuickConnect.Visible = true; + TsQuickConnect.Visible = true; _mMenViewQuickConnectToolbar.Checked = true; } else { - _tsQuickConnect.Visible = false; + TsQuickConnect.Visible = false; _mMenViewQuickConnectToolbar.Checked = false; } } private void mMenViewFullscreen_Click(object sender, EventArgs e) { - _fullscreenHandler.Value = !_fullscreenHandler.Value; - _mMenViewFullscreen.Checked = _fullscreenHandler.Value; + FullscreenHandler.Value = !FullscreenHandler.Value; + _mMenViewFullscreen.Checked = FullscreenHandler.Value; } #endregion } diff --git a/mRemoteV1/UI/Window/ComponentsCheckWindow.cs b/mRemoteV1/UI/Window/ComponentsCheckWindow.cs index c196f2e8..adf00dfb 100644 --- a/mRemoteV1/UI/Window/ComponentsCheckWindow.cs +++ b/mRemoteV1/UI/Window/ComponentsCheckWindow.cs @@ -438,7 +438,7 @@ namespace mRemoteNG.UI.Window } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage("Failed to properly show the ComponentsWindow", ex, MessageClass.ErrorMsg, true); + Runtime.MessageCollector.AddExceptionMessage("Failed to properly show the ComponentsWindow", ex); } } #endregion diff --git a/mRemoteV1/UI/Window/UltraVNCWindow.cs b/mRemoteV1/UI/Window/UltraVNCWindow.cs index b179bd3f..6de15c1f 100644 --- a/mRemoteV1/UI/Window/UltraVNCWindow.cs +++ b/mRemoteV1/UI/Window/UltraVNCWindow.cs @@ -44,9 +44,9 @@ namespace mRemoteNG.UI.Window // //pnlContainer // - this.pnlContainer.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); + this.pnlContainer.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom + | System.Windows.Forms.AnchorStyles.Left + | System.Windows.Forms.AnchorStyles.Right; this.pnlContainer.Location = new System.Drawing.Point(0, 27); this.pnlContainer.Name = "pnlContainer"; this.pnlContainer.Size = new System.Drawing.Size(446, 335); @@ -118,12 +118,13 @@ namespace mRemoteNG.UI.Window } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "StartListening (UI.Window.UltraVNCSC) failed" + Environment.NewLine + ex.Message, false); + Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "StartListening (UI.Window.UltraVNCSC) failed" + Environment.NewLine + ex.Message); Close(); } } - - private void SetupLicense() + +#if false + private void SetupLicense() { try { @@ -136,7 +137,8 @@ namespace mRemoteNG.UI.Window Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "VNC SetupLicense failed (UI.Window.UltraVNCSC)" + Environment.NewLine + ex.Message, true); } } - +#endif + //Private Sub vnc_ConnectionAccepted(ByVal sender As Object, ByVal e As AxViewerX._ISmartCodeVNCViewerEvents_ConnectionAcceptedEvent) Handles vnc.ConnectionAccepted // mC.AddMessage(Messages.MessageClass.InformationMsg, e.bstrServerAddress & " is now connected to your UltraVNC SingleClick panel!") //End Sub @@ -145,12 +147,12 @@ namespace mRemoteNG.UI.Window // StartListening() //End Sub - private void btnDisconnect_Click(System.Object sender, System.EventArgs e) + private void btnDisconnect_Click(object sender, EventArgs e) { //vnc.Dispose() Dispose(); Windows.Show(WindowType.UltraVNCSC); } - #endregion +#endregion } } \ No newline at end of file diff --git a/mRemoteV1/UI/WindowList.cs b/mRemoteV1/UI/WindowList.cs index 65aa99e1..7f36cc1b 100644 --- a/mRemoteV1/UI/WindowList.cs +++ b/mRemoteV1/UI/WindowList.cs @@ -1,10 +1,8 @@ using System; using System.Collections; -using System.Windows.Forms; +using mRemoteNG.UI.Window; - - -namespace mRemoteNG.UI.Window +namespace mRemoteNG.UI { public class WindowList : CollectionBase { @@ -13,13 +11,13 @@ namespace mRemoteNG.UI.Window { get { - this.CleanUp(); + CleanUp(); if (Index is BaseWindow) return IndexByObject(Index); - else if (Index is Int32) - return IndexByNumber(Convert.ToInt32(Index)); - - return null; + if (Index is int) + return IndexByNumber(Convert.ToInt32(Index)); + + return null; } } @@ -27,7 +25,7 @@ namespace mRemoteNG.UI.Window { get { - this.CleanUp(); + CleanUp(); return List.Count; } } @@ -36,27 +34,27 @@ namespace mRemoteNG.UI.Window #region Public Methods public void Add(BaseWindow uiWindow) { - this.List.Add(uiWindow); + List.Add(uiWindow); //AddHandler uiWindow.FormClosing, AddressOf uiFormClosing } public void AddRange(BaseWindow[] uiWindow) { - foreach (Form uW in uiWindow) + foreach (var uW in uiWindow) { - this.List.Add(uW); + List.Add(uW); } } public void Remove(BaseWindow uiWindow) { - this.List.Remove(uiWindow); + List.Remove(uiWindow); } public BaseWindow FromString(string uiWindow) { - this.CleanUp(); - for (int i = 0; i < this.List.Count; i++) + CleanUp(); + for (var i = 0; i < List.Count; i++) { if (this[i].Text == uiWindow.Replace("&", "&&")) { @@ -71,19 +69,18 @@ namespace mRemoteNG.UI.Window private void CleanUp() { - for (int i = 0; i <= this.List.Count - 1; i++) + for (var i = 0; i <= List.Count - 1; i++) { - if (i > this.List.Count - 1) + if (i > List.Count - 1) { CleanUp(); return; } - if ((this.List[i] as BaseWindow).IsDisposed) - { - this.List.RemoveAt(i); - CleanUp(); - return; - } + var baseWindow = List[i] as BaseWindow; + if (baseWindow != null && !baseWindow.IsDisposed) continue; + List.RemoveAt(i); + CleanUp(); + return; } } @@ -91,7 +88,7 @@ namespace mRemoteNG.UI.Window { try { - int objectIndex = this.List.IndexOf(Index); + var objectIndex = List.IndexOf(Index); return IndexByNumber(objectIndex); } catch (ArgumentOutOfRangeException e) @@ -104,17 +101,19 @@ namespace mRemoteNG.UI.Window { try { - return this.List[Index] as BaseWindow; + return List[Index] as BaseWindow; } catch (ArgumentOutOfRangeException e) { throw new ArgumentOutOfRangeException(e.ParamName, e.ActualValue, "Index was out of bounds"); } } - + + /* private void uiFormClosing(object sender, FormClosingEventArgs e) { - this.List.Remove(sender); + List.Remove(sender); } + */ } } \ No newline at end of file diff --git a/mRemoteV1/app.config b/mRemoteV1/app.config index 35d267fb..f7cd32c2 100644 --- a/mRemoteV1/app.config +++ b/mRemoteV1/app.config @@ -1,12 +1,12 @@ - +
- -
+ +
- -
+ +
@@ -22,10 +22,10 @@ - - - - + + + + @@ -50,7 +50,7 @@ True - + True @@ -68,7 +68,7 @@ False - + True @@ -95,13 +95,13 @@ noinfo - + - + - + False @@ -119,7 +119,7 @@ False - + 80 @@ -128,13 +128,13 @@ False - + - + - + RDP @@ -221,13 +221,13 @@ False - + - + - + False @@ -299,10 +299,10 @@ False - + - + False @@ -341,10 +341,10 @@ EncHextile - + - + 0 @@ -353,7 +353,7 @@ ProxyNone - + False @@ -407,7 +407,7 @@ False - + IE @@ -416,7 +416,7 @@ False - + False @@ -425,13 +425,13 @@ False - + False - + False @@ -479,19 +479,19 @@ 5 - + - + - + - + - + False @@ -533,22 +533,22 @@ release - + True - + - + True - + True @@ -608,7 +608,7 @@ 00000000-0000-0000-0000-000000000000 - + False @@ -653,16 +653,16 @@ - - de,el,en,en-US,es-AR,es,fr,hu,it,ja-JP,nb-NO,nl,pt,pt-BR,pl,ru,uk,tr-TR,zh-CN,zh-TW - https://mremoteng.org/ + + cs-CZ,de,el,en,en-US,es-AR,es,fr,hu,it,ja-JP,nb-NO,nl,pt,pt-BR,pl,ru,uk,tr-TR,zh-CN,zh-TW + - \ No newline at end of file + diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index a143d7ea..0d3ef641 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -27,6 +27,9 @@ false v4.0 + + + True publish\ true Disk @@ -42,9 +45,6 @@ false true true - - - True @@ -59,15 +59,15 @@ ..\packages\Geckofx45.45.0.22\lib\net40\Geckofx-Winforms.dll True + + ..\packages\log4net.2.0.8\lib\net40-full\log4net.dll + True + False References\ADTree.dll - - False - References\log4net.dll - False References\MagicLibrary.dll @@ -206,6 +206,7 @@ + @@ -678,6 +679,7 @@ + Designer @@ -1474,7 +1476,17 @@ powershell -noprofile -command "sleep 2" -call "$(DevEnvDir)..\tools\vsvars32.bat" + +rem VS 2015 +IF EXIST "$(DevEnvDir)..\tools\vsvars32.bat" ( + call "$(DevEnvDir)..\tools\vsvars32.bat" +) + +rem VS 2017 +IF EXIST "$(DevEnvDir)..\..\VC\Auxiliary\Build\vcvars32.bat" ( +call "$(DevEnvDir)..\..\VC\Auxiliary\Build\vcvars32.bat" +) + set /p buildenv=<buildenv.tmp echo Copy PUTTYNG to correct directory @@ -1497,7 +1509,7 @@ editbin /largeaddressaware mRemoteNG.exe IF EXIST C:\mRemoteNG_code_signing_cert.pfx ( echo Signing binaries IF %25buildenv: Portable=%25==Release ( - powershell "&""$(SolutionDir)Tools\signfiles.ps1""" '%25cd%25' + powershell -File "$(SolutionDir)Tools\signfiles.ps1" -PathToSignableFiles %25cd%25 -Exclude 'PuTTYNG.exe' ) ) @@ -1523,6 +1535,7 @@ IF %25buildenv: =%25==ReleasePortable ( x86 false MinimumRecommendedRules.ruleset + false false @@ -1534,6 +1547,7 @@ IF %25buildenv: =%25==ReleasePortable ( AllRules.ruleset 1 false + false false @@ -1545,6 +1559,7 @@ IF %25buildenv: =%25==ReleasePortable ( x86 false AllRules.ruleset + false true @@ -1557,6 +1572,7 @@ IF %25buildenv: =%25==ReleasePortable ( x86 false MinimumRecommendedRules.ruleset + false