merged develop into pr/1690

This commit is contained in:
Faryan Rezagholi
2020-05-26 10:52:52 +02:00
76 changed files with 6545 additions and 5893 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -139,11 +139,6 @@ Copyright © 2006-2016 Phillip Piper
GNU General Public License (GPL) Version 3
https://sourceforge.net/projects/objectlistview/
Markdig
Copyright © 2016-2019 Alexandre Mutel
BSD 2-Clause "Simplified"
https://github.com/lunet-io/markdig
ConsoleControl
Copyright © 2015 Dave Kerr
MIT License

View File

@@ -2,7 +2,7 @@
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<?include $(sys.CURRENTDIR)Includes\Config.wxi?>
<Fragment>
<Component Id="C.MainExe" Directory="INSTALLDIR" Guid="*">
<Component Id="C.MainExe" Directory="INSTALLDIR" Guid="a028ee50-3135-46c7-83c0-1d14d36e146c">
<File Id="MainExeFile" Source="$(var.SolutionDir)mRemoteV1\bin\$(var.Configuration)\mRemoteNG.exe" />
</Component>
</Fragment>

View File

@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<Fragment>
<ComponentGroup Id="CG.ProjectInfoFiles" Directory="INSTALLDIR">
<Component Id="C.Changelog" Guid="*">
<File Id="ChangelogFile" Name="Changelog.txt" Source="$(var.SolutionDir)CHANGELOG.md" KeyPath="yes" />
<Component Id="C.Changelog" Guid="762459f4-0460-4058-a448-d0f4e5cd4a65">
<File Id="ChangelogFile" Name="Changelog" Source="$(var.SolutionDir)CHANGELOG.md" KeyPath="yes" />
</Component>
<Component Id="C.Credits" Guid="*">
<File Id="CreditsFile" Name="Credits.txt" Source="$(var.SolutionDir)CREDITS.md" KeyPath="yes" />
<Component Id="C.Credits" Guid="30d1a804-209f-4535-a546-1610a76c3d1b">
<File Id="CreditsFile" Name="Credits" Source="$(var.SolutionDir)CREDITS.md" KeyPath="yes" />
</Component>
<Component Id="C.License" Guid="*">
<File Id="LicenseFile" Name="License.txt" Source="$(var.SolutionDir)COPYING.TXT" KeyPath="yes" />
<Component Id="C.License" Guid="89e79101-fcf9-4277-b948-1fd5f1fcae69">
<File Id="LicenseFile" Name="License" Source="$(var.SolutionDir)COPYING.TXT" KeyPath="yes" />
</Component>
<Component Id="C.Readme" Guid="*">
<File Id="ReadmeFile" Name="Readme.txt" Source="$(var.SolutionDir)README.md" KeyPath="yes" />
<Component Id="C.Readme" Guid="1359cc74-fe51-4c6e-81f4-2bee7871c40f">
<File Id="ReadmeFile" Name="Readme" Source="$(var.SolutionDir)README.md" KeyPath="yes" />
</Component>
<Component Id="C.TileManifest" Guid="*">
<File Id="TileManifest" Name="mRemoteNG.VisualElementsManifest.xml" Source="$(var.SolutionDir)mRemoteV1\bin\Release\mRemoteNG.VisualElementsManifest.xml" KeyPath="yes" />
<Component Id="C.TileManifest" Guid="5d067bad-f6f6-466e-b1aa-d68b496026d3">
<File Id="TileManifest" Name="VisualElementsManifest" Source="$(var.mRemoteV1.TargetDir)mRemoteNG.VisualElementsManifest.xml" KeyPath="yes" />
</Component>
</ComponentGroup>
</Fragment>
</Fragment>
</Wix>

View File

@@ -2,7 +2,7 @@
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="INSTALLDIR">
<Component Id="C.PuttyNGFile" Guid="*">
<Component Id="C.PuttyNGFile" Guid="86bc1cf4-4c51-40a1-a9fe-cf9669bb883a">
<File Id="PuttyNGFile" Name="PuTTYNG.exe" Source="$(var.HarvestPath)\PuTTYNG.exe" KeyPath="yes" />
</Component>
</DirectoryRef>

View File

@@ -2,7 +2,7 @@
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="TARGETDIR">
<Component Id="C.RegistryEntries" Guid="*">
<Component Id="C.RegistryEntries" Guid="888643e4-4c52-45d3-801a-0d0d71c737fe">
<RegistryKey Root="HKLM" Key="Software\mRemoteNG">
<RegistryValue Type="string" Name="InstallDir" Value="[INSTALLDIR]" KeyPath="yes" />
</RegistryKey>

View File

@@ -34,7 +34,7 @@ mRemoteNG supports the following protocols:
* rlogin (Remote Login)
* Raw Socket Connections
For a detailed feature list and general usage support, refer to the [User Manual](https://github.com/mRemoteNG/mRemoteNG/wiki/User-Manual).
For a detailed feature list and general usage support, refer to the [Documentation](https://mremoteng.readthedocs.io/en/latest/).
## Installation

View File

@@ -13,7 +13,7 @@
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="BouncyCastle.Crypto" publicKeyToken="0e99375e54769942" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.8.5.0" newVersion="1.8.5.0" />
<bindingRedirect oldVersion="0.0.0.0-1.8.6.0" newVersion="1.8.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
@@ -25,11 +25,23 @@
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Google.Protobuf" publicKeyToken="a7d26565bac4d604" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.9.2.0" newVersion="3.9.2.0" />
<bindingRedirect oldVersion="0.0.0.0-3.12.1.0" newVersion="3.12.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
<bindingRedirect oldVersion="0.0.0.0-4.0.6.0" newVersion="4.0.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Cucumber.Messages" publicKeyToken="b10c5988214f940c" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.2.0" newVersion="6.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\SpecFlow.NUnit.3.0.225\build\SpecFlow.NUnit.props" Condition="Exists('..\packages\SpecFlow.NUnit.3.0.225\build\SpecFlow.NUnit.props')" />
<Import Project="..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props')" />
<Import Project="..\packages\SpecFlow.NUnit.3.1.97\build\SpecFlow.NUnit.props" Condition="Exists('..\packages\SpecFlow.NUnit.3.1.97\build\SpecFlow.NUnit.props')" />
<Import Project="..\packages\NUnit3TestAdapter.3.16.1\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\packages\NUnit3TestAdapter.3.16.1\build\net35\NUnit3TestAdapter.props')" />
<Import Project="..\packages\NUnit.3.12.0\build\NUnit.props" Condition="Exists('..\packages\NUnit.3.12.0\build\NUnit.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
@@ -40,22 +40,74 @@
<Reference Include="BoDi, Version=1.4.1.0, Culture=neutral, PublicKeyToken=ff7cd5ea2744b496, processorArchitecture=MSIL">
<HintPath>..\packages\BoDi.1.4.1\lib\net45\BoDi.dll</HintPath>
</Reference>
<Reference Include="Cucumber.Messages, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b10c5988214f940c, processorArchitecture=MSIL">
<HintPath>..\packages\Cucumber.Messages.6.0.2\lib\net45\Cucumber.Messages.dll</HintPath>
</Reference>
<Reference Include="Gherkin, Version=6.0.0.0, Culture=neutral, PublicKeyToken=86496cfa5b4a5851, processorArchitecture=MSIL">
<HintPath>..\packages\Gherkin.6.0.0\lib\net45\Gherkin.dll</HintPath>
</Reference>
<Reference Include="Google.Protobuf, Version=3.12.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Protobuf.3.12.1\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="nunit.framework, Version=3.12.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.12.0\lib\net45\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Core" />
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.6.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
<Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime, Version=4.1.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.4.3.1\lib\net462\System.Runtime.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.7.1\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Algorithms, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Algorithms.4.3.1\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.2, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.X509Certificates.4.3.2\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.3\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll</HintPath>
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
@@ -64,13 +116,12 @@
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="TechTalk.SpecFlow, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL">
<HintPath>..\packages\SpecFlow.3.0.225\lib\net45\TechTalk.SpecFlow.dll</HintPath>
<Reference Include="TechTalk.SpecFlow, Version=3.1.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL">
<HintPath>..\packages\SpecFlow.3.1.97\lib\net45\TechTalk.SpecFlow.dll</HintPath>
</Reference>
<Reference Include="TechTalk.SpecFlow.NUnit.SpecFlowPlugin, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL">
<HintPath>..\packages\SpecFlow.NUnit.3.0.225\lib\net45\TechTalk.SpecFlow.NUnit.SpecFlowPlugin.dll</HintPath>
<Reference Include="TechTalk.SpecFlow.NUnit.SpecFlowPlugin, Version=3.1.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL">
<HintPath>..\packages\SpecFlow.NUnit.3.1.97\lib\net45\TechTalk.SpecFlow.NUnit.SpecFlowPlugin.dll</HintPath>
</Reference>
<Reference Include="Utf8Json, Version=1.3.7.0, Culture=neutral, PublicKeyToken=8a73d3ba7e392e27, processorArchitecture=MSIL">
<HintPath>..\packages\Utf8Json.1.3.7\lib\net47\Utf8Json.dll</HintPath>
@@ -121,11 +172,13 @@
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\NUnit.3.12.0\build\NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit.3.12.0\build\NUnit.props'))" />
<Error Condition="!Exists('..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props'))" />
<Error Condition="!Exists('..\packages\SpecFlow.NUnit.3.0.225\build\SpecFlow.NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\SpecFlow.NUnit.3.0.225\build\SpecFlow.NUnit.props'))" />
<Error Condition="!Exists('..\packages\SpecFlow.NUnit.3.0.225\build\SpecFlow.NUnit.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\SpecFlow.NUnit.3.0.225\build\SpecFlow.NUnit.targets'))" />
<Error Condition="!Exists('..\packages\NUnit3TestAdapter.3.16.1\build\net35\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit3TestAdapter.3.16.1\build\net35\NUnit3TestAdapter.props'))" />
<Error Condition="!Exists('..\packages\SpecFlow.3.1.97\build\SpecFlow.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\SpecFlow.3.1.97\build\SpecFlow.targets'))" />
<Error Condition="!Exists('..\packages\SpecFlow.NUnit.3.1.97\build\SpecFlow.NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\SpecFlow.NUnit.3.1.97\build\SpecFlow.NUnit.props'))" />
<Error Condition="!Exists('..\packages\SpecFlow.NUnit.3.1.97\build\SpecFlow.NUnit.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\SpecFlow.NUnit.3.1.97\build\SpecFlow.NUnit.targets'))" />
</Target>
<Import Project="..\packages\SpecFlow.NUnit.3.0.225\build\SpecFlow.NUnit.targets" Condition="Exists('..\packages\SpecFlow.NUnit.3.0.225\build\SpecFlow.NUnit.targets')" />
<Import Project="..\packages\SpecFlow.3.1.97\build\SpecFlow.targets" Condition="Exists('..\packages\SpecFlow.3.1.97\build\SpecFlow.targets')" />
<Import Project="..\packages\SpecFlow.NUnit.3.1.97\build\SpecFlow.NUnit.targets" Condition="Exists('..\packages\SpecFlow.NUnit.3.1.97\build\SpecFlow.NUnit.targets')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">

View File

@@ -1,25 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="BoDi" version="1.4.1" targetFramework="net472" />
<package id="Cucumber.Messages" version="6.0.2" targetFramework="net472" />
<package id="Gherkin" version="6.0.0" targetFramework="net472" />
<package id="Newtonsoft.Json" version="12.0.2" targetFramework="net472" />
<package id="Google.Protobuf" version="3.12.1" targetFramework="net472" />
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net472" />
<package id="NUnit" version="3.12.0" targetFramework="net472" />
<package id="NUnit.Console" version="3.10.0" targetFramework="net472" />
<package id="NUnit.ConsoleRunner" version="3.10.0" targetFramework="net472" />
<package id="NUnit.Console" version="3.11.1" targetFramework="net472" />
<package id="NUnit.ConsoleRunner" version="3.11.1" targetFramework="net472" />
<package id="NUnit.Extension.NUnitProjectLoader" version="3.6.0" targetFramework="net472" />
<package id="NUnit.Extension.NUnitV2Driver" version="3.7.0" targetFramework="net472" />
<package id="NUnit.Extension.NUnitV2Driver" version="3.8.0" targetFramework="net472" />
<package id="NUnit.Extension.NUnitV2ResultWriter" version="3.6.0" targetFramework="net472" />
<package id="NUnit.Extension.TeamCityEventListener" version="1.0.7" targetFramework="net472" />
<package id="NUnit.Extension.VSProjectLoader" version="3.8.0" targetFramework="net472" />
<package id="NUnit.Runners" version="3.10.0" targetFramework="net472" />
<package id="NUnit3TestAdapter" version="3.15.1" targetFramework="net472" />
<package id="SpecFlow" version="3.0.225" targetFramework="net472" />
<package id="SpecFlow.NUnit" version="3.0.225" targetFramework="net472" />
<package id="SpecFlow.NUnit.Runners" version="3.0.225" targetFramework="net472" />
<package id="System.Reflection.Emit" version="4.6.0" targetFramework="net472" />
<package id="System.Reflection.Emit.Lightweight" version="4.6.0" targetFramework="net472" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.6.0" targetFramework="net472" />
<package id="System.Threading.Tasks.Extensions" version="4.5.3" targetFramework="net472" />
<package id="NUnit.Runners" version="3.11.1" targetFramework="net472" />
<package id="NUnit3TestAdapter" version="3.16.1" targetFramework="net472" developmentDependency="true" />
<package id="SpecFlow" version="3.1.97" targetFramework="net472" />
<package id="SpecFlow.NUnit" version="3.1.97" targetFramework="net472" />
<package id="SpecFlow.NUnit.Runners" version="3.1.97" targetFramework="net472" />
<package id="System.Buffers" version="4.5.1" targetFramework="net472" />
<package id="System.IO" version="4.3.0" targetFramework="net472" />
<package id="System.Memory" version="4.5.4" targetFramework="net472" />
<package id="System.Net.Http" version="4.3.4" targetFramework="net472" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net472" />
<package id="System.Reflection.Emit" version="4.7.0" targetFramework="net472" />
<package id="System.Reflection.Emit.Lightweight" version="4.7.0" targetFramework="net472" />
<package id="System.Runtime" version="4.3.1" targetFramework="net472" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.7.1" targetFramework="net472" />
<package id="System.Security.Cryptography.Algorithms" version="4.3.1" targetFramework="net472" />
<package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net472" />
<package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net472" />
<package id="System.Security.Cryptography.X509Certificates" version="4.3.2" targetFramework="net472" />
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net472" />
<package id="System.ValueTuple" version="4.5.0" targetFramework="net472" />
<package id="Utf8Json" version="1.3.7" targetFramework="net472" />
</packages>

View File

@@ -66,5 +66,7 @@
public TType VNCViewOnly { get; set; }
public TType RdpVersion { get; set; }
public TType UseEnhancedMode { get; set; }
public TType SSHOptions { get; set; }
public TType SSHTunnelConnectionName { get; set; }
}
}

View File

@@ -248,6 +248,7 @@ namespace mRemoteNGTests.UI.Window.ConfigWindowTests
nameof(ConnectionInfo.MacAddress),
nameof(ConnectionInfo.UserField),
nameof(ConnectionInfo.Favorite),
nameof(ConnectionInfo.SSHTunnelConnectionName),
};
if (!isContainer)
@@ -308,6 +309,7 @@ namespace mRemoteNGTests.UI.Window.ConfigWindowTests
nameof(ConnectionInfo.Username),
nameof(ConnectionInfo.Password),
nameof(ConnectionInfo.Port),
nameof(ConnectionInfo.SSHOptions),
nameof(ConnectionInfo.PuttySession)
});
break;

View File

@@ -12,15 +12,19 @@
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="BouncyCastle.Crypto" publicKeyToken="0e99375e54769942" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.8.5.0" newVersion="1.8.5.0" />
<bindingRedirect oldVersion="0.0.0.0-1.8.6.0" newVersion="1.8.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Google.Protobuf" publicKeyToken="a7d26565bac4d604" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.9.2.0" newVersion="3.9.2.0" />
<bindingRedirect oldVersion="0.0.0.0-3.12.1.0" newVersion="3.12.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
<bindingRedirect oldVersion="0.0.0.0-4.0.6.0" newVersion="4.0.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
</assemblyBinding>
</runtime>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\ReportGenerator.4.3.0\build\netstandard2.0\ReportGenerator.props" Condition="Exists('..\packages\ReportGenerator.4.3.0\build\netstandard2.0\ReportGenerator.props')" />
<Import Project="..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props')" />
<Import Project="..\packages\ReportGenerator.4.5.8\build\netstandard2.0\ReportGenerator.props" Condition="Exists('..\packages\ReportGenerator.4.5.8\build\netstandard2.0\ReportGenerator.props')" />
<Import Project="..\packages\NUnit3TestAdapter.3.16.1\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\packages\NUnit3TestAdapter.3.16.1\build\net35\NUnit3TestAdapter.props')" />
<Import Project="..\packages\NUnit.3.12.0\build\NUnit.props" Condition="Exists('..\packages\NUnit.3.12.0\build\NUnit.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -60,11 +60,11 @@
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="BouncyCastle.Crypto, Version=1.8.5.0, Culture=neutral, PublicKeyToken=0e99375e54769942">
<HintPath>..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll</HintPath>
<Reference Include="BouncyCastle.Crypto, Version=1.8.6.0, Culture=neutral, PublicKeyToken=0e99375e54769942">
<HintPath>..\packages\BouncyCastle.1.8.6.1\lib\BouncyCastle.Crypto.dll</HintPath>
</Reference>
<Reference Include="Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>..\packages\Castle.Core.4.4.0\lib\net45\Castle.Core.dll</HintPath>
<HintPath>..\packages\Castle.Core.4.4.1\lib\net45\Castle.Core.dll</HintPath>
</Reference>
<Reference Include="log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\packages\log4net.2.0.8\lib\net45-full\log4net.dll</HintPath>
@@ -87,11 +87,11 @@
<Reference Include="System.Data" />
<Reference Include="System.DirectoryServices" />
<Reference Include="System.Drawing" />
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.6.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.7.1\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.3\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll</HintPath>
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
@@ -344,8 +344,8 @@
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\NUnit.3.12.0\build\NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit.3.12.0\build\NUnit.props'))" />
<Error Condition="!Exists('..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props'))" />
<Error Condition="!Exists('..\packages\ReportGenerator.4.3.0\build\netstandard2.0\ReportGenerator.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\ReportGenerator.4.3.0\build\netstandard2.0\ReportGenerator.props'))" />
<Error Condition="!Exists('..\packages\NUnit3TestAdapter.3.16.1\build\net35\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit3TestAdapter.3.16.1\build\net35\NUnit3TestAdapter.props'))" />
<Error Condition="!Exists('..\packages\ReportGenerator.4.5.8\build\netstandard2.0\ReportGenerator.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\ReportGenerator.4.5.8\build\netstandard2.0\ReportGenerator.props'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -5,6 +5,6 @@
public static readonly string DefaultConnectionsPath = SettingsFileInfo.SettingsPath;
public static readonly string DefaultConnectionsFile = "confCons.xml";
public static readonly string DefaultConnectionsFileNew = "confConsNew.xml";
public static readonly double ConnectionFileVersion = 2.7;
public static readonly double ConnectionFileVersion = 2.8;
}
}

View File

@@ -8,14 +8,12 @@ namespace mRemoteNG.App
{
public static class Windows
{
private static AboutWindow _aboutForm;
private static ActiveDirectoryImportWindow _adimportForm;
private static HelpWindow _helpForm;
private static ExternalToolsWindow _externalappsForm;
private static PortScanWindow _portscanForm;
private static ScreenshotManagerWindow _screenshotmanagerForm;
private static UltraVNCWindow _ultravncscForm;
private static ComponentsCheckWindow _componentscheckForm;
private static ConnectionTreeWindow _treeForm;
internal static ConnectionTreeWindow TreeForm
@@ -39,11 +37,6 @@ namespace mRemoteNG.App
// ReSharper disable once SwitchStatementMissingSomeCases
switch (windowType)
{
case WindowType.About:
if (_aboutForm == null || _aboutForm.IsDisposed)
_aboutForm = new AboutWindow();
_aboutForm.Show(dockPanel);
break;
case WindowType.ActiveDirectoryImport:
if (_adimportForm == null || _adimportForm.IsDisposed)
_adimportForm = new ActiveDirectoryImportWindow();
@@ -89,13 +82,6 @@ namespace mRemoteNG.App
_ultravncscForm = new UltraVNCWindow();
_ultravncscForm.Show(dockPanel);
break;
case WindowType.ComponentsCheck:
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg,
"Showing ComponentsCheck window", true);
if (_componentscheckForm == null || _componentscheckForm.IsDisposed)
_componentscheckForm = new ComponentsCheckWindow();
_componentscheckForm.Show(dockPanel);
break;
}
}
catch (Exception ex)

View File

@@ -96,6 +96,10 @@ namespace mRemoteNG.Config.Serializers.Csv
connectionRecord.Domain = headers.Contains("Domain") ? connectionCsv[headers.IndexOf("Domain")] : "";
connectionRecord.Hostname = headers.Contains("Hostname") ? connectionCsv[headers.IndexOf("Hostname")] : "";
connectionRecord.VmId = headers.Contains("VmId") ? connectionCsv[headers.IndexOf("VmId")] : "";
connectionRecord.SSHOptions =
headers.Contains("SSHOptions") ? connectionCsv[headers.IndexOf("SSHOptions")] : "";
connectionRecord.SSHTunnelConnectionName =
headers.Contains("SSHTunnelConnectionName") ? connectionCsv[headers.IndexOf("SSHTunnelConnectionName")] : "";
connectionRecord.PuttySession = headers.Contains("PuttySession") ? connectionCsv[headers.IndexOf("PuttySession")] : "";
connectionRecord.LoadBalanceInfo = headers.Contains("LoadBalanceInfo")
? connectionCsv[headers.IndexOf("LoadBalanceInfo")]
@@ -480,6 +484,20 @@ namespace mRemoteNG.Config.Serializers.Csv
connectionRecord.Inheritance.Protocol = value;
}
if (headers.Contains("InheritSSHTunnelConnectionName"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritSSHTunnelConnectionName")], out value))
connectionRecord.Inheritance.SSHTunnelConnectionName = value;
}
if (headers.Contains("InheritSSHOptions"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritSSHOptions")], out value))
connectionRecord.Inheritance.SSHOptions = value;
}
if (headers.Contains("InheritPuttySession"))
{
bool value;

View File

@@ -56,7 +56,7 @@ namespace mRemoteNG.Config.Serializers.Csv
if (_saveFilter.SaveDomain)
sb.Append("Domain;");
sb.Append("Hostname;Port;VmId;Protocol;PuttySession;ConnectToConsole;UseCredSsp;UseVmId;UseEnhancedMode;RenderingEngine;ICAEncryptionStrength;RDPAuthenticationLevel;" +
sb.Append("Hostname;Port;VmId;Protocol;SSHTunnelConnectionName;SSHOptions;PuttySession;ConnectToConsole;UseCredSsp;UseVmId;UseEnhancedMode;RenderingEngine;ICAEncryptionStrength;RDPAuthenticationLevel;" +
"LoadBalanceInfo;Colors;Resolution;AutomaticResize;DisplayWallpaper;DisplayThemes;EnableFontSmoothing;EnableDesktopComposition;" +
"CacheBitmaps;RedirectDiskDrives;RedirectPorts;RedirectPrinters;RedirectClipboard;RedirectSmartCards;RedirectSound;RedirectKeys;" +
"PreExtApp;PostExtApp;MacAddress;UserField;ExtApp;Favorite;VNCCompression;VNCEncoding;VNCAuthMode;VNCProxyType;VNCProxyIP;" +
@@ -66,7 +66,7 @@ namespace mRemoteNG.Config.Serializers.Csv
if (_saveFilter.SaveInheritance)
sb.Append("InheritCacheBitmaps;InheritColors;InheritDescription;InheritDisplayThemes;InheritDisplayWallpaper;" +
"InheritEnableFontSmoothing;InheritEnableDesktopComposition;InheritDomain;InheritIcon;InheritPanel;InheritPassword;InheritPort;" +
"InheritProtocol;InheritPuttySession;InheritRedirectDiskDrives;InheritRedirectKeys;InheritRedirectPorts;InheritRedirectPrinters;" +
"InheritProtocol;InheritSSHTunnelConnectionName;InheritSSHOptions;InheritPuttySession;InheritRedirectDiskDrives;InheritRedirectKeys;InheritRedirectPorts;InheritRedirectPrinters;" +
"InheritRedirectClipboard;InheritRedirectSmartCards;InheritRedirectSound;InheritResolution;InheritAutomaticResize;" +
"InheritUseConsoleSession;InheritUseCredSsp;InheritUseVmId;InheritUseEnhancedMode;InheritVmId;InheritRenderingEngine;InheritUsername;InheritICAEncryptionStrength;" +
"InheritRDPAuthenticationLevel;InheritLoadBalanceInfo;InheritPreExtApp;InheritPostExtApp;InheritMacAddress;InheritUserField;" +
@@ -119,6 +119,8 @@ namespace mRemoteNG.Config.Serializers.Csv
.Append(FormatForCsv(con.Port))
.Append(FormatForCsv(con.VmId))
.Append(FormatForCsv(con.Protocol))
.Append(FormatForCsv(con.SSHTunnelConnectionName))
.Append(FormatForCsv(con.SSHOptions))
.Append(FormatForCsv(con.PuttySession))
.Append(FormatForCsv(con.UseConsoleSession))
.Append(FormatForCsv(con.UseCredSsp))
@@ -186,6 +188,8 @@ namespace mRemoteNG.Config.Serializers.Csv
.Append(FormatForCsv(con.Inheritance.Password))
.Append(FormatForCsv(con.Inheritance.Port))
.Append(FormatForCsv(con.Inheritance.Protocol))
.Append(FormatForCsv(con.Inheritance.SSHTunnelConnectionName))
.Append(FormatForCsv(con.Inheritance.SSHOptions))
.Append(FormatForCsv(con.Inheritance.PuttySession))
.Append(FormatForCsv(con.Inheritance.RedirectDiskDrives))
.Append(FormatForCsv(con.Inheritance.RedirectKeys))

View File

@@ -91,6 +91,8 @@ namespace mRemoteNG.Config.Serializers.MsSql
connectionInfo.VmId = (string)dataRow["VmId"];
connectionInfo.UseEnhancedMode = (bool)dataRow["UseEnhancedMode"];
connectionInfo.Protocol = (ProtocolType)Enum.Parse(typeof(ProtocolType), (string)dataRow["Protocol"]);
connectionInfo.SSHTunnelConnectionName = (string)dataRow["SSHTunnelConnectionName"];
connectionInfo.SSHOptions = (string)dataRow["SSHOptions"];
connectionInfo.PuttySession = (string)dataRow["PuttySession"];
connectionInfo.Port = (int)dataRow["Port"];
connectionInfo.UseConsoleSession = (bool)dataRow["ConnectToConsole"];
@@ -181,6 +183,8 @@ namespace mRemoteNG.Config.Serializers.MsSql
connectionInfo.Inheritance.Password = (bool)dataRow["InheritPassword"];
connectionInfo.Inheritance.Port = (bool)dataRow["InheritPort"];
connectionInfo.Inheritance.Protocol = (bool)dataRow["InheritProtocol"];
connectionInfo.Inheritance.SSHTunnelConnectionName = (bool)dataRow["InheritSSHTunnelConnectionName"];
connectionInfo.Inheritance.SSHOptions = (bool)dataRow["InheritSSHOptions"];
connectionInfo.Inheritance.PuttySession = (bool)dataRow["InheritPuttySession"];
connectionInfo.Inheritance.RedirectDiskDrives = (bool)dataRow["InheritRedirectDiskDrives"];
connectionInfo.Inheritance.RedirectKeys = (bool)dataRow["InheritRedirectKeys"];

View File

@@ -109,9 +109,11 @@ namespace mRemoteNG.Config.Serializers.MsSql
dataTable.Columns.Add("DomainName", typeof(string));
dataTable.Columns.Add("Password", typeof(string));
dataTable.Columns.Add("Hostname", typeof(string));
dataTable.Columns.Add("Protocol", typeof(string));
dataTable.Columns.Add("PuttySession", typeof(string));
dataTable.Columns.Add("Port", typeof(int));
dataTable.Columns.Add("Protocol", typeof(string));
dataTable.Columns.Add("SSHTunnelConnectionName", typeof(string));
dataTable.Columns.Add("SSHOptions", typeof(string));
dataTable.Columns.Add("PuttySession", typeof(string));
dataTable.Columns.Add("ConnectToConsole", typeof(bool));
dataTable.Columns.Add("UseCredSsp", typeof(bool));
dataTable.Columns.Add("RenderingEngine", typeof(string));
@@ -168,6 +170,8 @@ namespace mRemoteNG.Config.Serializers.MsSql
dataTable.Columns.Add("InheritPassword", typeof(bool));
dataTable.Columns.Add("InheritPort", typeof(bool));
dataTable.Columns.Add("InheritProtocol", typeof(bool));
dataTable.Columns.Add("InheritSSHTunnelConnectionName", typeof(bool));
dataTable.Columns.Add("InheritSSHOptions", typeof(bool));
dataTable.Columns.Add("InheritPuttySession", typeof(bool));
dataTable.Columns.Add("InheritRedirectDiskDrives", typeof(bool));
dataTable.Columns.Add("InheritRedirectKeys", typeof(bool));
@@ -497,6 +501,8 @@ namespace mRemoteNG.Config.Serializers.MsSql
dataRow["Hostname"] = connectionInfo.Hostname;
dataRow["VmId"] = connectionInfo.VmId;
dataRow["Protocol"] = connectionInfo.Protocol;
dataRow["SSHTunnelConnectionName"] = connectionInfo.SSHTunnelConnectionName;
dataRow["SSHOptions"] = connectionInfo.SSHOptions;
dataRow["PuttySession"] = connectionInfo.PuttySession;
dataRow["Port"] = connectionInfo.Port;
dataRow["ConnectToConsole"] = connectionInfo.UseConsoleSession;
@@ -568,6 +574,8 @@ namespace mRemoteNG.Config.Serializers.MsSql
dataRow["InheritPassword"] = connectionInfo.Inheritance.Password;
dataRow["InheritPort"] = connectionInfo.Inheritance.Port;
dataRow["InheritProtocol"] = connectionInfo.Inheritance.Protocol;
dataRow["InheritSSHTunnelConnectionName"] = connectionInfo.Inheritance.SSHTunnelConnectionName;
dataRow["InheritSSHOptions"] = connectionInfo.Inheritance.SSHOptions;
dataRow["InheritPuttySession"] = connectionInfo.Inheritance.PuttySession;
dataRow["InheritRedirectDiskDrives"] = connectionInfo.Inheritance.RedirectDiskDrives;
dataRow["InheritRedirectKeys"] = connectionInfo.Inheritance.RedirectKeys;
@@ -631,6 +639,8 @@ namespace mRemoteNG.Config.Serializers.MsSql
dataRow["InheritPassword"] = false;
dataRow["InheritPort"] = false;
dataRow["InheritProtocol"] = false;
dataRow["InheritSSHTunnelConnectionName"] = false;
dataRow["InheritSSHOptions"] = false;
dataRow["InheritPuttySession"] = false;
dataRow["InheritRedirectDiskDrives"] = false;
dataRow["InheritRedirectKeys"] = false;

View File

@@ -68,6 +68,8 @@ namespace mRemoteNG.Config.Serializers.Xml
element.Add(new XAttribute("Hostname", connectionInfo.Hostname));
element.Add(new XAttribute("Protocol", connectionInfo.Protocol));
element.Add(new XAttribute("SSHTunnelConnectionName", connectionInfo.SSHTunnelConnectionName));
element.Add(new XAttribute("SSHOptions", connectionInfo.SSHOptions));
element.Add(new XAttribute("PuttySession", connectionInfo.PuttySession));
element.Add(new XAttribute("Port", connectionInfo.Port));
element.Add(new XAttribute("ConnectToConsole",
@@ -185,6 +187,10 @@ namespace mRemoteNG.Config.Serializers.Xml
connectionInfo.Inheritance.Port.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritProtocol",
connectionInfo.Inheritance.Protocol.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritSSHTunnelConnectionName",
connectionInfo.Inheritance.SSHTunnelConnectionName.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritSSHOptions",
connectionInfo.Inheritance.SSHOptions.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritPuttySession",
connectionInfo.Inheritance.PuttySession.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRedirectDiskDrives",
@@ -293,6 +299,8 @@ namespace mRemoteNG.Config.Serializers.Xml
element.Add(new XAttribute("InheritPassword", falseString));
element.Add(new XAttribute("InheritPort", falseString));
element.Add(new XAttribute("InheritProtocol", falseString));
element.Add(new XAttribute("InheritSSHTunnelConnectionName", falseString));
element.Add(new XAttribute("InheritSSHOptions", falseString));
element.Add(new XAttribute("InheritPuttySession", falseString));
element.Add(new XAttribute("InheritRedirectDiskDrives", falseString));
element.Add(new XAttribute("InheritRedirectKeys", falseString));

View File

@@ -76,6 +76,8 @@ namespace mRemoteNG.Config.Serializers.Xml
element.Add(new XAttribute("Hostname", connectionInfo.Hostname));
element.Add(new XAttribute("Protocol", connectionInfo.Protocol));
element.Add(new XAttribute("RdpVersion", connectionInfo.RdpVersion.ToString().ToLowerInvariant()));
element.Add(new XAttribute("SSHTunnelConnectionName", connectionInfo.SSHTunnelConnectionName));
element.Add(new XAttribute("SSHOptions", connectionInfo.SSHOptions));
element.Add(new XAttribute("PuttySession", connectionInfo.PuttySession));
element.Add(new XAttribute("Port", connectionInfo.Port));
element.Add(new XAttribute("ConnectToConsole",
@@ -197,6 +199,10 @@ namespace mRemoteNG.Config.Serializers.Xml
connectionInfo.Inheritance.Protocol.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRdpVersion",
connectionInfo.Inheritance.RdpVersion.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritSSHTunnelConnectionName",
connectionInfo.Inheritance.SSHTunnelConnectionName.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritSSHOptions",
connectionInfo.Inheritance.SSHOptions.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritPuttySession",
connectionInfo.Inheritance.PuttySession.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRedirectDiskDrives",
@@ -316,6 +322,8 @@ namespace mRemoteNG.Config.Serializers.Xml
element.Add(new XAttribute("InheritPassword", falseString));
element.Add(new XAttribute("InheritPort", falseString));
element.Add(new XAttribute("InheritProtocol", falseString));
element.Add(new XAttribute("InheritSSHTunnelConnectionName", falseString));
element.Add(new XAttribute("InheritSSHOptions", falseString));
element.Add(new XAttribute("InheritPuttySession", falseString));
element.Add(new XAttribute("InheritRedirectDiskDrives", falseString));
element.Add(new XAttribute("InheritRedirectKeys", falseString));

View File

@@ -533,8 +533,7 @@ namespace mRemoteNG.Config.Serializers.Xml
xmlnode.GetAttributeAsBool("InheritRDPMinutesToIdleTimeout");
connectionInfo.RDPAlertIdleTimeout = xmlnode.GetAttributeAsBool("RDPAlertIdleTimeout");
connectionInfo.Inheritance.RDPAlertIdleTimeout =
xmlnode.GetAttributeAsBool("InheritRDPAlertIdleTimeout");
}
xmlnode.GetAttributeAsBool("InheritRDPAlertIdleTimeout"); }
if (_confVersion >= 2.7)
{
@@ -543,13 +542,17 @@ namespace mRemoteNG.Config.Serializers.Xml
connectionInfo.UseVmId = xmlnode.GetAttributeAsBool("UseVmId");
connectionInfo.VmId = xmlnode.GetAttributeAsString("VmId");
connectionInfo.UseEnhancedMode = xmlnode.GetAttributeAsBool("UseEnhancedMode");
connectionInfo.RdpVersion = xmlnode.GetAttributeAsEnum("RdpVersion", RdpVersion.Highest);
connectionInfo.SSHTunnelConnectionName = xmlnode.GetAttributeAsString("SSHTunnelConnectionName");
connectionInfo.SSHOptions = xmlnode.GetAttributeAsString("SSHOptions");
connectionInfo.Inheritance.RedirectClipboard = xmlnode.GetAttributeAsBool("InheritRedirectClipboard");
connectionInfo.Inheritance.Favorite = xmlnode.GetAttributeAsBool("InheritFavorite");
connectionInfo.RdpVersion = xmlnode.GetAttributeAsEnum("RdpVersion", RdpVersion.Highest);
connectionInfo.Inheritance.RdpVersion = xmlnode.GetAttributeAsBool("InheritRdpVersion");
connectionInfo.Inheritance.UseVmId = xmlnode.GetAttributeAsBool("InheritUseVmId");
connectionInfo.Inheritance.VmId = xmlnode.GetAttributeAsBool("InheritVmId");
connectionInfo.Inheritance.UseEnhancedMode = xmlnode.GetAttributeAsBool("InheritUseEnhancedMode");
connectionInfo.Inheritance.SSHTunnelConnectionName = xmlnode.GetAttributeAsBool("InheritSSHTunnelConnectionName");
connectionInfo.Inheritance.SSHOptions = xmlnode.GetAttributeAsBool("InheritSSHOptions");
}
}
catch (Exception ex)

View File

@@ -27,11 +27,15 @@ namespace mRemoteNG.Config.Serializers.Versioning
ALTER TABLE tblCons
ADD RedirectClipboard bit NOT NULL DEFAULT 0,
InheritRedirectClipboard bit NOT NULL DEFAULT 0,
VmId varchar NOT NULL DEFAULT 0,
VmId varchar NOT NULL DEFAULT '',
UseVmId bit NOT NULL DEFAULT 0,
UseEnhancedMode bit NOT NULL DEFAULT 0,
InheritVmId bit NOT NULL DEFAULT 0,
InheritUseVmId bit NOT NULL DEFAULT 0,
SSHTunnelConnectionName varchar NOT NULL DEFAULT '',
InheritSSHTunnelConnectionName bit NOT NULL DEFAULT 0,
SSHOptions varchar NOT NULL DEFAULT '',
InheritSSHOptions bit NOT NULL DEFAULT 0,
InheritUseEnhancedMode bit NOT NULL DEFAULT 0;
UPDATE tblRoot
SET ConfVersion='2.7'";

View File

@@ -27,10 +27,12 @@ namespace mRemoteNG.Connection
private string _vmId = "";
private bool _useEnhancedMode;
private string _sshTunnelConnectionName = "";
private ProtocolType _protocol;
private RdpVersion _rdpProtocolVersion;
private string _extApp;
private int _port;
private string _sshOptions = "";
private string _puttySession;
private IcaProtocol.EncryptionStrength _icaEncryption;
private bool _useConsoleSession;
@@ -194,6 +196,16 @@ namespace mRemoteNG.Connection
set => SetField(ref _vmId, value?.Trim(), "VmId");
}
[LocalizedAttributes.LocalizedCategory(nameof(Language.strCategoryConnection), 2),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.strPropertyNameSSHTunnelConnection)),
LocalizedAttributes.LocalizedDescription(nameof(Language.strPropertyDescriptionSSHTunnelConnection)),
TypeConverter(typeof(SshTunnelTypeConverter)),
UsedInAllProtocolsExcept()]
public string SSHTunnelConnectionName
{
get => GetPropertyValue("SSHTunnelConnectionName", _sshTunnelConnectionName).Trim();
set => SetField(ref _sshTunnelConnectionName, value?.Trim(), "SSHTunnelConnectionName");
}
#endregion
#region Protocol
@@ -242,6 +254,16 @@ namespace mRemoteNG.Connection
set => SetField(ref _puttySession, value, "PuttySession");
}
[LocalizedAttributes.LocalizedCategory(nameof(Language.strCategoryProtocol), 3),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.strPropertyNameSSHOptions)),
LocalizedAttributes.LocalizedDescription(nameof(Language.strPropertyDescriptionSSHOptions)),
UsedInProtocol(ProtocolType.SSH1, ProtocolType.SSH2)]
public virtual string SSHOptions
{
get => GetPropertyValue("SSHOptions", _sshOptions);
set => SetField(ref _sshOptions, value, "SSHOptions");
}
[LocalizedAttributes.LocalizedCategory(nameof(Language.strCategoryProtocol), 3),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.strPropertyNameEncryptionStrength)),
LocalizedAttributes.LocalizedDescription(nameof(Language.strPropertyDescriptionEncryptionStrength)),

View File

@@ -83,6 +83,13 @@ namespace mRemoteNG.Connection
LocalizedAttributes.LocalizedDescriptionInherit(nameof(Language.strPropertyDescriptionPort)),
TypeConverter(typeof(MiscTools.YesNoTypeConverter))]
public bool Port { get; set; }
[LocalizedAttributes.LocalizedCategory(nameof(Language.strCategoryConnection), 3),
LocalizedAttributes.LocalizedDisplayNameInheritAttribute(nameof(Language.strPropertyNameSSHTunnelConnection)),
LocalizedAttributes.LocalizedDescriptionInheritAttribute(nameof(Language.strPropertyDescriptionSSHTunnelConnection)),
TypeConverter(typeof(MiscTools.YesNoTypeConverter))]
[Browsable(true)]
public bool SSHTunnelConnectionName { get; set; }
#endregion
@@ -112,6 +119,12 @@ namespace mRemoteNG.Connection
TypeConverter(typeof(MiscTools.YesNoTypeConverter))]
public bool PuttySession { get; set; }
[LocalizedAttributes.LocalizedCategory(nameof(Language.strCategoryProtocol), 4),
LocalizedAttributes.LocalizedDisplayNameInherit(nameof(Language.strPropertyNameSSHOptions)),
LocalizedAttributes.LocalizedDescriptionInherit(nameof(Language.strPropertyDescriptionSSHOptions)),
TypeConverter(typeof(MiscTools.YesNoTypeConverter))]
public bool SSHOptions { get; set; }
[LocalizedAttributes.LocalizedCategory(nameof(Language.strCategoryProtocol), 4),
LocalizedAttributes.LocalizedDisplayNameInherit(nameof(Language.strPropertyNameEncryptionStrength)),
LocalizedAttributes.LocalizedDescriptionInherit(nameof(Language.strPropertyDescriptionEncryptionStrength)),

View File

@@ -5,6 +5,8 @@ using mRemoteNG.App;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Container;
using mRemoteNG.Messages;
using mRemoteNG.Tools;
using mRemoteNG.Tree;
using mRemoteNG.UI.Forms;
using mRemoteNG.UI.Panels;
using mRemoteNG.UI.Tabs;
@@ -49,7 +51,8 @@ namespace mRemoteNG.Connection
}
}
public void OpenConnection(
// async is necessary so UI can update while OpenConnection waits for tunnel connection to get ready in case of connection through SSH tunnel
public async void OpenConnection(
ConnectionInfo connectionInfo,
ConnectionInfo.Force force = ConnectionInfo.Force.None,
ConnectionWindow conForm = null)
@@ -75,15 +78,137 @@ namespace mRemoteNG.Connection
}
var protocolFactory = new ProtocolFactory();
var newProtocol = protocolFactory.CreateProtocol(connectionInfo);
var connectionPanel = SetConnectionPanel(connectionInfo, force);
if (string.IsNullOrEmpty(connectionPanel)) return;
var connectionForm = SetConnectionForm(conForm, connectionPanel);
var connectionContainer = SetConnectionContainer(connectionInfo, connectionForm);
Control connectionContainer = null;
// Handle connection through SSH tunnel:
// in case of connection through SSH tunnel, connectionInfo gets cloned, so that modification of its name, hostname and port do not modify the original connection info
// connectionInfoOriginal points to the original connection info in either case, for where its needed later on.
var connectionInfoOriginal = connectionInfo;
ConnectionInfo connectionInfoSshTunnel = null; // SSH tunnel connection info will be set if SSH tunnel connection is configured, can be found and connected.
if (!string.IsNullOrEmpty(connectionInfoOriginal.SSHTunnelConnectionName))
{
// Find the connection info specified as SSH tunnel in the connections tree
connectionInfoSshTunnel = getSSHConnectionInfoByName(Runtime.ConnectionsService.ConnectionTreeModel.RootNodes, connectionInfoOriginal.SSHTunnelConnectionName);
if (connectionInfoSshTunnel == null)
{
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg,
string.Format(Language.strSSHTunnelConfigProblem, connectionInfoOriginal.Name, connectionInfoOriginal.SSHTunnelConnectionName));
return;
}
Runtime.MessageCollector.AddMessage(MessageClass.DebugMsg,
$"SSH Tunnel connection '{connectionInfoOriginal.SSHTunnelConnectionName}' configured for '{connectionInfoOriginal.Name}' found. Finding free local port for use as local tunnel port ...");
// determine a free local port to use as local tunnel port
var l = new System.Net.Sockets.TcpListener(System.Net.IPAddress.Loopback, 0);
l.Start();
var localSshTunnelPort = ((System.Net.IPEndPoint)l.LocalEndpoint).Port;
l.Stop();
Runtime.MessageCollector.AddMessage(MessageClass.DebugMsg,
$"{localSshTunnelPort} will be used as local tunnel port. Establishing SSH connection to '{connectionInfoSshTunnel.Hostname}' with additional tunnel options for target connection ...");
// clone SSH tunnel connection as tunnel options will be added to it, and those changes shall not be saved to the configuration
connectionInfoSshTunnel = connectionInfoSshTunnel.Clone();
connectionInfoSshTunnel.SSHOptions += " -L " + localSshTunnelPort + ":" + connectionInfoOriginal.Hostname + ":" + connectionInfoOriginal.Port;
// clone target connection info as its hostname will be changed to localhost and port to local tunnel port to establish connection through tunnel, and those changes shall not be saved to the configuration
connectionInfo = connectionInfoOriginal.Clone();
connectionInfo.Name += " via " + connectionInfoSshTunnel.Name;
connectionInfo.Hostname = "localhost";
connectionInfo.Port = localSshTunnelPort;
// connect the SSH connection to setup the tunnel
var protocolSshTunnel = protocolFactory.CreateProtocol(connectionInfoSshTunnel);
if (!(protocolSshTunnel is PuttyBase puttyBaseSshTunnel))
{
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg,
string.Format(Language.strSSHTunnelIsNotPutty, connectionInfoOriginal.Name, connectionInfoSshTunnel.Name));
return;
}
SetConnectionFormEventHandlers(protocolSshTunnel, connectionForm);
SetConnectionEventHandlers(protocolSshTunnel);
connectionContainer = SetConnectionContainer(connectionInfo, connectionForm);
BuildConnectionInterfaceController(connectionInfoSshTunnel, protocolSshTunnel, connectionContainer);
protocolSshTunnel.InterfaceControl.OriginalInfo = connectionInfoSshTunnel;
if (protocolSshTunnel.Initialize() == false)
{
protocolSshTunnel.Close();
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg,
string.Format(Language.strSSHTunnelNotInitialized, connectionInfoOriginal.Name, connectionInfoSshTunnel.Name));
return;
}
if (protocolSshTunnel.Connect() == false)
{
protocolSshTunnel.Close();
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg,
string.Format(Language.strSSHTunnelNotConnected, connectionInfoOriginal.Name, connectionInfoSshTunnel.Name));
return;
}
Runtime.MessageCollector.AddMessage(MessageClass.DebugMsg,
"Putty started for SSH connection for tunnel. Waiting for local tunnel port to become available ...");
// wait until SSH tunnel connection is ready, by checking if local port can be connected to, but max 60 sec.
var testsock = new System.Net.Sockets.Socket(System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
while (stopwatch.ElapsedMilliseconds < 60000)
{
// confirm that SSH connection is still active
// works only if putty is connfigured to always close window on exit
// else, if connection attempt fails, window remains open and putty process remains running, and we cannot know that connection is already doomed
// in this case the timeout will expire and the log message below will be created
// awkward for user as he has already acknowledged the putty popup some seconds again when the below notification comes....
if (!puttyBaseSshTunnel.isRunning())
{
protocolSshTunnel.Close();
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg,
string.Format(Language.strSSHTunnelFailed, connectionInfoOriginal.Name, connectionInfoSshTunnel.Name));
return;
}
try
{
testsock.Connect(System.Net.IPAddress.Loopback, localSshTunnelPort);
testsock.Close();
break;
}
catch (Exception e)
{
await System.Threading.Tasks.Task.Delay(1000);
}
}
if (stopwatch.ElapsedMilliseconds >= 60000)
{
protocolSshTunnel.Close();
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg,
string.Format(Language.strSSHTunnelPortNotReadyInTime, connectionInfoOriginal.Name, connectionInfoSshTunnel.Name));
return;
}
Runtime.MessageCollector.AddMessage(MessageClass.DebugMsg,
"Local tunnel port is now available. Hiding putty display and setting up target connection via local tunnel port ...");
// hide the display of the SSH tunnel connection which has been shown until this time, such that password can be entered if required or errors be seen
// it stays invisible in the container however which will be reused for the actual connection and such that if the container is closed the SSH tunnel connection is closed as well
protocolSshTunnel.InterfaceControl.Hide();
}
var newProtocol = protocolFactory.CreateProtocol(connectionInfo);
SetConnectionFormEventHandlers(newProtocol, connectionForm);
SetConnectionEventHandlers(newProtocol);
// in case of connection through SSH tunnel the container is already defined and must be use, else it needs to be created here
if (connectionContainer == null) connectionContainer = SetConnectionContainer(connectionInfo, connectionForm);
BuildConnectionInterfaceController(connectionInfo, newProtocol, connectionContainer);
// in case of connection through SSH tunnel the connectionInfo was modified but connectionInfoOriginal in all cases retains the original info
// and is stored in interface control for further use
newProtocol.InterfaceControl.OriginalInfo = connectionInfoOriginal;
// SSH tunnel connection is stored in Interface Control to be used in log messages etc
newProtocol.InterfaceControl.SSHTunnelInfo = connectionInfoSshTunnel;
newProtocol.Force = force;
@@ -99,7 +224,7 @@ namespace mRemoteNG.Connection
return;
}
connectionInfo.OpenConnections.Add(newProtocol);
connectionInfoOriginal.OpenConnections.Add(newProtocol);
_activeConnections.Add(connectionInfo.ConstantID);
FrmMain.Default.SelectedConnection = connectionInfo;
}
@@ -109,6 +234,25 @@ namespace mRemoteNG.Connection
}
}
// recursively traverse the tree to find ConnectionInfo of a specific name
private ConnectionInfo getSSHConnectionInfoByName(IEnumerable<ConnectionInfo> rootnodes, string SSHTunnelConnectionName)
{
ConnectionInfo result = null;
foreach (var node in rootnodes)
{
if (node is ContainerInfo container)
{
result = getSSHConnectionInfoByName(container.Children, SSHTunnelConnectionName);
}
else
{
if (node.Name == SSHTunnelConnectionName && (node.Protocol == ProtocolType.SSH1 || node.Protocol == ProtocolType.SSH2)) result = node;
}
if (result != null) break;
}
return result;
}
#region Private
private static void StartPreConnectionExternalApp(ConnectionInfo connectionInfo)
{
@@ -132,7 +276,7 @@ namespace mRemoteNG.Connection
var tab = (ConnectionTab)dockContent;
var ic = InterfaceControl.FindInterfaceControl(tab);
if (ic == null) continue;
if (ic.Info == connectionInfo)
if (ic.Info == connectionInfo || ic.OriginalInfo == connectionInfo)
return ic;
}
}
@@ -221,11 +365,16 @@ namespace mRemoteNG.Connection
}
}
var strHostname = prot.InterfaceControl.OriginalInfo.Hostname;
if (prot.InterfaceControl.SSHTunnelInfo != null)
{
strHostname += " via SSH Tunnel " + prot.InterfaceControl.SSHTunnelInfo.Name;
}
Runtime.MessageCollector.AddMessage(msgClass,
string.Format(
Language.strProtocolEventDisconnected,
disconnectedMessage,
prot.InterfaceControl.Info.Hostname,
strHostname,
prot.InterfaceControl.Info.Protocol.ToString()));
}
catch (Exception ex)
@@ -242,11 +391,11 @@ namespace mRemoteNG.Connection
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, Language.strConnenctionCloseEvent,
true);
string connDetail;
if (prot.InterfaceControl.Info.Hostname == "" &&
if (prot.InterfaceControl.OriginalInfo.Hostname == "" &&
prot.InterfaceControl.Info.Protocol == ProtocolType.IntApp)
connDetail = prot.InterfaceControl.Info.ExtApp;
else if (prot.InterfaceControl.Info.Hostname != "")
connDetail = prot.InterfaceControl.Info.Hostname;
else if (prot.InterfaceControl.OriginalInfo.Hostname != "")
connDetail = prot.InterfaceControl.OriginalInfo.Hostname;
else
connDetail = "UNKNOWN";
@@ -254,13 +403,13 @@ namespace mRemoteNG.Connection
string.Format(Language.strConnenctionClosedByUser, connDetail,
prot.InterfaceControl.Info.Protocol,
Environment.UserName));
prot.InterfaceControl.Info.OpenConnections.Remove(prot);
prot.InterfaceControl.OriginalInfo.OpenConnections.Remove(prot);
if (_activeConnections.Contains(prot.InterfaceControl.Info.ConstantID))
_activeConnections.Remove(prot.InterfaceControl.Info.ConstantID);
if (prot.InterfaceControl.Info.PostExtApp == "") return;
var extA = Runtime.ExternalToolsService.GetExtAppByName(prot.InterfaceControl.Info.PostExtApp);
extA?.Start(prot.InterfaceControl.Info);
extA?.Start(prot.InterfaceControl.OriginalInfo);
}
catch (Exception ex)
{
@@ -275,7 +424,7 @@ namespace mRemoteNG.Connection
true);
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg,
string.Format(Language.strConnectionEventConnectedDetail,
prot.InterfaceControl.Info.Hostname,
prot.InterfaceControl.OriginalInfo.Hostname,
prot.InterfaceControl.Info.Protocol, Environment.UserName,
prot.InterfaceControl.Info.Description,
prot.InterfaceControl.Info.UserField));
@@ -290,7 +439,7 @@ namespace mRemoteNG.Connection
var msg = string.Format(
Language.strConnectionEventErrorOccured,
errorMessage,
prot.InterfaceControl.Info.Hostname,
prot.InterfaceControl.OriginalInfo.Hostname,
errorCode?.ToString() ?? "-");
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, msg);
}

View File

@@ -13,6 +13,11 @@ namespace mRemoteNG.Connection
{
public ProtocolBase Protocol { get; set; }
public ConnectionInfo Info { get; set; }
// in case the connection is through a SSH tunnel the Info is a copy of original info with hostname and port number overwritten with localhost and local tunnel port
// and the original Info is saved in the following variable
public ConnectionInfo OriginalInfo { get; set; }
// in case the connection is through a SSH tunnel the Info of the SSHTunnelConnection is also saved for reference in log messages etc.
public ConnectionInfo SSHTunnelInfo { get; set; }
public InterfaceControl(Control parent, ProtocolBase protocol, ConnectionInfo info)
@@ -37,19 +42,24 @@ namespace mRemoteNG.Connection
public static InterfaceControl FindInterfaceControl(DockPanel DockPnl)
{
if (!(DockPnl.ActiveDocument is ConnectionTab ct)) return null;
if (ct.Controls.Count < 1) return null;
if (ct.Controls[0] is InterfaceControl ic)
return ic;
// instead of repeating the code, call the routine using ConnectionTab if called by DockPanel
if (DockPnl.ActiveDocument is ConnectionTab ct)
return FindInterfaceControl(ct);
return null;
}
public static InterfaceControl FindInterfaceControl(ConnectionTab tab)
{
if (tab.Controls.Count < 1) return null;
if (tab.Controls[0] is InterfaceControl ic)
return ic;
// if the tab has more than one controls and the second is an InterfaceControl than it must be a connection through SSH tunnel
// and the first Control is the SSH tunnel connection and thus the second control must be returned.
if (tab.Controls.Count > 1)
{
if (tab.Controls[1] is InterfaceControl ic1)
return ic1;
}
if (tab.Controls[0] is InterfaceControl ic0)
return ic0;
return null;
}

View File

@@ -50,6 +50,11 @@ namespace mRemoteNG.Connection.Protocol
#region Public Methods
public bool isRunning()
{
return !PuttyProcess.HasExited;
}
public override bool Connect()
{
try
@@ -136,6 +141,11 @@ namespace mRemoteNG.Connection.Protocol
}
PuttyProcess.StartInfo.Arguments = arguments.ToString();
// add additional SSH options, f.e. tunnel or noshell parameters that may be specified for the the connnection
if (!string.IsNullOrEmpty(InterfaceControl.Info.SSHOptions))
{
PuttyProcess.StartInfo.Arguments += " " + InterfaceControl.Info.SSHOptions;
}
PuttyProcess.EnableRaisingEvents = true;
PuttyProcess.Exited += ProcessExited;

View File

@@ -589,7 +589,7 @@ namespace mRemoteNG.Connection.Protocol.RDP
_rdpClient.AdvancedSettings2.RedirectPrinters = connectionInfo.RedirectPrinters;
_rdpClient.AdvancedSettings2.RedirectSmartCards = connectionInfo.RedirectSmartCards;
_rdpClient.SecuredSettings2.AudioRedirectionMode = (int)connectionInfo.RedirectSound;
_rdpClient.AdvancedSettings.DisableRdpdr = connectionInfo.RedirectClipboard ? 0 : 1;
_rdpClient.AdvancedSettings6.RedirectClipboard = connectionInfo.RedirectClipboard;
}
catch (Exception ex)
{

View File

@@ -1,31 +0,0 @@
.. HowTo - Jump server / Bastion host with mRemoteNG
.. Need more information here to explain and work with hosts for jumps
**************************
Jump server / Bastion host
**************************
Introduction
============
This document will not go into details on what a bastion host or a jump server really is. Instead
it will give you a howto for setting up the hosts so you can do the jump with mRemoteNG. If you need
more information regarding the function of bastion host and jump server then see links mentioned below.
.. note::
The information below could probably be a lot better. If you have a better idea or easier
way to work with bastion host and jump server, then please let us know.
References
==========
- `Wikipedia Bastion host <https://en.wikipedia.org/wiki/Bastion_host>`_
- `Wikipedia Jump server <https://en.wikipedia.org/wiki/Jump_server>`_
Linux Server to target host
===========================
In this section we will use a Ubuntu 18.04 LTS to jump to another host both RDP and SSH.
Windows Server to target host
=============================
In this section we will use a Windows 2016 Server to jump to another host both RDP and SSH.

View File

@@ -0,0 +1,13 @@
*************
SSH Tunneling
*************
You can use any configured SSH connection to be used as a tunnel server for another connection.
.. figure:: /images/ssh_tunnel.png
If an SSH Tunnel is configured the connection is searched and if found a free local TCP port determined. The SSH tunnel connection
is setup with additional parameters for the tunnel. The original connection info is copied and the copy is modified to connect
to local host and the local TCP port and the target connection is opened.
You can use the SSH connection attribute for additional SSH options. It can be used by all
normal SSH connections as well to specify any additional options, e.g. to not start a shell which some SSH servers.

View File

@@ -39,7 +39,7 @@ Port 2179 must be open on Hyper-V server and on the machine you are connecting f
netsh advfirewall firewall add rule name="VMRDP" dir=out action=allow protocol=TCP localport=2179 (outgoing)
In case you are facing "Unknown disconnection reason 3848" error when connecting, you need to configure a number of registry settings on your client and the Hyper-V Server to make the connection work.
Tis problem occurs because of the CredSSP (Credential Security Service Provider) policy on the client and/or Hyper-V Server not allowing to authentication of remote users by default.
This problem occurs because of the CredSSP (Credential Security Service Provider) policy on the client and/or Hyper-V Server not allowing to authentication of remote users by default.
.. note::

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -32,7 +32,7 @@ Welcome to mRemoteNG's documentation!
:maxdepth: 2
:caption: HowTos
howtos/jumpservers.rst
howtos/sshtunnel.rst
howtos/external_tools.rst
howtos/bulk_connections.rst
howtos/vmrdp.rst

View File

@@ -95,8 +95,6 @@ Additional tools that can be used and triggered in mRemoteNG.
- Show external tools dialog (See: :ref:`external_tools`)
* - Port Scan
- Show port scan dialog (See: :ref:`port_scan`)
* - Components Check
- Show installed components requirements test
* - Options
- Opens mRemoteNG global settings and options dialog

View File

@@ -27,9 +27,6 @@ Options below are for the various settings for Startup/Exit of mRemoteNG.
* - Allow only a single instance of the application (mRemoteNG restart required)
- Off
- Enforces and makes sure only a single instance of mRemoteNG is running on the computer
* - Check proper installation of components at startup
- Off
- Opens the panel for Components Check on every startup
Appearance
==========

BIN
mRemoteV1/Icons/Admin.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
mRemoteV1/Icons/Console.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
mRemoteV1/Icons/Staging.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -12,7 +12,7 @@ namespace mRemoteNG {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.3.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.7.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
@@ -1535,18 +1535,6 @@ namespace mRemoteNG {
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool StartupComponentsCheck {
get {
return ((bool)(this["StartupComponentsCheck"]));
}
set {
this["StartupComponentsCheck"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
@@ -2927,6 +2915,54 @@ namespace mRemoteNG {
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool InhDefaultSSHTunnelConnectionName {
get {
return ((bool)(this["InhDefaultSSHTunnelConnectionName"]));
}
set {
this["InhDefaultSSHTunnelConnectionName"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string ConDefaultSSHTunnelConnectionName {
get {
return ((string)(this["ConDefaultSSHTunnelConnectionName"]));
}
set {
this["ConDefaultSSHTunnelConnectionName"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool InhDefaultSSHOptions {
get {
return ((bool)(this["InhDefaultSSHOptions"]));
}
set {
this["InhDefaultSSHOptions"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string ConDefaultSSHOptions {
get {
return ((string)(this["ConDefaultSSHOptions"]));
}
set {
this["ConDefaultSSHOptions"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]

View File

@@ -380,9 +380,6 @@
<Setting Name="UVNCSCPort" Type="System.Int32" Scope="User">
<Value Profile="(Default)">5500</Value>
</Setting>
<Setting Name="StartupComponentsCheck" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="XULRunnerPath" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
@@ -728,6 +725,18 @@
<Setting Name="InhDefaultRdpVersion" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="InhDefaultSSHTunnelConnectionName" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="ConDefaultSSHTunnelConnectionName" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="InhDefaultSSHOptions" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="ConDefaultSSHOptions" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="StartMinimized" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>

File diff suppressed because it is too large Load Diff

View File

@@ -2678,6 +2678,30 @@ Development umfasst Alphas, Betas und Release Candidates.</value>
<data name="strPropertyDescriptionRdpVersion" xml:space="preserve">
<value>Legt die Version des RDP fest, die beim Öffnen von Verbindungen verwendet wird.</value>
</data>
<data name="strPropertyDescriptionSSHTunnelConnection" xml:space="preserve">
<value>Zum Verbinden mittels eines SSH Tunnels (Jump Host) geben Sie hier den Namen der SSH Verbindung an, welche benutzt werden soll um den SSH Tunnel einzurichten.</value>
</data>
<data name="strPropertyDescriptionSSHOptions" xml:space="preserve">
<value>Geben Sie hier zusaetzliche Optionen an welche fuer die SSH Verbindung verwendet werden sollen. Fuer weitere Infos zu den moeglichen Optionen konsultieren sie die Putty Dokumentation.</value>
</data>
<data name="strSSHTunnelConfigProblem" xml:space="preserve">
<value>Konfigurationsfehler der Verbindung. Verbindung zu: "{0}" via SSH Tunnel: "{1}" nicht möglich. Eine Verbindung mit dem als SSH Tunnel konfiguriertem Namen konnte nicht gefunden werden. Löschen Sie die SSH Tunnel Konfiguration or geben sie eine existierende SSH Verbindung an, welche zum Aufbau eine Tunnels zum Erreichen des eigentlichen Zielsystems verwendet werden soll.</value>
</data>
<data name="strSSHTunnelIsNotPutty" xml:space="preserve">
<value>Konfigurationsfehler des SSH Tunnel. Verbindung zu: "{0}" via SSH Tunnel: "{1}" nicht möglich. Die als SSH Tunnel konfigurierte Verbindung wurde zwar gefunden, aber das zugehörige Protokoll ist nicht von Putty abgeleitet. Stellen Sie sicher dass die als SSH Tunnel konfigurierte Verbindung das SSH version 1 oder 2 Protokoll verwendet.</value>
</data>
<data name="strSSHTunnelNotInitialized" xml:space="preserve">
<value>Initialisierungsproblem des SSH Tunnel. Verbindung zu: "{0}" via SSH Tunnel: "{1}" nicht möglich. Initialisierung der SSH Verbindung fehlgeschlagen. Überprüfen Sie die als SSH Tunnel konfigurierte Verbindung auf etwaige Probleme.</value>
</data>
<data name="strSSHTunnelNotConnected" xml:space="preserve">
<value>Verbindungsproblem des SSH Tunnel. Verbindung zu: "{0}" via SSH Tunnel: "{1}" nicht möglich. SSH Verbindungsaufbau fehlgeschlagen. Überprüfen Sie die als SSH Tunnel konfigurierte Verbindung auf etwaige Probleme.</value>
</data>
<data name="strSSHTunnelFailed" xml:space="preserve">
<value>SSH Tunnel Verbindung fehlgeschlagen. Verbindung zu: "{0}" via SSH Tunnel: "{1}" nicht möglich. Putty Prozess vorzeitig beendet. Überprüfen Sie die als SSH Tunnel konfigurierte Verbindung auf etwaige Probleme.</value>
</data>
<data name="strSSHTunnelPortNotReadyInTime" xml:space="preserve">
<value>Zeitüberschreitung des SSH Tunnel. Verbindung zu: "{0}" via SSH Tunnel: "{1}" nicht möglich. Lokaler Tunnel Port nicht vor Ablauf der Zeitüberschreitung verfügbar. Überprüfen Sie die als SSH Tunnel konfigurierte Verbindung auf etwaige Probleme.</value>
</data>
<data name="strStartMinimized" xml:space="preserve">
<value>Minimiert starten</value>
</data>
@@ -2687,4 +2711,7 @@ Development umfasst Alphas, Betas und Release Candidates.</value>
<data name="strCloseToSysTray" xml:space="preserve">
<value>In den System Tray schließen</value>
</data>
<data name="strLicense" xml:space="preserve">
<value>Lizenz</value>
</data>
</root>

View File

@@ -59,7 +59,7 @@
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
@@ -105,15 +105,15 @@
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
@@ -576,7 +576,7 @@ Si la vérification des composants ou l'utilisation d'ICA échoue malgré tout,
<value>Basique</value>
</data>
<data name="strEncryptCompleteConnectionFile" xml:space="preserve">
<value>Crypter complètement le fichier de connexion</value>
<value>Chiffrer complètement le fichier de connexion</value>
</data>
<data name="strEndIP" xml:space="preserve">
<value>IP de fin</value>
@@ -1243,7 +1243,7 @@ Si vous rencontrez une erreur, créez un nouveau fichier de connexion s'il vous
<value>Entrez votre mot de passe.</value>
</data>
<data name="strPropertyDescriptionPort" xml:space="preserve">
<value>Entrez le port d'écoute du protocole choisit</value>
<value>Entrez le port d'écoute du protocole choisi</value>
</data>
<data name="strPropertyDescriptionProtocol" xml:space="preserve">
<value>Choisissez le protocole utilisé par mRemoteNG pour se connecter à l'hôte.</value>
@@ -2147,4 +2147,7 @@ Message:
<data name="strYes" xml:space="preserve">
<value>Oui</value>
</data>
<data name="strCredits" xml:space="preserve">
<value>Crédits</value>
</data>
</root>

View File

@@ -305,10 +305,7 @@ If you are still not able to pass this check or use the Gecko Engine in mRemoteN
<value>GeckoFx was found and seems to be installed properly.</value>
</data>
<data name="strCcICAFailed" xml:space="preserve">
<value>ICA requires that the XenDesktop Online Plugin is installed and that the wfica.ocx library is registered. You can download the client here: http://www.citrix.com/download/
If you have the XenDesktop Online Plugin installed and the check still fails, try to register wfica.ocx manually.
To do this open up the run dialog (Start - Run) and enter the following: regsvr32 "c:\Program Files\Citrix\ICA Client\wfica.ocx" (Where c:\Program Files\Citrix\ICA Client\ is the path to your XenDesktop Online Plugin installation).
If you are still not able to pass this check or use ICA in mRemoteNG please consult the at {0}.</value>
<value>ICA requires that the XenDesktop Online Plugin is installed and that the wfica.ocx library is registered. You can download the client here: http://www.citrix.com/download/</value>
</data>
<data name="strCcICAOK" xml:space="preserve">
<value>All ICA components were found and seem to be registered properly.
@@ -2813,6 +2810,36 @@ Development Channel includes Alphas, Betas &amp; Release Candidates.</value>
<data name="RdpProtocolVersionNotSupported" xml:space="preserve">
<value>Could not create RDP client. RDP protocol version {0} is not supported on this machine. Please choose an older protocol version.</value>
</data>
<data name="strPropertyDescriptionSSHTunnelConnection" xml:space="preserve">
<value>For connection through a SSH tunnel (jump host) specify SSH connection to be used to establish SSH tunnel.</value>
</data>
<data name="strPropertyNameSSHTunnelConnection" xml:space="preserve">
<value>SSH Tunnel</value>
</data>
<data name="strPropertyDescriptionSSHOptions" xml:space="preserve">
<value>Specify here additional options to be used for SSH connection. See putty documentation for further details.</value>
</data>
<data name="strPropertyNameSSHOptions" xml:space="preserve">
<value>SSH Options</value>
</data>
<data name="strSSHTunnelConfigProblem" xml:space="preserve">
<value>Connection configuration problem. Connection to: "{0}" via SSH Tunnel: "{1}" not possible. A connection with the name configured as SSH Tunnel and protocol SSH version 1 or SSH2 version 2 cannot be found in the connection tree. Clear SSH Tunnel configuration or specify existing SSH connection.</value>
</data>
<data name="strSSHTunnelIsNotPutty" xml:space="preserve">
<value>SSH tunnel configuration problem. Connection to: "{0}" via SSH Tunnel: "{1}" not possible. Connection configured as SSH Tunnel found in tree, but protocol is not derived from putty. Make sure connection configured as SSH Tunnel is using SSH protocol.</value>
</data>
<data name="strSSHTunnelNotInitialized" xml:space="preserve">
<value>SSH tunnel initialization problem. Connection to: "{0}" via SSH Tunnel: "{1}" not possible. SSH connection could not be initialized. Check for any problems with the connection configured as SSH Tunnel.</value>
</data>
<data name="strSSHTunnelNotConnected" xml:space="preserve">
<value>SSH tunnel connection problem. Connection to: "{0}" via SSH Tunnel: "{1}" not possible. SSH connection failed. Check for any problems with the connection configured as SSH Tunnel.</value>
</data>
<data name="strSSHTunnelFailed" xml:space="preserve">
<value>SSH tunnel connection failed. Connection to: "{0}" via SSH Tunnel: "{1}" not possible. Putty process terminated. Check for any problems with the connection configured as SSH Tunnel.</value>
</data>
<data name="strSSHTunnelPortNotReadyInTime" xml:space="preserve">
<value>SSH tunnel connection timed out. Connection to: "{0}" via SSH Tunnel: "{1}" not possible. Local tunnel port did not become available in time. Check for any problems with the connection configured as SSH Tunnel.</value>
</data>
<data name="strStartMinimized" xml:space="preserve">
<value>Start minimized</value>
</data>
@@ -2840,6 +2867,15 @@ Development Channel includes Alphas, Betas &amp; Release Candidates.</value>
<data name="strPowerShell" xml:space="preserve">
<value>PowerShell</value>
</data>
<data name="strChangelog" xml:space="preserve">
<value>Changelog</value>
</data>
<data name="strCredits" xml:space="preserve">
<value>Credits</value>
</data>
<data name="strLicense" xml:space="preserve">
<value>License</value>
</data>
<data name="strHttpCEF" xml:space="preserve">
<value>CEF (Chromium)</value>
</data>

View File

@@ -36,18 +36,17 @@
<xs:attribute name="Descr" type="xs:string" use="required" />
<xs:attribute name="Icon" type="xs:string" use="required" />
<xs:attribute name="Panel" type="xs:string" use="required" />
<!--<xs:attribute name="CredentialId" type="xs:string" use="required" />-->
<xs:attribute name="Username" type="xs:string" use="required" />
<xs:attribute name="Domain" type="xs:string" use="required" />
<xs:attribute name="Password" type="xs:string" use="required" />
<xs:attribute name="Hostname" type="xs:string" use="required" />
<xs:attribute name="Protocol" type="xs:string" use="required" />
<xs:attribute name="RdpVersion" type="xs:string" use="required" />
<xs:attribute name="VmId" type="xs:string" use="required" />
<xs:attribute name="UseVmId" type="xs:boolean" use="required" />
<xs:attribute name="UseEnhancedMode" type="xs:boolean" use="required" />
<xs:attribute name="SSHTunnelConnectionName" type="xs:string" use="optional" />
<xs:attribute name="SSHOptions" type="xs:string" use="optional" />
<xs:attribute name="PuttySession" type="xs:string" use="required" />
<xs:attribute name="Port" type="xs:int" use="required" />
<xs:attribute name="ConnectToConsole" type="xs:boolean" use="required" />
@@ -114,6 +113,8 @@
<xs:attribute name="InheritPort" type="xs:boolean" use="optional" />
<xs:attribute name="InheritProtocol" type="xs:boolean" use="optional" />
<xs:attribute name="InheritRdpVersion" type="xs:boolean" use="optional" />
<xs:attribute name="InheritSSHTunnelConnectionName" type="xs:boolean" use="optional" />
<xs:attribute name="InheritSSHOptions" type="xs:boolean" use="optional" />
<xs:attribute name="InheritPuttySession" type="xs:boolean" use="optional" />
<xs:attribute name="InheritRedirectDiskDrives" type="xs:boolean" use="optional" />
<xs:attribute name="InheritRedirectKeys" type="xs:boolean" use="optional" />

View File

@@ -0,0 +1,39 @@
using System;
using System.Collections;
using System.DirectoryServices;
using System.Runtime.InteropServices;
namespace mRemoteNG.Tools
{
public class ADhelper
{
private DirectoryEntry _dEntry;
public ADhelper(string domain)
{
Children = new Hashtable();
Domain = domain;
}
public Hashtable Children { get; }
private string Domain { get; }
public void GetChildEntries(string adPath = "")
{
_dEntry = adPath.Length <= 0
? Domain.Length <= 0 ? new DirectoryEntry() : new DirectoryEntry("LDAP://" + Domain)
: new DirectoryEntry(adPath);
try
{
foreach (DirectoryEntry child in _dEntry.Children)
Children.Add(child.Name, child.Path);
}
catch (COMException ex)
{
if (ex.Message.ToLower().Equals("the server is not operational"))
throw new Exception("Could not find AD Server", ex);
}
}
}
}

View File

@@ -0,0 +1,58 @@
using mRemoteNG.App;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Container;
using System.Collections.Generic;
using System.ComponentModel;
namespace mRemoteNG.Tools
{
public class SshTunnelTypeConverter : StringConverter
{
public static string[] SshTunnels
{
get
{
var sshTunnelList = new List<string> {string.Empty};
// Add a blank entry to signify that no external tool is selected
sshTunnelList.AddRange(GetSshConnectionNames(Runtime.ConnectionsService.ConnectionTreeModel.RootNodes));
return sshTunnelList.ToArray();
}
}
// recursively traverse the connection tree to find all ConnectionInfo s of type SSH
private static IEnumerable<string> GetSshConnectionNames(IEnumerable<ConnectionInfo> rootnodes)
{
var result = new List<string>();
foreach (var node in rootnodes)
if (node is ContainerInfo container)
{
result.AddRange(GetSshConnectionNames(container.Children));
}
else
{
if (node is PuttySessionInfo) continue;
if (node.Protocol == ProtocolType.SSH1 || node.Protocol == ProtocolType.SSH2)
result.Add(node.Name);
}
return result;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
return new StandardValuesCollection(SshTunnels);
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
}
}

73
mRemoteV1/UI/Controls/AdTree.Designer.cs generated Normal file
View File

@@ -0,0 +1,73 @@
namespace mRemoteNG.UI.Controls
{
partial class AdTree
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AdTree));
this.tvActiveDirectory = new System.Windows.Forms.TreeView();
this.ImglTree = new System.Windows.Forms.ImageList(this.components);
this.SuspendLayout();
//
// tvActiveDirectory
//
this.tvActiveDirectory.Dock = System.Windows.Forms.DockStyle.Fill;
this.tvActiveDirectory.Location = new System.Drawing.Point(0, 0);
this.tvActiveDirectory.Name = "tvActiveDirectory";
this.tvActiveDirectory.Size = new System.Drawing.Size(800, 450);
this.tvActiveDirectory.TabIndex = 0;
this.tvActiveDirectory.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.TvActiveDirectory_AfterExpand);
this.tvActiveDirectory.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.TvActiveDirectory_AfterSelect);
//
// ImglTree
//
this.ImglTree.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("ImglTree.ImageStream")));
this.ImglTree.TransparentColor = System.Drawing.Color.Transparent;
this.ImglTree.Images.SetKeyName(0, "Root.png");
this.ImglTree.Images.SetKeyName(1, "OU.png");
this.ImglTree.Images.SetKeyName(2, "Folder.png");
this.ImglTree.Images.SetKeyName(3, "Question.png");
//
// AdTree
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.Controls.Add(this.tvActiveDirectory);
this.Name = "AdTree";
this.Size = new System.Drawing.Size(800, 450);
this.Load += new System.EventHandler(this.AdTree_Load);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TreeView tvActiveDirectory;
private System.Windows.Forms.ImageList ImglTree;
}
}

View File

@@ -0,0 +1,123 @@
using mRemoteNG.Tools;
using System;
using System.Runtime.CompilerServices;
using System.Windows.Forms;
namespace mRemoteNG.UI.Controls
{
public partial class AdTree : UserControl
{
#region Public Methods
public AdTree()
{
InitializeComponent();
}
public event AdPathChangedEventHandler AdPathChanged;
public delegate void AdPathChangedEventHandler(object sender);
public string AdPath { get; set; }
public string Domain
{
private get => string.IsNullOrEmpty(_domain) == false ? _domain : Environment.UserDomainName;
set => _domain = value;
}
public object SelectedNode { get; internal set; }
#endregion Public Methods
#region Private Methods
private string _domain;
private void TvActiveDirectory_AfterExpand(object sender, TreeViewEventArgs e)
{
try
{
foreach (TreeNode node in e.Node.Nodes)
AddTreeNodes(node);
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace);
}
}
private void TvActiveDirectory_AfterSelect(object sender, TreeViewEventArgs e)
{
AdPath = e.Node.Tag.ToString();
var pathChangedEvent = AdPathChanged;
pathChangedEvent?.Invoke(this);
}
private void AdTree_Load(object sender, EventArgs e)
{
tvActiveDirectory.Nodes.Clear();
var treeNode = new TreeNode(Domain) { Tag = "" };
tvActiveDirectory.Nodes.Add(treeNode);
AddTreeNodes(treeNode);
tvActiveDirectory.Nodes[0].Expand();
}
private void AddTreeNodes(TreeNode tNode)
{
var adhelper = new ADhelper(Domain);
adhelper.GetChildEntries(tNode.Tag.ToString());
var enumerator = adhelper.Children.GetEnumerator();
tvActiveDirectory.BeginUpdate();
while (enumerator.MoveNext())
{
var flag1 = false;
if (enumerator.Key == null) continue;
var node1 = new TreeNode(enumerator.Key.ToString().Substring(3))
{
Tag = RuntimeHelpers.GetObjectValue(enumerator.Value)
};
if (!enumerator.Key.ToString().Substring(0, 2).Equals("CN") ||
enumerator.Key.ToString().Equals("CN=Computers") ||
enumerator.Key.ToString().Equals("CN=Users"))
flag1 = true;
if (flag1)
{
var flag2 = false;
try
{
foreach (TreeNode node2 in tNode.Nodes)
{
if (!node2.Text.Equals(node1.Text)) continue;
flag2 = true;
break;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace);
}
if (!flag2)
tNode.Nodes.Add(node1);
}
var imageIndex = GetImageIndex(enumerator.Key.ToString().Substring(0, 2));
node1.ImageIndex = imageIndex;
node1.SelectedImageIndex = imageIndex;
}
tvActiveDirectory.EndUpdate();
}
private static int GetImageIndex(string objType)
{
if (objType.Equals("CN"))
return 2;
return objType.Equals("OU") ? 1 : 3;
}
#endregion Private Methods
}
}

View File

@@ -0,0 +1,183 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="ImglTree.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<data name="ImglTree.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA4
DAAAAk1TRnQBSQFMAgEBBAEAARgBAAEYAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wD/AP8ACAAC/wH0
A/MC9AL/CwAB9AH3AQcB/yYAAf8B9AHxAbsBtAGtAc8BtAG1AfEC/wcAA/8CtAEHAf8lAAL/AfABiwFl
AYYBrQHPAa0BhgGtAd0B/wUAAv8B8wHwAbUBuwGRAZIB8gH0Af8CAAHsAesBbQHqARMBFQERAQ8HDgEA
AewB6wFtAeoBEwEVAREBDwcOAwAB/wGLAQ0BiwG0AgkBtAHPAWwBiwH/BAAB/wHyAfcB7AHtAbUBCQG0
AesB7AH3AfEB/wEAAewBmgF6AVgFUgFRAUsBKgJLAQ8BAAHsAZoBegFYBVIBUQFLASoCSwEPAwABtQFm
AWwBrgGRA7UBrgFsAWYBtAMAAf8BvAGRArUBuwEJARkBCQG1AbQB6wHsAfAB/wHsAaABmgF5AhUBUgF6
AVkBSwEAASoBMQFLAREBAAHsAaACmgR6AVkBUwJSATEBSwERAgAB8gFsAe8BtQKLAbUBCQG1AWwBZgJl
AfIBAAH/AbwBtQEJAhkBCQGmAa0CGQEJAbUBrgHsAfEB7AEaAaABSgJ5AUoBegFZAQABUgEAAVIBKgFD
AQAB7AEaAaACmgN6AlkBUwJSASoBQwEAAfQB7QFlAZEBrQGmAa0BCQH/AbsBiwFlAmYBrgL0AbUBCQMZ
AbUBCgFlAxkBCQG1AesBkgHtAcMBoAEAApoBAAJ6AQABWQEAAVIBMQEUAQAB7QHDAqACmgN6AlkBUwFS
ATEBFAEAAfMBZgFlAaYCrAGtAgkBtAKLAZEBbAFmAfEBBwEJBRkBuwEJBBkBCQG1AW0B7QHDAaABSgGZ
AXkBSgJ6AQABWQEAAVIBMQESAQAB7QHDAqACmgR6AlkBUgExARIBAAHxAmUBigGsAbMB2wG6AbMBrAGK
AbQBBwGRAWYBvAEHBRkB9AG0AQkB/wQZAbsB6wEcAsMBmQIUAXkCegEAAXoBAAFSATEB6gEAARwDwwGg
ApoEegFZAVIBMQHqAQAB8QKmAa0BswHbARkB3AGtAqwBiwGRAa4BZgG8AQcBGQH0AxkB/wG1AYYBGQH0
AxkBCQHsARwDwwKgApoEegFZAVIB6wEAARwDwwKgApoEegFZAVIB6wEAAfQBiwGGAdUC3AEZAdsCswKt
AosBbAHyAbwF9AEZAf8CpgEJAfQCGQEJAe0BHAXDAqACmgR6AesBAAEcBcMCoAKaBHoB6wEAAf8BCQGt
AdsB3AIZAdwB1QIJAa0CiwGSAf8B8AH0Af8B9AH/AbQBpgEJAa4BXwG0Av8B9AG7AbwKHATtAewBAAoc
BO0B7AIAAf8BzgG0AfAB9AH/ARkB3AHdAQkBswGLAWYB9AEAAfQB8gP/AbUBXwEJAYYBXwG7Av8B8wHv
AfQBHAEaAsMBoAGaARwB8QgAARwBGgLDAaABmgEcAfEKAAHzAYsBBwL/AfQCCQK0AYsBvAMAAvMD/wG1
Aa0BhgG1Av8B9AG8AfQBAAHxBRwB8QkAAfEFHAHxDAAB8wG0AbsB8gHwAbsCtAGLAfAFAALzB/8B9AHw
Af8mAAH/AfACtAGRAbQBCQH/BwAB/wLzAfQB9gH/AfQB8wH0Af8jAAFCAU0BPgcAAT4DAAEoAwABQAMA
ASADAAEBAQABAQYAAQEWAAP/gQAB4AEHAf8BDwT/AcABAwH4AQ8E/wGAAQMB4AEDAQABAQEAAQEBwAED
AcABAQEAAQEBAAEBAcABAwGAAgABAQEAAQEBgAEBAwABAQEAAQEFAAEBAQABAQUAAQEBAAEBBQABAQEA
AQEFAAEBAQABAQUAAQEBAAEBBQABAQEAAQEBgAEBAwAB/wEAAf8BwAEDAYACAQH/AQEB/wHgAQcBwAED
BP8B8AEPAeABBwT/Cw==
</value>
</data>
</root>

174
mRemoteV1/UI/Forms/FrmAbout.Designer.cs generated Normal file
View File

@@ -0,0 +1,174 @@
namespace mRemoteNG.UI.Window
{
public partial class FrmAbout
{
#region Windows Form Designer generated code
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmAbout));
this.pbLogo = new System.Windows.Forms.PictureBox();
this.pnlBottom = new System.Windows.Forms.Panel();
this.llCredits = new System.Windows.Forms.LinkLabel();
this.llChangelog = new System.Windows.Forms.LinkLabel();
this.llLicense = new System.Windows.Forms.LinkLabel();
this.lblTitle = new mRemoteNG.UI.Controls.Base.NGLabel();
this.lblVersion = new mRemoteNG.UI.Controls.Base.NGLabel();
this.lblLicense = new mRemoteNG.UI.Controls.Base.NGLabel();
this.lblCopyright = new mRemoteNG.UI.Controls.Base.NGLabel();
((System.ComponentModel.ISupportInitialize)(this.pbLogo)).BeginInit();
this.pnlBottom.SuspendLayout();
this.SuspendLayout();
//
// pbLogo
//
this.pbLogo.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(52)))), ((int)(((byte)(58)))), ((int)(((byte)(64)))));
this.pbLogo.BackgroundImage = global::mRemoteNG.Resources.Header_dark;
this.pbLogo.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
this.pbLogo.Dock = System.Windows.Forms.DockStyle.Top;
this.pbLogo.Location = new System.Drawing.Point(0, 0);
this.pbLogo.Name = "pbLogo";
this.pbLogo.Size = new System.Drawing.Size(584, 120);
this.pbLogo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
this.pbLogo.TabIndex = 1;
this.pbLogo.TabStop = false;
//
// pnlBottom
//
this.pnlBottom.BackColor = System.Drawing.SystemColors.Control;
this.pnlBottom.Controls.Add(this.llCredits);
this.pnlBottom.Controls.Add(this.llChangelog);
this.pnlBottom.Controls.Add(this.llLicense);
this.pnlBottom.Controls.Add(this.lblTitle);
this.pnlBottom.Controls.Add(this.lblVersion);
this.pnlBottom.Controls.Add(this.lblLicense);
this.pnlBottom.Controls.Add(this.lblCopyright);
this.pnlBottom.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlBottom.ForeColor = System.Drawing.SystemColors.ControlText;
this.pnlBottom.Location = new System.Drawing.Point(0, 120);
this.pnlBottom.Name = "pnlBottom";
this.pnlBottom.Size = new System.Drawing.Size(584, 161);
this.pnlBottom.TabIndex = 1;
//
// llCredits
//
this.llCredits.AutoSize = true;
this.llCredits.Font = new System.Drawing.Font("Segoe UI", 9.75F);
this.llCredits.Location = new System.Drawing.Point(5, 134);
this.llCredits.Name = "llCredits";
this.llCredits.Size = new System.Drawing.Size(49, 17);
this.llCredits.TabIndex = 10;
this.llCredits.TabStop = true;
this.llCredits.Text = "Credits";
this.llCredits.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llCredits_LinkClicked);
//
// llChangelog
//
this.llChangelog.AutoSize = true;
this.llChangelog.Font = new System.Drawing.Font("Segoe UI", 9.75F);
this.llChangelog.Location = new System.Drawing.Point(5, 117);
this.llChangelog.Name = "llChangelog";
this.llChangelog.Size = new System.Drawing.Size(71, 17);
this.llChangelog.TabIndex = 9;
this.llChangelog.TabStop = true;
this.llChangelog.Text = "Changelog";
this.llChangelog.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llChangelog_LinkClicked);
//
// llLicense
//
this.llLicense.AutoSize = true;
this.llLicense.Font = new System.Drawing.Font("Segoe UI", 9.75F);
this.llLicense.Location = new System.Drawing.Point(5, 100);
this.llLicense.Name = "llLicense";
this.llLicense.Size = new System.Drawing.Size(50, 17);
this.llLicense.TabIndex = 8;
this.llLicense.TabStop = true;
this.llLicense.Text = "License";
this.llLicense.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llLicense_LinkClicked);
//
// lblTitle
//
this.lblTitle.AutoSize = true;
this.lblTitle.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblTitle.ForeColor = System.Drawing.SystemColors.ControlText;
this.lblTitle.Location = new System.Drawing.Point(6, 3);
this.lblTitle.Name = "lblTitle";
this.lblTitle.Size = new System.Drawing.Size(106, 27);
this.lblTitle.TabIndex = 0;
this.lblTitle.Text = "mRemoteNG";
this.lblTitle.UseCompatibleTextRendering = true;
//
// lblVersion
//
this.lblVersion.AutoSize = true;
this.lblVersion.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblVersion.ForeColor = System.Drawing.SystemColors.ControlText;
this.lblVersion.Location = new System.Drawing.Point(6, 30);
this.lblVersion.Name = "lblVersion";
this.lblVersion.Size = new System.Drawing.Size(49, 22);
this.lblVersion.TabIndex = 1;
this.lblVersion.Text = "Version";
this.lblVersion.UseCompatibleTextRendering = true;
//
// lblLicense
//
this.lblLicense.AutoSize = true;
this.lblLicense.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblLicense.ForeColor = System.Drawing.SystemColors.ControlText;
this.lblLicense.Location = new System.Drawing.Point(6, 74);
this.lblLicense.Name = "lblLicense";
this.lblLicense.Size = new System.Drawing.Size(48, 22);
this.lblLicense.TabIndex = 5;
this.lblLicense.Text = "License";
this.lblLicense.UseCompatibleTextRendering = true;
//
// lblCopyright
//
this.lblCopyright.AutoSize = true;
this.lblCopyright.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblCopyright.ForeColor = System.Drawing.SystemColors.ControlText;
this.lblCopyright.Location = new System.Drawing.Point(6, 52);
this.lblCopyright.Name = "lblCopyright";
this.lblCopyright.Size = new System.Drawing.Size(63, 22);
this.lblCopyright.TabIndex = 2;
this.lblCopyright.Text = "Copyright";
this.lblCopyright.UseCompatibleTextRendering = true;
//
// FrmAbout
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.BackColor = System.Drawing.SystemColors.Control;
this.ClientSize = new System.Drawing.Size(584, 281);
this.Controls.Add(this.pnlBottom);
this.Controls.Add(this.pbLogo);
this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.ForeColor = System.Drawing.SystemColors.ControlText;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MaximumSize = new System.Drawing.Size(20000, 10000);
this.MinimizeBox = false;
this.Name = "FrmAbout";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "About";
this.TopMost = true;
((System.ComponentModel.ISupportInitialize)(this.pbLogo)).EndInit();
this.pnlBottom.ResumeLayout(false);
this.pnlBottom.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
internal Controls.Base.NGLabel lblCopyright;
internal Controls.Base.NGLabel lblTitle;
internal Controls.Base.NGLabel lblVersion;
internal Controls.Base.NGLabel lblLicense;
internal System.Windows.Forms.Panel pnlBottom;
internal System.Windows.Forms.PictureBox pbLogo;
private System.Windows.Forms.LinkLabel llCredits;
private System.Windows.Forms.LinkLabel llChangelog;
private System.Windows.Forms.LinkLabel llLicense;
}
}

View File

@@ -0,0 +1,62 @@
using mRemoteNG.App.Info;
using mRemoteNG.Themes;
using System.Windows.Forms;
using System.Diagnostics;
using mRemoteNG.UI.Forms;
namespace mRemoteNG.UI.Window
{
public partial class FrmAbout : Form
{
public static FrmAbout Instance { get; set; } = new FrmAbout();
private FrmAbout()
{
InitializeComponent();
ThemeManager.getInstance().ThemeChanged += ApplyTheme;
ApplyLanguage();
ApplyTheme();
}
private void ApplyLanguage()
{
lblLicense.Text = Language.strLabelReleasedUnderGPL;
base.Text = Language.strAbout;
llChangelog.Text = Language.strChangelog;
llCredits.Text = Language.strCredits;
llLicense.Text = Language.strLicense;
lblCopyright.Text = GeneralAppInfo.Copyright;
lblVersion.Text = $@"Version {GeneralAppInfo.ApplicationVersion}";
AddPortableString();
}
[Conditional("PORTABLE")]
private void AddPortableString() => lblTitle.Text += $@" {Language.strLabelPortableEdition}";
private void ApplyTheme()
{
if (!ThemeManager.getInstance().ThemingActive) return;
if (!ThemeManager.getInstance().ActiveAndExtended) return;
pnlBottom.BackColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Background");
pnlBottom.ForeColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Foreground");
}
private void llLicense_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
Process.Start("https://github.com/mRemoteNG/mRemoteNG/blob/develop/COPYING.TXT");
Close();
}
private void llChangelog_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
Process.Start("https://github.com/mRemoteNG/mRemoteNG/blob/develop/CHANGELOG.md");
Close();
}
private void llCredits_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
Process.Start("https://github.com/mRemoteNG/mRemoteNG/blob/develop/CREDITS.md");
Close();
}
}
}

View File

@@ -0,0 +1,399 @@

namespace mRemoteNG.UI.Forms.OptionsPages
{
public sealed partial class ComponentsPage : OptionsPage
{
//UserControl overrides dispose to clean up the component list.
[System.Diagnostics.DebuggerNonUserCode()]
protected override void Dispose(bool disposing)
{
try
{
if (disposing && components != null)
{
components.Dispose();
}
}
finally
{
base.Dispose(disposing);
}
}
//Required by the Windows Form Designer
private System.ComponentModel.Container components = null;
//NOTE: The following procedure is required by the Windows Form Designer
//It can be modified using the Windows Form Designer.
//Do not modify it using the code editor.
[System.Diagnostics.DebuggerStepThrough()]
private void InitializeComponent()
{
this.pnlCheck1 = new System.Windows.Forms.Panel();
this.txtCheck1 = new mRemoteNG.UI.Controls.Base.NGTextBox();
this.lblCheck1 = new mRemoteNG.UI.Controls.Base.NGLabel();
this.pbCheck1 = new System.Windows.Forms.PictureBox();
this.pnlCheck2 = new System.Windows.Forms.Panel();
this.txtCheck2 = new mRemoteNG.UI.Controls.Base.NGTextBox();
this.lblCheck2 = new mRemoteNG.UI.Controls.Base.NGLabel();
this.pbCheck2 = new System.Windows.Forms.PictureBox();
this.pnlCheck3 = new System.Windows.Forms.Panel();
this.txtCheck3 = new mRemoteNG.UI.Controls.Base.NGTextBox();
this.lblCheck3 = new mRemoteNG.UI.Controls.Base.NGLabel();
this.pbCheck3 = new System.Windows.Forms.PictureBox();
this.pnlCheck4 = new System.Windows.Forms.Panel();
this.txtCheck4 = new mRemoteNG.UI.Controls.Base.NGTextBox();
this.lblCheck4 = new mRemoteNG.UI.Controls.Base.NGLabel();
this.pbCheck4 = new System.Windows.Forms.PictureBox();
this.pnlCheck5 = new System.Windows.Forms.Panel();
this.txtCheck5 = new mRemoteNG.UI.Controls.Base.NGTextBox();
this.lblCheck5 = new mRemoteNG.UI.Controls.Base.NGLabel();
this.pbCheck5 = new System.Windows.Forms.PictureBox();
this.btnCheckAgain = new mRemoteNG.UI.Controls.Base.NGButton();
this.tblCheck = new System.Windows.Forms.TableLayoutPanel();
this.pnlCheck1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck1)).BeginInit();
this.pnlCheck2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck2)).BeginInit();
this.pnlCheck3.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck3)).BeginInit();
this.pnlCheck4.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck4)).BeginInit();
this.pnlCheck5.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck5)).BeginInit();
this.tblCheck.SuspendLayout();
this.SuspendLayout();
//
// pnlCheck1
//
this.pnlCheck1.Controls.Add(this.txtCheck1);
this.pnlCheck1.Controls.Add(this.lblCheck1);
this.pnlCheck1.Controls.Add(this.pbCheck1);
this.pnlCheck1.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlCheck1.Location = new System.Drawing.Point(3, 3);
this.pnlCheck1.Name = "pnlCheck1";
this.pnlCheck1.Size = new System.Drawing.Size(604, 84);
this.pnlCheck1.TabIndex = 10;
this.pnlCheck1.Visible = false;
//
// txtCheck1
//
this.txtCheck1.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.txtCheck1.BackColor = System.Drawing.SystemColors.Control;
this.txtCheck1.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.txtCheck1.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.txtCheck1.Location = new System.Drawing.Point(35, 25);
this.txtCheck1.Multiline = true;
this.txtCheck1.Name = "txtCheck1";
this.txtCheck1.ReadOnly = true;
this.txtCheck1.Size = new System.Drawing.Size(566, 55);
this.txtCheck1.TabIndex = 2;
//
// lblCheck1
//
this.lblCheck1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lblCheck1.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblCheck1.ForeColor = System.Drawing.SystemColors.ControlText;
this.lblCheck1.Location = new System.Drawing.Point(32, -1);
this.lblCheck1.Name = "lblCheck1";
this.lblCheck1.Size = new System.Drawing.Size(493, 23);
this.lblCheck1.TabIndex = 1;
this.lblCheck1.Text = "RDP check succeeded!";
//
// pbCheck1
//
this.pbCheck1.Location = new System.Drawing.Point(0, 0);
this.pbCheck1.Name = "pbCheck1";
this.pbCheck1.Size = new System.Drawing.Size(30, 30);
this.pbCheck1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pbCheck1.TabIndex = 0;
this.pbCheck1.TabStop = false;
//
// pnlCheck2
//
this.pnlCheck2.Controls.Add(this.txtCheck2);
this.pnlCheck2.Controls.Add(this.lblCheck2);
this.pnlCheck2.Controls.Add(this.pbCheck2);
this.pnlCheck2.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlCheck2.Location = new System.Drawing.Point(3, 93);
this.pnlCheck2.Name = "pnlCheck2";
this.pnlCheck2.Size = new System.Drawing.Size(604, 84);
this.pnlCheck2.TabIndex = 20;
this.pnlCheck2.Visible = false;
//
// txtCheck2
//
this.txtCheck2.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.txtCheck2.BackColor = System.Drawing.SystemColors.Control;
this.txtCheck2.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.txtCheck2.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.txtCheck2.Location = new System.Drawing.Point(35, 25);
this.txtCheck2.Multiline = true;
this.txtCheck2.Name = "txtCheck2";
this.txtCheck2.ReadOnly = true;
this.txtCheck2.Size = new System.Drawing.Size(566, 55);
this.txtCheck2.TabIndex = 2;
//
// lblCheck2
//
this.lblCheck2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lblCheck2.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblCheck2.Location = new System.Drawing.Point(32, -1);
this.lblCheck2.Name = "lblCheck2";
this.lblCheck2.Size = new System.Drawing.Size(489, 23);
this.lblCheck2.TabIndex = 1;
this.lblCheck2.Text = "RDP check succeeded!";
//
// pbCheck2
//
this.pbCheck2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.pbCheck2.Location = new System.Drawing.Point(0, -1);
this.pbCheck2.Name = "pbCheck2";
this.pbCheck2.Size = new System.Drawing.Size(30, 31);
this.pbCheck2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pbCheck2.TabIndex = 0;
this.pbCheck2.TabStop = false;
//
// pnlCheck3
//
this.pnlCheck3.Controls.Add(this.txtCheck3);
this.pnlCheck3.Controls.Add(this.lblCheck3);
this.pnlCheck3.Controls.Add(this.pbCheck3);
this.pnlCheck3.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlCheck3.Location = new System.Drawing.Point(3, 183);
this.pnlCheck3.Name = "pnlCheck3";
this.pnlCheck3.Size = new System.Drawing.Size(604, 84);
this.pnlCheck3.TabIndex = 30;
this.pnlCheck3.Visible = false;
//
// txtCheck3
//
this.txtCheck3.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.txtCheck3.BackColor = System.Drawing.SystemColors.Control;
this.txtCheck3.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.txtCheck3.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.txtCheck3.Location = new System.Drawing.Point(35, 25);
this.txtCheck3.Multiline = true;
this.txtCheck3.Name = "txtCheck3";
this.txtCheck3.ReadOnly = true;
this.txtCheck3.Size = new System.Drawing.Size(566, 55);
this.txtCheck3.TabIndex = 2;
//
// lblCheck3
//
this.lblCheck3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lblCheck3.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblCheck3.Location = new System.Drawing.Point(32, -1);
this.lblCheck3.Name = "lblCheck3";
this.lblCheck3.Size = new System.Drawing.Size(489, 23);
this.lblCheck3.TabIndex = 1;
this.lblCheck3.Text = "RDP check succeeded!";
//
// pbCheck3
//
this.pbCheck3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.pbCheck3.Location = new System.Drawing.Point(0, -1);
this.pbCheck3.Name = "pbCheck3";
this.pbCheck3.Size = new System.Drawing.Size(30, 31);
this.pbCheck3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pbCheck3.TabIndex = 0;
this.pbCheck3.TabStop = false;
//
// pnlCheck4
//
this.pnlCheck4.Controls.Add(this.txtCheck4);
this.pnlCheck4.Controls.Add(this.lblCheck4);
this.pnlCheck4.Controls.Add(this.pbCheck4);
this.pnlCheck4.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlCheck4.Location = new System.Drawing.Point(3, 273);
this.pnlCheck4.Name = "pnlCheck4";
this.pnlCheck4.Size = new System.Drawing.Size(604, 84);
this.pnlCheck4.TabIndex = 40;
this.pnlCheck4.Visible = false;
//
// txtCheck4
//
this.txtCheck4.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.txtCheck4.BackColor = System.Drawing.SystemColors.Control;
this.txtCheck4.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.txtCheck4.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.txtCheck4.Location = new System.Drawing.Point(35, 25);
this.txtCheck4.Multiline = true;
this.txtCheck4.Name = "txtCheck4";
this.txtCheck4.ReadOnly = true;
this.txtCheck4.Size = new System.Drawing.Size(566, 55);
this.txtCheck4.TabIndex = 2;
//
// lblCheck4
//
this.lblCheck4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lblCheck4.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblCheck4.Location = new System.Drawing.Point(32, -1);
this.lblCheck4.Name = "lblCheck4";
this.lblCheck4.Size = new System.Drawing.Size(489, 23);
this.lblCheck4.TabIndex = 1;
this.lblCheck4.Text = "RDP check succeeded!";
//
// pbCheck4
//
this.pbCheck4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.pbCheck4.Location = new System.Drawing.Point(0, 0);
this.pbCheck4.Name = "pbCheck4";
this.pbCheck4.Size = new System.Drawing.Size(30, 31);
this.pbCheck4.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pbCheck4.TabIndex = 0;
this.pbCheck4.TabStop = false;
//
// pnlCheck5
//
this.pnlCheck5.Controls.Add(this.txtCheck5);
this.pnlCheck5.Controls.Add(this.lblCheck5);
this.pnlCheck5.Controls.Add(this.pbCheck5);
this.pnlCheck5.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlCheck5.Location = new System.Drawing.Point(3, 363);
this.pnlCheck5.Name = "pnlCheck5";
this.pnlCheck5.Size = new System.Drawing.Size(604, 84);
this.pnlCheck5.TabIndex = 50;
this.pnlCheck5.Visible = false;
//
// txtCheck5
//
this.txtCheck5.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.txtCheck5.BackColor = System.Drawing.SystemColors.Control;
this.txtCheck5.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.txtCheck5.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.txtCheck5.Location = new System.Drawing.Point(35, 25);
this.txtCheck5.Multiline = true;
this.txtCheck5.Name = "txtCheck5";
this.txtCheck5.ReadOnly = true;
this.txtCheck5.Size = new System.Drawing.Size(566, 55);
this.txtCheck5.TabIndex = 2;
//
// lblCheck5
//
this.lblCheck5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lblCheck5.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblCheck5.Location = new System.Drawing.Point(32, -1);
this.lblCheck5.Name = "lblCheck5";
this.lblCheck5.Size = new System.Drawing.Size(489, 23);
this.lblCheck5.TabIndex = 1;
this.lblCheck5.Text = "RDP check succeeded!";
//
// pbCheck5
//
this.pbCheck5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.pbCheck5.Location = new System.Drawing.Point(0, -1);
this.pbCheck5.Name = "pbCheck5";
this.pbCheck5.Size = new System.Drawing.Size(30, 31);
this.pbCheck5.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pbCheck5.TabIndex = 0;
this.pbCheck5.TabStop = false;
//
// btnCheckAgain
//
this.btnCheckAgain._mice = mRemoteNG.UI.Controls.Base.NGButton.MouseState.OUT;
this.btnCheckAgain.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnCheckAgain.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnCheckAgain.Location = new System.Drawing.Point(503, 453);
this.btnCheckAgain.Name = "btnCheckAgain";
this.btnCheckAgain.Size = new System.Drawing.Size(104, 23);
this.btnCheckAgain.TabIndex = 0;
this.btnCheckAgain.Text = "Check again";
this.btnCheckAgain.UseVisualStyleBackColor = true;
this.btnCheckAgain.Click += new System.EventHandler(this.BtnCheckAgain_Click);
//
// tblCheck
//
this.tblCheck.ColumnCount = 1;
this.tblCheck.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tblCheck.Controls.Add(this.pnlCheck5, 0, 4);
this.tblCheck.Controls.Add(this.pnlCheck2, 0, 1);
this.tblCheck.Controls.Add(this.pnlCheck3, 0, 2);
this.tblCheck.Controls.Add(this.pnlCheck4, 0, 3);
this.tblCheck.Controls.Add(this.pnlCheck1, 0, 0);
this.tblCheck.Controls.Add(this.btnCheckAgain, 0, 5);
this.tblCheck.Dock = System.Windows.Forms.DockStyle.Fill;
this.tblCheck.Location = new System.Drawing.Point(0, 0);
this.tblCheck.Name = "tblCheck";
this.tblCheck.RowCount = 6;
this.tblCheck.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 90F));
this.tblCheck.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 90F));
this.tblCheck.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 90F));
this.tblCheck.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 90F));
this.tblCheck.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 90F));
this.tblCheck.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tblCheck.Size = new System.Drawing.Size(610, 490);
this.tblCheck.TabIndex = 51;
//
// ComponentsPage
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.Controls.Add(this.tblCheck);
this.Name = "ComponentsPage";
this.Size = new System.Drawing.Size(610, 490);
this.pnlCheck1.ResumeLayout(false);
this.pnlCheck1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck1)).EndInit();
this.pnlCheck2.ResumeLayout(false);
this.pnlCheck2.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck2)).EndInit();
this.pnlCheck3.ResumeLayout(false);
this.pnlCheck3.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck3)).EndInit();
this.pnlCheck4.ResumeLayout(false);
this.pnlCheck4.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck4)).EndInit();
this.pnlCheck5.ResumeLayout(false);
this.pnlCheck5.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck5)).EndInit();
this.tblCheck.ResumeLayout(false);
this.ResumeLayout(false);
}
private System.Windows.Forms.PictureBox pbCheck1;
private Controls.Base.NGLabel lblCheck1;
private System.Windows.Forms.Panel pnlCheck2;
private Controls.Base.NGLabel lblCheck2;
private System.Windows.Forms.PictureBox pbCheck2;
private System.Windows.Forms.Panel pnlCheck3;
private Controls.Base.NGLabel lblCheck3;
private System.Windows.Forms.PictureBox pbCheck3;
private System.Windows.Forms.Panel pnlCheck4;
private Controls.Base.NGLabel lblCheck4;
private System.Windows.Forms.PictureBox pbCheck4;
private System.Windows.Forms.Panel pnlCheck5;
private Controls.Base.NGLabel lblCheck5;
private System.Windows.Forms.PictureBox pbCheck5;
private Controls.Base.NGButton btnCheckAgain;
private Controls.Base.NGTextBox txtCheck1;
private Controls.Base.NGTextBox txtCheck2;
private Controls.Base.NGTextBox txtCheck3;
private Controls.Base.NGTextBox txtCheck4;
private Controls.Base.NGTextBox txtCheck5;
private System.Windows.Forms.Panel pnlCheck1;
private System.Windows.Forms.TableLayoutPanel tblCheck;
}
}

View File

@@ -0,0 +1,237 @@
using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Threading;
using AxWFICALib;
using Gecko;
using mRemoteNG.App;
using mRemoteNG.App.Info;
using mRemoteNG.Connection.Protocol.RDP;
using mRemoteNG.Messages;
using mRemoteNG.Themes;
namespace mRemoteNG.UI.Forms.OptionsPages
{
public partial class ComponentsPage
{
public ComponentsPage()
{
ApplyTheme();
PageIcon = Resources.ComponentsCheck_Icon;
InitializeComponent();
CheckComponents();
FontOverrider.FontOverride(this);
ThemeManager.getInstance().ThemeChanged += ApplyTheme;
}
public override string PageName
{
get => Language.strComponentsCheck;
set { }
}
#region Form Stuff
public override void ApplyLanguage()
{
base.ApplyLanguage();
Text = Language.strComponentsCheck;
btnCheckAgain.Text = Language.strCcCheckAgain;
}
private void BtnCheckAgain_Click(object sender, EventArgs e)
{
CheckComponents();
}
#endregion
private void CheckComponents()
{
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "Beginning component check", true);
CheckRdp();
CheckVnc();
CheckPutty();
CheckIca();
CheckGeckoBrowser();
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "Finished component check", true);
}
private void CheckRdp()
{
pnlCheck1.Visible = true;
var rdpProtocolFactory = new RdpProtocolFactory();
var supportedVersions = rdpProtocolFactory.GetSupportedVersions();
if (supportedVersions.Any())
{
pbCheck1.Image = Resources.Good_Symbol;
lblCheck1.ForeColor = Color.DarkOliveGreen;
lblCheck1.Text = "RDP (Remote Desktop) " + Language.strCcCheckSucceeded;
txtCheck1.Text = string.Format(Language.strCcRDPOK, string.Join(", ", supportedVersions));
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "RDP versions installed: "+ string.Join(",", supportedVersions), true);
}
else
{
pbCheck1.Image = Resources.Bad_Symbol;
lblCheck1.ForeColor = Color.Firebrick;
lblCheck1.Text = "RDP (Remote Desktop) " + Language.strCcCheckFailed;
txtCheck1.Text = string.Format(Language.strCcRDPFailed, GeneralAppInfo.UrlForum);
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg,
"RDP " + Language.strCcNotInstalledProperly, true);
}
}
private void CheckVnc()
{
pnlCheck2.Visible = true;
try
{
using (var vnc = new VncSharp.RemoteDesktop())
{
vnc.CreateControl();
while (!vnc.Created)
{
Thread.Sleep(10);
System.Windows.Forms.Application.DoEvents();
}
pbCheck2.Image = Resources.Good_Symbol;
lblCheck2.ForeColor = Color.DarkOliveGreen;
lblCheck2.Text = "VNC (Virtual Network Computing) " + Language.strCcCheckSucceeded;
txtCheck2.Text = string.Format(Language.strCcVNCOK, vnc.ProductVersion);
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "VNC installed", true);
}
}
catch (Exception)
{
pbCheck2.Image = Resources.Bad_Symbol;
lblCheck2.ForeColor = Color.Firebrick;
lblCheck2.Text = "VNC (Virtual Network Computing) " + Language.strCcCheckFailed;
txtCheck2.Text = string.Format(Language.strCcVNCFailed, GeneralAppInfo.UrlForum);
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg,
"VNC " + Language.strCcNotInstalledProperly, true);
}
}
private void CheckPutty()
{
pnlCheck3.Visible = true;
string pPath;
if (Settings.Default.UseCustomPuttyPath == false)
{
pPath = GeneralAppInfo.HomePath + "\\PuTTYNG.exe";
}
else
{
pPath = Settings.Default.CustomPuttyPath;
}
if (File.Exists(pPath))
{
var versionInfo = FileVersionInfo.GetVersionInfo(pPath);
pbCheck3.Image = Resources.Good_Symbol;
lblCheck3.ForeColor = Color.DarkOliveGreen;
lblCheck3.Text = "PuTTY (SSH/Telnet/Rlogin/RAW) " + Language.strCcCheckSucceeded;
txtCheck3.Text =
$"{Language.strCcPuttyOK}{Environment.NewLine}Version: {versionInfo.ProductName} Release: {versionInfo.FileVersion}";
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "PuTTY installed", true);
}
else
{
pbCheck3.Image = Resources.Bad_Symbol;
lblCheck3.ForeColor = Color.Firebrick;
lblCheck3.Text = "PuTTY (SSH/Telnet/Rlogin/RAW) " + Language.strCcCheckFailed;
txtCheck3.Text = Language.strCcPuttyFailed;
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg,
"PuTTY " + Language.strCcNotInstalledProperly, true);
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "File " + pPath + " does not exist.",
true);
}
}
private void CheckIca()
{
pnlCheck4.Visible = true;
try
{
using (var ica = new AxICAClient())
{
ica.Parent = this;
pbCheck4.Image = Resources.Good_Symbol;
lblCheck4.ForeColor = Color.DarkOliveGreen;
lblCheck4.Text = @"ICA (Citrix ICA) " + Language.strCcCheckSucceeded;
txtCheck4.Text = string.Format(Language.strCcICAOK, ica.Version);
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "ICA installed", true);
}
}
catch (Exception ex)
{
pbCheck4.Image = Resources.Bad_Symbol;
lblCheck4.ForeColor = Color.Firebrick;
lblCheck4.Text = @"ICA (Citrix ICA) " + Language.strCcCheckFailed;
txtCheck4.Text = string.Format(Language.strCcICAFailed, GeneralAppInfo.UrlForum);
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg,
"ICA " + Language.strCcNotInstalledProperly, true);
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, ex.Message, true);
}
}
private void CheckGeckoBrowser()
{
pnlCheck5.Visible = true;
var geckoBad = false;
var geckoFxPath = Path.Combine(GeneralAppInfo.HomePath, "Firefox");
if (File.Exists(Path.Combine(GeneralAppInfo.HomePath, "Geckofx-Core.dll")))
{
if (Directory.Exists(geckoFxPath))
{
if (!File.Exists(Path.Combine(geckoFxPath, "xul.dll")))
{
geckoBad = true;
}
}
else
{
geckoBad = true;
}
}
if (geckoBad == false)
{
pbCheck5.Image = Resources.Good_Symbol;
lblCheck5.ForeColor = Color.DarkOliveGreen;
lblCheck5.Text = @"Gecko (Firefox) Rendering Engine (HTTP/S) " + Language.strCcCheckSucceeded;
if (!Xpcom.IsInitialized)
Xpcom.Initialize("Firefox");
txtCheck5.Text = Language.strCcGeckoOK + " Version: " + Xpcom.XulRunnerVersion;
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "Gecko Browser installed", true);
}
else
{
pbCheck5.Image = Resources.Bad_Symbol;
lblCheck5.ForeColor = Color.Firebrick;
lblCheck5.Text = @"Gecko (Firefox) Rendering Engine (HTTP/S) " + Language.strCcCheckFailed;
txtCheck5.Text = string.Format(Language.strCcGeckoFailed, GeneralAppInfo.UrlForum);
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg,
"Gecko " + Language.strCcNotInstalledProperly, true);
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg,
"GeckoFx was not found in " + geckoFxPath, true);
}
}
}
}

View File

@@ -36,7 +36,6 @@ namespace mRemoteNG.UI.Forms.OptionsPages
Settings.Default.OpenConsFromLastSession = chkReconnectOnStart.Checked;
Settings.Default.SingleInstance = chkSingleInstance.Checked;
Settings.Default.StartMinimized = chkStartMinimized.Checked;
Settings.Default.StartupComponentsCheck = chkProperInstallationOfComponentsAtStartup.Checked;
}
private void StartupExitPage_Load(object sender, EventArgs e)
@@ -45,7 +44,6 @@ namespace mRemoteNG.UI.Forms.OptionsPages
chkReconnectOnStart.Checked = Settings.Default.OpenConsFromLastSession;
chkSingleInstance.Checked = Settings.Default.SingleInstance;
chkStartMinimized.Checked = Settings.Default.StartMinimized;
chkProperInstallationOfComponentsAtStartup.Checked = Settings.Default.StartupComponentsCheck;
}
}
}

View File

@@ -232,8 +232,6 @@ namespace mRemoteNG.UI.Forms
Windows.TreeForm.Focus();
PuttySessionsManager.Instance.StartWatcher();
if (Settings.Default.StartupComponentsCheck)
Windows.Show(WindowType.ComponentsCheck);
Startup.Instance.CreateConnectionsProvider(messageCollector);

View File

@@ -169,7 +169,7 @@
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "mRemoteNG Options";
this.Load += new System.EventHandler(this.frmOptions_Load);
this.Load += new System.EventHandler(this.FrmOptions_Load);
this.pnlBottom.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.lstOptionPages)).EndInit();
this.ResumeLayout(false);

View File

@@ -5,7 +5,6 @@ using System.Diagnostics;
using System.Linq;
using System.Windows.Forms;
using mRemoteNG.Themes;
using mRemoteNG.Tools;
namespace mRemoteNG.UI.Forms
{
@@ -28,7 +27,7 @@ namespace mRemoteNG.UI.Forms
Cursor.Current = Cursors.Default;
}
private void frmOptions_Load(object sender, EventArgs e)
private void FrmOptions_Load(object sender, EventArgs e)
{
CompileListOfOptionsPages();
FontOverrider.FontOverride(this);
@@ -78,7 +77,8 @@ namespace mRemoteNG.UI.Forms
{typeof(UpdatesPage).Name, new UpdatesPage {Dock = DockStyle.Fill}},
{typeof(ThemePage).Name, new ThemePage {Dock = DockStyle.Fill}},
{typeof(SecurityPage).Name, new SecurityPage {Dock = DockStyle.Fill}},
{typeof(AdvancedPage).Name, new AdvancedPage {Dock = DockStyle.Fill}}
{typeof(AdvancedPage).Name, new AdvancedPage {Dock = DockStyle.Fill}},
{typeof(ComponentsPage).Name, new ComponentsPage {Dock = DockStyle.Fill}},
};
}

View File

@@ -3,6 +3,7 @@ using System.Diagnostics;
using System.Windows.Forms;
using mRemoteNG.App;
using mRemoteNG.App.Info;
using mRemoteNG.UI.Window;
namespace mRemoteNG.UI.Menu
{
@@ -157,7 +158,7 @@ namespace mRemoteNG.UI.Menu
private void mMenInfoDonate_Click(object sender, EventArgs e) => Process.Start(GeneralAppInfo.UrlDonate);
private void mMenInfoAbout_Click(object sender, EventArgs e) => Windows.Show(WindowType.About);
private void mMenInfoAbout_Click(object sender, EventArgs e) => FrmAbout.Instance.Show();
#endregion
}

View File

@@ -13,7 +13,6 @@ namespace mRemoteNG.UI.Menu
private ToolStripMenuItem _mMenToolsExternalApps;
private ToolStripMenuItem _mMenToolsPortScan;
private ToolStripMenuItem _mMenToolsUvncsc;
private ToolStripMenuItem _mMenToolsComponentsCheck;
private ToolStripMenuItem _mMenViewScreenshotManager;
public Form MainForm { get; set; }
@@ -31,7 +30,6 @@ namespace mRemoteNG.UI.Menu
_mMenToolsExternalApps = new ToolStripMenuItem();
_mMenToolsPortScan = new ToolStripMenuItem();
_mMenToolsSep1 = new ToolStripSeparator();
_mMenToolsComponentsCheck = new ToolStripMenuItem();
_mMenToolsOptions = new ToolStripMenuItem();
_mMenViewScreenshotManager = new ToolStripMenuItem();
//
@@ -45,7 +43,6 @@ namespace mRemoteNG.UI.Menu
_mMenToolsPortScan,
_mMenViewScreenshotManager,
_mMenToolsSep1,
_mMenToolsComponentsCheck,
_mMenToolsOptions
});
Name = "mMenTools";
@@ -98,14 +95,6 @@ namespace mRemoteNG.UI.Menu
_mMenToolsSep1.Name = "mMenToolsSep1";
_mMenToolsSep1.Size = new System.Drawing.Size(181, 6);
//
// mMenToolsComponentsCheck
//
_mMenToolsComponentsCheck.Image = Resources.cog_error;
_mMenToolsComponentsCheck.Name = "mMenToolsComponentsCheck";
_mMenToolsComponentsCheck.Size = new System.Drawing.Size(184, 22);
_mMenToolsComponentsCheck.Text = Language.strComponentsCheck;
_mMenToolsComponentsCheck.Click += mMenToolsComponentsCheck_Click;
//
// mMenToolsOptions
//
_mMenToolsOptions.Image = Resources.Options;
@@ -122,7 +111,6 @@ namespace mRemoteNG.UI.Menu
_mMenToolsExternalApps.Text = Language.strMenuExternalTools;
_mMenToolsPortScan.Text = Language.strMenuPortScan;
_mMenViewScreenshotManager.Text = Language.strScreenshots;
_mMenToolsComponentsCheck.Text = Language.strComponentsCheck;
_mMenToolsOptions.Text = Language.strMenuOptions;
}
@@ -153,11 +141,6 @@ namespace mRemoteNG.UI.Menu
Windows.Show(WindowType.ScreenshotManager);
}
private void mMenToolsComponentsCheck_Click(object sender, EventArgs e)
{
Windows.Show(WindowType.ComponentsCheck);
}
private void mMenToolsOptions_Click(object sender, EventArgs e)
{
Windows.Show(WindowType.Options);

View File

@@ -1,203 +0,0 @@
namespace mRemoteNG.UI.Window
{
public partial class AboutWindow
{
#region Windows Form Designer generated code
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutWindow));
this.pnlTop = new System.Windows.Forms.Panel();
this.pbLogo = new System.Windows.Forms.PictureBox();
this.pnlBottom = new System.Windows.Forms.Panel();
this.lblTitle = new mRemoteNG.UI.Controls.Base.NGLabel();
this.lblVersion = new mRemoteNG.UI.Controls.Base.NGLabel();
this.lblLicense = new mRemoteNG.UI.Controls.Base.NGLabel();
this.lblCopyright = new mRemoteNG.UI.Controls.Base.NGLabel();
this.tlpBottom = new System.Windows.Forms.TableLayoutPanel();
this.gwbCredits = new Gecko.GeckoWebBrowser();
this.gwbChangeLog = new Gecko.GeckoWebBrowser();
this.tlpTop = new System.Windows.Forms.TableLayoutPanel();
this.pnlTop.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbLogo)).BeginInit();
this.pnlBottom.SuspendLayout();
this.tlpBottom.SuspendLayout();
this.tlpTop.SuspendLayout();
this.SuspendLayout();
//
// pnlTop
//
this.pnlTop.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(52)))), ((int)(((byte)(58)))), ((int)(((byte)(64)))));
this.pnlTop.Controls.Add(this.pbLogo);
this.pnlTop.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlTop.ForeColor = System.Drawing.Color.White;
this.pnlTop.Location = new System.Drawing.Point(3, 3);
this.pnlTop.Name = "pnlTop";
this.pnlTop.Size = new System.Drawing.Size(1111, 116);
this.pnlTop.TabIndex = 0;
//
// pbLogo
//
this.pbLogo.Image = global::mRemoteNG.Resources.Header_dark;
this.pbLogo.Location = new System.Drawing.Point(0, 0);
this.pbLogo.Name = "pbLogo";
this.pbLogo.Size = new System.Drawing.Size(450, 120);
this.pbLogo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
this.pbLogo.TabIndex = 1;
this.pbLogo.TabStop = false;
//
// pnlBottom
//
this.pnlBottom.BackColor = System.Drawing.SystemColors.Control;
this.pnlBottom.Controls.Add(this.lblTitle);
this.pnlBottom.Controls.Add(this.lblVersion);
this.pnlBottom.Controls.Add(this.lblLicense);
this.pnlBottom.Controls.Add(this.lblCopyright);
this.pnlBottom.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlBottom.ForeColor = System.Drawing.SystemColors.ControlText;
this.pnlBottom.Location = new System.Drawing.Point(3, 125);
this.pnlBottom.Name = "pnlBottom";
this.pnlBottom.Size = new System.Drawing.Size(1111, 194);
this.pnlBottom.TabIndex = 1;
//
// lblTitle
//
this.lblTitle.AutoSize = true;
this.lblTitle.Font = new System.Drawing.Font("Segoe UI", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblTitle.ForeColor = System.Drawing.SystemColors.ControlText;
this.lblTitle.Location = new System.Drawing.Point(3, 3);
this.lblTitle.Name = "lblTitle";
this.lblTitle.Size = new System.Drawing.Size(126, 31);
this.lblTitle.TabIndex = 0;
this.lblTitle.Text = "mRemoteNG";
this.lblTitle.UseCompatibleTextRendering = true;
//
// lblVersion
//
this.lblVersion.AutoSize = true;
this.lblVersion.Font = new System.Drawing.Font("Segoe UI", 11F);
this.lblVersion.ForeColor = System.Drawing.SystemColors.ControlText;
this.lblVersion.Location = new System.Drawing.Point(3, 34);
this.lblVersion.Name = "lblVersion";
this.lblVersion.Size = new System.Drawing.Size(55, 25);
this.lblVersion.TabIndex = 1;
this.lblVersion.Text = "Version";
this.lblVersion.UseCompatibleTextRendering = true;
//
// lblLicense
//
this.lblLicense.AutoSize = true;
this.lblLicense.Font = new System.Drawing.Font("Segoe UI", 11F);
this.lblLicense.ForeColor = System.Drawing.SystemColors.ControlText;
this.lblLicense.Location = new System.Drawing.Point(3, 84);
this.lblLicense.Name = "lblLicense";
this.lblLicense.Size = new System.Drawing.Size(54, 25);
this.lblLicense.TabIndex = 5;
this.lblLicense.Text = "License";
this.lblLicense.UseCompatibleTextRendering = true;
//
// lblCopyright
//
this.lblCopyright.AutoSize = true;
this.lblCopyright.Font = new System.Drawing.Font("Segoe UI", 11F);
this.lblCopyright.ForeColor = System.Drawing.SystemColors.ControlText;
this.lblCopyright.Location = new System.Drawing.Point(3, 59);
this.lblCopyright.Name = "lblCopyright";
this.lblCopyright.Size = new System.Drawing.Size(71, 25);
this.lblCopyright.TabIndex = 2;
this.lblCopyright.Text = "Copyright";
this.lblCopyright.UseCompatibleTextRendering = true;
//
// tlpBottom
//
this.tlpBottom.ColumnCount = 2;
this.tlpBottom.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tlpBottom.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tlpBottom.Controls.Add(this.gwbCredits, 0, 0);
this.tlpBottom.Controls.Add(this.gwbChangeLog, 1, 0);
this.tlpBottom.Dock = System.Windows.Forms.DockStyle.Fill;
this.tlpBottom.Location = new System.Drawing.Point(0, 235);
this.tlpBottom.Name = "tlpBottom";
this.tlpBottom.RowCount = 1;
this.tlpBottom.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tlpBottom.Size = new System.Drawing.Size(1117, 470);
this.tlpBottom.TabIndex = 13;
//
// gwbCredits
//
this.gwbCredits.Dock = System.Windows.Forms.DockStyle.Fill;
this.gwbCredits.FrameEventsPropagateToMainWindow = false;
this.gwbCredits.Location = new System.Drawing.Point(3, 3);
this.gwbCredits.Name = "gwbCredits";
this.gwbCredits.NoDefaultContextMenu = true;
this.gwbCredits.Size = new System.Drawing.Size(552, 464);
this.gwbCredits.TabIndex = 12;
this.gwbCredits.UseHttpActivityObserver = false;
this.gwbCredits.DomClick += new System.EventHandler<Gecko.DomMouseEventArgs>(this.LinkClicked);
//
// gwbChangeLog
//
this.gwbChangeLog.Dock = System.Windows.Forms.DockStyle.Fill;
this.gwbChangeLog.FrameEventsPropagateToMainWindow = false;
this.gwbChangeLog.Location = new System.Drawing.Point(561, 3);
this.gwbChangeLog.Name = "gwbChangeLog";
this.gwbChangeLog.NoDefaultContextMenu = true;
this.gwbChangeLog.Size = new System.Drawing.Size(553, 464);
this.gwbChangeLog.TabIndex = 13;
this.gwbChangeLog.UseHttpActivityObserver = false;
this.gwbChangeLog.DomClick += new System.EventHandler<Gecko.DomMouseEventArgs>(this.LinkClicked);
//
// tlpTop
//
this.tlpTop.ColumnCount = 1;
this.tlpTop.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tlpTop.Controls.Add(this.pnlTop, 0, 0);
this.tlpTop.Controls.Add(this.pnlBottom, 0, 1);
this.tlpTop.Dock = System.Windows.Forms.DockStyle.Top;
this.tlpTop.Location = new System.Drawing.Point(0, 0);
this.tlpTop.Name = "tlpTop";
this.tlpTop.RowCount = 2;
this.tlpTop.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 122F));
this.tlpTop.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 200F));
this.tlpTop.Size = new System.Drawing.Size(1117, 235);
this.tlpTop.TabIndex = 14;
//
// AboutWindow
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.BackColor = System.Drawing.SystemColors.Control;
this.ClientSize = new System.Drawing.Size(1117, 705);
this.Controls.Add(this.tlpBottom);
this.Controls.Add(this.tlpTop);
this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.ForeColor = System.Drawing.SystemColors.ControlText;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximumSize = new System.Drawing.Size(20000, 10000);
this.Name = "AboutWindow";
this.TabText = "About";
this.Text = "About";
this.pnlTop.ResumeLayout(false);
this.pnlTop.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pbLogo)).EndInit();
this.pnlBottom.ResumeLayout(false);
this.pnlBottom.PerformLayout();
this.tlpBottom.ResumeLayout(false);
this.tlpTop.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
internal Controls.Base.NGLabel lblCopyright;
internal Controls.Base.NGLabel lblTitle;
internal Controls.Base.NGLabel lblVersion;
internal Controls.Base.NGLabel lblLicense;
internal System.Windows.Forms.Panel pnlBottom;
internal System.Windows.Forms.PictureBox pbLogo;
private System.Windows.Forms.TableLayoutPanel tlpBottom;
private System.Windows.Forms.TableLayoutPanel tlpTop;
internal System.Windows.Forms.Panel pnlTop;
private Gecko.GeckoWebBrowser gwbCredits;
private Gecko.GeckoWebBrowser gwbChangeLog;
}
}

View File

@@ -1,132 +0,0 @@
using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Text;
using Gecko;
using mRemoteNG.App;
using mRemoteNG.App.Info;
using mRemoteNG.Messages;
using mRemoteNG.Themes;
using Markdig;
using WeifenLuo.WinFormsUI.Docking;
namespace mRemoteNG.UI.Window
{
public partial class AboutWindow : BaseWindow
{
#region Public Methods
public AboutWindow()
{
WindowType = WindowType.About;
DockPnl = new DockContent();
if (!Xpcom.IsInitialized)
Xpcom.Initialize("Firefox");
InitializeComponent();
FontOverrider.FontOverride(this);
ThemeManager.getInstance().ThemeChanged += ApplyTheme;
ApplyLanguage();
ApplyTheme();
LoadDocuments();
}
#endregion Public Methods
#region Private Methods
private void ApplyLanguage()
{
lblLicense.Text = Language.strLabelReleasedUnderGPL;
TabText = Language.strAbout;
Text = Language.strAbout;
lblCopyright.Text = GeneralAppInfo.Copyright;
lblVersion.Text = $@"Version {GeneralAppInfo.ApplicationVersion}";
#if PORTABLE
lblTitle.Text += $@" {Language.strLabelPortableEdition}";
#endif
}
private new void ApplyTheme()
{
if (!ThemeManager.getInstance().ThemingActive) return;
base.ApplyTheme();
if (!ThemeManager.getInstance().ActiveAndExtended) return;
BackColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Background");
ForeColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Foreground");
pnlBottom.BackColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Background");
pnlBottom.ForeColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Foreground");
pnlTop.ForeColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Background");
pnlTop.ForeColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Foreground");
}
#endregion Private Methods
#region Form Stuff
private void LoadDocuments()
{
try
{
// AppVeyor seems to pull text files in UNIX format... This messes up the display on the about screen...
//
// This would be MUCH faster:
//var UnxEndRx = new Regex(@"(?<!\r)\n$"); // Look for UNIX line endings and still Windows line endings.
//if (UnxEndRx.IsMatch(txtChangeLog.Text))
// txtChangeLog.Text = txtChangeLog.Text.Replace("\n", Environment.NewLine);
//
// But for some reason that I couldn't figure out, the RegEx.IsMatch on CREDITS.md/txtCredits.Text
// did not work at all despite it CLEARLY ending with \n when pulled from AppVeyor...
// The Changelog is a bit long anyways... Limit the number of lines to something reasonable.
if (!File.Exists(GeneralAppInfo.HomePath + @"\CREDITS.md") && !File.Exists(GeneralAppInfo.HomePath + @"\CHANGELOG.md")) return;
var pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build();
var backgroundColor = ColorTranslator.ToHtml(ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Background"));
var foregroundColor = ColorTranslator.ToHtml(ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Foreground"));
var css =
$@"<head><style>body{{font-family:arial,helvetica,sans-serif;font-size:12px;color:{foregroundColor};}}a:link,a:visited,a:hover,a:active{{text-decoration:none;background-color:{foregroundColor};color:{backgroundColor};}}</style></head>";
var changelog = "";
using (var sR = new StreamReader(GeneralAppInfo.HomePath + @"\CHANGELOG.md", Encoding.UTF8, true))
{
string line;
var i = 0;
while ((line = sR.ReadLine()) != null)
{
changelog += line + Environment.NewLine;
i++;
if (i <= 128 || line != string.Empty) continue;
changelog +=
$"{Environment.NewLine}***See [CHANGELOG.md](https://github.com/mRemoteNG/mRemoteNG/blob/develop/CHANGELOG.md) for full History...***{Environment.NewLine}";
break;
}
}
var changelogHtml = Markdown.ToHtml(changelog, pipeline);
changelogHtml = css + $"<body bgcolor=\"{backgroundColor}\">{changelogHtml}</body>";
var credits = new StreamReader(GeneralAppInfo.HomePath + @"\CREDITS.md", Encoding.UTF8, true).ReadToEnd();
var creditsHtml = Markdown.ToHtml(credits, pipeline);
creditsHtml = css + $"<body bgcolor=\"{backgroundColor}\">{creditsHtml}</body>";
gwbChangeLog.LoadHtml(changelogHtml.Replace("©", "&copy;"));
gwbCredits.LoadHtml(creditsHtml.Replace("©", "&copy;"));
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg,
"Loading About failed" + Environment.NewLine + ex.Message, true);
}
}
private void LinkClicked(object sender, DomMouseEventArgs e)
{
var url = ((GeckoWebBrowser)sender).StatusText;
if (!string.IsNullOrEmpty(url))
Process.Start(url);
e.Handled = true;
}
#endregion Form Stuff
}
}

View File

@@ -1,10 +1,7 @@

using mRemoteNG.Themes;
namespace mRemoteNG.UI.Window
{
public partial class ActiveDirectoryImportWindow : BaseWindow
public partial class ActiveDirectoryImportWindow
{
#region Windows Form Designer generated code
private void InitializeComponent()
@@ -13,7 +10,7 @@ namespace mRemoteNG.UI.Window
this.txtDomain = new mRemoteNG.UI.Controls.Base.NGTextBox();
this.lblDomain = new mRemoteNG.UI.Controls.Base.NGLabel();
this.btnChangeDomain = new mRemoteNG.UI.Controls.Base.NGButton();
this.ActiveDirectoryTree = new ADTree.ADtree();
this.activeDirectoryTree = new mRemoteNG.UI.Controls.AdTree();
this.btnClose = new mRemoteNG.UI.Controls.Base.NGButton();
this.chkSubOU = new mRemoteNG.UI.Controls.Base.NGCheckBox();
this.SuspendLayout();
@@ -28,7 +25,7 @@ namespace mRemoteNG.UI.Window
this.btnImport.TabIndex = 4;
this.btnImport.Text = "&Import";
this.btnImport.UseVisualStyleBackColor = true;
this.btnImport.Click += new System.EventHandler(this.btnImport_Click);
this.btnImport.Click += new System.EventHandler(this.BtnImport_Click);
//
// txtDomain
//
@@ -39,7 +36,7 @@ namespace mRemoteNG.UI.Window
this.txtDomain.Name = "txtDomain";
this.txtDomain.Size = new System.Drawing.Size(406, 22);
this.txtDomain.TabIndex = 1;
this.txtDomain.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtDomain_KeyDown);
this.txtDomain.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TxtDomain_KeyDown);
//
// lblDomain
//
@@ -60,23 +57,22 @@ namespace mRemoteNG.UI.Window
this.btnChangeDomain.TabIndex = 2;
this.btnChangeDomain.Text = "Change";
this.btnChangeDomain.UseVisualStyleBackColor = true;
this.btnChangeDomain.Click += new System.EventHandler(this.btnChangeDomain_Click);
this.btnChangeDomain.Click += new System.EventHandler(this.BtnChangeDomain_Click);
//
// ActiveDirectoryTree
//
this.ActiveDirectoryTree.AdPath = null;
this.ActiveDirectoryTree.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
this.activeDirectoryTree.AdPath = null;
this.activeDirectoryTree.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.ActiveDirectoryTree.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.ActiveDirectoryTree.Domain = "";
this.ActiveDirectoryTree.Location = new System.Drawing.Point(12, 52);
this.ActiveDirectoryTree.Margin = new System.Windows.Forms.Padding(4);
this.ActiveDirectoryTree.Name = "ActiveDirectoryTree";
this.ActiveDirectoryTree.SelectedNode = null;
this.ActiveDirectoryTree.Size = new System.Drawing.Size(510, 285);
this.ActiveDirectoryTree.TabIndex = 3;
this.ActiveDirectoryTree.AdPathChanged += new ADTree.ADtree.AdPathChangedEventHandler(this.ActiveDirectoryTree_ADPathChanged);
this.activeDirectoryTree.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.activeDirectoryTree.Location = new System.Drawing.Point(12, 52);
this.activeDirectoryTree.Margin = new System.Windows.Forms.Padding(4);
this.activeDirectoryTree.Name = "ActiveDirectoryTree";
this.activeDirectoryTree.SelectedNode = null;
this.activeDirectoryTree.Size = new System.Drawing.Size(510, 285);
this.activeDirectoryTree.TabIndex = 3;
this.activeDirectoryTree.AdPathChanged += new mRemoteNG.UI.Controls.AdTree.AdPathChangedEventHandler(this.ActiveDirectoryTree_ADPathChanged);
//
// btnClose
//
@@ -88,7 +84,7 @@ namespace mRemoteNG.UI.Window
this.btnClose.TabIndex = 5;
this.btnClose.Text = "Close";
this.btnClose.UseVisualStyleBackColor = true;
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
this.btnClose.Click += new System.EventHandler(this.BtnClose_Click);
//
// chkSubOU
//
@@ -112,7 +108,7 @@ namespace mRemoteNG.UI.Window
this.ClientSize = new System.Drawing.Size(534, 381);
this.Controls.Add(this.chkSubOU);
this.Controls.Add(this.btnClose);
this.Controls.Add(this.ActiveDirectoryTree);
this.Controls.Add(this.activeDirectoryTree);
this.Controls.Add(this.lblDomain);
this.Controls.Add(this.txtDomain);
this.Controls.Add(this.btnChangeDomain);
@@ -122,7 +118,6 @@ namespace mRemoteNG.UI.Window
this.Name = "ActiveDirectoryImportWindow";
this.TabText = "Active Directory Import";
this.Text = "Active Directory Import";
this.Load += new System.EventHandler(this.ADImport_Load);
this.ResumeLayout(false);
this.PerformLayout();
@@ -131,7 +126,7 @@ namespace mRemoteNG.UI.Window
private Controls.Base.NGTextBox txtDomain;
private Controls.Base.NGLabel lblDomain;
private Controls.Base.NGButton btnChangeDomain;
private ADTree.ADtree ActiveDirectoryTree;
private mRemoteNG.UI.Controls.AdTree activeDirectoryTree;
#endregion
private Controls.Base.NGButton btnClose;

View File

@@ -8,47 +8,37 @@ using mRemoteNG.Themes;
namespace mRemoteNG.UI.Window
{
public partial class ActiveDirectoryImportWindow
public partial class ActiveDirectoryImportWindow : BaseWindow
{
private string _currentDomain;
public ActiveDirectoryImportWindow()
{
InitializeComponent();
FontOverrider.FontOverride(this);
WindowType = WindowType.ActiveDirectoryImport;
DockPnl = new DockContent();
_currentDomain = Environment.UserDomainName;
InitializeComponent();
FontOverrider.FontOverride(this);
ApplyTheme();
}
private new void ApplyTheme()
{
base.ApplyTheme();
if (ActiveDirectoryTree.Controls.Count < 1) return;
if (!(ActiveDirectoryTree.Controls[0] is TreeView tv)) return;
var tm = ThemeManager.getInstance();
if (!tm.ActiveAndExtended) return;
tv.BackColor = tm.ActiveTheme.ExtendedPalette.getColor("List_Background");
tv.ForeColor = tm.ActiveTheme.ExtendedPalette.getColor("List_Item_Foreground");
ApplyLanguage();
txtDomain.Text = _currentDomain;
EnableDisableImportButton();
// Domain doesn't refresh on load, so it defaults to DOMAIN without this...
_currentDomain = Environment.UserDomainName;
ChangeDomain();
}
#region Private Methods
#region Event Handlers
private void ADImport_Load(object sender, EventArgs e)
private new void ApplyTheme()
{
ApplyLanguage();
txtDomain.Text = _currentDomain;
ActiveDirectoryTree.Domain = _currentDomain;
EnableDisableImportButton();
// Domain doesn't refresh on load, so it defaults to DOMAIN without this...
ChangeDomain();
if (!ThemeManager.getInstance().ThemingActive) return;
base.ApplyTheme();
if (!ThemeManager.getInstance().ActiveAndExtended) return;
activeDirectoryTree.BackColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("List_Background");
activeDirectoryTree.ForeColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("List_Item_Foreground");
}
private void btnImport_Click(object sender, EventArgs e)
private void BtnImport_Click(object sender, EventArgs e)
{
var selectedNode = Windows.TreeForm.SelectedNode;
ContainerInfo importDestination;
@@ -57,37 +47,26 @@ namespace mRemoteNG.UI.Window
else
importDestination = Runtime.ConnectionsService.ConnectionTreeModel.RootNodes.First();
Import.ImportFromActiveDirectory(ActiveDirectoryTree.AdPath, importDestination, chkSubOU.Checked);
Import.ImportFromActiveDirectory(activeDirectoryTree.AdPath, importDestination, chkSubOU.Checked);
}
/*
private static void txtDomain_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.KeyCode == Keys.Enter)
e.IsInputKey = true;
}
*/
private void txtDomain_KeyDown(object sender, KeyEventArgs e)
private void TxtDomain_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode != Keys.Enter) return;
ChangeDomain();
e.SuppressKeyPress = true;
}
private void btnChangeDomain_Click(object sender, EventArgs e)
private void BtnChangeDomain_Click(object sender, EventArgs e)
{
ChangeDomain();
}
// ReSharper disable once UnusedParameter.Local
private void ActiveDirectoryTree_ADPathChanged(object sender)
{
EnableDisableImportButton();
}
#endregion
private void ApplyLanguage()
{
btnImport.Text = Language.strButtonImport;
@@ -100,20 +79,19 @@ namespace mRemoteNG.UI.Window
private void ChangeDomain()
{
_currentDomain = txtDomain.Text;
ActiveDirectoryTree.Domain = _currentDomain;
ActiveDirectoryTree.Refresh();
activeDirectoryTree.Domain = _currentDomain;
activeDirectoryTree.Refresh();
}
private void EnableDisableImportButton()
{
btnImport.Enabled = !string.IsNullOrEmpty(ActiveDirectoryTree.AdPath);
btnImport.Enabled = !string.IsNullOrEmpty(activeDirectoryTree.AdPath);
}
#endregion
private void btnClose_Click(object sender, EventArgs e)
private void BtnClose_Click(object sender, EventArgs e)
{
Close();
}
#endregion Private Methods
}
}

View File

@@ -1,724 +0,0 @@
using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Threading;
using AxWFICALib;
using Gecko;
using mRemoteNG.App;
using mRemoteNG.App.Info;
using mRemoteNG.Connection.Protocol.RDP;
using mRemoteNG.Messages;
using mRemoteNG.Themes;
using WeifenLuo.WinFormsUI.Docking;
namespace mRemoteNG.UI.Window
{
public class ComponentsCheckWindow : BaseWindow
{
private readonly Image _successImage;
private readonly Image _failureImage;
#region Form Stuff
private System.Windows.Forms.PictureBox pbCheck1;
private Controls.Base.NGLabel lblCheck1;
private System.Windows.Forms.Panel pnlCheck2;
private Controls.Base.NGLabel lblCheck2;
private System.Windows.Forms.PictureBox pbCheck2;
private System.Windows.Forms.Panel pnlCheck3;
private Controls.Base.NGLabel lblCheck3;
private System.Windows.Forms.PictureBox pbCheck3;
private System.Windows.Forms.Panel pnlCheck4;
private Controls.Base.NGLabel lblCheck4;
private System.Windows.Forms.PictureBox pbCheck4;
private System.Windows.Forms.Panel pnlCheck5;
private Controls.Base.NGLabel lblCheck5;
private System.Windows.Forms.PictureBox pbCheck5;
private Controls.Base.NGButton btnCheckAgain;
private Controls.Base.NGTextBox txtCheck1;
private Controls.Base.NGTextBox txtCheck2;
private Controls.Base.NGTextBox txtCheck3;
private Controls.Base.NGTextBox txtCheck4;
private Controls.Base.NGTextBox txtCheck5;
private Controls.Base.NGCheckBox chkAlwaysShow;
private System.Windows.Forms.Panel pnlChecks;
private System.Windows.Forms.Panel pnlCheck1;
private void InitializeComponent()
{
this.pnlCheck1 = new System.Windows.Forms.Panel();
this.txtCheck1 = new mRemoteNG.UI.Controls.Base.NGTextBox();
this.lblCheck1 = new mRemoteNG.UI.Controls.Base.NGLabel();
this.pbCheck1 = new System.Windows.Forms.PictureBox();
this.pnlCheck2 = new System.Windows.Forms.Panel();
this.txtCheck2 = new mRemoteNG.UI.Controls.Base.NGTextBox();
this.lblCheck2 = new mRemoteNG.UI.Controls.Base.NGLabel();
this.pbCheck2 = new System.Windows.Forms.PictureBox();
this.pnlCheck3 = new System.Windows.Forms.Panel();
this.txtCheck3 = new mRemoteNG.UI.Controls.Base.NGTextBox();
this.lblCheck3 = new mRemoteNG.UI.Controls.Base.NGLabel();
this.pbCheck3 = new System.Windows.Forms.PictureBox();
this.pnlCheck4 = new System.Windows.Forms.Panel();
this.txtCheck4 = new mRemoteNG.UI.Controls.Base.NGTextBox();
this.lblCheck4 = new mRemoteNG.UI.Controls.Base.NGLabel();
this.pbCheck4 = new System.Windows.Forms.PictureBox();
this.pnlCheck5 = new System.Windows.Forms.Panel();
this.txtCheck5 = new mRemoteNG.UI.Controls.Base.NGTextBox();
this.lblCheck5 = new mRemoteNG.UI.Controls.Base.NGLabel();
this.pbCheck5 = new System.Windows.Forms.PictureBox();
this.btnCheckAgain = new mRemoteNG.UI.Controls.Base.NGButton();
this.chkAlwaysShow = new mRemoteNG.UI.Controls.Base.NGCheckBox();
this.pnlChecks = new System.Windows.Forms.Panel();
this.pnlCheck1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck1)).BeginInit();
this.pnlCheck2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck2)).BeginInit();
this.pnlCheck3.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck3)).BeginInit();
this.pnlCheck4.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck4)).BeginInit();
this.pnlCheck5.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck5)).BeginInit();
this.pnlChecks.SuspendLayout();
this.SuspendLayout();
//
// pnlCheck1
//
this.pnlCheck1.Anchor =
((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.pnlCheck1.Controls.Add(this.txtCheck1);
this.pnlCheck1.Controls.Add(this.lblCheck1);
this.pnlCheck1.Controls.Add(this.pbCheck1);
this.pnlCheck1.Location = new System.Drawing.Point(3, 3);
this.pnlCheck1.Name = "pnlCheck1";
this.pnlCheck1.Size = new System.Drawing.Size(562, 130);
this.pnlCheck1.TabIndex = 10;
this.pnlCheck1.Visible = false;
//
// txtCheck1
//
this.txtCheck1.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.txtCheck1.BackColor = System.Drawing.SystemColors.Control;
this.txtCheck1.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.txtCheck1.Location = new System.Drawing.Point(129, 29);
this.txtCheck1.Multiline = true;
this.txtCheck1.Name = "txtCheck1";
this.txtCheck1.ReadOnly = true;
this.txtCheck1.Size = new System.Drawing.Size(430, 97);
this.txtCheck1.TabIndex = 2;
//
// lblCheck1
//
this.lblCheck1.Anchor =
((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lblCheck1.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Bold,
System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblCheck1.ForeColor = System.Drawing.SystemColors.ControlText;
this.lblCheck1.Location = new System.Drawing.Point(108, 3);
this.lblCheck1.Name = "lblCheck1";
this.lblCheck1.Size = new System.Drawing.Size(451, 23);
this.lblCheck1.TabIndex = 1;
this.lblCheck1.Text = "RDP check succeeded!";
//
// pbCheck1
//
this.pbCheck1.Anchor =
((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.pbCheck1.Location = new System.Drawing.Point(3, 3);
this.pbCheck1.Name = "pbCheck1";
this.pbCheck1.Size = new System.Drawing.Size(72, 123);
this.pbCheck1.TabIndex = 0;
this.pbCheck1.TabStop = false;
//
// pnlCheck2
//
this.pnlCheck2.Anchor =
((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.pnlCheck2.Controls.Add(this.txtCheck2);
this.pnlCheck2.Controls.Add(this.lblCheck2);
this.pnlCheck2.Controls.Add(this.pbCheck2);
this.pnlCheck2.Location = new System.Drawing.Point(3, 139);
this.pnlCheck2.Name = "pnlCheck2";
this.pnlCheck2.Size = new System.Drawing.Size(562, 130);
this.pnlCheck2.TabIndex = 20;
this.pnlCheck2.Visible = false;
//
// txtCheck2
//
this.txtCheck2.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.txtCheck2.BackColor = System.Drawing.SystemColors.Control;
this.txtCheck2.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.txtCheck2.Location = new System.Drawing.Point(129, 29);
this.txtCheck2.Multiline = true;
this.txtCheck2.Name = "txtCheck2";
this.txtCheck2.ReadOnly = true;
this.txtCheck2.Size = new System.Drawing.Size(430, 97);
this.txtCheck2.TabIndex = 2;
//
// lblCheck2
//
this.lblCheck2.Anchor =
((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lblCheck2.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Bold,
System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblCheck2.Location = new System.Drawing.Point(112, 3);
this.lblCheck2.Name = "lblCheck2";
this.lblCheck2.Size = new System.Drawing.Size(447, 23);
this.lblCheck2.TabIndex = 1;
this.lblCheck2.Text = "RDP check succeeded!";
//
// pbCheck2
//
this.pbCheck2.Anchor =
((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.pbCheck2.Location = new System.Drawing.Point(3, 3);
this.pbCheck2.Name = "pbCheck2";
this.pbCheck2.Size = new System.Drawing.Size(72, 123);
this.pbCheck2.TabIndex = 0;
this.pbCheck2.TabStop = false;
//
// pnlCheck3
//
this.pnlCheck3.Anchor =
((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.pnlCheck3.Controls.Add(this.txtCheck3);
this.pnlCheck3.Controls.Add(this.lblCheck3);
this.pnlCheck3.Controls.Add(this.pbCheck3);
this.pnlCheck3.Location = new System.Drawing.Point(3, 275);
this.pnlCheck3.Name = "pnlCheck3";
this.pnlCheck3.Size = new System.Drawing.Size(562, 130);
this.pnlCheck3.TabIndex = 30;
this.pnlCheck3.Visible = false;
//
// txtCheck3
//
this.txtCheck3.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.txtCheck3.BackColor = System.Drawing.SystemColors.Control;
this.txtCheck3.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.txtCheck3.Location = new System.Drawing.Point(129, 29);
this.txtCheck3.Multiline = true;
this.txtCheck3.Name = "txtCheck3";
this.txtCheck3.ReadOnly = true;
this.txtCheck3.Size = new System.Drawing.Size(430, 97);
this.txtCheck3.TabIndex = 2;
//
// lblCheck3
//
this.lblCheck3.Anchor =
((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lblCheck3.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Bold,
System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblCheck3.Location = new System.Drawing.Point(112, 3);
this.lblCheck3.Name = "lblCheck3";
this.lblCheck3.Size = new System.Drawing.Size(447, 23);
this.lblCheck3.TabIndex = 1;
this.lblCheck3.Text = "RDP check succeeded!";
//
// pbCheck3
//
this.pbCheck3.Anchor =
((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.pbCheck3.Location = new System.Drawing.Point(3, 3);
this.pbCheck3.Name = "pbCheck3";
this.pbCheck3.Size = new System.Drawing.Size(72, 123);
this.pbCheck3.TabIndex = 0;
this.pbCheck3.TabStop = false;
//
// pnlCheck4
//
this.pnlCheck4.Anchor =
((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.pnlCheck4.Controls.Add(this.txtCheck4);
this.pnlCheck4.Controls.Add(this.lblCheck4);
this.pnlCheck4.Controls.Add(this.pbCheck4);
this.pnlCheck4.Location = new System.Drawing.Point(3, 411);
this.pnlCheck4.Name = "pnlCheck4";
this.pnlCheck4.Size = new System.Drawing.Size(562, 130);
this.pnlCheck4.TabIndex = 40;
this.pnlCheck4.Visible = false;
//
// txtCheck4
//
this.txtCheck4.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.txtCheck4.BackColor = System.Drawing.SystemColors.Control;
this.txtCheck4.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.txtCheck4.Location = new System.Drawing.Point(129, 30);
this.txtCheck4.Multiline = true;
this.txtCheck4.Name = "txtCheck4";
this.txtCheck4.ReadOnly = true;
this.txtCheck4.Size = new System.Drawing.Size(430, 97);
this.txtCheck4.TabIndex = 2;
//
// lblCheck4
//
this.lblCheck4.Anchor =
((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lblCheck4.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Bold,
System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblCheck4.Location = new System.Drawing.Point(112, 3);
this.lblCheck4.Name = "lblCheck4";
this.lblCheck4.Size = new System.Drawing.Size(447, 23);
this.lblCheck4.TabIndex = 1;
this.lblCheck4.Text = "RDP check succeeded!";
//
// pbCheck4
//
this.pbCheck4.Anchor =
((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.pbCheck4.Location = new System.Drawing.Point(3, 3);
this.pbCheck4.Name = "pbCheck4";
this.pbCheck4.Size = new System.Drawing.Size(72, 123);
this.pbCheck4.TabIndex = 0;
this.pbCheck4.TabStop = false;
//
// pnlCheck5
//
this.pnlCheck5.Anchor =
((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.pnlCheck5.Controls.Add(this.txtCheck5);
this.pnlCheck5.Controls.Add(this.lblCheck5);
this.pnlCheck5.Controls.Add(this.pbCheck5);
this.pnlCheck5.Location = new System.Drawing.Point(3, 547);
this.pnlCheck5.Name = "pnlCheck5";
this.pnlCheck5.Size = new System.Drawing.Size(562, 130);
this.pnlCheck5.TabIndex = 50;
this.pnlCheck5.Visible = false;
//
// txtCheck5
//
this.txtCheck5.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.txtCheck5.BackColor = System.Drawing.SystemColors.Control;
this.txtCheck5.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.txtCheck5.Location = new System.Drawing.Point(129, 29);
this.txtCheck5.Multiline = true;
this.txtCheck5.Name = "txtCheck5";
this.txtCheck5.ReadOnly = true;
this.txtCheck5.Size = new System.Drawing.Size(430, 97);
this.txtCheck5.TabIndex = 2;
//
// lblCheck5
//
this.lblCheck5.Anchor =
((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lblCheck5.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Bold,
System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblCheck5.Location = new System.Drawing.Point(112, 3);
this.lblCheck5.Name = "lblCheck5";
this.lblCheck5.Size = new System.Drawing.Size(447, 23);
this.lblCheck5.TabIndex = 1;
this.lblCheck5.Text = "RDP check succeeded!";
//
// pbCheck5
//
this.pbCheck5.Anchor =
((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.pbCheck5.Location = new System.Drawing.Point(3, 3);
this.pbCheck5.Name = "pbCheck5";
this.pbCheck5.Size = new System.Drawing.Size(72, 123);
this.pbCheck5.TabIndex = 0;
this.pbCheck5.TabStop = false;
//
// btnCheckAgain
//
this.btnCheckAgain._mice = mRemoteNG.UI.Controls.Base.NGButton.MouseState.HOVER;
this.btnCheckAgain.Anchor =
((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom |
System.Windows.Forms.AnchorStyles.Right)));
this.btnCheckAgain.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnCheckAgain.Location = new System.Drawing.Point(476, 810);
this.btnCheckAgain.Name = "btnCheckAgain";
this.btnCheckAgain.Size = new System.Drawing.Size(104, 23);
this.btnCheckAgain.TabIndex = 0;
this.btnCheckAgain.Text = "Check again";
this.btnCheckAgain.UseVisualStyleBackColor = true;
this.btnCheckAgain.Click += new System.EventHandler(this.btnCheckAgain_Click);
//
// chkAlwaysShow
//
this.chkAlwaysShow._mice = mRemoteNG.UI.Controls.Base.NGCheckBox.MouseState.HOVER;
this.chkAlwaysShow.Anchor =
((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom |
System.Windows.Forms.AnchorStyles.Left)));
this.chkAlwaysShow.AutoSize = true;
this.chkAlwaysShow.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.chkAlwaysShow.Location = new System.Drawing.Point(12, 814);
this.chkAlwaysShow.Name = "chkAlwaysShow";
this.chkAlwaysShow.Size = new System.Drawing.Size(200, 17);
this.chkAlwaysShow.TabIndex = 51;
this.chkAlwaysShow.Text = "Always show this screen at startup";
this.chkAlwaysShow.UseVisualStyleBackColor = true;
this.chkAlwaysShow.CheckedChanged += new System.EventHandler(this.chkAlwaysShow_CheckedChanged);
//
// pnlChecks
//
this.pnlChecks.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.pnlChecks.AutoScroll = true;
this.pnlChecks.Controls.Add(this.pnlCheck1);
this.pnlChecks.Controls.Add(this.pnlCheck2);
this.pnlChecks.Controls.Add(this.pnlCheck3);
this.pnlChecks.Controls.Add(this.pnlCheck5);
this.pnlChecks.Controls.Add(this.pnlCheck4);
this.pnlChecks.Location = new System.Drawing.Point(12, 12);
this.pnlChecks.Name = "pnlChecks";
this.pnlChecks.Size = new System.Drawing.Size(568, 792);
this.pnlChecks.TabIndex = 52;
//
// ComponentsCheckWindow
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.ClientSize = new System.Drawing.Size(592, 845);
this.Controls.Add(this.pnlChecks);
this.Controls.Add(this.chkAlwaysShow);
this.Controls.Add(this.btnCheckAgain);
this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular,
System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Icon = global::mRemoteNG.Resources.ComponentsCheck_Icon;
this.Name = "ComponentsCheckWindow";
this.TabText = "Components Check";
this.Text = "Components Check";
this.Load += new System.EventHandler(this.ComponentsCheck_Load);
this.pnlCheck1.ResumeLayout(false);
this.pnlCheck1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck1)).EndInit();
this.pnlCheck2.ResumeLayout(false);
this.pnlCheck2.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck2)).EndInit();
this.pnlCheck3.ResumeLayout(false);
this.pnlCheck3.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck3)).EndInit();
this.pnlCheck4.ResumeLayout(false);
this.pnlCheck4.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck4)).EndInit();
this.pnlCheck5.ResumeLayout(false);
this.pnlCheck5.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pbCheck5)).EndInit();
this.pnlChecks.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
#region Public Methods
public ComponentsCheckWindow()
{
WindowType = WindowType.ComponentsCheck;
DockPnl = new DockContent();
InitializeComponent();
var display = new DisplayProperties();
_successImage = display.ScaleImage(Resources.Good_Symbol);
_failureImage = display.ScaleImage(Resources.Bad_Symbol);
FontOverrider.FontOverride(this);
ThemeManager.getInstance().ThemeChanged += ApplyTheme;
}
#endregion
#region Form Stuff
private void ComponentsCheck_Load(object sender, EventArgs e)
{
ApplyLanguage();
ApplyTheme();
chkAlwaysShow.Checked = Settings.Default.StartupComponentsCheck;
CheckComponents();
}
private void ApplyLanguage()
{
TabText = Language.strComponentsCheck;
Text = Language.strComponentsCheck;
chkAlwaysShow.Text = Language.strCcAlwaysShowScreen;
btnCheckAgain.Text = Language.strCcCheckAgain;
}
private new void ApplyTheme()
{
if (!ThemeManager.getInstance().ThemingActive) return;
base.ApplyTheme();
if (!ThemeManager.getInstance().ActiveAndExtended) return;
pnlCheck1.BackColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Background");
pnlCheck1.ForeColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Foreground");
pnlCheck2.BackColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Background");
pnlCheck2.ForeColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Foreground");
pnlCheck3.BackColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Background");
pnlCheck3.ForeColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Foreground");
pnlCheck4.BackColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Background");
pnlCheck4.ForeColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Foreground");
pnlCheck5.BackColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Background");
pnlCheck5.ForeColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Foreground");
pnlChecks.BackColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Background");
pnlChecks.ForeColor = ThemeManager.getInstance().ActiveTheme.ExtendedPalette.getColor("Dialog_Foreground");
}
private void btnCheckAgain_Click(object sender, EventArgs e)
{
CheckComponents();
}
private void chkAlwaysShow_CheckedChanged(object sender, EventArgs e)
{
Settings.Default.StartupComponentsCheck = chkAlwaysShow.Checked;
}
public new void Show(DockPanel panel)
{
try
{
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "Trying to show the components window",
true);
base.Show(panel);
}
catch (Exception ex)
{
Runtime.MessageCollector.AddExceptionMessage("Failed to properly show the ComponentsWindow", ex);
}
}
#endregion
private void CheckComponents()
{
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "Beginning component check", true);
CheckRdp();
CheckVnc();
CheckPutty();
CheckIca();
CheckGeckoBrowser();
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "Finished component check", true);
}
private void CheckRdp()
{
pnlCheck1.Visible = true;
var rdpProtocolFactory = new RdpProtocolFactory();
var supportedVersions = rdpProtocolFactory.GetSupportedVersions();
if (supportedVersions.Any())
{
pbCheck1.Image = _successImage;
lblCheck1.ForeColor = Color.DarkOliveGreen;
lblCheck1.Text = "RDP (Remote Desktop) " + Language.strCcCheckSucceeded;
txtCheck1.Text = string.Format(Language.strCcRDPOK, string.Join(", ", supportedVersions));
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "RDP versions installed: "+ string.Join(",", supportedVersions), true);
}
else
{
pbCheck1.Image = _failureImage;
lblCheck1.ForeColor = Color.Firebrick;
lblCheck1.Text = "RDP (Remote Desktop) " + Language.strCcCheckFailed;
txtCheck1.Text = string.Format(Language.strCcRDPFailed, GeneralAppInfo.UrlForum);
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg,
"RDP " + Language.strCcNotInstalledProperly, true);
}
}
private void CheckVnc()
{
pnlCheck2.Visible = true;
try
{
using (var vnc = new VncSharp.RemoteDesktop())
{
vnc.CreateControl();
while (!vnc.Created)
{
Thread.Sleep(10);
System.Windows.Forms.Application.DoEvents();
}
pbCheck2.Image = _successImage;
lblCheck2.ForeColor = Color.DarkOliveGreen;
lblCheck2.Text = "VNC (Virtual Network Computing) " + Language.strCcCheckSucceeded;
txtCheck2.Text = string.Format(Language.strCcVNCOK, vnc.ProductVersion);
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "VNC installed", true);
}
}
catch (Exception)
{
pbCheck2.Image = _failureImage;
lblCheck2.ForeColor = Color.Firebrick;
lblCheck2.Text = "VNC (Virtual Network Computing) " + Language.strCcCheckFailed;
txtCheck2.Text = string.Format(Language.strCcVNCFailed, GeneralAppInfo.UrlForum);
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg,
"VNC " + Language.strCcNotInstalledProperly, true);
}
}
private void CheckPutty()
{
pnlCheck3.Visible = true;
string pPath;
if (Settings.Default.UseCustomPuttyPath == false)
{
pPath = GeneralAppInfo.HomePath + "\\PuTTYNG.exe";
}
else
{
pPath = Settings.Default.CustomPuttyPath;
}
if (File.Exists(pPath))
{
var versionInfo = FileVersionInfo.GetVersionInfo(pPath);
pbCheck3.Image = _successImage;
lblCheck3.ForeColor = Color.DarkOliveGreen;
lblCheck3.Text = "PuTTY (SSH/Telnet/Rlogin/RAW) " + Language.strCcCheckSucceeded;
txtCheck3.Text =
$"{Language.strCcPuttyOK}{Environment.NewLine}Version: {versionInfo.ProductName} Release: {versionInfo.FileVersion}";
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "PuTTY installed", true);
}
else
{
pbCheck3.Image = _failureImage;
lblCheck3.ForeColor = Color.Firebrick;
lblCheck3.Text = "PuTTY (SSH/Telnet/Rlogin/RAW) " + Language.strCcCheckFailed;
txtCheck3.Text = Language.strCcPuttyFailed;
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg,
"PuTTY " + Language.strCcNotInstalledProperly, true);
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "File " + pPath + " does not exist.",
true);
}
}
private void CheckIca()
{
pnlCheck4.Visible = true;
try
{
using (var ica = new AxICAClient())
{
ica.Parent = this;
pbCheck4.Image = _successImage;
lblCheck4.ForeColor = Color.DarkOliveGreen;
lblCheck4.Text = @"ICA (Citrix ICA) " + Language.strCcCheckSucceeded;
txtCheck4.Text = string.Format(Language.strCcICAOK, ica.Version);
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "ICA installed", true);
}
}
catch (Exception ex)
{
pbCheck4.Image = _failureImage;
lblCheck4.ForeColor = Color.Firebrick;
lblCheck4.Text = @"ICA (Citrix ICA) " + Language.strCcCheckFailed;
txtCheck4.Text = string.Format(Language.strCcICAFailed, GeneralAppInfo.UrlForum);
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg,
"ICA " + Language.strCcNotInstalledProperly, true);
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, ex.Message, true);
}
}
private void CheckGeckoBrowser()
{
pnlCheck5.Visible = true;
var geckoBad = false;
var geckoFxPath = Path.Combine(GeneralAppInfo.HomePath, "Firefox");
if (File.Exists(Path.Combine(GeneralAppInfo.HomePath, "Geckofx-Core.dll")))
{
if (Directory.Exists(geckoFxPath))
{
if (!File.Exists(Path.Combine(geckoFxPath, "xul.dll")))
{
geckoBad = true;
}
}
else
{
geckoBad = true;
}
}
if (geckoBad == false)
{
pbCheck5.Image = _successImage;
lblCheck5.ForeColor = Color.DarkOliveGreen;
lblCheck5.Text = @"Gecko (Firefox) Rendering Engine (HTTP/S) " + Language.strCcCheckSucceeded;
if (!Xpcom.IsInitialized)
Xpcom.Initialize("Firefox");
txtCheck5.Text = Language.strCcGeckoOK + " Version: " + Xpcom.XulRunnerVersion;
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "Gecko Browser installed", true);
}
else
{
pbCheck5.Image = _failureImage;
lblCheck5.ForeColor = Color.Firebrick;
lblCheck5.Text = @"Gecko (Firefox) Rendering Engine (HTTP/S) " + Language.strCcCheckFailed;
txtCheck5.Text = string.Format(Language.strCcGeckoFailed, GeneralAppInfo.UrlForum);
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg,
"Gecko " + Language.strCcNotInstalledProperly, true);
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg,
"GeckoFx was not found in " + geckoFxPath, true);
}
}
}
}

View File

@@ -1,4 +1,4 @@
namespace mRemoteNG.UI
namespace mRemoteNG.UI
{
public enum WindowType
{
@@ -8,7 +8,6 @@ namespace mRemoteNG.UI
ErrorsAndInfos = 4,
ScreenshotManager = 5,
Options = 6,
About = 8,
Update = 9,
SSHTransfer = 10,
ActiveDirectoryImport = 11,
@@ -16,6 +15,5 @@ namespace mRemoteNG.UI
ExternalApps = 13,
PortScan = 14,
UltraVNCSC = 16,
ComponentsCheck = 17,
}
}

View File

@@ -753,6 +753,18 @@
<setting name="InhDefaultRdpVersion" serializeAs="String">
<value>False</value>
</setting>
<setting name="InhDefaultSSHTunnelConnectionName" serializeAs="String">
<value>False</value>
</setting>
<setting name="ConDefaultSSHTunnelConnectionName" serializeAs="String">
<value />
</setting>
<setting name="InhDefaultSSHOptions" serializeAs="String">
<value>False</value>
</setting>
<setting name="ConDefaultSSHOptions" serializeAs="String">
<value />
</setting>
<setting name="StartMinimized" serializeAs="String">
<value>False</value>
</setting>
@@ -785,11 +797,19 @@
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="BouncyCastle.Crypto" publicKeyToken="0e99375e54769942" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.8.5.0" newVersion="1.8.5.0" />
<bindingRedirect oldVersion="0.0.0.0-1.8.6.0" newVersion="1.8.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Google.Protobuf" publicKeyToken="a7d26565bac4d604" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.9.2.0" newVersion="3.9.2.0" />
<bindingRedirect oldVersion="0.0.0.0-3.12.1.0" newVersion="3.12.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.6.0" newVersion="4.0.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
</assemblyBinding>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
<Import Project="..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props')" />
<Import Project="..\packages\NUnit3TestAdapter.3.16.1\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\packages\NUnit3TestAdapter.3.16.1\build\net35\NUnit3TestAdapter.props')" />
<Import Project="..\packages\CefSharp.WinForms.79.1.350\build\CefSharp.WinForms.props" Condition="Exists('..\packages\CefSharp.WinForms.79.1.350\build\CefSharp.WinForms.props')" />
<Import Project="..\packages\CefSharp.Common.79.1.350\build\CefSharp.Common.props" Condition="Exists('..\packages\CefSharp.Common.79.1.350\build\CefSharp.Common.props')" />
<Import Project="..\packages\cef.redist.x86.79.1.35\build\cef.redist.x86.props" Condition="Exists('..\packages\cef.redist.x86.79.1.35\build\cef.redist.x86.props')" />
@@ -53,17 +53,17 @@
<CefSharpAnyCpuSupport>true</CefSharpAnyCpuSupport>
</PropertyGroup>
<ItemGroup>
<Reference Include="ADTree">
<HintPath>References\ADTree.dll</HintPath>
<Reference Include="BouncyCastle.Crypto, Version=1.8.6.0, Culture=neutral, PublicKeyToken=0e99375e54769942">
<HintPath>..\packages\BouncyCastle.1.8.6.1\lib\BouncyCastle.Crypto.dll</HintPath>
</Reference>
<Reference Include="BouncyCastle.Crypto, Version=1.8.5.0, Culture=neutral, PublicKeyToken=0e99375e54769942">
<HintPath>..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll</HintPath>
<Reference Include="ConsoleControl, Version=1.3.0.0, Culture=neutral, PublicKeyToken=7edd23586f5e297f, processorArchitecture=MSIL">
<HintPath>..\packages\ConsoleControl.1.3.0\lib\net40-client\ConsoleControl.dll</HintPath>
</Reference>
<Reference Include="ConsoleControl, Version=1.2.1.0, Culture=neutral, PublicKeyToken=7edd23586f5e297f, processorArchitecture=MSIL">
<HintPath>..\packages\ConsoleControl.1.2.1\lib\net40-client\ConsoleControl.dll</HintPath>
<Reference Include="ConsoleControlAPI, Version=1.3.0.0, Culture=neutral, PublicKeyToken=7c86b8a36b9c33e2, processorArchitecture=MSIL">
<HintPath>..\packages\ConsoleControlAPI.1.3.0\lib\net40\ConsoleControlAPI.dll</HintPath>
</Reference>
<Reference Include="ConsoleControlAPI, Version=1.2.1.0, Culture=neutral, PublicKeyToken=7c86b8a36b9c33e2, processorArchitecture=MSIL">
<HintPath>..\packages\ConsoleControlAPI.1.2.1\lib\net40\ConsoleControlAPI.dll</HintPath>
<Reference Include="Geckofx-Core, Version=60.0.44.0, Culture=neutral, PublicKeyToken=3209ac31600d1857, processorArchitecture=x86">
<HintPath>..\packages\Geckofx60.32.60.0.44\lib\net45\Geckofx-Core.dll</HintPath>
</Reference>
<Reference Include="Google.Protobuf, Version=3.9.2.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Protobuf.3.9.2\lib\net45\Google.Protobuf.dll</HintPath>
@@ -71,13 +71,10 @@
<Reference Include="log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\packages\log4net.2.0.8\lib\net45-full\log4net.dll</HintPath>
</Reference>
<Reference Include="Markdig, Version=0.17.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Markdig.0.17.1\lib\net40\Markdig.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="mscorlib" />
<Reference Include="MySql.Data, Version=8.0.17.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<HintPath>..\packages\MySql.Data.8.0.17\lib\net452\MySql.Data.dll</HintPath>
<Reference Include="MySql.Data, Version=8.0.20.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<HintPath>..\packages\MySql.Data.8.0.20\lib\net452\MySql.Data.dll</HintPath>
</Reference>
<Reference Include="ObjectListView, Version=2.9.1.1072, Culture=neutral, PublicKeyToken=b1c5bf581481bcd4, processorArchitecture=MSIL">
<HintPath>..\packages\ObjectListView.Official.2.9.1\lib\net20\ObjectListView.dll</HintPath>
@@ -86,6 +83,9 @@
<HintPath>..\packages\SSH.NET.2016.1.0\lib\net40\Renci.SshNet.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Configuration" />
@@ -95,12 +95,25 @@
<Reference Include="System.Drawing" />
<Reference Include="System.Drawing.Design" />
<Reference Include="System.Management" />
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.7.1\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Security" />
<Reference Include="System.Transactions" />
<Reference Include="System.Web" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" />
<Reference Include="Ubiety.Dns.Core, Version=2.2.1.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<HintPath>..\packages\MySql.Data.8.0.20\lib\net452\Ubiety.Dns.Core.dll</HintPath>
</Reference>
<Reference Include="VncSharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=61974755c7bfea7c, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>References\VncSharp.dll</HintPath>
@@ -121,6 +134,9 @@
<HintPath>..\packages\DockPanelSuite.ThemeVS2015.3.0.6\lib\net40\WeifenLuo.WinFormsUI.Docking.ThemeVS2015.dll</HintPath>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="Zstandard.Net, Version=1.1.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<HintPath>..\packages\MySql.Data.8.0.20\lib\net452\Zstandard.Net.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Folder Include="Credential\Records\" />
@@ -299,6 +315,11 @@
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Resources\Language\Language.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Language.resx</DependentUpon>
</Compile>
<Compile Include="Resources\Themes\ColorMapTheme.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
@@ -314,6 +335,7 @@
<Compile Include="Themes\MremoteNGThemeBase.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="Tools\ADhelper.cs" />
<Compile Include="Tools\Attributes\UsedInAllProtocolsExceptAttribute.cs" />
<Compile Include="Tools\Clipboard\WindowsClipboard.cs" />
<Compile Include="Tools\CustomCollections\IFullyNotifiableList.cs" />
@@ -367,7 +389,7 @@
<Compile Include="Security\Factories\CryptoProviderFactoryFromXml.cs" />
<Compile Include="Tools\Cmdline\StartupArgumentsInterpreter.cs" />
<Compile Include="Tools\CustomCollections\CollectionUpdatedEventArgs.cs" />
<Compile Include="Settings.cs" />
<Compile Include="Config\Settings\Settings.cs" />
<Compile Include="Tools\DisposableAction.cs" />
<Compile Include="Tools\DisposableOptional.cs" />
<Compile Include="Tools\Extensions.cs" />
@@ -375,6 +397,7 @@
<Compile Include="Tools\Cmdline\CmdArgumentsInterpreter.cs" />
<Compile Include="Tools\ConnectionsTreeToMenuItemsConverter.cs" />
<Compile Include="Tools\ExternalToolsService.cs" />
<Compile Include="Tools\SshTunnelTypeConverter.cs" />
<Compile Include="Tools\ExternalToolsTypeConverter.cs" />
<Compile Include="Tools\CustomCollections\INotifyCollectionUpdated.cs" />
<Compile Include="Tools\Optional.cs" />
@@ -405,6 +428,12 @@
<Compile Include="Tree\Root\RootNodeTypeEnum.cs" />
<Compile Include="Tree\ClickHandlers\SwitchToConnectionClickHandler.cs" />
<Compile Include="Tree\ClickHandlers\TreeNodeCompositeClickHandler.cs" />
<Compile Include="UI\Controls\AdTree.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UI\Controls\AdTree.Designer.cs">
<DependentUpon>AdTree.cs</DependentUpon>
</Compile>
<Compile Include="UI\Controls\Base\NGButton.cs">
<SubType>Component</SubType>
</Compile>
@@ -576,6 +605,9 @@
<Compile Include="UI\Forms\OptionsPages\AppearancePage.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UI\Forms\OptionsPages\ComponentsPage.Designer.cs">
<DependentUpon>ComponentsPage.cs</DependentUpon>
</Compile>
<Compile Include="UI\Forms\OptionsPages\CredentialsPage.cs">
<SubType>UserControl</SubType>
</Compile>
@@ -686,11 +718,6 @@
<Compile Include="UI\Forms\PasswordForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Resources\Language\Language.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Language.resx</DependentUpon>
</Compile>
<Compile Include="Messages\Message.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Settings.Designer.cs">
@@ -771,11 +798,11 @@
<Compile Include="UI\TaskDialog\frmTaskDialog.designer.cs">
<DependentUpon>frmTaskDialog.cs</DependentUpon>
</Compile>
<Compile Include="UI\Window\AboutWindow.cs">
<Compile Include="UI\Forms\FrmAbout.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="UI\Window\AboutWindow.Designer.cs">
<DependentUpon>AboutWindow.cs</DependentUpon>
<Compile Include="UI\Forms\FrmAbout.Designer.cs">
<DependentUpon>FrmAbout.cs</DependentUpon>
</Compile>
<Compile Include="UI\Window\ActiveDirectoryImportWindow.Designer.cs">
<DependentUpon>ActiveDirectoryImportWindow.cs</DependentUpon>
@@ -786,8 +813,8 @@
<Compile Include="UI\Window\BaseWindow.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="UI\Window\ComponentsCheckWindow.cs">
<SubType>Form</SubType>
<Compile Include="UI\Forms\OptionsPages\ComponentsPage.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="UI\Window\ConfigWindow.cs">
<SubType>Form</SubType>
@@ -873,6 +900,9 @@
<LastGenOutput>ColorMapTheme.Designer.cs</LastGenOutput>
<CustomToolNamespace>mRemoteNG</CustomToolNamespace>
</EmbeddedResource>
<EmbeddedResource Include="UI\Controls\AdTree.resx">
<DependentUpon>AdTree.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\Controls\Base\NGButton.resx">
<DependentUpon>NGButton.cs</DependentUpon>
</EmbeddedResource>
@@ -1029,7 +1059,7 @@
<Generator>ResXFileCodeGenerator</Generator>
<CustomToolNamespace>mRemoteNG</CustomToolNamespace>
<SubType>Designer</SubType>
<LastGenOutput>Language1.Designer.cs</LastGenOutput>
<LastGenOutput>Language.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="Resources\Language\Language.fr.resx">
<SubType>Designer</SubType>
@@ -1074,8 +1104,8 @@
<EmbeddedResource Include="UI\TaskDialog\frmTaskDialog.resx">
<DependentUpon>frmTaskDialog.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\Window\AboutWindow.resx">
<DependentUpon>AboutWindow.cs</DependentUpon>
<EmbeddedResource Include="UI\Forms\FrmAbout.resx">
<DependentUpon>FrmAbout.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="UI\Window\ActiveDirectoryImportWindow.resx">
@@ -1085,8 +1115,8 @@
<EmbeddedResource Include="UI\Window\BaseWindow.resx">
<DependentUpon>BaseWindow.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="UI\Window\ComponentsCheckWindow.resx">
<DependentUpon>ComponentsCheckWindow.cs</DependentUpon>
<EmbeddedResource Include="UI\Forms\OptionsPages\ComponentsPage.resx">
<DependentUpon>ComponentsPage.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="UI\Window\ConfigWindow.resx">
@@ -1202,6 +1232,7 @@
<None Include="Documentation\images\connections_status.png" />
<None Include="Documentation\images\putty.png" />
<Content Include="Console.ico" />
<Content Include="Documentation\images\ssh_tunnel.png" />
<Content Include="Documentation\mssql_db_setup.sql" />
<Content Include="Documentation\mysql_db_setup.sql" />
<None Include="Documentation\images\config_top_bar.png" />
@@ -1223,6 +1254,8 @@
<None Include="Documentation\images\connections_open.png" />
<None Include="Documentation\images\screenshot_manager_rightclick_menu.png" />
<None Include="Documentation\images\screenshot_manager_overview.png" />
<Content Include="Icons\Console.ico" />
<Content Include="Icons\Admin.ico" />
<Content Include="Icons\Apple.ico">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -1270,6 +1303,15 @@
<None Include="Resources\Images\tab_edit.png" />
<None Include="Resources\Images\tab_delete.png" />
<None Include="Resources\Images\star.png" />
<Content Include="Icons\Infrastructure.ico">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Icons\Production.ico">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Icons\Staging.ico">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Icons\PowerShell.ico">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -1409,7 +1451,7 @@
<None Include="Documentation\installation.rst" />
<None Include="Documentation\installation\minimum_requirements.rst" />
<None Include="Documentation\installation\uninstall.rst" />
<None Include="Documentation\howtos\jumpservers.rst" />
<None Include="Documentation\howtos\sshtunnel.rst" />
<None Include="Documentation\user_interface.rst" />
<None Include="Documentation\user_interface\main_window.rst" />
<None Include="Documentation\user_interface\panels.rst" />

View File

@@ -1,23 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="BouncyCastle" version="1.8.5" targetFramework="net472" />
<package id="cef.redist.x64" version="79.1.35" targetFramework="net472" />
<package id="cef.redist.x86" version="79.1.35" targetFramework="net472" />
<package id="CefSharp.Common" version="79.1.350" targetFramework="net472" />
<package id="CefSharp.WinForms" version="79.1.350" targetFramework="net472" />
<package id="ConsoleControl" version="1.2.1" targetFramework="net472" />
<package id="ConsoleControlAPI" version="1.2.1" targetFramework="net472" />
<package id="BouncyCastle" version="1.8.6.1" targetFramework="net472" />
<package id="ConsoleControl" version="1.3.0" targetFramework="net472" />
<package id="ConsoleControlAPI" version="1.3.0" targetFramework="net472" />
<package id="DockPanelSuite" version="3.0.6" targetFramework="net472" />
<package id="DockPanelSuite.ThemeVS2003" version="3.0.6" targetFramework="net472" />
<package id="DockPanelSuite.ThemeVS2012" version="3.0.6" targetFramework="net472" />
<package id="DockPanelSuite.ThemeVS2013" version="3.0.6" targetFramework="net472" />
<package id="DockPanelSuite.ThemeVS2015" version="3.0.6" targetFramework="net472" />
<package id="Geckofx60.32" version="60.0.39" targetFramework="net472" />
<package id="Google.Protobuf" version="3.9.2" targetFramework="net472" />
<package id="Geckofx60.32" version="60.0.44" targetFramework="net472" />
<package id="Google.Protobuf" version="3.12.1" targetFramework="net472" />
<package id="K4os.Compression.LZ4" version="1.1.11" targetFramework="net472" />
<package id="K4os.Compression.LZ4.Streams" version="1.1.11" targetFramework="net472" />
<package id="K4os.Hash.xxHash" version="1.0.6" targetFramework="net472" />
<package id="log4net" version="2.0.8" targetFramework="net472" />
<package id="Markdig" version="0.17.1" targetFramework="net472" />
<package id="MySql.Data" version="8.0.17" targetFramework="net472" />
<package id="NUnit3TestAdapter" version="3.15.1" targetFramework="net472" />
<package id="MySql.Data" version="8.0.20" targetFramework="net472" />
<package id="NUnit3TestAdapter" version="3.16.1" targetFramework="net472" developmentDependency="true" />
<package id="ObjectListView.Official" version="2.9.1" targetFramework="net472" />
<package id="SSH.NET" version="2016.1.0" targetFramework="net472" />
<package id="System.Buffers" version="4.5.1" targetFramework="net472" />
<package id="System.Memory" version="4.5.4" targetFramework="net472" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net472" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.7.1" targetFramework="net472" />
</packages>