mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-18 14:39:32 +08:00
Compare commits
89 Commits
v1.76Alpha
...
v1.76Alpha
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e872581d3c | ||
|
|
defe9e094c | ||
|
|
5662735cb8 | ||
|
|
8646dce21b | ||
|
|
99a3eabbaf | ||
|
|
c57bd386f2 | ||
|
|
f2a52b03df | ||
|
|
860e1ccfaa | ||
|
|
49967b38d4 | ||
|
|
36038fff6d | ||
|
|
c5958954b0 | ||
|
|
d0d63016ca | ||
|
|
35f2484adf | ||
|
|
c2cf496ded | ||
|
|
8a172f02a9 | ||
|
|
f27935ea61 | ||
|
|
043df0aec3 | ||
|
|
63a2e18760 | ||
|
|
c3ced7ed03 | ||
|
|
f597e14b3d | ||
|
|
aff4ba9115 | ||
|
|
554e0805e3 | ||
|
|
f4efa74a23 | ||
|
|
ddc19587fa | ||
|
|
5f1232727e | ||
|
|
9c373e8f0a | ||
|
|
83942d788f | ||
|
|
73d6fec6f3 | ||
|
|
a37b5deaa1 | ||
|
|
3b9de847e7 | ||
|
|
924f1f1e48 | ||
|
|
7bdebbe25b | ||
|
|
8f46c25dc9 | ||
|
|
8bb4a03639 | ||
|
|
7b5bc5e057 | ||
|
|
35582a5e6a | ||
|
|
20340fd31f | ||
|
|
d6d7664b48 | ||
|
|
ce97e63876 | ||
|
|
378b98ff89 | ||
|
|
ce31199e57 | ||
|
|
227f3b2924 | ||
|
|
5076f1354c | ||
|
|
e5a34388ae | ||
|
|
6a5f65c018 | ||
|
|
6d5f41b3d8 | ||
|
|
64f10ead63 | ||
|
|
575dae446f | ||
|
|
9b438576f2 | ||
|
|
cbd32f1a07 | ||
|
|
516182ec40 | ||
|
|
4ad3a68d80 | ||
|
|
2f9ba32c07 | ||
|
|
dfc45a2904 | ||
|
|
563fdffb67 | ||
|
|
f2e9c5e2c0 | ||
|
|
86a591364c | ||
|
|
2a82485f81 | ||
|
|
e13549d361 | ||
|
|
a85c1bd7d3 | ||
|
|
946679f490 | ||
|
|
b6f27eac18 | ||
|
|
2cc82145a3 | ||
|
|
2dae0f2d8e | ||
|
|
412f6edc36 | ||
|
|
764791b8e5 | ||
|
|
bd20d6ae7d | ||
|
|
8db0bf7bea | ||
|
|
cff6aa72fc | ||
|
|
63ddf06057 | ||
|
|
3d9d57b7fa | ||
|
|
2c1734aea6 | ||
|
|
301c39aad0 | ||
|
|
5be346c89d | ||
|
|
e4eaf0037e | ||
|
|
8f97be82cb | ||
|
|
4ab7f92b82 | ||
|
|
0ec95a7729 | ||
|
|
98c38716cd | ||
|
|
6a46df780c | ||
|
|
7788198f26 | ||
|
|
3010963283 | ||
|
|
6522524c0f | ||
|
|
160434c114 | ||
|
|
36acb9ac12 | ||
|
|
ddbf6a2e7a | ||
|
|
8567e912a3 | ||
|
|
7c98f2809c | ||
|
|
0898ed8c00 |
38
.github/ISSUE_TEMPLATE.md
vendored
38
.github/ISSUE_TEMPLATE.md
vendored
@@ -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):
|
||||
|
||||
33
.github/PULL_REQUEST_TEMPLATE.md
vendored
33
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
8
Jenkinsfile
vendored
@@ -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)') {
|
||||
|
||||
@@ -10,9 +10,9 @@
|
||||
|
||||
| Update Channel | Build Status | Downloads |
|
||||
| ---------------|--------------|-----------|
|
||||
| Stable | [](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/master) | [](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.75.7011) |
|
||||
| Beta | | [](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.75.7011) |
|
||||
| Development | [](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/develop) | - |
|
||||
| Stable | [](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/master) | [](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.75.7012) |
|
||||
| Beta | | [](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.75.7012) |
|
||||
| Development | [](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/develop) | [](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.76Alpha5) |
|
||||
|
||||
mRemoteNG is the next generation of mRemote, a full-featured, multi-tab remote connections manager.
|
||||
|
||||
|
||||
114
Tools/CreateBulkConnections_ConfCons2_6.ps1
Normal file
114
Tools/CreateBulkConnections_ConfCons2_6.ps1
Normal 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()
|
||||
@@ -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
BIN
Tools/exes/dumpbin.exe
Normal file
Binary file not shown.
BIN
Tools/exes/editbin.exe
Normal file
BIN
Tools/exes/editbin.exe
Normal file
Binary file not shown.
BIN
Tools/exes/link.exe
Normal file
BIN
Tools/exes/link.exe
Normal file
Binary file not shown.
BIN
Tools/exes/mspdbcore.dll
Normal file
BIN
Tools/exes/mspdbcore.dll
Normal file
Binary file not shown.
@@ -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)) {
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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 ""
|
||||
@@ -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 ""
|
||||
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
@@ -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
|
||||
{
|
||||
@@ -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
|
||||
{
|
||||
@@ -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(
|
||||
@@ -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")]
|
||||
@@ -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]
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
18
mRemoteNGTests/Container/RootNodeInfoTests.cs
Normal file
18
mRemoteNGTests/Container/RootNodeInfoTests.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
132
mRemoteNGTests/TestHelpers/ConnectionInfoHelpers.cs
Normal file
132
mRemoteNGTests/TestHelpers/ConnectionInfoHelpers.cs
Normal 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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 });
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
37
mRemoteV1/Config/Import/MRemoteNGXmlImporter.cs
Normal file
37
mRemoteV1/Config/Import/MRemoteNGXmlImporter.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 + ";";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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");
|
||||
@@ -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
|
||||
{
|
||||
@@ -2,8 +2,7 @@
|
||||
using System.Xml.Linq;
|
||||
using mRemoteNG.Security;
|
||||
|
||||
|
||||
namespace mRemoteNG.Config.Serializers
|
||||
namespace mRemoteNG.Config.Serializers.Xml
|
||||
{
|
||||
public class XmlConnectionsDocumentEncryptor
|
||||
{
|
||||
@@ -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>
|
||||
{
|
||||
@@ -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;
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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")]
|
||||
26
mRemoteV1/Properties/Settings.Designer.cs
generated
26
mRemoteV1/Properties/Settings.Designer.cs
generated
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
172
mRemoteV1/Resources/Language/Language.Designer.cs
generated
172
mRemoteV1/Resources/Language/Language.Designer.cs
generated
@@ -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, "{0}"..
|
||||
/// Looks up a localized string similar to An error occurred while importing the file "{0}"..
|
||||
/// </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 "Load Balance Info" 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 'themes' 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>
|
||||
|
||||
@@ -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>&Direkt Verbinden:</value>
|
||||
<value>&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>&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&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>&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 &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>&Löschen</value>
|
||||
</data>
|
||||
<data name="strOptionsKeyboardButtonNew" xml:space="preserve">
|
||||
<value>&Neu</value>
|
||||
</data>
|
||||
<data name="strOptionsKeyboardButtonReset" xml:space="preserve">
|
||||
<value>&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&eende {0}</value>
|
||||
</data>
|
||||
<data name="strCommandTryAgain" xml:space="preserve">
|
||||
<value>&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>&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 &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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -187,13 +187,13 @@
|
||||
<value>Текущая версия</value>
|
||||
</data>
|
||||
<data name="strButtonBrowse" xml:space="preserve">
|
||||
<value>&Обзор ...</value>
|
||||
<value>&Обзор...</value>
|
||||
</data>
|
||||
<data name="strButtonCancel" xml:space="preserve">
|
||||
<value>&Отменить</value>
|
||||
</data>
|
||||
<data name="strButtonChange" xml:space="preserve">
|
||||
<value>Измененить</value>
|
||||
<value>Изменить</value>
|
||||
</data>
|
||||
<data name="strButtonClose" xml:space="preserve">
|
||||
<value>&Закрыть</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>&Подключение:</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 && 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>
|
||||
@@ -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" />
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -272,6 +272,7 @@ namespace mRemoteNG.UI.Controls
|
||||
Expand(parent);
|
||||
SelectObject(newNode, true);
|
||||
EnsureModelVisible(newNode);
|
||||
_allowEdit = true;
|
||||
SelectedItem.BeginEdit();
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
162
mRemoteV1/UI/Forms/frmMain.Designer.cs
generated
162
mRemoteV1/UI/Forms/frmMain.Designer.cs
generated
@@ -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;
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user