Compare commits

...

341 Commits

Author SHA1 Message Date
Faryan Rezagholi
aee497de03 nuget updates 2022-01-11 23:31:13 +01:00
Dimitrij
823f8614e5 lib update 2022-01-11 21:04:53 +00:00
Dimitrij
b54afb8823 Merge pull request #2115 from Vest/fix_2100
Fix tests that were broken by PR #2100
2022-01-11 20:16:00 +00:00
Dimitrij
22e611c63b Update ConfigWindowGeneralTests.cs
add one more ','
2022-01-11 19:37:22 +00:00
Dimitrij
3deb01a65d Update ConfigWindowGeneralTests.cs
add ','
2022-01-11 19:23:52 +00:00
Dimitrij
6f24b0bb71 Update ConfigWindowGeneralTests.cs
add missing fileds
2022-01-11 19:07:29 +00:00
Dimitrij
9d7921f538 Update ConfigWindowGeneralTests.cs
fixes for username field add
2022-01-11 15:14:28 +00:00
Vest
a4e66b3d11 Fix tests that were broken by PR #2100.
Signed-off-by: Vest <Vest@users.noreply.github.com>
2022-01-11 15:47:18 +01:00
Faryan Rezagholi
3866ff76f9 Merge pull request #2114 from david-sway/fix_toolbar_toggles
Fixed behavior of toolbar visibility toggles in the View menu
2022-01-11 00:02:14 +01:00
david-sway
82f947abdd Fixed behavior of toolbar visibility toggles in the View menu 2022-01-10 13:06:18 -05:00
Dimitrij
47c6f53b43 fix image link 2022-01-07 16:57:13 +00:00
Dimitrij
606657524e update build badges, paypal 2022-01-07 16:33:23 +00:00
Dimitrij
168285944c fix path 2022-01-07 15:46:04 +00:00
Dimitrij
1746af927b lib updates 2022-01-07 09:46:31 +00:00
Dimitrij
2eca8ffba2 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2022-01-04 10:43:12 +00:00
Dimitrij
6ef0c06a19 lib updates 2022-01-04 10:43:00 +00:00
Faryan Rezagholi
af68f1a16e Merge pull request #2104 from tecxx/develop-orig
fix test cases caused by new fields
2021-12-26 13:11:03 +01:00
tecxx
f429839a17 fix test cases caused by new fields 2021-12-25 19:53:31 +01:00
Dimitrij
66770e602a Merge pull request #2103 from tecxx/develop-orig
improve SS api credential handling
2021-12-25 18:52:04 +00:00
tecxx
f760131cf5 remove dead function call 2021-12-25 18:55:59 +01:00
tecxx
cdc1d5064f improve handling of invalid api credentials 2021-12-25 18:52:54 +01:00
Faryan Rezagholi
3b707d29b9 Updated PuTTYNG to v0.76 (fixes #2012) 2021-12-25 16:11:22 +01:00
Dimitrij
df632bb1f0 Merge pull request #2102 from Vest/issue_2057
Extended the field [RenderingEngine] from 10 chars to 16
2021-12-25 13:12:22 +00:00
Vest
74cb453995 Updated changelog.md 2021-12-25 11:33:56 +01:00
Vest
f8eec94b04 Extended the field [RenderingEngine] from 10 chars to 16.
This is not the full fix of issue #2057, because the scripts are not "migration" scripts.
2021-12-25 11:31:05 +01:00
Faryan Rezagholi
697efacc58 Merge pull request #2101 from Vest/fix_mssql_type
Fix typo in mssql_db_setup.sql
2021-12-24 19:12:20 +01:00
Vest
ff9cff8f44 Fix typo in mssql_db_setup.sql
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-24 16:59:31 +01:00
Dimitrij
d78388646d Merge pull request #2100 from tecxx/develop
external connectors update #2
2021-12-23 17:42:49 +00:00
tecxx
05ffcdeef7 fix null object bug in ec2 connector 2021-12-23 16:54:54 +01:00
Dimitrij
3b8e347a9e Merge pull request #2098 from Vest/fix_large
Fix failed BinaryFileTest
2021-12-23 11:18:55 +00:00
Dimitrij
37f160f698 Merge branch 'develop' into fix_large 2021-12-23 11:18:46 +00:00
tecxx
6f1446339c new fields for external connectors
add ec2 instance connector
2021-12-23 09:59:29 +01:00
Dimitrij
fed44dc366 Merge pull request #2097 from Vest/fix_gui
Fix failed tests related to mRemoteNGTests.UI.Window.ConfigWindowTests
2021-12-23 02:36:17 +00:00
Vest
c71ec34998 Updated changelog
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-22 22:40:10 +01:00
Vest
157bda8f51 Fix BinaryFileTest
mRemoteNGTests doesn't define "DEBUG" and "PORTABLE", but defines "DEBUG_PORTABLE" macro.

Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-22 22:36:38 +01:00
Vest
d80e5bc792 Updated changelog.md
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-22 22:33:30 +01:00
Vest
f9669e8158 Fix failed tests related to mRemoteNGTests.UI.Window.ConfigWindowTests.
The menu item OpeningCommand is related to SSH1/SSH2. Previously it was tested for RDP.

Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-22 22:26:53 +01:00
Faryan Rezagholi
04c83c608b removed deprecated/unhandled features 2021-12-20 17:37:19 +01:00
Faryan Rezagholi
9f50037e11 Merge pull request #2096 from Vest/fix_2081
Fixed crypto provider test
2021-12-20 17:09:44 +01:00
Faryan Rezagholi
33fd741ba7 Merge branch 'develop' into fix_2081 2021-12-20 17:06:14 +01:00
Vest
035c3f9319 Updated changelog.md
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-20 16:21:43 +01:00
Vest
3df922340d Fixed the test that was broken with the PR #2081
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-20 16:17:39 +01:00
Dimitrij
72b9190e2f fix for failing tests due missing path to schema 2021-12-20 11:28:01 +00:00
Dimitrij
8fe1bdf39a Merge pull request #2089 from Vest/fix_help_menu
Fixes the exception thrown by menu buttons "Documentation" and "Website"
2021-12-17 10:14:57 +00:00
Vest
f78bf2bc8a Updated CHANGELOG.md
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 21:52:56 +01:00
Vest
a1f0a69874 Menu button "Documentation" and "Website" threw an exception.
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 21:46:10 +01:00
Faryan Rezagholi
8a26b2f433 Merge pull request #2088 from Vest/issue_2087
Launch updates from shell (fixes #2087)
2021-12-16 20:57:56 +01:00
Vest
a18784d2c7 Updated changelog.
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 19:04:49 +01:00
Vest
3c25a987fd Fix the issue #2087
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 19:02:25 +01:00
Dimitrij
7cebc4ef42 Merge pull request #2086 from Vest/refactor_webclient
Use async HttpClient instead of obsolete WebClient
2021-12-16 17:31:06 +00:00
Faryan Rezagholi
a8ab46d5c8 remove app.comfig 2021-12-16 17:09:03 +01:00
Vest
8bac5a8c54 Removed unused imports for UpdateWindow.cs 2021-12-16 17:05:05 +01:00
Faryan Rezagholi
801a41ae10 removed log4net leftover 2021-12-16 17:04:11 +01:00
Vest
47e37afe12 Removed unused imports for AppUpdater.cs
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 17:03:56 +01:00
Faryan Rezagholi
942bf7d8cb moved log4net config into its own file 2021-12-16 17:01:45 +01:00
Vest
0e8d573819 Updated changelog 2021-12-16 17:00:49 +01:00
Vest
2bdfd7401e Corrected warnings related to async event handlers
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 16:41:00 +01:00
Vest
68dd6b1e23 Removed unused code
Added the checksum verification.

Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 15:57:18 +01:00
Vest
2fe85ae0e5 Added the progress handling;
Now API (AppUpdater) is async.
Cancellation token hasn't been tested yet, because UI doesn't allow to cancel the update.

Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 15:37:56 +01:00
Vest
e9fa1c3b5e Added Initial async support for AppUpdater
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-16 12:30:12 +01:00
Faryan Rezagholi
f543b83cfc added missing issue (#870) 2021-12-16 00:41:57 +01:00
Faryan Rezagholi
2d917ca11a set lang version to latest 2021-12-15 22:54:08 +01:00
Faryan Rezagholi
2c830627ef removed orphaned paths, added missing ones 2021-12-15 21:11:22 +01:00
Faryan Rezagholi
46003a3509 removed orphaned path from harvest dir 2021-12-15 20:18:10 +01:00
Faryan Rezagholi
6b0412586e Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-12-15 19:50:03 +01:00
Faryan Rezagholi
36ca7ffbdb removed credits file from installer 2021-12-15 19:48:23 +01:00
Dimitrij
e5244f1fec Merge pull request #2085 from tecxx/develop
fix issue 2075
2021-12-15 18:41:57 +00:00
Faryan Rezagholi
359a7272e8 build external connectors on 'release portable' 2021-12-15 19:38:33 +01:00
Dimitrij
82cd3a7e56 swap runtime and configSections as per below https://stackoverflow.com/questions/13623896 2021-12-15 16:01:40 +00:00
tecxx
a2e78fd08a fix issue 2075 by standardizing "StartProgram" Property to "RDPStartProgram" and "StartProgramWorkDir" to "RDPStartProgramWorkDir" 2021-12-15 15:11:56 +01:00
Faryan Rezagholi
a48b5e9d65 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-12-15 02:42:00 +01:00
Faryan Rezagholi
f4c4d9ea8c removed 'en-US' specific translation in favor of default (en) 2021-12-15 02:41:50 +01:00
Dimitrij
02ed45fa61 added file exist check and null check 2021-12-15 01:31:26 +00:00
Dimitrij
ad227ea2ee add check if no removable files to don't throw null error 2021-12-15 01:02:13 +00:00
Dimitrij
d7e2358d3e Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-12-14 23:50:13 +00:00
Faryan Rezagholi
196e98e4a7 Merge pull request #2084 from tecxx/develop
fixed some tests around "StartProgramWorkDir"
2021-12-14 22:04:09 +01:00
tecxx
00bc45fba1 fix some more inconsistencies with "StartProgramWorkDir" 2021-12-14 21:45:39 +01:00
Dimitrij
62c0d3f07f Merge pull request #2083 from tecxx/develop
fix a test case caused by property named "Prop_StartProgram" instead …
2021-12-14 20:37:16 +00:00
Faryan Rezagholi
d42574a16c updated sql scripts (fixes #1436) 2021-12-14 21:36:14 +01:00
tecxx
a854b04293 fix a test case caused by property named "Prop_StartProgram" instead of "StartProgram" 2021-12-14 21:07:06 +01:00
Faryan Rezagholi
96632da4d7 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-12-14 20:00:10 +01:00
Faryan Rezagholi
cf18d6b1e9 reordered "added" section 2021-12-14 20:00:02 +01:00
Faryan Rezagholi
262e2e1b85 Merge pull request #1451 from mRemoteNG/push_settings_recursively
Added option to push inheritance settings to children recursively
2021-12-14 19:51:10 +01:00
Faryan Rezagholi
743c46de70 merge from develop 2021-12-14 19:48:10 +01:00
Faryan Rezagholi
9624bc96c9 Merge pull request #2081 from Vest/refactor_rijndael
Fixed compiler warning
2021-12-14 19:36:32 +01:00
Vest
1643bb7d59 Corrected "obsolete" warnings for objects RijndaelManaged and MD5CryptoServiceProvider
Added several "using" statements for all disposable objects.

Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-14 16:55:14 +01:00
Faryan Rezagholi
edad5a838f removed credits file 2021-12-14 13:40:35 +01:00
Faryan Rezagholi
fb35226e20 update nuget packages 2021-12-14 13:37:40 +01:00
Faryan Rezagholi
40605737b1 Merge pull request #2080 from Vest/issue_2079
Copy theme files to target dir
2021-12-14 13:31:13 +01:00
Faryan Rezagholi
01a62e099e updated changelog (#2079) 2021-12-14 13:27:23 +01:00
Faryan Rezagholi
80748bb66b copy theme files to output dir (fixes #2079) 2021-12-14 13:25:40 +01:00
Faryan Rezagholi
c6c77e9bc4 Revert "Solve issue #2079"
This reverts commit 1f462648c4.
2021-12-14 13:23:31 +01:00
Vest
1f462648c4 Solve issue #2079
Signed-off-by: Vest <Vest@users.noreply.github.com>
2021-12-14 13:10:02 +01:00
Faryan Rezagholi
099256e5d4 code cleanup 2021-12-14 01:14:51 +01:00
Dimitrij
8735d24122 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-12-12 19:37:12 +00:00
Dimitrij
b2fc3967d3 update to move dll and lang to subfolders, not supported fully in net 6.0 2021-12-12 19:36:47 +00:00
Faryan Rezagholi
0ec02cfa56 removed left over project files from #2076 2021-12-09 20:29:45 +01:00
Faryan Rezagholi
ade36d6876 re-add .net framework 2 as supported runtimefor installer 2021-12-09 20:25:48 +01:00
Faryan Rezagholi
73313d7dae fixes/simplified postbuild installer scripts 2021-12-09 20:11:45 +01:00
Faryan Rezagholi
7db9865ffa build installer for .net framework 4.8 only 2021-12-09 18:27:29 +01:00
Faryan Rezagholi
40656cb70b Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-12-09 18:20:27 +01:00
Faryan Rezagholi
b5a07f3e79 Update README.MD 2021-12-09 18:20:20 +01:00
Faryan Rezagholi
66877ce9b1 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-12-09 18:16:00 +01:00
Faryan Rezagholi
57b067b4e2 don't convert license file to rich text format on installer build 2021-12-09 18:14:35 +01:00
Faryan Rezagholi
74999e9394 removed obsolete files 2021-12-09 18:14:05 +01:00
Faryan Rezagholi
f4d6f1e5ee Condensed README.MD 2021-12-09 18:09:22 +01:00
Faryan Rezagholi
096f670eb3 hide disc cost button in installer (#1363) 2021-12-09 00:22:00 +01:00
Faryan Rezagholi
bceaca49bf imported templates from wix sources to be able to make modifications. 2021-12-09 00:21:04 +01:00
Faryan Rezagholi
5e94c84516 spelling fix 2021-12-08 23:08:35 +01:00
Faryan Rezagholi
28dc14e739 improved feature tree in installer 2021-12-08 23:06:56 +01:00
Faryan Rezagholi
d5d28e80cb removed any cpu configurations from solution file 2021-12-07 01:22:49 +01:00
Faryan Rezagholi
f1eea76249 added build configs for external conectors project 2021-12-07 01:12:20 +01:00
Faryan Rezagholi
0976404eda merged from develop 2021-12-07 01:10:02 +01:00
Faryan Rezagholi
8074c9a7c6 re 2021-12-07 01:06:31 +01:00
Dimitrij
513af43fca Merge pull request #2076 from tecxx/develop
rework TSS api to use .net6 compatible code
2021-12-06 21:59:58 +00:00
tecxx
afd5d76992 rework TSS api to use .net6 compatible code
rename dll to ExternalConnectors.dll for possible other future implementations
refactor namespaces in dll
2021-12-06 21:54:35 +01:00
Faryan Rezagholi
a31da5f880 update build configuration 2021-12-06 00:57:00 +01:00
Faryan Rezagholi
be470f50ec rounded corners 2021-12-04 15:17:24 +01:00
Faryan Rezagholi
a04494346e rounded corners 2021-12-04 15:15:25 +01:00
Faryan Rezagholi
797533459e Update README.MD
updated .net version requirement
2021-12-04 14:39:19 +01:00
Faryan Rezagholi
22e879ef18 Update README.MD
added server 2022
2021-12-04 14:37:19 +01:00
Faryan Rezagholi
dc6bc5b4d6 fixed appveyor badges 2021-12-04 14:34:07 +01:00
Faryan Rezagholi
a6c7457c59 updated VncSharp nuget 2021-12-02 23:20:20 +01:00
Dimitrij
b609cfba2a Merge pull request #1848 from johnwc/feature/RemoteDesktopServices
Feature/remote desktop services
2021-12-02 09:02:56 +00:00
John Carew
345980f457 Removed duplicate StartProgram property set 2021-12-02 01:27:27 -06:00
John Carew
5a86a0a8cb Merge from develop 2021-12-02 00:32:40 -06:00
John Carew
24c1ce3f4a Correct saving StartProgramWorkDir 2021-12-02 00:17:26 -06:00
Faryan Rezagholi
fc65c2583e hopefully fixed all installer build issues 2021-12-02 01:15:22 +01:00
Faryan Rezagholi
1df3c33f69 removed developer note from license file 2021-12-02 00:11:07 +01:00
Faryan Rezagholi
98a9cc7436 Update README.MD 2021-12-01 23:51:06 +01:00
Faryan Rezagholi
ff88d4649c more adjustments to the build configuration 2021-12-01 23:42:16 +01:00
Faryan Rezagholi
8c61306a8d Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-12-01 23:25:52 +01:00
Faryan Rezagholi
6496e34868 fixed installer paths 2021-12-01 23:25:42 +01:00
Faryan Rezagholi
7d6c9d517c unified different project configurations 2021-12-01 23:25:17 +01:00
Faryan Rezagholi
d918d8ffd1 Update README.MD 2021-12-01 22:53:18 +01:00
Dimitrij
ca61ea09d0 --update test libs 2021-12-01 20:55:15 +00:00
Faryan Rezagholi
faff230d42 applied fix from @reox22 2021-12-01 21:09:57 +01:00
Faryan Rezagholi
c288c3d071 fixed project style of pr 2021-12-01 21:07:18 +01:00
Faryan Rezagholi
500a22b0b6 merged from develop 2021-12-01 21:07:00 +01:00
Faryan Rezagholi
ba1317d245 replaced newly introduced backup icon with one that matches the programs ui 2021-12-01 20:25:00 +01:00
Dimitrij
5cfbfc5071 --correction
test cases
2021-12-01 10:04:38 +00:00
Dimitrij
bf4b9d5355 --lib updates 2021-11-26 09:41:32 +00:00
Dimitrij
904f0bc202 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-11-26 09:20:56 +00:00
Dimitrij
94c546bd0f -- fix for tests 2021-11-26 09:20:45 +00:00
Dimitrij
64f1e10a5e Merge pull request #2024 from mRemoteNG/dotnet
Migrate Project to .NET6
2021-11-26 09:14:55 +00:00
Faryan Rezagholi
8b20da78ff merge from develop 2021-11-25 22:40:32 +01:00
Faryan Rezagholi
1be4ef437d merged from develop 2021-11-25 22:40:20 +01:00
Dimitrij
76da9c3247 -fix
fix serializers for OpeningCommand
2021-11-17 23:30:57 +00:00
Dimitrij
1e4dcc23d7 -fix
more fix regarding adding new option
2021-11-17 11:41:06 +00:00
Dimitrij
9c95e7fd96 -fix after nunit update 2021-11-16 22:29:00 +00:00
Dimitrij
cea5f57c60 --fix
better way to set of defaults
2021-11-16 19:10:09 +00:00
Dimitrij
19e6d37b62 -- fix
Set CustomToolNamespace to avoid overwrite on change
2021-11-16 19:02:29 +00:00
Dimitrij
018979d17f #2064 fix, to avoid failure then null, set by default to be empty 2021-11-16 17:19:06 +00:00
Dimitrij
8bd398cbd6 update to VS 2022 2021-11-16 13:29:14 +00:00
Dimitrij
59872b14cf #1297
little fix of logic
2021-11-16 13:28:45 +00:00
Dimitrij
c5240d72e1 Merge pull request #2065 from merarischroeder/503_ssh-execute-single-command-after-login
Added Null/Empty check for OpeningCommand
2021-11-16 09:08:39 +00:00
Todd Hubers
77b54f9a10 Added Null/Empty check for OpeningCommand 2021-11-15 13:38:56 +11:00
Dimitrij
b5bcb5b3bb libupdate 2021-11-13 16:42:33 +00:00
Dimitrij
87c500138b update .net framework to version 4.8 2021-11-13 16:32:47 +00:00
Dimitrij
f3f384ebcc Merge pull request #2064 from merarischroeder/503_ssh-execute-single-command-after-login
503 SSH Execute a single command after login
2021-11-13 16:16:54 +00:00
Todd Hubers
08de2eacd6 Amended changelog 2021-11-13 03:25:03 +11:00
Todd Hubers
b763d968fe Support for saving OpeningCommand and the InheritedOpeningCommand. Tested for stock saving only. 2021-11-13 03:22:35 +11:00
Todd Hubers
3b05eba2e2 Use SendKeys to Execute the Opening Command on the Putty window after logged in + NEWLINE. Tested and working. 2021-11-13 03:05:02 +11:00
Todd Hubers
b6d2c72a40 Added new SSH Property "Opening Command" 2021-11-13 02:47:16 +11:00
Dimitrij
e6d2c9791d Merge pull request #2063 from tecxx/SecretServerInterface
Thycotic Secret Server Interface
2021-11-05 13:00:45 +00:00
tecxx
91a0eeb29a add changelog entry 2021-11-04 21:30:48 +01:00
tecxx
8c9c4865f2 add secret server handler to RDP and SSH 2021-11-04 21:13:37 +01:00
tecxx
6fbd4a7c88 add secret server interface library 2021-11-04 21:09:23 +01:00
Dimitrij
239adaa129 add 'Languages' folder as alternative for translation assemblies (to move from root all translations into it) 2021-11-02 23:08:09 +00:00
Dimitrij
9f8c82b649 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-11-02 22:53:56 +00:00
Dimitrij
7875bb6ebd lib update 2021-11-02 22:53:14 +00:00
Dimitrij
a33abf3f56 Merge pull request #2061 from horizontti/patch-1
Create Language.fi-FI.resx
2021-11-02 10:05:33 +00:00
horizontti
1fadadcdb5 Create Language.fi-FI.resx 2021-11-01 23:59:46 +02:00
Faryan Rezagholi
a294dec0dc merged from develop 2021-10-30 15:58:32 +02:00
Dimitrij
5de75e6a8a downgrade DockPanelSuite to 3.0.6 due reference error in 3.1.0 2021-10-30 01:04:39 +01:00
Dimitrij
4b44be2e54 libs update 2021-10-28 17:57:48 +01:00
Dimitrij
b5f1d63175 Merge pull request #2058 from LightningSt0rm/develop
Fix a break in the Windows Clipboard Chain
2021-10-28 17:24:33 +01:00
Adrian
1c5695df7e Update changelog 2021-10-20 17:52:50 -05:00
Adrian
1808ad9ad7 Correct issues with the Windows Clipboard Chain, where the chain was broken when messages to WM_CHANGECBCHAIN weren't handled appropriately as well unregister self from the clipboard chain when closing. 2021-10-20 17:10:24 -05:00
Dimitrij
8dc5e81374 Update French translation #2045 2021-09-21 22:46:49 +01:00
Dimitrij
b899056a8e lib update 2021-09-17 23:12:47 +01:00
Dimitrij
f884c47ad8 set Language as resource 2021-09-17 22:58:58 +01:00
Dimitrij
07eae639b6 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-09-14 12:13:58 +01:00
Dimitrij
d2349bd713 merge with new options 2021-09-14 12:03:01 +01:00
Faryan Rezagholi
28ee3c6e8f merged from develop 2021-08-30 00:36:28 +02:00
Faryan Rezagholi
4430f269f7 Merge pull request #2033 from IDDesigns/id/net5
Id/net5
2021-08-29 23:04:55 +02:00
Faryan Rezagholi
a72f7d63f6 Added <LangVersion>preview</LangVersion> to test project 2021-08-29 22:59:38 +02:00
Faryan Rezagholi
859b6f8ac5 set target framework to "net6.0-windows" instead of "net6.0-windows7.0" 2021-08-29 22:55:19 +02:00
Faryan Rezagholi
a7f238aba3 merge from dotnet 2021-08-29 22:51:29 +02:00
Faryan Rezagholi
e0cff27aae addded <LangVersion>preview</LangVersion> to project file 2021-08-29 18:55:21 +02:00
Faryan Rezagholi
d9c4a6ec76 Merge branch 'dotnet' into dotnet6 2021-08-29 18:45:29 +02:00
Faryan Rezagholi
4d95bc4255 merge from develop 2021-08-29 18:45:02 +02:00
Faryan Rezagholi
fdea0144b0 removed test output from script 2021-08-29 18:44:08 +02:00
Faryan Rezagholi
7398a373c2 Squashed commit of the following:
commit 84b28316d01d158891d909e90fe428e48d5566e3
Author: Faryan Rezagholi <faryan.rezagholi@siedle.de>
Date:   Sun Aug 29 13:08:31 2021 +0200

    r

commit 7375b4a5456a615b36c4fbf0eda7a8d56762de85
Author: Faryan Rezagholi <faryan.rezagholi@siedle.de>
Date:   Sun Aug 29 12:54:40 2021 +0200

    ...

commit 96aa9d809131c8277bd62cb90fdfa4fd07f1940e
Author: Faryan Rezagholi <faryan.rezagholi@siedle.de>
Date:   Fri Aug 20 15:12:03 2021 +0200

    j
2021-08-29 18:41:50 +02:00
Faryan Rezagholi
c88e45cde8 fixed app.config for dotnet6 2021-08-29 12:47:31 +02:00
Ian Dunkerly
f77848e3d9 Fixing up unit tests 2021-08-27 21:20:50 +01:00
Ian Dunkerly
5ed78cc3b6 Swapped BouncyCastle for Portable.BouncyCastle which support .net standard 2.0 2021-08-22 17:25:55 +01:00
Ian Dunkerly
1b4593bb62 Removed system.web reference - these are not supported in .Net 5 2021-08-22 15:28:47 +01:00
Ian Dunkerly
c620e26644 Import MSTC as ActiveX control removing need for dependency on Windows Simulator 2021-08-22 14:27:58 +01:00
Faryan Rezagholi
74af24c3db appveyor test 2021-08-20 13:14:16 +02:00
Faryan Rezagholi
ac1f32f773 setting workdir for 7z 2021-08-20 13:03:22 +02:00
Faryan Rezagholi
99c7dbb332 trying -sfp2 option on 7z for appveyor 2021-08-20 12:17:14 +02:00
Faryan Rezagholi
b0632b8910 trying to fix appveyor no 7z-ing portable release 2021-08-20 00:36:09 +02:00
Faryan Rezagholi
d26a9615c0 updated nuget 2021-08-19 23:47:46 +02:00
Faryan Rezagholi
f609d6e0b2 removed cefsharp nuget 2021-08-19 23:47:37 +02:00
Faryan Rezagholi
e5042712b6 nuget update 2021-08-19 23:29:13 +02:00
Faryan Rezagholi
bf93d3af04 fixed ambigous call 2021-08-19 22:36:41 +02:00
Faryan Rezagholi
ea43abe392 updated projects to .net6 2021-08-19 22:36:32 +02:00
Faryan Rezagholi
0e74314ddc fixed port scan and external tools window not showing 2021-08-15 21:53:10 +02:00
Faryan Rezagholi
54eabd6a74 some property display names were not showing, fixes #1990 2021-08-15 20:53:52 +02:00
Faryan Rezagholi
2f52473566 Allow setting Port when using MSSQL, fixes #1884 2021-08-15 20:13:59 +02:00
Faryan Rezagholi
98e7250b3c trying to fix 7z creating archives wrong on appveyor 2021-08-15 19:51:25 +02:00
Faryan Rezagholi
882438f5e0 replaced logo in readme 2021-08-15 19:16:17 +02:00
Faryan Rezagholi
bb93dddd39 copy PUTTYNG.exe to output dir 2021-08-15 17:05:13 +02:00
Faryan Rezagholi
59f6a8a933 fixed wix installer 2021-08-15 16:36:55 +02:00
Faryan Rezagholi
8ce83f3cd0 removed orphaned path from project 2021-08-15 16:32:50 +02:00
Faryan Rezagholi
745e402da9 Removed VNC Smart Size feature. This allows the use of VNCSharp via nuget instead of distributing our own version of it) 2021-08-15 16:32:31 +02:00
Faryan Rezagholi
6cbe1c92d5 fix for Proces.Start() on .net5 2021-08-15 16:28:38 +02:00
Faryan Rezagholi
54fc2fb4c6 updated readme 2021-08-15 16:20:23 +02:00
Faryan Rezagholi
adc2815ab5 fixed some failing tests 2021-08-15 16:20:09 +02:00
Faryan Rezagholi
75f9f647ee migrated projects to .net5 2021-08-15 16:16:30 +02:00
Faryan Rezagholi
f14f7dbb72 removed assembly info classes as they are no longer needed 2021-08-15 16:15:34 +02:00
Faryan Rezagholi
4978618e9a merged from develp 2021-08-15 14:08:40 +02:00
Faryan Rezagholi
59b9f4f15b moved resharper logo 2021-08-15 02:17:40 +02:00
Faryan Rezagholi
7ff0ce5369 tring to fix 7z duplicate file error on appveyor builds 2021-08-15 00:41:59 +02:00
Faryan Rezagholi
93bd278819 removed assembly bindings 2021-08-14 18:30:49 +02:00
Faryan Rezagholi
b97b1f3690 added sigcheck back 2021-08-14 18:24:36 +02:00
Faryan Rezagholi
307f374be1 fixed renaming of installer not working 2021-08-14 18:17:17 +02:00
Faryan Rezagholi
17f701824e encore un test 2021-08-14 17:05:21 +02:00
Faryan Rezagholi
c7b89dcf71 another test 2021-08-14 16:57:42 +02:00
Faryan Rezagholi
fc527a947f appveyor build script fixes 2021-08-14 16:49:23 +02:00
Faryan Rezagholi
d0520690a2 appveyor build script fixes 2021-08-14 16:45:06 +02:00
Faryan Rezagholi
315d020b6f appveyor build script fixes 2021-08-14 13:55:42 +02:00
Faryan Rezagholi
8a4bcdef52 appveyor build script fixes 2021-08-14 13:48:38 +02:00
Faryan Rezagholi
727ef34c6d appveyor build script fixes 2021-08-14 13:46:43 +02:00
Faryan Rezagholi
d8bc06d05d ? 2021-08-14 13:41:09 +02:00
Faryan Rezagholi
def214dde2 maybe this time 2021-08-14 13:39:10 +02:00
Faryan Rezagholi
219f948c4a again... 2021-08-14 13:35:13 +02:00
Faryan Rezagholi
72193eccf0 appveyor fix 2021-08-14 13:30:54 +02:00
Faryan Rezagholi
7eb85c6a3d trying to fix appveyor not zipping 2021-08-14 13:26:35 +02:00
Faryan Rezagholi
954c667173 cleanup 2021-08-14 13:16:09 +02:00
Faryan Rezagholi
33c738df5f unified/simplified/accelerated zip file creation 2021-08-14 13:07:14 +02:00
Faryan Rezagholi
2141fe298f let appveyor use project scripts 2021-08-14 12:15:13 +02:00
Faryan Rezagholi
8e73f512b4 moved puttyng.exe to project root 2021-08-14 01:55:51 +02:00
Faryan Rezagholi
92dddb8fd8 removed unused scripts 2021-08-13 02:20:34 +02:00
Faryan Rezagholi
e9869f4c88 cleaned up resource structure 2021-08-13 02:06:21 +02:00
Faryan Rezagholi
52597d4dcb removed 7zip binarys from project 2021-08-13 01:44:26 +02:00
Faryan Rezagholi
dc7ce27b81 fixed designer error 2021-08-13 01:17:27 +02:00
Faryan Rezagholi
4242595a66 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2021-08-13 01:12:45 +02:00
Faryan Rezagholi
50b9a11503 change searchbar placement default property 2021-08-13 01:12:20 +02:00
Faryan Rezagholi
621a723602 Merge pull request #2022 from mRemoteNG/webview2
Replace CefSharp with Webview2
2021-08-12 23:46:04 +02:00
Faryan Rezagholi
6260cc3655 fixed tests 2021-08-12 23:35:19 +02:00
Faryan Rezagholi
300e668327 updated wix file fragments 2021-08-12 23:26:18 +02:00
Faryan Rezagholi
3cf274c37a updated changelog 2021-08-12 23:11:55 +02:00
Faryan Rezagholi
2ca356ee5c removed CefSharp from credits 2021-08-12 22:55:40 +02:00
Faryan Rezagholi
ca8751c40c little code cleanup 2021-08-12 22:54:20 +02:00
Faryan Rezagholi
3c7e97d2d9 replaced CefSharp with WebView2 2021-08-12 22:46:07 +02:00
Faryan Rezagholi
dbe2d690da removed majority of cefsharp related code 2021-08-12 21:00:26 +02:00
Faryan Rezagholi
949410e2cc unified release channel names across program 2021-08-11 03:21:16 +02:00
Faryan Rezagholi
100f856b5f cleaned up view menu and made all properties saveable 2021-08-11 03:08:20 +02:00
Faryan Rezagholi
d7bee01454 removed orphaned templates dir 2021-08-10 01:17:15 +02:00
Faryan Rezagholi
5566081986 update nuget packages 2021-08-10 00:59:27 +02:00
Faryan Rezagholi
29f7dd93f3 optimized form closing event 2021-08-10 00:56:14 +02:00
Faryan Rezagholi
3dd8db5728 updated icons in connection tree 2021-08-08 22:30:55 +02:00
Dimitrij
17e70d11f5 Merge pull request #2016 from xjoker/develop
Cannot connect to the database when the password has special characters
2021-08-06 14:59:15 +01:00
wuwenjing
f8afd439b2 When the password contains special characters, it will be unable to connect to the database. Using "SqlConnectionStringBuilder" to construct "ConnectionString" can solve the problem 2021-08-06 16:35:01 +08:00
Faryan Rezagholi
0dc61b1c26 Merge pull request #2014 from mRemoteNG/revised_icons
Revised icons
2021-08-04 02:39:03 +02:00
Faryan Rezagholi
de6c4fcb17 updated readme 2021-08-04 02:18:53 +02:00
Faryan Rezagholi
57f5c854ff moved logo 2021-08-04 02:13:17 +02:00
Faryan Rezagholi
4f4523ab77 removed old form icons 2021-08-04 02:11:29 +02:00
Faryan Rezagholi
e34e632519 removed ICOs from project 2021-08-04 01:49:06 +02:00
Faryan Rezagholi
f810b902a6 added image converter class to get ico from resources (get rid of redundant image resources) 2021-08-04 01:48:08 +02:00
Faryan Rezagholi
fd5bdc1484 replaced remaining icons 2021-08-04 01:11:34 +02:00
Faryan Rezagholi
e3a12ae6c5 you guessed it... ICONS! 2021-08-04 00:51:54 +02:00
Faryan Rezagholi
c9c5664ec6 icons icons icons 2021-08-04 00:39:33 +02:00
Faryan Rezagholi
75cff549ce more icons changed 2021-08-03 23:53:08 +02:00
Faryan Rezagholi
885cb6915d Merge branch 'develop' into revised_icons 2021-08-03 23:13:27 +02:00
Faryan Rezagholi
f9396a4ecf moved photoshop image templates out of project folder 2021-08-03 22:43:57 +02:00
Faryan Rezagholi
f1a03329e5 removed ultravnc icon 2021-08-03 22:38:15 +02:00
Faryan Rezagholi
f65be671a3 moved icons that will stay the same 2021-08-03 22:36:34 +02:00
Faryan Rezagholi
fa9e8f6cba merged develop 2021-08-03 22:27:51 +02:00
Faryan Rezagholi
67a3e76cfe removed icons that are obsolete since #2011 and #2013 2021-08-03 22:16:53 +02:00
Faryan Rezagholi
e4569c0bb8 Merge pull request #2013 from mRemoteNG/remove_components_check
Remove components check
2021-08-03 22:11:10 +02:00
Faryan Rezagholi
6f1a62e917 Merge branch 'develop' into remove_components_check 2021-08-03 21:57:06 +02:00
Faryan Rezagholi
3f6e21f15a Merge pull request #2011 from mRemoteNG/remove_screenshot_manager
removed screenshot manager
2021-08-03 21:54:52 +02:00
Faryan Rezagholi
46c4287c67 updated changelog 2021-08-03 21:51:09 +02:00
Faryan Rezagholi
1ea1826a27 removed leftovers from components check 2021-08-03 21:46:00 +02:00
Faryan Rezagholi
151457daf0 removed components check options page 2021-08-03 21:39:07 +02:00
Faryan Rezagholi
38cc21fa3a first wave of icons changed 2021-08-03 21:36:03 +02:00
Faryan Rezagholi
77f759f258 more icons cleaned up 2021-08-03 18:50:47 +02:00
Faryan Rezagholi
07c04061c2 more unused icons removed 2021-08-03 01:30:06 +02:00
Faryan Rezagholi
d4bf6ed0c8 added icons that were no part of the resource file 2021-08-03 01:21:11 +02:00
Faryan Rezagholi
ebd46efe81 Merge branch 'develop' into remove_screenshot_manager 2021-08-03 01:11:28 +02:00
Faryan Rezagholi
24d193efb0 revised host status icons 2021-08-03 00:59:59 +02:00
Faryan Rezagholi
3b2a63178f removed unused images/duplicate resources 2021-08-03 00:52:28 +02:00
Faryan Rezagholi
78f60afb85 Removed famfamfam folder and obsolete icons from images folder 2021-08-03 00:49:11 +02:00
Faryan Rezagholi
52a7957789 Update README.MD
Embedded new logo
2021-08-02 12:56:04 +02:00
Faryan Rezagholi
6870583b1c new logo 2021-08-02 12:50:00 +02:00
Faryan Rezagholi
9ffe514350 fixed error from previous merge 2021-08-02 00:29:15 +02:00
Faryan Rezagholi
fc6e04497a updated changelog 2021-08-02 00:16:14 +02:00
Faryan Rezagholi
cfb3f9a3ca merged from develop 2021-08-02 00:13:33 +02:00
Faryan Rezagholi
d47fac791e removed unused language strings 2021-08-02 00:05:10 +02:00
Faryan Rezagholi
490b70c2d3 removed cef scheme handler for obsolete in-app documentation 2021-08-02 00:01:48 +02:00
Faryan Rezagholi
3eecdd9ada Merge pull request #2010 from mRemoteNG/redesign_menus
Redesigned Menus
2021-08-01 23:51:22 +02:00
Faryan Rezagholi
7bdbc5417c update changelog 2021-08-01 23:28:32 +02:00
Faryan Rezagholi
2cd07dcb72 Merge branch 'develop' into redesign_menus 2021-08-01 23:01:53 +02:00
Faryan Rezagholi
adb83ade67 Merge pull request #2005 from mRemoteNG/remove_in_app_documentation
Remove in-app documentation
2021-08-01 23:00:21 +02:00
Faryan Rezagholi
a90f5da8b0 updated changelog 2021-08-01 22:45:39 +02:00
Faryan Rezagholi
38937a4f83 more rearrangements 2021-08-01 22:43:59 +02:00
Faryan Rezagholi
31f35a23ee removed some icons from file menu 2021-08-01 22:39:16 +02:00
Faryan Rezagholi
74de010d3c cleaned up icons in view menu 2021-08-01 22:32:27 +02:00
Faryan Rezagholi
a9e4c880df redesigned help menu 2021-08-01 22:29:04 +02:00
Faryan Rezagholi
b7fe265604 rearranged view menu 2021-08-01 21:45:15 +02:00
Faryan Rezagholi
25c4af5a9f cleaned up file menu 2021-08-01 21:40:14 +02:00
Faryan Rezagholi
b3ecf702e1 removed developer notice 2021-07-28 21:31:59 +02:00
Faryan Rezagholi
c34a3cc7e7 Added back sphinx documentation files 2021-07-26 01:22:31 +02:00
Faryan Rezagholi
158783f2d1 removed screenshot manager 2021-07-26 01:11:01 +02:00
Faryan Rezagholi
e9be139ed0 removed HelpWindows from code 2021-07-24 19:40:52 +02:00
Faryan Rezagholi
2b9195ed9c fixed typo 2021-07-24 19:38:09 +02:00
Faryan Rezagholi
dfdfecba57 open help in external browsr instead of in-app 2021-07-24 19:37:38 +02:00
Faryan Rezagholi
2d6fec13fb added url to documentation 2021-07-24 19:37:22 +02:00
Faryan Rezagholi
216f340468 removed sphinx documentation files 2021-07-24 19:35:00 +02:00
Faryan Rezagholi
a4211a7e55 removed postbuild sphinx script 2021-07-24 19:34:04 +02:00
John Carew
67dfd6b036 Update change log 2020-08-29 17:56:18 -05:00
John Carew
162eb0c958 Add missing db updates for Favorite & ICAEncryptionStrength columns.
Misc vs project automated updates.
2020-08-29 17:44:45 -05:00
John Carew
a2dcc42f68 Update to support reading/writing from config
Update db version to 2.9
Change version tracking from double to Version, to support revision changes between minor versions in db
2020-08-29 17:43:11 -05:00
John Carew
6b7f6dcb19 Add Remote Desktop Services group
Add StartProgram & StartProgramWorkDir properties to Remote Desktop Services group
Corrected Redirect Drives & Smart Cards display names
2020-08-29 17:26:46 -05:00
David Sparer
066e783a37 changed the Edit sub-menu to Inheritance in the connection context menu 2019-06-18 09:16:17 -05:00
David Sparer
3e1bf001c7 Merge branch 'develop' into push_settings_recursively
# Conflicts:
#	mRemoteV1/Resources/Language/Language.Designer.cs
#	mRemoteV1/Resources/Language/Language.resx
2019-06-18 09:10:23 -05:00
David Sparer
722e18c07d updated changelog 2019-05-15 10:41:00 -05:00
David Sparer
a66ec00587 put the ''apply to children" menu options in a sub-menu 2019-05-15 10:09:08 -05:00
David Sparer
2b5100c019 Merge branch 'develop' into push_settings_recursively 2019-05-15 09:29:02 -05:00
David Sparer
74da05e6e8 fixed tests 2019-05-10 15:47:11 -05:00
David Sparer
af24e3b284 the inheritance button will now be shown on items whose parent is the root node 2019-05-10 15:41:43 -05:00
David Sparer
fb68d0bff3 added a button to apply default inheritance to the selected node 2019-05-10 13:57:58 -05:00
David Sparer
d3a2ba26ba only allow pushing inheritance from containers 2019-05-10 08:10:37 -05:00
David Sparer
2f70ec5cb6 Merge branch 'develop' into push_settings_recursively 2019-05-10 08:04:15 -05:00
David Sparer
9173e9e56a added a context menu item to push inheritance to child nodes 2019-04-29 08:39:06 -05:00
David Sparer
11ad8a8398 simplified how inheritance is globally disabled/enabled 2019-04-25 10:21:09 -05:00
David Sparer
0d518e44c7 Merge branch 'develop' into push_settings_recursively 2019-04-24 12:26:21 -05:00
David Sparer
7d8a5a2bdf added methods on the container info to push settings to children recursively 2019-04-01 13:26:25 -05:00
647 changed files with 144380 additions and 20712 deletions

14
.readthedocs.yaml Normal file
View File

@@ -0,0 +1,14 @@
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
# Build documentation in the docs/ directory with Sphinx
sphinx:
configuration: mRemoteNGDocumentation/conf.py
# Optionally build your docs in additional formats such as PDF
formats:
- pdf

View File

@@ -5,33 +5,57 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
## [Unreleased]
### Added
- #1427: Fix RDP local desktop scale not taking effect on remote
- #2086: Replace WebClient with async HttpClient for updater.
- #1850: Minify config xml
- #1770: Added missing RDP performance settings
- #1516: added API to access credential vault (Thycotic Secret Server) by specifying SSAPI:ID as username
- #1476: Configurable backups. Can now edit/set backup frequency, backup path, and max number of backup files.
- #1427: Fix RDP local desktop scale not taking effect on remote
- #1332: Added option to hide menu strip container
- #870: Added option to push inheritance settings to child nodes recursively
- #545: Option to minimize to system tray on closing
- #503: SSH Execute a single command after login
- #420: SSH tunneling implemented
- #327: Added Alternative Shell for RDP settings
- #319: Override quick connect username when using user@domain
- #283: Support for native PowerShell remoting as new protocol
- #1850: Minify config xml
- #xxx: Add external connector to retrieve ip address from Amazon EC2 Instance IDs
### Changed
- #2102: Extended the field RenderingEngine from 10 chars to 16
- #2022: Replaced CefSharp with WebView2
- #2014: Revised icons
- #2013: Removed components check
- #2011: Removed screenshot manager
- #2010: Redesigned menus
- #2005: Removed in-app documentation
- #1777: Cleaned up VisualStudio project structure
- #1767: Turned about window into a simple popup form
- #1766: Converted components check page into options page
- #1690: Replaced GeckoFX (Firefox) with CefSharp (Chromium)
- #1325: Language resource files cleanup
- #xxxx: Secret Server connector via new field "API User ID" instead of SSAPI: prefix
### Fixed
- #2098: Fix failed BinaryFileTest
- #2097: Fix failed tests related to mRemoteNGTests.UI.Window.ConfigWindowTests
- #2096: Corrected encryption code of LegacyRijndaelCryptographyProvider
- #2089: Fixed the exception thrown by menu buttons "Documentation" and "Website"
- #2087: Fixed application crash, when the update file is launched from the application
- #2079: Fixed theme files not being copied to output directory
- #2012: Updated PuTTYNG to v0.76
- #1884: Allow setting Port when using MSSQL
- #1783: Added missing inheritance properties to SQL scripts
- #1773: Connection issue with mysql - Missing fields in
- #1773: Connection issue with MySql - Missing fields in
- #1756: Cannot type any character on MultiSSH toolbar
- #1720: Show configuration file name in title of password prompt form
- #1713: Sound redirection does not work if Clipboard redirection is set to No
- #1632: 1.77.1 breaks RDP drive and sound redirection
- #1610: Menu bar changes to english when cancelling options form
- #1610: Menu bar changes to English when canceling options form
- #1595: Unhandled exception when trying to browse through non existent multi ssh history with keyboard key strokes
- #1589: Update SQL tables instead of rewriting them
- #1465: REGRESSION: Smart Cards redirection to Remote Desktop not working
- #1363: Don't show "Disk Usage" button in installer
- #1337: Unhandled exception after closing mRemoteNG
- #359: Making a VNC connection to an unreachable host causes the application to not respond for 20-30 seconds
- #618: Do not break the Windows Clipboard Chain when exiting.
## [1.77.1] - 2019-09-02
### Added

View File

@@ -278,62 +278,3 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View File

@@ -1,127 +0,0 @@
# Contributors
## Current mRemoteNG dev team
[David Sparer](http://github.com/sparerd)
[Sean Kaim](http://github.com/kmscode)
[Faryan Rezagholi](http://github.com/farosch)
[Bennett Blodinger](http://github.com/benwa)
[Joe Cefoli](http://github.com/jcefoli)
[countchappy](http://github.com/countchappy)
Tony Lambert
[Julien Roncaglia](http://github.com/vbfox)
[peterchenadded](http://github.com/peterchenadded)
[Brandon Wulf](http://github.com/mrwulf)
[Pedro Rodrigues](http://github.com/pedro2555)
[dekelMP](http://github.com/dekelMP)
[Bruce](http://github.com/brucetp)
[Camilo Alvarez](http://github.com/jotatsu)
[DamianBis](http://github.com/DamianBis)
[pfjason](http://github.com/pfjason)
[sirLoaf](http://github.com/sirLoaf)
[Fyers](http://github.com/Fyers)
[Vladimir Semenov](http://github.com/sli-pro)
[Stephan](http://github.com/st-schuler)
[Aleksey Reytsman](http://github.com/areytsman)
[Cristian Abelleira](http://github.com/CrAbelleira)
[MitchellBot](http://github.com/MitchellBot)
[Filippo Ferrazini](http://github.com/Filippo125)
## Past Contributors
Felix Deimel - mRemote original developer
Riley McArdle - mRemoteNG original developer
[Hayato Iriumi](http://github.com/hiriumi)
Jason Barbier
Wiktor Beryt
Lionel Caignec
Ruben d'Arco
Holger Henke
Tom Hiller
Apisitt Rattana
Andreas Rehm
David Vidmar
[Brandhor](http://github.com/Brandhor)
[Dimitrij](http://github.com/Kvarkas)
## Translators
Eugenio "Ryo567" Martínez
Mathieu Pape
Emanuel Silva
Robert Siwiec
Hayato Iriumi
[Sebastien Thieury](http://github.com/SebThieu)
Riza Emet
[Lukas Plachy](http://github.com/rheingold)
Gyuha Shin
[Stefan](http://github.com/polluks)
[emazv72](http://github.com/emazv72)
[Vladimir Semenov](http://github.com/sli-pro)
[Marco Sousa](http://github.com/marcomsousa)
[wwj402](http://github.com/wwj402)
[Fyers](http://github.com/Fyers)
[pablomh](http://github.com/pablomh)
[Damian Szczepanik](http://github.com/damianszczepanik)
[Mant1kor](http://github.com/Mant1kor)
# Included Source Code
**[Command Line Arguments Parser](http://www.codeproject.com/KB/recipes/command_line.aspx)**
Copyright © 2002 Richard Lopes
MIT License
**[FilteredPropertyGrid](http://www.codeproject.com/KB/cs/FilteredPropertyGrid.aspx)**
Copyright © 2006 Azuria
**[InputBox](http://www.csharp-examples.net/inputbox/)**
Copyright © 2016 Jan Slama
**[IP TextBox](http://www.codeproject.com/Articles/11576/IP-TextBox)**
Copyright © 2005 mawnkay
**[PortableSettingsProvider](https://github.com/crdx/PortableSettingsProvider)**
Copyright © 2014 crdx
**[ADTree](http://www.codeproject.com/KB/selection/ADPickerCtrl.aspx)**
Copyright © 2004 Marc Merritt © 2008 Felix Deimel
# Included Components
**[CefSharp](https://github.com/cefsharp/CefSharp)**
Copyright © The CefSharp Authors
MIT License
**[DockPanel Suite](https://github.com/dockpanelsuite/dockpanelsuite)**
Copyright © 2018 @roken and @lextm (formerly Weifen Luo)
MIT License
**[log4net](http://logging.apache.org/log4net/)**
Copyright © 2001-2015 The Apache Software Foundation
Apache License Version 2.0
**[PuTTY](http://www.chiark.greenend.org.uk/~sgtatham/putty/)**
Copyright © 1997-2017 Simon Tatham
MIT License
**[Silk Icon Set](http://www.famfamfam.com/)**
Copyright © 2005-2008 FAMFAMFAM
Creative Commons Attribution 2.5 License
**[SSH.NET](https://github.com/sshnet/SSH.NET)**
Copyright © 2016
MIT License
**[VncSharp](https://github.com/humphd/VncSharp) (Archived)**
Copyright © 2004-2009 David Humphrey
GNU General Public License (GPL) Version 2
**[ObjectListView](https://sourceforge.net/projects/objectlistview/)**
Copyright © 2006-2016 Phillip Piper
GNU General Public License (GPL) Version 3
**[ConsoleControl](https://github.com/dwmkerr/consolecontrol)**
Copyright © 2015 Dave Kerr
MIT License

View File

@@ -0,0 +1,180 @@
namespace ExternalConnectors.AWS
{
partial class AWSConnectionForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.tbAccesKeyID = new System.Windows.Forms.TextBox();
this.tbAccesKey = new System.Windows.Forms.TextBox();
this.btnOK = new System.Windows.Forms.Button();
this.btnCancel = new System.Windows.Forms.Button();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.tableLayoutPanel1.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
this.SuspendLayout();
//
// tbAccesKeyID
//
this.tbAccesKeyID.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbAccesKeyID.Location = new System.Drawing.Point(152, 4);
this.tbAccesKeyID.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.tbAccesKeyID.Name = "tbAccesKeyID";
this.tbAccesKeyID.Size = new System.Drawing.Size(490, 23);
this.tbAccesKeyID.TabIndex = 0;
//
// tbAccesKey
//
this.tbAccesKey.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbAccesKey.Location = new System.Drawing.Point(152, 43);
this.tbAccesKey.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.tbAccesKey.Name = "tbAccesKey";
this.tbAccesKey.Size = new System.Drawing.Size(490, 23);
this.tbAccesKey.TabIndex = 2;
//
// btnOK
//
this.btnOK.Anchor = System.Windows.Forms.AnchorStyles.Right;
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.btnOK.Location = new System.Drawing.Point(219, 12);
this.btnOK.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.btnOK.Name = "btnOK";
this.btnOK.Size = new System.Drawing.Size(88, 26);
this.btnOK.TabIndex = 10;
this.btnOK.Text = "OK";
this.btnOK.UseVisualStyleBackColor = true;
//
// btnCancel
//
this.btnCancel.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btnCancel.Location = new System.Drawing.Point(338, 12);
this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(88, 26);
this.btnCancel.TabIndex = 11;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 22.92994F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 77.07006F));
this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.label2, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.tbAccesKeyID, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.tbAccesKey, 1, 1);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Top;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 3;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(646, 102);
this.tableLayoutPanel1.TabIndex = 12;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
this.label1.Location = new System.Drawing.Point(4, 0);
this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(140, 39);
this.label1.TabIndex = 2;
this.label1.Text = "Access Key ID";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Dock = System.Windows.Forms.DockStyle.Fill;
this.label2.Location = new System.Drawing.Point(4, 39);
this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(140, 39);
this.label2.TabIndex = 4;
this.label2.Text = "Access Key";
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// tableLayoutPanel2
//
this.tableLayoutPanel2.ColumnCount = 5;
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 93F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 93F));
this.tableLayoutPanel2.Controls.Add(this.btnOK, 1, 0);
this.tableLayoutPanel2.Controls.Add(this.btnCancel, 3, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Bottom;
this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 112);
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(646, 50);
this.tableLayoutPanel2.TabIndex = 13;
//
// AWSConnectionForm
//
this.AcceptButton = this.btnOK;
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(646, 162);
this.Controls.Add(this.tableLayoutPanel2);
this.Controls.Add(this.tableLayoutPanel1);
this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.Name = "AWSConnectionForm";
this.Text = "AWS EC2 API Login Data";
this.Activated += new System.EventHandler(this.AWSConnectionForm_Activated);
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.tableLayoutPanel2.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
public System.Windows.Forms.TextBox tbAccesKeyID;
public System.Windows.Forms.TextBox tbAccesKey;
private System.Windows.Forms.Button btnOK;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
}
}

View File

@@ -0,0 +1,16 @@
namespace ExternalConnectors.AWS
{
public partial class AWSConnectionForm : Form
{
public AWSConnectionForm()
{
InitializeComponent();
}
private void AWSConnectionForm_Activated(object sender, EventArgs e)
{
tbAccesKeyID.Focus();
}
}
}

View File

@@ -0,0 +1,60 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,119 @@
using Amazon;
using Amazon.EC2;
using Amazon.EC2.Model;
using Microsoft.Win32;
namespace ExternalConnectors.AWS
{
public class EC2FetchDataService
{
private static DateTime lastFetch;
private static List<InstanceInfo>? lastData;
// input must be in format "AWSAPI:instanceid" where instanceid is the ec2 instance id, e.g. i-066f750a76c97583d
public static async Task<string> GetEC2InstanceDataAsync(string input, string region)
{
// get secret id
if (!input.StartsWith("AWSAPI:"))
throw new Exception("calling this function requires AWSAPI: input");
string InstanceID = input[7..];
// init connection credentials, display popup if necessary
AWSConnectionData.Init();
var alldata = await GetEC2IPDataAsync(region);
var found = alldata.Where(x => x.InstanceId == InstanceID).SingleOrDefault();
return (found == null) ? "" : found.PublicIP;
}
private static async Task<List<InstanceInfo>> GetEC2IPDataAsync(string region)
{
// caching
TimeSpan timeSpan = DateTime.Now - lastFetch;
if (timeSpan.TotalMinutes < 1 && lastData != null)
return lastData;
//AWSConfigs.AWSRegion = AWSConnectionData.region;
AWSConfigs.AWSRegion = region;
string awsAccessKeyId = AWSConnectionData.awsKeyID;
string awsSecretAccessKey = AWSConnectionData.awsKey;
var _client = new AmazonEC2Client(awsAccessKeyId, awsSecretAccessKey, RegionEndpoint.EUCentral1);
bool done = false;
List<InstanceInfo> instanceList = new();
var request = new DescribeInstancesRequest();
while (!done)
{
DescribeInstancesResponse response = await _client.DescribeInstancesAsync(request);
foreach (var reservation in response.Reservations)
{
foreach (var instance in reservation.Instances)
{
string vmname = "";
foreach (var tag in instance.Tags)
{
if (tag.Key == "Name")
{
vmname = tag.Value;
}
}
InstanceInfo inf = new(instance, vmname);
instanceList.Add(inf);
}
}
request.NextToken = response.NextToken;
if (response.NextToken == null)
{
done = true;
}
}
lastData = instanceList.OrderBy(x => x.Name).ToList();
lastFetch = DateTime.Now;
return lastData;
}
public static class AWSConnectionData
{
private static readonly RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\mRemoteAWSInterface");
public static string awsKeyID = "";
public static string awsKey = "";
//public static string _region = "eu-central-1";
public static void Init()
{
if (awsKey != "")
return;
// display gui and ask for data
AWSConnectionForm f = new();
f.tbAccesKeyID.Text = "" + key.GetValue("KeyID");
f.tbAccesKey.Text = "" + key.GetValue("Key");
//f.tbRegion.Text = "" + key.GetValue("Region");
//if (f.tbRegion.Text == null || f.tbRegion.Text.Length < 2)
// f.tbRegion.Text = region;
_ = f.ShowDialog();
if (f.DialogResult != DialogResult.OK)
return;
// store values to memory
awsKeyID = f.tbAccesKeyID.Text;
awsKey = f.tbAccesKey.Text;
//region = f.tbRegion.Text;
// write values to registry
key.SetValue("KeyID", awsKeyID);
key.SetValue("Key", awsKey);
//key.SetValue("Region", region);
key.Close();
}
}
}
}

View File

@@ -0,0 +1,34 @@
using Amazon.EC2.Model;
using System;
namespace ExternalConnectors.AWS
{
public class InstanceInfo
{
public string InstanceId { get; }
public string Name { get; }
public string Status { get; }
public string PublicIP { get; }
public string PrivateIP { get; }
public InstanceInfo(Instance instance, string name)
{
InstanceId = instance.InstanceId;
Name = name;
switch(instance.State.Code)
{
case 0: Status = "Pending"; break;
case 16: Status = "Running"; break;
case 32: Status = "Shutdown"; break;
case 48: Status = "Terminated"; break;
case 64: Status = "Stopping"; break;
case 80: Status = "Stopped"; break;
default: Status = "Unknown"; break;
};
PublicIP = instance.PublicIpAddress ?? "";
PrivateIP = instance.PrivateIpAddress ?? "";
}
}
}

View File

@@ -0,0 +1,28 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<OutputType>Library</OutputType>
<UseWindowsForms>True</UseWindowsForms>
<Platforms>x64</Platforms>
<Configurations>Debug;Release;Debug Portable;Release Portable</Configurations>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AWSSDK.Core" Version="3.7.5.13" />
<PackageReference Include="AWSSDK.EC2" Version="3.7.54" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
<ItemGroup>
<Compile Update="AWS\AWSConnectionForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="TSS\SSConnectionForm.cs">
<SubType>Form</SubType>
</Compile>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,256 @@
namespace ExternalConnectors.TSS
{
partial class SSConnectionForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.tbSSURL = new System.Windows.Forms.TextBox();
this.tbUsername = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.tbPassword = new System.Windows.Forms.TextBox();
this.btnOK = new System.Windows.Forms.Button();
this.btnCancel = new System.Windows.Forms.Button();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.label5 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.cbUseSSO = new System.Windows.Forms.CheckBox();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.label4 = new System.Windows.Forms.Label();
this.tableLayoutPanel1.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
this.SuspendLayout();
//
// tbSSURL
//
this.tbSSURL.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbSSURL.Location = new System.Drawing.Point(260, 4);
this.tbSSURL.Margin = new System.Windows.Forms.Padding(4);
this.tbSSURL.Name = "tbSSURL";
this.tbSSURL.Size = new System.Drawing.Size(536, 23);
this.tbSSURL.TabIndex = 0;
//
// tbUsername
//
this.tbUsername.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbUsername.Location = new System.Drawing.Point(260, 35);
this.tbUsername.Margin = new System.Windows.Forms.Padding(4);
this.tbUsername.Name = "tbUsername";
this.tbUsername.Size = new System.Drawing.Size(536, 23);
this.tbUsername.TabIndex = 2;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Dock = System.Windows.Forms.DockStyle.Fill;
this.label3.Location = new System.Drawing.Point(4, 62);
this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(248, 23);
this.label3.TabIndex = 5;
this.label3.Text = "Password";
this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// tbPassword
//
this.tbPassword.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbPassword.Location = new System.Drawing.Point(260, 66);
this.tbPassword.Margin = new System.Windows.Forms.Padding(4);
this.tbPassword.Name = "tbPassword";
this.tbPassword.Size = new System.Drawing.Size(536, 23);
this.tbPassword.TabIndex = 4;
this.tbPassword.UseSystemPasswordChar = true;
//
// btnOK
//
this.btnOK.Anchor = System.Windows.Forms.AnchorStyles.Right;
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.btnOK.Location = new System.Drawing.Point(296, 12);
this.btnOK.Margin = new System.Windows.Forms.Padding(4);
this.btnOK.Name = "btnOK";
this.btnOK.Size = new System.Drawing.Size(88, 26);
this.btnOK.TabIndex = 10;
this.btnOK.Text = "OK";
this.btnOK.UseVisualStyleBackColor = true;
//
// btnCancel
//
this.btnCancel.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btnCancel.Location = new System.Drawing.Point(415, 12);
this.btnCancel.Margin = new System.Windows.Forms.Padding(4);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(88, 26);
this.btnCancel.TabIndex = 11;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 32.06997F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67.93003F));
this.tableLayoutPanel1.Controls.Add(this.label5, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.label2, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.label3, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.tbSSURL, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.tbUsername, 1, 1);
this.tableLayoutPanel1.Controls.Add(this.tbPassword, 1, 2);
this.tableLayoutPanel1.Controls.Add(this.cbUseSSO, 0, 3);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Top;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(4);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 4;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(800, 108);
this.tableLayoutPanel1.TabIndex = 12;
//
// label5
//
this.label5.AutoSize = true;
this.label5.Dock = System.Windows.Forms.DockStyle.Fill;
this.label5.Location = new System.Drawing.Point(260, 85);
this.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(536, 23);
this.label5.TabIndex = 15;
this.label5.Text = "For SSO to work, additional IIS configuration is required!";
this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
this.label1.Location = new System.Drawing.Point(4, 0);
this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(248, 31);
this.label1.TabIndex = 2;
this.label1.Text = "Secret Server URL";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Dock = System.Windows.Forms.DockStyle.Fill;
this.label2.Location = new System.Drawing.Point(4, 31);
this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(248, 31);
this.label2.TabIndex = 4;
this.label2.Text = "DOMAIN\\Username";
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// cbUseSSO
//
this.cbUseSSO.AutoSize = true;
this.cbUseSSO.Location = new System.Drawing.Point(4, 89);
this.cbUseSSO.Margin = new System.Windows.Forms.Padding(4, 4, 4, 0);
this.cbUseSSO.Name = "cbUseSSO";
this.cbUseSSO.Size = new System.Drawing.Size(69, 19);
this.cbUseSSO.TabIndex = 14;
this.cbUseSSO.Text = "Use SSO";
this.cbUseSSO.UseVisualStyleBackColor = true;
this.cbUseSSO.CheckedChanged += new System.EventHandler(this.cbUseSSO_CheckedChanged);
//
// tableLayoutPanel2
//
this.tableLayoutPanel2.ColumnCount = 5;
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 93F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 93F));
this.tableLayoutPanel2.Controls.Add(this.btnOK, 1, 0);
this.tableLayoutPanel2.Controls.Add(this.btnCancel, 3, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Bottom;
this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 148);
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(4);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(800, 50);
this.tableLayoutPanel2.TabIndex = 13;
//
// label4
//
this.label4.AutoSize = true;
this.label4.Dock = System.Windows.Forms.DockStyle.Fill;
this.label4.Location = new System.Drawing.Point(0, 108);
this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(341, 15);
this.label4.TabIndex = 14;
this.label4.Text = "URL is the base URL, like https://cred.domain.local/SecretServer";
this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// SSConnectionForm
//
this.AcceptButton = this.btnOK;
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 198);
this.Controls.Add(this.label4);
this.Controls.Add(this.tableLayoutPanel2);
this.Controls.Add(this.tableLayoutPanel1);
this.Margin = new System.Windows.Forms.Padding(4);
this.Name = "SSConnectionForm";
this.Text = "Secret Server API Login Data";
this.Activated += new System.EventHandler(this.SSConnectionForm_Activated);
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.tableLayoutPanel2.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label3;
public System.Windows.Forms.TextBox tbSSURL;
public System.Windows.Forms.TextBox tbUsername;
public System.Windows.Forms.TextBox tbPassword;
private System.Windows.Forms.Button btnOK;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
public System.Windows.Forms.CheckBox cbUseSSO;
private System.Windows.Forms.Label label4;
private Label label5;
}
}

View File

@@ -0,0 +1,30 @@
namespace ExternalConnectors.TSS
{
public partial class SSConnectionForm : Form
{
public SSConnectionForm()
{
InitializeComponent();
}
private void SSConnectionForm_Activated(object sender, EventArgs e)
{
SetVisibility();
if (cbUseSSO.Checked)
btnOK.Focus();
else
tbPassword.Focus();
}
private void cbUseSSO_CheckedChanged(object sender, EventArgs e)
{
SetVisibility();
}
private void SetVisibility()
{
bool ch = cbUseSSO.Checked;
tbPassword.Enabled = !ch;
tbUsername.Enabled = !ch;
}
}
}

View File

@@ -0,0 +1,60 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,364 @@
//----------------------
// <auto-generated>
// Generated using the NSwag toolchain v13.14.8.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0)) (http://NSwag.org)
// </auto-generated>
//----------------------
#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended."
#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword."
#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?'
#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ...
#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..."
#pragma warning disable 8073 // Disable "CS8073 The result of the expression is always 'false' since a value of type 'T' is never equal to 'null' of type 'T?'"
#pragma warning disable 3016 // Disable "CS3016 Arrays as attribute arguments is not CLS-compliant"
namespace SecretServerAuthentication.TSS
{
using System = global::System;
[System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.8.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")]
public partial class OAuth2ServiceClient
{
private string _baseUrl = "";
private System.Net.Http.HttpClient _httpClient;
private System.Lazy<Newtonsoft.Json.JsonSerializerSettings> _settings;
public OAuth2ServiceClient(string baseUrl, System.Net.Http.HttpClient httpClient)
{
BaseUrl = baseUrl;
_httpClient = httpClient;
_settings = new System.Lazy<Newtonsoft.Json.JsonSerializerSettings>(CreateSerializerSettings);
}
private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings()
{
var settings = new Newtonsoft.Json.JsonSerializerSettings();
UpdateJsonSerializerSettings(settings);
return settings;
}
public string BaseUrl
{
get { return _baseUrl; }
set { _baseUrl = value; }
}
protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } }
partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings);
partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url);
partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder);
partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response);
/// <summary>Retrieve or Refresh Access Token</summary>
/// <param name="grant_type">Authentication grant type. Use 'password' when authenticating, and 'refresh_token' when refreshing a token.</param>
/// <param name="username">Secret Server authentication username. Required when authenticating.</param>
/// <param name="password">Secret Server authentication password. Required when authenticating.</param>
/// <param name="refresh_token">The refresh token. Required when refreshing a token.</param>
/// <returns>Successful retrieval of an access token</returns>
/// <exception cref="ApiException">A server side error occurred.</exception>
public System.Threading.Tasks.Task<TokenResponse> AuthorizeAsync(Grant_type grant_type, string username, string password, string refresh_token)
{
return AuthorizeAsync(grant_type, username, password, refresh_token, System.Threading.CancellationToken.None);
}
/// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
/// <summary>Retrieve or Refresh Access Token</summary>
/// <param name="grant_type">Authentication grant type. Use 'password' when authenticating, and 'refresh_token' when refreshing a token.</param>
/// <param name="username">Secret Server authentication username. Required when authenticating.</param>
/// <param name="password">Secret Server authentication password. Required when authenticating.</param>
/// <param name="refresh_token">The refresh token. Required when refreshing a token.</param>
/// <returns>Successful retrieval of an access token</returns>
/// <exception cref="ApiException">A server side error occurred.</exception>
public async System.Threading.Tasks.Task<TokenResponse> AuthorizeAsync(Grant_type grant_type, string username, string password, string refresh_token, System.Threading.CancellationToken cancellationToken)
{
var urlBuilder_ = new System.Text.StringBuilder();
urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/oauth2/token");
var client_ = _httpClient;
var disposeClient_ = false;
try
{
using (var request_ = new System.Net.Http.HttpRequestMessage())
{
var keyValues_ = new System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string, string>>();
if (grant_type == null)
throw new System.ArgumentNullException("grant_type");
else
keyValues_.Add(new System.Collections.Generic.KeyValuePair<string, string>("grant_type", ConvertToString(grant_type, System.Globalization.CultureInfo.InvariantCulture)));
if (username != null)
keyValues_.Add(new System.Collections.Generic.KeyValuePair<string, string>("username", ConvertToString(username, System.Globalization.CultureInfo.InvariantCulture)));
if (password != null)
keyValues_.Add(new System.Collections.Generic.KeyValuePair<string, string>("password", ConvertToString(password, System.Globalization.CultureInfo.InvariantCulture)));
if (refresh_token != null)
keyValues_.Add(new System.Collections.Generic.KeyValuePair<string, string>("refresh_token", ConvertToString(refresh_token, System.Globalization.CultureInfo.InvariantCulture)));
request_.Content = new System.Net.Http.FormUrlEncodedContent(keyValues_);
request_.Method = new System.Net.Http.HttpMethod("POST");
request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json"));
PrepareRequest(client_, request_, urlBuilder_);
var url_ = urlBuilder_.ToString();
request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute);
PrepareRequest(client_, request_, url_);
var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
var disposeResponse_ = true;
try
{
var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value);
if (response_.Content != null && response_.Content.Headers != null)
{
foreach (var item_ in response_.Content.Headers)
headers_[item_.Key] = item_.Value;
}
ProcessResponse(client_, response_);
var status_ = (int)response_.StatusCode;
if (status_ == 200)
{
var objectResponse_ = await ReadObjectResponseAsync<TokenResponse>(response_, headers_, cancellationToken).ConfigureAwait(false);
if (objectResponse_.Object == null)
{
throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
}
return objectResponse_.Object;
}
else
if (status_ == 400)
{
var objectResponse_ = await ReadObjectResponseAsync<TokenErrorResponse>(response_, headers_, cancellationToken).ConfigureAwait(false);
if (objectResponse_.Object == null)
{
throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
}
throw new ApiException<TokenErrorResponse>("An error occurred", status_, objectResponse_.Text, headers_, objectResponse_.Object, null);
}
else
{
var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false);
throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null);
}
}
finally
{
if (disposeResponse_)
response_.Dispose();
}
}
}
finally
{
if (disposeClient_)
client_.Dispose();
}
}
protected struct ObjectResponseResult<T>
{
public ObjectResponseResult(T responseObject, string responseText)
{
this.Object = responseObject;
this.Text = responseText;
}
public T Object { get; }
public string Text { get; }
}
public bool ReadResponseAsString { get; set; }
protected virtual async System.Threading.Tasks.Task<ObjectResponseResult<T>> ReadObjectResponseAsync<T>(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, System.Threading.CancellationToken cancellationToken)
{
if (response == null || response.Content == null)
{
return new ObjectResponseResult<T>(default(T), string.Empty);
}
if (ReadResponseAsString)
{
var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
try
{
var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(responseText, JsonSerializerSettings);
return new ObjectResponseResult<T>(typedBody, responseText);
}
catch (Newtonsoft.Json.JsonException exception)
{
var message = "Could not deserialize the response body string as " + typeof(T).FullName + ".";
throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception);
}
}
else
{
try
{
using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
using (var streamReader = new System.IO.StreamReader(responseStream))
using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader))
{
var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings);
var typedBody = serializer.Deserialize<T>(jsonTextReader);
return new ObjectResponseResult<T>(typedBody, string.Empty);
}
}
catch (Newtonsoft.Json.JsonException exception)
{
var message = "Could not deserialize the response body stream as " + typeof(T).FullName + ".";
throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception);
}
}
}
private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo)
{
if (value == null)
{
return "";
}
if (value is System.Enum)
{
var name = System.Enum.GetName(value.GetType(), value);
if (name != null)
{
var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name);
if (field != null)
{
var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute))
as System.Runtime.Serialization.EnumMemberAttribute;
if (attribute != null)
{
return attribute.Value != null ? attribute.Value : name;
}
}
var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo));
return converted == null ? string.Empty : converted;
}
}
else if (value is bool)
{
return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant();
}
else if (value is byte[])
{
return System.Convert.ToBase64String((byte[])value);
}
else if (value.GetType().IsArray)
{
var array = System.Linq.Enumerable.OfType<object>((System.Array)value);
return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo)));
}
var result = System.Convert.ToString(value, cultureInfo);
return result == null ? "" : result;
}
}
/// <summary>API access token response</summary>
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")]
public partial class TokenResponse
{
/// <summary>Authentication token</summary>
[Newtonsoft.Json.JsonProperty("access_token", Required = Newtonsoft.Json.Required.Always)]
[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
public string Access_token { get; set; }
/// <summary>Authentication token type</summary>
[Newtonsoft.Json.JsonProperty("token_type", Required = Newtonsoft.Json.Required.Always)]
[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
public TokenResponseToken_type Token_type { get; set; }
/// <summary>Authentication token expiration time, in seconds</summary>
[Newtonsoft.Json.JsonProperty("expires_in", Required = Newtonsoft.Json.Required.Always)]
[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
public string Expires_in { get; set; }
/// <summary>Refresh token. This is only provided when the server is set to allow refresh tokens for web services and when the session timeout duration is not set to Unlimited.</summary>
[Newtonsoft.Json.JsonProperty("refresh_token", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string Refresh_token { get; set; }
}
/// <summary>API access token error response</summary>
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")]
public partial class TokenErrorResponse
{
/// <summary>Authentication token</summary>
[Newtonsoft.Json.JsonProperty("message", Required = Newtonsoft.Json.Required.Always)]
[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
public string Message { get; set; }
}
/// <summary>Authentication grant type. Use 'password' when authenticating, and 'refresh_token' when refreshing a token.</summary>
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")]
public enum Grant_type
{
[System.Runtime.Serialization.EnumMember(Value = @"password")]
Password = 0,
[System.Runtime.Serialization.EnumMember(Value = @"refresh_token")]
Refresh_token = 1,
}
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")]
public enum TokenResponseToken_type
{
[System.Runtime.Serialization.EnumMember(Value = @"bearer")]
Bearer = 0,
}
[System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.8.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")]
public partial class ApiException : System.Exception
{
public int StatusCode { get; private set; }
public string Response { get; private set; }
public System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> Headers { get; private set; }
public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, System.Exception innerException)
: base(message + "\n\nStatus: " + statusCode + "\nResponse: \n" + ((response == null) ? "(null)" : response.Substring(0, response.Length >= 512 ? 512 : response.Length)), innerException)
{
StatusCode = statusCode;
Response = response;
Headers = headers;
}
public override string ToString()
{
return string.Format("HTTP Response: \n\n{0}\n\n{1}", Response, base.ToString());
}
}
[System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.8.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")]
public partial class ApiException<TResult> : ApiException
{
public TResult Result { get; private set; }
public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, TResult result, System.Exception innerException)
: base(message, statusCode, response, headers, innerException)
{
Result = result;
}
}
}
#pragma warning restore 1591
#pragma warning restore 1573
#pragma warning restore 472
#pragma warning restore 114
#pragma warning restore 108
#pragma warning restore 3016

View File

@@ -0,0 +1,184 @@
using Microsoft.Win32;
using SecretServerAuthentication.TSS;
using SecretServerRestClient.TSS;
namespace ExternalConnectors.TSS
{
public class SecretServerInterface
{
private static class SSConnectionData
{
public static string ssUsername = "";
public static string ssPassword = "";
public static string ssUrl = "";
public static bool ssSSO = false;
public static bool initdone = false;
public static void Init()
{
if (ssPassword != "" || initdone == true)
return;
RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\mRemoteSSInterface");
try
{
// display gui and ask for data
SSConnectionForm f = new SSConnectionForm();
string? un = key.GetValue("Username") as string;
f.tbUsername.Text = un ?? "";
string? url = key.GetValue("URL") as string;
if (url == null || !url.Contains("://"))
url = "https://cred.domain.local/SecretServer";
f.tbSSURL.Text = url;
var b = key.GetValue("SSO");
if (b == null || (string)b != "True")
ssSSO = false;
else
{
ssSSO = true;
initdone = true;
}
f.cbUseSSO.Checked = ssSSO;
// show dialog
while(true)
{
_ = f.ShowDialog();
if (f.DialogResult != DialogResult.OK)
return;
// store values to memory
ssUsername = f.tbUsername.Text;
ssPassword = f.tbPassword.Text;
ssUrl = f.tbSSURL.Text;
ssSSO = f.cbUseSSO.Checked;
// check connection first
try
{
if (TestCredentials() == true)
break;
}
catch (Exception)
{
MessageBox.Show("TestCredentials failed - please check your credentials");
}
}
// write values to registry
key.SetValue("Username", ssUsername);
key.SetValue("URL", ssUrl);
key.SetValue("SSO", ssSSO);
}
catch (Exception)
{
throw;
}
finally
{
key.Close();
}
}
}
private static bool TestCredentials()
{
string authUsername = SSConnectionData.ssUsername;
string authPassword = SSConnectionData.ssPassword;
string baseURL = SSConnectionData.ssUrl;
if (SSConnectionData.ssSSO)
{
// checking creds doesn't really make sense here, as we can't modify them anyway if something is wrong
return true;
}
else
{
using (var httpClient = new HttpClient())
{
// Authenticate:
var tokenClient = new OAuth2ServiceClient(baseURL, httpClient);
// call below will throw an exception if the creds are invalid
var token = tokenClient.AuthorizeAsync(Grant_type.Password, authUsername, authPassword, null).Result;
// here we can be sure the creds are ok - return success state
return true;
}
}
}
private static void FetchSecret(int secretID, out string secretUsername, out string secretPassword, out string secretDomain)
{
string authUsername = SSConnectionData.ssUsername;
string authPassword = SSConnectionData.ssPassword;
string baseURL = SSConnectionData.ssUrl;
SecretModel secret;
if (SSConnectionData.ssSSO)
{
// REQUIRES IIS CONFIG! https://docs.thycotic.com/ss/11.0.0/api-scripting/webservice-iwa-powershell
var handler = new HttpClientHandler() { UseDefaultCredentials = true };
using (var httpClient = new HttpClient(handler))
{
// Call REST API:
var client = new SecretsServiceClient($"{baseURL}/winauthwebservices/api", httpClient);
secret = client.GetSecretAsync(false, true, secretID, null).Result;
}
}
else
{
using (var httpClient = new HttpClient())
{
// Authenticate:
var tokenClient = new OAuth2ServiceClient(baseURL, httpClient);
var token = tokenClient.AuthorizeAsync(Grant_type.Password, authUsername, authPassword, null).Result;
var tokenResult = token.Access_token;
// Set credentials (token):
httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", tokenResult);
// Call REST API:
var client = new SecretsServiceClient($"{baseURL}/api", httpClient);
secret = client.GetSecretAsync(false, true, secretID, null).Result;
}
}
// clear return variables
secretDomain = "";
secretUsername = "";
secretPassword = "";
// parse data and extract what we need
foreach (var item in secret.Items)
{
if (item.FieldName.ToLower().Equals("domain"))
secretDomain = item.ItemValue;
else if (item.FieldName.ToLower().Equals("username"))
secretUsername = item.ItemValue;
else if (item.FieldName.ToLower().Equals("password"))
secretPassword = item.ItemValue;
}
}
// input must be in form "SSAPI:xxxx" where xxx is the secret id to fetch
public static void FetchSecretFromServer(string input, out string username, out string password, out string domain)
{
// get secret id
if (!input.StartsWith("SSAPI:"))
throw new Exception("calling this function requires SSAPI: input");
int secretID = Int32.Parse(input.Substring(6));
// init connection credentials, display popup if necessary
SSConnectionData.Init();
// get the secret
FetchSecret(secretID, out username, out password, out domain);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@
<br/><br/>
<p align="center">
<img width="500" src="https://raw.githubusercontent.com/mRemoteNG/mRemoteNG/develop/Tools/img/logo.png">
<img width="450" src="https://github.com/mRemoteNG/mRemoteNG/blob/develop/mRemoteNGProjectFiles/Header_dark.png">
</p>
<p align="center">
@@ -23,7 +23,9 @@
<a href="https://gitter.im/mRemoteNG/PublicChat">
<img alt="Gitter" src="https://img.shields.io/gitter/room/mRemoteNG/PublicChat?label=Join%20the%20Chat&logo=Gitter&style=flat-square">
</a>
<a href="https://www.paypal.me/DavidSparer">
</p>
<p align="center">
<a href="https://www.paypal.com/paypalme/mremoteng">
<img alt="PayPal" src="https://img.shields.io/badge/%24-PayPal-blue.svg?label=Donate&logo=PayPal&style=flat-square">
</a>
<a href="bitcoin:16fUnHUM3k7W9Fvpc6dug7TAdfeGEcLbSg">
@@ -45,11 +47,11 @@
---
| Update Channel | Build Status | Downloads |
| Channel | Build Status | Downloads |
| ---------------|--------------|-----------|
| Stable | [![Build status](https://ci.appveyor.com/api/projects/status/k0sdbxmq90fgdmj6/branch/master?svg=true)](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/master) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.76.20/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.76.20) |
| Prerelease | [![Build status](https://ci.appveyor.com/api/projects/status/k0sdbxmq90fgdmj6/branch/develop?svg=true)](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/develop) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.77.1/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.77.1) |
| Nightly build | [![Build status](https://ci.appveyor.com/api/projects/status/k0sdbxmq90fgdmj6/branch/develop?svg=true)](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/develop) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.77.2-nb/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.77.2-nb) |
| Stable | ![Build status](https://ci.appveyor.com/api/projects/status/rqwxjxldail7btcf?svg=true) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.76.20/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.76.20) |
| Preview | ![Build status](https://ci.appveyor.com/api/projects/status/rqwxjxldail7btcf/branch/preview?svg=true) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.77.1/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.77.1) |
| Nightly | ![Build status](https://ci.appveyor.com/api/projects/status/rqwxjxldail7btcf/branch/develop?svg=true) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/2022.01.07-1.77.2-nb/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/2022.01.07-1.77.2-nb) |
## Features
@@ -73,24 +75,11 @@ For a detailed feature list and general usage support, refer to the [Documentati
- [Windows 11](https://en.wikipedia.org/wiki/Windows_11)
- [Windows 10](https://en.wikipedia.org/wiki/Windows_10)
- [Windows 8.1](https://en.wikipedia.org/wiki/Windows_8.1)
- [Windows Server 2022](https://en.wikipedia.org/wiki/Windows_Server_2022)
- [Windows Server 2019](https://en.wikipedia.org/wiki/Windows_Server_2019)
- [Windows Server 2016](https://en.wikipedia.org/wiki/Windows_Server_2016)
- [Windows Server 2012 R2](https://en.wikipedia.org/wiki/Windows_Server_2012_R2)
### Packaging
Downloads are provided in three different packages.
#### Binary package
The binary package of mRemoteNG is a compiled version of mRemoteNG which comes in an MSI installer.
This is the most common way to install mRemoteNG and get up and running.
#### Portable package
The portable package contains a modified version of the executable which stores and loads all your settings from files in the application's directory.
This package can be used to run mRemoteNG from a USB stick and preserve your configuration wherever you go.
#### Source package
This contains the source code from which mRemoteNG is build.
@@ -98,8 +87,8 @@ You will need to compile it yourself using Visual Studio.
### Minimum Requirements
* [Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)
* [Microsoft .NET Framework 4.0](https://www.microsoft.com/en-us/download/details.aspx?id=17851)
* [Microsoft Visual C++ Redistributable for Visual Studio 2015 - 2022](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)
* [Microsoft .NET 6.0](https://dotnet.microsoft.com/download/dotnet/6.0)
* Microsoft Terminal Service Client 6.0 or later
* Needed if you use RDP. mstscax.dll and/or msrdp.ocx be registered.
@@ -113,41 +102,16 @@ mRemoteNG is available as a redistributable MSI package or as a portable ZIP pac
The MSI package of mRemoteNG can be installed using the command line:
`msiexec /i C:\Path\To\mRemoteNG-Installer.exe [INSTALLDIR=value] [IGNOREPREREQUISITES=value]`
`msiexec /i [/qn] C:\Path\To\mRemoteNG-Installer.exe [INSTALLDIR=value] [IGNOREPREREQUISITES=value] [/lv* <log path>]`
| Property | Value | Description |
| Argument/Property | Value | Description |
|-|-|-|
| INSTALLDIR | `folder path` | This allows you to set the installation directory from the command line. For paths that contain spaces, enclose the path in double quotes (""). This overrides any value found in the registry. |
| /qn | `Silent Installation` | Will run the installer silently in the background. |
| /lv* | `Silent Installation` | Will write a logfile to the specified location. (For paths that contain spaces, enclose the path in double quotes) |
| INSTALLDIR | `folder path` | Allows you to set the installation directory from the command line. (For paths that contain spaces, enclose the path in double quotes) |
| IGNOREPREREQUISITES | `0` or `1` | When set to `1`, the installer will not be halted if any prerequisite check is not met. You must still run the installer as administrator. |
#### Examples
**Install to a custom folder**
`msiexec /i C:\Path\To\mRemoteNG-Installer.msi INSTALLDIR="D:\Work Apps\mRemoteNG"`
**Ignore prerequisites during a normal install**
`msiexec /i C:\Path\To\mRemoteNG-Installer.msi IGNOREPREREQUISITES=1`
**Ignore prerequisites during a silent install**
`msiexec /i C:\Path\To\mRemoteNG-Installer.msi /qn IGNOREPREREQUISITES=1`
### Troubleshooting installation
Turn on verbose logging by using the `/lv* <log path>` argument at the command line.
`msiexec /i C:\Path\To\mRemoteNG-Installer.msi /l*v C:\mremoteng_install.log`
## Uninstall
### Standard Uninstall
mRemoteNG basic binary package can be uninstalled with Windows Control Panel. If for some reason it does not work please
follow information provided below for Manual Uninstall.
### Manual Uninstall
## Manual Uninstall
_If you are using the Portable version, simply deleting the folder that contains mRemoteNG should be sufficient. These uninstall instructions are only necessary for the normal binary .MSI installed version of mRemoteNG_
@@ -177,5 +141,5 @@ Check out the [Wiki page](https://github.com/mRemoteNG/mRemoteNG/wiki) on how to
</br>
<p align="center">
<img alt="Developed with ReSharper" src="https://raw.githubusercontent.com/mRemoteNG/mRemoteNG/develop/Tools/img/icon_ReSharper.png">
<img alt="Developed with ReSharper" src="https://github.com/mRemoteNG/mRemoteNG/blob/develop/mRemoteNGProjectFiles/icon_ReSharper.png">
</p>

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,31 +0,0 @@
7-Zip Extra
~~~~~~~~~~~
License for use and distribution
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Copyright (C) 1999-2019 Igor Pavlov.
7-Zip Extra files are under the GNU LGPL license.
Notes:
You can use 7-Zip Extra on any computer, including a computer in a commercial
organization. You don't need to register or pay for 7-Zip.
GNU LGPL information
--------------------
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You can receive a copy of the GNU Lesser General Public License from
http://www.gnu.org/

View File

@@ -1,111 +0,0 @@
7-Zip Extra history
-------------------
This file contains only information about changes related to that package exclusively.
The full history of changes is listed in history.txt in main 7-Zip program.
19.00 2019-02-21
-------------------------
- Encryption strength for 7z archives was increased:
the size of random initialization vector was increased from 64-bit to 128-bit,
and the pseudo-random number generator was improved.
- Some bugs were fixed.
18.06 2018-12-30
-------------------------
- The speed for LZMA/LZMA2 compressing was increased by 3-10%,
and there are minor changes in compression ratio.
- Some bugs were fixed.
18.05 2018-04-30
-------------------------
- The speed for LZMA/LZMA2 compressing was increased
by 8% for fastest/fast compression levels and
by 3% for normal/maximum compression levels.
18.03 beta 2018-03-04
-------------------------
- The speed for single-thread LZMA/LZMA2 decoding
was increased by 30% in x64 version and by 3% in x86 version.
- 7-Zip now can use multi-threading for 7z/LZMA2 decoding,
if there are multiple independent data chunks in LZMA2 stream.
9.35 beta 2014-12-07
------------------------------
- SFX modules were moved to LZMA SDK package.
9.34 alpha 2014-06-22
------------------------------
- Minimum supported system now is Windows 2000 for EXE and DLL files.
- all EXE and DLL files use msvcrt.dll.
- 7zr.exe now support AES encryption.
9.18 2010-11-02
------------------------------
- New small SFX module for installers.
9.17 2010-10-04
------------------------------
- New 7-Zip plugin for FAR Manager x64.
9.10 2009-12-30
------------------------------
- 7-Zip for installers now supports LZMA2.
9.09 2009-12-12
------------------------------
- LZMA2 compression method support.
- Some bugs were fixed.
4.65 2009-02-03
------------------------------
- Some bugs were fixed.
4.38 beta 2006-04-13
------------------------------
- SFX for installers now supports new properties in config file:
Progress, Directory, ExecuteFile, ExecuteParameters.
4.34 beta 2006-02-27
------------------------------
- ISetProperties::SetProperties:
it's possible to specify desirable number of CPU threads:
PROPVARIANT: name=L"mt", vt = VT_UI4, ulVal = NumberOfThreads
If "mt" is not defined, 7za.dll will check number of processors in system to set
number of desirable threads.
Now 7za.dll can use:
2 threads for LZMA compressing
N threads for BZip2 compressing
4 threads for BZip2 decompressing
Other codecs use only one thread.
Note: 7za.dll can use additional "small" threads with low CPU load.
- It's possible to call ISetProperties::SetProperties to specify "mt" property for decoder.
4.33 beta 2006-02-05
------------------------------
- Compressing speed and Memory requirements were increased.
Default dictionary size was increased: Fastest: 64 KB, Fast: 1 MB,
Normal: 4 MB, Max: 16 MB, Ultra: 64 MB.
- 7z/LZMA now can use only these match finders: HC4, BT2, BT3, BT4
4.27 2005-09-21
------------------------------
- Some GUIDs/interfaces were changed.
IStream.h:
ISequentialInStream::Read now works as old ReadPart
ISequentialOutStream::Write now works as old WritePart

View File

@@ -1,124 +0,0 @@
7-Zip Extra 19.00
-----------------
7-Zip Extra is package of extra modules of 7-Zip.
7-Zip Copyright (C) 1999-2019 Igor Pavlov.
7-Zip is free software. Read License.txt for more information about license.
Source code of binaries can be found at:
http://www.7-zip.org/
This package contains the following files:
7za.exe - standalone console version of 7-Zip with reduced formats support.
7za.dll - library for working with 7z archives
7zxa.dll - library for extracting from 7z archives
License.txt - license information
readme.txt - this file
Far\ - plugin for Far Manager
x64\ - binaries for x64
All 32-bit binaries can work in:
Windows 2000 / 2003 / 2008 / XP / Vista / 7 / 8 / 10
and in any Windows x64 version with WoW64 support.
All x64 binaries can work in any Windows x64 version.
All binaries use msvcrt.dll.
7za.exe
-------
7za.exe - is a standalone console version of 7-Zip with reduced formats support.
Extra: 7za.exe : support for only some formats of 7-Zip.
7-Zip: 7z.exe with 7z.dll : support for all formats of 7-Zip.
7za.exe and 7z.exe from 7-Zip have same command line interface.
7za.exe doesn't use external DLL files.
You can read Help File (7-zip.chm) from 7-Zip package for description
of all commands and switches for 7za.exe and 7z.exe.
7za.exe features:
- High compression ratio in 7z format
- Supported formats:
- Packing / unpacking: 7z, xz, ZIP, GZIP, BZIP2 and TAR
- Unpacking only: Z, lzma, CAB.
- Highest compression ratio for ZIP and GZIP formats.
- Fast compression and decompression
- Strong AES-256 encryption in 7z and ZIP formats.
Note: LZMA SDK contains 7zr.exe - more reduced version of 7za.exe.
But you can use 7zr.exe as "public domain" code.
DLL files
---------
7za.dll and 7zxa.dll are reduced versions of 7z.dll from 7-Zip.
7za.dll and 7zxa.dll support only 7z format.
Note: 7z.dll is main DLL file that works with all archive types in 7-Zip.
7za.dll and 7zxa.dll support the following decoding methods:
- LZMA, LZMA2, PPMD, BCJ, BCJ2, COPY, 7zAES, BZip2, Deflate.
7za.dll also supports 7z encoding with the following encoding methods:
- LZMA, LZMA2, PPMD, BCJ, BCJ2, COPY, 7zAES.
7za.dll and 7zxa.dll work via COM interfaces.
But these DLLs don't use standard COM interfaces for objects creating.
Look also example code that calls DLL functions (in source code of 7-Zip):
7zip\UI\Client7z
Another example of binary that uses these interface is 7-Zip itself.
The following binaries from 7-Zip use 7z.dll:
- 7z.exe (console version)
- 7zG.exe (GUI version)
- 7zFM.exe (7-Zip File Manager)
Note: The source code of LZMA SDK also contains the code for similar DLLs
(DLLs without BZip2, Deflate support). And these files from LZMA SDK can be
used as "public domain" code. If you use LZMA SDK files, you don't need to
follow GNU LGPL rules, if you want to change the code.
License FAQ
-----------
Can I use the EXE or DLL files from 7-Zip in a commercial application?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Yes, but you are required to specify in documentation for your application:
(1) that you used parts of the 7-Zip program,
(2) that 7-Zip is licensed under the GNU LGPL license and
(3) you must give a link to www.7-zip.org, where the source code can be found.
Can I use the source code of 7-Zip in a commercial application?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Since 7-Zip is licensed under the GNU LGPL you must follow the rules of that license.
In brief, it means that any LGPL'ed code must remain licensed under the LGPL.
For instance, you can change the code from 7-Zip or write a wrapper for some
code from 7-Zip and compile it into a DLL; but, the source code of that DLL
(including your modifications / additions / wrapper) must be licensed under
the LGPL or GPL.
Any other code in your application can be licensed as you wish. This scheme allows
users and developers to change LGPL'ed code and recompile that DLL. That is the
idea of free software. Read more here: http://www.gnu.org/.
Note: You can look also LZMA SDK, which is available under a more liberal license.
---
End of document

View File

@@ -1,15 +0,0 @@
param (
[string]
[Parameter(Mandatory=$true)]
$SolutionDir,
[string]
[Parameter(Mandatory=$true)]
$TargetDir
)
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
Write-Output "Copying PUTTYNG to correct directory"
Copy-Item -Path (Join-Path -Path $SolutionDir -ChildPath "mRemoteNG\Resources\PuTTYNG.exe") -Destination $TargetDir -Force
Write-Output ""

View File

@@ -1,21 +0,0 @@
param (
[string]
$SourcePath,
[string]
$DestinationDir
)
Write-Host $SourcePath
Write-Host $DestinationDir
if (!(Test-Path -Path $DestinationDir))
{
New-Item -Path $DestinationDir -ItemType "directory"
}
$sourceFiles = Get-ChildItem -Path $SourcePath -Recurse | ?{$_.Extension -match "exe|msi"}
foreach ($item in $sourceFiles)
{
Copy-Item -Path $item.FullName -Destination $DestinationDir -Force
}

View File

@@ -1,19 +0,0 @@
param (
[string]
[Parameter(Mandatory=$true)]
$SolutionDir,
[string]
[Parameter(Mandatory=$true)]
$TargetDir
)
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
Write-Output "Copying THEMES folder to output"
$sourceFiles = [io.path]::combine($SolutionDir , 'mRemoteNG\Resources\Themes' )
$DestinationDir = [io.path]::combine($TargetDir , 'Themes')
robocopy $sourceFiles $DestinationDir *.vstheme /s
Write-Output ""

View File

@@ -1,17 +0,0 @@
param (
[string]
[Parameter(Mandatory=$true)]
$SolutionDir,
[string]
[Parameter(Mandatory=$true)]
$TargetDir
)
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
Write-Output "Copying TILES folder to output"
$sourceFiles = [io.path]::combine($SolutionDir , 'mRemoteNG\Resources\Tiles' )
robocopy $sourceFiles $TargetDir *.*
Write-Output ""

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -25,9 +25,9 @@ param (
$ExcludeFromSigning
)
Write-Output "+=================================================================+"
Write-Output "| Beginning mRemoteNG Installer Post Build |"
Write-Output "+=================================================================+"
Write-Output "+===========================================================================================+"
Write-Output "| Beginning mRemoteNG Installer Post Build |"
Write-Output "+===========================================================================================+"
Format-Table -AutoSize -Wrap -InputObject @{
"SolutionDir" = $SolutionDir
"TargetDir" = $TargetDir
@@ -40,5 +40,4 @@ Format-Table -AutoSize -Wrap -InputObject @{
& "$PSScriptRoot\sign_binaries.ps1" -TargetDir $TargetDir -CertificatePath $CertificatePath -CertificatePassword $CertificatePassword -ConfigurationName $ConfigurationName -Exclude $ExcludeFromSigning -SolutionDir $SolutionDir
& "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName -CertificatePath $CertificatePath -SolutionDir $SolutionDir
& "$PSScriptRoot\rename_installer_with_version.ps1" -SolutionDir $SolutionDir
& "$PSScriptRoot\copy_release_installer.ps1" -SourcePath $TargetDir -DestinationDir (Join-Path -Path $SolutionDir -ChildPath "Release")
& "$PSScriptRoot\rename_and_copy_installer.ps1" -SolutionDir $SolutionDir

View File

@@ -25,9 +25,9 @@ param (
$ExcludeFromSigning
)
Write-Output "+=================================================================+"
Write-Output "| Beginning mRemoteNG Post Build |"
Write-Output "+=================================================================+"
Write-Output "+===========================================================================================+"
Write-Output "| Beginning mRemoteNG Post Build |"
Write-Output "+===========================================================================================+"
Format-Table -AutoSize -Wrap -InputObject @{
"SolutionDir" = $SolutionDir
"TargetDir" = $TargetDir
@@ -37,16 +37,25 @@ Format-Table -AutoSize -Wrap -InputObject @{
"ExcludeFromSigning" = $ExcludeFromSigning
}
# Move dlls resurses into folder
#Remove-Item -Path "$TargetDir\libs" -Recurse -ErrorAction Ignore
#New-Item -ItemType "directory" -Force -Path $TargetDir -Name "libs"
#Move-Item -Path "$TargetDir\*.dll" -Destination "$TargetDir\libs" -force
& "$PSScriptRoot\copy_puttyng.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir
& "$PSScriptRoot\copy_themes.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir
& "$PSScriptRoot\copy_tiles.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir
& "$PSScriptRoot\sphinx_docs.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir
###
# Move lang resurses into folder
#Remove-Item -Path "$TargetDir\languages" -Recurse -ErrorAction Ignore
#New-Item -ItemType "directory" -Force -Path $TargetDir -Name "languages"
#"cs-CZ,de,el,en-US,es-AR,es,fr,hu,it,lt,ja-JP,ko-KR,nb-NO,nl,pt,pt-BR,pl,ru,uk,tr-TR,zh-CN,zh-TW,fi-FI".Split(",") | ForEach {
# Move-Item -Path "$TargetDir\$_" -Destination "$TargetDir\languages" -force
# }
###
& "$PSScriptRoot\set_LargeAddressAware.ps1" -TargetDir $TargetDir -TargetFileName $TargetFileName
& "$PSScriptRoot\verify_LargeAddressAware.ps1" -TargetDir $TargetDir -TargetFileName $TargetFileName
& "$PSScriptRoot\tidy_files_for_release.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName
& "$PSScriptRoot\sign_binaries.ps1" -TargetDir $TargetDir -CertificatePath $CertificatePath -CertificatePassword $CertificatePassword -ConfigurationName $ConfigurationName -Exclude $ExcludeFromSigning -SolutionDir $SolutionDir
& "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName -CertificatePath $CertificatePath -SolutionDir $SolutionDir
& "$PSScriptRoot\zip_symbols.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -ConfigurationName $ConfigurationName
& "$PSScriptRoot\zip_portable_files.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -ConfigurationName $ConfigurationName
& "$PSScriptRoot\zip_files.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -ConfigurationName $ConfigurationName

View File

@@ -0,0 +1,13 @@
param (
[string]
$SolutionDir
)
$targetVersionedFile = "$SolutionDir\mRemoteNG\bin\x64\Release\mRemoteNG.exe"
$version = &"$SolutionDir\Tools\exes\sigcheck.exe" /accepteula -q -n $targetVersionedFile
$src = $SolutionDir + "mRemoteNGInstaller\Installer\bin\Release\en-US\mRemoteNG-Installer.msi"
$dst = $SolutionDir + "mRemoteNG\bin\x64\Release\mRemoteNG-Installer-" + $version + ".msi"
# Copy file
Copy-Item $src -Destination $dst -Force

View File

@@ -1,29 +0,0 @@
param (
[string]
$SolutionDir
)
$renameTarget = $SolutionDir + "InstallerProjects\Installer\bin\Release\en-US\mRemoteNG-Installer.msi"
Write-Host $SolutionDir
Write-Host $renameTarget
$targetVersionedFile = "$SolutionDir\mRemoteNG\bin\Release\mRemoteNG.exe"
$version = &"$SolutionDir\Tools\exes\sigcheck.exe" /accepteula -q -n $targetVersionedFile
$renameTargetFileObject = Get-Item -Path $renameTarget -ErrorAction SilentlyContinue
if ($renameTargetFileObject)
{
# Build the new file name
$oldFileName = $renameTargetFileObject.Name
$newFileName = $oldFileName -replace "$("\"+$renameTargetFileObject.Extension)",$("-"+$version+$renameTargetFileObject.Extension)
Write-Host $oldFileName
Write-Host $newFileName
# Delete any items that already exist with the new name (effectively an overwrite)
Remove-Item -Path "$($renameTargetFileObject.Directory.FullName)\$newFileName" -ErrorAction SilentlyContinue
# Rename file
Rename-Item -Path $renameTarget -NewName $newFileName -ErrorAction SilentlyContinue
}

View File

@@ -1,33 +0,0 @@
param (
[string]
[Parameter(Mandatory=$true)]
$SolutionDir,
[string]
[Parameter(Mandatory=$true)]
$TargetDir
)
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
Write-Output "Building HTML-Documentation with Sphinx"
$path_HelpFilesDir = Join-Path -Path $TargetDir -ChildPath "Help"
$path_SphinxSourceDir = Join-Path -Path $SolutionDir -ChildPath "mRemoteNG\Documentation"
# Remove stale Help files, if they exist
if (Test-Path -Path $path_HelpFilesDir) {
Remove-Item -Path $path_HelpFilesDir -Recurse -Force
}
# Build docs
sphinx-build $path_SphinxSourceDir $path_HelpFilesDir
# Place dummy html file if build failed
if (-Not (Test-Path $path_HelpFilesDir\index.html -PathType Leaf)) {
New-Item -Path $path_HelpFilesDir -ItemType "directory"
New-Item $path_HelpFilesDir\index.html
Set-Content $path_HelpFilesDir\index.html 'Welcome to mRemoteNG!'
}
Write-Output ""

View File

@@ -7,15 +7,15 @@ param (
[Parameter(Mandatory=$true)]
$ConfigurationName
)
Write-Output ""
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
# Remove unnecessary files from Release versions
if ($ConfigurationName -match "Release") {
Write-Output "Removing unnecessary files from Release versions"
if ($ConfigurationName -match "Release")
{
$test = Join-Path -Path $TargetDir -ChildPath "app.publish"
if (Test-Path $test -PathType Container) {
if (Test-Path $test -PathType Container)
{
Remove-Item -Path (Join-Path -Path $TargetDir -ChildPath "app.publish") -Recurse -Force
}
@@ -29,10 +29,18 @@ if ($ConfigurationName -match "Release") {
) -Exclude @(
"mRemoteNG.VisualElementsManifest.xml"
)
Remove-Item -Path $filesToDelete.FullName
Write-Output $filesToDelete.FullName
if ($filesToDelete)
{
Write-Output "Unnecessary files are detected and will be removed"
Remove-Item -Path $filesToDelete.FullName
Write-Output $filesToDelete.FullName
} else
{
Write-Output " No unnecessary files are detected"
}
}
else {
else
{
Write-Output "We will not remove anything - this is not a release build."
}

View File

@@ -20,6 +20,7 @@ param (
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
# validate release versions and if the certificate value was passed
if ($ConfigurationName -match "Release" -And ($CertificatePath)) {

83
Tools/zip_files.ps1 Normal file
View File

@@ -0,0 +1,83 @@
param (
[string]
[Parameter(Mandatory=$true)]
$SolutionDir,
[string]
[Parameter(Mandatory=$true)]
$TargetDir,
[string]
[Parameter(Mandatory=$true)]
$ConfigurationName
)
Write-Output ""
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
$ConfigurationName = $ConfigurationName.Trim()
Write-Output "Config Name (trimmed): '$($ConfigurationName)'"
$exe = Join-Path -Path $TargetDir -ChildPath $TargetFileName
$Version = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($exe).FileVersion
Write-Output "Version is $($version)"
# Fix for AppVeyor
if(!([string]::IsNullOrEmpty($Env:APPVEYOR_BUILD_FOLDER))) {
if(!(test-path "Release")) {
New-Item -ItemType Directory -Force -Path "Release" | Out-Null
}
}
# Package debug symbols zip file
if ($ConfigurationName -match "Release") {
Write-Output "Packaging debug symbols"
if ($ConfigurationName -match "Portable") {
$zipFilePrefix = "mRemoteNG-Portable-symbols"
} else {
$zipFilePrefix = "mRemoteNG-symbols"
}
$debugFile = Join-Path -Path $TargetDir -ChildPath "mRemoteNG.pdb"
# AppVeyor build
if(!([string]::IsNullOrEmpty($Env:APPVEYOR_BUILD_FOLDER))) {
$outputZipPath = Join-Path -Path $SolutionDir -ChildPath "Release\$zipFilePrefix-$($version).zip"
7z a $outputZipPath $debugFile
}
# Local build
else {
if (!(Test-Path -Path $debugFile -PathType Leaf))
{
$outputZipPath = "$($SolutionDir)Release\$zipFilePrefix-$($version).zip"
Compress-Archive $debugFile $outputZipPath -Force
} else {
write-host "File do not exist:" $debugFile", nothing to compress"
}
}
Remove-Item $debugFile
}
# Package portable release zip file
if ($ConfigurationName -eq "Release Portable") {
Write-Output "Packaging portable ZIP file"
# AppVeyor build
if(!([string]::IsNullOrEmpty($Env:APPVEYOR_BUILD_FOLDER))) {
$outputZipPath = Join-Path -Path $SolutionDir -ChildPath "Release\mRemoteNG-Portable-$($version).zip"
7z a -bt -bd -bb1 -mx=9 -tzip -y -r $outputZipPath $TargetDir\*
}
# Local build
else {
if ($Source)
{
$outputZipPath="$($SolutionDir)\Release\mRemoteNG-Portable-$($version).zip"
Compress-Archive $Source $outputZipPath -Force
} else {
write-host "File do not exist:" $Source", nothing to compress"
}
}
}
Write-Output ""

View File

@@ -1,64 +0,0 @@
param (
[string]
[Parameter(Mandatory=$true)]
$SolutionDir,
[string]
[Parameter(Mandatory=$true)]
$TargetDir,
[string]
[Parameter(Mandatory=$true)]
$ConfigurationName
)
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
if(-not [string]::IsNullOrEmpty($Env:APPVEYOR_BUILD_FOLDER)) {
Write-Output "Too early to run via Appveyor - artifacts don't get generated properly. Exiting"
Exit
}
Write-Output "Solution Dir: '$($SolutionDir)'"
Write-Output "Target Dir: '$($TargetDir)'"
$ConfigurationName = $ConfigurationName.Trim()
Write-Output "Config Name (tirmmed): '$($ConfigurationName)'"
# Windows Sysinternals Sigcheck from http://technet.microsoft.com/en-us/sysinternals/bb897441
$SIGCHECK="$($SolutionDir)Tools\exes\sigcheck.exe"
$SEVENZIP="$($SolutionDir)Tools\7zip\7za.exe"
# Package Zip
if ($ConfigurationName -eq "Release Portable") {
Write-Output "Packaging Release Portable ZIP"
$version = & $SIGCHECK /accepteula -q -n "$($SolutionDir)mRemoteNG\bin\$($ConfigurationName)\mRemoteNG.exe"
Write-Output "Version is $($version)"
$PortableZip="$($SolutionDir)Release\mRemoteNG-Portable-$($version).zip"
$tempFolderPath = Join-Path -Path $SolutionDir -ChildPath "mRemoteNG\bin\package"
Remove-Item -Recurse $tempFolderPath -ErrorAction SilentlyContinue | Out-Null
New-Item $tempFolderPath -ItemType "directory" | Out-Null
Copy-Item "$($SolutionDir)mRemoteNG\Resources\PuTTYNG.exe" -Destination $tempFolderPath
#Write-Output "$($SolutionDir)mRemoteNG\bin\$ConfigurationName"
#Write-Output "$($SolutionDir)mRemoteNG\bin\package"
Copy-Item "$($SolutionDir)mRemoteNG\bin\$ConfigurationName\*" -Destination $tempFolderPath -Recurse -Force
# Delete any PDB files that accidentally get copied into the temp folder
Get-ChildItem -Path $tempFolderPath -Filter "*.pdb" | Remove-Item
Copy-Item "$($SolutionDir)*.txt" -Destination $tempFolderPath
Write-Output "Creating portable ZIP file $($PortableZip)"
Remove-Item -Force $PortableZip -ErrorAction SilentlyContinue
& $SEVENZIP a -bt -bd -bb1 -mx=9 -tzip -y -r $PortableZip (Join-Path -Path $tempFolderPath -ChildPath "*.*")
#& $SEVENZIP a -bt -mx=9 -tzip -y $PortableZip "$($SolutionDir)*.TXT"
}
else {
Write-Output "We will not zip anything - this isnt a portable release build."
}
Write-Output ""

View File

@@ -1,56 +0,0 @@
param (
[string]
[Parameter(Mandatory=$true)]
$SolutionDir,
[string]
[Parameter(Mandatory=$true)]
$TargetDir,
[string]
[Parameter(Mandatory=$true)]
$ConfigurationName
)
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
if(-not [string]::IsNullOrEmpty($Env:APPVEYOR_BUILD_FOLDER)) {
Write-Output "Too early to run via Appveyor - artifacts don't get generated properly. Exiting"
Exit
}
Write-Output "Solution Dir: '$($SolutionDir)'"
Write-Output "Target Dir: '$($TargetDir)'"
$ConfigurationName = $ConfigurationName.Trim()
Write-Output "Config Name (trimmed): '$($ConfigurationName)'"
# Windows Sysinternals Sigcheck from http://technet.microsoft.com/en-us/sysinternals/bb897441
$SIGCHECK="$($SolutionDir)Tools\exes\sigcheck.exe"
$SEVENZIP="$($SolutionDir)Tools\7zip\7za.exe"
# Package Zip
if ($ConfigurationName -match "Release") {
Write-Output "Packaging debug symbols"
$version = & $SIGCHECK /accepteula -q -n "$($SolutionDir)mRemoteNG\bin\$($ConfigurationName)\mRemoteNG.exe"
Write-Output "Version is $($version)"
if ($ConfigurationName -match "Portable") {
$zipFilePrefix = "mRemoteNG-Portable-symbols"
} else {
$zipFilePrefix = "mRemoteNG-symbols"
}
$outputZipPath="$($SolutionDir)Release\$zipFilePrefix-$($version).zip"
Write-Output "Creating debug symbols ZIP file $($outputZipPath)"
Remove-Item -Force $outputZipPath -ErrorAction SilentlyContinue
& $SEVENZIP a -bt -bd -bb1 -mx=9 -tzip -y -r $outputZipPath (Join-Path -Path $TargetDir -ChildPath "*.pdb")
}
else {
Write-Output "We will not package debug symbols - this isnt a release build."
}
Write-Output ""

View File

@@ -1,11 +1,11 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.28803.352
# Visual Studio Version 17
VisualStudioVersion = 17.0.31912.275
MinimumVisualStudioVersion = 14.0.25420.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mRemoteNG", "mRemoteNG\mRemoteNG.csproj", "{4934A491-40BC-4E5B-9166-EA1169A220F6}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mRemoteNG", "mRemoteNG\mRemoteNG.csproj", "{4934A491-40BC-4E5B-9166-EA1169A220F6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mRemoteNGTests", "mRemoteNGTests\mRemoteNGTests.csproj", "{1453B37F-8621-499E-B0B2-6091F76DC0BB}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mRemoteNGTests", "mRemoteNGTests\mRemoteNGTests.csproj", "{1453B37F-8621-499E-B0B2-6091F76DC0BB}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "mRemoteNGInstaller", "mRemoteNGInstaller", "{4FE795BE-646E-4F1B-BAD0-A68EA26394DD}"
EndProject
@@ -16,108 +16,63 @@ Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Installer", "mRemoteNGInsta
{5423D985-CB48-4344-B47F-E8C6D60C8B04} = {5423D985-CB48-4344-B47F-E8C6D60C8B04}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mRemoteNGSpecs", "mRemoteNGSpecs\mRemoteNGSpecs.csproj", "{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mRemoteNGSpecs", "mRemoteNGSpecs\mRemoteNGSpecs.csproj", "{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExternalConnectors", "ExternalConnectors\ExternalConnectors.csproj", "{A56A2029-79B8-492A-ABE5-D2BFE05801BD}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug Portable|Any CPU = Debug Portable|Any CPU
Debug Portable|x86 = Debug Portable|x86
Debug|Any CPU = Debug|Any CPU
Debug|x86 = Debug|x86
Release Installer|Any CPU = Release Installer|Any CPU
Release Installer|x86 = Release Installer|x86
Release Portable|Any CPU = Release Portable|Any CPU
Release Portable|x86 = Release Portable|x86
Release|Any CPU = Release|Any CPU
Release|x86 = Release|x86
Debug Portable|x64 = Debug Portable|x64
Debug|x64 = Debug|x64
Release Installer|x64 = Release Installer|x64
Release Portable|x64 = Release Portable|x64
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug Portable|Any CPU.ActiveCfg = Debug Portable|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug Portable|Any CPU.Build.0 = Debug Portable|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug Portable|x86.ActiveCfg = Debug Portable|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug Portable|x86.Build.0 = Debug Portable|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug|Any CPU.ActiveCfg = Debug|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug|Any CPU.Build.0 = Debug|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug|x86.ActiveCfg = Debug|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug|x86.Build.0 = Debug|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer|Any CPU.ActiveCfg = Release|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer|Any CPU.Build.0 = Release|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer|x86.ActiveCfg = Release|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer|x86.Build.0 = Release|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|Any CPU.ActiveCfg = Release Portable|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|Any CPU.Build.0 = Release Portable|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|x86.ActiveCfg = Release Portable|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|x86.Build.0 = Release Portable|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|Any CPU.ActiveCfg = Release|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|Any CPU.Build.0 = Release|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|x86.ActiveCfg = Release|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|x86.Build.0 = Release|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|Any CPU.ActiveCfg = Debug Portable|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|Any CPU.Build.0 = Debug Portable|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|x86.ActiveCfg = Debug Portable|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|x86.Build.0 = Debug Portable|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug|Any CPU.ActiveCfg = Debug|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug|Any CPU.Build.0 = Debug|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug|x86.ActiveCfg = Debug|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug|x86.Build.0 = Debug|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Installer|Any CPU.ActiveCfg = Release|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Installer|Any CPU.Build.0 = Release|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Installer|x86.ActiveCfg = Release|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Installer|x86.Build.0 = Release|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|Any CPU.ActiveCfg = Release Portable|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|Any CPU.Build.0 = Release Portable|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x86.ActiveCfg = Release Portable|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x86.Build.0 = Release Portable|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|Any CPU.ActiveCfg = Release|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|Any CPU.Build.0 = Release|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|x86.ActiveCfg = Release|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|x86.Build.0 = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug Portable|Any CPU.ActiveCfg = Debug|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug Portable|Any CPU.Build.0 = Debug|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug Portable|x86.ActiveCfg = Debug|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug|Any CPU.ActiveCfg = Debug|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug|x86.ActiveCfg = Debug|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug|x86.Build.0 = Debug|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Installer|Any CPU.ActiveCfg = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Installer|Any CPU.Build.0 = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Installer|x86.ActiveCfg = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Installer|x86.Build.0 = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Portable|Any CPU.ActiveCfg = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Portable|x86.ActiveCfg = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release|Any CPU.ActiveCfg = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release|Any CPU.Build.0 = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release|x86.ActiveCfg = Release|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug Portable|Any CPU.ActiveCfg = Debug Portable|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug Portable|Any CPU.Build.0 = Debug Portable|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug Portable|x86.ActiveCfg = Debug Portable|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug|Any CPU.ActiveCfg = Debug|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug|x86.ActiveCfg = Debug|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Installer|Any CPU.ActiveCfg = Release|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Installer|Any CPU.Build.0 = Release|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Installer|x86.ActiveCfg = Release|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Installer|x86.Build.0 = Release|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Portable|Any CPU.ActiveCfg = Release Portable|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Portable|x86.ActiveCfg = Release Portable|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release|Any CPU.ActiveCfg = Release|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release|x86.ActiveCfg = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug Portable|Any CPU.ActiveCfg = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug Portable|Any CPU.Build.0 = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug Portable|x86.ActiveCfg = Debug|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug Portable|x86.Build.0 = Debug|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug|Any CPU.ActiveCfg = Debug|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug|x86.ActiveCfg = Debug|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug|x86.Build.0 = Debug|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Installer|Any CPU.ActiveCfg = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Installer|Any CPU.Build.0 = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Installer|x86.ActiveCfg = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Installer|x86.Build.0 = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Portable|Any CPU.ActiveCfg = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Portable|Any CPU.Build.0 = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Portable|x86.ActiveCfg = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Portable|x86.Build.0 = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release|Any CPU.ActiveCfg = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release|x86.ActiveCfg = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release|x86.Build.0 = Release|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug Portable|x64.Build.0 = Debug Portable|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug|x64.ActiveCfg = Debug|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug|x64.Build.0 = Debug|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer|x64.ActiveCfg = Release|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer|x64.Build.0 = Release|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|x64.ActiveCfg = Release Portable|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|x64.Build.0 = Release Portable|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|x64.ActiveCfg = Release|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|x64.Build.0 = Release|x64
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug|x64.ActiveCfg = Debug|x64
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Installer|x64.ActiveCfg = Release|x64
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x64.ActiveCfg = Release Portable|x64
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x64.Build.0 = Release Portable|x64
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|x64.ActiveCfg = Release|x64
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|x64.Build.0 = Release|x64
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug|x64.ActiveCfg = Debug|x64
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Installer|x64.ActiveCfg = Release|x64
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Installer|x64.Build.0 = Release|x64
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Portable|x64.ActiveCfg = Release Portable|x64
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release|x64.ActiveCfg = Release|x64
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug|x64.ActiveCfg = Debug|x64
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Installer|x64.ActiveCfg = Release|x64
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Installer|x64.Build.0 = Release|x64
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Portable|x64.ActiveCfg = Release Portable|x64
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release|x64.ActiveCfg = Release|x64
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug|x64.ActiveCfg = Debug|x64
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Installer|x64.ActiveCfg = Release|x64
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Portable|x64.ActiveCfg = Release Portable|x64
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release|x64.ActiveCfg = Release|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Debug Portable|x64.Build.0 = Debug Portable|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Debug|x64.ActiveCfg = Debug|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Debug|x64.Build.0 = Debug|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Installer|x64.ActiveCfg = Release|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Installer|x64.Build.0 = Release|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Portable|x64.ActiveCfg = Release Portable|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Portable|x64.Build.0 = Release Portable|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release|x64.ActiveCfg = Release|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@@ -5,9 +5,9 @@ using Microsoft.Win32;
using mRemoteNG.App.Info;
using mRemoteNG.Messages;
using mRemoteNG.Properties;
using mRemoteNG.Resources.Language;
using mRemoteNG.UI.Forms;
using mRemoteNG.UI.TaskDialog;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.App
{

View File

@@ -6,8 +6,8 @@ using mRemoteNG.Config.Import;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Container;
using mRemoteNG.Resources.Language;
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.App
{

View File

@@ -1,10 +1,12 @@
namespace mRemoteNG.App.Info
using System;
namespace mRemoteNG.App.Info
{
public static class ConnectionsFileInfo
{
public static readonly string DefaultConnectionsPath = SettingsFileInfo.SettingsPath;
public static readonly string DefaultConnectionsFile = "confCons.xml";
public static readonly string DefaultConnectionsFileNew = "confConsNew.xml";
public static readonly double ConnectionFileVersion = 2.8;
public static readonly Version ConnectionFileVersion = new Version(2, 9);
}
}

View File

@@ -15,6 +15,7 @@ namespace mRemoteNG.App.Info
public const string UrlDonate = "https://mremoteng.org/contribute";
public const string UrlForum = "https://www.reddit.com/r/mRemoteNG";
public const string UrlBugs = "https://bugs.mremoteng.org";
public const string UrlDocumentation = "https://mremoteng.readthedocs.io/en/latest/";
public static string ApplicationVersion = Application.ProductVersion;
public static readonly string ProductName = Application.ProductName;

View File

@@ -8,17 +8,16 @@ namespace mRemoteNG.App.Info
public static class UpdateChannelInfo
{
public const string STABLE = "Stable";
public const string BETA = "Beta";
public const string DEV = "Development";
public const string PREVIEW = "Preview";
public const string NIGHTLY = "Nightly";
/* no #if here since they are used for unit tests as well */
public const string STABLE_PORTABLE = "update-portable.txt";
public const string BETA_PORTABLE = "beta-update-portable.txt";
public const string DEV_PORTABLE = "dev-update-portable.txt";
public const string PREVIEW_PORTABLE = "preview-update-portable.txt";
public const string NIGHTLY_PORTABLE = "nightly-update-portable.txt";
public const string STABLE_MSI = "update.txt";
public const string BETA_MSI = "beta-update.txt";
public const string DEV_MSI = "dev-update.txt";
public const string PREVIEW_MSI = "preview-update.txt";
public const string NIGHTLY_MSI = "nightly-update.txt";
public static Uri GetUpdateChannelInfo()
@@ -40,10 +39,10 @@ namespace mRemoteNG.App.Info
{
case STABLE:
return STABLE_MSI;
case BETA:
return BETA_MSI;
case DEV:
return DEV_MSI;
case PREVIEW:
return PREVIEW_MSI;
case NIGHTLY:
return NIGHTLY_MSI;
default:
return STABLE_MSI;
}
@@ -55,10 +54,10 @@ namespace mRemoteNG.App.Info
{
case STABLE:
return STABLE_PORTABLE;
case BETA:
return BETA_PORTABLE;
case DEV:
return DEV_PORTABLE;
case PREVIEW:
return PREVIEW_PORTABLE;
case NIGHTLY:
return NIGHTLY_PORTABLE;
default:
return STABLE_PORTABLE;
}
@@ -72,7 +71,7 @@ namespace mRemoteNG.App.Info
private static bool IsValidChannel(string s)
{
return s.Equals(STABLE) || s.Equals(BETA) || s.Equals(DEV);
return s.Equals(STABLE) || s.Equals(PREVIEW) || s.Equals(NIGHTLY);
}
}
}

View File

@@ -1,5 +1,6 @@
using System;
using System;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using log4net;
using log4net.Appender;
@@ -35,6 +36,7 @@ namespace mRemoteNG.App
public void SetLogPath(string path)
{
var repository = LogManager.GetRepository("mRemoteNG");
XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));
var appenders = repository.GetAppenders();
foreach (var appender in appenders)

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Drawing;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
@@ -71,6 +71,12 @@ namespace mRemoteNG.App
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool ChangeClipboardChain(
IntPtr hWndRemove, // handle to window to remove
IntPtr hWndNewNext // handle to next window
);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern bool SetForegroundWindow(IntPtr hWnd);
@@ -106,7 +112,6 @@ namespace mRemoteNG.App
internal static extern bool SetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
[DllImport("kernel32", SetLastError = true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
internal static extern bool CloseHandle(IntPtr handle);
#endregion

View File

@@ -102,6 +102,10 @@ namespace mRemoteNG.App
if (Settings.Default.UseSQLServer)
{
ConnectionsService.LastSqlUpdate = DateTime.Now;
}
else
{
ConnectionsService.LastFileUpdate = System.IO.File.GetLastWriteTime(connectionFileName);
}
// re-enable sql update checking after updates are loaded

View File

@@ -2,11 +2,12 @@
using System;
using System.Diagnostics;
using System.Windows.Forms;
using mRemoteNG.Config.Connections;
using mRemoteNG.Config.Putty;
using mRemoteNG.Properties;
using mRemoteNG.Resources.Language;
using mRemoteNG.UI.Controls;
using mRemoteNG.UI.Forms;
using mRemoteNG.Resources.Language;
// ReSharper disable ArrangeAccessorOwnerBody
@@ -60,8 +61,34 @@ namespace mRemoteNG.App
private static void SaveConnections()
{
if (Settings.Default.SaveConsOnExit)
DateTime lastUpdate;
DateTime updateDate;
DateTime currentDate = DateTime.Now;
//OBSOLETE: Settings.Default.SaveConsOnExit is obsolete and should be removed in a future release
if (Settings.Default.SaveConsOnExit || (Settings.Default.SaveConnectionsFrequency == (int)ConnectionsBackupFrequencyEnum.OnExit))
{
Runtime.ConnectionsService.SaveConnections();
return;
}
lastUpdate = Runtime.ConnectionsService.UsingDatabase ? Runtime.ConnectionsService.LastSqlUpdate : Runtime.ConnectionsService.LastFileUpdate;
switch (Settings.Default.SaveConnectionsFrequency)
{
case (int)ConnectionsBackupFrequencyEnum.Daily:
updateDate = lastUpdate.AddDays(1);
break;
case (int)ConnectionsBackupFrequencyEnum.Weekly:
updateDate = lastUpdate.AddDays(7);
break;
default:
return;
}
if (currentDate >= updateDate)
{
Runtime.ConnectionsService.SaveConnections();
}
}
private static void SaveSettings(Control quickConnectToolStrip,
@@ -93,7 +120,7 @@ namespace mRemoteNG.App
private static void RunUpdateFile()
{
if (UpdatePending)
Process.Start(_updateFilePath);
Process.Start(new ProcessStartInfo(_updateFilePath) { UseShellExecute = true });
}
}
}

View File

@@ -2,6 +2,7 @@
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.Threading.Tasks;
using mRemoteNG.App.Info;
using mRemoteNG.App.Initialization;
using mRemoteNG.App.Update;
@@ -65,7 +66,7 @@ namespace mRemoteNG.App
Runtime.ConnectionsService.RemoteConnectionsSyncronizer.Enable();
}
public void CheckForUpdate()
public async Task CheckForUpdate()
{
if (_appUpdate == null)
{
@@ -87,32 +88,9 @@ namespace mRemoteNG.App
return;
}
_appUpdate.GetUpdateInfoCompletedEvent += GetUpdateInfoCompleted;
_appUpdate.GetUpdateInfoAsync();
}
private void GetUpdateInfoCompleted(object sender, AsyncCompletedEventArgs e)
{
if (_frmMain.InvokeRequired)
{
_frmMain.Invoke(new AsyncCompletedEventHandler(GetUpdateInfoCompleted), sender, e);
return;
}
try
{
_appUpdate.GetUpdateInfoCompletedEvent -= GetUpdateInfoCompleted;
if (e.Cancelled)
{
return;
}
if (e.Error != null)
{
throw e.Error;
}
await _appUpdate.GetUpdateInfoAsync();
if (_appUpdate.IsUpdateAvailable())
{
Windows.Show(WindowType.Update);
@@ -120,7 +98,7 @@ namespace mRemoteNG.App
}
catch (Exception ex)
{
Runtime.MessageCollector.AddExceptionMessage("GetUpdateInfoCompleted() failed.", ex);
Runtime.MessageCollector.AddExceptionMessage("CheckForUpdate() failed.", ex);
}
}
}

View File

@@ -1,12 +1,12 @@
using System;
using System.IO;
using System.Net;
using System.ComponentModel;
using System.Net.Http;
using System.Threading;
using System.Reflection;
using mRemoteNG.App.Info;
using mRemoteNG.Security.SymmetricEncryption;
using System.Security.Cryptography;
using System.Threading.Tasks;
using mRemoteNG.Properties;
#if !PORTABLE
using mRemoteNG.Tools;
@@ -21,29 +21,30 @@ namespace mRemoteNG.App.Update
{
public class AppUpdater
{
private const int _bufferLength = 8192;
private WebProxy _webProxy;
private Thread _getUpdateInfoThread;
private Thread _getChangeLogThread;
private HttpClient _httpClient;
private CancellationTokenSource _changeLogCancelToken;
private CancellationTokenSource _getUpdateInfoCancelToken;
#region Public Properties
public UpdateInfo CurrentUpdateInfo { get; private set; }
public string ChangeLog { get; private set; }
public bool IsGetUpdateInfoRunning
{
get { return _getUpdateInfoThread != null && _getUpdateInfoThread.IsAlive; }
get
{
return _getUpdateInfoCancelToken != null;
}
}
private bool IsGetChangeLogRunning
{
get { return _getChangeLogThread != null && _getChangeLogThread.IsAlive; }
}
public bool IsDownloadUpdateRunning
{
get { return _downloadUpdateWebClient != null; }
get
{
return _changeLogCancelToken != null;
}
}
#endregion
@@ -52,10 +53,10 @@ namespace mRemoteNG.App.Update
public AppUpdater()
{
SetProxySettings();
SetDefaultProxySettings();
}
private void SetProxySettings()
private void SetDefaultProxySettings()
{
var shouldWeUseProxy = Settings.Default.UpdateUseProxy;
var proxyAddress = Settings.Default.UpdateProxyAddress;
@@ -78,13 +79,14 @@ namespace mRemoteNG.App.Update
if (useProxy && !string.IsNullOrEmpty(address))
{
_webProxy = port != 0 ? new WebProxy(address, port) : new WebProxy(address);
_webProxy.Credentials = useAuthentication ? new NetworkCredential(username, password) : null;
}
else
{
_webProxy = null;
}
UpdateHttpClient();
}
public bool IsUpdateAvailable()
@@ -96,54 +98,24 @@ namespace mRemoteNG.App.Update
return CurrentUpdateInfo.Version > GeneralAppInfo.GetApplicationVersion();
}
public void GetUpdateInfoAsync()
public async Task DownloadUpdateAsync(IProgress<int> progress)
{
if (IsGetUpdateInfoRunning)
{
_getUpdateInfoThread.Abort();
}
_getUpdateInfoCancelToken.Cancel();
_getUpdateInfoCancelToken.Dispose();
_getUpdateInfoCancelToken = null;
_getUpdateInfoThread = new Thread(GetUpdateInfo);
_getUpdateInfoThread.SetApartmentState(ApartmentState.STA);
_getUpdateInfoThread.IsBackground = true;
_getUpdateInfoThread.Start();
}
public void GetChangeLogAsync()
{
if (CurrentUpdateInfo == null || !CurrentUpdateInfo.IsValid)
{
throw new InvalidOperationException(
"CurrentUpdateInfo is not valid. GetUpdateInfoAsync() must be called before calling GetChangeLogAsync().");
}
if (IsGetChangeLogRunning)
{
_getChangeLogThread.Abort();
}
_getChangeLogThread = new Thread(GetChangeLog);
_getChangeLogThread.SetApartmentState(ApartmentState.STA);
_getChangeLogThread.IsBackground = true;
_getChangeLogThread.Start();
}
public void DownloadUpdateAsync()
{
if (_downloadUpdateWebClient != null)
{
throw new InvalidOperationException("A previous call to DownloadUpdateAsync() is still in progress.");
}
if (CurrentUpdateInfo == null || !CurrentUpdateInfo.IsValid)
{
throw new InvalidOperationException(
"CurrentUpdateInfo is not valid. GetUpdateInfoAsync() must be called before calling DownloadUpdateAsync().");
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(), "msi"));
CurrentUpdateInfo.UpdateFilePath = Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Path.GetRandomFileName(), "msi"));
#else
var sfd = new SaveFileDialog
{
@@ -160,135 +132,38 @@ namespace mRemoteNG.App.Update
return;
}
#endif
DownloadUpdateWebClient.DownloadFileAsync(CurrentUpdateInfo.DownloadAddress,
CurrentUpdateInfo.UpdateFilePath);
}
#endregion
#region Private Properties
private WebClient _downloadUpdateWebClient;
private WebClient DownloadUpdateWebClient
{
get
{
if (_downloadUpdateWebClient != null)
{
return _downloadUpdateWebClient;
}
_downloadUpdateWebClient = CreateWebClient();
_downloadUpdateWebClient.DownloadProgressChanged += DownloadUpdateProgressChanged;
_downloadUpdateWebClient.DownloadFileCompleted += DownloadUpdateCompleted;
return _downloadUpdateWebClient;
}
}
#endregion
#region Private Methods
private WebClient CreateWebClient()
{
var webClient = new WebClient();
webClient.Headers.Add("user-agent", GeneralAppInfo.UserAgent);
webClient.Proxy = _webProxy;
return webClient;
}
private static DownloadStringCompletedEventArgs NewDownloadStringCompletedEventArgs(string result,
Exception exception,
bool cancelled,
object userToken)
{
var type = typeof(DownloadStringCompletedEventArgs);
const BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Instance;
Type[] argumentTypes = {typeof(string), typeof(Exception), typeof(bool), typeof(object)};
var constructor = type.GetConstructor(bindingFlags, null, argumentTypes, null);
object[] arguments = {result, exception, cancelled, userToken};
if (constructor == null)
return null;
return (DownloadStringCompletedEventArgs)constructor.Invoke(arguments);
}
private DownloadStringCompletedEventArgs DownloadString(Uri address)
{
var webClient = CreateWebClient();
var result = string.Empty;
Exception exception = null;
var cancelled = false;
try
{
result = webClient.DownloadString(address);
}
catch (ThreadAbortException)
{
cancelled = true;
}
catch (Exception ex)
{
exception = ex;
}
_getUpdateInfoCancelToken = new CancellationTokenSource();
using var response = await _httpClient.GetAsync(CurrentUpdateInfo.DownloadAddress, HttpCompletionOption.ResponseHeadersRead, _getUpdateInfoCancelToken.Token);
var buffer = new byte[_bufferLength];
var totalBytes = response.Content.Headers.ContentLength ?? 0;
var readBytes = 0L;
return NewDownloadStringCompletedEventArgs(result, exception, cancelled, null);
}
private void GetUpdateInfo()
{
var e = DownloadString(UpdateChannelInfo.GetUpdateChannelInfo());
if (!e.Cancelled && e.Error == null)
{
try
await using (var httpStream = await response.Content.ReadAsStreamAsync(_getUpdateInfoCancelToken.Token))
{
CurrentUpdateInfo = UpdateInfo.FromString(e.Result);
await using var fileStream = new FileStream(CurrentUpdateInfo.UpdateFilePath, FileMode.Create,
FileAccess.Write, FileShare.None, _bufferLength, true);
Settings.Default.CheckForUpdatesLastCheck = DateTime.UtcNow;
if (!Settings.Default.UpdatePending)
while (readBytes <= totalBytes || !_getUpdateInfoCancelToken.IsCancellationRequested)
{
Settings.Default.UpdatePending = IsUpdateAvailable();
var bytesRead =
await httpStream.ReadAsync(buffer, 0, _bufferLength, _getUpdateInfoCancelToken.Token);
if (bytesRead == 0)
{
progress.Report(100);
break;
}
await fileStream.WriteAsync(buffer, 0, bytesRead, _getUpdateInfoCancelToken.Token);
readBytes += bytesRead;
var percentComplete = (int)(readBytes * 100 / totalBytes);
progress.Report(percentComplete);
}
}
catch (Exception ex)
{
e = NewDownloadStringCompletedEventArgs(e.Result, ex, e.Cancelled, null);
}
}
GetUpdateInfoCompletedEventEvent?.Invoke(this, e);
}
private void GetChangeLog()
{
var e = DownloadString(CurrentUpdateInfo.ChangeLogAddress);
if (!e.Cancelled && e.Error == null)
{
ChangeLog = e.Result;
}
GetChangeLogCompletedEventEvent?.Invoke(this, e);
}
private void DownloadUpdateProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
DownloadUpdateProgressChangedEventEvent?.Invoke(sender, e);
}
private void DownloadUpdateCompleted(object sender, AsyncCompletedEventArgs e)
{
var raiseEventArgs = e;
if (!e.Cancelled && e.Error == null)
{
try
{
#if !PORTABLE
var updateAuthenticode = new Authenticode(CurrentUpdateInfo.UpdateFilePath)
{
@@ -307,101 +182,85 @@ namespace mRemoteNG.App.Update
}
#endif
using (var cksum = SHA512.Create())
{
using (var stream = File.OpenRead(CurrentUpdateInfo.UpdateFilePath))
{
var hash = cksum.ComputeHash(stream);
var hashString = BitConverter.ToString(hash).Replace("-", "").ToUpperInvariant();
if (!hashString.Equals(CurrentUpdateInfo.Checksum))
throw new Exception("SHA512 Hashes didn't match!");
}
}
}
catch (Exception ex)
{
raiseEventArgs = new AsyncCompletedEventArgs(ex, false, null);
}
using var checksum = SHA512.Create();
await using var stream = File.OpenRead(CurrentUpdateInfo.UpdateFilePath);
var hash = await checksum.ComputeHashAsync(stream);
var hashString = BitConverter.ToString(hash).Replace("-", "").ToUpperInvariant();
if (!hashString.Equals(CurrentUpdateInfo.Checksum))
throw new Exception("SHA512 Hashes didn't match!");
} finally{
_getUpdateInfoCancelToken?.Dispose();
_getUpdateInfoCancelToken = null;
}
if (raiseEventArgs.Cancelled || raiseEventArgs.Error != null)
{
File.Delete(CurrentUpdateInfo.UpdateFilePath);
}
DownloadUpdateCompletedEventEvent?.Invoke(this, raiseEventArgs);
_downloadUpdateWebClient.Dispose();
_downloadUpdateWebClient = null;
}
#endregion
#region Events
#region Private Methods
private AsyncCompletedEventHandler GetUpdateInfoCompletedEventEvent;
public event AsyncCompletedEventHandler GetUpdateInfoCompletedEvent
private void UpdateHttpClient()
{
add
if (_httpClient != null)
{
GetUpdateInfoCompletedEventEvent =
(AsyncCompletedEventHandler)Delegate.Combine(GetUpdateInfoCompletedEventEvent, value);
_httpClient.Dispose();
}
remove
var httpClientHandler = new HttpClientHandler();
if (_webProxy != null)
{
GetUpdateInfoCompletedEventEvent =
(AsyncCompletedEventHandler)Delegate.Remove(GetUpdateInfoCompletedEventEvent, value);
httpClientHandler.UseProxy = true;
httpClientHandler.Proxy = _webProxy;
}
_httpClient = new HttpClient(httpClientHandler);
_httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(GeneralAppInfo.UserAgent);
}
public async Task GetUpdateInfoAsync()
{
if (IsGetUpdateInfoRunning)
{
_getUpdateInfoCancelToken.Cancel();
_getUpdateInfoCancelToken.Dispose();
_getUpdateInfoCancelToken = null;
}
try
{
_getUpdateInfoCancelToken = new CancellationTokenSource();
var updateInfo = await _httpClient.GetStringAsync(UpdateChannelInfo.GetUpdateChannelInfo(), _getUpdateInfoCancelToken.Token);
CurrentUpdateInfo = UpdateInfo.FromString(updateInfo);
Settings.Default.CheckForUpdatesLastCheck = DateTime.UtcNow;
if (!Settings.Default.UpdatePending)
{
Settings.Default.UpdatePending = IsUpdateAvailable();
}
}
finally
{
_getUpdateInfoCancelToken?.Dispose();
_getUpdateInfoCancelToken = null;
}
}
private AsyncCompletedEventHandler GetChangeLogCompletedEventEvent;
public event AsyncCompletedEventHandler GetChangeLogCompletedEvent
public async Task<string> GetChangeLogAsync()
{
add
if (IsGetChangeLogRunning)
{
GetChangeLogCompletedEventEvent =
(AsyncCompletedEventHandler)Delegate.Combine(GetChangeLogCompletedEventEvent, value);
_changeLogCancelToken.Cancel();
_changeLogCancelToken.Dispose();
_changeLogCancelToken = null;
}
remove
{
GetChangeLogCompletedEventEvent =
(AsyncCompletedEventHandler)Delegate.Remove(GetChangeLogCompletedEventEvent, value);
}
}
private DownloadProgressChangedEventHandler DownloadUpdateProgressChangedEventEvent;
public event DownloadProgressChangedEventHandler DownloadUpdateProgressChangedEvent
{
add
try
{
DownloadUpdateProgressChangedEventEvent =
(DownloadProgressChangedEventHandler)Delegate.Combine(DownloadUpdateProgressChangedEventEvent,
value);
_changeLogCancelToken = new CancellationTokenSource();
return await _httpClient.GetStringAsync(CurrentUpdateInfo.ChangeLogAddress, _changeLogCancelToken.Token);
}
remove
finally
{
DownloadUpdateProgressChangedEventEvent =
(DownloadProgressChangedEventHandler)Delegate.Remove(DownloadUpdateProgressChangedEventEvent,
value);
}
}
private AsyncCompletedEventHandler DownloadUpdateCompletedEventEvent;
public event AsyncCompletedEventHandler DownloadUpdateCompletedEvent
{
add
{
DownloadUpdateCompletedEventEvent =
(AsyncCompletedEventHandler)Delegate.Combine(DownloadUpdateCompletedEventEvent, value);
}
remove
{
DownloadUpdateCompletedEventEvent =
(AsyncCompletedEventHandler)Delegate.Remove(DownloadUpdateCompletedEventEvent, value);
_changeLogCancelToken?.Dispose();
_changeLogCancelToken = null;
}
}

View File

@@ -8,10 +8,8 @@ namespace mRemoteNG.App
public static class Windows
{
private static ActiveDirectoryImportWindow _adimportForm;
private static HelpWindow _helpForm;
private static ExternalToolsWindow _externalappsForm;
private static PortScanWindow _portscanForm;
private static ScreenshotManagerWindow _screenshotmanagerForm;
private static UltraVNCWindow _ultravncscForm;
private static ConnectionTreeWindow _treeForm;
@@ -23,7 +21,6 @@ namespace mRemoteNG.App
internal static ConfigWindow ConfigForm { get; set; } = new ConfigWindow();
internal static ErrorAndInfoWindow ErrorsForm { get; set; } = new ErrorAndInfoWindow();
internal static ScreenshotManagerWindow ScreenshotForm { get; set; } = new ScreenshotManagerWindow();
private static UpdateWindow UpdateForm { get; set; } = new UpdateWindow();
internal static SSHTransferWindow SshtransferForm { get; private set; } = new SSHTransferWindow();
@@ -58,11 +55,6 @@ namespace mRemoteNG.App
UpdateForm = new UpdateWindow();
UpdateForm.Show(dockPanel);
break;
case WindowType.Help:
if (_helpForm == null || _helpForm.IsDisposed)
_helpForm = new HelpWindow();
_helpForm.Show(dockPanel);
break;
case WindowType.ExternalApps:
if (_externalappsForm == null || _externalappsForm.IsDisposed)
_externalappsForm = new ExternalToolsWindow();
@@ -72,10 +64,6 @@ namespace mRemoteNG.App
_portscanForm = new PortScanWindow();
_portscanForm.Show(dockPanel);
break;
case WindowType.ScreenshotManager:
_screenshotmanagerForm = new ScreenshotManagerWindow();
_screenshotmanagerForm.Show(dockPanel);
break;
case WindowType.UltraVNCSC:
if (_ultravncscForm == null || _ultravncscForm.IsDisposed)
_ultravncscForm = new UltraVNCWindow();

View File

@@ -0,0 +1,13 @@
namespace mRemoteNG.Config.Connections
{
public enum ConnectionsBackupFrequencyEnum
{
Unassigned = 0,
Never = 1,
OnEdit = 2,
OnExit = 3,
Daily = 4,
Weekly = 5,
Custom = 6
}
}

View File

@@ -8,7 +8,7 @@ namespace mRemoteNG.Config.Connections.Multiuser
{
public class RemoteConnectionsSyncronizer : IConnectionsUpdateChecker
{
private readonly Timer _updateTimer;
private readonly System.Timers.Timer _updateTimer;
private readonly IConnectionsUpdateChecker _updateChecker;
public double TimerIntervalInMilliseconds
@@ -19,7 +19,7 @@ namespace mRemoteNG.Config.Connections.Multiuser
public RemoteConnectionsSyncronizer(IConnectionsUpdateChecker updateChecker)
{
_updateChecker = updateChecker;
_updateTimer = new Timer(3000);
_updateTimer = new System.Timers.Timer(3000);
SetEventListeners();
}

View File

@@ -3,6 +3,7 @@ using System.Collections.Specialized;
using System.ComponentModel;
using mRemoteNG.Connection;
using mRemoteNG.UI.Forms;
using mRemoteNG.Properties;
namespace mRemoteNG.Config.Connections
{
@@ -48,12 +49,14 @@ namespace mRemoteNG.Config.Connections
private void SaveConnectionOnEdit(string propertyName = "")
{
if (!Properties.Settings.Default.SaveConnectionsAfterEveryEdit)
return;
if (FrmMain.Default.IsClosing)
return;
//OBSOLETE: mRemoteNG.Settings.Default.SaveConnectionsAfterEveryEdit is obsolete and should be removed in a future release
if (mRemoteNG.Properties.Settings.Default.SaveConnectionsAfterEveryEdit || (mRemoteNG.Properties.Settings.Default.SaveConnectionsFrequency == (int)ConnectionsBackupFrequencyEnum.OnEdit))
{
if (FrmMain.Default.IsClosing)
return;
_connectionsService.SaveConnectionsAsync(propertyName);
_connectionsService.SaveConnectionsAsync(propertyName);
}
}
}
}

View File

@@ -12,12 +12,12 @@ using mRemoteNG.Config.Serializers.Versioning;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Messages;
using mRemoteNG.Resources.Language;
using mRemoteNG.Security;
using mRemoteNG.Security.SymmetricEncryption;
using mRemoteNG.Tools;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Config.Connections
{
@@ -140,9 +140,9 @@ namespace mRemoteNG.Config.Connections
{
dbQuery =
databaseConnector.DbCommand(
"INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES(\'" +
MiscTools.PrepareValueForDB(rootTreeNode.Name) + "\', 0, \'" + strProtected + "\'," +
ConnectionsFileInfo.ConnectionFileVersion.ToString(CultureInfo.InvariantCulture) + ")");
"INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES('" +
MiscTools.PrepareValueForDB(rootTreeNode.Name) + "', 0, '" + strProtected + "','" +
ConnectionsFileInfo.ConnectionFileVersion.ToString() + "')");
dbQuery.ExecuteNonQuery();
}
else
@@ -172,7 +172,7 @@ namespace mRemoteNG.Config.Connections
{
var dbQuery = databaseConnector.DbCommand("DELETE FROM tblUpdate");
dbQuery.ExecuteNonQuery();
dbQuery = databaseConnector.DbCommand("INSERT INTO tblUpdate (LastUpdate) VALUES(\'" + MiscTools.DBDate(DateTime.Now) + "\')");
dbQuery = databaseConnector.DbCommand("INSERT INTO tblUpdate (LastUpdate) VALUES('" + MiscTools.DBDate(DateTime.Now) + "')");
dbQuery.ExecuteNonQuery();
}

View File

@@ -53,12 +53,26 @@ namespace mRemoteNG.Config.DatabaseConnectors
private void BuildDbConnectionStringWithCustomCredentials()
{
_dbConnectionString = $"Data Source={_dbHost};Initial Catalog={_dbCatalog};User Id={_dbUsername};Password={_dbPassword}";
string[] hostParts = _dbHost.Split(new char[] { ':' }, 2);
var _dbPort = (hostParts.Length == 2) ? hostParts[1] : "1433";
_dbConnectionString = new SqlConnectionStringBuilder
{
DataSource = $"{hostParts[0]},{_dbPort}",
InitialCatalog = _dbCatalog,
UserID = _dbUsername,
Password = _dbPassword,
}.ToString();
}
private void BuildDbConnectionStringWithDefaultCredentials()
{
_dbConnectionString = $"Data Source={_dbHost};Initial Catalog={_dbCatalog};Integrated Security=True";
_dbConnectionString = new SqlConnectionStringBuilder
{
DataSource = _dbHost,
InitialCatalog = _dbCatalog,
IntegratedSecurity = true
}.ToString();
}
public void Connect()

View File

@@ -101,6 +101,10 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
? connectionCsv[headers.IndexOf("Panel")]
: "";
connectionRecord.Username = headers.Contains("UserViaAPI")
? connectionCsv[headers.IndexOf("UserViaAPI")]
: "";
connectionRecord.Username = headers.Contains("Username")
? connectionCsv[headers.IndexOf("Username")]
: "";
@@ -136,6 +140,10 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
? connectionCsv[headers.IndexOf("LoadBalanceInfo")]
: "";
connectionRecord.OpeningCommand = headers.Contains("OpeningCommand")
? connectionCsv[headers.IndexOf("OpeningCommand")]
: "";
connectionRecord.PreExtApp = headers.Contains("PreExtApp")
? connectionCsv[headers.IndexOf("PreExtApp")]
: "";
@@ -186,6 +194,14 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
? connectionCsv[headers.IndexOf("RDGatewayHostname")]
: "";
connectionRecord.RDPStartProgram = headers.Contains("RDPStartProgram")
? connectionCsv[headers.IndexOf("RDPStartProgram")]
: "";
connectionRecord.RDPStartProgramWorkDir = headers.Contains("RDPStartProgramWorkDir")
? connectionCsv[headers.IndexOf("RDPStartProgramWorkDir")]
: "";
if (headers.Contains("Protocol"))
{
if (Enum.TryParse(connectionCsv[headers.IndexOf("Protocol")], out ProtocolType protocolType))
@@ -536,6 +552,12 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
connectionRecord.Inheritance.SSHTunnelConnectionName = value;
}
if (headers.Contains("InheritOpeningCommand"))
{
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritOpeningCommand")], out bool value))
connectionRecord.Inheritance.OpeningCommand = value;
}
if (headers.Contains("InheritSSHOptions"))
{
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritSSHOptions")], out bool value))
@@ -632,6 +654,12 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
connectionRecord.Inheritance.RenderingEngine = value;
}
if (headers.Contains("InheritUserViaAPI"))
{
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritUserViaAPI")], out bool value))
connectionRecord.Inheritance.UserViaAPI = value;
}
if (headers.Contains("InheritUsername"))
{
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritUsername")], out bool value))
@@ -656,6 +684,12 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
connectionRecord.Inheritance.LoadBalanceInfo = value;
}
if (headers.Contains("InheritOpeningCommand"))
{
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritOpeningCommand")], out bool value))
connectionRecord.Inheritance.OpeningCommand = value;
}
if (headers.Contains("InheritPreExtApp"))
{
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritPreExtApp")], out bool value))

View File

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

View File

@@ -1,278 +1,263 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Security;
using mRemoteNG.App;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Connection.Protocol.Http;
using mRemoteNG.Connection.Protocol.RDP;
using mRemoteNG.Connection.Protocol.VNC;
using mRemoteNG.Container;
using mRemoteNG.Security;
using mRemoteNG.Tools;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
{
public class DataTableDeserializer : IDeserializer<DataTable, ConnectionTreeModel>
{
private readonly ICryptographyProvider _cryptographyProvider;
private readonly SecureString _decryptionKey;
public DataTableDeserializer(ICryptographyProvider cryptographyProvider, SecureString decryptionKey)
{
_cryptographyProvider = cryptographyProvider.ThrowIfNull(nameof(cryptographyProvider));
_decryptionKey = decryptionKey.ThrowIfNull(nameof(decryptionKey));
}
public ConnectionTreeModel Deserialize(DataTable table)
{
var connectionList = CreateNodesFromTable(table);
var connectionTreeModel = CreateNodeHierarchy(connectionList, table);
Runtime.ConnectionsService.IsConnectionsFileLoaded = true;
return connectionTreeModel;
}
private List<ConnectionInfo> CreateNodesFromTable(DataTable table)
{
var nodeList = new List<ConnectionInfo>();
foreach (DataRow row in table.Rows)
{
// ReSharper disable once SwitchStatementMissingSomeCases
switch ((string)row["Type"])
{
case "Connection":
nodeList.Add(DeserializeConnectionInfo(row));
break;
case "Container":
nodeList.Add(DeserializeContainerInfo(row));
break;
}
}
return nodeList;
}
private ConnectionInfo DeserializeConnectionInfo(DataRow row)
{
var connectionId = row["ConstantID"] as string ?? Guid.NewGuid().ToString();
var connectionInfo = new ConnectionInfo(connectionId);
PopulateConnectionInfoFromDatarow(row, connectionInfo);
return connectionInfo;
}
private ContainerInfo DeserializeContainerInfo(DataRow row)
{
var containerId = row["ConstantID"] as string ?? Guid.NewGuid().ToString();
var containerInfo = new ContainerInfo(containerId);
PopulateConnectionInfoFromDatarow(row, containerInfo);
return containerInfo;
}
private void PopulateConnectionInfoFromDatarow(DataRow dataRow, ConnectionInfo connectionInfo)
{
connectionInfo.Name = (string)dataRow["Name"];
// This throws a NPE - Parent is a connectionInfo object which will be null at this point.
// The Parent object is linked properly later in CreateNodeHierarchy()
//connectionInfo.Parent.ConstantID = (string)dataRow["ParentID"];
connectionInfo.Description = (string)dataRow["Description"];
connectionInfo.Icon = (string)dataRow["Icon"];
connectionInfo.Panel = (string)dataRow["Panel"];
connectionInfo.Username = (string)dataRow["Username"];
connectionInfo.Domain = (string)dataRow["Domain"];
connectionInfo.Password = DecryptValue((string)dataRow["Password"]);
connectionInfo.Hostname = (string)dataRow["Hostname"];
connectionInfo.VmId = (string)dataRow["VmId"];
connectionInfo.UseEnhancedMode = (bool)dataRow["UseEnhancedMode"];
connectionInfo.Protocol = (ProtocolType)Enum.Parse(typeof(ProtocolType), (string)dataRow["Protocol"]);
connectionInfo.SSHTunnelConnectionName = (string)dataRow["SSHTunnelConnectionName"];
connectionInfo.SSHOptions = (string)dataRow["SSHOptions"];
connectionInfo.PuttySession = (string)dataRow["PuttySession"];
connectionInfo.Port = (int)dataRow["Port"];
connectionInfo.UseConsoleSession = (bool)dataRow["ConnectToConsole"];
connectionInfo.UseCredSsp = (bool)dataRow["UseCredSsp"];
connectionInfo.UseVmId = (bool)dataRow["UseVmId"];
connectionInfo.RenderingEngine = (HTTPBase.RenderingEngine)Enum.Parse(typeof(HTTPBase.RenderingEngine),
(string)dataRow["RenderingEngine"]);
connectionInfo.RDPAuthenticationLevel =
(AuthenticationLevel)Enum.Parse(typeof(AuthenticationLevel),
(string)dataRow["RDPAuthenticationLevel"]);
connectionInfo.RDPMinutesToIdleTimeout = (int)dataRow["RDPMinutesToIdleTimeout"];
connectionInfo.RDPAlertIdleTimeout = (bool)dataRow["RDPAlertIdleTimeout"];
connectionInfo.LoadBalanceInfo = (string)dataRow["LoadBalanceInfo"];
connectionInfo.Colors =
(RDPColors)Enum.Parse(typeof(RDPColors), (string)dataRow["Colors"]);
connectionInfo.Resolution =
(RDPResolutions)Enum.Parse(typeof(RDPResolutions),
(string)dataRow["Resolution"]);
connectionInfo.AutomaticResize = (bool)dataRow["AutomaticResize"];
connectionInfo.DisplayWallpaper = (bool)dataRow["DisplayWallpaper"];
connectionInfo.DisplayThemes = (bool)dataRow["DisplayThemes"];
connectionInfo.EnableFontSmoothing = (bool)dataRow["EnableFontSmoothing"];
connectionInfo.EnableDesktopComposition = (bool)dataRow["EnableDesktopComposition"];
connectionInfo.DisableFullWindowDrag = (bool)dataRow["DisableFullWindowDrag"];
connectionInfo.DisableMenuAnimations = (bool)dataRow["DisableMenuAnimations"];
connectionInfo.DisableCursorShadow = (bool)dataRow["DisableCursorShadow"];
connectionInfo.DisableCursorBlinking = (bool)dataRow["DisableCursorBlinking"];
connectionInfo.CacheBitmaps = (bool)dataRow["CacheBitmaps"];
connectionInfo.RedirectDiskDrives = (bool)dataRow["RedirectDiskDrives"];
connectionInfo.RedirectPorts = (bool)dataRow["RedirectPorts"];
connectionInfo.RedirectPrinters = (bool)dataRow["RedirectPrinters"];
connectionInfo.RedirectClipboard = (bool)dataRow["RedirectClipboard"];
connectionInfo.RedirectSmartCards = (bool)dataRow["RedirectSmartCards"];
connectionInfo.RedirectSound =
(RDPSounds)Enum.Parse(typeof(RDPSounds), (string)dataRow["RedirectSound"]);
connectionInfo.SoundQuality = (RDPSoundQuality)Enum.Parse(typeof(RDPSoundQuality),
(string)dataRow["SoundQuality"]);
connectionInfo.RedirectAudioCapture = (bool)dataRow["RedirectAudioCapture"];
connectionInfo.RedirectKeys = (bool)dataRow["RedirectKeys"];
connectionInfo.PreExtApp = (string)dataRow["PreExtApp"];
connectionInfo.PostExtApp = (string)dataRow["PostExtApp"];
connectionInfo.MacAddress = (string)dataRow["MacAddress"];
connectionInfo.UserField = (string)dataRow["UserField"];
connectionInfo.ExtApp = (string)dataRow["ExtApp"];
connectionInfo.VNCCompression = (ProtocolVNC.Compression)Enum.Parse(typeof(ProtocolVNC.Compression),
(string)dataRow["VNCCompression"]);
connectionInfo.VNCEncoding =
(ProtocolVNC.Encoding)Enum.Parse(typeof(ProtocolVNC.Encoding), (string)dataRow["VNCEncoding"]);
connectionInfo.VNCAuthMode =
(ProtocolVNC.AuthMode)Enum.Parse(typeof(ProtocolVNC.AuthMode), (string)dataRow["VNCAuthMode"]);
connectionInfo.VNCProxyType =
(ProtocolVNC.ProxyType)Enum.Parse(typeof(ProtocolVNC.ProxyType), (string)dataRow["VNCProxyType"]);
connectionInfo.VNCProxyIP = (string)dataRow["VNCProxyIP"];
connectionInfo.VNCProxyPort = (int)dataRow["VNCProxyPort"];
connectionInfo.VNCProxyUsername = (string)dataRow["VNCProxyUsername"];
connectionInfo.VNCProxyPassword = DecryptValue((string)dataRow["VNCProxyPassword"]);
connectionInfo.VNCColors =
(ProtocolVNC.Colors)Enum.Parse(typeof(ProtocolVNC.Colors), (string)dataRow["VNCColors"]);
connectionInfo.VNCSmartSizeMode = (ProtocolVNC.SmartSizeMode)Enum.Parse(typeof(ProtocolVNC.SmartSizeMode),
(string)dataRow
["VNCSmartSizeMode"]);
connectionInfo.VNCViewOnly = (bool)dataRow["VNCViewOnly"];
connectionInfo.RDGatewayUsageMethod =
(RDGatewayUsageMethod)Enum.Parse(typeof(RDGatewayUsageMethod),
(string)dataRow["RDGatewayUsageMethod"]);
connectionInfo.RDGatewayHostname = (string)dataRow["RDGatewayHostname"];
connectionInfo.RDGatewayUseConnectionCredentials =
(RDGatewayUseConnectionCredentials)Enum.Parse(typeof(RDGatewayUseConnectionCredentials),
(string)dataRow["RDGatewayUseConnectionCredentials"]);
connectionInfo.RDGatewayUsername = (string)dataRow["RDGatewayUsername"];
connectionInfo.RDGatewayPassword = DecryptValue((string)dataRow["RDGatewayPassword"]);
connectionInfo.RDGatewayDomain = (string)dataRow["RDGatewayDomain"];
if (!dataRow.IsNull("RdpVersion")) // table allows null values which must be handled
if (Enum.TryParse((string)dataRow["RdpVersion"], true, out RdpVersion rdpVersion))
connectionInfo.RdpVersion = rdpVersion;
connectionInfo.Inheritance.CacheBitmaps = (bool)dataRow["InheritCacheBitmaps"];
connectionInfo.Inheritance.Colors = (bool)dataRow["InheritColors"];
connectionInfo.Inheritance.Description = (bool)dataRow["InheritDescription"];
connectionInfo.Inheritance.DisplayThemes = (bool)dataRow["InheritDisplayThemes"];
connectionInfo.Inheritance.DisplayWallpaper = (bool)dataRow["InheritDisplayWallpaper"];
connectionInfo.Inheritance.EnableFontSmoothing = (bool)dataRow["InheritEnableFontSmoothing"];
connectionInfo.Inheritance.EnableDesktopComposition = (bool)dataRow["InheritEnableDesktopComposition"];
connectionInfo.Inheritance.DisableFullWindowDrag = (bool)dataRow["InheritDisableFullWindowDrag"];
connectionInfo.Inheritance.DisableMenuAnimations = (bool)dataRow["InheritDisableMenuAnimations"];
connectionInfo.Inheritance.DisableCursorShadow = (bool)dataRow["InheritDisableCursorShadow"];
connectionInfo.Inheritance.DisableCursorBlinking = (bool)dataRow["InheritDisableCursorBlinking"];
connectionInfo.Inheritance.Domain = (bool)dataRow["InheritDomain"];
connectionInfo.Inheritance.Icon = (bool)dataRow["InheritIcon"];
connectionInfo.Inheritance.Panel = (bool)dataRow["InheritPanel"];
connectionInfo.Inheritance.Password = (bool)dataRow["InheritPassword"];
connectionInfo.Inheritance.Port = (bool)dataRow["InheritPort"];
connectionInfo.Inheritance.Protocol = (bool)dataRow["InheritProtocol"];
connectionInfo.Inheritance.SSHTunnelConnectionName = (bool)dataRow["InheritSSHTunnelConnectionName"];
connectionInfo.Inheritance.SSHOptions = (bool)dataRow["InheritSSHOptions"];
connectionInfo.Inheritance.PuttySession = (bool)dataRow["InheritPuttySession"];
connectionInfo.Inheritance.RedirectDiskDrives = (bool)dataRow["InheritRedirectDiskDrives"];
connectionInfo.Inheritance.RedirectKeys = (bool)dataRow["InheritRedirectKeys"];
connectionInfo.Inheritance.RedirectPorts = (bool)dataRow["InheritRedirectPorts"];
connectionInfo.Inheritance.RedirectPrinters = (bool)dataRow["InheritRedirectPrinters"];
connectionInfo.Inheritance.RedirectClipboard = (bool)dataRow["InheritRedirectClipboard"];
connectionInfo.Inheritance.RedirectSmartCards = (bool)dataRow["InheritRedirectSmartCards"];
connectionInfo.Inheritance.RedirectSound = (bool)dataRow["InheritRedirectSound"];
connectionInfo.Inheritance.SoundQuality = (bool)dataRow["InheritSoundQuality"];
connectionInfo.Inheritance.RedirectAudioCapture = (bool)dataRow["InheritRedirectAudioCapture"];
connectionInfo.Inheritance.Resolution = (bool)dataRow["InheritResolution"];
connectionInfo.Inheritance.AutomaticResize = (bool)dataRow["InheritAutomaticResize"];
connectionInfo.Inheritance.UseConsoleSession = (bool)dataRow["InheritUseConsoleSession"];
connectionInfo.Inheritance.UseCredSsp = (bool)dataRow["InheritUseCredSsp"];
connectionInfo.Inheritance.UseVmId = (bool)dataRow["InheritUseVmId"];
connectionInfo.Inheritance.UseEnhancedMode = (bool)dataRow["InheritUseEnhancedMode"];
connectionInfo.Inheritance.VmId = (bool)dataRow["InheritVmId"];
connectionInfo.Inheritance.RenderingEngine = (bool)dataRow["InheritRenderingEngine"];
connectionInfo.Inheritance.Username = (bool)dataRow["InheritUsername"];
connectionInfo.Inheritance.RDPAuthenticationLevel = (bool)dataRow["InheritRDPAuthenticationLevel"];
connectionInfo.Inheritance.RDPAlertIdleTimeout = (bool)dataRow["InheritRDPAlertIdleTimeout"];
connectionInfo.Inheritance.RDPMinutesToIdleTimeout = (bool)dataRow["InheritRDPMinutesToIdleTimeout"];
connectionInfo.Inheritance.LoadBalanceInfo = (bool)dataRow["InheritLoadBalanceInfo"];
connectionInfo.Inheritance.PreExtApp = (bool)dataRow["InheritPreExtApp"];
connectionInfo.Inheritance.PostExtApp = (bool)dataRow["InheritPostExtApp"];
connectionInfo.Inheritance.MacAddress = (bool)dataRow["InheritMacAddress"];
connectionInfo.Inheritance.UserField = (bool)dataRow["InheritUserField"];
connectionInfo.Inheritance.ExtApp = (bool)dataRow["InheritExtApp"];
connectionInfo.Inheritance.VNCCompression = (bool)dataRow["InheritVNCCompression"];
connectionInfo.Inheritance.VNCEncoding = (bool)dataRow["InheritVNCEncoding"];
connectionInfo.Inheritance.VNCAuthMode = (bool)dataRow["InheritVNCAuthMode"];
connectionInfo.Inheritance.VNCProxyType = (bool)dataRow["InheritVNCProxyType"];
connectionInfo.Inheritance.VNCProxyIP = (bool)dataRow["InheritVNCProxyIP"];
connectionInfo.Inheritance.VNCProxyPort = (bool)dataRow["InheritVNCProxyPort"];
connectionInfo.Inheritance.VNCProxyUsername = (bool)dataRow["InheritVNCProxyUsername"];
connectionInfo.Inheritance.VNCProxyPassword = (bool)dataRow["InheritVNCProxyPassword"];
connectionInfo.Inheritance.VNCColors = (bool)dataRow["InheritVNCColors"];
connectionInfo.Inheritance.VNCSmartSizeMode = (bool)dataRow["InheritVNCSmartSizeMode"];
connectionInfo.Inheritance.VNCViewOnly = (bool)dataRow["InheritVNCViewOnly"];
connectionInfo.Inheritance.RDGatewayUsageMethod = (bool)dataRow["InheritRDGatewayUsageMethod"];
connectionInfo.Inheritance.RDGatewayHostname = (bool)dataRow["InheritRDGatewayHostname"];
connectionInfo.Inheritance.RDGatewayUseConnectionCredentials =
(bool)dataRow["InheritRDGatewayUseConnectionCredentials"];
connectionInfo.Inheritance.RDGatewayUsername = (bool)dataRow["InheritRDGatewayUsername"];
connectionInfo.Inheritance.RDGatewayPassword = (bool)dataRow["InheritRDGatewayPassword"];
connectionInfo.Inheritance.RDGatewayDomain = (bool)dataRow["InheritRDGatewayDomain"];
connectionInfo.Inheritance.RdpVersion = (bool)dataRow["InheritRdpVersion"];
}
private string DecryptValue(string cipherText)
{
try
{
return _cryptographyProvider.Decrypt(cipherText, _decryptionKey);
}
catch (EncryptionException)
{
// value may not be encrypted
return cipherText;
}
}
private ConnectionTreeModel CreateNodeHierarchy(List<ConnectionInfo> connectionList, DataTable dataTable)
{
var connectionTreeModel = new ConnectionTreeModel();
var rootNode = new RootNodeInfo(RootNodeType.Connection, "0")
{
PasswordString = _decryptionKey.ConvertToUnsecureString()
};
connectionTreeModel.AddRootNode(rootNode);
foreach (DataRow row in dataTable.Rows)
{
var id = (string)row["ConstantID"];
var connectionInfo = connectionList.First(node => node.ConstantID == id);
var parentId = (string)row["ParentID"];
if (parentId == "0" || connectionList.All(node => node.ConstantID != parentId))
rootNode.AddChild(connectionInfo);
else
(connectionList.First(node => node.ConstantID == parentId) as ContainerInfo)?.AddChild(
connectionInfo);
}
return connectionTreeModel;
}
}
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Security;
using mRemoteNG.App;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Connection.Protocol.Http;
using mRemoteNG.Connection.Protocol.RDP;
using mRemoteNG.Connection.Protocol.VNC;
using mRemoteNG.Container;
using mRemoteNG.Security;
using mRemoteNG.Tools;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
{
public class DataTableDeserializer : IDeserializer<DataTable, ConnectionTreeModel>
{
private readonly ICryptographyProvider _cryptographyProvider;
private readonly SecureString _decryptionKey;
public DataTableDeserializer(ICryptographyProvider cryptographyProvider, SecureString decryptionKey)
{
_cryptographyProvider = cryptographyProvider.ThrowIfNull(nameof(cryptographyProvider));
_decryptionKey = decryptionKey.ThrowIfNull(nameof(decryptionKey));
}
public ConnectionTreeModel Deserialize(DataTable table)
{
var connectionList = CreateNodesFromTable(table);
var connectionTreeModel = CreateNodeHierarchy(connectionList, table);
Runtime.ConnectionsService.IsConnectionsFileLoaded = true;
return connectionTreeModel;
}
private List<ConnectionInfo> CreateNodesFromTable(DataTable table)
{
var nodeList = new List<ConnectionInfo>();
foreach (DataRow row in table.Rows)
{
// ReSharper disable once SwitchStatementMissingSomeCases
switch ((string)row["Type"])
{
case "Connection":
nodeList.Add(DeserializeConnectionInfo(row));
break;
case "Container":
nodeList.Add(DeserializeContainerInfo(row));
break;
}
}
return nodeList;
}
private ConnectionInfo DeserializeConnectionInfo(DataRow row)
{
var connectionId = row["ConstantID"] as string ?? Guid.NewGuid().ToString();
var connectionInfo = new ConnectionInfo(connectionId);
PopulateConnectionInfoFromDatarow(row, connectionInfo);
return connectionInfo;
}
private ContainerInfo DeserializeContainerInfo(DataRow row)
{
var containerId = row["ConstantID"] as string ?? Guid.NewGuid().ToString();
var containerInfo = new ContainerInfo(containerId);
PopulateConnectionInfoFromDatarow(row, containerInfo);
return containerInfo;
}
private void PopulateConnectionInfoFromDatarow(DataRow dataRow, ConnectionInfo connectionInfo)
{
connectionInfo.Name = (string)dataRow["Name"];
// This throws a NPE - Parent is a connectionInfo object which will be null at this point.
// The Parent object is linked properly later in CreateNodeHierarchy()
//connectionInfo.Parent.ConstantID = (string)dataRow["ParentID"];
connectionInfo.Description = (string)dataRow["Description"];
connectionInfo.Icon = (string)dataRow["Icon"];
connectionInfo.Panel = (string)dataRow["Panel"];
connectionInfo.Username = (string)dataRow["Username"];
connectionInfo.Domain = (string)dataRow["Domain"];
connectionInfo.Password = DecryptValue((string)dataRow["Password"]);
connectionInfo.Hostname = (string)dataRow["Hostname"];
connectionInfo.VmId = (string)dataRow["VmId"];
connectionInfo.UseEnhancedMode = (bool)dataRow["UseEnhancedMode"];
connectionInfo.Protocol = (ProtocolType)Enum.Parse(typeof(ProtocolType), (string)dataRow["Protocol"]);
connectionInfo.SSHTunnelConnectionName = (string)dataRow["SSHTunnelConnectionName"];
connectionInfo.OpeningCommand = (string)dataRow["OpeningCommand"];
connectionInfo.SSHOptions = (string)dataRow["SSHOptions"];
connectionInfo.PuttySession = (string)dataRow["PuttySession"];
connectionInfo.Port = (int)dataRow["Port"];
connectionInfo.UseConsoleSession = (bool)dataRow["ConnectToConsole"];
connectionInfo.UseCredSsp = (bool)dataRow["UseCredSsp"];
connectionInfo.UseVmId = (bool)dataRow["UseVmId"];
connectionInfo.RenderingEngine = (HTTPBase.RenderingEngine)Enum.Parse(typeof(HTTPBase.RenderingEngine), (string)dataRow["RenderingEngine"]);
connectionInfo.RDPAuthenticationLevel = (AuthenticationLevel)Enum.Parse(typeof(AuthenticationLevel), (string)dataRow["RDPAuthenticationLevel"]);
connectionInfo.RDPMinutesToIdleTimeout = (int)dataRow["RDPMinutesToIdleTimeout"];
connectionInfo.RDPAlertIdleTimeout = (bool)dataRow["RDPAlertIdleTimeout"];
connectionInfo.LoadBalanceInfo = (string)dataRow["LoadBalanceInfo"];
connectionInfo.Colors = (RDPColors)Enum.Parse(typeof(RDPColors), (string)dataRow["Colors"]);
connectionInfo.Resolution = (RDPResolutions)Enum.Parse(typeof(RDPResolutions), (string)dataRow["Resolution"]);
connectionInfo.AutomaticResize = (bool)dataRow["AutomaticResize"];
connectionInfo.DisplayWallpaper = (bool)dataRow["DisplayWallpaper"];
connectionInfo.DisplayThemes = (bool)dataRow["DisplayThemes"];
connectionInfo.EnableFontSmoothing = (bool)dataRow["EnableFontSmoothing"];
connectionInfo.EnableDesktopComposition = (bool)dataRow["EnableDesktopComposition"];
connectionInfo.DisableFullWindowDrag = (bool)dataRow["DisableFullWindowDrag"];
connectionInfo.DisableMenuAnimations = (bool)dataRow["DisableMenuAnimations"];
connectionInfo.DisableCursorShadow = (bool)dataRow["DisableCursorShadow"];
connectionInfo.DisableCursorBlinking = (bool)dataRow["DisableCursorBlinking"];
connectionInfo.CacheBitmaps = (bool)dataRow["CacheBitmaps"];
connectionInfo.RedirectDiskDrives = (bool)dataRow["RedirectDiskDrives"];
connectionInfo.RedirectPorts = (bool)dataRow["RedirectPorts"];
connectionInfo.RedirectPrinters = (bool)dataRow["RedirectPrinters"];
connectionInfo.RedirectClipboard = (bool)dataRow["RedirectClipboard"];
connectionInfo.RedirectSmartCards = (bool)dataRow["RedirectSmartCards"];
connectionInfo.RedirectSound = (RDPSounds)Enum.Parse(typeof(RDPSounds), (string)dataRow["RedirectSound"]);
connectionInfo.SoundQuality = (RDPSoundQuality)Enum.Parse(typeof(RDPSoundQuality), (string)dataRow["SoundQuality"]);
connectionInfo.RedirectAudioCapture = (bool)dataRow["RedirectAudioCapture"];
connectionInfo.RDPStartProgram = (string)dataRow["StartProgram"];
connectionInfo.RDPStartProgramWorkDir = (string)dataRow["StartProgramWorkDir"];
connectionInfo.RedirectKeys = (bool)dataRow["RedirectKeys"];
connectionInfo.OpeningCommand = (string)dataRow["OpeningCommand"];
connectionInfo.PreExtApp = (string)dataRow["PreExtApp"];
connectionInfo.PostExtApp = (string)dataRow["PostExtApp"];
connectionInfo.MacAddress = (string)dataRow["MacAddress"];
connectionInfo.UserField = (string)dataRow["UserField"];
connectionInfo.ExtApp = (string)dataRow["ExtApp"];
connectionInfo.VNCCompression = (ProtocolVNC.Compression)Enum.Parse(typeof(ProtocolVNC.Compression), (string)dataRow["VNCCompression"]);
connectionInfo.VNCEncoding = (ProtocolVNC.Encoding)Enum.Parse(typeof(ProtocolVNC.Encoding), (string)dataRow["VNCEncoding"]);
connectionInfo.VNCAuthMode = (ProtocolVNC.AuthMode)Enum.Parse(typeof(ProtocolVNC.AuthMode), (string)dataRow["VNCAuthMode"]);
connectionInfo.VNCProxyType = (ProtocolVNC.ProxyType)Enum.Parse(typeof(ProtocolVNC.ProxyType), (string)dataRow["VNCProxyType"]);
connectionInfo.VNCProxyIP = (string)dataRow["VNCProxyIP"];
connectionInfo.VNCProxyPort = (int)dataRow["VNCProxyPort"];
connectionInfo.VNCProxyUsername = (string)dataRow["VNCProxyUsername"];
connectionInfo.VNCProxyPassword = DecryptValue((string)dataRow["VNCProxyPassword"]);
connectionInfo.VNCColors = (ProtocolVNC.Colors)Enum.Parse(typeof(ProtocolVNC.Colors), (string)dataRow["VNCColors"]);
connectionInfo.VNCSmartSizeMode = (ProtocolVNC.SmartSizeMode)Enum.Parse(typeof(ProtocolVNC.SmartSizeMode), (string)dataRow["VNCSmartSizeMode"]);
connectionInfo.VNCViewOnly = (bool)dataRow["VNCViewOnly"];
connectionInfo.RDGatewayUsageMethod = (RDGatewayUsageMethod)Enum.Parse(typeof(RDGatewayUsageMethod), (string)dataRow["RDGatewayUsageMethod"]);
connectionInfo.RDGatewayHostname = (string)dataRow["RDGatewayHostname"];
connectionInfo.RDGatewayUseConnectionCredentials = (RDGatewayUseConnectionCredentials)Enum.Parse(typeof(RDGatewayUseConnectionCredentials), (string)dataRow["RDGatewayUseConnectionCredentials"]);
connectionInfo.RDGatewayUsername = (string)dataRow["RDGatewayUsername"];
connectionInfo.RDGatewayPassword = DecryptValue((string)dataRow["RDGatewayPassword"]);
connectionInfo.RDGatewayDomain = (string)dataRow["RDGatewayDomain"];
if (!dataRow.IsNull("RdpVersion")) // table allows null values which must be handled
if (Enum.TryParse((string)dataRow["RdpVersion"], true, out RdpVersion rdpVersion))
connectionInfo.RdpVersion = rdpVersion;
connectionInfo.Inheritance.CacheBitmaps = (bool)dataRow["InheritCacheBitmaps"];
connectionInfo.Inheritance.Colors = (bool)dataRow["InheritColors"];
connectionInfo.Inheritance.Description = (bool)dataRow["InheritDescription"];
connectionInfo.Inheritance.DisplayThemes = (bool)dataRow["InheritDisplayThemes"];
connectionInfo.Inheritance.DisplayWallpaper = (bool)dataRow["InheritDisplayWallpaper"];
connectionInfo.Inheritance.EnableFontSmoothing = (bool)dataRow["InheritEnableFontSmoothing"];
connectionInfo.Inheritance.EnableDesktopComposition = (bool)dataRow["InheritEnableDesktopComposition"];
connectionInfo.Inheritance.DisableFullWindowDrag = (bool)dataRow["InheritDisableFullWindowDrag"];
connectionInfo.Inheritance.DisableMenuAnimations = (bool)dataRow["InheritDisableMenuAnimations"];
connectionInfo.Inheritance.DisableCursorShadow = (bool)dataRow["InheritDisableCursorShadow"];
connectionInfo.Inheritance.DisableCursorBlinking = (bool)dataRow["InheritDisableCursorBlinking"];
connectionInfo.Inheritance.Domain = (bool)dataRow["InheritDomain"];
connectionInfo.Inheritance.Icon = (bool)dataRow["InheritIcon"];
connectionInfo.Inheritance.Panel = (bool)dataRow["InheritPanel"];
connectionInfo.Inheritance.Password = (bool)dataRow["InheritPassword"];
connectionInfo.Inheritance.Port = (bool)dataRow["InheritPort"];
connectionInfo.Inheritance.Protocol = (bool)dataRow["InheritProtocol"];
connectionInfo.Inheritance.SSHTunnelConnectionName = (bool)dataRow["InheritSSHTunnelConnectionName"];
connectionInfo.Inheritance.OpeningCommand = (bool)dataRow["InheritOpeningCommand"];
connectionInfo.Inheritance.SSHOptions = (bool)dataRow["InheritSSHOptions"];
connectionInfo.Inheritance.PuttySession = (bool)dataRow["InheritPuttySession"];
connectionInfo.Inheritance.RedirectDiskDrives = (bool)dataRow["InheritRedirectDiskDrives"];
connectionInfo.Inheritance.RedirectKeys = (bool)dataRow["InheritRedirectKeys"];
connectionInfo.Inheritance.RedirectPorts = (bool)dataRow["InheritRedirectPorts"];
connectionInfo.Inheritance.RedirectPrinters = (bool)dataRow["InheritRedirectPrinters"];
connectionInfo.Inheritance.RedirectClipboard = (bool)dataRow["InheritRedirectClipboard"];
connectionInfo.Inheritance.RedirectSmartCards = (bool)dataRow["InheritRedirectSmartCards"];
connectionInfo.Inheritance.RedirectSound = (bool)dataRow["InheritRedirectSound"];
connectionInfo.Inheritance.SoundQuality = (bool)dataRow["InheritSoundQuality"];
connectionInfo.Inheritance.RedirectAudioCapture = (bool)dataRow["InheritRedirectAudioCapture"];
connectionInfo.Inheritance.Resolution = (bool)dataRow["InheritResolution"];
connectionInfo.Inheritance.AutomaticResize = (bool)dataRow["InheritAutomaticResize"];
connectionInfo.Inheritance.UseConsoleSession = (bool)dataRow["InheritUseConsoleSession"];
connectionInfo.Inheritance.UseCredSsp = (bool)dataRow["InheritUseCredSsp"];
connectionInfo.Inheritance.UseVmId = (bool)dataRow["InheritUseVmId"];
connectionInfo.Inheritance.UseEnhancedMode = (bool)dataRow["InheritUseEnhancedMode"];
connectionInfo.Inheritance.VmId = (bool)dataRow["InheritVmId"];
connectionInfo.Inheritance.RenderingEngine = (bool)dataRow["InheritRenderingEngine"];
connectionInfo.Inheritance.Username = (bool)dataRow["InheritUsername"];
connectionInfo.Inheritance.RDPAuthenticationLevel = (bool)dataRow["InheritRDPAuthenticationLevel"];
connectionInfo.Inheritance.RDPAlertIdleTimeout = (bool)dataRow["InheritRDPAlertIdleTimeout"];
connectionInfo.Inheritance.RDPMinutesToIdleTimeout = (bool)dataRow["InheritRDPMinutesToIdleTimeout"];
connectionInfo.Inheritance.LoadBalanceInfo = (bool)dataRow["InheritLoadBalanceInfo"];
connectionInfo.Inheritance.OpeningCommand = (bool)dataRow["InheritOpeningCommand"];
connectionInfo.Inheritance.PreExtApp = (bool)dataRow["InheritPreExtApp"];
connectionInfo.Inheritance.PostExtApp = (bool)dataRow["InheritPostExtApp"];
connectionInfo.Inheritance.MacAddress = (bool)dataRow["InheritMacAddress"];
connectionInfo.Inheritance.UserField = (bool)dataRow["InheritUserField"];
connectionInfo.Inheritance.ExtApp = (bool)dataRow["InheritExtApp"];
connectionInfo.Inheritance.VNCCompression = (bool)dataRow["InheritVNCCompression"];
connectionInfo.Inheritance.VNCEncoding = (bool)dataRow["InheritVNCEncoding"];
connectionInfo.Inheritance.VNCAuthMode = (bool)dataRow["InheritVNCAuthMode"];
connectionInfo.Inheritance.VNCProxyType = (bool)dataRow["InheritVNCProxyType"];
connectionInfo.Inheritance.VNCProxyIP = (bool)dataRow["InheritVNCProxyIP"];
connectionInfo.Inheritance.VNCProxyPort = (bool)dataRow["InheritVNCProxyPort"];
connectionInfo.Inheritance.VNCProxyUsername = (bool)dataRow["InheritVNCProxyUsername"];
connectionInfo.Inheritance.VNCProxyPassword = (bool)dataRow["InheritVNCProxyPassword"];
connectionInfo.Inheritance.VNCColors = (bool)dataRow["InheritVNCColors"];
connectionInfo.Inheritance.VNCSmartSizeMode = (bool)dataRow["InheritVNCSmartSizeMode"];
connectionInfo.Inheritance.VNCViewOnly = (bool)dataRow["InheritVNCViewOnly"];
connectionInfo.Inheritance.RDGatewayUsageMethod = (bool)dataRow["InheritRDGatewayUsageMethod"];
connectionInfo.Inheritance.RDGatewayHostname = (bool)dataRow["InheritRDGatewayHostname"];
connectionInfo.Inheritance.RDGatewayUseConnectionCredentials = (bool)dataRow["InheritRDGatewayUseConnectionCredentials"];
connectionInfo.Inheritance.RDGatewayUsername = (bool)dataRow["InheritRDGatewayUsername"];
connectionInfo.Inheritance.RDGatewayPassword = (bool)dataRow["InheritRDGatewayPassword"];
connectionInfo.Inheritance.RDGatewayDomain = (bool)dataRow["InheritRDGatewayDomain"];
connectionInfo.Inheritance.RdpVersion = (bool)dataRow["InheritRdpVersion"];
}
private string DecryptValue(string cipherText)
{
try
{
return _cryptographyProvider.Decrypt(cipherText, _decryptionKey);
}
catch (EncryptionException)
{
// value may not be encrypted
return cipherText;
}
}
private ConnectionTreeModel CreateNodeHierarchy(List<ConnectionInfo> connectionList, DataTable dataTable)
{
var connectionTreeModel = new ConnectionTreeModel();
var rootNode = new RootNodeInfo(RootNodeType.Connection, "0")
{
PasswordString = _decryptionKey.ConvertToUnsecureString()
};
connectionTreeModel.AddRootNode(rootNode);
foreach (DataRow row in dataTable.Rows)
{
var id = (string)row["ConstantID"];
var connectionInfo = connectionList.First(node => node.ConstantID == id);
var parentId = (string)row["ParentID"];
if (parentId == "0" || connectionList.All(node => node.ConstantID != parentId))
rootNode.AddChild(connectionInfo);
else
(connectionList.First(node => node.ConstantID == parentId) as ContainerInfo)?.AddChild(
connectionInfo);
}
return connectionTreeModel;
}
}
}

View File

@@ -80,9 +80,9 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
if (rootTreeNode != null)
{
cmd = databaseConnector.DbCommand(
"INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES(\'" +
MiscTools.PrepareValueForDB(rootTreeNode.Name) + "\', 0, \'" + strProtected + "\'," +
ConnectionsFileInfo.ConnectionFileVersion.ToString(CultureInfo.InvariantCulture) + ")");
"INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES('" +
MiscTools.PrepareValueForDB(rootTreeNode.Name) + "', 0, '" + strProtected + "','" +
ConnectionsFileInfo.ConnectionFileVersion.ToString() + "')");
cmd.ExecuteNonQuery();
}
else

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Security;
using System.Xml.Linq;
using mRemoteNG.Connection;
@@ -66,6 +66,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(new XAttribute("Hostname", connectionInfo.Hostname));
element.Add(new XAttribute("Protocol", connectionInfo.Protocol));
element.Add(new XAttribute("SSHTunnelConnectionName", connectionInfo.SSHTunnelConnectionName));
element.Add(new XAttribute("OpeningCommand", connectionInfo.OpeningCommand));
element.Add(new XAttribute("SSHOptions", connectionInfo.SSHOptions));
element.Add(new XAttribute("PuttySession", connectionInfo.PuttySession));
element.Add(new XAttribute("Port", connectionInfo.Port));
@@ -98,7 +99,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(new XAttribute("MacAddress", connectionInfo.MacAddress));
element.Add(new XAttribute("UserField", connectionInfo.UserField));
element.Add(new XAttribute("ExtApp", connectionInfo.ExtApp));
element.Add(new XAttribute("StartProgram", connectionInfo.StartProgram));
element.Add(new XAttribute("StartProgram", connectionInfo.RDPStartProgram));
element.Add(new XAttribute("VNCCompression", connectionInfo.VNCCompression));
element.Add(new XAttribute("VNCEncoding", connectionInfo.VNCEncoding));
element.Add(new XAttribute("VNCAuthMode", connectionInfo.VNCAuthMode));
@@ -168,6 +169,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(new XAttribute("InheritProtocol", inheritance.Protocol.ToString().ToLowerInvariant()));
if (inheritance.SSHTunnelConnectionName)
element.Add(new XAttribute("InheritSSHTunnelConnectionName", inheritance.SSHTunnelConnectionName.ToString().ToLowerInvariant()));
if (inheritance.OpeningCommand)
element.Add(new XAttribute("InheritOpeningCommand", inheritance.OpeningCommand.ToString().ToLowerInvariant()));
if (inheritance.SSHOptions)
element.Add(new XAttribute("InheritSSHOptions", inheritance.SSHOptions.ToString().ToLowerInvariant()));
if (inheritance.PuttySession)

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Security;
using System.Xml.Linq;
using mRemoteNG.App;
@@ -76,6 +76,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(new XAttribute("Protocol", connectionInfo.Protocol));
element.Add(new XAttribute("RdpVersion", connectionInfo.RdpVersion.ToString().ToLowerInvariant()));
element.Add(new XAttribute("SSHTunnelConnectionName", connectionInfo.SSHTunnelConnectionName));
element.Add(new XAttribute("OpeningCommand", connectionInfo.OpeningCommand));
element.Add(new XAttribute("SSHOptions", connectionInfo.SSHOptions));
element.Add(new XAttribute("PuttySession", connectionInfo.PuttySession));
element.Add(new XAttribute("Port", connectionInfo.Port));
@@ -114,7 +115,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(new XAttribute("UserField", connectionInfo.UserField));
element.Add(new XAttribute("Favorite", connectionInfo.Favorite));
element.Add(new XAttribute("ExtApp", connectionInfo.ExtApp));
element.Add(new XAttribute("StartProgram", connectionInfo.StartProgram));
element.Add(new XAttribute("StartProgram", connectionInfo.RDPStartProgram));
element.Add(new XAttribute("StartProgramWorkDir", connectionInfo.RDPStartProgramWorkDir));
element.Add(new XAttribute("VNCCompression", connectionInfo.VNCCompression));
element.Add(new XAttribute("VNCEncoding", connectionInfo.VNCEncoding));
element.Add(new XAttribute("VNCAuthMode", connectionInfo.VNCAuthMode));
@@ -148,6 +150,10 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(_saveFilter.SaveDomain
? new XAttribute("RDGatewayDomain", connectionInfo.RDGatewayDomain)
: new XAttribute("RDGatewayDomain", ""));
element.Add(new XAttribute("UserViaAPI", connectionInfo.UserViaAPI));
element.Add(new XAttribute("EC2InstanceId", connectionInfo.EC2InstanceId));
element.Add(new XAttribute("EC2Region", connectionInfo.EC2Region));
}
private void SetInheritanceAttributes(XContainer element, IInheritable connectionInfo)
@@ -194,6 +200,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(new XAttribute("InheritRdpVersion", inheritance.RdpVersion.ToString().ToLowerInvariant()));
if (inheritance.SSHTunnelConnectionName)
element.Add(new XAttribute("InheritSSHTunnelConnectionName", inheritance.SSHTunnelConnectionName.ToString().ToLowerInvariant()));
if (inheritance.OpeningCommand)
element.Add(new XAttribute("InheritOpeningCommand", inheritance.OpeningCommand.ToString().ToLowerInvariant()));
if (inheritance.SSHOptions)
element.Add(new XAttribute("InheritSSHOptions", inheritance.SSHOptions.ToString().ToLowerInvariant()));
if (inheritance.PuttySession)
@@ -288,6 +296,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(new XAttribute("InheritUseVmId", inheritance.UseVmId.ToString().ToLowerInvariant()));
if (inheritance.UseEnhancedMode)
element.Add(new XAttribute("InheritUseEnhancedMode", inheritance.UseEnhancedMode.ToString().ToLowerInvariant()));
if (inheritance.UserViaAPI)
element.Add(new XAttribute("InheritUserViaAPI", inheritance.UserViaAPI.ToString().ToLowerInvariant()));
}
}
}

View File

@@ -6,10 +6,10 @@ using mRemoteNG.Config.Import;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Container;
using mRemoteNG.Resources.Language;
using mRemoteNG.Tools;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Config.Serializers.MiscSerializers
{

View File

@@ -152,7 +152,7 @@ namespace mRemoteNG.Config.Serializers.MiscSerializers
connectionInfo.RDGatewayHostname = value;
break;
case "alternate shell":
connectionInfo.StartProgram = value;
connectionInfo.RDPStartProgram = value;
break;
}
}

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
@@ -7,9 +7,9 @@ using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Connection.Protocol.RDP;
using mRemoteNG.Container;
using mRemoteNG.Resources.Language;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Config.Serializers.MiscSerializers
{
@@ -183,8 +183,8 @@ namespace mRemoteNG.Config.Serializers.MiscSerializers
{
if (bool.TryParse(connectionSettingsNode.SelectSingleNode("./connectToConsole")?.InnerText, out var useConsole))
connectionInfo.UseConsoleSession = useConsole;
connectionInfo.StartProgram = connectionSettingsNode.SelectSingleNode("./startProgram")?.InnerText;
// ./workingDir
connectionInfo.RDPStartProgram = connectionSettingsNode.SelectSingleNode("./startProgram")?.InnerText;
connectionInfo.RDPStartProgramWorkDir = connectionSettingsNode.SelectSingleNode("./startProgramWorkDir")?.InnerText;
if (int.TryParse(connectionSettingsNode.SelectSingleNode("./port")?.InnerText, out var port))
connectionInfo.Port = port;
}

View File

@@ -2,13 +2,15 @@
using mRemoteNG.App.Info;
using mRemoteNG.Config.DatabaseConnectors;
using mRemoteNG.Messages;
using System;
using mRemoteNG.Resources.Language;
using System;
namespace mRemoteNG.Config.Serializers.Versioning
{
public class SqlDatabaseVersionVerifier
{
{
protected readonly Version currentSupportedVersion = new Version(2, 9);
private readonly IDatabaseConnector _databaseConnector;
public SqlDatabaseVersionVerifier(IDatabaseConnector DatabaseConnector)
@@ -39,6 +41,7 @@ namespace mRemoteNG.Config.Serializers.Versioning
new SqlVersion25To26Upgrader(_databaseConnector),
new SqlVersion26To27Upgrader(_databaseConnector),
new SqlVersion27To28Upgrader(_databaseConnector),
new SqlVersion28To29Upgrader(_databaseConnector),
};
foreach (var upgrader in dbUpgraders)
@@ -50,7 +53,7 @@ namespace mRemoteNG.Config.Serializers.Versioning
}
// DB is at the highest current supported version
if (databaseVersion.CompareTo(new Version(2, 8)) == 0)
if (databaseVersion.CompareTo(currentSupportedVersion) == 0)
isVerified = true;
if (isVerified == false)

View File

@@ -0,0 +1,80 @@
using mRemoteNG.App;
using mRemoteNG.Config.DatabaseConnectors;
using mRemoteNG.Messages;
using System;
using System.Data.Common;
namespace mRemoteNG.Config.Serializers.Versioning
{
public class SqlVersion28To29Upgrader : IVersionUpgrader
{
private readonly Version version = new Version(2, 9);
private readonly IDatabaseConnector _databaseConnector;
public SqlVersion28To29Upgrader(IDatabaseConnector databaseConnector)
{
_databaseConnector = databaseConnector ?? throw new ArgumentNullException(nameof(databaseConnector));
}
public bool CanUpgrade(Version currentVersion)
{
return currentVersion == new Version(2, 8) ||
// Support upgrading during dev revisions, 2.9.1, 2.9.2, etc...
(currentVersion <= new Version(2, 9) &&
currentVersion < version);
}
public Version Upgrade()
{
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg,
string.Format("Upgrading database to version {0}.", version));
const string mySqlAlter = @"
ALTER TABLE tblCons ADD COLUMN StartProgram varchar(512) DEFAULT NULL;
ALTER TABLE tblCons ADD COLUMN StartProgramWorkDir varchar(512) DEFAULT NULL;
ALTER TABLE tblRoot CHANGE COLUMN ConfVersion ConfVersion VARCHAR(15) NOT NULL;";
const string mySqlUpdate = @"UPDATE tblRoot SET ConfVersion=?;";
const string msSqlAlter = @"
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[tblCons]') AND name = 'StartProgram')
BEGIN
ALTER TABLE tblCons ADD StartProgram varchar(512), StartProgramWorkDir varchar(512);
END;GO;
ALTER TABLE tblRoot MODIFY COLUMN ConfVersion varchar(15);GO;";
const string msSqlUpdate = @"UPDATE tblRoot SET ConfVersion=@confVersion;";
using (var sqlTran = _databaseConnector.DbConnection().BeginTransaction(System.Data.IsolationLevel.Serializable))
{
DbCommand dbCommand;
if (_databaseConnector.GetType() == typeof(MSSqlDatabaseConnector))
{
dbCommand = _databaseConnector.DbCommand(msSqlAlter);
dbCommand.Transaction = sqlTran;
dbCommand.ExecuteNonQuery();
dbCommand = _databaseConnector.DbCommand(msSqlUpdate);
dbCommand.Transaction = sqlTran;
}
else if (_databaseConnector.GetType() == typeof(MySqlDatabaseConnector))
{
dbCommand = _databaseConnector.DbCommand(mySqlAlter);
dbCommand.Transaction = sqlTran;
dbCommand.ExecuteNonQuery();
dbCommand = _databaseConnector.DbCommand(mySqlUpdate);
dbCommand.Transaction = sqlTran;
}
else
{
throw new Exception("Unknown database back-end");
}
var pConfVersion = dbCommand.CreateParameter();
pConfVersion.ParameterName = "confVersion";
pConfVersion.Value = version.ToString();
pConfVersion.DbType = System.Data.DbType.String;
pConfVersion.Direction = System.Data.ParameterDirection.Input;
dbCommand.Parameters.Add(pConfVersion);
dbCommand.ExecuteNonQuery();
sqlTran.Commit();
}
return version;
}
}
}

View File

@@ -77,9 +77,6 @@ namespace mRemoteNG.Config.Settings
if (persistString == typeof(ErrorAndInfoWindow).ToString())
return Windows.ErrorsForm;
if (persistString == typeof(ScreenshotManagerWindow).ToString())
return Windows.ScreenshotForm;
}
catch (Exception ex)
{

File diff suppressed because it is too large Load Diff

View File

@@ -15,8 +15,9 @@ using mRemoteNG.Connection.Protocol.Telnet;
using mRemoteNG.Connection.Protocol.VNC;
using mRemoteNG.Container;
using mRemoteNG.Properties;
using mRemoteNG.Resources.Language;
using mRemoteNG.Tree;
using mRemoteNG.Resources.Language;
using mRemoteNG.Tree.Root;
namespace mRemoteNG.Connection
@@ -46,10 +47,10 @@ namespace mRemoteNG.Connection
[Browsable(false)] public ContainerInfo Parent { get; internal set; }
[Browsable(false)]
// ReSharper disable once UnusedAutoPropertyAccessor.Global
public bool IsQuickConnect { get; set; }
[Browsable(false)] public bool PleaseConnect { get; set; }
[Browsable(false)]
public bool PleaseConnect { get; set; }
#endregion
@@ -66,6 +67,7 @@ namespace mRemoteNG.Connection
SetTreeDisplayDefaults();
SetConnectionDefaults();
SetProtocolDefaults();
SetRemoteDesktopServicesDefaults();
SetRdGatewayDefaults();
SetAppearanceDefaults();
SetRedirectDefaults();
@@ -199,7 +201,10 @@ namespace mRemoteNG.Connection
private bool ShouldThisPropertyBeInherited(string propertyName)
{
return ParentIsValidInheritanceTarget() && IsInheritanceTurnedOnForThisProperty(propertyName);
return
Inheritance.InheritanceActive &&
ParentIsValidInheritanceTarget() &&
IsInheritanceTurnedOnForThisProperty(propertyName);
}
private bool ParentIsValidInheritanceTarget()
@@ -291,6 +296,7 @@ namespace mRemoteNG.Connection
private void SetConnectionDefaults()
{
Hostname = string.Empty;
EC2Region = Settings.Default.ConDefaultEC2Region;
}
private void SetProtocolDefaults()
@@ -310,6 +316,12 @@ namespace mRemoteNG.Connection
UseEnhancedMode = Settings.Default.ConDefaultUseEnhancedMode;
}
private void SetRemoteDesktopServicesDefaults()
{
RDPStartProgram = string.Empty;
RDPStartProgramWorkDir = string.Empty;
}
private void SetRdGatewayDefaults()
{
RDGatewayUsageMethod = (RDGatewayUsageMethod)Enum.Parse(typeof(RDGatewayUsageMethod), Settings.Default.ConDefaultRDGatewayUsageMethod);
@@ -356,7 +368,9 @@ namespace mRemoteNG.Connection
MacAddress = Settings.Default.ConDefaultMacAddress;
UserField = Settings.Default.ConDefaultUserField;
Favorite = Settings.Default.ConDefaultFavorite;
StartProgram = Settings.Default.ConDefaultStartProgram;
RDPStartProgram = Settings.Default.ConDefaultRDPStartProgram;
RDPStartProgramWorkDir = Settings.Default.ConDefaultRDPStartProgram;
OpeningCommand = Settings.Default.OpeningCommand;
}
private void SetVncDefaults()

View File

@@ -2,8 +2,9 @@
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using mRemoteNG.Resources.Language;
using mRemoteNG.Tools;
using mRemoteNG.Tree.Root;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection
{
@@ -50,6 +51,12 @@ namespace mRemoteNG.Connection
#endregion
#region Connection
[LocalizedAttributes.LocalizedCategory(nameof(Language.Connection), 3),
LocalizedAttributes.LocalizedDisplayNameInherit(nameof(Language.UserViaAPI)),
LocalizedAttributes.LocalizedDescriptionInherit(nameof(Language.PropertyDescriptionUserViaAPI)),
TypeConverter(typeof(MiscTools.YesNoTypeConverter))]
[Browsable(true)]
public bool UserViaAPI { get; set; }
[LocalizedAttributes.LocalizedCategory(nameof(Language.Connection), 3),
LocalizedAttributes.LocalizedDisplayNameInherit(nameof(Language.Username)),
@@ -92,6 +99,15 @@ namespace mRemoteNG.Connection
[Browsable(true)]
public bool SSHTunnelConnectionName { get; set; }
[LocalizedAttributes.LocalizedCategory(nameof(Language.Connection), 3),
LocalizedAttributes.LocalizedDisplayNameInheritAttribute(nameof(Language.OpeningCommand)),
LocalizedAttributes.LocalizedDescriptionInheritAttribute(nameof(Language.PropertyDescriptionOpeningCommand)),
TypeConverter(typeof(MiscTools.YesNoTypeConverter))]
[Browsable(true)]
public bool OpeningCommand { get; set; }
#endregion
#region Protocol
@@ -446,7 +462,16 @@ namespace mRemoteNG.Connection
TypeConverter(typeof(MiscTools.YesNoTypeConverter))]public bool VNCViewOnly {get; set;}
#endregion
[Browsable(false)] public ConnectionInfo Parent { get; private set; }
[Browsable(false)]
public ConnectionInfo Parent { get; private set; }
/// <summary>
/// Indicates whether this inheritance object is enabled.
/// When false, users of this object should not respect inheritance
/// settings for individual properties.
/// </summary>
[Browsable(false)]
public bool InheritanceActive => !(Parent is RootNodeInfo || Parent?.Parent is RootNodeInfo);
#endregion
@@ -463,7 +488,6 @@ namespace mRemoteNG.Connection
{
var newInheritance = (ConnectionInfoInheritance)MemberwiseClone();
newInheritance.Parent = parent;
newInheritance._tempInheritanceStorage = null;
return newInheritance;
}
@@ -521,15 +545,22 @@ namespace mRemoteNG.Connection
/// <returns></returns>
public IEnumerable<string> GetEnabledInheritanceProperties()
{
return GetProperties()
.Where(property => (bool)property.GetValue(this))
.Select(property => property.Name)
.ToList();
return InheritanceActive
? GetProperties()
.Where(property => (bool)property.GetValue(this))
.Select(property => property.Name)
.ToList()
: Enumerable.Empty<string>();
}
private bool FilterProperty(PropertyInfo propertyInfo)
{
var exclusions = new[] {"EverythingInherited", "Parent"};
var exclusions = new[]
{
nameof(EverythingInherited),
nameof(Parent),
nameof(InheritanceActive)
};
var valueShouldNotBeFiltered = !exclusions.Contains(propertyInfo.Name);
return valueShouldNotBeFiltered;
}

View File

@@ -6,12 +6,12 @@ using mRemoteNG.Connection.Protocol;
using mRemoteNG.Container;
using mRemoteNG.Messages;
using mRemoteNG.Properties;
using mRemoteNG.Resources.Language;
using mRemoteNG.UI.Forms;
using mRemoteNG.UI.Panels;
using mRemoteNG.UI.Tabs;
using mRemoteNG.UI.Window;
using WeifenLuo.WinFormsUI.Docking;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection
@@ -62,6 +62,19 @@ namespace mRemoteNG.Connection
try
{
if (!string.IsNullOrEmpty(connectionInfo.EC2InstanceId))
{
try
{
string host = await ExternalConnectors.AWS.EC2FetchDataService.GetEC2InstanceDataAsync("AWSAPI:" + connectionInfo.EC2InstanceId, connectionInfo.EC2Region);
if (!string.IsNullOrEmpty(host))
connectionInfo.Hostname = host;
}
catch
{
}
}
if (connectionInfo.Hostname == "" && connectionInfo.Protocol != ProtocolType.IntApp)
{
Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg,

View File

@@ -13,12 +13,12 @@ using mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Messages;
using mRemoteNG.Properties;
using mRemoteNG.Resources.Language;
using mRemoteNG.Security;
using mRemoteNG.Tools;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNG.UI;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection
{
@@ -37,6 +37,7 @@ namespace mRemoteNG.Connection
public string ConnectionFileName { get; private set; }
public RemoteConnectionsSyncronizer RemoteConnectionsSyncronizer { get; set; }
public DateTime LastSqlUpdate { get; set; }
public DateTime LastFileUpdate { get; set; }
public ConnectionTreeModel ConnectionTreeModel { get; private set; }
@@ -77,10 +78,16 @@ namespace mRemoteNG.Connection
if (connectionString.Contains("@"))
{
string[] x = connectionString.Split('@');
var x = connectionString.Split('@');
uriBuilder.UserName = x[0];
uriBuilder.Host = x[1];
}
if (uriBuilder.Host.Contains(":"))
{
var x = uriBuilder.Host.Split(':');
uriBuilder.Host = x[0];
uriBuilder.Port = Convert.ToInt32(x[1]);
}
else
uriBuilder.Host = connectionString;
@@ -92,16 +99,12 @@ namespace mRemoteNG.Connection
: uriBuilder.Host;
newConnectionInfo.Protocol = protocol;
newConnectionInfo.Hostname = uriBuilder.Host;
newConnectionInfo.Username = uriBuilder.UserName;
if (uriBuilder.Port == -1)
{
newConnectionInfo.SetDefaultPort();
}
else
{
newConnectionInfo.Port = uriBuilder.Port;
}
if (string.IsNullOrEmpty(newConnectionInfo.Panel))
newConnectionInfo.Panel = Language.General;

View File

@@ -1,34 +0,0 @@
// Copyright © 2013 The CefSharp Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
using CefSharp;
using System;
namespace mRemoteNG.Connection.Protocol.Http
{
public class DownloadHandler : IDownloadHandler
{
public event EventHandler<DownloadItem> OnBeforeDownloadFired;
public event EventHandler<DownloadItem> OnDownloadUpdatedFired;
public void OnBeforeDownload(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
{
OnBeforeDownloadFired?.Invoke(this, downloadItem);
if (!callback.IsDisposed)
{
using (callback)
{
callback.Continue(downloadItem.SuggestedFileName, showDialog: true);
}
}
}
public void OnDownloadUpdated(IWebBrowser chromiumWebBrowser, IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
{
OnDownloadUpdatedFired?.Invoke(this, downloadItem);
}
}
}

View File

@@ -1,68 +0,0 @@
using CefSharp;
using System.Diagnostics;
using System.Security.Cryptography.X509Certificates;
namespace mRemoteNG.Connection.Protocol.Http
{
partial class RequestHandler : IRequestHandler
{
public bool GetAuthCredentials(IWebBrowser chromiumWebBrowser, IBrowser browser, string originUrl, bool isProxy, string host, int port, string realm, string scheme, IAuthCallback callback)
{
return false;
}
public IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
{
return null;
}
public bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect)
{
if (request.Url.StartsWith(Cef.CefCommitHash))
{
return false;
}
else
{
Process.Start(request.Url);
return true;
}
}
public void OnDocumentAvailableInMainFrame(IWebBrowser chromiumWebBrowser, IBrowser browser)
{
}
public bool OnCertificateError(IWebBrowser chromiumWebBrowser, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback)
{
return false;
}
public bool OnOpenUrlFromTab(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
{
return false;
}
public void OnPluginCrashed(IWebBrowser chromiumWebBrowser, IBrowser browser, string pluginPath)
{
}
public bool OnQuotaRequest(IWebBrowser chromiumWebBrowser, IBrowser browser, string originUrl, long newSize, IRequestCallback callback)
{
return true;
}
public void OnRenderProcessTerminated(IWebBrowser chromiumWebBrowser, IBrowser browser, CefTerminationStatus status)
{
}
public void OnRenderViewReady(IWebBrowser chromiumWebBrowser, IBrowser browser)
{
}
public bool OnSelectClientCertificate(IWebBrowser chromiumWebBrowser, IBrowser browser, bool isProxy, string host, int port, X509Certificate2Collection certificates, ISelectClientCertificateCallback callback)
{
return true;
}
}
}

View File

@@ -1,11 +1,10 @@
using System;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
using Microsoft.Web.WebView2.WinForms;
using mRemoteNG.Tools;
using mRemoteNG.App;
using mRemoteNG.Resources.Language;
using mRemoteNG.UI.Tabs;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.Http
@@ -14,24 +13,22 @@ namespace mRemoteNG.Connection.Protocol.Http
{
#region Private Properties
private Control wBrowser;
private Control _wBrowser;
private string _tabTitle;
protected string httpOrS;
protected int defaultPort;
private string tabTitle;
private bool browserInitialised = false;
private bool connectCalled = false;
#endregion
#region Public Methods
protected HTTPBase(RenderingEngine RenderingEngine)
protected HTTPBase(RenderingEngine renderingEngine)
{
try
{
if (RenderingEngine == RenderingEngine.CEF)
if (renderingEngine == RenderingEngine.EdgeChromium)
{
Control = new ChromiumWebBrowser("about:blank")
Control = new WebView2()
{
Dock = DockStyle.Fill,
};
@@ -53,33 +50,26 @@ namespace mRemoteNG.Connection.Protocol.Http
try
{
if (InterfaceControl.Parent is ConnectionTab objConnectionTab) tabTitle = objConnectionTab.TabText;
if (InterfaceControl.Parent is ConnectionTab objConnectionTab) _tabTitle = objConnectionTab.TabText;
}
catch (Exception)
{
tabTitle = "";
_tabTitle = "";
}
try
{
wBrowser = Control;
_wBrowser = Control;
if (InterfaceControl.Info.RenderingEngine == RenderingEngine.CEF)
if (InterfaceControl.Info.RenderingEngine == RenderingEngine.EdgeChromium)
{
var CEFBrowser = (ChromiumWebBrowser)wBrowser;
if (CEFBrowser != null)
{
CEFBrowser.LoadingStateChanged += CefBrowser_LoadingStateChanged;
CEFBrowser.TitleChanged += WBrowser_DocumentTitleChanged;
}
else
{
throw new Exception("Failed to initialize CEF Rendering Engine.");
}
var edge = (WebView2)_wBrowser;
edge.CoreWebView2InitializationCompleted += Edge_CoreWebView2InitializationCompleted;
}
else
{
var objWebBrowser = (WebBrowser)wBrowser;
var objWebBrowser = (WebBrowser)_wBrowser;
objWebBrowser.ScrollBarsEnabled = true;
// http://stackoverflow.com/questions/4655662/how-to-ignore-script-errors-in-webbrowser
@@ -87,7 +77,6 @@ namespace mRemoteNG.Connection.Protocol.Http
objWebBrowser.Navigated += WBrowser_Navigated;
objWebBrowser.DocumentTitleChanged += WBrowser_DocumentTitleChanged;
browserInitialised = true;
}
return true;
@@ -103,20 +92,16 @@ namespace mRemoteNG.Connection.Protocol.Http
{
try
{
if (InterfaceControl.Info.RenderingEngine == RenderingEngine.CEF)
if (InterfaceControl.Info.RenderingEngine == RenderingEngine.EdgeChromium)
{
if (browserInitialised)
{
((ChromiumWebBrowser)wBrowser).Load(GetURL());
}
((WebView2)_wBrowser).Source = new Uri(GetUrl());
}
else
{
((WebBrowser)wBrowser).Navigate(GetURL());
((WebBrowser)_wBrowser).Navigate(GetUrl());
}
base.Connect();
connectCalled = true;
return true;
}
catch (Exception ex)
@@ -130,22 +115,12 @@ namespace mRemoteNG.Connection.Protocol.Http
#region Private Methods
private string GetURL()
private string GetUrl()
{
try
{
var strHost = InterfaceControl.Info.Hostname;
/*
* Commenting out since this codes doesn't actually do anything at this time...
* Possibly related to MR-221 and/or MR-533 ????
*
string strAuth = "";
if (((int)Force & (int)ConnectionInfo.Force.NoCredentials) != (int)ConnectionInfo.Force.NoCredentials && !string.IsNullOrEmpty(InterfaceControl.Info.Username) && !string.IsNullOrEmpty(InterfaceControl.Info.Password))
{
strAuth = "Authorization: Basic " + Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(InterfaceControl.Info.Username + ":" + InterfaceControl.Info.Password)) + Environment.NewLine;
}
*/
if (InterfaceControl.Info.Port != defaultPort)
{
if (strHost.EndsWith("/"))
@@ -161,6 +136,7 @@ namespace mRemoteNG.Connection.Protocol.Http
if (strHost.Contains(httpOrS + "://") == false)
strHost = httpOrS + "://" + strHost;
}
return strHost;
}
catch (Exception ex)
@@ -174,26 +150,17 @@ namespace mRemoteNG.Connection.Protocol.Http
#region Events
private void CefBrowser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
private void Edge_CoreWebView2InitializationCompleted(object sender, Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs e)
{
browserInitialised = !e.IsLoading;
if (browserInitialised)
if (!e.IsSuccess)
{
// Unhook the loading state changes now, as navigation is done by the user on links in the control
((ChromiumWebBrowser)wBrowser).LoadingStateChanged -= CefBrowser_LoadingStateChanged;
// If this Connection has already been asked to connect but the browser hadn't finished initalising
// then the connect wouldn't have been allowed to take place, so now we can call it!
if (connectCalled)
{
Connect();
}
Runtime.MessageCollector.AddExceptionStackTrace(Language.HttpFailedUrlBuild, e.InitializationException);
}
}
private void WBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
if (!(wBrowser is WebBrowser objWebBrowser)) return;
if (!(_wBrowser is WebBrowser objWebBrowser)) return;
// This can only be set once the WebBrowser control is shown, it will throw a COM exception otherwise.
objWebBrowser.AllowWebBrowserDrop = false;
@@ -207,33 +174,18 @@ namespace mRemoteNG.Connection.Protocol.Http
{
if (!(InterfaceControl.Parent is ConnectionTab tabP)) return;
string shortTitle;
if (InterfaceControl.Info.RenderingEngine == RenderingEngine.CEF)
if (((WebBrowser)_wBrowser).DocumentTitle.Length >= 15)
{
if (((TitleChangedEventArgs)e).Title.Length >= 15)
{
shortTitle = ((TitleChangedEventArgs)e).Title.Substring(0, 10) + "...";
}
else
{
shortTitle = ((CefSharp.TitleChangedEventArgs)e).Title;
}
shortTitle = ((WebBrowser)_wBrowser).DocumentTitle.Substring(0, 10) + "...";
}
else
{
if (((WebBrowser)wBrowser).DocumentTitle.Length >= 15)
{
shortTitle = ((WebBrowser)wBrowser).DocumentTitle.Substring(0, 10) + "...";
}
else
{
shortTitle = ((WebBrowser)wBrowser).DocumentTitle;
}
shortTitle = ((WebBrowser)_wBrowser).DocumentTitle;
}
if (!string.IsNullOrEmpty(tabTitle))
if (!string.IsNullOrEmpty(_tabTitle))
{
tabP.TabText = tabTitle + @" - " + shortTitle;
tabP.TabText = _tabTitle + @" - " + shortTitle;
}
else
{
@@ -246,38 +198,6 @@ namespace mRemoteNG.Connection.Protocol.Http
}
}
private void geckoBrowser_DocumentTitleChanged(object sender, EventArgs e)
{
try
{
if (!(InterfaceControl.Parent is ConnectionTab tabP)) return;
string shortTitle;
if (((WebBrowser)wBrowser).DocumentTitle.Length >= 15)
{
shortTitle = ((WebBrowser)wBrowser).DocumentTitle.Substring(0, 10) + "...";
}
else
{
shortTitle = ((WebBrowser)wBrowser).DocumentTitle;
}
if (!string.IsNullOrEmpty(tabTitle))
{
tabP.TabText = tabTitle + @" - " + shortTitle;
}
else
{
tabP.TabText = shortTitle;
}
}
catch (Exception ex)
{
Runtime.MessageCollector.AddExceptionStackTrace(Language.HttpDocumentTileChangeFailed, ex);
}
}
#endregion
#region Enums
@@ -288,7 +208,7 @@ namespace mRemoteNG.Connection.Protocol.Http
IE = 1,
[LocalizedAttributes.LocalizedDescription(nameof(Language.HttpCEF))]
CEF = 2
EdgeChromium = 2
}
#endregion

View File

@@ -6,8 +6,8 @@ using System.Windows.Forms;
using mRemoteNG.App;
using mRemoteNG.Messages;
using mRemoteNG.Properties;
using mRemoteNG.Resources.Language;
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol
{

View File

@@ -1,5 +1,5 @@
using mRemoteNG.Resources.Language;
using mRemoteNG.Tools;
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol
{

View File

@@ -82,6 +82,19 @@ namespace mRemoteNG.Connection.Protocol
var username = "";
var password = "";
// access secret server api if necessary
if (!string.IsNullOrEmpty(InterfaceControl.Info?.UserViaAPI))
{
var domain = ""; // dummy
try
{
ExternalConnectors.TSS.SecretServerInterface.FetchSecretFromServer("SSAPI:" + InterfaceControl.Info?.UserViaAPI, out username, out password, out domain);
}
catch (Exception ex)
{
Event_ErrorOccured(this, "Secret Server Interface Error: " + ex.Message, 0);
}
}
if (!string.IsNullOrEmpty(InterfaceControl.Info?.Username))
{
username = InterfaceControl.Info.Username;
@@ -188,6 +201,13 @@ namespace mRemoteNG.Connection.Protocol
string.Format(Language.PanelHandle,
InterfaceControl.Parent.Handle), true);
if (!string.IsNullOrEmpty(InterfaceControl.Info?.OpeningCommand))
{
NativeMethods.SetForegroundWindow(PuttyHandle);
var finalCommand = InterfaceControl.Info.OpeningCommand.TrimEnd() + "\n";
SendKeys.SendWait(finalCommand);
}
Resize(this, new EventArgs());
base.Connect();
return true;

View File

@@ -1,5 +1,5 @@
using mRemoteNG.Resources.Language;
using mRemoteNG.Tools;
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

View File

@@ -1,5 +1,5 @@
using mRemoteNG.Resources.Language;
using mRemoteNG.Tools;
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

View File

@@ -1,5 +1,5 @@
using mRemoteNG.Resources.Language;
using mRemoteNG.Tools;
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

View File

@@ -1,5 +1,5 @@
using mRemoteNG.Resources.Language;
using mRemoteNG.Tools;
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

View File

@@ -1,6 +1,6 @@
using System.ComponentModel;
using mRemoteNG.Resources.Language;
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

View File

@@ -1,5 +1,5 @@
using mRemoteNG.Resources.Language;
using mRemoteNG.Tools;
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

View File

@@ -1,5 +1,5 @@
using mRemoteNG.Resources.Language;
using mRemoteNG.Tools;
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

File diff suppressed because it is too large Load Diff

View File

@@ -4,8 +4,8 @@ using System.Windows.Forms;
using AxMSTSCLib;
using mRemoteNG.App;
using mRemoteNG.Messages;
using mRemoteNG.Resources.Language;
using MSTSCLib;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

View File

@@ -3,36 +3,20 @@ using System.Threading;
using System.ComponentModel;
using System.Net.Sockets;
using mRemoteNG.App;
using mRemoteNG.Resources.Language;
using mRemoteNG.Tools;
using mRemoteNG.UI.Forms;
using mRemoteNG.Resources.Language;
// ReSharper disable ArrangeAccessorOwnerBody
namespace mRemoteNG.Connection.Protocol.VNC
{
public class ProtocolVNC : ProtocolBase, ISupportsViewOnly
public class ProtocolVNC : ProtocolBase
{
#region Properties
public bool SmartSize
{
get => _vnc.Scaled;
set => _vnc.Scaled = value;
}
public bool ViewOnly
{
get => _vnc.ViewOnly;
set => _vnc.ViewOnly = value;
}
#endregion
#region Private Declarations
private VncSharp.RemoteDesktop _vnc;
private VncSharpCore.RemoteDesktop _vnc;
private ConnectionInfo _info;
private static bool _isConnectionSuccessful;
private static Exception _socketexception;
@@ -44,7 +28,7 @@ namespace mRemoteNG.Connection.Protocol.VNC
public ProtocolVNC()
{
Control = new VncSharp.RemoteDesktop();
Control = new VncSharpCore.RemoteDesktop();
}
public override bool Initialize()
@@ -53,7 +37,7 @@ namespace mRemoteNG.Connection.Protocol.VNC
try
{
_vnc = (VncSharp.RemoteDesktop)Control;
_vnc = (VncSharpCore.RemoteDesktop)Control;
_info = InterfaceControl.Info;
_vnc.VncPort = _info.Port;
@@ -109,10 +93,10 @@ namespace mRemoteNG.Connection.Protocol.VNC
switch (Keys)
{
case SpecialKeys.CtrlAltDel:
_vnc.SendSpecialKeys(VncSharp.SpecialKeys.CtrlAltDel);
_vnc.SendSpecialKeys(VncSharpCore.SpecialKeys.CtrlAltDel);
break;
case SpecialKeys.CtrlEsc:
_vnc.SendSpecialKeys(VncSharp.SpecialKeys.CtrlEsc);
_vnc.SendSpecialKeys(VncSharpCore.SpecialKeys.CtrlEsc);
break;
}
}
@@ -124,36 +108,6 @@ namespace mRemoteNG.Connection.Protocol.VNC
}
}
public void ToggleSmartSize()
{
try
{
SmartSize = !SmartSize;
RefreshScreen();
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg,
Language.VncToggleSmartSizeFailed + Environment.NewLine +
ex.Message, true);
}
}
public void ToggleViewOnly()
{
try
{
ViewOnly = !ViewOnly;
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg,
Language.VncToggleViewOnlyFailed + Environment.NewLine +
ex.Message, true);
}
}
public void StartChat()
{
throw new NotImplementedException();

View File

@@ -1,6 +1,6 @@
using System.ComponentModel;
using mRemoteNG.Resources.Language;
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.VNC
{

View File

@@ -1,12 +1,12 @@
using mRemoteNG.App;
using mRemoteNG.App;
using mRemoteNG.Messages;
using mRemoteNG.Tools;
using System;
using System.ComponentModel;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Resources.Language;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection

View File

@@ -263,6 +263,34 @@ namespace mRemoteNG.Container
return childList;
}
/// <summary>
/// Pushes the connection properties of this container to all
/// children recursively.
/// </summary>
public void ApplyConnectionPropertiesToChildren()
{
var children = GetRecursiveChildList();
foreach (var child in children)
{
child.CopyFrom(this);
}
}
/// <summary>
/// Pushes the inheritance settings of this container to all
/// children recursively.
/// </summary>
public void ApplyInheritancePropertiesToChildren()
{
var children = GetRecursiveChildList();
foreach (var child in children)
{
child.Inheritance = Inheritance.Clone(child);
}
}
private IEnumerable<ConnectionInfo> GetRecursiveFavoritChildList(ContainerInfo container)
{
var childList = new List<ConnectionInfo>();

View File

@@ -2,8 +2,8 @@
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using mRemoteNG.Resources.Language;
using mRemoteNG.Tree;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Credential

View File

@@ -1,13 +0,0 @@
/* override table width restrictions */
@media screen and (min-width: 767px) {
.wy-table-responsive table td {
/* !important prevents the common CSS stylesheets from overriding
this as on RTD they are loaded after this stylesheet */
white-space: normal !important;
}
.wy-table-responsive {
overflow: visible !important;
}
}

View File

@@ -1,233 +0,0 @@
# -*- coding: utf-8 -*-
#
# Configuration file for the Sphinx documentation builder.
#
# This file does only contain a selection of the most common options. For a
# full list see the documentation:
# http://www.sphinx-doc.org/en/master/config
# -- Path setup --------------------------------------------------------------
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))
# -- Project information -----------------------------------------------------
project = 'mRemoteNG'
copyright = '2020 The mRemoteNG Team'
author = 'The mRemoteNG Team'
# The short X.Y version
version = '0.0'
# The full version, including alpha/beta/rc tags
release = '0.0.alpha'
######################### Begin mRemoteNG Stuff ###############################
import re
# Load assembly information
try:
file = open("..\\Properties\\AssemblyInfo.cs", "r")
for line in file:
if re.match(r'(\[assembly: AssemblyTitle.*)', line):
project = line
elif re.match(r'(\[assembly: AssemblyCompany.*)', line):
author = line
elif re.match(r'(\[assembly: AssemblyVersion.*)', line):
version = line
release = line
elif re.match(r'(\[assembly: AssemblyCopyright.*)', line):
copyright = line
project = re.search(r'\".*\"', project)
project = project.group(0).replace('\"', '')
author = re.search(r'\".*\"', author)
author = author.group(0).replace('\"', '')
version = re.search(r'\".*\"', version)
version = re.search(r'\"[\d].[\d].', version.group(0))
version = version.group(0).replace('\"', '')
release = re.search(r'\".*\"', release)
release = release.group(0).replace('\"', '')
copyright = re.search(r'\".*\"', copyright)
copyright = copyright.group(0).replace('\"', '')
except:
print("Assembly file cannot be found, using default values")
########################### End mRemoteNG Stuff ###############################
# -- General configuration ---------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.For a full list see the documentation:
# http://www.sphinx-doc.org/en/master/usage/extensions/index.html
#extensions = [
#]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The master toctree document.
master_doc = 'index'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = None
# -- Options for HTML output -------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'sphinx_rtd_theme'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
# html_theme_options = {}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
#
# The default sidebars (for documents that don't match any pattern) are
# defined by theme itself. Builtin themes are using these templates by
# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
# 'searchbox.html']``.
# Remove page source editing
html_show_sourcelink = False
# -- Options for HTMLHelp output ---------------------------------------------
# Output file base name for HTML help builder.
htmlhelp_basename = 'mRemoteNGdoc'
# -- Options for LaTeX output ------------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'mRemoteNG.tex', 'mRemoteNG Documentation',
'The mRemoteNG Team', 'manual'),
]
# -- Options for manual page output ------------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'mremoteng', 'mRemoteNG Documentation',
[author], 1)
]
# -- Options for Texinfo output ----------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'mRemoteNG', 'mRemoteNG Documentation',
author, 'mRemoteNG', 'One line description of project.',
'Miscellaneous'),
]
# -- Options for Epub output -------------------------------------------------
# Bibliographic Dublin Core info.
epub_title = project
# The unique identifier of the text. This can be a ISBN number
# or the project homepage.
#
# epub_identifier = ''
# A unique identification for the text.
#
# epub_uid = ''
# A list of files that should not be packed into the epub file.
epub_exclude_files = ['search.html']
# -- Extension configuration -------------------------------------------------
# -- Options for todo extension ----------------------------------------------
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = True
html_context = {
'css_files': [
'_static/theme_overrides.css', # override wide tables in RTD theme
],
}

View File

@@ -9,6 +9,9 @@
//------------------------------------------------------------------------------
namespace mRemoteNG.Resources.Language {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
@@ -16,7 +19,7 @@ namespace mRemoteNG.Resources.Language {
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Language {
@@ -36,7 +39,7 @@ namespace mRemoteNG.Resources.Language {
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("mRemoteNG.Resources.Language.Language", typeof(Language).Assembly);
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("mRemoteNG.Language.Language", typeof(Language).Assembly);
resourceMan = temp;
}
return resourceMan;
@@ -85,7 +88,7 @@ namespace mRemoteNG.Resources.Language {
}
/// <summary>
/// Looks up a localized string similar to &amp;Warn me when closing connections.
/// Looks up a localized string similar to Warn me when closing connections.
/// </summary>
internal static string _CloseWarnAll {
get {
@@ -93,15 +96,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to &amp;Connect:.
/// </summary>
internal static string _Connect {
get {
return ResourceManager.GetString("_Connect", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &amp;Delete.
/// </summary>
@@ -382,7 +376,25 @@ namespace mRemoteNG.Resources.Language {
}
/// <summary>
/// Looks up a localized string similar to Arguments.
/// Sucht eine lokalisierte Zeichenfolge, die Apply default inheritance ähnelt.
/// </summary>
internal static string ApplyDefaultInheritance {
get {
return ResourceManager.GetString("ApplyDefaultInheritance", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Apply inheritance to children ähnelt.
/// </summary>
internal static string ApplyInheritanceToChildren {
get {
return ResourceManager.GetString("ApplyInheritanceToChildren", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Arguments ähnelt.
/// </summary>
internal static string Arguments {
get {
@@ -516,15 +528,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Basic.
/// </summary>
internal static string Basic {
get {
return ResourceManager.GetString("Basic", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Default Inheritance.
/// </summary>
@@ -570,93 +573,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to ICA requires that the XenDesktop Online Plugin is installed and that the wfica.ocx library is registered. You can download the client here: http://www.citrix.com/download/.
/// </summary>
internal static string CcICAFailed {
get {
return ResourceManager.GetString("CcICAFailed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to All ICA components were found and seem to be registered properly.
///Citrix ICA Client Control Version {0}.
/// </summary>
internal static string CcICAOK {
get {
return ResourceManager.GetString("CcICAOK", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to not installed properly.
/// </summary>
internal static string CcNotInstalledProperly {
get {
return ResourceManager.GetString("CcNotInstalledProperly", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The SSH, Telnet, Rlogin and RAW protocols need PuTTY to work. PuTTY comes with every mRemoteNG package and is located in the installation path.
///Please make sure that either you have the Putty.exe in your mRemoteNG directory (default: c:\Program Files\mRemoteNG\) or that you specified a valid path to your PuTTY executable in the Options (Tools - Options - Advanced - Custom PuTTY path).
/// </summary>
internal static string CcPuttyFailed {
get {
return ResourceManager.GetString("CcPuttyFailed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The PuTTY executable was found and should be ready to use..
/// </summary>
internal static string CcPuttyOK {
get {
return ResourceManager.GetString("CcPuttyOK", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to For RDP to work properly you need to have at least Remote Desktop Connection (Terminal Services) Client 8.0 installed. You can download it here: http://support.microsoft.com/kb/925876
///If this check still fails or you are unable to use RDP, please consult the at {0}..
/// </summary>
internal static string CcRDPFailed {
get {
return ResourceManager.GetString("CcRDPFailed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The following RDP protocol versions are supported on this machine: {0}.
/// </summary>
internal static string CcRDPOK {
get {
return ResourceManager.GetString("CcRDPOK", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to VNC requires VncSharp.dll to be located in your mRemoteNG application folder.
///Please make sure that you have the VncSharp.dll file in your mRemoteNG application folder (usually C:\Program Files\mRemoteNG\).
///If you are still not able to pass this check or use VNC in mRemoteNG please consult the at {0}..
/// </summary>
internal static string CcVNCFailed {
get {
return ResourceManager.GetString("CcVNCFailed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to All VNC components were found and seem to be registered properly.
///VncSharp Control Version {0}.
/// </summary>
internal static string CcVNCOK {
get {
return ResourceManager.GetString("CcVNCOK", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Change.
/// </summary>
@@ -774,15 +690,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Checking for updates....
/// </summary>
internal static string CheckingForUpdates {
get {
return ResourceManager.GetString("CheckingForUpdates", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Check now.
/// </summary>
@@ -801,15 +708,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Check succeeded!.
/// </summary>
internal static string CheckSucceeded {
get {
return ResourceManager.GetString("CheckSucceeded", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Choose a path for the mRemoteNG log file.
/// </summary>
@@ -945,15 +843,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Components Check.
/// </summary>
internal static string ComponentsCheck {
get {
return ResourceManager.GetString("ComponentsCheck", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Compression.
/// </summary>
@@ -1279,11 +1168,47 @@ namespace mRemoteNG.Resources.Language {
}
/// <summary>
/// Looks up a localized string similar to Connections and Config.
/// Looks up a localized string similar to Daily.
/// </summary>
internal static string ConnectionsAndConfig {
internal static string ConnectionsBackupFrequencyDaily {
get {
return ResourceManager.GetString("ConnectionsAndConfig", resourceCulture);
return ResourceManager.GetString("ConnectionsBackupFrequencyDaily", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Never backup connections.
/// </summary>
internal static string ConnectionsBackupFrequencyNever {
get {
return ResourceManager.GetString("ConnectionsBackupFrequencyNever", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to On Edit.
/// </summary>
internal static string ConnectionsBackupFrequencyOnEdit {
get {
return ResourceManager.GetString("ConnectionsBackupFrequencyOnEdit", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to On Exit.
/// </summary>
internal static string ConnectionsBackupFrequencyOnExit {
get {
return ResourceManager.GetString("ConnectionsBackupFrequencyOnExit", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Weekly.
/// </summary>
internal static string ConnectionsBackupFrequencyWeekly {
get {
return ResourceManager.GetString("ConnectionsBackupFrequencyWeekly", resourceCulture);
}
}
@@ -1558,15 +1483,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Delete Connection....
/// </summary>
internal static string DeleteConnection {
get {
return ResourceManager.GetString("DeleteConnection", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Delete External Tool....
/// </summary>
@@ -1576,15 +1492,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Delete Folder....
/// </summary>
internal static string DeleteFolder {
get {
return ResourceManager.GetString("DeleteFolder", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Description.
/// </summary>
@@ -1719,7 +1626,50 @@ namespace mRemoteNG.Resources.Language {
return ResourceManager.GetString("Domain", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to EC2InstanceId.
/// </summary>
internal static string EC2InstanceId
{
get
{
return ResourceManager.GetString("EC2InstanceId", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to PropertyDescriptionEC2InstanceId.
/// </summary>
internal static string PropertyDescriptionEC2InstanceId
{
get
{
return ResourceManager.GetString("PropertyDescriptionEC2InstanceId", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to EC2InstanceId.
/// </summary>
internal static string EC2Region
{
get
{
return ResourceManager.GetString("EC2Region", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to PropertyDescriptionEC2InstanceId.
/// </summary>
internal static string PropertyDescriptionEC2Region
{
get
{
return ResourceManager.GetString("PropertyDescriptionEC2Region", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Donate.
/// </summary>
@@ -1801,24 +1751,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Duplicate Connection.
/// </summary>
internal static string DuplicateConnection {
get {
return ResourceManager.GetString("DuplicateConnection", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Duplicate Folder.
/// </summary>
internal static string DuplicateFolder {
get {
return ResourceManager.GetString("DuplicateFolder", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Duplicate Tab.
/// </summary>
@@ -1864,42 +1796,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to 128-bit.
/// </summary>
internal static string Enc128Bit {
get {
return ResourceManager.GetString("Enc128Bit", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to 128-bit (logon only).
/// </summary>
internal static string Enc128BitLogonOnly {
get {
return ResourceManager.GetString("Enc128BitLogonOnly", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to 40-bit.
/// </summary>
internal static string Enc40Bit {
get {
return ResourceManager.GetString("Enc40Bit", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to 56-bit.
/// </summary>
internal static string Enc56Bit {
get {
return ResourceManager.GetString("Enc56Bit", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Encoding.
/// </summary>
@@ -1945,15 +1841,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Encryption Strength.
/// </summary>
internal static string EncryptionStrength {
get {
return ResourceManager.GetString("EncryptionStrength", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Encryption Test.
/// </summary>
@@ -2535,7 +2422,7 @@ namespace mRemoteNG.Resources.Language {
}
/// <summary>
/// Looks up a localized string similar to CEF (Chromium).
/// Looks up a localized string similar to Edge Chromium.
/// </summary>
internal static string HttpCEF {
get {
@@ -2606,69 +2493,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to ICA.
/// </summary>
internal static string ICA {
get {
return ResourceManager.GetString("ICA", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Couldn&apos;t create new ICA Connection!.
/// </summary>
internal static string IcaConnectionFailed {
get {
return ResourceManager.GetString("IcaConnectionFailed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Loading ICA Plugin failed!.
/// </summary>
internal static string IcaControlFailed {
get {
return ResourceManager.GetString("IcaControlFailed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to ICA SetCredentials failed!.
/// </summary>
internal static string IcaSetCredentialsFailed {
get {
return ResourceManager.GetString("IcaSetCredentialsFailed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to ICA Set Event Handlers Failed!.
/// </summary>
internal static string IcaSetEventHandlersFailed {
get {
return ResourceManager.GetString("IcaSetEventHandlersFailed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to ICA Set Props Failed!.
/// </summary>
internal static string IcaSetPropsFailed {
get {
return ResourceManager.GetString("IcaSetPropsFailed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to ICA Set Resolution Failed!.
/// </summary>
internal static string IcaSetResolutionFailed {
get {
return ResourceManager.GetString("IcaSetResolutionFailed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Icon.
/// </summary>
@@ -2696,15 +2520,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Import failed.
/// </summary>
internal static string ImportFailed {
get {
return ResourceManager.GetString("ImportFailed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to An error occurred while importing the file &quot;{0}&quot;..
/// </summary>
@@ -2759,15 +2574,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Installed version.
/// </summary>
internal static string InstalledVersion {
get {
return ResourceManager.GetString("InstalledVersion", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Dispose of Int App process failed!.
/// </summary>
@@ -2831,15 +2637,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Jump to.
/// </summary>
internal static string JumpTo {
get {
return ResourceManager.GetString("JumpTo", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to (Automatically Detect).
/// </summary>
@@ -3390,6 +3187,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Opening Command.
/// </summary>
internal static string OpeningCommand {
get {
return ResourceManager.GetString("OpeningCommand", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Open new tab to the right of the currently selected tab.
/// </summary>
@@ -3867,15 +3673,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Select the encryption strength of the remote host..
/// </summary>
internal static string PropertyDescriptionEncryptionStrength {
get {
return ResourceManager.GetString("PropertyDescriptionEncryptionStrength", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Select the external tool to be started..
/// </summary>
@@ -3957,6 +3754,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to A command to run on the remote server after successfully connecting..
/// </summary>
internal static string PropertyDescriptionOpeningCommand {
get {
return ResourceManager.GetString("PropertyDescriptionOpeningCommand", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Sets the panel in which the connection will open..
/// </summary>
@@ -4083,6 +3889,24 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to The program to be started on the remote server upon connection..
/// </summary>
internal static string PropertyDescriptionRDPStartProgram {
get {
return ResourceManager.GetString("PropertyDescriptionRDPStartProgram", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Specifies the working directory of the alternate shell..
/// </summary>
internal static string PropertyDescriptionRDPStartProgramWorkDir {
get {
return ResourceManager.GetString("PropertyDescriptionRDPStartProgramWorkDir", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Sets the version of RDP to use when opening connections..
/// </summary>
@@ -4218,15 +4042,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Start Program.
/// </summary>
internal static string PropertyDescriptionStartProgram {
get {
return ResourceManager.GetString("PropertyDescriptionStartProgram", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Connect to the console session of the remote host..
/// </summary>
@@ -4262,7 +4077,18 @@ namespace mRemoteNG.Resources.Language {
return ResourceManager.GetString("PropertyDescriptionUser1", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Enter your username..
/// </summary>
internal static string PropertyDescriptionUserViaAPI
{
get
{
return ResourceManager.GetString("PropertyDescriptionUserViaAPI", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Enter your username..
/// </summary>
@@ -4705,15 +4531,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Alert on Idle disconnect.
/// </summary>
internal static string RdpAlertIdleTimeout {
get {
return ResourceManager.GetString("RdpAlertIdleTimeout", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Couldn&apos;t create RDP control, please check mRemoteNG requirements..
/// </summary>
@@ -5038,15 +4855,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Smart Size.
/// </summary>
internal static string RdpSmartSize {
get {
return ResourceManager.GetString("RdpSmartSize", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Bring to this computer.
/// </summary>
@@ -5065,6 +4873,24 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Alternate Shell.
/// </summary>
internal static string RDPStartProgram {
get {
return ResourceManager.GetString("RDPStartProgram", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Alternate shell working directory.
/// </summary>
internal static string RDPStartProgramWorkDir {
get {
return ResourceManager.GetString("RDPStartProgramWorkDir", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to RDP ToggleFullscreen failed!.
/// </summary>
@@ -5110,15 +4936,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Reconnect All Open Connections.
/// </summary>
internal static string ReconnectAll {
get {
return ResourceManager.GetString("ReconnectAll", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Reconnect All Connections.
/// </summary>
@@ -5146,6 +4963,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Disk Drives.
/// </summary>
internal static string RedirectDrives {
get {
return ResourceManager.GetString("RedirectDrives", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Key Combinations.
/// </summary>
@@ -5155,6 +4981,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Smart Cards.
/// </summary>
internal static string RedirectSmartCards {
get {
return ResourceManager.GetString("RedirectSmartCards", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Refresh.
/// </summary>
@@ -5184,8 +5019,8 @@ namespace mRemoteNG.Resources.Language {
/// <summary>
/// Looks up a localized string similar to Stable channel includes final releases only.
///Beta channel includes Betas &amp; Release Candidates.
///Development Channel includes Alphas, Betas &amp; Release Candidates..
///Preview channel includes Betas &amp; Release Candidates.
///Nightly Channel includes Alphas, Betas &amp; Release Candidates..
/// </summary>
internal static string ReleaseChannelExplanation {
get {
@@ -5202,6 +5037,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Remote Desktop Services.
/// </summary>
internal static string RemoteDesktopServices {
get {
return ResourceManager.GetString("RemoteDesktopServices", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Remote file.
/// </summary>
@@ -5229,24 +5073,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Rename Connection.
/// </summary>
internal static string RenameConnection {
get {
return ResourceManager.GetString("RenameConnection", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Rename Folder.
/// </summary>
internal static string RenameFolder {
get {
return ResourceManager.GetString("RenameFolder", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Rename Tab.
/// </summary>
@@ -5364,15 +5190,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Save connections on exit.
/// </summary>
internal static string SaveConsOnExit {
get {
return ResourceManager.GetString("SaveConsOnExit", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Graphics Interchange Format File (.gif)|*.gif|Joint Photographic Experts Group File (.jpeg)|*.jpeg|Joint Photographic Experts Group File (.jpg)|*.jpg|Portable Network Graphics File (.png)|*.png.
/// </summary>
@@ -5599,11 +5416,11 @@ namespace mRemoteNG.Resources.Language {
}
/// <summary>
/// Looks up a localized string similar to Smart Cards.
/// Looks up a localized string similar to SmartCard.
/// </summary>
internal static string SmartCards {
internal static string SmartCard {
get {
return ResourceManager.GetString("SmartCards", resourceCulture);
return ResourceManager.GetString("SmartCard", resourceCulture);
}
}
@@ -5625,15 +5442,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Start Program.
/// </summary>
internal static string StartProgram {
get {
return ResourceManager.GetString("StartProgram", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Socks 5.
/// </summary>
@@ -5849,18 +5657,7 @@ namespace mRemoteNG.Resources.Language {
return ResourceManager.GetString("StartMinimized", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Start minimized.
/// </summary>
internal static string StartFullScreen
{
get
{
return ResourceManager.GetString("StartFullScreen", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Startup/Exit.
/// </summary>
@@ -5879,6 +5676,51 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Backup.
/// </summary>
internal static string strBackup {
get {
return ResourceManager.GetString("strBackup", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Browse....
/// </summary>
internal static string strBrowse {
get {
return ResourceManager.GetString("strBrowse", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Connection Backup Frequency.
/// </summary>
internal static string strConnectionBackupFrequency {
get {
return ResourceManager.GetString("strConnectionBackupFrequency", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Maximum number of backups.
/// </summary>
internal static string strConnectionsBackupMaxCount {
get {
return ResourceManager.GetString("strConnectionsBackupMaxCount", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Location of connection file backup.
/// </summary>
internal static string strConnectionsBackupPath {
get {
return ResourceManager.GetString("strConnectionsBackupPath", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Support Forum.
/// </summary>
@@ -6284,7 +6126,18 @@ namespace mRemoteNG.Resources.Language {
return ResourceManager.GetString("UserField", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Username.
/// </summary>
internal static string UserViaAPI
{
get
{
return ResourceManager.GetString("UserViaAPI", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Username.
/// </summary>
@@ -6474,6 +6327,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to WebView2 creation failed with exception.
/// </summary>
internal static string WebView2InitializationFailed {
get {
return ResourceManager.GetString("WebView2InitializationFailed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Weekly.
/// </summary>

View File

@@ -246,46 +246,6 @@
<data name="CheckFailed" xml:space="preserve">
<value>Kontrola selhala!</value>
</data>
<data name="CheckSucceeded" xml:space="preserve">
<value>Kontrola úspěšná!</value>
</data>
<data name="CcICAFailed" xml:space="preserve">
<value>Funkcionalita ICA vyžaduje, aby byl nainstalován XenDesktop Online Plugin a knihovna wfica.ocx byla zaregistrována. Klienta můžete stáhnout zde: http://www.citrix.com/download/
Pokud máte XenDesktop Online Plugin nainstalován a kontrola stále selhává, pokuste se zaregistrovat wfica.ocx ručně.
K tomu otevřete dialog "Spustit" (Start-&gt;Spustit) a zadejte následující text: regsvr32 "c:\Program Files\Citrix\ICA Client\wfica.ocx" (kde c:\Program Files\Citrix\ICA Client\ je cesta ke složce s Vaší instalací XenDesktop Online Plugin).
Pokud tato kontrola stále selhává nebo nejste schopni používat funkcionalitu ICA v mRemoteNG, prosím obraťte se na diskuzní fórum mRemoteNG na adrese http://forum.mremoteng.org/.</value>
</data>
<data name="CcICAOK" xml:space="preserve">
<value>Všechny komponenty ICA byly nalezeny a zdají se být řádně zaregistrovány.
Citrix ICA Client Control verze {0}</value>
</data>
<data name="CcNotInstalledProperly" xml:space="preserve">
<value>není správně instalováno</value>
</data>
<data name="CcPuttyFailed" xml:space="preserve">
<value>Protokoly SSH, Telnet, Rlogin and RAW potřebují ke své práci program PuTTY. PuTTY je součástí každého balíčku s mRemoteNG a je k nalezení ve složce, kde je mRemoteNG nainstalován.
Prosím ujistěte se, že budťo máte soubor Putty.exe ve složce vašeho mRemoteNG (výchozí je: c:\Program Files\mRemoteNG\) nebo že jste zadali správnou cestu ke složce obsahující program PuTTY v Nástrojích (menu Nástroje -&gt; Možnosti -&gt; Pokročilé -&gt; Vlastní cesta k PuTTY)</value>
</data>
<data name="CcPuttyOK" xml:space="preserve">
<value>Program PuTTY byl nalezen a měl by být připraven k použití.</value>
</data>
<data name="CcRDPFailed" xml:space="preserve">
<value>Aby RDP fungovalo, musíte mí nainstlaovanou poslední verzi Remote Desktop Connection (Terminal Services) Client 8.0. Můžete jej stáhnout zde : http://support.microsoft.com/kb/925876
Pokud tato kontrola stále selhává nebo nejste schopni používat RDP v mRemoteNG, prosím prosím obraťte se na diskuzní fórum mRemoteNG na adrese http://forum.mremoteng.org/.</value>
</data>
<data name="CcRDPOK" xml:space="preserve">
<value>Všechny komponenty RDP byly nalezeny a zdají se být řádně zaregistrovány.
Remote Desktop Connection Control verze {0}</value>
</data>
<data name="CcVNCFailed" xml:space="preserve">
<value>Funkcionalita VNC vyžaduje knihovnu VncSharp.dll ve složce s vaší instalací mRemoteNG.
Prosím ujistěte se, že máte v aplikační složce vaší instalace mRemoteNG soubor VncSharp.dll (zpravidla složka C:\Program Files\mRemoteNG\).
Pokud tato kontrola stále selhává nebo nejste schopni používat VNC v mRemoteNG, prosím prosím obraťte se na diskuzní fórum mRemoteNG na adrese http://forum.mremoteng.org/.</value>
</data>
<data name="CcVNCOK" xml:space="preserve">
<value>Všechny VNC součásti byly nalezeny a zdají se být řádně zaregistrovány.
VncSharp Control verze {0}</value>
</data>
<data name="CheckboxAutomaticReconnect" xml:space="preserve">
<value>Automaticky obnovit připojení v případě přerušení spojení se serverem(pouze RDP &amp;&amp; ICA)</value>
</data>
@@ -358,9 +318,6 @@ VncSharp Control verze {0}</value>
<data name="CompatibilityProblemDetected" xml:space="preserve">
<value>Detekován porblém s kompatibilitou</value>
</data>
<data name="ComponentsCheck" xml:space="preserve">
<value>Kontrola komponent</value>
</data>
<data name="ConfigPropertyGridButtonIconClickFailed" xml:space="preserve">
<value>Operace btnIcon_Click selhala!</value>
</data>
@@ -476,9 +433,6 @@ Otevírám nový prázdný soubor seznamu spojení.</value>
<data name="CouldNotFindToolStripInFilteredPropertyGrid" xml:space="preserve">
<value>Nepovedlo se najít ovládací prvek ToolStrip control v objektu FilteredPropertyGrid.</value>
</data>
<data name="InstalledVersion" xml:space="preserve">
<value>Instalovaná verze</value>
</data>
<data name="Detect" xml:space="preserve">
<value>Detekovat</value>
</data>
@@ -503,21 +457,6 @@ Otevírám nový prázdný soubor seznamu spojení.</value>
<data name="EmptyUsernamePasswordDomainFields" xml:space="preserve">
<value>Pro prázdná políčka Login, Heslo nebo Doména použít:</value>
</data>
<data name="Enc128Bit" xml:space="preserve">
<value>128-bit</value>
</data>
<data name="Enc128BitLogonOnly" xml:space="preserve">
<value>128-bit (jen pro logon)</value>
</data>
<data name="Enc40Bit" xml:space="preserve">
<value>40-bit</value>
</data>
<data name="Enc56Bit" xml:space="preserve">
<value>56-bit</value>
</data>
<data name="Basic" xml:space="preserve">
<value>Basic</value>
</data>
<data name="EncryptCompleteConnectionFile" xml:space="preserve">
<value>Zakódovat celý soubor seznamu připojení</value>
</data>
@@ -668,18 +607,12 @@ Otevírám nový prázdný soubor seznamu spojení.</value>
<data name="HttpSetPropsFailed" xml:space="preserve">
<value>Nastavení vlast. HTTP selhalo!</value>
</data>
<data name="strIdentifyQuickConnectTabs" xml:space="preserve">
<value>Označ záložky rychlého připojení prefixem "Quick:"</value>
</data>
<data name="ImportAD" xml:space="preserve">
<value>Import z Active Directory</value>
</data>
<data name="ImportFileFailedContent" xml:space="preserve">
<value>Při importování souboru "{0}" došlo k chybě.</value>
</data>
<data name="ImportFailed" xml:space="preserve">
<value>Import selhal</value>
</data>
<data name="ImportFromFile" xml:space="preserve">
<value>Import ze &amp;souboru...</value>
</data>
@@ -716,9 +649,6 @@ Otevírám nový prázdný soubor seznamu spojení.</value>
<data name="ClosingConnections" xml:space="preserve">
<value>Když se ukončují spojení:</value>
</data>
<data name="_Connect" xml:space="preserve">
<value>&amp;Připojit:</value>
</data>
<data name="DisplayName" xml:space="preserve">
<value>Zobrazený název:</value>
</data>
@@ -791,9 +721,6 @@ Otevírám nový prázdný soubor seznamu spojení.</value>
<data name="ConnectionPanels" xml:space="preserve">
<value>Panely</value>
</data>
<data name="ConnectionsAndConfig" xml:space="preserve">
<value>Nastavení spojení</value>
</data>
<data name="Copy" xml:space="preserve">
<value>Kopírovat</value>
</data>
@@ -803,24 +730,12 @@ Otevírám nový prázdný soubor seznamu spojení.</value>
<data name="CtrlEsc" xml:space="preserve">
<value>Ctrl-Esc</value>
</data>
<data name="DeleteConnection" xml:space="preserve">
<value>Smazat spojení...</value>
</data>
<data name="DeleteExternalTool" xml:space="preserve">
<value>Smazat vnější nástroj...</value>
</data>
<data name="DeleteFolder" xml:space="preserve">
<value>Smazat složku...</value>
</data>
<data name="Donate" xml:space="preserve">
<value>Přispějte</value>
</data>
<data name="DuplicateConnection" xml:space="preserve">
<value>Klonovat připojení</value>
</data>
<data name="DuplicateFolder" xml:space="preserve">
<value>Klonovat složku</value>
</data>
<data name="DuplicateTab" xml:space="preserve">
<value>Klonovat záložku tabu</value>
</data>
@@ -839,9 +754,6 @@ Otevírám nový prázdný soubor seznamu spojení.</value>
<data name="HelpContents" xml:space="preserve">
<value>Nápověda mRemoteNG</value>
</data>
<data name="JumpTo" xml:space="preserve">
<value>Jít na</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
<value>Spustit externí nástroj</value>
</data>
@@ -878,12 +790,6 @@ Otevírám nový prázdný soubor seznamu spojení.</value>
<data name="RefreshScreen" xml:space="preserve">
<value>Obnovit obraz (VNC)</value>
</data>
<data name="RenameConnection" xml:space="preserve">
<value>Přejmenovat spojení</value>
</data>
<data name="RenameFolder" xml:space="preserve">
<value>Přejmenovat složku</value>
</data>
<data name="RenameTab" xml:space="preserve">
<value>Přejmonovat záložku tabu</value>
</data>
@@ -1077,9 +983,6 @@ Pokud k takové chybě dojde, prosím vytvořte nový soubor se seznamem spojen
<data name="PropertyDescriptionEncoding" xml:space="preserve">
<value>Vyberte způsob kódování přenosu.</value>
</data>
<data name="PropertyDescriptionEncryptionStrength" xml:space="preserve">
<value>Vyberte požadovanou sílu šifrování vzdáleného hostitele.</value>
</data>
<data name="PropertyDescriptionExternalTool" xml:space="preserve">
<value>Vyberte externí nástroj, který má být spuštěn.</value>
</data>
@@ -1230,9 +1133,6 @@ Pokud k takové chybě dojde, prosím vytvořte nový soubor se seznamem spojen
<data name="Encoding" xml:space="preserve">
<value>Kódování</value>
</data>
<data name="EncryptionStrength" xml:space="preserve">
<value>Síla šifrování</value>
</data>
<data name="ExternalTool" xml:space="preserve">
<value>Externí nástroj</value>
</data>
@@ -1293,9 +1193,6 @@ Pokud k takové chybě dojde, prosím vytvořte nový soubor se seznamem spojen
<data name="Printers" xml:space="preserve">
<value>Připoj tiskárny</value>
</data>
<data name="SmartCards" xml:space="preserve">
<value>Poskytuj karty</value>
</data>
<data name="Sounds" xml:space="preserve">
<value>Zvuky</value>
</data>
@@ -1527,9 +1424,6 @@ Zpráva:
<data name="RdpSetResolutionFailed" xml:space="preserve">
<value>Metoda RDP SetResolution selhala!</value>
</data>
<data name="RdpSmartSize" xml:space="preserve">
<value>Autom. velikost</value>
</data>
<data name="RdpSoundBringToThisComputer" xml:space="preserve">
<value>Přehrávat v místním počítači</value>
</data>
@@ -1548,9 +1442,6 @@ Zpráva:
<data name="ReconnectAtStartup" xml:space="preserve">
<value>Znovu se připojit k předchozím otevřeným relacím při startu aplikace</value>
</data>
<data name="Refresh" xml:space="preserve">
<value>Obnovit</value>
</data>
<data name="RemoteFile" xml:space="preserve">
<value>Vzdálený soubor</value>
</data>
@@ -1719,9 +1610,6 @@ Zpráva:
<data name="UpdateCheckCompleteFailed" xml:space="preserve">
<value>Informace o aktualizacích nemohly být staženy.</value>
</data>
<data name="CheckingForUpdates" xml:space="preserve">
<value>Vyhledávám aktualizace...</value>
</data>
<data name="UpdateDownloadComplete" xml:space="preserve">
<value>Stahování ukončeno!
mRemoteNG se nyní ukončí a zahájí instalaci.</value>
@@ -1798,9 +1686,6 @@ mRemoteNG se nyní ukončí a zahájí instalaci.</value>
<data name="Yes" xml:space="preserve">
<value>Ano</value>
</data>
<data name="ReconnectAll" xml:space="preserve">
<value>Obnovit všechna otevřená spojení</value>
</data>
<data name="RdpOverallConnectionTimeout" xml:space="preserve">
<value>Čas čekání (timeout) na RDP spojení</value>
</data>
@@ -1867,9 +1752,6 @@ mRemoteNG se nyní ukončí a zahájí instalaci.</value>
<data name="PropertyDescriptionRDPAlertIdleTimeout" xml:space="preserve">
<value>Zapsat zprávu logu když se RDP sezení odpojí kvůli neaktivitě.</value>
</data>
<data name="RdpAlertIdleTimeout" xml:space="preserve">
<value>Upozornit při odpojení z neaktivity</value>
</data>
<data name="PasswordConstainsSpecialCharactersConstraintHint" xml:space="preserve">
<value>Heslo musí obsahovat alespoň {0} z těchto písmen: {1}</value>
</data>

View File

@@ -240,55 +240,6 @@
<data name="CheckFailed" xml:space="preserve">
<value>Prüfung fehlgeschlagen!</value>
</data>
<data name="CheckSucceeded" xml:space="preserve">
<value>Prüfung erfolgreich!</value>
</data>
<data name="strCcEOLFailed" xml:space="preserve">
<value>Die (RDP-) Sitzungsfunktion benötigt die Datei eolwtscom.dll. Diese muss korrekt registriert sein.
Alle mRemoteNG-Pakete beinhalten diese Datei, jedoch muss sie, wenn Sie eines der nicht-Setup Pakete verwenden, manuell registriert werden.
Öffnen Sie hierzu den Ausführen-Dialog (Start - Ausführen) und geben Sie Folgendes ein: regsvr32 "c:\Programme\mRemoteNG\eolwtscom.dll" (Wobei c:\Programme\mRemoteNG\ Ihr mRemoteNG-Installationspfad ist).
Wenn Sie noch immer Probleme mit der (RDP-) Sitzungsfunktion in mRemoteNG haben, konsultieren Sie bitte das mRemoteNG-Forum: http://forum.mremoteng.org/</value>
</data>
<data name="strCcEOLOK" xml:space="preserve">
<value>EOLWTSCOM wurde gefunden und scheint korrekt registriert zu sein.</value>
</data>
<data name="strCcGeckoFailed" xml:space="preserve">
<value>Um die Gecko Rendering Engine benutzen zu können, benötigen Sie XULrunner 1.8.1.x und einen korrekt eingetragenen Pfad in den Optionen.
Hier können Sie XULrunner 1.8.1.3 herunterladen: ftp://ftp.mozilla.org/pub/xulrunner/releases/1.8.1.3/contrib/win32/
Wenn der Download abgeschlossen ist, entpacken Sie das Paket (Der Speicherort ist dabei ihnen überlassen). Als nächstes öffnen Sie (in mRemoteNG) Extras - Optionen - Erweitert und geben Sie den korrekten Pfad im XULrunner Feld an.
Wenn Sie noch immer Probleme mit der Gecko Engine in mRemote haben, konsultieren Sie bitte das mRemoteNG-Forum: http://forum.mremoteng.org/</value>
</data>
<data name="strCcGeckoOK" xml:space="preserve">
<value>GeckoFx wurde gefunden und scheint korrekt installiert zu sein.</value>
</data>
<data name="strCcNotInstalledProperly" xml:space="preserve">
<value>nicht korrekt installiert</value>
</data>
<data name="CcPuttyFailed" xml:space="preserve">
<value>Die Protokolle SSH, Telnet, Rlogin und RAW benötigen PuTTY. PuTTY wird in allen mRemote Paketen mitgeliefert und befindet sich im Installationspfad.
Bitte versichern Sie sich, dass sich die Datei PuttyNG.exe in ihrem mRemote Installationspfad befindet (Standard: c:\Programme\mRemoteNG\) oder dass Sie einen korrekten Pfad in den Optionen (Extras - Optionen - Erweitert - Eigener PuTTY-Pfad) angegeben haben.</value>
</data>
<data name="CcPuttyOK" xml:space="preserve">
<value>PuTTY wurde gefunden und scheint betriebsbereit zu sein.</value>
</data>
<data name="CcRDPFailed" xml:space="preserve">
<value>Um RDP korrekt betreiben können, muss mindestens Remote Desktop Connection (Terminal Services Client) 6.0 installiert sein. Hier können Sie die Software herunterladen: http://support.microsoft.com/kb/951616
Wenn Sie RDP 6.1 bereits installiert haben und die Prüfung noch immer fehlschlägt, versuchen Sie, die Datei mstscax.dll manuell zu registrieren. Öffnen Sie hierzu den Ausführen-Dialog (Start - Ausführen) und geben Sie Folgendes ein: regsvr32 "c:\windows\system32\mstscax.dll" (Wobei c:\ Ihr System-Laufwerk ist).
Wenn Sie noch immer Probleme mit RDP haben, konsultieren Sie bitte das mRemoteNG-Forum: http://forum.mremoteng.org/</value>
</data>
<data name="CcRDPOK" xml:space="preserve">
<value>Alle RDP-Komponenten wurden gefunden und scheinen korrekt registriert zu sein.
Remote Desktop Verbindung Control Version {0}</value>
</data>
<data name="CcVNCFailed" xml:space="preserve">
<value>VNC benötigt die Datei VncSharp.dll im mRemoteNG-Programmordner.
Bitte stellen Sie sicher, dass Sie die Datei VncSharp.dll in Ihrem mRemoteNG-Programmordner haben (üblicherweise C:\Programme\mRemoteNG\).
Wenn Sie noch immer Probleme mit VNC haben, konsultieren Sie bitte das mRemoteNG-Forum: http://forum.mremoteng.org/</value>
</data>
<data name="CcVNCOK" xml:space="preserve">
<value>Alle VNC-Komponenten wurden gefunden und scheinen korrekt registriert zu sein.
VncSharp Control Version {0}</value>
</data>
<data name="CheckboxAutomaticReconnect" xml:space="preserve">
<value>Automatisch versuchen zu verbinden, wenn Verbindung getrennt wird (nur RDP &amp;&amp; ICA)</value>
</data>
@@ -352,9 +303,6 @@ VncSharp Control Version {0}</value>
<data name="CompatibilityProblemDetected" xml:space="preserve">
<value>Kompatibilitätsproblem entdeckt</value>
</data>
<data name="ComponentsCheck" xml:space="preserve">
<value>Komponenten prüfen</value>
</data>
<data name="ConfigPropertyGridButtonIconClickFailed" xml:space="preserve">
<value>Bild Knopf Ereignis fehlgeschlagen!</value>
</data>
@@ -468,9 +416,6 @@ Starte mit neuer Datei.</value>
<data name="CouldNotFindToolStripInFilteredPropertyGrid" xml:space="preserve">
<value>Das ToolStrip-Steuerelement konnte in FilteredPropertyGrid nicht gefunden werden.</value>
</data>
<data name="InstalledVersion" xml:space="preserve">
<value>Aktuelle Version</value>
</data>
<data name="Detect" xml:space="preserve">
<value>Erkennen</value>
</data>
@@ -492,21 +437,6 @@ Starte mit neuer Datei.</value>
<data name="EmptyUsernamePasswordDomainFields" xml:space="preserve">
<value>Bei leeren Feldern für Benutzername, Passwort oder Domäne verwende:</value>
</data>
<data name="Enc128Bit" xml:space="preserve">
<value>128 Bit</value>
</data>
<data name="Enc128BitLogonOnly" xml:space="preserve">
<value>128 Bit (nur Anmeldung)</value>
</data>
<data name="Enc40Bit" xml:space="preserve">
<value>40 Bit</value>
</data>
<data name="Enc56Bit" xml:space="preserve">
<value>56 Bit</value>
</data>
<data name="Basic" xml:space="preserve">
<value>Einfach</value>
</data>
<data name="EncryptCompleteConnectionFile" xml:space="preserve">
<value>Verbindungsdatendatei vollständig verschlüsseln</value>
</data>
@@ -609,9 +539,6 @@ Starte mit neuer Datei.</value>
<data name="HttpSetPropsFailed" xml:space="preserve">
<value>Setzen der HTTP-Parameter fehlgeschlagen!</value>
</data>
<data name="strIdentifyQuickConnectTabs" xml:space="preserve">
<value>QuickConnect-Tabs identifizieren, indem das Präfix "Quick" benutzt wird</value>
</data>
<data name="ImportAD" xml:space="preserve">
<value>Von Active Directory importieren</value>
</data>
@@ -648,9 +575,6 @@ Starte mit neuer Datei.</value>
<data name="ClosingConnections" xml:space="preserve">
<value>Beim Schließen der Verbindungen:</value>
</data>
<data name="_Connect" xml:space="preserve">
<value>&amp;Verbinden:</value>
</data>
<data name="DisplayName" xml:space="preserve">
<value>Anzeigename</value>
</data>
@@ -720,9 +644,6 @@ Starte mit neuer Datei.</value>
<data name="ConnectionPanels" xml:space="preserve">
<value>Verbindungs-Panels</value>
</data>
<data name="ConnectionsAndConfig" xml:space="preserve">
<value>Verbindungen und Konfiguration</value>
</data>
<data name="Copy" xml:space="preserve">
<value>Kopieren</value>
</data>
@@ -732,24 +653,12 @@ Starte mit neuer Datei.</value>
<data name="CtrlEsc" xml:space="preserve">
<value>STRG-ESC</value>
</data>
<data name="DeleteConnection" xml:space="preserve">
<value>Verbindung löschen</value>
</data>
<data name="DeleteExternalTool" xml:space="preserve">
<value>Entfernen</value>
</data>
<data name="DeleteFolder" xml:space="preserve">
<value>Ordner löschen</value>
</data>
<data name="Donate" xml:space="preserve">
<value>Spenden</value>
</data>
<data name="DuplicateConnection" xml:space="preserve">
<value>Verbindung duplizieren</value>
</data>
<data name="DuplicateFolder" xml:space="preserve">
<value>Ordner duplizieren</value>
</data>
<data name="DuplicateTab" xml:space="preserve">
<value>Tab klonen</value>
</data>
@@ -768,9 +677,6 @@ Starte mit neuer Datei.</value>
<data name="HelpContents" xml:space="preserve">
<value>Hilfe</value>
</data>
<data name="JumpTo" xml:space="preserve">
<value>Springe zu</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
<value>Starten</value>
</data>
@@ -804,12 +710,6 @@ Starte mit neuer Datei.</value>
<data name="RefreshScreen" xml:space="preserve">
<value>Anzeige aktualisieren (VNC)</value>
</data>
<data name="RenameConnection" xml:space="preserve">
<value>Verbindung umbenennen</value>
</data>
<data name="RenameFolder" xml:space="preserve">
<value>Ordner umbenennen</value>
</data>
<data name="RenameTab" xml:space="preserve">
<value>Tab umbenennen</value>
</data>
@@ -982,9 +882,6 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="PropertyDescriptionEncoding" xml:space="preserve">
<value>Wählen Sie die zu verwendende Codierung.</value>
</data>
<data name="PropertyDescriptionEncryptionStrength" xml:space="preserve">
<value>Wählen Sie die Verschlüsselungsstärke des Remote Hosts.</value>
</data>
<data name="PropertyDescriptionExternalTool" xml:space="preserve">
<value>Wählen Sie die zu startende externe Applikation.</value>
</data>
@@ -1129,9 +1026,6 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="Encoding" xml:space="preserve">
<value>Codierung</value>
</data>
<data name="EncryptionStrength" xml:space="preserve">
<value>Verschlüsselungsstärke</value>
</data>
<data name="ExternalTool" xml:space="preserve">
<value>Externes Programm</value>
</data>
@@ -1189,9 +1083,6 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="Printers" xml:space="preserve">
<value>Drucker</value>
</data>
<data name="SmartCards" xml:space="preserve">
<value>Smartcards</value>
</data>
<data name="Sounds" xml:space="preserve">
<value>Töne</value>
</data>
@@ -1419,9 +1310,6 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="RdpSetResolutionFailed" xml:space="preserve">
<value>Setzen der Auflösung fehlgeschlagen!</value>
</data>
<data name="RdpSmartSize" xml:space="preserve">
<value>Automatisch skalieren</value>
</data>
<data name="RdpSoundBringToThisComputer" xml:space="preserve">
<value>Hier wiedergeben</value>
</data>
@@ -1440,9 +1328,6 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="ReconnectAtStartup" xml:space="preserve">
<value>Offene Verbindungen speichern und beim nächsten Start wiederverbinden</value>
</data>
<data name="Refresh" xml:space="preserve">
<value>Aktualisieren</value>
</data>
<data name="RemoteFile" xml:space="preserve">
<value>Entfernte Datei</value>
</data>
@@ -1681,9 +1566,6 @@ mRemoteNG wird nun geschlossen und die Installation gestartet.</value>
<data name="Yes" xml:space="preserve">
<value>Ja</value>
</data>
<data name="ReconnectAll" xml:space="preserve">
<value>Alle offenen Verbindungen neu verbinden</value>
</data>
<data name="_Launch" xml:space="preserve">
<value>&amp;Starten</value>
</data>
@@ -1711,18 +1593,12 @@ mRemoteNG wird nun geschlossen und die Installation gestartet.</value>
<data name="FilterAllImportable" xml:space="preserve">
<value>Alle wichtigen Dateien</value>
</data>
<data name="ImportFailed" xml:space="preserve">
<value>Import-Vorgang fehlgeschlagen</value>
</data>
<data name="ImportFromFile" xml:space="preserve">
<value>Von &amp;Datei importieren</value>
</data>
<data name="OptionsProxyTesting" xml:space="preserve">
<value>Testen...</value>
</data>
<data name="CheckingForUpdates" xml:space="preserve">
<value>Nach Updates suchen...</value>
</data>
<data name="EncryptionEngine" xml:space="preserve">
<value>Verschlüsselungs-Engine</value>
</data>
@@ -1891,9 +1767,6 @@ mRemoteNG wird nun geschlossen und die Installation gestartet.</value>
<data name="PropertyDescriptionRDPAlertIdleTimeout" xml:space="preserve">
<value>Wählen Sie, ob eine Benachrichtigung empfangen werden soll, nachdem die RDP-Sitzung aufgrund von Inaktivität getrennt wurde</value>
</data>
<data name="RdpAlertIdleTimeout" xml:space="preserve">
<value>Benachrichtigung bei Leerlauftrennung</value>
</data>
<data name="PasswordConstainsSpecialCharactersConstraintHint" xml:space="preserve">
<value>Das Passwort muss mindestens {0} der folgenden Zeichen enthalten: {1}</value>
</data>
@@ -1973,9 +1846,6 @@ Die Passwortlänge muss zwischen {0} und {1} liegen</value>
<data name="Https" xml:space="preserve">
<value>HTTPS</value>
</data>
<data name="ICA" xml:space="preserve">
<value>ICA</value>
</data>
<data name="Download" xml:space="preserve">
<value>Download</value>
</data>
@@ -1990,8 +1860,8 @@ Die Passwortlänge muss zwischen {0} und {1} liegen</value>
</data>
<data name="ReleaseChannelExplanation" xml:space="preserve">
<value>Stable enthält nur finale Versionen.
Beta beinhaltet Betas &amp; Release Candidates.
Development umfasst Alphas, Betas und Release Candidates.</value>
Preview beinhaltet Betas &amp; Release Candidates.
Nightly umfasst Alphas, Betas und Release Candidates.</value>
</data>
<data name="TrackActiveConnectionInConnectionTree" xml:space="preserve">
<value>Aktive Verbindung im Verbindungsbaum verfolgen</value>
@@ -2131,9 +2001,6 @@ Development umfasst Alphas, Betas und Release Candidates.</value>
<data name="AutomaticReconnectError" xml:space="preserve">
<value>Beim Versuch, die Verbindung zum RDP-Host '{0}' wiederherzustellen, ist ein Fehler aufgetreten</value>
</data>
<data name="CcNotInstalledProperly" xml:space="preserve">
<value>nicht richtig installiert</value>
</data>
<data name="ChangeConnectionResolutionError" xml:space="preserve">
<value>Beim Versuch, die Verbindungsauflösung auf den Host '{0}' zu ändern, ist ein Fehler aufgetreten</value>
</data>
@@ -2155,13 +2022,13 @@ Development umfasst Alphas, Betas und Release Candidates.</value>
<data name="ExceptionMessage" xml:space="preserve">
<value>Fehlermeldung</value>
</data>
<data name="IcaControlFailed" xml:space="preserve">
<value>Laden des ICA-Plugins fehlgeschlagen!</value>
<data name="WebView2InitializationFailed" xml:space="preserve">
<value>WebView2-Erstellung fehlgeschlagen</value>
</data>
<data name="IcaSetCredentialsFailed" xml:space="preserve">
<value>ICA SetCredentials fehlgeschlagen!</value>
<data name="ApplyDefaultInheritance" xml:space="preserve">
<value>Standardvererbung anwenden</value>
</data>
<data name="IcaConnectionFailed" xml:space="preserve">
<value>Konnte keine neue ICA-Verbindung erstellen!</value>
<data name="ApplyInheritanceToChildren" xml:space="preserve">
<value>Vererbung auf Kinder anwenden</value>
</data>
</root>

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