mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-21 16:38:38 +08:00
Compare commits
61 Commits
v1.75Beta1
...
v1.75Beta3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6eff685b18 | ||
|
|
2d08146de8 | ||
|
|
f131420a44 | ||
|
|
245ea5463e | ||
|
|
71bb90a769 | ||
|
|
e71a22fbb3 | ||
|
|
802c4c28f5 | ||
|
|
2cda6fc057 | ||
|
|
a0303c70f9 | ||
|
|
f5b9f58747 | ||
|
|
0d8dee0ed7 | ||
|
|
ace02263dd | ||
|
|
a2398bfb3a | ||
|
|
cd7ddb5ba1 | ||
|
|
ae37a4c85d | ||
|
|
32e1716061 | ||
|
|
d92616f39f | ||
|
|
0c13db46fd | ||
|
|
b6fc9a8ec1 | ||
|
|
a672141352 | ||
|
|
df354e483a | ||
|
|
89874545b1 | ||
|
|
b0fdd09f39 | ||
|
|
fbf620ae36 | ||
|
|
509f7da12e | ||
|
|
64a40e4ed0 | ||
|
|
ab253dbf28 | ||
|
|
feb19df20f | ||
|
|
d5d2241f1b | ||
|
|
5af1a0aa87 | ||
|
|
816621651d | ||
|
|
8f2aa08dbe | ||
|
|
d20e1a6e9c | ||
|
|
2a5a4c9ace | ||
|
|
2e7fd3fb60 | ||
|
|
56579100f1 | ||
|
|
1e5cd24acd | ||
|
|
7f152cef20 | ||
|
|
3958d2d597 | ||
|
|
84a3b31e8d | ||
|
|
cc15c12d19 | ||
|
|
50e7b89b15 | ||
|
|
0b507cb66a | ||
|
|
b1c697ea09 | ||
|
|
dbcf15e45b | ||
|
|
21d864ce7a | ||
|
|
dcf1f1af10 | ||
|
|
9c25a39b7b | ||
|
|
d79687db53 | ||
|
|
77428e0fe5 | ||
|
|
53df3b5cfa | ||
|
|
f2e1c9e959 | ||
|
|
a004b2f3e0 | ||
|
|
65b4398b0e | ||
|
|
0b83d2869d | ||
|
|
1a408b810c | ||
|
|
bab5879c3d | ||
|
|
70408ca8ee | ||
|
|
82848aa4cd | ||
|
|
5131604ba7 | ||
|
|
1be821b07a |
61
.github/CONTRIBUTING.md
vendored
61
.github/CONTRIBUTING.md
vendored
@@ -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
BIN
.github/icon_ReSharper.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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) > 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=<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) > 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>
|
||||
@@ -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">
|
||||
|
||||
@@ -6,9 +6,11 @@
|
||||
[](https://www.paypal.me/DavidSparer)
|
||||
|
||||
[](http://ec2-52-39-111-114.us-west-2.compute.amazonaws.com:8080/job/mRemoteNG/job/mRemoteNG/job/develop/)
|
||||
[](http://waffle.io/mRemoteNG/mRemoteNG)
|
||||
[](https://waffle.io/mRemoteNG/mRemoteNG)
|
||||
[](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.74)
|
||||
|
||||
[](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).
|
||||
|
||||
|
||||
|
||||
[](https://www.jetbrains.com/resharper/)
|
||||
@@ -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
|
||||
@@ -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"));
|
||||
|
||||
28
mRemoteNGTests/Properties/Resources.Designer.cs
generated
28
mRemoteNGTests/Properties/Resources.Designer.cs
generated
@@ -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]";.
|
||||
/// </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]";.
|
||||
/// </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 <?xml version="1.0" encoding="utf-8"?>
|
||||
///<Connections Name="Connections" Export="False" EncryptionEngine="AES" BlockCipherMode="GCM" KdfIterations="1000" FullFileEncryption="False" Protected="Bqmajt4G5RDLsV5nn3s7QHZkkeWXQqgSDA4RSA8fWYx1bxRaorsmZ0ub4Z6mOBbefuXBbaWnsVRn0+NOJ3zTjkUJ" ConfVersion="2.6">
|
||||
///<Connections Name="Connections" Export="False" EncryptionEngine="AES" BlockCipherMode="GCM" KdfIterations="1000" FullFileEncryption="False" Protected="8LmIO3+MWBY0zTmfjfOEdCGxhTAwnlohb1veTGNZFt6lAYvY2UOzWyjVzkx6V93smpbP0ZOuexN15u7rvwJEjawC" ConfVersion="2.6">
|
||||
/// <Node Name="Folder1" Type="Container" Expanded="True" Descr="" Icon="mRemoteNG" Panel="General" Username="" Domain="" Password="" Hostname="" Protocol="ICA" PuttySession="Default Settings" Port="1494" Connec [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string confCons_v2_6 {
|
||||
@@ -84,7 +102,7 @@ namespace mRemoteNGTests.Properties {
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?>
|
||||
///<Connections Name="Connections" Export="False" EncryptionEngine="AES" BlockCipherMode="GCM" KdfIterations="5000" FullFileEncryption="False" Protected="ZrxA5XJSUirgITMc2UxVRY4mLPxzNsyaqpgJXNdjcUdTlA/p4ZQP4bKqp44ZMrZlNU9jZgsvodGEVqS5/26St+Sk" ConfVersion="2.6">
|
||||
///<Connections Name="Connections" Export="False" EncryptionEngine="AES" BlockCipherMode="GCM" KdfIterations="5000" FullFileEncryption="False" Protected="Z1IOT8h7neJ5V7es5Iv63A2WsDG6QWl10F/Rb9ljKxvCseEITty1BfMNgiaVPfm7w61uabQKqu2waDCXUpLo1OZW" ConfVersion="2.6">
|
||||
/// <Node Name="Folder1" Type="Container" Expanded="True" Descr="" Icon="mRemoteNG" Panel="General" Username="" Domain="" Password="" Hostname="" Protocol="ICA" PuttySession="Default Settings" Port="1494" Connec [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string confCons_v2_6_5k_iterations {
|
||||
@@ -95,7 +113,7 @@ namespace mRemoteNGTests.Properties {
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?>
|
||||
///<Connections Name="Connections" Export="False" EncryptionEngine="AES" BlockCipherMode="GCM" KdfIterations="1000" FullFileEncryption="True" Protected="tfNq70KLL8id4QnOeC9OrjMlACoArKa7pFJKcG1vrrRxMkvHpJPiEx/JlbPBJ3x4HXXx806ipsFiMkU1+OT7eE3Z" ConfVersion="2.6">NAxOa6dYlXPZCtpxWfiFrINjIC0dicQU7YdmKRnOn6POI07mMWU/Yy5uhPeXfVfzWgbPlKGyOMk5pgTw0pYIpTZpmqRKzZN+MzFw7NTW9QgD3Uhq528OItO2/MdpGQZ8AYM+qrDHHCXG9bGkczDwe5BZ8cDnGfbFrYTINGBZ9wxjLfyA9oYxzfrzoHDACbM8gD8wvmO26ML/lShwQS+/9B [rest of string was truncated]";.
|
||||
///<Connections Name="Connections" Export="False" EncryptionEngine="AES" BlockCipherMode="GCM" KdfIterations="1000" FullFileEncryption="True" Protected="qrOUhRlBLCnjjmfU1r8uwhgIBwZ+D1+trBgPmcQyEnW0xf2adLeOfUhZHnto2NOsMneXDibsS8PH0B1moOyvua22" ConfVersion="2.6">pCvan5X5+bSJy8oZq3QhrYs9zAS4v2tu9/4eYk4GAeB2EDep9Ed1zkshaLP165sWHE9oJ6bHnWSrSr/XXiDGdosvxl+O3hSSi02On9/TspuHhPDuuDb7UY2+mLh/LVoJqAjz2NmK7f3QkID2aanHkHzE/MDFiez8gLU8SdW9RxlSXT+L8MEjIXnq34yDVsfV89tGoP01T84ShTCZpRAQMq [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string confCons_v2_6_fullencryption {
|
||||
get {
|
||||
@@ -105,7 +123,7 @@ namespace mRemoteNGTests.Properties {
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?>
|
||||
///<Connections Name="Connections" Export="False" EncryptionEngine="AES" BlockCipherMode="GCM" KdfIterations="1000" FullFileEncryption="False" Protected="et1WJ5jh501ty5nzV139lFcoK4Cjm2HwYiFDgEtTTW6iIMTiJ7ilw0gkDOOahwig8neVelBnGaP1AAmRY4B6" ConfVersion="2.6">
|
||||
///<Connections Name="Connections" Export="False" EncryptionEngine="AES" BlockCipherMode="GCM" KdfIterations="1000" FullFileEncryption="False" Protected="e/T6ajrPtNNlHreSeD4QBqToTuiqtNACKiPJv7vU+l6TWCu9JNsmL+Y8lJ4aTl5YVcstXpQjxsZ9i8+YV4Gs" ConfVersion="2.6">
|
||||
/// <Node Name="Folder1" Type="Container" Expanded="True" Descr="" Icon="mRemoteNG" Panel="General" Username="" Domain="" Password="" Hostname="" Protocol="ICA" PuttySession="Default Settings" Port="1494" ConnectToC [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string confCons_v2_6_passwordis_Password {
|
||||
@@ -116,7 +134,7 @@ namespace mRemoteNGTests.Properties {
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?>
|
||||
///<Connections Name="Connections" Export="False" EncryptionEngine="AES" BlockCipherMode="GCM" KdfIterations="1000" FullFileEncryption="True" Protected="RD3KGFlcH+4MxnYNje/ruXy6kN6pXgOwg8u6jlyU4u1RFWd8gm8DAGyAdycTDCr37dCNsi6F4Huj41haRQg4" ConfVersion="2.6">/au8q00e4YHoMGSnNWL/zRCzSQd1EaDgZ6VHuJ92iffxh5Spuhy86nsoiMr99UMaUF8UjlrYsboZC2B5sLO6t1lqKuB9okjY/jaLHTlGB7mmaHlDHXo7WEChz51xO+caUGfXCXPHgHOFsz/yCJIv3E9LwVOsAIH2qTfMp19OsytF3+Lb4T8v3nMAKb1iw63WcjFsp/835TMcZWWjI+SwPNKMze [rest of string was truncated]";.
|
||||
///<Connections Name="Connections" Export="False" EncryptionEngine="AES" BlockCipherMode="GCM" KdfIterations="1000" FullFileEncryption="True" Protected="d7pvbk1N6aswOmTgjCKkkavQKM2xTpknkdnMgzi+bOPgwr9WirGy82kaQldQ06af7MrZgJwvc9hKAcGxBfYt" ConfVersion="2.6">P9haenvGQ9HxnJSUUY+3SdALKoWQau0gF3Vxk6eCERKJ9G2gi87zhBcMCH+PwSsh/5ohPfOansFvUcDvPeE10slCTVqQmQFeU+daQY4OMk+2Q0UR/rEDRlbjGlM8YKVv2xjLRPRs6AbNJsKLv4zo8T/x3ySlZnuiMiGTGt4Wstfle/QfwNbBeV88N5IPbbKy2FWQf5yOlPtrjgPrcl0cRtRI3c [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string confCons_v2_6_passwordis_Password_fullencryption {
|
||||
get {
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -437,6 +437,7 @@ namespace mRemoteNG.App
|
||||
public static void SaveConnections()
|
||||
{
|
||||
if (ConnectionTreeModel == null) return;
|
||||
if (!IsConnectionsFileLoaded) return;
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
3
mRemoteV1/Properties/Settings.Designer.cs
generated
3
mRemoteV1/Properties/Settings.Designer.cs
generated
@@ -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"]));
|
||||
|
||||
@@ -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)" />
|
||||
|
||||
@@ -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>
|
||||
|
||||
2275
mRemoteV1/Resources/Language/Language.tr-TR.resx
Normal file
2275
mRemoteV1/Resources/Language/Language.tr-TR.resx
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user