Compare commits

...

89 Commits

Author SHA1 Message Date
David Sparer
e872581d3c updated changelog 2018-06-03 09:50:42 -05:00
David Sparer
defe9e094c made opening an empty panel on startup configurable in options 2018-05-31 06:26:43 -05:00
David Sparer
5662735cb8 bumped assembly version for next pre-release 2018-05-25 18:01:32 -05:00
David Sparer
8646dce21b update jenkins build to use newest msbuild (enables c# 7 lang features) 2018-05-20 11:07:43 -05:00
David Sparer
99a3eabbaf updated changelog 2018-05-19 17:00:57 -05:00
David Sparer
c57bd386f2 dont try to connect to folders in quick connect menu. resolves #924 2018-05-19 16:57:34 -05:00
David Sparer
f2a52b03df menu bar can be moved when "lock toolbar position" is turned off. closes #902 2018-05-19 12:57:29 -05:00
David Sparer
860e1ccfaa fix a mismerged language item 2018-05-18 21:33:16 -05:00
David Sparer
49967b38d4 update changelog 2018-05-18 21:32:51 -05:00
David Sparer
36038fff6d fix minor code typo 2018-05-18 20:52:17 -05:00
David Sparer
c5958954b0 apply language later in app startup 2018-05-18 20:45:27 -05:00
David Sparer
d0d63016ca Merge branch 'pr_948_target' into release/v1.76
# Conflicts:
#	mRemoteV1/Resources/Language/Language.resx
#	mRemoteV1/UI/Forms/frmMain.Designer.cs
#	mRemoteV1/UI/Menu/ViewMenu.cs
2018-05-18 20:04:23 -05:00
David Sparer
35f2484adf Merge pull request #948 from farosch/translation
some changes regarding tranlsation
2018-05-18 18:41:06 -05:00
David Sparer
c2cf496ded updated changelog and credits 2018-04-29 12:00:08 -05:00
David Sparer
8a172f02a9 updated changelog and credits for #942 2018-04-19 08:08:44 -05:00
David Sparer
f27935ea61 Merge pull request #942 from sli-pro/develop
Made several strings translatable and added Russian translations
2018-04-19 07:58:16 -05:00
Faryan Rezagholi
043df0aec3 fixed wording 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
63a2e18760 added missing items 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
c3ced7ed03 fix: translations of main file menu items were not loaded 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
f597e14b3d fix group box was not translatable 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
aff4ba9115 fix: set labels dock mode to fill (wasnt displaying longer translated texts) 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
554e0805e3 fix: title of options page was not translatable 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
f4efa74a23 Added missing translation options in viewMenu.cs 2018-04-14 11:56:01 +02:00
Vladimir Semenov
ddc19587fa Edited and added a translation of the Russian language in the forms
- File/import
- File/Import from AD
- File/Export to File
- View/Lock Toolbar position
- View/Mylti SSH toolbar
- Tools/Options/Additionally
Related to question #940.
2018-04-10 13:41:34 +03:00
Vladimir Semenov
5f1232727e Edit and add a translation on the external tools form.
Added and corrected Russian and English translations in the external tools tab.
Adjusted the placement of components on the external tools form so that the text does not overlap during translation.
Related to question #940.
2018-04-10 09:58:59 +03:00
David Sparer
9c373e8f0a Merge pull request #938 from sli-pro/develop
Small visual correction of the forms
2018-04-07 11:25:55 -05:00
David Sparer
83942d788f Merge branch '916_default_properties_not_saving' into develop 2018-04-06 15:05:35 -05:00
David Sparer
73d6fec6f3 updated changelog 2018-04-06 15:05:00 -05:00
David Sparer
a37b5deaa1 finished updating some tests for default inheritance 2018-04-06 15:02:14 -05:00
Vladimir Semenov
3b9de847e7 Small visual correction of the forms
- for the main form set the minimum resolution 1140; 603.
- for the form of port scans, done visual editing of components.
2018-04-06 20:59:15 +03:00
David Sparer
924f1f1e48 improved tests for default connection info 2018-04-05 16:37:22 -05:00
David Sparer
7bdebbe25b Merge pull request #936 from sli-pro/develop
Update Language ru
2018-04-05 15:16:31 -05:00
David Sparer
8f46c25dc9 Merge pull request #935 from marcomsousa/develop
Update Language es
2018-04-05 15:15:04 -05:00
Vladimir Semenov
8bb4a03639 Update Language ru
Fix typos in Russian language
2018-04-05 18:51:47 +03:00
Marco Sousa
7b5bc5e057 Update Language es 2018-04-05 12:39:02 +02:00
David Sparer
35582a5e6a fixed bug with saving and loading default connection info data
updated tests to better cover this feature. related to #916
2018-03-22 16:54:50 -05:00
David Sparer
20340fd31f Merge pull request #913 from mRemoteNG/github-templates
Update .github templates
2018-03-22 07:44:10 -05:00
David Sparer
d6d7664b48 update readme shield 2018-03-14 19:30:25 -05:00
David Sparer
ce97e63876 bump version 2018-03-14 19:17:29 -05:00
David Sparer
378b98ff89 set release date 2018-03-14 19:09:02 -05:00
David Sparer
ce31199e57 updated changelog 2018-03-10 17:55:15 -06:00
David Sparer
227f3b2924 fix csv serialization bug where some empty fields would not be included
related to #911
2018-03-10 17:47:33 -06:00
David Sparer
5076f1354c fix bug where inheritance is incorrectly allowed on nodes under the root node after deserializing 2018-03-10 16:37:54 -06:00
Bennett Blodinger
e5a34388ae Update .github templates
Bumping up the quality of the templates with help from https://www.talater.com/open-source-templates
2018-03-09 09:46:03 -05:00
David Sparer
6a5f65c018 add a bit more documentation to the ps script that creates bulk connections 2018-03-09 08:08:29 -06:00
David Sparer
6d5f41b3d8 forgot to bump the stable branch when 1.75.7012 was released 2018-03-03 09:39:37 -06:00
David Sparer
64f10ead63 bump development channel download shield 2018-03-03 09:31:27 -06:00
David Sparer
575dae446f bump version and update changelog 2018-03-03 09:16:55 -06:00
David Sparer
9b438576f2 deserializing enums now ignores case. resolves #899 2018-02-27 09:48:09 -06:00
David Sparer
cbd32f1a07 added powershell script for creating bulk connections 2018-02-27 08:37:25 -06:00
David Sparer
516182ec40 the xml v2.6 schema must have the export field event if we dont use it. need to bump to v2.7 to get rid of it 2018-02-26 08:11:59 -06:00
David Sparer
4ad3a68d80 readded Export field to xml schema 2018-02-26 07:13:36 -06:00
David Sparer
2f9ba32c07 bump readme for development channel badge 2018-02-25 13:41:32 -06:00
David Sparer
dfc45a2904 update changelog 2018-02-25 12:59:58 -06:00
David Sparer
563fdffb67 fixed build scripts that publish to github
github no longer accepts tls1.0 connections, use tls1.2
2018-02-25 12:58:12 -06:00
David Sparer
f2e9c5e2c0 fixed issue with expanded property not being deserialized 2018-02-25 12:57:40 -06:00
David Sparer
86a591364c modified the xml serializer slightly to make it conform to the XSD file
This required all bools to be serialized to lower case which broke a few assumptions we made in the deserializer
2018-02-25 11:26:29 -06:00
David Sparer
2a82485f81 fixed build issue where installer wasnt being renamed with version number 2018-02-25 09:04:59 -06:00
David Sparer
e13549d361 fixed build issue where binary signatures were not being validated during release builds 2018-02-25 09:00:51 -06:00
David Sparer
a85c1bd7d3 bumped assembly and set release date 2018-02-24 15:19:09 -06:00
David Sparer
946679f490 dont attempt to close a tab if it is disposed 2018-02-24 15:09:09 -06:00
David Sparer
b6f27eac18 added another test and did some cleanup 2018-02-24 14:34:13 -06:00
David Sparer
2cc82145a3 csv serialization now fully preserves tree structure 2018-02-24 12:58:16 -06:00
David Sparer
2dae0f2d8e fix bug where sometimes containers would have their container flag turned off 2018-02-24 12:57:38 -06:00
David Sparer
412f6edc36 change guard checks to use extension method 2018-02-16 20:17:31 -06:00
David Sparer
764791b8e5 changed the Maybe type name to Optional, which is slightly more common 2018-02-16 20:17:30 -06:00
David Sparer
bd20d6ae7d moved classes to new namespace 2018-02-16 20:17:30 -06:00
David Sparer
8db0bf7bea make constant id readonly 2018-02-13 16:15:49 -06:00
David Sparer
cff6aa72fc update changelog 2018-02-13 14:38:58 -06:00
David Sparer
63ddf06057 Made port scan timeout configurable
resolves #648
2018-02-13 14:29:26 -06:00
David Sparer
3d9d57b7fa adding several tool chain dependencies 2018-02-09 13:09:58 -06:00
David Sparer
2c1734aea6 change post-build scripts to use bin tools from the repo
this should prevent some build issues new devs have and gives us more control over our build process
2018-02-08 16:11:16 -06:00
David Sparer
301c39aad0 update copyright 2018-02-08 15:39:35 -06:00
David Sparer
5be346c89d changed a few localized strings used by the initial connection file not found dialog 2018-02-04 19:44:39 -06:00
David Sparer
e4eaf0037e fixed an issue that was making bug #479 reappear 2018-02-04 19:14:03 -06:00
David Sparer
8f97be82cb added some more safety around retrieving inherited values 2018-02-04 19:08:29 -06:00
David Sparer
4ab7f92b82 reapply the quick connect focus bug fix provided in #651 2018-02-04 18:13:18 -06:00
David Sparer
0ec95a7729 Merge branch '625_deserialize_csv' into develop 2018-02-04 17:59:49 -06:00
David Sparer
98c38716cd updated changelog 2018-02-04 17:59:15 -06:00
David Sparer
6a46df780c did some refactoring
made IConnectionImporter generic to cut down on code
2018-02-04 16:00:50 -06:00
David Sparer
7788198f26 fixed an issue with serializing csv data with semi colons in fields 2018-02-04 11:52:26 -06:00
David Sparer
3010963283 hooked up csv deserialization to ui 2018-02-04 11:39:04 -06:00
David Sparer
6522524c0f added serialization for a few more inheritance properties 2018-02-04 10:32:18 -06:00
David Sparer
160434c114 Merge branch 'develop' into 625_deserialize_csv 2018-02-04 09:33:33 -06:00
David Sparer
36acb9ac12 update develop branch download badge 2018-02-01 21:38:10 -06:00
Sean Kaim
ddbf6a2e7a ports from dev for appveyor build 2018-01-25 12:35:32 -05:00
Sean Kaim
8567e912a3 add citrixReceiver.exe for appveyor 2018-01-25 12:25:48 -05:00
Sean Kaim
7c98f2809c add appveyor.yml 2018-01-25 12:14:01 -05:00
David Sparer
0898ed8c00 began implementing csv deserializing 2017-12-04 22:00:18 -06:00
115 changed files with 3539 additions and 1098 deletions

View File

@@ -1,16 +1,30 @@
<!--
Only file GitHub issues for bugs and feature requests. All other topics will be closed.
<!--- Provide a general summary of the issue in the Title above -->
Before opening an issue, please search for a duplicate or closed issue.
Please provide as much detail as possible for us to fix your issue.
-->
## Expected Behavior
<!--- If you're describing a bug, tell us what should happen -->
<!--- If you're suggesting a change/improvement, tell us how it should work -->
<!-- Bug -->
|Detail|Value|
|--:|---|
|Operating system | Windows 10 x64 |
|mRemoteNG version| 1.75.7008 |
## Current Behavior
<!--- If describing a bug, tell us what happens instead of the expected behavior -->
<!--- If suggesting a change/improvement, explain the difference from current behavior -->
## Possible Solution
<!--- Not obligatory, but suggest a fix/reason for the bug, -->
<!--- or ideas how to implement the addition or change -->
<!-- Feature Request -->
<!-- If you file a feature request, please delete the bug section -->
## Steps to Reproduce (for bugs)
<!--- Provide an unambiguous set of steps to reproduce -->
<!--- this bug. Include code to reproduce, if relevant -->
1.
2.
3.
4.
## Context
<!--- How has this issue affected you? What are you trying to accomplish? -->
<!--- Providing context helps us come up with a solution that is most useful in the real world -->
## Your Environment
<!--- Include as many relevant details about the environment you experienced the bug in -->
* Version used:
* Operating System and version (e.g. Windows 10 1709 x64):

View File

@@ -1,4 +1,29 @@
<!--
Please provide as much detail as possible with what your pull request does.
Include a reference to a filed issue if it exists.
-->
<!--- Provide a general summary of your changes in the Title above -->
## Description
<!--- Describe your changes in detail -->
## Motivation and Context
<!--- Why is this change required? What problem does it solve? -->
<!--- If it fixes an open issue, please link to the issue here. -->
## How Has This Been Tested?
<!--- Please describe in detail how you tested your changes. -->
<!--- Include details of your testing environment, and the tests you ran to -->
<!--- see how your change affects other areas of the code, etc. -->
## Screenshots (if appropriate):
## Types of changes
<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
## Checklist:
<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
- [ ] My code follows the code style of this project.
- [ ] My change requires a change to the documentation.
- [ ] I have updated the documentation accordingly.
- [ ] I have read the **CONTRIBUTING** document.

View File

@@ -1,3 +1,46 @@
1.76.4 Alpha 6 (2018-06-03):
Features/Enhancements:
----------------------
#948: Fixed issue where many menu item translations were not being used
#942: Improved Russian translation of several items
#924: Notification for "No Host Specified" when clicking folders in quick-connect menu
#902: Menu bar can once again be moved. View -> "Lock toolbar positions" now also locks the menu position
Added option for creating an empty panel on startup
Fixes:
------
#938: Minor layout improvements on the Port Scan screen
#916: Default properties were not being saved
1.76.3 Alpha 5 (2018-03-14):
Fixes:
------
#911: Csv exports sometimes do not include all fields
#807: Inheritance is sometimes turned on for nodes under root Connections node
1.76.2 Alpha 4 (2018-03-03):
Fixes:
------
#899: DoNotPlay is Case Sensitive in XML Serialization
1.76.1 Alpha 3 (2018-02-24):
Features/Enhancements:
----------------------
#625: Added ability to import mRemoteNG formatted CSV files
#648: The port scan ping timeout is now configurable
Fixes:
------
Fixed a few Xml serialization bugs that would occur if boolean values weren't capitalized
1.76.0 Alpha 2 (2018-02-01):
Features/Enhancements:
@@ -24,6 +67,7 @@ Features/Enhancements:
#671: Revamped UI theme system
#611: Added multi-ssh toolbar for sending commands to many SSH clients at once
#558: Connection tree now shows customizable icons instead of play/pause icon
#519: You can now import normal mRemoteNG files - they do not have to be exports
#504: Added Korean translation
#485: The Domain field is now visible/editable for connection with the IntApp protocol
#468: Default connection info Panel property is now saved

View File

@@ -23,6 +23,7 @@ github.com/DamianBis
github.com/pfjason
github.com/sirLoaf
github.com/Fyers
Vladimir Semenov (github.com/sli-pro)
Past Contributors
@@ -59,6 +60,8 @@ Lukas Plachy (github.com/rheingold)
Gyuha Shin
Stefan (github.com/polluks)
github.com/emazv72
Vladimir Semenov (github.com/sli-pro)
Marco Sousa (github.com/marcomsousa)
Included Source Code

8
Jenkinsfile vendored
View File

@@ -1,8 +1,8 @@
#!groovy
node('windows') {
def jobDir = pwd()
def solutionFilePath = "\"${jobDir}\\mRemoteV1.sln\""
def vsToolsDir = "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\Tools"
def vsExtensionsDir = "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\IDE\\CommonExtensions\\Microsoft\\TestWindow"
def msBuild = "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\MSBuild\\15.0\\Bin\\msbuild.exe"
def nunitConsolePath = "${jobDir}\\packages\\NUnit.ConsoleRunner.3.7.0\\tools\\nunit3-console.exe"
def openCoverPath = "${jobDir}\\packages\\OpenCover.4.6.519\\tools\\OpenCover.Console.exe"
def reportGeneratorPath = "${jobDir}\\packages\\ReportGenerator.3.0.2\\tools\\ReportGenerator.exe"
@@ -24,11 +24,11 @@ node('windows') {
}
stage ('Build mRemoteNG (Normal)') {
bat "\"${vsToolsDir}\\VsDevCmd.bat\" && msbuild.exe /nologo /p:Platform=x86 \"${jobDir}\\mRemoteV1.sln\""
bat "\"${msBuild}\" /nologo /p:Platform=x86 \"${jobDir}\\mRemoteV1.sln\""
}
stage ('Build mRemoteNG (Portable)') {
bat "\"${vsToolsDir}\\VsDevCmd.bat\" && msbuild.exe /nologo /p:Configuration=\"Debug Portable\";Platform=x86 \"${jobDir}\\mRemoteV1.sln\""
bat "\"${msBuild}\" /nologo /p:Configuration=\"Debug Portable\";Platform=x86 \"${jobDir}\\mRemoteV1.sln\""
}
stage ('Run Unit Tests (Normal, w/coverage)') {

View File

@@ -10,9 +10,9 @@
| Update Channel | Build Status | Downloads |
| ---------------|--------------|-----------|
| Stable | [![Build status](https://ci.appveyor.com/api/projects/status/k0sdbxmq90fgdmj6/branch/master?svg=true)](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/master) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.75.7011/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.75.7011) |
| Beta | | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.75.7011/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.75.7011) |
| Development | [![Build status](https://ci.appveyor.com/api/projects/status/k0sdbxmq90fgdmj6/branch/develop?svg=true)](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/develop) | - |
| Stable | [![Build status](https://ci.appveyor.com/api/projects/status/k0sdbxmq90fgdmj6/branch/master?svg=true)](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/master) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.75.7012/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.75.7012) |
| Beta | | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.75.7012/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.75.7012) |
| Development | [![Build status](https://ci.appveyor.com/api/projects/status/k0sdbxmq90fgdmj6/branch/develop?svg=true)](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/develop) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.76Alpha5/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.76Alpha5) |
mRemoteNG is the next generation of mRemote, a full-featured, multi-tab remote connections manager.

View File

@@ -0,0 +1,114 @@
#####################################
# Author: David Sparer
# Summary:
# This is intended to be a template for creating connections in bulk. This uses the serializers directly from the mRemoteNG binaries.
# You will still need to create the connection info objects, but the library will handle serialization. It is expected that you
# are familiar with PowerShell. If this is not the case, reach out to the mRemoteNG community for help.
# Usage:
# Replace or modify the examples that are shown toward the end of the script to create your own connection info objects.
#####################################
$EncryptionKey = (Get-Credential -Message "Enter the encryption key you would like to use. This must match the encryption key used by the rest of the confCons file." -UserName "DontNeedUsername").Password
$PathToMrngFolder = ""
if ($PathToMrngFolder -eq "") {
Write-Error -Message 'You must set the $PathToMrngFolder variable in this script to the folder which contains mRemoteNG.exe'
}
$assembly = [System.Reflection.Assembly]::LoadFile((Join-Path -Path $PathToMrngFolder -ChildPath "mRemoteNG.exe"))
$assembly = [System.Reflection.Assembly]::LoadFile((Join-Path -Path $PathToMrngFolder -ChildPath "BouncyCastle.Crypto.dll"))
function New-mRemoteNGXmlSerializer {
[CmdletBinding()]
param (
[SecureString]
$EncryptionKey
)
PROCESS {
$cryptoProvider = New-Object -TypeName mRemoteNG.Security.SymmetricEncryption.AeadCryptographyProvider
$saveFilter = New-Object -TypeName mRemoteNG.Security.SaveFilter -ArgumentList @($false)
$xmlSerializer = New-Object -TypeName mRemoteNG.Config.Serializers.XmlConnectionNodeSerializer -ArgumentList @($cryptoProvider, $encryptionKey, $saveFilter)
Write-Output $xmlSerializer
}
}
function New-mRemoteNGConnectionInfo {
[CmdletBinding()]
param ()
PROCESS {
$connectionInfo = New-Object -TypeName mRemoteNG.Connection.ConnectionInfo
Write-Output $connectionInfo
}
}
function New-mRemoteNGContainerInfo {
[CmdletBinding()]
param ()
PROCESS {
$connectionInfo = New-Object -TypeName mRemoteNG.Container.ContainerInfo
Write-Output $connectionInfo
}
}
# Setup the services needed to do serialization
$xmlSerializer = New-mRemoteNGXmlSerializer -EncryptionKey $EncryptionKey
#----------------------------------------------------------------
# Example 1: serialize many connections, no containers
# Here you can define the number of connection info objects to create
# You can also provide a list of desired hostnames and iterate over those
$xml = ""
foreach($i in 1..5)
{
$connectionInfo = New-mRemoteNGConnectionInfo
# Set connection info properties
$connectionInfo.Name = "server-$i"
$connectionInfo.Hostname = "some-win-server-$i"
$connectionInfo.Protocol = [mRemoteNG.Connection.Protocol.ProtocolType]::RDP
$connectionInfo.Inheritance.Username = $true
$connectionInfo.Inheritance.Domain = $true
$connectionInfo.Inheritance.Password = $true
$serializedConnection = $xmlSerializer.SerializeConnectionInfo($connectionInfo).ToString()
$xml += $serializedConnection + [System.Environment]::NewLine
}
Write-Output $xml
#----------------------------------------------------------------
# Example 2: serialize a container which has connections
# You can also create containers and add connections to them, which will be nested correctly when serialized
$xml = ""
$container = New-mRemoteNGContainerInfo
$container.Name = "ProductionServers"
$serializedContainer = $xmlSerializer.SerializeConnectionInfo($container)
foreach($i in 1..3)
{
$connectionInfo = New-mRemoteNGConnectionInfo
# Set connection info properties
$connectionInfo.Name = "server-$i"
$connectionInfo.Hostname = "some-linux-server-$i"
$connectionInfo.Protocol = [mRemoteNG.Connection.Protocol.ProtocolType]::SSH2
$connectionInfo.Inheritance.Username = $true
$connectionInfo.Inheritance.Domain = $true
$connectionInfo.Inheritance.Password = $true
# serialize the connection
$serializedConnection = $xmlSerializer.SerializeConnectionInfo($connectionInfo)
# add the connection to the container
$serializedContainer.Add($serializedConnection)
}
# Call ToString() on the top-level container to get the XML of it and all its children
Write-Output $serializedContainer.ToString()

View File

@@ -5,7 +5,7 @@ setlocal enabledelayedexpansion
set SOLUTIONDIR=%~dp0..
rem Windows Sysinternals Sigcheck from http://technet.microsoft.com/en-us/sysinternals/bb897441
set SIGCHECK="%SOLUTIONDIR%\Tools\sigcheck.exe"
set SIGCHECK="%SOLUTIONDIR%\Tools\exes\sigcheck.exe"
set SEVENZIP="%SOLUTIONDIR%\Tools\7zip\7za.exe"
set VCVARSALL="%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"

BIN
Tools/exes/dumpbin.exe Normal file

Binary file not shown.

BIN
Tools/exes/editbin.exe Normal file

Binary file not shown.

BIN
Tools/exes/link.exe Normal file

Binary file not shown.

BIN
Tools/exes/mspdbcore.dll Normal file

Binary file not shown.

View File

@@ -1,3 +1,5 @@
[CmdletBinding()]
param (
[string]
# Name of the file to find
@@ -46,6 +48,7 @@ $rootSearchPaths = @(
# Returns the first full path to the $FileName that our search can find
foreach ($searchPath in $rootSearchPaths) {
foreach ($visualStudioFolder in $searchPath) {
Write-Verbose "Searching in folder '$visualStudioFolder'"
$matchingExes = [System.IO.Directory]::EnumerateFileSystemEntries($visualStudioFolder, $FileName, [System.IO.SearchOption]::AllDirectories)
foreach ($matchingExe in $matchingExes) {
if ((EditBinCertificateIsValid -Path $matchingExe) -and (ToolCanBeExecuted -Path $matchingExe)) {

View File

@@ -1,5 +1,6 @@
$githubUrl = 'https://api.github.com'
# GitHub doesn't support the default powershell protocol (TLS 1.0)
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
function Publish-GitHubRelease {
param (

View File

@@ -45,5 +45,5 @@ Format-Table -AutoSize -Wrap -InputObject @{
& "$PSScriptRoot\verify_LargeAddressAware.ps1" -TargetDir $TargetDir -TargetFileName $TargetFileName
& "$PSScriptRoot\tidy_files_for_release.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName
& "$PSScriptRoot\sign_binaries.ps1" -TargetDir $TargetDir -CertificatePath $CertificatePath -CertificatePassword $CertificatePassword -ConfigurationName $ConfigurationName -Exclude $ExcludeFromSigning
& "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName
& "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName -CertificatePath $CertificatePath
& "$PSScriptRoot\zip_portable_files.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -ConfigurationName $ConfigurationName

View File

@@ -9,7 +9,7 @@ Write-Host $SolutionDir
Write-Host $renameTarget
$targetVersionedFile = "$SolutionDir\mRemoteV1\bin\Release\mRemoteNG.exe"
$version = &"$SolutionDir\Tools\sigcheck.exe" /accepteula -q -n $targetVersionedFile
$version = &"$SolutionDir\Tools\exes\sigcheck.exe" /accepteula -q -n $targetVersionedFile
$renameTargetFileObject = Get-Item -Path $renameTarget -ErrorAction SilentlyContinue

View File

@@ -1,3 +1,5 @@
[CmdletBinding()]
param (
[string]
[Parameter(Mandatory=$true)]
@@ -10,13 +12,11 @@ param (
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
# Find editbin.exe
$path_editBin = & "$PSScriptRoot\find_vstool.ps1" -FileName "editbin.exe"
$path_editBin = Join-Path -Path $PSScriptRoot -ChildPath "exes\editbin.exe"
$path_outputExe = Join-Path -Path $TargetDir -ChildPath $TargetFileName
# Set LargeAddressAware
Write-Output "Setting LargeAddressAware on binary file:`n`"$path_outputExe`" `nwith:`n`"$path_editBin`""
& $path_editBin "/largeaddressaware" "$path_outputExe"
& "$path_editBin" /largeaddressaware "$path_outputExe"
Write-Output ""

View File

@@ -1,3 +1,5 @@
[CmdletBinding()]
param (
[string]
[Parameter(Mandatory=$true)]
@@ -10,13 +12,11 @@ param (
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
# Find editbin.exe
$path_dumpBin = & "$PSScriptRoot\find_vstool.ps1" -FileName "dumpbin.exe"
$path_dumpBin = Join-Path -Path $PSScriptRoot -ChildPath "exes\dumpbin.exe"
$path_outputExe = Join-Path -Path $TargetDir -ChildPath $TargetFileName
# Dump exe header
$output = & "$path_dumpBin" /NOLOGO /HEADERS $path_outputExe | Select-String large
$output = & "$path_dumpBin" /NOLOGO /HEADERS "$path_outputExe" | Select-String large
if ($output -eq $null)
{
@@ -27,6 +27,4 @@ else
Write-Output $output.ToString().TrimStart(" ")
}
Write-Output ""

View File

@@ -8,6 +8,7 @@ param (
$ConfigurationName,
[string]
[Parameter(Mandatory=$true)]
# The code signing certificate to use when signing the files.
$CertificatePath
)
@@ -17,11 +18,11 @@ Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
# validate release versions and if the certificate is available
if ($ConfigurationName -match "Release") {
if ($CertificatePath -eq "" -or !(Test-Path -Path $CertificatePath -PathType Leaf))
{
if ($CertificatePath -eq "" -or !(Test-Path -Path $CertificatePath -PathType Leaf))
{
Write-Output "Certificate is not present - files likely not signed - we won't verify file signatures."
return
}
}
Write-Output "Verifying signature of binaries"
Write-Output "Getting files from path: $TargetDir"

View File

@@ -4,6 +4,7 @@ using System.Security;
using System.Xml.Linq;
using mRemoteNG.Config;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Security;

View File

@@ -0,0 +1,185 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using mRemoteNG.Config.Serializers.Csv;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Connection.Protocol.Http;
using mRemoteNG.Connection.Protocol.ICA;
using mRemoteNG.Connection.Protocol.RDP;
using mRemoteNG.Connection.Protocol.VNC;
using mRemoteNG.Credential;
using mRemoteNG.Security;
using mRemoteNGTests.TestHelpers;
using NSubstitute;
using NUnit.Framework;
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Csv
{
public class CsvConnectionsDeserializerMremotengFormatTests
{
private CsvConnectionsDeserializerMremotengFormat _deserializer;
private CsvConnectionsSerializerMremotengFormat _serializer;
[SetUp]
public void Setup()
{
_deserializer = new CsvConnectionsDeserializerMremotengFormat();
var credentialRepositoryList = Substitute.For<ICredentialRepositoryList>();
_serializer = new CsvConnectionsSerializerMremotengFormat(new SaveFilter(), credentialRepositoryList);
}
[TestCaseSource(typeof(DeserializationTestSource), nameof(DeserializationTestSource.ConnectionPropertyTestCases))]
public object ConnectionPropertiesDeserializedCorrectly(string propertyToCheck)
{
var csv = _serializer.Serialize(GetTestConnection());
var deserializedConnections = _deserializer.Deserialize(csv);
var connection = deserializedConnections.GetRecursiveChildList().FirstOrDefault();
var propertyValue = typeof(ConnectionInfo).GetProperty(propertyToCheck)?.GetValue(connection);
return propertyValue;
}
[TestCaseSource(typeof(DeserializationTestSource), nameof(DeserializationTestSource.InheritanceTestCases))]
public object InheritancePropertiesDeserializedCorrectly(string propertyToCheck)
{
var csv = _serializer.Serialize(GetTestConnectionWithAllInherited());
var deserializedConnections = _deserializer.Deserialize(csv);
var connection = deserializedConnections.GetRecursiveChildList().FirstOrDefault();
connection?.RemoveParent();
var propertyValue = typeof(ConnectionInfoInheritance).GetProperty(propertyToCheck)?.GetValue(connection?.Inheritance);
return propertyValue;
}
[Test]
public void TreeStructureDeserializedCorrectly()
{
//Root
// |- folder1
// | |- Con1
// |- Con2
var treeModel = new ConnectionTreeModelBuilder().Build();
var csv = _serializer.Serialize(treeModel);
var deserializedConnections = _deserializer.Deserialize(csv);
var con1 = deserializedConnections.GetRecursiveChildList().First(info => info.Name == "Con1");
var folder1 = deserializedConnections.GetRecursiveChildList().First(info => info.Name == "folder1");
Assert.That(con1.Parent, Is.EqualTo(folder1));
}
internal static ConnectionInfo GetTestConnection()
{
return new ConnectionInfo
{
Name = "SomeName",
Description = "SomeDescription",
Icon = "SomeIcon",
Panel = "SomePanel",
Username = "SomeUsername",
Password = "SomePassword",
Domain = "SomeDomain",
Hostname = "SomeHostname",
PuttySession = "SomePuttySession",
LoadBalanceInfo = "SomeLoadBalanceInfo",
PreExtApp = "SomePreExtApp",
PostExtApp = "SomePostExtApp",
MacAddress = "SomeMacAddress",
UserField = "SomeUserField",
ExtApp = "SomeExtApp",
VNCProxyUsername = "SomeVNCProxyUsername",
VNCProxyPassword = "SomeVNCProxyPassword",
RDGatewayUsername = "SomeRDGatewayUsername",
RDGatewayPassword = "SomeRDGatewayPassword",
RDGatewayDomain = "SomeRDGatewayDomain",
VNCProxyIP = "SomeVNCProxyIP",
RDGatewayHostname = "SomeRDGatewayHostname",
Protocol = ProtocolType.ICA,
Port = 999,
UseConsoleSession = true,
UseCredSsp = true,
RenderingEngine = HTTPBase.RenderingEngine.Gecko,
ICAEncryptionStrength = IcaProtocol.EncryptionStrength.Encr40Bit,
RDPAuthenticationLevel = RdpProtocol.AuthenticationLevel.WarnOnFailedAuth,
Colors = RdpProtocol.RDPColors.Colors16Bit,
Resolution = RdpProtocol.RDPResolutions.Res1366x768,
AutomaticResize = true,
DisplayWallpaper = true,
DisplayThemes = true,
EnableFontSmoothing = true,
EnableDesktopComposition = true,
CacheBitmaps = true,
RedirectDiskDrives = true,
RedirectPorts = true,
RedirectPrinters = true,
RedirectSmartCards = true,
RedirectSound = RdpProtocol.RDPSounds.LeaveAtRemoteComputer,
RedirectKeys = true,
VNCCompression = ProtocolVNC.Compression.Comp4,
VNCEncoding = ProtocolVNC.Encoding.EncRRE,
VNCAuthMode = ProtocolVNC.AuthMode.AuthVNC,
VNCProxyType = ProtocolVNC.ProxyType.ProxySocks5,
VNCProxyPort = 123,
VNCColors = ProtocolVNC.Colors.Col8Bit,
VNCSmartSizeMode = ProtocolVNC.SmartSizeMode.SmartSAspect,
VNCViewOnly = true,
RDGatewayUsageMethod = RdpProtocol.RDGatewayUsageMethod.Detect,
RDGatewayUseConnectionCredentials = RdpProtocol.RDGatewayUseConnectionCredentials.SmartCard
};
}
internal static ConnectionInfo GetTestConnectionWithAllInherited()
{
var connectionInfo = new ConnectionInfo();
connectionInfo.Inheritance.TurnOnInheritanceCompletely();
return connectionInfo;
}
private class DeserializationTestSource
{
public static IEnumerable ConnectionPropertyTestCases()
{
var ignoreProperties = new[]
{
nameof(ConnectionInfo.Inheritance),
nameof(ConnectionInfo.ConstantID),
nameof(ConnectionInfo.Parent)
};
var properties = typeof(ConnectionInfo)
.GetProperties()
.Where(property => !ignoreProperties.Contains(property.Name));
var testCases = new List<TestCaseData>();
var testConnectionInfo = GetTestConnection();
foreach (var property in properties)
{
testCases.Add(
new TestCaseData(property.Name)
.Returns(property.GetValue(testConnectionInfo)));
}
return testCases;
}
public static IEnumerable InheritanceTestCases()
{
var ignoreProperties = new[]
{
nameof(ConnectionInfoInheritance.EverythingInherited),
nameof(ConnectionInfoInheritance.Parent)
};
var properties = typeof(ConnectionInfoInheritance)
.GetProperties()
.Where(property => !ignoreProperties.Contains(property.Name));
var testCases = new List<TestCaseData>();
var testInheritance = GetTestConnectionWithAllInherited().Inheritance;
foreach (var property in properties)
{
testCases.Add(
new TestCaseData(property.Name)
.Returns(property.GetValue(testInheritance)));
}
return testCases;
}
}
}
}

View File

@@ -1,13 +1,17 @@
using System;
using System.Linq;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Csv;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Credential;
using mRemoteNG.Security;
using mRemoteNG.Tree;
using mRemoteNGTests.TestHelpers;
using NSubstitute;
using NUnit.Framework;
namespace mRemoteNGTests.Config.Serializers.MiscSerializers
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Csv
{
public class CsvConnectionsSerializerMremotengFormatTests
{
@@ -28,6 +32,24 @@ namespace mRemoteNGTests.Config.Serializers.MiscSerializers
_credentialRepositoryList.GetCredentialRecord(new Guid()).ReturnsForAnyArgs(credRecord);
}
[Test]
public void SerializesNodeId()
{
var serializer = new CsvConnectionsSerializerMremotengFormat(new SaveFilter(), _credentialRepositoryList);
var connectionInfo = BuildConnectionInfo();
var csv = serializer.Serialize(connectionInfo);
Assert.That(csv, Does.Match(connectionInfo.ConstantID));
}
[Test]
public void DoesntSerializeTheRootNode()
{
var serializer = new CsvConnectionsSerializerMremotengFormat(new SaveFilter(), _credentialRepositoryList);
var treeModel = new ConnectionTreeModelBuilder().Build();
var csv = serializer.Serialize(treeModel);
Assert.That(csv, Does.Not.Match($"{treeModel.RootNodes[0].ConstantID};.*;{TreeNodeType.Root}"));
}
[TestCase(Username)]
[TestCase(Domain)]
[TestCase(Password)]
@@ -82,6 +104,32 @@ namespace mRemoteNGTests.Config.Serializers.MiscSerializers
Assert.Throws<ArgumentNullException>(() => serializer.Serialize((ConnectionTreeModel)null));
}
[Test]
public void FoldersAreSerialized()
{
var serializer = new CsvConnectionsSerializerMremotengFormat(new SaveFilter(), _credentialRepositoryList);
var container = BuildContainer();
var csv = serializer.Serialize(container);
Assert.That(csv, Does.Match(container.Name));
Assert.That(csv, Does.Match(container.Username));
Assert.That(csv, Does.Match(container.Domain));
Assert.That(csv, Does.Match(container.Password));
Assert.That(csv, Does.Contain(TreeNodeType.Container.ToString()));
}
[Test]
public void SerializationIncludesRawInheritedValuesIfObjectInheritsFromParentOutsideOfSerializationScope()
{
var serializer = new CsvConnectionsSerializerMremotengFormat(new SaveFilter(), _credentialRepositoryList);
var treeModel = new ConnectionTreeModelBuilder().Build();
var serializationTarget = treeModel.GetRecursiveChildList().First(info => info.Name == "folder3");
var csv = serializer.Serialize(serializationTarget);
var lineWithFolder3 = csv.Split(new[] {Environment.NewLine}, StringSplitOptions.None).First(s => s.Contains(serializationTarget.Name));
Assert.That(lineWithFolder3, Does.Contain(serializationTarget.Username));
Assert.That(lineWithFolder3, Does.Contain(serializationTarget.Domain));
Assert.That(lineWithFolder3, Does.Contain(serializationTarget.Password));
}
private ConnectionInfo BuildConnectionInfo()
{
return new ConnectionInfo
@@ -93,5 +141,16 @@ namespace mRemoteNGTests.Config.Serializers.MiscSerializers
Inheritance = {Colors = true}
};
}
private ContainerInfo BuildContainer()
{
return new ContainerInfo
{
Name = "MyFolder",
Username = "BlahBlah1",
Domain = "aklkskkksh8",
Password = "qweraslkdjf87"
};
}
}
}

View File

@@ -0,0 +1,96 @@
using System;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Xml;
using System.Xml.Schema;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Security;
using mRemoteNG.Security.SymmetricEncryption;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNGTests.TestHelpers;
using NUnit.Framework;
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
{
public class ValidateXmlSchemas
{
private XmlConnectionsSerializer _serializer;
private ConnectionTreeModel _connectionTreeModel;
private ICryptographyProvider _cryptographyProvider;
private XmlReaderSettings _xmlReaderSettings;
[SetUp]
public void Setup()
{
_connectionTreeModel = new ConnectionTreeModelBuilder().Build();
_cryptographyProvider = new AeadCryptographyProvider();
var connectionNodeSerializer = new XmlConnectionNodeSerializer26(
_cryptographyProvider,
_connectionTreeModel.RootNodes.OfType<RootNodeInfo>().First().PasswordString.ConvertToSecureString(),
new SaveFilter());
_serializer = new XmlConnectionsSerializer(_cryptographyProvider, connectionNodeSerializer);
_xmlReaderSettings = new XmlReaderSettings
{
ValidationType = ValidationType.Schema,
ValidationFlags = XmlSchemaValidationFlags.ProcessInlineSchema |
XmlSchemaValidationFlags.ProcessSchemaLocation |
XmlSchemaValidationFlags.ReportValidationWarnings
};
}
[Test]
public void ValidateSchema()
{
var sb = new StringBuilder();
var xml = _serializer.Serialize(_connectionTreeModel);
var schemaFile = GetTargetPath("mremoteng_confcons_v2_6.xsd");
_xmlReaderSettings.Schemas.Add("http://mremoteng.org", schemaFile);
_xmlReaderSettings.ValidationEventHandler += (sender, args) =>
{
sb.AppendLine($"{args.Severity}: {args.Message}");
};
using (var stream = GenerateStreamFromString(xml))
{
var reader = XmlReader.Create(stream, _xmlReaderSettings);
while (reader.Read()) ;
}
Assert.That(sb.ToString(), Is.Empty);
}
public string GetTargetPath(string fileName, [CallerFilePath] string sourceFilePath = "")
{
const string debugOrRelease =
#if DEBUG
"Debug";
#else
"Release";
#endif
const string normalOrPortable =
#if PORTABLE
" Portable";
#else
"";
#endif
var path = Path.GetDirectoryName(sourceFilePath);
var filePath = $@"{path}\..\..\..\..\bin\{debugOrRelease}{normalOrPortable}\Schemas\{fileName}";
return filePath;
}
private Stream GenerateStreamFromString(string s)
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(s);
writer.Flush();
stream.Position = 0;
return stream;
}
}
}

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Security;
@@ -9,7 +10,7 @@ using mRemoteNG.Tree;
using mRemoteNGTests.Properties;
using NUnit.Framework;
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
{
public class XmlConnectionsDeserializerTests
{
@@ -104,6 +105,14 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers
Assert.That(folder22.Inheritance.Username, Is.True);
}
[TestCaseSource(typeof(XmlConnectionsDeserializerFixtureData), nameof(XmlConnectionsDeserializerFixtureData.FixtureParams))]
public void ExpandedPropertyGetsDeserialized(Datagram testData)
{
Setup(testData.ConfCons, testData.Password);
var folder1 = GetFolderNamed("Folder1", _connectionTreeModel.GetRecursiveChildList());
Assert.That(folder1.IsExpanded, Is.True);
}
private bool ContainsNodeNamed(string name, IEnumerable<ConnectionInfo> list)
{
return list.Any(node => node.Name == name);

View File

@@ -1,6 +1,7 @@
using System.Linq;
using System.Xml.XPath;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Security;
@@ -9,7 +10,7 @@ using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using NUnit.Framework;
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
{
public class XmlConnectionsDocumentCompilerTests
{

View File

@@ -1,6 +1,7 @@
using System.Linq;
using System.Xml.Linq;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Security;
@@ -9,7 +10,7 @@ using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using NUnit.Framework;
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
{
public class XmlConnectionsDocumentEncryptorTests
{

View File

@@ -2,6 +2,7 @@
using System.Xml;
using System.Xml.Linq;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Security;
@@ -10,7 +11,7 @@ using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using NUnit.Framework;
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
{
public class XmlConnectionsSerializerTests
{
@@ -55,7 +56,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers
[TestCase("Username", "")]
[TestCase("Domain", "")]
[TestCase("Password", "")]
[TestCase("InheritAutomaticResize", "False")]
[TestCase("InheritAutomaticResize", "false")]
public void SerializerRespectsSaveFilterSettings(string attributeName, string expectedValue)
{
var connectionNodeSerializer = new XmlConnectionNodeSerializer26(

View File

@@ -2,13 +2,14 @@
using System.Collections;
using System.Xml.Linq;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Security;
using mRemoteNG.Security.Factories;
using mRemoteNG.Security.SymmetricEncryption;
using mRemoteNG.Tree.Root;
using NUnit.Framework;
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
{
public class XmlRootNodeSerializerTests
{
@@ -75,7 +76,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers
{
var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, _cryptographyProvider, fullFileEncryption);
var attributeValue = element.Attribute(XName.Get("FullFileEncryption"))?.Value;
Assert.That(attributeValue, Is.EqualTo(fullFileEncryption.ToString()));
Assert.That(bool.Parse(attributeValue), Is.EqualTo(fullFileEncryption));
}
[TestCase("", "ThisIsNotProtected")]

View File

@@ -1,4 +1,5 @@
using mRemoteNG.Config.Serializers;
using System.Linq;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Security;
@@ -26,7 +27,7 @@ namespace mRemoteNGTests.Config.Serializers
{
var model = CreateConnectionTreeModel();
var dataTable = _dataTableSerializer.Serialize(model);
Assert.That(dataTable.Rows.Count, Is.EqualTo(3));
Assert.That(dataTable.Rows.Count, Is.EqualTo(model.GetRecursiveChildList().Count()));
}
[Test]

View File

@@ -1,4 +1,5 @@
using mRemoteNG.Connection;
using System;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Connection.Protocol.Http;
using mRemoteNG.Connection.Protocol.ICA;
@@ -9,10 +10,14 @@ using NUnit.Framework;
namespace mRemoteNGTests.Connection
{
public class AbstractConnectionInfoDataTests
public class AbstractConnectionInfoDataTests
{
#pragma warning disable 618
private class TestAbstractConnectionInfoData : AbstractConnectionRecord {}
private class TestAbstractConnectionInfoData : AbstractConnectionRecord {
public TestAbstractConnectionInfoData() : base(Guid.NewGuid().ToString())
{
}
}
#pragma warning restore 618
private TestAbstractConnectionInfoData _testAbstractConnectionInfoData;

View File

@@ -27,22 +27,6 @@ namespace mRemoteNGTests.Connection
_connectionInfo = null;
}
[Test]
public void CreatingConnectionInfoWithParentSetsTheParentProperty()
{
var container = new ContainerInfo();
var connectionInfo = new ConnectionInfo(container);
Assert.That(connectionInfo.Parent, Is.EqualTo(container));
}
[Test]
public void CreatingConnectionInfoWithParentAddsToTheParentsChildList()
{
var container = new ContainerInfo();
var connectionInfo = new ConnectionInfo(container);
Assert.That(container.Children, Does.Contain(connectionInfo));
}
[Test]
public void CopyCreatesMemberwiseCopy()
{

View File

@@ -1,73 +1,62 @@
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using System.Collections.Generic;
using System.Reflection;
using mRemoteNG.Connection;
using mRemoteNGTests.TestHelpers;
using NUnit.Framework;
namespace mRemoteNGTests.Connection
{
public class DefaultConnectionInfoTests
{
private string _testDomain = "somedomain";
public class DefaultConnectionInfoTests
{
private ConnectionInfo _randomizedConnectionInfo;
[SetUp]
public void Setup()
{
DefaultConnectionInfo.Instance.Domain = "";
_randomizedConnectionInfo = ConnectionInfoHelpers.GetRandomizedConnectionInfo();
}
[Test]
public void LoadingDefaultInfoUpdatesAllProperties()
[TestCaseSource(nameof(GetConnectionInfoProperties))]
public void LoadingDefaultInfoUpdatesAllProperties(PropertyInfo property)
{
var connectionInfoSource = new ConnectionInfo { Domain = _testDomain };
DefaultConnectionInfo.Instance.LoadFrom(connectionInfoSource);
Assert.That(DefaultConnectionInfo.Instance.Domain, Is.EqualTo(_testDomain));
DefaultConnectionInfo.Instance.LoadFrom(_randomizedConnectionInfo);
var valueInDestination = property.GetValue(DefaultConnectionInfo.Instance);
var valueInSource = property.GetValue(_randomizedConnectionInfo);
Assert.That(valueInDestination, Is.EqualTo(valueInSource));
}
[Test]
public void SavingDefaultConnectionInfoExportsAllProperties()
[TestCaseSource(nameof(GetConnectionInfoProperties))]
public void SavingDefaultConnectionInfoExportsAllProperties(PropertyInfo property)
{
var saveTarget = new ConnectionInfo();
DefaultConnectionInfo.Instance.Domain = _testDomain;
var randomizedValue = property.GetValue(_randomizedConnectionInfo);
property.SetValue(DefaultConnectionInfo.Instance, randomizedValue);
DefaultConnectionInfo.Instance.SaveTo(saveTarget);
Assert.That(saveTarget.Domain, Is.EqualTo(_testDomain));
var valueInDestination = property.GetValue(saveTarget);
var valueInSource = property.GetValue(DefaultConnectionInfo.Instance);
Assert.That(valueInDestination, Is.EqualTo(valueInSource));
}
[Test]
public void CanSaveEnumValuesToString()
{
const ProtocolType targetProtocol = ProtocolType.RAW;
var saveTarget = new AllStringPropertySaveTarget();
DefaultConnectionInfo.Instance.Protocol = targetProtocol;
[TestCaseSource(nameof(GetConnectionInfoProperties))]
public void CanSaveDefaultConnectionToModelWithAllStringProperties(PropertyInfo property)
{
var saveTarget = new SerializableConnectionInfoAllPropertiesOfType<string>();
// randomize default connnection values to ensure we dont get false passing tests
var randomizedValue = property.GetValue(_randomizedConnectionInfo);
property.SetValue(DefaultConnectionInfo.Instance, randomizedValue);
DefaultConnectionInfo.Instance.SaveTo(saveTarget);
Assert.That(saveTarget.Protocol, Is.EqualTo(targetProtocol.ToString()));
var valueInSource = property.GetValue(DefaultConnectionInfo.Instance).ToString();
var valueInDestination = saveTarget.GetType().GetProperty(property.Name).GetValue(saveTarget).ToString();
Assert.That(valueInDestination, Is.EqualTo(valueInSource));
}
[Test]
public void CanSaveIntegerValuesToString()
{
const int targetValue = 123;
var saveTarget = new AllStringPropertySaveTarget();
DefaultConnectionInfo.Instance.RDPMinutesToIdleTimeout = targetValue;
DefaultConnectionInfo.Instance.SaveTo(saveTarget);
Assert.That(saveTarget.RDPMinutesToIdleTimeout, Is.EqualTo(targetValue.ToString()));
}
[Test]
public void CanSaveStringValuesToString()
{
const string targetName = "hello";
var saveTarget = new AllStringPropertySaveTarget();
DefaultConnectionInfo.Instance.Username = targetName;
DefaultConnectionInfo.Instance.SaveTo(saveTarget);
Assert.That(saveTarget.Username, Is.EqualTo(targetName));
}
private class AllStringPropertySaveTarget
{
public string Username { get; set; }
public string Protocol { get; set; }
public string RDPMinutesToIdleTimeout { get; set; }
}
private static IEnumerable<PropertyInfo> GetConnectionInfoProperties()
{
return new ConnectionInfo().GetSerializableProperties();
}
}
}

View File

@@ -1,34 +1,40 @@
using mRemoteNG.Connection;
using System.Collections.Generic;
using System.Reflection;
using mRemoteNG.Connection;
using NUnit.Framework;
namespace mRemoteNGTests.Connection
{
public class DefaultConnectionInheritanceTests
public class DefaultConnectionInheritanceTests
{
[SetUp]
public void Setup()
[TestCaseSource(nameof(GetInheritanceProperties))]
public void LoadingDefaultInheritanceUpdatesAllProperties(PropertyInfo property)
{
DefaultConnectionInheritance.Instance.TurnOffInheritanceCompletely();
}
[Test]
public void LoadingDefaultInheritanceUpdatesAllProperties()
{
var inheritanceSource = new ConnectionInfoInheritance(new object(), true);
var inheritanceSource = new ConnectionInfoInheritance(new object(), true);
inheritanceSource.TurnOnInheritanceCompletely();
DefaultConnectionInheritance.Instance.LoadFrom(inheritanceSource);
Assert.That(DefaultConnectionInheritance.Instance.EverythingInherited, Is.True);
}
DefaultConnectionInheritance.Instance.TurnOffInheritanceCompletely();
[Test]
public void SavingDefaultInheritanceExportsAllProperties()
DefaultConnectionInheritance.Instance.LoadFrom(inheritanceSource);
var valueInDestination = property.GetValue(DefaultConnectionInheritance.Instance);
var valueInSource = property.GetValue(inheritanceSource);
Assert.That(valueInDestination, Is.EqualTo(valueInSource));
}
[TestCaseSource(nameof(GetInheritanceProperties))]
public void SavingDefaultInheritanceExportsAllProperties(PropertyInfo property)
{
var inheritanceDestination = new ConnectionInfoInheritance(new object(), true);
DefaultConnectionInheritance.Instance.AutomaticResize = true;
DefaultConnectionInheritance.Instance.SaveTo(inheritanceDestination);
Assert.That(inheritanceDestination.AutomaticResize, Is.True);
}
var saveTarget = new ConnectionInfoInheritance(new object(), true);
saveTarget.TurnOffInheritanceCompletely();
DefaultConnectionInheritance.Instance.TurnOnInheritanceCompletely();
DefaultConnectionInheritance.Instance.SaveTo(saveTarget);
var valueInDestination = property.GetValue(saveTarget);
var valueInSource = property.GetValue(DefaultConnectionInheritance.Instance);
Assert.That(valueInDestination, Is.EqualTo(valueInSource));
}
[Test]
public void NewInheritanceInstancesCreatedWithDefaultInheritanceValues()
@@ -38,12 +44,20 @@ namespace mRemoteNGTests.Connection
Assert.That(inheritanceInstance.Domain, Is.True);
}
[Test]
public void NewInheritanceInstancesCreatedWithAllDefaultInheritanceValues()
[TestCaseSource(nameof(GetInheritanceProperties))]
public void NewInheritanceInstancesCreatedWithAllDefaultInheritanceValues(PropertyInfo property)
{
DefaultConnectionInheritance.Instance.TurnOnInheritanceCompletely();
var inheritanceInstance = new ConnectionInfoInheritance(new object());
Assert.That(inheritanceInstance.EverythingInherited, Is.True);
}
}
var valueInDestination = property.GetValue(inheritanceInstance);
var valueInSource = property.GetValue(DefaultConnectionInheritance.Instance);
Assert.That(valueInDestination, Is.EqualTo(valueInSource));
}
private static IEnumerable<PropertyInfo> GetInheritanceProperties()
{
return new ConnectionInfoInheritance(new object(), true).GetProperties();
}
}
}

View File

@@ -0,0 +1,18 @@
using mRemoteNG.Connection;
using mRemoteNG.Tree.Root;
using NUnit.Framework;
namespace mRemoteNGTests.Container
{
public class RootNodeInfoTests
{
[Test]
public void InheritanceIsDisabledForNodesDirectlyUnderRootNode()
{
var rootNode = new RootNodeInfo(RootNodeType.Connection);
var con1 = new ConnectionInfo { Inheritance = { Password = true } };
rootNode.AddChild(con1);
Assert.That(con1.Inheritance.Password, Is.False);
}
}
}

View File

@@ -1,5 +1,6 @@
using System.Linq;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Security;

View File

@@ -34,8 +34,9 @@
using System.Collections;
using System.Windows.Forms;
using NUnit.Extensions.Forms;
namespace NUnit.Extensions.Forms
namespace mRemoteNGTests
{
/// <summary>
/// A ControlTester for testing List Views.

View File

@@ -0,0 +1,132 @@
using System;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Connection.Protocol.Http;
using mRemoteNG.Connection.Protocol.ICA;
using mRemoteNG.Connection.Protocol.RDP;
using mRemoteNG.Connection.Protocol.VNC;
namespace mRemoteNGTests.TestHelpers
{
internal class ConnectionInfoHelpers
{
private static readonly Random _random = new Random();
/// <summary>
/// Returns a <see cref="ConnectionInfo"/> object with randomized
/// values in all fields.
/// </summary>
internal static ConnectionInfo GetRandomizedConnectionInfo(bool randomizeInheritance = false)
{
var connectionInfo = new ConnectionInfo
{
// string types
Name = RandomString(),
Hostname = RandomString(),
Description = RandomString(),
Domain = RandomString(),
ExtApp = RandomString(),
Icon = RandomString(),
LoadBalanceInfo = RandomString(),
MacAddress = RandomString(),
Panel = RandomString(),
Password = RandomString(),
PostExtApp = RandomString(),
PreExtApp = RandomString(),
PuttySession = RandomString(),
RDGatewayHostname = RandomString(),
RDGatewayUsername = RandomString(),
RDGatewayDomain = RandomString(),
RDGatewayPassword = RandomString(),
UserField = RandomString(),
Username = RandomString(),
VNCProxyIP = RandomString(),
VNCProxyPassword = RandomString(),
VNCProxyUsername = RandomString(),
// bool types
AutomaticResize = RandomBool(),
CacheBitmaps = RandomBool(),
DisplayThemes = RandomBool(),
DisplayWallpaper = RandomBool(),
EnableDesktopComposition = RandomBool(),
EnableFontSmoothing = RandomBool(),
IsContainer = RandomBool(),
IsDefault = RandomBool(),
IsQuickConnect = RandomBool(),
PleaseConnect = RandomBool(),
RDPAlertIdleTimeout = RandomBool(),
RedirectDiskDrives = RandomBool(),
RedirectKeys = RandomBool(),
RedirectPorts = RandomBool(),
RedirectPrinters = RandomBool(),
RedirectSmartCards = RandomBool(),
UseConsoleSession = RandomBool(),
UseCredSsp = RandomBool(),
VNCViewOnly = RandomBool(),
// ints
Port = RandomInt(),
RDPMinutesToIdleTimeout = RandomInt(),
VNCProxyPort = RandomInt(),
// enums
Colors = RandomEnum<RdpProtocol.RDPColors>(),
ICAEncryptionStrength = RandomEnum<IcaProtocol.EncryptionStrength> (),
Protocol = RandomEnum<ProtocolType>(),
RDGatewayUsageMethod = RandomEnum<RdpProtocol.RDGatewayUsageMethod>(),
RDGatewayUseConnectionCredentials = RandomEnum<RdpProtocol.RDGatewayUseConnectionCredentials>(),
RDPAuthenticationLevel = RandomEnum<RdpProtocol.AuthenticationLevel>(),
RedirectSound = RandomEnum<RdpProtocol.RDPSounds>(),
RenderingEngine = RandomEnum<HTTPBase.RenderingEngine>(),
Resolution = RandomEnum<RdpProtocol.RDPResolutions>(),
SoundQuality = RandomEnum<RdpProtocol.RDPSoundQuality>(),
VNCAuthMode = RandomEnum<ProtocolVNC.AuthMode>(),
VNCColors = RandomEnum<ProtocolVNC.Colors>(),
VNCCompression = RandomEnum<ProtocolVNC.Compression>(),
VNCEncoding = RandomEnum<ProtocolVNC.Encoding>(),
VNCProxyType = RandomEnum<ProtocolVNC.ProxyType>(),
VNCSmartSizeMode = RandomEnum<ProtocolVNC.SmartSizeMode>(),
};
if (randomizeInheritance)
connectionInfo.Inheritance = GetRandomizedInheritance(connectionInfo);
return connectionInfo;
}
internal static ConnectionInfoInheritance GetRandomizedInheritance(ConnectionInfo parent)
{
var inheritance = new ConnectionInfoInheritance(parent, true);
foreach (var property in inheritance.GetProperties())
{
property.SetValue(inheritance, RandomBool());
}
return inheritance;
}
internal static string RandomString()
{
return Guid.NewGuid().ToString("N");
}
internal static bool RandomBool()
{
return _random.Next() % 2 == 0;
}
internal static int RandomInt()
{
return _random.Next();
}
internal static T RandomEnum<T>() where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
throw new ArgumentException("T must be an enum");
var values = Enum.GetValues(typeof(T));
return (T)values.GetValue(_random.Next(values.Length));
}
}
}

View File

@@ -7,17 +7,52 @@ namespace mRemoteNGTests.TestHelpers
{
public class ConnectionTreeModelBuilder
{
/// <summary>
/// Builds a tree which looks like:
/// Root
/// |- folder1
/// | |- con1
/// |- con2
/// |- folder2
/// |- folder3
/// |- con3
/// </summary>
/// <returns></returns>
public ConnectionTreeModel Build()
{
var model = new ConnectionTreeModel();
var root = new RootNodeInfo(RootNodeType.Connection);
var folder1 = new ContainerInfo { Name = "folder1", Username = "user1", Domain = "domain1", Password = "password1" };
var folder2 = new ContainerInfo { Name = "folder2", Username = "user2", Domain = "domain2", Password = "password2" };
var folder3 = new ContainerInfo
{
Name = "folder3",
Inheritance =
{
Username = true,
Domain = true,
Password = true
}
};
var con1 = new ConnectionInfo { Name = "Con1", Username = "user1", Domain = "domain1", Password = "password1" };
var con2 = new ConnectionInfo { Name = "Con2", Username = "user2", Domain = "domain2", Password = "password2" };
var con3 = new ContainerInfo
{
Name = "con3",
Inheritance =
{
Username = true,
Domain = true,
Password = true
}
};
root.AddChild(folder1);
root.AddChild(con2);
folder1.AddChild(con1);
root.AddChild(folder2);
folder2.AddChild(folder3);
folder3.AddChild(con3);
model.AddRootNode(root);
return model;
}

View File

@@ -0,0 +1,63 @@
namespace mRemoteNGTests.TestHelpers
{
/// <summary>
/// A ConnectionInfo that has only the serializable properties as string types.
/// Only used for testing.
/// </summary>
internal class SerializableConnectionInfoAllPropertiesOfType<TType>
{
public TType Description { get; set; }
public TType Icon { get; set; }
public TType Panel { get; set; }
public TType Username { get; set; }
public TType Password { get; set; }
public TType Domain { get; set; }
public TType Protocol { get; set; }
public TType ExtApp { get; set; }
public TType PuttySession { get; set; }
public TType ICAEncryptionStrength { get; set; }
public TType UseConsoleSession { get; set; }
public TType RDPAuthenticationLevel { get; set; }
public TType RDPMinutesToIdleTimeout { get; set; }
public TType RDPAlertIdleTimeout { get; set; }
public TType LoadBalanceInfo { get; set; }
public TType RenderingEngine { get; set; }
public TType UseCredSsp { get; set; }
public TType RDGatewayUsageMethod { get; set; }
public TType RDGatewayHostname { get; set; }
public TType RDGatewayUseConnectionCredentials { get; set; }
public TType RDGatewayUsername { get; set; }
public TType RDGatewayPassword { get; set; }
public TType RDGatewayDomain { get; set; }
public TType Resolution { get; set; }
public TType AutomaticResize { get; set; }
public TType Colors { get; set; }
public TType CacheBitmaps { get; set; }
public TType DisplayWallpaper { get; set; }
public TType DisplayThemes { get; set; }
public TType EnableFontSmoothing { get; set; }
public TType EnableDesktopComposition { get; set; }
public TType RedirectKeys { get; set; }
public TType RedirectDiskDrives { get; set; }
public TType RedirectPrinters { get; set; }
public TType RedirectPorts { get; set; }
public TType RedirectSmartCards { get; set; }
public TType RedirectSound { get; set; }
public TType SoundQuality { get; set; }
public TType PreExtApp { get; set; }
public TType PostExtApp { get; set; }
public TType MacAddress { get; set; }
public TType UserField { get; set; }
public TType VNCCompression { get; set; }
public TType VNCEncoding { get; set; }
public TType VNCAuthMode { get; set; }
public TType VNCProxyType { get; set; }
public TType VNCProxyIP { get; set; }
public TType VNCProxyPort { get; set; }
public TType VNCProxyUsername { get; set; }
public TType VNCProxyPassword { get; set; }
public TType VNCColors { get; set; }
public TType VNCSmartSizeMode { get; set; }
public TType VNCViewOnly { get; set; }
}
}

View File

@@ -3,12 +3,12 @@ using NUnit.Framework;
namespace mRemoteNGTests.Tools
{
public class MaybeTests
public class OptionalTests
{
[Test]
public void MaybeReturnsEmptyListWhenGivenNullValue()
{
var sut = new Maybe<object>(null);
var sut = new Optional<object>(null);
Assert.That(sut, Is.Empty);
}
@@ -16,7 +16,7 @@ namespace mRemoteNGTests.Tools
public void MaybeReturnsValueIfNotNull()
{
var expected = new object();
var sut = new Maybe<object>(expected);
var sut = new Optional<object>(expected);
Assert.That(sut, Has.Member(expected));
}

View File

@@ -8,7 +8,7 @@ using NUnit.Framework;
namespace mRemoteNGTests.Tree
{
public class NodeSearcherTests
public class NodeSearcherTests
{
private NodeSearcher _nodeSearcher;
private ContainerInfo _folder1;
@@ -104,6 +104,14 @@ namespace mRemoteNGTests.Tree
_con4 = new ConnectionInfo { Name = "con4", Description="description6", Hostname="hostname6" };
_con5 = new ConnectionInfo { Name = "con5", Description="description7", Hostname="hostname7" };
_folder1.Inheritance.TurnOffInheritanceCompletely();
_con1.Inheritance.TurnOffInheritanceCompletely();
_con2.Inheritance.TurnOffInheritanceCompletely();
_folder2.Inheritance.TurnOffInheritanceCompletely();
_con3.Inheritance.TurnOffInheritanceCompletely();
_con4.Inheritance.TurnOffInheritanceCompletely();
_con5.Inheritance.TurnOffInheritanceCompletely();
connectionTreeModel.AddRootNode(root);
root.AddChildRange(new [] { _folder1, _folder2, _con5 });
_folder1.AddChildRange(new [] { _con1, _con2 });

View File

@@ -114,6 +114,7 @@
<Compile Include="Config\DataProviders\FileBackupCreatorTests.cs" />
<Compile Include="Config\DataProviders\FileDataProviderTests.cs" />
<Compile Include="Config\DataProviders\FileDataProviderWithRollingBackupTests.cs" />
<Compile Include="Config\Serializers\ConnectionSerializers\Xml\ValidateXmlSchemas.cs" />
<Compile Include="Config\Serializers\DataTableDeserializerTests.cs" />
<Compile Include="Config\CredentialHarvesterTests.cs" />
<Compile Include="Config\CredentialRecordLoaderTests.cs" />
@@ -121,20 +122,21 @@
<Compile Include="Config\Serializers\CredentialProviderSerializerTests.cs" />
<Compile Include="Config\Serializers\CredentialSerializers\XmlCredentialPasswordDecryptorDecoratorTests.cs" />
<Compile Include="Config\Serializers\CredentialSerializers\XmlCredentialPasswordEncryptorDecoratorTests.cs" />
<Compile Include="Config\Serializers\MiscSerializers\CsvConnectionsSerializerMremotengFormatTests.cs" />
<Compile Include="Config\Serializers\ConnectionSerializers\Csv\CsvConnectionsDeserializerMremotengFormatTests.cs" />
<Compile Include="Config\Serializers\ConnectionSerializers\Csv\CsvConnectionsSerializerMremotengFormatTests.cs" />
<Compile Include="Config\Serializers\DataTableSerializerTests.cs" />
<Compile Include="Config\Serializers\MiscSerializers\PortScanDeserializerTests.cs" />
<Compile Include="Config\Serializers\MiscSerializers\PuttyConnectionManagerDeserializerTests.cs" />
<Compile Include="Config\Serializers\ConnectionSerializers\XmlConnectionsDeserializerTests.cs" />
<Compile Include="Config\Serializers\ConnectionSerializers\Xml\XmlConnectionsDeserializerTests.cs" />
<Compile Include="Config\Serializers\MiscSerializers\RemoteDesktopConnectionDeserializerTests.cs" />
<Compile Include="Config\Serializers\MiscSerializers\RemoteDesktopConnectionManager27DeserializerTests.cs" />
<Compile Include="Config\Serializers\MiscSerializers\RemoteDesktopConnectionManagerDeserializerTests.cs" />
<Compile Include="Config\Serializers\ConnectionSerializers\XmlConnectionsDocumentCompilerTests.cs" />
<Compile Include="Config\Serializers\ConnectionSerializers\XmlConnectionsDocumentEncryptorTests.cs" />
<Compile Include="Config\Serializers\ConnectionSerializers\XmlConnectionsSerializerTests.cs" />
<Compile Include="Config\Serializers\ConnectionSerializers\Xml\XmlConnectionsDocumentCompilerTests.cs" />
<Compile Include="Config\Serializers\ConnectionSerializers\Xml\XmlConnectionsDocumentEncryptorTests.cs" />
<Compile Include="Config\Serializers\ConnectionSerializers\Xml\XmlConnectionsSerializerTests.cs" />
<Compile Include="Config\Serializers\CredentialSerializers\XmlCredentialRecordDeserializerTests.cs" />
<Compile Include="Config\Serializers\CredentialSerializers\XmlCredentialSerializerTests.cs" />
<Compile Include="Config\Serializers\ConnectionSerializers\XmlRootNodeSerializerTests.cs" />
<Compile Include="Config\Serializers\ConnectionSerializers\Xml\XmlRootNodeSerializerTests.cs" />
<Compile Include="Config\Serializers\Versioning\SqlVersion22To23UpgraderTests.cs" />
<Compile Include="Config\Serializers\Versioning\SqlVersion23To24UpgraderTests.cs" />
<Compile Include="Config\Serializers\Versioning\SqlVersion24To25UpgraderTests.cs" />
@@ -144,6 +146,7 @@
<Compile Include="Connection\ConnectionInfoComparerTests.cs" />
<Compile Include="Connection\Protocol\IntegratedProgramTests.cs" />
<Compile Include="Connection\Protocol\ProtocolListTests.cs" />
<Compile Include="Container\RootNodeInfoTests.cs" />
<Compile Include="Credential\CompositeRepositoryUnlockerTests.cs" />
<Compile Include="Credential\CredentialChangedEventArgsTests.cs" />
<Compile Include="Credential\CredentialDeletionMsgBoxConfirmerTests.cs" />
@@ -167,12 +170,14 @@
<Compile Include="Security\PasswordCreation\PasswordLengthConstraintTests.cs" />
<Compile Include="Security\RandomGeneratorTests.cs" />
<Compile Include="Security\SecureStringExtensionsTests.cs" />
<Compile Include="TestHelpers\ConnectionInfoHelpers.cs" />
<Compile Include="TestHelpers\ConnectionTreeModelBuilder.cs" />
<Compile Include="Security\XmlCryptoProviderBuilderTests.cs" />
<Compile Include="TestHelpers\FileTestHelpers.cs" />
<Compile Include="TestHelpers\SerializableConnectionInfoAllPropertiesOfType.cs" />
<Compile Include="Tools\ExternalToolsArgumentParserTests.cs" />
<Compile Include="Tools\FullyObservableCollectionTests.cs" />
<Compile Include="Tools\MaybeTests.cs" />
<Compile Include="Tools\OptionalTests.cs" />
<Compile Include="Tree\ClickHandlers\TreeNodeCompositeClickHandlerTests.cs" />
<Compile Include="Tree\ConnectionTreeDragAndDropHandlerTests.cs" />
<Compile Include="Tree\ConnectionTreeModelTests.cs" />

View File

@@ -4,6 +4,8 @@ using System.Windows.Forms;
using mRemoteNG.Config.Connections;
using mRemoteNG.Config.DataProviders;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Csv;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Security;

View File

@@ -7,22 +7,10 @@ using mRemoteNG.Connection.Protocol;
using mRemoteNG.Container;
using mRemoteNG.Tools;
namespace mRemoteNG.App
{
public static class Import
{
private enum FileType
{
Unknown = 0,
// ReSharper disable once InconsistentNaming
mRemoteXml,
RemoteDesktopConnection,
RemoteDesktopConnectionManager,
PuttyConnectionManager
}
#region Public Methods
public static void ImportFromFile(ContainerInfo importDestinationContainer)
{
try
@@ -34,8 +22,9 @@ namespace mRemoteNG.App
openFileDialog.Multiselect = true;
var fileTypes = new List<string>();
fileTypes.AddRange(new[] {Language.strFilterAllImportable, "*.xml;*.rdp;*.rdg;*.dat"});
fileTypes.AddRange(new[] {Language.strFilterAllImportable, "*.xml;*.rdp;*.rdg;*.dat;*.csv"});
fileTypes.AddRange(new[] {Language.strFiltermRemoteXML, "*.xml"});
fileTypes.AddRange(new[] {Language.strFiltermRemoteCSV, "*.csv"});
fileTypes.AddRange(new[] {Language.strFilterRDP, "*.rdp"});
fileTypes.AddRange(new[] {Language.strFilterRdgFiles, "*.rdg"});
fileTypes.AddRange(new[] {Language.strFilterPuttyConnectionManager, "*.dat"});
@@ -50,32 +39,14 @@ namespace mRemoteNG.App
{
try
{
IConnectionImporter importer;
// ReSharper disable once SwitchStatementMissingSomeCases
switch (DetermineFileType(fileName))
{
case FileType.mRemoteXml:
importer = new mRemoteNGImporter();
break;
case FileType.RemoteDesktopConnection:
importer = new RemoteDesktopConnectionImporter();
break;
case FileType.RemoteDesktopConnectionManager:
importer = new RemoteDesktopConnectionManagerImporter();
break;
case FileType.PuttyConnectionManager:
importer = new PuttyConnectionManagerImporter();
break;
default:
throw new FileFormatException("Unrecognized file format.");
}
var importer = BuildConnectionImporterFromFileExtension(fileName);
importer.Import(fileName, importDestinationContainer);
}
catch (Exception ex)
{
MessageBox.Show(string.Format(Language.strImportFileFailedContent, fileName), Language.strImportFileFailedMainInstruction,
MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromFile() failed:1", ex);
Runtime.MessageCollector.AddExceptionMessage("Unable to import file.", ex);
}
}
@@ -84,15 +55,15 @@ namespace mRemoteNG.App
}
catch (Exception ex)
{
Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromFile() failed:2", ex);
Runtime.MessageCollector.AddExceptionMessage("Unable to import file.", ex);
}
}
public static void ImportFromActiveDirectory(string ldapPath, ContainerInfo importDestinationContainer, bool importSubOU)
public static void ImportFromActiveDirectory(string ldapPath, ContainerInfo importDestinationContainer, bool importSubOu)
{
try
{
ActiveDirectoryImporter.Import(ldapPath, importDestinationContainer, importSubOU);
ActiveDirectoryImporter.Import(ldapPath, importDestinationContainer, importSubOu);
Runtime.ConnectionsService.SaveConnectionsAsync();
}
catch (Exception ex)
@@ -114,25 +85,25 @@ namespace mRemoteNG.App
Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromPortScan() failed.", ex);
}
}
#endregion
private static FileType DetermineFileType(string fileName)
private static IConnectionImporter<string> BuildConnectionImporterFromFileExtension(string fileName)
{
// TODO: Use the file contents to determine the file type instead of trusting the extension
var extension = Path.GetExtension(fileName);
if (extension == null) return FileType.Unknown;
var extension = Path.GetExtension(fileName) ?? "";
switch (extension.ToLowerInvariant())
{
case ".xml":
return FileType.mRemoteXml;
return new MRemoteNGXmlImporter();
case ".csv":
return new MRemoteNGCsvImporter();
case ".rdp":
return FileType.RemoteDesktopConnection;
return new RemoteDesktopConnectionImporter();
case ".rdg":
return FileType.RemoteDesktopConnectionManager;
return new RemoteDesktopConnectionManagerImporter();
case ".dat":
return FileType.PuttyConnectionManager;
return new PuttyConnectionManagerImporter();
default:
return FileType.Unknown;
throw new FileFormatException("Unrecognized file format.");
}
}
}

View File

@@ -147,7 +147,14 @@ namespace mRemoteNG.App
{
try
{
CTaskDialog.ShowTaskDialogBox(GeneralAppInfo.ProductName, Language.ConfigurationFileNotFound, "", "", "", "", "", string.Join(" | ", commandButtons), ETaskDialogButtons.None, ESysIcons.Question, ESysIcons.Question);
CTaskDialog.ShowTaskDialogBox(
GeneralAppInfo.ProductName,
Language.ConnectionFileNotFound,
"", "", "", "", "",
string.Join(" | ", commandButtons),
ETaskDialogButtons.None,
ESysIcons.Question,
ESysIcons.Question);
switch (CTaskDialog.CommandButtonResult)
{

View File

@@ -10,7 +10,7 @@ namespace mRemoteNG.Config.Connections
/// The previous <see cref="ConnectionTreeModel"/> that is being
/// unloaded.
/// </summary>
public Maybe<ConnectionTreeModel> PreviousConnectionTreeModel { get; }
public Optional<ConnectionTreeModel> PreviousConnectionTreeModel { get; }
/// <summary>
/// True if the previous <see cref="ConnectionTreeModel"/> was loaded from
@@ -37,7 +37,7 @@ namespace mRemoteNG.Config.Connections
public string NewSourcePath { get; }
public ConnectionsLoadedEventArgs(
Maybe<ConnectionTreeModel> previousTreeModelModel, ConnectionTreeModel newTreeModelModel,
Optional<ConnectionTreeModel> previousTreeModelModel, ConnectionTreeModel newTreeModelModel,
bool previousSourceWasDatabase, bool newSourceIsDatabase,
string newSourcePath)
{

View File

@@ -2,6 +2,7 @@
using mRemoteNG.App;
using mRemoteNG.Config.DataProviders;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Csv;
using mRemoteNG.Security;
using mRemoteNG.Tree;

View File

@@ -5,6 +5,7 @@ using mRemoteNG.Config.Serializers;
using mRemoteNG.Tools;
using mRemoteNG.Tree;
using System.IO;
using mRemoteNG.Config.Serializers.Xml;
namespace mRemoteNG.Config.Connections
{

View File

@@ -3,6 +3,7 @@ using System.Linq;
using mRemoteNG.App;
using mRemoteNG.Config.DataProviders;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Security;
using mRemoteNG.Security.Factories;
using mRemoteNG.Tree;

View File

@@ -20,6 +20,10 @@ namespace mRemoteNG.Config.DataProviders
{
fileContents = File.ReadAllText(FilePath);
}
catch (FileNotFoundException ex)
{
Runtime.MessageCollector.AddExceptionStackTrace($"Could not load file. File does not exist '{FilePath}'", ex);
}
catch (Exception ex)
{
Runtime.MessageCollector.AddExceptionStackTrace($"Failed to load file {FilePath}", ex);

View File

@@ -3,24 +3,23 @@ using System.Linq;
using mRemoteNG.App;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Container;
using mRemoteNG.Tools;
namespace mRemoteNG.Config.Import
{
public class ActiveDirectoryImporter : IConnectionImporter
public class ActiveDirectoryImporter : IConnectionImporter<string>
{
public void Import(object ldapPath, ContainerInfo destinationContainer)
public void Import(string ldapPath, ContainerInfo destinationContainer)
{
var ldapPathAsString = ldapPath as string;
if (ldapPathAsString == null) return;
Import(ldapPathAsString, destinationContainer);
Import(ldapPath, destinationContainer, false);
}
public static void Import(string ldapPath, ContainerInfo destinationContainer, bool importSubOU = false)
public static void Import(string ldapPath, ContainerInfo destinationContainer, bool importSubOu)
{
try
{
var deserializer = new ActiveDirectoryDeserializer(ldapPath, importSubOU);
ldapPath.ThrowIfNullOrEmpty(nameof(ldapPath));
var deserializer = new ActiveDirectoryDeserializer(ldapPath, importSubOu);
var connectionTreeModel = deserializer.Deserialize();
var importedRootNode = connectionTreeModel.RootNodes.First();
if (importedRootNode == null) return;

View File

@@ -1,10 +1,10 @@
using mRemoteNG.Container;
namespace mRemoteNG.Config.Import
{
public interface IConnectionImporter
public interface IConnectionImporter<in TSource>
where TSource : class
{
void Import(object source, ContainerInfo destinationContainer);
void Import(TSource source, ContainerInfo destinationContainer);
}
}

View File

@@ -1,42 +1,34 @@
using System.IO;
using System.IO;
using System.Linq;
using mRemoteNG.App;
using mRemoteNG.Config.DataProviders;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Csv;
using mRemoteNG.Container;
using mRemoteNG.Messages;
namespace mRemoteNG.Config.Import
{
// ReSharper disable once InconsistentNaming
public class mRemoteNGImporter : IConnectionImporter
{
public void Import(object filePath, ContainerInfo destinationContainer)
{
var filePathAsString = filePath as string;
if (filePathAsString == null)
{
public class MRemoteNGCsvImporter : IConnectionImporter<string>
{
public void Import(string filePath, ContainerInfo destinationContainer)
{
if (string.IsNullOrEmpty(filePath))
{
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "Unable to import file. File path is null.");
return;
}
if(File.Exists(filePathAsString))
Import(filePathAsString, destinationContainer);
else
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, $"Unable to import file. File does not exist. Path: {filePathAsString}");
}
if (!File.Exists(filePath))
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, $"Unable to import file. File does not exist. Path: {filePath}");
public void Import(string fileName, ContainerInfo destinationContainer)
{
var dataProvider = new FileDataProvider(fileName);
var dataProvider = new FileDataProvider(filePath);
var xmlString = dataProvider.Load();
var xmlConnectionsDeserializer = new XmlConnectionsDeserializer();
var connectionTreeModel = xmlConnectionsDeserializer.Deserialize(xmlString, true);
var xmlConnectionsDeserializer = new CsvConnectionsDeserializerMremotengFormat();
var connectionTreeModel = xmlConnectionsDeserializer.Deserialize(xmlString);
var rootImportContainer = new ContainerInfo { Name = Path.GetFileNameWithoutExtension(fileName) };
var rootImportContainer = new ContainerInfo { Name = Path.GetFileNameWithoutExtension(filePath) };
rootImportContainer.AddChildRange(connectionTreeModel.RootNodes.First().Children.ToArray());
destinationContainer.AddChild(rootImportContainer);
}
}
}
}
}
}

View File

@@ -0,0 +1,37 @@
using System.IO;
using System.Linq;
using mRemoteNG.App;
using mRemoteNG.Config.DataProviders;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Container;
using mRemoteNG.Messages;
namespace mRemoteNG.Config.Import
{
// ReSharper disable once InconsistentNaming
public class MRemoteNGXmlImporter : IConnectionImporter<string>
{
public void Import(string fileName, ContainerInfo destinationContainer)
{
if (fileName == null)
{
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "Unable to import file. File path is null.");
return;
}
if(!File.Exists(fileName))
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, $"Unable to import file. File does not exist. Path: {fileName}");
var dataProvider = new FileDataProvider(fileName);
var xmlString = dataProvider.Load();
var xmlConnectionsDeserializer = new XmlConnectionsDeserializer();
var connectionTreeModel = xmlConnectionsDeserializer.Deserialize(xmlString, true);
var rootImportContainer = new ContainerInfo { Name = Path.GetFileNameWithoutExtension(fileName) };
rootImportContainer.AddChildRange(connectionTreeModel.RootNodes.First().Children.ToArray());
destinationContainer.AddChild(rootImportContainer);
}
}
}

View File

@@ -8,7 +8,7 @@ using mRemoteNG.Tools;
namespace mRemoteNG.Config.Import
{
public class PortScanImporter : IConnectionImporter
public class PortScanImporter : IConnectionImporter<IEnumerable<ScanHost>>
{
private readonly ProtocolType _targetProtocolType;
@@ -17,13 +17,6 @@ namespace mRemoteNG.Config.Import
_targetProtocolType = targetProtocolType;
}
public void Import(object hosts, ContainerInfo destinationContainer)
{
var hostsAsEnumerableScanHost = hosts as IEnumerable<ScanHost>;
if (hostsAsEnumerableScanHost == null) return;
Import(hostsAsEnumerableScanHost, destinationContainer);
}
public void Import(IEnumerable<ScanHost> hosts, ContainerInfo destinationContainer)
{
var deserializer = new PortScanDeserializer(_targetProtocolType);

View File

@@ -1,4 +1,3 @@
using System.IO;
using System.Linq;
using mRemoteNG.Config.DataProviders;
using mRemoteNG.Config.Serializers;
@@ -7,17 +6,8 @@ using mRemoteNG.Container;
namespace mRemoteNG.Config.Import
{
public class PuttyConnectionManagerImporter : IConnectionImporter
public class PuttyConnectionManagerImporter : IConnectionImporter<string>
{
public void Import(object filePath, ContainerInfo destinationContainer)
{
var filePathAsString = filePath as string;
if (filePathAsString == null)
return;
if (File.Exists(filePathAsString))
Import(filePathAsString, destinationContainer);
}
public void Import(string filePath, ContainerInfo destinationContainer)
{
var dataProvider = new FileDataProvider(filePath);

View File

@@ -1,4 +1,3 @@
using System;
using System.IO;
using System.Linq;
using mRemoteNG.Config.DataProviders;
@@ -8,17 +7,8 @@ using mRemoteNG.Container;
namespace mRemoteNG.Config.Import
{
public class RemoteDesktopConnectionImporter : IConnectionImporter
public class RemoteDesktopConnectionImporter : IConnectionImporter<string>
{
public void Import(object fileName, ContainerInfo destinationContainer)
{
var fileNameAsString = fileName as string;
if(fileNameAsString == null)
return;
if (File.Exists(fileNameAsString))
Import(fileNameAsString, destinationContainer);
}
public void Import(string fileName, ContainerInfo destinationContainer)
{
var dataProvider = new FileDataProvider(fileName);

View File

@@ -1,4 +1,3 @@
using System.IO;
using System.Linq;
using mRemoteNG.Config.DataProviders;
using mRemoteNG.Config.Serializers;
@@ -7,18 +6,9 @@ using mRemoteNG.Container;
namespace mRemoteNG.Config.Import
{
public class RemoteDesktopConnectionManagerImporter : IConnectionImporter
public class RemoteDesktopConnectionManagerImporter : IConnectionImporter<string>
{
public void Import(object filePath, ContainerInfo destinationContainer)
{
var fileNameAsString = filePath as string;
if (fileNameAsString == null)
return;
if (File.Exists(fileNameAsString))
Import(fileNameAsString, destinationContainer);
}
private static void Import(string filePath, ContainerInfo destinationContainer)
public void Import(string filePath, ContainerInfo destinationContainer)
{
var dataProvider = new FileDataProvider(filePath);
var fileContent = dataProvider.Load();

View File

@@ -0,0 +1,712 @@
using System;
using System.Collections.Generic;
using System.Linq;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Connection.Protocol.Http;
using mRemoteNG.Connection.Protocol.ICA;
using mRemoteNG.Connection.Protocol.RDP;
using mRemoteNG.Connection.Protocol.VNC;
using mRemoteNG.Container;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
namespace mRemoteNG.Config.Serializers.Csv
{
public class CsvConnectionsDeserializerMremotengFormat : IDeserializer<string, ConnectionTreeModel>
{
public ConnectionTreeModel Deserialize(string serializedData)
{
var lines = serializedData.Split(new []{"\r\n", "\r", "\n"}, StringSplitOptions.RemoveEmptyEntries);
var csvHeaders = new List<string>();
// used to map a connectioninfo to it's parent's GUID
var parentMapping = new Dictionary<ConnectionInfo, string>();
for (var lineNumber = 0; lineNumber < lines.Length; lineNumber++)
{
var line = lines[lineNumber].Split(';');
if (lineNumber == 0)
csvHeaders = line.ToList();
else
{
var connectionInfo = ParseConnectionInfo(csvHeaders, line);
parentMapping.Add(connectionInfo, line[csvHeaders.IndexOf("Parent")]);
}
}
var root = CreateTreeStructure(parentMapping);
var connectionTreeModel = new ConnectionTreeModel();
connectionTreeModel.AddRootNode(root);
return connectionTreeModel;
}
private RootNodeInfo CreateTreeStructure(Dictionary<ConnectionInfo, string> parentMapping)
{
var root = new RootNodeInfo(RootNodeType.Connection);
foreach (var node in parentMapping)
{
// no parent mapped, add to root
if (string.IsNullOrEmpty(node.Value))
{
root.AddChild(node.Key);
continue;
}
// search for parent in the list by GUID
var parent = parentMapping
.Keys
.OfType<ContainerInfo>()
.FirstOrDefault(info => info.ConstantID == node.Value);
if (parent != null)
{
parent.AddChild(node.Key);
}
else
{
root.AddChild(node.Key);
}
}
return root;
}
private ConnectionInfo ParseConnectionInfo(IList<string> headers, string[] connectionCsv)
{
var nodeType = headers.Contains("NodeType")
? (TreeNodeType)Enum.Parse(typeof(TreeNodeType), connectionCsv[headers.IndexOf("NodeType")], true)
: TreeNodeType.Connection;
var nodeId = headers.Contains("Id")
? connectionCsv[headers.IndexOf("Id")]
: Guid.NewGuid().ToString();
var connectionRecord = nodeType == TreeNodeType.Connection
? new ConnectionInfo(nodeId)
: new ContainerInfo(nodeId);
connectionRecord.Name = headers.Contains("Name") ? connectionCsv[headers.IndexOf("Name")] : "";
connectionRecord.Description = headers.Contains("Description") ? connectionCsv[headers.IndexOf("Description")] : "";
connectionRecord.Icon = headers.Contains("Icon") ? connectionCsv[headers.IndexOf("Icon")] : "";
connectionRecord.Panel = headers.Contains("Panel") ? connectionCsv[headers.IndexOf("Panel")] : "";
connectionRecord.Username = headers.Contains("Username") ? connectionCsv[headers.IndexOf("Username")] : "";
connectionRecord.Password = headers.Contains("Password") ? connectionCsv[headers.IndexOf("Password")] : "";
connectionRecord.Domain = headers.Contains("Domain") ? connectionCsv[headers.IndexOf("Domain")] : "";
connectionRecord.Hostname = headers.Contains("Hostname") ? connectionCsv[headers.IndexOf("Hostname")] : "";
connectionRecord.PuttySession = headers.Contains("PuttySession") ? connectionCsv[headers.IndexOf("PuttySession")] : "";
connectionRecord.LoadBalanceInfo = headers.Contains("LoadBalanceInfo") ? connectionCsv[headers.IndexOf("LoadBalanceInfo")] : "";
connectionRecord.PreExtApp = headers.Contains("PreExtApp") ? connectionCsv[headers.IndexOf("PreExtApp")] : "";
connectionRecord.PostExtApp = headers.Contains("PostExtApp") ? connectionCsv[headers.IndexOf("PostExtApp")] : "";
connectionRecord.MacAddress = headers.Contains("MacAddress") ? connectionCsv[headers.IndexOf("MacAddress")] : "";
connectionRecord.UserField = headers.Contains("UserField") ? connectionCsv[headers.IndexOf("UserField")] : "";
connectionRecord.ExtApp = headers.Contains("ExtApp") ? connectionCsv[headers.IndexOf("ExtApp")] : "";
connectionRecord.VNCProxyUsername = headers.Contains("VNCProxyUsername") ? connectionCsv[headers.IndexOf("VNCProxyUsername")] : "";
connectionRecord.VNCProxyPassword = headers.Contains("VNCProxyPassword") ? connectionCsv[headers.IndexOf("VNCProxyPassword")] : "";
connectionRecord.RDGatewayUsername = headers.Contains("RDGatewayUsername") ? connectionCsv[headers.IndexOf("RDGatewayUsername")] : "";
connectionRecord.RDGatewayPassword = headers.Contains("RDGatewayPassword") ? connectionCsv[headers.IndexOf("RDGatewayPassword")] : "";
connectionRecord.RDGatewayDomain = headers.Contains("RDGatewayDomain") ? connectionCsv[headers.IndexOf("RDGatewayDomain")] : "";
connectionRecord.VNCProxyIP = headers.Contains("VNCProxyIP") ? connectionCsv[headers.IndexOf("VNCProxyIP")] : "";
connectionRecord.RDGatewayHostname = headers.Contains("RDGatewayHostname") ? connectionCsv[headers.IndexOf("RDGatewayHostname")] : "";
if (headers.Contains("Protocol"))
{
ProtocolType protocolType;
if (Enum.TryParse(connectionCsv[headers.IndexOf("Protocol")], out protocolType))
connectionRecord.Protocol = protocolType;
}
if (headers.Contains("Port"))
{
int port;
if (int.TryParse(connectionCsv[headers.IndexOf("Port")], out port))
connectionRecord.Port = port;
}
if (headers.Contains("ConnectToConsole"))
{
bool useConsoleSession;
if (bool.TryParse(connectionCsv[headers.IndexOf("ConnectToConsole")], out useConsoleSession))
connectionRecord.UseConsoleSession = useConsoleSession;
}
if (headers.Contains("UseCredSsp"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("UseCredSsp")], out value))
connectionRecord.UseCredSsp = value;
}
if (headers.Contains("RenderingEngine"))
{
HTTPBase.RenderingEngine value;
if (Enum.TryParse(connectionCsv[headers.IndexOf("RenderingEngine")], out value))
connectionRecord.RenderingEngine = value;
}
if (headers.Contains("ICAEncryptionStrength"))
{
IcaProtocol.EncryptionStrength value;
if (Enum.TryParse(connectionCsv[headers.IndexOf("ICAEncryptionStrength")], out value))
connectionRecord.ICAEncryptionStrength = value;
}
if (headers.Contains("RDPAuthenticationLevel"))
{
RdpProtocol.AuthenticationLevel value;
if (Enum.TryParse(connectionCsv[headers.IndexOf("RDPAuthenticationLevel")], out value))
connectionRecord.RDPAuthenticationLevel = value;
}
if (headers.Contains("Colors"))
{
RdpProtocol.RDPColors value;
if (Enum.TryParse(connectionCsv[headers.IndexOf("Colors")], out value))
connectionRecord.Colors = value;
}
if (headers.Contains("Resolution"))
{
RdpProtocol.RDPResolutions value;
if (Enum.TryParse(connectionCsv[headers.IndexOf("Resolution")], out value))
connectionRecord.Resolution = value;
}
if (headers.Contains("AutomaticResize"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("AutomaticResize")], out value))
connectionRecord.AutomaticResize = value;
}
if (headers.Contains("DisplayWallpaper"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("DisplayWallpaper")], out value))
connectionRecord.DisplayWallpaper = value;
}
if (headers.Contains("DisplayThemes"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("DisplayThemes")], out value))
connectionRecord.DisplayThemes = value;
}
if (headers.Contains("EnableFontSmoothing"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("EnableFontSmoothing")], out value))
connectionRecord.EnableFontSmoothing = value;
}
if (headers.Contains("EnableDesktopComposition"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("EnableDesktopComposition")], out value))
connectionRecord.EnableDesktopComposition = value;
}
if (headers.Contains("CacheBitmaps"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("CacheBitmaps")], out value))
connectionRecord.CacheBitmaps = value;
}
if (headers.Contains("RedirectDiskDrives"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("RedirectDiskDrives")], out value))
connectionRecord.RedirectDiskDrives = value;
}
if (headers.Contains("RedirectPorts"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("RedirectPorts")], out value))
connectionRecord.RedirectPorts = value;
}
if (headers.Contains("RedirectPrinters"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("RedirectPrinters")], out value))
connectionRecord.RedirectPrinters = value;
}
if (headers.Contains("RedirectSmartCards"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("RedirectSmartCards")], out value))
connectionRecord.RedirectSmartCards = value;
}
if (headers.Contains("RedirectSound"))
{
RdpProtocol.RDPSounds value;
if (Enum.TryParse(connectionCsv[headers.IndexOf("RedirectSound")], out value))
connectionRecord.RedirectSound = value;
}
if (headers.Contains("RedirectKeys"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("RedirectKeys")], out value))
connectionRecord.RedirectKeys = value;
}
if (headers.Contains("VNCCompression"))
{
ProtocolVNC.Compression value;
if (Enum.TryParse(connectionCsv[headers.IndexOf("VNCCompression")], out value))
connectionRecord.VNCCompression = value;
}
if (headers.Contains("VNCEncoding"))
{
ProtocolVNC.Encoding value;
if (Enum.TryParse(connectionCsv[headers.IndexOf("VNCEncoding")], out value))
connectionRecord.VNCEncoding = value;
}
if (headers.Contains("VNCAuthMode"))
{
ProtocolVNC.AuthMode value;
if (Enum.TryParse(connectionCsv[headers.IndexOf("VNCAuthMode")], out value))
connectionRecord.VNCAuthMode = value;
}
if (headers.Contains("VNCProxyType"))
{
ProtocolVNC.ProxyType value;
if (Enum.TryParse(connectionCsv[headers.IndexOf("VNCProxyType")], out value))
connectionRecord.VNCProxyType = value;
}
if (headers.Contains("VNCProxyPort"))
{
int value;
if (int.TryParse(connectionCsv[headers.IndexOf("VNCProxyPort")], out value))
connectionRecord.VNCProxyPort = value;
}
if (headers.Contains("VNCColors"))
{
ProtocolVNC.Colors value;
if (Enum.TryParse(connectionCsv[headers.IndexOf("VNCColors")], out value))
connectionRecord.VNCColors = value;
}
if (headers.Contains("VNCSmartSizeMode"))
{
ProtocolVNC.SmartSizeMode value;
if (Enum.TryParse(connectionCsv[headers.IndexOf("VNCSmartSizeMode")], out value))
connectionRecord.VNCSmartSizeMode = value;
}
if (headers.Contains("VNCViewOnly"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("VNCViewOnly")], out value))
connectionRecord.VNCViewOnly = value;
}
if (headers.Contains("RDGatewayUsageMethod"))
{
RdpProtocol.RDGatewayUsageMethod value;
if (Enum.TryParse(connectionCsv[headers.IndexOf("RDGatewayUsageMethod")], out value))
connectionRecord.RDGatewayUsageMethod = value;
}
if (headers.Contains("RDGatewayUseConnectionCredentials"))
{
RdpProtocol.RDGatewayUseConnectionCredentials value;
if (Enum.TryParse(connectionCsv[headers.IndexOf("RDGatewayUseConnectionCredentials")], out value))
connectionRecord.RDGatewayUseConnectionCredentials = value;
}
#region Inheritance
if (headers.Contains("InheritCacheBitmaps"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritCacheBitmaps")], out value))
connectionRecord.Inheritance.CacheBitmaps = value;
}
if (headers.Contains("InheritColors"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritColors")], out value))
connectionRecord.Inheritance.Colors = value;
}
if (headers.Contains("InheritDescription"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritDescription")], out value))
connectionRecord.Inheritance.Description = value;
}
if (headers.Contains("InheritDisplayThemes"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritDisplayThemes")], out value))
connectionRecord.Inheritance.DisplayThemes = value;
}
if (headers.Contains("InheritDisplayWallpaper"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritDisplayWallpaper")], out value))
connectionRecord.Inheritance.DisplayWallpaper = value;
}
if (headers.Contains("InheritEnableFontSmoothing"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritEnableFontSmoothing")], out value))
connectionRecord.Inheritance.EnableFontSmoothing = value;
}
if (headers.Contains("InheritEnableDesktopComposition"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritEnableDesktopComposition")], out value))
connectionRecord.Inheritance.EnableDesktopComposition = value;
}
if (headers.Contains("InheritDomain"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritDomain")], out value))
connectionRecord.Inheritance.Domain = value;
}
if (headers.Contains("InheritIcon"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritIcon")], out value))
connectionRecord.Inheritance.Icon = value;
}
if (headers.Contains("InheritPanel"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritPanel")], out value))
connectionRecord.Inheritance.Panel = value;
}
if (headers.Contains("InheritPassword"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritPassword")], out value))
connectionRecord.Inheritance.Password = value;
}
if (headers.Contains("InheritPort"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritPort")], out value))
connectionRecord.Inheritance.Port = value;
}
if (headers.Contains("InheritProtocol"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritProtocol")], out value))
connectionRecord.Inheritance.Protocol = value;
}
if (headers.Contains("InheritPuttySession"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritPuttySession")], out value))
connectionRecord.Inheritance.PuttySession = value;
}
if (headers.Contains("InheritRedirectDiskDrives"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritRedirectDiskDrives")], out value))
connectionRecord.Inheritance.RedirectDiskDrives = value;
}
if (headers.Contains("InheritRedirectKeys"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritRedirectKeys")], out value))
connectionRecord.Inheritance.RedirectKeys = value;
}
if (headers.Contains("InheritRedirectPorts"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritRedirectPorts")], out value))
connectionRecord.Inheritance.RedirectPorts = value;
}
if (headers.Contains("InheritRedirectPrinters"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritRedirectPrinters")], out value))
connectionRecord.Inheritance.RedirectPrinters = value;
}
if (headers.Contains("InheritRedirectSmartCards"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritRedirectSmartCards")], out value))
connectionRecord.Inheritance.RedirectSmartCards = value;
}
if (headers.Contains("InheritRedirectSound"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritRedirectSound")], out value))
connectionRecord.Inheritance.RedirectSound = value;
}
if (headers.Contains("InheritResolution"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritResolution")], out value))
connectionRecord.Inheritance.Resolution = value;
}
if (headers.Contains("InheritAutomaticResize"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritAutomaticResize")], out value))
connectionRecord.Inheritance.AutomaticResize = value;
}
if (headers.Contains("InheritUseConsoleSession"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritUseConsoleSession")], out value))
connectionRecord.Inheritance.UseConsoleSession = value;
}
if (headers.Contains("InheritUseCredSsp"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritUseCredSsp")], out value))
connectionRecord.Inheritance.UseCredSsp = value;
}
if (headers.Contains("InheritRenderingEngine"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritRenderingEngine")], out value))
connectionRecord.Inheritance.RenderingEngine = value;
}
if (headers.Contains("InheritUsername"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritUsername")], out value))
connectionRecord.Inheritance.Username = value;
}
if (headers.Contains("InheritICAEncryptionStrength"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritICAEncryptionStrength")], out value))
connectionRecord.Inheritance.ICAEncryptionStrength = value;
}
if (headers.Contains("InheritRDPAuthenticationLevel"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritRDPAuthenticationLevel")], out value))
connectionRecord.Inheritance.RDPAuthenticationLevel = value;
}
if (headers.Contains("InheritLoadBalanceInfo"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritLoadBalanceInfo")], out value))
connectionRecord.Inheritance.LoadBalanceInfo = value;
}
if (headers.Contains("InheritPreExtApp"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritPreExtApp")], out value))
connectionRecord.Inheritance.PreExtApp = value;
}
if (headers.Contains("InheritPostExtApp"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritPostExtApp")], out value))
connectionRecord.Inheritance.PostExtApp = value;
}
if (headers.Contains("InheritMacAddress"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritMacAddress")], out value))
connectionRecord.Inheritance.MacAddress = value;
}
if (headers.Contains("InheritUserField"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritUserField")], out value))
connectionRecord.Inheritance.UserField = value;
}
if (headers.Contains("InheritExtApp"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritExtApp")], out value))
connectionRecord.Inheritance.ExtApp = value;
}
if (headers.Contains("InheritVNCCompression"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritVNCCompression")], out value))
connectionRecord.Inheritance.VNCCompression = value;
}
if (headers.Contains("InheritVNCEncoding"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritVNCEncoding")], out value))
connectionRecord.Inheritance.VNCEncoding = value;
}
if (headers.Contains("InheritVNCAuthMode"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritVNCAuthMode")], out value))
connectionRecord.Inheritance.VNCAuthMode = value;
}
if (headers.Contains("InheritVNCProxyType"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritVNCProxyType")], out value))
connectionRecord.Inheritance.VNCProxyType = value;
}
if (headers.Contains("InheritVNCProxyIP"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritVNCProxyIP")], out value))
connectionRecord.Inheritance.VNCProxyIP = value;
}
if (headers.Contains("InheritVNCProxyPort"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritVNCProxyPort")], out value))
connectionRecord.Inheritance.VNCProxyPort = value;
}
if (headers.Contains("InheritVNCProxyUsername"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritVNCProxyUsername")], out value))
connectionRecord.Inheritance.VNCProxyUsername = value;
}
if (headers.Contains("InheritVNCProxyPassword"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritVNCProxyPassword")], out value))
connectionRecord.Inheritance.VNCProxyPassword = value;
}
if (headers.Contains("InheritVNCColors"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritVNCColors")], out value))
connectionRecord.Inheritance.VNCColors = value;
}
if (headers.Contains("InheritVNCSmartSizeMode"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritVNCSmartSizeMode")], out value))
connectionRecord.Inheritance.VNCSmartSizeMode = value;
}
if (headers.Contains("InheritVNCViewOnly"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritVNCViewOnly")], out value))
connectionRecord.Inheritance.VNCViewOnly = value;
}
if (headers.Contains("InheritRDGatewayUsageMethod"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritRDGatewayUsageMethod")], out value))
connectionRecord.Inheritance.RDGatewayUsageMethod = value;
}
if (headers.Contains("InheritRDGatewayHostname"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritRDGatewayHostname")], out value))
connectionRecord.Inheritance.RDGatewayHostname = value;
}
if (headers.Contains("InheritRDGatewayUseConnectionCredentials"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritRDGatewayUseConnectionCredentials")], out value))
connectionRecord.Inheritance.RDGatewayUseConnectionCredentials = value;
}
if (headers.Contains("InheritRDGatewayUsername"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritRDGatewayUsername")], out value))
connectionRecord.Inheritance.RDGatewayUsername = value;
}
if (headers.Contains("InheritRDGatewayPassword"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritRDGatewayPassword")], out value))
connectionRecord.Inheritance.RDGatewayPassword = value;
}
if (headers.Contains("InheritRDGatewayDomain"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritRDGatewayDomain")], out value))
connectionRecord.Inheritance.RDGatewayDomain = value;
}
if (headers.Contains("InheritRDPAlertIdleTimeout"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritRDPAlertIdleTimeout")], out value))
connectionRecord.Inheritance.RDPAlertIdleTimeout = value;
}
if (headers.Contains("InheritRDPMinutesToIdleTimeout"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritRDPMinutesToIdleTimeout")], out value))
connectionRecord.Inheritance.RDPMinutesToIdleTimeout = value;
}
if (headers.Contains("InheritSoundQuality"))
{
bool value;
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritSoundQuality")], out value))
connectionRecord.Inheritance.SoundQuality = value;
}
#endregion
return connectionRecord;
}
}
}

View File

@@ -0,0 +1,211 @@
using System;
using System.Linq;
using System.Text;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Credential;
using mRemoteNG.Security;
using mRemoteNG.Tools;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
namespace mRemoteNG.Config.Serializers.Csv
{
public class CsvConnectionsSerializerMremotengFormat : ISerializer<ConnectionInfo,string>
{
private readonly SaveFilter _saveFilter;
private readonly ICredentialRepositoryList _credentialRepositoryList;
public CsvConnectionsSerializerMremotengFormat(SaveFilter saveFilter, ICredentialRepositoryList credentialRepositoryList)
{
saveFilter.ThrowIfNull(nameof(saveFilter));
credentialRepositoryList.ThrowIfNull(nameof(credentialRepositoryList));
_saveFilter = saveFilter;
_credentialRepositoryList = credentialRepositoryList;
}
public string Serialize(ConnectionTreeModel connectionTreeModel)
{
connectionTreeModel.ThrowIfNull(nameof(connectionTreeModel));
var rootNode = connectionTreeModel.RootNodes.First(node => node is RootNodeInfo);
return Serialize(rootNode);
}
public string Serialize(ConnectionInfo serializationTarget)
{
serializationTarget.ThrowIfNull(nameof(serializationTarget));
var sb = new StringBuilder();
WriteCsvHeader(sb);
SerializeNodesRecursive(serializationTarget, sb);
return sb.ToString();
}
private void WriteCsvHeader(StringBuilder sb)
{
sb.Append("Name;Id;Parent;NodeType;Description;Icon;Panel;");
if (_saveFilter.SaveUsername)
sb.Append("Username;");
if (_saveFilter.SavePassword)
sb.Append("Password;");
if (_saveFilter.SaveDomain)
sb.Append("Domain;");
sb.Append("Hostname;Protocol;PuttySession;Port;ConnectToConsole;UseCredSsp;RenderingEngine;ICAEncryptionStrength;RDPAuthenticationLevel;LoadBalanceInfo;Colors;Resolution;AutomaticResize;DisplayWallpaper;DisplayThemes;EnableFontSmoothing;EnableDesktopComposition;CacheBitmaps;RedirectDiskDrives;RedirectPorts;RedirectPrinters;RedirectSmartCards;RedirectSound;RedirectKeys;PreExtApp;PostExtApp;MacAddress;UserField;ExtApp;VNCCompression;VNCEncoding;VNCAuthMode;VNCProxyType;VNCProxyIP;VNCProxyPort;VNCProxyUsername;VNCProxyPassword;VNCColors;VNCSmartSizeMode;VNCViewOnly;RDGatewayUsageMethod;RDGatewayHostname;RDGatewayUseConnectionCredentials;RDGatewayUsername;RDGatewayPassword;RDGatewayDomain;");
if (_saveFilter.SaveInheritance)
sb.Append("InheritCacheBitmaps;InheritColors;InheritDescription;InheritDisplayThemes;InheritDisplayWallpaper;InheritEnableFontSmoothing;InheritEnableDesktopComposition;InheritDomain;InheritIcon;InheritPanel;InheritPassword;InheritPort;InheritProtocol;InheritPuttySession;InheritRedirectDiskDrives;InheritRedirectKeys;InheritRedirectPorts;InheritRedirectPrinters;InheritRedirectSmartCards;InheritRedirectSound;InheritResolution;InheritAutomaticResize;InheritUseConsoleSession;InheritUseCredSsp;InheritRenderingEngine;InheritUsername;InheritICAEncryptionStrength;InheritRDPAuthenticationLevel;InheritLoadBalanceInfo;InheritPreExtApp;InheritPostExtApp;InheritMacAddress;InheritUserField;InheritExtApp;InheritVNCCompression;InheritVNCEncoding;InheritVNCAuthMode;InheritVNCProxyType;InheritVNCProxyIP;InheritVNCProxyPort;InheritVNCProxyUsername;InheritVNCProxyPassword;InheritVNCColors;InheritVNCSmartSizeMode;InheritVNCViewOnly;InheritRDGatewayUsageMethod;InheritRDGatewayHostname;InheritRDGatewayUseConnectionCredentials;InheritRDGatewayUsername;InheritRDGatewayPassword;InheritRDGatewayDomain;InheritRDPAlertIdleTimeout;InheritRDPMinutesToIdleTimeout;InheritSoundQuality");
}
private void SerializeNodesRecursive(ConnectionInfo node, StringBuilder sb)
{
var nodeAsContainer = node as ContainerInfo;
if (nodeAsContainer != null)
{
foreach (var child in nodeAsContainer.Children)
{
SerializeNodesRecursive(child, sb);
}
}
// dont serialize the root node
if (node is RootNodeInfo)
return;
SerializeConnectionInfo(node, sb);
}
private void SerializeConnectionInfo(ConnectionInfo con, StringBuilder sb)
{
sb.AppendLine();
sb.Append(FormatForCsv(con.Name))
.Append(FormatForCsv(con.ConstantID))
.Append(FormatForCsv(con.Parent?.ConstantID ?? ""))
.Append(FormatForCsv(con.GetTreeNodeType()))
.Append(FormatForCsv(con.Description))
.Append(FormatForCsv(con.Icon))
.Append(FormatForCsv(con.Panel));
if (_saveFilter.SaveUsername)
sb.Append(FormatForCsv(con.Username));
if (_saveFilter.SavePassword)
sb.Append(FormatForCsv(con.Password));
if (_saveFilter.SaveDomain)
sb.Append(FormatForCsv(con.Domain));
sb.Append(FormatForCsv(con.Hostname))
.Append(FormatForCsv(con.Protocol))
.Append(FormatForCsv(con.PuttySession))
.Append(FormatForCsv(con.Port))
.Append(FormatForCsv(con.UseConsoleSession))
.Append(FormatForCsv(con.UseCredSsp))
.Append(FormatForCsv(con.RenderingEngine))
.Append(FormatForCsv(con.ICAEncryptionStrength))
.Append(FormatForCsv(con.RDPAuthenticationLevel))
.Append(FormatForCsv(con.LoadBalanceInfo))
.Append(FormatForCsv(con.Colors))
.Append(FormatForCsv(con.Resolution))
.Append(FormatForCsv(con.AutomaticResize))
.Append(FormatForCsv(con.DisplayWallpaper))
.Append(FormatForCsv(con.DisplayThemes))
.Append(FormatForCsv(con.EnableFontSmoothing))
.Append(FormatForCsv(con.EnableDesktopComposition))
.Append(FormatForCsv(con.CacheBitmaps))
.Append(FormatForCsv(con.RedirectDiskDrives))
.Append(FormatForCsv(con.RedirectPorts))
.Append(FormatForCsv(con.RedirectPrinters))
.Append(FormatForCsv(con.RedirectSmartCards))
.Append(FormatForCsv(con.RedirectSound))
.Append(FormatForCsv(con.RedirectKeys))
.Append(FormatForCsv(con.PreExtApp))
.Append(FormatForCsv(con.PostExtApp))
.Append(FormatForCsv(con.MacAddress))
.Append(FormatForCsv(con.UserField))
.Append(FormatForCsv(con.ExtApp))
.Append(FormatForCsv(con.VNCCompression))
.Append(FormatForCsv(con.VNCEncoding))
.Append(FormatForCsv(con.VNCAuthMode))
.Append(FormatForCsv(con.VNCProxyType))
.Append(FormatForCsv(con.VNCProxyIP))
.Append(FormatForCsv(con.VNCProxyPort))
.Append(FormatForCsv(con.VNCProxyUsername))
.Append(FormatForCsv(con.VNCProxyPassword))
.Append(FormatForCsv(con.VNCColors))
.Append(FormatForCsv(con.VNCSmartSizeMode))
.Append(FormatForCsv(con.VNCViewOnly))
.Append(FormatForCsv(con.RDGatewayUsageMethod))
.Append(FormatForCsv(con.RDGatewayHostname))
.Append(FormatForCsv(con.RDGatewayUseConnectionCredentials))
.Append(FormatForCsv(con.RDGatewayUsername))
.Append(FormatForCsv(con.RDGatewayPassword))
.Append(FormatForCsv(con.RDGatewayDomain));
if (!_saveFilter.SaveInheritance)
return;
sb.Append(FormatForCsv(con.Inheritance.CacheBitmaps))
.Append(FormatForCsv(con.Inheritance.Colors))
.Append(FormatForCsv(con.Inheritance.Description))
.Append(FormatForCsv(con.Inheritance.DisplayThemes))
.Append(FormatForCsv(con.Inheritance.DisplayWallpaper))
.Append(FormatForCsv(con.Inheritance.EnableFontSmoothing))
.Append(FormatForCsv(con.Inheritance.EnableDesktopComposition))
.Append(FormatForCsv(con.Inheritance.Domain))
.Append(FormatForCsv(con.Inheritance.Icon))
.Append(FormatForCsv(con.Inheritance.Panel))
.Append(FormatForCsv(con.Inheritance.Password))
.Append(FormatForCsv(con.Inheritance.Port))
.Append(FormatForCsv(con.Inheritance.Protocol))
.Append(FormatForCsv(con.Inheritance.PuttySession))
.Append(FormatForCsv(con.Inheritance.RedirectDiskDrives))
.Append(FormatForCsv(con.Inheritance.RedirectKeys))
.Append(FormatForCsv(con.Inheritance.RedirectPorts))
.Append(FormatForCsv(con.Inheritance.RedirectPrinters))
.Append(FormatForCsv(con.Inheritance.RedirectSmartCards))
.Append(FormatForCsv(con.Inheritance.RedirectSound))
.Append(FormatForCsv(con.Inheritance.Resolution))
.Append(FormatForCsv(con.Inheritance.AutomaticResize))
.Append(FormatForCsv(con.Inheritance.UseConsoleSession))
.Append(FormatForCsv(con.Inheritance.UseCredSsp))
.Append(FormatForCsv(con.Inheritance.RenderingEngine))
.Append(FormatForCsv(con.Inheritance.Username))
.Append(FormatForCsv(con.Inheritance.ICAEncryptionStrength))
.Append(FormatForCsv(con.Inheritance.RDPAuthenticationLevel))
.Append(FormatForCsv(con.Inheritance.LoadBalanceInfo))
.Append(FormatForCsv(con.Inheritance.PreExtApp))
.Append(FormatForCsv(con.Inheritance.PostExtApp))
.Append(FormatForCsv(con.Inheritance.MacAddress))
.Append(FormatForCsv(con.Inheritance.UserField))
.Append(FormatForCsv(con.Inheritance.ExtApp))
.Append(FormatForCsv(con.Inheritance.VNCCompression))
.Append(FormatForCsv(con.Inheritance.VNCEncoding))
.Append(FormatForCsv(con.Inheritance.VNCAuthMode))
.Append(FormatForCsv(con.Inheritance.VNCProxyType))
.Append(FormatForCsv(con.Inheritance.VNCProxyIP))
.Append(FormatForCsv(con.Inheritance.VNCProxyPort))
.Append(FormatForCsv(con.Inheritance.VNCProxyUsername))
.Append(FormatForCsv(con.Inheritance.VNCProxyPassword))
.Append(FormatForCsv(con.Inheritance.VNCColors))
.Append(FormatForCsv(con.Inheritance.VNCSmartSizeMode))
.Append(FormatForCsv(con.Inheritance.VNCViewOnly))
.Append(FormatForCsv(con.Inheritance.RDGatewayUsageMethod))
.Append(FormatForCsv(con.Inheritance.RDGatewayHostname))
.Append(FormatForCsv(con.Inheritance.RDGatewayUseConnectionCredentials))
.Append(FormatForCsv(con.Inheritance.RDGatewayUsername))
.Append(FormatForCsv(con.Inheritance.RDGatewayPassword))
.Append(FormatForCsv(con.Inheritance.RDGatewayDomain))
.Append(FormatForCsv(con.Inheritance.RDPAlertIdleTimeout))
.Append(FormatForCsv(con.Inheritance.RDPMinutesToIdleTimeout))
.Append(FormatForCsv(con.Inheritance.SoundQuality));
}
private string FormatForCsv(object value)
{
var cleanedString = value.ToString().Replace(";", "");
return cleanedString + ";";
}
}
}

View File

@@ -5,8 +5,7 @@ using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Security;
namespace mRemoteNG.Config.Serializers
namespace mRemoteNG.Config.Serializers.Xml
{
// ReSharper disable once InconsistentNaming
public class XmlConnectionNodeSerializer26 : ISerializer<ConnectionInfo,XElement>
@@ -43,7 +42,7 @@ namespace mRemoteNG.Config.Serializers
element.Add(new XAttribute("Name", connectionInfo.Name));
element.Add(new XAttribute("Type", connectionInfo.GetTreeNodeType().ToString()));
if (nodeAsContainer != null)
element.Add(new XAttribute("Expanded", nodeAsContainer.IsExpanded.ToString()));
element.Add(new XAttribute("Expanded", nodeAsContainer.IsExpanded.ToString().ToLowerInvariant()));
element.Add(new XAttribute("Descr", connectionInfo.Description));
element.Add(new XAttribute("Icon", connectionInfo.Icon));
element.Add(new XAttribute("Panel", connectionInfo.Panel));
@@ -66,30 +65,30 @@ namespace mRemoteNG.Config.Serializers
element.Add(new XAttribute("Protocol", connectionInfo.Protocol));
element.Add(new XAttribute("PuttySession", connectionInfo.PuttySession));
element.Add(new XAttribute("Port", connectionInfo.Port));
element.Add(new XAttribute("ConnectToConsole", connectionInfo.UseConsoleSession.ToString()));
element.Add(new XAttribute("UseCredSsp", connectionInfo.UseCredSsp.ToString()));
element.Add(new XAttribute("ConnectToConsole", connectionInfo.UseConsoleSession.ToString().ToLowerInvariant()));
element.Add(new XAttribute("UseCredSsp", connectionInfo.UseCredSsp.ToString().ToLowerInvariant()));
element.Add(new XAttribute("RenderingEngine", connectionInfo.RenderingEngine));
element.Add(new XAttribute("ICAEncryptionStrength", connectionInfo.ICAEncryptionStrength));
element.Add(new XAttribute("RDPAuthenticationLevel", connectionInfo.RDPAuthenticationLevel));
element.Add(new XAttribute("RDPMinutesToIdleTimeout", connectionInfo.RDPMinutesToIdleTimeout));
element.Add(new XAttribute("RDPAlertIdleTimeout", connectionInfo.RDPAlertIdleTimeout));
element.Add(new XAttribute("RDPAlertIdleTimeout", connectionInfo.RDPAlertIdleTimeout.ToString().ToLowerInvariant()));
element.Add(new XAttribute("LoadBalanceInfo", connectionInfo.LoadBalanceInfo));
element.Add(new XAttribute("Colors", connectionInfo.Colors));
element.Add(new XAttribute("Resolution", connectionInfo.Resolution));
element.Add(new XAttribute("AutomaticResize", connectionInfo.AutomaticResize.ToString()));
element.Add(new XAttribute("DisplayWallpaper", connectionInfo.DisplayWallpaper.ToString()));
element.Add(new XAttribute("DisplayThemes", connectionInfo.DisplayThemes.ToString()));
element.Add(new XAttribute("EnableFontSmoothing", connectionInfo.EnableFontSmoothing.ToString()));
element.Add(new XAttribute("EnableDesktopComposition", connectionInfo.EnableDesktopComposition.ToString()));
element.Add(new XAttribute("CacheBitmaps", connectionInfo.CacheBitmaps.ToString()));
element.Add(new XAttribute("RedirectDiskDrives", connectionInfo.RedirectDiskDrives.ToString()));
element.Add(new XAttribute("RedirectPorts", connectionInfo.RedirectPorts.ToString()));
element.Add(new XAttribute("RedirectPrinters", connectionInfo.RedirectPrinters.ToString()));
element.Add(new XAttribute("RedirectSmartCards", connectionInfo.RedirectSmartCards.ToString()));
element.Add(new XAttribute("AutomaticResize", connectionInfo.AutomaticResize.ToString().ToLowerInvariant()));
element.Add(new XAttribute("DisplayWallpaper", connectionInfo.DisplayWallpaper.ToString().ToLowerInvariant()));
element.Add(new XAttribute("DisplayThemes", connectionInfo.DisplayThemes.ToString().ToLowerInvariant()));
element.Add(new XAttribute("EnableFontSmoothing", connectionInfo.EnableFontSmoothing.ToString().ToLowerInvariant()));
element.Add(new XAttribute("EnableDesktopComposition", connectionInfo.EnableDesktopComposition.ToString().ToLowerInvariant()));
element.Add(new XAttribute("CacheBitmaps", connectionInfo.CacheBitmaps.ToString().ToLowerInvariant()));
element.Add(new XAttribute("RedirectDiskDrives", connectionInfo.RedirectDiskDrives.ToString().ToLowerInvariant()));
element.Add(new XAttribute("RedirectPorts", connectionInfo.RedirectPorts.ToString().ToLowerInvariant()));
element.Add(new XAttribute("RedirectPrinters", connectionInfo.RedirectPrinters.ToString().ToLowerInvariant()));
element.Add(new XAttribute("RedirectSmartCards", connectionInfo.RedirectSmartCards.ToString().ToLowerInvariant()));
element.Add(new XAttribute("RedirectSound", connectionInfo.RedirectSound.ToString()));
element.Add(new XAttribute("SoundQuality", connectionInfo.SoundQuality.ToString()));
element.Add(new XAttribute("RedirectKeys", connectionInfo.RedirectKeys.ToString()));
element.Add(new XAttribute("Connected", (connectionInfo.OpenConnections.Count > 0).ToString()));
element.Add(new XAttribute("RedirectKeys", connectionInfo.RedirectKeys.ToString().ToLowerInvariant()));
element.Add(new XAttribute("Connected", (connectionInfo.OpenConnections.Count > 0).ToString().ToLowerInvariant()));
element.Add(new XAttribute("PreExtApp", connectionInfo.PreExtApp));
element.Add(new XAttribute("PostExtApp", connectionInfo.PostExtApp));
element.Add(new XAttribute("MacAddress", connectionInfo.MacAddress));
@@ -113,7 +112,7 @@ namespace mRemoteNG.Config.Serializers
element.Add(new XAttribute("VNCColors", connectionInfo.VNCColors));
element.Add(new XAttribute("VNCSmartSizeMode", connectionInfo.VNCSmartSizeMode));
element.Add(new XAttribute("VNCViewOnly", connectionInfo.VNCViewOnly.ToString()));
element.Add(new XAttribute("VNCViewOnly", connectionInfo.VNCViewOnly.ToString().ToLowerInvariant()));
element.Add(new XAttribute("RDGatewayUsageMethod", connectionInfo.RDGatewayUsageMethod));
element.Add(new XAttribute("RDGatewayHostname", connectionInfo.RDGatewayHostname));
element.Add(new XAttribute("RDGatewayUseConnectionCredentials", connectionInfo.RDGatewayUseConnectionCredentials));
@@ -136,117 +135,118 @@ namespace mRemoteNG.Config.Serializers
{
if (_saveFilter.SaveInheritance)
{
element.Add(new XAttribute("InheritCacheBitmaps", connectionInfo.Inheritance.CacheBitmaps.ToString()));
element.Add(new XAttribute("InheritColors", connectionInfo.Inheritance.Colors.ToString()));
element.Add(new XAttribute("InheritDescription", connectionInfo.Inheritance.Description.ToString()));
element.Add(new XAttribute("InheritDisplayThemes", connectionInfo.Inheritance.DisplayThemes.ToString()));
element.Add(new XAttribute("InheritDisplayWallpaper", connectionInfo.Inheritance.DisplayWallpaper.ToString()));
element.Add(new XAttribute("InheritEnableFontSmoothing", connectionInfo.Inheritance.EnableFontSmoothing.ToString()));
element.Add(new XAttribute("InheritEnableDesktopComposition", connectionInfo.Inheritance.EnableDesktopComposition.ToString()));
element.Add(new XAttribute("InheritDomain", connectionInfo.Inheritance.Domain.ToString()));
element.Add(new XAttribute("InheritIcon", connectionInfo.Inheritance.Icon.ToString()));
element.Add(new XAttribute("InheritPanel", connectionInfo.Inheritance.Panel.ToString()));
element.Add(new XAttribute("InheritPassword", connectionInfo.Inheritance.Password.ToString()));
element.Add(new XAttribute("InheritPort", connectionInfo.Inheritance.Port.ToString()));
element.Add(new XAttribute("InheritProtocol", connectionInfo.Inheritance.Protocol.ToString()));
element.Add(new XAttribute("InheritPuttySession", connectionInfo.Inheritance.PuttySession.ToString()));
element.Add(new XAttribute("InheritRedirectDiskDrives", connectionInfo.Inheritance.RedirectDiskDrives.ToString()));
element.Add(new XAttribute("InheritRedirectKeys", connectionInfo.Inheritance.RedirectKeys.ToString()));
element.Add(new XAttribute("InheritRedirectPorts", connectionInfo.Inheritance.RedirectPorts.ToString()));
element.Add(new XAttribute("InheritRedirectPrinters", connectionInfo.Inheritance.RedirectPrinters.ToString()));
element.Add(new XAttribute("InheritRedirectSmartCards", connectionInfo.Inheritance.RedirectSmartCards.ToString()));
element.Add(new XAttribute("InheritRedirectSound", connectionInfo.Inheritance.RedirectSound.ToString()));
element.Add(new XAttribute("InheritSoundQuality", connectionInfo.Inheritance.SoundQuality.ToString()));
element.Add(new XAttribute("InheritResolution", connectionInfo.Inheritance.Resolution.ToString()));
element.Add(new XAttribute("InheritAutomaticResize", connectionInfo.Inheritance.AutomaticResize.ToString()));
element.Add(new XAttribute("InheritUseConsoleSession", connectionInfo.Inheritance.UseConsoleSession.ToString()));
element.Add(new XAttribute("InheritUseCredSsp", connectionInfo.Inheritance.UseCredSsp.ToString()));
element.Add(new XAttribute("InheritRenderingEngine", connectionInfo.Inheritance.RenderingEngine.ToString()));
element.Add(new XAttribute("InheritUsername", connectionInfo.Inheritance.Username.ToString()));
element.Add(new XAttribute("InheritICAEncryptionStrength", connectionInfo.Inheritance.ICAEncryptionStrength.ToString()));
element.Add(new XAttribute("InheritRDPAuthenticationLevel", connectionInfo.Inheritance.RDPAuthenticationLevel.ToString()));
element.Add(new XAttribute("InheritRDPMinutesToIdleTimeout", connectionInfo.Inheritance.RDPMinutesToIdleTimeout.ToString()));
element.Add(new XAttribute("InheritRDPAlertIdleTimeout", connectionInfo.Inheritance.RDPAlertIdleTimeout.ToString()));
element.Add(new XAttribute("InheritLoadBalanceInfo", connectionInfo.Inheritance.LoadBalanceInfo.ToString()));
element.Add(new XAttribute("InheritPreExtApp", connectionInfo.Inheritance.PreExtApp.ToString()));
element.Add(new XAttribute("InheritPostExtApp", connectionInfo.Inheritance.PostExtApp.ToString()));
element.Add(new XAttribute("InheritMacAddress", connectionInfo.Inheritance.MacAddress.ToString()));
element.Add(new XAttribute("InheritUserField", connectionInfo.Inheritance.UserField.ToString()));
element.Add(new XAttribute("InheritExtApp", connectionInfo.Inheritance.ExtApp.ToString()));
element.Add(new XAttribute("InheritVNCCompression", connectionInfo.Inheritance.VNCCompression.ToString()));
element.Add(new XAttribute("InheritVNCEncoding", connectionInfo.Inheritance.VNCEncoding.ToString()));
element.Add(new XAttribute("InheritVNCAuthMode", connectionInfo.Inheritance.VNCAuthMode.ToString()));
element.Add(new XAttribute("InheritVNCProxyType", connectionInfo.Inheritance.VNCProxyType.ToString()));
element.Add(new XAttribute("InheritVNCProxyIP", connectionInfo.Inheritance.VNCProxyIP.ToString()));
element.Add(new XAttribute("InheritVNCProxyPort", connectionInfo.Inheritance.VNCProxyPort.ToString()));
element.Add(new XAttribute("InheritVNCProxyUsername", connectionInfo.Inheritance.VNCProxyUsername.ToString()));
element.Add(new XAttribute("InheritVNCProxyPassword", connectionInfo.Inheritance.VNCProxyPassword.ToString()));
element.Add(new XAttribute("InheritVNCColors", connectionInfo.Inheritance.VNCColors.ToString()));
element.Add(new XAttribute("InheritVNCSmartSizeMode", connectionInfo.Inheritance.VNCSmartSizeMode.ToString()));
element.Add(new XAttribute("InheritVNCViewOnly", connectionInfo.Inheritance.VNCViewOnly.ToString()));
element.Add(new XAttribute("InheritRDGatewayUsageMethod", connectionInfo.Inheritance.RDGatewayUsageMethod.ToString()));
element.Add(new XAttribute("InheritRDGatewayHostname", connectionInfo.Inheritance.RDGatewayHostname.ToString()));
element.Add(new XAttribute("InheritRDGatewayUseConnectionCredentials", connectionInfo.Inheritance.RDGatewayUseConnectionCredentials.ToString()));
element.Add(new XAttribute("InheritRDGatewayUsername", connectionInfo.Inheritance.RDGatewayUsername.ToString()));
element.Add(new XAttribute("InheritRDGatewayPassword", connectionInfo.Inheritance.RDGatewayPassword.ToString()));
element.Add(new XAttribute("InheritRDGatewayDomain", connectionInfo.Inheritance.RDGatewayDomain.ToString()));
element.Add(new XAttribute("InheritCacheBitmaps", connectionInfo.Inheritance.CacheBitmaps.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritColors", connectionInfo.Inheritance.Colors.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritDescription", connectionInfo.Inheritance.Description.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritDisplayThemes", connectionInfo.Inheritance.DisplayThemes.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritDisplayWallpaper", connectionInfo.Inheritance.DisplayWallpaper.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritEnableFontSmoothing", connectionInfo.Inheritance.EnableFontSmoothing.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritEnableDesktopComposition", connectionInfo.Inheritance.EnableDesktopComposition.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritDomain", connectionInfo.Inheritance.Domain.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritIcon", connectionInfo.Inheritance.Icon.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritPanel", connectionInfo.Inheritance.Panel.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritPassword", connectionInfo.Inheritance.Password.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritPort", connectionInfo.Inheritance.Port.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritProtocol", connectionInfo.Inheritance.Protocol.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritPuttySession", connectionInfo.Inheritance.PuttySession.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRedirectDiskDrives", connectionInfo.Inheritance.RedirectDiskDrives.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRedirectKeys", connectionInfo.Inheritance.RedirectKeys.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRedirectPorts", connectionInfo.Inheritance.RedirectPorts.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRedirectPrinters", connectionInfo.Inheritance.RedirectPrinters.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRedirectSmartCards", connectionInfo.Inheritance.RedirectSmartCards.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRedirectSound", connectionInfo.Inheritance.RedirectSound.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritSoundQuality", connectionInfo.Inheritance.SoundQuality.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritResolution", connectionInfo.Inheritance.Resolution.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritAutomaticResize", connectionInfo.Inheritance.AutomaticResize.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritUseConsoleSession", connectionInfo.Inheritance.UseConsoleSession.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritUseCredSsp", connectionInfo.Inheritance.UseCredSsp.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRenderingEngine", connectionInfo.Inheritance.RenderingEngine.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritUsername", connectionInfo.Inheritance.Username.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritICAEncryptionStrength", connectionInfo.Inheritance.ICAEncryptionStrength.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRDPAuthenticationLevel", connectionInfo.Inheritance.RDPAuthenticationLevel.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRDPMinutesToIdleTimeout", connectionInfo.Inheritance.RDPMinutesToIdleTimeout.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRDPAlertIdleTimeout", connectionInfo.Inheritance.RDPAlertIdleTimeout.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritLoadBalanceInfo", connectionInfo.Inheritance.LoadBalanceInfo.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritPreExtApp", connectionInfo.Inheritance.PreExtApp.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritPostExtApp", connectionInfo.Inheritance.PostExtApp.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritMacAddress", connectionInfo.Inheritance.MacAddress.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritUserField", connectionInfo.Inheritance.UserField.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritExtApp", connectionInfo.Inheritance.ExtApp.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritVNCCompression", connectionInfo.Inheritance.VNCCompression.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritVNCEncoding", connectionInfo.Inheritance.VNCEncoding.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritVNCAuthMode", connectionInfo.Inheritance.VNCAuthMode.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritVNCProxyType", connectionInfo.Inheritance.VNCProxyType.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritVNCProxyIP", connectionInfo.Inheritance.VNCProxyIP.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritVNCProxyPort", connectionInfo.Inheritance.VNCProxyPort.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritVNCProxyUsername", connectionInfo.Inheritance.VNCProxyUsername.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritVNCProxyPassword", connectionInfo.Inheritance.VNCProxyPassword.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritVNCColors", connectionInfo.Inheritance.VNCColors.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritVNCSmartSizeMode", connectionInfo.Inheritance.VNCSmartSizeMode.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritVNCViewOnly", connectionInfo.Inheritance.VNCViewOnly.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRDGatewayUsageMethod", connectionInfo.Inheritance.RDGatewayUsageMethod.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRDGatewayHostname", connectionInfo.Inheritance.RDGatewayHostname.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRDGatewayUseConnectionCredentials", connectionInfo.Inheritance.RDGatewayUseConnectionCredentials.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRDGatewayUsername", connectionInfo.Inheritance.RDGatewayUsername.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRDGatewayPassword", connectionInfo.Inheritance.RDGatewayPassword.ToString().ToLowerInvariant()));
element.Add(new XAttribute("InheritRDGatewayDomain", connectionInfo.Inheritance.RDGatewayDomain.ToString().ToLowerInvariant()));
}
else
{
element.Add(new XAttribute("InheritCacheBitmaps", false.ToString()));
element.Add(new XAttribute("InheritColors", false.ToString()));
element.Add(new XAttribute("InheritDescription", false.ToString()));
element.Add(new XAttribute("InheritDisplayThemes", false.ToString()));
element.Add(new XAttribute("InheritDisplayWallpaper", false.ToString()));
element.Add(new XAttribute("InheritEnableFontSmoothing", false.ToString()));
element.Add(new XAttribute("InheritEnableDesktopComposition", false.ToString()));
element.Add(new XAttribute("InheritDomain", false.ToString()));
element.Add(new XAttribute("InheritIcon", false.ToString()));
element.Add(new XAttribute("InheritPanel", false.ToString()));
element.Add(new XAttribute("InheritPassword", false.ToString()));
element.Add(new XAttribute("InheritPort", false.ToString()));
element.Add(new XAttribute("InheritProtocol", false.ToString()));
element.Add(new XAttribute("InheritPuttySession", false.ToString()));
element.Add(new XAttribute("InheritRedirectDiskDrives", false.ToString()));
element.Add(new XAttribute("InheritRedirectKeys", false.ToString()));
element.Add(new XAttribute("InheritRedirectPorts", false.ToString()));
element.Add(new XAttribute("InheritRedirectPrinters", false.ToString()));
element.Add(new XAttribute("InheritRedirectSmartCards", false.ToString()));
element.Add(new XAttribute("InheritRedirectSound", false.ToString()));
element.Add(new XAttribute("InheritSoundQuality", false.ToString()));
element.Add(new XAttribute("InheritResolution", false.ToString()));
element.Add(new XAttribute("InheritAutomaticResize", false.ToString()));
element.Add(new XAttribute("InheritUseConsoleSession", false.ToString()));
element.Add(new XAttribute("InheritUseCredSsp", false.ToString()));
element.Add(new XAttribute("InheritRenderingEngine", false.ToString()));
element.Add(new XAttribute("InheritUsername", false.ToString()));
element.Add(new XAttribute("InheritICAEncryptionStrength", false.ToString()));
element.Add(new XAttribute("InheritRDPAuthenticationLevel", false.ToString()));
element.Add(new XAttribute("InheritRDPMinutesToIdleTimeout", false.ToString()));
element.Add(new XAttribute("InheritRDPAlertIdleTimeout", false.ToString()));
element.Add(new XAttribute("InheritLoadBalanceInfo", false.ToString()));
element.Add(new XAttribute("InheritPreExtApp", false.ToString()));
element.Add(new XAttribute("InheritPostExtApp", false.ToString()));
element.Add(new XAttribute("InheritMacAddress", false.ToString()));
element.Add(new XAttribute("InheritUserField", false.ToString()));
element.Add(new XAttribute("InheritExtApp", false.ToString()));
element.Add(new XAttribute("InheritVNCCompression", false.ToString()));
element.Add(new XAttribute("InheritVNCEncoding", false.ToString()));
element.Add(new XAttribute("InheritVNCAuthMode", false.ToString()));
element.Add(new XAttribute("InheritVNCProxyType", false.ToString()));
element.Add(new XAttribute("InheritVNCProxyIP", false.ToString()));
element.Add(new XAttribute("InheritVNCProxyPort", false.ToString()));
element.Add(new XAttribute("InheritVNCProxyUsername", false.ToString()));
element.Add(new XAttribute("InheritVNCProxyPassword", false.ToString()));
element.Add(new XAttribute("InheritVNCColors", false.ToString()));
element.Add(new XAttribute("InheritVNCSmartSizeMode", false.ToString()));
element.Add(new XAttribute("InheritVNCViewOnly", false.ToString()));
element.Add(new XAttribute("InheritRDGatewayUsageMethod", false.ToString()));
element.Add(new XAttribute("InheritRDGatewayHostname", false.ToString()));
element.Add(new XAttribute("InheritRDGatewayUseConnectionCredentials", false.ToString()));
element.Add(new XAttribute("InheritRDGatewayUsername", false.ToString()));
element.Add(new XAttribute("InheritRDGatewayPassword", false.ToString()));
element.Add(new XAttribute("InheritRDGatewayDomain", false.ToString()));
var falseString = false.ToString().ToLowerInvariant();
element.Add(new XAttribute("InheritCacheBitmaps", falseString));
element.Add(new XAttribute("InheritColors", falseString));
element.Add(new XAttribute("InheritDescription", falseString));
element.Add(new XAttribute("InheritDisplayThemes", falseString));
element.Add(new XAttribute("InheritDisplayWallpaper", falseString));
element.Add(new XAttribute("InheritEnableFontSmoothing", falseString));
element.Add(new XAttribute("InheritEnableDesktopComposition", falseString));
element.Add(new XAttribute("InheritDomain", falseString));
element.Add(new XAttribute("InheritIcon", falseString));
element.Add(new XAttribute("InheritPanel", falseString));
element.Add(new XAttribute("InheritPassword", falseString));
element.Add(new XAttribute("InheritPort", falseString));
element.Add(new XAttribute("InheritProtocol", falseString));
element.Add(new XAttribute("InheritPuttySession", falseString));
element.Add(new XAttribute("InheritRedirectDiskDrives", falseString));
element.Add(new XAttribute("InheritRedirectKeys", falseString));
element.Add(new XAttribute("InheritRedirectPorts", falseString));
element.Add(new XAttribute("InheritRedirectPrinters", falseString));
element.Add(new XAttribute("InheritRedirectSmartCards", falseString));
element.Add(new XAttribute("InheritRedirectSound", falseString));
element.Add(new XAttribute("InheritSoundQuality", falseString));
element.Add(new XAttribute("InheritResolution", falseString));
element.Add(new XAttribute("InheritAutomaticResize", falseString));
element.Add(new XAttribute("InheritUseConsoleSession", falseString));
element.Add(new XAttribute("InheritUseCredSsp", falseString));
element.Add(new XAttribute("InheritRenderingEngine", falseString));
element.Add(new XAttribute("InheritUsername", falseString));
element.Add(new XAttribute("InheritICAEncryptionStrength", falseString));
element.Add(new XAttribute("InheritRDPAuthenticationLevel", falseString));
element.Add(new XAttribute("InheritRDPMinutesToIdleTimeout", falseString));
element.Add(new XAttribute("InheritRDPAlertIdleTimeout", falseString));
element.Add(new XAttribute("InheritLoadBalanceInfo", falseString));
element.Add(new XAttribute("InheritPreExtApp", falseString));
element.Add(new XAttribute("InheritPostExtApp", falseString));
element.Add(new XAttribute("InheritMacAddress", falseString));
element.Add(new XAttribute("InheritUserField", falseString));
element.Add(new XAttribute("InheritExtApp", falseString));
element.Add(new XAttribute("InheritVNCCompression", falseString));
element.Add(new XAttribute("InheritVNCEncoding", falseString));
element.Add(new XAttribute("InheritVNCAuthMode", falseString));
element.Add(new XAttribute("InheritVNCProxyType", falseString));
element.Add(new XAttribute("InheritVNCProxyIP", falseString));
element.Add(new XAttribute("InheritVNCProxyPort", falseString));
element.Add(new XAttribute("InheritVNCProxyUsername", falseString));
element.Add(new XAttribute("InheritVNCProxyPassword", falseString));
element.Add(new XAttribute("InheritVNCColors", falseString));
element.Add(new XAttribute("InheritVNCSmartSizeMode", falseString));
element.Add(new XAttribute("InheritVNCViewOnly", falseString));
element.Add(new XAttribute("InheritRDGatewayUsageMethod", falseString));
element.Add(new XAttribute("InheritRDGatewayHostname", falseString));
element.Add(new XAttribute("InheritRDGatewayUseConnectionCredentials", falseString));
element.Add(new XAttribute("InheritRDGatewayUsername", falseString));
element.Add(new XAttribute("InheritRDGatewayPassword", falseString));
element.Add(new XAttribute("InheritRDGatewayDomain", falseString));
}
}
}

View File

@@ -13,13 +13,12 @@ using mRemoteNG.Connection.Protocol.VNC;
using mRemoteNG.Container;
using mRemoteNG.Messages;
using mRemoteNG.Security;
using mRemoteNG.Tools;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNG.UI.Forms;
using mRemoteNG.UI.TaskDialog;
namespace mRemoteNG.Config.Serializers
namespace mRemoteNG.Config.Serializers.Xml
{
public class XmlConnectionsDeserializer : IDeserializer<string, ConnectionTreeModel>
{
@@ -71,7 +70,8 @@ namespace mRemoteNG.Config.Serializers
if (_confVersion >= 2.6)
{
if (rootXmlElement?.Attributes["FullFileEncryption"].Value == "True")
var fullFileEncryptionValue = rootXmlElement?.Attributes["FullFileEncryption"].Value ?? "";
if (bool.Parse(fullFileEncryptionValue))
{
var decryptedContent = _decryptor.Decrypt(rootXmlElement.InnerText);
rootXmlElement.InnerXml = decryptedContent;
@@ -143,10 +143,10 @@ namespace mRemoteNG.Config.Serializers
if (_confVersion >= 2.6)
{
BlockCipherEngines engine;
Enum.TryParse(connectionsRootElement?.Attributes["EncryptionEngine"].Value, out engine);
Enum.TryParse(connectionsRootElement?.Attributes["EncryptionEngine"].Value, true, out engine);
BlockCipherModes mode;
Enum.TryParse(connectionsRootElement?.Attributes["BlockCipherMode"].Value, out mode);
Enum.TryParse(connectionsRootElement?.Attributes["BlockCipherMode"].Value, true, out mode);
int keyDerivationIterations;
int.TryParse(connectionsRootElement?.Attributes["KdfIterations"].Value, out keyDerivationIterations);
@@ -186,7 +186,10 @@ namespace mRemoteNG.Config.Serializers
if (_confVersion >= 0.9)
containerInfo.CopyFrom(GetConnectionInfoFromXml(xmlNode));
if (_confVersion >= 0.8)
containerInfo.IsExpanded = xmlNode.Attributes?["Expanded"].Value == "True";
{
var expandedValue = xmlNode.Attributes?["Expanded"].Value ?? "";
containerInfo.IsExpanded = bool.Parse(expandedValue);
}
parentContainer.AddChild(containerInfo);
AddNodesFromXmlRecursive(xmlNode, containerInfo);
@@ -204,7 +207,9 @@ namespace mRemoteNG.Config.Serializers
private ConnectionInfo GetConnectionInfoFromXml(XmlNode xmlnode)
{
if (xmlnode.Attributes == null) return null;
var connectionInfo = new ConnectionInfo();
var connectionId = xmlnode.Attributes["Id"]?.Value ?? Guid.NewGuid().ToString();
var connectionInfo = new ConnectionInfo(connectionId);
try
{
@@ -219,7 +224,9 @@ namespace mRemoteNG.Config.Serializers
if (_confVersion < 1.1) //1.0 - 0.1
{
connectionInfo.Resolution = Convert.ToBoolean(xmlnode.Attributes["Fullscreen"].Value) ? RdpProtocol.RDPResolutions.Fullscreen : RdpProtocol.RDPResolutions.FitToWindow;
connectionInfo.Resolution = Convert.ToBoolean(xmlnode.Attributes["Fullscreen"].Value)
? RdpProtocol.RDPResolutions.Fullscreen
: RdpProtocol.RDPResolutions.FitToWindow;
}
if (_confVersion <= 2.6) // 0.2 - 2.6
@@ -257,7 +264,9 @@ namespace mRemoteNG.Config.Serializers
{
if (_confVersion < 0.7)
{
connectionInfo.Port = Convert.ToInt32(Convert.ToBoolean(xmlnode.Attributes["UseVNC"].Value) ? xmlnode.Attributes["VNCPort"].Value : xmlnode.Attributes["RDPPort"].Value);
connectionInfo.Port = Convert.ToInt32(Convert.ToBoolean(xmlnode.Attributes["UseVNC"].Value)
? xmlnode.Attributes["VNCPort"].Value
: xmlnode.Attributes["RDPPort"].Value);
}
connectionInfo.UseConsoleSession = bool.Parse(xmlnode.Attributes["ConnectToConsole"].Value);
@@ -291,7 +300,9 @@ namespace mRemoteNG.Config.Serializers
if (_confVersion >= 0.7)
{
connectionInfo.Protocol = (ProtocolType)MiscTools.StringToEnum(typeof(ProtocolType), xmlnode.Attributes["Protocol"].Value);
ProtocolType protocolType;
Enum.TryParse(xmlnode.Attributes["Protocol"].Value, true, out protocolType);
connectionInfo.Protocol = protocolType;
connectionInfo.Port = Convert.ToInt32(xmlnode.Attributes["Port"].Value);
}
@@ -307,9 +318,9 @@ namespace mRemoteNG.Config.Serializers
if (_confVersion >= 1.3)
{
connectionInfo.Colors = (RdpProtocol.RDPColors)MiscTools.StringToEnum(typeof(RdpProtocol.RDPColors), xmlnode.Attributes["Colors"].Value);
connectionInfo.Resolution = (RdpProtocol.RDPResolutions)MiscTools.StringToEnum(typeof(RdpProtocol.RDPResolutions), Convert.ToString(xmlnode.Attributes["Resolution"].Value));
connectionInfo.RedirectSound = (RdpProtocol.RDPSounds)MiscTools.StringToEnum(typeof(RdpProtocol.RDPSounds), Convert.ToString(xmlnode.Attributes["RedirectSound"].Value));
connectionInfo.Colors = (RdpProtocol.RDPColors)Enum.Parse(typeof(RdpProtocol.RDPColors), xmlnode.Attributes["Colors"].Value, true);
connectionInfo.Resolution = (RdpProtocol.RDPResolutions)Enum.Parse(typeof(RdpProtocol.RDPResolutions), xmlnode.Attributes["Resolution"].Value, true);
connectionInfo.RedirectSound = (RdpProtocol.RDPSounds)Enum.Parse(typeof(RdpProtocol.RDPSounds), xmlnode.Attributes["RedirectSound"].Value, true);
}
else
{
@@ -385,7 +396,7 @@ namespace mRemoteNG.Config.Serializers
if (_confVersion >= 1.6)
{
connectionInfo.ICAEncryptionStrength = (IcaProtocol.EncryptionStrength)MiscTools.StringToEnum(typeof(IcaProtocol.EncryptionStrength), xmlnode.Attributes["ICAEncryptionStrength"].Value);
connectionInfo.ICAEncryptionStrength = (IcaProtocol.EncryptionStrength)Enum.Parse(typeof(IcaProtocol.EncryptionStrength), xmlnode.Attributes["ICAEncryptionStrength"].Value, true);
connectionInfo.Inheritance.ICAEncryptionStrength = bool.Parse(xmlnode.Attributes["InheritICAEncryptionStrength"].Value);
connectionInfo.PreExtApp = xmlnode.Attributes["PreExtApp"].Value;
connectionInfo.PostExtApp = xmlnode.Attributes["PostExtApp"].Value;
@@ -395,16 +406,16 @@ namespace mRemoteNG.Config.Serializers
if (_confVersion >= 1.7)
{
connectionInfo.VNCCompression = (ProtocolVNC.Compression)MiscTools.StringToEnum(typeof(ProtocolVNC.Compression), xmlnode.Attributes["VNCCompression"].Value);
connectionInfo.VNCEncoding = (ProtocolVNC.Encoding)MiscTools.StringToEnum(typeof(ProtocolVNC.Encoding), Convert.ToString(xmlnode.Attributes["VNCEncoding"].Value));
connectionInfo.VNCAuthMode = (ProtocolVNC.AuthMode)MiscTools.StringToEnum(typeof(ProtocolVNC.AuthMode), xmlnode.Attributes["VNCAuthMode"].Value);
connectionInfo.VNCProxyType = (ProtocolVNC.ProxyType)MiscTools.StringToEnum(typeof(ProtocolVNC.ProxyType), xmlnode.Attributes["VNCProxyType"].Value);
connectionInfo.VNCCompression = (ProtocolVNC.Compression)Enum.Parse(typeof(ProtocolVNC.Compression), xmlnode.Attributes["VNCCompression"].Value, true);
connectionInfo.VNCEncoding = (ProtocolVNC.Encoding)Enum.Parse(typeof(ProtocolVNC.Encoding), xmlnode.Attributes["VNCEncoding"].Value, true);
connectionInfo.VNCAuthMode = (ProtocolVNC.AuthMode)Enum.Parse(typeof(ProtocolVNC.AuthMode), xmlnode.Attributes["VNCAuthMode"].Value, true);
connectionInfo.VNCProxyType = (ProtocolVNC.ProxyType)Enum.Parse(typeof(ProtocolVNC.ProxyType), xmlnode.Attributes["VNCProxyType"].Value, true);
connectionInfo.VNCProxyIP = xmlnode.Attributes["VNCProxyIP"].Value;
connectionInfo.VNCProxyPort = Convert.ToInt32(xmlnode.Attributes["VNCProxyPort"].Value);
connectionInfo.VNCProxyUsername = xmlnode.Attributes["VNCProxyUsername"].Value;
connectionInfo.VNCProxyPassword = _decryptor.Decrypt(xmlnode.Attributes["VNCProxyPassword"].Value);
connectionInfo.VNCColors = (ProtocolVNC.Colors)MiscTools.StringToEnum(typeof(ProtocolVNC.Colors), xmlnode.Attributes["VNCColors"].Value);
connectionInfo.VNCSmartSizeMode = (ProtocolVNC.SmartSizeMode)MiscTools.StringToEnum(typeof(ProtocolVNC.SmartSizeMode), xmlnode.Attributes["VNCSmartSizeMode"].Value);
connectionInfo.VNCColors = (ProtocolVNC.Colors)Enum.Parse(typeof(ProtocolVNC.Colors), xmlnode.Attributes["VNCColors"].Value, true);
connectionInfo.VNCSmartSizeMode = (ProtocolVNC.SmartSizeMode)Enum.Parse(typeof(ProtocolVNC.SmartSizeMode), xmlnode.Attributes["VNCSmartSizeMode"].Value, true);
connectionInfo.VNCViewOnly = bool.Parse(xmlnode.Attributes["VNCViewOnly"].Value);
connectionInfo.Inheritance.VNCCompression = bool.Parse(xmlnode.Attributes["InheritVNCCompression"].Value);
connectionInfo.Inheritance.VNCEncoding = bool.Parse(xmlnode.Attributes["InheritVNCEncoding"].Value);
@@ -421,13 +432,13 @@ namespace mRemoteNG.Config.Serializers
if (_confVersion >= 1.8)
{
connectionInfo.RDPAuthenticationLevel = (RdpProtocol.AuthenticationLevel)MiscTools.StringToEnum(typeof(RdpProtocol.AuthenticationLevel), xmlnode.Attributes["RDPAuthenticationLevel"].Value);
connectionInfo.RDPAuthenticationLevel = (RdpProtocol.AuthenticationLevel)Enum.Parse(typeof(RdpProtocol.AuthenticationLevel), xmlnode.Attributes["RDPAuthenticationLevel"].Value, true);
connectionInfo.Inheritance.RDPAuthenticationLevel = bool.Parse(xmlnode.Attributes["InheritRDPAuthenticationLevel"].Value);
}
if (_confVersion >= 1.9)
{
connectionInfo.RenderingEngine = (HTTPBase.RenderingEngine)MiscTools.StringToEnum(typeof(HTTPBase.RenderingEngine), xmlnode.Attributes["RenderingEngine"].Value);
connectionInfo.RenderingEngine = (HTTPBase.RenderingEngine)Enum.Parse(typeof(HTTPBase.RenderingEngine), xmlnode.Attributes["RenderingEngine"].Value, true);
connectionInfo.MacAddress = xmlnode.Attributes["MacAddress"].Value;
connectionInfo.Inheritance.RenderingEngine = bool.Parse(xmlnode.Attributes["InheritRenderingEngine"].Value);
connectionInfo.Inheritance.MacAddress = bool.Parse(xmlnode.Attributes["InheritMacAddress"].Value);
@@ -448,9 +459,9 @@ namespace mRemoteNG.Config.Serializers
if (_confVersion >= 2.2)
{
// Get settings
connectionInfo.RDGatewayUsageMethod = (RdpProtocol.RDGatewayUsageMethod)MiscTools.StringToEnum(typeof(RdpProtocol.RDGatewayUsageMethod), Convert.ToString(xmlnode.Attributes["RDGatewayUsageMethod"].Value));
connectionInfo.RDGatewayUsageMethod = (RdpProtocol.RDGatewayUsageMethod)Enum.Parse(typeof(RdpProtocol.RDGatewayUsageMethod), xmlnode.Attributes["RDGatewayUsageMethod"].Value, true);
connectionInfo.RDGatewayHostname = xmlnode.Attributes["RDGatewayHostname"].Value;
connectionInfo.RDGatewayUseConnectionCredentials = (RdpProtocol.RDGatewayUseConnectionCredentials)MiscTools.StringToEnum(typeof(RdpProtocol.RDGatewayUseConnectionCredentials), Convert.ToString(xmlnode.Attributes["RDGatewayUseConnectionCredentials"].Value));
connectionInfo.RDGatewayUseConnectionCredentials = (RdpProtocol.RDGatewayUseConnectionCredentials)Enum.Parse(typeof(RdpProtocol.RDGatewayUseConnectionCredentials), xmlnode.Attributes["RDGatewayUseConnectionCredentials"].Value, true);
connectionInfo.RDGatewayUsername = xmlnode.Attributes["RDGatewayUsername"].Value;
connectionInfo.RDGatewayPassword = _decryptor.Decrypt(Convert.ToString(xmlnode.Attributes["RDGatewayPassword"].Value));
connectionInfo.RDGatewayDomain = xmlnode.Attributes["RDGatewayDomain"].Value;
@@ -491,8 +502,7 @@ namespace mRemoteNG.Config.Serializers
if (_confVersion >= 2.6)
{
connectionInfo.ConstantID = xmlnode.Attributes["Id"]?.Value ?? connectionInfo.ConstantID;
connectionInfo.SoundQuality = (RdpProtocol.RDPSoundQuality)MiscTools.StringToEnum(typeof(RdpProtocol.RDPSoundQuality), Convert.ToString(xmlnode.Attributes["SoundQuality"].Value));
connectionInfo.SoundQuality = (RdpProtocol.RDPSoundQuality)Enum.Parse(typeof(RdpProtocol.RDPSoundQuality), xmlnode.Attributes["SoundQuality"].Value, true);
connectionInfo.Inheritance.SoundQuality = bool.Parse(xmlnode.Attributes["InheritSoundQuality"].Value);
connectionInfo.RDPMinutesToIdleTimeout = Convert.ToInt32(xmlnode.Attributes["RDPMinutesToIdleTimeout"]?.Value ?? "0");
connectionInfo.Inheritance.RDPMinutesToIdleTimeout = bool.Parse(xmlnode.Attributes["InheritRDPMinutesToIdleTimeout"]?.Value ?? "False");

View File

@@ -8,8 +8,7 @@ using mRemoteNG.Security;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
namespace mRemoteNG.Config.Serializers
namespace mRemoteNG.Config.Serializers.Xml
{
public class XmlConnectionsDocumentCompiler
{

View File

@@ -2,8 +2,7 @@
using System.Xml.Linq;
using mRemoteNG.Security;
namespace mRemoteNG.Config.Serializers
namespace mRemoteNG.Config.Serializers.Xml
{
public class XmlConnectionsDocumentEncryptor
{

View File

@@ -10,7 +10,7 @@ using mRemoteNG.Security;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
namespace mRemoteNG.Config.Serializers
namespace mRemoteNG.Config.Serializers.Xml
{
public class XmlConnectionsSerializer : ISerializer<ConnectionTreeModel,string>, ISerializer<ConnectionInfo, string>
{

View File

@@ -2,19 +2,21 @@
using mRemoteNG.Security;
using mRemoteNG.Tree.Root;
namespace mRemoteNG.Config.Serializers
namespace mRemoteNG.Config.Serializers.Xml
{
public class XmlRootNodeSerializer
public class XmlRootNodeSerializer
{
public XElement SerializeRootNodeInfo(RootNodeInfo rootNodeInfo, ICryptographyProvider cryptographyProvider, bool fullFileEncryption = false)
{
var element = new XElement("Connections");
XNamespace xmlNamespace = "http://mremoteng.org";
var element = new XElement(xmlNamespace + "Connections");
element.Add(new XAttribute(XNamespace.Xmlns+"mrng", xmlNamespace));
element.Add(new XAttribute(XName.Get("Name"), rootNodeInfo.Name));
element.Add(new XAttribute(XName.Get("EncryptionEngine"), cryptographyProvider.CipherEngine));
element.Add(new XAttribute(XName.Get("Export"), "false"));
element.Add(new XAttribute(XName.Get("EncryptionEngine"), cryptographyProvider.CipherEngine));
element.Add(new XAttribute(XName.Get("BlockCipherMode"), cryptographyProvider.CipherMode));
element.Add(new XAttribute(XName.Get("KdfIterations"), cryptographyProvider.KeyDerivationIterations));
element.Add(new XAttribute(XName.Get("FullFileEncryption"), fullFileEncryption.ToString()));
element.Add(new XAttribute(XName.Get("FullFileEncryption"), fullFileEncryption.ToString().ToLowerInvariant()));
element.Add(CreateProtectedAttribute(rootNodeInfo, cryptographyProvider));
element.Add(new XAttribute(XName.Get("ConfVersion"), "2.6"));
return element;

View File

@@ -15,7 +15,7 @@ using mRemoteNG.Tree.Root;
namespace mRemoteNG.Config.Serializers
{
public class DataTableDeserializer : IDeserializer<DataTable, ConnectionTreeModel>
public class DataTableDeserializer : IDeserializer<DataTable, ConnectionTreeModel>
{
public ConnectionTreeModel Deserialize(DataTable table)
{
@@ -46,14 +46,16 @@ namespace mRemoteNG.Config.Serializers
private ConnectionInfo DeserializeConnectionInfo(DataRow row)
{
var connectionInfo = new ConnectionInfo();
var connectionId = row["ConstantID"] as string ?? Guid.NewGuid().ToString();
var connectionInfo = new ConnectionInfo(connectionId);
PopulateConnectionInfoFromDatarow(row, connectionInfo);
return connectionInfo;
}
private ContainerInfo DeserializeContainerInfo(DataRow row)
{
var containerInfo = new ContainerInfo();
var containerId = row["ConstantID"] as string ?? Guid.NewGuid().ToString();
var containerInfo = new ContainerInfo(containerId);
PopulateConnectionInfoFromDatarow(row, containerInfo);
return containerInfo;
}
@@ -61,7 +63,6 @@ namespace mRemoteNG.Config.Serializers
private void PopulateConnectionInfoFromDatarow(DataRow dataRow, ConnectionInfo connectionInfo)
{
connectionInfo.Name = (string)dataRow["Name"];
connectionInfo.ConstantID = (string)dataRow["ConstantID"];
// This throws a NPE - Parent is a connectionInfo object which will be null at this point.
// The Parent object is linked properly later in CreateNodeHierarchy()
@@ -187,7 +188,7 @@ namespace mRemoteNG.Config.Serializers
private ConnectionTreeModel CreateNodeHierarchy(List<ConnectionInfo> connectionList, DataTable dataTable)
{
var connectionTreeModel = new ConnectionTreeModel();
var rootNode = new RootNodeInfo(RootNodeType.Connection) {ConstantID = "0"};
var rootNode = new RootNodeInfo(RootNodeType.Connection, "0");
connectionTreeModel.AddRootNode(rootNode);
foreach (DataRow row in dataTable.Rows)

View File

@@ -5,6 +5,7 @@ using mRemoteNG.App;
using mRemoteNG.Config.Import;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Tools;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
@@ -14,12 +15,12 @@ namespace mRemoteNG.Config.Serializers
public class ActiveDirectoryDeserializer
{
private readonly string _ldapPath;
private readonly bool _importSubOU;
private readonly bool _importSubOu;
public ActiveDirectoryDeserializer(string ldapPath, bool importSubOU)
public ActiveDirectoryDeserializer(string ldapPath, bool importSubOu)
{
_ldapPath = ldapPath;
_importSubOU = importSubOU;
_ldapPath = ldapPath.ThrowIfNullOrEmpty(nameof(ldapPath));
_importSubOu = importSubOu;
}
public ConnectionTreeModel Deserialize()
@@ -64,9 +65,10 @@ namespace mRemoteNG.Config.Serializers
if (directoryEntry.Properties["objectClass"].Contains("organizationalUnit"))
{
// check/continue here so we don't create empty connection objects
if(!_importSubOU) continue;
if(!_importSubOu) continue;
ActiveDirectoryImporter.Import(ldapResult.Path, parentContainer, _importSubOU);
// TODO - this is a circular call. A deserializer should not call an importer
ActiveDirectoryImporter.Import(ldapResult.Path, parentContainer, _importSubOu);
continue;
}

View File

@@ -1,221 +0,0 @@
using System;
using System.Linq;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Credential;
using mRemoteNG.Security;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
namespace mRemoteNG.Config.Serializers
{
public class CsvConnectionsSerializerMremotengFormat : ISerializer<ConnectionInfo,string>
{
private string _csv = "";
private ConnectionInfo _serializationTarget;
private readonly SaveFilter _saveFilter;
private readonly ICredentialRepositoryList _credentialRepositoryList;
public CsvConnectionsSerializerMremotengFormat(SaveFilter saveFilter, ICredentialRepositoryList credentialRepositoryList)
{
if (saveFilter == null)
throw new ArgumentNullException(nameof(saveFilter));
if (credentialRepositoryList == null)
throw new ArgumentNullException(nameof(credentialRepositoryList));
_saveFilter = saveFilter;
_credentialRepositoryList = credentialRepositoryList;
}
public string Serialize(ConnectionTreeModel connectionTreeModel)
{
if (connectionTreeModel == null)
throw new ArgumentNullException(nameof(connectionTreeModel));
var rootNode = connectionTreeModel.RootNodes.First(node => node is RootNodeInfo);
return Serialize(rootNode);
}
public string Serialize(ConnectionInfo serializationTarget)
{
if (serializationTarget == null)
throw new ArgumentNullException(nameof(serializationTarget));
_csv = "";
_serializationTarget = serializationTarget;
WriteCsvHeader();
SerializeNodesRecursive(serializationTarget);
return _csv;
}
private void WriteCsvHeader()
{
var csvHeader = string.Empty;
csvHeader += "Name;Folder;Description;Icon;Panel;";
if (_saveFilter.SaveUsername)
csvHeader += "Username;";
if (_saveFilter.SavePassword)
csvHeader += "Password;";
if (_saveFilter.SaveDomain)
csvHeader += "Domain;";
csvHeader += "Hostname;Protocol;PuttySession;Port;ConnectToConsole;UseCredSsp;RenderingEngine;ICAEncryptionStrength;RDPAuthenticationLevel;LoadBalanceInfo;Colors;Resolution;AutomaticResize;DisplayWallpaper;DisplayThemes;EnableFontSmoothing;EnableDesktopComposition;CacheBitmaps;RedirectDiskDrives;RedirectPorts;RedirectPrinters;RedirectSmartCards;RedirectSound;RedirectKeys;PreExtApp;PostExtApp;MacAddress;UserField;ExtApp;VNCCompression;VNCEncoding;VNCAuthMode;VNCProxyType;VNCProxyIP;VNCProxyPort;VNCProxyUsername;VNCProxyPassword;VNCColors;VNCSmartSizeMode;VNCViewOnly;RDGatewayUsageMethod;RDGatewayHostname;RDGatewayUseConnectionCredentials;RDGatewayUsername;RDGatewayPassword;RDGatewayDomain;";
if (_saveFilter.SaveInheritance)
csvHeader += "InheritCacheBitmaps;InheritColors;InheritDescription;InheritDisplayThemes;InheritDisplayWallpaper;InheritEnableFontSmoothing;InheritEnableDesktopComposition;InheritDomain;InheritIcon;InheritPanel;InheritPassword;InheritPort;InheritProtocol;InheritPuttySession;InheritRedirectDiskDrives;InheritRedirectKeys;InheritRedirectPorts;InheritRedirectPrinters;InheritRedirectSmartCards;InheritRedirectSound;InheritResolution;InheritAutomaticResize;InheritUseConsoleSession;InheritUseCredSsp;InheritRenderingEngine;InheritUsername;InheritICAEncryptionStrength;InheritRDPAuthenticationLevel;InheritLoadBalanceInfo;InheritPreExtApp;InheritPostExtApp;InheritMacAddress;InheritUserField;InheritExtApp;InheritVNCCompression;InheritVNCEncoding;InheritVNCAuthMode;InheritVNCProxyType;InheritVNCProxyIP;InheritVNCProxyPort;InheritVNCProxyUsername;InheritVNCProxyPassword;InheritVNCColors;InheritVNCSmartSizeMode;InheritVNCViewOnly;InheritRDGatewayUsageMethod;InheritRDGatewayHostname;InheritRDGatewayUseConnectionCredentials;InheritRDGatewayUsername;InheritRDGatewayPassword;InheritRDGatewayDomain";
_csv += csvHeader;
}
private void SerializeNodesRecursive(ConnectionInfo node)
{
var nodeAsContainer = node as ContainerInfo;
if (nodeAsContainer != null)
{
foreach (var child in nodeAsContainer.Children)
{
var info = child as ContainerInfo;
if (info != null)
SerializeNodesRecursive(info);
else
SerializeConnectionInfo(child);
}
}
else
SerializeConnectionInfo(node);
}
private void SerializeConnectionInfo(ConnectionInfo con)
{
var csvLine = Environment.NewLine;
csvLine += con.Name + ";" + GetNodePath(con) + ";" + con.Description + ";" + con.Icon + ";" + con.Panel + ";";
if (_saveFilter.SaveUsername)
csvLine += con.Username + ";";
if (_saveFilter.SavePassword)
csvLine += con.Password + ";";
if (_saveFilter.SaveDomain)
csvLine += con.Domain + ";";
csvLine += con.Hostname + ";" +
con.Protocol + ";" +
con.PuttySession + ";" +
Convert.ToString(con.Port) + ";" +
Convert.ToString(con.UseConsoleSession) + ";" +
Convert.ToString(con.UseCredSsp) + ";" +
con.RenderingEngine + ";" +
con.ICAEncryptionStrength + ";" +
con.RDPAuthenticationLevel + ";" +
con.LoadBalanceInfo + ";" +
con.Colors + ";" +
con.Resolution + ";" +
Convert.ToString(con.AutomaticResize) + ";" +
Convert.ToString(con.DisplayWallpaper) + ";" +
Convert.ToString(con.DisplayThemes) + ";" +
Convert.ToString(con.EnableFontSmoothing) + ";" +
Convert.ToString(con.EnableDesktopComposition) + ";" +
Convert.ToString(con.CacheBitmaps) + ";" +
Convert.ToString(con.RedirectDiskDrives) + ";" +
Convert.ToString(con.RedirectPorts) + ";" +
Convert.ToString(con.RedirectPrinters) + ";" +
Convert.ToString(con.RedirectSmartCards) + ";" +
con.RedirectSound + ";" +
Convert.ToString(con.RedirectKeys) + ";" +
con.PreExtApp + ";" +
con.PostExtApp + ";" +
con.MacAddress + ";" +
con.UserField + ";" +
con.ExtApp + ";" +
con.VNCCompression + ";" +
con.VNCEncoding + ";" +
con.VNCAuthMode + ";" +
con.VNCProxyType + ";" +
con.VNCProxyIP + ";" +
Convert.ToString(con.VNCProxyPort) + ";" +
con.VNCProxyUsername + ";" +
con.VNCProxyPassword + ";" +
con.VNCColors + ";" +
con.VNCSmartSizeMode + ";" +
Convert.ToString(con.VNCViewOnly) + ";" +
con.RDGatewayUsageMethod + ";" +
con.RDGatewayHostname + ";" +
con.RDGatewayUseConnectionCredentials + ";" +
con.RDGatewayUsername + ";" +
con.RDGatewayPassword + ";" +
con.RDGatewayDomain + ";";
if (_saveFilter.SaveInheritance)
{
csvLine += con.Inheritance.CacheBitmaps + ";" +
con.Inheritance.Colors + ";" +
con.Inheritance.Description + ";" +
con.Inheritance.DisplayThemes + ";" +
con.Inheritance.DisplayWallpaper + ";" +
con.Inheritance.EnableFontSmoothing + ";" +
con.Inheritance.EnableDesktopComposition + ";" +
con.Inheritance.Domain + ";" +
con.Inheritance.Icon + ";" +
con.Inheritance.Panel + ";" +
con.Inheritance.Password + ";" +
con.Inheritance.Port + ";" +
con.Inheritance.Protocol + ";" +
con.Inheritance.PuttySession + ";" +
con.Inheritance.RedirectDiskDrives + ";" +
con.Inheritance.RedirectKeys + ";" +
con.Inheritance.RedirectPorts + ";" +
con.Inheritance.RedirectPrinters + ";" +
con.Inheritance.RedirectSmartCards + ";" +
con.Inheritance.RedirectSound + ";" +
con.Inheritance.Resolution + ";" +
con.Inheritance.AutomaticResize + ";" +
con.Inheritance.UseConsoleSession + ";" +
con.Inheritance.UseCredSsp + ";" +
con.Inheritance.RenderingEngine + ";" +
con.Inheritance.Username + ";" +
con.Inheritance.ICAEncryptionStrength + ";" +
con.Inheritance.RDPAuthenticationLevel + ";" +
con.Inheritance.LoadBalanceInfo + ";" +
con.Inheritance.PreExtApp + ";" +
con.Inheritance.PostExtApp + ";" +
con.Inheritance.MacAddress + ";" +
con.Inheritance.UserField + ";" +
con.Inheritance.ExtApp + ";" +
con.Inheritance.VNCCompression + ";" +
con.Inheritance.VNCEncoding + ";" +
con.Inheritance.VNCAuthMode + ";" +
con.Inheritance.VNCProxyType + ";" +
con.Inheritance.VNCProxyIP + ";" +
con.Inheritance.VNCProxyPort + ";" +
con.Inheritance.VNCProxyUsername + ";" +
con.Inheritance.VNCProxyPassword + ";" +
con.Inheritance.VNCColors + ";" +
con.Inheritance.VNCSmartSizeMode + ";" +
con.Inheritance.VNCViewOnly +
con.Inheritance.RDGatewayUsageMethod + ";" +
con.Inheritance.RDGatewayHostname + ";" +
con.Inheritance.RDGatewayUseConnectionCredentials + ";" +
con.Inheritance.RDGatewayUsername + ";" +
con.Inheritance.RDGatewayPassword + ";" +
con.Inheritance.RDGatewayDomain + ";";
}
_csv += csvLine;
}
private string GetNodePath(ConnectionInfo connectionInfo)
{
var nodePath = "";
var container = connectionInfo.Parent;
if (container == null) return nodePath;
while (container != _serializationTarget)
{
container = container.Parent;
nodePath += $@"{container.Name}\";
}
nodePath = nodePath.TrimEnd('\\');
return nodePath;
}
}
}

View File

@@ -498,7 +498,7 @@ namespace mRemoteNG.Connection
#region Misc
[Browsable(false)]
public string ConstantID { get; set; }
public string ConstantID { get; /*set;*/ }
[LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7),
LocalizedAttributes.LocalizedDisplayName("strPropertyNameExternalToolBefore"),
@@ -658,6 +658,11 @@ namespace mRemoteNG.Connection
#endregion
#endregion
protected AbstractConnectionRecord(string uniqueId)
{
ConstantID = uniqueId.ThrowIfNullOrEmpty(nameof(uniqueId));
}
protected virtual TPropertyType GetPropertyValue<TPropertyType>(string propertyName, TPropertyType value)
{
return (TPropertyType)GetType().GetProperty(propertyName).GetValue(this, null);

View File

@@ -14,9 +14,7 @@ using mRemoteNG.Connection.Protocol.SSH;
using mRemoteNG.Connection.Protocol.Telnet;
using mRemoteNG.Connection.Protocol.VNC;
using mRemoteNG.Container;
using mRemoteNG.Tools;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
namespace mRemoteNG.Connection
@@ -32,7 +30,7 @@ namespace mRemoteNG.Connection
public ProtocolList OpenConnections { get; protected set; }
[Browsable(false)]
public bool IsContainer { get; set; }
public virtual bool IsContainer { get; set; }
[Browsable(false)]
public bool IsDefault { get; set; }
@@ -52,7 +50,14 @@ namespace mRemoteNG.Connection
#endregion
#region Constructors
public ConnectionInfo()
public ConnectionInfo()
: this(Guid.NewGuid().ToString())
{
}
public ConnectionInfo(string uniqueId)
: base(uniqueId)
{
SetTreeDisplayDefaults();
SetConnectionDefaults();
@@ -65,12 +70,6 @@ namespace mRemoteNG.Connection
SetNonBrowsablePropertiesDefaults();
SetDefaults();
}
public ConnectionInfo(ContainerInfo parent) : this()
{
IsContainer = true;
parent.AddChild(this);
}
#endregion
#region Public Methods
@@ -78,7 +77,6 @@ namespace mRemoteNG.Connection
{
var newConnectionInfo = new ConnectionInfo();
newConnectionInfo.CopyFrom(this);
newConnectionInfo.ConstantID = MiscTools.CreateConstantID();
newConnectionInfo.Inheritance = Inheritance.Clone();
return newConnectionInfo;
}
@@ -128,19 +126,22 @@ namespace mRemoteNG.Connection
return filteredProperties;
}
public virtual IEnumerable<PropertyInfo> GetSerializableProperties()
{
var excludedProperties = new[] { "Parent", "Name", "Hostname", "Port", "Inheritance", "OpenConnections",
"IsContainer", "IsDefault", "PositionID", "ConstantID", "TreeNode", "IsQuickConnect", "PleaseConnect" };
return GetProperties(excludedProperties);
}
public virtual void SetParent(ContainerInfo newParent)
{
RemoveParent();
newParent?.AddChild(this);
if (newParent is RootNodeInfo)
Inheritance.DisableInheritance();
}
public void RemoveParent()
{
if (Parent is RootNodeInfo)
Inheritance.EnableInheritance();
Parent?.RemoveChild(this);
}
@@ -168,7 +169,13 @@ namespace mRemoteNG.Connection
#region Private Methods
protected override TPropertyType GetPropertyValue<TPropertyType>(string propertyName, TPropertyType value)
{
return ShouldThisPropertyBeInherited(propertyName) ? GetInheritedPropertyValue<TPropertyType>(propertyName) : value;
if (!ShouldThisPropertyBeInherited(propertyName))
return value;
var inheritedValue = GetInheritedPropertyValue<TPropertyType>(propertyName);
if (inheritedValue.Equals(default(TPropertyType)))
return value;
return inheritedValue;
}
private bool ShouldThisPropertyBeInherited(string propertyName)
@@ -191,15 +198,21 @@ namespace mRemoteNG.Connection
private TPropertyType GetInheritedPropertyValue<TPropertyType>(string propertyName)
{
var connectionInfoType = Parent.GetType();
var parentPropertyInfo = connectionInfoType.GetProperty(propertyName);
if (parentPropertyInfo == null)
return default(TPropertyType); // shouldn't get here...
var parentPropertyValue = (TPropertyType)parentPropertyInfo.GetValue(Parent, null);
try
{
var connectionInfoType = Parent.GetType();
var parentPropertyInfo = connectionInfoType.GetProperty(propertyName);
if (parentPropertyInfo == null)
return default(TPropertyType); // shouldn't get here...
var parentPropertyValue = (TPropertyType)parentPropertyInfo.GetValue(Parent, null);
return parentPropertyValue;
return parentPropertyValue;
}
catch (Exception e)
{
Runtime.MessageCollector.AddExceptionStackTrace($"Error retrieving inherited property '{propertyName}'", e);
return default(TPropertyType);
}
}
private static int GetDefaultPort(ProtocolType protocol)
@@ -305,7 +318,6 @@ namespace mRemoteNG.Connection
private void SetMiscDefaults()
{
ConstantID = MiscTools.CreateConstantID();
PreExtApp = Settings.Default.ConDefaultPreExtApp;
PostExtApp = Settings.Default.ConDefaultPostExtApp;
MacAddress = Settings.Default.ConDefaultMacAddress;

View File

@@ -227,7 +227,7 @@ namespace mRemoteNG.Connection
public event EventHandler<ConnectionsLoadedEventArgs> ConnectionsLoaded;
public event EventHandler<ConnectionsSavedEventArgs> ConnectionsSaved;
private void RaiseConnectionsLoadedEvent(Maybe<ConnectionTreeModel> previousTreeModel, ConnectionTreeModel newTreeModel,
private void RaiseConnectionsLoadedEvent(Optional<ConnectionTreeModel> previousTreeModel, ConnectionTreeModel newTreeModel,
bool previousSourceWasDatabase, bool newSourceIsDatabase,
string newSourcePath)
{

View File

@@ -1,35 +1,39 @@
using System;
using System.ComponentModel;
using System.Configuration;
using mRemoteNG.App;
namespace mRemoteNG.Connection
{
public class DefaultConnectionInfo : ConnectionInfo
public class DefaultConnectionInfo : ConnectionInfo
{
public static DefaultConnectionInfo Instance { get; } = new DefaultConnectionInfo();
private readonly string[] _excludedProperties = { "Parent", "Name", "Hostname", "Port", "Inheritance",
"OpenConnections", "IsContainer", "IsDefault", "PositionID", "ConstantID", "TreeNode", "IsQuickConnect", "PleaseConnect" };
private DefaultConnectionInfo()
{
IsDefault = true;
Inheritance = DefaultConnectionInheritance.Instance;
}
public void LoadFrom<TSource>(TSource sourceInstance, Func<string, string> propertyNameMutator = null)
{
if (propertyNameMutator == null) propertyNameMutator = a => a;
var connectionProperties = GetProperties(_excludedProperties);
if (propertyNameMutator == null)
propertyNameMutator = a => a;
var connectionProperties = GetSerializableProperties();
foreach (var property in connectionProperties)
{
try
{
var propertyFromSource = typeof(TSource).GetProperty(propertyNameMutator(property.Name));
if (propertyFromSource == null) continue;
var valueFromSource = propertyFromSource.GetValue(sourceInstance, null);
var typeConverter = TypeDescriptor.GetConverter(property.PropertyType);
if (typeConverter.CanConvertFrom(valueFromSource.GetType()))
property.SetValue(Instance, typeConverter.ConvertFrom(valueFromSource), null);
var expectedPropertyName = propertyNameMutator(property.Name);
var propertyFromSource = typeof(TSource).GetProperty(expectedPropertyName);
if (propertyFromSource == null)
throw new SettingsPropertyNotFoundException($"No property with name '{expectedPropertyName}' found.");
var valueFromSource = propertyFromSource.GetValue(sourceInstance, null);
var value = Convert.ChangeType(valueFromSource, property.PropertyType);
property.SetValue(Instance, value, null);
}
catch (Exception ex)
{
@@ -40,19 +44,25 @@ namespace mRemoteNG.Connection
public void SaveTo<TDestination>(TDestination destinationInstance, Func<string, string> propertyNameMutator = null)
{
if (propertyNameMutator == null) propertyNameMutator = (a) => a;
var inheritanceProperties = GetProperties(_excludedProperties);
foreach (var property in inheritanceProperties)
if (propertyNameMutator == null)
propertyNameMutator = (a) => a;
var connectionProperties = GetSerializableProperties();
foreach (var property in connectionProperties)
{
try
{
var propertyFromDestination = typeof(TDestination).GetProperty(propertyNameMutator(property.Name));
var localValue = property.GetValue(Instance, null);
var typeConverter = TypeDescriptor.GetConverter(property.PropertyType);
if (propertyFromDestination != null && !typeConverter.CanConvertTo(propertyFromDestination.PropertyType)) continue;
if (propertyFromDestination == null) continue;
var convertedValue = typeConverter.ConvertTo(localValue, propertyFromDestination.PropertyType);
propertyFromDestination.SetValue(destinationInstance, convertedValue, null);
var expectedPropertyName = propertyNameMutator(property.Name);
var propertyFromDestination = typeof(TDestination).GetProperty(expectedPropertyName);
if (propertyFromDestination == null)
throw new SettingsPropertyNotFoundException($"No property with name '{expectedPropertyName}' found.");
// ensure value is of correct type
var value = Convert.ChangeType(property.GetValue(Instance, null), propertyFromDestination.PropertyType);
propertyFromDestination.SetValue(destinationInstance, value, null);
}
catch (Exception ex)
{

View File

@@ -1,16 +1,15 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using mRemoteNG.Connection;
using System.ComponentModel;
using System.Linq;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Tools;
using mRemoteNG.Tree;
namespace mRemoteNG.Container
{
[DefaultProperty("Name")]
[DefaultProperty("Name")]
public class ContainerInfo : ConnectionInfo, INotifyCollectionChanged
{
[Browsable(false)]
@@ -19,13 +18,20 @@ namespace mRemoteNG.Container
[Category(""), Browsable(false), ReadOnly(false), Bindable(false), DefaultValue(""), DesignOnly(false)]
public bool IsExpanded { get; set; }
[Browsable(false)]
public override bool IsContainer { get { return true; } set {} }
public ContainerInfo()
public ContainerInfo(string uniqueId)
: base(uniqueId)
{
SetDefaults();
IsContainer = true;
}
public ContainerInfo()
: this(Guid.NewGuid().ToString())
{
}
public override TreeNodeType GetTreeNodeType()
{
return TreeNodeType.Container;
@@ -57,7 +63,7 @@ namespace mRemoteNG.Container
AddChildAt(newChildItem, newChildIndex);
}
public void AddChildAt(ConnectionInfo newChildItem, int index)
public virtual void AddChildAt(ConnectionInfo newChildItem, int index)
{
if (Children.Contains(newChildItem)) return;
newChildItem.Parent?.RemoveChild(newChildItem);
@@ -75,7 +81,7 @@ namespace mRemoteNG.Container
}
}
public void RemoveChild(ConnectionInfo removalTarget)
public virtual void RemoveChild(ConnectionInfo removalTarget)
{
if (!Children.Contains(removalTarget)) return;
removalTarget.Parent = null;
@@ -178,7 +184,6 @@ namespace mRemoteNG.Container
{
var newContainer = new ContainerInfo();
newContainer.CopyFrom(this);
newContainer.ConstantID = MiscTools.CreateConstantID();
newContainer.OpenConnections = new ProtocolList();
newContainer.Inheritance = Inheritance.Clone();
foreach (var child in Children.ToArray())

View File

@@ -14,7 +14,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyDescription("Multi-protocol remote connections manager")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("mRemoteNG")]
[assembly: AssemblyCopyright("Copyright © 2017 mRemoteNG Dev Team; 2010-2013 Riley McArdle; 2007-2009 Felix Deimel")]
[assembly: AssemblyCopyright("Copyright © 2018 mRemoteNG Dev Team; 2010-2013 Riley McArdle; 2007-2009 Felix Deimel")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
@@ -33,5 +33,5 @@ using System.Runtime.InteropServices;
// by using the '*' as shown below:
// <Assembly: AssemblyVersion("1.0.*")>
[assembly: AssemblyVersion("1.76.0.*")]
[assembly: AssemblyVersion("1.76.4.*")]
[assembly: NeutralResourcesLanguage("en")]

View File

@@ -12,7 +12,7 @@ namespace mRemoteNG {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.5.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
@@ -2698,5 +2698,29 @@ namespace mRemoteNG {
this["MultiSshToolbarVisible"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool CreateEmptyPanelOnStartUp {
get {
return ((bool)(this["CreateEmptyPanelOnStartUp"]));
}
set {
this["CreateEmptyPanelOnStartUp"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("General")]
public string StartUpPanelName {
get {
return ((string)(this["StartUpPanelName"]));
}
set {
this["StartUpPanelName"] = value;
}
}
}
}

View File

@@ -671,5 +671,11 @@
<Setting Name="MultiSshToolbarVisible" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="CreateEmptyPanelOnStartUp" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="StartUpPanelName" Type="System.String" Scope="User">
<Value Profile="(Default)">General</Value>
</Setting>
</Settings>
</SettingsFile>

View File

@@ -19,7 +19,7 @@ namespace mRemoteNG {
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Language {
@@ -61,7 +61,7 @@ namespace mRemoteNG {
}
/// <summary>
/// Looks up a localized string similar to Create a New Configuration File.
/// Looks up a localized string similar to Create a New Connection File.
/// </summary>
internal static string ConfigurationCreateNew {
get {
@@ -78,15 +78,6 @@ namespace mRemoteNG {
}
}
/// <summary>
/// Looks up a localized string similar to The Configuration File is Missing..
/// </summary>
internal static string ConfigurationFileNotFound {
get {
return ResourceManager.GetString("ConfigurationFileNotFound", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Import an Existing File.
/// </summary>
@@ -96,6 +87,15 @@ namespace mRemoteNG {
}
}
/// <summary>
/// Looks up a localized string similar to The connection file could not be found..
/// </summary>
internal static string ConnectionFileNotFound {
get {
return ResourceManager.GetString("ConnectionFileNotFound", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Connection successful.
/// </summary>
@@ -222,6 +222,15 @@ namespace mRemoteNG {
}
}
/// <summary>
/// Looks up a localized string similar to Working directory:.
/// </summary>
internal static string srtWorkingDirectory {
get {
return ResourceManager.GetString("srtWorkingDirectory", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to About.
/// </summary>
@@ -312,6 +321,15 @@ namespace mRemoteNG {
}
}
/// <summary>
/// Looks up a localized string similar to AdvancedSecurityOptions.
/// </summary>
internal static string strAdvancedSecurityOptions {
get {
return ResourceManager.GetString("strAdvancedSecurityOptions", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Allow only a single instance of the application (mRemoteNG restart required).
/// </summary>
@@ -439,7 +457,7 @@ namespace mRemoteNG {
}
/// <summary>
/// Looks up a localized string similar to Auto save every:.
/// Looks up a localized string similar to Auto save time in minutes (0 means disabled):.
/// </summary>
internal static string strAutoSaveEvery {
get {
@@ -1628,6 +1646,15 @@ namespace mRemoteNG {
}
}
/// <summary>
/// Looks up a localized string similar to Create an empty panel when mRemoteNG starts.
/// </summary>
internal static string strCreateEmptyPanelOnStartUp {
get {
return ResourceManager.GetString("strCreateEmptyPanelOnStartUp", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Credential Editor.
/// </summary>
@@ -2544,7 +2571,7 @@ namespace mRemoteNG {
}
/// <summary>
/// Looks up a localized string similar to An error occurred while importing the file, &quot;{0}&quot;..
/// Looks up a localized string similar to An error occurred while importing the file &quot;{0}&quot;..
/// </summary>
internal static string strImportFileFailedContent {
get {
@@ -2633,6 +2660,15 @@ namespace mRemoteNG {
}
}
/// <summary>
/// Looks up a localized string similar to Import sub OUs.
/// </summary>
internal static string strImportSubOUs {
get {
return ResourceManager.GetString("strImportSubOUs", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Inactive.
/// </summary>
@@ -3011,6 +3047,15 @@ namespace mRemoteNG {
}
}
/// <summary>
/// Looks up a localized string similar to Use UTF8 encoding for RDP &quot;Load Balance Info&quot; property.
/// </summary>
internal static string strLoadBalanceInfoUseUtf8 {
get {
return ResourceManager.GetString("strLoadBalanceInfoUseUtf8", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Load from SQL failed.
/// </summary>
@@ -3056,6 +3101,15 @@ namespace mRemoteNG {
}
}
/// <summary>
/// Looks up a localized string similar to Lock toolbar positions.
/// </summary>
internal static string strLockToolbars {
get {
return ResourceManager.GetString("strLockToolbars", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Log file path.
/// </summary>
@@ -3416,6 +3470,24 @@ namespace mRemoteNG {
}
}
/// <summary>
/// Looks up a localized string similar to Lock Toolbar Positions.
/// </summary>
internal static string strMenuLockToolbars {
get {
return ResourceManager.GetString("strMenuLockToolbars", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Multi SSH Toolbar.
/// </summary>
internal static string strMenuMultiSshToolbar {
get {
return ResourceManager.GetString("strMenuMultiSshToolbar", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to New Connection File.
/// </summary>
@@ -3812,6 +3884,15 @@ namespace mRemoteNG {
}
}
/// <summary>
/// Looks up a localized string similar to Multi SSH toolbar.
/// </summary>
internal static string strMultiSshToolbar {
get {
return ResourceManager.GetString("strMultiSshToolbar", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to My current credentials (Windows logon information).
/// </summary>
@@ -4110,6 +4191,15 @@ namespace mRemoteNG {
}
}
/// <summary>
/// Looks up a localized string similar to mRemoteNG Options.
/// </summary>
internal static string strOptionsPageTitle {
get {
return ResourceManager.GetString("strOptionsPageTitle", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Testing....
/// </summary>
@@ -4174,7 +4264,7 @@ namespace mRemoteNG {
}
/// <summary>
/// Looks up a localized string similar to No themes are loaded, check that the default mremoteNG themes exist in the slash themes folder.
/// Looks up a localized string similar to No themes are loaded, check that the default mremoteNG themes exist in the &apos;themes&apos; folder.
/// </summary>
internal static string strOptionsThemeErrorNoThemes {
get {
@@ -6210,6 +6300,24 @@ namespace mRemoteNG {
}
}
/// <summary>
/// Looks up a localized string similar to Run elevated.
/// </summary>
internal static string strRunElevated {
get {
return ResourceManager.GetString("strRunElevated", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Run elevate.
/// </summary>
internal static string strRunElevateHeader {
get {
return ResourceManager.GetString("strRunElevateHeader", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Save.
/// </summary>
@@ -6381,6 +6489,15 @@ namespace mRemoteNG {
}
}
/// <summary>
/// Looks up a localized string similar to Show on toolbar column.
/// </summary>
internal static string strShowOnToolbarColumnHeader {
get {
return ResourceManager.GetString("strShowOnToolbarColumnHeader", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Show protocols on tab names.
/// </summary>
@@ -7011,6 +7128,15 @@ namespace mRemoteNG {
}
}
/// <summary>
/// Looks up a localized string similar to Timeout (seconds).
/// </summary>
internal static string strTimeoutInSeconds {
get {
return ResourceManager.GetString("strTimeoutInSeconds", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Title.
/// </summary>
@@ -7101,6 +7227,15 @@ namespace mRemoteNG {
}
}
/// <summary>
/// Looks up a localized string similar to Try to integrate.
/// </summary>
internal static string strTryToIntegrateColumnHeader {
get {
return ResourceManager.GetString("strTryToIntegrateColumnHeader", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Type.
/// </summary>
@@ -7471,6 +7606,15 @@ namespace mRemoteNG {
}
}
/// <summary>
/// Looks up a localized string similar to Working directory.
/// </summary>
internal static string strWorkingDirColumnHeader {
get {
return ResourceManager.GetString("strWorkingDirColumnHeader", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to XULrunner path:.
/// </summary>

View File

@@ -151,10 +151,10 @@
<value>Panel Auswahldialog immer anzeigen</value>
</data>
<data name="strAlwaysShowPanelTabs" xml:space="preserve">
<value>Palettenregister immer anzeigen</value>
<value>Panel immer anzeigen</value>
</data>
<data name="strAlwaysShowSysTrayIcon" xml:space="preserve">
<value>System Tray Icon immer anzeigen</value>
<value>Tray Icon immer anzeigen</value>
</data>
<data name="strAskUpdatesCommandAskLater" xml:space="preserve">
<value>Später nochmal fragen</value>
@@ -178,7 +178,7 @@
<value>Automatisch Sitzungsinformationen einholen</value>
</data>
<data name="strAutoSaveEvery" xml:space="preserve">
<value>Automatisch speichern jede:</value>
<value>Automatisch speichern in Minuten (0 bedeutet deaktiviert):</value>
</data>
<data name="strAutoSaveMins" xml:space="preserve">
<value>Minuten (0 bedeutet deaktiviert)</value>
@@ -424,7 +424,7 @@ VncSharp Control Version {0}</value>
<value>Kompatibilitätsproblem entdeckt</value>
</data>
<data name="strComponentsCheck" xml:space="preserve">
<value>Komponentenüberprüfung</value>
<value>Komponenten prüfen</value>
</data>
<data name="strConfigPropertyGridButtonIconClickFailed" xml:space="preserve">
<value>Bild Knopf Ereignis fehlgeschlagen!</value>
@@ -748,7 +748,7 @@ Starte mit neuer Datei.</value>
<value>Quick connect Registerkarten identifizieren, indem das Präfix "Quick:" benutzt wird</value>
</data>
<data name="strImportAD" xml:space="preserve">
<value>Aus Active Directory importieren</value>
<value>Von Active Directory importieren</value>
</data>
<data name="strImportExport" xml:space="preserve">
<value>Importieren/Exportieren</value>
@@ -817,7 +817,7 @@ Starte mit neuer Datei.</value>
<value>Beim Schließen der Verbindungen:</value>
</data>
<data name="strLabelConnect" xml:space="preserve">
<value>&amp;Direkt Verbinden:</value>
<value>&amp;Verbinden:</value>
</data>
<data name="strLabelDisplayName" xml:space="preserve">
<value>Anzeigename</value>
@@ -931,7 +931,7 @@ Starte mit neuer Datei.</value>
<value>Verbindungen</value>
</data>
<data name="strMenuConnectionsAndConfig" xml:space="preserve">
<value>Verbindungen and Konfiguration</value>
<value>Verbindungen und Konfiguration</value>
</data>
<data name="strMenuCopy" xml:space="preserve">
<value>Kopieren</value>
@@ -994,7 +994,7 @@ Starte mit neuer Datei.</value>
<value>&amp;Hilfe</value>
</data>
<data name="strMenuHelpContents" xml:space="preserve">
<value>mRemoteNG Hilfe</value>
<value>Hilfe</value>
</data>
<data name="strMenuJumpTo" xml:space="preserve">
<value>Springe zu</value>
@@ -1003,10 +1003,7 @@ Starte mit neuer Datei.</value>
<value>Starten</value>
</data>
<data name="strMenuNewConnectionFile" xml:space="preserve">
<value>Neue Konfigurationsdatei</value>
</data>
<data name="strMenuNewExternalTool" xml:space="preserve">
<value>Hinzufügen</value>
<value>Neue Verbindungsdatei</value>
</data>
<data name="strMenuNotifications" xml:space="preserve">
<value>Meldungen</value>
@@ -1021,7 +1018,7 @@ Starte mit neuer Datei.</value>
<value>Alle Löschen</value>
</data>
<data name="strMenuOpenConnectionFile" xml:space="preserve">
<value>Konfigurationsdatei öffnen...</value>
<value>Verbindungsdatei öffnen...</value>
</data>
<data name="strMenuOptions" xml:space="preserve">
<value>Optionen</value>
@@ -1033,7 +1030,7 @@ Starte mit neuer Datei.</value>
<value>Port-Scan</value>
</data>
<data name="strMenuQuickConnectToolbar" xml:space="preserve">
<value>Direkt-Verbinden-Symbolleiste</value>
<value>QuickConnect Symbolleiste</value>
</data>
<data name="strMenuReconnect" xml:space="preserve">
<value>Wiederverbinden</value>
@@ -1060,10 +1057,10 @@ Starte mit neuer Datei.</value>
<value>Layout zurücksetzen</value>
</data>
<data name="strMenuSaveConnectionFile" xml:space="preserve">
<value>Konfigurationsdatei speichern</value>
<value>Verbindungsdatei speichern</value>
</data>
<data name="strMenuSaveConnectionFileAs" xml:space="preserve">
<value>Konfigurationsdatei speichern unter...</value>
<value>Verbindungsdatei speichern unter...</value>
</data>
<data name="strMenuScreenshot" xml:space="preserve">
<value>Bildschirmschnappschuss</value>
@@ -1096,7 +1093,7 @@ Starte mit neuer Datei.</value>
<value>Chat starten (VNC)</value>
</data>
<data name="strMenuSupportForum" xml:space="preserve">
<value>Unterstützungs Forum</value>
<value>Forum</value>
</data>
<data name="strMenuTools" xml:space="preserve">
<value>E&amp;xtras</value>
@@ -1566,9 +1563,6 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="strQuick" xml:space="preserve">
<value>Direkt: {0}</value>
</data>
<data name="strQuickConnect" xml:space="preserve">
<value>Direkt verbinden</value>
</data>
<data name="strQuickConnectAddFailed" xml:space="preserve">
<value>Hinzufügen zur Direktverbindungshistorie fehlgeschlagen!</value>
</data>
@@ -1828,7 +1822,7 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<value>Anmeldeinformationen im Tab Titel anzeigen</value>
</data>
<data name="strShowProtocolOnTabs" xml:space="preserve">
<value>Protokoll im Tab Titel anzeigen</value>
<value>Protokoll im Titel des Tab anzeigen</value>
</data>
<data name="strSingleClickOnConnectionOpensIt" xml:space="preserve">
<value>Ein einzelner Klick auf eine Verbindung öffnet diese</value>
@@ -2085,9 +2079,6 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="strUpdateCheckPortableEdition" xml:space="preserve">
<value>mRemoteNG Portable Edition unterstützt derzeit keine automatische Updates.</value>
</data>
<data name="strUpdateDeleteFailed" xml:space="preserve">
<value>Löschen der Aktualisierungsdatei ist gehlgeschlagen!</value>
</data>
<data name="strUpdateDownloadComplete" xml:space="preserve">
<value>Download fertiggestellt!
mRemoteNG wird nun geschlossen und die Installation gestartet.</value>
@@ -2180,6 +2171,402 @@ mRemoteNG wird nun geschlossen und die Installation gestartet.</value>
<value>Ja</value>
</data>
<data name="strMenuReconnectAll" xml:space="preserve">
<value>Wiederverbinden von allen offenen Verbindungen</value>
<value>Wiederverbinden aller offener Verbindungen</value>
</data>
</root>
<data name="strButtonLaunch" xml:space="preserve">
<value>&amp;Starten</value>
</data>
<data name="strCommandOpenConnectionFile" xml:space="preserve">
<value>Eine Verbindungsdatei öffnen</value>
</data>
<data name="strConnectNoCredentials" xml:space="preserve">
<value>Ohne Anmeldedaten verbinden</value>
</data>
<data name="strDontConnectToConsoleSessionMenuItem" xml:space="preserve">
<value>Nicht zu Konsolensitzung verbinden</value>
</data>
<data name="strErrorCouldNotLaunchPutty" xml:space="preserve">
<value>PuTTY konnte nicht gestartet werden</value>
</data>
<data name="strExportEverything" xml:space="preserve">
<value>Export alles</value>
</data>
<data name="strExportFile" xml:space="preserve">
<value>Export Datei</value>
</data>
<data name="strExportProperties" xml:space="preserve">
<value>Export Eigeschaften</value>
</data>
<data name="strFilterAllImportable" xml:space="preserve">
<value>Alle importierbaren Dateien</value>
</data>
<data name="strImportFileFailedMainInstruction" xml:space="preserve">
<value>Import fehlgeschlagen</value>
</data>
<data name="strImportFromFileMenuItem" xml:space="preserve">
<value>Von &amp;Datei importieren</value>
</data>
<data name="strImportLocationContent" xml:space="preserve">
<value>Wo sollen die importierten Objekte platziert werden?</value>
</data>
<data name="strImportLocationMainInstruction" xml:space="preserve">
<value>Import Ziel</value>
</data>
<data name="strOptionsKeyboardButtonDelete" xml:space="preserve">
<value>&amp;Löschen</value>
</data>
<data name="strOptionsKeyboardButtonNew" xml:space="preserve">
<value>&amp;Neu</value>
</data>
<data name="strOptionsKeyboardButtonReset" xml:space="preserve">
<value>&amp;Neu</value>
</data>
<data name="strOptionsKeyboardCommandsNextTab" xml:space="preserve">
<value>Nächster Tab</value>
</data>
<data name="strOptionsKeyboardGroupModifyShortcut" xml:space="preserve">
<value>Vorheriger Tab</value>
</data>
<data name="strOptionsProxyTesting" xml:space="preserve">
<value>Teste...</value>
</data>
<data name="strOptionsTabKeyboard" xml:space="preserve">
<value>Tastatur</value>
</data>
<data name="strUpdateCheckFailedLabel" xml:space="preserve">
<value>Überprüfung fehlgeschlagen</value>
</data>
<data name="strUpdateCheckingLabel" xml:space="preserve">
<value>Prüfe auf Updates...</value>
</data>
<data name="strEncryptionEngine" xml:space="preserve">
<value>Verschlüsselungs-Engine</value>
</data>
<data name="strTabSecurity" xml:space="preserve">
<value>Sicherheit</value>
</data>
<data name="strRDPSoundQualityDynamic" xml:space="preserve">
<value>Dynamisch</value>
</data>
<data name="strRDPSoundQualityHigh" xml:space="preserve">
<value>Hoch</value>
</data>
<data name="strRDPSoundQualityMedium" xml:space="preserve">
<value>Mittel</value>
</data>
<data name="strPropertyNameSoundQuality" xml:space="preserve">
<value>Ton Qualität</value>
</data>
<data name="strUpdatePortableDownloadComplete" xml:space="preserve">
<value>Download abgeschlossen!</value>
</data>
<data name="strRemove" xml:space="preserve">
<value>Entfernen</value>
</data>
<data name="strTitle" xml:space="preserve">
<value>Titel</value>
</data>
<data name="strOpenFile" xml:space="preserve">
<value>Datei öffnen</value>
</data>
<data name="strHttpsInsecureAllowAlways" xml:space="preserve">
<value>Immer erlauben</value>
</data>
<data name="strHttpsInsecureAllowOnce" xml:space="preserve">
<value>Ein Mal erlauben</value>
</data>
<data name="strHttpsInsecureDontAllow" xml:space="preserve">
<value>Nie erlauben</value>
</data>
<data name="IncorrectPassword" xml:space="preserve">
<value>Falsches Passwort</value>
</data>
<data name="Source" xml:space="preserve">
<value>Qualle</value>
</data>
<data name="strBack" xml:space="preserve">
<value>Zurück</value>
</data>
<data name="strCreateAndOpenNewFile" xml:space="preserve">
<value>Erstelle und öffne neue Datei</value>
</data>
<data name="strOpenADifferentFile" xml:space="preserve">
<value>Andere Datei öffnen</value>
</data>
<data name="strCredentialManagerUpgradeDescription" xml:space="preserve">
<value>In v1.76 haben wir ein Berechtigungsverwaltungssystem eingeführt. Diese Funktion erfordert eine erhebliche Änderung bei der Speicherung und Interaktion mit Anmeldeinformationen in mRemoteNG. Sie müssen eine Aktualisierung Ihrer mRemoteNG-Verbindungsdatei durchführen.
Diese Seite führt Sie durch den Prozess der Aktualisierung Ihrer Verbindungsdatei oder gibt Ihnen die Möglichkeit, eine andere Verbindungsdatei zu öffnen, wenn Sie das Upgrade nicht durchführen möchten.</value>
</data>
<data name="ConfigurationCreateNew" xml:space="preserve">
<value>Neue Verbindungsdatei erstellen</value>
</data>
<data name="strCommandExitProgram" xml:space="preserve">
<value>B&amp;eende {0}</value>
</data>
<data name="strCommandTryAgain" xml:space="preserve">
<value>&amp;Nochmal versuchen</value>
</data>
<data name="strExternalToolDefaultName" xml:space="preserve">
<value>Neues externes Programm</value>
</data>
<data name="strLoadFromSqlFailedContent" xml:space="preserve">
<value>Die Verbindungsinformationen konnten nicht vom SQL-Server geladen werden.</value>
</data>
<data name="strOptionsKeyboardCommandsPreviousTab" xml:space="preserve">
<value>Vorheriger Tab</value>
</data>
<data name="strOptionsKeyboardLabelKeyboardShortcuts" xml:space="preserve">
<value>Tataturkürzel</value>
</data>
<data name="strPasswordStatusMustMatch" xml:space="preserve">
<value>Beide Passwörter müssen übereinstimmen</value>
</data>
<data name="strPasswordStatusTooShort" xml:space="preserve">
<value>Das Passwort muss mindestens 3 Zeichen lang sein.</value>
</data>
<data name="strPortScanComplete" xml:space="preserve">
<value>Port-Scan abgeschlossen.</value>
</data>
<data name="strPropertyDescriptionAutomaticResize" xml:space="preserve">
<value>Wählen Sie aus, ob die Größe der Verbindung automatisch angepasst werden soll, wenn die Fenstergröße geändert oder der Vollbildmodus umgeschaltet wird. Benötigt RDC 8.0 oder höher.</value>
</data>
<data name="strPropertyDescriptionLoadBalanceInfo" xml:space="preserve">
<value>Gibt die Lastausgleichsinformationen an, die von Lastenausgleichsroutern verwendet werden, um den besten Server auszuwählen.</value>
</data>
<data name="strPropertyNameLoadBalanceInfo" xml:space="preserve">
<value>Lastausgleichsinfo</value>
</data>
<data name="strTitlePasswordWithName" xml:space="preserve">
<value>Passwort für {0}</value>
</data>
<data name="strRDPOverallConnectionTimeout" xml:space="preserve">
<value>RDP-Verbindungs-Timeout:</value>
</data>
<data name="strNodeAlreadyInFolder" xml:space="preserve">
<value>Dieser Knoten ist bereits im Verzeichnis</value>
</data>
<data name="strNodeCannotDragOnSelf" xml:space="preserve">
<value>Knoten kann nicht auf sich selbst gezogen werden.</value>
</data>
<data name="strNodeCannotDragParentOnChild" xml:space="preserve">
<value>Elternknoten kann nicht auf Kindknoten gezogen werden.</value>
</data>
<data name="strNodeNotDraggable" xml:space="preserve">
<value>Dieser Knoten ist nicht ziehbar.</value>
</data>
<data name="strEncryptionBlockCipherMode" xml:space="preserve">
<value>Block Cipher-Modus</value>
</data>
<data name="strShowTheseMessageTypes" xml:space="preserve">
<value>Zeige diese Nachrichtentypen</value>
</data>
<data name="ConnectionFileNotFound" xml:space="preserve">
<value>Die Verbindungsdatei konnte nicht gefunden werden.</value>
</data>
<data name="ConfigurationImportFile" xml:space="preserve">
<value>Existierende Datei importieren</value>
</data>
<data name="ConnectionSuccessful" xml:space="preserve">
<value>Verbindung erfolgreich</value>
</data>
<data name="DatabaseNotAvailable" xml:space="preserve">
<value>Datenbank '{0}' nicht verfügbar.</value>
</data>
<data name="SaveConnectionsAfterEveryEdit" xml:space="preserve">
<value>Verbindungen nach jeder Änderung speichern</value>
</data>
<data name="FilterSearchMatchesInConnectionTree" xml:space="preserve">
<value>Suchergebnisse in Verbindungen filtern</value>
</data>
<data name="TestConnection" xml:space="preserve">
<value>Teste Verbindung</value>
</data>
<data name="strTimeoutInSeconds" xml:space="preserve">
<value>Time-Out (Sekunden)</value>
</data>
<data name="strOptionsKeyboardButtonResetAll" xml:space="preserve">
<value>&amp;Alles zurücksetzen</value>
</data>
<data name="strPropertyNameAutomaticResize" xml:space="preserve">
<value>Automatische Größenanpassung</value>
</data>
<data name="strPuttySessionSettings" xml:space="preserve">
<value>PuTTY Sitzungseinstellungen</value>
</data>
<data name="strShowOnToolbar" xml:space="preserve">
<value>Auf der Toolbar anzeigen</value>
</data>
<data name="strAccept" xml:space="preserve">
<value>Akzeptieren</value>
</data>
<data name="strCredentialEditor" xml:space="preserve">
<value>Hinzufügen</value>
</data>
<data name="strAssignedCredential" xml:space="preserve">
<value>Zugewiesene Anmeldedaten</value>
</data>
<data name="strHttpsInsecurePromptTitle" xml:space="preserve">
<value>Unsichere Zertifikate erlauben?</value>
</data>
<data name="Unlock" xml:space="preserve">
<value>Entsperren</value>
</data>
<data name="strOptionsThemeEnableTheming" xml:space="preserve">
<value>Themes aktivieren</value>
</data>
<data name="strOptionsThemeNewThemeCaption" xml:space="preserve">
<value>Neuer Thema Name</value>
</data>
<data name="TestingConnection" xml:space="preserve">
<value>Teste Verbindung</value>
</data>
<data name="strExportToFileMenuItem" xml:space="preserve">
<value>In Datei &amp;exportieren...</value>
</data>
<data name="strImportFileFailedContent" xml:space="preserve">
<value>Ein Fehler ist während des Imports der Datei {0} aufgetreten.</value>
</data>
<data name="strMenuLockToolbars" xml:space="preserve">
<value>Symbolleisten sperren</value>
</data>
<data name="strMenuMultiSshToolbar" xml:space="preserve">
<value>Multi-SSH Symbolleiste</value>
</data>
<data name="strAdvancedSecurityOptions" xml:space="preserve">
<value>Erweiterte Sicherheitsoptionen</value>
</data>
<data name="strLogTheseMessageTypes" xml:space="preserve">
<value>Diese Nachrichtentypen protokollieren</value>
</data>
<data name="strOptionsThemeThemeChaangeWarning" xml:space="preserve">
<value>Warnung! Ein Neustart ist notwendig um ein Theme zu deaktivieren oder anzuwenden</value>
</data>
<data name="strOptionsThemeErrorNoThemes" xml:space="preserve">
<value>
Es werden keine Themes geladen, vergewissern Sie sich, dass das standard mremoteNG-Theme im Ordner 'themes' vorhanden ist</value>
</data>
<data name="LoginFailedForUser" xml:space="preserve">
<value>Login fehlgeschlagen für Benutzer '{0}'.</value>
</data>
<data name="strOptionsPageTitle" xml:space="preserve">
<value>mRemoteNG Optionen</value>
</data>
<data name="strImportLocationCommandButtons" xml:space="preserve">
<value>Unter dem Stamm {0} {1} | Unter dem ausgewählten Ordner {0} {2}</value>
</data>
<data name="strMenuNewExternalTool" xml:space="preserve">
<value>Neues externes Tool</value>
</data>
<data name="strMenuSessionRetrieve" xml:space="preserve">
<value>Abrufen</value>
</data>
<data name="strUpdateGetChangeLogFailed" xml:space="preserve">
<value>Das Change-Log konnte nicht herunter geladen werden.</value>
</data>
<data name="strPropertyDescriptionSoundQuality" xml:space="preserve">
<value>Wählen Sie die vom Protokoll bereitgestellte Klangqualität: Dynamisch, Mittel, Hoch</value>
</data>
<data name="strPropertyDescriptionRDPMinutesToIdleTimeout" xml:space="preserve">
<value>Die Anzahl der Minuten, die die RDP-Sitzung im Leerlauf verbleibt, bevor sie automatisch getrennt wird (0 bedeutet kein Limit)</value>
</data>
<data name="strPropertyNameRDPMinutesToIdleTimeout" xml:space="preserve">
<value>Minuten zum Leerlauf</value>
</data>
<data name="strAdd" xml:space="preserve">
<value>Hinzufügen</value>
</data>
<data name="strPropertyDescriptionCredential" xml:space="preserve">
<value>Auswählen welche Anmeldeinformationen für diese Verbindung verwendet werden sollen.</value>
</data>
<data name="strConfirmDeleteCredentialRecord" xml:space="preserve">
<value>Möchten Sie die Anmeldeinformationen {0} wirklich löschen?</value>
</data>
<data name="strFindMatchingCredentialFailed" xml:space="preserve">
<value>
Es konnte kein Anmeldedatensatz mit der ID "{0}" für den Verbindungsdatensatz mit dem Namen "{1}" gefunden werden.</value>
</data>
<data name="strPropertyDescriptionRDPAlertIdleTimeout" xml:space="preserve">
<value>Wählen Sie, ob eine Benachrichtigung empfangen werden soll, nachdem die RDP-Sitzung aufgrund von Inaktivität getrennt wurde</value>
</data>
<data name="strPropertyNameRDPAlertIdleTimeout" xml:space="preserve">
<value>Benachrichtigung bei Leerlauftrennung</value>
</data>
<data name="strPasswordConstainsSpecialCharactersConstraintHint" xml:space="preserve">
<value>Das Passwort muss mindestens {0} der folgenden Zeichen enthalten: {1}</value>
</data>
<data name="strPasswordContainsLowerCaseConstraintHint" xml:space="preserve">
<value>Das Passwort muss mindestens {0} Kleinbuchstaben enthalten</value>
</data>
<data name="strPasswordContainsNumbersConstraint" xml:space="preserve">
<value>Passwort muss mindestens {0} Nummer (n) enthalten</value>
</data>
<data name="strPasswordContainsUpperCaseConstraintHint" xml:space="preserve">
<value>Passwort muss mindestens {0} Großbuchstaben enthalten</value>
</data>
<data name="strPasswordLengthConstraintHint" xml:space="preserve">
<value>
Die Passwortlänge muss zwischen {0} und {1} liegen</value>
</data>
<data name="strChooseLogPath" xml:space="preserve">
<value>
Wählen Sie einen Pfad für die mRemoteNG-Protokolldatei</value>
</data>
<data name="strLogFilePath" xml:space="preserve">
<value>Protokollierungspfad</value>
</data>
<data name="strChoosePath" xml:space="preserve">
<value>Pfad wählen</value>
</data>
<data name="strUseDefault" xml:space="preserve">
<value>Standard verwenden</value>
</data>
<data name="strLogging" xml:space="preserve">
<value>Protokollierung</value>
</data>
<data name="strLogToAppDir" xml:space="preserve">
<value>In das Anwendungsverzeichnis protokollieren</value>
</data>
<data name="strHttpsInsecurePrompt" xml:space="preserve">
<value>Unsicheres Zertifikat für URL zulassen: {0}?</value>
</data>
<data name="RepositoryIsUnlocked" xml:space="preserve">
<value>Das ausgewählte Repository ist entsperrt</value>
</data>
<data name="Unlocking" xml:space="preserve">
<value>Entsperren</value>
</data>
<data name="UnlockCredentialRepository" xml:space="preserve">
<value>Entsperre Credential Repository</value>
</data>
<data name="PromptUnlockCredReposOnStartup" xml:space="preserve">
<value>Auffordern das Credential Repository beim Start zu entsperren</value>
</data>
<data name="strConnectionFilePath" xml:space="preserve">
<value>Verbindungsdateipfad</value>
</data>
<data name="CredentialUnavailable" xml:space="preserve">
<value>Anmeldeinformationen nicht verfügbar</value>
</data>
<data name="strOptionsThemeDeleteConfirmation" xml:space="preserve">
<value>Soll das Theme wirklich gelöscht werden?</value>
</data>
<data name="strOptionsThemeNewThemeError" xml:space="preserve">
<value>Das Theme kann nicht erstellt werden, Name bereits vorhanden oder Sonderzeichen im Namen</value>
</data>
<data name="strOptionsThemeNewThemeText" xml:space="preserve">
<value>Namen des neuen Theme angeben</value>
</data>
<data name="CouldNotFindExternalTool" xml:space="preserve">
<value>Externes Tool mit Namen "{0}" konnte nicht gefunden werden</value>
</data>
<data name="ConfigurationCustomPath" xml:space="preserve">
<value>Eigenen Pfad verwenden</value>
</data>
<data name="ServerNotAccessible" xml:space="preserve">
<value>Server '{0}' nicht erreichbar</value>
</data>
<data name="LoadBalanceInfoUseUtf8" xml:space="preserve">
<value>Verwenden Sie die UTF8-Codierung für die RDP-Eigenschaft "Load Balance Info"</value>
</data>
</root>

View File

@@ -1154,7 +1154,7 @@ Ver el articulo de soporte de Microsoft en http://support.microsoft.com/kb/81183
<value>Sin SmartSize</value>
</data>
<data name="strNoUpdateAvailable" xml:space="preserve">
<value>Sin actualizaciones dosponibles</value>
<value>Sin actualizaciones disponibles</value>
</data>
<data name="strOldConffile" xml:space="preserve">
<value>Está intentando cargar un archivo de conexión que ha sido creado con una versión muy antigua de mRemote, ésto puede causar un error en tiempo de ejecución.
@@ -2069,4 +2069,4 @@ mRemoteNG ahora se cerrará y comenzará la instalación.</value>
<data name="strYes" xml:space="preserve">
<value>Sí</value>
</data>
</root>
</root>

View File

@@ -181,7 +181,7 @@
<value>Automatically get session information</value>
</data>
<data name="strAutoSaveEvery" xml:space="preserve">
<value>Auto save every:</value>
<value>Auto save time in minutes (0 means disabled):</value>
</data>
<data name="strAutoSaveMins" xml:space="preserve">
<value>Minutes (0 means disabled)</value>
@@ -836,7 +836,7 @@ See the Microsoft Support article at http://support.microsoft.com/kb/811833 for
<value>Import/Export</value>
</data>
<data name="strImportFileFailedContent" xml:space="preserve">
<value>An error occurred while importing the file, "{0}".</value>
<value>An error occurred while importing the file "{0}".</value>
</data>
<data name="strImportFileFailedMainInstruction" xml:space="preserve">
<value>Import failed</value>
@@ -2584,16 +2584,16 @@ This page will walk you through the process of upgrading your connections file o
<value>Warning: Restart is required to disable the themes or to completely apply a new one</value>
</data>
<data name="strOptionsThemeErrorNoThemes" xml:space="preserve">
<value>No themes are loaded, check that the default mremoteNG themes exist in the slash themes folder</value>
<value>No themes are loaded, check that the default mremoteNG themes exist in the 'themes' folder</value>
</data>
<data name="CouldNotFindExternalTool" xml:space="preserve">
<value>Could not find external tool with name "{0}"</value>
</data>
<data name="ConfigurationCreateNew" xml:space="preserve">
<value>Create a New Configuration File</value>
<value>Create a New Connection File</value>
</data>
<data name="ConfigurationFileNotFound" xml:space="preserve">
<value>The Configuration File is Missing.</value>
<data name="ConnectionFileNotFound" xml:space="preserve">
<value>The connection file could not be found.</value>
</data>
<data name="ConfigurationImportFile" xml:space="preserve">
<value>Import an Existing File</value>
@@ -2631,4 +2631,52 @@ This page will walk you through the process of upgrading your connections file o
<data name="LoadBalanceInfoUseUtf8" xml:space="preserve">
<value>Use UTF8 encoding for RDP "Load Balance Info" property</value>
</data>
<data name="strTimeoutInSeconds" xml:space="preserve">
<value>Timeout (seconds)</value>
</data>
<data name="srtWorkingDirectory" xml:space="preserve">
<value>Working directory:</value>
</data>
<data name="strRunElevated" xml:space="preserve">
<value>Run elevated</value>
</data>
<data name="strRunElevateHeader" xml:space="preserve">
<value>Run elevate</value>
</data>
<data name="strShowOnToolbarColumnHeader" xml:space="preserve">
<value>Show on toolbar column</value>
</data>
<data name="strTryToIntegrateColumnHeader" xml:space="preserve">
<value>Try to integrate</value>
</data>
<data name="strWorkingDirColumnHeader" xml:space="preserve">
<value>Working directory</value>
</data>
<data name="strLockToolbars" xml:space="preserve">
<value>Lock toolbar positions</value>
</data>
<data name="strMultiSshToolbar" xml:space="preserve">
<value>Multi SSH toolbar</value>
</data>
<data name="strImportSubOUs" xml:space="preserve">
<value>Import sub OUs</value>
</data>
<data name="strMenuLockToolbars" xml:space="preserve">
<value>Lock Toolbar Positions</value>
</data>
<data name="strMenuMultiSshToolbar" xml:space="preserve">
<value>Multi SSH Toolbar</value>
</data>
<data name="strAdvancedSecurityOptions" xml:space="preserve">
<value>AdvancedSecurityOptions</value>
</data>
<data name="strOptionsPageTitle" xml:space="preserve">
<value>mRemoteNG Options</value>
</data>
<data name="strLoadBalanceInfoUseUtf8" xml:space="preserve">
<value>Use UTF8 encoding for RDP "Load Balance Info" property</value>
</data>
<data name="strCreateEmptyPanelOnStartUp" xml:space="preserve">
<value>Create an empty panel when mRemoteNG starts</value>
</data>
</root>

View File

@@ -187,13 +187,13 @@
<value>Текущая версия</value>
</data>
<data name="strButtonBrowse" xml:space="preserve">
<value>&amp;Обзор ...</value>
<value>&amp;Обзор...</value>
</data>
<data name="strButtonCancel" xml:space="preserve">
<value>&amp;Отменить</value>
</data>
<data name="strButtonChange" xml:space="preserve">
<value>Измененить</value>
<value>Изменить</value>
</data>
<data name="strButtonClose" xml:space="preserve">
<value>&amp;Закрыть</value>
@@ -302,8 +302,8 @@
<value>GeckoFx был найден и установлен правильно.</value>
</data>
<data name="strCcICAFailed" xml:space="preserve">
<value>ICA требуется установленный XenDesktop Online Plugin и зарегистрированная библиотека wfica.ocx. Вы можете скачать клиент здесь: http://www.citrix.com/download/
Если у вас есть установленный XenDesktop Online Plugin и ничего не работает, попробуйте зарегистрировать wfica.ocx вручную.
<value>ICA требуется установленный XenDesktop Online Plugin и зарегистрированная библиотека wfica.ocx. Вы можете скачать клиент здесь: http://www.citrix.com/download/
Если у вас есть установленный XenDesktop Online Plugin и ничего не работает, попробуйте зарегистрировать wfica.ocx вручную.
Для этого откройте (Пуск - Выполнить) и введите следующую команду: regsvr32 "C:\Program Files\Citrix\ICA Client\wfica.ocx" (где C:\Program Files\Citrix \ICA Client\ это путь к XenDesktop Online Plugin).
Если у вас все же не работает ICA в mRemoteNG обратитесь на форум mRemoteNG http://forum.mremoteng.org/ "</value>
</data>
@@ -319,7 +319,7 @@
Убедитесь, что putty.exe есть в папке с mRemoteNG (по умолчанию: C:\Program Files\mRemoteNG\), или что вы указали правильный путь к исполняемому файлу PuTTY в Инструменты - Опции - Дополнительно - Путь к PuTTY)</value>
</data>
<data name="strCcPuttyOK" xml:space="preserve">
<value>Испольняемый файл PuTTY найден и готов к использованию.</value>
<value>Исполняемый файл PuTTY найден и готов к использованию.</value>
</data>
<data name="strCcRDPFailed" xml:space="preserve">
<value>Для правильной работы RDP необходимо иметь установленный Remote Desktop Connection (Terminal Services Client) 8.0. Вы можете получить его здесь: https://support.microsoft.com/kb/2592687
@@ -418,7 +418,7 @@
<value>Невозможно разобрать аргументы командной строки!</value>
</data>
<data name="strCompatibilityLenovoAutoScrollUtilityDetected" xml:space="preserve">
<value>{0} обнаружено что на этой системе работает утилита Lenovo Auto Scroll. Известно, что эта утилита вызвает проблемы с {0}. Рекомендуется отключить или удалить ее.</value>
<value>{0} обнаружено что на этой системе работает утилита Lenovo Auto Scroll. Известно, что эта утилита вызывает проблемы с {0}. Рекомендуется отключить или удалить ее.</value>
</data>
<data name="strCompatibilityProblemDetected" xml:space="preserve">
<value>Обнаружена проблема совместимости</value>
@@ -569,7 +569,7 @@
<value>Не подключать без проверки</value>
</data>
<data name="strDoubleClickTabClosesIt" xml:space="preserve">
<value>Двойной щелчок для закрытия вкладки</value>
<value>Двойной щелчок для закрытия вкладки</value>
</data>
<data name="strDownloadAndInstall" xml:space="preserve">
<value>Загрузка и установка</value>
@@ -605,7 +605,7 @@
<value>Конечный IP</value>
</data>
<data name="strEndPort" xml:space="preserve">
<value>Конечн. порт</value>
<value>Конечный порт</value>
</data>
<data name="strErrorAddExternalToolsToToolBarFailed" xml:space="preserve">
<value>Ошибка добавления внешнего приложения на Панель (frmMain). {0}</value>
@@ -711,7 +711,7 @@
<value>Соединение</value>
</data>
<data name="strGroupboxExternalToolProperties" xml:space="preserve">
<value>Свройства внешнего инструмента</value>
<value>Свойства внешнего инструмента</value>
</data>
<data name="strGroupboxFiles" xml:space="preserve">
<value>Файлы</value>
@@ -825,7 +825,7 @@
<value>&amp;Подключение:</value>
</data>
<data name="strLabelDisplayName" xml:space="preserve">
<value>Отображаемое имя</value>
<value>Отображаемое имя:</value>
</data>
<data name="strLabelDomain" xml:space="preserve">
<value>Домен:</value>
@@ -855,7 +855,7 @@
<value>Нажмите на эту кнопку для настройки сессий PuTTY:</value>
</data>
<data name="strLabelPuttyTimeout" xml:space="preserve">
<value>Max. PuTTY &amp;&amp; Integrated Ext. Apps wait time:</value>
<value>Максимальное время ожидание PuTTY и внешнего приложения:</value>
</data>
<data name="strLabelReleasedUnderGPL" xml:space="preserve">
<value>Выпущено под лицензией GNU General Public License (GPL)</value>
@@ -897,7 +897,7 @@
<value>Загрузить из XML не удалось!</value>
</data>
<data name="strLocalFile" xml:space="preserve">
<value>Локал. файл</value>
<value>Локальный файл</value>
</data>
<data name="strLocalFileDoesNotExist" xml:space="preserve">
<value>Локальный файл не существует!</value>
@@ -951,10 +951,10 @@
<value>Удалить...</value>
</data>
<data name="strMenuDeleteConnection" xml:space="preserve">
<value>Удалить подключение ...</value>
<value>Удалить подключение...</value>
</data>
<data name="strMenuDeleteExternalTool" xml:space="preserve">
<value>Удалить Внешний инструмент...</value>
<value>Удалить внешний инструмент...</value>
</data>
<data name="strMenuDeleteFolder" xml:space="preserve">
<value>Удалить папку...</value>
@@ -1270,7 +1270,7 @@
<value>Это имя, которое будет отображаться в дереве подключений.</value>
</data>
<data name="strPropertyDescriptionPanel" xml:space="preserve">
<value>Устанавить панель, в которой будет открыто подключение.</value>
<value>Установить панель, в которой будет открыто подключение.</value>
</data>
<data name="strPropertyDescriptionPassword" xml:space="preserve">
<value>Введите пароль.</value>
@@ -1579,7 +1579,7 @@
<value>Ошибка добавления Быстрого подключения!</value>
</data>
<data name="strQuickConnectFailed" xml:space="preserve">
<value>Созданить быстрое подключение не удалось</value>
<value>Создать быстрое подключение не удалось</value>
</data>
<data name="strRadioCloseWarnAll" xml:space="preserve">
<value>Предупреждать при закрытии подключений</value>
@@ -1705,7 +1705,7 @@
<value>Ошибка сессии!</value>
</data>
<data name="strRdpReconnectCount" xml:space="preserve">
<value>К-ство переподключений RDP:</value>
<value>Количество переподключений RDP:</value>
</data>
<data name="strRdpSetAuthenticationLevelFailed" xml:space="preserve">
<value>RDP: Установить уровень проверки подлинности не удалась!</value>
@@ -1768,7 +1768,7 @@
<value>Обновление</value>
</data>
<data name="strRemoteFile" xml:space="preserve">
<value>Удаленн. файл</value>
<value>Удалить файл</value>
</data>
<data name="strRemoveAll" xml:space="preserve">
<value>Удалить все</value>
@@ -1885,7 +1885,7 @@
<value>Фоновая передача по SSH - не удалась!</value>
</data>
<data name="strSSHTranferSuccessful" xml:space="preserve">
<value>Передано успешо!</value>
<value>Передано успешно!</value>
</data>
<data name="strSSHTransferEndFailed" xml:space="preserve">
<value>Передача по SSH завершена с ошибкой (UI.Window.SSHTransfer)!</value>
@@ -1897,7 +1897,7 @@
<value>Начальный IP</value>
</data>
<data name="strStartPort" xml:space="preserve">
<value>Начальн. порт</value>
<value>Начальный порт</value>
</data>
<data name="strStartupExit" xml:space="preserve">
<value>Запуск / Выход</value>
@@ -2080,7 +2080,7 @@
<value>Требуется обновление mRemoteNG</value>
</data>
<data name="strUpdateCheck" xml:space="preserve">
<value>mRemoteNG может периодически подключаться к сайту mRemoteNG для проверки наличия обновлений.</value>
<value>mRemoteNG может периодически подключаться к сайту mRemoteNG для проверки наличия обновлений.</value>
</data>
<data name="strUpdateCheckCompleteFailed" xml:space="preserve">
<value>Не удалось завершить проверку обновлений!</value>
@@ -2191,4 +2191,76 @@ mRemoteNG сейчас прекратит работу и начнет проц
<data name="strMenuReconnectAll" xml:space="preserve">
<value>Переподключить все открытые соединения</value>
</data>
<data name="srtWorkingDirectory" xml:space="preserve">
<value>Рабочий каталог:</value>
</data>
<data name="strButtonLaunch" xml:space="preserve">
<value>Запуск</value>
</data>
<data name="strRunElevated" xml:space="preserve">
<value>Выполнить с повышенными правами</value>
</data>
<data name="strRunElevateHeader" xml:space="preserve">
<value>Выполнить с повышенными правами</value>
</data>
<data name="strShowOnToolbar" xml:space="preserve">
<value>Отобразить на панели инструментов:</value>
</data>
<data name="strShowOnToolbarColumnHeader" xml:space="preserve">
<value>Отобразить на панели инструментов</value>
</data>
<data name="strTryToIntegrateColumnHeader" xml:space="preserve">
<value>Попробовать интегрировать</value>
</data>
<data name="strWorkingDirColumnHeader" xml:space="preserve">
<value>Рабочий каталог</value>
</data>
<data name="strExportToFileMenuItem" xml:space="preserve">
<value>Экспорт в файл...</value>
</data>
<data name="strImportFromFileMenuItem" xml:space="preserve">
<value>Импорт из файла...</value>
</data>
<data name="strImportMenuItem" xml:space="preserve">
<value>Импорт</value>
</data>
<data name="strLockToolbars" xml:space="preserve">
<value>Закрепить позицию панели инструментов</value>
</data>
<data name="strMultiSshToolbar" xml:space="preserve">
<value>Панель инструментов SSH</value>
</data>
<data name="strAssignedCredential" xml:space="preserve">
<value>Назначенные учетные данные</value>
</data>
<data name="strExportEverything" xml:space="preserve">
<value>Экспортировать все</value>
</data>
<data name="strExportFile" xml:space="preserve">
<value>Файл экспорта</value>
</data>
<data name="strExportItems" xml:space="preserve">
<value>Пункт импорта</value>
</data>
<data name="strExportProperties" xml:space="preserve">
<value>Экспорт свойств</value>
</data>
<data name="strExportSelectedConnection" xml:space="preserve">
<value>Экспорт выбранного соединения</value>
</data>
<data name="strExportSelectedFolder" xml:space="preserve">
<value>Экспорт выбранной папки</value>
</data>
<data name="strFileFormatLabel" xml:space="preserve">
<value>Формат файла:</value>
</data>
<data name="strImportSubOUs" xml:space="preserve">
<value>Импорт подразделений</value>
</data>
<data name="strLoadBalanceInfoUseUtf8" xml:space="preserve">
<value>Используйте кодировку UTF8 для свойства RDP "Load Balance Info"</value>
</data>
<data name="strTimeoutInSeconds" xml:space="preserve">
<value>Время ожидания в секундах:</value>
</data>
</root>

View File

@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="mremoteng_confcons_v2_6"
targetNamespace="http://mremoteng.org"
elementFormDefault="qualified"
xmlns="http://mremoteng.org"
xmlns:mrng="http://mremoteng.org"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="unqualified"
>
<xs:element name="Connections">
<xs:complexType>
<xs:sequence>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="Node" type="mrng:connectioninfo" />
</xs:sequence>
<xs:attribute name="Name" type="xs:string" use="required" />
@@ -31,6 +31,7 @@
</xs:sequence>
<xs:attribute name="Name" type="xs:string" use="required" />
<xs:attribute name="Type" type="xs:string" use="required" />
<xs:attribute name="Expanded" type="xs:boolean" use="optional" />
<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" />

View File

@@ -5,21 +5,50 @@ namespace mRemoteNG.Tools
{
public static class Extensions
{
public static Maybe<T> Maybe<T>(this T value)
public static Optional<T> Maybe<T>(this T value)
{
return new Maybe<T>(value);
return new Optional<T>(value);
}
public static Maybe<U> MaybeParse<T, U>(this T value, Func<T, U> parseFunc)
public static Optional<U> MaybeParse<T, U>(this T value, Func<T, U> parseFunc)
{
try
{
return new Maybe<U>(parseFunc(value));
return new Optional<U>(parseFunc(value));
}
catch
{
return new Maybe<U>();
return new Optional<U>();
}
}
/// <summary>
/// Throws an <see cref="ArgumentNullException"/> if the given value is
/// null. Otherwise, return the value.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <param name="argName">
/// The name of the argument
/// </param>
public static T ThrowIfNull<T>(this T value, string argName)
{
if (value == null)
throw new ArgumentNullException(argName);
return value;
}
/// <summary>
/// Throws an <see cref="ArgumentException"/> if the value
/// is null or an empty string. Otherwise, returns the value.
/// </summary>
/// <param name="value"></param>
/// <param name="argName"></param>
public static string ThrowIfNullOrEmpty(this string value, string argName)
{
if (string.IsNullOrEmpty(value))
throw new ArgumentException("Value cannot be null or empty", argName);
return value;
}
}
}

View File

@@ -12,7 +12,7 @@ using static System.String;
namespace mRemoteNG.Tools
{
public static class MiscTools
public static class MiscTools
{
public static Icon GetIconFromFile(string FileName)
{
@@ -68,13 +68,6 @@ namespace mRemoteNG.Tools
{
return Text.Replace("\'", "\'\'");
}
public static object StringToEnum(Type t, string value)
{
return Enum.Parse(t, value);
}
public static string GetExceptionMessageRecursive(Exception ex)
{

View File

@@ -4,16 +4,16 @@ using System.Linq;
namespace mRemoteNG.Tools
{
public class Maybe<T> : IEnumerable<T>
public class Optional<T> : IEnumerable<T>
{
private readonly T[] _maybe;
public Maybe()
public Optional()
{
_maybe = new T[0];
}
public Maybe(T value)
public Optional(T value)
{
_maybe = value != null
? new[] {value}
@@ -35,16 +35,16 @@ namespace mRemoteNG.Tools
return _maybe.Any() ? _maybe.First().ToString() : "";
}
public static implicit operator Maybe<T>(T value)
public static implicit operator Optional<T>(T value)
{
return new Maybe<T>(value);
return new Optional<T>(value);
}
public static Maybe<TOut> FromNullable<TOut>(TOut? value) where TOut : struct
public static Optional<TOut> FromNullable<TOut>(TOut? value) where TOut : struct
{
return value.HasValue
? new Maybe<TOut>(value.Value)
: new Maybe<TOut>();
? new Optional<TOut>(value.Value)
: new Optional<TOut>();
}
}
}

View File

@@ -17,17 +17,24 @@ namespace mRemoteNG.Tools
private readonly List<int> _ports = new List<int>();
private Thread _scanThread;
private readonly List<ScanHost> _scannedHosts = new List<ScanHost>();
private readonly int _timeoutInMilliseconds;
#region Public Methods
public PortScanner(IPAddress ipAddress1, IPAddress ipAddress2, int port1, int port2)
public PortScanner(IPAddress ipAddress1, IPAddress ipAddress2, int port1, int port2, int timeoutInMilliseconds = 5000)
{
var ipAddressStart = IpAddressMin(ipAddress1, ipAddress2);
var ipAddressEnd = IpAddressMax(ipAddress1, ipAddress2);
var portStart = Math.Min(port1, port2);
var portEnd = Math.Max(port1, port2);
if (timeoutInMilliseconds < 0)
throw new ArgumentOutOfRangeException(nameof(timeoutInMilliseconds));
_timeoutInMilliseconds = timeoutInMilliseconds;
_ports.Clear();
for (var port = portStart; port <= portEnd; port++)
{
@@ -87,7 +94,7 @@ namespace mRemoteNG.Tools
try
{
pingSender.PingCompleted += PingSender_PingCompleted;
pingSender.SendAsync(ipAddress, ipAddress);
pingSender.SendAsync(ipAddress, _timeoutInMilliseconds, ipAddress);
}
catch (Exception ex)
{

View File

@@ -8,7 +8,7 @@ using mRemoteNG.Tree.Root;
namespace mRemoteNG.Tree
{
public sealed class ConnectionTreeModel : INotifyCollectionChanged, INotifyPropertyChanged
public sealed class ConnectionTreeModel : INotifyCollectionChanged, INotifyPropertyChanged
{
public List<ContainerInfo> RootNodes { get; } = new List<ContainerInfo>();
@@ -30,7 +30,7 @@ namespace mRemoteNG.Tree
RaiseCollectionChangedEvent(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, rootNode));
}
public IEnumerable<ConnectionInfo> GetRecursiveChildList()
public IReadOnlyList<ConnectionInfo> GetRecursiveChildList()
{
var list = new List<ConnectionInfo>();
foreach (var rootNode in RootNodes)

View File

@@ -5,7 +5,7 @@ using mRemoteNG.Connection;
namespace mRemoteNG.Tree
{
public class NodeSearcher
public class NodeSearcher
{
private readonly ConnectionTreeModel _connectionTreeModel;
@@ -22,7 +22,7 @@ namespace mRemoteNG.Tree
{
ResetMatches();
if (searchText == "") return Matches;
var nodes = (List<ConnectionInfo>)_connectionTreeModel.GetRecursiveChildList();
var nodes = _connectionTreeModel.GetRecursiveChildList();
var searchTextLower = searchText.ToLowerInvariant();
foreach (var node in nodes)
{

View File

@@ -1,8 +1,8 @@
using mRemoteNG.Tools;
using System;
using System.ComponentModel;
using System.Security;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Security;
using mRemoteNG.Tools;
namespace mRemoteNG.Tree.Root
@@ -13,11 +13,17 @@ namespace mRemoteNG.Tree.Root
private string _name;
private string _customPassword = "";
public RootNodeInfo(RootNodeType rootType)
public RootNodeInfo(RootNodeType rootType, string uniqueId)
: base(uniqueId)
{
_name = Language.strConnections;
Type = rootType;
}
public RootNodeInfo(RootNodeType rootType)
: this(rootType, Guid.NewGuid().ToString())
{
}
#region Public Properties
@@ -63,5 +69,17 @@ namespace mRemoteNG.Tree.Root
return TreeNodeType.Root;
}
#endregion
}
public override void AddChildAt(ConnectionInfo newChildItem, int index)
{
newChildItem.Inheritance.DisableInheritance();
base.AddChildAt(newChildItem, index);
}
public override void RemoveChild(ConnectionInfo removalTarget)
{
removalTarget.Inheritance.EnableInheritance();
base.RemoveChild(removalTarget);
}
}
}

View File

@@ -272,6 +272,7 @@ namespace mRemoteNG.UI.Controls
Expand(parent);
SelectObject(newNode, true);
EnsureModelVisible(newNode);
_allowEdit = true;
SelectedItem.BeginEdit();
}

View File

@@ -5,6 +5,7 @@ using System.Windows.Forms;
using mRemoteNG.App;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Container;
using mRemoteNG.Themes;
using mRemoteNG.Tools;
@@ -232,10 +233,19 @@ namespace mRemoteNG.UI.Controls
private void ConnectionsMenuItem_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Left) return;
var tag = ((ToolStripMenuItem)sender).Tag as ConnectionInfo;
if (tag != null)
var menuItem = (ToolStripMenuItem) sender;
// While we can connect to a whole folder at once, it is
// probably not the expected behavior when navigating through
// a nested menu. Just return
var containerInfo = menuItem.Tag as ContainerInfo;
if (containerInfo != null)
return;
var connectionInfo = menuItem.Tag as ConnectionInfo;
if (connectionInfo != null)
{
ConnectionInitiator.OpenConnection(tag);
ConnectionInitiator.OpenConnection(connectionInfo);
}
}
#endregion

View File

@@ -32,7 +32,7 @@ namespace mRemoteNG.UI.Forms.OptionsPages
lblSeconds.Text = Language.strLabelSeconds;
lblMaximumPuttyWaitTime.Text = Language.strLabelPuttyTimeout;
chkAutomaticReconnect.Text = Language.strCheckboxAutomaticReconnect;
chkLoadBalanceInfoUseUtf8.Text = Language.LoadBalanceInfoUseUtf8;
chkLoadBalanceInfoUseUtf8.Text = Language.strLoadBalanceInfoUseUtf8;
lblConfigurePuttySessions.Text = Language.strLabelPuttySessionsConfig;
btnLaunchPutty.Text = Language.strButtonLaunchPutty;
btnBrowseCustomPuttyPath.Text = Language.strButtonBrowse;

View File

@@ -85,20 +85,20 @@ namespace mRemoteNG.UI.Forms.OptionsPages
//
// lblRDPConTimeout
//
this.lblRDPConTimeout.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblRDPConTimeout.Location = new System.Drawing.Point(3, 6);
this.lblRDPConTimeout.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblRDPConTimeout.Location = new System.Drawing.Point(3, 0);
this.lblRDPConTimeout.Name = "lblRDPConTimeout";
this.lblRDPConTimeout.Size = new System.Drawing.Size(137, 13);
this.lblRDPConTimeout.Size = new System.Drawing.Size(261, 26);
this.lblRDPConTimeout.TabIndex = 0;
this.lblRDPConTimeout.Text = "RDP Connection Timeout";
this.lblRDPConTimeout.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// lblRdpReconnectionCount
//
this.lblRdpReconnectionCount.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblRdpReconnectionCount.Location = new System.Drawing.Point(3, 6);
this.lblRdpReconnectionCount.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblRdpReconnectionCount.Location = new System.Drawing.Point(3, 0);
this.lblRdpReconnectionCount.Name = "lblRdpReconnectionCount";
this.lblRdpReconnectionCount.Size = new System.Drawing.Size(139, 13);
this.lblRdpReconnectionCount.Size = new System.Drawing.Size(261, 26);
this.lblRdpReconnectionCount.TabIndex = 0;
this.lblRdpReconnectionCount.Text = "RDP Reconnection Count";
this.lblRdpReconnectionCount.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
@@ -156,10 +156,10 @@ namespace mRemoteNG.UI.Forms.OptionsPages
//
// lblAutoSave1
//
this.lblAutoSave1.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblAutoSave1.Location = new System.Drawing.Point(3, 6);
this.lblAutoSave1.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblAutoSave1.Location = new System.Drawing.Point(3, 0);
this.lblAutoSave1.Name = "lblAutoSave1";
this.lblAutoSave1.Size = new System.Drawing.Size(261, 13);
this.lblAutoSave1.Size = new System.Drawing.Size(261, 26);
this.lblAutoSave1.TabIndex = 0;
this.lblAutoSave1.Text = "Auto Save in Minutes (0 means disabled)";
this.lblAutoSave1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;

View File

@@ -28,6 +28,7 @@ namespace mRemoteNG.UI.Forms.OptionsPages
labelBlockCipher.Text = Language.strEncryptionBlockCipherMode;
labelEncryptionEngine.Text = Language.strEncryptionEngine;
labelKdfIterations.Text = Language.strEncryptionKeyDerivationIterations;
groupAdvancedSecurityOptions.Text = Language.strAdvancedSecurityOptions;
}
public override void LoadSettings()

View File

@@ -38,6 +38,9 @@ namespace mRemoteNG.UI.Forms.OptionsPages
this.chkShowLogonInfoOnTabs = new mRemoteNG.UI.Controls.Base.NGCheckBox();
this.chkDoubleClickClosesTab = new mRemoteNG.UI.Controls.Base.NGCheckBox();
this.chkShowProtocolOnTabs = new mRemoteNG.UI.Controls.Base.NGCheckBox();
this.chkCreateEmptyPanelOnStart = new mRemoteNG.UI.Controls.Base.NGCheckBox();
this.txtBoxPanelName = new mRemoteNG.UI.Controls.Base.NGTextBox();
this.lblPanelName = new mRemoteNG.UI.Controls.Base.NGLabel();
this.SuspendLayout();
//
// chkAlwaysShowPanelTabs
@@ -117,10 +120,41 @@ namespace mRemoteNG.UI.Forms.OptionsPages
this.chkShowProtocolOnTabs.Text = "Show protocols on tab names";
this.chkShowProtocolOnTabs.UseVisualStyleBackColor = true;
//
// chkCreateEmptyPanelOnStart
//
this.chkCreateEmptyPanelOnStart._mice = mRemoteNG.UI.Controls.Base.NGCheckBox.MouseState.HOVER;
this.chkCreateEmptyPanelOnStart.AutoSize = true;
this.chkCreateEmptyPanelOnStart.Location = new System.Drawing.Point(3, 164);
this.chkCreateEmptyPanelOnStart.Name = "chkCreateEmptyPanelOnStart";
this.chkCreateEmptyPanelOnStart.Size = new System.Drawing.Size(253, 17);
this.chkCreateEmptyPanelOnStart.TabIndex = 7;
this.chkCreateEmptyPanelOnStart.Text = "Create an empty panel when mRemoteNG starts";
this.chkCreateEmptyPanelOnStart.UseVisualStyleBackColor = true;
this.chkCreateEmptyPanelOnStart.CheckedChanged += new System.EventHandler(this.chkCreateEmptyPanelOnStart_CheckedChanged);
//
// txtBoxPanelName
//
this.txtBoxPanelName.Location = new System.Drawing.Point(43, 200);
this.txtBoxPanelName.Name = "txtBoxPanelName";
this.txtBoxPanelName.Size = new System.Drawing.Size(213, 20);
this.txtBoxPanelName.TabIndex = 8;
//
// lblPanelName
//
this.lblPanelName.AutoSize = true;
this.lblPanelName.Location = new System.Drawing.Point(40, 184);
this.lblPanelName.Name = "lblPanelName";
this.lblPanelName.Size = new System.Drawing.Size(66, 13);
this.lblPanelName.TabIndex = 9;
this.lblPanelName.Text = "Panel name:";
//
// TabsPanelsPage
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.lblPanelName);
this.Controls.Add(this.txtBoxPanelName);
this.Controls.Add(this.chkCreateEmptyPanelOnStart);
this.Controls.Add(this.chkAlwaysShowPanelTabs);
this.Controls.Add(this.chkIdentifyQuickConnectTabs);
this.Controls.Add(this.chkOpenNewTabRightOfSelected);
@@ -142,6 +176,8 @@ namespace mRemoteNG.UI.Forms.OptionsPages
internal Controls.Base.NGCheckBox chkShowLogonInfoOnTabs;
internal Controls.Base.NGCheckBox chkDoubleClickClosesTab;
internal Controls.Base.NGCheckBox chkShowProtocolOnTabs;
}
private Controls.Base.NGCheckBox chkCreateEmptyPanelOnStart;
private Controls.Base.NGTextBox txtBoxPanelName;
private Controls.Base.NGLabel lblPanelName;
}
}

View File

@@ -25,6 +25,8 @@ namespace mRemoteNG.UI.Forms.OptionsPages
chkIdentifyQuickConnectTabs.Text = Language.strIdentifyQuickConnectTabs;
chkDoubleClickClosesTab.Text = Language.strDoubleClickTabClosesIt;
chkAlwaysShowPanelSelectionDlg.Text = Language.strAlwaysShowPanelSelection;
chkCreateEmptyPanelOnStart.Text = Language.strCreateEmptyPanelOnStartUp;
lblPanelName.Text = $"{Language.strPanelName}:";
}
public override void LoadSettings()
@@ -38,6 +40,9 @@ namespace mRemoteNG.UI.Forms.OptionsPages
chkIdentifyQuickConnectTabs.Checked = Settings.Default.IdentifyQuickConnectTabs;
chkDoubleClickClosesTab.Checked = Settings.Default.DoubleClickOnTabClosesIt;
chkAlwaysShowPanelSelectionDlg.Checked = Settings.Default.AlwaysShowPanelSelectionDlg;
chkCreateEmptyPanelOnStart.Checked = Settings.Default.CreateEmptyPanelOnStartUp;
txtBoxPanelName.Text = Settings.Default.StartUpPanelName;
UpdatePanelNameTextBox();
}
public override void SaveSettings()
@@ -53,8 +58,20 @@ namespace mRemoteNG.UI.Forms.OptionsPages
Settings.Default.IdentifyQuickConnectTabs = chkIdentifyQuickConnectTabs.Checked;
Settings.Default.DoubleClickOnTabClosesIt = chkDoubleClickClosesTab.Checked;
Settings.Default.AlwaysShowPanelSelectionDlg = chkAlwaysShowPanelSelectionDlg.Checked;
Settings.Default.CreateEmptyPanelOnStartUp = chkCreateEmptyPanelOnStart.Checked;
Settings.Default.StartUpPanelName = txtBoxPanelName.Text;
Settings.Default.Save();
}
private void UpdatePanelNameTextBox()
{
txtBoxPanelName.Enabled = chkCreateEmptyPanelOnStart.Checked;
}
private void chkCreateEmptyPanelOnStart_CheckedChanged(object sender, System.EventArgs e)
{
UpdatePanelNameTextBox();
}
}
}

View File

@@ -30,21 +30,17 @@ namespace mRemoteNG.UI.Forms
mRemoteNG.Connection.ConnectionInitiator connectionInitiator1 = new mRemoteNG.Connection.ConnectionInitiator();
this.pnlDock = new WeifenLuo.WinFormsUI.Docking.DockPanel();
this.msMain = new System.Windows.Forms.MenuStrip();
this.mMenFile = new System.Windows.Forms.ToolStripMenuItem();
this.mMenView = new System.Windows.Forms.ToolStripMenuItem();
this.mMenTools = new System.Windows.Forms.ToolStripMenuItem();
this.mMenInfo = new System.Windows.Forms.ToolStripMenuItem();
this.fileMenu = new mRemoteNG.UI.Menu.MainFileMenu();
this.viewMenu = new mRemoteNG.UI.Menu.ViewMenu();
this.toolsMenu = new mRemoteNG.UI.Menu.ToolsMenu();
this.helpMenu = new mRemoteNG.UI.Menu.HelpMenu();
this.mMenSep3 = new System.Windows.Forms.ToolStripSeparator();
this.tsContainer = new System.Windows.Forms.ToolStripContainer();
this.tmrAutoSave = new System.Windows.Forms.Timer(this.components);
this.vsToolStripExtender = new WeifenLuo.WinFormsUI.Docking.VisualStudioToolStripExtender(this.components);
this._quickConnectToolStrip = new mRemoteNG.UI.Controls.QuickConnectToolStrip();
this._multiSshToolStrip = new mRemoteNG.UI.Controls.MultiSshToolStrip();
this._externalToolsToolStrip = new mRemoteNG.UI.Controls.ExternalToolsToolStrip();
this._quickConnectToolStrip = new mRemoteNG.UI.Controls.QuickConnectToolStrip();
this.mainFileMenu1 = new mRemoteNG.UI.Menu.MainFileMenu();
this.viewMenu1 = new mRemoteNG.UI.Menu.ViewMenu();
this.toolsMenu1 = new mRemoteNG.UI.Menu.ToolsMenu();
this.helpMenu1 = new mRemoteNG.UI.Menu.HelpMenu();
this.tmrAutoSave = new System.Windows.Forms.Timer(this.components);
this.vsToolStripExtender = new WeifenLuo.WinFormsUI.Docking.VisualStudioToolStripExtender(this.components);
this.msMain.SuspendLayout();
this.tsContainer.ContentPanel.SuspendLayout();
this.tsContainer.TopToolStripPanel.SuspendLayout();
@@ -60,7 +56,7 @@ namespace mRemoteNG.UI.Forms
this.pnlDock.DocumentStyle = WeifenLuo.WinFormsUI.Docking.DocumentStyle.DockingSdi;
this.pnlDock.Location = new System.Drawing.Point(0, 0);
this.pnlDock.Name = "pnlDock";
this.pnlDock.Size = new System.Drawing.Size(966, 473);
this.pnlDock.Size = new System.Drawing.Size(1129, 472);
this.pnlDock.TabIndex = 13;
this.pnlDock.ActiveDocumentChanged += new System.EventHandler(this.pnlDock_ActiveDocumentChanged);
//
@@ -69,12 +65,13 @@ namespace mRemoteNG.UI.Forms
this.msMain.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.msMain.Dock = System.Windows.Forms.DockStyle.None;
this.msMain.GripMargin = new System.Windows.Forms.Padding(0);
this.msMain.GripStyle = System.Windows.Forms.ToolStripGripStyle.Visible;
this.msMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mainFileMenu1,
this.viewMenu1,
this.toolsMenu1,
this.helpMenu1});
this.msMain.Location = new System.Drawing.Point(3, 0);
this.fileMenu,
this.viewMenu,
this.toolsMenu,
this.helpMenu});
this.msMain.Location = new System.Drawing.Point(3, 50);
this.msMain.Name = "msMain";
this.msMain.Padding = new System.Windows.Forms.Padding(2, 2, 0, 2);
this.msMain.Size = new System.Drawing.Size(176, 24);
@@ -82,25 +79,41 @@ namespace mRemoteNG.UI.Forms
this.msMain.TabIndex = 0;
this.msMain.Text = "Main Toolbar";
//
// mMenFile
// fileMenu
//
this.mMenFile.Name = "mMenFile";
this.mMenFile.Size = new System.Drawing.Size(32, 19);
this.fileMenu.ConnectionInitiator = null;
this.fileMenu.Name = "mMenFile";
this.fileMenu.Size = new System.Drawing.Size(37, 20);
this.fileMenu.Text = "&File";
this.fileMenu.TreeWindow = null;
this.fileMenu.DropDownOpening += new System.EventHandler(this.mainFileMenu1_DropDownOpening);
//
// mMenView
// viewMenu
//
this.mMenView.Name = "mMenView";
this.mMenView.Size = new System.Drawing.Size(32, 19);
this.viewMenu.FullscreenHandler = null;
this.viewMenu.MainForm = null;
this.viewMenu.Name = "mMenView";
this.viewMenu.Size = new System.Drawing.Size(44, 20);
this.viewMenu.Text = "&View";
this.viewMenu.TsExternalTools = null;
this.viewMenu.TsMultiSsh = null;
this.viewMenu.TsQuickConnect = null;
this.viewMenu.DropDownOpening += new System.EventHandler(this.ViewMenu_Opening);
//
// mMenTools
// toolsMenu
//
this.mMenTools.Name = "mMenTools";
this.mMenTools.Size = new System.Drawing.Size(32, 19);
this.toolsMenu.CredentialProviderCatalog = null;
this.toolsMenu.MainForm = null;
this.toolsMenu.Name = "mMenTools";
this.toolsMenu.Size = new System.Drawing.Size(47, 20);
this.toolsMenu.Text = "&Tools";
//
// mMenInfo
// helpMenu
//
this.mMenInfo.Name = "mMenInfo";
this.mMenInfo.Size = new System.Drawing.Size(32, 19);
this.helpMenu.Name = "mMenInfo";
this.helpMenu.Size = new System.Drawing.Size(44, 20);
this.helpMenu.Text = "&Help";
this.helpMenu.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
//
// mMenSep3
//
@@ -113,29 +126,32 @@ namespace mRemoteNG.UI.Forms
// tsContainer.ContentPanel
//
this.tsContainer.ContentPanel.Controls.Add(this.pnlDock);
this.tsContainer.ContentPanel.Size = new System.Drawing.Size(966, 473);
this.tsContainer.ContentPanel.Size = new System.Drawing.Size(1129, 472);
this.tsContainer.Dock = System.Windows.Forms.DockStyle.Fill;
this.tsContainer.Location = new System.Drawing.Point(0, 0);
this.tsContainer.Name = "tsContainer";
this.tsContainer.Size = new System.Drawing.Size(966, 523);
this.tsContainer.Size = new System.Drawing.Size(1129, 571);
this.tsContainer.TabIndex = 17;
this.tsContainer.Text = "ToolStripContainer1";
//
// tsContainer.TopToolStripPanel
//
this.tsContainer.TopToolStripPanel.Controls.Add(this.msMain);
this.tsContainer.TopToolStripPanel.Controls.Add(this._externalToolsToolStrip);
this.tsContainer.TopToolStripPanel.Controls.Add(this._quickConnectToolStrip);
this.tsContainer.TopToolStripPanel.Controls.Add(this._multiSshToolStrip);
this.tsContainer.TopToolStripPanel.Controls.Add(this.msMain);
this.tsContainer.TopToolStripPanel.Controls.Add(this._externalToolsToolStrip);
//
// tmrAutoSave
// _quickConnectToolStrip
//
this.tmrAutoSave.Interval = 10000;
this.tmrAutoSave.Tick += new System.EventHandler(this.tmrAutoSave_Tick);
//
// vsToolStripExtender
//
this.vsToolStripExtender.DefaultRenderer = null;
this._quickConnectToolStrip.BackColor = System.Drawing.SystemColors.Control;
this._quickConnectToolStrip.ConnectionInitiator = connectionInitiator1;
this._quickConnectToolStrip.Dock = System.Windows.Forms.DockStyle.None;
this._quickConnectToolStrip.ForeColor = System.Drawing.SystemColors.ControlText;
this._quickConnectToolStrip.Location = new System.Drawing.Point(3, 0);
this._quickConnectToolStrip.MaximumSize = new System.Drawing.Size(0, 25);
this._quickConnectToolStrip.Name = "_quickConnectToolStrip";
this._quickConnectToolStrip.Size = new System.Drawing.Size(364, 25);
this._quickConnectToolStrip.TabIndex = 18;
//
// _multiSshToolStrip
//
@@ -152,68 +168,30 @@ namespace mRemoteNG.UI.Forms
this._externalToolsToolStrip.BackColor = System.Drawing.SystemColors.Control;
this._externalToolsToolStrip.Dock = System.Windows.Forms.DockStyle.None;
this._externalToolsToolStrip.ForeColor = System.Drawing.SystemColors.ControlText;
this._externalToolsToolStrip.Location = new System.Drawing.Point(380, 25);
this._externalToolsToolStrip.Location = new System.Drawing.Point(39, 74);
this._externalToolsToolStrip.MaximumSize = new System.Drawing.Size(0, 25);
this._externalToolsToolStrip.Name = "_externalToolsToolStrip";
this._externalToolsToolStrip.Size = new System.Drawing.Size(111, 25);
this._externalToolsToolStrip.TabIndex = 17;
//
// _quickConnectToolStrip
// tmrAutoSave
//
this._quickConnectToolStrip.BackColor = System.Drawing.SystemColors.Control;
this._quickConnectToolStrip.ConnectionInitiator = connectionInitiator1;
this._quickConnectToolStrip.Dock = System.Windows.Forms.DockStyle.None;
this._quickConnectToolStrip.ForeColor = System.Drawing.SystemColors.ControlText;
this._quickConnectToolStrip.Location = new System.Drawing.Point(179, 0);
this._quickConnectToolStrip.MaximumSize = new System.Drawing.Size(0, 25);
this._quickConnectToolStrip.Name = "_quickConnectToolStrip";
this._quickConnectToolStrip.Size = new System.Drawing.Size(364, 25);
this._quickConnectToolStrip.TabIndex = 18;
this.tmrAutoSave.Interval = 10000;
this.tmrAutoSave.Tick += new System.EventHandler(this.tmrAutoSave_Tick);
//
// mainFileMenu1
// vsToolStripExtender
//
this.mainFileMenu1.ConnectionInitiator = null;
this.mainFileMenu1.Name = "mMenFile";
this.mainFileMenu1.Size = new System.Drawing.Size(37, 20);
this.mainFileMenu1.Text = "&File";
this.mainFileMenu1.TreeWindow = null;
this.mainFileMenu1.DropDownOpening += new System.EventHandler(this.mainFileMenu1_DropDownOpening);
//
// viewMenu1
//
this.viewMenu1.FullscreenHandler = null;
this.viewMenu1.MainForm = null;
this.viewMenu1.Name = "mMenView";
this.viewMenu1.Size = new System.Drawing.Size(44, 20);
this.viewMenu1.Text = "&View";
this.viewMenu1.TsExternalTools = null;
this.viewMenu1.TsMultiSsh = null;
this.viewMenu1.TsQuickConnect = null;
this.viewMenu1.DropDownOpening += new System.EventHandler(this.ViewMenu_Opening);
//
// toolsMenu1
//
this.toolsMenu1.CredentialProviderCatalog = null;
this.toolsMenu1.MainForm = null;
this.toolsMenu1.Name = "mMenTools";
this.toolsMenu1.Size = new System.Drawing.Size(47, 20);
this.toolsMenu1.Text = "&Tools";
//
// helpMenu1
//
this.helpMenu1.Name = "mMenInfo";
this.helpMenu1.Size = new System.Drawing.Size(44, 20);
this.helpMenu1.Text = "&Help";
this.helpMenu1.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
this.vsToolStripExtender.DefaultRenderer = null;
//
// FrmMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(966, 523);
this.ClientSize = new System.Drawing.Size(1129, 571);
this.Controls.Add(this.tsContainer);
this.Icon = global::mRemoteNG.Resources.mRemote_Icon;
this.MainMenuStrip = this.msMain;
this.MinimumSize = new System.Drawing.Size(1145, 610);
this.Name = "FrmMain";
this.Opacity = 0D;
this.Text = "mRemoteNG";
@@ -235,18 +213,14 @@ namespace mRemoteNG.UI.Forms
}
internal WeifenLuo.WinFormsUI.Docking.DockPanel pnlDock;
internal System.Windows.Forms.MenuStrip msMain;
internal System.Windows.Forms.ToolStripMenuItem mMenFile;
internal System.Windows.Forms.ToolStripMenuItem mMenView;
internal System.Windows.Forms.ToolStripMenuItem mMenTools;
internal System.Windows.Forms.ToolStripMenuItem mMenInfo;
internal System.Windows.Forms.ToolStripContainer tsContainer;
internal System.Windows.Forms.Timer tmrAutoSave;
internal System.Windows.Forms.ToolStripSeparator mMenSep3;
private System.ComponentModel.IContainer components;
private Menu.MainFileMenu mainFileMenu1;
private Menu.ViewMenu viewMenu1;
private Menu.ToolsMenu toolsMenu1;
private Menu.HelpMenu helpMenu1;
private Menu.MainFileMenu fileMenu;
private Menu.ViewMenu viewMenu;
private Menu.ToolsMenu toolsMenu;
private Menu.HelpMenu helpMenu;
internal mRemoteNG.UI.Controls.QuickConnectToolStrip _quickConnectToolStrip;
internal mRemoteNG.UI.Controls.ExternalToolsToolStrip _externalToolsToolStrip;
internal mRemoteNG.UI.Controls.MultiSshToolStrip _multiSshToolStrip;

View File

@@ -66,10 +66,6 @@ namespace mRemoteNG.UI.Forms
_screenSystemMenu = new ScreenSelectionSystemMenu(this);
}
static FrmMain()
{
}
#region Properties
public FormWindowState PreviousWindowState { get; set; }
@@ -176,13 +172,28 @@ namespace mRemoteNG.UI.Forms
_screenSystemMenu.BuildScreenList();
SystemEvents.DisplaySettingsChanged += _screenSystemMenu.OnDisplayChanged;
ApplyLanguage();
Opacity = 1;
//Fix missing general panel at the first run
new PanelAdder().AddPanel();
if (Settings.Default.CreateEmptyPanelOnStartUp)
{
var panelName = !string.IsNullOrEmpty(Settings.Default.StartUpPanelName)
? Settings.Default.StartUpPanelName
: Language.strNewPanel;
new PanelAdder().AddPanel(panelName);
}
}
private void OnApplicationSettingChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
private void ApplyLanguage()
{
fileMenu.ApplyLanguage();
viewMenu.ApplyLanguage();
toolsMenu.ApplyLanguage();
helpMenu.ApplyLanguage();
}
private void OnApplicationSettingChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
{
if (propertyChangedEventArgs.PropertyName != nameof(Settings.LockToolbars))
return;
@@ -192,7 +203,7 @@ namespace mRemoteNG.UI.Forms
private void LockToolbarPositions(bool shouldBeLocked)
{
var toolbars = new ToolStrip[] { _quickConnectToolStrip, _multiSshToolStrip, _externalToolsToolStrip };
var toolbars = new ToolStrip[] { _quickConnectToolStrip, _multiSshToolStrip, _externalToolsToolStrip, msMain };
foreach (var toolbar in toolbars)
{
toolbar.GripStyle = shouldBeLocked
@@ -209,17 +220,17 @@ namespace mRemoteNG.UI.Forms
private void SetMenuDependencies()
{
var connectionInitiator = new ConnectionInitiator();
mainFileMenu1.TreeWindow = Windows.TreeForm;
mainFileMenu1.ConnectionInitiator = connectionInitiator;
fileMenu.TreeWindow = Windows.TreeForm;
fileMenu.ConnectionInitiator = connectionInitiator;
viewMenu1.TsExternalTools = _externalToolsToolStrip;
viewMenu1.TsQuickConnect = _quickConnectToolStrip;
viewMenu1.TsMultiSsh = _multiSshToolStrip;
viewMenu1.FullscreenHandler = Fullscreen;
viewMenu1.MainForm = this;
viewMenu.TsExternalTools = _externalToolsToolStrip;
viewMenu.TsQuickConnect = _quickConnectToolStrip;
viewMenu.TsMultiSsh = _multiSshToolStrip;
viewMenu.FullscreenHandler = Fullscreen;
viewMenu.MainForm = this;
toolsMenu1.MainForm = this;
toolsMenu1.CredentialProviderCatalog = Runtime.CredentialProviderCatalog;
toolsMenu.MainForm = this;
toolsMenu.CredentialProviderCatalog = Runtime.CredentialProviderCatalog;
_quickConnectToolStrip.ConnectionInitiator = connectionInitiator;
}
@@ -396,17 +407,28 @@ namespace mRemoteNG.UI.Forms
var controlThatWasClicked = FromChildHandle(NativeMethods.WindowFromPoint(MousePosition));
if (controlThatWasClicked != null)
{
if (controlThatWasClicked.CanSelect || controlThatWasClicked is MenuStrip ||
controlThatWasClicked is ToolStrip || controlThatWasClicked is Crownwood.Magic.Controls.TabControl ||
controlThatWasClicked is Crownwood.Magic.Controls.InertButton)
if (controlThatWasClicked is TreeView ||
controlThatWasClicked is ComboBox ||
controlThatWasClicked is TextBox)
{
controlThatWasClicked.Focus();
}
else if (controlThatWasClicked.CanSelect ||
controlThatWasClicked is MenuStrip ||
controlThatWasClicked is ToolStrip ||
controlThatWasClicked is Crownwood.Magic.Controls.TabControl ||
controlThatWasClicked is Crownwood.Magic.Controls.InertButton)
{
// Simulate a mouse event since one wasn't generated by Windows
MouseClickSimulator.Click(controlThatWasClicked, MousePosition);
SimulateClick(controlThatWasClicked);
controlThatWasClicked.Focus();
}
else
{
// This handles activations from clicks that did not start a size/move operation
ActivateConnection();
}
}
// This handles activations from clicks that did not start a size/move operation
ActivateConnection();
}
break;
case NativeMethods.WM_WINDOWPOSCHANGED:
@@ -441,7 +463,17 @@ namespace mRemoteNG.UI.Forms
base.WndProc(ref m);
}
private void SimulateClick(Control control)
{
var clientMousePosition = control.PointToClient(MousePosition);
var temp_wLow = clientMousePosition.X;
var temp_wHigh = clientMousePosition.Y;
NativeMethods.SendMessage(control.Handle, NativeMethods.WM_LBUTTONDOWN, (IntPtr)NativeMethods.MK_LBUTTON, (IntPtr)NativeMethods.MAKELPARAM(ref temp_wLow, ref temp_wHigh));
clientMousePosition.X = temp_wLow;
clientMousePosition.Y = temp_wHigh;
}
private void ActivateConnection()
{
var w = pnlDock.ActiveDocument as ConnectionWindow;
@@ -595,12 +627,12 @@ namespace mRemoteNG.UI.Forms
private void ViewMenu_Opening(object sender, EventArgs e)
{
viewMenu1.mMenView_DropDownOpening(sender, e);
viewMenu.mMenView_DropDownOpening(sender, e);
}
private void mainFileMenu1_DropDownOpening(object sender, EventArgs e)
{
mainFileMenu1.mMenFile_DropDownOpening(sender, e);
fileMenu.mMenFile_DropDownOpening(sender, e);
}
}
}

Some files were not shown because too many files have changed in this diff Show More