Compare commits

...

497 Commits

Author SHA1 Message Date
Dimitrij
455d897b9f Merge pull request #3146 from mRemoteNG/renovate/microsoft.web.webview2-1.x
Update dependency Microsoft.Web.WebView2 to 1.0.3800.47
2026-02-16 12:13:11 +00:00
renovate[bot]
3d4d1136f0 Update dependency Microsoft.Web.WebView2 to 1.0.3800.47 2026-02-16 10:47:26 +00:00
Dimitrij
598136f089 Update MSBuild version to '18.0' 2026-02-15 14:45:44 +00:00
Dimitrij
865bddfb04 Merge pull request #3145 from mRemoteNG/renovate/coverlet.collector-8.x
Update dependency coverlet.collector to v8
2026-02-15 14:40:49 +00:00
Dimitrij
3b2bc028cc Merge pull request #3144 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.75
2026-02-15 14:40:29 +00:00
Dimitrij
71c746f801 Update MSBuild version range in workflow
vsVersion: 18.0
2026-02-15 14:38:43 +00:00
renovate[bot]
079814751e Update dependency coverlet.collector to v8 2026-02-14 23:51:10 +00:00
Dimitrij
1de9ce6ef5 Merge pull request #3143 from jcefoli/v1.78.2-dev
AlwaysShowPanelTabs Setting Not Respected at Application…
2026-02-14 23:50:44 +00:00
renovate[bot]
01df0e295e Update dependency AWSSDK.EC2 to 4.0.75 2026-02-14 00:58:14 +00:00
Joe Cefoli
2631926eda Fixes #3142: AlwaysShowPanelTabs Setting Not Respected at Application Launch 2026-02-13 13:54:13 -05:00
Dimitrij
db1496d4a2 Merge pull request #3140 from mRemoteNG/renovate/actions-setup-dotnet-5.x
Update actions/setup-dotnet action to v5
2026-02-13 10:29:59 +00:00
renovate[bot]
a8b12c9ba1 Update actions/setup-dotnet action to v5 2026-02-12 23:12:53 +00:00
Dimitrij
a2b408e537 Update Build_mR-NB.yml
add .net 10 install
2026-02-12 23:12:17 +00:00
Dimitrij
a871624ab7 Update MSBuild version range in workflow
set ver for lower
2026-02-12 23:03:10 +00:00
Dimitrij
e40a800bc4 Update Build_mR-NB.yml
fix build tools ver
2026-02-12 22:58:46 +00:00
Dimitrij
48cb1ce770 Merge pull request #3139 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.74
2026-02-12 22:56:04 +00:00
Kvarkas
6733d758aa upd action 2026-02-12 22:55:25 +00:00
Dimitrij
f78b9bf51c Refactor self-contained build process in workflow
fix msbuild
2026-02-12 21:53:24 +00:00
renovate[bot]
213ea6a4d3 Update dependency AWSSDK.EC2 to 4.0.74 2026-02-12 21:17:33 +00:00
Kvarkas
ac3d7e6366 added new option - build Self-Contained, this allow to run mR without installing .NET 2026-02-12 21:16:31 +00:00
Dimitrij
9fae2e066e Merge pull request #3138 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update aws-sdk-net monorepo
2026-02-12 10:30:06 +00:00
renovate[bot]
cf66e84d31 Update aws-sdk-net monorepo 2026-02-11 22:12:21 +00:00
Dimitrij
f7326aff62 Merge pull request #3137 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.Core to 4.0.3.13
2026-02-11 09:22:09 +00:00
Kvarkas
d4bca6b03d small fixes 2026-02-10 22:03:02 +00:00
renovate[bot]
1d86015f9d Update dependency AWSSDK.Core to 4.0.3.13 2026-02-10 21:19:54 +00:00
Dimitrij
5efcc653eb Merge pull request #3038 from mRemoteNG/copilot/fix-command-injection-vulnerability
Fix command injection vulnerabilities in Process.Start calls
2026-02-10 21:18:59 +00:00
Kvarkas
333588e101 Merge branch 'v1.78.2-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.78.2-dev 2026-02-10 21:18:29 +00:00
Kvarkas
4046681fc5 remove dependency what are now included with .Net 10
small fixes
2026-02-10 21:18:17 +00:00
Dimitrij
91c7df22b2 Update mRemoteNGTests/Connection/Protocol/ProtocolAnydeskTests.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-10 21:10:35 +00:00
Dimitrij
173b208eb1 Update mRemoteNG/UI/Forms/FrmAbout.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-10 21:10:12 +00:00
Dimitrij
50de37c3a4 Update mRemoteNG/UI/Forms/OptionsPages/NotificationsPage.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-10 21:09:56 +00:00
Dimitrij
380e91de07 Update mRemoteNG/Connection/Protocol/AnyDesk/ProtocolAnyDesk.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-10 21:09:06 +00:00
Dimitrij
ba97933f33 Update mRemoteNG/UI/Forms/OptionsPages/NotificationsPage.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-10 21:08:46 +00:00
Dimitrij
539b761199 Merge pull request #3136 from mRemoteNG/renovate/major-github-artifact-actions
Update GitHub Artifact Actions (major)
2026-02-10 19:58:22 +00:00
renovate[bot]
aaff6e4548 Update GitHub Artifact Actions 2026-02-10 18:31:58 +00:00
Kvarkas
a1e3b34580 do release 2026-02-10 18:30:52 +00:00
Kvarkas
276585e379 upgrade so release include self contained version 2026-02-10 18:27:03 +00:00
Dimitrij
9242dc0faf Merge pull request #3135 from mRemoteNG/renovate/dotnet-monorepo
Update dotnet monorepo to 10.0.3
2026-02-10 18:13:22 +00:00
renovate[bot]
14d08d8d62 Update dotnet monorepo to 10.0.3 2026-02-10 17:56:13 +00:00
Dimitrij
421d8eb581 Merge pull request #3132 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.72
2026-02-10 11:37:36 +00:00
renovate[bot]
aed0006f1d Update dependency AWSSDK.EC2 to 4.0.72 2026-02-10 01:15:15 +00:00
Dimitrij
86d986a633 Merge pull request #3101 from mRemoteNG/copilot/fix-new-connection-error
Show error popup when connecting without hostname/IP
2026-02-01 20:18:51 +00:00
Dimitrij
5163aeb4d2 Change error message to warning for blank hostname 2026-02-01 20:18:11 +00:00
copilot-swe-agent[bot]
a103939c64 Address code review: fix typos, improve test robustness, use Language resources
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2026-02-01 19:59:39 +00:00
copilot-swe-agent[bot]
bcb8e05698 Update documentation for new popup error default setting
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2026-02-01 19:58:03 +00:00
copilot-swe-agent[bot]
2e74313f07 Change hostname validation to ErrorMsg and enable popup errors by default
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2026-02-01 19:56:53 +00:00
copilot-swe-agent[bot]
c9791454ec Initial plan 2026-02-01 19:52:25 +00:00
Dimitrij
b1c1696acb Merge pull request #3099 from jafin/fix/frmInputBox-autosize
Fix FrmInputBox to use dynamic sizing instead of fixed dimensions
2026-02-01 19:24:31 +00:00
Dimitrij
ab668ac677 Merge pull request #3097 from mRemoteNG/renovate/chromiumembeddedframework.runtime.win-x64-144.x
Update dependency chromiumembeddedframework.runtime.win-x64 to v144
2026-02-01 19:23:58 +00:00
Dimitrij
1777c4840a Merge pull request #3096 from mRemoteNG/renovate/chromiumembeddedframework.runtime.win-arm64-144.x
Update dependency chromiumembeddedframework.runtime.win-arm64 to v144
2026-02-01 19:23:44 +00:00
Dimitrij
90fcd672d8 Merge pull request #3095 from mRemoteNG/renovate/protobuf-monorepo
Update dependency Google.Protobuf to 3.33.5
2026-02-01 19:23:27 +00:00
Dimitrij
4226396cbf Merge pull request #3094 from mRemoteNG/renovate/microsoft.web.webview2-1.x
Update dependency Microsoft.Web.WebView2 to 1.0.3719.77
2026-02-01 19:23:11 +00:00
Dimitrij
3591ca0f4c Merge pull request #3093 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update aws-sdk-net monorepo
2026-02-01 19:22:55 +00:00
Jason Finch
09cbcccf30 Fix FrmInputBox to use dynamic sizing instead of fixed dimensions 2026-02-01 13:32:00 +10:00
renovate[bot]
4e36b5666e Update dependency chromiumembeddedframework.runtime.win-x64 to v144 2026-01-31 05:48:20 +00:00
renovate[bot]
308253a325 Update dependency chromiumembeddedframework.runtime.win-arm64 to v144 2026-01-31 05:48:13 +00:00
renovate[bot]
30bb4016b4 Update dependency Google.Protobuf to 3.33.5 2026-01-30 00:59:36 +00:00
renovate[bot]
e616ae16e1 Update aws-sdk-net monorepo 2026-01-30 00:59:30 +00:00
renovate[bot]
469528a07a Update dependency Microsoft.Web.WebView2 to 1.0.3719.77 2026-01-27 12:45:38 +00:00
Dimitrij
c7f831e9f9 Merge pull request #3089 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.67
2026-01-26 12:51:28 +00:00
Dimitrij
dd9922be45 Merge pull request #3087 from mRemoteNG/renovate/mysql.data-9.x
Update dependency MySql.Data to 9.6.0
2026-01-26 12:51:11 +00:00
Dimitrij
d0a468c22b Merge pull request #3090 from mRemoteNG/renovate/cucumber.messages-32.x
Update dependency Cucumber.Messages to v32
2026-01-26 12:50:56 +00:00
Dimitrij
ff5dbc88fe Merge pull request #3091 from mRemoteNG/renovate/gherkin-38.x
Update dependency Gherkin to v38
2026-01-26 12:50:42 +00:00
renovate[bot]
3a4ae9b098 Update dependency Cucumber.Messages to v32 2026-01-25 13:44:37 +00:00
renovate[bot]
2de24e534c Update dependency AWSSDK.EC2 to 4.0.67 2026-01-22 21:05:19 +00:00
renovate[bot]
59412a65e1 Update dependency Gherkin to v38 2026-01-22 02:30:57 +00:00
renovate[bot]
adedb6962f Update dependency MySql.Data to 9.6.0 2026-01-21 10:47:43 +00:00
Dimitrij
d3fa608ae9 Merge pull request #3086 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update aws-sdk-net monorepo
2026-01-21 10:47:03 +00:00
renovate[bot]
3159903875 Update aws-sdk-net monorepo 2026-01-21 01:59:43 +00:00
Dimitrij
31c28c4917 Merge pull request #3084 from mRemoteNG/renovate/microsoft.data.sqlclient-6.x
Update dependency Microsoft.Data.SqlClient to 6.1.4
2026-01-16 09:59:33 +00:00
Dimitrij
2c13f7c3a7 Merge pull request #3085 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update aws-sdk-net monorepo
2026-01-16 09:59:18 +00:00
renovate[bot]
725ee92147 Update aws-sdk-net monorepo 2026-01-16 01:27:24 +00:00
renovate[bot]
14406f79a2 Update dependency Microsoft.Data.SqlClient to 6.1.4 2026-01-15 18:42:41 +00:00
Kvarkas
3e202c3a19 lib update 2026-01-14 10:26:47 +00:00
Dimitrij
412c727e4c Merge pull request #3081 from mRemoteNG/renovate/dotnet-monorepo
Update dotnet monorepo to 10.0.2
2026-01-13 19:19:31 +00:00
renovate[bot]
31e7b9e443 Update dotnet monorepo to 10.0.2 2026-01-13 18:40:14 +00:00
Dimitrij
a18e292765 Merge pull request #3078 from mRemoteNG/renovate/protobuf-monorepo
Update dependency Google.Protobuf to 3.33.4
2026-01-13 11:23:46 +00:00
Dimitrij
258ea87f90 Merge pull request #3079 from mRemoteNG/renovate/cucumber.messages-31.x
Update dependency Cucumber.Messages to 31.2.0
2026-01-13 10:38:07 +00:00
renovate[bot]
fd9eabe1e6 Update dependency Google.Protobuf to 3.33.4 2026-01-12 21:55:32 +00:00
renovate[bot]
a9dd06df45 Update dependency Cucumber.Messages to 31.2.0 2026-01-12 00:24:29 +00:00
Dimitrij
dfc24b0cb2 Merge pull request #3076 from mRemoteNG/renovate/nunit3testadapter-6.x
Update dependency NUnit3TestAdapter to 6.1.0
2026-01-08 09:46:33 +00:00
Dimitrij
63f5325f29 Merge pull request #3075 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update aws-sdk-net monorepo
2026-01-08 09:46:04 +00:00
renovate[bot]
6f7949214b Update dependency NUnit3TestAdapter to 6.1.0 2026-01-07 21:23:22 +00:00
renovate[bot]
6cfec060a0 Update aws-sdk-net monorepo 2026-01-07 21:23:16 +00:00
Dimitrij
db733424ca Merge pull request #3074 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.65.1
2026-01-06 10:49:59 +00:00
renovate[bot]
49eab4d377 Update dependency AWSSDK.EC2 to 4.0.65.1 2026-01-06 01:42:04 +00:00
Dimitrij
53e5396031 Merge pull request #3073 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.Core to 4.0.3.7
2026-01-05 21:17:14 +00:00
renovate[bot]
99d01130bf Update dependency AWSSDK.Core to 4.0.3.7 2026-01-05 21:04:09 +00:00
Dimitrij
62ce6cd6e7 Merge pull request #3071 from mRemoteNG/renovate/nunit.consolerunner-3.x
Update dependency NUnit.ConsoleRunner to 3.22.0
2026-01-04 17:53:30 +00:00
renovate[bot]
35c66b0e4a Update dependency NUnit.ConsoleRunner to 3.22.0 2026-01-04 17:53:20 +00:00
Dimitrij
dafc05dc42 Merge pull request #3072 from mRemoteNG/renovate/zstdsharp.port-0.x
Update dependency ZstdSharp.Port to 0.8.7
2026-01-04 17:53:13 +00:00
Dimitrij
458a05ea5f Merge pull request #3070 from mRemoteNG/renovate/nunit.console-3.x
Update dependency NUnit.Console to 3.22.0
2026-01-04 17:52:43 +00:00
renovate[bot]
38acc1e960 Update dependency ZstdSharp.Port to 0.8.7 2026-01-03 17:58:37 +00:00
renovate[bot]
f83209a2b9 Update dependency NUnit.Console to 3.22.0 2026-01-03 01:59:37 +00:00
Dimitrij
9d1546c8b7 Merge pull request #3068 from mRemoteNG/copilot/fix-sql-injection-issue
Fix WQL injection vulnerability in InstalledWindowsUpdateChecker
2025-12-30 12:30:53 +00:00
copilot-swe-agent[bot]
dca2517cf0 Normalize digit-only KB IDs to include KB prefix
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-12-30 12:19:35 +00:00
copilot-swe-agent[bot]
ff54ca9015 Fix inaccurate comment in SanitizeKbId method
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-12-30 12:17:52 +00:00
copilot-swe-agent[bot]
76cb0a1e0b Address code review feedback - optimize regex and use Array.Empty
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-12-30 12:16:52 +00:00
copilot-swe-agent[bot]
c683854678 Add WQL injection prevention via KB ID sanitization
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-12-30 12:15:31 +00:00
copilot-swe-agent[bot]
e9d0a8aa69 Initial plan 2025-12-30 12:11:00 +00:00
Dimitrij
30cb1de711 Merge pull request #3064 from mRemoteNG/copilot/fix-ldap-query-injection
Fix LDAP injection vulnerability in Active Directory integration
2025-12-30 12:06:35 +00:00
Dimitrij
699b93e175 Merge pull request #3066 from mRemoteNG/copilot/setup-copilot-instructions
Add GitHub Copilot instructions for repository
2025-12-30 12:05:30 +00:00
copilot-swe-agent[bot]
c7df6f3715 Add comprehensive GitHub Copilot instructions
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-12-29 13:17:42 +00:00
copilot-swe-agent[bot]
f1d1a19779 Initial plan 2025-12-29 13:13:24 +00:00
copilot-swe-agent[bot]
1c2b5fadc4 Fix code review feedback: consistent hex formatting and test names
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-12-29 10:06:39 +00:00
copilot-swe-agent[bot]
97f5daa13d Add LDAP injection protection with sanitization utility
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-12-29 10:04:43 +00:00
copilot-swe-agent[bot]
63e100c233 Initial plan 2025-12-29 09:59:26 +00:00
Dimitrij
92a710e72a Merge pull request #3061 from koen-lee/make-1password-integration-more-tolerant
Make 1password integration more tolerant
2025-12-29 09:57:47 +00:00
Koen van Leeuwen
fe82146f47 server type items have username id fields by default which may have localized labels 2025-12-24 21:40:54 +01:00
Koen van Leeuwen
64b0496ef7 Add (self) documentation 2025-12-24 21:21:27 +01:00
Koen van Leeuwen
7d21b3de9e Fall back to a username/password by label 2025-12-24 20:48:51 +01:00
Dimitrij
68a8caea34 Merge pull request #3059 from mRemoteNG/renovate/gherkin-37.x
Update dependency Gherkin to 37.0.1
2025-12-24 10:18:21 +00:00
Dimitrij
aee18bae3b Merge pull request #3058 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.65
2025-12-24 10:18:09 +00:00
Dimitrij
ff58cae677 Merge pull request #3060 from mRemoteNG/renovate/cucumber.messages-31.x
Update dependency Cucumber.Messages to 31.1.0
2025-12-24 10:17:54 +00:00
renovate[bot]
548f938757 Update dependency Cucumber.Messages to 31.1.0 2025-12-23 00:55:31 +00:00
renovate[bot]
b9c2e82af1 Update dependency Gherkin to 37.0.1 2025-12-22 21:56:51 +00:00
renovate[bot]
23bb5ec7be Update dependency AWSSDK.EC2 to 4.0.65 2025-12-22 21:56:45 +00:00
Dimitrij
0b7b87d84a Merge pull request #3057 from mRemoteNG/renovate/nunit3testadapter-6.x
Update dependency NUnit3TestAdapter to 6.0.1
2025-12-20 15:44:58 +00:00
Dimitrij
b84a49e99c Merge pull request #3056 from mRemoteNG/renovate/nunit.consolerunner-3.x
Update dependency NUnit.ConsoleRunner to 3.21.1
2025-12-20 15:40:31 +00:00
renovate[bot]
327cc46c8d Update dependency NUnit3TestAdapter to 6.0.1 2025-12-20 15:28:10 +00:00
renovate[bot]
8540434594 Update dependency NUnit.ConsoleRunner to 3.21.1 2025-12-20 15:28:07 +00:00
Dimitrij
41536ba971 Merge pull request #3055 from mRemoteNG/renovate/nunit.console-3.x
Update dependency NUnit.Console to 3.21.1
2025-12-20 15:27:25 +00:00
renovate[bot]
8ddaf024ff Update dependency NUnit.Console to 3.21.1 2025-12-20 04:34:08 +00:00
Dimitrij
7e8f647f54 Merge pull request #3053 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.64
2025-12-19 10:15:21 +00:00
renovate[bot]
9a32a7c68c Update dependency AWSSDK.EC2 to 4.0.64 2025-12-19 01:41:58 +00:00
Dimitrij
280a930792 Merge pull request #3052 from mRemoteNG/renovate/cucumber.messages-31.x
Update dependency Cucumber.Messages to 31.0.1
2025-12-18 20:41:57 +00:00
renovate[bot]
2540d39dd8 Update dependency Cucumber.Messages to 31.0.1 2025-12-18 18:41:46 +00:00
Dimitrij
2b00fa0ad9 Merge pull request #3050 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.63
2025-12-17 22:34:25 +00:00
renovate[bot]
810aad90ed Update dependency AWSSDK.EC2 to 4.0.63 2025-12-15 22:25:49 +00:00
Dimitrij
59c8968d8a Merge pull request #3048 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update aws-sdk-net monorepo
2025-12-13 21:03:19 +00:00
renovate[bot]
4bfed87d81 Update aws-sdk-net monorepo 2025-12-12 22:00:10 +00:00
Dimitrij
5c36477b1f Merge pull request #3047 from mRemoteNG/renovate/chromiumembeddedframework.runtime.win-x64-143.x
Update dependency chromiumembeddedframework.runtime.win-x64 to v143
2025-12-12 11:42:19 +00:00
Dimitrij
a529b978e1 Merge pull request #3045 from mRemoteNG/renovate/actions-cache-5.x
Update actions/cache action to v5
2025-12-12 11:42:01 +00:00
Dimitrij
eae83eadab Merge pull request #3042 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update aws-sdk-net monorepo
2025-12-12 11:41:49 +00:00
Dimitrij
297260af9a Merge pull request #3046 from mRemoteNG/renovate/chromiumembeddedframework.runtime.win-arm64-143.x
Update dependency chromiumembeddedframework.runtime.win-arm64 to v143
2025-12-12 11:41:32 +00:00
renovate[bot]
f5d38c282f Update dependency chromiumembeddedframework.runtime.win-x64 to v143 2025-12-12 11:13:59 +00:00
renovate[bot]
493e5eda6a Update dependency chromiumembeddedframework.runtime.win-arm64 to v143 2025-12-12 11:13:54 +00:00
renovate[bot]
88b8201384 Update actions/cache action to v5 2025-12-12 04:11:47 +00:00
renovate[bot]
b88204c261 Update aws-sdk-net monorepo 2025-12-10 22:42:33 +00:00
Dimitrij
d39fb10b47 Merge pull request #3041 from mRemoteNG/renovate/dotnet-monorepo
Update dotnet monorepo to 10.0.1
2025-12-09 23:04:07 +00:00
Dimitrij
96e7313b69 Merge pull request #3040 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.62
2025-12-09 23:03:43 +00:00
Dimitrij
02be546c5b Merge pull request #3039 from mRemoteNG/renovate/microsoft.web.webview2-1.x
Update dependency Microsoft.Web.WebView2 to 1.0.3650.58
2025-12-09 23:02:57 +00:00
renovate[bot]
c5b98c6cc8 Update dotnet monorepo to 10.0.1 2025-12-09 19:55:45 +00:00
renovate[bot]
687a4088ab Update dependency AWSSDK.EC2 to 4.0.62 2025-12-09 03:37:36 +00:00
renovate[bot]
8c63843c22 Update dependency Microsoft.Web.WebView2 to 1.0.3650.58 2025-12-08 14:52:30 +00:00
copilot-swe-agent[bot]
469ca48592 Fix compilation issues and improve code review feedback
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-12-08 13:12:15 +00:00
copilot-swe-agent[bot]
208ce663b2 Address code review feedback - improve security validations
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-12-08 13:08:50 +00:00
copilot-swe-agent[bot]
843243c75e Add comprehensive tests for AnyDesk ID validation
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-12-08 13:06:16 +00:00
copilot-swe-agent[bot]
b7ed5a300d Fix command injection vulnerabilities in Process.Start calls
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-12-08 13:03:54 +00:00
copilot-swe-agent[bot]
415a649a76 Initial plan 2025-12-08 12:55:04 +00:00
Dimitrij
462d9c39af Merge pull request #3035 from mRemoteNG/renovate/nunit.console-3.x
Update dependency NUnit.Console to 3.21.0
2025-12-08 12:15:46 +00:00
Dimitrij
d52d79dd69 Merge pull request #3034 from mRemoteNG/renovate/protobuf-monorepo
Update dependency Google.Protobuf to 3.33.2
2025-12-08 12:15:25 +00:00
Dimitrij
5dbc6e74e0 Merge pull request #3033 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update aws-sdk-net monorepo
2025-12-08 12:15:02 +00:00
renovate[bot]
986b0084bf Update dependency NUnit.Console to 3.21.0 2025-12-08 12:14:52 +00:00
Dimitrij
78bdf02c14 Merge pull request #3036 from mRemoteNG/renovate/nunit.consolerunner-3.x
Update dependency NUnit.ConsoleRunner to 3.21.0
2025-12-08 12:14:31 +00:00
Dimitrij
b4ea8f00ad Merge pull request #3037 from mRemoteNG/renovate/nunit3testadapter-6.x
Update dependency NUnit3TestAdapter to v6
2025-12-08 12:14:16 +00:00
renovate[bot]
7fd992e9f1 Update dependency NUnit3TestAdapter to v6 2025-12-06 21:14:25 +00:00
renovate[bot]
76e739cdc1 Update dependency NUnit.ConsoleRunner to 3.21.0 2025-12-06 18:10:34 +00:00
renovate[bot]
0e0cc1c884 Update dependency Google.Protobuf to 3.33.2 2025-12-06 03:05:36 +00:00
renovate[bot]
21fba7f371 Update aws-sdk-net monorepo 2025-12-05 21:29:40 +00:00
Dimitrij
3f3a0c3c21 Merge pull request #3032 from mRemoteNG/renovate/reportgenerator-5.x
Update dependency ReportGenerator to 5.5.1
2025-12-04 10:24:31 +00:00
Kvarkas
1db87b18de update links to vc++ 2025-12-03 21:59:40 +00:00
renovate[bot]
44b01bca96 Update dependency ReportGenerator to 5.5.1 2025-12-03 21:35:59 +00:00
Dimitrij
441b13bed6 Merge pull request #3029 from mRemoteNG/renovate/softprops-action-gh-release-digest
Update softprops/action-gh-release digest to a06a81a
2025-12-03 17:10:28 +00:00
renovate[bot]
dd72e9edb7 Update softprops/action-gh-release digest to a06a81a 2025-12-01 09:07:48 +00:00
Kvarkas
8bbcc9b877 update to .net 10 2025-11-26 09:21:53 +00:00
Dimitrij
98580a8dc6 Merge pull request #3026 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.61
2025-11-26 09:21:00 +00:00
renovate[bot]
3600905a39 Update dependency AWSSDK.EC2 to 4.0.61 2025-11-25 21:38:27 +00:00
Dimitrij
c207685b91 Merge pull request #3025 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update aws-sdk-net monorepo
2025-11-24 10:28:24 +00:00
renovate[bot]
683f3bcb80 Update aws-sdk-net monorepo 2025-11-22 02:26:25 +00:00
Dimitrij
23f964ba28 Merge pull request #3023 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.59
2025-11-21 10:10:26 +00:00
renovate[bot]
56271ba346 Update dependency AWSSDK.EC2 to 4.0.59 2025-11-21 01:24:18 +00:00
Dimitrij
252a402f4f Merge pull request #3022 from mRemoteNG/renovate/actions-checkout-6.x
Update actions/checkout action to v6
2025-11-20 19:08:30 +00:00
renovate[bot]
d2d0722ac2 Update actions/checkout action to v6 2025-11-20 16:57:14 +00:00
Dimitrij
ce9bdccc4d Merge pull request #3019 from mRemoteNG/renovate/cucumber.messages-31.x
Update dependency Cucumber.Messages to v31
2025-11-20 14:52:12 +00:00
Dimitrij
2a992aa1d8 Merge pull request #3016 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update aws-sdk-net monorepo
2025-11-20 14:51:54 +00:00
Dimitrij
f73729bbe8 Merge pull request #3021 from mRemoteNG/renovate/gherkin-37.x
Update dependency Gherkin to v37
2025-11-20 14:51:31 +00:00
renovate[bot]
8634edbd8c Update aws-sdk-net monorepo 2025-11-20 00:30:33 +00:00
renovate[bot]
cc3ead0799 Update dependency Gherkin to v37 2025-11-19 20:43:09 +00:00
renovate[bot]
566cd26e73 Update dependency Cucumber.Messages to v31 2025-11-19 00:41:03 +00:00
Dimitrij
2354d5a8a4 Merge pull request #3015 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.54
2025-11-14 22:24:43 +00:00
renovate[bot]
778067a590 Update dependency AWSSDK.EC2 to 4.0.54 2025-11-13 22:56:16 +00:00
Dimitrij
d8d9c844d1 Merge pull request #3014 from mRemoteNG/renovate/protobuf-monorepo
Update dependency Google.Protobuf to 3.33.1
2025-11-13 22:55:42 +00:00
renovate[bot]
dc6655514a Update dependency Google.Protobuf to 3.33.1 2025-11-13 20:38:21 +00:00
Dimitrij
feb3b72fd0 Merge pull request #3011 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update aws-sdk-net monorepo
2025-11-13 10:58:16 +00:00
Dimitrij
479e18b204 Merge pull request #3012 from mRemoteNG/renovate/microsoft.data.sqlclient-6.x
Update dependency Microsoft.Data.SqlClient to 6.1.3
2025-11-13 10:57:59 +00:00
renovate[bot]
b1c169d0b8 Update dependency Microsoft.Data.SqlClient to 6.1.3 2025-11-13 00:43:12 +00:00
renovate[bot]
7f75fadb31 Update aws-sdk-net monorepo 2025-11-13 00:43:07 +00:00
Dimitrij
6af70543ea Merge pull request #3010 from mRemoteNG/renovate/reportgenerator-5.x
Update dependency ReportGenerator to 5.5.0
2025-11-12 09:28:27 +00:00
Dimitrij
59d5d575ad Merge pull request #3009 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.52
2025-11-12 09:26:54 +00:00
renovate[bot]
05f2b84cf5 Update dependency ReportGenerator to 5.5.0 2025-11-11 22:41:56 +00:00
renovate[bot]
a39d4a3063 Update dependency AWSSDK.EC2 to 4.0.52 2025-11-11 22:41:50 +00:00
Dimitrij
1da019575e Merge pull request #3008 from mRemoteNG/renovate/major-dotnet-monorepo
Update dotnet monorepo to v10 (major)
2025-11-11 18:37:15 +00:00
renovate[bot]
195c4be4e2 Update dotnet monorepo to v10 2025-11-11 18:36:53 +00:00
Dimitrij
4dd672e600 Merge pull request #3006 from mRemoteNG/renovate/vstest-monorepo
Update dependency Microsoft.NET.Test.Sdk to 18.0.1
2025-11-11 18:36:17 +00:00
renovate[bot]
f3a14c5ede Update dependency Microsoft.NET.Test.Sdk to 18.0.1 2025-11-11 18:36:04 +00:00
Dimitrij
af696a96aa Merge pull request #3007 from mRemoteNG/renovate/dotnet-monorepo
Update dotnet monorepo to 9.0.11
2025-11-11 18:35:29 +00:00
renovate[bot]
d7de52fb4c Update dotnet monorepo to 9.0.11 2025-11-11 16:53:18 +00:00
Dimitrij
ae66a8fcfc Merge pull request #3004 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.51
2025-11-11 09:11:25 +00:00
renovate[bot]
56d18774a8 Update dependency AWSSDK.EC2 to 4.0.51 2025-11-11 03:41:19 +00:00
Dimitrij
7ba22c5555 Merge pull request #2995 from joubertdj/fix/issue-2960-panel-tab-visibility
Fix panel tab header visibility issue when single panel is docked
2025-11-09 18:39:55 +00:00
Dimitrij
dab7715eb7 Merge pull request #3002 from mRemoteNG/renovate/softprops-action-gh-release-digest
Update softprops/action-gh-release digest to 5be0e66
2025-11-09 18:39:28 +00:00
Dimitrij
ec8bac933d Merge pull request #2999 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update aws-sdk-net monorepo
2025-11-09 18:38:46 +00:00
renovate[bot]
958ec65b17 Update softprops/action-gh-release digest to 5be0e66 2025-11-08 21:58:44 +00:00
renovate[bot]
e775acc209 Update aws-sdk-net monorepo 2025-11-07 23:29:42 +00:00
Dimitrij
d23631faef Merge pull request #2996 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.49
2025-11-07 09:14:03 +00:00
renovate[bot]
518401b2c4 Update dependency AWSSDK.EC2 to 4.0.49 2025-11-06 22:05:23 +00:00
Dawie Joubert
20c3ebd662 Fix panel tab header visibility issue when single panel is docked
Changed DockPanel DocumentStyle from DockingSdi to DockingWindow to ensure
panel tab headers remain visible even when only one panel exists in a dock area.

This resolves the issue where users could not access panel controls (close button,
pin/auto-hide, dropdown menu) after moving panels to new locations, as the tab
strip was completely hidden with DockingSdi when only one panel was present.

With DockingWindow style:
- Panel name/title always visible
- Close button (X) always accessible
- Pin/auto-hide button always available
- Dropdown menu always accessible
- No more "lost" panels requiring layout reset

Fixes #2960

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06 16:40:29 +02:00
Dimitrij
8d0d03e152 Merge pull request #2990 from joubertdj/fix/rdp-automatic-resize-issue-2971
Fix RDP automatic resize not working when manually dragging window edges (maximize/minimize/etc)
2025-11-06 12:10:22 +00:00
Dimitrij
632cfca71f Update mRemoteNGTests/Connection/Protocol/RdpProtocol8ResizeTests.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-06 12:09:27 +00:00
Dimitrij
221ff38a66 Merge pull request #2991 from joubertdj/fix/issue-2907-options-panel-fixes
Fix issue #2907: Options panel freezing, disposal, and performance is…
2025-11-06 12:08:18 +00:00
Dimitrij
3ac7365c9b Update mRemoteNGTests/UI/Forms/OptionsFormTests.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-06 12:06:36 +00:00
Dimitrij
be53755010 Update mRemoteNG/UI/Forms/frmOptions.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-06 12:06:18 +00:00
Dimitrij
30eafa3efa Update mRemoteNG/UI/Window/OptionsWindow.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-06 12:06:10 +00:00
Dimitrij
7c0a6a51d4 Merge pull request #2992 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update aws-sdk-net monorepo
2025-11-06 11:59:51 +00:00
Dimitrij
181f96823e Merge pull request #2993 from mRemoteNG/renovate/gherkin-36.x
Update dependency Gherkin to 36.1.0
2025-11-06 11:59:33 +00:00
renovate[bot]
7b4e9781ac Update dependency Gherkin to 36.1.0 2025-11-05 22:29:32 +00:00
renovate[bot]
7a4ff98ba8 Update aws-sdk-net monorepo 2025-11-05 22:29:26 +00:00
Dawie Joubert
100c2e3078 Fix issue #2907: Options panel freezing, disposal, and performance issues
This commit resolves multiple related issues with the Options dialog that caused freezing, crashes, and slow performance:

**Problem 1: Infinite Recursive Loop**
- Symptom: Options dialog would freeze when navigating between pages
- Cause: LstOptionPages_SelectedIndexChanged event handler triggering itself infinitely
- Fix: Added _isHandlingSelectionChange guard flag to prevent recursive calls

**Problem 2: Disposed Object Exception**
- Symptom: "Cannot access a disposed object" error after SSH connection workflow
- Cause: Static FrmOptions instance was disposed but still referenced
- Fix: Enhanced OptionsWindow.LoadOptionsForm() to detect disposal before use
- Fix: Added FrmMain.RecreateOptionsForm() to recreate disposed forms transparently

**Problem 3: Index Out of Range**
- Symptom: "index must be less than 0" when accessing empty lstOptionPages
- Cause: SetActivatedPage() tried to access Items[0] when collection was empty
- Fix: Added bounds checking before accessing lstOptionPages.Items

**Problem 4: NullReferenceException in OptionsPages**
- Symptom: NullReferenceException in LoadRegistrySettings() across all pages
- Cause: pageRegSettingsInstance was null when registry settings didn't exist
- Fix: Added null checks and default instance creation in 8 OptionsPages

**Problem 5: Slow Page Loading on Recreation**
- Symptom: Second Options dialog open showed staggered page loading (~2.2 seconds)
- Cause: Application.Idle async pattern loaded pages one-by-one
- Fix: Replaced async loading with synchronous batch loading using BeginUpdate/EndUpdate

**Files Modified:**
- mRemoteNG/UI/Forms/frmOptions.cs
- mRemoteNG/UI/Window/OptionsWindow.cs
- mRemoteNG/UI/Forms/frmMain.cs
- mRemoteNG/UI/Forms/OptionsPages/StartupExitPage.cs
- mRemoteNG/UI/Forms/OptionsPages/NotificationsPage.cs
- mRemoteNG/UI/Forms/OptionsPages/AppearancePage.cs
- mRemoteNG/UI/Forms/OptionsPages/SecurityPage.cs
- mRemoteNG/UI/Forms/OptionsPages/ConnectionsPage.cs
- mRemoteNG/UI/Forms/OptionsPages/CredentialsPage.cs
- mRemoteNG/UI/Forms/OptionsPages/TabsPanelsPage.cs
- mRemoteNG/UI/Forms/OptionsPages/UpdatesPage.cs

**Additional Changes:**
- Replaced all Debug.WriteLine with Logger.Instance.Log for consistent logging
- Added comprehensive debug logging throughout Options form lifecycle
- Improved defensive programming with guard flags and validation checks

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-05 19:49:56 +02:00
Dawie Joubert
cc6f07d943 Fix RDP automatic resize not working when manually dragging window edges
Fixes #2971

This fix addresses the issue where RDP connections with "Automatic resize"
enabled weren't resizing the remote desktop when users manually dragged
window edges - only when changing window states (Maximize/Restore).

Changes:
- RdpProtocol8.cs: Fixed resize logic to use InterfaceControl.Size instead
  of Control.Size, added 300ms debounce to reduce flickering, and registered
  ResizeEnd event handler
- RdpProtocol9.cs: Added null safety checks in UpdateSessionDisplaySettings
- NotificationPanelMessageWriter.cs: Added exception handling for shutdown
  scenarios to prevent InvalidAsynchronousStateException
- RdpProtocol8ResizeTests.cs: Added 12 comprehensive unit tests covering
  all resize scenarios including debounce mechanism
- TabColorConverterTests.cs: Added missing System namespace import

The fix works for all RDP versions (8, 9, 10, 11) through inheritance.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-05 17:34:45 +02:00
Dimitrij
cc3a9c3a00 Merge pull request #2985 from mRemoteNG/copilot/fix-vnc-connection-issue
Fix VNC connection failure due to TCP client resource leak
2025-11-03 22:49:06 +00:00
Dimitrij
ce1d82c730 Merge pull request #2986 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.47
2025-11-03 22:42:17 +00:00
renovate[bot]
ec3a01de70 Update dependency AWSSDK.EC2 to 4.0.47 2025-11-03 22:13:04 +00:00
Dimitrij
af894964fc Update mRemoteNG/Connection/Protocol/VNC/Connection.Protocol.VNC.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-03 21:39:58 +00:00
copilot-swe-agent[bot]
5cebc4d418 Reset socket exception before other operations for safety
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-11-03 21:25:15 +00:00
copilot-swe-agent[bot]
04e0144004 Preserve exception stack trace using ExceptionDispatchInfo
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-11-03 21:23:55 +00:00
copilot-swe-agent[bot]
c33c9814c2 Address code review feedback: improve comment and add thread safety
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-11-03 21:22:07 +00:00
copilot-swe-agent[bot]
3a946e5810 Fix VNC connection TCP client resource leak
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-11-03 21:18:50 +00:00
copilot-swe-agent[bot]
6a6a894a1c Initial plan 2025-11-03 21:14:03 +00:00
Dimitrij
e1ffb9262d Merge pull request #2977 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update aws-sdk-net monorepo
2025-11-03 11:48:00 +00:00
Dimitrij
b3eb6904f9 Merge pull request #2983 from mRemoteNG/renovate/microsoft.web.webview2-1.x
Update dependency Microsoft.Web.WebView2 to 1.0.3595.46
2025-11-03 11:47:37 +00:00
Dimitrij
72cbade402 Merge pull request #2979 from MaxPlap/feature/VaultOpenbao-Connector
Feature/vault openbao connector
2025-11-03 11:10:12 +00:00
Dimitrij
6fd008c2e8 Merge pull request #2978 from mRemoteNG/renovate/ssh.net-2025.x
Update dependency SSH.NET to 2025.1.0
2025-11-03 11:09:54 +00:00
renovate[bot]
25f26f08de Update dependency Microsoft.Web.WebView2 to 1.0.3595.46 2025-11-03 10:00:32 +00:00
renovate[bot]
7ebc62d8e3 Update aws-sdk-net monorepo 2025-10-31 20:57:59 +00:00
massimo.antonello
e04ba4f9e0 removed debug log 2025-10-28 15:46:38 +01:00
massimo.antonello
0d4324b009 Read OTP SSH 2025-10-28 15:12:32 +01:00
massimo.antonello
6404956a62 new option 2025-10-28 14:45:26 +01:00
renovate[bot]
769db78ee8 Update dependency SSH.NET to 2025.1.0 2025-10-27 23:27:13 +00:00
Dimitrij
8bb8d52b1d Merge pull request #2974 from mRemoteNG/renovate/reportgenerator-5.x
Update dependency ReportGenerator to 5.4.18
2025-10-26 13:20:05 +00:00
Dimitrij
e990659d05 Merge pull request #2975 from mRemoteNG/renovate/chromiumembeddedframework.runtime.win-arm64-141.x
Update dependency chromiumembeddedframework.runtime.win-arm64 to v141
2025-10-26 13:19:45 +00:00
Dimitrij
0fcef353ae Merge pull request #2976 from mRemoteNG/renovate/chromiumembeddedframework.runtime.win-x64-141.x
Update dependency chromiumembeddedframework.runtime.win-x64 to v141
2025-10-26 13:18:40 +00:00
renovate[bot]
bf91a8a709 Update dependency chromiumembeddedframework.runtime.win-x64 to v141 2025-10-26 00:55:06 +00:00
renovate[bot]
d81a608b3a Update dependency chromiumembeddedframework.runtime.win-arm64 to v141 2025-10-26 00:55:02 +00:00
renovate[bot]
8413ee77d4 Update dependency ReportGenerator to 5.4.18 2025-10-25 16:48:20 +00:00
Dimitrij
4d92a30089 Merge pull request #2970 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update aws-sdk-net monorepo
2025-10-24 09:16:23 +01:00
renovate[bot]
57f7e09bb6 Update aws-sdk-net monorepo 2025-10-24 01:12:48 +00:00
Dimitrij
19fdccc540 Merge pull request #2969 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.44
2025-10-23 17:44:02 +01:00
renovate[bot]
83c2f2a7a8 Update dependency AWSSDK.EC2 to 4.0.44 2025-10-23 02:53:43 +00:00
Dimitrij
9dcea7ed6e Merge pull request #2968 from mRemoteNG/renovate/mysql.data-9.x
Update dependency MySql.Data to 9.5.0
2025-10-22 10:29:24 +01:00
renovate[bot]
6ad3de91e9 Update dependency MySql.Data to 9.5.0 2025-10-22 08:26:36 +00:00
Dimitrij
2bbbd166f9 Merge pull request #2967 from mRemoteNG/copilot/fix-command-injection-vulnerability
Fix command injection vulnerabilities in Process.Start calls
2025-10-22 09:25:51 +01:00
copilot-swe-agent[bot]
327ba3f4e1 Add path validation to PuttyBase, IntegratedProgram, and AnyDesk protocols
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-22 08:21:20 +00:00
copilot-swe-agent[bot]
c9b77b6616 Add comprehensive security tests for path validation and command injection prevention
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-22 08:17:58 +00:00
copilot-swe-agent[bot]
a94e58c83e Add path validation to prevent command injection in Process.Start calls
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-22 08:16:25 +00:00
copilot-swe-agent[bot]
d40794d7a0 Initial plan 2025-10-22 08:10:43 +00:00
Dimitrij
7dd916dd80 Merge pull request #2966 from mRemoteNG/copilot/fix-option-panel-issue
Fix options panel hanging on second open
2025-10-22 00:51:38 +01:00
copilot-swe-agent[bot]
d16d76d0fa Improve fix to avoid interfering with initial load
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-21 23:41:25 +00:00
copilot-swe-agent[bot]
a896949752 Fix options panel not opening on second call
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-21 23:40:06 +00:00
copilot-swe-agent[bot]
f63186a7a6 Initial plan 2025-10-21 23:35:44 +00:00
Dimitrij
ee88e835ed in additional to #2963 logic fixes 2025-10-22 00:16:26 +01:00
Dimitrij
1288a274f3 code tidy up 2025-10-21 22:19:22 +01:00
Dimitrij
facc523aae Merge pull request #2963 from mRemoteNG/copilot/add-bind-connections-config
Add option to bind Connections and Config panels together when auto-hidden
2025-10-21 21:00:15 +01:00
Dimitrij
11dfdd797d Merge pull request #2962 from mRemoteNG/copilot/fix-remote-code-execution
Remove insecure BinaryFormatter deserialization code to prevent RCE vulnerabilities
2025-10-21 20:58:55 +01:00
copilot-swe-agent[bot]
3dc37d0359 Refine PanelBinder implementation and add documentation
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-21 17:33:38 +00:00
copilot-swe-agent[bot]
b00185e1dc Add panel binding feature with UI option
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-21 17:31:29 +00:00
copilot-swe-agent[bot]
44c65775ad Remove insecure BinaryFormatter code and imports
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-21 17:24:50 +00:00
copilot-swe-agent[bot]
9c31ee28b6 Initial plan 2025-10-21 17:20:45 +00:00
copilot-swe-agent[bot]
5868f91d2d Initial plan 2025-10-21 17:17:46 +00:00
Dimitrij
ee3735904d Merge pull request #2957 from mRemoteNG/copilot/add-anydesk-connection-plugin
Add native AnyDesk protocol support to mRemoteNG
2025-10-20 22:35:51 +01:00
Dimitrij
2b39dde523 Update mRemoteNG/Connection/Protocol/AnyDesk/ProtocolAnyDesk.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-20 22:34:26 +01:00
Dimitrij
611fdcebe9 Update mRemoteNG/Connection/Protocol/AnyDesk/ProtocolAnyDesk.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-20 22:34:06 +01:00
Dimitrij
b6c21bb21f Update mRemoteNG/Connection/Protocol/AnyDesk/ProtocolAnyDesk.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-20 22:31:42 +01:00
copilot-swe-agent[bot]
ed2fee3195 Add AnyDesk documentation and improve implementation comments
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-20 17:39:05 +00:00
copilot-swe-agent[bot]
2d7a897a4d Improve AnyDesk protocol implementation - better window handling and cleanup
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-20 17:36:21 +00:00
copilot-swe-agent[bot]
4f14c78b58 Add AnyDesk protocol support - initial implementation
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-20 17:33:56 +00:00
copilot-swe-agent[bot]
8b8c1d919e Initial plan 2025-10-20 17:27:45 +00:00
Dimitrij
e960353de6 Merge pull request #2955 from mRemoteNG/fix/aikido-security-sast-8911151-ato3
[Aikido] AI Fix for Path traversal attack possible
2025-10-20 10:02:10 +01:00
aikido-autofix[bot]
e563a4c319 fix(security): autofix Path traversal attack possible 2025-10-20 09:01:19 +00:00
Dimitrij
131aef7069 Merge pull request #2954 from mRemoteNG/copilot/add-wsl-connection-protocol
Add WSL protocol support with installation check
2025-10-19 21:55:47 +01:00
Dimitrij
73c3e078d1 Merge branch 'v1.78.2-dev' into copilot/add-wsl-connection-protocol 2025-10-19 21:55:39 +01:00
Dimitrij
8858d55970 Merge pull request #2952 from mRemoteNG/copilot/add-protocol-to-connect-terminal
Add Terminal protocol to connect to command prompt
2025-10-19 21:53:24 +01:00
copilot-swe-agent[bot]
f983f5de02 Improve timeout handling and error messaging in Terminal protocol
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-19 20:40:22 +00:00
copilot-swe-agent[bot]
a8efba1ed4 Fix handle creation wait loop in Terminal protocol
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-19 20:38:36 +00:00
copilot-swe-agent[bot]
8fc3682cc9 Address code review feedback - improve Terminal protocol implementation
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-19 20:36:52 +00:00
copilot-swe-agent[bot]
4ade871aba Add WSL translations to language resource files
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-19 20:34:40 +00:00
copilot-swe-agent[bot]
0a381e0a44 Improve Terminal protocol to use cmd.exe instead of wt.exe
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-19 20:34:22 +00:00
copilot-swe-agent[bot]
895e16d4cb Add Terminal language entries to all language files
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-19 20:33:20 +00:00
copilot-swe-agent[bot]
6657fa3ad0 Update attributes and tests for WSL protocol
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-19 20:32:40 +00:00
copilot-swe-agent[bot]
f5fcc7c206 Add WSL protocol support with installation check
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-19 20:30:48 +00:00
copilot-swe-agent[bot]
435e6f46c1 Add Terminal protocol support to mRemoteNG
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-19 20:29:42 +00:00
copilot-swe-agent[bot]
9ef81e6e72 Initial plan 2025-10-19 20:23:35 +00:00
copilot-swe-agent[bot]
e4b4400aa5 Initial plan 2025-10-19 20:22:29 +00:00
Dimitrij
1d9e082a4a Merge pull request #2950 from mRemoteNG/copilot/fix-log4net-not-found
Fix unhandled exception during startup: log4net assembly not found
2025-10-19 20:34:43 +01:00
copilot-swe-agent[bot]
43d11a5de2 Remove log4net assembly-level attribute causing startup crash
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-19 19:21:14 +00:00
copilot-swe-agent[bot]
94db6caa2c Initial plan 2025-10-19 19:16:54 +00:00
Dimitrij
11366e5d8d upd 2025-10-19 00:43:44 +01:00
Dimitrij
a2967fa999 Merge pull request #2946 from mRemoteNG/copilot/add-margin-to-connection-frame
Fix connection frame color visibility by adding padding to prevent content overlap
2025-10-19 00:36:04 +01:00
copilot-swe-agent[bot]
12920bc6c6 Update IntegratedProgram and PowerShell protocols to respect connection frame padding
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-18 23:20:09 +00:00
copilot-swe-agent[bot]
55fec45b58 Add padding to InterfaceControl to make connection frame color visible
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-18 23:18:15 +00:00
copilot-swe-agent[bot]
045aa631e4 Initial plan 2025-10-18 23:12:37 +00:00
Dimitrij
3cf3a70fc7 fix 2025-10-19 00:01:59 +01:00
Dimitrij
290dab29f1 Merge pull request #2944 from mRemoteNG/copilot/add-attribute-to-store-tags
Add EnvironmentTags attribute to store environment categorization tags
2025-10-18 23:57:05 +01:00
copilot-swe-agent[bot]
79b252f839 Add EnvironmentTags to test helper
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-18 22:51:46 +00:00
copilot-swe-agent[bot]
49bd76f197 Add EnvironmentTags property to connection info
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-18 22:50:02 +00:00
copilot-swe-agent[bot]
54492bedfb Initial plan 2025-10-18 22:39:41 +00:00
Dimitrij
2d1c2df2cb Merge pull request #2941 from mRemoteNG/copilot/add-ctrl-tab-tab-switching
Add Ctrl+Tab keyboard shortcuts for tab navigation
2025-10-18 22:41:54 +01:00
Dimitrij
1187e1c95e Merge pull request #2942 from mRemoteNG/copilot/add-production-color-frame
Add Connection Frame Color feature to visually distinguish production and other environments
2025-10-18 22:41:23 +01:00
copilot-swe-agent[bot]
664a63211e Add visual examples for ConnectionFrameColor feature
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-18 21:35:35 +00:00
copilot-swe-agent[bot]
b7df1e80c8 Add implementation notes and summary for ConnectionFrameColor feature
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-18 21:34:43 +00:00
copilot-swe-agent[bot]
2d6563022e Add documentation for ConnectionFrameColor feature
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-18 21:33:31 +00:00
copilot-swe-agent[bot]
5423c84eed Update CSV serializer to include ConnectionFrameColor field
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-18 21:31:51 +00:00
copilot-swe-agent[bot]
d263fb1b80 Add ConnectionFrameColor feature for visual environment distinction
- Added ConnectionFrameColor enum with None, Red, Yellow, Green, Blue, Purple options
- Added ConnectionFrameColor property to AbstractConnectionRecord with inheritance support
- Updated XML serialization to save/load ConnectionFrameColor
- Added language resources for ConnectionFrameColor
- Implemented visual border rendering in InterfaceControl based on ConnectionFrameColor

Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-18 21:29:59 +00:00
copilot-swe-agent[bot]
c72bd2a107 Consolidate debug log messages to single line
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-18 21:29:29 +00:00
copilot-swe-agent[bot]
8e4627c872 Add debug logging for edge case in tab navigation
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-18 21:27:56 +00:00
copilot-swe-agent[bot]
ccbe99f828 Add edge case handling for tab navigation
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-18 21:25:57 +00:00
copilot-swe-agent[bot]
ee483e3b2b Add Ctrl+Tab keyboard shortcuts for tab navigation
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-18 21:25:20 +00:00
copilot-swe-agent[bot]
5b4b13828b Initial plan 2025-10-18 21:23:39 +00:00
copilot-swe-agent[bot]
4b0bc71fb0 Initial plan 2025-10-18 21:18:55 +00:00
Dimitrij
c28ae335b2 Merge pull request #2939 from mRemoteNG/copilot/fix-sql-injection-issue
Fix SQL injection vulnerabilities via parameterized queries
2025-10-18 22:11:18 +01:00
copilot-swe-agent[bot]
2d3830b747 Clarify comment about database-specific datetime types
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-18 20:38:22 +00:00
copilot-swe-agent[bot]
fe4e205772 Add clarifying comment about datetime parameter usage
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-18 20:36:32 +00:00
copilot-swe-agent[bot]
5e2fc8b0dc Fix SQL injection in SqlConnectionsSaver UpdateUpdatesTable method
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-18 20:33:47 +00:00
copilot-swe-agent[bot]
6403573e36 Fix SQL injection vulnerabilities using parameterized queries
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-18 20:32:21 +00:00
Dimitrij
39b863b57e Merge pull request #2940 from mRemoteNG/fix/aikido-security-sast-8815714-tnsC
[Aikido] AI Fix for Possible command injection via Process.Start
2025-10-18 21:31:15 +01:00
aikido-autofix[bot]
8e5cdcb6e5 fix(security): autofix Possible command injection via Process.Start 2025-10-18 20:29:05 +00:00
copilot-swe-agent[bot]
f5b7cd6fb1 Initial plan 2025-10-18 20:27:45 +00:00
Dimitrij
493ddc1f1f Merge pull request #2932 from mRemoteNG/copilot/fix-https-login-issue
Fix HTTP/HTTPS protocol to support multiple concurrent connections
2025-10-18 21:13:16 +01:00
Dimitrij
5ad338bdcc Merge pull request #2937 from mRemoteNG/renovate/nunit.console-3.x
Update dependency NUnit.Console to 3.20.2
2025-10-18 14:29:58 +01:00
renovate[bot]
d1a1adb994 Update dependency NUnit.Console to 3.20.2 2025-10-18 13:28:59 +00:00
Dimitrij
c879b030ad Merge pull request #2936 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.43.2
2025-10-18 14:28:40 +01:00
Dimitrij
8d1d55c38e Merge pull request #2938 from mRemoteNG/renovate/nunit.consolerunner-3.x
Update dependency NUnit.ConsoleRunner to 3.20.2
2025-10-18 14:28:21 +01:00
renovate[bot]
aef576d290 Update dependency NUnit.ConsoleRunner to 3.20.2 2025-10-18 05:11:19 +00:00
renovate[bot]
e34b0fded3 Update dependency AWSSDK.EC2 to 4.0.43.2 2025-10-18 02:13:16 +00:00
copilot-swe-agent[bot]
14e5e6a715 Add proper thread marshalling and improve cleanup safety
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-17 17:57:51 +00:00
copilot-swe-agent[bot]
0579273964 Fix async deadlock issues and improve error handling
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-17 17:56:04 +00:00
copilot-swe-agent[bot]
5839a836c8 Address code review feedback - improve async handling and safety
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-17 17:54:16 +00:00
copilot-swe-agent[bot]
236fff8014 Fix HTTP/HTTPS protocol to support multiple concurrent connections
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-17 17:51:36 +00:00
copilot-swe-agent[bot]
c1efefae81 Initial plan 2025-10-17 17:46:16 +00:00
Dimitrij
1e5bd44332 Merge pull request #2931 from MaxPlap/feature/VaultOpenbao-Connector
Feature/vault openbao connector
2025-10-17 16:59:18 +01:00
massimo.antonello
7478537f3e Revert RootNode Properties 2025-10-17 16:18:57 +02:00
massimo.antonello
b0f50b825f used winform window for credentials like other connectors 2025-10-17 16:14:06 +02:00
massimo.antonello
7509fcda52 Merge remote-tracking branch 'origin/v1.78.2-dev' into feature/VaultOpenbao-Connector
# Conflicts:
#	mRemoteNG/Language/Language.resx
2025-10-17 14:58:16 +02:00
massimo.antonello
0991cf74ef Secret Engine Property 2025-10-17 14:53:01 +02:00
massimo.antonello
61dd2ec8db started working 2025-10-17 11:49:17 +02:00
massimo.antonello
77643848b6 new properties 2025-10-17 11:48:40 +02:00
Dimitrij
21ab172041 fix 2025-10-17 09:12:57 +01:00
Dimitrij
d6c2c2158a Merge pull request #2930 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.43.1
2025-10-16 23:26:54 +01:00
renovate[bot]
0c50e2d78e Update dependency AWSSDK.EC2 to 4.0.43.1 2025-10-16 21:33:36 +00:00
Dimitrij
64183e8e7d Merge pull request #2929 from mRemoteNG/copilot/fix-panel-visibility-issue
Fix panel visibility issue when opening first connection
2025-10-16 22:32:56 +01:00
copilot-swe-agent[bot]
b9595d1650 Fix panel visibility check to use DockState
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 21:28:45 +00:00
copilot-swe-agent[bot]
fa3be420b8 Initial plan 2025-10-16 21:21:53 +00:00
Dimitrij
e2d1929553 Merge pull request #2925 from mRemoteNG/copilot/fix-options-panel-display
Fix Options panel corruption when toggling "Always show panel tabs"
2025-10-16 22:12:01 +01:00
Dimitrij
4f05e8dbe9 Merge pull request #2927 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.Core to 4.0.1.1
2025-10-16 22:11:38 +01:00
renovate[bot]
ea9e79d930 Update dependency AWSSDK.Core to 4.0.1.1 2025-10-16 21:08:10 +00:00
Dimitrij
e1a8d60cd7 Merge pull request #2926 from mRemoteNG/copilot/fix-empty-space-in-tabs
[WIP] Fix empty space issue between settings in Tabs & Panels
2025-10-16 22:07:31 +01:00
copilot-swe-agent[bot]
4e20049ea3 Fix Options panel corruption when toggling 'Always show panel tabs'
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 21:05:51 +00:00
copilot-swe-agent[bot]
89ccd33fd1 Fix empty space in Tabs & Panels settings by adjusting control positions
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 21:04:59 +00:00
copilot-swe-agent[bot]
4668104e36 Initial plan 2025-10-16 21:01:20 +00:00
copilot-swe-agent[bot]
b4aa30de23 Initial plan 2025-10-16 20:55:28 +00:00
Dimitrij
526cb1fb47 small fixes 2025-10-16 21:50:59 +01:00
Dimitrij
03b395ee15 Merge pull request #2924 from mRemoteNG/copilot/fix-first-connection-panel-issue
Fix connection panel visibility issue on first connection
2025-10-16 21:45:50 +01:00
copilot-swe-agent[bot]
4125344254 Fix panel visibility issue when opening first connection
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 20:40:36 +00:00
copilot-swe-agent[bot]
531e117731 Initial plan 2025-10-16 20:31:42 +00:00
Dimitrij
588fdca4d7 Merge pull request #2922 from mRemoteNG/copilot/add-options-dialog-prompt
Add confirmation prompt when closing Options dialog with unsaved changes
2025-10-16 21:24:59 +01:00
Dimitrij
285ca46c18 Merge branch 'v1.78.2-dev' into copilot/add-options-dialog-prompt 2025-10-16 21:24:41 +01:00
Dimitrij
8bdb83eb73 Merge pull request #2919 from mRemoteNG/copilot/fix-empty-option-panel
Fix empty Options panel when Theme is canceled
2025-10-16 21:21:52 +01:00
Dimitrij
d38b71d5ea Merge branch 'v1.78.2-dev' into copilot/fix-empty-option-panel 2025-10-16 21:21:06 +01:00
copilot-swe-agent[bot]
687f06937d Fix change tracking to ignore initial loading and add tests
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 20:20:00 +00:00
copilot-swe-agent[bot]
e0799a6772 Add change tracking and prompt for unsaved options
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 20:18:11 +00:00
Dimitrij
4943dce1a8 Merge pull request #2921 from mRemoteNG/copilot/fix-options-freezing-issue
[WIP] Fix freezing issue when opening and closing Options
2025-10-16 21:16:33 +01:00
copilot-swe-agent[bot]
8dee5c0d3c Also fix event handler accumulation in OptionsWindow
- Add _isInitialized flag to OptionsWindow to prevent multiple ThemeChanged subscriptions
- Ensures ThemeChanged event is only subscribed once

Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 20:14:34 +00:00
Dimitrij
018b07299e Merge pull request #2920 from mRemoteNG/copilot/fix-rdp-settings-alignment
Fix RDP settings fields alignment in Connections options page
2025-10-16 21:13:21 +01:00
copilot-swe-agent[bot]
6f52b82a6d Fix Options dialog freezing when opening/closing multiple times
- Add _isInitialized flag to prevent multiple event subscriptions
- Skip re-initialization in FrmOptions_Load when form is reused
- Properly clean up Application.Idle handler in FormClosing
- Add test to verify form can be shown/hidden multiple times

Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 20:13:01 +00:00
copilot-swe-agent[bot]
e1ee905286 Initial plan 2025-10-16 20:12:40 +00:00
copilot-swe-agent[bot]
6853b158ce Fix empty Options panel when Theme is canceled
- Call RevertSettings() on all option pages when Cancel is clicked
- Enhanced ThemePage.RevertSettings() to properly revert theme changes:
  - Store original active theme in LoadSettings
  - Clear modifiedThemes list on cancel
  - Restore original theme selection
- Add VisibleChanged handler to ensure panel is populated when form is shown
- Fixes issue where Options panel was empty after canceling theme selection

Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 20:09:02 +00:00
copilot-swe-agent[bot]
d705b8a45d Fix RDP settings fields alignment in Connections options page
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 20:08:58 +00:00
copilot-swe-agent[bot]
cfb707d20f Initial plan 2025-10-16 20:07:55 +00:00
copilot-swe-agent[bot]
3aedc938cb Initial plan 2025-10-16 20:05:10 +00:00
copilot-swe-agent[bot]
c70e4c66e6 Initial plan 2025-10-16 20:02:27 +00:00
Dimitrij
b727dbd604 Merge pull request #2918 from mRemoteNG/copilot/fix-connection-options-setting
[WIP] Fix connection options displaying incorrect value
2025-10-16 20:54:27 +01:00
copilot-swe-agent[bot]
cd7f237920 Add Settings.Default.Save() to ConnectionContextMenu disconnect
Found another location where ConfirmCloseConnection is changed without immediately saving.
This ensures all four code paths that change this setting persist it immediately.

Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 19:52:57 +00:00
Dimitrij
a1db763060 Merge pull request #2915 from mRemoteNG/copilot/fix-password-visibility-issue
Fix password with special characters not passed correctly to External Tools
2025-10-16 20:52:35 +01:00
copilot-swe-agent[bot]
01e22740ce Fix Options page not showing correct ConfirmCloseConnection value
- Add VisibleChanged event handler to ConnectionsPage to reload settings when page becomes visible
- Save settings immediately when user checks "Don't show this message again" checkbox during connection close
- Ensures Options dialog always displays current setting value, even if changed outside the dialog

Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 19:51:02 +00:00
copilot-swe-agent[bot]
6b52b6b062 Initial plan 2025-10-16 19:43:33 +00:00
Dimitrij
6781fd57af Merge pull request #2916 from mRemoteNG/copilot/fix-connection-warning-option
Fix: Set ConfirmCloseConnection to Never when "Do not show this dialog again" is checked
2025-10-16 19:38:33 +01:00
copilot-swe-agent[bot]
8b22c7812d Fix: Set ConfirmCloseConnection to Never instead of decrementing
When user checks "Do not show this dialog again" while closing a connection,
the ConfirmCloseConnection setting should be set to Never (1) instead of being
decremented. The decrement approach was incorrectly changing All (4) to Multiple (3)
instead of Never (1), which didn't match user expectations.

Fixed in:
- ConnectionTab.cs
- ConnectionWindow.cs (2 occurrences)
- ConnectionContextMenu.cs
- frmMain.cs

Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 18:27:54 +00:00
copilot-swe-agent[bot]
80c1391361 Fix password passing issue in External Tools
- Changed SetProcessProperties to use Arguments property instead of splitting by space and using ArgumentList
- Added tests to verify passwords with special characters like '=' are passed correctly
- This fixes the issue where passwords like 'Z-3=Wv99/Aq' were being split incorrectly

Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 18:26:41 +00:00
copilot-swe-agent[bot]
c77e6b8616 Initial plan 2025-10-16 18:22:19 +00:00
copilot-swe-agent[bot]
e04ace4820 Initial plan 2025-10-16 18:20:37 +00:00
Dimitrij
d89ea96b34 Merge pull request #2904 from mRemoteNG/copilot/fix-encryption-issue-windows-11
Fix connection file encryption failure when password protection is enabled
2025-10-16 19:19:33 +01:00
massimo.antonello
0e83e525fe Properties 2025-10-16 15:06:16 +02:00
copilot-swe-agent[bot]
d5d9a8bf03 Fix PasswordString getter to never return empty password
Added defensive check in PasswordString getter to ensure it returns the default password when _customPassword is empty, even if Password property is true. This prevents encryption failures when Password is set inconsistently.

Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 04:12:08 +00:00
copilot-swe-agent[bot]
ecb935868d Add tests for Password property edge cases
Added tests to verify that full file encryption works correctly when Password property is set directly without setting PasswordString, ensuring the fix prevents encryption failures.

Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 04:08:46 +00:00
copilot-swe-agent[bot]
d736d3c388 Fix connection file encryption with password protection
Changed CreateProtectedAttribute to use PasswordString as source of truth instead of Password property. This prevents encryption failures when Password property is true but _customPassword is empty.

Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 04:07:26 +00:00
copilot-swe-agent[bot]
2520ccd6be Initial plan 2025-10-16 03:57:26 +00:00
Dimitrij
4307dd043e Merge pull request #2903 from mRemoteNG/copilot/fix-about-tab-close-dialog
Fix About tab showing connection close dialog when closed
2025-10-16 04:54:20 +01:00
copilot-swe-agent[bot]
4ae8e4252b Convert frmAbout from Form to BaseWindow to prevent connection close dialog
- Changed frmAbout to inherit from BaseWindow instead of Form
- Updated HelpMenu to show About window in DockPanel
- Removed Form-specific properties (TopMost, StartPosition, FormBorderStyle, etc.)
- Removed Hide() behavior in OnFormClosing to allow proper tab closure
- Added TabText property for proper tab display

Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-16 03:49:45 +00:00
copilot-swe-agent[bot]
995f03d03e Initial plan 2025-10-16 03:38:46 +00:00
Dimitrij
2965f598ac Merge pull request #2902 from mRemoteNG/renovate/protobuf-monorepo
Update dependency Google.Protobuf to 3.33.0
2025-10-16 04:29:48 +01:00
Dimitrij
0ad6f5aea1 Merge pull request #2901 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.43
2025-10-16 04:29:35 +01:00
renovate[bot]
c6fe8ff1f1 Update dependency Google.Protobuf to 3.33.0 2025-10-15 21:36:14 +00:00
renovate[bot]
a3a6917bf8 Update dependency AWSSDK.EC2 to 4.0.43 2025-10-15 21:36:08 +00:00
Dimitrij
1d8484957e fix menu issues and add translations 2025-10-15 19:04:42 +01:00
massimo.antonello
0fc3fb4a58 Merge remote-tracking branch 'origin/v1.78.2-dev' into feature/VaultOpenbao-Connector
# Conflicts:
#	mRemoteNG/Language/Language.de.resx
#	mRemoteNG/Language/Language.el.resx
#	mRemoteNG/Language/Language.es.resx
#	mRemoteNG/Language/Language.fi-FI.resx
#	mRemoteNG/Language/Language.fr.resx
#	mRemoteNG/Language/Language.hu.resx
#	mRemoteNG/Language/Language.it.resx
#	mRemoteNG/Language/Language.ja-JP.resx
#	mRemoteNG/Language/Language.ko-KR.resx
#	mRemoteNG/Language/Language.lt.resx
#	mRemoteNG/Language/Language.nb-NO.resx
#	mRemoteNG/Language/Language.nl.resx
#	mRemoteNG/Language/Language.pl.resx
#	mRemoteNG/Language/Language.pt-BR.resx
#	mRemoteNG/Language/Language.pt.resx
#	mRemoteNG/Language/Language.resx
#	mRemoteNG/Language/Language.sv-SE.resx
#	mRemoteNG/Language/Language.ta.resx
#	mRemoteNG/Language/Language.tr-TR.resx
#	mRemoteNG/Language/Language.uk.resx
#	mRemoteNG/Language/Language.zh-CN.resx
#	mRemoteNG/Language/Language.zh-TW.resx
2025-10-15 14:52:58 +02:00
Dimitrij
6ab67ee844 Merge pull request #2900 from mRemoteNG/copilot/fix-report-bug-link
Add "Report a Bug" menu item to Help menu and update bug report URL to GitHub issues
2025-10-15 11:11:33 +01:00
copilot-swe-agent[bot]
11fa059b1b Add Report a Bug menu item and update bug URL to GitHub issues
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-15 10:01:51 +00:00
copilot-swe-agent[bot]
847115abd6 Initial plan 2025-10-15 09:56:41 +00:00
Dimitrij
a5a0a310ce Update CREDITS.md
upd
2025-10-14 22:33:36 +01:00
Dimitrij
a72582b10f Merge pull request #2898 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.42
2025-10-14 22:06:24 +01:00
Dimitrij
929e22dc5a Merge pull request #2897 from mRemoteNG/renovate/dotnet-monorepo
Update dependency Microsoft.Extensions.DependencyModel to 9.0.10
2025-10-14 22:06:12 +01:00
renovate[bot]
ec4bca9bc0 Update dependency Microsoft.Extensions.DependencyModel to 9.0.10 2025-10-14 21:05:25 +00:00
Dimitrij
0648541ce1 lib update 2025-10-14 22:04:45 +01:00
renovate[bot]
77529f29f5 Update dependency AWSSDK.EC2 to 4.0.42 2025-10-14 20:49:17 +00:00
Dimitrij
02cf1739c0 Fix language msgs 2025-10-14 19:51:16 +01:00
massimo.antonello
903a5f5799 begin 2025-10-14 17:57:05 +02:00
Dimitrij
ccd955ca7e Merge pull request #2895 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update dependency AWSSDK.EC2 to 4.0.41
2025-10-14 08:12:08 +01:00
renovate[bot]
1af3b03fa8 Update dependency AWSSDK.EC2 to 4.0.41 2025-10-13 21:01:18 +00:00
Dimitrij
cc28186f73 Merge pull request #2894 from mRemoteNG/copilot/fix-options-panel-reopening
Fix Options panel not reopening after closing by clicking X on tab
2025-10-13 10:20:53 +01:00
Dimitrij
103bc8bd8b Update README.md
upd
2025-10-12 18:41:13 +01:00
copilot-swe-agent[bot]
9bcf7af467 Fix Options panel not reopening after closing
Set HideOnClose = true for OptionsWindow to prevent disposal when closed, and ensure embedded form is shown when window becomes visible again.

Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-12 17:02:36 +00:00
copilot-swe-agent[bot]
8d10980875 Initial plan 2025-10-12 16:55:17 +00:00
Dimitrij
57d4945d71 Merge pull request #2890 from mRemoteNG/renovate/softprops-action-gh-release-digest
Update softprops/action-gh-release digest to 6da8fa9
2025-10-11 18:53:18 +01:00
renovate[bot]
11febb93bd Update softprops/action-gh-release digest to 6da8fa9 2025-10-11 17:51:41 +00:00
Dimitrij
cc9b83b0f8 Merge pull request #2889 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update aws-sdk-net monorepo
2025-10-10 21:49:40 +01:00
renovate[bot]
54386924d7 Update aws-sdk-net monorepo 2025-10-10 20:47:56 +00:00
Dimitrij
35417bc05d Merge pull request #2888 from mRemoteNG/renovate/aws-sdk-net-monorepo
Update aws-sdk-net monorepo
2025-10-10 09:04:39 +01:00
renovate[bot]
8b212dd87f Update aws-sdk-net monorepo 2025-10-09 23:04:22 +00:00
Dimitrij
488035e124 Merge pull request #2887 from mRemoteNG/copilot/add-warning-for-disconnect-option
Add confirmation dialog when disconnecting connections from context menu
2025-10-09 19:27:33 +01:00
copilot-swe-agent[bot]
9129edb725 Add confirmation dialog for disconnect operation from context menu
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-09 17:57:17 +00:00
copilot-swe-agent[bot]
6f3882e0ca Initial plan 2025-10-09 17:51:26 +00:00
Dimitrij
f810f6aa85 Merge pull request #2885 from mRemoteNG/copilot/add-dependency-check-texts
Add dependency check texts to language pack for internationalization
2025-10-09 11:15:37 +01:00
Dimitrij
6f13111c4c Merge pull request #2886 from mRemoteNG/copilot/add-reenable-checkbox-option
[WIP] Add option to reenable 'Do not show this message again' checkbox
2025-10-09 11:13:43 +01:00
copilot-swe-agent[bot]
fcca1a1fa3 Add dependency check texts to language pack
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-09 10:12:02 +00:00
copilot-swe-agent[bot]
ac0aa9e33b Enable ConfirmCloseConnection setting in Options dialog
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-09 10:10:50 +00:00
copilot-swe-agent[bot]
6109ff7783 Initial plan 2025-10-09 10:05:22 +00:00
copilot-swe-agent[bot]
4d2d24efb3 Initial plan 2025-10-09 10:04:47 +00:00
Dimitrij
e2b7081b9e Merge pull request #2883 from heing/v1.78.2-dev
Improve 1Password logging
2025-10-09 10:47:55 +01:00
Dimitrij
6ba7fedc18 Merge pull request #2882 from mRemoteNG/renovate/gherkin-36.x
Update dependency Gherkin to v36
2025-10-09 10:47:40 +01:00
Hein Gustavsen
3973fae8ef Improve 1Password logging 2025-10-09 09:44:08 +02:00
renovate[bot]
77752f494f Update dependency Gherkin to v36 2025-10-09 05:26:22 +00:00
Simon Monai
71574b62cb Update README.md - Minimum Requirements
Update Minimum Requirements download links and formatting to match results of #2870. 

Additionally fixed one typo.
2025-10-08 23:06:49 +02:00
Dimitrij
546ba16366 Merge pull request #2875 from mRemoteNG/renovate/cucumber.messages-30.x
Update dependency Cucumber.Messages to 30.1.0
2025-10-08 16:57:47 +01:00
renovate[bot]
f61ca2ad17 Update dependency Cucumber.Messages to 30.1.0 2025-10-08 15:55:24 +00:00
Dimitrij
781afd1c3b Merge pull request #2874 from heing/v1.78.2-dev
Add 1Password integration
2025-10-08 16:54:47 +01:00
Hein Gustavsen
2bfd8495ab Fix formatting in CHANGELOG.md
Removed an empty line in the Added section.
2025-10-08 16:02:28 +02:00
Hein Gustavsen
094fa65ad6 Update CHANGELOG, add 1Password integration 2025-10-08 16:01:01 +02:00
Hein Gustavsen
ec2a652d74 Add missing ECPOnePassword in Language.Designer.cs 2025-10-08 14:21:00 +02:00
Hein Gustavsen
1b55645b81 Add 1Password integration 2025-10-08 13:56:25 +02:00
Dimitrij
5c02581c81 Merge pull request #2872 from mRemoteNG/renovate/microsoft.data.sqlclient-6.x
Update dependency Microsoft.Data.SqlClient to 6.1.2
2025-10-08 07:54:42 +01:00
renovate[bot]
62cc4780ca Update dependency Microsoft.Data.SqlClient to 6.1.2 2025-10-08 05:57:32 +00:00
Dimitrij
8f26d57f40 NB release 2025-10-08 00:01:23 +01:00
Dimitrij
3bd2fe889a upd to for check x64 vc++ 2025-10-07 23:56:48 +01:00
Dimitrij
492a2629c2 Replace to x64 version 2025-10-07 23:32:21 +01:00
Dimitrij
b64ddf32ff fix 2025-10-07 23:31:28 +01:00
Dimitrij
e86a550985 Merge branch 'v1.78.2-dev' of https://github.com/mRemoteNG/mRemoteNG into v1.78.2-dev 2025-10-07 23:31:12 +01:00
Dimitrij
fcccdacb99 Remove to update 2025-10-07 23:31:05 +01:00
Dimitrij
487de4c29b Merge pull request #2871 from simonai1254/v1.78.2-dev
Update README.md featuring Icon Project
2025-10-07 22:36:13 +01:00
Dimitrij
d36c6cb067 Merge pull request #2869 from mRemoteNG/copilot/fix-color-selection-for-panel-tabs
Fix Color property converter and add missing Display category attributes for TabColor
2025-10-07 22:31:30 +01:00
Simon Monai
a4b704252b Update README.md
Include Link to Fancy Icon Collection of @bearlikelion
2025-10-07 23:29:12 +02:00
Dimitrij
93e8d26a75 Merge branch 'v1.78.2-dev' into copilot/fix-color-selection-for-panel-tabs 2025-10-07 22:26:04 +01:00
copilot-swe-agent[bot]
0a3ecaac64 Fix Color property converter and add missing category attributes
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 21:17:26 +00:00
Simon Monai
ea6b762021 Update README.md
Add Visual C++ Dependency back in
2025-10-07 23:16:12 +02:00
Dimitrij
265a43e31c fix 2025-10-07 22:12:15 +01:00
copilot-swe-agent[bot]
6d156586ac Initial plan 2025-10-07 21:11:51 +00:00
Simon Monai
68e3f607a3 Update README.md
Fix Formatting Issue with Dependency Link
2025-10-07 22:40:48 +02:00
Dimitrij
0b240a3902 Merge pull request #2864 from mRemoteNG/copilot/add-color-support-for-connection-folders
Add Color property to connections and folders with inheritance support
2025-10-07 21:25:20 +01:00
Dimitrij
4082761606 Merge branch 'v1.78.2-dev' into copilot/add-color-support-for-connection-folders 2025-10-07 21:24:50 +01:00
Dimitrij
e68c42ba64 Merge pull request #2867 from mRemoteNG/copilot/fix-tab-color-selection-error
[WIP] Fix tab color dropdown selection error
2025-10-07 21:17:04 +01:00
copilot-swe-agent[bot]
347546ee0e Add TabColorConverter to fix Color to String conversion issue
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 20:15:32 +00:00
Dimitrij
ca717d6b80 Merge pull request #2863 from mRemoteNG/copilot/add-ard-connection-support
Add ARD (Apple Remote Desktop) protocol support for macOS connections
2025-10-07 21:12:17 +01:00
copilot-swe-agent[bot]
5d623d80eb Initial plan 2025-10-07 20:10:54 +00:00
Dimitrij
a2edbd9934 Merge pull request #2865 from mRemoteNG/copilot/add-connection-tab-colors
Add configurable connection tab colors to distinguish environments
2025-10-07 21:02:05 +01:00
copilot-swe-agent[bot]
5830f39d50 Add documentation for Tab Color feature
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:51:26 +00:00
copilot-swe-agent[bot]
0aa0b59635 Add documentation for Color property in folders and inheritance
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:50:10 +00:00
copilot-swe-agent[bot]
3c6a485647 Add TabColor property to connection info and implement tab coloring
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:49:32 +00:00
copilot-swe-agent[bot]
bbe1fa8416 Add Color property to Language.Designer.cs and add inheritance tests
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:49:21 +00:00
copilot-swe-agent[bot]
ac4469bb4a Add ARD protocol support to UI, port scanning, and tests
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:48:57 +00:00
copilot-swe-agent[bot]
9e61e8eafa Add Color property to connections and folders with inheritance support
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:47:07 +00:00
copilot-swe-agent[bot]
b193199268 Add ARD protocol to VNC property attributes and default port handling
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:45:38 +00:00
copilot-swe-agent[bot]
f8b7d37af1 Add ARD (Apple Remote Desktop) protocol support
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:42:31 +00:00
Dimitrij
b3e9202d72 Merge pull request #2862 from mRemoteNG/copilot/fix-unhandled-exception-panel-closure
Fix unhandled exception when closing panel with active connections
2025-10-07 20:40:35 +01:00
copilot-swe-agent[bot]
0f819ade56 Initial plan 2025-10-07 19:39:14 +00:00
copilot-swe-agent[bot]
d682afcde2 Initial plan 2025-10-07 19:39:03 +00:00
copilot-swe-agent[bot]
e67754ee9f Fix unhandled exception when closing panel with connections
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:35:18 +00:00
copilot-swe-agent[bot]
4897771fbf Initial plan 2025-10-07 19:35:06 +00:00
copilot-swe-agent[bot]
4128f3404a Initial plan 2025-10-07 19:31:35 +00:00
Dimitrij
7bc25ceb38 Merge pull request #2861 from mRemoteNG/copilot/add-autofocus-to-password-field
[WIP] Add autofocus to password field on startup
2025-10-07 20:29:40 +01:00
Dimitrij
f77f0f5e04 Merge pull request #2859 from mRemoteNG/copilot/fix-username-field-visibility
Fix Username field visibility for External Tool protocol
2025-10-07 20:28:48 +01:00
copilot-swe-agent[bot]
0e666efaad Add autofocus to password field in FrmPassword form
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:26:14 +00:00
copilot-swe-agent[bot]
e2893b9516 Add IntApp to Username property supported protocols
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 19:24:01 +00:00
copilot-swe-agent[bot]
fb86b13948 Initial plan 2025-10-07 19:22:15 +00:00
copilot-swe-agent[bot]
e22cc6921d Initial plan 2025-10-07 19:19:17 +00:00
Dimitrij
42fdd91206 Merge pull request #2857 from mRemoteNG/copilot/fix-default-panel-opening
Fix Update panel auto-loading on startup
2025-10-07 20:14:21 +01:00
copilot-swe-agent[bot]
2329d95002 Remove automatic Update panel display at startup
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 16:49:36 +00:00
copilot-swe-agent[bot]
8dda6ba13f Fix Update panel auto-checking on load
Co-authored-by: Kvarkas <3611964+Kvarkas@users.noreply.github.com>
2025-10-07 16:47:29 +00:00
copilot-swe-agent[bot]
156e2b8056 Initial plan 2025-10-07 16:41:34 +00:00
185 changed files with 13771 additions and 4874 deletions

242
.github/copilot-instructions.md vendored Normal file
View File

@@ -0,0 +1,242 @@
# GitHub Copilot Instructions for mRemoteNG
## Project Overview
mRemoteNG is an open-source, multi-protocol, tabbed remote connections manager for Windows. It's a fork of mRemote that allows users to view and manage all their remote connections (RDP, VNC, SSH, Telnet, HTTP/HTTPS, rlogin, Raw Socket, PowerShell remoting, AnyDesk) in a simple yet powerful interface.
## Technology Stack
- **Language**: C# with latest language version
- **Framework**: .NET 10.0 for Windows (net10.0-windows10.0.26100.0)
- **UI Framework**: Windows Forms with WPF support
- **Target Platforms**: x64 and ARM64
- **Testing Framework**: NUnit with NSubstitute for mocking
- **Build System**: MSBuild with .NET SDK-style projects
## Building the Project
### Prerequisites
- Visual Studio 2022 (version 17.14.12 or later)
- .NET 10.0 Desktop Runtime
- Windows 10/11 or Windows Server 2016+
### Build Commands
```powershell
# Restore NuGet packages
dotnet restore
# Build the solution
msbuild mRemoteNG.sln -p:Configuration=Release -p:Platform=x64
# Or for ARM64
msbuild mRemoteNG.sln -p:Configuration=Release -p:Platform=arm64
```
### Running Tests
The project uses NUnit for testing. Test projects are in `mRemoteNGTests/` directory.
```powershell
dotnet test mRemoteNGTests/mRemoteNGTests.csproj
```
## Code Organization
### Main Projects
- **mRemoteNG**: Main application project
- **mRemoteNGTests**: Unit and integration tests
- **mRemoteNGSpecs**: Specification tests
- **ObjectListView.NetCore**: Custom list view control
- **ExternalConnectors**: External protocol connector implementations
- **mRemoteNGDocumentation**: reStructuredText documentation
### Key Directories in mRemoteNG Project
- `App/`: Application startup and initialization
- `Connection/`: Connection models, protocols, and management
- `Config/`: Configuration and serialization (XML, CSV)
- `Container/`: Container/folder node implementations
- `Credential/`: Credential storage and repositories
- `Language/`: Localization resource files (.resx)
- `Security/`: Authentication, encryption, and password management
- `Tree/`: Connection tree UI and management
- `UI/`: User interface components and forms
- `Tools/`: Utility classes and helpers
## Code Style and Conventions
### EditorConfig Settings
The project uses EditorConfig (`.editorconfig` in `mRemoteNG/` directory) with these key rules:
- **Indentation**: 4 spaces (no tabs)
- **Line Endings**: CRLF (Windows-style)
- **Charset**: UTF-8 with BOM for C# files
- **New Lines**: Opening braces on new lines (Allman style)
- **Using Directives**: Sort System directives first
- **this. Qualifier**: Do not use `this.` prefix unless necessary
### Naming Conventions
- **Classes/Interfaces**: PascalCase (e.g., `ConnectionInfo`, `IInheritable`)
- **Methods**: PascalCase (e.g., `GetConnection`, `SaveToXml`)
- **Properties**: PascalCase (e.g., `ConnectionName`, `Port`)
- **Fields**: Use camelCase for private fields, consider `_` prefix for backing fields
- **Constants**: PascalCase
### Code Patterns
#### Inheritance System
mRemoteNG has a sophisticated property inheritance system for connection settings:
1. Properties can be inherited from parent containers/folders
2. Each inheritable property has a corresponding `Inherit<PropertyName>` boolean in `ConnectionInfoInheritance` class
3. Use `IInheritable` interface for objects that support inheritance
4. Example: `ConnectionFrameColor` property has `InheritConnectionFrameColor` boolean
#### Serialization
The project supports multiple serialization formats:
**XML Serialization** (`Config/Serializers/ConnectionSerializers/Xml/`):
- Node-based serializers (e.g., `XmlConnectionNodeSerializer28.cs`)
- Deserializers handle backward compatibility
- Attributes for properties and inheritance flags
- Always maintain backward compatibility - old files must still load
**CSV Serialization** (`Config/Serializers/ConnectionSerializers/Csv/`):
- Export connections to CSV format
- Include both value and inheritance columns
- Maintain column order consistency
#### Localization
All user-facing strings must be localized:
1. Add entries to `Language/Language.resx` (English base)
2. Use `Language.ResourceName` to access strings in code
3. Resource naming:
- Properties: `PropertyName` (e.g., `ConnectionFrameColor`)
- Descriptions: `PropertyDescription<PropertyName>`
- Enum values: `<EnumName><Value>` (e.g., `FrameColorRed`)
4. Provide clear, concise descriptions for PropertyGrid tooltips
### Common Patterns
#### Adding a New Connection Property
1. **Add enum** (if needed) in `Connection/` directory
2. **Add property** to `AbstractConnectionRecord.cs` or `ConnectionInfo.cs`
- Add `[Category("CategoryName")]` attribute for PropertyGrid grouping
- Add `[Description("Language.PropertyDescription<Name>")]` for tooltip
- Use appropriate TypeConverter if needed
3. **Add inheritance support** in `ConnectionInfoInheritance.cs`
4. **Update serializers**:
- XML: Update latest `XmlConnectionNodeSerializer*.cs` and `XmlConnectionsDeserializer.cs`
- CSV: Update `CsvConnectionsSerializerMremotengFormat.cs`
5. **Add localization** in `Language/Language.resx`
6. **Write tests** in `mRemoteNGTests/Connection/`
7. **Update documentation** in `mRemoteNGDocumentation/` if user-facing
#### UI Controls
- Prefer existing mRemoteNG patterns for UI controls
- Connection panels use `InterfaceControl` base class
- Custom painting: Override `OnPaint` or handle `Paint` event
- Follow Windows Forms best practices
## Testing Guidelines
### Test Structure
- Use NUnit's `[Test]` attribute for test methods
- Use `[SetUp]` and `[TearDown]` for test initialization/cleanup
- Use `[TestCase]` for parameterized tests
- Use NSubstitute for mocking: `Substitute.For<IInterface>()`
### Test Naming
- Use descriptive names: `MethodName_Scenario_ExpectedBehavior`
- Example: `ConnectionInfo_SetPassword_EncryptsValue`
### Test Organization
Mirror the main project structure in `mRemoteNGTests/`:
- `Connection/` for connection tests
- `Security/` for security tests
- `Config/` for configuration/serialization tests
## Important Notes and Pitfalls
### Backward Compatibility
- **Critical**: Never break loading of old connection files
- Always provide default values for new properties
- Test that files without new attributes still load correctly
### Security
- Sensitive data (passwords, credentials) must be encrypted
- Use existing security providers in `Security/` namespace
- Never log or expose credentials in plain text
### Performance
- Connection tree can contain thousands of nodes
- Optimize for large connection files
- Avoid unnecessary UI refreshes
- Use async/await for I/O operations
### Platform-Specific Code
- The project targets both x64 and ARM64
- Avoid platform-specific code unless absolutely necessary
- Test on both platforms when possible
### External Dependencies
- PuTTY for SSH/Telnet (bundled)
- Terminal Service Client for RDP
- Various protocol-specific libraries (see CREDITS.md)
## Documentation
### User Documentation
- Located in `mRemoteNGDocumentation/`
- Written in reStructuredText (.rst)
- Follows ReadTheDocs format
- Include screenshots and examples for new features
### Code Documentation
- Use XML documentation comments for public APIs
- Document complex algorithms and business logic
- Keep implementation notes in `IMPLEMENTATION_NOTES.md` for significant features
## Common Tasks
### Adding a Protocol
1. Create protocol implementation in `Connection/Protocol/`
2. Add protocol enum value to protocol types
3. Implement connection logic
4. Add UI controls if needed
5. Update documentation
### Adding a Theme
1. Add theme files to `Themes/` directory
2. Update theme manager
3. Add documentation in `mRemoteNGDocumentation/themes/`
### Updating Dependencies
- Dependencies are centrally managed in `Directory.Packages.props`
- Use `dotnet restore` after updating
- Test thoroughly after dependency updates
## Version and Release
- Current development version: 1.78.2-dev
- Version is set in `mRemoteNG.csproj`
- Builds are automated via GitHub Actions (`.github/workflows/`)
- Changelog maintained in `CHANGELOG.md`
## Getting Help
- Project website: https://mremoteng.org
- Documentation: https://mremoteng.readthedocs.io
- GitHub Issues: Report bugs and feature requests
- Community: Reddit r/mRemoteNG, Matrix chat
## Summary
When contributing to mRemoteNG:
1. Follow the existing code style (EditorConfig)
2. Maintain backward compatibility with old connection files
3. Localize all user-facing strings
4. Write tests for new functionality
5. Update documentation for user-facing changes
6. Test on both x64 and ARM64 if possible
7. Keep security and performance in mind

View File

@@ -1,4 +1,4 @@
name: Build_and_Release_mR-NB
name: Build_and_Release_mR-NB_MultiDeploy
on:
push:
branches:
@@ -19,12 +19,28 @@ jobs:
strategy:
matrix:
include:
# Framework-Dependent builds (requires .NET runtime on user machine)
- runner: windows-latest
platform: x64
arch: x64
deployment: framework-dependent
deploy_suffix: FD
- runner: windows-11-arm
platform: ARM64
arch: arm64
deployment: framework-dependent
deploy_suffix: FD
# Self-Contained builds (includes .NET runtime)
- runner: windows-latest
platform: x64
arch: x64
deployment: self-contained
deploy_suffix: SC
- runner: windows-11-arm
platform: ARM64
arch: arm64
deployment: self-contained
deploy_suffix: SC
runs-on: ${{ matrix.runner }}
# Only run if:
# - manual dispatch, OR
@@ -35,14 +51,19 @@ jobs:
steps:
- name: (01) Checkout Repository
uses: actions/checkout@v5
- name: (02) Setup MSBuild
uses: actions/checkout@v6
- name: (02) Install .NET 10 SDK
uses: actions/setup-dotnet@v5
with:
dotnet-version: '10.0.x'
- name: (03) Setup MSBuild
uses: microsoft/setup-msbuild@v2
with:
vs-version: '17.14.12'
vs-version: '18.0'
- name: (03) Install and run dotnet-t4 to transform T4 templates
- name: (04) Install and run dotnet-t4 to transform T4 templates
shell: pwsh
run: |
dotnet tool install --global dotnet-t4
@@ -56,24 +77,32 @@ jobs:
env:
PLATFORM: '${{ matrix.platform }}'
- name: (04) Cache NuGet Packages
uses: actions/cache@v4
- name: (05) Cache NuGet Packages
uses: actions/cache@v5
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-${{ matrix.arch }}-nuget-${{ hashFiles('**/*.csproj') }}
key: ${{ runner.os }}-${{ matrix.arch }}-${{ matrix.deployment }}-nuget-${{ hashFiles('**/*.csproj') }}
restore-keys: |
${{ runner.os }}-${{ matrix.arch }}-${{ matrix.deployment }}-nuget-
${{ runner.os }}-${{ matrix.arch }}-nuget-
- name: (05) Restore NuGet Packages
- name: (06) Restore NuGet Packages
shell: pwsh
run: dotnet restore
- name: (06) Build Release
- name: (07) Build Framework-Dependent Release
if: matrix.deployment == 'framework-dependent'
shell: pwsh
run: |
msbuild "$Env:GITHUB_WORKSPACE\mRemoteNG.sln" -p:Configuration="Release" -p:Platform=${{ matrix.platform }} /verbosity:minimal
- name: (07) Release Information
- name: (08) Build Self-Contained Release
if: matrix.deployment == 'self-contained'
shell: pwsh
run: |
msbuild "$Env:GITHUB_WORKSPACE\mRemoteNG.sln" /t:Publish /p:Configuration="Release Self-Contained" -p:Platform=${{ matrix.platform }} /verbosity:minimal /p:SelfContained=true /p:PublishDir="bin\${{ matrix.platform }}\Release"
- name: (09) Release Information
id: version
shell: pwsh
run: |
@@ -86,7 +115,7 @@ jobs:
throw "Could not extract version and build number"
}
$date = Get-Date -Format "yyyyMMdd"
$zipName = "mRemoteNG-$date-v$version-NB-$build-${{ matrix.arch }}.zip"
$zipName = "mRemoteNG-$date-v$version-NB-$build-${{ matrix.arch }}-${{ matrix.deploy_suffix }}.zip"
$tag = "$date-v$version-NB-($build)"
$message = git log -1 --pretty=%B
echo "message=$message" >> $env:GITHUB_OUTPUT
@@ -94,9 +123,9 @@ jobs:
echo "version=$version" >> $env:GITHUB_OUTPUT
echo "build=$build" >> $env:GITHUB_OUTPUT
echo "tag=$tag" >> $env:GITHUB_OUTPUT
$version = "${{ steps.version.outputs.version }}"
echo "deployment=${{ matrix.deployment }}" >> $env:GITHUB_OUTPUT
- name: (08) Extract Changelog Section
- name: (10) Extract Changelog Section
id: changelog
shell: pwsh
run: |
@@ -127,30 +156,128 @@ jobs:
echo "log<<EOF" >> $env:GITHUB_OUTPUT
echo $joined >> $env:GITHUB_OUTPUT
echo "EOF" >> $env:GITHUB_OUTPUT
echo "log=$escaped"
- name: (09) Create Zip File
- name: (11) Create Zip File
shell: pwsh
run: |
$sourceDir = "$Env:GITHUB_WORKSPACE\mRemoteNG\bin\${{ matrix.platform }}\Release"
Compress-Archive -Path "$sourceDir\*" -DestinationPath ${{ steps.version.outputs.zipname }}
echo "File: ${{ steps.version.outputs.zipname }}"
# Show file size
$fileSize = (Get-Item ${{ steps.version.outputs.zipname }}).Length / 1MB
echo "Size: $([math]::Round($fileSize, 2)) MB"
- name: (10) Create release
id: create_release
uses: softprops/action-gh-release@aec2ec56f94eb8180ceec724245f64ef008b89f5 # v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
- name: (10) Upload artifacts for combination
uses: actions/upload-artifact@v6
with:
tag_name: ${{ steps.version.outputs.tag }}
name: "mRemoteNG ${{ steps.version.outputs.version }} NB ${{ steps.version.outputs.build }}"
files: ${{ steps.version.outputs.zipname }}
body: |
Changes in this Release:
${{ steps.changelog.outputs.log }}
name: release-${{ matrix.arch }}-${{ matrix.deploy_suffix }}
path: ${{ steps.version.outputs.zipname }}
retention-days: 1
Last Commit Message:
Create-Combined-Release:
needs: NB-Build-and-Release
runs-on: windows-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v6
- name: Download all artifacts
uses: actions/download-artifact@v7
with:
path: artifacts
- name: Extract version info
id: version
shell: pwsh
run: |
$assemblyInfoPath = "${{ github.workspace }}\mRemoteNG\Properties\AssemblyInfo.cs"
$line = Get-Content $assemblyInfoPath | Where-Object { $_ -match 'AssemblyVersion\("(.+?)"\)' }
if ($line -match 'AssemblyVersion\("(?<ver>\d+\.\d+\.\d+)\.(?<build>\d+)"\)') {
$version = $matches['ver']
$build = $matches['build']
} else {
throw "Could not extract version and build number"
}
$date = Get-Date -Format "yyyyMMdd"
$tag = "$date-v$version-NB-($build)"
$message = git log -1 --pretty=%B
echo "version=$version" >> $env:GITHUB_OUTPUT
echo "build=$build" >> $env:GITHUB_OUTPUT
echo "tag=$tag" >> $env:GITHUB_OUTPUT
echo "message=$message" >> $env:GITHUB_OUTPUT
- name: Extract Changelog
id: changelog
shell: pwsh
run: |
$changelogPath = "$env:GITHUB_WORKSPACE\CHANGELOG.md"
$lines = Get-Content $changelogPath
$startIndex = -1
for ($i = 0; $i -lt $lines.Count; $i++) {
if ($lines[$i] -match '^## \[') {
$startIndex = $i
break
}
}
if ($startIndex -eq -1) {
throw "No version header found in CHANGELOG.md"
}
$section = @()
for ($i = $startIndex + 1; $i -lt $lines.Count; $i++) {
if ($lines[$i] -match '^## ') {
break
}
$section += $lines[$i]
}
$joined = $section -join "`n"
echo "log<<EOF" >> $env:GITHUB_OUTPUT
echo $joined >> $env:GITHUB_OUTPUT
echo "EOF" >> $env:GITHUB_OUTPUT
- name: Collect all release files
shell: pwsh
run: |
Get-ChildItem -Path artifacts -Recurse -Filter "*.zip" | ForEach-Object {
Copy-Item $_.FullName -Destination .
echo "Found: $($_.Name)"
}
- name: Create combined release
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ steps.version.outputs.tag }}
name: "mRemoteNG ${{ steps.version.outputs.version }} NB ${{ steps.version.outputs.build }}"
files: '*.zip'
body: |
## mRemoteNG ${{ steps.version.outputs.version }} NB Build ${{ steps.version.outputs.build }}
### 📦 Available Downloads
**Framework-Dependent (FD)** - Requires .NET 10 Runtime installed:
- Smaller download size (~15-25 MB)
- Requires .NET 10 Desktop Runtime on user machine
- Files: `*-FD.zip`
**Self-Contained (SC)** - Portable, no installation required:
- Larger download size (~80-150 MB)
- Includes .NET 10 runtime - no installation needed
- Files: `*-SC.zip`
Both versions are available for **x64** and **ARM64** architectures.
---
### 📝 Changes in this Release
${{ steps.changelog.outputs.log }}
### 💬 Last Commit Message
${{ steps.version.outputs.message }}
draft: false

View File

@@ -27,7 +27,7 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v5
uses: actions/checkout@v6
- name: Check for Renovate dependency update
id: check-renovate

View File

@@ -4,31 +4,42 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.78.2]
### Fixed
- #2855: Fix missing Username field for HTTP and HTTPS protocols
- #2852: Fix XML External Entity (XXE) vulnerability in XML deserialization
- #2851: Fix path traversal vulnerability in file operations
- #2850: Fix password dialog appearing behind splash screen on startup
- #2842: Fix element placement in options window
- #2715: Disable WinForms analyzers and suppress WFO1000 build errors for ObjectListView
- #2712: VNCEvent_Disconnected send the ProtocolBase based object reference
- #2668: fix ssh quickconnect exception
- #2611: correct registry path
- #2496: use pwfile instead of cleartext password for putty connections
- #2734: fix native build for Windows-x64
- #2939: fixed SQL injection vulnerabilities via parameterized queries
- #2940: fixed for Possible command injection via Process.Start
- #2932: fixed HTTP/HTTPS protocol to support multiple concurrent connections
- #2855: fixed missing Username field for HTTP and HTTPS protocols
- #2852: fixed XML External Entity (XXE) vulnerability in XML deserialization
- #2851: fixed path traversal vulnerability in file operations
- #2850: fixed password dialog appearing behind splash screen on startup
- #2842: fixed element placement in options window
- #2734: fixed native build for Windows-x64
- #2715: fixed Disable WinForms analyzers and suppress WFO1000 build errors for ObjectListView
- #2712: fixed VNCEvent_Disconnected send the ProtocolBase based object reference
- #2668: fixed ssh quickconnect exception
- #2611: fixed correct registry path
- #2496: fixed use pwfile instead of cleartext password for putty connections
### Added
- #2728 Add support for building mRemoteNG on Windows ARM64
- #2723: Read keyboardhook, gatewayaccesstoken and gatewaycredentialssource from RDP File
- #2690: தமிழ் (ta) Translation update
- #2643: Registry Settings: enhancements and new settings implementation
- #2931: added vault openbao connector
- #2900: added "Report a Bug" menu item to Help menu and update bug report URL to GitHub issues
- #2865: added configurable connection tab colors to distinguish between different environments
- #2864: added color property to connections and folders with inheritance support
- #2863: added ARD (Apple Remote Desktop) protocol support for macOS connections
- #2728: added support for building mRemoteNG on Windows ARM64
- #2723: added read keyboardhook, gatewayaccesstoken and gatewaycredentialssource from RDP File
- #2690: added தமிழ் (ta) Translation update
- #2643: added registry Settings: enhancements and new settings implementation
- #2591: add Clickstudios Passwordstate API connector
- #2212: added 1Password integration
### Updated
- #2883: Improve 1Password logging
- #2854: Refactor settings dialog to be opened in dockable panel (for consistency)
- #2597: Remember the opened connection file on relaunch
- #2502: Updated Polish translation
### Dependency update
- #3bd2fe8: puttyng updated to x64 version (and signed)
## [1.77.3.1784]
### Fixed

View File

@@ -1,7 +1,9 @@
# Contributors
## Current mRemoteNG dev team
[Dimitrij Gorodeckij](https://github.com/Kvarkas)
## Past Contributors
[David Sparer](http://github.com/sparerd)
[Sean Kaim](http://github.com/kmscode)
[Faryan Rezagholi](http://github.com/farosch)
@@ -28,8 +30,6 @@ Tony Lambert
[MitchellBot](http://github.com/MitchellBot)
[Filippo Ferrazini](http://github.com/Filippo125)
## Past Contributors
Felix Deimel - mRemote original developer
Riley McArdle - mRemoteNG original developer

167
DEPLOYMENT_OPTIONS.md Normal file
View File

@@ -0,0 +1,167 @@
# mRemoteNG Deployment Options
This document explains the two deployment options for mRemoteNG and how to build each version.
## Deployment Types
### 1. Framework-Dependent (FD)
**File suffix: `-FD.zip`**
- **Size**: ~15-25 MB
- **Requirements**: User must have .NET 10 Desktop Runtime installed
- **Startup**: Application checks for .NET runtime and prompts user to download if missing
- **Use case**: Standard release for users comfortable installing prerequisites
### 2. Self-Contained (SC)
**File suffix: `-SC.zip`**
- **Size**: ~80-150 MB
- **Requirements**: None - includes .NET 10 runtime
- **Startup**: No runtime checks performed (runtime is bundled)
- **Use case**: Portable version for users who want zero installation/configuration
## Building Locally
### Framework-Dependent Build
```powershell
# x64
msbuild mRemoteNG.sln -p:Configuration=Release -p:Platform=x64
# ARM64
msbuild mRemoteNG.sln -p:Configuration=Release -p:Platform=ARM64
```
### Self-Contained Build
```powershell
# x64
dotnet publish mRemoteNG\mRemoteNG.csproj `
--configuration Release `
--runtime win-x64 `
--self-contained true `
-p:Platform=x64 `
-p:PublishSingleFile=false `
-p:PublishReadyToRun=true `
-p:DefineConstants="SELF_CONTAINED"
# ARM64
dotnet publish mRemoteNG\mRemoteNG.csproj `
--configuration Release `
--runtime win-arm64 `
--self-contained true `
-p:Platform=ARM64 `
-p:PublishSingleFile=false `
-p:PublishReadyToRun=true `
-p:DefineConstants="SELF_CONTAINED"
```
## GitHub Actions Workflow
The new workflow file `Build_and_Release_mR-NB-MultiDeploy.yml` automatically builds all four variants:
1. **x64 Framework-Dependent** - `mRemoteNG-YYYYMMDD-vX.X.X-NB-XXXX-x64-FD.zip`
2. **x64 Self-Contained** - `mRemoteNG-YYYYMMDD-vX.X.X-NB-XXXX-x64-SC.zip`
3. **ARM64 Framework-Dependent** - `mRemoteNG-YYYYMMDD-vX.X.X-NB-XXXX-arm64-FD.zip`
4. **ARM64 Self-Contained** - `mRemoteNG-YYYYMMDD-vX.X.X-NB-XXXX-arm64-SC.zip`
### Workflow Triggers
The workflow runs when:
- You push to `v1.78.2-dev` branch with commit message containing "NB release"
- You manually trigger via workflow_dispatch
### Release Output
All four zip files are uploaded to a single GitHub Release with clear descriptions:
- Framework-Dependent versions are marked as requiring .NET 10 Runtime
- Self-Contained versions are marked as portable/no installation needed
## Code Changes
### ProgramRoot.cs
The `MainAsync` method now uses conditional compilation:
```csharp
#if !SELF_CONTAINED
// Runtime check code only included in Framework-Dependent builds
// Checks for .NET Runtime and Visual C++ Redistributable
#endif
```
When building with `-p:DefineConstants="SELF_CONTAINED"`, the runtime checks are completely excluded from the compiled binary.
## Recommendations
### For Users
**Choose Framework-Dependent (FD) if:**
- You don't mind installing .NET 10 Desktop Runtime once
- You want smaller download size
- You're using multiple .NET applications (runtime is shared)
**Choose Self-Contained (SC) if:**
- You want zero installation/setup
- You need portable deployment (USB drive, restricted environments)
- You don't want to deal with prerequisites
### For Distribution
Consider offering both options:
- Make Framework-Dependent the **default/recommended** option (smaller, faster updates)
- Offer Self-Contained as **portable alternative** for special use cases
## Technical Details
### Compilation Symbols
- Framework-Dependent builds: No special symbols
- Self-Contained builds: `SELF_CONTAINED` symbol defined
### Runtime Identifiers
- x64: `win-x64`
- ARM64: `win-arm64`
### Publish Options
Self-contained builds use these optimizations:
- `PublishReadyToRun=true` - AOT compilation for faster startup
- `IncludeNativeLibrariesForSelfExtract=true` - Bundle native dependencies
- `PublishSingleFile=false` - Keep files separate for better compatibility with mRemoteNG's plugin system
## File Size Comparison
Typical build sizes:
| Version | Framework-Dependent | Self-Contained |
|---------|---------------------|----------------|
| x64 | ~18 MB | ~95 MB |
| ARM64 | ~18 MB | ~95 MB |
*Note: Self-contained includes entire .NET 10 runtime (~80 MB overhead)*
## Testing
### Framework-Dependent Build
1. Uninstall .NET 10 Runtime (if installed)
2. Run mRemoteNG.exe
3. Should prompt to download .NET 10 Runtime
4. Install runtime and verify app launches
### Self-Contained Build
1. Uninstall .NET 10 Runtime (if installed)
2. Run mRemoteNG.exe
3. Should launch immediately without runtime check
4. Verify full functionality
## Migration from Old Workflow
The original workflow `Build_and_Release_mR-NB.yml` is preserved. To migrate:
1. Rename or remove old workflow: `Build_and_Release_mR-NB.yml`
2. Rename new workflow: `Build_and_Release_mR-NB-MultiDeploy.yml``Build_and_Release_mR-NB.yml`
3. Commit and push with "NB release" in message

View File

@@ -2,50 +2,50 @@
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
<NoWarn>$(NoWarn);NU1507</NoWarn>
<NoWarn>$(NoWarn);NU1507;NU1701</NoWarn>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="AWSSDK.Core" Version="4.0.0.32" />
<PackageVersion Include="AWSSDK.EC2" Version="4.0.40.4" />
<PackageVersion Include="AWSSDK.Core" Version="4.0.3.14" />
<PackageVersion Include="AWSSDK.EC2" Version="4.0.75" />
<PackageVersion Include="BouncyCastle.Cryptography" Version="2.6.2" />
<PackageVersion Include="Castle.Core" Version="5.2.1" />
<PackageVersion Include="ConsoleControl" Version="1.3.0" />
<PackageVersion Include="ConsoleControlAPI" Version="1.3.0" />
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
<PackageVersion Include="Cucumber.Messages" Version="30.0.0" />
<PackageVersion Include="coverlet.collector" Version="8.0.0" />
<PackageVersion Include="Cucumber.Messages" Version="32.0.1" />
<PackageVersion Include="DockPanelSuite" Version="3.1.1" />
<PackageVersion Include="DockPanelSuite.ThemeVS2015" Version="3.1.1" />
<PackageVersion Include="envdte" Version="17.14.40260" />
<PackageVersion Include="Gherkin" Version="35.1.0" />
<PackageVersion Include="Google.Protobuf" Version="3.32.1" />
<PackageVersion Include="Gherkin" Version="38.0.0" />
<PackageVersion Include="Google.Protobuf" Version="3.33.5" />
<PackageVersion Include="LiteDB" Version="5.0.21" />
<PackageVersion Include="log4net" Version="3.2.0" />
<PackageVersion Include="Microsoft.Data.SqlClient" Version="6.1.1" />
<PackageVersion Include="Microsoft.Data.SqlClient" Version="6.1.4" />
<PackageVersion Include="Microsoft.Data.SqlClient.SNI" Version="6.0.2" />
<PackageVersion Include="Microsoft.Data.SqlClient.SNI.runtime" Version="6.0.2" />
<PackageVersion Include="Microsoft.Extensions.DependencyModel" Version="9.0.9" />
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="9.0.9" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyModel" Version="10.0.3" />
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="10.0.3" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageVersion Include="Microsoft.NETCore.Platforms" Version="7.0.4" />
<PackageVersion Include="Microsoft.NETCore.Targets" Version="5.0.0" />
<PackageVersion Include="Microsoft.VisualStudio.TextTemplating.VSHost" Version="17.14.40265" />
<PackageVersion Include="Microsoft.Web.WebView2" Version="1.0.3537.50" />
<PackageVersion Include="Microsoft.Web.WebView2" Version="1.0.3800.47" />
<PackageVersion Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.135" />
<PackageVersion Include="Microsoft-WindowsAPICodePack-Shell" Version="1.1.5" />
<PackageVersion Include="MySql.Data" Version="9.4.0" />
<PackageVersion Include="MySql.Data" Version="9.6.0" />
<PackageVersion Include="NETStandard.Library" Version="2.0.3" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
<PackageVersion Include="Newtonsoft.Json.Schema" Version="4.0.1" />
<PackageVersion Include="NSubstitute" Version="5.3.0" />
<PackageVersion Include="NUnit" Version="4.4.0" />
<PackageVersion Include="NUnit.Console" Version="3.20.1" />
<PackageVersion Include="NUnit.ConsoleRunner" Version="3.20.1" />
<PackageVersion Include="NUnit.Console" Version="3.22.0" />
<PackageVersion Include="NUnit.ConsoleRunner" Version="3.22.0" />
<PackageVersion Include="NUnit.Extension.TeamCityEventListener" Version="1.0.10" />
<PackageVersion Include="NUnit.Runners" Version="3.12.0" />
<PackageVersion Include="NUnit3TestAdapter" Version="5.2.0" />
<PackageVersion Include="NUnit3TestAdapter" Version="6.1.0" />
<PackageVersion Include="OpenCover" Version="4.7.1221" />
<PackageVersion Include="Renci.SshNet.Async" Version="1.4.0" />
<PackageVersion Include="ReportGenerator" Version="5.4.17" />
<PackageVersion Include="ReportGenerator" Version="5.5.1" />
<PackageVersion Include="runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl" Version="4.3.3" />
<PackageVersion Include="runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl" Version="4.3.3" />
<PackageVersion Include="runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl" Version="4.3.3" />
@@ -56,20 +56,20 @@
<PackageVersion Include="runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl" Version="4.3.3" />
<PackageVersion Include="runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl" Version="4.3.3" />
<PackageVersion Include="runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl" Version="4.3.3" />
<PackageVersion Include="SSH.NET" Version="2025.0.0" />
<PackageVersion Include="SSH.NET" Version="2025.1.0" />
<PackageVersion Include="System.Buffers" Version="4.6.1" />
<PackageVersion Include="System.Configuration.ConfigurationManager" Version="9.0.9" />
<PackageVersion Include="System.Collections.Immutable" Version="9.0.9" />
<PackageVersion Include="System.Configuration.ConfigurationManager" Version="10.0.3" />
<PackageVersion Include="System.Collections.Immutable" Version="10.0.3" />
<PackageVersion Include="System.Console" Version="4.3.1" />
<PackageVersion Include="System.Data.Common" Version="4.3.0" />
<PackageVersion Include="System.Diagnostics.DiagnosticSource" Version="9.0.9" />
<PackageVersion Include="System.Drawing.Common" Version="9.0.9" />
<PackageVersion Include="System.Diagnostics.EventLog" Version="9.0.9" />
<PackageVersion Include="System.DirectoryServices" Version="9.0.9" />
<PackageVersion Include="System.Diagnostics.DiagnosticSource" Version="10.0.3" />
<PackageVersion Include="System.Drawing.Common" Version="10.0.3" />
<PackageVersion Include="System.Diagnostics.EventLog" Version="10.0.3" />
<PackageVersion Include="System.DirectoryServices" Version="10.0.3" />
<PackageVersion Include="System.Dynamic.Runtime" Version="4.3.0" />
<PackageVersion Include="System.IO.Pipelines" Version="9.0.9" />
<PackageVersion Include="System.Formats.Asn1" Version="9.0.9" />
<PackageVersion Include="System.Management" Version="9.0.9" />
<PackageVersion Include="System.IO.Pipelines" Version="10.0.3" />
<PackageVersion Include="System.Formats.Asn1" Version="10.0.3" />
<PackageVersion Include="System.Management" Version="10.0.3" />
<PackageVersion Include="System.Memory" Version="4.6.3" />
<PackageVersion Include="System.Net.Http" Version="4.3.4" />
<PackageVersion Include="System.Net.Primitives" Version="4.3.1" />
@@ -77,7 +77,7 @@
<PackageVersion Include="System.Reflection.Emit" Version="4.7.0" />
<PackageVersion Include="System.Reflection.Emit.ILGeneration" Version="4.7.0" />
<PackageVersion Include="System.Reflection.Emit.Lightweight" Version="4.7.0" />
<PackageVersion Include="System.Reflection.Metadata" Version="9.0.9" />
<PackageVersion Include="System.Reflection.Metadata" Version="10.0.3" />
<PackageVersion Include="System.Reflection.TypeExtensions" Version="4.7.0" />
<PackageVersion Include="System.Resources.ResourceManager" Version="4.3.0" />
<PackageVersion Include="System.Runtime" Version="4.3.1" />
@@ -87,18 +87,19 @@
<PackageVersion Include="System.Security.Cryptography.Algorithms" Version="4.3.1" />
<PackageVersion Include="System.Security.Cryptography.Cng" Version="5.0.0" />
<PackageVersion Include="System.Security.Cryptography.OpenSsl" Version="5.0.0" />
<PackageVersion Include="System.Security.Cryptography.ProtectedData" Version="9.0.9" />
<PackageVersion Include="System.Security.Cryptography.ProtectedData" Version="10.0.3" />
<PackageVersion Include="System.Security.Cryptography.X509Certificates" Version="4.3.2" />
<PackageVersion Include="System.Security.Permissions" Version="9.0.9" />
<PackageVersion Include="System.Security.Permissions" Version="10.0.3" />
<PackageVersion Include="System.Security.Principal.Windows" Version="5.0.0" />
<PackageVersion Include="System.Text.Encoding.CodePages" Version="9.0.9" />
<PackageVersion Include="System.Text.Json" Version="9.0.9" />
<PackageVersion Include="System.Text.Encoding.CodePages" Version="10.0.3" />
<PackageVersion Include="System.Text.Json" Version="10.0.3" />
<PackageVersion Include="System.Text.RegularExpressions" Version="4.3.1" />
<PackageVersion Include="System.Threading.Tasks.Extensions" Version="4.6.3" />
<PackageVersion Include="System.ValueTuple" Version="4.6.1" />
<PackageVersion Include="System.Windows.Extensions" Version="9.0.9" />
<PackageVersion Include="System.Windows.Extensions" Version="10.0.3" />
<PackageVersion Include="System.Xml.ReaderWriter" Version="4.3.1" />
<PackageVersion Include="VaultSharp" Version="1.17.5.1" />
<PackageVersion Include="VncSharpCore" Version="1.2.1" />
<PackageVersion Include="ZstdSharp.Port" Version="0.8.6" />
<PackageVersion Include="ZstdSharp.Port" Version="0.8.7" />
</ItemGroup>
</Project>

View File

@@ -1,18 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0-windows10.0.26100.0</TargetFramework>
<TargetFramework>net10.0-windows10.0.26100.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<OutputType>Library</OutputType>
<UseWindowsForms>True</UseWindowsForms>
<Platforms>x64;arm64</Platforms>
<Configurations>Debug;Release;Debug Portable;Release Portable;Deploy to github</Configurations>
<SupportedOSPlatformVersion>10.0.26100.0</SupportedOSPlatformVersion>
<Configurations>Debug;Release;Debug Portable;Release Self-Contained;Deploy to github</Configurations>
<SupportedOSPlatformVersion>10.0.22621.0</SupportedOSPlatformVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Portable|x64'">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Self-Contained|x64'">
<Optimize>True</Optimize>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Portable|arm64'">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Self-Contained|arm64'">
<Optimize>True</Optimize>
</PropertyGroup>
<ItemGroup>
@@ -20,10 +20,14 @@
<PackageReference Include="AWSSDK.EC2" />
<PackageReference Include="BouncyCastle.Cryptography" />
<PackageReference Include="Newtonsoft.Json" />
<PackageReference Include="VaultSharp" />
</ItemGroup>
<ItemGroup>
<Compile Update="AWS\AWSConnectionForm.cs" />
<Compile Update="CPS\CPSConnectionForm.cs" />
<Compile Update="DSS\SSConnectionForm.cs" />
<Compile Update="VO\VaultOpenbaoConnectionForm.cs">
<SubType>Form</SubType>
</Compile>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,131 @@
using System.Diagnostics;
using System.Net;
using System.Text.Json;
using System.Web;
namespace ExternalConnectors.OP;
public class OnePasswordCliException(string message, string arguments) : Exception(message)
{
public string Arguments { get; set; } = arguments;
}
public class OnePasswordCli
{
private const string OnePasswordCliExecutable = "op.exe";
// Username / password purpose metadata is used on Login category item fields
private const string UserNamePurpose = "USERNAME";
private const string PasswordPurpose = "PASSWORD";
// Server category items (and perhaps others) do have a built-in username/password field but don't have the `purpose` set
// and because it's a built-in field this can't be set afterwards.
// We use the label for as fallback because that can be user-modified to fit this convention in all cases.
private const string UserNameLabel = "username";
private const string PasswordLabel = "password";
private const string StringType = "STRING";
private const string SshKeyType = "SSHKEY";
private const string DomainLabel = "domain";
private record VaultUrl(string Label, string Href);
private record VaultField(string Id, string Label, string Type, string Purpose, string Value);
private record VaultItem(VaultUrl[]? Urls, VaultField[]? Fields);
private static readonly JsonSerializerOptions JsonSerializerOptions = new()
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
public static void ReadPassword(string input, out string username, out string password, out string domain, out string privateKey)
{
var inputUrl = new Uri(input);
var vault = WebUtility.UrlDecode(inputUrl.Host);
var queryParams = HttpUtility.ParseQueryString(inputUrl.Query);
var account = queryParams["account"];
var item = WebUtility.UrlDecode(inputUrl.AbsolutePath.TrimStart('/'));
ItemGet(item, vault, account, out username, out password, out domain, out privateKey);
}
private static void ItemGet(string item, string? vault, string? account, out string username, out string password, out string domain, out string privateKey)
{
var args = new List<string> { "item", "get", item };
if (!string.IsNullOrEmpty(account))
{
args.Add("--account");
args.Add(account);
}
if (!string.IsNullOrEmpty(vault))
{
args.Add("--vault");
args.Add(vault);
}
args.Add("--format");
args.Add("json");
string commandLine = OnePasswordCliExecutable + " " + string.Join(' ', args);
var exitCode = RunCommand(OnePasswordCliExecutable, args, out var output, out var error);
if (exitCode != 0)
{
username = string.Empty;
password = string.Empty;
privateKey = string.Empty;
domain = string.Empty;
throw new OnePasswordCliException($"Error running op item get: {error}",
commandLine);
}
var items = JsonSerializer.Deserialize<VaultItem>(output, JsonSerializerOptions) ??
throw new OnePasswordCliException("1Password returned null",
commandLine);
username = FindField(items, UserNamePurpose, UserNameLabel);
password = FindField(items, PasswordPurpose, PasswordLabel);
privateKey = items.Fields?.FirstOrDefault(x => x.Type == SshKeyType)?.Value ?? string.Empty;
domain = items.Fields?.FirstOrDefault(x => x.Type == StringType && x.Label == DomainLabel)?.Value ?? string.Empty;
if(string.IsNullOrEmpty(password) && string.IsNullOrEmpty(privateKey))
{
throw new OnePasswordCliException("No secret found in 1Password. At least fields with labels username/password or a SshKey are expected.", commandLine);
}
}
private static string FindField(VaultItem items, string purpose, string fallbackLabel)
{
return items.Fields?.FirstOrDefault(x => x.Purpose == purpose)?.Value ??
items.Fields?.FirstOrDefault(x => x.Type == StringType && string.Equals(x.Id, fallbackLabel, StringComparison.InvariantCultureIgnoreCase))?.Value ??
items.Fields?.FirstOrDefault(x => x.Type == StringType && string.Equals(x.Label, fallbackLabel, StringComparison.InvariantCultureIgnoreCase))?.Value ??
string.Empty;
}
private static int RunCommand(string command, IReadOnlyCollection<string> arguments, out string output,
out string error)
{
var processStartInfo = new ProcessStartInfo
{
FileName = command,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
};
foreach (var argument in arguments)
{
processStartInfo.ArgumentList.Add(argument);
}
using var process = new Process();
process.StartInfo = processStartInfo;
process.Start();
output = process.StandardOutput.ReadToEnd();
error = process.StandardError.ReadToEnd();
process.WaitForExit();
return process.ExitCode;
}
}

View File

@@ -0,0 +1,105 @@
using Microsoft.Win32;
using System.Net;
using System.Net.Sockets;
using VaultSharp;
using VaultSharp.V1.AuthMethods;
using VaultSharp.V1.AuthMethods.Token;
namespace ExternalConnectors.VO {
public class VaultOpenbaoException(string message, string? arguments = null) : Exception(message) {
public string Arguments { get; set; } = arguments ?? string.Empty;
}
public static class VaultOpenbao {
private static readonly RegistryKey baseKey = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\mRemoteVaultOpenbao");
private static string token = "";
private static VaultClient GetClient() {
string url = (string)baseKey.GetValue("URL", "");
using VaultOpenbaoConnectionForm voForm = new();
voForm.tbUrl.Text = url;
voForm.tbToken.Text = token;
_ = voForm.ShowDialog();
if (voForm.DialogResult != DialogResult.OK)
throw new VaultOpenbaoException($"No credential provided");
url = voForm.tbUrl.Text;
if (!string.IsNullOrEmpty(voForm.tbToken.Text)) // override token if provided
token = voForm.tbToken.Text;
IAuthMethodInfo authMethod = new TokenAuthMethodInfo(token);
var vaultClientSettings = new VaultClientSettings(url, authMethod);
VaultClient client = new(vaultClientSettings);
var sysInfo = client.V1.System.GetInitStatusAsync().Result;
if (!sysInfo) {
MessageBox.Show("Test connection failed", "Vault Openbao", MessageBoxButtons.OK, MessageBoxIcon.Error);
throw new VaultOpenbaoException("Url not working");
}
baseKey.SetValue("URL", url);
return client;
}
private static void TestMountType(VaultClient vaultClient, string mount, int VaultOpenbaoSecretEngine) {
switch (vaultClient.V1.System.GetSecretBackendAsync(mount).Result.Data.Type.Type) {
case "kv" when VaultOpenbaoSecretEngine != 0:
throw new VaultOpenbaoException($"Backend of type kv does not match expected type {VaultOpenbaoSecretEngine}");
case "ldap" when VaultOpenbaoSecretEngine != 1 && VaultOpenbaoSecretEngine != 2:
throw new VaultOpenbaoException($"Backend of type ldap does not match expected type {VaultOpenbaoSecretEngine}");
case "ssh" when VaultOpenbaoSecretEngine != 3:
throw new VaultOpenbaoException($"Backend of type ssh does not match expected type {VaultOpenbaoSecretEngine}");
}
}
public static void ReadOtpSSH(string mount, string role, string? username, string address, out string password) {
VaultClient vaultClient = GetClient();
TestMountType(vaultClient, mount, 3);
if (!IPAddress.TryParse(address, out _)) {
try {
var addrs = Dns.GetHostAddressesAsync(address).Result;
if (addrs == null || addrs.Length == 0) {
throw new VaultOpenbaoException($"Could not resolve address '{address}'");
}
// Prefer IPv4, otherwise take first available
var selected = addrs.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork) ?? addrs[0];
address = selected.ToString();
} catch (Exception ex) {
throw new VaultOpenbaoException($"Failed to resolve address '{address}'", ex.Message);
}
}
var otp = vaultClient.V1.Secrets.SSH.GetCredentialsAsync(role, address, username, mount).Result;
password = otp.Data.Key;
}
public static void ReadPasswordSSH(int secretEngine, string mount, string role, string username, out string password) {
VaultClient vaultClient = GetClient();
TestMountType(vaultClient, mount, secretEngine);
switch (secretEngine) {
case 0:
var kv = vaultClient.V1.Secrets.KeyValue.V2.ReadSecretAsync(role, mountPoint: mount).Result;
password = kv.Data.Data[username].ToString() ?? string.Empty;
return;
default:
throw new VaultOpenbaoException($"Backend of type {secretEngine} is not supported");
}
}
public static void ReadPasswordRDP(int secretEngine, string mount, string role, ref string username, out string password) {
VaultClient vaultClient = GetClient();
TestMountType(vaultClient, mount, secretEngine);
switch (secretEngine) {
case 0:
var kv = vaultClient.V1.Secrets.KeyValue.V2.ReadSecretAsync(role, mountPoint: mount).Result;
password = kv.Data.Data[username].ToString() ?? string.Empty;
return;
case 1:
var ldapd = vaultClient.V1.Secrets.OpenLDAP.GetDynamicCredentialsAsync(role, mount).Result;
username = ldapd.Data.Username;
password = ldapd.Data.Password;
return;
case 2:
var ldaps = vaultClient.V1.Secrets.OpenLDAP.GetStaticCredentialsAsync(role, mount).Result;
username = ldaps.Data.Username;
password = ldaps.Data.Password;
return;
default:
throw new VaultOpenbaoException($"Backend of type {secretEngine} is not supported");
}
}
}
}

View File

@@ -0,0 +1,185 @@
namespace ExternalConnectors.VO
{
partial class VaultOpenbaoConnectionForm
{
/// <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() {
tbUrl = new TextBox();
tbToken = new TextBox();
btnOK = new Button();
btnCancel = new Button();
tableLayoutPanel1 = new TableLayoutPanel();
label1 = new Label();
label2 = new Label();
tableLayoutPanel2 = new TableLayoutPanel();
tableLayoutPanel1.SuspendLayout();
tableLayoutPanel2.SuspendLayout();
SuspendLayout();
//
// tbUrl
//
tbUrl.Dock = DockStyle.Fill;
tbUrl.Location = new Point(174, 5);
tbUrl.Margin = new Padding(5);
tbUrl.Name = "tbUrl";
tbUrl.Size = new Size(559, 27);
tbUrl.TabIndex = 0;
//
// tbToken
//
tbToken.Dock = DockStyle.Fill;
tbToken.Location = new Point(174, 57);
tbToken.Margin = new Padding(5);
tbToken.Name = "tbToken";
tbToken.Size = new Size(559, 27);
tbToken.TabIndex = 2;
tbToken.UseSystemPasswordChar = true;
tbToken.Focus();
//
// btnOK
//
btnOK.Anchor = AnchorStyles.Right;
btnOK.DialogResult = DialogResult.OK;
btnOK.Location = new Point(250, 16);
btnOK.Margin = new Padding(5);
btnOK.Name = "btnOK";
btnOK.Size = new Size(101, 35);
btnOK.TabIndex = 10;
btnOK.Text = "OK";
btnOK.UseVisualStyleBackColor = true;
//
// btnCancel
//
btnCancel.Anchor = AnchorStyles.Left;
btnCancel.DialogResult = DialogResult.Cancel;
btnCancel.Location = new Point(387, 16);
btnCancel.Margin = new Padding(5);
btnCancel.Name = "btnCancel";
btnCancel.Size = new Size(101, 35);
btnCancel.TabIndex = 11;
btnCancel.Text = "Cancel";
btnCancel.UseVisualStyleBackColor = true;
//
// tableLayoutPanel1
//
tableLayoutPanel1.ColumnCount = 2;
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 22.92994F));
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 77.07006F));
tableLayoutPanel1.Controls.Add(label1, 0, 0);
tableLayoutPanel1.Controls.Add(label2, 0, 1);
tableLayoutPanel1.Controls.Add(tbUrl, 1, 0);
tableLayoutPanel1.Controls.Add(tbToken, 1, 1);
tableLayoutPanel1.Dock = DockStyle.Top;
tableLayoutPanel1.Location = new Point(0, 0);
tableLayoutPanel1.Margin = new Padding(5);
tableLayoutPanel1.Name = "tableLayoutPanel1";
tableLayoutPanel1.RowCount = 3;
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 31F));
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 31F));
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 31F));
tableLayoutPanel1.Size = new Size(738, 136);
tableLayoutPanel1.TabIndex = 12;
//
// label1
//
label1.AutoSize = true;
label1.Dock = DockStyle.Fill;
label1.Location = new Point(5, 0);
label1.Margin = new Padding(5, 0, 5, 0);
label1.Name = "label1";
label1.Size = new Size(159, 52);
label1.TabIndex = 2;
label1.Text = "Server URL";
label1.TextAlign = ContentAlignment.MiddleLeft;
//
// label2
//
label2.AutoSize = true;
label2.Dock = DockStyle.Fill;
label2.Location = new Point(5, 52);
label2.Margin = new Padding(5, 0, 5, 0);
label2.Name = "label2";
label2.Size = new Size(159, 52);
label2.TabIndex = 4;
label2.Text = "Access Token";
label2.TextAlign = ContentAlignment.MiddleLeft;
//
// tableLayoutPanel2
//
tableLayoutPanel2.ColumnCount = 5;
tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 106F));
tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 26F));
tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 106F));
tableLayoutPanel2.Controls.Add(btnOK, 1, 0);
tableLayoutPanel2.Controls.Add(btnCancel, 3, 0);
tableLayoutPanel2.Dock = DockStyle.Bottom;
tableLayoutPanel2.Location = new Point(0, 149);
tableLayoutPanel2.Margin = new Padding(5);
tableLayoutPanel2.Name = "tableLayoutPanel2";
tableLayoutPanel2.RowCount = 1;
tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
tableLayoutPanel2.Size = new Size(738, 67);
tableLayoutPanel2.TabIndex = 13;
//
// VaultOpenbaoConnectionForm
//
AcceptButton = btnOK;
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(738, 216);
Controls.Add(tableLayoutPanel2);
Controls.Add(tableLayoutPanel1);
FormBorderStyle = FormBorderStyle.FixedDialog;
Margin = new Padding(5);
MaximizeBox = false;
MinimizeBox = false;
Name = "VaultOpenbaoConnectionForm";
SizeGripStyle = SizeGripStyle.Hide;
Text = "Vault/Openbao API Login Data";
Activated += VaultOpenbaoConnectionForm_Activated;
tableLayoutPanel1.ResumeLayout(false);
tableLayoutPanel1.PerformLayout();
tableLayoutPanel2.ResumeLayout(false);
ResumeLayout(false);
}
#endregion
public System.Windows.Forms.TextBox tbUrl;
public System.Windows.Forms.TextBox tbToken;
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,13 @@
namespace ExternalConnectors.VO
{
public partial class VaultOpenbaoConnectionForm : Form {
public VaultOpenbaoConnectionForm() {
InitializeComponent();
}
private void VaultOpenbaoConnectionForm_Activated(object sender, EventArgs e) {
tbUrl.Focus();
}
}
}

View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<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>

158
IMPLEMENTATION_NOTES.md Normal file
View File

@@ -0,0 +1,158 @@
# Connection Frame Color Feature - Implementation Summary
## Overview
This implementation adds a "Connection Frame Color" feature to mRemoteNG that allows users to visually distinguish between different connection environments (e.g., production, test, development) by displaying a colored border around connection panels.
## Feature Request Context
The feature was requested in issue to prevent accidental operations on production systems. The user cited DBeaver database management tool as an example, which uses a red frame to indicate production database connections.
## Implementation Details
### 1. Data Model (Connection/ConnectionFrameColor.cs)
Created an enum with the following values:
- **None** (default): No colored border
- **Red**: Intended for production environments
- **Yellow**: Intended for staging/UAT environments
- **Green**: Intended for test environments
- **Blue**: Intended for development environments
- **Purple**: Intended for custom/other environments
### 2. Property Addition (Connection/AbstractConnectionRecord.cs)
- Added `ConnectionFrameColor` property to the base connection record class
- Property is categorized under "Display" section in PropertyGrid
- Uses EnumTypeConverter for proper display in PropertyGrid
- Includes localized descriptions
### 3. Inheritance Support (Connection/ConnectionInfoInheritance.cs)
- Added `ConnectionFrameColor` inheritance property
- Allows folders to set a frame color that child connections can inherit
- Follows the same pattern as other inheritable properties
### 4. Serialization
#### XML Serialization (Config/Serializers/ConnectionSerializers/Xml/)
- **XmlConnectionNodeSerializer28.cs**: Serializes ConnectionFrameColor as an XML attribute
- **XmlConnectionsDeserializer.cs**: Deserializes ConnectionFrameColor from XML
- Includes inheritance attribute handling (InheritConnectionFrameColor)
- Backward compatible: old files without this attribute will default to None
#### CSV Serialization (Config/Serializers/ConnectionSerializers/Csv/)
- **CsvConnectionsSerializerMremotengFormat.cs**: Added ConnectionFrameColor to CSV export
- Includes both value and inheritance columns
- Maintains CSV column order consistency
### 5. Visual Rendering (Connection/InterfaceControl.cs)
- Added custom Paint event handler to InterfaceControl
- Draws a 4-pixel colored border around the connection panel when ConnectionFrameColor is set
- Uses specific colors:
- Red: RGB(220, 53, 69) - Bootstrap danger red
- Yellow: RGB(255, 193, 7) - Warning yellow
- Green: RGB(40, 167, 69) - Success green
- Blue: RGB(0, 123, 255) - Primary blue
- Purple: RGB(111, 66, 193) - Purple
- Border is drawn inside the control bounds to avoid clipping
### 6. Localization (Language/Language.resx)
Added language resources for:
- ConnectionFrameColor: "Connection Frame Color"
- PropertyDescriptionConnectionFrameColor: Description shown in PropertyGrid
- FrameColorNone: "None"
- FrameColorRed: "Red (Production)"
- FrameColorYellow: "Yellow (Staging/UAT)"
- FrameColorGreen: "Green (Test)"
- FrameColorBlue: "Blue (Development)"
- FrameColorPurple: "Purple (Custom)"
### 7. Documentation (mRemoteNGDocumentation/howtos/connection_frame_color.rst)
Created comprehensive documentation including:
- Overview and purpose
- Step-by-step usage instructions
- Visual examples
- Inheritance explanation
- Best practices for environment organization
- Troubleshooting guide
## Technical Design Decisions
### Why 4-pixel border?
- Wide enough to be immediately noticeable
- Not so wide as to obscure content
- Consistent with modern UI design patterns
### Why these specific colors?
- Colors chosen based on common conventions:
- Red = danger/production (universal warning color)
- Yellow = caution/staging (standard warning color)
- Green = safe/test (universal "go" color)
- Blue = development (calm, neutral)
- Purple = custom (distinct but not alarming)
- Colors use accessible, high-contrast RGB values
### Why enum instead of custom color picker?
- Simpler UI (dropdown vs color picker)
- Ensures consistency across team/organization
- Prevents confusion from too many color choices
- Follows principle of "convention over configuration"
- Can be extended in future if needed
### Why inherit from Panel?
- InterfaceControl is already a Panel (see InterfaceControl.Designer.cs)
- Panel has built-in Paint event support
- No need for additional controls or complexity
## Backward Compatibility
- Old connection files (without ConnectionFrameColor attribute) automatically default to None
- No migration needed
- Feature is completely opt-in
- Does not affect existing functionality
## Testing Recommendations
When testing this feature, verify:
1. **Property Display**: ConnectionFrameColor appears in PropertyGrid under Display section
2. **Enum Values**: All color options appear in dropdown
3. **Visual Rendering**: Border appears when color is selected and connection is active
4. **Inheritance**: Setting on folder and enabling inheritance on child works correctly
5. **Serialization**:
- Save connection with frame color set
- Close and reopen file
- Verify color is preserved
6. **CSV Export**: ConnectionFrameColor appears in exported CSV
7. **Backward Compatibility**: Open old connection files without errors
## Future Enhancements (Out of Scope)
Potential future improvements:
- Custom color picker support
- Border width customization
- Border style options (solid, dashed, etc.)
- Tab header color indicator in addition to panel border
- Global warning when connecting to production (confirmation dialog)
- Audit logging for production connections
## Files Modified
1. mRemoteNG/Connection/ConnectionFrameColor.cs (NEW)
2. mRemoteNG/Connection/AbstractConnectionRecord.cs
3. mRemoteNG/Connection/ConnectionInfo.cs
4. mRemoteNG/Connection/ConnectionInfoInheritance.cs
5. mRemoteNG/Connection/InterfaceControl.cs
6. mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionNodeSerializer28.cs
7. mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDeserializer.cs
8. mRemoteNG/Config/Serializers/ConnectionSerializers/Csv/CsvConnectionsSerializerMremotengFormat.cs
9. mRemoteNG/Language/Language.resx
10. mRemoteNGDocumentation/howtos/connection_frame_color.rst (NEW)
## Code Review Checklist
- [x] Property follows existing naming conventions
- [x] Enum values are localized
- [x] Inheritance support implemented
- [x] XML serialization/deserialization working
- [x] CSV serialization updated
- [x] Visual rendering implemented
- [x] Documentation created
- [x] Backward compatibility maintained
- [x] No breaking changes
- [x] Code follows existing patterns in codebase

View File

@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0-windows10.0.26100.0</TargetFramework>
<TargetFramework>net10.0-windows10.0.26100.0</TargetFramework>
<Deterministic>false</Deterministic>
<RootNamespace>BrightIdeasSoftware</RootNamespace>
<AssemblyName>ObjectListView</AssemblyName>
@@ -35,8 +35,4 @@
<Folder Include="Resources\" />
<Folder Include="Rendering\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="System.Drawing.Common" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" />
</ItemGroup>
</Project>

View File

@@ -582,8 +582,6 @@ using System.Globalization;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Versioning;
using System.Threading;
using System.Windows.Forms;
@@ -1908,7 +1906,7 @@ namespace BrightIdeasSoftware
[Category("ObjectListView"),
Description("The image list from which group header will take their images"),
DefaultValue(null)]
public ImageList GroupImageList
public new ImageList GroupImageList
{
get { return this.groupImageList; }
set
@@ -5870,12 +5868,7 @@ namespace BrightIdeasSoftware
// Now that we have stored our state, convert it to a byte array
using (MemoryStream ms = new MemoryStream())
{
//BinaryFormatter serializer = new BinaryFormatter();
//serializer.AssemblyFormat = FormatterAssemblyStyle.Simple;
//serializer.Serialize(ms, olvState);
//return ms.ToArray();
// Use System.Text.Json for serialization instead of BinaryFormatter
// Use System.Text.Json for serialization
var options = new JsonSerializerOptions
{
WriteIndented = false
@@ -5896,47 +5889,6 @@ namespace BrightIdeasSoftware
{
using (MemoryStream ms = new MemoryStream(state))
{
/*
BinaryFormatter deserializer = new BinaryFormatter();
ObjectListViewState olvState;
try
{
olvState = deserializer.Deserialize(ms) as ObjectListViewState;
}
catch (System.Runtime.Serialization.SerializationException)
{
return false;
}
// The number of columns has changed. We have no way to match old
// columns to the new ones, so we just give up.
if (olvState == null || olvState.NumberOfColumns != this.AllColumns.Count)
return false;
if (olvState.SortColumn == -1)
{
this.PrimarySortColumn = null;
this.PrimarySortOrder = SortOrder.None;
}
else
{
this.PrimarySortColumn = this.AllColumns[olvState.SortColumn];
this.PrimarySortOrder = olvState.LastSortOrder;
}
for (int i = 0; i < olvState.NumberOfColumns; i++)
{
OLVColumn column = this.AllColumns[i];
column.Width = (int)olvState.ColumnWidths[i];
column.IsVisible = (bool)olvState.ColumnIsVisible[i];
column.LastDisplayIndex = (int)olvState.ColumnDisplayIndicies[i];
}
// ReSharper disable RedundantCheckBeforeAssignment
if (olvState.IsShowingGroups != this.ShowGroups)
// ReSharper restore RedundantCheckBeforeAssignment
this.ShowGroups = olvState.IsShowingGroups;
if (this.View == olvState.CurrentView)
this.RebuildColumns();
else
this.View = olvState.CurrentView;
*/
ObjectListViewState olvState;
try
{

View File

@@ -431,7 +431,7 @@ namespace BrightIdeasSoftware
/// Override the basic message pump
/// </summary>
/// <param name="m"></param>
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
//[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
protected override void WndProc(ref Message m)
{
const int WM_DESTROY = 2;
@@ -492,7 +492,7 @@ namespace BrightIdeasSoftware
base.WndProc(ref m);
}
private bool HandleReflectNotify(ref Message m)
private static bool HandleReflectNotify(ref Message m)
{
NativeMethods.NMHDR nmhdr = (NativeMethods.NMHDR)m.GetLParam(typeof(NativeMethods.NMHDR));
System.Diagnostics.Debug.WriteLine(String.Format("rn: {0}", nmhdr.code));

View File

@@ -645,7 +645,6 @@ namespace BrightIdeasSoftware
/// Mess with the basic message pump of the tooltip
/// </summary>
/// <param name="msg"></param>
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
override protected void WndProc(ref Message msg) {
//System.Diagnostics.Trace.WriteLine(String.Format("xx {0:x}", msg.Msg));
switch (msg.Msg) {
@@ -697,5 +696,4 @@ namespace BrightIdeasSoftware
#endregion
}
}

View File

@@ -77,14 +77,16 @@ using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Windows.Forms;
using MethodInvoker = System.Windows.Forms.MethodInvoker;
namespace BrightIdeasSoftware
{
[SupportedOSPlatform("windows")]
/// <summary>
/// A virtual object list view operates in virtual mode, that is, it only gets model objects for
/// a row when it is needed. This gives it the ability to handle very large numbers of rows with
@@ -99,7 +101,7 @@ namespace BrightIdeasSoftware
/// <para>
/// Although it isn't documented, .NET virtual lists cannot have checkboxes. This class codes around this limitation,
/// but you must use the functions provided by ObjectListView: CheckedObjects, CheckObject(), UncheckObject() and their friends.
/// If you use the normal check box properties (CheckedItems or CheckedIndicies), they will throw an exception, since the
/// If you use the normal check box properties (CheckedItems or CheckedIndicie), they will throw an exception, since the
/// list is in virtual mode, and .NET "knows" it can't handle checkboxes in virtual mode.
/// </para>
/// <para>Due to the limits of the underlying Windows control, virtual lists do not trigger ItemCheck/ItemChecked events.
@@ -153,7 +155,7 @@ namespace BrightIdeasSoftware
/// <para>
/// This property returns a simple collection. Changes made to the returned
/// collection do NOT affect the list. This is different to the behaviour of
/// CheckedIndicies collection.
/// CheckedIndicie collection.
/// </para>
/// <para>
/// When getting CheckedObjects, the performance of this method is O(n) where n is the number of checked objects.
@@ -403,8 +405,6 @@ namespace BrightIdeasSoftware
[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_virtualListSize")]
private static extern ref int GetVirtualListSizeField(ListView listView);
static private FieldInfo virtualListSizeFieldInfo;
#endregion
#region OLV accessing

67
PANEL_BINDING_FEATURE.md Normal file
View File

@@ -0,0 +1,67 @@
# Panel Binding Feature
## Overview
This feature allows users to bind the Connections and Config panels together when they are in auto-hide state (collapsed). When one panel is clicked to expand, the other panel will automatically expand as well.
## How It Works
### User Workflow
1. The user collapses both the Connections and Config panels by clicking the auto-hide pin icon (they become auto-hidden tabs on the left side)
2. The user enables the "Bind Connections and Config panels together when auto-hidden" option in Tools > Options > Tabs & Panels
3. When the user clicks on the Connections tab to expand it, the Config panel will automatically expand as well
4. Similarly, when clicking on the Config tab, the Connections panel will expand
5. Both panels stay expanded together, allowing the user to view connection settings easily
6. When the user clicks away from the panels, both collapse back to auto-hide
### Benefits
- Reduces the number of clicks needed to view and edit connection settings
- Panels work together seamlessly when in auto-hide mode
- User can still use panels independently when they are pinned (docked)
- Configurable option allows users to enable/disable as needed
## Implementation Details
### Files Modified
1. **Properties/OptionsTabsPanelsPage.settings** - Added `BindConnectionsAndConfigPanels` setting (default: false)
2. **Properties/OptionsTabsPanelsPage.Designer.cs** - Added property accessor for the new setting
3. **UI/Panels/PanelBinder.cs** - NEW - Core logic for binding panel visibility
4. **UI/Forms/OptionsPages/TabsPanelsPage.cs** - Added checkbox and load/save logic
5. **UI/Forms/OptionsPages/TabsPanelsPage.Designer.cs** - Added UI checkbox control
6. **UI/Forms/frmMain.cs** - Initialize PanelBinder after panels are loaded
7. **Config/Settings/Registry/OptRegistryTabsPanelsPage.cs** - Added registry support for enterprise deployment
### Key Classes
#### PanelBinder
- Singleton class that manages the binding between panels
- Subscribes to VisibleChanged events on both TreeForm (Connections) and ConfigForm (Config)
- Only acts when:
- The binding setting is enabled
- Both panels are in auto-hide state
- One panel becomes visible (user clicked its tab)
- Uses a `_isProcessing` flag to prevent recursive event triggers
- Calls `Activate()` on the other panel to show it
### How to Test
1. Build and run mRemoteNG
2. Go to Tools > Options > Tabs & Panels
3. Verify the new checkbox "Bind Connections and Config panels together when auto-hidden" is present
4. Create a test connection in the Connections panel
5. Auto-hide both the Connections and Config panels (click the pin icon on each)
6. Both panels should now appear as collapsed tabs on the left side
7. Enable the binding option in Options
8. Click on the Connections tab - both Connections and Config should expand
9. Click away from the panels - both should collapse
10. Click on the Config tab - both panels should expand again
11. Disable the binding option
12. Verify panels now work independently when clicking their tabs
13. Pin one or both panels (dock them)
14. Verify the binding only works when BOTH panels are in auto-hide state
## Registry Support
Administrators can configure this setting via registry for enterprise deployment:
- Key: `HKEY_LOCAL_MACHINE\SOFTWARE\mRemoteNG\TabsAndPanels` or `HKEY_CURRENT_USER\SOFTWARE\mRemoteNG\TabsAndPanels`
- Value: `BindConnectionsAndConfigPanels` (DWORD)
- 0 = Disabled, 1 = Enabled

View File

@@ -1,3 +1,18 @@
<p align="Left">
Developing mRemoteNG to its fullest potential is my personal priority.<br>
While the project remains non-commercial, it does come with ongoing costs — including VPS hosting for testing, AI tools, domain fees, and more. <br> If you find value in mRemoteNG and want to support its future, even a small donation from our community can make a huge difference.<br>
Your support helps me keep the project secure, modern, and accessible for everyone who relies on it — and brings us closer to a brighter, more collaborative future.<br><br>
Consider donating — every contribution counts!
<br><br>
<a href="https://www.paypal.com/paypalme/mremoteng">
<img height='36' alt="PayPal" style='border:0px;height:36px;' src="https://img.shields.io/badge/%24-PayPal-blue.svg?label=Donate&logo=PayPal&style=flat-square">
</a><br>
<a href='https://ko-fi.com/Q5Q41I7JS' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi6.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a>
</a>
</p>
---
<p align="center">
<img width="450" src="https://github.com/mRemoteNG/mRemoteNG/blob/mRemoteNGProjectFiles/Header_dark.png">
</p>
@@ -21,11 +36,6 @@
<img alt="Element" src="https://img.shields.io/matrix/mremoteng:matrix.org?label=Join%20to%20chat%20about%20mRemoteNG&logo=element&style=social&link=https://app.element.io/#/room/#mremoteng:matrix.org">
</a>
</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>
</p>
<p align="center">
<a href="https://github.com/mRemoteNG/mRemoteNG/blob/develop/COPYING.TXT">
@@ -62,6 +72,7 @@ The following protocols are supported:
* rlogin (Remote Login)
* Raw Socket Connections
* Powershell remoting
* AnyDesk
For a detailed feature list and general usage support, refer to the [Documentation](https://mremoteng.readthedocs.io/en/latest/).
@@ -79,12 +90,18 @@ For a detailed feature list and general usage support, refer to the [Documentati
#### Source package
This contains the source code from which mRemoteNG is build.
This contains the source code from which mRemoteNG is built.
You will need to compile it yourself using Visual Studio.
### Minimum Requirements
* [[Microsoft .NET Desktop Runtime 9.0](https://dotnet.microsoft.com/download/dotnet/6.0](https://dotnet.microsoft.com/en-us/download/dotnet/9.0))
Make sure you have the latest version installed:
* [Microsoft .NET Desktop Runtime 10.0](https://dotnet.microsoft.com/download/dotnet/10.0)
* Microsoft Visual C++ Redistributable 20152026 is needed:
- [x64](https://aka.ms/vs/18/release/vc_redist.x64.exe)
- [ARM64](https://aka.ms/vs/18/release/vc_redist.arm64.exe)
- [x86](https://aka.ms/vs/18/release/vc_redist.x86.exe)
* Microsoft Terminal Service Client 6.0 or later (needed if you use RDP with mstscax.dll and/or msrdp.ocx to be registered)
### Download
@@ -129,6 +146,7 @@ _If you are using the Portable version, simply deleting the folder that contains
* [PSmRemoteNG](https://github.com/realslacker/PSmRemoteNG) A module to create mRemoteNG connection files from PowerShell.
* [mRemoteNGOpenVPN](https://github.com/T3los/mRemoteNGOpenVPN) A script that can be embedded as an external tool to control OpenVPN.
* [mRemoteNG-Icons](https://github.com/bearlikelion/mRemoteNG-Icons) A collection of fancy icons to customize the connections
## Contribute

122
VISUAL_EXAMPLES.md Normal file
View File

@@ -0,0 +1,122 @@
# Connection Frame Color - Visual Examples
## Before and After
### Without Frame Color (Default)
```
┌──────────────────────────────────────────────┐
│ Connection Tab │
├──────────────────────────────────────────────┤
│ │
│ │
│ [Normal connection content area] │
│ │
│ │
│ │
└──────────────────────────────────────────────┘
```
### With Red Frame Color (Production)
```
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Connection Tab (Production) ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ ╔════════════════════════════════════════╗ ┃
┃ ║ ║ ┃
┃ ║ [Connection content area] ║ ┃
┃ ║ With 4-pixel RED border all around ║ ┃
┃ ║ ║ ┃
┃ ╚════════════════════════════════════════╝ ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
```
### With Green Frame Color (Test)
```
┌──────────────────────────────────────────────┐
│ Connection Tab (Test) │
├──────────────────────────────────────────────┤
│ ╔════════════════════════════════════════╗ │
│ ║ ║ │
│ ║ [Connection content area] ║ │
│ ║ With 4-pixel GREEN border all around ║ │
│ ║ ║ │
│ ╚════════════════════════════════════════╝ │
└──────────────────────────────────────────────┘
```
## Side-by-Side Comparison
```
Test Connection Production Connection
┌─────────────────────┐ ┏━━━━━━━━━━━━━━━━━━━━━┓
│ [test server] │ ┃ [production server] ┃
│ │ ┃ ╔═══════════════╗ ┃
│ ┌───────────────┐ │ ┃ ║ ║ ┃
│ │ │ │ ┃ ║ !WARNING! ║ ┃
│ │ SSH Session │ │ ┃ ║ Production ║ ┃
│ │ (Green) │ │ ┃ ║ Environment ║ ┃
│ └───────────────┘ │ ┃ ║ (Red) ║ ┃
│ │ ┃ ╚═══════════════╝ ┃
└─────────────────────┘ ┗━━━━━━━━━━━━━━━━━━━━━┛
Safe to experiment Requires extra caution!
```
## Property Grid Display
When you select a connection in mRemoteNG, the Config panel will show:
```
┌─ Display ──────────────────────────────────┐
│ │
│ Name: My Server │
│ Description: Production DB │
│ Icon: SSH │
│ Panel: General │
│ Color: [empty] │
│ Tab Color: [empty] │
│ Connection Frame Color: ▼ Red (Production)│
│ ├─ None │
│ ├─ Red (Prod...)│
│ ├─ Yellow (St...)│
│ ├─ Green (Test) │
│ ├─ Blue (Dev) │
│ └─ Purple (C...)│
└────────────────────────────────────────────┘
```
## Folder Inheritance Example
```
📁 Production Servers (ConnectionFrameColor: Red)
├─ 📄 Web Server 1 (inherits Red)
├─ 📄 Web Server 2 (inherits Red)
└─ 📄 Database Server (inherits Red)
📁 Development Servers (ConnectionFrameColor: Blue)
├─ 📄 Dev Server 1 (inherits Blue)
└─ 📄 Dev Server 2 (inherits Blue)
📁 Test Servers (ConnectionFrameColor: Green)
├─ 📄 Test Server 1 (inherits Green)
└─ 📄 QA Server (inherits Green)
```
All connections in the "Production Servers" folder will automatically
get a red border when you connect to them (assuming inheritance is enabled).
## Color Palette
The implementation uses these specific colors:
- **Red (Production)**: RGB(220, 53, 69) - High visibility warning color
- **Yellow (Staging/UAT)**: RGB(255, 193, 7) - Caution/warning color
- **Green (Test)**: RGB(40, 167, 69) - Safe/go color
- **Blue (Development)**: RGB(0, 123, 255) - Calm, neutral color
- **Purple (Custom)**: RGB(111, 66, 193) - Distinct custom color
- **None (Default)**: Transparent - No border
These colors are chosen for:
1. High contrast and visibility
2. Universal recognition (red = danger, green = safe)
3. Accessibility considerations
4. Consistency with modern UI design patterns

View File

@@ -1,4 +1,4 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31912.275
@@ -13,8 +13,8 @@ Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|arm64 = Debug|arm64
Debug|x64 = Debug|x64
Release Installer and Portable|arm64 = Release Installer and Portable|arm64
Release Installer and Portable|x64 = Release Installer and Portable|x64
Release Self-Contained|arm64 = Release Self-Contained|arm64
Release Self-Contained|x64 = Release Self-Contained|x64
Release|arm64 = Release|arm64
Release|x64 = Release|x64
EndGlobalSection
@@ -23,10 +23,10 @@ Global
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug|arm64.Build.0 = Debug|arm64
{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 and Portable|arm64.ActiveCfg = Release Portable|arm64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer and Portable|arm64.Build.0 = Release Portable|arm64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer and Portable|x64.ActiveCfg = Release Portable|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer and Portable|x64.Build.0 = Release Portable|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Self-Contained|arm64.ActiveCfg = Release Self-Contained|arm64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Self-Contained|arm64.Build.0 = Release Self-Contained|arm64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Self-Contained|x64.ActiveCfg = Release Self-Contained|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Self-Contained|x64.Build.0 = Release Self-Contained|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|arm64.ActiveCfg = Release|arm64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|arm64.Build.0 = Release|arm64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|x64.ActiveCfg = Release|x64
@@ -35,10 +35,10 @@ Global
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Debug|arm64.Build.0 = Debug|arm64
{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 and Portable|arm64.ActiveCfg = Release Portable|arm64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Installer and Portable|arm64.Build.0 = Release Portable|arm64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Installer and Portable|x64.ActiveCfg = Release Portable|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Installer and Portable|x64.Build.0 = Release Portable|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Self-Contained|arm64.ActiveCfg = Release Self-Contained|arm64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Self-Contained|arm64.Build.0 = Release Self-Contained|arm64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Self-Contained|x64.ActiveCfg = Release Self-Contained|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Self-Contained|x64.Build.0 = Release Self-Contained|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release|arm64.ActiveCfg = Release|arm64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release|arm64.Build.0 = Release|arm64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release|x64.ActiveCfg = Release|x64
@@ -47,10 +47,10 @@ Global
{5718734C-03AC-4954-89B1-1723CF03AF10}.Debug|arm64.Build.0 = Debug|Any CPU
{5718734C-03AC-4954-89B1-1723CF03AF10}.Debug|x64.ActiveCfg = Debug|Any CPU
{5718734C-03AC-4954-89B1-1723CF03AF10}.Debug|x64.Build.0 = Debug|Any CPU
{5718734C-03AC-4954-89B1-1723CF03AF10}.Release Installer and Portable|arm64.ActiveCfg = Release|Any CPU
{5718734C-03AC-4954-89B1-1723CF03AF10}.Release Installer and Portable|arm64.Build.0 = Release|Any CPU
{5718734C-03AC-4954-89B1-1723CF03AF10}.Release Installer and Portable|x64.ActiveCfg = Release|Any CPU
{5718734C-03AC-4954-89B1-1723CF03AF10}.Release Installer and Portable|x64.Build.0 = Release|Any CPU
{5718734C-03AC-4954-89B1-1723CF03AF10}.Release Self-Contained|arm64.ActiveCfg = Release|Any CPU
{5718734C-03AC-4954-89B1-1723CF03AF10}.Release Self-Contained|arm64.Build.0 = Release|Any CPU
{5718734C-03AC-4954-89B1-1723CF03AF10}.Release Self-Contained|x64.ActiveCfg = Release|Any CPU
{5718734C-03AC-4954-89B1-1723CF03AF10}.Release Self-Contained|x64.Build.0 = Release|Any CPU
{5718734C-03AC-4954-89B1-1723CF03AF10}.Release|arm64.ActiveCfg = Release|Any CPU
{5718734C-03AC-4954-89B1-1723CF03AF10}.Release|arm64.Build.0 = Release|Any CPU
{5718734C-03AC-4954-89B1-1723CF03AF10}.Release|x64.ActiveCfg = Release|Any CPU

View File

@@ -10,7 +10,7 @@ using mRemoteNG.UI.Window;
namespace mRemoteNG.App
{
[SupportedOSPlatform("windows")]
public static class Windows
public static class AppWindows
{
private static ActiveDirectoryImportWindow _adimportForm;
private static ExternalToolsWindow _externalappsForm;
@@ -26,7 +26,7 @@ namespace mRemoteNG.App
internal static ConfigWindow ConfigForm { get; set; } = new ConfigWindow();
internal static ErrorAndInfoWindow ErrorsForm { get; set; } = new ErrorAndInfoWindow();
private static UpdateWindow UpdateForm { get; set; } = new UpdateWindow();
internal static UpdateWindow UpdateForm { get; set; } = new UpdateWindow();
internal static SSHTransferWindow SshtransferForm { get; private set; } = new SSHTransferWindow();
internal static OptionsWindow OptionsFormWindow { get; private set; }

View File

@@ -24,7 +24,7 @@ namespace mRemoteNG.App.Update
string version = $"{major}.{minor}";
foreach (var baseKey in baseKeys)
{
string path = $@"{baseKey}\{version}\VC\Runtimes\x86";
string path = $@"{baseKey}\{version}\VC\Runtimes\x64";
using (RegistryKey? key = Registry.LocalMachine.OpenSubKey(path))
{
if (key?.GetValue("Installed") is int installed && installed == 1)

View File

@@ -15,8 +15,10 @@ namespace mRemoteNG.App.Info
{
public const string UrlHome = "https://mremoteng.org";
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 UrlForum = "https://github.com/orgs/mRemoteNG/discussions";
public const string UrlChat = "https://app.element.io/#/room/#mremoteng:matrix.org";
public const string UrlCommunity = "https://www.reddit.com/r/mRemoteNG";
public const string UrlBugs = "https://github.com/mRemoteNG/mRemoteNG/issues/new";
public const string UrlDocumentation = "https://mremoteng.readthedocs.io/en/latest/";
public static readonly string ApplicationVersion = Application.ProductVersion;
public static readonly string ProductName = Application.ProductName;

View File

@@ -57,9 +57,9 @@ namespace mRemoteNG.App.Initialization
return new OnlyLogMessageFilter(
new MessageTypeFilterDecorator(
new NotificationPanelMessageFilteringOptions(),
new MessageFocusDecorator(Windows.ErrorsForm,
new MessageFocusDecorator(AppWindows.ErrorsForm,
new NotificationPanelSwitchOnMessageFilteringOptions(),
new NotificationPanelMessageWriter(Windows.ErrorsForm))
new NotificationPanelMessageWriter(AppWindows.ErrorsForm))
)
);
}

View File

@@ -3,9 +3,8 @@
using mRemoteNG.App.Update;
using mRemoteNG.Config.Settings;
using mRemoteNG.DotNet.Update;
using mRemoteNG.DotNet.Update;
using mRemoteNG.UI.Forms;
using mRemoteNG.Resources.Language;
using System;
using System.Diagnostics;
using System.Drawing;
@@ -25,7 +24,6 @@ namespace mRemoteNG.App
public static class ProgramRoot
{
private static Mutex? _mutex;
private static FrmSplashScreenNew _frmSplashScreen = null;
private static string customResourcePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Languages");
private static System.Threading.Thread? _wpfSplashThread;
@@ -42,6 +40,9 @@ namespace mRemoteNG.App
{
AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve;
#if !SELF_CONTAINED
// Runtime checks only needed for framework-dependent deployments
// Self-contained builds include the runtime, so no check is needed
string? installedVersion = DotNetRuntimeCheck.GetLatestDotNetRuntimeVersion();
//installedVersion = ""; // Force check for testing purposes
@@ -53,12 +54,11 @@ namespace mRemoteNG.App
{
try
{
var result = MessageBox.Show(
$".NET Desktop Runtime at least {DotNetRuntimeCheck.RequiredDotnetVersion}.0 is required.\n" +
"The application will now exit.\n\nPlease download and install latest desktop runtime:\n" + downloadUrl,
"Missing .NET " + DotNetRuntimeCheck.RequiredDotnetVersion + " Runtime",
MessageBoxButtons.OKCancel,
MessageBoxIcon.Information);
var result = ShowDownloadCancelDialog(
$".NET " + DotNetRuntimeCheck.RequiredDotnetVersion + ".0 " + Language.MsgRuntimeIsRequired + "\n\n" +
Language.MsgDownloadLatestRuntime + "\n" + downloadUrl + "\n\n" +
Language.MsgExit + "\n\n",
Language.MsgMissingRuntime + " .NET " + DotNetRuntimeCheck.RequiredDotnetVersion);
if (result == DialogResult.OK && InternetConnection.IsPosible())
{
@@ -79,15 +79,14 @@ namespace mRemoteNG.App
// Checking Visual C++ Redistributable version
if (VCppRuntimeCheck.GetInstalledVcRedistVersions() == null || VCppRuntimeCheck.GetInstalledVcRedistVersions().Count == 0)
{
var downloadUrl2 = "https://aka.ms/vs/17/release/vc_redist.x86.exe";
var downloadUrl2 = "https://aka.ms/vs/17/release/vc_redist.x64.exe";
try
{
var result = MessageBox.Show(
$"A Visual C++ (MSVC) runtime library is required.\n" +
"The application will now exit.\n\nPlease download and install latest desktop runtime:\n" + downloadUrl2,
"Missing Visual C++ Redistributable x86 Runtime",
MessageBoxButtons.OKCancel,
MessageBoxIcon.Information);
var result = ShowDownloadCancelDialog(
$"A Visual C++ (MSVC) " + Language.MsgRuntimeIsRequired + "\n\n" +
Language.MsgDownloadLatestRuntime + "\n" + downloadUrl2 + "\n\n" +
Language.MsgExit + "\n\n",
Language.MsgMissingRuntime + " Visual C++ Redistributable x64");
if (result == DialogResult.OK && InternetConnection.IsPosible())
{
@@ -109,6 +108,7 @@ namespace mRemoteNG.App
{
Environment.Exit(0);
}
#endif
Lazy<bool> singleInstanceOption = new(() => Properties.OptionsStartupExitPage.Default.SingleInstance);
if (singleInstanceOption.Value)
@@ -269,5 +269,101 @@ namespace mRemoteNG.App
_wpfSplashThread = null;
}
}
// Helper to show a dialog with "Download" and "Cancel" buttons.
// Returns DialogResult.OK if Download clicked, otherwise DialogResult.Cancel.
private static DialogResult ShowDownloadCancelDialog(string message, string caption)
{
using Form dialog = new Form()
{
Text = caption,
StartPosition = FormStartPosition.CenterScreen,
FormBorderStyle = FormBorderStyle.FixedDialog,
MinimizeBox = false,
MaximizeBox = false,
ShowInTaskbar = false,
ClientSize = new Size(560, 200),
Icon = SystemIcons.Information
};
// Try to find a URL in the message (very simple heuristic: first "http" until whitespace/newline)
int urlStart = message.IndexOf("http", StringComparison.OrdinalIgnoreCase);
string? url = null;
if (urlStart >= 0)
{
int urlEnd = message.IndexOfAny(new char[] { ' ', '\r', '\n', '\t' }, urlStart);
if (urlEnd == -1) urlEnd = message.Length;
url = message.Substring(urlStart, urlEnd - urlStart);
}
LinkLabel lbl = new LinkLabel()
{
AutoSize = false,
Text = message,
Location = new Point(12, 12),
Size = new Size(dialog.ClientSize.Width - 24, dialog.ClientSize.Height - 60),
TextAlign = ContentAlignment.TopLeft,
LinkBehavior = LinkBehavior.SystemDefault
};
lbl.MaximumSize = new Size(dialog.ClientSize.Width - 24, 0);
if (!string.IsNullOrEmpty(url) && urlStart >= 0)
{
// Ensure link indices are within bounds of the LinkLabel text
int linkStartInLabel = urlStart;
int linkLength = url.Length;
if (linkStartInLabel + linkLength <= lbl.Text.Length)
{
lbl.Links.Add(linkStartInLabel, linkLength, url);
}
}
lbl.LinkClicked += (s, e) =>
{
string? linkUrl = e.Link.LinkData as string;
if (string.IsNullOrEmpty(linkUrl))
return;
if (!InternetConnection.IsPosible())
{
MessageBox.Show("No internet connection is available.", "Network", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
// Treat clicking the link the same as clicking the "Download" button:
// set DialogResult to OK so the caller receives DialogResult.OK and can proceed to open the download URL.
dialog.DialogResult = DialogResult.OK;
// Do not call Process.Start here to avoid duplicate launches; caller already opens the URL when it sees DialogResult.OK.
};
Button btnDownload = new Button()
{
Text = "Download",
DialogResult = DialogResult.OK,
Size = new Size(100, 28),
};
Button btnCancel = new Button()
{
Text = "Cancel",
DialogResult = DialogResult.Cancel,
Size = new Size(100, 28),
};
// Position buttons
int padding = 12;
btnCancel.Location = new Point(dialog.ClientSize.Width - padding - btnCancel.Width, dialog.ClientSize.Height - padding - btnCancel.Height);
btnDownload.Location = new Point(btnCancel.Left - 8 - btnDownload.Width, btnCancel.Top);
// Set dialog defaults
dialog.Controls.Add(lbl);
dialog.Controls.Add(btnDownload);
dialog.Controls.Add(btnCancel);
dialog.AcceptButton = btnDownload;
dialog.CancelButton = btnCancel;
// Adjust label height to wrap text properly
lbl.Height = btnCancel.Top - lbl.Top - 8;
return dialog.ShowDialog();
}
}
}

View File

@@ -121,7 +121,11 @@ namespace mRemoteNG.App
private static void RunUpdateFile()
{
if (UpdatePending)
{
// Validate the update file path to prevent command injection
Tools.PathValidator.ValidateExecutablePathOrThrow(_updateFilePath, nameof(_updateFilePath));
Process.Start(new ProcessStartInfo(_updateFilePath) { UseShellExecute = true });
}
}
}
}

View File

@@ -84,10 +84,8 @@ namespace mRemoteNG.App
try
{
await _appUpdate.GetUpdateInfoAsync();
if (_appUpdate.IsUpdateAvailable())
{
Windows.Show(WindowType.Update);
}
// Update is available, but don't show the panel automatically at startup
// User can check for updates manually via Help > Check for Updates menu
}
catch (Exception ex)
{

View File

@@ -168,7 +168,15 @@ namespace mRemoteNG.Config.Connections
// TODO: use transaction
System.Data.Common.DbCommand dbQuery = databaseConnector.DbCommand("TRUNCATE TABLE tblUpdate");
dbQuery.ExecuteNonQuery();
dbQuery = databaseConnector.DbCommand("INSERT INTO tblUpdate (LastUpdate) VALUES('" + MiscTools.DBDate(DateTime.Now.ToUniversalTime()) + "')");
dbQuery = databaseConnector.DbCommand("INSERT INTO tblUpdate (LastUpdate) VALUES(@LastUpdate)");
DbParameter lastUpdateParam = dbQuery.CreateParameter();
lastUpdateParam.ParameterName = "@LastUpdate";
// Use DBTimeStampNow() instead of DBDate() - the column is datetime type, not string
// DBTimeStampNow() returns the database-specific .NET type: DateTime for MSSQL, MySqlDateTime for MySQL
lastUpdateParam.Value = MiscTools.DBTimeStampNow();
dbQuery.Parameters.Add(lastUpdateParam);
dbQuery.ExecuteNonQuery();
}

View File

@@ -4,6 +4,7 @@ using System.Runtime.Versioning;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using LiteDB;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Config.DatabaseConnectors
{
@@ -111,19 +112,19 @@ namespace mRemoteNG.Config.DatabaseConnectors
catch (PlatformNotSupportedException ex)
{
// Log or handle architecture mismatch
Console.WriteLine($"Platform error: {ex.Message}");
Console.WriteLine(string.Format(Language.ErrorPlatformNotSupported, ex.Message));
return ConnectionTestResult.UnknownError;
}
catch (DllNotFoundException ex)
{
// Handle missing native dependencies
Console.WriteLine($"Missing dependency: {ex.Message}");
Console.WriteLine(string.Format(Language.ErrorMissingDependency, ex.Message));
return ConnectionTestResult.UnknownError;
}
catch (BadImageFormatException ex)
{
// Handle architecture mismatch in native libraries
Console.WriteLine($"Architecture mismatch: {ex.Message}");
Console.WriteLine(string.Format(Language.ErrorArchitectureMismatch, ex.Message));
return ConnectionTestResult.UnknownError;
}
catch (SqlException sqlException)

View File

@@ -168,6 +168,11 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
? connectionCsv[headers.IndexOf("UserField")]
: "";
connectionRecord.EnvironmentTags =
headers.Contains("EnvironmentTags")
? connectionCsv[headers.IndexOf("EnvironmentTags")]
: "";
connectionRecord.ExtApp = headers.Contains("ExtApp")
? connectionCsv[headers.IndexOf("ExtApp")] : "";
@@ -777,6 +782,12 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
connectionRecord.Inheritance.UserField = value;
}
if (headers.Contains("InheritEnvironmentTags"))
{
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritEnvironmentTags")], out bool value))
connectionRecord.Inheritance.EnvironmentTags = value;
}
if (headers.Contains("InheritFavorite"))
{
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritFavorite")], out bool value))

View File

@@ -50,7 +50,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
private void WriteCsvHeader(StringBuilder sb)
{
sb.Append("Name;Id;Parent;NodeType;Description;Icon;Panel;");
sb.Append("Name;Id;Parent;NodeType;Description;Icon;Panel;TabColor;ConnectionFrameColor;");
if (_saveFilter.SaveUsername)
sb.Append("Username;");
if (_saveFilter.SavePassword)
@@ -61,18 +61,18 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
sb.Append("Hostname;Port;VmId;Protocol;SSHTunnelConnectionName;OpeningCommand;SSHOptions;PuttySession;ConnectToConsole;UseCredSsp;UseRestrictedAdmin;UseRCG;UseVmId;UseEnhancedMode;RenderingEngine;RDPAuthenticationLevel;" +
"LoadBalanceInfo;Colors;Resolution;AutomaticResize;DisplayWallpaper;DisplayThemes;EnableFontSmoothing;EnableDesktopComposition;DisableFullWindowDrag;DisableMenuAnimations;DisableCursorShadow;DisableCursorBlinking;" +
"CacheBitmaps;RedirectDiskDrives;RedirectDiskDrivesCustomRedirectPorts;RedirectPrinters;RedirectClipboard;RedirectSmartCards;RedirectSound;RedirectKeys;" +
"PreExtApp;PostExtApp;MacAddress;UserField;ExtApp;Favorite;VNCCompression;VNCEncoding;VNCAuthMode;VNCProxyType;VNCProxyIP;" +
"PreExtApp;PostExtApp;MacAddress;UserField;EnvironmentTags;ExtApp;Favorite;VNCCompression;VNCEncoding;VNCAuthMode;VNCProxyType;VNCProxyIP;" +
"VNCProxyPort;VNCProxyUsername;VNCProxyPassword;VNCColors;VNCSmartSizeMode;VNCViewOnly;RDGatewayUsageMethod;RDGatewayHostname;" +
"RDGatewayUseConnectionCredentials;RDGatewayUsername;RDGatewayPassword;RDGatewayDomain;RDGatewayExternalCredentialProvider;RDGatewayUserViaAPI;RedirectAudioCapture;RdpVersion;RDPStartProgram;RDPStartProgramWorkDir;UserViaAPI;EC2InstanceId;EC2Region;ExternalCredentialProvider;ExternalAddressProvider;");
if (_saveFilter.SaveInheritance)
sb.Append("InheritCacheBitmaps;InheritColors;InheritDescription;InheritDisplayThemes;InheritDisplayWallpaper;" +
"InheritEnableFontSmoothing;InheritEnableDesktopComposition;InheritDisableFullWindowDrag;InheritDisableMenuAnimations;InheritDisableCursorShadow;InheritDisableCursorBlinking;InheritDomain;InheritIcon;InheritPanel;InheritPassword;InheritPort;" +
"InheritEnableFontSmoothing;InheritEnableDesktopComposition;InheritDisableFullWindowDrag;InheritDisableMenuAnimations;InheritDisableCursorShadow;InheritDisableCursorBlinking;InheritDomain;InheritIcon;InheritPanel;InheritTabColor;InheritConnectionFrameColor;InheritPassword;InheritPort;" +
"InheritProtocol;InheritSSHTunnelConnectionName;InheritOpeningCommand;InheritSSHOptions;InheritPuttySession;InheritRedirectDiskDrives;InheritRedirectDiskDrivesCustom;InheritRedirectKeys;InheritRedirectPorts;InheritRedirectPrinters;" +
"InheritRedirectClipboard;InheritRedirectSmartCards;InheritRedirectSound;InheritResolution;InheritAutomaticResize;" +
"InheritUseConsoleSession;InheritUseCredSsp;InheritUseRestrictedAdmin;InheritUseRCG;InheritUseVmId;InheritUseEnhancedMode;InheritVmId;InheritRenderingEngine;InheritUsername;" +
"InheritRDPAuthenticationLevel;InheritLoadBalanceInfo;InheritPreExtApp;InheritPostExtApp;InheritMacAddress;InheritUserField;" +
"InheritFavorite;InheritExtApp;InheritVNCCompression;InheritVNCEncoding;InheritVNCAuthMode;InheritVNCProxyType;InheritVNCProxyIP;" +
"InheritEnvironmentTags;InheritFavorite;InheritExtApp;InheritVNCCompression;InheritVNCEncoding;InheritVNCAuthMode;InheritVNCProxyType;InheritVNCProxyIP;" +
"InheritVNCProxyPort;InheritVNCProxyUsername;InheritVNCProxyPassword;InheritVNCColors;InheritVNCSmartSizeMode;InheritVNCViewOnly;" +
"InheritRDGatewayUsageMethod;InheritRDGatewayHostname;InheritRDGatewayUseConnectionCredentials;InheritRDGatewayUsername;" +
"InheritRDGatewayPassword;InheritRDGatewayDomain;InheritRDGatewayExternalCredentialProvider;InheritRDGatewayUserViaAPI;InheritRDPAlertIdleTimeout;InheritRDPMinutesToIdleTimeout;InheritSoundQuality;InheritUserViaAPI;" +
@@ -106,7 +106,9 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
.Append(FormatForCsv(con.GetTreeNodeType()))
.Append(FormatForCsv(con.Description))
.Append(FormatForCsv(con.Icon))
.Append(FormatForCsv(con.Panel));
.Append(FormatForCsv(con.Panel))
.Append(FormatForCsv(con.TabColor))
.Append(FormatForCsv(con.ConnectionFrameColor));
if (_saveFilter.SaveUsername)
sb.Append(FormatForCsv(con.Username));
@@ -159,6 +161,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
.Append(FormatForCsv(con.PostExtApp))
.Append(FormatForCsv(con.MacAddress))
.Append(FormatForCsv(con.UserField))
.Append(FormatForCsv(con.EnvironmentTags))
.Append(FormatForCsv(con.ExtApp))
.Append(FormatForCsv(con.Favorite))
.Append(FormatForCsv(con.VNCCompression))
@@ -209,6 +212,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
.Append(FormatForCsv(con.Inheritance.Domain))
.Append(FormatForCsv(con.Inheritance.Icon))
.Append(FormatForCsv(con.Inheritance.Panel))
.Append(FormatForCsv(con.Inheritance.TabColor))
.Append(FormatForCsv(con.Inheritance.ConnectionFrameColor))
.Append(FormatForCsv(con.Inheritance.Password))
.Append(FormatForCsv(con.Inheritance.Port))
.Append(FormatForCsv(con.Inheritance.Protocol))
@@ -241,6 +246,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
.Append(FormatForCsv(con.Inheritance.PostExtApp))
.Append(FormatForCsv(con.Inheritance.MacAddress))
.Append(FormatForCsv(con.Inheritance.UserField))
.Append(FormatForCsv(con.Inheritance.EnvironmentTags))
.Append(FormatForCsv(con.Inheritance.Favorite))
.Append(FormatForCsv(con.Inheritance.ExtApp))
.Append(FormatForCsv(con.Inheritance.VNCCompression))

View File

@@ -145,6 +145,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql
connectionInfo.UseRCG = MiscTools.GetBooleanValue(dataRow["UseRCG"]);
connectionInfo.UseRestrictedAdmin = MiscTools.GetBooleanValue(dataRow["UseRestrictedAdmin"]);
connectionInfo.UserField = (string)dataRow["UserField"];
connectionInfo.EnvironmentTags = dataRow.Table.Columns.Contains("EnvironmentTags") ? (string)dataRow["EnvironmentTags"] : "";
connectionInfo.Username = (string)dataRow["Username"];
connectionInfo.UseVmId = MiscTools.GetBooleanValue(dataRow["UseVmId"]);
connectionInfo.VmId = (string)dataRow["VmId"];
@@ -224,6 +225,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql
connectionInfo.Inheritance.UseRCG = MiscTools.GetBooleanValue(dataRow["InheritUseRCG"]);
connectionInfo.Inheritance.UseRestrictedAdmin = MiscTools.GetBooleanValue(dataRow["InheritUseRestrictedAdmin"]);
connectionInfo.Inheritance.UserField = MiscTools.GetBooleanValue(dataRow["InheritUserField"]);
if (dataRow.Table.Columns.Contains("InheritEnvironmentTags"))
connectionInfo.Inheritance.EnvironmentTags = MiscTools.GetBooleanValue(dataRow["InheritEnvironmentTags"]);
connectionInfo.Inheritance.Username = MiscTools.GetBooleanValue(dataRow["InheritUsername"]);
connectionInfo.Inheritance.UseVmId = MiscTools.GetBooleanValue(dataRow["InheritUseVmId"]);
connectionInfo.Inheritance.VmId = MiscTools.GetBooleanValue(dataRow["InheritVmId"]);

View File

@@ -177,6 +177,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql
dataTable.Columns.Add("InheritUseRestrictedAdmin", typeof(bool));
dataTable.Columns.Add("InheritUseVmId", typeof(bool));
dataTable.Columns.Add("InheritUserField", typeof(bool));
dataTable.Columns.Add("InheritEnvironmentTags", typeof(bool));
dataTable.Columns.Add("InheritUserViaAPI", typeof(bool));
dataTable.Columns.Add("InheritUsername", typeof(bool));
dataTable.Columns.Add("InheritVNCAuthMode", typeof(bool));
@@ -240,6 +241,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql
dataTable.Columns.Add("UseRestrictedAdmin", typeof(bool));
dataTable.Columns.Add("UseVmId", typeof(bool));
dataTable.Columns.Add("UserField", typeof(string));
dataTable.Columns.Add("EnvironmentTags", typeof(string));
dataTable.Columns.Add("UserViaAPI", typeof(string));
dataTable.Columns.Add("Username", typeof(string));
dataTable.Columns.Add("VNCAuthMode", typeof(string));
@@ -612,6 +614,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql
dataRow["UseRestrictedAdmin"] = connectionInfo.UseRestrictedAdmin;
dataRow["UseVmId"] = connectionInfo.UseVmId;
dataRow["UserField"] = connectionInfo.UserField;
dataRow["EnvironmentTags"] = connectionInfo.EnvironmentTags;
dataRow["Username"] = _saveFilter.SaveUsername ? connectionInfo.Username : "";
dataRow["VNCAuthMode"] = connectionInfo.VNCAuthMode;
dataRow["VNCColors"] = connectionInfo.VNCColors;
@@ -690,6 +693,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql
dataRow["InheritUseRestrictedAdmin"] = connectionInfo.Inheritance.UseRestrictedAdmin;
dataRow["InheritUseVmId"] = connectionInfo.Inheritance.UseVmId;
dataRow["InheritUserField"] = connectionInfo.Inheritance.UserField;
dataRow["InheritEnvironmentTags"] = connectionInfo.Inheritance.EnvironmentTags;
dataRow["InheritUserViaAPI"] = connectionInfo.Inheritance.UserViaAPI;
dataRow["InheritUsername"] = connectionInfo.Inheritance.Username;
dataRow["InheritVNCAuthMode"] = connectionInfo.Inheritance.VNCAuthMode;
@@ -767,6 +771,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql
dataRow["InheritUseRCG"] = false;
dataRow["InheritUseRestrictedAdmin"] = false;
dataRow["InheritUserField"] = false;
dataRow["InheritEnvironmentTags"] = false;
dataRow["InheritUserViaAPI"] = false;
dataRow["InheritUsername"] = false;
dataRow["InheritVNCAuthMode"] = false;

View File

@@ -99,9 +99,22 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql
if (rootTreeNode != null)
{
cmd = databaseConnector.DbCommand(
"INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES('" +
MiscTools.PrepareValueForDB(rootTreeNode.Name) + "', 0, '" + strProtected + "','" +
ConnectionsFileInfo.ConnectionFileVersion + "')");
"INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES(@Name, 0, @Protected, @ConfVersion)");
DbParameter nameParam = cmd.CreateParameter();
nameParam.ParameterName = "@Name";
nameParam.Value = rootTreeNode.Name;
cmd.Parameters.Add(nameParam);
DbParameter protectedParam = cmd.CreateParameter();
protectedParam.ParameterName = "@Protected";
protectedParam.Value = strProtected;
cmd.Parameters.Add(protectedParam);
DbParameter confVersionParam = cmd.CreateParameter();
confVersionParam.ParameterName = "@ConfVersion";
confVersionParam.Value = ConnectionsFileInfo.ConnectionFileVersion.ToString();
cmd.Parameters.Add(confVersionParam);
cmd.ExecuteNonQuery();
}
@@ -111,6 +124,22 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql
}
}
private bool IsValidTableName(string tableName)
{
// Table names should only contain alphanumeric characters and underscores
// This prevents SQL injection when table names must be used directly in queries
if (string.IsNullOrWhiteSpace(tableName))
return false;
foreach (char c in tableName)
{
if (!char.IsLetterOrDigit(c) && c != '_')
return false;
}
return true;
}
private bool DoesDbTableExist(IDatabaseConnector databaseConnector, string tableName)
{
bool exists;
@@ -119,7 +148,18 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql
{
// ANSI SQL way. Works in PostgreSQL, MSSQL, MySQL.
string database_name = Properties.OptionsDBsPage.Default.SQLDatabaseName;
DbCommand cmd = databaseConnector.DbCommand("select case when exists((select * from information_schema.tables where table_name = '" + tableName + "' and table_schema='"+ database_name + "')) then 1 else 0 end");
DbCommand cmd = databaseConnector.DbCommand("select case when exists((select * from information_schema.tables where table_name = @TableName and table_schema = @DatabaseName)) then 1 else 0 end");
DbParameter tableNameParam = cmd.CreateParameter();
tableNameParam.ParameterName = "@TableName";
tableNameParam.Value = tableName;
cmd.Parameters.Add(tableNameParam);
DbParameter databaseNameParam = cmd.CreateParameter();
databaseNameParam.ParameterName = "@DatabaseName";
databaseNameParam.Value = database_name;
cmd.Parameters.Add(databaseNameParam);
short cmdResult = Convert.ToInt16(cmd.ExecuteScalar());
exists = (cmdResult == 1);
}
@@ -128,9 +168,18 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql
try
{
// Other RDBMS. Graceful degradation
exists = true;
DbCommand cmdOthers = databaseConnector.DbCommand("select 1 from " + tableName + " where 1 = 0");
cmdOthers.ExecuteNonQuery();
// Note: Table names cannot be parameterized in standard SQL.
// Validate tableName to prevent SQL injection
if (!IsValidTableName(tableName))
{
exists = false;
}
else
{
exists = true;
DbCommand cmdOthers = databaseConnector.DbCommand($"select 1 from {tableName} where 1 = 0");
cmdOthers.ExecuteNonQuery();
}
}
catch
{

View File

@@ -42,6 +42,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(new XAttribute("Descr", connectionInfo.Description));
element.Add(new XAttribute("Icon", connectionInfo.Icon));
element.Add(new XAttribute("Panel", connectionInfo.Panel));
element.Add(new XAttribute("TabColor", connectionInfo.TabColor));
element.Add(new XAttribute("ConnectionFrameColor", connectionInfo.ConnectionFrameColor));
element.Add(new XAttribute("Id", connectionInfo.ConstantID));
if (!Runtime.UseCredentialManager)
@@ -103,6 +105,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(new XAttribute("PostExtApp", connectionInfo.PostExtApp));
element.Add(new XAttribute("MacAddress", connectionInfo.MacAddress));
element.Add(new XAttribute("UserField", connectionInfo.UserField));
element.Add(new XAttribute("EnvironmentTags", connectionInfo.EnvironmentTags));
element.Add(new XAttribute("Favorite", connectionInfo.Favorite));
element.Add(new XAttribute("ExtApp", connectionInfo.ExtApp));
element.Add(new XAttribute("StartProgram", connectionInfo.RDPStartProgram));
@@ -151,6 +154,11 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(new XAttribute("EC2Region", connectionInfo.EC2Region));
element.Add(new XAttribute("ExternalCredentialProvider", connectionInfo.ExternalCredentialProvider));
element.Add(new XAttribute("ExternalAddressProvider", connectionInfo.ExternalAddressProvider));
// Vault/OpenBao specific
element.Add(new XAttribute("VaultOpenbaoMount", connectionInfo.VaultOpenbaoMount ?? string.Empty));
element.Add(new XAttribute("VaultOpenbaoRole", connectionInfo.VaultOpenbaoRole ?? string.Empty));
element.Add(new XAttribute("VaultOpenbaoSecretEngine", connectionInfo.VaultOpenbaoSecretEngine));
}
private void SetInheritanceAttributes(XContainer element, IInheritable connectionInfo)
@@ -187,6 +195,10 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(new XAttribute("InheritIcon", inheritance.Icon.ToString().ToLowerInvariant()));
if (inheritance.Panel)
element.Add(new XAttribute("InheritPanel", inheritance.Panel.ToString().ToLowerInvariant()));
if (inheritance.TabColor)
element.Add(new XAttribute("InheritTabColor", inheritance.TabColor.ToString().ToLowerInvariant()));
if (inheritance.ConnectionFrameColor)
element.Add(new XAttribute("InheritConnectionFrameColor", inheritance.ConnectionFrameColor.ToString().ToLowerInvariant()));
if (inheritance.Password)
element.Add(new XAttribute("InheritPassword", inheritance.Password.ToString().ToLowerInvariant()));
if (inheritance.Port)
@@ -251,6 +263,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(new XAttribute("InheritMacAddress", inheritance.MacAddress.ToString().ToLowerInvariant()));
if (inheritance.UserField)
element.Add(new XAttribute("InheritUserField", inheritance.UserField.ToString().ToLowerInvariant()));
if (inheritance.EnvironmentTags)
element.Add(new XAttribute("InheritEnvironmentTags", inheritance.EnvironmentTags.ToString().ToLowerInvariant()));
if (inheritance.Favorite)
element.Add(new XAttribute("InheritFavorite", inheritance.Favorite.ToString().ToLowerInvariant()));
if (inheritance.ExtApp)

View File

@@ -119,8 +119,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
private void InitializeRootNode(XmlElement connectionsRootElement)
{
string rootNodeName = connectionsRootElement?.Attributes["Name"]?.Value.Trim();
_rootNodeInfo.Name = rootNodeName;
_rootNodeInfo.Name = connectionsRootElement?.Attributes["Name"]?.Value.Trim();
}
private void CreateDecryptor(RootNodeInfo rootNodeInfo, XmlElement connectionsRootElement = null)
@@ -328,6 +327,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
connectionInfo.Inheritance.DisplayWallpaper = xmlnode.GetAttributeAsBool("InheritDisplayWallpaper");
connectionInfo.Inheritance.Icon = xmlnode.GetAttributeAsBool("InheritIcon");
connectionInfo.Inheritance.Panel = xmlnode.GetAttributeAsBool("InheritPanel");
connectionInfo.Inheritance.TabColor = xmlnode.GetAttributeAsBool("InheritTabColor");
connectionInfo.Inheritance.ConnectionFrameColor = xmlnode.GetAttributeAsBool("InheritConnectionFrameColor");
connectionInfo.Inheritance.Port = xmlnode.GetAttributeAsBool("InheritPort");
connectionInfo.Inheritance.Protocol = xmlnode.GetAttributeAsBool("InheritProtocol");
connectionInfo.Inheritance.PuttySession = xmlnode.GetAttributeAsBool("InheritPuttySession");
@@ -350,6 +351,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
connectionInfo.Icon = xmlnode.GetAttributeAsString("Icon");
connectionInfo.Panel = xmlnode.GetAttributeAsString("Panel");
connectionInfo.TabColor = xmlnode.GetAttributeAsString("TabColor");
connectionInfo.ConnectionFrameColor = xmlnode.GetAttributeAsEnum<ConnectionFrameColor>("ConnectionFrameColor");
}
else
{
@@ -515,6 +518,9 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
connectionInfo.UserViaAPI = xmlnode.GetAttributeAsString("UserViaAPI");
connectionInfo.Inheritance.UserViaAPI = xmlnode.GetAttributeAsBool("InheritUserViaAPI");
connectionInfo.ExternalAddressProvider = xmlnode.GetAttributeAsEnum("ExternalAddressProvider", ExternalAddressProvider.None);
connectionInfo.VaultOpenbaoMount = xmlnode.GetAttributeAsString("VaultOpenbaoMount");
connectionInfo.VaultOpenbaoRole = xmlnode.GetAttributeAsString("VaultOpenbaoRole");
connectionInfo.VaultOpenbaoSecretEngine = xmlnode.GetAttributeAsEnum("VaultOpenbaoSecretEngine", VaultOpenbaoSecretEngine.Kv);
connectionInfo.EC2InstanceId = xmlnode.GetAttributeAsString("EC2InstanceId");
connectionInfo.EC2Region = xmlnode.GetAttributeAsString("EC2Region");
connectionInfo.UseRestrictedAdmin = xmlnode.GetAttributeAsBool("UseRestrictedAdmin");
@@ -533,6 +539,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
connectionInfo.RedirectDiskDrives = xmlnode.GetAttributeAsEnum<RDPDiskDrives>("RedirectDiskDrives");
connectionInfo.RedirectDiskDrivesCustom = xmlnode.GetAttributeAsString("RedirectDiskDrivesCustom");
connectionInfo.Inheritance.RedirectDiskDrivesCustom = xmlnode.GetAttributeAsBool("InheritRedirectDiskDrivesCustom");
connectionInfo.EnvironmentTags = xmlnode.GetAttributeAsString("EnvironmentTags");
connectionInfo.Inheritance.EnvironmentTags = xmlnode.GetAttributeAsBool("InheritEnvironmentTags");
break;
case >= 0.5:

View File

@@ -28,7 +28,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
private XAttribute CreateProtectedAttribute(RootNodeInfo rootNodeInfo, ICryptographyProvider cryptographyProvider)
{
XAttribute attribute = new(XName.Get("Protected"), "");
string plainText = rootNodeInfo.Password ? "ThisIsProtected" : "ThisIsNotProtected";
string plainText = (rootNodeInfo.PasswordString != rootNodeInfo.DefaultPassword) ? "ThisIsProtected" : "ThisIsNotProtected";
System.Security.SecureString encryptionPassword = rootNodeInfo.PasswordString.ConvertToSecureString();
attribute.Value = cryptographyProvider.Encrypt(plainText, encryptionPassword);
return attribute;

View File

@@ -10,6 +10,7 @@ using mRemoteNG.Tools;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNG.Resources.Language;
using mRemoteNG.Security;
using System.Runtime.Versioning;
namespace mRemoteNG.Config.Serializers.MiscSerializers
@@ -17,9 +18,48 @@ namespace mRemoteNG.Config.Serializers.MiscSerializers
[SupportedOSPlatform("windows")]
public class ActiveDirectoryDeserializer(string ldapPath, bool importSubOu)
{
private readonly string _ldapPath = ldapPath.ThrowIfNullOrEmpty(nameof(ldapPath));
private readonly string _ldapPath = SanitizeLdapPath(ldapPath.ThrowIfNullOrEmpty(nameof(ldapPath)));
private readonly bool _importSubOu = importSubOu;
private static string SanitizeLdapPath(string ldapPath)
{
// Validate the LDAP path format
if (!LdapPathSanitizer.IsValidDistinguishedNameFormat(ldapPath))
{
throw new ArgumentException("Invalid LDAP path format", nameof(ldapPath));
}
// For LDAP paths (URIs like LDAP://...), we need to sanitize the DN portion
// If it starts with LDAP:// or LDAPS://, extract and sanitize the DN part
if (ldapPath.StartsWith("LDAP://", StringComparison.OrdinalIgnoreCase) ||
ldapPath.StartsWith("LDAPS://", StringComparison.OrdinalIgnoreCase))
{
int schemeEndIndex = ldapPath.IndexOf("://", StringComparison.OrdinalIgnoreCase) + 3;
if (schemeEndIndex < ldapPath.Length)
{
// Find the server/domain part (before the first /)
int pathStartIndex = ldapPath.IndexOf('/', schemeEndIndex);
if (pathStartIndex > 0)
{
string scheme = ldapPath.Substring(0, schemeEndIndex);
string serverPart = ldapPath.Substring(schemeEndIndex, pathStartIndex - schemeEndIndex);
string dnPart = ldapPath.Substring(pathStartIndex + 1);
// Sanitize the DN part
string sanitizedDn = LdapPathSanitizer.SanitizeDistinguishedName(dnPart);
return scheme + serverPart + "/" + sanitizedDn;
}
}
// If no DN part found, return the path as-is (just the server)
return ldapPath;
}
else
{
// For plain DN strings, sanitize directly
return LdapPathSanitizer.SanitizeDistinguishedName(ldapPath);
}
}
public ConnectionTreeModel Deserialize()
{
ConnectionTreeModel connectionTreeModel = new();

View File

@@ -61,6 +61,10 @@ namespace mRemoteNG.Config.Serializers.MiscSerializers
if (host.Vnc)
finalProtocol = ProtocolType.VNC;
break;
case ProtocolType.ARD:
if (host.Vnc)
finalProtocol = ProtocolType.ARD;
break;
default:
protocolValid = false;
break;

View File

@@ -63,7 +63,7 @@ namespace mRemoteNG.Config.Settings
}
}
private IDockContent GetContentFromPersistString(string persistString)
private IDockContent? GetContentFromPersistString(string persistString)
{
// pnlLayout.xml persistence XML fix for refactoring to mRemoteNG
if (persistString.StartsWith("mRemote."))
@@ -72,13 +72,13 @@ namespace mRemoteNG.Config.Settings
try
{
if (persistString == typeof(ConfigWindow).ToString())
return App.Windows.ConfigForm;
return AppWindows.ConfigForm;
if (persistString == typeof(ConnectionTreeWindow).ToString())
return App.Windows.TreeForm;
return AppWindows.TreeForm;
if (persistString == typeof(ErrorAndInfoWindow).ToString())
return App.Windows.ErrorsForm;
return AppWindows.ErrorsForm;
}
catch (Exception ex)
{

View File

@@ -48,6 +48,11 @@ namespace mRemoteNG.Config.Settings.Registry
/// </summary>
public WinRegistryEntry<string> StartUpPanelName { get; private set; }
/// <summary>
/// Specifies whether Connections and Config panels are bound together when auto-hidden.
/// </summary>
public WinRegistryEntry<bool> BindConnectionsAndConfigPanels { get; private set; }
public OptRegistryTabsPanelsPage()
{
RegistryHive hive = WindowsRegistryInfo.Hive;
@@ -61,6 +66,7 @@ namespace mRemoteNG.Config.Settings.Registry
AlwaysShowPanelSelectionDlg = new WinRegistryEntry<bool>(hive, subKey, nameof(AlwaysShowPanelSelectionDlg)).Read();
CreateEmptyPanelOnStartUp = new WinRegistryEntry<bool>(hive, subKey, nameof(CreateEmptyPanelOnStartUp)).Read();
StartUpPanelName = new WinRegistryEntry<string>(hive, subKey, nameof(StartUpPanelName)).Read();
BindConnectionsAndConfigPanels = new WinRegistryEntry<bool>(hive, subKey, nameof(BindConnectionsAndConfigPanels)).Read();
SetupValidation();
Apply();
@@ -87,6 +93,7 @@ namespace mRemoteNG.Config.Settings.Registry
ApplyAlwaysShowPanelSelectionDlg();
ApplyCreateEmptyPanelOnStartUp();
ApplyStartUpPanelName();
ApplyBindConnectionsAndConfigPanels();
}
private void ApplyAlwaysShowPanelTabs()
@@ -136,5 +143,11 @@ namespace mRemoteNG.Config.Settings.Registry
if (StartUpPanelName.IsSet)
Properties.OptionsTabsPanelsPage.Default.StartUpPanelName = StartUpPanelName.Value;
}
private void ApplyBindConnectionsAndConfigPanels()
{
if (BindConnectionsAndConfigPanels.IsSet)
Properties.OptionsTabsPanelsPage.Default.BindConnectionsAndConfigPanels = BindConnectionsAndConfigPanels.Value;
}
}
}

View File

@@ -55,7 +55,6 @@ namespace mRemoteNG.Config.Settings
SetShowSystemTrayIcon();
SetAutoSave();
LoadExternalAppsFromXml();
SetAlwaysShowPanelTabs();
if (Properties.App.Default.ResetToolbars)
SetToolbarsDefault();
@@ -68,12 +67,6 @@ namespace mRemoteNG.Config.Settings
}
}
private static void SetAlwaysShowPanelTabs()
{
if (Properties.OptionsTabsPanelsPage.Default.AlwaysShowPanelTabs)
FrmMain.Default.pnlDock.DocumentStyle = DocumentStyle.DockingWindow;
}
private void SetSupportedCulture()
{

View File

@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Connection.Protocol.Http;
using mRemoteNG.Connection.Protocol.RDP;
@@ -22,6 +23,9 @@ namespace mRemoteNG.Connection
private string _description;
private string _icon;
private string _panel;
private string _color;
private string _tabColor;
private ConnectionFrameColor _connectionFrameColor;
private string _hostname;
private ExternalAddressProvider _externalAddressProvider;
@@ -32,6 +36,9 @@ namespace mRemoteNG.Connection
private string _username = "";
//private SecureString _password = null;
private string _password = null;
private string _vaultRole = null;
private string _vaultMount = null;
private VaultOpenbaoSecretEngine _vaultSecretEngine = VaultOpenbaoSecretEngine.Kv;
private string _domain = "";
private string _vmId = "";
private bool _useEnhancedMode;
@@ -94,6 +101,7 @@ namespace mRemoteNG.Connection
private string _macAddress;
private string _openingCommand;
private string _userField;
private string _environmentTags = "";
private string _rdpStartProgram;
private string _rdpStartProgramWorkDir;
private bool _favorite;
@@ -153,6 +161,38 @@ namespace mRemoteNG.Connection
set => SetField(ref _panel, value, "Panel");
}
[LocalizedAttributes.LocalizedCategory(nameof(Language.Display)),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.Color)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionColor)),
Editor(typeof(System.Drawing.Design.ColorEditor), typeof(System.Drawing.Design.UITypeEditor)),
TypeConverter(typeof(MiscTools.TabColorConverter))]
public virtual string Color
{
get => GetPropertyValue("Color", _color);
set => SetField(ref _color, value, "Color");
}
[LocalizedAttributes.LocalizedCategory(nameof(Language.Display)),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.TabColor)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionTabColor)),
Editor(typeof(System.Drawing.Design.ColorEditor), typeof(System.Drawing.Design.UITypeEditor)),
TypeConverter(typeof(MiscTools.TabColorConverter))]
public virtual string TabColor
{
get => GetPropertyValue("TabColor", _tabColor);
set => SetField(ref _tabColor, value, "TabColor");
}
[LocalizedAttributes.LocalizedCategory(nameof(Language.Display)),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.ConnectionFrameColor)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionConnectionFrameColor)),
TypeConverter(typeof(MiscTools.EnumTypeConverter))]
public virtual ConnectionFrameColor ConnectionFrameColor
{
get => GetPropertyValue("ConnectionFrameColor", _connectionFrameColor);
set => SetField(ref _connectionFrameColor, value, "ConnectionFrameColor");
}
#endregion
#region Connection
@@ -203,7 +243,7 @@ namespace mRemoteNG.Connection
[LocalizedAttributes.LocalizedCategory(nameof(Language.Connection), 2),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.Username)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionUsername)),
AttributeUsedInProtocol(ProtocolType.RDP, ProtocolType.SSH1, ProtocolType.SSH2, ProtocolType.HTTP, ProtocolType.HTTPS)]
AttributeUsedInProtocol(ProtocolType.RDP, ProtocolType.SSH1, ProtocolType.SSH2, ProtocolType.HTTP, ProtocolType.HTTPS, ProtocolType.IntApp)]
public virtual string Username
{
get => GetPropertyValue("Username", _username);
@@ -222,10 +262,40 @@ namespace mRemoteNG.Connection
set => SetField(ref _password, value, "Password");
}
[LocalizedAttributes.LocalizedCategory(nameof(Language.Connection), 2),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.VaultOpenbaoMount)),
LocalizedAttributes.LocalizedDescription(nameof(Language.VaultOpenbaoMountDescription)),
AttributeUsedInProtocol(ProtocolType.RDP, ProtocolType.SSH1, ProtocolType.SSH2)]
public virtual string VaultOpenbaoMount {
get => GetPropertyValue("VaultOpenbaoMount", _vaultMount);
set => SetField(ref _vaultMount, value, "VaultOpenbaoMount");
}
[LocalizedAttributes.LocalizedCategory(nameof(Language.Connection), 2),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.VaultOpenbaoRole)),
LocalizedAttributes.LocalizedDescription(nameof(Language.VaultOpenbaoRoleDescription)),
AttributeUsedInProtocol(ProtocolType.RDP, ProtocolType.SSH1, ProtocolType.SSH2)]
public virtual string VaultOpenbaoRole {
get => GetPropertyValue("VaultOpenbaoRole", _vaultRole);
set => SetField(ref _vaultRole, value, "VaultOpenbaoRole");
}
// external credential provider selector
[LocalizedAttributes.LocalizedCategory(nameof(Language.Connection), 2),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.VaultOpenbaoSecretEngine)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionVaultOpenbaoSecretEngine)),
TypeConverter(typeof(MiscTools.EnumTypeConverter)),
AttributeUsedInProtocol(ProtocolType.RDP, ProtocolType.SSH1, ProtocolType.SSH2)]
public VaultOpenbaoSecretEngine VaultOpenbaoSecretEngine {
get => GetPropertyValue("VaultOpenbaoSecretEngine", _vaultSecretEngine);
set => SetField(ref _vaultSecretEngine, value, "VaultOpenbaoSecretEngine");
}
[LocalizedAttributes.LocalizedCategory(nameof(Language.Connection), 2),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.Domain)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionDomain)),
AttributeUsedInProtocol(ProtocolType.RDP, ProtocolType.IntApp, ProtocolType.PowerShell)]
AttributeUsedInProtocol(ProtocolType.RDP, ProtocolType.IntApp, ProtocolType.PowerShell, ProtocolType.WSL)]
public string Domain
{
get => GetPropertyValue("Domain", _domain).Trim();
@@ -869,6 +939,15 @@ namespace mRemoteNG.Connection
set => SetField(ref _userField, value, "UserField");
}
[LocalizedAttributes.LocalizedCategory(nameof(Language.Miscellaneous), 7),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.EnvironmentTags)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionEnvironmentTags))]
public virtual string EnvironmentTags
{
get => GetPropertyValue("EnvironmentTags", _environmentTags);
set => SetField(ref _environmentTags, value, "EnvironmentTags");
}
[LocalizedAttributes.LocalizedCategory(nameof(Language.Miscellaneous), 7),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.Favorite)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionFavorite)),
@@ -908,7 +987,7 @@ namespace mRemoteNG.Connection
LocalizedAttributes.LocalizedDisplayName(nameof(Language.Compression)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionCompression)),
TypeConverter(typeof(MiscTools.EnumTypeConverter)),
AttributeUsedInProtocol(ProtocolType.VNC),
AttributeUsedInProtocol(ProtocolType.VNC, ProtocolType.ARD),
Browsable(false)]
public ProtocolVNC.Compression VNCCompression
{
@@ -920,7 +999,7 @@ namespace mRemoteNG.Connection
LocalizedAttributes.LocalizedDisplayName(nameof(Language.Encoding)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionEncoding)),
TypeConverter(typeof(MiscTools.EnumTypeConverter)),
AttributeUsedInProtocol(ProtocolType.VNC),
AttributeUsedInProtocol(ProtocolType.VNC, ProtocolType.ARD),
Browsable(false)]
public ProtocolVNC.Encoding VNCEncoding
{
@@ -932,7 +1011,7 @@ namespace mRemoteNG.Connection
LocalizedAttributes.LocalizedDisplayName(nameof(Language.AuthenticationMode)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionAuthenticationMode)),
TypeConverter(typeof(MiscTools.EnumTypeConverter)),
AttributeUsedInProtocol(ProtocolType.VNC),
AttributeUsedInProtocol(ProtocolType.VNC, ProtocolType.ARD),
Browsable(false)]
public ProtocolVNC.AuthMode VNCAuthMode
{
@@ -944,7 +1023,7 @@ namespace mRemoteNG.Connection
LocalizedAttributes.LocalizedDisplayName(nameof(Language.ProxyType)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionVNCProxyType)),
TypeConverter(typeof(MiscTools.EnumTypeConverter)),
AttributeUsedInProtocol(ProtocolType.VNC),
AttributeUsedInProtocol(ProtocolType.VNC, ProtocolType.ARD),
Browsable(false)]
public ProtocolVNC.ProxyType VNCProxyType
{
@@ -955,7 +1034,7 @@ namespace mRemoteNG.Connection
[LocalizedAttributes.LocalizedCategory(nameof(Language.Proxy), 7),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.ProxyAddress)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionVNCProxyAddress)),
AttributeUsedInProtocol(ProtocolType.VNC),
AttributeUsedInProtocol(ProtocolType.VNC, ProtocolType.ARD),
Browsable(false)]
public string VNCProxyIP
{
@@ -966,7 +1045,7 @@ namespace mRemoteNG.Connection
[LocalizedAttributes.LocalizedCategory(nameof(Language.Proxy), 7),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.ProxyPort)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionVNCProxyPort)),
AttributeUsedInProtocol(ProtocolType.VNC),
AttributeUsedInProtocol(ProtocolType.VNC, ProtocolType.ARD),
Browsable(false)]
public int VNCProxyPort
{
@@ -977,7 +1056,7 @@ namespace mRemoteNG.Connection
[LocalizedAttributes.LocalizedCategory(nameof(Language.Proxy), 7),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.ProxyUsername)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionVNCProxyUsername)),
AttributeUsedInProtocol(ProtocolType.VNC),
AttributeUsedInProtocol(ProtocolType.VNC, ProtocolType.ARD),
Browsable(false)]
public string VNCProxyUsername
{
@@ -989,7 +1068,7 @@ namespace mRemoteNG.Connection
LocalizedAttributes.LocalizedDisplayName(nameof(Language.ProxyPassword)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionVNCProxyPassword)),
PasswordPropertyText(true),
AttributeUsedInProtocol(ProtocolType.VNC),
AttributeUsedInProtocol(ProtocolType.VNC, ProtocolType.ARD),
Browsable(false)]
public string VNCProxyPassword
{
@@ -1001,7 +1080,7 @@ namespace mRemoteNG.Connection
LocalizedAttributes.LocalizedDisplayName(nameof(Language.Colors)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionColors)),
TypeConverter(typeof(MiscTools.EnumTypeConverter)),
AttributeUsedInProtocol(ProtocolType.VNC),
AttributeUsedInProtocol(ProtocolType.VNC, ProtocolType.ARD),
Browsable(false)]
public ProtocolVNC.Colors VNCColors
{
@@ -1013,7 +1092,7 @@ namespace mRemoteNG.Connection
LocalizedAttributes.LocalizedDisplayName(nameof(Language.SmartSizeMode)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionSmartSizeMode)),
TypeConverter(typeof(MiscTools.EnumTypeConverter)),
AttributeUsedInProtocol(ProtocolType.VNC)]
AttributeUsedInProtocol(ProtocolType.VNC, ProtocolType.ARD)]
public ProtocolVNC.SmartSizeMode VNCSmartSizeMode
{
get => GetPropertyValue("VNCSmartSizeMode", _vncSmartSizeMode);
@@ -1024,7 +1103,7 @@ namespace mRemoteNG.Connection
LocalizedAttributes.LocalizedDisplayName(nameof(Language.ViewOnly)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionViewOnly)),
TypeConverter(typeof(MiscTools.YesNoTypeConverter)),
AttributeUsedInProtocol(ProtocolType.VNC)]
AttributeUsedInProtocol(ProtocolType.VNC, ProtocolType.ARD)]
public bool VNCViewOnly
{
get => GetPropertyValue("VNCViewOnly", _vncViewOnly);

View File

@@ -0,0 +1,26 @@
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection
{
public enum ConnectionFrameColor
{
[LocalizedAttributes.LocalizedDescription(nameof(Language.FrameColorNone))]
None = 0,
[LocalizedAttributes.LocalizedDescription(nameof(Language.FrameColorRed))]
Red = 1,
[LocalizedAttributes.LocalizedDescription(nameof(Language.FrameColorYellow))]
Yellow = 2,
[LocalizedAttributes.LocalizedDescription(nameof(Language.FrameColorGreen))]
Green = 3,
[LocalizedAttributes.LocalizedDescription(nameof(Language.FrameColorBlue))]
Blue = 4,
[LocalizedAttributes.LocalizedDescription(nameof(Language.FrameColorPurple))]
Purple = 5
}
}

View File

@@ -5,8 +5,11 @@ using System.Linq;
using System.Reflection;
using mRemoteNG.App;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Connection.Protocol.ARD;
using mRemoteNG.Connection.Protocol.Http;
using mRemoteNG.Connection.Protocol.PowerShell;
using mRemoteNG.Connection.Protocol.Terminal;
using mRemoteNG.Connection.Protocol.WSL;
using mRemoteNG.Connection.Protocol.RAW;
using mRemoteNG.Connection.Protocol.RDP;
using mRemoteNG.Connection.Protocol.Rlogin;
@@ -254,6 +257,8 @@ namespace mRemoteNG.Connection
return (int)RdpProtocol.Defaults.Port;
case ProtocolType.VNC:
return (int)ProtocolVNC.Defaults.Port;
case ProtocolType.ARD:
return (int)ProtocolARD.Defaults.Port;
case ProtocolType.SSH1:
return (int)ProtocolSSH1.Defaults.Port;
case ProtocolType.SSH2:
@@ -270,6 +275,10 @@ namespace mRemoteNG.Connection
return (int)ProtocolHTTPS.Defaults.Port;
case ProtocolType.PowerShell:
return (int)ProtocolPowerShell.Defaults.Port;
case ProtocolType.WSL:
return (int)ProtocolWSL.Defaults.Port;
case ProtocolType.Terminal:
return (int)ProtocolTerminal.Defaults.Port;
case ProtocolType.IntApp:
return (int)IntegratedProgram.Defaults.Port;
}
@@ -289,6 +298,9 @@ namespace mRemoteNG.Connection
Description = Settings.Default.ConDefaultDescription;
Icon = Settings.Default.ConDefaultIcon;
Panel = Language.General;
Color = string.Empty;
TabColor = string.Empty;
ConnectionFrameColor = ConnectionFrameColor.None;
}
private void SetConnectionDefaults()
@@ -373,6 +385,7 @@ namespace mRemoteNG.Connection
PostExtApp = Settings.Default.ConDefaultPostExtApp;
MacAddress = Settings.Default.ConDefaultMacAddress;
UserField = Settings.Default.ConDefaultUserField;
EnvironmentTags = Settings.Default.ConDefaultEnvironmentTags;
Favorite = Settings.Default.ConDefaultFavorite;
RDPStartProgram = Settings.Default.ConDefaultRDPStartProgram;
RDPStartProgramWorkDir = Settings.Default.ConDefaultRDPStartProgramWorkDir;

View File

@@ -50,6 +50,24 @@ namespace mRemoteNG.Connection
TypeConverter(typeof(MiscTools.YesNoTypeConverter))]
public bool Panel { get; set; }
[LocalizedAttributes.LocalizedCategory(nameof(Language.Display), 2),
LocalizedAttributes.LocalizedDisplayNameInherit(nameof(Language.Color)),
LocalizedAttributes.LocalizedDescriptionInherit(nameof(Language.PropertyDescriptionColor)),
TypeConverter(typeof(MiscTools.YesNoTypeConverter))]
public bool Color { get; set; }
[LocalizedAttributes.LocalizedCategory(nameof(Language.Display), 2),
LocalizedAttributes.LocalizedDisplayNameInherit(nameof(Language.TabColor)),
LocalizedAttributes.LocalizedDescriptionInherit(nameof(Language.PropertyDescriptionTabColor)),
TypeConverter(typeof(MiscTools.YesNoTypeConverter))]
public bool TabColor { get; set; }
[LocalizedAttributes.LocalizedCategory(nameof(Language.Display), 2),
LocalizedAttributes.LocalizedDisplayNameInherit(nameof(Language.ConnectionFrameColor)),
LocalizedAttributes.LocalizedDescriptionInherit(nameof(Language.PropertyDescriptionConnectionFrameColor)),
TypeConverter(typeof(MiscTools.YesNoTypeConverter))]
public bool ConnectionFrameColor { get; set; }
#endregion
#region Connection
@@ -439,6 +457,12 @@ namespace mRemoteNG.Connection
TypeConverter(typeof(MiscTools.YesNoTypeConverter))]
public bool UserField { get; set; }
[LocalizedAttributes.LocalizedCategory(nameof(Language.Miscellaneous), 8),
LocalizedAttributes.LocalizedDisplayNameInherit(nameof(Language.EnvironmentTags)),
LocalizedAttributes.LocalizedDescriptionInherit(nameof(Language.PropertyDescriptionEnvironmentTags)),
TypeConverter(typeof(MiscTools.YesNoTypeConverter))]
public bool EnvironmentTags { get; set; }
[LocalizedAttributes.LocalizedCategory(nameof(Language.Miscellaneous), 8),
LocalizedAttributes.LocalizedDisplayNameInherit(nameof(Language.Favorite)),
LocalizedAttributes.LocalizedDescriptionInherit(nameof(Language.PropertyDescriptionFavorite)),

View File

@@ -320,7 +320,8 @@ namespace mRemoteNG.Connection
ConnectionWindow connectionForm = conForm ?? Runtime.WindowList.FromString(connectionPanel) as ConnectionWindow;
if (connectionForm == null)
connectionForm = _panelAdder.AddPanel(connectionPanel);
// Don't show the panel immediately - it will be shown when first tab is added
connectionForm = _panelAdder.AddPanel(connectionPanel, showImmediately: false);
else
connectionForm.Show(FrmMain.Default.pnlDock);
@@ -464,4 +465,4 @@ namespace mRemoteNG.Connection
#endregion
}
}
}

View File

@@ -12,7 +12,12 @@ namespace mRemoteNG.Connection
DelineaSecretServer = 1,
[LocalizedAttributes.LocalizedDescription(nameof(Language.ECPClickstudiosPasswordstate))]
ClickstudiosPasswordState = 2
ClickstudiosPasswordState = 2,
[LocalizedAttributes.LocalizedDescription(nameof(Language.ECPOnePassword))]
OnePassword = 3,
[LocalizedAttributes.LocalizedDescription(nameof(Language.VaultOpenbao))]
VaultOpenbao = 4,
}
}

View File

@@ -32,6 +32,12 @@ namespace mRemoteNG.Connection
Size = Parent.Size;
Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
InitializeComponent();
// Enable custom painting for border
this.Paint += InterfaceControl_Paint;
// Set padding to prevent content from covering the frame border
UpdatePaddingForFrameColor();
}
catch (Exception ex)
{
@@ -41,6 +47,57 @@ namespace mRemoteNG.Connection
}
}
private void InterfaceControl_Paint(object sender, PaintEventArgs e)
{
// Draw colored border based on ConnectionFrameColor property
if (Info?.ConnectionFrameColor != null && Info.ConnectionFrameColor != ConnectionFrameColor.None)
{
Color frameColor = GetFrameColor(Info.ConnectionFrameColor);
int borderWidth = 4; // 4 pixel border for visibility
using (Pen pen = new Pen(frameColor, borderWidth))
{
// Draw border inside the control bounds
Rectangle rect = new Rectangle(
borderWidth / 2,
borderWidth / 2,
this.Width - borderWidth,
this.Height - borderWidth
);
e.Graphics.DrawRectangle(pen, rect);
}
}
}
private void UpdatePaddingForFrameColor()
{
// Add padding to prevent content from covering the frame border
if (Info?.ConnectionFrameColor != null && Info.ConnectionFrameColor != ConnectionFrameColor.None)
{
int borderWidth = 4; // Must match the border width in InterfaceControl_Paint
// Add 2px margin so the border is fully visible and not covered by child controls
int padding = borderWidth / 2 + 2;
this.Padding = new Padding(padding);
}
else
{
this.Padding = new Padding(0);
}
}
private Color GetFrameColor(ConnectionFrameColor frameColor)
{
return frameColor switch
{
ConnectionFrameColor.Red => Color.FromArgb(220, 53, 69), // Bootstrap danger red
ConnectionFrameColor.Yellow => Color.FromArgb(255, 193, 7), // Warning yellow
ConnectionFrameColor.Green => Color.FromArgb(40, 167, 69), // Success green
ConnectionFrameColor.Blue => Color.FromArgb(0, 123, 255), // Primary blue
ConnectionFrameColor.Purple => Color.FromArgb(111, 66, 193), // Purple
_ => Color.Transparent
};
}
public static InterfaceControl FindInterfaceControl(DockPanel DockPnl)
{
// instead of repeating the code, call the routine using ConnectionTab if called by DockPanel

View File

@@ -0,0 +1,19 @@
using System;
using System.Runtime.Versioning;
using mRemoteNG.Connection.Protocol.VNC;
namespace mRemoteNG.Connection.Protocol.ARD
{
[SupportedOSPlatform("windows")]
public class ProtocolARD : ProtocolVNC
{
public ProtocolARD()
{
}
public new enum Defaults
{
Port = 5900
}
}
}

View File

@@ -0,0 +1,457 @@
using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Runtime.Versioning;
using System.Threading;
using System.Windows.Forms;
using mRemoteNG.App;
using mRemoteNG.Messages;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.AnyDesk
{
[SupportedOSPlatform("windows")]
public class ProtocolAnyDesk : ProtocolBase
{
#region Private Fields
private IntPtr _handle;
private readonly ConnectionInfo _connectionInfo;
private Process _process;
private const string DefaultAnydeskPath = @"C:\Program Files (x86)\AnyDesk\AnyDesk.exe";
private const string AlternateAnydeskPath = @"C:\Program Files\AnyDesk\AnyDesk.exe";
#endregion
#region Constructor
public ProtocolAnyDesk(ConnectionInfo connectionInfo)
{
_connectionInfo = connectionInfo;
}
#endregion
#region Public Methods
public override bool Initialize()
{
return base.Initialize();
}
public override bool Connect()
{
try
{
Runtime.MessageCollector?.AddMessage(MessageClass.InformationMsg,
"Attempting to start AnyDesk connection.", true);
// Validate AnyDesk installation
string anydeskPath = FindAnydeskExecutable();
if (string.IsNullOrEmpty(anydeskPath))
{
Runtime.MessageCollector?.AddMessage(MessageClass.ErrorMsg,
"AnyDesk is not installed. Please install AnyDesk to use this protocol.", true);
return false;
}
// Validate the executable path to prevent command injection
Tools.PathValidator.ValidateExecutablePathOrThrow(anydeskPath, nameof(anydeskPath));
// Validate connection info
if (string.IsNullOrEmpty(_connectionInfo.Hostname))
{
Runtime.MessageCollector?.AddMessage(MessageClass.ErrorMsg,
"AnyDesk ID is required in the Hostname field.", true);
return false;
}
// Start AnyDesk connection
if (!StartAnydeskConnection(anydeskPath))
{
return false;
}
return true;
}
catch (Exception ex)
{
Runtime.MessageCollector?.AddExceptionMessage(Language.ConnectionFailed, ex);
return false;
}
}
public override void Focus()
{
try
{
if (_handle != IntPtr.Zero)
{
NativeMethods.SetForegroundWindow(_handle);
}
}
catch (Exception ex)
{
Runtime.MessageCollector?.AddExceptionMessage(Language.IntAppFocusFailed, ex);
}
}
protected override void Resize(object sender, EventArgs e)
{
try
{
if (_handle == IntPtr.Zero || InterfaceControl.Size == Size.Empty)
return;
// Use ClientRectangle to account for padding (for connection frame color)
Rectangle clientRect = InterfaceControl.ClientRectangle;
NativeMethods.MoveWindow(_handle,
clientRect.X - SystemInformation.FrameBorderSize.Width,
clientRect.Y - (SystemInformation.CaptionHeight + SystemInformation.FrameBorderSize.Height),
clientRect.Width + SystemInformation.FrameBorderSize.Width * 2,
clientRect.Height + SystemInformation.CaptionHeight +
SystemInformation.FrameBorderSize.Height * 2, true);
}
catch (Exception ex)
{
Runtime.MessageCollector?.AddExceptionMessage(Language.IntAppResizeFailed, ex);
}
}
public override void Close()
{
try
{
// Try to close all AnyDesk processes related to this connection
if (_process != null)
{
try
{
if (!_process.HasExited)
{
_process.Kill();
}
}
catch (Exception ex)
{
Runtime.MessageCollector?.AddExceptionMessage(Language.IntAppKillFailed, ex);
}
finally
{
_process?.Dispose();
_process = null;
}
}
// Also try to close by window handle if we have it
if (_handle != IntPtr.Zero)
{
try
{
NativeMethods.SendMessage(_handle, 0x0010, IntPtr.Zero, IntPtr.Zero); // WM_CLOSE
}
catch
{
// Ignore errors when closing by handle
}
_handle = IntPtr.Zero;
}
}
catch (Exception ex)
{
Runtime.MessageCollector?.AddExceptionMessage("Error closing AnyDesk connection.", ex);
}
base.Close();
}
#endregion
#region Private Methods
private string FindAnydeskExecutable()
{
// Check common installation paths
if (File.Exists(DefaultAnydeskPath))
{
return DefaultAnydeskPath;
}
if (File.Exists(AlternateAnydeskPath))
{
return AlternateAnydeskPath;
}
// Check if it's in PATH
string pathVariable = Environment.GetEnvironmentVariable("PATH");
if (pathVariable != null)
{
var paths = pathVariable.Split(Path.PathSeparator);
foreach (var path in paths)
{
var exePath = Path.Combine(path.Trim(), "AnyDesk.exe");
if (File.Exists(exePath))
{
return exePath;
}
}
}
return null;
}
private bool StartAnydeskConnection(string anydeskPath)
{
try
{
// Build AnyDesk arguments
// Format: AnyDesk.exe [ID|alias@ad] [options]
// Hostname field contains the AnyDesk ID (e.g., 123456789 or alias@ad)
// Username field is optional and not used in the CLI (reserved for future use)
// Password field is piped via stdin when --with-password flag is used
string anydeskId = _connectionInfo.Hostname.Trim();
// Validate AnyDesk ID to prevent command injection
// AnyDesk IDs are numeric or alphanumeric with @ and - characters for aliases
if (!IsValidAnydeskId(anydeskId))
{
Runtime.MessageCollector?.AddMessage(MessageClass.ErrorMsg,
"Invalid AnyDesk ID format. Only alphanumeric characters, @, -, _, and . are allowed.", true);
return false;
}
string arguments = anydeskId;
// Add --with-password flag if password is provided
bool hasPassword = !string.IsNullOrEmpty(_connectionInfo.Password);
if (hasPassword)
{
arguments += " --with-password";
}
// Add --plain flag to minimize UI (optional)
arguments += " --plain";
Runtime.MessageCollector?.AddMessage(MessageClass.InformationMsg,
$"Starting AnyDesk with ID: {anydeskId}", true);
// If password is provided, we need to pipe it to AnyDesk
if (hasPassword)
{
return StartAnydeskWithPassword(anydeskPath, arguments);
}
else
{
return StartAnydeskWithoutPassword(anydeskPath, arguments);
}
}
catch (Exception ex)
{
Runtime.MessageCollector?.AddExceptionMessage("Failed to start AnyDesk connection.", ex);
return false;
}
}
private bool IsValidAnydeskId(string anydeskId)
{
if (string.IsNullOrWhiteSpace(anydeskId))
return false;
// AnyDesk IDs can be:
// - Pure numeric (e.g., 123456789)
// - Alphanumeric with @ for aliases (e.g., alias@ad)
// - May contain hyphens and underscores in aliases
// Reject any characters that could be used for command injection
foreach (char c in anydeskId)
{
if (!char.IsLetterOrDigit(c) && c != '@' && c != '-' && c != '_' && c != '.')
{
return false;
}
}
return true;
}
private bool StartAnydeskWithPassword(string anydeskPath, string arguments)
{
try
{
// Start AnyDesk and pipe the password directly to stdin
// This avoids command injection vulnerabilities from using PowerShell
_process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = anydeskPath,
Arguments = arguments,
UseShellExecute = false,
CreateNoWindow = false,
RedirectStandardOutput = false,
RedirectStandardError = false,
RedirectStandardInput = true
},
EnableRaisingEvents = true
};
_process.Exited += ProcessExited;
_process.Start();
// Write the password to stdin and close the stream
// AnyDesk expects the password on stdin when --with-password is used
try
{
if (_process.StandardInput != null)
{
_process.StandardInput.WriteLine(_connectionInfo.Password);
_process.StandardInput.Close();
}
}
catch (Exception ex)
{
Runtime.MessageCollector?.AddMessage(MessageClass.WarningMsg,
$"Failed to send password to AnyDesk: {ex.Message}", true);
}
// Wait for the AnyDesk window to appear
if (!WaitForAnydeskWindow())
{
Runtime.MessageCollector?.AddMessage(MessageClass.WarningMsg,
"AnyDesk window did not appear within the expected time.", true);
return false;
}
base.Connect();
return true;
}
catch (Exception ex)
{
Runtime.MessageCollector?.AddExceptionMessage("Failed to start AnyDesk with password.", ex);
return false;
}
}
private bool StartAnydeskWithoutPassword(string anydeskPath, string arguments)
{
try
{
_process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = anydeskPath,
Arguments = arguments,
UseShellExecute = false // Changed to false for better security
},
EnableRaisingEvents = true
};
_process.Exited += ProcessExited;
_process.Start();
// Wait for the AnyDesk window to appear
if (!WaitForAnydeskWindow())
{
Runtime.MessageCollector?.AddMessage(MessageClass.WarningMsg,
"AnyDesk window did not appear within the expected time.", true);
return false;
}
base.Connect();
return true;
}
catch (Exception ex)
{
Runtime.MessageCollector?.AddExceptionMessage("Failed to start AnyDesk connection.", ex);
return false;
}
}
private bool WaitForAnydeskWindow()
{
// Wait up to 10 seconds for AnyDesk window to appear
int maxWaitTime = 10000; // 10 seconds
int waitInterval = 100; // 100 ms
int elapsedTime = 0;
while (elapsedTime < maxWaitTime)
{
// Find AnyDesk process by name
Process[] anydeskProcesses = Process.GetProcessesByName("AnyDesk");
Process processToKeep = null;
try
{
foreach (Process anydeskProcess in anydeskProcesses)
{
try
{
anydeskProcess.Refresh();
// Try to get the main window handle
if (anydeskProcess.MainWindowHandle != IntPtr.Zero)
{
_handle = anydeskProcess.MainWindowHandle;
// Store the actual AnyDesk process for later cleanup
// Dispose the PowerShell process if it's different
if (_process != null && _process.ProcessName != "AnyDesk")
{
_process.Exited -= ProcessExited;
_process = anydeskProcess;
_process.EnableRaisingEvents = true;
_process.Exited += ProcessExited;
processToKeep = anydeskProcess;
}
// Try to integrate the window
if (InterfaceControl != null)
{
NativeMethods.SetParent(_handle, InterfaceControl.Handle);
Resize(this, new EventArgs());
}
return true;
}
}
catch
{
// Ignore errors for individual processes
}
}
}
finally
{
foreach (Process anydeskProcess in anydeskProcesses)
{
if (anydeskProcess != processToKeep)
{
anydeskProcess.Dispose();
}
}
}
Thread.Sleep(waitInterval);
elapsedTime += waitInterval;
}
return false;
}
private void ProcessExited(object sender, EventArgs e)
{
Event_Closed(this);
}
#endregion
#region Enumerations
public enum Defaults
{
Port = 0 // AnyDesk doesn't use a traditional port from the client side
}
#endregion
}
}

View File

@@ -8,6 +8,8 @@ using mRemoteNG.UI.Tabs;
using mRemoteNG.Resources.Language;
using System.Runtime.Versioning;
using System.Windows.Forms.VisualStyles;
using System.IO;
using System.Threading.Tasks;
namespace mRemoteNG.Connection.Protocol.Http
@@ -21,6 +23,9 @@ namespace mRemoteNG.Connection.Protocol.Http
private string _tabTitle;
protected string httpOrS;
protected int defaultPort;
private string _userDataFolder;
private CoreWebView2Environment? _webView2Environment;
private Task _webView2InitializationTask;
#endregion
@@ -32,6 +37,14 @@ namespace mRemoteNG.Connection.Protocol.Http
{
if (renderingEngine == RenderingEngine.EdgeChromium)
{
// Create a unique user data folder for each WebView2 instance
// This prevents session sharing between multiple HTTP/HTTPS connections
_userDataFolder = Path.Combine(
Path.GetTempPath(),
"mRemoteNG_WebView2",
Guid.NewGuid().ToString()
);
Control = new Microsoft.Web.WebView2.WinForms.WebView2()
{
Dock = DockStyle.Fill,
@@ -69,6 +82,9 @@ namespace mRemoteNG.Connection.Protocol.Http
{
Microsoft.Web.WebView2.WinForms.WebView2 edge = (Microsoft.Web.WebView2.WinForms.WebView2)_wBrowser;
edge.CoreWebView2InitializationCompleted += Edge_CoreWebView2InitializationCompleted;
// Initialize WebView2 with unique user data folder asynchronously
_webView2InitializationTask = InitializeWebView2Async(edge);
}
else
{
@@ -91,13 +107,66 @@ namespace mRemoteNG.Connection.Protocol.Http
}
}
private async Task InitializeWebView2Async(Microsoft.Web.WebView2.WinForms.WebView2 webView2)
{
try
{
// Create the WebView2 environment with a unique user data folder
_webView2Environment = await CoreWebView2Environment.CreateAsync(null, _userDataFolder);
// Initialize the WebView2 control with the custom environment
await webView2.EnsureCoreWebView2Async(_webView2Environment);
// Prevent popups from opening in new windows
webView2.CoreWebView2.NewWindowRequested += CoreWebView2_NewWindowRequested;
}
catch (Exception ex)
{
Runtime.MessageCollector.AddExceptionStackTrace(Language.HttpSetPropsFailed, ex);
}
}
public override bool Connect()
{
try
{
if (InterfaceControl.Info.RenderingEngine == RenderingEngine.EdgeChromium)
{
((Microsoft.Web.WebView2.WinForms.WebView2)_wBrowser).Source = new Uri(GetUrl());
var webView2 = (Microsoft.Web.WebView2.WinForms.WebView2)_wBrowser;
// Wait for WebView2 initialization to complete before connecting
if (_webView2InitializationTask != null && !_webView2InitializationTask.IsCompleted)
{
// Schedule navigation after initialization completes
_webView2InitializationTask.ContinueWith(t =>
{
if (t.IsCompletedSuccessfully && webView2.CoreWebView2 != null)
{
// Use Invoke to ensure we're on the UI thread
if (webView2.InvokeRequired)
{
webView2.Invoke(new Action(() => webView2.Source = new Uri(GetUrl())));
}
else
{
webView2.Source = new Uri(GetUrl());
}
}
else if (t.IsFaulted)
{
Runtime.MessageCollector.AddExceptionStackTrace(Language.HttpConnectFailed, t.Exception);
}
},
// Use UI thread scheduler if available, otherwise use default
System.Threading.SynchronizationContext.Current != null
? TaskScheduler.FromCurrentSynchronizationContext()
: TaskScheduler.Default);
}
else if (webView2.CoreWebView2 != null)
{
// WebView2 is already initialized, navigate immediately
webView2.Source = new Uri(GetUrl());
}
}
else
{
@@ -214,6 +283,83 @@ namespace mRemoteNG.Connection.Protocol.Http
#endregion
#region Cleanup
public override void Close()
{
try
{
// Wait for initialization to complete before disposing (non-blocking approach)
if (_webView2InitializationTask != null && !_webView2InitializationTask.IsCompleted)
{
// Create a continuation to dispose after initialization completes
var cleanupTask = _webView2InitializationTask.ContinueWith(_ =>
{
DisposeWebView2Environment();
}, TaskScheduler.Default); // Use default scheduler to avoid UI thread issues
// Give it a reasonable time to complete, but don't block indefinitely
// Using a background thread to avoid blocking UI thread
Task.Run(() =>
{
if (!cleanupTask.Wait(TimeSpan.FromSeconds(2)))
{
// Initialization is taking too long, log and continue
Runtime.MessageCollector.AddMessage(mRemoteNG.Messages.MessageClass.WarningMsg,
"WebView2 initialization did not complete in time during cleanup");
}
});
}
else
{
DisposeWebView2Environment();
}
}
catch (Exception ex)
{
Runtime.MessageCollector.AddExceptionStackTrace("Error during HTTPBase cleanup", ex);
}
base.Close();
}
private void DisposeWebView2Environment()
{
try
{
// There is no Dispose method for CoreWebView2Environment, so just set to null
_webView2Environment = null;
// Clean up the temporary user data folder
if (!string.IsNullOrEmpty(_userDataFolder) && Directory.Exists(_userDataFolder))
{
try
{
// Verify the path is within the expected temp directory for safety
string tempPath = Path.GetTempPath();
string fullUserDataPath = Path.GetFullPath(_userDataFolder);
if (fullUserDataPath.StartsWith(Path.GetFullPath(tempPath), StringComparison.OrdinalIgnoreCase) &&
fullUserDataPath.Contains("mRemoteNG_WebView2"))
{
Directory.Delete(_userDataFolder, true);
}
}
catch (Exception ex)
{
// Log but don't throw - cleanup is best effort
Runtime.MessageCollector.AddExceptionStackTrace("Failed to clean up WebView2 user data folder", ex);
}
}
}
catch (Exception ex)
{
Runtime.MessageCollector.AddExceptionStackTrace("Error disposing WebView2 environment", ex);
}
}
#endregion
#region Enums
public enum RenderingEngine

View File

@@ -67,13 +67,21 @@ namespace mRemoteNG.Connection.Protocol
}
ExternalToolArgumentParser argParser = new(_externalTool.ConnectionInfo);
string parsedFileName = argParser.ParseArguments(_externalTool.FileName);
string parsedArguments = argParser.ParseArguments(_externalTool.Arguments);
// Validate the executable path to prevent command injection
PathValidator.ValidateExecutablePathOrThrow(parsedFileName, nameof(_externalTool.FileName));
_process = new Process
{
StartInfo =
{
UseShellExecute = true,
FileName = argParser.ParseArguments(_externalTool.FileName),
Arguments = argParser.ParseArguments(_externalTool.Arguments)
// Use UseShellExecute = false for better security
// Only use true if we need runas for elevation (which IntegratedProgram doesn't use)
UseShellExecute = false,
FileName = parsedFileName,
Arguments = parsedArguments
},
EnableRaisingEvents = true
};
@@ -139,10 +147,13 @@ namespace mRemoteNG.Connection.Protocol
try
{
if (InterfaceControl.Size == Size.Empty) return;
NativeMethods.MoveWindow(_handle, -SystemInformation.FrameBorderSize.Width,
-(SystemInformation.CaptionHeight + SystemInformation.FrameBorderSize.Height),
InterfaceControl.Width + SystemInformation.FrameBorderSize.Width * 2,
InterfaceControl.Height + SystemInformation.CaptionHeight +
// Use ClientRectangle to account for padding (for connection frame color)
Rectangle clientRect = InterfaceControl.ClientRectangle;
NativeMethods.MoveWindow(_handle,
clientRect.X - SystemInformation.FrameBorderSize.Width,
clientRect.Y - (SystemInformation.CaptionHeight + SystemInformation.FrameBorderSize.Height),
clientRect.Width + SystemInformation.FrameBorderSize.Width * 2,
clientRect.Height + SystemInformation.CaptionHeight +
SystemInformation.FrameBorderSize.Height * 2, true);
}
catch (Exception ex)

View File

@@ -229,10 +229,13 @@ namespace mRemoteNG.Connection.Protocol.PowerShell
try
{
if (InterfaceControl.Size == Size.Empty) return;
NativeMethods.MoveWindow(_handle, -SystemInformation.FrameBorderSize.Width,
-(SystemInformation.CaptionHeight + SystemInformation.FrameBorderSize.Height),
InterfaceControl.Width + SystemInformation.FrameBorderSize.Width * 2,
InterfaceControl.Height + SystemInformation.CaptionHeight +
// Use ClientRectangle to account for padding (for connection frame color)
Rectangle clientRect = InterfaceControl.ClientRectangle;
NativeMethods.MoveWindow(_handle,
clientRect.X - SystemInformation.FrameBorderSize.Width,
clientRect.Y - (SystemInformation.CaptionHeight + SystemInformation.FrameBorderSize.Height),
clientRect.Width + SystemInformation.FrameBorderSize.Width * 2,
clientRect.Height + SystemInformation.CaptionHeight +
SystemInformation.FrameBorderSize.Height * 2, true);
}
catch (Exception ex)

View File

@@ -116,9 +116,8 @@ namespace mRemoteNG.Connection.Protocol
Control.Name = Name;
Control.Location = _interfaceControl.Location;
Control.Size = InterfaceControl.Size;
Control.Anchor = _interfaceControl.Anchor;
// Use Dock.Fill to respect padding (e.g., for connection frame color)
Control.Dock = DockStyle.Fill;
_interfaceControl.Controls.Add(Control);
return true;

View File

@@ -5,8 +5,12 @@ using mRemoteNG.Connection.Protocol.Rlogin;
using mRemoteNG.Connection.Protocol.SSH;
using mRemoteNG.Connection.Protocol.Telnet;
using mRemoteNG.Connection.Protocol.VNC;
using mRemoteNG.Connection.Protocol.ARD;
using System;
using mRemoteNG.Connection.Protocol.PowerShell;
using mRemoteNG.Connection.Protocol.WSL;
using mRemoteNG.Connection.Protocol.Terminal;
using mRemoteNG.Connection.Protocol.AnyDesk;
using mRemoteNG.Resources.Language;
using System.Runtime.Versioning;
@@ -28,6 +32,8 @@ namespace mRemoteNG.Connection.Protocol
return rdp;
case ProtocolType.VNC:
return new ProtocolVNC();
case ProtocolType.ARD:
return new ProtocolARD();
case ProtocolType.SSH1:
return new ProtocolSSH1();
case ProtocolType.SSH2:
@@ -44,6 +50,12 @@ namespace mRemoteNG.Connection.Protocol
return new ProtocolHTTPS(connectionInfo.RenderingEngine);
case ProtocolType.PowerShell:
return new ProtocolPowerShell(connectionInfo);
case ProtocolType.WSL:
return new ProtocolWSL(connectionInfo);
case ProtocolType.Terminal:
return new ProtocolTerminal(connectionInfo);
case ProtocolType.AnyDesk:
return new ProtocolAnyDesk(connectionInfo);
case ProtocolType.IntApp:
if (connectionInfo.ExtApp == "")
{

View File

@@ -35,6 +35,18 @@ namespace mRemoteNG.Connection.Protocol
[LocalizedAttributes.LocalizedDescription(nameof(Language.PowerShell))]
PowerShell = 10,
[LocalizedAttributes.LocalizedDescription(nameof(Language.Ard))]
ARD = 11,
[LocalizedAttributes.LocalizedDescription(nameof(Language.Terminal))]
Terminal = 12,
[LocalizedAttributes.LocalizedDescription(nameof(Language.Wsl))]
WSL = 13,
[LocalizedAttributes.LocalizedDescription(nameof(Language.AnyDesk))]
AnyDesk = 14,
[LocalizedAttributes.LocalizedDescription(nameof(Language.ExternalTool))]
IntApp = 20
}
@@ -43,7 +55,7 @@ namespace mRemoteNG.Connection.Protocol
{
public static bool SupportBlankHostname(ProtocolType protocolType)
{
return (protocolType == ProtocolType.IntApp || protocolType == ProtocolType.PowerShell);
return (protocolType == ProtocolType.IntApp || protocolType == ProtocolType.PowerShell || protocolType == ProtocolType.WSL || protocolType == ProtocolType.Terminal);
}
}
}

View File

@@ -5,6 +5,7 @@ using mRemoteNG.Security;
using mRemoteNG.Security.SymmetricEncryption;
using mRemoteNG.Tools;
using mRemoteNG.Tools.Cmdline;
using mRemoteNG.Tree.Root;
using mRemoteNG.UI;
using System;
using System.Diagnostics;
@@ -13,9 +14,11 @@ using System.IO;
using System.IO.Pipes;
using System.Linq;
using System.Runtime.Versioning;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
// ReSharper disable ArrangeAccessorOwnerBody
@@ -81,6 +84,9 @@ namespace mRemoteNG.Connection.Protocol
{
_isPuttyNg = PuttyTypeDetector.GetPuttyType() == PuttyTypeDetector.PuttyType.PuttyNg;
// Validate PuttyPath to prevent command injection
PathValidator.ValidateExecutablePathOrThrow(PuttyPath, nameof(PuttyPath));
PuttyProcess = new Process
{
StartInfo =
@@ -104,7 +110,6 @@ namespace mRemoteNG.Connection.Protocol
string username = InterfaceControl.Info?.Username ?? "";
//string password = InterfaceControl.Info?.Password?.ConvertToUnsecureString() ?? "";
string password = InterfaceControl.Info?.Password ?? "";
string domain = InterfaceControl.Info?.Domain ?? "";
string UserViaAPI = InterfaceControl.Info?.UserViaAPI ?? "";
string privatekey = "";
@@ -113,7 +118,7 @@ namespace mRemoteNG.Connection.Protocol
{
try
{
ExternalConnectors.DSS.SecretServerInterface.FetchSecretFromServer($"{UserViaAPI}", out username, out password, out domain, out privatekey);
ExternalConnectors.DSS.SecretServerInterface.FetchSecretFromServer($"{UserViaAPI}", out username, out password, out _, out privatekey);
if (!string.IsNullOrEmpty(privatekey))
{
@@ -134,7 +139,7 @@ namespace mRemoteNG.Connection.Protocol
{
try
{
ExternalConnectors.CPS.PasswordstateInterface.FetchSecretFromServer($"{UserViaAPI}", out username, out password, out domain, out privatekey);
ExternalConnectors.CPS.PasswordstateInterface.FetchSecretFromServer($"{UserViaAPI}", out username, out password, out _, out privatekey);
if (!string.IsNullOrEmpty(privatekey))
{
@@ -151,7 +156,27 @@ namespace mRemoteNG.Connection.Protocol
Event_ErrorOccured(this, "Passwordstate Interface Error: " + ex.Message, 0);
}
}
else if (InterfaceControl.Info.ExternalCredentialProvider == ExternalCredentialProvider.OnePassword) {
try
{
ExternalConnectors.OP.OnePasswordCli.ReadPassword($"{UserViaAPI}", out username, out password, out _, out privatekey);
}
catch (ExternalConnectors.OP.OnePasswordCliException ex)
{
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, Language.ECPOnePasswordCommandLine + ": " + ex.Arguments);
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.ECPOnePasswordReadFailed + Environment.NewLine + ex.Message);
}
}
else if (InterfaceControl.Info.ExternalCredentialProvider == ExternalCredentialProvider.VaultOpenbao) {
try {
if (InterfaceControl.Info?.VaultOpenbaoSecretEngine == VaultOpenbaoSecretEngine.SSHOTP)
ExternalConnectors.VO.VaultOpenbao.ReadOtpSSH($"{InterfaceControl.Info?.VaultOpenbaoMount}", $"{InterfaceControl.Info?.VaultOpenbaoRole}", $"{InterfaceControl.Info?.Username}", $"{InterfaceControl.Info?.Hostname}", out password);
else
ExternalConnectors.VO.VaultOpenbao.ReadPasswordSSH((int)InterfaceControl.Info?.VaultOpenbaoSecretEngine, InterfaceControl.Info?.VaultOpenbaoMount ?? "", InterfaceControl.Info?.VaultOpenbaoRole ?? "", InterfaceControl.Info?.Username ?? "root", out password);
} catch (ExternalConnectors.VO.VaultOpenbaoException ex) {
Event_ErrorOccured(this, "Secret Server Interface Error: " + ex.Message, 0);
}
}
if (string.IsNullOrEmpty(username))
{
@@ -170,7 +195,7 @@ namespace mRemoteNG.Connection.Protocol
try
{
ExternalConnectors.DSS.SecretServerInterface.FetchSecretFromServer(
$"{Properties.OptionsCredentialsPage.Default.UserViaAPIDefault}", out username, out password, out domain, out privatekey);
$"{Properties.OptionsCredentialsPage.Default.UserViaAPIDefault}", out username, out password, out _, out privatekey);
}
catch (Exception ex)
{
@@ -203,7 +228,7 @@ namespace mRemoteNG.Connection.Protocol
if (!string.IsNullOrEmpty(password))
{
string random = string.Join("", Guid.NewGuid().ToString("n").Take(8).Select(o => o));
string random = string.Join("", Guid.NewGuid().ToString("n").Take(8));
// write data to pipe
Thread thread = new(new ParameterizedThreadStart(CreatePipe));
thread.Start($"{random}{password}");
@@ -213,6 +238,32 @@ namespace mRemoteNG.Connection.Protocol
}
}
if (InterfaceControl.Info.ExternalCredentialProvider == ExternalCredentialProvider.VaultOpenbao && InterfaceControl.Info?.VaultOpenbaoSecretEngine == VaultOpenbaoSecretEngine.SSHOTP) {
if (!_isPuttyNg) {
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "Cannot connect to VaultOpenbao ssh otp without using puttyng to inject authenticator plugin");
return false;
}
arguments.Add("-auth-plugin");
string random = string.Join("", Guid.NewGuid().ToString("n").Take(8));
string pipename = $"mRemoteNGSecretPipe{random}";
arguments.Add($"{App.Info.GeneralAppInfo.HomePath}\\vault-ssh-helper-plugin.exe {username} --pipeName={pipename}");
System.Threading.Tasks.Task.Run(async () => {
using NamedPipeServerStream server = CreatePipeServer(pipename);
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10)).Token;
await server.WaitForConnectionAsync(cts);
using var reader = new StreamReader(server, Utf8NoBom, detectEncodingFromByteOrderMarks: false, bufferSize: 1024, leaveOpen: true);
using var writer = new StreamWriter(server, Utf8NoBom, bufferSize: 1024, leaveOpen: true) { AutoFlush = true };
string? pingMessage = await reader.ReadLineAsync(cts);
if (pingMessage != "ping") throw new FormatException("Invalid ping from VaultOpenbao SSH OTP plugin");
await writer.WriteLineAsync("pong");
string dataRequest = await reader.ReadLineAsync(cts) ?? throw new FormatException("Invalid data request from VaultOpenbao SSH OTP plugin");
var data = DeserializeData(dataRequest);
if (data.Username != username || data.Hostname != InterfaceControl.Info.Hostname || data.Port != InterfaceControl.Info.Port)
throw new FormatException("Mismatched data request from VaultOpenbao SSH OTP plugin");
await writer.WriteLineAsync(password);
}).ConfigureAwait(false);
}
// use private key if specified
if (!string.IsNullOrEmpty(optionalTemporaryPrivateKeyPath))
{
@@ -322,17 +373,22 @@ namespace mRemoteNG.Connection.Protocol
if (_isPuttyNg)
{
// PuTTYNG 0.70.0.1 and later doesn't have any window borders
NativeMethods.MoveWindow(PuttyHandle, 0, 0, InterfaceControl.Width, InterfaceControl.Height, true);
// Use ClientRectangle to account for padding (for connection frame color)
Rectangle clientRect = InterfaceControl.ClientRectangle;
NativeMethods.MoveWindow(PuttyHandle, clientRect.X, clientRect.Y, clientRect.Width, clientRect.Height, true);
}
else
{
int scaledFrameBorderHeight = _display.ScaleHeight(SystemInformation.FrameBorderSize.Height);
int scaledFrameBorderWidth = _display.ScaleWidth(SystemInformation.FrameBorderSize.Width);
NativeMethods.MoveWindow(PuttyHandle, -scaledFrameBorderWidth,
-(SystemInformation.CaptionHeight + scaledFrameBorderHeight),
InterfaceControl.Width + scaledFrameBorderWidth * 2,
InterfaceControl.Height + SystemInformation.CaptionHeight +
// Use ClientRectangle to account for padding (for connection frame color)
Rectangle clientRect = InterfaceControl.ClientRectangle;
NativeMethods.MoveWindow(PuttyHandle,
clientRect.X - scaledFrameBorderWidth,
clientRect.Y - (SystemInformation.CaptionHeight + scaledFrameBorderHeight),
clientRect.Width + scaledFrameBorderWidth * 2,
clientRect.Height + SystemInformation.CaptionHeight +
scaledFrameBorderHeight * 2,
true);
}
@@ -410,5 +466,37 @@ namespace mRemoteNG.Connection.Protocol
}
#endregion
#region VaultOpenbaoUtils
private static readonly Encoding Utf8NoBom = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false);
private static NamedPipeServerStream CreatePipeServer(string pipeName) {
var pipeSecurity = new PipeSecurity();
using var identity = WindowsIdentity.GetCurrent();
var sid = identity.Owner ?? identity.User ?? throw new InvalidOperationException("Unable to determine current user SID.");
pipeSecurity.SetAccessRuleProtection(isProtected: true, preserveInheritance: false);
pipeSecurity.AddAccessRule(new PipeAccessRule(sid, PipeAccessRights.FullControl, AccessControlType.Allow));
return NamedPipeServerStreamAcl.Create(
pipeName: pipeName,
direction: PipeDirection.InOut,
maxNumberOfServerInstances: 1,
transmissionMode: PipeTransmissionMode.Byte,
options: PipeOptions.Asynchronous,
inBufferSize: 0,
outBufferSize: 0,
pipeSecurity);
}
private static (string Username, string Hostname, uint Port) DeserializeData(string data) {
var strings = data.Split(':');
if (strings.Length != 3) {
throw new FormatException("Invalid data format");
}
return (
Encoding.UTF8.GetString(Convert.FromBase64String(strings[0])),
Encoding.UTF8.GetString(Convert.FromBase64String(strings[1])),
uint.Parse(Encoding.UTF8.GetString(Convert.FromBase64String(strings[2])))
);
}
#endregion
}
}

View File

@@ -1,26 +1,23 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using System.Timers;
using System.Windows.Forms;
using AxMSTSCLib;
using AxMSTSCLib;
using mRemoteNG.App;
using mRemoteNG.Messages;
using mRemoteNG.Properties;
using mRemoteNG.Resources.Language;
using mRemoteNG.Security.SymmetricEncryption;
using mRemoteNG.Tools;
using mRemoteNG.Tree.Root;
using mRemoteNG.UI;
using mRemoteNG.UI.Forms;
using mRemoteNG.UI.Tabs;
using MSTSCLib;
using mRemoteNG.Resources.Language;
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using FileDialog = Microsoft.Win32.FileDialog;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
using System.DirectoryServices.ActiveDirectory;
using mRemoteNG.Security;
using System.Threading;
using System.Timers;
using System.Windows.Forms;
namespace mRemoteNG.Connection.Protocol.RDP
{
@@ -470,9 +467,32 @@ namespace mRemoteNG.Connection.Protocol.RDP
Event_ErrorOccured(this, "Passwordstate Interface Error: " + ex.Message, 0);
}
}
else if (InterfaceControl.Info.ExternalCredentialProvider == ExternalCredentialProvider.OnePassword)
{
try
{
string RDGUserViaAPI = InterfaceControl.Info.RDGatewayUserViaAPI;
ExternalConnectors.OP.OnePasswordCli.ReadPassword($"{RDGUserViaAPI}", out gwu, out gwp, out gwd, out pkey);
}
catch (ExternalConnectors.OP.OnePasswordCliException ex)
{
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, Language.ECPOnePasswordCommandLine + ": " + ex.Arguments);
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.ECPOnePasswordReadFailed + Environment.NewLine + ex.Message);
}
}
else if (InterfaceControl.Info.ExternalCredentialProvider == ExternalCredentialProvider.VaultOpenbao)
{
try {
if (connectionInfo.VaultOpenbaoSecretEngine == VaultOpenbaoSecretEngine.Kv)
gwu = connectionInfo.RDGatewayUsername;
ExternalConnectors.VO.VaultOpenbao.ReadPasswordRDP((int)connectionInfo.VaultOpenbaoSecretEngine, connectionInfo.VaultOpenbaoMount, connectionInfo.VaultOpenbaoRole, ref gwu, out gwp);
} catch (ExternalConnectors.VO.VaultOpenbaoException ex) {
Event_ErrorOccured(this, "Secret Server Interface Error: " + ex.Message, 0);
}
}
if (connectionInfo.RDGatewayUseConnectionCredentials != RDGatewayUseConnectionCredentials.AccessToken)
if (connectionInfo.RDGatewayUseConnectionCredentials != RDGatewayUseConnectionCredentials.AccessToken)
{
_rdpClient.TransportSettings2.GatewayUsername = gwu;
_rdpClient.TransportSettings2.GatewayPassword = gwp;
@@ -570,6 +590,27 @@ namespace mRemoteNG.Connection.Protocol.RDP
Event_ErrorOccured(this, "Passwordstate Interface Error: " + ex.Message, 0);
}
}
else if (InterfaceControl.Info.ExternalCredentialProvider == ExternalCredentialProvider.OnePassword)
{
try
{
ExternalConnectors.OP.OnePasswordCli.ReadPassword($"{userViaApi}", out userName, out password, out domain, out pkey);
}
catch (ExternalConnectors.OP.OnePasswordCliException ex)
{
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, Language.ECPOnePasswordCommandLine + ": " + ex.Arguments);
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.ECPOnePasswordReadFailed + Environment.NewLine + ex.Message);
}
}
else if (InterfaceControl.Info.ExternalCredentialProvider == ExternalCredentialProvider.VaultOpenbao) {
try {
if(connectionInfo.VaultOpenbaoSecretEngine == VaultOpenbaoSecretEngine.Kv)
userName = connectionInfo?.Username ?? "";
ExternalConnectors.VO.VaultOpenbao.ReadPasswordRDP((int)connectionInfo.VaultOpenbaoSecretEngine, connectionInfo?.VaultOpenbaoMount ?? "", connectionInfo?.VaultOpenbaoRole ?? "", ref userName, out password);
} catch (ExternalConnectors.VO.VaultOpenbaoException ex) {
Event_ErrorOccured(this, "Secret Server Interface Error: " + ex.Message, 0);
}
}
if (string.IsNullOrEmpty(userName))
{

View File

@@ -25,6 +25,21 @@ namespace mRemoteNG.Connection.Protocol.RDP
protected override RdpVersion RdpProtocolVersion => RDP.RdpVersion.Rdc8;
protected FormWindowState LastWindowState = FormWindowState.Minimized;
// Debounce timer to reduce flickering during resize
private System.Timers.Timer _resizeDebounceTimer;
private Size _pendingResizeSize;
private bool _hasPendingResize = false;
public RdpProtocol8()
{
_frmMain.ResizeEnd += ResizeEnd;
// Initialize debounce timer (300ms delay)
_resizeDebounceTimer = new System.Timers.Timer(300);
_resizeDebounceTimer.AutoReset = false;
_resizeDebounceTimer.Elapsed += ResizeDebounceTimer_Elapsed;
}
public override bool Initialize()
{
if (!base.Initialize())
@@ -58,16 +73,87 @@ namespace mRemoteNG.Connection.Protocol.RDP
protected override void Resize(object sender, EventArgs e)
{
if (LastWindowState == _frmMain.WindowState) return;
LastWindowState = _frmMain.WindowState;
if (_frmMain.WindowState == FormWindowState.Minimized) return; // don't resize when going to minimized since it seems to resize anyway, as seen when window is restored
if (_frmMain == null) return;
// Skip resize entirely when minimized or minimizing
if (_frmMain.WindowState == FormWindowState.Minimized) return;
Runtime.MessageCollector.AddMessage(MessageClass.DebugMsg,
$"Resize() called - WindowState={_frmMain.WindowState}, LastWindowState={LastWindowState}");
// Update control size during resize to keep UI synchronized
// Actual RDP session resize is deferred to ResizeEnd() to prevent flickering
DoResizeControl();
DoResizeClient();
// Only resize RDP session on window state changes (Maximize/Restore)
// Manual drag-resizing will be handled by ResizeEnd()
if (LastWindowState != _frmMain.WindowState)
{
Runtime.MessageCollector.AddMessage(MessageClass.DebugMsg,
$"Resize() - Window state changed from {LastWindowState} to {_frmMain.WindowState}, calling DoResizeClient()");
LastWindowState = _frmMain.WindowState;
DoResizeClient();
}
else
{
Runtime.MessageCollector.AddMessage(MessageClass.DebugMsg,
$"Resize() - Window state unchanged ({_frmMain.WindowState}), deferring to ResizeEnd()");
}
}
protected override void ResizeEnd(object sender, EventArgs e)
{
if (_frmMain == null) return;
// Skip resize when minimized
if (_frmMain.WindowState == FormWindowState.Minimized) return;
Runtime.MessageCollector.AddMessage(MessageClass.DebugMsg,
$"ResizeEnd() called - WindowState={_frmMain.WindowState}");
// Update window state tracking
LastWindowState = _frmMain.WindowState;
// Update control size immediately (no flicker)
DoResizeControl();
// Debounce the RDP session resize to reduce flickering
ScheduleDebouncedResize();
}
private void ScheduleDebouncedResize()
{
if (InterfaceControl == null) return;
// Store the pending size
_pendingResizeSize = InterfaceControl.Size;
_hasPendingResize = true;
// Reset the timer (this delays the resize if called repeatedly)
_resizeDebounceTimer?.Stop();
_resizeDebounceTimer?.Start();
Runtime.MessageCollector?.AddMessage(MessageClass.DebugMsg,
$"Resize debounced - will resize to {_pendingResizeSize.Width}x{_pendingResizeSize.Height} after 300ms");
}
private void ResizeDebounceTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (!_hasPendingResize) return;
// Check if controls are still valid (not disposed during shutdown)
if (Control == null || Control.IsDisposed || InterfaceControl == null || InterfaceControl.IsDisposed)
{
_hasPendingResize = false;
return;
}
_hasPendingResize = false;
Runtime.MessageCollector?.AddMessage(MessageClass.DebugMsg,
$"Debounce timer fired - executing delayed resize to {_pendingResizeSize.Width}x{_pendingResizeSize.Height}");
// Execute the actual RDP session resize
DoResizeClient();
}
@@ -79,28 +165,52 @@ namespace mRemoteNG.Connection.Protocol.RDP
private void DoResizeClient()
{
if (!loginComplete)
{
Runtime.MessageCollector.AddMessage(MessageClass.DebugMsg,
$"Resize skipped for '{connectionInfo.Hostname}': Login not complete");
return;
}
if (!InterfaceControl.Info.AutomaticResize)
{
Runtime.MessageCollector.AddMessage(MessageClass.DebugMsg,
$"Resize skipped for '{connectionInfo.Hostname}': AutomaticResize is disabled");
return;
}
if (!(InterfaceControl.Info.Resolution == RDPResolutions.FitToWindow ||
InterfaceControl.Info.Resolution == RDPResolutions.Fullscreen))
{
Runtime.MessageCollector.AddMessage(MessageClass.DebugMsg,
$"Resize skipped for '{connectionInfo.Hostname}': Resolution is {InterfaceControl.Info.Resolution} (needs FitToWindow or Fullscreen)");
return;
}
if (SmartSize)
{
Runtime.MessageCollector.AddMessage(MessageClass.DebugMsg,
$"Resize skipped for '{connectionInfo.Hostname}': SmartSize is enabled (use client-side scaling instead)");
return;
}
Runtime.MessageCollector.AddMessage(MessageClass.DebugMsg,
$"Resizing RDP connection to host '{connectionInfo.Hostname}'");
try
{
// Use InterfaceControl.Size instead of Control.Size because Control may be docked
// and not reflect the actual available space
Size size = Fullscreen
? Screen.FromControl(Control).Bounds.Size
: Control.Size;
: InterfaceControl.Size;
Runtime.MessageCollector.AddMessage(MessageClass.DebugMsg,
$"Calling UpdateSessionDisplaySettings({size.Width}, {size.Height}) for '{connectionInfo.Hostname}' (Control.Size={Control.Size}, InterfaceControl.Size={InterfaceControl.Size})");
UpdateSessionDisplaySettings((uint)size.Width, (uint)size.Height);
Runtime.MessageCollector.AddMessage(MessageClass.DebugMsg,
$"Successfully resized RDP session for '{connectionInfo.Hostname}' to {size.Width}x{size.Height}");
}
catch (Exception ex)
{
@@ -112,16 +222,72 @@ namespace mRemoteNG.Connection.Protocol.RDP
private bool DoResizeControl()
{
if (Control == null || InterfaceControl == null) return false;
// Check if controls are being disposed during shutdown
if (Control.IsDisposed || InterfaceControl.IsDisposed) return false;
Runtime.MessageCollector?.AddMessage(MessageClass.DebugMsg,
$"DoResizeControl - Before: Control.Size={Control.Size}, InterfaceControl.Size={InterfaceControl.Size}, Control.Dock={Control.Dock}");
// If control is docked, we need to temporarily undock it, resize it, then redock it
// because WinForms ignores Size assignments on docked controls
bool wasDocked = Control.Dock == DockStyle.Fill;
if (wasDocked)
{
Control.Dock = DockStyle.None;
}
Control.Location = InterfaceControl.Location;
// kmscode - this doesn't look right to me. But I'm not aware of any functionality issues with this currently...
if (Control.Size == InterfaceControl.Size || InterfaceControl.Size == Size.Empty) return false;
if (Control.Size == InterfaceControl.Size || InterfaceControl.Size == Size.Empty)
{
// Restore docking if we changed it
if (wasDocked)
{
Control.Dock = DockStyle.Fill;
}
Runtime.MessageCollector?.AddMessage(MessageClass.DebugMsg,
$"DoResizeControl - Skipped: Sizes already match or InterfaceControl.Size is empty");
return false;
}
Control.Size = InterfaceControl.Size;
// Restore docking
if (wasDocked)
{
Control.Dock = DockStyle.Fill;
}
Runtime.MessageCollector?.AddMessage(MessageClass.DebugMsg,
$"DoResizeControl - After: Control.Size={Control.Size}, Control.Dock={Control.Dock}");
return true;
}
protected virtual void UpdateSessionDisplaySettings(uint width, uint height)
{
RdpClient8.Reconnect(width, height);
if (RdpClient8 != null)
{
RdpClient8.Reconnect(width, height);
}
}
public override void Close()
{
// Clean up debounce timer
if (_resizeDebounceTimer != null)
{
_resizeDebounceTimer.Stop();
_resizeDebounceTimer.Elapsed -= ResizeDebounceTimer_Elapsed;
_resizeDebounceTimer.Dispose();
_resizeDebounceTimer = null;
}
base.Close();
}
}

View File

@@ -13,11 +13,8 @@ namespace mRemoteNG.Connection.Protocol.RDP
protected override RdpVersion RdpProtocolVersion => RDP.RdpVersion.Rdc9;
public RdpProtocol9()
{
_frmMain.ResizeEnd += ResizeEnd;
}
// Constructor not needed - ResizeEnd is already registered in RdpProtocol8 base class
public override bool Initialize()
{
if (!base.Initialize())
@@ -37,7 +34,14 @@ namespace mRemoteNG.Connection.Protocol.RDP
{
try
{
RdpClient9.UpdateSessionDisplaySettings(width, height, width, height, Orientation, DesktopScaleFactor, DeviceScaleFactor);
if (RdpClient9 != null)
{
RdpClient9.UpdateSessionDisplaySettings(width, height, width, height, Orientation, DesktopScaleFactor, DeviceScaleFactor);
}
else
{
base.UpdateSessionDisplaySettings(width, height);
}
}
catch (Exception)
{

View File

@@ -0,0 +1,155 @@
using System;
using System.Drawing;
using System.Runtime.Versioning;
using System.Windows.Forms;
using mRemoteNG.App;
using mRemoteNG.Messages;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.Terminal
{
[SupportedOSPlatform("windows")]
public class ProtocolTerminal(ConnectionInfo connectionInfo) : ProtocolBase
{
#region Private Fields
private IntPtr _handle;
private readonly ConnectionInfo _connectionInfo = connectionInfo;
private ConsoleControl.ConsoleControl _consoleControl;
#endregion
#region Public Methods
public override bool Connect()
{
try
{
Runtime.MessageCollector?.AddMessage(MessageClass.InformationMsg, "Attempting to start Terminal session.", true);
_consoleControl = new ConsoleControl.ConsoleControl
{
Dock = DockStyle.Fill,
BackColor = ColorTranslator.FromHtml("#012456"),
ForeColor = Color.White,
IsInputEnabled = true,
Padding = new Padding(0, 20, 0, 0)
};
// Path to command prompt - dynamically determined from system
// Using COMSPEC environment variable which points to the system's command processor
string terminalExe = Environment.GetEnvironmentVariable("COMSPEC") ?? @"C:\Windows\System32\cmd.exe";
// Setup arguments based on whether hostname is provided
string arguments = "";
string hostname = _connectionInfo.Hostname.Trim().ToLower();
bool useLocalHost = hostname == "" || hostname.Equals("localhost");
if (!useLocalHost)
{
// If hostname is provided, try to connect via SSH
// Note: Domain field is not used for SSH as it's Windows-specific
// SSH authentication will use standard SSH mechanisms (password prompt, keys, etc.)
string username = _connectionInfo.Username;
int port = _connectionInfo.Port;
// Build SSH command
string sshCommand = "ssh";
// Add port if it's not the default SSH port (22)
if (port > 0 && port != 22)
{
sshCommand += $" -p {port}";
}
if (!string.IsNullOrEmpty(username))
{
sshCommand += $" {username}@{_connectionInfo.Hostname}";
}
else
{
sshCommand += $" {_connectionInfo.Hostname}";
}
arguments = $"/K {sshCommand}";
}
else
{
// For local sessions, just start cmd with /K to keep it open
arguments = "/K";
}
_consoleControl.StartProcess(terminalExe, arguments);
// Wait for the console control to create its handle
int maxWaitMs = 5000; // 5 seconds timeout
long startTicks = Environment.TickCount64;
while (!_consoleControl.IsHandleCreated &&
Environment.TickCount64 < startTicks + maxWaitMs)
{
System.Threading.Thread.Sleep(50);
}
if (!_consoleControl.IsHandleCreated)
{
throw new Exception("Failed to initialize terminal console within 5 seconds. This may indicate system resource constraints or permission issues.");
}
_handle = _consoleControl.Handle;
NativeMethods.SetParent(_handle, InterfaceControl.Handle);
Resize(this, new EventArgs());
base.Connect();
return true;
}
catch (Exception ex)
{
Runtime.MessageCollector?.AddExceptionMessage(Language.ConnectionFailed, ex);
return false;
}
}
public override void Focus()
{
try
{
NativeMethods.SetForegroundWindow(_handle);
}
catch (Exception ex)
{
Runtime.MessageCollector.AddExceptionMessage(Language.IntAppFocusFailed, ex);
}
}
protected override void Resize(object sender, EventArgs e)
{
try
{
if (InterfaceControl.Size == Size.Empty) return;
// Use ClientRectangle to account for padding (for connection frame color)
Rectangle clientRect = InterfaceControl.ClientRectangle;
NativeMethods.MoveWindow(_handle,
clientRect.X - SystemInformation.FrameBorderSize.Width,
clientRect.Y - (SystemInformation.CaptionHeight + SystemInformation.FrameBorderSize.Height),
clientRect.Width + SystemInformation.FrameBorderSize.Width * 2,
clientRect.Height + SystemInformation.CaptionHeight +
SystemInformation.FrameBorderSize.Height * 2, true);
}
catch (Exception ex)
{
Runtime.MessageCollector.AddExceptionMessage(Language.IntAppResizeFailed, ex);
}
}
#endregion
#region Enumerations
public enum Defaults
{
Port = 22
}
#endregion
}
}

View File

@@ -8,6 +8,7 @@ using mRemoteNG.UI.Forms;
using mRemoteNG.Resources.Language;
using System.Runtime.Versioning;
using mRemoteNG.Security;
using System.Runtime.ExceptionServices;
// ReSharper disable ArrangeAccessorOwnerBody
@@ -21,9 +22,10 @@ namespace mRemoteNG.Connection.Protocol.VNC
private VncSharpCore.RemoteDesktop _vnc;
private ConnectionInfo _info;
private static bool _isConnectionSuccessful;
private static Exception _socketexception;
private static volatile bool _isConnectionSuccessful;
private static ExceptionDispatchInfo _socketexception;
private static readonly ManualResetEvent TimeoutObject = new(false);
private static readonly object _testConnectLock = new();
#endregion
@@ -161,30 +163,40 @@ namespace mRemoteNG.Connection.Protocol.VNC
private static bool TestConnect(string hostName, int port, int timeoutMSec)
{
TcpClient tcpclient = new();
TimeoutObject.Reset();
tcpclient.BeginConnect(hostName, port, CallBackMethod, tcpclient);
if (TimeoutObject.WaitOne(timeoutMSec, false))
lock (_testConnectLock)
{
if (_isConnectionSuccessful) return true;
}
else
{
tcpclient.Close();
throw new TimeoutException($"Connection timed out to host " + hostName + " on port " + port);
}
_socketexception = null;
TcpClient tcpclient = new();
return false;
TimeoutObject.Reset();
tcpclient.BeginConnect(hostName, port, CallBackMethod, tcpclient);
if (TimeoutObject.WaitOne(timeoutMSec, false))
{
if (_isConnectionSuccessful) return true;
// Connection completed but failed - tcpclient will be closed in CallBackMethod's finally block
if (_socketexception != null)
{
_socketexception.Throw();
}
}
else
{
tcpclient.Close();
throw new TimeoutException($"Connection timed out to host " + hostName + " on port " + port);
}
return false;
}
}
private static void CallBackMethod(IAsyncResult asyncresult)
{
TcpClient tcpclient = null;
try
{
_isConnectionSuccessful = false;
TcpClient tcpclient = asyncresult.AsyncState as TcpClient;
tcpclient = asyncresult.AsyncState as TcpClient;
if (tcpclient?.Client == null) return;
@@ -194,10 +206,11 @@ namespace mRemoteNG.Connection.Protocol.VNC
catch (Exception ex)
{
_isConnectionSuccessful = false;
_socketexception = ex;
_socketexception = ExceptionDispatchInfo.Capture(ex);
}
finally
{
tcpclient?.Close();
TimeoutObject.Set();
}
}

View File

@@ -0,0 +1,160 @@
using System;
using System.Drawing;
using System.IO;
using System.Runtime.Versioning;
using System.Windows.Forms;
using mRemoteNG.App;
using mRemoteNG.Messages;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.WSL
{
[SupportedOSPlatform("windows")]
public class ProtocolWSL(ConnectionInfo connectionInfo) : ProtocolBase
{
#region Private Fields
private IntPtr _handle;
private readonly ConnectionInfo _connectionInfo = connectionInfo;
private ConsoleControl.ConsoleControl _consoleControl;
#endregion
#region Public Methods
public override bool Connect()
{
try
{
// Check if WSL is installed
if (!IsWslInstalled())
{
Runtime.MessageCollector?.AddMessage(MessageClass.ErrorMsg,
"WSL is not installed on this system. Please install WSL to use this protocol.", true);
return false;
}
Runtime.MessageCollector?.AddMessage(MessageClass.InformationMsg,
"Attempting to start WSL session.", true);
_consoleControl = new ConsoleControl.ConsoleControl
{
Dock = DockStyle.Fill,
BackColor = ColorTranslator.FromHtml("#300A24"), // Ubuntu terminal color
ForeColor = Color.White,
IsInputEnabled = true,
Padding = new Padding(0, 20, 0, 0)
};
// Path to wsl.exe
string wslExe = @"C:\Windows\System32\wsl.exe";
// Build arguments based on connection info
string arguments = BuildWslArguments();
_consoleControl.StartProcess(wslExe, arguments);
while (!_consoleControl.IsHandleCreated) break;
_handle = _consoleControl.Handle;
NativeMethods.SetParent(_handle, InterfaceControl.Handle);
Resize(this, new EventArgs());
base.Connect();
return true;
}
catch (Exception ex)
{
Runtime.MessageCollector?.AddExceptionMessage(Language.ConnectionFailed, ex);
return false;
}
}
private bool IsWslInstalled()
{
try
{
// Check if wsl.exe exists
string wslPath = @"C:\Windows\System32\wsl.exe";
if (!File.Exists(wslPath))
{
return false;
}
// Additional check: Try to execute wsl.exe --status to verify it's properly installed
// For now, just check if the file exists
return true;
}
catch
{
return false;
}
}
private string BuildWslArguments()
{
string arguments = "";
// If a hostname is specified, treat it as a distribution name
if (!string.IsNullOrEmpty(_connectionInfo.Hostname))
{
string hostname = _connectionInfo.Hostname.Trim();
// Check if it's not localhost (WSL doesn't use localhost as a distribution name)
if (!hostname.Equals("localhost", StringComparison.OrdinalIgnoreCase))
{
arguments = $"-d {hostname}";
}
}
// If username is specified, we can try to use it
if (!string.IsNullOrEmpty(_connectionInfo.Username))
{
arguments += $" -u {_connectionInfo.Username}";
}
return arguments.Trim();
}
public override void Focus()
{
try
{
NativeMethods.SetForegroundWindow(_handle);
}
catch (Exception ex)
{
Runtime.MessageCollector.AddExceptionMessage(Language.IntAppFocusFailed, ex);
}
}
protected override void Resize(object sender, EventArgs e)
{
try
{
if (InterfaceControl.Size == Size.Empty) return;
// Use ClientRectangle to account for padding (for connection frame color)
Rectangle clientRect = InterfaceControl.ClientRectangle;
NativeMethods.MoveWindow(_handle,
clientRect.X - SystemInformation.FrameBorderSize.Width,
clientRect.Y - (SystemInformation.CaptionHeight + SystemInformation.FrameBorderSize.Height),
clientRect.Width + SystemInformation.FrameBorderSize.Width * 2,
clientRect.Height + SystemInformation.CaptionHeight +
SystemInformation.FrameBorderSize.Height * 2, true);
}
catch (Exception ex)
{
Runtime.MessageCollector.AddExceptionMessage(Language.IntAppResizeFailed, ex);
}
}
#endregion
#region Enumerations
public enum Defaults
{
Port = 0 // WSL doesn't use a traditional port
}
#endregion
}
}

View File

@@ -92,7 +92,7 @@ namespace mRemoteNG.Connection
#region IComponent
[Browsable(false)]
public ISite Site
public ISite? Site
{
get => new PropertyGridCommandSite(this);
set => throw (new NotImplementedException());
@@ -103,7 +103,7 @@ namespace mRemoteNG.Connection
Disposed?.Invoke(this, EventArgs.Empty);
}
public event EventHandler Disposed;
public event EventHandler? Disposed;
#endregion
}

View File

@@ -0,0 +1,18 @@
using mRemoteNG.Resources.Language;
using mRemoteNG.Tools;
namespace mRemoteNG.Connection {
public enum VaultOpenbaoSecretEngine {
[LocalizedAttributes.LocalizedDescription(nameof(Language.VaultOpenbaoSecretEngineKeyValue))]
Kv = 0,
[LocalizedAttributes.LocalizedDescription(nameof(Language.VaultOpenbaoSecretEngineLDAPDynamic))]
LdapDynamic = 1,
[LocalizedAttributes.LocalizedDescription(nameof(Language.VaultOpenbaoSecretEngineLDAPStatic))]
LdapStatic = 2,
[LocalizedAttributes.LocalizedDescription(nameof(Language.VaultOpenbaoSecretEngineSSHOTP))]
SSHOTP = 3,
}
}

BIN
mRemoteNG/Icons/WSL.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -213,15 +213,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to About.
/// </summary>
internal static string About {
get {
return ResourceManager.GetString("About", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Hidden.
/// </summary>
@@ -384,6 +375,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to AnyDesk.
/// </summary>
internal static string AnyDesk {
get {
return ResourceManager.GetString("AnyDesk", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Appearance.
/// </summary>
@@ -420,6 +420,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to ARD (Apple Remote Desktop).
/// </summary>
internal static string Ard {
get {
return ResourceManager.GetString("Ard", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Arguments.
/// </summary>
@@ -726,15 +735,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Check for Updates.
/// </summary>
internal static string CheckForUpdates {
get {
return ResourceManager.GetString("CheckForUpdates", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Check for updates at startup.
/// </summary>
@@ -843,6 +843,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Color.
/// </summary>
internal static string Color {
get {
return ResourceManager.GetString("Color", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Colors.
/// </summary>
@@ -1077,6 +1086,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Are you sure you want to disconnect &quot;{0}&quot;?.
/// </summary>
internal static string ConfirmDisconnectConnection {
get {
return ResourceManager.GetString("ConfirmDisconnectConnection", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Do you want to close all open connections?.
/// </summary>
@@ -1185,6 +1203,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Connection Frame Color.
/// </summary>
internal static string ConnectionFrameColor {
get {
return ResourceManager.GetString("ConnectionFrameColor", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Opening connection failed!.
/// </summary>
@@ -1600,6 +1627,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Discard.
/// </summary>
internal static string Discard {
get {
return ResourceManager.GetString("Discard", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Disconnect.
/// </summary>
@@ -1681,15 +1717,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Donate.
/// </summary>
internal static string Donate {
get {
return ResourceManager.GetString("Donate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Do not play.
/// </summary>
@@ -1852,6 +1879,33 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to 1Password.
/// </summary>
internal static string ECPOnePassword {
get {
return ResourceManager.GetString("ECPOnePassword", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to 1Password command line.
/// </summary>
internal static string ECPOnePasswordCommandLine {
get {
return ResourceManager.GetString("ECPOnePasswordCommandLine", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to 1Password read failed.
/// </summary>
internal static string ECPOnePasswordReadFailed {
get {
return ResourceManager.GetString("ECPOnePasswordReadFailed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Do you want to continue with no password?.
/// </summary>
@@ -1951,6 +2005,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Environment Tags.
/// </summary>
internal static string EnvironmentTags {
get {
return ResourceManager.GetString("EnvironmentTags", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to AddExternalToolsToToolBar (frmMain) failed. {0}.
/// </summary>
@@ -1969,6 +2032,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Architecture mismatch: {0}.
/// </summary>
internal static string ErrorArchitectureMismatch {
get {
return ResourceManager.GetString("ErrorArchitectureMismatch", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The database version {0} is not compatible with this version of {1}..
/// </summary>
@@ -2027,6 +2099,24 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Missing dependency: {0}.
/// </summary>
internal static string ErrorMissingDependency {
get {
return ResourceManager.GetString("ErrorMissingDependency", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Platform error: {0}.
/// </summary>
internal static string ErrorPlatformNotSupported {
get {
return ResourceManager.GetString("ErrorPlatformNotSupported", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Errors.
/// </summary>
@@ -2450,6 +2540,60 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Blue (Development).
/// </summary>
internal static string FrameColorBlue {
get {
return ResourceManager.GetString("FrameColorBlue", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Green (Test).
/// </summary>
internal static string FrameColorGreen {
get {
return ResourceManager.GetString("FrameColorGreen", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to None.
/// </summary>
internal static string FrameColorNone {
get {
return ResourceManager.GetString("FrameColorNone", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Purple (Custom).
/// </summary>
internal static string FrameColorPurple {
get {
return ResourceManager.GetString("FrameColorPurple", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Red (Production).
/// </summary>
internal static string FrameColorRed {
get {
return ResourceManager.GetString("FrameColorRed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Yellow (Staging/UAT).
/// </summary>
internal static string FrameColorYellow {
get {
return ResourceManager.GetString("FrameColorYellow", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Free.
/// </summary>
@@ -2504,15 +2648,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to mRemoteNG Help.
/// </summary>
internal static string HelpContents {
get {
return ResourceManager.GetString("HelpContents", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to High.
/// </summary>
@@ -3035,6 +3170,87 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to About.
/// </summary>
internal static string MenuItem_About {
get {
return ResourceManager.GetString("MenuItem_About", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to mR Chat.
/// </summary>
internal static string MenuItem_Chat {
get {
return ResourceManager.GetString("MenuItem_Chat", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Check for Updates.
/// </summary>
internal static string MenuItem_CheckForUpdates {
get {
return ResourceManager.GetString("MenuItem_CheckForUpdates", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Community.
/// </summary>
internal static string MenuItem_Community {
get {
return ResourceManager.GetString("MenuItem_Community", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Donate.
/// </summary>
internal static string MenuItem_Donate {
get {
return ResourceManager.GetString("MenuItem_Donate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to mRemoteNG Help.
/// </summary>
internal static string MenuItem_HelpContents {
get {
return ResourceManager.GetString("MenuItem_HelpContents", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Report an Issue.
/// </summary>
internal static string MenuItem_ReportIssue {
get {
return ResourceManager.GetString("MenuItem_ReportIssue", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Support Forum.
/// </summary>
internal static string MenuItem_SupportForum {
get {
return ResourceManager.GetString("MenuItem_SupportForum", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Website.
/// </summary>
internal static string MenuItem_Website {
get {
return ResourceManager.GetString("MenuItem_Website", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Message.
/// </summary>
@@ -3125,6 +3341,42 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Please download and install latest runtime:.
/// </summary>
internal static string MsgDownloadLatestRuntime {
get {
return ResourceManager.GetString("MsgDownloadLatestRuntime", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The application will now exit..
/// </summary>
internal static string MsgExit {
get {
return ResourceManager.GetString("MsgExit", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Missing Runtime:.
/// </summary>
internal static string MsgMissingRuntime {
get {
return ResourceManager.GetString("MsgMissingRuntime", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to runtime library is required.
/// </summary>
internal static string MsgRuntimeIsRequired {
get {
return ResourceManager.GetString("MsgRuntimeIsRequired", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Multi SSH:.
/// </summary>
@@ -3388,7 +3640,7 @@ namespace mRemoteNG.Resources.Language {
}
/// <summary>
/// Looks up a localized string similar to OpeningCommand TODO.
/// Looks up a localized string similar to Opening Command .
/// </summary>
internal static string OpeningCommand {
get {
@@ -3774,6 +4026,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Sets the color for the connection or folder in the connections tree. Connections inherit this color from their parent folder..
/// </summary>
internal static string PropertyDescriptionColor {
get {
return ResourceManager.GetString("PropertyDescriptionColor", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Select the color quality to be used..
/// </summary>
@@ -3792,6 +4053,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Sets a colored border around the connection panel to visually distinguish between different environments (e.g., production, test, development)..
/// </summary>
internal static string PropertyDescriptionConnectionFrameColor {
get {
return ResourceManager.GetString("PropertyDescriptionConnectionFrameColor", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Put your notes or a description for the host here..
/// </summary>
@@ -3909,6 +4179,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Tags to categorize the environment (e.g., #PROD, #UAT, #TEST, #BETA, #FINDEPARTMENT).
/// </summary>
internal static string PropertyDescriptionEnvironmentTags {
get {
return ResourceManager.GetString("PropertyDescriptionEnvironmentTags", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to External provider to retrieve host address from.
/// </summary>
@@ -4314,6 +4593,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Sets the color of the connection tab. Leave empty for default theme color..
/// </summary>
internal static string PropertyDescriptionTabColor {
get {
return ResourceManager.GetString("PropertyDescriptionTabColor", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Connect to the console session of the remote host..
/// </summary>
@@ -4395,6 +4683,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Secret engine used in Vault/Openbao to store the secret.
/// </summary>
internal static string PropertyDescriptionVaultOpenbaoSecretEngine {
get {
return ResourceManager.GetString("PropertyDescriptionVaultOpenbaoSecretEngine", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to If you want to establish a view only connection to the host select yes..
/// </summary>
@@ -5496,15 +5793,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Report a Bug.
/// </summary>
internal static string ReportBug {
get {
return ResourceManager.GetString("ReportBug", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Reset layout.
/// </summary>
@@ -5622,6 +5910,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Do you want to save the changes made to the options?.
/// </summary>
internal static string SaveOptionsBeforeClosing {
get {
return ResourceManager.GetString("SaveOptionsBeforeClosing", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Screen.
/// </summary>
@@ -6171,15 +6468,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Support Forum.
/// </summary>
internal static string SupportForum {
get {
return ResourceManager.GetString("SupportForum", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Switch to Notifications panel on:.
/// </summary>
@@ -6189,6 +6477,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Tab Color.
/// </summary>
internal static string TabColor {
get {
return ResourceManager.GetString("TabColor", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Tabs &amp;&amp; Panels.
/// </summary>
@@ -6216,6 +6513,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Terminal.
/// </summary>
internal static string Terminal {
get {
return ResourceManager.GetString("Terminal", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Test connection.
/// </summary>
@@ -6676,6 +6982,114 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Vault or Openbao.
/// </summary>
internal static string VaultOpenbao {
get {
return ResourceManager.GetString("VaultOpenbao", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Mount.
/// </summary>
internal static string VaultOpenbaoMount {
get {
return ResourceManager.GetString("VaultOpenbaoMount", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Mount where the secret is stored.
/// </summary>
internal static string VaultOpenbaoMountDescription {
get {
return ResourceManager.GetString("VaultOpenbaoMountDescription", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Role.
/// </summary>
internal static string VaultOpenbaoRole {
get {
return ResourceManager.GetString("VaultOpenbaoRole", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Name or path of the secret.
/// </summary>
internal static string VaultOpenbaoRoleDescription {
get {
return ResourceManager.GetString("VaultOpenbaoRoleDescription", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Vault/Openbao Secret Engine.
/// </summary>
internal static string VaultOpenbaoSecretEngine {
get {
return ResourceManager.GetString("VaultOpenbaoSecretEngine", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to KeyValue (Username as Key).
/// </summary>
internal static string VaultOpenbaoSecretEngineKeyValue {
get {
return ResourceManager.GetString("VaultOpenbaoSecretEngineKeyValue", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to LDAP dynamic role.
/// </summary>
internal static string VaultOpenbaoSecretEngineLDAPDynamic {
get {
return ResourceManager.GetString("VaultOpenbaoSecretEngineLDAPDynamic", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to LDAP static role.
/// </summary>
internal static string VaultOpenbaoSecretEngineLDAPStatic {
get {
return ResourceManager.GetString("VaultOpenbaoSecretEngineLDAPStatic", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to SSH engine OTP mode.
/// </summary>
internal static string VaultOpenbaoSecretEngineSSHOTP {
get {
return ResourceManager.GetString("VaultOpenbaoSecretEngineSSHOTP", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Token for Vault/Openbao.
/// </summary>
internal static string VaultOpenbaoToken {
get {
return ResourceManager.GetString("VaultOpenbaoToken", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Token to access Vault/Openbao server.
/// </summary>
internal static string VaultOpenbaoTokenPropertyDescription {
get {
return ResourceManager.GetString("VaultOpenbaoTokenPropertyDescription", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Verify:.
/// </summary>
@@ -6838,15 +7252,6 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to Website.
/// </summary>
internal static string Website {
get {
return ResourceManager.GetString("Website", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to WebView2InitializationFailed.
/// </summary>
@@ -6901,6 +7306,15 @@ namespace mRemoteNG.Resources.Language {
}
}
/// <summary>
/// Looks up a localized string similar to WSL.
/// </summary>
internal static string Wsl {
get {
return ResourceManager.GetString("Wsl", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Yes.
/// </summary>

View File

@@ -117,7 +117,7 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<data name="MenuItem_About" xml:space="preserve">
<value>O Aplikaci</value>
</data>
<data name="ActiveDirectory" xml:space="preserve">
@@ -712,7 +712,7 @@ Otevírám nový prázdný soubor seznamu spojení.</value>
<data name="AddConnectionPanel" xml:space="preserve">
<value>Nový panel spojení</value>
</data>
<data name="CheckForUpdates" xml:space="preserve">
<data name="MenuItem_CheckForUpdates" xml:space="preserve">
<value>Vyhledat aktualizace</value>
</data>
<data name="Config" xml:space="preserve">
@@ -733,7 +733,7 @@ Otevírám nový prázdný soubor seznamu spojení.</value>
<data name="DeleteExternalTool" xml:space="preserve">
<value>Smazat vnější nástroj...</value>
</data>
<data name="Donate" xml:space="preserve">
<data name="MenuItem_Donate" xml:space="preserve">
<value>Přispějte</value>
</data>
<data name="DuplicateTab" xml:space="preserve">
@@ -751,7 +751,7 @@ Otevírám nový prázdný soubor seznamu spojení.</value>
<data name="_Help" xml:space="preserve">
<value>&amp;Nápověda</value>
</data>
<data name="HelpContents" xml:space="preserve">
<data name="MenuItem_HelpContents" xml:space="preserve">
<value>Nápověda mRemoteNG</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
@@ -793,7 +793,7 @@ Otevírám nový prázdný soubor seznamu spojení.</value>
<data name="RenameTab" xml:space="preserve">
<value>Přejmonovat záložku tabu</value>
</data>
<data name="ReportBug" xml:space="preserve">
<data name="MenuItem_ReportIssue" xml:space="preserve">
<value>Nahlásit chybu</value>
</data>
<data name="ResetLayout" xml:space="preserve">
@@ -823,7 +823,7 @@ Otevírám nový prázdný soubor seznamu spojení.</value>
<data name="StartChat" xml:space="preserve">
<value>Spustit (VNC) chat</value>
</data>
<data name="SupportForum" xml:space="preserve">
<data name="MenuItem_SupportForum" xml:space="preserve">
<value>Diskuzní fórum podpory</value>
</data>
<data name="_Tools" xml:space="preserve">
@@ -838,7 +838,7 @@ Otevírám nový prázdný soubor seznamu spojení.</value>
<data name="ViewOnly" xml:space="preserve">
<value>Pouze prohlížet (VNC)</value>
</data>
<data name="Website" xml:space="preserve">
<data name="MenuItem_Website" xml:space="preserve">
<value>Webová stránka</value>
</data>
<data name="MinimizeToSysTray" xml:space="preserve">
@@ -1878,7 +1878,47 @@ mRemoteNG se nyní ukončí a zahájí instalaci.</value>
<data name="AutoSaveInMinutes" xml:space="preserve">
<value>Kliknutím na již otevřené připojení v seznamu otevře jeho záložku</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbao" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="WarnMeOnlyWhenClosingMultipleConnections1" xml:space="preserve">
<value>Upozornit mě pouze při ukončení několika připojení</value>
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

View File

@@ -117,7 +117,7 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<data name="MenuItem_About" xml:space="preserve">
<value>Über</value>
</data>
<data name="AddNodeFromXmlFailed" xml:space="preserve">
@@ -195,6 +195,9 @@
<data name="Inheritance" xml:space="preserve">
<value>Vererbung</value>
</data>
<data name="_Launch" xml:space="preserve">
<value>&amp;Starten</value>
</data>
<data name="ButtonLaunchPutty" xml:space="preserve">
<value>Starte PuTTY</value>
</data>
@@ -225,9 +228,6 @@
<data name="Display" xml:space="preserve">
<value>Anzeige</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Gateway</value>
</data>
<data name="Miscellaneous" xml:space="preserve">
<value>Verschiedenes</value>
</data>
@@ -294,9 +294,18 @@
<data name="Message" xml:space="preserve">
<value>Nachricht</value>
</data>
<data name="CommandExitProgram" xml:space="preserve">
<value>B&amp;eende {0}</value>
</data>
<data name="CommandLineArgsCouldNotBeParsed" xml:space="preserve">
<value>Die Kommandozeilenparameter konnten nicht ausgewertet werden!</value>
</data>
<data name="CommandOpenConnectionFile" xml:space="preserve">
<value>Eine Verbindungsdatei öffnen</value>
</data>
<data name="_TryAgain" xml:space="preserve">
<value>&amp;Nochmal versuchen</value>
</data>
<data name="CompatibilityLenovoAutoScrollUtilityDetected" xml:space="preserve">
<value>{0} hat festgestellt, dass das Lenovo Auto Scroll Utility auf diesem Computer ausgeführt wird. Dieses Dienstprogramm ist dafür bekannt, dass es Probleme mit {0} verursacht. Es wird empfohlen, dass Sie es deaktivieren oder deinstallieren.</value>
</data>
@@ -395,6 +404,9 @@ Starte mit neuer Datei.</value>
<data name="ConnectionsFileCouldNotSaveAs" xml:space="preserve">
<value>Verbindungsdatei konnte nicht als "{0}" gespeichert werden!</value>
</data>
<data name="ConnectNoCredentials" xml:space="preserve">
<value>Ohne Anmeldedaten verbinden</value>
</data>
<data name="ConnectToConsoleSession" xml:space="preserve">
<value>Mit der Konsolensitzung verbinden</value>
</data>
@@ -419,6 +431,9 @@ Starte mit neuer Datei.</value>
<data name="Detect" xml:space="preserve">
<value>Erkennen</value>
</data>
<data name="DontConnectToConsoleSession" xml:space="preserve">
<value>Keine Verbindung zur Konsolensitzung herstellen</value>
</data>
<data name="DontConnectWhenAuthFails" xml:space="preserve">
<value>Keine Verbindung herstellen, wenn Authentifizierung fehlschlägt</value>
</data>
@@ -458,6 +473,9 @@ Starte mit neuer Datei.</value>
<data name="ErrorConnectionListSaveFailed" xml:space="preserve">
<value>Die Verbindungsliste konnte nicht gespeichert werden.</value>
</data>
<data name="ErrorCouldNotLaunchPutty" xml:space="preserve">
<value>PuTTY konnte nicht gestartet werden.</value>
</data>
<data name="ErrorDecryptionFailed" xml:space="preserve">
<value>Entschlüsselung ist gescheitert. {0}</value>
</data>
@@ -482,9 +500,36 @@ Starte mit neuer Datei.</value>
<data name="Export" xml:space="preserve">
<value>Exportieren</value>
</data>
<data name="ExportEverything" xml:space="preserve">
<value>Alles exportieren</value>
</data>
<data name="ExportFile" xml:space="preserve">
<value>Datei exportieren</value>
</data>
<data name="ExportItems" xml:space="preserve">
<value>Element exportieren</value>
</data>
<data name="ExportProperties" xml:space="preserve">
<value>Eigenschaften exportieren</value>
</data>
<data name="ExportSelectedConnection" xml:space="preserve">
<value>Die Aktuell gewählte Verbindung exportieren</value>
</data>
<data name="ExportSelectedFolder" xml:space="preserve">
<value>Den Aktuell gewählten Ordner exportieren</value>
</data>
<data name="_ExportToFile" xml:space="preserve">
<value>In Datei &amp;exportieren...</value>
</data>
<data name="ExternalToolDefaultName" xml:space="preserve">
<value>Neues externes Programm</value>
</data>
<data name="FilterAll" xml:space="preserve">
<value>Alle Dateien (*.*)</value>
</data>
<data name="FilterAllImportable" xml:space="preserve">
<value>Alle wichtigen Dateien</value>
</data>
<data name="FilterApplication" xml:space="preserve">
<value>Application Dateien (*.exe)</value>
</data>
@@ -527,6 +572,9 @@ Starte mit neuer Datei.</value>
<data name="Host" xml:space="preserve">
<value>Host</value>
</data>
<data name="Http" xml:space="preserve">
<value>HTTP</value>
</data>
<data name="HttpConnectFailed" xml:space="preserve">
<value>Verbindung mit HTTP fehlgeschlagen!</value>
</data>
@@ -536,12 +584,24 @@ Starte mit neuer Datei.</value>
<data name="HttpDocumentTileChangeFailed" xml:space="preserve">
<value>Fehler beim Ändern des HTTP-Dokumentfensters!</value>
</data>
<data name="HttpInternetExplorer" xml:space="preserve">
<value>Internet Explorer</value>
</data>
<data name="Https" xml:space="preserve">
<value>HTTPS</value>
</data>
<data name="HttpSetPropsFailed" xml:space="preserve">
<value>Setzen der HTTP-Parameter fehlgeschlagen!</value>
</data>
<data name="ImportAD" xml:space="preserve">
<value>Von Active Directory importieren</value>
</data>
<data name="ImportFileFailedContent" xml:space="preserve">
<value>Beim Importieren der Datei ist ein Fehler aufgetreten ("{0}").</value>
</data>
<data name="ImportFromFile" xml:space="preserve">
<value>Von &amp;Datei importieren</value>
</data>
<data name="ImportPortScan" xml:space="preserve">
<value>Von Port Scan importieren</value>
</data>
@@ -623,6 +683,9 @@ Starte mit neuer Datei.</value>
<data name="LoadFromSqlFailed" xml:space="preserve">
<value>Laden per SQL fehlgeschlagen!</value>
</data>
<data name="LoadFromSqlFailedContent" xml:space="preserve">
<value>Die Verbindungsinformationen konnten nicht vom SQL-Server geladen werden.</value>
</data>
<data name="LoadFromXmlFailed" xml:space="preserve">
<value>Laden der XML-Datei fehlgeschlagen!</value>
</data>
@@ -635,7 +698,7 @@ Starte mit neuer Datei.</value>
<data name="AddConnectionPanel" xml:space="preserve">
<value>Verbindungs-Panel hinzufügen</value>
</data>
<data name="CheckForUpdates" xml:space="preserve">
<data name="MenuItem_CheckForUpdates" xml:space="preserve">
<value>Suche nach Updates</value>
</data>
<data name="Config" xml:space="preserve">
@@ -656,7 +719,7 @@ Starte mit neuer Datei.</value>
<data name="DeleteExternalTool" xml:space="preserve">
<value>Entfernen</value>
</data>
<data name="Donate" xml:space="preserve">
<data name="MenuItem_Donate" xml:space="preserve">
<value>Spenden</value>
</data>
<data name="DuplicateTab" xml:space="preserve">
@@ -674,7 +737,7 @@ Starte mit neuer Datei.</value>
<data name="_Help" xml:space="preserve">
<value>&amp;Hilfe</value>
</data>
<data name="HelpContents" xml:space="preserve">
<data name="MenuItem_HelpContents" xml:space="preserve">
<value>Hilfe</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
@@ -683,6 +746,9 @@ Starte mit neuer Datei.</value>
<data name="NewConnectionFile" xml:space="preserve">
<value>Neue Verbindungsdatei</value>
</data>
<data name="NewExternalTool" xml:space="preserve">
<value>Neues externes Tool</value>
</data>
<data name="Notifications" xml:space="preserve">
<value>Meldungen</value>
</data>
@@ -713,7 +779,7 @@ Starte mit neuer Datei.</value>
<data name="RenameTab" xml:space="preserve">
<value>Tab umbenennen</value>
</data>
<data name="ReportBug" xml:space="preserve">
<data name="MenuItem_ReportIssue" xml:space="preserve">
<value>Fehler melden</value>
</data>
<data name="ResetLayout" xml:space="preserve">
@@ -743,7 +809,7 @@ Starte mit neuer Datei.</value>
<data name="StartChat" xml:space="preserve">
<value>Chat starten (VNC)</value>
</data>
<data name="SupportForum" xml:space="preserve">
<data name="MenuItem_SupportForum" xml:space="preserve">
<value>Forum</value>
</data>
<data name="_Tools" xml:space="preserve">
@@ -758,7 +824,7 @@ Starte mit neuer Datei.</value>
<data name="ViewOnly" xml:space="preserve">
<value>View-Only-Modus</value>
</data>
<data name="Website" xml:space="preserve">
<data name="MenuItem_Website" xml:space="preserve">
<value>Webseite</value>
</data>
<data name="MinimizeToSysTray" xml:space="preserve">
@@ -819,6 +885,9 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="OpenPorts" xml:space="preserve">
<value>Offene Ports</value>
</data>
<data name="OptionsProxyTesting" xml:space="preserve">
<value>Testen...</value>
</data>
<data name="Theme" xml:space="preserve">
<value>Theme</value>
</data>
@@ -834,9 +903,18 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="PasswordProtect" xml:space="preserve">
<value>Passwortschutz</value>
</data>
<data name="PasswordStatusMustMatch" xml:space="preserve">
<value>Die beide Passwörter müssen übereinstimmen.</value>
</data>
<data name="PasswordStatusTooShort" xml:space="preserve">
<value>Das Passwort muss mindestens 3 Zeichen lang sein.</value>
</data>
<data name="PleaseFillAllFields" xml:space="preserve">
<value>Bitte alle Felder ausfüllen!</value>
</data>
<data name="PortScanComplete" xml:space="preserve">
<value>Port-Scan abgeschlossen.</value>
</data>
<data name="PortScanCouldNotLoadPanel" xml:space="preserve">
<value>Kann das Port-Scan-Panel nicht laden!</value>
</data>
@@ -852,6 +930,9 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="PropertyDescriptionAuthenticationMode" xml:space="preserve">
<value>Wählen Sie, wie Sie sich am VNC-Server authentifizieren wollen.</value>
</data>
<data name="PropertyDescriptionAutomaticResize" xml:space="preserve">
<value>Wählen Sie aus, ob die Größe der Verbindung automatisch angepasst werden soll, wenn die Fenstergröße geändert oder der Vollbildmodus umgeschaltet wird. Benötigt RDC 8.0 oder höher.</value>
</data>
<data name="PropertyDescriptionCacheBitmaps" xml:space="preserve">
<value>Wählen Sie, ob Bitmap-Zwischenspeicherung verwendet werden soll.</value>
</data>
@@ -894,6 +975,9 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="PropertyDescriptionIcon" xml:space="preserve">
<value>Das ausgewählte Icon wird bei Verbindung zum Host im Tab angezeigt.</value>
</data>
<data name="PropertyDescriptionLoadBalanceInfo" xml:space="preserve">
<value>Gibt die Lastausgleichsinformationen an, die von Lastenausgleichsroutern verwendet werden, um den besten Server auszuwählen.</value>
</data>
<data name="PropertyDescriptionMACAddress" xml:space="preserve">
<value>Geben Sie die MAC-Adresse des Remote Hosts ein (kann für externe Applikationen verwendet werden).</value>
</data>
@@ -942,6 +1026,9 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="PropertyDescriptionRedirectPrinters" xml:space="preserve">
<value>Wählen Sie, ob ihre lokalen Drucker auf dem entfernten System zur Verfügung stehen sollen.</value>
</data>
<data name="PropertyDescriptionRedirectClipboard" xml:space="preserve">
<value>Umleitung der Zwischenablage erlauben.</value>
</data>
<data name="PropertyDescriptionRedirectSmartCards" xml:space="preserve">
<value>Wählen Sie, ob lokale Smartcards auf dem Remotehost verfügbar sein sollen.</value>
</data>
@@ -999,6 +1086,9 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="AuthenticationMode" xml:space="preserve">
<value>Authentifizierungsmodus</value>
</data>
<data name="AutomaticResize" xml:space="preserve">
<value>Automatische Größenänderung</value>
</data>
<data name="CacheBitmaps" xml:space="preserve">
<value>Bitmaps zwischenspeichern</value>
</data>
@@ -1035,6 +1125,9 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="ExternalToolBefore" xml:space="preserve">
<value>Externes Programm vorher</value>
</data>
<data name="LoadBalanceInfo" xml:space="preserve">
<value>Lastausgleichsinfo</value>
</data>
<data name="MacAddress" xml:space="preserve">
<value>MAC-Adresse</value>
</data>
@@ -1083,6 +1176,9 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="Printers" xml:space="preserve">
<value>Drucker</value>
</data>
<data name="Clipboard" xml:space="preserve">
<value>Zwischenablage</value>
</data>
<data name="Sounds" xml:space="preserve">
<value>Töne</value>
</data>
@@ -1172,6 +1268,9 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="Quick" xml:space="preserve">
<value>Direkt: {0}</value>
</data>
<data name="QuickConnect" xml:space="preserve">
<value>Schnellverbindung</value>
</data>
<data name="QuickConnectAddFailed" xml:space="preserve">
<value>Hinzufügen zur Direktverbindungshistorie fehlgeschlagen!</value>
</data>
@@ -1349,9 +1448,6 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="SaveConnectionsFileBeforeOpeningAnother" xml:space="preserve">
<value>Wollen sie die aktuelle Verbindungsdatei speichern, bevor eine andere geladen wird?</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>Verbindungen beim Schließen speichern</value>
</data>
<data name="SaveImageFilter" xml:space="preserve">
<value>Graphics Interchange Format Datei (.gif)|*.gif|Joint Photographic Experts Group Datei (.jpeg)|*.jpeg|Joint Photographic Experts Group Datei (.jpg)|*.jpg|Portable Network Graphics Datei (.png)|*.png</value>
</data>
@@ -1463,6 +1559,9 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="TitlePassword" xml:space="preserve">
<value>mRemoteNG Passwort</value>
</data>
<data name="TitlePasswordWithName" xml:space="preserve">
<value>mRemoteNG Passwort für {0}</value>
</data>
<data name="TitleSelectPanel" xml:space="preserve">
<value>Wähle Panel</value>
</data>
@@ -1475,6 +1574,9 @@ Wenn Sie Fehler feststellen, dann sollten Sie eine neue Verbindungsdatei erstell
<data name="TryToIntegrate" xml:space="preserve">
<value>Integration versuchen</value>
</data>
<data name="ShowOnToolbar" xml:space="preserve">
<value>In der Symbolleiste anzeigen</value>
</data>
<data name="UltraVncRepeater" xml:space="preserve">
<value>Ultra Vnc Repeater</value>
</data>
@@ -1515,6 +1617,9 @@ mRemoteNG wird nun geschlossen und die Installation gestartet.</value>
<data name="Weekly" xml:space="preserve">
<value>Wöchentlich</value>
</data>
<data name="UpdateGetChangeLogFailed" xml:space="preserve">
<value>Der Changelog konnte nicht heruntergeladen werden.</value>
</data>
<data name="UseDifferentUsernameAndPassword" xml:space="preserve">
<value>Anderen Benutzernamen und Passwort verwenden</value>
</data>
@@ -1566,105 +1671,6 @@ mRemoteNG wird nun geschlossen und die Installation gestartet.</value>
<data name="Yes" xml:space="preserve">
<value>Ja</value>
</data>
<data name="_Launch" xml:space="preserve">
<value>&amp;Starten</value>
</data>
<data name="CommandOpenConnectionFile" xml:space="preserve">
<value>Eine Verbindungsdatei öffnen</value>
</data>
<data name="ConnectNoCredentials" xml:space="preserve">
<value>Ohne Anmeldedaten verbinden</value>
</data>
<data name="DontConnectToConsoleSession" xml:space="preserve">
<value>Keine Verbindung zur Konsolensitzung herstellen</value>
</data>
<data name="ErrorCouldNotLaunchPutty" xml:space="preserve">
<value>PuTTY konnte nicht gestartet werden.</value>
</data>
<data name="ExportEverything" xml:space="preserve">
<value>Alles exportieren</value>
</data>
<data name="ExportFile" xml:space="preserve">
<value>Datei exportieren</value>
</data>
<data name="ExportProperties" xml:space="preserve">
<value>Eigenschaften exportieren</value>
</data>
<data name="FilterAllImportable" xml:space="preserve">
<value>Alle wichtigen Dateien</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="EncryptionEngine" xml:space="preserve">
<value>Verschlüsselungs-Engine</value>
</data>
<data name="TabSecurity" xml:space="preserve">
<value>Sicherheit</value>
</data>
<data name="Dynamic" xml:space="preserve">
<value>Dynamisch</value>
</data>
<data name="High" xml:space="preserve">
<value>Hoch</value>
</data>
<data name="Medium" xml:space="preserve">
<value>Mittel</value>
</data>
<data name="SoundQuality" xml:space="preserve">
<value>Klangqualität</value>
</data>
<data name="UpdatePortableDownloadComplete" xml:space="preserve">
<value>Download abgeschlossen!</value>
</data>
<data name="Title" xml:space="preserve">
<value>Titel</value>
</data>
<data name="OpenFile" xml:space="preserve">
<value>Datei öffnen</value>
</data>
<data name="OpenADifferentFile" xml:space="preserve">
<value>Andere Datei öffnen</value>
</data>
<data name="ConfigurationCreateNew" xml:space="preserve">
<value>Neue Verbindungsdatei erstellen</value>
</data>
<data name="CommandExitProgram" xml:space="preserve">
<value>B&amp;eende {0}</value>
</data>
<data name="_TryAgain" xml:space="preserve">
<value>&amp;Nochmal versuchen</value>
</data>
<data name="ExternalToolDefaultName" xml:space="preserve">
<value>Neues externes Programm</value>
</data>
<data name="LoadFromSqlFailedContent" xml:space="preserve">
<value>Die Verbindungsinformationen konnten nicht vom SQL-Server geladen werden.</value>
</data>
<data name="PasswordStatusMustMatch" xml:space="preserve">
<value>Die beide Passwörter müssen übereinstimmen.</value>
</data>
<data name="PasswordStatusTooShort" xml:space="preserve">
<value>Das Passwort muss mindestens 3 Zeichen lang sein.</value>
</data>
<data name="PortScanComplete" xml:space="preserve">
<value>Port-Scan abgeschlossen.</value>
</data>
<data name="PropertyDescriptionAutomaticResize" xml:space="preserve">
<value>Wählen Sie aus, ob die Größe der Verbindung automatisch angepasst werden soll, wenn die Fenstergröße geändert oder der Vollbildmodus umgeschaltet wird. Benötigt RDC 8.0 oder höher.</value>
</data>
<data name="PropertyDescriptionLoadBalanceInfo" xml:space="preserve">
<value>Gibt die Lastausgleichsinformationen an, die von Lastenausgleichsroutern verwendet werden, um den besten Server auszuwählen.</value>
</data>
<data name="LoadBalanceInfo" xml:space="preserve">
<value>Lastausgleichsinfo</value>
</data>
<data name="TitlePasswordWithName" xml:space="preserve">
<value>mRemoteNG Passwort für {0}</value>
</data>
<data name="RdpOverallConnectionTimeout" xml:space="preserve">
<value>RDP-Verbindungs-Timeout</value>
</data>
@@ -1683,75 +1689,36 @@ mRemoteNG wird nun geschlossen und die Installation gestartet.</value>
<data name="EncryptionBlockCipherMode" xml:space="preserve">
<value>Block-Cipher-Modus</value>
</data>
<data name="ShowTheseMessageTypes" xml:space="preserve">
<value>Zeige diese Nachrichtentypen</value>
<data name="EncryptionEngine" xml:space="preserve">
<value>Verschlüsselungs-Engine</value>
</data>
<data name="ConnectionFileNotFound" xml:space="preserve">
<value>Die Verbindungsdatei konnte nicht gefunden werden.</value>
<data name="TabSecurity" xml:space="preserve">
<value>Sicherheit</value>
</data>
<data name="ConfigurationImportFile" xml:space="preserve">
<value>Existierende Datei importieren</value>
<data name="EncryptionKeyDerivationIterations" xml:space="preserve">
<value>Iterationen der Ableitungsfunktion</value>
</data>
<data name="ConnectionSuccessful" xml:space="preserve">
<value>Verbindung erfolgreich</value>
<data name="Dynamic" xml:space="preserve">
<value>Dynamisch</value>
</data>
<data name="DatabaseNotAvailable" xml:space="preserve">
<value>Datenbank '{0}' ist nicht verfügbar.</value>
<data name="High" xml:space="preserve">
<value>Hoch</value>
</data>
<data name="SaveConnectionsAfterEveryEdit" xml:space="preserve">
<value>Verbindungen nach jeder Bearbeitung speichern</value>
</data>
<data name="FilterSearchMatchesInConnectionTree" xml:space="preserve">
<value>Suchergebnisse in Verbindungen filtern</value>
</data>
<data name="TestConnection" xml:space="preserve">
<value>Verbindung testen</value>
</data>
<data name="TimeoutInSeconds" xml:space="preserve">
<value>Time-Out [Sekunden]</value>
</data>
<data name="AutomaticResize" xml:space="preserve">
<value>Automatische Größenänderung</value>
</data>
<data name="ShowOnToolbar" xml:space="preserve">
<value>In der Symbolleiste anzeigen</value>
</data>
<data name="AssignedCredential" xml:space="preserve">
<value>Zugewiesene Anmeldedaten</value>
</data>
<data name="OptionsThemeNewThemeCaption" xml:space="preserve">
<value>Neuer Thema Name</value>
</data>
<data name="TestingConnection" xml:space="preserve">
<value>Verbindung testen</value>
</data>
<data name="_ExportToFile" xml:space="preserve">
<value>In Datei &amp;exportieren...</value>
</data>
<data name="ImportFileFailedContent" xml:space="preserve">
<value>Beim Importieren der Datei ist ein Fehler aufgetreten ("{0}").</value>
</data>
<data name="AdvancedSecurityOptions" xml:space="preserve">
<value>Erweiterte Sicherheitsoptionen</value>
</data>
<data name="LogTheseMessageTypes" xml:space="preserve">
<value>Diese Nachrichtentypen protokollieren</value>
</data>
<data name="LoginFailedForUser" xml:space="preserve">
<value>Login fehlgeschlagen für Benutzer '{0}'.</value>
</data>
<data name="OptionsPageTitle" xml:space="preserve">
<value>mRemoteNG Optionen</value>
</data>
<data name="NewExternalTool" xml:space="preserve">
<value>Neues externes Tool</value>
</data>
<data name="UpdateGetChangeLogFailed" xml:space="preserve">
<value>Der Changelog konnte nicht heruntergeladen werden.</value>
<data name="Medium" xml:space="preserve">
<value>Mittel</value>
</data>
<data name="PropertyDescriptionSoundQuality" xml:space="preserve">
<value>Wählen Sie die vom Protokoll bereitgestellte Klangqualität: Dynamisch, Mittel, Hoch</value>
</data>
<data name="SoundQuality" xml:space="preserve">
<value>Klangqualität</value>
</data>
<data name="UpdatePortableDownloadComplete" xml:space="preserve">
<value>Download abgeschlossen!</value>
</data>
<data name="Download" xml:space="preserve">
<value>Download</value>
</data>
<data name="PropertyDescriptionRDPMinutesToIdleTimeout" xml:space="preserve">
<value>Die Anzahl der Minuten, die die RDP-Sitzung im Leerlauf verbleibt, bevor sie automatisch getrennt wird (0 bedeutet kein Limit)</value>
</data>
@@ -1761,6 +1728,9 @@ mRemoteNG wird nun geschlossen und die Installation gestartet.</value>
<data name="Add" xml:space="preserve">
<value>Hinzufügen</value>
</data>
<data name="Title" xml:space="preserve">
<value>Titel</value>
</data>
<data name="ConfirmDeleteCredentialRecord" xml:space="preserve">
<value>Möchten Sie die Anmeldeinformationen {0} wirklich löschen?</value>
</data>
@@ -1786,74 +1756,161 @@ Die Passwortlänge muss zwischen {0} und {1} liegen</value>
<data name="ChooseLogPath" xml:space="preserve">
<value>Wählen Sie einen Pfad für das mRemoteNG-Logfile</value>
</data>
<data name="ShowTheseMessageTypes" xml:space="preserve">
<value>Zeige diese Nachrichtentypen</value>
</data>
<data name="LogFilePath" xml:space="preserve">
<value>Pfad des Logfiles</value>
</data>
<data name="LogTheseMessageTypes" xml:space="preserve">
<value>Diese Nachrichtentypen protokollieren</value>
</data>
<data name="ChoosePath" xml:space="preserve">
<value>Pfad auswählen</value>
</data>
<data name="OpenFile" xml:space="preserve">
<value>Datei öffnen</value>
</data>
<data name="UseDefault" xml:space="preserve">
<value>Standard verwenden</value>
</data>
<data name="Logging" xml:space="preserve">
<value>Protokollierung</value>
</data>
<data name="Popups" xml:space="preserve">
<value>Pop-ups</value>
</data>
<data name="LogToAppDir" xml:space="preserve">
<value>In das Anwendungsverzeichnis protokollieren</value>
</data>
<data name="AssignedCredential" xml:space="preserve">
<value>Zugewiesene Anmeldedaten</value>
</data>
<data name="Credentials" xml:space="preserve">
<value>Anmeldedaten</value>
</data>
<data name="OpenADifferentFile" xml:space="preserve">
<value>Andere Datei öffnen</value>
</data>
<data name="CredentialUnavailable" xml:space="preserve">
<value>Anmeldeinformationen nicht verfügbar</value>
</data>
<data name="OptionsThemeDeleteConfirmation" xml:space="preserve">
<value>Soll das Theme wirklich gelöscht werden?</value>
</data>
<data name="OptionsThemeNewThemeCaption" xml:space="preserve">
<value>Neuer Thema Name</value>
</data>
<data name="OptionsThemeNewThemeError" xml:space="preserve">
<value>Das Theme kann nicht erstellt werden, Name bereits vorhanden oder Sonderzeichen im Namen</value>
</data>
<data name="OptionsThemeNewThemeText" xml:space="preserve">
<value>Namen des neuen Theme angeben</value>
</data>
<data name="OptionsThemeChangeWarning" xml:space="preserve">
<value>Warnung: Ein Neustart ist erforderlich, um Änderungen am Theme anzuwenden.</value>
</data>
<data name="CouldNotFindExternalTool" xml:space="preserve">
<value>Externes Tool mit Namen "{0}" konnte nicht gefunden werden</value>
</data>
<data name="ConfigurationCreateNew" xml:space="preserve">
<value>Neue Verbindungsdatei erstellen</value>
</data>
<data name="ConnectionFileNotFound" xml:space="preserve">
<value>Die Verbindungsdatei konnte nicht gefunden werden.</value>
</data>
<data name="ConfigurationImportFile" xml:space="preserve">
<value>Existierende Datei importieren</value>
</data>
<data name="ConfigurationCustomPath" xml:space="preserve">
<value>Eigenen Pfad verwenden</value>
</data>
<data name="TestingConnection" xml:space="preserve">
<value>Verbindung testen</value>
</data>
<data name="ServerNotAccessible" xml:space="preserve">
<value>Server '{0}' nicht erreichbar</value>
</data>
<data name="ConnectionSuccessful" xml:space="preserve">
<value>Verbindung erfolgreich</value>
</data>
<data name="LoginFailedForUser" xml:space="preserve">
<value>Login fehlgeschlagen für Benutzer '{0}'.</value>
</data>
<data name="DatabaseNotAvailable" xml:space="preserve">
<value>Datenbank '{0}' ist nicht verfügbar.</value>
</data>
<data name="SaveConnectionsAfterEveryEdit" xml:space="preserve">
<value>Verbindungen nach jeder Bearbeitung speichern</value>
</data>
<data name="FilterSearchMatchesInConnectionTree" xml:space="preserve">
<value>Suchergebnisse in Verbindungen filtern</value>
</data>
<data name="TestConnection" xml:space="preserve">
<value>Verbindung testen</value>
</data>
<data name="LoadBalanceInfoUseUtf8" xml:space="preserve">
<value>Verwenden Sie die UTF8-Codierung für die RDP-Eigenschaft "Load Balance Info"</value>
</data>
<data name="ExportSelectedConnection" xml:space="preserve">
<value>Die Aktuell gewählte Verbindung exportieren</value>
<data name="TimeoutInSeconds" xml:space="preserve">
<value>Time-Out [Sekunden]</value>
</data>
<data name="ExportSelectedFolder" xml:space="preserve">
<value>Den Aktuell gewählten Ordner exportieren</value>
<data name="WorkingDirectory" xml:space="preserve">
<value>Arbeitsverzeichnis:</value>
</data>
<data name="Popups" xml:space="preserve">
<value>Pop-ups</value>
<data name="WorkingDirColumnHeader" xml:space="preserve">
<value>Arbeitsverzeichnis</value>
</data>
<data name="ExportItems" xml:space="preserve">
<value>Element exportieren</value>
<data name="LockToolbars" xml:space="preserve">
<value>Position der Symbolleiste sperren</value>
</data>
<data name="Http" xml:space="preserve">
<value>HTTP</value>
<data name="MultiSshToolbar" xml:space="preserve">
<value>Multi-SSH Symbolleiste</value>
</data>
<data name="HttpInternetExplorer" xml:space="preserve">
<value>Internet Explorer</value>
<data name="AdvancedSecurityOptions" xml:space="preserve">
<value>Erweiterte Sicherheitsoptionen</value>
</data>
<data name="Https" xml:space="preserve">
<value>HTTPS</value>
<data name="OptionsPageTitle" xml:space="preserve">
<value>mRemoteNG Optionen</value>
</data>
<data name="Download" xml:space="preserve">
<value>Download</value>
<data name="CreateEmptyPanelOnStartUp" xml:space="preserve">
<value>Erstelle ein leeres Panel, wenn mRemoteNG gestartet wird</value>
</data>
<data name="MustBeBetween0And255" xml:space="preserve">
<value>Muss zwischen 0 und 255 liegen</value>
</data>
<data name="Delete" xml:space="preserve">
<value>Löschen</value>
</data>
<data name="ReconnectAllConnections" xml:space="preserve">
<value>Alle Verbindungen wieder verbinden</value>
</data>
<data name="DisconnectOthers" xml:space="preserve">
<value>Alles außer dieser Verbindung trennen</value>
</data>
<data name="ConfirmCloseConnectionOthersInstruction" xml:space="preserve">
<value>Sind Sie sicher, dass Sie alle Verbindungen bis auf "{0}" schließen wollen?</value>
</data>
<data name="AutomaticReconnectError" xml:space="preserve">
<value>Beim Versuch, die Verbindung zum RDP-Host '{0}' wiederherzustellen, ist ein Fehler aufgetreten</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>
<data name="ExceptionMessage" xml:space="preserve">
<value>Fehlermeldung</value>
</data>
<data name="UnhandledExceptionOccured" xml:space="preserve">
<value>Eine unbehandelte Ausnahme ist aufgetreten</value>
</data>
<data name="CopyHostname" xml:space="preserve">
<value>Hostnamen kopieren</value>
</data>
<data name="PlaceSearchBarAboveConnectionTree" xml:space="preserve">
<value>Suchleiste über den Verbindungen anzeigen</value>
</data>
<data name="CreateEmptyPanelOnStartUp" xml:space="preserve">
<value>Erstelle ein leeres Panel, wenn mRemoteNG gestartet wird</value>
<data name="TrackActiveConnectionInConnectionTree" xml:space="preserve">
<value>Aktive Verbindung im Verbindungsbaum verfolgen</value>
</data>
<data name="ReleaseChannel" xml:space="preserve">
<value>Update-Kanal</value>
@@ -1863,30 +1920,9 @@ Die Passwortlänge muss zwischen {0} und {1} liegen</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>
</data>
<data name="EncryptionKeyDerivationIterations" xml:space="preserve">
<value>Iterationen der Ableitungsfunktion</value>
</data>
<data name="Credentials" xml:space="preserve">
<value>Anmeldedaten</value>
</data>
<data name="Apply" xml:space="preserve">
<value>Anwenden</value>
</data>
<data name="OptionsThemeChangeWarning" xml:space="preserve">
<value>Warnung: Ein Neustart ist erforderlich, um Änderungen am Theme anzuwenden.</value>
</data>
<data name="Clipboard" xml:space="preserve">
<value>Zwischenablage</value>
</data>
<data name="PropertyDescriptionRedirectClipboard" xml:space="preserve">
<value>Umleitung der Zwischenablage erlauben.</value>
</data>
<data name="MultiSshToolbar" xml:space="preserve">
<value>Multi-SSH Symbolleiste</value>
</data>
<data name="PropertyDescriptionFavorite" xml:space="preserve">
<value>Zeige diese Verbindung in den Favoriten</value>
</data>
@@ -1905,8 +1941,8 @@ Nightly umfasst Alphas, Betas und Release Candidates.</value>
<data name="DoNotTrimUsername" xml:space="preserve">
<value>Leerzeichen nicht aus Benutzernamen entfernen</value>
</data>
<data name="UseVmId" xml:space="preserve">
<value>Benutze VM ID</value>
<data name="PropertyDescriptionRdpVersion" xml:space="preserve">
<value>Legt die Version des RDP fest, die beim Öffnen von Verbindungen verwendet wird.</value>
</data>
<data name="PropertyDescriptionUseVmId" xml:space="preserve">
<value>Verwenden Sie die VM ID, um eine Verbindung zu einer VM herzustellen die auf Hyper-V ausgeführt wird.</value>
@@ -1914,18 +1950,24 @@ Nightly umfasst Alphas, Betas und Release Candidates.</value>
<data name="PropertyDescriptionVmId" xml:space="preserve">
<value>Die ID der virtuellen Hyper-V-Maschine, zu der eine Verbindung hergestellt werden soll.</value>
</data>
<data name="UseVmId" xml:space="preserve">
<value>Benutze VM ID</value>
</data>
<data name="RdpProtocolVersionNotSupported" xml:space="preserve">
<value>RDP-Client konnte nicht erstellt werden. Die RDP-Protokollversion {0} wird auf diesem System nicht unterstützt. Bitte wählen Sie eine ältere Protokollversion.</value>
</data>
<data name="PropertyDescriptionRdpVersion" xml:space="preserve">
<value>Legt die Version des RDP fest, die beim Öffnen von Verbindungen verwendet wird.</value>
</data>
<data name="PropertyDescriptionSshTunnel" xml:space="preserve">
<value>Zum Verbinden mittels eines SSH Tunnels (Jump Host) geben Sie hier den Namen der SSH Verbindung an, welche benutzt werden soll um den SSH Tunnel einzurichten.</value>
</data>
<data name="SshTunnel" xml:space="preserve">
<value>SSH-Tunnel</value>
</data>
<data name="PropertyDescriptionSshOptions" xml:space="preserve">
<value>Geben Sie hier zusaetzliche Optionen an welche fuer die SSH Verbindung verwendet werden sollen. Fuer weitere Infos zu den moeglichen Optionen konsultieren sie die Putty Dokumentation.</value>
</data>
<data name="SshOptions" xml:space="preserve">
<value>SSH-Optionen</value>
</data>
<data name="SshTunnelConfigProblem" xml:space="preserve">
<value>Konfigurationsfehler der Verbindung. Verbindung zu: "{0}" via SSH Tunnel: "{1}" nicht möglich. Eine Verbindung mit dem als SSH Tunnel konfiguriertem Namen konnte nicht gefunden werden. Löschen Sie die SSH Tunnel Konfiguration or geben sie eine existierende SSH Verbindung an, welche zum Aufbau eine Tunnels zum Erreichen des eigentlichen Zielsystems verwendet werden soll.</value>
</data>
@@ -1950,6 +1992,9 @@ Nightly umfasst Alphas, Betas und Release Candidates.</value>
<data name="PropertyDescriptionPasswordProtect" xml:space="preserve">
<value>Legen Sie ein Kennwort fest, mit dem die Verbindungsdatei verschlüsselt werden soll. Sie werden aufgefordert Ihr Passwort einzugeben, bevor Sie mRemoteNG starten.</value>
</data>
<data name="UseEnhancedMode" xml:space="preserve">
<value>Erweiterten Modus verwenden</value>
</data>
<data name="CloseToSysTray" xml:space="preserve">
<value>In den System Tray schließen</value>
</data>
@@ -1962,75 +2007,21 @@ Nightly umfasst Alphas, Betas und Release Candidates.</value>
<data name="PropertyDescriptionDisableCursorShadow" xml:space="preserve">
<value>Legt fest, ob ein Mausschatten sichtbar sein soll.</value>
</data>
<data name="PropertyDescriptionDisableMenuAnimations" xml:space="preserve">
<value>Legt fest, ob Menüs und Fenster mit Animationseffekten in der Remote-Sitzung angezeigt werden können.</value>
</data>
<data name="PropertyDescriptionDisableFullWindowDrag" xml:space="preserve">
<value>Legt fest, ob der Fensterinhalt angezeigt wird, wenn Sie das Fenster an eine neue Position ziehen.</value>
</data>
<data name="PropertyDescriptionDisableMenuAnimations" xml:space="preserve">
<value>Legt fest, ob Menüs und Fenster mit Animationseffekten in der Remote-Sitzung angezeigt werden können.</value>
</data>
<data name="ShowHideMenu" xml:space="preserve">
<value>Verstecke/Zeige Menü</value>
</data>
<data name="WorkingDirColumnHeader" xml:space="preserve">
<value>Arbeitsverzeichnis</value>
</data>
<data name="WorkingDirectory" xml:space="preserve">
<value>Arbeitsverzeichnis:</value>
</data>
<data name="UseEnhancedMode" xml:space="preserve">
<value>Erweiterten Modus verwenden</value>
</data>
<data name="UnhandledExceptionOccured" xml:space="preserve">
<value>Eine unbehandelte Ausnahme ist aufgetreten</value>
</data>
<data name="ReconnectAllConnections" xml:space="preserve">
<value>Alle Verbindungen wieder verbinden</value>
</data>
<data name="QuickConnect" xml:space="preserve">
<value>Schnellverbindung</value>
</data>
<data name="SshOptions" xml:space="preserve">
<value>SSH-Optionen</value>
</data>
<data name="SshTunnel" xml:space="preserve">
<value>SSH-Tunnel</value>
</data>
<data name="MustBeBetween0And255" xml:space="preserve">
<value>Muss zwischen 0 und 255 liegen</value>
</data>
<data name="AutomaticReconnectError" xml:space="preserve">
<value>Beim Versuch, die Verbindung zum RDP-Host '{0}' wiederherzustellen, ist ein Fehler aufgetreten</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>
<data name="ConfirmCloseConnectionOthersInstruction" xml:space="preserve">
<value>Sind Sie sicher, dass Sie alle Verbindungen bis auf "{0}" schließen wollen?</value>
</data>
<data name="CopyHostname" xml:space="preserve">
<value>Hostnamen kopieren</value>
</data>
<data name="Delete" xml:space="preserve">
<value>Löschen</value>
</data>
<data name="DisconnectOthers" xml:space="preserve">
<value>Alles außer dieser Verbindung trennen</value>
</data>
<data name="LockToolbars" xml:space="preserve">
<value>Position der Symbolleiste sperren</value>
</data>
<data name="ExceptionMessage" xml:space="preserve">
<value>Fehlermeldung</value>
</data>
<data name="WebView2InitializationFailed" xml:space="preserve">
<value>WebView2-Erstellung fehlgeschlagen</value>
<data name="ApplyInheritanceToChildren" xml:space="preserve">
<value>Vererbung auf Kinder anwenden</value>
</data>
<data name="ApplyDefaultInheritance" xml:space="preserve">
<value>Standardvererbung anwenden</value>
</data>
<data name="ApplyInheritanceToChildren" xml:space="preserve">
<value>Vererbung auf Kinder anwenden</value>
</data>
<data name="PsCanceled" xml:space="preserve">
<value>Anmeldung abgebrochen! Bei bedarf neu einleiten.</value>
<comment>C# to Powershell transfer issue with encoding possible</comment>
@@ -2050,4 +2041,50 @@ Nightly umfasst Alphas, Betas und Release Candidates.</value>
<data name="OptionsCompanyPolicyMessage" xml:space="preserve">
<value>*Einige Einstellungen werden von Ihrem Unternehmen festgelegt. Für weitere Informationen wenden Sie sich an Ihren Systemadministrator.</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Gateway</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>Verbindungen beim Schließen speichern</value>
</data>
<data name="WebView2InitializationFailed" xml:space="preserve">
<value>WebView2-Erstellung fehlgeschlagen</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

View File

@@ -59,7 +59,7 @@
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="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>
@@ -105,19 +105,19 @@
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="MenuItem_About" xml:space="preserve">
<value>Σχετικά με</value>
</data>
<data name="AddNodeFromXmlFailed" xml:space="preserve">
@@ -222,9 +222,6 @@
<data name="Display" xml:space="preserve">
<value>Οθόνη</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Πύλη</value>
</data>
<data name="Miscellaneous" xml:space="preserve">
<value>Διάφορα</value>
</data>
@@ -273,4 +270,44 @@
<data name="ConnectionsFileCouldNotBeLoaded" xml:space="preserve">
<value>Το αρχείο συνδέσεων "{0}" δεν μπορεί να φορτωθεί!</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Πύλη</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

View File

@@ -59,7 +59,7 @@
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="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>
@@ -105,17 +105,17 @@
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ButtonDefaultProperties" xml:space="preserve">
<value>Propiedades por defecto</value>
@@ -309,4 +309,44 @@
<data name="ErrorVerifyDatabaseVersionFailed" xml:space="preserve">
<value>VerificarVersionBasedeDatos (Config.Connections.Save) falló. {0}</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbao" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

View File

@@ -117,7 +117,7 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<data name="MenuItem_About" xml:space="preserve">
<value>Acerca de</value>
</data>
<data name="AddNodeFromXmlFailed" xml:space="preserve">
@@ -225,9 +225,6 @@
<data name="Display" xml:space="preserve">
<value>Pantalla</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Puerta de Enlace</value>
</data>
<data name="Miscellaneous" xml:space="preserve">
<value>Varios</value>
</data>
@@ -628,7 +625,7 @@ Arrancando con un nuevo archivo de conexiones.</value>
<data name="AddConnectionPanel" xml:space="preserve">
<value>Agregar Panel de Conexión</value>
</data>
<data name="CheckForUpdates" xml:space="preserve">
<data name="MenuItem_CheckForUpdates" xml:space="preserve">
<value>Comprobar Actualizaciones</value>
</data>
<data name="Config" xml:space="preserve">
@@ -649,7 +646,7 @@ Arrancando con un nuevo archivo de conexiones.</value>
<data name="DeleteExternalTool" xml:space="preserve">
<value>Borrar Herramienta Externa...</value>
</data>
<data name="Donate" xml:space="preserve">
<data name="MenuItem_Donate" xml:space="preserve">
<value>Donar</value>
</data>
<data name="DuplicateTab" xml:space="preserve">
@@ -667,7 +664,7 @@ Arrancando con un nuevo archivo de conexiones.</value>
<data name="_Help" xml:space="preserve">
<value>&amp;Ayuda</value>
</data>
<data name="HelpContents" xml:space="preserve">
<data name="MenuItem_HelpContents" xml:space="preserve">
<value>Ayuda de mRemoteNG</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
@@ -709,7 +706,7 @@ Arrancando con un nuevo archivo de conexiones.</value>
<data name="RenameTab" xml:space="preserve">
<value>Renombrar Pestaña</value>
</data>
<data name="ReportBug" xml:space="preserve">
<data name="MenuItem_ReportIssue" xml:space="preserve">
<value>Informar de un Bug</value>
</data>
<data name="ResetLayout" xml:space="preserve">
@@ -739,7 +736,7 @@ Arrancando con un nuevo archivo de conexiones.</value>
<data name="StartChat" xml:space="preserve">
<value>Comenzar Chat (VNC)</value>
</data>
<data name="SupportForum" xml:space="preserve">
<data name="MenuItem_SupportForum" xml:space="preserve">
<value>Foro de Soporte</value>
</data>
<data name="_Tools" xml:space="preserve">
@@ -754,7 +751,7 @@ Arrancando con un nuevo archivo de conexiones.</value>
<data name="ViewOnly" xml:space="preserve">
<value>Solo Ver (VNC)</value>
</data>
<data name="Website" xml:space="preserve">
<data name="MenuItem_Website" xml:space="preserve">
<value>Sitio Web</value>
</data>
<data name="MinimizeToSysTray" xml:space="preserve">
@@ -1330,9 +1327,6 @@ Mensaje:
<data name="SaveConnectionsFileBeforeOpeningAnother" xml:space="preserve">
<value>¿Quiere guardar el actual archivo de conexiones antes de cargar otro?</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>Guardar conexiones al salir</value>
</data>
<data name="Screen" xml:space="preserve">
<value>Pantalla</value>
</data>
@@ -1541,4 +1535,47 @@ mRemoteNG ahora se cerrará y comenzará la instalación.</value>
<data name="Yes" xml:space="preserve">
<value>Sí</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Puerta de Enlace</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>Guardar conexiones al salir</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

View File

@@ -1,5 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<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">
@@ -79,4 +138,41 @@
<data name="Rdp65536Colors" xml:space="preserve">
<value>65536 Värit (16-bit)</value>
</data>
</root>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

File diff suppressed because it is too large Load Diff

View File

@@ -59,7 +59,7 @@
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="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>
@@ -105,19 +105,19 @@
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="MenuItem_About" xml:space="preserve">
<value>Névjegy</value>
</data>
<data name="Always" xml:space="preserve">
@@ -183,9 +183,6 @@
<data name="Display" xml:space="preserve">
<value>Képernyő</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Átjáró</value>
</data>
<data name="Miscellaneous" xml:space="preserve">
<value>Egyéb</value>
</data>
@@ -270,7 +267,7 @@
<data name="LanguageDefault" xml:space="preserve">
<value>(Automatikus észlelés)</value>
</data>
<data name="CheckForUpdates" xml:space="preserve">
<data name="MenuItem_CheckForUpdates" xml:space="preserve">
<value>Frissítés keresése</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
@@ -297,7 +294,7 @@
<data name="RenameTab" xml:space="preserve">
<value>Fül átnevezése</value>
</data>
<data name="ReportBug" xml:space="preserve">
<data name="MenuItem_ReportIssue" xml:space="preserve">
<value>Hibabejelentés</value>
</data>
<data name="ResetLayout" xml:space="preserve">
@@ -309,7 +306,7 @@
<data name="SaveConnectionFileAs" xml:space="preserve">
<value>Kapcsolatfájl mentése, mint...</value>
</data>
<data name="Website" xml:space="preserve">
<data name="MenuItem_Website" xml:space="preserve">
<value>Honlap</value>
</data>
<data name="Never" xml:space="preserve">
@@ -333,4 +330,44 @@
<data name="UseSQLServer" xml:space="preserve">
<value>SQL szerver használata a kapcsolatok kezelésére</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Átjáró</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

View File

@@ -59,7 +59,7 @@
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="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>
@@ -105,19 +105,19 @@
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="MenuItem_About" xml:space="preserve">
<value>Informazioni su</value>
</data>
<data name="AddNodeFromXmlFailed" xml:space="preserve">
@@ -225,9 +225,6 @@
<data name="Display" xml:space="preserve">
<value>Schermo</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Gateway</value>
</data>
<data name="Miscellaneous" xml:space="preserve">
<value>Altro</value>
</data>
@@ -625,7 +622,7 @@ Creazione di un nuovo file delle connessioni.</value>
<data name="AddConnectionPanel" xml:space="preserve">
<value>Aggiungi pannello delle connessioni</value>
</data>
<data name="CheckForUpdates" xml:space="preserve">
<data name="MenuItem_CheckForUpdates" xml:space="preserve">
<value>Verifica la presenza di aggiornamenti</value>
</data>
<data name="Config" xml:space="preserve">
@@ -646,7 +643,7 @@ Creazione di un nuovo file delle connessioni.</value>
<data name="DeleteExternalTool" xml:space="preserve">
<value>Elimina applicazione esterna...</value>
</data>
<data name="Donate" xml:space="preserve">
<data name="MenuItem_Donate" xml:space="preserve">
<value>Effettua una donazione</value>
</data>
<data name="DuplicateTab" xml:space="preserve">
@@ -664,7 +661,7 @@ Creazione di un nuovo file delle connessioni.</value>
<data name="_Help" xml:space="preserve">
<value>&amp;Aiuto</value>
</data>
<data name="HelpContents" xml:space="preserve">
<data name="MenuItem_HelpContents" xml:space="preserve">
<value>Guida di mRemoteNG</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
@@ -706,7 +703,7 @@ Creazione di un nuovo file delle connessioni.</value>
<data name="RenameTab" xml:space="preserve">
<value>Rinomina tab</value>
</data>
<data name="ReportBug" xml:space="preserve">
<data name="MenuItem_ReportIssue" xml:space="preserve">
<value>Segnala un bug</value>
</data>
<data name="ResetLayout" xml:space="preserve">
@@ -736,7 +733,7 @@ Creazione di un nuovo file delle connessioni.</value>
<data name="StartChat" xml:space="preserve">
<value>Avvia chat (VNC)</value>
</data>
<data name="SupportForum" xml:space="preserve">
<data name="MenuItem_SupportForum" xml:space="preserve">
<value>Forum di supporto</value>
</data>
<data name="_Tools" xml:space="preserve">
@@ -751,7 +748,7 @@ Creazione di un nuovo file delle connessioni.</value>
<data name="ViewOnly" xml:space="preserve">
<value>Visualizza soltanto (VNC)</value>
</data>
<data name="Website" xml:space="preserve">
<data name="MenuItem_Website" xml:space="preserve">
<value>Sito web</value>
</data>
<data name="MinimizeToSysTray" xml:space="preserve">
@@ -1342,9 +1339,6 @@ Messaggio:
<data name="SaveConnectionsFileBeforeOpeningAnother" xml:space="preserve">
<value>Vuoi salvare il file delle connessioni corrente prima di caricarne un altro?</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>Salva le connessioni all'uscita</value>
</data>
<data name="SaveImageFilter" xml:space="preserve">
<value>File Graphics Interchange Format (.gif)|*.gif|File Joint Photographic Experts Group (.jpeg)|*.jpeg|File Joint Photographic Experts Group (.jpg)|*.jpg|File Portable Network Graphics (.png)|*.png</value>
</data>
@@ -1556,4 +1550,50 @@ mRemoteNG verrà chiuso e l'installazione avrà inizio.</value>
<data name="Yes" xml:space="preserve">
<value>Sì</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Gateway</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>Salva le connessioni all'uscita</value>
</data>
<data name="VaultOpenbao" xml:space="preserve">
<value>Vault o Openbao</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

View File

@@ -117,7 +117,7 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<data name="MenuItem_About" xml:space="preserve">
<value>mRemoteNGについて</value>
</data>
<data name="ActiveDirectory" xml:space="preserve">
@@ -233,9 +233,6 @@
<data name="Display" xml:space="preserve">
<value>ディスプレイ</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>ゲートウェイ</value>
</data>
<data name="Miscellaneous" xml:space="preserve">
<value>その他</value>
</data>
@@ -726,7 +723,7 @@ Starting with new connections file.</value>
<data name="AddConnectionPanel" xml:space="preserve">
<value>接続表示パネルの追加</value>
</data>
<data name="CheckForUpdates" xml:space="preserve">
<data name="MenuItem_CheckForUpdates" xml:space="preserve">
<value>最新バージョンをチェック</value>
</data>
<data name="Config" xml:space="preserve">
@@ -747,7 +744,7 @@ Starting with new connections file.</value>
<data name="DeleteExternalTool" xml:space="preserve">
<value>外部ツールを削除...</value>
</data>
<data name="Donate" xml:space="preserve">
<data name="MenuItem_Donate" xml:space="preserve">
<value>寄付のお願い</value>
</data>
<data name="DuplicateTab" xml:space="preserve">
@@ -765,7 +762,7 @@ Starting with new connections file.</value>
<data name="_Help" xml:space="preserve">
<value>ヘルプ(&amp;H)</value>
</data>
<data name="HelpContents" xml:space="preserve">
<data name="MenuItem_HelpContents" xml:space="preserve">
<value>mRemoteNGヘルプ</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
@@ -807,7 +804,7 @@ Starting with new connections file.</value>
<data name="RenameTab" xml:space="preserve">
<value>タブ名を変更</value>
</data>
<data name="ReportBug" xml:space="preserve">
<data name="MenuItem_ReportIssue" xml:space="preserve">
<value>バグを報告する</value>
</data>
<data name="ResetLayout" xml:space="preserve">
@@ -838,7 +835,7 @@ Starting with new connections file.</value>
<data name="StartChat" xml:space="preserve">
<value>Start Chat (VNC)</value>
</data>
<data name="SupportForum" xml:space="preserve">
<data name="MenuItem_SupportForum" xml:space="preserve">
<value>サポートフォーラム</value>
</data>
<data name="_Tools" xml:space="preserve">
@@ -853,7 +850,7 @@ Starting with new connections file.</value>
<data name="ViewOnly" xml:space="preserve">
<value>View Only (VNC)</value>
</data>
<data name="Website" xml:space="preserve">
<data name="MenuItem_Website" xml:space="preserve">
<value>ウェブサイト(英語)</value>
</data>
<data name="MinimizeToSysTray" xml:space="preserve">
@@ -1486,9 +1483,6 @@ Message:
<data name="SaveConnectionsFileBeforeOpeningAnother" xml:space="preserve">
<value>Do you want to save the current connections file before loading another?</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>終了時に保存する</value>
</data>
<data name="SaveImageFilter" xml:space="preserve">
<value>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</value>
</data>
@@ -1716,4 +1710,47 @@ mRemoteNGを終了してインストールを開始します</value>
<data name="Yes" xml:space="preserve">
<value>はい</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>ゲートウェイ</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>終了時に保存する</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

File diff suppressed because it is too large Load Diff

View File

@@ -117,15 +117,34 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="PlaceSearchBarAboveConnectionTree" xml:space="preserve">
<value>Place search bar above connection tree</value>
<data name="ActiveDirectory" xml:space="preserve">
<value>Active Directory</value>
</data>
<data name="ErrorFipsPolicyIncompatible" xml:space="preserve">
<value>The Windows security setting, "System cryptography: Use FIPS compliant algorithms for encryption, hashing, and signing", is enabled.
See the Microsoft Support article at http://support.microsoft.com/kb/811833 for more information.
{0} is not fully FIPS compliant. Click OK to proceed at your own discretion, or Cancel to Exit.</value>
</data>
<data name="HttpInternetExplorer" xml:space="preserve">
<value>Internet Explorer</value>
</data>
<data name="None" xml:space="preserve">
<value>None</value>
</data>
<data name="PropertyDescriptionColors" xml:space="preserve">
<value>Select the color quality to be used.</value>
</data>
<data name="PropertyDescriptionRedirectClipboard" xml:space="preserve">
<value>Select whether clipboard should be shared.</value>
</data>
<data name="Colors" xml:space="preserve">
<value>Colors</value>
</data>
<data name="Clipboard" xml:space="preserve">
<value>Clipboard</value>
</data>
<data name="Rdp16777216Colors" xml:space="preserve">
<value>16777216 Colors (24-bit)</value>
</data>
@@ -141,91 +160,109 @@
<data name="Rdp65536Colors" xml:space="preserve">
<value>65536 Colors (16-bit)</value>
</data>
<data name="ActiveDirectory" xml:space="preserve">
<value>Active Directory</value>
</data>
<data name="ErrorFipsPolicyIncompatible" xml:space="preserve">
<value>The Windows security setting, "System cryptography: Use FIPS compliant algorithms for encryption, hashing, and signing", is enabled.
See the Microsoft Support article at http://support.microsoft.com/kb/811833 for more information.
{0} is not fully FIPS compliant. Click OK to proceed at your own discretion, or Cancel to Exit.</value>
</data>
<data name="HttpInternetExplorer" xml:space="preserve">
<value>Internet Explorer</value>
</data>
<data name="None" xml:space="preserve">
<value>None</value>
</data>
<data name="PropertyDescriptionRedirectClipboard" xml:space="preserve">
<value>Select whether clipboard should be shared.</value>
</data>
<data name="Clipboard" xml:space="preserve">
<value>Clipboard</value>
</data>
<data name="OptionsThemeChangeWarning" xml:space="preserve">
<value>Warning: Restart is required to commit any theme configuration change.</value>
</data>
<value>Warning: Restart is required to commit any theme configuration change.</value>
</data>
<data name="MustBeBetween0And255" xml:space="preserve">
<value>Must Be Between 0 and 255</value>
</data>
<value>Must Be Between 0 and 255</value>
</data>
<data name="OutOfRange" xml:space="preserve">
<value>Out Of Range</value>
</data>
<value>Out Of Range</value>
</data>
<data name="Delete" xml:space="preserve">
<value>Delete...</value>
</data>
<value>Delete...</value>
</data>
<data name="ReconnectAllConnections" xml:space="preserve">
<value>Reconnect All Connections</value>
</data>
<value>Reconnect All Connections</value>
</data>
<data name="UltraVNCSingleClick" xml:space="preserve">
<value>UltraVNC SingleClick</value>
</data>
<value>UltraVNC SingleClick</value>
</data>
<data name="DisconnectOthers" xml:space="preserve">
<value>Disconnect All But This</value>
</data>
<value>Disconnect All But This</value>
</data>
<data name="AutomaticReconnectError" xml:space="preserve">
<value>An error occurred while trying to reconnect to RDP host '{0}'</value>
</data>
<value>An error occurred while trying to reconnect to RDP host '{0}'</value>
</data>
<data name="ChangeConnectionResolutionError" xml:space="preserve">
<value>An error occurred while trying to change the connection resolution to host '{0}'</value>
</data>
<value>An error occurred while trying to change the connection resolution to host '{0}'</value>
</data>
<data name="StackTrace" xml:space="preserve">
<value>Stack trace</value>
</data>
<value>Stack trace</value>
</data>
<data name="ExceptionMessage" xml:space="preserve">
<value>Exception Message</value>
</data>
<value>Exception Message</value>
</data>
<data name="mRemoteNGUnhandledException" xml:space="preserve">
<value>mRemoteNG Unhandled Exception</value>
</data>
<value>mRemoteNG Unhandled Exception</value>
</data>
<data name="UnhandledExceptionOccured" xml:space="preserve">
<value>An unhandled exception has occurred</value>
</data>
<value>An unhandled exception has occurred</value>
</data>
<data name="ExceptionForcesmRemoteNGToClose" xml:space="preserve">
<value>This exception will force mRemoteNG to close</value>
</data>
<value>This exception will force mRemoteNG to close</value>
</data>
<data name="CopyHostname" xml:space="preserve">
<value>Copy Hostname</value>
</data>
<value>Copy Hostname</value>
</data>
<data name="PlaceSearchBarAboveConnectionTree" xml:space="preserve">
<value>Place search bar above connection tree</value>
</data>
<data name="TrackActiveConnectionInConnectionTree" xml:space="preserve">
<value>Track active connection in the connection tree</value>
</data>
<value>Track active connection in the connection tree</value>
</data>
<data name="AlwaysShowConnectionTabs" xml:space="preserve">
<value>Always show connection tabs</value>
</data>
<value>Always show connection tabs</value>
</data>
<data name="ReleaseChannel" xml:space="preserve">
<value>Release Channel</value>
</data>
<value>Release Channel</value>
</data>
<data name="ReleaseChannelExplanation" xml:space="preserve">
<value>Stable channel includes final releases only.
<value>Stable channel includes final releases only.
Preview channel includes Betas &amp; Release Candidates.
Nightly Channel includes Alphas, Betas &amp; Release Candidates.</value>
</data>
</data>
<data name="Apply" xml:space="preserve">
<value>Apply</value>
</data>
<value>Apply</value>
</data>
<data name="Proxy" xml:space="preserve">
<value>Proxy</value>
</data>
<value>Proxy</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

View File

@@ -117,7 +117,7 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<data name="MenuItem_About" xml:space="preserve">
<value>Om</value>
</data>
<data name="AddNodeFromXmlFailed" xml:space="preserve">
@@ -195,6 +195,9 @@
<data name="Inheritance" xml:space="preserve">
<value>Arv</value>
</data>
<data name="_Launch" xml:space="preserve">
<value>&amp;Start</value>
</data>
<data name="ButtonLaunchPutty" xml:space="preserve">
<value>Start PuTTY</value>
</data>
@@ -225,9 +228,6 @@
<data name="Display" xml:space="preserve">
<value>Skjerm</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Gateway</value>
</data>
<data name="Miscellaneous" xml:space="preserve">
<value>Diverse</value>
</data>
@@ -294,9 +294,18 @@
<data name="Message" xml:space="preserve">
<value>Melding</value>
</data>
<data name="CommandExitProgram" xml:space="preserve">
<value>Avslu&amp;tt {0}</value>
</data>
<data name="CommandLineArgsCouldNotBeParsed" xml:space="preserve">
<value>Kunne ikke tolke kommandolinjeargumenter!</value>
</data>
<data name="CommandOpenConnectionFile" xml:space="preserve">
<value>Åpne tilkoblingsfil</value>
</data>
<data name="_TryAgain" xml:space="preserve">
<value>Prøv igjen</value>
</data>
<data name="CompatibilityLenovoAutoScrollUtilityDetected" xml:space="preserve">
<value>{0} har oppdaget at Lenovo Auto Scroll-verktøyet kjører på dette systemet. Dette verktøyet er kjent for å forårsake problemer med {0}. Det anbefales at du deaktiverer eller avinstallerer dette programmet.</value>
</data>
@@ -394,6 +403,9 @@ Starter med ny tilkoblingsfil.</value>
<data name="ConnectionsFileCouldNotSaveAs" xml:space="preserve">
<value>Kunne ikke lagre tilkoblingsfilen som "{0}"!</value>
</data>
<data name="ConnectNoCredentials" xml:space="preserve">
<value>Koble til uten legitimasjon</value>
</data>
<data name="ConnectToConsoleSession" xml:space="preserve">
<value>Koble til konsolløkt</value>
</data>
@@ -418,6 +430,9 @@ Starter med ny tilkoblingsfil.</value>
<data name="Detect" xml:space="preserve">
<value>Oppdag</value>
</data>
<data name="DontConnectToConsoleSession" xml:space="preserve">
<value>Ikke koble til konsollsesjon</value>
</data>
<data name="DontConnectWhenAuthFails" xml:space="preserve">
<value>Ikke koble til dersom godkjenning mislykkes</value>
</data>
@@ -457,12 +472,23 @@ Starter med ny tilkoblingsfil.</value>
<data name="ErrorConnectionListSaveFailed" xml:space="preserve">
<value>Tilkoblingslisten kan ikke lagres.</value>
</data>
<data name="ErrorCouldNotLaunchPutty" xml:space="preserve">
<value>PuTTY kunne ikke startes.</value>
</data>
<data name="ErrorDecryptionFailed" xml:space="preserve">
<value>Dekryptering mislyktes. {0}</value>
</data>
<data name="ErrorEncryptionFailed" xml:space="preserve">
<value>Kryptering mislyktes. {0}</value>
</data>
<data name="ErrorFipsPolicyIncompatible" xml:space="preserve">
<value>Sikkerhetsinnstillingen "Systemkryptografi: Bruk FIPS-kompatible algoritmer til kryptering, hash-koding og signering" i Windows er aktivert.
Se Microsofts support-artikkel på http://support.microsoft.com/kb/811833 for mer informasjon.
{0} er ikke fullt ut FIPS-kompatibel. Klikk OK for å fortsette, eller Avbryt for å avslutte.
</value>
</data>
<data name="Errors" xml:space="preserve">
<value>Feil</value>
</data>
@@ -481,9 +507,39 @@ Starter med ny tilkoblingsfil.</value>
<data name="Export" xml:space="preserve">
<value>Eksporter</value>
</data>
<data name="ExportEverything" xml:space="preserve">
<value>Eksporter alt</value>
</data>
<data name="ExportFile" xml:space="preserve">
<value>Eksporter fil</value>
</data>
<data name="ExportItems" xml:space="preserve">
<value>Eksporter elementer</value>
</data>
<data name="ExportProperties" xml:space="preserve">
<value>Eksporter egenskaper</value>
</data>
<data name="ExportSelectedConnection" xml:space="preserve">
<value>Eksporter valgt tilkobling</value>
</data>
<data name="ExportSelectedFolder" xml:space="preserve">
<value>Eksporter valgt mappe</value>
</data>
<data name="_ExportToFile" xml:space="preserve">
<value>&amp;Eksporter til fil...</value>
</data>
<data name="ExternalToolDefaultName" xml:space="preserve">
<value>Nytt eksternt verktøy</value>
</data>
<data name="FileFormat" xml:space="preserve">
<value>&amp;Filformat:</value>
</data>
<data name="FilterAll" xml:space="preserve">
<value>Alle filer (*.*)</value>
</data>
<data name="FilterAllImportable" xml:space="preserve">
<value>Alle filer som kan importeres</value>
</data>
<data name="FilterApplication" xml:space="preserve">
<value>Programfiler (*.exe)</value>
</data>
@@ -493,6 +549,12 @@ Starter med ny tilkoblingsfil.</value>
<data name="FiltermRemoteXML" xml:space="preserve">
<value>mRemote XML-filer (*.xml)</value>
</data>
<data name="FilterPuttyConnectionManager" xml:space="preserve">
<value>PuTTY Connection Manager-filer</value>
</data>
<data name="FilterRdgFiles" xml:space="preserve">
<value>Remote Desktop Connection Manager-filer (*.rdg)</value>
</data>
<data name="FilterRDP" xml:space="preserve">
<value>RDP-filer (*.rdp)</value>
</data>
@@ -544,6 +606,12 @@ Starter med ny tilkoblingsfil.</value>
<data name="ImportAD" xml:space="preserve">
<value>Importer fra Active Directory</value>
</data>
<data name="ImportFileFailedContent" xml:space="preserve">
<value>En feil har oppstått under import av filen "{0}".</value>
</data>
<data name="ImportFromFile" xml:space="preserve">
<value>Importer fra &amp;fil...</value>
</data>
<data name="ImportPortScan" xml:space="preserve">
<value>Import fra Port Scan</value>
</data>
@@ -625,6 +693,9 @@ Starter med ny tilkoblingsfil.</value>
<data name="LoadFromSqlFailed" xml:space="preserve">
<value>Innlasting fra SQL mislyktes!</value>
</data>
<data name="LoadFromSqlFailedContent" xml:space="preserve">
<value>Tilkoblingsinformasjonen kunne ikke lastes fra SQL server.</value>
</data>
<data name="LoadFromXmlFailed" xml:space="preserve">
<value>Innlasting fra XML mislyktes!</value>
</data>
@@ -637,7 +708,7 @@ Starter med ny tilkoblingsfil.</value>
<data name="AddConnectionPanel" xml:space="preserve">
<value>Legg til tilkoblingspanel</value>
</data>
<data name="CheckForUpdates" xml:space="preserve">
<data name="MenuItem_CheckForUpdates" xml:space="preserve">
<value>Se etter oppdateringer</value>
</data>
<data name="Config" xml:space="preserve">
@@ -658,7 +729,7 @@ Starter med ny tilkoblingsfil.</value>
<data name="DeleteExternalTool" xml:space="preserve">
<value>Slett eksternt verktøy...</value>
</data>
<data name="Donate" xml:space="preserve">
<data name="MenuItem_Donate" xml:space="preserve">
<value>Donér</value>
</data>
<data name="DuplicateTab" xml:space="preserve">
@@ -676,7 +747,7 @@ Starter med ny tilkoblingsfil.</value>
<data name="_Help" xml:space="preserve">
<value>&amp;Hjelp</value>
</data>
<data name="HelpContents" xml:space="preserve">
<data name="MenuItem_HelpContents" xml:space="preserve">
<value>mRemoteNG-hjelp</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
@@ -718,7 +789,7 @@ Starter med ny tilkoblingsfil.</value>
<data name="RenameTab" xml:space="preserve">
<value>Gi nytt navn til fane</value>
</data>
<data name="ReportBug" xml:space="preserve">
<data name="MenuItem_ReportIssue" xml:space="preserve">
<value>Rapporter en feil</value>
</data>
<data name="ResetLayout" xml:space="preserve">
@@ -748,7 +819,7 @@ Starter med ny tilkoblingsfil.</value>
<data name="StartChat" xml:space="preserve">
<value>Start chat (VNC)</value>
</data>
<data name="SupportForum" xml:space="preserve">
<data name="MenuItem_SupportForum" xml:space="preserve">
<value>Forum for brukerstøtte</value>
</data>
<data name="_Tools" xml:space="preserve">
@@ -763,7 +834,7 @@ Starter med ny tilkoblingsfil.</value>
<data name="ViewOnly" xml:space="preserve">
<value>Kun visning (VNC)</value>
</data>
<data name="Website" xml:space="preserve">
<data name="MenuItem_Website" xml:space="preserve">
<value>Nettsted</value>
</data>
<data name="MinimizeToSysTray" xml:space="preserve">
@@ -838,9 +909,18 @@ Starter med ny tilkoblingsfil.</value>
<data name="PasswordProtect" xml:space="preserve">
<value>Passordbeskyttelse</value>
</data>
<data name="PasswordStatusMustMatch" xml:space="preserve">
<value>Begge passordene må være like.</value>
</data>
<data name="PasswordStatusTooShort" xml:space="preserve">
<value>Passordet må være minst 3 tegn langt.</value>
</data>
<data name="PleaseFillAllFields" xml:space="preserve">
<value>Vennligst fyll inn alle felt</value>
</data>
<data name="PortScanComplete" xml:space="preserve">
<value>Portskanning ferdig.</value>
</data>
<data name="PortScanCouldNotLoadPanel" xml:space="preserve">
<value>Kunne ikke laste inn portskanningpanelet!</value>
</data>
@@ -856,6 +936,9 @@ Starter med ny tilkoblingsfil.</value>
<data name="PropertyDescriptionAuthenticationMode" xml:space="preserve">
<value>Velg hvordan du ønsker å autentisere deg mot VNC-serveren.</value>
</data>
<data name="PropertyDescriptionAutomaticResize" xml:space="preserve">
<value>Velg om tilkoblingen skal endre størrelse når vinduet endrer størrelse eller fullskjermsmodus slås av eller på. Krever RDC 8.0 eller høyere.</value>
</data>
<data name="PropertyDescriptionCacheBitmaps" xml:space="preserve">
<value>Velg om du vil bruke hurtigbufring av punktgrafikk eller ikke.</value>
</data>
@@ -898,6 +981,9 @@ Starter med ny tilkoblingsfil.</value>
<data name="PropertyDescriptionIcon" xml:space="preserve">
<value>Velg et ikon som skal vises når man er tilkoblet verten.</value>
</data>
<data name="PropertyDescriptionLoadBalanceInfo" xml:space="preserve">
<value>Angi informasjon for lastbalanseringsrutere for å velge den beste verten.</value>
</data>
<data name="PropertyDescriptionMACAddress" xml:space="preserve">
<value>Angi MAC-adressen til den eksterne verten dersom du ønsker å bruke denne i et eksternt verktøy.</value>
</data>
@@ -946,12 +1032,18 @@ Starter med ny tilkoblingsfil.</value>
<data name="PropertyDescriptionRedirectPrinters" xml:space="preserve">
<value>Velg om lokale skrivere skal vises på den eksterne verten.</value>
</data>
<data name="PropertyDescriptionRedirectClipboard" xml:space="preserve">
<value>Velg om utklippstavlen skal deles.</value>
</data>
<data name="PropertyDescriptionRedirectSmartCards" xml:space="preserve">
<value>Velg om lokale smartkort skal være tilgjengelig på den eksterne verten.</value>
</data>
<data name="PropertyDescriptionRedirectSounds" xml:space="preserve">
<value>Velg hvordan ekstern lyd skal omadresseres.</value>
</data>
<data name="PropertyDescriptionRedirectAudioCapture" xml:space="preserve">
<value>Velg om standard lydinndataenhet på den eksterne maskinen skal omadresseres til denne maskinen.</value>
</data>
<data name="PropertyDescriptionRenderingEngine" xml:space="preserve">
<value>Velg en av de tilgjengelige renderingsmotorene som skal brukes til å vise HTML.</value>
</data>
@@ -1003,6 +1095,9 @@ Starter med ny tilkoblingsfil.</value>
<data name="AuthenticationMode" xml:space="preserve">
<value>Godkjenningsmodus</value>
</data>
<data name="AutomaticResize" xml:space="preserve">
<value>Automatisk størrelsesendring</value>
</data>
<data name="CacheBitmaps" xml:space="preserve">
<value>Hurtigbufring av punktgrafikk</value>
</data>
@@ -1039,6 +1134,9 @@ Starter med ny tilkoblingsfil.</value>
<data name="ExternalToolBefore" xml:space="preserve">
<value>Eksternt verktøy før</value>
</data>
<data name="LoadBalanceInfo" xml:space="preserve">
<value>Lastbalanseringsinformasjon</value>
</data>
<data name="MacAddress" xml:space="preserve">
<value>MAC-adresse</value>
</data>
@@ -1087,9 +1185,15 @@ Starter med ny tilkoblingsfil.</value>
<data name="Printers" xml:space="preserve">
<value>Skrivere</value>
</data>
<data name="Clipboard" xml:space="preserve">
<value>Utklippstavle</value>
</data>
<data name="Sounds" xml:space="preserve">
<value>Lyder</value>
</data>
<data name="AudioCapture" xml:space="preserve">
<value>Lydopptak</value>
</data>
<data name="RenderingEngine" xml:space="preserve">
<value>Renderingsmotor</value>
</data>
@@ -1355,9 +1459,6 @@ Starter med ny tilkoblingsfil.</value>
<data name="SaveConnectionsFileBeforeOpeningAnother" xml:space="preserve">
<value>Vil du lagre den gjeldende tilkoblingsfilen før du laster inn en annen?</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>Lagre tilkoblinger ved avslutning</value>
</data>
<data name="SaveImageFilter" xml:space="preserve">
<value>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</value>
</data>
@@ -1469,6 +1570,9 @@ Starter med ny tilkoblingsfil.</value>
<data name="TitlePassword" xml:space="preserve">
<value>Passord</value>
</data>
<data name="TitlePasswordWithName" xml:space="preserve">
<value>Passord for {0}</value>
</data>
<data name="TitleSelectPanel" xml:space="preserve">
<value>Velg panel</value>
</data>
@@ -1481,6 +1585,9 @@ Starter med ny tilkoblingsfil.</value>
<data name="TryToIntegrate" xml:space="preserve">
<value>Prøv å integrere</value>
</data>
<data name="ShowOnToolbar" xml:space="preserve">
<value>Vis på verktøylinjen</value>
</data>
<data name="UltraVncRepeater" xml:space="preserve">
<value>Ultra VNC Repeater</value>
</data>
@@ -1521,6 +1628,9 @@ mRemoteNG vil nå avslutte og starte installasjonen.</value>
<data name="Weekly" xml:space="preserve">
<value>Ukentlig</value>
</data>
<data name="UpdateGetChangeLogFailed" xml:space="preserve">
<value>Endringsloggen kunne ikke lastes ned.</value>
</data>
<data name="UseDifferentUsernameAndPassword" xml:space="preserve">
<value>Bruk et annet brukernavn og/eller passord</value>
</data>
@@ -1572,122 +1682,6 @@ mRemoteNG vil nå avslutte og starte installasjonen.</value>
<data name="Yes" xml:space="preserve">
<value>Ja</value>
</data>
<data name="_Launch" xml:space="preserve">
<value>&amp;Start</value>
</data>
<data name="CommandExitProgram" xml:space="preserve">
<value>Avslu&amp;tt {0}</value>
</data>
<data name="CommandOpenConnectionFile" xml:space="preserve">
<value>Åpne tilkoblingsfil</value>
</data>
<data name="_TryAgain" xml:space="preserve">
<value>Prøv igjen</value>
</data>
<data name="ConnectNoCredentials" xml:space="preserve">
<value>Koble til uten legitimasjon</value>
</data>
<data name="DontConnectToConsoleSession" xml:space="preserve">
<value>Ikke koble til konsollsesjon</value>
</data>
<data name="ErrorCouldNotLaunchPutty" xml:space="preserve">
<value>PuTTY kunne ikke startes.</value>
</data>
<data name="ErrorFipsPolicyIncompatible" xml:space="preserve">
<value>Sikkerhetsinnstillingen "Systemkryptografi: Bruk FIPS-kompatible algoritmer til kryptering, hash-koding og signering" i Windows er aktivert.
Se Microsofts support-artikkel på http://support.microsoft.com/kb/811833 for mer informasjon.
{0} er ikke fullt ut FIPS-kompatibel. Klikk OK for å fortsette, eller Avbryt for å avslutte.
</value>
</data>
<data name="ExportEverything" xml:space="preserve">
<value>Eksporter alt</value>
</data>
<data name="ExportFile" xml:space="preserve">
<value>Eksporter fil</value>
</data>
<data name="ExportItems" xml:space="preserve">
<value>Eksporter elementer</value>
</data>
<data name="ExportProperties" xml:space="preserve">
<value>Eksporter egenskaper</value>
</data>
<data name="ExportSelectedConnection" xml:space="preserve">
<value>Eksporter valgt tilkobling</value>
</data>
<data name="ExportSelectedFolder" xml:space="preserve">
<value>Eksporter valgt mappe</value>
</data>
<data name="_ExportToFile" xml:space="preserve">
<value>&amp;Eksporter til fil...</value>
</data>
<data name="ExternalToolDefaultName" xml:space="preserve">
<value>Nytt eksternt verktøy</value>
</data>
<data name="FileFormat" xml:space="preserve">
<value>&amp;Filformat:</value>
</data>
<data name="FilterAllImportable" xml:space="preserve">
<value>Alle filer som kan importeres</value>
</data>
<data name="FilterPuttyConnectionManager" xml:space="preserve">
<value>PuTTY Connection Manager-filer</value>
</data>
<data name="FilterRdgFiles" xml:space="preserve">
<value>Remote Desktop Connection Manager-filer (*.rdg)</value>
</data>
<data name="ImportFileFailedContent" xml:space="preserve">
<value>En feil har oppstått under import av filen "{0}".</value>
</data>
<data name="ImportFromFile" xml:space="preserve">
<value>Importer fra &amp;fil...</value>
</data>
<data name="LoadFromSqlFailedContent" xml:space="preserve">
<value>Tilkoblingsinformasjonen kunne ikke lastes fra SQL server.</value>
</data>
<data name="PasswordStatusMustMatch" xml:space="preserve">
<value>Begge passordene må være like.</value>
</data>
<data name="PasswordStatusTooShort" xml:space="preserve">
<value>Passordet må være minst 3 tegn langt.</value>
</data>
<data name="PortScanComplete" xml:space="preserve">
<value>Portskanning ferdig.</value>
</data>
<data name="PropertyDescriptionAutomaticResize" xml:space="preserve">
<value>Velg om tilkoblingen skal endre størrelse når vinduet endrer størrelse eller fullskjermsmodus slås av eller på. Krever RDC 8.0 eller høyere.</value>
</data>
<data name="PropertyDescriptionLoadBalanceInfo" xml:space="preserve">
<value>Angi informasjon for lastbalanseringsrutere for å velge den beste verten.</value>
</data>
<data name="PropertyDescriptionRedirectClipboard" xml:space="preserve">
<value>Velg om utklippstavlen skal deles.</value>
</data>
<data name="PropertyDescriptionRedirectAudioCapture" xml:space="preserve">
<value>Velg om standard lydinndataenhet på den eksterne maskinen skal omadresseres til denne maskinen.</value>
</data>
<data name="AutomaticResize" xml:space="preserve">
<value>Automatisk størrelsesendring</value>
</data>
<data name="LoadBalanceInfo" xml:space="preserve">
<value>Lastbalanseringsinformasjon</value>
</data>
<data name="Clipboard" xml:space="preserve">
<value>Utklippstavle</value>
</data>
<data name="AudioCapture" xml:space="preserve">
<value>Lydopptak</value>
</data>
<data name="TitlePasswordWithName" xml:space="preserve">
<value>Passord for {0}</value>
</data>
<data name="ShowOnToolbar" xml:space="preserve">
<value>Vis på verktøylinjen</value>
</data>
<data name="UpdateGetChangeLogFailed" xml:space="preserve">
<value>Endringsloggen kunne ikke lastes ned.</value>
</data>
<data name="RdpOverallConnectionTimeout" xml:space="preserve">
<value>RDP tidsavbrudd</value>
</data>
@@ -2005,4 +1999,47 @@ Nightly-kanalen inkluderer alpha-, beta- og release candidate-versjoner.</value>
<data name="Environment" xml:space="preserve">
<value>Miljø</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Gateway</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>Lagre tilkoblinger ved avslutning</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

View File

@@ -117,7 +117,7 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<data name="MenuItem_About" xml:space="preserve">
<value>Over</value>
</data>
<data name="AddNodeFromXmlFailed" xml:space="preserve">
@@ -225,9 +225,6 @@
<data name="Display" xml:space="preserve">
<value>Scherm</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Gateway</value>
</data>
<data name="Miscellaneous" xml:space="preserve">
<value>Diversen</value>
</data>
@@ -634,7 +631,7 @@ Beginnen met nieuwe Connectie bestand.</value>
<data name="AddConnectionPanel" xml:space="preserve">
<value>Voeg Connectie Paneel toe</value>
</data>
<data name="CheckForUpdates" xml:space="preserve">
<data name="MenuItem_CheckForUpdates" xml:space="preserve">
<value>Controleer voor beschikbare Updates</value>
</data>
<data name="Config" xml:space="preserve">
@@ -655,7 +652,7 @@ Beginnen met nieuwe Connectie bestand.</value>
<data name="DeleteExternalTool" xml:space="preserve">
<value>Verwijder Externe Applicatie...</value>
</data>
<data name="Donate" xml:space="preserve">
<data name="MenuItem_Donate" xml:space="preserve">
<value>Doneer</value>
</data>
<data name="DuplicateTab" xml:space="preserve">
@@ -673,7 +670,7 @@ Beginnen met nieuwe Connectie bestand.</value>
<data name="_Help" xml:space="preserve">
<value>&amp;Help</value>
</data>
<data name="HelpContents" xml:space="preserve">
<data name="MenuItem_HelpContents" xml:space="preserve">
<value>mRemoteNG Help</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
@@ -715,7 +712,7 @@ Beginnen met nieuwe Connectie bestand.</value>
<data name="RenameTab" xml:space="preserve">
<value>Hernoem Tab</value>
</data>
<data name="ReportBug" xml:space="preserve">
<data name="MenuItem_ReportIssue" xml:space="preserve">
<value>Meld een bug</value>
</data>
<data name="ResetLayout" xml:space="preserve">
@@ -745,7 +742,7 @@ Beginnen met nieuwe Connectie bestand.</value>
<data name="StartChat" xml:space="preserve">
<value>Start Chat (VNC)</value>
</data>
<data name="SupportForum" xml:space="preserve">
<data name="MenuItem_SupportForum" xml:space="preserve">
<value>Ondersteunings Forum</value>
</data>
<data name="_Tools" xml:space="preserve">
@@ -760,7 +757,7 @@ Beginnen met nieuwe Connectie bestand.</value>
<data name="ViewOnly" xml:space="preserve">
<value>Alleen bekijken (VNC)</value>
</data>
<data name="Website" xml:space="preserve">
<data name="MenuItem_Website" xml:space="preserve">
<value>Website</value>
</data>
<data name="MinimizeToSysTray" xml:space="preserve">
@@ -1355,9 +1352,6 @@ Bericht:
<data name="SaveConnectionsFileBeforeOpeningAnother" xml:space="preserve">
<value>Wil je de huidige verbindingen opslaan voordat er een andere wordt geopend?</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>Sla verbindingen op bij afsluiten</value>
</data>
<data name="SaveImageFilter" xml:space="preserve">
<value>Graphics Interchange Format bestand (.gif)|*.gif|Joint Photographic Experts Group bestand (.jpeg)|*.jpeg|Joint Photographic Experts Group bestand (.jpg)|*.jpg|Portable Network Graphics bestand (.png)|*.png</value>
</data>
@@ -1588,4 +1582,47 @@ mRemoteNG zal nu worden gesloten en beginnen met de installatie.</value>
<value>Maximaal aantal inlogpogingen overschreden. Maak opnieuw verbinding.</value>
<comment>C# to Powershell transfer issue with encoding possible</comment>
</data>
<data name="Gateway" xml:space="preserve">
<value>Gateway</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>Sla verbindingen op bij afsluiten</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

View File

@@ -117,7 +117,7 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<data name="MenuItem_About" xml:space="preserve">
<value>O programie</value>
</data>
<data name="ActiveDirectory" xml:space="preserve">
@@ -231,9 +231,6 @@
<data name="Display" xml:space="preserve">
<value>Wyświetl</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Brama</value>
</data>
<data name="Miscellaneous" xml:space="preserve">
<value>Pozostałe</value>
</data>
@@ -725,7 +722,7 @@ Więcj informacji w aktykule Wsparcia Windows na stronie https://support.microso
<data name="AddConnectionPanel" xml:space="preserve">
<value>Dodaj panel połączenia</value>
</data>
<data name="CheckForUpdates" xml:space="preserve">
<data name="MenuItem_CheckForUpdates" xml:space="preserve">
<value>Sprawdź aktualizacje</value>
</data>
<data name="Config" xml:space="preserve">
@@ -746,7 +743,7 @@ Więcj informacji w aktykule Wsparcia Windows na stronie https://support.microso
<data name="DeleteExternalTool" xml:space="preserve">
<value>Usuń zewnętrzne narzędzie...</value>
</data>
<data name="Donate" xml:space="preserve">
<data name="MenuItem_Donate" xml:space="preserve">
<value>Darowizna</value>
</data>
<data name="DuplicateTab" xml:space="preserve">
@@ -764,7 +761,7 @@ Więcj informacji w aktykule Wsparcia Windows na stronie https://support.microso
<data name="_Help" xml:space="preserve">
<value>&amp;Pomoc</value>
</data>
<data name="HelpContents" xml:space="preserve">
<data name="MenuItem_HelpContents" xml:space="preserve">
<value>Pomoc mRemoteNG</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
@@ -806,7 +803,7 @@ Więcj informacji w aktykule Wsparcia Windows na stronie https://support.microso
<data name="RenameTab" xml:space="preserve">
<value>Zmień nazwę karty</value>
</data>
<data name="ReportBug" xml:space="preserve">
<data name="MenuItem_ReportIssue" xml:space="preserve">
<value>Zgłoś błąd</value>
</data>
<data name="ResetLayout" xml:space="preserve">
@@ -836,7 +833,7 @@ Więcj informacji w aktykule Wsparcia Windows na stronie https://support.microso
<data name="StartChat" xml:space="preserve">
<value>Rozpocznij Chat (VNC)</value>
</data>
<data name="SupportForum" xml:space="preserve">
<data name="MenuItem_SupportForum" xml:space="preserve">
<value>Forum pomocy</value>
</data>
<data name="_Tools" xml:space="preserve">
@@ -851,7 +848,7 @@ Więcj informacji w aktykule Wsparcia Windows na stronie https://support.microso
<data name="ViewOnly" xml:space="preserve">
<value>Tylko pogląd (VNC)</value>
</data>
<data name="Website" xml:space="preserve">
<data name="MenuItem_Website" xml:space="preserve">
<value>Strona WWW</value>
</data>
<data name="MinimizeToSysTray" xml:space="preserve">
@@ -2155,6 +2152,9 @@ Kanał nocny obejmuje wersje alfa, beta i RC (gotowe do wydania).</value>
<data name="PowerShell" xml:space="preserve">
<value>PowerShell</value>
</data>
<data name="Terminal" xml:space="preserve">
<value>Terminal</value>
</data>
<data name="Changelog" xml:space="preserve">
<value>Dziennik zmian</value>
</data>
@@ -2359,4 +2359,47 @@ Kanał nocny obejmuje wersje alfa, beta i RC (gotowe do wydania).</value>
<value>Maksymalna liczba prób została przekroczona. Proszę połączyć się ponownie.</value>
<comment>Problem z transferem z C# do Powershell z możliwym kodowaniem</comment>
</data>
</root>
<data name="Gateway" xml:space="preserve">
<value>Brama</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="Wsl" xml:space="preserve">
<value>WSL</value>
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

View File

@@ -59,7 +59,7 @@
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="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>
@@ -105,19 +105,19 @@
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="MenuItem_About" xml:space="preserve">
<value>Sobre</value>
</data>
<data name="AddNodeFromXmlFailed" xml:space="preserve">
@@ -222,9 +222,6 @@
<data name="Display" xml:space="preserve">
<value>Mostrar</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Gateway</value>
</data>
<data name="Miscellaneous" xml:space="preserve">
<value>Diversos</value>
</data>
@@ -369,4 +366,44 @@
<data name="ConnectionsFileCouldNotBeLoadedNew" xml:space="preserve">
<value>Arquivo de conexões "{0}" não pôde ser carregado! Começando com o novo arquivo de conexões.</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Gateway</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

View File

@@ -59,7 +59,7 @@
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="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>
@@ -105,19 +105,19 @@
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="MenuItem_About" xml:space="preserve">
<value>Sobre</value>
</data>
<data name="AddNodeFromXmlFailed" xml:space="preserve">
@@ -225,9 +225,6 @@
<data name="Display" xml:space="preserve">
<value>Ecrã</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Gateway</value>
</data>
<data name="Miscellaneous" xml:space="preserve">
<value>Diversos</value>
</data>
@@ -630,7 +627,7 @@
<data name="AddConnectionPanel" xml:space="preserve">
<value>Adicionar o Painel de Ligação</value>
</data>
<data name="CheckForUpdates" xml:space="preserve">
<data name="MenuItem_CheckForUpdates" xml:space="preserve">
<value>Verificar se há atualizações</value>
</data>
<data name="Config" xml:space="preserve">
@@ -651,7 +648,7 @@
<data name="DeleteExternalTool" xml:space="preserve">
<value>Excluir ferramenta externa...</value>
</data>
<data name="Donate" xml:space="preserve">
<data name="MenuItem_Donate" xml:space="preserve">
<value>Doar</value>
</data>
<data name="DuplicateTab" xml:space="preserve">
@@ -669,7 +666,7 @@
<data name="_Help" xml:space="preserve">
<value>&amp;Ajuda</value>
</data>
<data name="HelpContents" xml:space="preserve">
<data name="MenuItem_HelpContents" xml:space="preserve">
<value>Ajuda mRemoteNG</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
@@ -711,7 +708,7 @@
<data name="RenameTab" xml:space="preserve">
<value>Renomear aba</value>
</data>
<data name="ReportBug" xml:space="preserve">
<data name="MenuItem_ReportIssue" xml:space="preserve">
<value>Relatar um erro</value>
</data>
<data name="ResetLayout" xml:space="preserve">
@@ -738,7 +735,7 @@
<data name="StartChat" xml:space="preserve">
<value>Iniciar chat (VNC)</value>
</data>
<data name="SupportForum" xml:space="preserve">
<data name="MenuItem_SupportForum" xml:space="preserve">
<value>Fórum de suporte</value>
</data>
<data name="_Tools" xml:space="preserve">
@@ -753,7 +750,7 @@
<data name="ViewOnly" xml:space="preserve">
<value>Somente ver (VNC)</value>
</data>
<data name="Website" xml:space="preserve">
<data name="MenuItem_Website" xml:space="preserve">
<value>Sítio</value>
</data>
<data name="MinimizeToSysTray" xml:space="preserve">
@@ -1341,9 +1338,6 @@
<data name="SaveConnectionsFileBeforeOpeningAnother" xml:space="preserve">
<value>Você deseja salvar o arquivo atual de ligações antes de carregar outro?</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>Salvar as ligações à saída</value>
</data>
<data name="SaveImageFilter" xml:space="preserve">
<value>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</value>
</data>
@@ -1554,4 +1548,47 @@
<data name="Yes" xml:space="preserve">
<value>Sim</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Gateway</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>Salvar as ligações à saída</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

View File

@@ -117,7 +117,7 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<data name="MenuItem_About" xml:space="preserve">
<value>About</value>
</data>
<data name="ActiveDirectory" xml:space="preserve">
@@ -159,6 +159,12 @@
<data name="AskUpdatesMainInstruction" xml:space="preserve">
<value>Automatic update settings</value>
</data>
<data name="AnyDesk" xml:space="preserve">
<value>AnyDesk</value>
</data>
<data name="Ard" xml:space="preserve">
<value>ARD (Apple Remote Desktop)</value>
</data>
<data name="Aspect" xml:space="preserve">
<value>Aspect</value>
</data>
@@ -345,6 +351,9 @@
<data name="ConfirmCloseConnectionPanelMainInstruction" xml:space="preserve">
<value>Are you sure you want to close the panel, "{0}"? Any connections that it contains will also be closed.</value>
</data>
<data name="ConfirmDisconnectConnection" xml:space="preserve">
<value>Are you sure you want to disconnect "{0}"?</value>
</data>
<data name="ConfirmDeleteExternalTool" xml:space="preserve">
<value>Are you sure you want to delete the external tool, "{0}"?</value>
</data>
@@ -725,7 +734,7 @@ See the Microsoft Support article at http://support.microsoft.com/kb/811833 for
<data name="AddConnectionPanel" xml:space="preserve">
<value>Add Connection Panel</value>
</data>
<data name="CheckForUpdates" xml:space="preserve">
<data name="MenuItem_CheckForUpdates" xml:space="preserve">
<value>Check for Updates</value>
</data>
<data name="Config" xml:space="preserve">
@@ -746,7 +755,7 @@ See the Microsoft Support article at http://support.microsoft.com/kb/811833 for
<data name="DeleteExternalTool" xml:space="preserve">
<value>Delete External Tool...</value>
</data>
<data name="Donate" xml:space="preserve">
<data name="MenuItem_Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="DuplicateTab" xml:space="preserve">
@@ -764,7 +773,7 @@ See the Microsoft Support article at http://support.microsoft.com/kb/811833 for
<data name="_Help" xml:space="preserve">
<value>&amp;Help</value>
</data>
<data name="HelpContents" xml:space="preserve">
<data name="MenuItem_HelpContents" xml:space="preserve">
<value>mRemoteNG Help</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
@@ -806,8 +815,8 @@ See the Microsoft Support article at http://support.microsoft.com/kb/811833 for
<data name="RenameTab" xml:space="preserve">
<value>Rename Tab</value>
</data>
<data name="ReportBug" xml:space="preserve">
<value>Report a Bug</value>
<data name="MenuItem_ReportIssue" xml:space="preserve">
<value>Report an Issue</value>
</data>
<data name="ResetLayout" xml:space="preserve">
<value>Reset layout</value>
@@ -836,7 +845,7 @@ See the Microsoft Support article at http://support.microsoft.com/kb/811833 for
<data name="StartChat" xml:space="preserve">
<value>Start Chat (VNC)</value>
</data>
<data name="SupportForum" xml:space="preserve">
<data name="MenuItem_SupportForum" xml:space="preserve">
<value>Support Forum</value>
</data>
<data name="_Tools" xml:space="preserve">
@@ -851,7 +860,7 @@ See the Microsoft Support article at http://support.microsoft.com/kb/811833 for
<data name="ViewOnly" xml:space="preserve">
<value>View Only</value>
</data>
<data name="Website" xml:space="preserve">
<data name="MenuItem_Website" xml:space="preserve">
<value>Website</value>
</data>
<data name="MinimizeToSysTray" xml:space="preserve">
@@ -1020,6 +1029,12 @@ If you run into such an error, please create a new connection file!</value>
<data name="PropertyDescriptionPanel" xml:space="preserve">
<value>Sets the panel in which the connection will open.</value>
</data>
<data name="PropertyDescriptionColor" xml:space="preserve">
<value>Sets the color for the connection or folder in the connections tree. Connections inherit this color from their parent folder.</value>
</data>
<data name="PropertyDescriptionTabColor" xml:space="preserve">
<value>Sets the color of the connection tab. Leave empty for default theme color.</value>
</data>
<data name="PropertyDescriptionPassword" xml:space="preserve">
<value>Enter your password.</value>
</data>
@@ -1137,6 +1152,9 @@ If you run into such an error, please create a new connection file!</value>
<data name="CacheBitmaps" xml:space="preserve">
<value>Cache Bitmaps</value>
</data>
<data name="Color" xml:space="preserve">
<value>Color</value>
</data>
<data name="Colors" xml:space="preserve">
<value>Colors</value>
</data>
@@ -1182,6 +1200,9 @@ If you run into such an error, please create a new connection file!</value>
<data name="Panel" xml:space="preserve">
<value>Panel</value>
</data>
<data name="TabColor" xml:space="preserve">
<value>Tab Color</value>
</data>
<data name="Password" xml:space="preserve">
<value>Password</value>
</data>
@@ -1254,6 +1275,12 @@ If you run into such an error, please create a new connection file!</value>
<data name="UserField" xml:space="preserve">
<value>User Field</value>
</data>
<data name="EnvironmentTags" xml:space="preserve">
<value>Environment Tags</value>
</data>
<data name="PropertyDescriptionEnvironmentTags" xml:space="preserve">
<value>Tags to categorize the environment (e.g., #PROD, #UAT, #TEST, #BETA, #FINDEPARTMENT)</value>
</data>
<data name="ProxyAddress" xml:space="preserve">
<value>Proxy Address</value>
</data>
@@ -1501,6 +1528,12 @@ If you run into such an error, please create a new connection file!</value>
<data name="SaveConnectionsFileBeforeOpeningAnother" xml:space="preserve">
<value>Do you want to save the current connections file before loading another?</value>
</data>
<data name="SaveOptionsBeforeClosing" xml:space="preserve">
<value>Do you want to save the changes made to the options?</value>
</data>
<data name="Discard" xml:space="preserve">
<value>Discard</value>
</data>
<data name="ConnectionsBackupFrequencyDaily" xml:space="preserve">
<value>Daily</value>
</data>
@@ -1925,6 +1958,15 @@ mRemoteNG will now quit and begin with the installation.</value>
<data name="DatabaseNotAvailable" xml:space="preserve">
<value>Database '{0}' not available.</value>
</data>
<data name="ErrorPlatformNotSupported" xml:space="preserve">
<value>Platform error: {0}</value>
</data>
<data name="ErrorMissingDependency" xml:space="preserve">
<value>Missing dependency: {0}</value>
</data>
<data name="ErrorArchitectureMismatch" xml:space="preserve">
<value>Architecture mismatch: {0}</value>
</data>
<data name="SaveConnectionsAfterEveryEdit" xml:space="preserve">
<value>Save connections after every edit</value>
</data>
@@ -2155,6 +2197,9 @@ Nightly Channel includes Alphas, Betas &amp; Release Candidates.</value>
<data name="PowerShell" xml:space="preserve">
<value>PowerShell</value>
</data>
<data name="Terminal" xml:space="preserve">
<value>Terminal</value>
</data>
<data name="Changelog" xml:space="preserve">
<value>Changelog</value>
</data>
@@ -2200,7 +2245,8 @@ Nightly Channel includes Alphas, Betas &amp; Release Candidates.</value>
<comment>https://docs.microsoft.com/en-us/windows/win32/termserv/imstscsecuredsettings-workdir</comment>
</data>
<data name="OpeningCommand" xml:space="preserve">
<value>OpeningCommand TODO</value>
<value>Opening Command </value>
<comment>Command what will be run after connection</comment>
</data>
<data name="PropertyDescriptionOpeningCommand" xml:space="preserve">
<value>Description of OpeningCommand TODO</value>
@@ -2292,6 +2338,15 @@ Nightly Channel includes Alphas, Betas &amp; Release Candidates.</value>
<data name="ECPClickstudiosPasswordstate" xml:space="preserve">
<value>Clickstudios Passwordstate</value>
</data>
<data name="ECPOnePassword" xml:space="preserve">
<value>1Password</value>
</data>
<data name="ECPOnePasswordReadFailed" xml:space="preserve">
<value>1Password read failed</value>
</data>
<data name="ECPOnePasswordCommandLine" xml:space="preserve">
<value>1Password command line</value>
</data>
<data name="ECPNone" xml:space="preserve">
<value>None</value>
</data>
@@ -2416,4 +2471,92 @@ Nightly Channel includes Alphas, Betas &amp; Release Candidates.</value>
<data name="WarnMeOnlyWhenClosingMultipleConnections" xml:space="preserve">
<value>WarnMeOnlyWhenClosingMultipleConnections</value>
</data>
<data name="MsgExit" xml:space="preserve">
<value>The application will now exit.</value>
<comment>Message shown then application will normally close</comment>
</data>
<data name="MsgDownloadLatestRuntime" xml:space="preserve">
<value>Please download and install latest runtime:</value>
<comment>Appears then missing a runtime</comment>
</data>
<data name="MsgMissingRuntime" xml:space="preserve">
<value>Missing Runtime:</value>
</data>
<data name="MsgRuntimeIsRequired" xml:space="preserve">
<value>runtime library is required</value>
</data>
<data name="VaultOpenbao" xml:space="preserve">
<value>Vault or Openbao</value>
</data>
<data name="VaultOpenbaoMount" xml:space="preserve">
<value>Mount</value>
</data>
<data name="VaultOpenbaoMountDescription" xml:space="preserve">
<value>Mount where the secret is stored</value>
</data>
<data name="VaultOpenbaoRole" xml:space="preserve">
<value>Role</value>
</data>
<data name="VaultOpenbaoRoleDescription" xml:space="preserve">
<value>Name or path of the secret</value>
</data>
<data name="VaultOpenbaoToken" xml:space="preserve">
<value>Token for Vault/Openbao</value>
</data>
<data name="VaultOpenbaoTokenPropertyDescription" xml:space="preserve">
<value>Token to access Vault/Openbao server</value>
</data>
<data name="VaultOpenbaoSecretEngine" xml:space="preserve">
<value>Vault/Openbao Secret Engine</value>
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" xml:space="preserve">
<value>Secret engine used in Vault/Openbao to store the secret</value>
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" xml:space="preserve">
<value>KeyValue (Username as Key)</value>
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" xml:space="preserve">
<value>LDAP dynamic role</value>
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" xml:space="preserve">
<value>LDAP static role</value>
</data>
<data name="MenuItem_Chat" xml:space="preserve">
<value>mR Chat</value>
<comment>Chat to dev</comment>
</data>
<data name="MenuItem_Community" xml:space="preserve">
<value>Community</value>
<comment>Reddit</comment>
</data>
<data name="ConnectionFrameColor" xml:space="preserve">
<value>Connection Frame Color</value>
</data>
<data name="PropertyDescriptionConnectionFrameColor" xml:space="preserve">
<value>Sets a colored border around the connection panel to visually distinguish between different environments (e.g., production, test, development).</value>
</data>
<data name="FrameColorNone" xml:space="preserve">
<value>None</value>
</data>
<data name="FrameColorRed" xml:space="preserve">
<value>Red (Production)</value>
</data>
<data name="FrameColorYellow" xml:space="preserve">
<value>Yellow (Staging/UAT)</value>
</data>
<data name="FrameColorGreen" xml:space="preserve">
<value>Green (Test)</value>
</data>
<data name="FrameColorBlue" xml:space="preserve">
<value>Blue (Development)</value>
</data>
<data name="FrameColorPurple" xml:space="preserve">
<value>Purple (Custom)</value>
</data>
<data name="Wsl" xml:space="preserve">
<value>WSL</value>
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" xml:space="preserve">
<value>SSH engine OTP mode</value>
</data>
</root>

View File

@@ -117,7 +117,7 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<data name="MenuItem_About" xml:space="preserve">
<value>О программе</value>
</data>
<data name="ActiveDirectory" xml:space="preserve">
@@ -719,7 +719,7 @@
<data name="AddConnectionPanel" xml:space="preserve">
<value>Добавить Панель подключения</value>
</data>
<data name="CheckForUpdates" xml:space="preserve">
<data name="MenuItem_CheckForUpdates" xml:space="preserve">
<value>Проверка наличия обновлений</value>
</data>
<data name="Config" xml:space="preserve">
@@ -740,7 +740,7 @@
<data name="DeleteExternalTool" xml:space="preserve">
<value>Удалить внешний инструмент...</value>
</data>
<data name="Donate" xml:space="preserve">
<data name="MenuItem_Donate" xml:space="preserve">
<value>Помочь проекту</value>
</data>
<data name="DuplicateTab" xml:space="preserve">
@@ -758,7 +758,7 @@
<data name="_Help" xml:space="preserve">
<value>&amp;Справка</value>
</data>
<data name="HelpContents" xml:space="preserve">
<data name="MenuItem_HelpContents" xml:space="preserve">
<value>Справка mRemoteNG</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
@@ -800,7 +800,7 @@
<data name="RenameTab" xml:space="preserve">
<value>Переименовать закладку</value>
</data>
<data name="ReportBug" xml:space="preserve">
<data name="MenuItem_ReportIssue" xml:space="preserve">
<value>Сообщить об ошибке</value>
</data>
<data name="ResetLayout" xml:space="preserve">
@@ -830,7 +830,7 @@
<data name="StartChat" xml:space="preserve">
<value>Начать чат (VNC)</value>
</data>
<data name="SupportForum" xml:space="preserve">
<data name="MenuItem_SupportForum" xml:space="preserve">
<value>Форум поддержки</value>
</data>
<data name="_Tools" xml:space="preserve">
@@ -845,7 +845,7 @@
<data name="ViewOnly" xml:space="preserve">
<value>Просмотр (VNC)</value>
</data>
<data name="Website" xml:space="preserve">
<data name="MenuItem_Website" xml:space="preserve">
<value>Веб-сайт</value>
</data>
<data name="MinimizeToSysTray" xml:space="preserve">
@@ -1995,4 +1995,44 @@ mRemoteNG сейчас прекратит работу и начнет проц
<data name="SaveConsOnExit" xml:space="preserve">
<value>Сохранять подключения при выходе</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbao" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

View File

@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
@@ -26,79 +26,79 @@
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<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: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: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: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: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: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:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
@@ -117,7 +117,7 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<data name="MenuItem_About" xml:space="preserve">
<value>Om</value>
</data>
<data name="AddNodeFromXmlFailed" xml:space="preserve">
@@ -228,9 +228,6 @@
<data name="Display" xml:space="preserve">
<value>Skärm</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Nätverksnod (gateway)</value>
</data>
<data name="Miscellaneous" xml:space="preserve">
<value>Blandat</value>
</data>
@@ -713,7 +710,7 @@ Se Microsofts supportartikel på http://support.microsoft.com/kb/811833 för mer
<data name="AddConnectionPanel" xml:space="preserve">
<value>Lägg till anslutningspanel</value>
</data>
<data name="CheckForUpdates" xml:space="preserve">
<data name="MenuItem_CheckForUpdates" xml:space="preserve">
<value>Sök efter uppdateringar</value>
</data>
<data name="Config" xml:space="preserve">
@@ -728,7 +725,7 @@ Se Microsofts supportartikel på http://support.microsoft.com/kb/811833 för mer
<data name="DeleteExternalTool" xml:space="preserve">
<value>Ta bort externt verktyg...</value>
</data>
<data name="Donate" xml:space="preserve">
<data name="MenuItem_Donate" xml:space="preserve">
<value>Donera</value>
</data>
<data name="DuplicateTab" xml:space="preserve">
@@ -746,7 +743,7 @@ Se Microsofts supportartikel på http://support.microsoft.com/kb/811833 för mer
<data name="_Help" xml:space="preserve">
<value>&amp;Hjälp</value>
</data>
<data name="HelpContents" xml:space="preserve">
<data name="MenuItem_HelpContents" xml:space="preserve">
<value>mRemoteNG hjälp</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
@@ -788,7 +785,7 @@ Se Microsofts supportartikel på http://support.microsoft.com/kb/811833 för mer
<data name="RenameTab" xml:space="preserve">
<value>Byt namn på flik</value>
</data>
<data name="ReportBug" xml:space="preserve">
<data name="MenuItem_ReportIssue" xml:space="preserve">
<value>Rapportera en bugg</value>
</data>
<data name="ResetLayout" xml:space="preserve">
@@ -815,7 +812,7 @@ Se Microsofts supportartikel på http://support.microsoft.com/kb/811833 för mer
<data name="StartChat" xml:space="preserve">
<value>Starta chatt (VNC)</value>
</data>
<data name="SupportForum" xml:space="preserve">
<data name="MenuItem_SupportForum" xml:space="preserve">
<value>Supportforum</value>
</data>
<data name="_Tools" xml:space="preserve">
@@ -830,7 +827,7 @@ Se Microsofts supportartikel på http://support.microsoft.com/kb/811833 för mer
<data name="ViewOnly" xml:space="preserve">
<value>Visa endast</value>
</data>
<data name="Website" xml:space="preserve">
<data name="MenuItem_Website" xml:space="preserve">
<value>Webbplats</value>
</data>
<data name="MinimizeToSysTray" xml:space="preserve">
@@ -2172,4 +2169,44 @@ Nattliga kanalen inkluderar Alfa, Betor &amp; Utgåvokandidater.</value>
<data name="FiltermRemoteRemoteDesktopManagerCSV" xml:space="preserve">
<value>Remote Desktop Manager-filer (*.csv)</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>Nätverksnod (gateway)</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

View File

@@ -117,7 +117,7 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<data name="MenuItem_About" xml:space="preserve">
<value>பற்றி</value>
</data>
<data name="ActiveDirectory" xml:space="preserve">
@@ -725,7 +725,7 @@
<data name="AddConnectionPanel" xml:space="preserve">
<value>இணைப்பு பலகையைச் சேர்</value>
</data>
<data name="CheckForUpdates" xml:space="preserve">
<data name="MenuItem_CheckForUpdates" xml:space="preserve">
<value>புதுப்பிப்புகளை சரிபார்</value>
</data>
<data name="Config" xml:space="preserve">
@@ -746,7 +746,7 @@
<data name="DeleteExternalTool" xml:space="preserve">
<value>வெளிப்புற கருவியை நீக்கு...</value>
</data>
<data name="Donate" xml:space="preserve">
<data name="MenuItem_Donate" xml:space="preserve">
<value>நன்கொடை</value>
</data>
<data name="DuplicateTab" xml:space="preserve">
@@ -764,7 +764,7 @@
<data name="_Help" xml:space="preserve">
<value>உதவி</value>
</data>
<data name="HelpContents" xml:space="preserve">
<data name="MenuItem_HelpContents" xml:space="preserve">
<value>பலதொலைஅத உதவி</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
@@ -806,7 +806,7 @@
<data name="RenameTab" xml:space="preserve">
<value>தாவலை மறுபெயரிடுங்கள்</value>
</data>
<data name="ReportBug" xml:space="preserve">
<data name="MenuItem_ReportIssue" xml:space="preserve">
<value>ஒரு பிழையைப் புகாரளி</value>
</data>
<data name="ResetLayout" xml:space="preserve">
@@ -836,7 +836,7 @@
<data name="StartChat" xml:space="preserve">
<value>அரட்டையைத் தொடங்கு (விஎன்சி)</value>
</data>
<data name="SupportForum" xml:space="preserve">
<data name="MenuItem_SupportForum" xml:space="preserve">
<value>உதவி மன்றம்</value>
</data>
<data name="_Tools" xml:space="preserve">
@@ -851,7 +851,7 @@
<data name="ViewOnly" xml:space="preserve">
<value>பார்க்க மட்டுமே</value>
</data>
<data name="Website" xml:space="preserve">
<data name="MenuItem_Website" xml:space="preserve">
<value>வலைத்தளம்</value>
</data>
<data name="MinimizeToSysTray" xml:space="preserve">
@@ -2155,6 +2155,9 @@
<data name="PowerShell" xml:space="preserve">
<value>ஆற்றல்ஓடு</value>
</data>
<data name="Terminal" xml:space="preserve">
<value>Terminal</value>
</data>
<data name="Changelog" xml:space="preserve">
<value>மாற்றபதிவு</value>
</data>
@@ -2416,4 +2419,44 @@
<data name="WarnMeOnlyWhenClosingMultipleConnections" xml:space="preserve">
<value>முன்னறிவிப்பு</value>
</data>
</root>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="Wsl" xml:space="preserve">
<value>WSL</value>
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -117,7 +117,7 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<data name="MenuItem_About" xml:space="preserve">
<value>关于</value>
</data>
<data name="ActiveDirectory" xml:space="preserve">
@@ -231,9 +231,6 @@
<data name="Display" xml:space="preserve">
<value>显示</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>网关</value>
</data>
<data name="Miscellaneous" xml:space="preserve">
<value>杂项</value>
</data>
@@ -722,7 +719,7 @@
<data name="AddConnectionPanel" xml:space="preserve">
<value>添加连接面板</value>
</data>
<data name="CheckForUpdates" xml:space="preserve">
<data name="MenuItem_CheckForUpdates" xml:space="preserve">
<value>检查更新</value>
</data>
<data name="Config" xml:space="preserve">
@@ -743,7 +740,7 @@
<data name="DeleteExternalTool" xml:space="preserve">
<value>删除外部工具...</value>
</data>
<data name="Donate" xml:space="preserve">
<data name="MenuItem_Donate" xml:space="preserve">
<value>捐赠</value>
</data>
<data name="DuplicateTab" xml:space="preserve">
@@ -761,7 +758,7 @@
<data name="_Help" xml:space="preserve">
<value>帮助(&amp;H)</value>
</data>
<data name="HelpContents" xml:space="preserve">
<data name="MenuItem_HelpContents" xml:space="preserve">
<value>mRemoteNG 帮助</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
@@ -803,7 +800,7 @@
<data name="RenameTab" xml:space="preserve">
<value>重命名标签</value>
</data>
<data name="ReportBug" xml:space="preserve">
<data name="MenuItem_ReportIssue" xml:space="preserve">
<value>报告问题</value>
</data>
<data name="ResetLayout" xml:space="preserve">
@@ -833,7 +830,7 @@
<data name="StartChat" xml:space="preserve">
<value>启动 Chat(VNC)</value>
</data>
<data name="SupportForum" xml:space="preserve">
<data name="MenuItem_SupportForum" xml:space="preserve">
<value>支持论坛</value>
</data>
<data name="_Tools" xml:space="preserve">
@@ -848,7 +845,7 @@
<data name="ViewOnly" xml:space="preserve">
<value>仅查看</value>
</data>
<data name="Website" xml:space="preserve">
<data name="MenuItem_Website" xml:space="preserve">
<value>网站</value>
</data>
<data name="MinimizeToSysTray" xml:space="preserve">
@@ -1483,9 +1480,6 @@
<data name="SaveConnectionsFileBeforeOpeningAnother" xml:space="preserve">
<value>打开其它连接配置文件前,是否保存当前配置文件?</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>退出时保存连接配置文件</value>
</data>
<data name="SaveImageFilter" xml:space="preserve">
<value>图形交换格式文件 (.gif)|*.gif|联合图像专家组文件 (.jpeg)|*.jpeg|联合图像专家组文件 (.jpg)|*.jpg|便携式网络图形文件 (.png)|*.png</value>
</data>
@@ -2080,4 +2074,53 @@ mRemoteNG 将退出并安装更新。</value>
<data name="PowerShell" xml:space="preserve">
<value>PowerShell</value>
</data>
<data name="Terminal" xml:space="preserve">
<value>Terminal</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>网关</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>退出时保存连接配置文件</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="Wsl" xml:space="preserve">
<value>WSL</value>
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

View File

@@ -59,7 +59,7 @@
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="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>
@@ -105,19 +105,19 @@
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About" xml:space="preserve">
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="MenuItem_About" xml:space="preserve">
<value>關於</value>
</data>
<data name="AddNodeFromXmlFailed" xml:space="preserve">
@@ -225,9 +225,6 @@
<data name="Display" xml:space="preserve">
<value>顯示</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>閘道</value>
</data>
<data name="Miscellaneous" xml:space="preserve">
<value>雜項</value>
</data>
@@ -637,7 +634,7 @@
<data name="AddConnectionPanel" xml:space="preserve">
<value>加入連線面板</value>
</data>
<data name="CheckForUpdates" xml:space="preserve">
<data name="MenuItem_CheckForUpdates" xml:space="preserve">
<value>檢查更新</value>
</data>
<data name="Config" xml:space="preserve">
@@ -658,7 +655,7 @@
<data name="DeleteExternalTool" xml:space="preserve">
<value>刪除外部工具...</value>
</data>
<data name="Donate" xml:space="preserve">
<data name="MenuItem_Donate" xml:space="preserve">
<value>捐贈</value>
</data>
<data name="DuplicateTab" xml:space="preserve">
@@ -676,7 +673,7 @@
<data name="_Help" xml:space="preserve">
<value>說明(&amp;H)</value>
</data>
<data name="HelpContents" xml:space="preserve">
<data name="MenuItem_HelpContents" xml:space="preserve">
<value>mRemoteNG 說明</value>
</data>
<data name="LaunchExternalTool" xml:space="preserve">
@@ -718,7 +715,7 @@
<data name="RenameTab" xml:space="preserve">
<value>重新命名索引標籤</value>
</data>
<data name="ReportBug" xml:space="preserve">
<data name="MenuItem_ReportIssue" xml:space="preserve">
<value>報告 Bug</value>
</data>
<data name="ResetLayout" xml:space="preserve">
@@ -748,7 +745,7 @@
<data name="StartChat" xml:space="preserve">
<value>開始聊天 (VNC)</value>
</data>
<data name="SupportForum" xml:space="preserve">
<data name="MenuItem_SupportForum" xml:space="preserve">
<value>支援討論區</value>
</data>
<data name="_Tools" xml:space="preserve">
@@ -763,7 +760,7 @@
<data name="ViewOnly" xml:space="preserve">
<value>只有檢視 (VNC)</value>
</data>
<data name="Website" xml:space="preserve">
<data name="MenuItem_Website" xml:space="preserve">
<value>網站</value>
</data>
<data name="MinimizeToSysTray" xml:space="preserve">
@@ -1358,9 +1355,6 @@
<data name="SaveConnectionsFileBeforeOpeningAnother" xml:space="preserve">
<value>您要在載入另一個之前先儲存目前的連線檔案嗎?</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>結束時儲存連線</value>
</data>
<data name="SaveImageFilter" xml:space="preserve">
<value>Graphics Interchange Format 檔案 (.gif)|*.gif|Joint Photographic Experts Group 檔案 (.jpeg)|*.jpeg|Joint Photographic Experts Group 檔案 (.jpg)|*.jpg|Portable Network Graphics 檔案 (.png)|*.png</value>
</data>
@@ -1575,4 +1569,47 @@ mRemoteNG 將立即結束並開始安裝。</value>
<data name="Yes" xml:space="preserve">
<value>是</value>
</data>
<data name="Gateway" xml:space="preserve">
<value>閘道</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>結束時儲存連線</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="VaultOpenbaoMount" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoMountDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRole" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoRoleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoToken" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoTokenPropertyDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="PropertyDescriptionVaultOpenbaoSecretEngine" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineKeyValue" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPDynamic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineLDAPStatic" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="VaultOpenbaoSecretEngineSSHOTP" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
</root>

View File

@@ -20,9 +20,33 @@ namespace mRemoteNG.Messages.MessageWriters
private void AddToList(ListViewItem lvItem)
{
// Check if the control is disposed or handle not created (during shutdown)
if (_messageWindow.lvErrorCollector.IsDisposed || !_messageWindow.lvErrorCollector.IsHandleCreated)
{
return;
}
if (_messageWindow.lvErrorCollector.InvokeRequired)
{
_messageWindow.lvErrorCollector.Invoke((MethodInvoker)(() => AddToList(lvItem)));
try
{
_messageWindow.lvErrorCollector.Invoke((MethodInvoker)(() => AddToList(lvItem)));
}
catch (System.ComponentModel.InvalidAsynchronousStateException)
{
// Destination thread no longer exists (application shutting down)
return;
}
catch (ObjectDisposedException)
{
// Control has been disposed (application shutting down)
return;
}
catch (InvalidOperationException)
{
// Control handle no longer exists or other invalid operation (application shutting down)
return;
}
}
else
{

View File

@@ -11,7 +11,7 @@ using System.Resources;
// Compute version values
//Build nr: 3177
//Build nr: 3225
// General Information
[assembly: AssemblyTitle("mRemoteNG")]
@@ -24,10 +24,7 @@ using System.Resources;
[assembly: AssemblyCulture("")]
// Version information
[assembly: AssemblyVersion("1.78.2.3177")]
[assembly: AssemblyFileVersion("1.78.2.3177")]
[assembly: AssemblyVersion("1.78.2.3225")]
[assembly: AssemblyFileVersion("1.78.2.3225")]
[assembly: NeutralResourcesLanguageAttribute("en-US")]
[assembly: AssemblyInformationalVersion("1.78.2 (Nightly Build 3177) x64")]
// Logging
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]
[assembly: AssemblyInformationalVersion("1.78.2 (Nightly Build 3225) x64")]

View File

@@ -49,7 +49,4 @@ using System.Resources;
[assembly: AssemblyVersion("<#= major #>.<#= minor #>.<#= revision #>.<#= build #>")]
[assembly: AssemblyFileVersion("<#= major #>.<#= minor #>.<#= revision #>.<#= build #>")]
[assembly: NeutralResourcesLanguageAttribute("en-US")]
[assembly: AssemblyInformationalVersion("<#= major #>.<#= minor #>.<#= revision #> (<#= channel #> <#= build #>) <#= platformValue #>")]
// Logging
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]
[assembly: AssemblyInformationalVersion("<#= major #>.<#= minor #>.<#= revision #> (<#= channel #> <#= build #>) <#= platformValue #>")]

View File

@@ -145,7 +145,7 @@ namespace mRemoteNG.Properties {
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool PopupMessageWriterWriteErrorMsgs {
get {
return ((bool)(this["PopupMessageWriterWriteErrorMsgs"]));

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