mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-17 22:11:48 +08:00
Compare commits
497 Commits
20251007-v
...
v1.78.2-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
455d897b9f | ||
|
|
3d4d1136f0 | ||
|
|
598136f089 | ||
|
|
865bddfb04 | ||
|
|
3b2bc028cc | ||
|
|
71c746f801 | ||
|
|
079814751e | ||
|
|
1de9ce6ef5 | ||
|
|
01df0e295e | ||
|
|
2631926eda | ||
|
|
db1496d4a2 | ||
|
|
a8b12c9ba1 | ||
|
|
a2b408e537 | ||
|
|
a871624ab7 | ||
|
|
e40a800bc4 | ||
|
|
48cb1ce770 | ||
|
|
6733d758aa | ||
|
|
f78b9bf51c | ||
|
|
213ea6a4d3 | ||
|
|
ac3d7e6366 | ||
|
|
9fae2e066e | ||
|
|
cf66e84d31 | ||
|
|
f7326aff62 | ||
|
|
d4bca6b03d | ||
|
|
1d86015f9d | ||
|
|
5efcc653eb | ||
|
|
333588e101 | ||
|
|
4046681fc5 | ||
|
|
91c7df22b2 | ||
|
|
173b208eb1 | ||
|
|
50de37c3a4 | ||
|
|
380e91de07 | ||
|
|
ba97933f33 | ||
|
|
539b761199 | ||
|
|
aaff6e4548 | ||
|
|
a1e3b34580 | ||
|
|
276585e379 | ||
|
|
9242dc0faf | ||
|
|
14d08d8d62 | ||
|
|
421d8eb581 | ||
|
|
aed0006f1d | ||
|
|
86d986a633 | ||
|
|
5163aeb4d2 | ||
|
|
a103939c64 | ||
|
|
bcb8e05698 | ||
|
|
2e74313f07 | ||
|
|
c9791454ec | ||
|
|
b1c1696acb | ||
|
|
ab668ac677 | ||
|
|
1777c4840a | ||
|
|
90fcd672d8 | ||
|
|
4226396cbf | ||
|
|
3591ca0f4c | ||
|
|
09cbcccf30 | ||
|
|
4e36b5666e | ||
|
|
308253a325 | ||
|
|
30bb4016b4 | ||
|
|
e616ae16e1 | ||
|
|
469528a07a | ||
|
|
c7f831e9f9 | ||
|
|
dd9922be45 | ||
|
|
d0a468c22b | ||
|
|
ff5dbc88fe | ||
|
|
3a4ae9b098 | ||
|
|
2de24e534c | ||
|
|
59412a65e1 | ||
|
|
adedb6962f | ||
|
|
d3fa608ae9 | ||
|
|
3159903875 | ||
|
|
31c28c4917 | ||
|
|
2c13f7c3a7 | ||
|
|
725ee92147 | ||
|
|
14406f79a2 | ||
|
|
3e202c3a19 | ||
|
|
412c727e4c | ||
|
|
31e7b9e443 | ||
|
|
a18e292765 | ||
|
|
258ea87f90 | ||
|
|
fd9eabe1e6 | ||
|
|
a9dd06df45 | ||
|
|
dfc24b0cb2 | ||
|
|
63f5325f29 | ||
|
|
6f7949214b | ||
|
|
6cfec060a0 | ||
|
|
db733424ca | ||
|
|
49eab4d377 | ||
|
|
53e5396031 | ||
|
|
99d01130bf | ||
|
|
62ce6cd6e7 | ||
|
|
35c66b0e4a | ||
|
|
dafc05dc42 | ||
|
|
458a05ea5f | ||
|
|
38acc1e960 | ||
|
|
f83209a2b9 | ||
|
|
9d1546c8b7 | ||
|
|
dca2517cf0 | ||
|
|
ff54ca9015 | ||
|
|
76cb0a1e0b | ||
|
|
c683854678 | ||
|
|
e9d0a8aa69 | ||
|
|
30cb1de711 | ||
|
|
699b93e175 | ||
|
|
c7df6f3715 | ||
|
|
f1d1a19779 | ||
|
|
1c2b5fadc4 | ||
|
|
97f5daa13d | ||
|
|
63e100c233 | ||
|
|
92a710e72a | ||
|
|
fe82146f47 | ||
|
|
64b0496ef7 | ||
|
|
7d21b3de9e | ||
|
|
68a8caea34 | ||
|
|
aee18bae3b | ||
|
|
ff58cae677 | ||
|
|
548f938757 | ||
|
|
b9c2e82af1 | ||
|
|
23bb5ec7be | ||
|
|
0b7b87d84a | ||
|
|
b84a49e99c | ||
|
|
327cc46c8d | ||
|
|
8540434594 | ||
|
|
41536ba971 | ||
|
|
8ddaf024ff | ||
|
|
7e8f647f54 | ||
|
|
9a32a7c68c | ||
|
|
280a930792 | ||
|
|
2540d39dd8 | ||
|
|
2b00fa0ad9 | ||
|
|
810aad90ed | ||
|
|
59c8968d8a | ||
|
|
4bfed87d81 | ||
|
|
5c36477b1f | ||
|
|
a529b978e1 | ||
|
|
eae83eadab | ||
|
|
297260af9a | ||
|
|
f5d38c282f | ||
|
|
493e5eda6a | ||
|
|
88b8201384 | ||
|
|
b88204c261 | ||
|
|
d39fb10b47 | ||
|
|
96e7313b69 | ||
|
|
02be546c5b | ||
|
|
c5b98c6cc8 | ||
|
|
687a4088ab | ||
|
|
8c63843c22 | ||
|
|
469ca48592 | ||
|
|
208ce663b2 | ||
|
|
843243c75e | ||
|
|
b7ed5a300d | ||
|
|
415a649a76 | ||
|
|
462d9c39af | ||
|
|
d52d79dd69 | ||
|
|
5dbc6e74e0 | ||
|
|
986b0084bf | ||
|
|
78bdf02c14 | ||
|
|
b4ea8f00ad | ||
|
|
7fd992e9f1 | ||
|
|
76e739cdc1 | ||
|
|
0e0cc1c884 | ||
|
|
21fba7f371 | ||
|
|
3f3a0c3c21 | ||
|
|
1db87b18de | ||
|
|
44b01bca96 | ||
|
|
441b13bed6 | ||
|
|
dd72e9edb7 | ||
|
|
8bbcc9b877 | ||
|
|
98580a8dc6 | ||
|
|
3600905a39 | ||
|
|
c207685b91 | ||
|
|
683f3bcb80 | ||
|
|
23f964ba28 | ||
|
|
56271ba346 | ||
|
|
252a402f4f | ||
|
|
d2d0722ac2 | ||
|
|
ce9bdccc4d | ||
|
|
2a992aa1d8 | ||
|
|
f73729bbe8 | ||
|
|
8634edbd8c | ||
|
|
cc3ead0799 | ||
|
|
566cd26e73 | ||
|
|
2354d5a8a4 | ||
|
|
778067a590 | ||
|
|
d8d9c844d1 | ||
|
|
dc6655514a | ||
|
|
feb3b72fd0 | ||
|
|
479e18b204 | ||
|
|
b1c169d0b8 | ||
|
|
7f75fadb31 | ||
|
|
6af70543ea | ||
|
|
59d5d575ad | ||
|
|
05f2b84cf5 | ||
|
|
a39d4a3063 | ||
|
|
1da019575e | ||
|
|
195c4be4e2 | ||
|
|
4dd672e600 | ||
|
|
f3a14c5ede | ||
|
|
af696a96aa | ||
|
|
d7de52fb4c | ||
|
|
ae66a8fcfc | ||
|
|
56d18774a8 | ||
|
|
7ba22c5555 | ||
|
|
dab7715eb7 | ||
|
|
ec8bac933d | ||
|
|
958ec65b17 | ||
|
|
e775acc209 | ||
|
|
d23631faef | ||
|
|
518401b2c4 | ||
|
|
20c3ebd662 | ||
|
|
8d0d03e152 | ||
|
|
632cfca71f | ||
|
|
221ff38a66 | ||
|
|
3ac7365c9b | ||
|
|
be53755010 | ||
|
|
30eafa3efa | ||
|
|
7c0a6a51d4 | ||
|
|
181f96823e | ||
|
|
7b4e9781ac | ||
|
|
7a4ff98ba8 | ||
|
|
100c2e3078 | ||
|
|
cc6f07d943 | ||
|
|
cc3a9c3a00 | ||
|
|
ce1d82c730 | ||
|
|
ec3a01de70 | ||
|
|
af894964fc | ||
|
|
5cebc4d418 | ||
|
|
04e0144004 | ||
|
|
c33c9814c2 | ||
|
|
3a946e5810 | ||
|
|
6a6a894a1c | ||
|
|
e1ffb9262d | ||
|
|
b3eb6904f9 | ||
|
|
72cbade402 | ||
|
|
6fd008c2e8 | ||
|
|
25f26f08de | ||
|
|
7ebc62d8e3 | ||
|
|
e04ba4f9e0 | ||
|
|
0d4324b009 | ||
|
|
6404956a62 | ||
|
|
769db78ee8 | ||
|
|
8bb8d52b1d | ||
|
|
e990659d05 | ||
|
|
0fcef353ae | ||
|
|
bf91a8a709 | ||
|
|
d81a608b3a | ||
|
|
8413ee77d4 | ||
|
|
4d92a30089 | ||
|
|
57f7e09bb6 | ||
|
|
19fdccc540 | ||
|
|
83c2f2a7a8 | ||
|
|
9dcea7ed6e | ||
|
|
6ad3de91e9 | ||
|
|
2bbbd166f9 | ||
|
|
327ba3f4e1 | ||
|
|
c9b77b6616 | ||
|
|
a94e58c83e | ||
|
|
d40794d7a0 | ||
|
|
7dd916dd80 | ||
|
|
d16d76d0fa | ||
|
|
a896949752 | ||
|
|
f63186a7a6 | ||
|
|
ee88e835ed | ||
|
|
1288a274f3 | ||
|
|
facc523aae | ||
|
|
11dfdd797d | ||
|
|
3dc37d0359 | ||
|
|
b00185e1dc | ||
|
|
44c65775ad | ||
|
|
9c31ee28b6 | ||
|
|
5868f91d2d | ||
|
|
ee3735904d | ||
|
|
2b39dde523 | ||
|
|
611fdcebe9 | ||
|
|
b6c21bb21f | ||
|
|
ed2fee3195 | ||
|
|
2d7a897a4d | ||
|
|
4f14c78b58 | ||
|
|
8b8c1d919e | ||
|
|
e960353de6 | ||
|
|
e563a4c319 | ||
|
|
131aef7069 | ||
|
|
73c3e078d1 | ||
|
|
8858d55970 | ||
|
|
f983f5de02 | ||
|
|
a8efba1ed4 | ||
|
|
8fc3682cc9 | ||
|
|
4ade871aba | ||
|
|
0a381e0a44 | ||
|
|
895e16d4cb | ||
|
|
6657fa3ad0 | ||
|
|
f5fcc7c206 | ||
|
|
435e6f46c1 | ||
|
|
9ef81e6e72 | ||
|
|
e4b4400aa5 | ||
|
|
1d9e082a4a | ||
|
|
43d11a5de2 | ||
|
|
94db6caa2c | ||
|
|
11366e5d8d | ||
|
|
a2967fa999 | ||
|
|
12920bc6c6 | ||
|
|
55fec45b58 | ||
|
|
045aa631e4 | ||
|
|
3cf3a70fc7 | ||
|
|
290dab29f1 | ||
|
|
79b252f839 | ||
|
|
49bd76f197 | ||
|
|
54492bedfb | ||
|
|
2d1c2df2cb | ||
|
|
1187e1c95e | ||
|
|
664a63211e | ||
|
|
b7df1e80c8 | ||
|
|
2d6563022e | ||
|
|
5423c84eed | ||
|
|
d263fb1b80 | ||
|
|
c72bd2a107 | ||
|
|
8e4627c872 | ||
|
|
ccbe99f828 | ||
|
|
ee483e3b2b | ||
|
|
5b4b13828b | ||
|
|
4b0bc71fb0 | ||
|
|
c28ae335b2 | ||
|
|
2d3830b747 | ||
|
|
fe4e205772 | ||
|
|
5e2fc8b0dc | ||
|
|
6403573e36 | ||
|
|
39b863b57e | ||
|
|
8e5cdcb6e5 | ||
|
|
f5b7cd6fb1 | ||
|
|
493ddc1f1f | ||
|
|
5ad338bdcc | ||
|
|
d1a1adb994 | ||
|
|
c879b030ad | ||
|
|
8d1d55c38e | ||
|
|
aef576d290 | ||
|
|
e34b0fded3 | ||
|
|
14e5e6a715 | ||
|
|
0579273964 | ||
|
|
5839a836c8 | ||
|
|
236fff8014 | ||
|
|
c1efefae81 | ||
|
|
1e5bd44332 | ||
|
|
7478537f3e | ||
|
|
b0f50b825f | ||
|
|
7509fcda52 | ||
|
|
0991cf74ef | ||
|
|
61dd2ec8db | ||
|
|
77643848b6 | ||
|
|
21ab172041 | ||
|
|
d6c2c2158a | ||
|
|
0c50e2d78e | ||
|
|
64183e8e7d | ||
|
|
b9595d1650 | ||
|
|
fa3be420b8 | ||
|
|
e2d1929553 | ||
|
|
4f05e8dbe9 | ||
|
|
ea9e79d930 | ||
|
|
e1a8d60cd7 | ||
|
|
4e20049ea3 | ||
|
|
89ccd33fd1 | ||
|
|
4668104e36 | ||
|
|
b4aa30de23 | ||
|
|
526cb1fb47 | ||
|
|
03b395ee15 | ||
|
|
4125344254 | ||
|
|
531e117731 | ||
|
|
588fdca4d7 | ||
|
|
285ca46c18 | ||
|
|
8bdb83eb73 | ||
|
|
d38b71d5ea | ||
|
|
687f06937d | ||
|
|
e0799a6772 | ||
|
|
4943dce1a8 | ||
|
|
8dee5c0d3c | ||
|
|
018b07299e | ||
|
|
6f52b82a6d | ||
|
|
e1ee905286 | ||
|
|
6853b158ce | ||
|
|
d705b8a45d | ||
|
|
cfb707d20f | ||
|
|
3aedc938cb | ||
|
|
c70e4c66e6 | ||
|
|
b727dbd604 | ||
|
|
cd7f237920 | ||
|
|
a1db763060 | ||
|
|
01e22740ce | ||
|
|
6b52b6b062 | ||
|
|
6781fd57af | ||
|
|
8b22c7812d | ||
|
|
80c1391361 | ||
|
|
c77e6b8616 | ||
|
|
e04ace4820 | ||
|
|
d89ea96b34 | ||
|
|
0e83e525fe | ||
|
|
d5d9a8bf03 | ||
|
|
ecb935868d | ||
|
|
d736d3c388 | ||
|
|
2520ccd6be | ||
|
|
4307dd043e | ||
|
|
4ae8e4252b | ||
|
|
995f03d03e | ||
|
|
2965f598ac | ||
|
|
0ad6f5aea1 | ||
|
|
c6fe8ff1f1 | ||
|
|
a3a6917bf8 | ||
|
|
1d8484957e | ||
|
|
0fc3fb4a58 | ||
|
|
6ab67ee844 | ||
|
|
11fa059b1b | ||
|
|
847115abd6 | ||
|
|
a5a0a310ce | ||
|
|
a72582b10f | ||
|
|
929e22dc5a | ||
|
|
ec4bca9bc0 | ||
|
|
0648541ce1 | ||
|
|
77529f29f5 | ||
|
|
02cf1739c0 | ||
|
|
903a5f5799 | ||
|
|
ccd955ca7e | ||
|
|
1af3b03fa8 | ||
|
|
cc28186f73 | ||
|
|
103bc8bd8b | ||
|
|
9bcf7af467 | ||
|
|
8d10980875 | ||
|
|
57d4945d71 | ||
|
|
11febb93bd | ||
|
|
cc9b83b0f8 | ||
|
|
54386924d7 | ||
|
|
35417bc05d | ||
|
|
8b212dd87f | ||
|
|
488035e124 | ||
|
|
9129edb725 | ||
|
|
6f3882e0ca | ||
|
|
f810f6aa85 | ||
|
|
6f13111c4c | ||
|
|
fcca1a1fa3 | ||
|
|
ac0aa9e33b | ||
|
|
6109ff7783 | ||
|
|
4d2d24efb3 | ||
|
|
e2b7081b9e | ||
|
|
6ba7fedc18 | ||
|
|
3973fae8ef | ||
|
|
77752f494f | ||
|
|
71574b62cb | ||
|
|
546ba16366 | ||
|
|
f61ca2ad17 | ||
|
|
781afd1c3b | ||
|
|
2bfd8495ab | ||
|
|
094fa65ad6 | ||
|
|
ec2a652d74 | ||
|
|
1b55645b81 | ||
|
|
5c02581c81 | ||
|
|
62cc4780ca | ||
|
|
8f26d57f40 | ||
|
|
3bd2fe889a | ||
|
|
492a2629c2 | ||
|
|
b64ddf32ff | ||
|
|
e86a550985 | ||
|
|
fcccdacb99 | ||
|
|
487de4c29b | ||
|
|
d36c6cb067 | ||
|
|
a4b704252b | ||
|
|
93e8d26a75 | ||
|
|
0a3ecaac64 | ||
|
|
ea6b762021 | ||
|
|
265a43e31c | ||
|
|
6d156586ac | ||
|
|
68e3f607a3 | ||
|
|
0b240a3902 | ||
|
|
4082761606 | ||
|
|
e68c42ba64 | ||
|
|
347546ee0e | ||
|
|
ca717d6b80 | ||
|
|
5d623d80eb | ||
|
|
a2edbd9934 | ||
|
|
5830f39d50 | ||
|
|
0aa0b59635 | ||
|
|
3c6a485647 | ||
|
|
bbe1fa8416 | ||
|
|
ac4469bb4a | ||
|
|
9e61e8eafa | ||
|
|
b193199268 | ||
|
|
f8b7d37af1 | ||
|
|
b3e9202d72 | ||
|
|
0f819ade56 | ||
|
|
d682afcde2 | ||
|
|
e67754ee9f | ||
|
|
4897771fbf | ||
|
|
4128f3404a | ||
|
|
7bc25ceb38 | ||
|
|
f77f0f5e04 | ||
|
|
0e666efaad | ||
|
|
e2893b9516 | ||
|
|
fb86b13948 | ||
|
|
e22cc6921d | ||
|
|
42fdd91206 | ||
|
|
2329d95002 | ||
|
|
8dda6ba13f | ||
|
|
156e2b8056 |
242
.github/copilot-instructions.md
vendored
Normal file
242
.github/copilot-instructions.md
vendored
Normal 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
|
||||
189
.github/workflows/Build_mR-NB.yml
vendored
189
.github/workflows/Build_mR-NB.yml
vendored
@@ -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
|
||||
|
||||
2
.github/workflows/add_PR_2_chlog.yml
vendored
2
.github/workflows/add_PR_2_chlog.yml
vendored
@@ -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
|
||||
|
||||
41
CHANGELOG.md
41
CHANGELOG.md
@@ -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
|
||||
|
||||
@@ -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
167
DEPLOYMENT_OPTIONS.md
Normal 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
|
||||
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
131
ExternalConnectors/OP/OnePasswordCli.cs
Normal file
131
ExternalConnectors/OP/OnePasswordCli.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
105
ExternalConnectors/VO/VaultOpenbao.cs
Normal file
105
ExternalConnectors/VO/VaultOpenbao.cs
Normal 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");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
185
ExternalConnectors/VO/VaultOpenbaoConnectionForm.Designer.cs
generated
Normal file
185
ExternalConnectors/VO/VaultOpenbaoConnectionForm.Designer.cs
generated
Normal 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;
|
||||
}
|
||||
}
|
||||
13
ExternalConnectors/VO/VaultOpenbaoConnectionForm.cs
Normal file
13
ExternalConnectors/VO/VaultOpenbaoConnectionForm.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
120
ExternalConnectors/VO/VaultOpenbaoConnectionForm.resx
Normal file
120
ExternalConnectors/VO/VaultOpenbaoConnectionForm.resx
Normal 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
158
IMPLEMENTATION_NOTES.md
Normal 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
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
67
PANEL_BINDING_FEATURE.md
Normal 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
|
||||
32
README.md
32
README.md
@@ -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 2015–2026 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
122
VISUAL_EXAMPLES.md
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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))
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"]);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
26
mRemoteNG/Connection/ConnectionFrameColor.cs
Normal file
26
mRemoteNG/Connection/ConnectionFrameColor.cs
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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)),
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
19
mRemoteNG/Connection/Protocol/ARD/ProtocolARD.cs
Normal file
19
mRemoteNG/Connection/Protocol/ARD/ProtocolARD.cs
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
457
mRemoteNG/Connection/Protocol/AnyDesk/ProtocolAnyDesk.cs
Normal file
457
mRemoteNG/Connection/Protocol/AnyDesk/ProtocolAnyDesk.cs
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 == "")
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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))
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
160
mRemoteNG/Connection/Protocol/WSL/Connection.Protocol.WSL.cs
Normal file
160
mRemoteNG/Connection/Protocol/WSL/Connection.Protocol.WSL.cs
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
18
mRemoteNG/Connection/VaultOpenbaoSecretEngine.cs
Normal file
18
mRemoteNG/Connection/VaultOpenbaoSecretEngine.cs
Normal 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
BIN
mRemoteNG/Icons/WSL.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
542
mRemoteNG/Language/Language.Designer.cs
generated
542
mRemoteNG/Language/Language.Designer.cs
generated
@@ -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 "{0}"?.
|
||||
/// </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 && 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>
|
||||
|
||||
@@ -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>&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>
|
||||
@@ -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>&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&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>&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 &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 &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>&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>&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 &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&eende {0}</value>
|
||||
</data>
|
||||
<data name="_TryAgain" xml:space="preserve">
|
||||
<value>&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 &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 & 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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>&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>
|
||||
@@ -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
@@ -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>
|
||||
@@ -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>&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>
|
||||
@@ -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>ヘルプ(&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
@@ -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 & Release Candidates.
|
||||
Nightly Channel includes Alphas, Betas & 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>
|
||||
@@ -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>&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&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>&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>&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 &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>&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>&Start</value>
|
||||
</data>
|
||||
<data name="CommandExitProgram" xml:space="preserve">
|
||||
<value>Avslu&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>&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>&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 &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>
|
||||
@@ -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>&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>
|
||||
@@ -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>&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>
|
||||
@@ -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>
|
||||
@@ -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>&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>
|
||||
@@ -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>&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 & 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 & 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 & 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 & 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>
|
||||
@@ -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>&Справка</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>
|
||||
@@ -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>&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 & 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>
|
||||
@@ -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
@@ -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>帮助(&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>
|
||||
@@ -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>說明(&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>
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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")]
|
||||
@@ -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 #>")]
|
||||
@@ -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
Reference in New Issue
Block a user