Compare commits

...

61 Commits

Author SHA1 Message Date
David Sparer
6eff685b18 updated changelog 2016-12-01 15:40:04 -07:00
David Sparer
2d08146de8 updated changelog for 1.75beta3 2016-12-01 15:38:26 -07:00
Sean Kaim
f131420a44 Change from .exe to .msi
Fixes #289
2016-12-01 17:22:50 -05:00
David Sparer
245ea5463e updated the folder path resolution for the release folder to be a bit safer 2016-12-01 15:04:49 -07:00
David Sparer
71bb90a769 Set build date 2016-12-01 14:47:43 -07:00
David Sparer
e71a22fbb3 Added badge for CII progress https://bestpractices.coreinfrastructure.org/projects/529 2016-12-01 14:24:20 -07:00
Sean Kaim
802c4c28f5 smaller image 2016-12-01 15:51:59 -05:00
Sean Kaim
2cda6fc057 updated/added some links 2016-12-01 15:47:40 -05:00
Sean Kaim
a0303c70f9 Merge pull request #285 from mRemoteNG/284_md5_update_checks
284 md5 update checks
2016-11-30 15:32:37 -05:00
Sean Kaim
f5b9f58747 generate update files 2016-11-30 15:31:34 -05:00
Sean Kaim
0d8dee0ed7 use MD5 checksum for zip and msi releases
and some code cleanup
2016-11-30 14:50:55 -05:00
David Sparer
ace02263dd added a few links 2016-11-30 12:48:29 -07:00
David Sparer
a2398bfb3a Merge pull request #189 from mRemoteNG/update_contribution_guide
Update CONTRIBUTING.md
2016-11-30 12:22:44 -07:00
David Sparer
cd7ddb5ba1 minor typo fixes 2016-11-30 12:08:48 -07:00
Sean Kaim
ae37a4c85d some additions
- added short code style section
- added "ready" and "Documentation" label notes
- made note of Static Code Analysis tools for PRs
2016-11-30 13:49:34 -05:00
Sean Kaim
32e1716061 Merge remote-tracking branch 'refs/remotes/origin/develop' into update_contribution_guide 2016-11-30 13:32:27 -05:00
David Sparer
d92616f39f Merge pull request #282 from mRemoteNG/280_connections_file_corrupted_when_cancelling_password_prompt
Connections file corrupted when cancelling password prompt
2016-11-30 10:28:50 -07:00
David Sparer
0c13db46fd save not performed when connections file is not loaded 2016-11-30 10:20:26 -07:00
David Sparer
b6fc9a8ec1 Updated credits and changelog for PR #275 2016-11-29 11:51:11 -07:00
David Sparer
a672141352 Merge pull request #275 from ForensicITGuy/develop
Addition of HTML code for SSH File Transfer help page
2016-11-29 11:46:53 -07:00
David Sparer
df354e483a Merge pull request #279 from mRemoteNG/278_silent_installs_not_detecting_prerequisites
Resolves #278
2016-11-29 11:16:00 -07:00
David Sparer
89874545b1 updated changelog 2016-11-29 11:12:45 -07:00
David Sparer
b0fdd09f39 added prereq checks to non-gui executions 2016-11-29 11:11:31 -07:00
David Sparer
fbf620ae36 Merge pull request #277 from mRemoteNG/271_make_installer_aware_of_previous_install_path
make installer aware of previous install path. Resolves #277
2016-11-29 11:00:42 -07:00
David Sparer
509f7da12e installer now saves and loads the previous install location in the registry 2016-11-29 10:37:54 -07:00
David Sparer
64a40e4ed0 renamed the property used for the fully install path from APPLICATIONROOTDIRECTORY to INSTALLDIR to make it easier to type at the cmdline 2016-11-29 09:21:22 -07:00
David Sparer
ab253dbf28 Merge pull request #273 from mRemoteNG/add_turkish_translation
Add Turkish translation provided by forum user rizaemet
2016-11-29 08:18:56 -07:00
David Sparer
feb19df20f minor update to credits 2016-11-29 08:15:15 -07:00
ForensicITGuy
d5d2241f1b Fixed Indentation and added Troubleshooting Info 2016-11-29 00:03:48 -06:00
ForensicITGuy
5af1a0aa87 Fixed Indentation 2016-11-28 23:55:44 -06:00
ForensicITGuy
816621651d Added help HTML code for SSH File Transfer 2016-11-28 23:03:23 -06:00
David Sparer
8f2aa08dbe Updated changelog and credits 2016-11-28 13:15:09 -07:00
David Sparer
d20e1a6e9c added Turkish translation provided by forum user rizaemet 2016-11-28 13:01:31 -07:00
Sean Kaim
2a5a4c9ace code clean up 2016-11-22 17:14:27 -05:00
Sean Kaim
2e7fd3fb60 code clean up 2016-11-22 16:54:06 -05:00
David Sparer
56579100f1 Merge pull request #265 from mRemoteNG/254_component_check_issues
Resolves #254
2016-11-22 08:04:37 -07:00
David Sparer
1e5cd24acd update changelog 2016-11-22 08:03:11 -07:00
David Sparer
7f152cef20 Merge branch 'develop' into 254_component_check_issues 2016-11-22 07:57:32 -07:00
David Sparer
3958d2d597 update changelog 2016-11-21 12:15:16 -07:00
David Sparer
84a3b31e8d Merge pull request #263 from mRemoteNG/260_unable_to_decrypt_confCons_v2_5_fullencryption
Resolves #260
2016-11-21 10:06:15 -07:00
David Sparer
cc15c12d19 Resolved bug with deserializing confCons v2.5 custom password full encryption files 2016-11-21 10:01:34 -07:00
David Sparer
50e7b89b15 Added test for deserializing confCons v2.5 custom password full encryption files 2016-11-21 10:00:55 -07:00
David Sparer
0b507cb66a Fixed bug where custom decryption passwords would require 2 password prompts to decrypt 2016-11-21 09:59:46 -07:00
David Sparer
b1c697ea09 ensured that the rootnodeinfo is not null during decryption 2016-11-21 09:25:43 -07:00
David Sparer
dbcf15e45b Created test to ensure deserializing confCons v2.5 w/ full encryption works 2016-11-21 09:05:35 -07:00
David Sparer
21d864ce7a Merge pull request #262 from mRemoteNG/261_double_click_expands_tree_node_folder
Re-add double click support for toggling tree node expansion. Resolves #261
2016-11-21 08:47:02 -07:00
David Sparer
dcf1f1af10 Added double click support for toggling tree node expansion. (existed in previous version - this was a feature regression) 2016-11-21 08:44:55 -07:00
David Sparer
9c25a39b7b split ICA object initialization from setting Parent property. this had created an appearance bug. connected to #254 2016-11-21 08:23:33 -07:00
David Sparer
d79687db53 Added some extra debugging messages. will remove once done investigating 2016-11-18 11:52:23 -07:00
David Sparer
77428e0fe5 minor cleanup 2016-11-18 09:48:21 -07:00
David Sparer
53df3b5cfa moved the Rdp and Vnc component check using directives into the try blocks. connected to #254 2016-11-18 08:15:24 -07:00
David Sparer
f2e1c9e959 moved the using directive of the ICA check into the try block. this seems to resolve #254 2016-11-17 15:16:45 -07:00
David Sparer
a004b2f3e0 split component checks to separate functions to make them a bit easier to digest mentally 2016-11-17 14:50:54 -07:00
Sean Kaim
65b4398b0e code clean up 2016-11-17 15:06:58 -05:00
Sean Kaim
0b83d2869d code clean up - use "using"
Attempt to help #254
2016-11-17 15:01:49 -05:00
Sean Kaim
1a408b810c use var everywhere in Logger
For #253
2016-11-17 14:38:51 -05:00
David Sparer
bab5879c3d Component check now tests for the correct RDP version. 2016-11-17 08:29:33 -07:00
David Sparer
70408ca8ee Finalized the first draft and removed the template lines 2016-10-31 15:54:42 -06:00
David Sparer
82848aa4cd Added a section on pull requests 2016-10-20 15:29:58 -06:00
David Sparer
5131604ba7 Added drafts for submitting bugs and feature requests 2016-10-20 12:33:23 -06:00
David Sparer
1be821b07a added rough draft of the contribution intro 2016-10-20 11:30:49 -06:00
39 changed files with 3334 additions and 764 deletions

View File

@@ -1 +1,60 @@
Please see the [Wiki](https://github.com/mRemoteNG/mRemoteNG/wiki/Development) for contributing information.
# Welcome!
We are really glad you are interested in contributing to mRemoteNG!
Open source software is best when shared with others. This also applies to the work that goes into the software. Your ideas and passion are what make this software great.
### Ways you can contribute
There are many ways that you can help improve mRemoteNG, even if you don't know how to program.
For example, you might:
- add documentation or "how-to" articles on the [Wiki](https://github.com/mRemoteNG/mRemoteNG/wiki)
- answer support questions on the [forum](http://forum.mremoteng.org)
- [add or improve a translation](https://github.com/mRemoteNG/mRemoteNG/wiki/How to Help Translating mRemoteNG)
- submit a [pull request](https://github.com/mRemoteNG/mRemoteNG/pulls) for a [bug or feature ticket](https://github.com/mRemoteNG/mRemoteNG/issues)
# Submitting GitHub Issues
The GitHub Issue tracker is our preferred channel for bug reports and feature requests.
- For questions or general discussion, please use [our public Gitter chat](https://gitter.im/mRemoteNG/PublicChat) or the [forum](http://forum.mremoteng.org).
- If you find a security vulnerability, do **NOT** open an issue. Email support@mremoteng.org instead.
### Bug reports
A bug is any behavior that does not consistently produce the expected result.
Guidelines for bug reports:
1. Do not open bug reports for questions.
1. Use the GitHub Issue search to make sure your bug hasn't already been reported.
1. Include as much detailed information as possible. We've included a default template when opening an issue to make this easier.
1. Please tag your your bug report with the [`Bug`](https://github.com/mRemoteNG/mRemoteNG/issues?q=is%3Aissue+is%3Aopen+label%3ABug) label.
### Feature requests
Feature requests are great! Take some time to compose a well thought out proposal. It's up to you to convince the project maintainers that your feature is a good idea. To ensure your request receives the consideration that it deserves, include as much detail as possible. For example:
- What is the purpose of the new feature?
- What situation led you to want this feature?
- How does the application perform now and how would the new feature change this?
- If applicable, consider including visual mock-ups to show us what you mean.
- Please tag your feature request with the [`Feature Request`](https://github.com/mRemoteNG/mRemoteNG/issues?q=is%3Aissue+is%3Aopen+label%3A%22Feature+Request%22) label.
# Pull requests
Good pull requests are a huge help! If you haven't already, please consider reading [GitHub's guide to contributing to open source](https://guides.github.com/activities/contributing-to-open-source/)
Our requests when it comes to pull requests:
- Be clear about what your PR seeks to do.
- Keep your PR focused. It should be clear what code changed to achieve your stated goal.
- Add or update tests when possible. Some of the code base is still very hard to effectively test. If you can, please try to create or update tests that relate to your PR.
- Please talk with one of the project maintainers before starting work on large pull requests. Otherwise, you run the risk of putting a lot of time into a feature or refactor that gets denied.
- If you have access to Static Code Analysis tools (like ReSharper), please don't analyze/fix everything in one giant PR. As great as these tools are, they can sometimes cause unintended problems.
# Code Style
- Please make use of simple types and var where possible
- Prefer "using" over .Dispose()
- Avoid nesting "using"
# Your first contributions
Want to help but don't know where to start? Check out the issues that we've labeled with [`Help Wanted`](https://github.com/mRemoteNG/mRemoteNG/issues?q=is%3Aissue+is%3Aopen+label%3A%22Help+Wanted%22) or [`ready`](https://github.com/mRemoteNG/mRemoteNG/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3A%22ready%22). These will vary in difficulty, but should be possible for new contributors.
Want to help but don't know C#? Check out the issues that we've labeled with [`Documentation`](https://github.com/mRemoteNG/mRemoteNG/labels/Documentation).
Sorry, we currently do not have any tags for truly beginner-friendly issues :(

BIN
.github/icon_ReSharper.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -1,3 +1,31 @@
1.75 Beta 3 (2016-12-01):
Fixes:
------
#289: Install fails during update process (only affects v1.75 beta 1 - v1.75 beta 2)
Known Issue:
------------
Portable build MD5 check will fail when updating from 1.75 Beta 1 to newer versions.
1.75 Beta 2 (2016-12-01):
Features/Enhancements:
----------------------
#273: Added Turkish translation provided by forum user "rizaemet"
#217: Create user manual documentation for the SSH File Transfer feature
Fixes:
------
#254: Component check window position issues and uncaught exception
#260: Crash when attempting to load fully encrypted confCons v2.5
#261: Double clicking folder in treeview doesnt expand it in 1.75 beta1
#271: Install package is not using the last installation path
#278: Silent installs not detecting prerequisites
1.75 Beta 1 (2016-11-15):
General Changes:

View File

@@ -8,6 +8,8 @@ Sean Kaim (github.com/kmscode)
Thanks for the awesome new website!
Bennett Blodinger (github.com/benwa)
Tony Lambert
Past Contributors
=================
@@ -38,6 +40,7 @@ Emanuel Silva
Robert Siwiec
Hayato Iriumi
Sebastien Thieury (github.com/SebThieu)
Riza Emet
Included Source Code

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<!-- http://robmensching.com/blog/posts/2010/5/2/the-wix-toolsets-remember-property-pattern/ -->
<!-- This pattern allows a cmdline value to take precedence over values set from searchers (registry/file/etc) -->
<!-- Save the INSTALLDIR value from the cmdline, if it was provided -->
<CustomAction Id="SaveCmdlineINSTALLDIR" Property="CMDLINE_INSTALLDIR" Value="[INSTALLDIR]" Execute="firstSequence" />
<!-- Set the INSTALLDIR value to the cmdline value, if one was provided -->
<CustomAction Id="SetFromCmdlineINSTALLDIR" Property="INSTALLDIR" Value="[CMDLINE_INSTALLDIR]" Execute="firstSequence" />
<InstallUISequence>
<Custom Action="SaveCmdlineINSTALLDIR" Before="AppSearch" />
<Custom Action="SetFromCmdlineINSTALLDIR" After="AppSearch">
CMDLINE_INSTALLDIR
</Custom>
</InstallUISequence>
<InstallExecuteSequence>
<Custom Action="SaveCmdlineINSTALLDIR" Before="AppSearch" />
<Custom Action="SetFromCmdlineINSTALLDIR" After="AppSearch">
CMDLINE_INSTALLDIR
</Custom>
</InstallExecuteSequence>
</Fragment>
</Wix>

View File

@@ -4,7 +4,7 @@
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="$(var.PlatformProgramFilesFolder)">
<Directory Id="APPLICATIONROOTDIRECTORY" Name="$(var.ProductName)">
<Directory Id="INSTALLDIR" Name="$(var.ProductName)">
</Directory>
</Directory>

View File

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

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<ComponentGroup Id="CG.ProjectInfoFiles" Directory="APPLICATIONROOTDIRECTORY">
<ComponentGroup Id="CG.ProjectInfoFiles" Directory="INSTALLDIR">
<Component Id="C.Changelog" Guid="*">
<File Id="ChangelogFile" Name="Changelog.txt" Source="$(var.SolutionDir)CHANGELOG.TXT" KeyPath="yes" />
</Component>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="APPLICATIONROOTDIRECTORY">
<DirectoryRef Id="INSTALLDIR">
<Component Id="C.PuttyNGFile" Guid="*">
<File Id="PuttyNGFile" Name="PuTTYNG.exe" Source="$(var.HarvestPath)\PuTTYNG.exe" KeyPath="yes" />
</Component>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="TARGETDIR">
<Component Id="C.RegistryEntries" Guid="*">
<RegistryKey Root="HKLM" Key="Software\mRemoteNG">
<RegistryValue Type="string" Name="InstallDir" Value="[INSTALLDIR]" KeyPath="yes" />
</RegistryKey>
</Component>
</DirectoryRef>
</Fragment>
</Wix>

View File

@@ -5,17 +5,17 @@
<DirectoryRef Id="DesktopFolder">
<Component Id="C.DesktopShortcut" Guid="F78E5A16-A2F7-4BD9-9250-CBF3016CCCDA">
<Shortcut Id="DesktopShortcut" Name="$(var.ProductName)" Target="[APPLICATIONROOTDIRECTORY][MAINEXE]" WorkingDirectory="APPLICATIONROOTDIRECTORY" Icon="mRemoteNG.ico" />
<Shortcut Id="DesktopShortcut" Name="$(var.ProductName)" Target="[INSTALLDIR][MAINEXE]" WorkingDirectory="INSTALLDIR" Icon="mRemoteNG.ico" />
<RegistryValue Root="HKCU" Key="Software\$(var.ProductName)" Name="DesktopShortcut" Type="integer" Value="1" KeyPath="yes" />
</Component>
</DirectoryRef>
<DirectoryRef Id="ApplicationProgramsFolder">
<Component Id="C.ApplicationStartMenuShortcut" Guid="193B9E14-F40E-44F1-8514-BED253BCBF75">
<Shortcut Id="ApplicationStartMenuShortcut" Name="$(var.ProductName)" Target="[APPLICATIONROOTDIRECTORY][MAINEXE]" WorkingDirectory="APPLICATIONROOTDIRECTORY" Icon="mRemoteNG.ico" />
<Shortcut Id="CreditsShortcut" Name="Credits" Target="[APPLICATIONROOTDIRECTORY]Credits.txt" WorkingDirectory="APPLICATIONROOTDIRECTORY" />
<Shortcut Id="LicenseShortcut" Name="License" Target="[APPLICATIONROOTDIRECTORY]License.txt" WorkingDirectory="APPLICATIONROOTDIRECTORY" />
<Shortcut Id="ReadmeShortcut" Name="Readme" Target="[APPLICATIONROOTDIRECTORY]Readme.txt" WorkingDirectory="APPLICATIONROOTDIRECTORY" />
<Shortcut Id="ApplicationStartMenuShortcut" Name="$(var.ProductName)" Target="[INSTALLDIR][MAINEXE]" WorkingDirectory="INSTALLDIR" Icon="mRemoteNG.ico" />
<Shortcut Id="CreditsShortcut" Name="Credits" Target="[INSTALLDIR]Credits.txt" WorkingDirectory="INSTALLDIR" />
<Shortcut Id="LicenseShortcut" Name="License" Target="[INSTALLDIR]License.txt" WorkingDirectory="INSTALLDIR" />
<Shortcut Id="ReadmeShortcut" Name="Readme" Target="[INSTALLDIR]Readme.txt" WorkingDirectory="INSTALLDIR" />
<RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
<RegistryValue Root="HKCU" Key="Software\$(var.ProductName)" Name="ApplicationStartMenuShortcut" Type="integer" Value="1" KeyPath="yes"/>
</Component>

View File

@@ -27,12 +27,14 @@
</PropertyGroup>
<ItemGroup>
<Compile Include="CustomActions\CheckForInstalledWindowsUpdates.wxs" />
<Compile Include="CustomActions\SaveInstallLocation.wxs" />
<Compile Include="CustomActions\UninstallLegacyVersions.wxs" />
<Compile Include="Fragments\FilesFragment.wxs" />
<Compile Include="Fragments\DirectoriesFragment.wxs" />
<Compile Include="Fragments\MainExeFragment.wxs" />
<Compile Include="Fragments\MiscTextFilesFragment.wxs" />
<Compile Include="Fragments\PuTTYNGFragment.wxs" />
<Compile Include="Fragments\RegistryEntriesFragment.wxs" />
<Compile Include="Fragments\ShortcutFragment.wxs" />
<Compile Include="mRemoteNGV1.wxs" />
</ItemGroup>
@@ -112,18 +114,6 @@
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release Portable|x86' ">
<DefineConstants>HarvestPath=$(SolutionDir)mRemoteV1\bin\Release Portable;HelpFilesHarvestPath=$(SolutionDir)mRemoteV1\Resources\Help</DefineConstants>
</PropertyGroup>
<PropertyGroup>
<PreBuildEvent>REM Clean the TargetDir
rmdir /S /Q "$(TargetDir)"
echo $(ConfigurationName) &gt; buildenv.tmp
REM Harvest bin directory of the mRemoteV1 project
call "$(WIX)bin\heat.exe" dir "$(SolutionDir)mRemoteV1\bin\$(Configuration)" -ag -dr APPLICATIONROOTDIRECTORY -var var.HarvestPath -srd -cg MandatoryComponents -template fragment -out "$(ProjectDir)Fragments\FilesFragment.wxs" -t "$(ProjectDir)Filters\Harvest_Filter.xslt" -v
REM Convert the license file "COPYING.TXT" to "License.rtf" to be shown in the installer GUI
call "$(ProjectDir)Resources\Pandoc\pandoc.exe" -s -t rtf -o "$(ProjectDir)\Resources\License.rtf" "$(SolutionDir)COPYING.TXT"</PreBuildEvent>
</PropertyGroup>
<PropertyGroup>
<PostBuildEvent>set /p buildenv=&lt;buildenv.tmp
@@ -140,4 +130,16 @@ powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\rename_installer_w
REM Copy MSI to Release folder
IF %25buildenv: Portable=%25==Release (powershell -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\copy_release_installer.ps1" $(TargetDir) $(SolutionDir)Release)</PostBuildEvent>
</PropertyGroup>
<PropertyGroup>
<PreBuildEvent>REM Clean the TargetDir
rmdir /S /Q "$(TargetDir)"
echo $(ConfigurationName) &gt; buildenv.tmp
REM Harvest bin directory of the mRemoteV1 project
call "$(WIX)bin\heat.exe" dir "$(SolutionDir)mRemoteV1\bin\$(Configuration)" -ag -dr INSTALLDIR -var var.HarvestPath -srd -cg MandatoryComponents -template fragment -out "$(ProjectDir)Fragments\FilesFragment.wxs" -t "$(ProjectDir)Filters\Harvest_Filter.xslt" -v
REM Convert the license file "COPYING.TXT" to "License.rtf" to be shown in the installer GUI
call "$(ProjectDir)Resources\Pandoc\pandoc.exe" -s -t rtf -o "$(ProjectDir)\Resources\License.rtf" "$(SolutionDir)COPYING.TXT"</PreBuildEvent>
</PropertyGroup>
</Project>

View File

@@ -12,8 +12,9 @@
<Binary Id="CustomActions.CA.dll" SourceFile="$(var.SolutionDir)InstallerProjects\CustomActions\bin\$(var.Configuration)\CustomActions.CA.dll" />
<Property Id="ARPPRODUCTICON" Value="mRemoteNG.ico" />
<Property Id="ARPHELPLINK" Value="http://www.mremoteng.org" />
<SetProperty Id="ARPINSTALLLOCATION" Value="[INSTALLDIR]" After="CostFinalize" />
<Property Id="MAINEXE" Value="$(var.ExeProcessName)" />
<Property Id="APPLICATIONROOTDIRECTORY">
<Property Id="INSTALLDIR">
<RegistrySearch Id='mRemoteNGRegistry' Type='raw' Root='HKLM' Key='Software\mRemoteNG' Name='InstallDir' />
</Property>
<Property Id='RDP_DTLS_KB' Value='$(var.RdpDtlsKb)' />
@@ -26,6 +27,7 @@
<PropertyRef Id="NETFRAMEWORK40FULL" />
<PropertyRef Id="WIX_IS_NETFRAMEWORK_40_OR_LATER_INSTALLED" />
<Icon Id="mRemoteNG.ico" SourceFile="Resources\mRemoteNG.ico" />
<CustomActionRef Id='SaveCmdlineINSTALLDIR' />
<InstallUISequence>
@@ -35,6 +37,14 @@
<Custom Action="CheckIfLegacyVersionInstalled" After="LaunchConditions" />
<Custom Action="UninstallLegacyVersion" After="CheckIfLegacyVersionInstalled">(NOT Installed) AND (LEGACYVERSIONINSTALLED = 1)</Custom>
</InstallUISequence>
<InstallExecuteSequence>
<Custom Action="CheckIfRdpDtlsUpdateInstalled" After="AppSearch">(NOT Installed) AND (VersionNT = 601 OR VersionNT64 = 601)</Custom>
<Custom Action="CheckIfMinimumRdpInstalled" After="CheckIfRdpDtlsUpdateInstalled">(NOT Installed) AND (VersionNT = 601 OR VersionNT64 = 601)</Custom>
<LaunchConditions After="SetWIX_IS_NETFRAMEWORK_40_OR_LATER_INSTALLED" />
<Custom Action="CheckIfLegacyVersionInstalled" After="LaunchConditions" />
<Custom Action="UninstallLegacyVersion" After="CheckIfLegacyVersionInstalled">(NOT Installed) AND (LEGACYVERSIONINSTALLED = 1)</Custom>
</InstallExecuteSequence>
<!-- Need to be admin to install -->
@@ -65,10 +75,11 @@
<Feature Id="F.Complete" Title="!(loc.Feature_Complete)" Display="expand" AllowAdvertise="no" Level="1">
<Feature Id="F.MinimalFeature" Title="$(var.ProductName)" Absent="disallow" ConfigurableDirectory="APPLICATIONROOTDIRECTORY" Level="1">
<Feature Id="F.MinimalFeature" Title="$(var.ProductName)" Absent="disallow" ConfigurableDirectory="INSTALLDIR" Level="1">
<ComponentGroupRef Id="MandatoryComponents" Primary="yes" />
<ComponentRef Id="C.MainExe" Primary="yes" />
<ComponentGroupRef Id="CG.ProjectInfoFiles" Primary="yes" />
<ComponentRef Id="C.RegistryEntries" Primary="yes" />
</Feature>
<Feature Id="F.PuttyNG" Title="PuTTYNG" Absent="allow" AllowAdvertise="no" Level="1">

View File

@@ -6,9 +6,11 @@
[![PayPal](https://img.shields.io/badge/%24-PayPal-blue.svg)](https://www.paypal.me/DavidSparer)
[![Build Status](http://ec2-52-39-111-114.us-west-2.compute.amazonaws.com:8080/buildStatus/icon?job=mRemoteNG/mRemoteNG/develop)](http://ec2-52-39-111-114.us-west-2.compute.amazonaws.com:8080/job/mRemoteNG/job/mRemoteNG/job/develop/)
[![Issues In Progress](https://badge.waffle.io/mRemoteNG/mRemoteNG.png?label=In%20Progress&title=In%20Progress)](http://waffle.io/mRemoteNG/mRemoteNG)
[![Issues In Progress](https://badge.waffle.io/mRemoteNG/mRemoteNG.png?label=In%20Progress&title=In%20Progress)](https://waffle.io/mRemoteNG/mRemoteNG)
[![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.74/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.74)
[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/529/badge)](https://bestpractices.coreinfrastructure.org/projects/529)
mRemoteNG is the next generation of mRemote, a full-featured, multi-tab remote connections manager.
@@ -35,3 +37,7 @@ https://support.microsoft.com/en-us/kb/2923545
Windows 8+ support RDP version 8+ out of the box.
RDP versions are backwards compatible, so an mRemoteNG client running on Windows 10 can connection successfully to a Windows 2003 host (for example).
[![Developed with ReSharper](https://raw.githubusercontent.com/mRemoteNG/mRemoteNG/develop/.github/icon_ReSharper.png)](https://www.jetbrains.com/resharper/)

View File

@@ -1,12 +1,42 @@
#Requires -Version 4.0
$file = gci ..\Release | sort LastWriteTime | select -last 1 | % { $_.FullName }
$releaseFolder = Join-Path -Path $PSScriptRoot -ChildPath "..\Release" -Resolve
$tag = Read-Host -Prompt 'Tag name'
Write-Host
Write-Host
Write-Host
Write-Host PORTABLE
Write-Host --------
$file = Get-ChildItem -Path "$releaseFolder\*.zip" | sort LastWriteTime | select -last 1 | % { $_.FullName }
$filename = $file.Split("\") | select -last 1
$version = $file.tostring().Split("-")[2].trim(".zip")
Write-Host Version: $version
Write-Host dURL:
Write-Host clURL:
Write-Host dURL: https://github.com/mRemoteNG/mRemoteNG/releases/download/$tag/$filename
Write-Host clURL: https://raw.githubusercontent.com/mRemoteNG/mRemoteNG/$tag/CHANGELOG.TXT
$hash = Get-FileHash -Algorithm MD5 $file | % { $_.Hash }
Write-Host CertificateThumbprint: $hash
Write-Host Checksum: $hash
Write-Host
Write-Host
Write-Host
Write-Host MSI
Write-Host ---
$file = Get-ChildItem -Path "$releaseFolder\*.msi" | sort LastWriteTime | select -last 1 | % { $_.FullName }
$filename = $file.Split("\") | select -last 1
$version = $file.tostring().Split("-")[2].trim(".msi")
Write-Host Version: $version
Write-Host dURL: https://github.com/mRemoteNG/mRemoteNG/releases/download/$tag/$filename
Write-Host clURL: https://raw.githubusercontent.com/mRemoteNG/mRemoteNG/$tag/CHANGELOG.TXT
Write-Host CertificateThumbprint: 0CEA828E5C787EA8AA89268D83816C1EA03375BA
$hash = Get-FileHash -Algorithm MD5 $file | % { $_.Hash }
Write-Host Checksum: $hash

View File

@@ -18,10 +18,7 @@ namespace mRemoteNGTests.Config.Serializers
public void Setup(string confCons, string password)
{
_xmlConnectionsDeserializer = new XmlConnectionsDeserializer(confCons)
{
AuthenticationRequestor = password.ConvertToSecureString
};
_xmlConnectionsDeserializer = new XmlConnectionsDeserializer(confCons, password.ConvertToSecureString);
_connectionTreeModel = _xmlConnectionsDeserializer.Deserialize();
}
@@ -126,6 +123,8 @@ namespace mRemoteNGTests.Config.Serializers
get
{
yield return new TestCaseData(new Datagram("confCons v2.5", Resources.confCons_v2_5, "mR3m"));
yield return new TestCaseData(new Datagram("confCons v2.5 fullencryption", Resources.confCons_v2_5_fullencryption, "mR3m"));
yield return new TestCaseData(new Datagram("confCons v2.5 custompassword,fullencryption", Resources.confCons_v2_5_passwordis_Password_fullencryption, "Password"));
yield return new TestCaseData(new Datagram("confCons v2.6", Resources.confCons_v2_6, "mR3m"));
yield return new TestCaseData(new Datagram("confCons v2.6 5k Iterations", Resources.confCons_v2_6_5k_iterations, "mR3m"));
yield return new TestCaseData(new Datagram("confCons v2.6 fullencryption", Resources.confCons_v2_6_fullencryption, "mR3m"));

View File

@@ -71,9 +71,27 @@ namespace mRemoteNGTests.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to qqv8WEdruAEzSfdnPZMQ8w5cLhsl55V/Vu6h81Ucv7s7OT3vwnocgLmfId8rxpfVBnZwdn1Pdvea0XgwnQKJV5qdrVZEiy694Vv84B3wXjxU1wT72rWu1C5TNLhNEZp9JqjjAxOttIbOFL5X0dM+zI4YrCmTZI2Qt04TaC47MTr2niO7XvQSvjDeZRPnzeHsEiJvxHvBSm9yJ64Iupect0zKIpFPiDuOoHDhFQegUCZ26IdZCX2IHb3pH866rYV+yiAGhqt7pokBHUKURVtN6eKpbYzlDyGPbLRJf/eD13KnlaVC6sbf7YiCP3JwJrkN5mLdnrZbmZGQJG3Sn9rrGeShItYG/vvayFAQ5jxz1Wddixik/1frJOtUCaKW1svh8X9EvJo/RaBwgbTLIWth/WTgT4E+9DAVocdgMDGXrpsulnLTkX8doxeWHmBq2vAOhlYFNlhw2ZL3Yp/fbuVK9OMt7PbGkf3x3nThSf0R61Ip4NRjCzWempepEHoLMeiv [rest of string was truncated]&quot;;.
/// </summary>
internal static string confCons_v2_5_fullencryption {
get {
return ResourceManager.GetString("confCons_v2_5_fullencryption", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to cpfCUuZuIpTYihGooKKG5eRIZVB8P4bANitHVY57yrzyr9wf6lHlgUKx3Y3/YDYXDeS9uawycgbGSVOCnKmah3zEJ31V3BMlA809AdgQoYV9GFXLhgz8auO0mdcfYo2FP7UYS/I2bAfoNOaLvvgmqamm7Lu5FtvSvqdCf3PmpJAW042BijgkDhqritfDAyBvqUbNtE7yvrJohiSv5Ur7qFMXMIUCK0Fc4o3PXM++exN9XfTrtPAwQpjchxoEEmXBOQVnPB4QIn6eg6Wr/4XgtWYFIbtCCzyA5/L91CsDdKBZZktNSRrJTyMmPYGLn1k3Ted77rsoVUovrhxqfXgErPxDLBFAOA9wAjk7NscTRQJGxbgEU5H514g4U6h9wWlLaFyswQQCIskAbmoBrFJz72X9ooS4IVh1q9gLvCKuqb1VM6tNC0RCcLS5EHpxG6kIVpmnNtSa/0EvwaiSLMskC74TpYJ6nBUpfZT783jTikAFNDVI4eA43mJLEIBvrxBR [rest of string was truncated]&quot;;.
/// </summary>
internal static string confCons_v2_5_passwordis_Password_fullencryption {
get {
return ResourceManager.GetString("confCons_v2_5_passwordis_Password_fullencryption", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
///&lt;Connections Name=&quot;Connections&quot; Export=&quot;False&quot; EncryptionEngine=&quot;AES&quot; BlockCipherMode=&quot;GCM&quot; KdfIterations=&quot;1000&quot; FullFileEncryption=&quot;False&quot; Protected=&quot;Bqmajt4G5RDLsV5nn3s7QHZkkeWXQqgSDA4RSA8fWYx1bxRaorsmZ0ub4Z6mOBbefuXBbaWnsVRn0+NOJ3zTjkUJ&quot; ConfVersion=&quot;2.6&quot;&gt;
///&lt;Connections Name=&quot;Connections&quot; Export=&quot;False&quot; EncryptionEngine=&quot;AES&quot; BlockCipherMode=&quot;GCM&quot; KdfIterations=&quot;1000&quot; FullFileEncryption=&quot;False&quot; Protected=&quot;8LmIO3+MWBY0zTmfjfOEdCGxhTAwnlohb1veTGNZFt6lAYvY2UOzWyjVzkx6V93smpbP0ZOuexN15u7rvwJEjawC&quot; ConfVersion=&quot;2.6&quot;&gt;
/// &lt;Node Name=&quot;Folder1&quot; Type=&quot;Container&quot; Expanded=&quot;True&quot; Descr=&quot;&quot; Icon=&quot;mRemoteNG&quot; Panel=&quot;General&quot; Username=&quot;&quot; Domain=&quot;&quot; Password=&quot;&quot; Hostname=&quot;&quot; Protocol=&quot;ICA&quot; PuttySession=&quot;Default Settings&quot; Port=&quot;1494&quot; Connec [rest of string was truncated]&quot;;.
/// </summary>
internal static string confCons_v2_6 {
@@ -84,7 +102,7 @@ namespace mRemoteNGTests.Properties {
/// <summary>
/// Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
///&lt;Connections Name=&quot;Connections&quot; Export=&quot;False&quot; EncryptionEngine=&quot;AES&quot; BlockCipherMode=&quot;GCM&quot; KdfIterations=&quot;5000&quot; FullFileEncryption=&quot;False&quot; Protected=&quot;ZrxA5XJSUirgITMc2UxVRY4mLPxzNsyaqpgJXNdjcUdTlA/p4ZQP4bKqp44ZMrZlNU9jZgsvodGEVqS5/26St+Sk&quot; ConfVersion=&quot;2.6&quot;&gt;
///&lt;Connections Name=&quot;Connections&quot; Export=&quot;False&quot; EncryptionEngine=&quot;AES&quot; BlockCipherMode=&quot;GCM&quot; KdfIterations=&quot;5000&quot; FullFileEncryption=&quot;False&quot; Protected=&quot;Z1IOT8h7neJ5V7es5Iv63A2WsDG6QWl10F/Rb9ljKxvCseEITty1BfMNgiaVPfm7w61uabQKqu2waDCXUpLo1OZW&quot; ConfVersion=&quot;2.6&quot;&gt;
/// &lt;Node Name=&quot;Folder1&quot; Type=&quot;Container&quot; Expanded=&quot;True&quot; Descr=&quot;&quot; Icon=&quot;mRemoteNG&quot; Panel=&quot;General&quot; Username=&quot;&quot; Domain=&quot;&quot; Password=&quot;&quot; Hostname=&quot;&quot; Protocol=&quot;ICA&quot; PuttySession=&quot;Default Settings&quot; Port=&quot;1494&quot; Connec [rest of string was truncated]&quot;;.
/// </summary>
internal static string confCons_v2_6_5k_iterations {
@@ -95,7 +113,7 @@ namespace mRemoteNGTests.Properties {
/// <summary>
/// Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
///&lt;Connections Name=&quot;Connections&quot; Export=&quot;False&quot; EncryptionEngine=&quot;AES&quot; BlockCipherMode=&quot;GCM&quot; KdfIterations=&quot;1000&quot; FullFileEncryption=&quot;True&quot; Protected=&quot;tfNq70KLL8id4QnOeC9OrjMlACoArKa7pFJKcG1vrrRxMkvHpJPiEx/JlbPBJ3x4HXXx806ipsFiMkU1+OT7eE3Z&quot; ConfVersion=&quot;2.6&quot;&gt;NAxOa6dYlXPZCtpxWfiFrINjIC0dicQU7YdmKRnOn6POI07mMWU/Yy5uhPeXfVfzWgbPlKGyOMk5pgTw0pYIpTZpmqRKzZN+MzFw7NTW9QgD3Uhq528OItO2/MdpGQZ8AYM+qrDHHCXG9bGkczDwe5BZ8cDnGfbFrYTINGBZ9wxjLfyA9oYxzfrzoHDACbM8gD8wvmO26ML/lShwQS+/9B [rest of string was truncated]&quot;;.
///&lt;Connections Name=&quot;Connections&quot; Export=&quot;False&quot; EncryptionEngine=&quot;AES&quot; BlockCipherMode=&quot;GCM&quot; KdfIterations=&quot;1000&quot; FullFileEncryption=&quot;True&quot; Protected=&quot;qrOUhRlBLCnjjmfU1r8uwhgIBwZ+D1+trBgPmcQyEnW0xf2adLeOfUhZHnto2NOsMneXDibsS8PH0B1moOyvua22&quot; ConfVersion=&quot;2.6&quot;&gt;pCvan5X5+bSJy8oZq3QhrYs9zAS4v2tu9/4eYk4GAeB2EDep9Ed1zkshaLP165sWHE9oJ6bHnWSrSr/XXiDGdosvxl+O3hSSi02On9/TspuHhPDuuDb7UY2+mLh/LVoJqAjz2NmK7f3QkID2aanHkHzE/MDFiez8gLU8SdW9RxlSXT+L8MEjIXnq34yDVsfV89tGoP01T84ShTCZpRAQMq [rest of string was truncated]&quot;;.
/// </summary>
internal static string confCons_v2_6_fullencryption {
get {
@@ -105,7 +123,7 @@ namespace mRemoteNGTests.Properties {
/// <summary>
/// Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
///&lt;Connections Name=&quot;Connections&quot; Export=&quot;False&quot; EncryptionEngine=&quot;AES&quot; BlockCipherMode=&quot;GCM&quot; KdfIterations=&quot;1000&quot; FullFileEncryption=&quot;False&quot; Protected=&quot;et1WJ5jh501ty5nzV139lFcoK4Cjm2HwYiFDgEtTTW6iIMTiJ7ilw0gkDOOahwig8neVelBnGaP1AAmRY4B6&quot; ConfVersion=&quot;2.6&quot;&gt;
///&lt;Connections Name=&quot;Connections&quot; Export=&quot;False&quot; EncryptionEngine=&quot;AES&quot; BlockCipherMode=&quot;GCM&quot; KdfIterations=&quot;1000&quot; FullFileEncryption=&quot;False&quot; Protected=&quot;e/T6ajrPtNNlHreSeD4QBqToTuiqtNACKiPJv7vU+l6TWCu9JNsmL+Y8lJ4aTl5YVcstXpQjxsZ9i8+YV4Gs&quot; ConfVersion=&quot;2.6&quot;&gt;
/// &lt;Node Name=&quot;Folder1&quot; Type=&quot;Container&quot; Expanded=&quot;True&quot; Descr=&quot;&quot; Icon=&quot;mRemoteNG&quot; Panel=&quot;General&quot; Username=&quot;&quot; Domain=&quot;&quot; Password=&quot;&quot; Hostname=&quot;&quot; Protocol=&quot;ICA&quot; PuttySession=&quot;Default Settings&quot; Port=&quot;1494&quot; ConnectToC [rest of string was truncated]&quot;;.
/// </summary>
internal static string confCons_v2_6_passwordis_Password {
@@ -116,7 +134,7 @@ namespace mRemoteNGTests.Properties {
/// <summary>
/// Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
///&lt;Connections Name=&quot;Connections&quot; Export=&quot;False&quot; EncryptionEngine=&quot;AES&quot; BlockCipherMode=&quot;GCM&quot; KdfIterations=&quot;1000&quot; FullFileEncryption=&quot;True&quot; Protected=&quot;RD3KGFlcH+4MxnYNje/ruXy6kN6pXgOwg8u6jlyU4u1RFWd8gm8DAGyAdycTDCr37dCNsi6F4Huj41haRQg4&quot; ConfVersion=&quot;2.6&quot;&gt;/au8q00e4YHoMGSnNWL/zRCzSQd1EaDgZ6VHuJ92iffxh5Spuhy86nsoiMr99UMaUF8UjlrYsboZC2B5sLO6t1lqKuB9okjY/jaLHTlGB7mmaHlDHXo7WEChz51xO+caUGfXCXPHgHOFsz/yCJIv3E9LwVOsAIH2qTfMp19OsytF3+Lb4T8v3nMAKb1iw63WcjFsp/835TMcZWWjI+SwPNKMze [rest of string was truncated]&quot;;.
///&lt;Connections Name=&quot;Connections&quot; Export=&quot;False&quot; EncryptionEngine=&quot;AES&quot; BlockCipherMode=&quot;GCM&quot; KdfIterations=&quot;1000&quot; FullFileEncryption=&quot;True&quot; Protected=&quot;d7pvbk1N6aswOmTgjCKkkavQKM2xTpknkdnMgzi+bOPgwr9WirGy82kaQldQ06af7MrZgJwvc9hKAcGxBfYt&quot; ConfVersion=&quot;2.6&quot;&gt;P9haenvGQ9HxnJSUUY+3SdALKoWQau0gF3Vxk6eCERKJ9G2gi87zhBcMCH+PwSsh/5ohPfOansFvUcDvPeE10slCTVqQmQFeU+daQY4OMk+2Q0UR/rEDRlbjGlM8YKVv2xjLRPRs6AbNJsKLv4zo8T/x3ySlZnuiMiGTGt4Wstfle/QfwNbBeV88N5IPbbKy2FWQf5yOlPtrjgPrcl0cRtRI3c [rest of string was truncated]&quot;;.
/// </summary>
internal static string confCons_v2_6_passwordis_Password_fullencryption {
get {

View File

@@ -121,6 +121,12 @@
<data name="confCons_v2_5" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\confCons_v2_5.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
<data name="confCons_v2_5_fullencryption" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\confCons_v2_5_fullencryption.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
<data name="confCons_v2_5_passwordis_Password_fullencryption" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\confCons_v2_5_passwordis_Password_fullencryption.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
<data name="confCons_v2_6" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\confCons_v2_6.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -201,6 +201,12 @@
<ItemGroup>
<None Include="Resources\confCons_v2_6_5k-iterations.xml" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\confCons_v2_5_fullencryption.xml" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\confCons_v2_5_passwordis_Password_fullencryption.xml" />
</ItemGroup>
<Choose>
<When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
<ItemGroup>

View File

@@ -1,7 +1,6 @@
using log4net;
using log4net.Appender;
using log4net.Config;
using log4net.Repository;
#if !PORTABLE
using System;
#endif
@@ -29,12 +28,12 @@ namespace mRemoteNG.App
private void Initialize()
{
XmlConfigurator.Configure();
string logFile = BuildLogFilePath();
var logFile = BuildLogFilePath();
ILoggerRepository repository = LogManager.GetRepository();
IAppender[] appenders = repository.GetAppenders();
var repository = LogManager.GetRepository();
var appenders = repository.GetAppenders();
foreach (IAppender appender in appenders)
foreach (var appender in appenders)
{
var fileAppender = (RollingFileAppender)appender;
if (fileAppender == null || fileAppender.Name != "LogFileAppender") continue;
@@ -47,12 +46,12 @@ namespace mRemoteNG.App
private static string BuildLogFilePath()
{
#if !PORTABLE
string logFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), Application.ProductName);
var logFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), Application.ProductName);
#else
string logFilePath = Application.StartupPath;
var logFilePath = Application.StartupPath;
#endif
string logFileName = Path.ChangeExtension(Application.ProductName, ".log");
string logFile = Path.Combine(logFilePath, logFileName);
var logFileName = Path.ChangeExtension(Application.ProductName, ".log");
var logFile = Path.Combine(logFilePath, logFileName);
return logFile;
}
}

View File

@@ -437,6 +437,7 @@ namespace mRemoteNG.App
public static void SaveConnections()
{
if (ConnectionTreeModel == null) return;
if (!IsConnectionsFileLoaded) return;
try
{

View File

@@ -6,28 +6,25 @@ using System.Threading;
using System.Reflection;
using mRemoteNG.App.Info;
using mRemoteNG.Security.SymmetricEncryption;
#if PORTABLE
using System.Security.Cryptography;
using System.Windows.Forms;
#else
#if !PORTABLE
using mRemoteNG.Tools;
#else
using System.Windows.Forms;
#endif
namespace mRemoteNG.App.Update
{
public class AppUpdater
{
private UpdateInfo _currentUpdateInfo;
private string _changeLog;
private WebProxy _webProxy;
private WebProxy _webProxy;
private Thread _getUpdateInfoThread;
private Thread _getChangeLogThread;
#region Public Properties
public UpdateInfo CurrentUpdateInfo => _currentUpdateInfo;
public UpdateInfo CurrentUpdateInfo { get; private set; }
public string ChangeLog => _changeLog;
public string ChangeLog { get; private set; }
public bool IsGetUpdateInfoRunning => _getUpdateInfoThread != null && _getUpdateInfoThread.IsAlive;
@@ -72,12 +69,12 @@ namespace mRemoteNG.App.Update
public bool IsUpdateAvailable()
{
if (_currentUpdateInfo == null || !_currentUpdateInfo.IsValid)
if (CurrentUpdateInfo == null || !CurrentUpdateInfo.IsValid)
{
return false;
}
return _currentUpdateInfo.Version > GeneralAppInfo.GetApplicationVersion();
return CurrentUpdateInfo.Version > GeneralAppInfo.GetApplicationVersion();
}
public void GetUpdateInfoAsync()
@@ -95,7 +92,7 @@ namespace mRemoteNG.App.Update
public void GetChangeLogAsync()
{
if (_currentUpdateInfo == null || !_currentUpdateInfo.IsValid)
if (CurrentUpdateInfo == null || !CurrentUpdateInfo.IsValid)
{
throw new InvalidOperationException("CurrentUpdateInfo is not valid. GetUpdateInfoAsync() must be called before calling GetChangeLogAsync().");
}
@@ -118,29 +115,29 @@ namespace mRemoteNG.App.Update
throw new InvalidOperationException("A previous call to DownloadUpdateAsync() is still in progress.");
}
if (_currentUpdateInfo == null || !_currentUpdateInfo.IsValid)
if (CurrentUpdateInfo == null || !CurrentUpdateInfo.IsValid)
{
throw new InvalidOperationException("CurrentUpdateInfo is not valid. GetUpdateInfoAsync() must be called before calling DownloadUpdateAsync().");
}
#if !PORTABLE
_currentUpdateInfo.UpdateFilePath = Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Path.GetRandomFileName(), "exe"));
CurrentUpdateInfo.UpdateFilePath = Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Path.GetRandomFileName(), "msi"));
#else
var sfd = new SaveFileDialog
{
InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory),
FileName = _currentUpdateInfo.FileName,
FileName = CurrentUpdateInfo.FileName,
RestoreDirectory = true
};
if (sfd.ShowDialog() == DialogResult.OK)
{
_currentUpdateInfo.UpdateFilePath = sfd.FileName;
CurrentUpdateInfo.UpdateFilePath = sfd.FileName;
}
else
{
return;
}
#endif
DownloadUpdateWebClient.DownloadFileAsync(CurrentUpdateInfo.DownloadAddress, _currentUpdateInfo.UpdateFilePath);
DownloadUpdateWebClient.DownloadFileAsync(CurrentUpdateInfo.DownloadAddress, CurrentUpdateInfo.UpdateFilePath);
}
#endregion
@@ -215,7 +212,7 @@ namespace mRemoteNG.App.Update
if (!e.Cancelled && e.Error == null)
{
_currentUpdateInfo = UpdateInfo.FromString(e.Result);
CurrentUpdateInfo = UpdateInfo.FromString(e.Result);
Settings.Default.CheckForUpdatesLastCheck = DateTime.UtcNow;
if (!Settings.Default.UpdatePending)
@@ -229,11 +226,11 @@ namespace mRemoteNG.App.Update
private void GetChangeLog()
{
var e = DownloadString(_currentUpdateInfo.ChangeLogAddress);
var e = DownloadString(CurrentUpdateInfo.ChangeLogAddress);
if (!e.Cancelled && e.Error == null)
{
_changeLog = e.Result;
ChangeLog = e.Result;
}
GetChangeLogCompletedEventEvent?.Invoke(this, e);
@@ -253,10 +250,10 @@ namespace mRemoteNG.App.Update
try
{
#if !PORTABLE
var updateAuthenticode = new Authenticode(_currentUpdateInfo.UpdateFilePath)
var updateAuthenticode = new Authenticode(CurrentUpdateInfo.UpdateFilePath)
{
RequireThumbprintMatch = true,
ThumbprintToMatch = _currentUpdateInfo.CertificateThumbprint
ThumbprintToMatch = CurrentUpdateInfo.CertificateThumbprint
};
if (updateAuthenticode.Verify() != Authenticode.StatusValue.Verified)
@@ -268,18 +265,18 @@ namespace mRemoteNG.App.Update
throw (new Exception(updateAuthenticode.StatusMessage));
}
#else
#endif
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(_currentUpdateInfo.UpdateFilePath))
using (var stream = File.OpenRead(CurrentUpdateInfo.UpdateFilePath))
{
var hash = md5.ComputeHash(stream);
var hashString = BitConverter.ToString(hash).Replace("-", "");
if (!hashString.Equals(_currentUpdateInfo.CertificateThumbprint))
var hashString = BitConverter.ToString(hash).Replace("-", "").ToUpperInvariant();
if (!hashString.Equals(CurrentUpdateInfo.Checksum))
throw new Exception("MD5 Hashes didn't match!");
}
}
#endif
}
catch (Exception ex)
{
@@ -289,7 +286,7 @@ namespace mRemoteNG.App.Update
if (raiseEventArgs.Cancelled || raiseEventArgs.Error != null)
{
File.Delete(_currentUpdateInfo.UpdateFilePath);
File.Delete(CurrentUpdateInfo.UpdateFilePath);
}
DownloadUpdateCompletedEventEvent?.Invoke(this, raiseEventArgs);

View File

@@ -34,23 +34,16 @@ namespace mRemoteNG.App.Update
{
var trimmedLine = line.Trim();
if (trimmedLine.Length == 0)
{
continue;
}
if (trimmedLine.Substring(0, 1).IndexOfAny(commentCharacters) != -1)
{
continue;
}
var parts = trimmedLine.Split(keyValueSeparators, 2);
if (parts.Length != 2)
{
continue;
}
var key = parts[0].Trim();
var value = parts[1].Trim();
Items.Add(key, value);
Items.Add(parts[0].Trim(), parts[1].Trim());
}
}
}
@@ -59,10 +52,10 @@ namespace mRemoteNG.App.Update
private string GetString(string key)
{
// ReSharper restore MemberCanBePrivate.Local
return !Items.ContainsKey(key) ? string.Empty : this.Items[key];
return !Items.ContainsKey(key) ? string.Empty : Items[key];
}
public Version GetVersion(string key)
public Version GetVersion(string key = "Version")
{
var value = GetString(key);
return string.IsNullOrEmpty(value) ? null : new Version(value);
@@ -74,7 +67,7 @@ namespace mRemoteNG.App.Update
return string.IsNullOrEmpty(value) ? null : new Uri(value);
}
public string GetThumbprint(string key)
public string GetThumbprint(string key = "CertificateThumbprint")
{
return GetString(key).Replace(" ", "").ToUpperInvariant();
}
@@ -85,6 +78,11 @@ namespace mRemoteNG.App.Update
var sv = value.Split('/');
return sv[sv.Length-1];
}
public string GetChecksum(string key = "Checksum")
{
return GetString(key).Replace(" ", "").ToUpperInvariant();
}
#endregion
}
}

View File

@@ -11,8 +11,11 @@ namespace mRemoteNG.App.Update
public Uri ChangeLogAddress { get; private set; }
public Uri ImageAddress { get; private set; }
public Uri ImageLinkAddress { get; private set; }
#if !PORTABLE
public string CertificateThumbprint { get; private set; }
#endif
public string FileName { get; private set; }
public string Checksum { get; private set; }
public static UpdateInfo FromString(string input)
{
@@ -24,13 +27,16 @@ namespace mRemoteNG.App.Update
else
{
var updateFile = new UpdateFile(input);
newInfo.Version = updateFile.GetVersion("Version");
newInfo.Version = updateFile.GetVersion();
newInfo.DownloadAddress = updateFile.GetUri("dURL");
newInfo.ChangeLogAddress = updateFile.GetUri("clURL");
newInfo.ImageAddress = updateFile.GetUri("imgURL");
newInfo.ImageLinkAddress = updateFile.GetUri("imgURLLink");
newInfo.CertificateThumbprint = updateFile.GetThumbprint("CertificateThumbprint");
#if !PORTABLE
newInfo.CertificateThumbprint = updateFile.GetThumbprint();
#endif
newInfo.FileName = updateFile.GetFileName();
newInfo.Checksum = updateFile.GetChecksum();
newInfo.IsValid = true;
}
return newInfo;

View File

@@ -1,6 +1,7 @@
using mRemoteNG.UI.Forms;
using mRemoteNG.UI.Window;
using System;
using mRemoteNG.Messages;
using mRemoteNG.UI;
using WeifenLuo.WinFormsUI.Docking;
@@ -116,6 +117,7 @@ namespace mRemoteNG.App
}
else if (windowType.Equals(WindowType.ComponentsCheck))
{
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "Showing ComponentsCheck window", true);
if (_componentscheckForm == null || _componentscheckForm.IsDisposed)
{
_componentscheckForm = new ComponentsCheckWindow(_componentscheckPanel);

View File

@@ -30,10 +30,7 @@ namespace mRemoteNG.Config.Connections
{
var dataProvider = new FileDataProvider(ConnectionFileName);
var xmlString = dataProvider.Load();
deserializer = new XmlConnectionsDeserializer(xmlString)
{
AuthenticationRequestor = PromptForPassword
};
deserializer = new XmlConnectionsDeserializer(xmlString, PromptForPassword);
}
var connectionTreeModel = deserializer.Deserialize();

View File

@@ -29,12 +29,13 @@ namespace mRemoteNG.Config.Serializers
//TODO find way to inject data source info
private string ConnectionFileName = "";
private const double MaxSupportedConfVersion = 2.6;
private RootNodeInfo _rootNodeInfo;
private RootNodeInfo _rootNodeInfo = new RootNodeInfo(RootNodeType.Connection);
public Func<SecureString> AuthenticationRequestor { get; set; }
public XmlConnectionsDeserializer(string xml)
public XmlConnectionsDeserializer(string xml, Func<SecureString> authenticationRequestor = null)
{
AuthenticationRequestor = authenticationRequestor;
LoadXmlConnectionData(xml);
ValidateConnectionFileVersion();
}
@@ -91,7 +92,7 @@ namespace mRemoteNG.Config.Serializers
Runtime.IsConnectionsFileLoaded = false;
var rootXmlElement = _xmlDocument.DocumentElement;
_rootNodeInfo = InitializeRootNode(rootXmlElement);
InitializeRootNode(rootXmlElement);
CreateDecryptor(_rootNodeInfo, rootXmlElement);
var connectionTreeModel = new ConnectionTreeModel();
connectionTreeModel.AddRootNode(_rootNodeInfo);
@@ -138,14 +139,10 @@ namespace mRemoteNG.Config.Serializers
}
}
private RootNodeInfo InitializeRootNode(XmlElement connectionsRootElement)
private void InitializeRootNode(XmlElement connectionsRootElement)
{
var rootNodeName = connectionsRootElement?.Attributes["Name"].Value.Trim();
var rootInfo = new RootNodeInfo(RootNodeType.Connection)
{
Name = rootNodeName
};
return rootInfo;
_rootNodeInfo.Name = rootNodeName;
}
private void CreateDecryptor(RootNodeInfo rootNodeInfo, XmlElement connectionsRootElement = null)

View File

@@ -16,22 +16,17 @@ namespace mRemoteNG.Config.Settings
{
public class SettingsLoader
{
private frmMain _mainForm;
private readonly LayoutSettingsLoader _layoutSettingsLoader;
private readonly LayoutSettingsLoader _layoutSettingsLoader;
private readonly ExternalAppsLoader _externalAppsLoader;
public frmMain MainForm
private frmMain MainForm { get; set; }
public SettingsLoader(frmMain mainForm)
{
get { return _mainForm; }
set { _mainForm = value; }
}
public SettingsLoader(frmMain mainForm)
{
_mainForm = mainForm;
_layoutSettingsLoader = new LayoutSettingsLoader(_mainForm);
_externalAppsLoader = new ExternalAppsLoader(_mainForm);
MainForm = mainForm;
_layoutSettingsLoader = new LayoutSettingsLoader(MainForm);
_externalAppsLoader = new ExternalAppsLoader(MainForm);
}
#region Public Methods
@@ -85,41 +80,40 @@ namespace mRemoteNG.Config.Settings
private static void SetSupportedCulture()
{
if (mRemoteNG.Settings.Default.OverrideUICulture != "" && SupportedCultures.IsNameSupported(mRemoteNG.Settings.Default.OverrideUICulture))
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(mRemoteNG.Settings.Default.OverrideUICulture);
Logger.Instance.InfoFormat("Override Culture: {0}/{1}", Thread.CurrentThread.CurrentUICulture.Name, Thread.CurrentThread.CurrentUICulture.NativeName);
}
if (mRemoteNG.Settings.Default.OverrideUICulture == "" ||
!SupportedCultures.IsNameSupported(mRemoteNG.Settings.Default.OverrideUICulture)) return;
Thread.CurrentThread.CurrentUICulture = new CultureInfo(mRemoteNG.Settings.Default.OverrideUICulture);
Logger.Instance.InfoFormat("Override Culture: {0}/{1}", Thread.CurrentThread.CurrentUICulture.Name, Thread.CurrentThread.CurrentUICulture.NativeName);
}
private void SetApplicationWindowPositionAndSize()
{
_mainForm.WindowState = FormWindowState.Normal;
MainForm.WindowState = FormWindowState.Normal;
if (mRemoteNG.Settings.Default.MainFormState == FormWindowState.Normal)
{
if (!mRemoteNG.Settings.Default.MainFormLocation.IsEmpty)
_mainForm.Location = mRemoteNG.Settings.Default.MainFormLocation;
MainForm.Location = mRemoteNG.Settings.Default.MainFormLocation;
if (!mRemoteNG.Settings.Default.MainFormSize.IsEmpty)
_mainForm.Size = mRemoteNG.Settings.Default.MainFormSize;
MainForm.Size = mRemoteNG.Settings.Default.MainFormSize;
}
else
{
if (!mRemoteNG.Settings.Default.MainFormRestoreLocation.IsEmpty)
_mainForm.Location = mRemoteNG.Settings.Default.MainFormRestoreLocation;
MainForm.Location = mRemoteNG.Settings.Default.MainFormRestoreLocation;
if (!mRemoteNG.Settings.Default.MainFormRestoreSize.IsEmpty)
_mainForm.Size = mRemoteNG.Settings.Default.MainFormRestoreSize;
MainForm.Size = mRemoteNG.Settings.Default.MainFormRestoreSize;
}
if (mRemoteNG.Settings.Default.MainFormState == FormWindowState.Maximized)
{
_mainForm.WindowState = FormWindowState.Maximized;
MainForm.WindowState = FormWindowState.Maximized;
}
// Make sure the form is visible on the screen
const int minHorizontal = 300;
const int minVertical = 150;
var screenBounds = Screen.FromHandle(_mainForm.Handle).Bounds;
var newBounds = _mainForm.Bounds;
var screenBounds = Screen.FromHandle(MainForm.Handle).Bounds;
var newBounds = MainForm.Bounds;
if (newBounds.Right < screenBounds.Left + minHorizontal)
newBounds.X = screenBounds.Left + minHorizontal - newBounds.Width;
@@ -130,25 +124,21 @@ namespace mRemoteNG.Config.Settings
if (newBounds.Top > screenBounds.Bottom - minVertical)
newBounds.Y = screenBounds.Bottom - minVertical;
_mainForm.Location = newBounds.Location;
MainForm.Location = newBounds.Location;
}
private void SetAutoSave()
{
if (mRemoteNG.Settings.Default.AutoSaveEveryMinutes > 0)
{
_mainForm.tmrAutoSave.Interval = Convert.ToInt32(mRemoteNG.Settings.Default.AutoSaveEveryMinutes * 60000);
_mainForm.tmrAutoSave.Enabled = true;
}
if (mRemoteNG.Settings.Default.AutoSaveEveryMinutes <= 0) return;
MainForm.tmrAutoSave.Interval = Convert.ToInt32(mRemoteNG.Settings.Default.AutoSaveEveryMinutes * 60000);
MainForm.tmrAutoSave.Enabled = true;
}
private void SetKioskMode()
{
if (mRemoteNG.Settings.Default.MainFormKiosk)
{
_mainForm.Fullscreen.Value = true;
_mainForm.mMenViewFullscreen.Checked = true;
}
if (!mRemoteNG.Settings.Default.MainFormKiosk) return;
MainForm.Fullscreen.Value = true;
MainForm.mMenViewFullscreen.Checked = true;
}
private static void SetShowSystemTrayIcon()
@@ -159,10 +149,7 @@ namespace mRemoteNG.Config.Settings
private static void SetPuttyPath()
{
if (mRemoteNG.Settings.Default.UseCustomPuttyPath)
PuttyBase.PuttyPath = Convert.ToString(mRemoteNG.Settings.Default.CustomPuttyPath);
else
PuttyBase.PuttyPath = GeneralAppInfo.PuttyPath;
PuttyBase.PuttyPath = mRemoteNG.Settings.Default.UseCustomPuttyPath ? Convert.ToString(mRemoteNG.Settings.Default.CustomPuttyPath) : GeneralAppInfo.PuttyPath;
}
private static void EnsureSettingsAreSavedInNewestVersion()
@@ -187,16 +174,16 @@ namespace mRemoteNG.Config.Settings
// needs to be cleared here because we know that we just updated.
mRemoteNG.Settings.Default.UpdatePending = false;
}
public void SetToolbarsDefault()
private void SetToolbarsDefault()
{
ToolStripPanelFromString("top").Join(MainForm.tsQuickConnect, new Point(300, 0));
MainForm.tsQuickConnect.Visible = true;
ToolStripPanelFromString("bottom").Join(MainForm.tsExternalTools, new Point(3, 0));
MainForm.tsExternalTools.Visible = false;
}
public void LoadToolbarsFromSettings()
private void LoadToolbarsFromSettings()
{
if (mRemoteNG.Settings.Default.QuickyTBLocation.X > mRemoteNG.Settings.Default.ExtAppsTBLocation.X)
{
@@ -238,13 +225,13 @@ namespace mRemoteNG.Config.Settings
return MainForm.tsContainer.TopToolStripPanel;
}
}
public void LoadPanelsFromXml()
private void LoadPanelsFromXml()
{
_layoutSettingsLoader.LoadPanelsFromXml();
}
public void LoadExternalAppsFromXml()
private void LoadExternalAppsFromXml()
{
_externalAppsLoader.LoadExternalAppsFromXML();
}

View File

@@ -5,30 +5,26 @@ using mRemoteNG.UI.Window;
using mRemoteNG.App;
using mRemoteNG.UI.Forms;
using WeifenLuo.WinFormsUI.Docking;
using Timer = System.Windows.Forms.Timer;
namespace mRemoteNG.Messages
{
public class MessageCollector
{
private Timer _ECTimer;
private ErrorAndInfoWindow _MCForm;
public ErrorAndInfoWindow MCForm
{
get { return _MCForm; }
set { _MCForm = value; }
}
private ErrorAndInfoWindow MCForm { get; set; }
public MessageCollector(ErrorAndInfoWindow MessageCollectorForm)
{
_MCForm = MessageCollectorForm;
MCForm = MessageCollectorForm;
CreateTimer();
}
#region Public Methods
public void AddMessage(MessageClass MsgClass, string MsgText, bool OnlyLog = false)
{
Message nMsg = new Message(MsgClass, MsgText, DateTime.Now);
var nMsg = new Message(MsgClass, MsgText, DateTime.Now);
if (nMsg.MsgClass == MessageClass.ReportMsg)
{
@@ -78,25 +74,25 @@ namespace mRemoteNG.Messages
else
ShowMessageBox(nMsg);
ListViewItem lvItem = BuildListViewItem(nMsg);
var lvItem = BuildListViewItem(nMsg);
AddToList(lvItem);
}
private void AddInfoMessage(Message nMsg)
private static void AddInfoMessage(Message nMsg)
{
Debug.Print("Info: " + nMsg.MsgText);
if (Settings.Default.WriteLogFile)
Logger.Instance.Info(nMsg.MsgText);
}
private void AddWarningMessage(Message nMsg)
private static void AddWarningMessage(Message nMsg)
{
Debug.Print("Warning: " + nMsg.MsgText);
if (Settings.Default.WriteLogFile)
Logger.Instance.Warn(nMsg.MsgText);
}
private void AddErrorMessage(Message nMsg)
private static void AddErrorMessage(Message nMsg)
{
Debug.Print("Error: " + nMsg.MsgText);
Logger.Instance.Error(nMsg.MsgText);
@@ -111,7 +107,7 @@ namespace mRemoteNG.Messages
private static ListViewItem BuildListViewItem(Message nMsg)
{
ListViewItem lvItem = new ListViewItem
var lvItem = new ListViewItem
{
ImageIndex = Convert.ToInt32(nMsg.MsgClass),
Text = nMsg.MsgText.Replace(Environment.NewLine, " "),
@@ -150,12 +146,12 @@ namespace mRemoteNG.Messages
private void SwitchToMessage()
{
_MCForm.PreviousActiveForm = (DockContent)frmMain.Default.pnlDock.ActiveContent;
MCForm.PreviousActiveForm = (DockContent)frmMain.Default.pnlDock.ActiveContent;
ShowMCForm();
_MCForm.lvErrorCollector.Focus();
_MCForm.lvErrorCollector.SelectedItems.Clear();
_MCForm.lvErrorCollector.Items[0].Selected = true;
_MCForm.lvErrorCollector.FocusedItem = _MCForm.lvErrorCollector.Items[0];
MCForm.lvErrorCollector.Focus();
MCForm.lvErrorCollector.SelectedItems.Clear();
MCForm.lvErrorCollector.Items[0].Selected = true;
MCForm.lvErrorCollector.FocusedItem = MCForm.lvErrorCollector.Items[0];
}
private static void ShowMessageBox(Message Msg)
@@ -181,26 +177,26 @@ namespace mRemoteNG.Messages
{
if (frmMain.Default.pnlDock.InvokeRequired)
{
ShowMCFormCB d = new ShowMCFormCB(ShowMCForm);
var d = new ShowMCFormCB(ShowMCForm);
frmMain.Default.pnlDock.Invoke(d);
}
else
{
_MCForm.Show(frmMain.Default.pnlDock);
MCForm.Show(frmMain.Default.pnlDock);
}
}
delegate void AddToListCB(ListViewItem lvItem);
private void AddToList(ListViewItem lvItem)
{
if (_MCForm.lvErrorCollector.InvokeRequired)
if (MCForm.lvErrorCollector.InvokeRequired)
{
AddToListCB d = new AddToListCB(AddToList);
_MCForm.lvErrorCollector.Invoke(d, new object[] { lvItem });
var d = new AddToListCB(AddToList);
MCForm.lvErrorCollector.Invoke(d, new object[] { lvItem });
}
else
{
_MCForm.lvErrorCollector.Items.Insert(0, lvItem);
MCForm.lvErrorCollector.Items.Insert(0, lvItem);
}
}
#endregion

View File

@@ -1873,7 +1873,8 @@ namespace mRemoteNG {
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("de,el,en,en-US,es-AR,es,fr,hu,it,ja-JP,nb-NO,nl,pt,pt-BR,pl,ru,uk,zh-CN,zh-TW")]
[global::System.Configuration.DefaultSettingValueAttribute("de,el,en,en-US,es-AR,es,fr,hu,it,ja-JP,nb-NO,nl,pt,pt-BR,pl,ru,uk,tr-TR,zh-CN,zh-" +
"TW")]
public string SupportedUICultures {
get {
return ((string)(this["SupportedUICultures"]));

View File

@@ -465,7 +465,7 @@
<Value Profile="(Default)" />
</Setting>
<Setting Name="SupportedUICultures" Type="System.String" Scope="Application">
<Value Profile="(Default)">de,el,en,en-US,es-AR,es,fr,hu,it,ja-JP,nb-NO,nl,pt,pt-BR,pl,ru,uk,zh-CN,zh-TW</Value>
<Value Profile="(Default)">de,el,en,en-US,es-AR,es,fr,hu,it,ja-JP,nb-NO,nl,pt,pt-BR,pl,ru,uk,tr-TR,zh-CN,zh-TW</Value>
</Setting>
<Setting Name="ConDefaultRDGatewayHostname" Type="System.String" Scope="User">
<Value Profile="(Default)" />

View File

@@ -1,13 +1,78 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>SSH File Transfer</title>
<link href="Main.css" rel="stylesheet" type="text/css" />
<title>SSH File Transfer</title>
<link href="Main.css" rel="stylesheet" type="text/css" />
</head>
<body>
<p>
Sorry, not yet...</p>
<p class="heading1">
Introduction to SSH File Transfer
</p>
<p>
SSH File Transfer functionality allows you to securely transfer files to a remote host over an encrypted tunnel using either SFTP or SCP.
</p>
<p class="heading1">
Use Cases
</p>
<p>
The primary use case is to upload individual files, such as configuration files, to a remote host.
</p>
<p class="heading1">Prerequisites</p>
<ul>
<li>SSH File Transfer requires an SSH service to listen on an available network port (default 22) on a remote host.</li>
<li>A username and password must be supplied to connect with the remote host.</li>
<li>The remote host must have a writeable folder on its filesystem to place the transferred files.</li>
</ul>
<p class="heading1">Configuration Options</p>
<ul>
<li><b>Host</b> - The remote host you connect to. Can be DNS name or IP address.</li>
<li><b>Port</b> - Remote network port listening for SSH/SFTP/SCP traffic.</li>
<li><b>User</b> - Username for account to log on to remote host.</li>
<li><b>Password</b> - Password for account to log on to remote host.</li>
<li><b>Protocol</b> - Choice of SCP or SFTP protocol used for communication.</li>
<li><b>Local File</b> - Path of file to transfer from local host.</li>
<li><b>Remote File</b> - Path where file will be transferred on remote host.<br />
Example: /home/John/Documents</li>
</ul>
<p class="heading1">Using SSH File Transfer</p>
<p>
To begin, select <b>Tools</b> and then <b>SSH File Transfer</b>. The tool will fill the window and allow you to input the configuration options. Each piece of information is needed for a successful transfer.
</p>
<p>
To populate the <b>Local File</b> option, select the <b>Browse</b> button and navigate to the desired file on the local filesystem. To populate the <b>Remote File</b> option, manually type desired filesystem path, including the desired file name.
</p>
<p>
Once all options are populated, select <b>Transfer</b> and the progress bar at the bottom of the window will show the progress.
</p>
<p class="heading1">Troubleshooting SSH File Transfer</p>
<p>
To troubleshoot issues with SSH File Transfer, consult the log under %AppData%\mRemoteNG\mRemoteNG.log. This log provides verbose information about successful and failed connections.
<br />
<br />
<span class="heading2">
Common Issues
</span>
<br />
<br />
<b>ERROR- Please fill all fields</b><br />
This issue was likely encountered because you did not provide all information needed to establish the connection.
<br />
<br />
<b>System.Net.Sockets.SocketException (0x80004005): No connection could be made because the target machine actively refused it</b><br />
This issue was likely encountered because the local host could not contact the remote host specified on the remote port specified.<br />
The issue may be caused by improperly configured firewall rules or a SSH service not listening properly on the remote host.
<br />
<br />
<b>[14] ERROR- SSH background transfer failed!</b><br />
This issue was likely encountered due to a permissions issue. Ensure you have appropriate access to write to the specified Remote File.
</p>
</body>
</html>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -452,8 +452,13 @@ namespace mRemoteNG.UI.Window
private void tvConnections_NodeMouseDoubleClick(object sender, CellClickEventArgs e)
{
if (e.ClickCount < 2) return;
var clickedNodeAsContainer = e.Model as ContainerInfo;
if (clickedNodeAsContainer != null)
{
olvConnections.ToggleExpansion(clickedNodeAsContainer);
}
var clickedNode = e.Model as ConnectionInfo;
if (clickedNode?.GetTreeNodeType() == TreeNodeType.Connection |
clickedNode?.GetTreeNodeType() == TreeNodeType.PuttySession)
{

View File

@@ -606,7 +606,7 @@
<applicationSettings>
<mRemoteNG.Settings>
<setting name="SupportedUICultures" serializeAs="String">
<value>de,el,en,en-US,es-AR,es,fr,hu,it,ja-JP,nb-NO,nl,pt,pt-BR,pl,ru,uk,zh-CN,zh-TW</value>
<value>de,el,en,en-US,es-AR,es,fr,hu,it,ja-JP,nb-NO,nl,pt,pt-BR,pl,ru,uk,tr-TR,zh-CN,zh-TW</value>
</setting>
<setting name="UpdateChannel" serializeAs="String">
<value>release</value>

View File

@@ -489,6 +489,7 @@
<EmbeddedResource Include="Resources\Language\Language.ja-JP.resx">
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Resources\Language\Language.tr-TR.resx" />
<EmbeddedResource Include="UI\Controls\IPTextBox.resx">
<DependentUpon>IPTextBox.cs</DependentUpon>
</EmbeddedResource>