Compare commits

..

787 Commits

Author SHA1 Message Date
Sean Kaim
abeb546116 Add total downloads badge 2019-03-10 21:59:17 -04:00
David Sparer
5a226ff95a replaced the Rename icon
This version is easier to see in dark themes
2019-03-10 11:57:01 -05:00
David Sparer
1e36112c06 fixed bug with starting ext tool on folder when nothing selected 2019-03-09 15:43:43 -06:00
David Sparer
c149701f3f Merge branch 'release/v1.76' into develop
# Conflicts:
#	CHANGELOG.TXT
#	mRemoteV1/App/CompatibilityChecker.cs
#	mRemoteV1/App/Import.cs
#	mRemoteV1/Config/Serializers/MiscSerializers/RemoteDesktopConnectionManagerDeserializer.cs
#	mRemoteV1/Properties/AssemblyInfo.cs
#	mRemoteV1/Properties/Settings.Designer.cs
#	mRemoteV1/Properties/Settings.settings
#	mRemoteV1/app.config
#	mRemoteV1/mRemoteV1.csproj
2019-03-09 12:10:10 -06:00
David Sparer
752a36d88a Update README.MD 2019-03-09 11:38:17 -06:00
David Sparer
ed81030976 bumped v1.76.15 release date 2019-03-09 11:21:21 -06:00
David Sparer
54322ca949 updated changelog 2019-03-08 10:41:57 -06:00
David Sparer
738b159e95 handle sql first-run case
fixes #1303
2019-03-08 10:31:39 -06:00
David Sparer
e43302b821 Merge pull request #1336 from konpl/develop
Added ability to run External tools on folders
2019-03-08 07:43:01 -06:00
konpl
4f5b9233f4 Merge branch 'develop' into develop 2019-03-08 14:51:52 +03:00
Kirill Trifonov
149778000a Fix bug when run ExternalApp with multifolder structure 2019-03-08 14:49:22 +03:00
David Sparer
3641da1faa abtracted clipboard usage and added tests
fixes #1335
2019-03-07 11:25:23 -06:00
Kirill Trifonov
7c4df9b1c4 Copy Hostname fix #1335 2019-03-06 20:50:13 +03:00
Kirill Trifonov
7260678620 Ability to run External tools on folders, close #375 2019-03-06 17:25:44 +03:00
Sean Kaim
292c20d317 remove unneeded file 2019-03-05 14:19:04 -05:00
Sean Kaim
8fe8739897 use the correct script 2019-03-04 17:37:13 -05:00
Sean Kaim
75bd285f5c remove cert password reference from manual builds 2019-03-04 17:22:31 -05:00
Sean Kaim
822766c831 minimize commands during post-build step 2019-03-04 16:55:06 -05:00
Sean Kaim
8440bde9d7 hide some build output and more consistent cert checks in post build 2019-03-04 16:25:22 -05:00
Sean Kaim
6c792b208c typo and actually use solution dir... 2019-03-04 15:45:48 -05:00
Sean Kaim
a4b869a381 SolutionDir, not TargetDir... 😕 2019-03-04 14:30:34 -05:00
Sean Kaim
db0b48f1ad fulll cert path on AV builds 2019-03-04 13:44:18 -05:00
David Sparer
e8f2e4f50c bumped patch version 2019-03-04 11:45:07 -06:00
David Sparer
5cd201440e added tests for the disposable action class 2019-03-04 11:44:30 -06:00
David Sparer
5c6c76b898 one more parse bug fix 2019-03-04 11:30:34 -06:00
Sean Kaim
5b1486cb6f Update AV publish build 2019-03-04 12:23:28 -05:00
David Sparer
4847ce054b resolved several parsing bugs in the rdcman deserializer 2019-03-04 11:17:45 -06:00
David Sparer
ec42fe7d7d improved testability of the import class 2019-03-04 11:17:19 -06:00
Sean Kaim
116e405ae3 I has teh dumb... 2019-03-04 11:49:55 -05:00
Sean Kaim
202a92998a testing 2019-03-04 11:42:01 -05:00
Sean Kaim
f06618fdaf fix minor syntax 2019-03-04 11:36:54 -05:00
Sean Kaim
a8bd031935 Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop 2019-03-04 11:23:57 -05:00
Sean Kaim
d0dd92578b Updated deployment AV scripts 2019-03-04 11:23:21 -05:00
David Sparer
07a20ed5ad batch saves when importing connection files
This reduces saves/backup overwrites when importing multiple files
2019-03-04 08:41:27 -06:00
David Sparer
b5228e547c Merge pull request #1320 from mRemoteNG/favorites2
Add connection tree favorites
2019-02-28 08:55:46 -06:00
Faryan Rezagholi
29be020e32 added missing tooltips 2019-02-28 10:04:49 +01:00
Faryan Rezagholi
8b443ed10b added favorites to the quick connect drop down 2019-02-28 10:01:35 +01:00
Faryan Rezagholi
9d24c6091b fixed remaining failing test 2019-02-27 20:53:39 +01:00
Faryan Rezagholi
6d2b6259a9 merge from develop 2019-02-27 20:28:41 +01:00
Faryan Rezagholi
2c7425bc51 corrected order of connection info favorite property 2019-02-27 19:54:25 +01:00
David Sparer
6c75fc3506 fixed several tests that assume english localization 2019-02-27 12:17:44 -06:00
Faryan Rezagholi
46ab5829b7 fixed some failing tests 2019-02-26 12:53:05 +01:00
David Sparer
5c5daf053b fixes #1329 2019-02-25 13:59:52 -06:00
Sean Kaim
3cb9bf984b fix the deployment name 2019-02-24 22:18:52 -05:00
Sean Kaim
4b59d79977 appveyor publish changes 2019-02-24 21:23:09 -05:00
Sean Kaim
7fc987f1a2 update appveyor build options 2019-02-24 21:07:10 -05:00
Sean Kaim
f14fd6bf5a Fixes #1314 - hide elements until they are needed
Fixes #1314
2019-02-24 19:26:50 -05:00
Sean Kaim
d3f3a14b1f update appveyor config to exclude portable pdbs 2019-02-24 18:59:59 -05:00
Sean Kaim
b812a1b06f update appveyor config to exclude pdbs 2019-02-24 18:35:59 -05:00
Sean Kaim
2282c19f46 Add 2 strings to resouce file 2019-02-20 23:32:53 -05:00
Sean Kaim
ccc28ba54c Fix CS0649 2019-02-20 23:17:56 -05:00
Sean Kaim
a512465d07 fix CA2213 warnings 2019-02-20 23:15:26 -05:00
Sean Kaim
1bb18abf5a Update tab text for HTTP(S) connections 2019-02-20 23:03:31 -05:00
Sean Kaim
1fec4b33b2 update other nuget packages 2019-02-20 22:53:21 -05:00
Sean Kaim
6266aab466 update gecko nuget 2019-02-20 22:32:48 -05:00
Sean Kaim
31bff169a2 update bouncycastle nuget 2019-02-20 22:30:33 -05:00
Sean Kaim
2f956ed400 update NUnit NuGet packages 2019-02-20 22:25:09 -05:00
Sean Kaim
b16831fc86 implement IDisposable / fix CA1001 warnings 2019-02-20 22:08:03 -05:00
Sean Kaim
ee74a25eae Translation updates
* All files updated via Zeta Editor
* Removed some incorrectly added objects (typos)
* Updated Russian translation (mostly via Google Translate but with some native speaker validation)
2019-02-20 21:32:22 -05:00
Sean Kaim
80eb314d03 fix a typo 2019-02-18 19:15:50 -05:00
Sean Kaim
fd6478c7f5 remove waffle.io 2019-02-18 19:13:59 -05:00
Faryan Rezagholi
56ba332dc5 fixed copy&paste error 2019-02-18 19:14:12 +01:00
Faryan Rezagholi
14deac00f6 updated comment 2019-02-18 19:13:27 +01:00
Faryan Rezagholi
481ca5194a reapplied changes from old PR 2019-02-18 12:57:34 +01:00
David Sparer
0cb4a2cfcc Merge pull request #1309 from mRemoteNG/lang_fix
German language fixes
2019-02-17 14:15:13 -06:00
Faryan Rezagholi
c6d6c2323c fixed genus of Logfile 2019-02-17 19:38:34 +01:00
Faryan Rezagholi
d65c52f6ea merge develop into lang_fix 2019-02-17 19:36:38 +01:00
Faryan Rezagholi
aef9f98095 some more tweaks 2019-02-15 23:14:50 +01:00
Sean Kaim
e143c6b5b4 resharper code reformat (to allow standard code style going forward) 2019-02-15 16:47:56 -05:00
Faryan Rezagholi
c570c1c0eb replaced "Protokolldatei" with "Logfile" 2019-02-15 22:02:58 +01:00
Sean Kaim
4bc3fe0c1b Use .editorconfig to code style/formatting 2019-02-15 15:59:09 -05:00
Faryan Rezagholi
1f46339900 removed newline 2019-02-15 21:57:09 +01:00
Faryan Rezagholi
a4f354161d removed "..." 2019-02-15 21:55:17 +01:00
Faryan Rezagholi
8a7bc4583b fixed typo in language resource string 2019-02-14 19:08:02 +01:00
Faryan Rezagholi
8468a3de7c fixed unnatural wording 2019-02-14 18:53:07 +01:00
Faryan Rezagholi
e4ff7b43f2 fixed capitalization on one word; translated overlooked word 2019-02-13 23:14:38 +01:00
Faryan Rezagholi
220396d016 renamed proxy settings category from miscellaneous to proxy as there was already a categroy named miscellaneous 2019-02-13 21:24:53 +01:00
Faryan Rezagholi
91f01abbae fixed some more inconsistencies/missing strings in german translation 2019-02-13 09:57:28 +01:00
Faryan Rezagholi
7eda617af9 added/fixed german translation 2019-02-12 22:53:24 +01:00
Faryan Rezagholi
595a22efc3 made hardcoded text on buttons translatable 2019-02-12 22:53:10 +01:00
Faryan Rezagholi
d2578e5be5 made hardcoded strings on updates options page translatable, fixes #785 2019-02-12 22:18:51 +01:00
Sean Kaim
0cd1485f85 Merge pull request #1243 from farosch/rearrange_menu_items
rearranged items and added/replaced icons
2019-02-11 17:26:29 -05:00
Sean Kaim
ab1dcd0e45 Merge branch 'develop' into pr/1243 2019-02-11 17:23:10 -05:00
Sean Kaim
8281f488f3 Merge pull request #1258 from mRemoteNG/RemoveMagicLib
Remove magic lib
2019-02-09 19:24:03 -05:00
Camilo Alvarez
c4a1879ae9 Remove IsSimpleDropSink restores item sorting for #1266
#1266 was generated by OLV ignoring some sink cusotmizations by using the  IsSimpleDropSink flag
2019-02-08 23:55:04 -05:00
Sean Kaim
fcc51b591e Merge branch 'develop' into RemoveMagicLib 2019-02-08 17:22:15 -05:00
Sean Kaim
1b44334361 Merge pull request #1276 from farosch/quick_connect
Set focus to textbox instead of connecting,
2019-02-08 17:21:04 -05:00
Sean Kaim
7ec677f021 conditinally focus 2019-02-08 17:20:30 -05:00
Sean Kaim
08201b0f00 Port FIPS override back to 1.76
Fixes #222
2019-02-08 16:51:58 -05:00
Sean Kaim
89055d2ae9 Remove outdated/incorrect translations for strErrorFipsPolicyIncompatible
These will need to be re-translated.
2019-02-08 16:43:43 -05:00
Sean Kaim
7393159f26 Missed the settings file from previous commit 2019-02-08 16:42:50 -05:00
Sean Kaim
dda2b4af11 Allow FIPS check to be overridden.
Fixes #222
2019-02-08 16:42:21 -05:00
Sean Kaim
7e1bc19a13 cleanup white space 2019-02-08 16:02:11 -05:00
Sean Kaim
650f1df0ee break out expand/collapse on connection tree
Fixes #1273
2019-02-08 15:59:52 -05:00
Sean Kaim
f7bfa82517 Dispose calls Close & Whitespace cleanup 2019-02-08 12:09:31 -05:00
Camilo Alvarez
b0bf31b29c Remove deadlock in #1247
#1247 was caused by a loop of the putty control calling the tab dispose and back again. Created a flag to indicate the ConnectionTab that the closing process was called by the protocol and not the user.
2019-02-07 17:39:40 -05:00
Sean Kaim
54bb9a8f5a minor code cleanup 2019-02-07 15:58:01 -05:00
Sean Kaim
7a38c1055a typo and link fix 2019-02-07 14:38:14 -05:00
Camilo Alvarez
cda557b6fb Avoid null pointers when race conditions or faults are present in protocol closing
Avoid some of the detected faults
2019-02-06 17:53:05 -05:00
Camilo Alvarez
e1fc272e1c new tabs are created in current panel
Added current panel to TabHelper, new tabs are created in the current panel
2019-02-06 11:58:24 -05:00
Camilo Alvarez
aa9b32a383 Changed refocusing method for rdp tabs
Solve bug reported by Joe Cefoli on gitter
2019-02-06 11:27:40 -05:00
Camilo Alvarez
c836e29d2f Screenshots correctly taken from windowed tab
Screenshots can be taken from undock tabs, created helper tab singleton class to make it easy to determine the current tab in the DPS - mremote model
2019-02-05 20:50:13 -05:00
Camilo Alvarez
39b919c38a Improves RDP tab focus
Improves rdp tab focus by passing active to focus event between rdp client and DPS  tab
2019-02-05 20:24:39 -05:00
Camilo Alvarez
4b8d06dfe8 Improvement in protocol to tab focus
Tabs are focused now when mouse is clicked inside of the connetiontab, before clicking inside ssh window, for example, will not highlight the tab.
2019-01-29 23:30:40 -05:00
Camilo Alvarez
b3cfcc1a5e Screenshot only taken from ConnectionTab area
Screenshots contained dockstrip area (the tab name with the x icon), now they are only limited to the ConnectionTab area
2019-01-29 23:19:33 -05:00
Faryan Rezagholi
41f1a65ce6 fixed position of ok button (was 1px off) 2019-01-28 20:16:39 +01:00
Sean Kaim
f8800384e0 Merge branch 'develop' into RemoveMagicLib 2019-01-25 17:15:57 -05:00
Sean Kaim
765bb3886d full path to cert 2019-01-25 16:53:17 -05:00
Sean Kaim
1768104d47 add rlease config and decrypt cert later 2019-01-25 16:46:17 -05:00
Sean Kaim
ab2f4b339a faster build targets? 2019-01-25 16:26:52 -05:00
Sean Kaim
531b1dfa33 build script for signing 2019-01-25 15:50:49 -05:00
Sean Kaim
935719fd43 Merge branch 'develop' into RemoveMagicLib 2019-01-25 15:29:08 -05:00
Sean Kaim
120d928402 use relative path 2019-01-25 15:28:54 -05:00
Sean Kaim
6ad29aaf3c Merge branch 'develop' into RemoveMagicLib 2019-01-25 14:55:14 -05:00
Sean Kaim
ea48c6d68c appveyor publish 2019-01-25 14:54:52 -05:00
Sean Kaim
34c8f21cc6 update with appveor publish build 2019-01-25 13:43:14 -05:00
Sean Kaim
18913eedae Merge branch 'develop' into RemoveMagicLib 2019-01-24 17:04:40 -05:00
Sean Kaim
9b159268bd whitespace clean up 2019-01-24 17:04:11 -05:00
Sean Kaim
a6cd5656f8 no borders for puttyng integrated processes
fixes  #1265
2019-01-23 21:05:15 -05:00
Camilo Alvarez
c93deb7696 Screenshot method change
Some screenshots were blank because DrawToBitmap uses the tab drawing graphics, New method uses screen buffer that brings the pixels from the final screen render.
2019-01-22 15:44:10 -05:00
Camilo Alvarez
0699e895fd Fix for #1249 screenshot X
Corrected casting for disposing the form
2019-01-21 23:49:35 -05:00
Camilo Alvarez
1f700f7842 Fix for #1257
CreateGraphics was the function being disposed in the using, the form handle was still floating around. Suggestion to optimize the dpi function
2019-01-21 23:29:26 -05:00
David Sparer
3db50096c5 Merge pull request #1281 from V0174/patch-1
Typo correction in czech translation
2019-01-17 07:32:31 -06:00
V0174
36bb614a27 Typo correction
Heso -> Heslo.
2019-01-17 08:31:58 +01:00
Sean Kaim
968471ec4a white space clean up 2019-01-16 22:38:31 -05:00
Sean Kaim
401a518f0f Theme page label text update
All theme changes require a restart.
2019-01-16 22:35:08 -05:00
Sean Kaim
96af6b252a themeing fix & update comments 2019-01-16 11:18:34 -05:00
Sean Kaim
6bac9c2432 Disable AlwaysShowConnectionTabs functinoality
This will not work with DPS currently.  Reference https://github.com/dockpanelsuite/dockpanelsuite/issues/559
2019-01-15 17:16:18 -05:00
Sean Kaim
ad44a6ccee Merge branch 'develop' into RemoveMagicLib 2019-01-15 17:04:04 -05:00
David Sparer
d7f6f28413 Merge pull request #1204 from leaskovski/develop
Added a new option to toggle Connection Tabs
2019-01-15 14:23:43 -06:00
Leaskovski
6161307cbb Merge branch 'develop' of https://github.com/mRemoteNG/mRemoteNG into develop
# Conflicts:
#	mRemoteV1/Properties/Settings.Designer.cs
#	mRemoteV1/Properties/Settings.settings
#	mRemoteV1/Resources/Language/Language.resx
#	mRemoteV1/UI/Forms/OptionsPages/TabsPanelsPage.Designer.cs
#	mRemoteV1/app.config
2019-01-15 17:22:43 +00:00
Faryan Rezagholi
96952817c1 Merge branch 'develop' into rearrange_menu_items 2019-01-13 01:42:33 +01:00
Faryan Rezagholi
c8d4a9a671 Set focus to textbox instead of connecting, fixes #1271 2019-01-13 01:30:23 +01:00
Sean Kaim
f059a7732f Fix some theming issues. New IsExtended propery
Done with theme stuff... Or at least I want to be...
2019-01-11 13:30:39 -05:00
Sean Kaim
adefd95fb6 undo a line that was added for testing... Sorry. 2019-01-11 11:29:41 -05:00
Sean Kaim
a0935e8613 missed 2 files in last commit 2019-01-11 11:29:15 -05:00
Sean Kaim
bebc9c9dd4 check themeing active AND/OR IsExtendable
Lots of small changes as a result of this

other minor clean up

Tests should pass now.

And if \Themes\vs2015light.vstheme can't ben loaded, we should be OK now...
2019-01-11 11:28:57 -05:00
Sean Kaim
82507aabcb additional saftey checks and no extended palette for "raw" default theme 2019-01-11 10:48:03 -05:00
Sean Kaim
4e8d336527 remove enable themes and default accordingly
additional error handling attempts for theme loading.
Though, if we can't load \Themes\vs2015light.vstheme we're going to have a bad time...
2019-01-11 10:07:09 -05:00
Sean Kaim
9977f33461 whitespace 2019-01-11 09:25:58 -05:00
Sean Kaim
4e11baa579 designer generated change 2019-01-11 09:03:57 -05:00
Sean Kaim
ef82df5e72 minor cleanup/refactoring 2019-01-10 17:19:02 -05:00
Sean Kaim
506ae1cbc6 Merge branch 'develop' into RemoveMagicLib 2019-01-10 16:10:25 -05:00
Sean Kaim
6156ce48ac rename ONLY the 4 vsthemes
DPS themes are back to their default names.

The *.vsthemes provided on the file system get named in memory to *NG

If we don't find the the theme name pulled from settings, blank it out. This should ONLY happen after upgrading from previous releases for users of the 4 *.vsthemes providedon the file system:  "darcula", "vs2015blue", "vs2015dark" , "vs2015light"

The 3 vs2015* ones are NOT to be confsed with the DPS provided versions of the almost identical name.

Jumping through hoops rather than renaming files/theme names to avoid unexpected theme changes for as many users as possible.
2019-01-10 16:08:56 -05:00
David Sparer
cd32b69d86 Merge pull request #1267 from farosch/overlay_icon_fix
Fixed connection icon overlay sizing
2019-01-10 14:27:55 -06:00
Faryan Rezagholi
1ca38386b7 always resize connection icon to 16x16 before adding overlay icon, fixes #1264 2019-01-10 20:48:26 +01:00
Sean Kaim
ef48f51834 move base.SaveSettings to top like other pages 2019-01-10 14:44:27 -05:00
Sean Kaim
8bcd6b9e53 save settings should only be called on OK/Apply 2019-01-10 14:43:46 -05:00
Sean Kaim
7c22ea6b01 Add apply button 2019-01-10 14:41:25 -05:00
Sean Kaim
b5034fd925 whitespace cleanup 2019-01-10 14:39:27 -05:00
Sean Kaim
a765a71474 minor cleanup 2019-01-10 14:22:58 -05:00
Sean Kaim
f3ad6e66e8 whitepsace clean up 2019-01-10 14:17:06 -05:00
Sean Kaim
3713f98f7b whitespace 2019-01-10 14:00:26 -05:00
Sean Kaim
0c6778b5a3 minor clean up 2019-01-10 13:57:51 -05:00
David Sparer
f56f1160ba safer cast and value access when creating float window 2019-01-10 10:22:00 -06:00
Camilo Alvarez
cc184b7c58 Float window customization for size
It will undock to the original size when it was docked
2019-01-10 10:14:31 -05:00
Sean Kaim
53fdf2bbbf minor clean up 2019-01-10 09:24:42 -05:00
Sean Kaim
033635fb43 copyright 2019
reference #1261
2019-01-09 22:49:20 -05:00
Sean Kaim
40682bc842 create empty panel on startup not working
Reference #1261
2019-01-09 22:46:59 -05:00
Sean Kaim
9da26358ba copy hostname on folder causes exception
Reference #1261
2019-01-09 22:27:14 -05:00
Sean Kaim
2f0550de8e doubleclick on running connection in tree should bring tab to focus
Reference #1261
2019-01-09 22:21:12 -05:00
Sean Kaim
f6a1d603a9 avoid duplicate close() on reconnect 2019-01-09 21:30:03 -05:00
David Sparer
764521414f double include switch-to handler for doubleclick yet 2019-01-09 19:08:17 -06:00
David Sparer
ffe44706c2 fixed issue with connection handlers not updating when settings change 2019-01-09 19:02:17 -06:00
David Sparer
41cab2f652 resolved exception when closing a connection group (top-level dps tab) 2019-01-09 18:03:24 -06:00
David Sparer
35fada7fcd prevent exception when removing connection from list 2019-01-09 16:46:21 -06:00
David Sparer
5b8fb68f65 Merge branch 'develop' into RemoveMagicLib
# Conflicts:
#	mRemoteV1/UI/Forms/OptionsPages/ConnectionsPage.cs
2019-01-09 15:50:53 -06:00
David Sparer
f5e668b716 added user setting for TrackActiveConnectionInConnectionTree 2019-01-09 15:48:11 -06:00
David Sparer
acbc03dc82 Merge pull request #1231 from SeanTMill/feature/trackintree
Tracks the active tab in the treeview
2019-01-09 15:22:35 -06:00
David Sparer
294281e0ac fixed page font 2019-01-09 15:19:44 -06:00
David Sparer
2d450d4dbd Merge branch 'help-updates' of https://github.com/nmat/mRemoteNG into develop
# Conflicts:
#	mRemoteV1/UI/Window/HelpWindow.cs
2019-01-09 15:19:24 -06:00
Sean Kaim
e2865fafde update changelog 2019-01-09 13:57:33 -05:00
Sean Kaim
aa546d87ff safety checks 2019-01-09 10:35:28 -05:00
Sean Kaim
72e637d389 Merge branch 'develop' into RemoveMagicLib 2019-01-09 10:17:38 -05:00
Sean Kaim
842f7045f8 update ADTree.dll
DPI scaling and other minor fixes
2019-01-09 10:17:26 -05:00
Sean Kaim
4f4f3a0370 Merge branch 'develop' into RemoveMagicLib 2019-01-09 09:46:28 -05:00
Sean Kaim
6a354f8757 don't default to a dummy domain
This causes the control to timeout and takes nearly 30 seconds to load
2019-01-09 09:46:14 -05:00
David Sparer
abd9aaa567 close splashscreen when error occurs while loading connections 2019-01-09 07:29:59 -06:00
Sean Kaim
32c4f984e9 theming updates and minor UI changes 2019-01-08 17:10:36 -05:00
Sean Kaim
86e806d021 code cleanup 2019-01-08 13:17:30 -05:00
Sean Kaim
32cff8af6d remove old code 2019-01-08 13:10:20 -05:00
Sean Kaim
40ac2124d8 whitespace clean up 2019-01-08 13:09:41 -05:00
Sean Kaim
a107d0586f close the protocol properly, just not the DockContent... 2019-01-08 12:16:50 -05:00
Sean Kaim
8a94000d98 clean up / refactoring 2019-01-08 12:02:43 -05:00
Sean Kaim
bb90261521 designer generated update 2019-01-08 11:57:45 -05:00
Sean Kaim
fd246bc83b Update title bar on connection change 2019-01-08 11:52:38 -05:00
Sean Kaim
018a97fb8e whitespace cleanup 2019-01-08 11:46:22 -05:00
Sean Kaim
9d10ee2da5 saftey checks 2019-01-08 11:45:41 -05:00
Sean Kaim
8a62942894 whitespace cleanup 2019-01-08 11:16:27 -05:00
Sean Kaim
71cabea03e minor cleanup 2019-01-08 11:15:25 -05:00
Sean Kaim
a37cd62d7e more updates to change themes on restart only 2019-01-08 10:49:32 -05:00
Sean Kaim
f180a5cd70 do nothing if double click on close is not set 2019-01-08 10:14:57 -05:00
Sean Kaim
4405a1fbf7 clean up / resharper fixes 2019-01-08 10:10:07 -05:00
Camilo Alvarez
7603587ce3 Reubicated the custom dock strip initialization
Now it work with all the themes and no theme enabled
2019-01-07 21:31:16 -05:00
Camilo Alvarez
27a06f6cfa Partial fix of double clic
Missing behavior on no theme scenario. Themes including default tested.
2019-01-07 21:03:08 -05:00
Camilo Alvarez
190204a47f Reverted the double click
Reverted the double click as it brokes the tab looks with themes
2019-01-07 20:01:21 -05:00
Camilo Alvarez
7e4003968d Fix broken test
Try #1 -.-
2019-01-07 19:28:03 -05:00
Camilo Alvarez
174dfbe95e Double click to close tab initial implementation
With the setting DoubleClickOnTabClosesIt it will close the tab, otherwise it will undock it. Missing do nothing implementation
2019-01-07 19:07:53 -05:00
Sean Kaim
9fef6dd2d3 minor clean up 2019-01-07 17:34:44 -05:00
Sean Kaim
4ac51a7e58 Tab ICONS!!!! 2019-01-07 17:01:41 -05:00
Sean Kaim
8487dde026 move connectiontab.designer to proper location in project
also make sure it has proper DPI settings
2019-01-07 16:35:02 -05:00
Sean Kaim
52bdf64cdb removed unused variable 2019-01-07 16:24:16 -05:00
Sean Kaim
e254d6978e ActiveTheme is only saved in setting and applied on restart 2019-01-07 15:33:14 -05:00
Sean Kaim
9eb15a25a5 designer generated change 2019-01-07 15:29:19 -05:00
Sean Kaim
8a63200ab9 handle events only when theming is active 2019-01-07 15:28:20 -05:00
Sean Kaim
b18ffc350f clean up 2019-01-07 14:53:24 -05:00
Sean Kaim
1340bc9902 apply themes after restart 2019-01-07 14:50:06 -05:00
Sean Kaim
df36523d6c minor cleanup 2019-01-07 14:27:24 -05:00
Sean Kaim
e626b65f5d speed up Options Page load 2019-01-07 14:03:38 -05:00
Sean Kaim
3ea8a75b3f minor fixes/cleanup 2019-01-07 11:46:14 -05:00
Sean Kaim
6fed9375d3 minor theming fix 2019-01-07 10:52:00 -05:00
Sean Kaim
7764c60797 Merge branch 'develop' into RemoveMagicLib 2019-01-07 10:37:53 -05:00
Sean Kaim
141567f303 Merge pull request #1253 from mRemoteNG/hidpi_fixes
Hidpi fixes
2019-01-07 10:37:35 -05:00
Sean Kaim
ecb2b05c5a connection panel rename not working
other misc fixes/cleanup
2019-01-07 10:17:52 -05:00
Sean Kaim
eda60a7142 resharper fixes & exception logging 2019-01-07 09:27:19 -05:00
nmat
e5fc8bfb2c Merge remote-tracking branch 'upstream/develop' into help-updates 2019-01-07 11:07:41 +01:00
Camilo Alvarez
d8cdba262b Remove tabcontroller references
Remove commented tab controller references
2019-01-06 22:43:57 -05:00
Camilo Alvarez
20f3b19f29 Restored reconnect all, correct tab collection now used instaed of custom one
Reconnect all from main file menu restored, tabsReferences in ConnectionWindow deleted in favor of connDock.DocumentsToArray()
2019-01-06 22:32:16 -05:00
Camilo Alvarez
52ef0c8bcb Fix darcula theme tab colors
Fix color to match theme
2019-01-06 21:17:12 -05:00
Sean Kaim
85aeb059fc find the correct InterfaceControl on conn change 2019-01-05 20:47:33 -05:00
Sean Kaim
edfbad2432 Implement screen shot functionality. 2019-01-05 19:58:56 -05:00
Sean Kaim
ea5b0362df more DPI scaling fixes + frmChoosePnl fixes
frmChoosePanel button layout was off a bit.
Exception when clicking "new" when no panels exist.
2019-01-05 14:34:02 -05:00
David Sparer
1c7d5a5803 fix scaling mode on options pages 2019-01-05 08:20:50 -06:00
Sean Kaim
adb7035f3e Merge branch 'develop' into RemoveMagicLib 2019-01-04 20:33:54 -05:00
Sean Kaim
31f9611478 update external references
ADTree from mRemoteNG/ADTree
VncSharp from mRemoteNG/VncSharp with upstream changes included
2019-01-04 17:19:39 -05:00
Sean Kaim
543da46457 Merge branch 'develop' into RemoveMagicLib 2019-01-04 14:06:19 -05:00
Sean Kaim
6409cb276f minor theme related fixes 2019-01-04 13:58:17 -05:00
Sean Kaim
c07e2e48d0 RDP resize (fit and smartsize) are working now 2019-01-03 22:07:28 -05:00
Sean Kaim
df8613f6be minor refactoring 2019-01-03 21:46:33 -05:00
Sean Kaim
3b35e5a44d minor clean up and default to modern theme 2019-01-03 17:06:44 -05:00
Sean Kaim
69216c8902 minor cleanup 2019-01-03 16:23:31 -05:00
Sean Kaim
3fcafbd76b code clean up 2019-01-03 16:06:59 -05:00
Sean Kaim
a45772bceb remove the magiclib dll... 2019-01-03 15:41:03 -05:00
Sean Kaim
aa0be76c6b remove old MagicLib related code 2019-01-03 15:36:31 -05:00
Sean Kaim
3581f2c818 code cleanup 2019-01-03 14:58:57 -05:00
Sean Kaim
469e6b301c code clean up 2019-01-03 13:13:56 -05:00
Sean Kaim
854af92f3d Merge branch 'develop' into RemoveMagicLib 2019-01-03 12:12:39 -05:00
Sean Kaim
bacf832158 More Segoe UI 2019-01-03 12:08:33 -05:00
Sean Kaim
31744be691 Window -> Segoe UI
and cleanup
2019-01-03 12:04:49 -05:00
Sean Kaim
59155b9f6c TaskDailog -> Segoe UI
and minor cleanup
2019-01-03 11:46:14 -05:00
Sean Kaim
9692e67aab minor cleanup 2019-01-03 11:42:35 -05:00
Sean Kaim
3ab3b79bc7 minor cleanup 2019-01-03 11:41:30 -05:00
Sean Kaim
132713f274 more Forms -> Segoe UI 2019-01-03 11:38:09 -05:00
Sean Kaim
62f7347178 Forms -> Segoe UI 2019-01-03 11:24:04 -05:00
Sean Kaim
3dcb0b2c69 PageSequence -> Segoe UI
and some cleanup
2019-01-03 11:20:10 -05:00
Sean Kaim
9e962b468e FilteredPropertyGrid -> Segoe UI 2019-01-03 11:11:08 -05:00
Sean Kaim
d87283b7d7 UI.ConnTree -> Segoe UI 2019-01-03 11:09:17 -05:00
Sean Kaim
e442cacf5f Controls.Base -> Segoe UI 2019-01-03 09:28:48 -05:00
Sean Kaim
f8ed5b37ac controls -> Segoe UI 2019-01-03 09:24:50 -05:00
Sean Kaim
c36d873636 clean up 2019-01-03 09:21:58 -05:00
nmat
ca2f45fc41 Merge remote-tracking branch 'upstream/develop' into help-updates 2019-01-03 12:21:37 +01:00
nmat
3a3f8546d1 Cleanup and finalize some updates
Added and removed some help. Nothing big but trying to finalize some parts of help.
2019-01-03 12:21:17 +01:00
Sean Kaim
42befd9ce7 count open documents on main form close 2019-01-02 17:40:31 -05:00
Sean Kaim
0f315f414d typo 2019-01-02 17:11:23 -05:00
Sean Kaim
44c35c7fb3 changelog update 2019-01-02 16:06:28 -05:00
Sean Kaim
b1a4d839ac Merge branch 'develop' into RemoveMagicLib 2019-01-02 15:57:01 -05:00
Sean Kaim
1ad46b484f NGNumericUpDown Theming fix
Fixes #1240
2019-01-02 15:40:46 -05:00
Sean Kaim
67420e5416 Segoe UI font on Connections Option page 2019-01-02 15:39:53 -05:00
Sean Kaim
166cec0483 minor clean up 2019-01-02 12:48:47 -05:00
Camilo Alvarez
2c3aace7a9 Tool forms restricted from entering document area
Avoid mixing tool and connection forms in the document area, as they behave and look different.
2019-01-02 12:40:55 -05:00
Sean Kaim
d3e40d7c3d Speed up Theme Option Page load
Fixes #1245

The CheckChanged event was causing load settings to be called more than once on form load.
2019-01-02 10:43:33 -05:00
Sean Kaim
efad824fe3 Speed up Theme Option Page load
Fixes #1245

The CheckChanged event was causing load settings to be called more than once on form load.
2019-01-02 10:42:01 -05:00
Sean Kaim
3bb6962ccc minor cleanup 2019-01-02 10:40:32 -05:00
Sean Kaim
6edb94758e minor cleanup 2019-01-02 08:57:59 -05:00
Camilo Alvarez
e8e70bc81b Resolved broken build, references to drag events
Removed event handlers caused broken build.
2019-01-01 20:38:49 -05:00
Camilo Alvarez
269bbb71f3 Removed drag events
Drag events are already implemented in the MDI mode of DockPanelSuite.
2019-01-01 19:37:40 -05:00
Camilo Alvarez
5cfee0974e Cleanup unused code in CloseOtherTabsToTheRight
Cleanup unused code in CloseOtherTabsToTheRight
2019-01-01 19:30:20 -05:00
Camilo Alvarez
a08454a09a Tab close , other and right restored
Reorganized the close event to the connectionTab class, restore the close from the tab X icon functionality , close all other and close left
2019-01-01 19:26:52 -05:00
David Sparer
ce371e45ae xml deserialization can now tolerate missing attributes 2019-01-01 13:50:00 -06:00
David Sparer
82808be0c7 deleted confcons 2.8 schema since this version doesnt exist 2019-01-01 13:43:03 -06:00
David Sparer
f124ec7131 fixed failing test of the PreviousSessionOpener and readded necessary interface property 2019-01-01 11:55:14 -06:00
Sean Kaim
3ea94fc5e0 fixed failing tests 2018-12-31 14:53:22 -05:00
Sean Kaim
afac6a9a89 Merge branch 'RemoveMagicLib' of https://github.com/mRemoteNG/mRemoteNG into RemoveMagicLib 2018-12-31 12:39:23 -05:00
Sean Kaim
80864c7ca4 code clean up / fix invalid cast
exception would be thrown when attempting to start an external app as a connection.
2018-12-31 12:39:05 -05:00
Camilo Alvarez
19765848d5 Update ConnectionWindow.cs
Restored rename tab functionality
2018-12-31 12:31:50 -05:00
Sean Kaim
21b3ca0b2f cleanup 2018-12-31 12:01:02 -05:00
Sean Kaim
710fdef0fb avoid exception
When clicking on a cell after switching from an extensable theme to a non-extensable one.
2018-12-31 11:38:56 -05:00
Sean Kaim
4f0237209a Enable DPS 2015 Themes
Rename themes to show that they are the DPS out of the box themes.
2018-12-31 11:37:57 -05:00
Sean Kaim
8f5c40487c minor fixes/cleanup 2018-12-31 11:05:53 -05:00
Sean Kaim
5cecd2be81 enable more right click methods 2018-12-31 10:47:33 -05:00
Sean Kaim
c24b79cb9d FindInterfaceControl(DockPanel DockPnl) 2018-12-31 10:34:44 -05:00
David Sparer
0e804d0bba ngradiobutton now scales correctly for hidpi 2018-12-31 09:23:26 -06:00
Sean Kaim
c749f9ead4 Merge branch 'RemoveMagicLib' of https://github.com/mRemoteNG/mRemoteNG into RemoveMagicLib 2018-12-31 10:19:18 -05:00
Camilo Alvarez
87f8317b97 Update ConnectionWindow.cs
Resolved tabs getting into dock panel positions . Tabs are now restricted to  DockAreas.Document | DockAreas.Float. Menu hook no on opening event insteaed of mouse events .
2018-12-31 10:12:32 -05:00
David Sparer
e6e4ecacaf improved display of ngcheckbox on hidpi devices 2018-12-31 08:48:44 -06:00
Sean Kaim
d458bb9a45 minor cleanup 2018-12-31 09:39:07 -05:00
Sean Kaim
362bf7b141 Close is successful - so at least we can reelase some resources for now...
Added a log message also...
2018-12-31 09:16:01 -05:00
Sean Kaim
9c81766b78 Find the correct connection and switch to it
If a connection is open, double clicking on it in the connection tree should switch to that connection...
2018-12-30 22:27:42 -05:00
Sean Kaim
28580103f3 Initial tab close implemtnation
PuttyProcess.Dispose() seems to hang in my initial testing, so it's been disabled for now...
2018-12-30 21:50:23 -05:00
Sean Kaim
1f93ca1cf8 white space and log message 2018-12-30 21:47:06 -05:00
Sean Kaim
2778175752 minor cleanup 2018-12-30 20:21:48 -05:00
Sean Kaim
3e0ed5b0af minor clean up 2018-12-30 20:18:38 -05:00
Sean Kaim
325bd510ff minor clean up 2018-12-30 20:14:55 -05:00
Sean Kaim
2b5a327e53 auto properties 2018-12-30 20:10:41 -05:00
Sean Kaim
c322946c32 minor cleanup 2018-12-30 20:06:42 -05:00
Sean Kaim
aefee9c92b code cleanup 2018-12-30 20:04:57 -05:00
Sean Kaim
172f7f7085 minor code cleanup 2018-12-30 20:01:43 -05:00
Sean Kaim
bb9d2a0a69 move to correct namespace 2018-12-30 19:58:58 -05:00
Sean Kaim
2d9cc286f0 syntax clean up and null checks
mostly from ReSharper
2018-12-30 19:53:05 -05:00
David Sparer
6629faa4d5 ngcheckbox now scales correctly with dpi 2018-12-30 15:32:32 -06:00
nmat
d3d397cf70 Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-29 19:37:17 +01:00
Camilo Alvarez
8c91b37dc8 First removal
Magic library is removed, basic tabbing functions are on, but all other functions are commented.

Some code is lifted from DockPanelSuite in MremoteNGAutoHideStrip to change the behavior and looks for Mremote .
2018-12-29 01:40:18 -05:00
Sean Kaim
fc4b33f7f0 changelog update 2018-12-28 17:08:25 -05:00
Sean Kaim
918da6e0ee minor code clean up 2018-12-28 16:51:36 -05:00
Sean Kaim
963f487648 update to latest dockpanelsuite
Fixes #269
2018-12-28 13:48:45 -05:00
Faryan Rezagholi
ba1c49e23a rearranged items and added/replaced icons 2018-12-28 18:11:26 +01:00
Sean Kaim
95a27fe2c9 Fix CA1063 2018-12-28 12:05:47 -05:00
Sean Kaim
2951f96daf Fix CA1063 2018-12-28 11:58:44 -05:00
Sean Kaim
9bf2e07006 Fix CA1063 2018-12-28 11:37:34 -05:00
Sean Kaim
332274f2a8 forgot the IDisposable 2018-12-28 11:33:28 -05:00
Sean Kaim
35c052e605 fix CA1001 and code cleanup 2018-12-28 11:20:03 -05:00
Sean Kaim
91de1dbd27 fix CA2229 build warning 2018-12-28 11:09:14 -05:00
Sean Kaim
3bc392fdc4 minor code cleanup 2018-12-28 11:02:54 -05:00
Sean Kaim
79c14ad801 Update changelog 2018-12-28 10:46:57 -05:00
Sean Kaim
0f7503875c Merge pull request #1241 from farosch/issue_fixes
Two issues fixed
2018-12-28 10:41:03 -05:00
Sean Kaim
75e1eac785 Minor code clean up. Ensure a single port scan when selecting first port only. 2018-12-28 10:15:55 -05:00
Sean Kaim
f77b0a51f4 best attempt to cancel pings/scan
And some minor code clean up...
2018-12-28 09:45:03 -05:00
Sean Kaim
8cef1dd51a move localization to ctor and fix minor themeing issue 2018-12-27 17:20:34 -05:00
Faryan Rezagholi
8bdc1590dd Only Scan default ports, when no specific ports are given. Fixes #765 2018-12-27 23:06:41 +01:00
nmat
ea0cf96a4a Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-27 22:25:25 +01:00
nmat
1bd96f6a88 not sure if this fixes it
test
2018-12-27 22:25:10 +01:00
Faryan Rezagholi
5f4bd19dcc Merge branch 'develop' into issue_fixes 2018-12-27 21:21:16 +01:00
Faryan Rezagholi
843f59b492 Give Focus to FrmMain when clicking on it, fixes #1044 2018-12-27 21:13:44 +01:00
Sean Kaim
f9ccf9e6aa fix monor themeing issue and remove unused component 2018-12-27 15:05:20 -05:00
Sean Kaim
3275c03a21 Merge pull request #1232 from farosch/redesign
App redesign proposal
2018-12-27 14:37:53 -05:00
Sean Kaim
a1a9229852 Credits text not filling form height 2018-12-27 14:34:25 -05:00
Sean Kaim
fc09245cdb Merge branch 'develop' into pr/1232 2018-12-27 14:28:18 -05:00
Sean Kaim
6ac6646ac2 fix line terminators for credits/changelog on about window 2018-12-27 11:39:35 -05:00
Faryan Rezagholi
db8ebcc3d5 removed redundand methods to return page icon in all option pages 2018-12-27 17:11:46 +01:00
Faryan Rezagholi
e0aa053e95 moved mRemoteNG png into subfolder images 2018-12-27 17:11:17 +01:00
Faryan Rezagholi
c8a24374fb merged develop into redisign 2018-12-27 17:10:44 +01:00
Sean Kaim
cde9ac63aa move localization into the ctor 2018-12-27 10:11:11 -05:00
nmat
b2d3aa8c11 Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-27 15:07:37 +01:00
David Sparer
ed786dfb11 Merge pull request #1200 from sk82jack/develop
Fix and refactor CreateBulkConnections_ConfCons2_6.ps1
2018-12-27 07:35:07 -06:00
nmat
cc93f008a4 Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-26 23:16:34 +01:00
David Sparer
2284432057 Merge pull request #1222 from farosch/gui_fixes
gui fixes
2018-12-26 16:00:21 -06:00
David Sparer
c623748d27 moved Config window localization into the ctor 2018-12-26 15:54:54 -06:00
Faryan Rezagholi
954f905c8c Merge branch 'redesign' of https://github.com/farosch/mRemoteNG into redesign 2018-12-26 22:54:14 +01:00
Faryan Rezagholi
f23d1faa33 removed pixelated version of app icon 2018-12-26 22:53:53 +01:00
Faryan Rezagholi
1f8bfdac5f make all option pages load their icon in their public constructor 2018-12-26 22:34:27 +01:00
Sean Kaim
b580da9e9f update appveyor config 2018-12-26 16:25:54 -05:00
David Sparer
46a188093a fixed #1238 2018-12-26 13:19:03 -06:00
Faryan Rezagholi
1c7f6438ff Windows Form Designer regenerated code after merge 2018-12-26 19:34:09 +01:00
Faryan Rezagholi
f9da7afd75 merged rebase of upstream/develop onto gui_fixes 2018-12-26 19:31:13 +01:00
Faryan Rezagholi
9d49dd2f40 fixed column being set to an absolute value 2018-12-26 19:25:43 +01:00
Faryan Rezagholi
fb8e19285b redesign of the port scan form, addresses #990 2018-12-26 19:25:43 +01:00
Faryan Rezagholi
505abb3029 fixed gap between elements on the credential settings page and the page border to be consisten with other pages 2018-12-26 19:25:43 +01:00
Faryan Rezagholi
2014598eaf Fixed padding and margin for menustrips 2018-12-26 19:25:42 +01:00
Faryan Rezagholi
1b39c345af Merge remote-tracking branch 'upstream/develop' into develop
mering upstream into develop
2018-12-26 19:21:16 +01:00
David Sparer
bdb1812705 return a default options page icon if no icon exists for page 2018-12-26 10:33:49 -06:00
David Sparer
0b8bcafb72 added unit tests for the DisplayProperties utility class. made class more testable 2018-12-26 10:31:02 -06:00
Sean Kaim
c0c699eab6 remove installer from being built in debug config
intorduced in c7d42305a3
2018-12-26 10:55:33 -05:00
Faryan Rezagholi
5a99c2dcef moved screenshots to extras menu #1234 2018-12-25 20:05:39 +01:00
Faryan Rezagholi
cbce5729fd fixed input box form never returning dialog result "ok".panels/tabs could not be renamed and new themes could not be created 2018-12-25 19:31:28 +01:00
Faryan Rezagholi
7290245729 removed mRemoteNG theme, was accidentely commited 2018-12-25 17:56:11 +01:00
Faryan Rezagholi
5c1bb564f2 Group boxes in notification settings form were default winforms instead of NGGroupBoxes (themes didn't apply) 2018-12-25 17:49:54 +01:00
Faryan Rezagholi
94ee854196 renamed classes under UI\Forms to begin with a capital letter 2018-12-25 16:22:56 +01:00
Faryan Rezagholi
91602c0be5 dispaly wait cursor when options are loading 2018-12-25 16:04:34 +01:00
Faryan Rezagholi
a31f287b2b renamed AppIcon to mRemoteNG_Icon for consistency 2018-12-25 15:57:25 +01:00
Faryan Rezagholi
f3a0d82304 updated classes to properly return their page icon 2018-12-25 15:53:22 +01:00
Faryan Rezagholi
f2669bb875 altered theme page layout, so the scrollbar doesn't get cut off when page is loaded into options window 2018-12-25 15:52:43 +01:00
Faryan Rezagholi
4801559edc cleaned up loactions of all used icons to be under \resources\icons with consitens naming (_Icons) at the end 2018-12-25 15:51:29 +01:00
nmat
9496b71bb7 Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-25 10:27:35 +01:00
Sean Kaim
ba1e8cc448 update changelog 2018-12-24 15:08:33 -05:00
Sean Kaim
d307adbbef Merge pull request #1228 from farosch/external_links
External links
2018-12-24 15:02:14 -05:00
Faryan Rezagholi
933bc0a9e3 Added ico version of pixelated icon for main form, help button and notify icon 2018-12-24 01:17:59 +01:00
Faryan Rezagholi
ee7319c702 introduced pixelated version of logo to be easier readable in 16x16 2018-12-24 01:07:01 +01:00
Faryan Rezagholi
aa63d11816 added "text file fragment" block to wix configuration so that the tile manifest gets included in the installer 2018-12-24 01:06:35 +01:00
Faryan Rezagholi
b1b402b011 added needed minimum arguments for tile manifest to work 2018-12-24 01:05:04 +01:00
Faryan Rezagholi
5931e8f813 replaced icon for connection tree 2018-12-24 01:04:27 +01:00
Faryan Rezagholi
52a5a54bb3 corrected positioning of letters in icon 2018-12-24 01:03:42 +01:00
Faryan Rezagholi
7ca987fb1c corrected positioning of letters in icon 2018-12-24 01:03:21 +01:00
Faryan Rezagholi
66dbf21df0 fixed missing icon in windows control panel 2018-12-23 23:35:21 +01:00
Faryan Rezagholi
cc0d42f34f fixed "Launch mRemoteNG now" string, was falsely change in an earlier commit 2018-12-23 23:23:16 +01:00
Faryan Rezagholi
38a79d8d3e excluded tile manifest from postbuild "tidy"-script 2018-12-23 23:17:29 +01:00
Faryan Rezagholi
9420420622 added post-build script to copy tiles and manifest 2018-12-23 23:17:02 +01:00
Faryan Rezagholi
ce1139f114 added tiles and tile manifest to resources 2018-12-23 23:16:32 +01:00
Faryan Rezagholi
d8ce0416fa added images and manifest for windows tiles 2018-12-23 23:15:23 +01:00
Faryan Rezagholi
a0e696eca4 updated splash screen 2018-12-23 22:00:25 +01:00
Faryan Rezagholi
6b20ffeeba Merge branch 'develop' into redesign 2018-12-23 21:39:32 +01:00
Faryan Rezagholi
ac1c0c90e7 Merge remote-tracking branch 'upstream/develop' into develop
update fork from original repository
2018-12-23 21:35:58 +01:00
Faryan Rezagholi
3663384ccf removed default colors from the manager class (was added in a commit earlier) 2018-12-23 21:29:52 +01:00
Faryan Rezagholi
ecf8d437c7 removed edition label in favor of adding the edition string to the title label 2018-12-23 21:22:31 +01:00
Faryan Rezagholi
3c07fc0387 removed illegal cast 2018-12-23 21:19:10 +01:00
Faryan Rezagholi
8bd2b9d7a7 replaced logo in about screen 2018-12-23 21:17:22 +01:00
Faryan Rezagholi
b2b78c67f4 new app icon as png for help menu 2018-12-23 21:17:08 +01:00
Faryan Rezagholi
94147c23b1 Replaced old mRemoteNG icon with new one 2018-12-23 20:40:04 +01:00
Faryan Rezagholi
ba588c9edf Removed unnecessary translation files for installer 2018-12-23 20:39:41 +01:00
Faryan Rezagholi
8810f453df Removed unnecessary party from licence file, see #1153 2018-12-23 19:42:40 +01:00
Faryan Rezagholi
c7d42305a3 Tidied up Resources folder, added new Photoshop templates for images and replaced installer images 2018-12-23 19:38:11 +01:00
Sean Milligan
40025db415 Tracks the active tab in the treeview 2018-12-23 09:19:05 -08:00
Faryan Rezagholi
c0b8a8b8eb redesign of the port scan form, addresses #990 2018-12-23 15:58:48 +01:00
Sean Kaim
92416b4661 test build for running with FIPS enabled
Reference #222
2018-12-22 19:19:11 -05:00
Faryan Rezagholi
aaa93b1bcc external links to open in browser instead of mremote itself 2018-12-23 00:56:09 +01:00
sk82jack
b328331d7c Add prompt for decryption password only if necessary 2018-12-22 22:24:39 +00:00
sk82jack
f51079e065 Add credential parameters 2018-12-22 22:24:39 +00:00
sk82jack
534c622980 Add folder selection for portable installation 2018-12-22 22:24:39 +00:00
sk82jack
6cc1cb5afa Fix registry key locations 2018-12-22 22:24:39 +00:00
sk82jack
2372d5ca92 Fix and refactor code 2018-12-22 22:24:39 +00:00
David Sparer
331af8cd24 Merge pull request #1218 from farosch/splashscreen
Splashscreen
2018-12-22 16:16:39 -06:00
Faryan Rezagholi
d58b8fffdc Merge pull request #2 from mRemoteNG/develop
update
2018-12-22 23:10:45 +01:00
David Sparer
e5d05b88bc Merge pull request #1227 from farosch/searchbar2top
Position of search bar configurable via settings
2018-12-22 16:07:47 -06:00
Faryan Rezagholi
61f823b6be Made position of the search bar configurable vias settings 2018-12-22 17:20:32 +01:00
David Sparer
06f23d5754 Merge pull request #1220 from farosch/appleicon
Added Apple Icon
2018-12-22 09:29:09 -06:00
Faryan Rezagholi
e567f1386a Merge pull request #1 from mRemoteNG/develop
update
2018-12-22 15:38:21 +01:00
nmat
15a734ace6 Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-22 10:45:48 +01:00
nmat
6f0309b6a7 Some fixes after comment from dev 2018-12-22 10:00:13 +01:00
Faryan Rezagholi
08191278d7 Chnaged splash screen form to display correctly on a high DPI device 2018-12-21 18:19:13 +01:00
Faryan Rezagholi
6a4b31ffe6 fixed gap between elements on the credential settings page and the page border to be consisten with other pages 2018-12-21 16:21:25 +01:00
Faryan Rezagholi
a150757a97 fixed checkbox in connection settings being 1px off 2018-12-21 16:09:48 +01:00
Faryan Rezagholi
8eded14f85 Fixed padding and margin for menustrips 2018-12-21 16:08:09 +01:00
David Sparer
b311f85ca0 Merge pull request #1217 from farosch/searchbar2top
Moved searchbar in connection tree to top
2018-12-21 07:37:10 -06:00
Faryan Rezagholi
9423c8135f Added Apple Icon 2018-12-21 14:21:40 +01:00
Faryan Rezagholi
5221907ef8 added my name to my github link :P 2018-12-21 00:43:32 +01:00
Faryan Rezagholi
4cc1847ea6 added mRemoteNG Logo to splash screen 2018-12-21 00:41:02 +01:00
Faryan Rezagholi
2a0032a199 Splash screen shown on startup and hiding after completion of the load method of the main form 2018-12-21 00:10:59 +01:00
Faryan Rezagholi
9b722eacdb Added form for spash screen 2018-12-20 23:42:11 +01:00
Faryan Rezagholi
c6f15411e3 Moved searchbar in connection tree to top 2018-12-20 15:48:22 +01:00
nmat
90a16b7149 Add more options and some cleaning 2018-12-18 22:23:29 +01:00
David Sparer
2df9741cd6 loadbalanceinfo property now imported from rdp files
fixes #1132
2018-12-17 11:47:15 -06:00
David Sparer
497b8bfce5 updated readme badges 2018-12-17 09:38:10 -06:00
nmat
0fdbb8d8a1 Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-15 18:28:24 +01:00
David Sparer
7a8a2fbf77 Merge pull request #1191 from mRemoteNG/929_server_name_in_notification
Host names are now displayed in some notifications
2018-12-15 10:12:33 -06:00
nmat
1e48cb831a Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-15 02:22:12 +01:00
Sean Kaim
9e96732b73 Update SSH.NET package
* Code clean up
* Notify users of exceptions/failed uploads
2018-12-14 17:09:30 -05:00
David Sparer
e863906eaa added test validating that an empty password cannot be passed to an encryptor 2018-12-14 07:31:50 -06:00
nmat
13ec6e2dca More cleanup and add tabs and panels 2018-12-09 19:51:57 +01:00
nmat
968e7222fd Merge remote-tracking branch 'upstream/develop' into help-updates 2018-12-05 23:34:23 +01:00
David Sparer
a84159ee70 Merge pull request #1159 from mRemoteNG/1123_handle_unhandled_exceptions
Added unhandled exception window
2018-12-05 16:31:36 -06:00
David Sparer
703f9deb9a added a version property to the ISerializer interface. switch to using confcons v2.7 serializer in production and tests. this resolved an issue with serializing the RedirectClipboard property 2018-12-05 16:07:59 -06:00
nmat
07147f13a8 Added keyboardshortcuts and removed configuration file. 2018-12-04 23:52:47 +01:00
nmat
a57d9d41c3 Help updates
Some help updates
2018-12-04 21:39:57 +01:00
Leaskovski
a40f66fc94 Added a new option to the Appearance and Tabs configuration page to allow the user to toggle if connection windows display tabs or not as per #1171. 2018-12-03 15:46:14 +00:00
nmat
097c97ca32 Merge remote-tracking branch 'upstream/develop' into help-updates 2018-11-16 00:35:57 +01:00
David Sparer
3e1d418269 Merge branch 'develop' into 929_server_name_in_notification 2018-11-15 15:44:24 -06:00
David Sparer
5ee7b3fcbf fixed failing test 2018-11-15 15:44:04 -06:00
David Sparer
15adf97174 refactored some protocol base events to standardize how disconnect/error events are raised 2018-11-15 15:31:38 -06:00
David Sparer
4bd5befaaa refactored force flag checks to be simpler to read 2018-11-15 14:18:45 -06:00
nmat
5fe6272915 Replaced mRemote with mRemoteNG in help 2018-11-15 00:46:30 +01:00
nmat
7a01a1f33f Add updated screenshot 2018-11-15 00:32:40 +01:00
David Sparer
92759aa9dc refactored connection initiator a bit to reduce unnecessary code
the conForm arg was always null, we didnt need it
2018-11-14 07:06:25 -06:00
David Sparer
65e21190b9 extracted rdp error codes to new class 2018-11-12 18:54:54 -06:00
David Sparer
f6877631d9 updated changelog 2018-11-12 17:23:58 -06:00
David Sparer
1e4fa8432b task dialog now properly localizes its buttons 2018-11-12 17:11:25 -06:00
David Sparer
ed5423368e use the task dialog for confirming node deletions, Esc key now closes dialog
related to #1064
2018-11-12 17:07:07 -06:00
David Sparer
673acad72c NBLabel now respects the TextAlignment property when in theming mode 2018-11-12 17:05:10 -06:00
David Sparer
efc04cc82d refactored task dialog to use am NGLabel instead of custom string drawing for the main instruction 2018-11-12 16:56:49 -06:00
David Sparer
b880f7c946 NGLabel now attempts to wrap text like default labels when theme mode is active 2018-11-12 16:51:45 -06:00
David Sparer
7304de0102 Esc key now cancels options window changes
related to #1064
2018-11-11 18:18:46 -06:00
David Sparer
a64601afcc fixed some visual issues with the notificaiton panel date label 2018-11-11 11:22:06 -06:00
David Sparer
79ce3c0d74 fixed issue with notification panel internal layout 2018-11-11 10:27:59 -06:00
David Sparer
83c31ad2b4 created sql version upgrader for confcons v2.7 2018-11-08 17:16:33 -06:00
David Sparer
3bcb769965 Merge branch 'release/v1.76' into develop
# Conflicts:
#	CHANGELOG.TXT
#	mRemoteV1/Properties/AssemblyInfo.cs
#	mRemoteV1/mRemoteV1.csproj
2018-11-08 16:38:51 -06:00
David Sparer
75e0b8f4c2 set release date in changelog 2018-11-08 15:09:08 -06:00
David Sparer
78ef0fdaf4 Merge pull request #1107 from mRemoteNG/321_hidpi
Implement HiDPI support
2018-11-08 07:36:44 -06:00
David Sparer
8d29ff2d61 fixes #1168 2018-11-04 19:13:10 -06:00
David Sparer
eea79da1ae updated changelog 2018-11-04 18:06:14 -06:00
David Sparer
cb5447f86e fixes #1181 2018-11-04 18:03:39 -06:00
David Sparer
8cb31ad524 slight cleanup of Runtime class 2018-11-04 18:03:29 -06:00
David Sparer
6ca52a0db1 updated changelog 2018-11-04 16:39:25 -06:00
David Sparer
25e30672c8 bumped version to v1.76.12 2018-11-04 16:38:14 -06:00
David Sparer
abcab2aadf sql now encrypts and decrypts passwords 2018-11-03 18:28:53 -05:00
David Sparer
19bb8f7595 refactored db classes to expose tblRoot data 2018-11-03 11:02:26 -05:00
David Sparer
0427956e8b we can now prevent saving to the database when a save was triggered for a local-only property change
this will prevent unnecessary db saves
2018-11-03 10:34:30 -05:00
David Sparer
78bf40282a the IsExapnded property is no longer saved to the DB 2018-11-02 11:30:39 -05:00
David Sparer
6c6a82f8e6 minor cleanup 2018-11-02 11:03:25 -05:00
David Sparer
4b9cc7be08 Merge branch 'release/v1.76' into 1134_dont_save_connection_status_to_db
# Conflicts:
#	mRemoteV1/Connection/ConnectionsService.cs
2018-11-02 10:56:49 -05:00
David Sparer
dc2d6b8160 added a few debug messages to track db connection loading events 2018-11-02 10:45:18 -05:00
David Sparer
083456e33a fixed several event handle leaks #1173 2018-11-02 10:29:09 -05:00
David Sparer
80e43e8634 added a safety check to the previous session opener to only open sessions that aren't already open 2018-11-02 09:30:18 -05:00
David Sparer
e99b8ed453 hooked up the local settings serializer 2018-11-01 19:14:25 -05:00
David Sparer
4aba36b756 added classes to handle local connection properties when dealing with the DB 2018-11-01 16:37:30 -05:00
David Sparer
2ebf654973 added a ForEach extension for enumerables 2018-11-01 16:36:56 -05:00
David Sparer
f560fb86d8 moved database serializers to more logical place 2018-11-01 15:00:51 -05:00
David Sparer
981689aa26 resolved #1170 2018-11-01 08:50:27 -05:00
David Sparer
b3fd266c31 Merge branch 'develop' into 1123_handle_unhandled_exceptions
# Conflicts:
#	mRemoteV1/Resources/Language/Language.resx
2018-10-31 09:10:14 -05:00
David Sparer
062b7a5986 removed test exception 2018-10-30 08:32:52 -05:00
David Sparer
088b1ee1c2 updated changelog and credits for v1.77 2018-10-29 17:12:25 -05:00
David Sparer
1d572bb4b6 Merge pull request #1160 from MitchellBot/develop
Feature Request: Right click option to copy hostname #1141
2018-10-29 17:01:11 -05:00
MitchellBot
cf8e033831 QuickConnect uses exact case of input
https://github.com/mRemoteNG/mRemoteNG/issues/1121
2018-10-28 20:59:40 -07:00
MitchellBot
43977a74cc Feature Request: Right click option to copy hostname #1141
Feature Request: Right click option to copy hostname #1141
2018-10-28 20:06:03 -07:00
David Sparer
d67e96539b added an unhandled exception window that will be displayed when unhandeled exceptions occur 2018-10-28 14:46:30 -05:00
David Sparer
09d1aff6a8 rdp connections now properly scale for hidpi 2018-10-27 16:09:12 -05:00
David Sparer
41c5a49abc began investigating how to set rdp desktop scaling for hidpi 2018-10-20 18:29:34 -05:00
David Sparer
eacff9025e Merge branch 'develop' into 321_hidpi
# Conflicts:
#	mRemoteV1/Connection/Protocol/PuttyBase.cs
2018-10-20 09:56:26 -05:00
David Sparer
f56b8f8e42 Merge branch 'master' into develop
# Conflicts:
#	CHANGELOG.TXT
#	CREDITS.TXT
#	mRemoteV1/Properties/AssemblyInfo.cs
2018-10-20 09:48:50 -05:00
David Sparer
8ab221e5a8 Merge branch 'release/v1.76' 2018-10-18 17:29:11 -05:00
David Sparer
21e51c8455 updated changelog and credits 2018-10-18 17:08:30 -05:00
David Sparer
3234896caf bumped version 2018-10-18 17:08:22 -05:00
David Sparer
b00dd1c5f5 fixes #1136 2018-10-17 17:48:16 -05:00
David Sparer
992a3f9d1c cherrypicked pr #1145
Fixing "Reconnect to previously opened sessions on startup"
2018-10-17 16:52:22 -05:00
David Sparer
6b280b5aa4 Merge pull request #1145 from st-schuler/reconnect-patch
Fixing "Reconnect to previously opened sessions on startup"
2018-10-17 16:46:39 -05:00
st-schuler
e6713520c7 Fixing "Reconnect to previously opened sessions on startup" 2018-10-17 20:01:51 +02:00
David Sparer
4f75b0343e Merge pull request #1120 from Fyers/develop
Improved German translations
2018-10-10 08:22:34 -05:00
David Sparer
097ebccdcd Merge pull request #1129 from pablomh/patch-1
Update Language.es.resx
2018-10-10 06:48:49 -05:00
pablomh
954e1de4da Update Language.es.resx
Misc fixes.
2018-10-10 09:22:31 +02:00
Fyers
63dc79699d Merge pull request #2 from Fyers/merge
Merge
2018-10-08 23:31:54 +02:00
Fyers
63f342bbdb resolved conflicts 2018-10-08 23:31:01 +02:00
Fyers
7c9b90ed7d Merge remote-tracking branch 'upstream/develop' into merge 2018-10-08 23:21:31 +02:00
David Sparer
00e45b60ad Merge branch 'master' into develop
# Conflicts:
#	CHANGELOG.TXT
#	mRemoteV1/Properties/AssemblyInfo.cs
#	mRemoteV1/Resources/Language/Language.resx
2018-10-08 15:23:25 -05:00
David Sparer
d1a7a37909 Merge branch 'release/v1.76' 2018-10-07 18:42:03 -05:00
David Sparer
1c12b52ada extension to the fix for #1124 2018-10-07 18:32:17 -05:00
David Sparer
722fe40899 updated changelog and bumped version 2018-10-07 16:33:29 -05:00
David Sparer
b2e7ebf43d fixed #1124 2018-10-07 16:28:09 -05:00
David Sparer
3ed8e768aa bumped patch version 2018-10-07 09:04:48 -05:00
David Sparer
d362691389 updated build scripts to include debug symbols and normalized github
asset names

cherrypicked from the develop branch
2018-10-07 07:53:31 -05:00
David Sparer
4b7c54d5b5 updated changelog 2018-10-07 07:28:57 -05:00
David Sparer
fbd0407863 added redirect clipboard to xml schema for v2.7 confcons 2018-10-03 21:05:12 -05:00
David Sparer
7bab1b4297 created a confcons v2.7 serializer 2018-10-03 21:00:23 -05:00
David Sparer
cfce9e9887 Merge pull request #951 from CrAbelleira/develop
Clipboard sharing setting implementation for RDP protocol
2018-10-03 20:51:19 -05:00
Fyers
9df2a96027 improved german translations 2018-10-01 19:26:26 +02:00
Cristian Abelleira Olañeta
d967c719f5 Added "RedirectClipboard" to ConnectionSerializers/Xml and MiscSerializers 2018-10-01 00:52:31 +02:00
David Sparer
ec80a5aa70 fixed #1117 2018-09-30 13:19:35 -05:00
David Sparer
0c95f178ca updated changelog 2018-09-30 11:04:03 -05:00
David Sparer
e0405b15df fixes #1110 2018-09-30 11:02:01 -05:00
David Sparer
e029f30acf added a few try/catch blocks around some rdp code. related to #853 2018-09-30 10:44:22 -05:00
David Sparer
44ed836b7c fixed #1115 2018-09-29 12:14:44 -05:00
David Sparer
00401201d1 fixed Spanish translation issue. fixes #1112 2018-09-27 08:23:17 -05:00
Cristian Abelleira Olañeta
726491feee Completed BuildExpectedConnectionInfoPropertyList 2018-09-24 18:19:33 +02:00
Cristian Abelleira
36a94e1399 Merge branch 'develop' into develop 2018-09-24 11:39:32 +02:00
David Sparer
855c83a325 Merge branch 'develop' into 321_hidpi
# Conflicts:
#	mRemoteV1/UI/Controls/MultiSshToolStrip.cs
#	mRemoteV1/UI/Window/AboutWindow.cs
#	mRemoteV1/UI/Window/ComponentsCheckWindow.cs
2018-09-22 17:51:00 -05:00
David Sparer
d9e65719d3 Merge branch 'release/v1.76' into develop
# Conflicts:
#	CHANGELOG.TXT
2018-09-22 17:40:42 -05:00
David Sparer
c774070feb fixed putty placement within connection window 2018-09-22 17:22:01 -05:00
David Sparer
5aeff8c9c0 fixed some more ctaskdialog scaling issues 2018-09-22 16:37:02 -05:00
David Sparer
4d5f5cf04b fixed textbox width scaling of quick connect and multissh toolbar controls 2018-09-22 16:01:53 -05:00
David Sparer
1d6b87ffa7 fixed about window scaling 2018-09-22 15:36:22 -05:00
David Sparer
3b82435740 fixed ad import window scaling 2018-09-22 15:35:19 -05:00
David Sparer
17499abfd0 fixed uvnc window scaling 2018-09-22 15:35:03 -05:00
David Sparer
9a57deb9ab fixed scaling of export form 2018-09-22 15:31:09 -05:00
David Sparer
089c58310c fixed scaling of screenshot window 2018-09-22 15:30:59 -05:00
David Sparer
647de5d473 fixed scaling of message window 2018-09-22 15:26:01 -05:00
David Sparer
b223b121d1 minor visual fix 2018-09-22 14:38:22 -05:00
David Sparer
49fbb37542 fixed scaling of the external tools window 2018-09-22 14:36:01 -05:00
David Sparer
1496192756 fixed port scan window scaling 2018-09-22 13:22:31 -05:00
David Sparer
f34cd50b9c fixed ssh transfer window scaling 2018-09-22 13:22:20 -05:00
David Sparer
20f46bea61 fixes #1106 2018-09-20 15:10:43 -05:00
David Sparer
f4ff8d37d5 component check window layout fixed for hidpi 2018-09-15 15:30:41 -05:00
David Sparer
15108645d4 updated the update screen to layout correctly on higher dpi screens 2018-09-15 15:23:51 -05:00
David Sparer
b5e8f32f1f removed dead code 2018-09-15 13:29:02 -05:00
David Sparer
4027c41c73 made password form respect dpi scaling 2018-09-15 13:20:33 -05:00
David Sparer
7037139ab3 removed the now-unused input class 2018-09-08 14:27:58 -05:00
David Sparer
b976fe4bad rewrote the input box class to be more display-responsive 2018-09-08 14:26:03 -05:00
David Sparer
d674a201ee options page icons now scale correctly 2018-09-08 10:48:45 -05:00
David Sparer
d4a3e292ed correct the appearance page icon 2018-09-08 09:24:06 -05:00
David Sparer
50084e47f7 themes page now displays correctly on hidpi 2018-09-08 09:21:40 -05:00
David Sparer
6e0a16a4d1 task dialog now works in scaled displays 2018-09-07 18:16:44 -05:00
David Sparer
5e87d8de18 scale the putty image on the advanced page 2018-09-03 10:02:57 -05:00
David Sparer
9a6c2fa7c8 added a bitmap scaling function 2018-09-03 10:01:06 -05:00
David Sparer
f440f91233 made appearance options page scale correctly 2018-09-03 09:10:34 -05:00
David Sparer
ccf364f2dd added func for calculating scaled width 2018-09-03 09:06:27 -05:00
David Sparer
3c5baae568 added class to calculate desktop scaling factor. connection tree icons are now scaled appropriately 2018-09-03 07:51:40 -05:00
David Sparer
7710ff32a6 scale search image size 2018-09-02 18:09:26 -05:00
David Sparer
e081d2b73a set window scaling to DPI 2018-09-02 18:07:14 -05:00
David Sparer
0c77fa43ff initial redesign of connection tree window using table layout panel 2018-09-02 17:56:10 -05:00
David Sparer
6ee4353bbd better to just remove the max size setting on the custom controls than override it in frmmain 2018-09-02 17:29:34 -05:00
David Sparer
bddab24d48 explicitly set the max size of toolbar items to infinite
i guess the default max size is height:25. When we don't explicitly set this to 0 it doesn't scale correctly
2018-09-02 17:15:16 -05:00
David Sparer
45f9a32e59 remove max size constraint from quick connect and ext tools toolbars 2018-09-02 17:10:40 -05:00
David Sparer
39b297fd00 set EnableWindowsFormsHighDpiAutoResizing config 2018-08-31 18:54:36 -05:00
David Sparer
fd2167d679 set dpi scale on frmmain 2018-08-31 18:37:21 -05:00
David Sparer
d07249e1b2 custom scaling of quick connect toolbar 2018-08-31 17:45:08 -05:00
David Sparer
31dc59c9d5 suspend layout of all menu controls when creating form 2018-08-31 17:28:37 -05:00
David Sparer
f3e82dac19 dont set max size on tool strip menu controls 2018-08-31 17:21:51 -05:00
David Sparer
41db80dba8 try different renderer 2018-08-31 17:13:44 -05:00
David Sparer
8efe922b50 set manifest entry to enable dpi scaling 2018-08-31 16:26:41 -05:00
Sean Kaim
a5d22d287c Fixed #1091 2018-08-28 14:59:07 -04:00
Sean Kaim
793095900b fix #1092
parse enums properly
2018-08-28 09:35:08 -04:00
David Sparer
ee63292e55 Merge branch 'update-asset-labels' into develop 2018-08-26 12:49:18 -05:00
David Sparer
9fbcde3ca0 simplify labels 2018-08-26 12:46:17 -05:00
David Sparer
9e48c8e359 changed labels to be more enduser appropriate 2018-08-26 12:21:59 -05:00
David Sparer
da07f50e49 Merge branch 'label-github-assets' into develop 2018-08-25 18:27:39 -05:00
David Sparer
cc872cd2b4 fixed powershell script 2018-08-25 17:03:28 -05:00
David Sparer
a3fa1e541c modified build to label assets 2018-08-25 17:02:54 -05:00
David Sparer
b579e823bd updated credits 2018-08-25 11:42:11 -05:00
David Sparer
fc5b1ec85e adjusted a few english strings that were added in #928 2018-08-25 11:39:25 -05:00
David Sparer
e0c2037831 set assembly version to 1.77.0 2018-08-25 11:38:40 -05:00
David Sparer
9f44d6b75b added changelog items for v1.77 updates 2018-08-25 10:56:30 -05:00
David Sparer
b6f2fff42b Merge branch 'release/v1.76' into develop 2018-08-25 10:46:10 -05:00
David Sparer
f10e54e47b bumped assembly version to 1.76.8 2018-08-25 10:31:35 -05:00
David Sparer
704e0c1dc1 updated changelog 2018-08-25 10:29:43 -05:00
David Sparer
067ac8fb56 Merge branch 'areytsman-Advanced_closing_tabs' into develop 2018-08-25 09:51:09 -05:00
David Sparer
4428089146 Merge branch 'Advanced_closing_tabs' of https://github.com/areytsman/mRemoteNG into areytsman-Advanced_closing_tabs
# Conflicts:
#	mRemoteV1/Resources/Language/Language.resx
#	mRemoteV1/Resources/Language/Language.ru.resx
2018-08-25 09:24:58 -05:00
David Sparer
44ce674166 Merge branch 'release/v1.76' into develop 2018-08-24 17:20:56 -05:00
David Sparer
0c79a9acde fixes #1088 2018-08-24 14:43:08 -05:00
David Sparer
ebfc2715e7 updated changelog 2018-08-24 13:24:23 -05:00
David Sparer
b0dbc9dc18 only delete reg key value if the value exists 2018-08-24 13:23:52 -05:00
David Sparer
507cdf75a5 fixes #1087 2018-08-24 13:23:02 -05:00
David Sparer
8f8492b0be xml deserializer now gives connections an ID if the ID string in xml is empty
fixes #1082
2018-08-24 10:37:54 -05:00
David Sparer
457e715188 set assembly version to 1.76.7 and set release date in changelog 2018-08-22 10:59:45 -05:00
David Sparer
3fad827b9f Merge branch 'release/v1.76' into develop
# Conflicts:
#	Tools/zip_portable_files.ps1
#	mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs
2018-08-22 10:39:09 -05:00
David Sparer
8bd571c78d added a wrapper around the windows registry api so we can better unit test classes that use the registry 2018-08-22 09:41:32 -05:00
David Sparer
1724521ebf added some null guards to methods 2018-08-22 07:06:44 -05:00
David Sparer
b0fb3596aa added some safety checks around accessing putty registry settings 2018-08-22 07:06:16 -05:00
David Sparer
38ff8340e4 Merge pull request #1016 from wwj402/develop
Chinese simplified language update for latest commit 05c96da
2018-08-19 12:01:31 -05:00
David Sparer
f759ea4bc2 Merge pull request #1072 from sli-pro/develop
Update the Russian language
2018-08-19 11:54:19 -05:00
David Sparer
fb228d72b1 resolved bug #1076 2018-08-19 11:44:43 -05:00
David Sparer
916361a3be update changelog 2018-08-11 20:03:27 -05:00
sli-pro
011d0cad8c Update the Russian language
- Update the Russian language (Language.ru.resx)

- Update Language.resx
2018-08-11 18:34:11 +03:00
David Sparer
408c40f699 fixed a few toolbar location loading edge cases
related to #1068
2018-08-11 10:02:07 -05:00
David Sparer
4173f6d775 swapped direct calls to Monitor with a lock statement and added a few method comments 2018-08-11 06:47:31 -05:00
Sean Kaim
e6f3c22064 code clean up / add'l checks
related to #1061
2018-08-03 10:13:31 -04:00
David Sparer
a013518eac bump assembly version 2018-08-03 08:51:44 -05:00
David Sparer
9c88cacb3d hopefully a fix for #1061 2018-08-03 08:33:51 -05:00
David Sparer
d49bf04b15 fixes #1062 2018-08-03 08:13:39 -05:00
David Sparer
1dbd5dc5bc set 1.76.5 release date in changelog 2018-08-02 18:15:33 -05:00
David Sparer
c103706a54 added test to verify #1057 2018-08-02 17:55:36 -05:00
David Sparer
b0a027df52 updated changelog 2018-08-02 17:49:50 -05:00
David Sparer
868641378a Merge pull request #1055 from mRemoteNG/647_save_symbols
647 save symbols
2018-08-02 16:34:04 -05:00
David Sparer
11baae3107 applying patch provided by Toomix in #1057 and merged in 7dbef77 2018-08-01 07:01:45 -05:00
David Sparer
7526bb430f Merge pull request #1057 from Toomix/patch-1
Fixing NullReferenceException when renaming node
2018-08-01 06:45:42 -05:00
Toomix
7dbef77687 Fixing NullReferenceExcepction in renaming Node
When I have no selected node and I press F2 key, NullReferenceException appears in method RenameSelectedNode(). I added not null condition, it is working now. Debugged in VS2017.
2018-08-01 08:50:55 +02:00
David Sparer
ed8125042e make portable symbols zip file name easier to distinguish from regular symbols 2018-07-30 17:02:08 -05:00
David Sparer
25b2655d0f log which files are uploaded to github release 2018-07-30 16:55:09 -05:00
David Sparer
145a264154 handle wildcard in github asset upload file path 2018-07-30 16:45:55 -05:00
David Sparer
3e33170ae0 handle non-auto hidden notification panel focusing too 2018-07-30 15:23:59 -05:00
David Sparer
d18bf68f0e fix release tests 2018-07-30 14:12:17 -05:00
David Sparer
368917e108 accidentally left off the variable identifier for msbuild 2018-07-30 11:16:04 -05:00
David Sparer
cdea4c3911 missed a groovy var 2018-07-30 11:02:05 -05:00
David Sparer
b4b9b55bbf updated jenkins publish script to target msbuild15 2018-07-30 10:59:21 -05:00
David Sparer
6092c63df4 fix zipping symbols 2018-07-30 08:03:40 -05:00
David Sparer
fda5132184 zip symbols 2018-07-29 22:22:13 -05:00
Sean Kaim
6a9fb25a18 fixes #868
DialogResult is not currently checked, so it's a minimal/non-impact bug currently. But it's fixed now in case it's used in the future...
2018-07-29 21:30:11 -04:00
Sean Kaim
18d7344690 fixes #762
Increased button size by about 150%
2018-07-29 21:16:19 -04:00
Sean Kaim
ba50cf20a0 update changelog 2018-07-29 21:03:54 -04:00
Sean Kaim
7bd6e126e2 Fix #893
Disabled ClickOnce/Publish wihtin the project options.
2018-07-29 21:02:33 -04:00
Sean Kaim
f7521c81d5 Fixes #1052
and some code clean up
2018-07-29 19:03:21 -04:00
David Sparer
f483a2dc2f replaced Timer implementation with Task async call
fixes #1052
2018-07-29 12:02:41 -05:00
Sean Kaim
9769d5af06 changelog update 2018-07-28 22:31:26 -04:00
Sean Kaim
0a2dc3563e fixes #1040
clicking close would have the same effect. Check return code and don't open the connection unless user input has been provided.
2018-07-28 22:30:06 -04:00
Sean Kaim
e9f0157b2b code clean up 2018-07-28 22:15:11 -04:00
Sean Kaim
e8e566fcdd localization fixes 2018-07-28 22:10:17 -04:00
Sean Kaim
72b7d22cef localization fixes 2018-07-28 22:09:27 -04:00
Sean Kaim
f79da476fd options pages code clean up 2018-07-28 21:59:24 -04:00
Sean Kaim
ef31b7844c Merge pull request #1053 from mRemoteNG/cherry
Cherry picked commits for 1.76
2018-07-28 13:54:34 -04:00
Sean Kaim
f1ed1bf115 appveyor post build tests 2018-07-28 13:11:56 -04:00
Sean Kaim
23ea028965 don't run post build zip in appveyor 2018-07-28 13:11:10 -04:00
Sean Kaim
42046a614f Solution config was building wrong projects 2018-07-28 13:05:37 -04:00
Sean Kaim
36055f56e6 the post publish job in the appveyor.yaml in ps1 form 2018-07-28 13:05:28 -04:00
Sean Kaim
b693cb30fc Trim ConfigurationName 2018-07-28 13:03:27 -04:00
Sean Kaim
20377d4ff5 zip portable directly via powershell
Trying to fix appveyor artifact build
2018-07-28 13:03:16 -04:00
Sean Kaim
570d732b0e latest 7-zip 2018-07-28 13:03:00 -04:00
Sean Kaim
d9d2b1de70 code clean up (convert to expression body) 2018-07-28 13:02:36 -04:00
Sean Kaim
0a7eaaf36f minor code clean up 2018-07-28 13:02:25 -04:00
Sean Kaim
36dd3e496d minor code clean up 2018-07-28 13:02:14 -04:00
Sean Kaim
83fd914d7b code clean up 2018-07-28 13:01:41 -04:00
Sean Kaim
281c6b13fa minor code clean up
* No need to kick off the registry provider here (it's done already in PuttySessionsManager#StartWatcher())

* if (Directory.Exists(sessionsFolderPath)) thows an exception even though it should have just fallen through... but if (!Directory.Exists(sessionsFolderPath)) doesn't throw and logs a message with a graceful return????

IDK... I had a Uri.IsWellFormedUriString test in there to avoid the exception, but it seems unnecessary...
2018-07-28 13:01:06 -04:00
David Sparer
00b7b1221c fixes #1051 2018-07-28 09:03:57 -05:00
David Sparer
56cbf0ff3f fixes #1050 2018-07-28 07:52:57 -05:00
Sean Kaim
f852a4d341 minor code clean up 2018-07-27 17:02:51 -04:00
Sean Kaim
7c8c7d482a frmChoosePanel was not properly themed 2018-07-27 16:58:25 -04:00
Sean Kaim
9e95ae2cb0 code clean up 2018-07-27 16:45:38 -04:00
Sean Kaim
0d2d935f17 set default theme when themes disabled
Fixes #1039
Also some code clean up
2018-07-27 16:04:42 -04:00
Sean Kaim
eeb320a825 more clean up (use .ToString) 2018-07-27 14:50:44 -04:00
Sean Kaim
9452d4dbe3 Theme code clean up 2018-07-27 14:45:07 -04:00
Sean Kaim
03d2387cdd appveyor build for 1.76 branch 2018-07-27 14:44:35 -04:00
Sean Kaim
61b325ccb9 code clean up 2018-07-27 14:26:01 -04:00
Sean Kaim
e57de9a4de localized strings 2018-07-27 14:24:42 -04:00
Sean Kaim
a259ab9541 fix typo 2018-07-27 14:16:14 -04:00
Sean Kaim
96946f3a1e porting fix for #971 to 1.76 branch 2018-07-27 14:15:23 -04:00
Sean Kaim
08569276eb Revert "fixing changelog item"
This reverts commit edc4be2d44.
2018-07-27 14:11:43 -04:00
David Sparer
edc4be2d44 fixing changelog item 2018-07-27 07:49:00 -05:00
David Sparer
8cd6fb7ae2 updated changelog 2018-07-26 13:40:53 -05:00
David Sparer
a5afa90790 fixes #1045 2018-07-26 13:39:12 -05:00
David Sparer
f634eb8d37 created tests for the config window to ensure property grid items correctly display for certain object types 2018-07-26 13:38:53 -05:00
David Sparer
694b61a67b added a property to expose the list of object properties being shown by the property grid
this will help a lot with testing the property grid/config window
2018-07-26 09:12:47 -05:00
David Sparer
88f0d00a15 minor style cleanup 2018-07-26 08:55:55 -05:00
David Sparer
e31088fd2e ensure that quick connect items always have a panel set, even if the con default Panel setting is empty
related to #802
2018-07-25 14:39:23 -05:00
David Sparer
1d7bb63710 ensure ConDefaultPanel has a default value
related to #802
2018-07-25 14:21:44 -05:00
Sean Kaim
64422c60bb update changelog 2018-07-25 14:08:05 -04:00
Sean Kaim
a8b082ed4b fix test failures 2018-07-25 13:46:54 -04:00
Sean Kaim
5a5ade0d60 fix build failure 2018-07-25 13:10:39 -04:00
Sean Kaim
7e24e2dcfb fixes #971
Remove the "machineNode" XML node so that settings are portable to all systems
2018-07-25 13:02:30 -04:00
Sean Kaim
930579d983 PortableSettingsProvider code clean up 2018-07-25 12:35:53 -04:00
David Sparer
af1ed5349f updated changelog 2018-07-25 08:08:35 -05:00
David Sparer
9dcf71dc31 new connection tree nodes will survive filtering until they exit edit mode
resolves #1038
2018-07-25 08:05:48 -05:00
David Sparer
8bf9af0ed8 updated changelog 2018-07-24 14:49:33 -05:00
David Sparer
aecfad5871 only access first array item if array has any items
resolves #1036
2018-07-24 14:49:01 -05:00
David Sparer
3edd155898 updated changelog 2018-07-24 12:55:27 -05:00
David Sparer
2c419c0b2e minor cleanup 2018-07-24 12:54:34 -05:00
David Sparer
2fb67e7042 fixed issue where the connection context menu wasn't using translated strings
The ctor for the context menu was being called before we loaded the desired culture, leading to the use of the English default strings. Resolves #1034
2018-07-24 12:54:20 -05:00
David Sparer
82847f07b2 Merge branch 'release/v1.76' into develop 2018-07-23 13:22:39 -05:00
David Sparer
29483b2625 attached the file backup pruner to listen to connection file save events
resolves #1020
2018-07-23 12:53:03 -05:00
David Sparer
7fc59e79f3 bumped assembly version in preparation for next alpha release 2018-07-23 12:03:53 -05:00
David Sparer
79b3e21148 updated changelog 2018-07-23 12:02:09 -05:00
David Sparer
ee91117010 renamed function to be a bit more accurate 2018-07-23 11:54:49 -05:00
David Sparer
0548037ff3 added a few method summaries 2018-07-23 11:53:50 -05:00
David Sparer
46002632bb removed duplicate code 2018-07-23 11:52:38 -05:00
David Sparer
9659ac1611 added a dialog to prompt for action when decrypting a connection file fails 2018-07-23 11:51:58 -05:00
David Sparer
bbc497e68d added some quality of life methods to Optional 2018-07-23 08:03:03 -05:00
David Sparer
d7ec7574ad updated changelog 2018-07-20 14:54:42 -05:00
David Sparer
2f476d9e61 fix a null ref exception when importing from port scan without selecting a tree node. resolves #1030 2018-07-20 14:52:12 -05:00
David Sparer
c74f37f0de confirmer should return false if deletion target is null. found during regression testing 2018-07-20 12:31:59 -05:00
David Sparer
d27a62cbfc added some extra null checks in the rdcman importer 2018-07-20 07:26:38 -05:00
David Sparer
8029e491a3 Merge branch 'auto_save_during_sort' into release/v1.76 2018-07-18 14:53:26 -05:00
David Sparer
fe56268421 added a simple system to batch saves in the connection service 2018-07-18 14:53:02 -05:00
David Sparer
2db6fabbe9 reverted 3bdcf65 2018-07-18 14:52:12 -05:00
David Sparer
035e89801a reduce FrmMain minimum size to prevent issues with other system features. resolves #1024 2018-07-17 08:07:10 -05:00
Sean Kaim
a7280da30c Solution config was building wrong projects 2018-07-07 14:10:18 -04:00
Sean Kaim
ac2920820d the post publish job in the appveyor.yaml in ps1 form 2018-07-03 17:04:11 -04:00
Sean Kaim
fcecc4b31e post build zip artifact test 2018-07-03 14:24:12 -04:00
Sean Kaim
4abef50ca0 appveyor post build tests 2018-07-03 13:38:22 -04:00
Sean Kaim
5e16445b08 testing post build appveyor script 2018-07-03 13:11:10 -04:00
Sean Kaim
be593b8185 don't run post build zip in appveyor 2018-07-03 13:10:52 -04:00
Sean Kaim
ca27cb9981 Trim ConfigurationName 2018-07-03 12:34:20 -04:00
Sean Kaim
5b64e629c9 zip portable directly via powershell
Trying to fix appveyor artifact build
2018-07-03 11:59:02 -04:00
Sean Kaim
18640826b6 latest 7-zip 2018-07-03 11:48:26 -04:00
Sean Kaim
e4d3239831 appveyor build installer 2018-07-02 17:34:08 -04:00
Sean Kaim
e834eadbe1 appveyor artifacts test 2018-07-02 17:03:23 -04:00
Sean Kaim
0ec8f66972 Revert "test appveyor artifacts"
This reverts commit 458c462f49.
2018-07-02 15:31:17 -04:00
Sean Kaim
28b49aab70 fix quotes 2018-07-02 15:29:27 -04:00
Sean Kaim
458c462f49 test appveyor artifacts 2018-07-02 15:29:05 -04:00
Sean Kaim
6f6e2a1254 code clean up (convert to expression body) 2018-07-02 15:12:01 -04:00
Sean Kaim
f46a3d69e1 minor code clean up 2018-07-02 14:57:10 -04:00
Sean Kaim
fa787ed082 minor code clean up 2018-07-02 14:34:22 -04:00
wwj402
b5b748f993 Chinese simplified language update for latest commit 05c96da 2018-07-02 11:02:48 +08:00
David Sparer
3bdcf655fd suspend tree model events during sort, since this can produce a lot of changes 2018-06-25 15:15:46 -05:00
David Sparer
284755f298 fix tab ordering on port scan page 2018-06-23 09:03:25 -05:00
David Sparer
ad5eed96e7 fixed visual bug when filtering connection tree. resolves #993 2018-06-22 15:09:53 -05:00
David Sparer
431c830ea0 resize connection tree column width when calling expand all. related to #993 2018-06-22 13:56:22 -05:00
David Sparer
da047427a5 fix test 2018-06-21 20:33:32 -05:00
David Sparer
69da1dca5f added some tests of the connection tree duplicate function. related to #1004 2018-06-21 18:04:29 -05:00
David Sparer
cc61501f63 dont attempt to delete selected node if it is not a valid deletion target. resolves #1004 2018-06-21 17:35:42 -05:00
David Sparer
4ced2d3392 accidentally put a few changelog items under the wrong version 2018-06-21 16:51:41 -05:00
David Sparer
7c72bfdf6b connection tree now removes filtering when 'use filtering' option turned off. resolves #1002 2018-06-21 15:33:43 -05:00
David Sparer
b8878e1458 updated changelog 2018-06-21 08:35:29 -05:00
David Sparer
abd40cec1b removed duplicate disable/enable shortcut calls that was causing an issue. resolves #1001 2018-06-21 08:34:26 -05:00
David Sparer
cc18da4f28 updated changelog 2018-06-20 16:43:24 -05:00
David Sparer
1a39039162 reenable all hotkeys once file menu closes. Resolves #999 2018-06-20 16:42:58 -05:00
David Sparer
cf9dd72ea5 dont allow folder/connections to be added to the putty root node in connection tree. Resolves #998 2018-06-20 16:25:08 -05:00
David Sparer
b7cdf81665 ensure putty root node returns correct tree node type. Related to #998 2018-06-20 16:20:51 -05:00
David Sparer
8497a05fd1 resolves #991
fixed bug when deleting connection tree node when in filtered view
2018-06-13 14:34:05 -05:00
David Sparer
7db4eec45c fixed bug where the export screen was using new credential manager code that shouldn't be active yet 2018-06-03 10:45:29 -05:00
David Sparer
cd822b545a random stuff the ui designer regenerated 2018-06-03 10:45:06 -05:00
David Sparer
e872581d3c updated changelog 2018-06-03 09:50:42 -05:00
David Sparer
defe9e094c made opening an empty panel on startup configurable in options 2018-05-31 06:26:43 -05:00
David Sparer
5662735cb8 bumped assembly version for next pre-release 2018-05-25 18:01:32 -05:00
David Sparer
05c96da98f Merge branch 'release/v1.76' into develop 2018-05-20 11:08:14 -05:00
David Sparer
8646dce21b update jenkins build to use newest msbuild (enables c# 7 lang features) 2018-05-20 11:07:43 -05:00
David Sparer
ea53fc190b Merge branch 'release/v1.76' into develop 2018-05-20 09:08:41 -05:00
David Sparer
99a3eabbaf updated changelog 2018-05-19 17:00:57 -05:00
David Sparer
c57bd386f2 dont try to connect to folders in quick connect menu. resolves #924 2018-05-19 16:57:34 -05:00
David Sparer
f2a52b03df menu bar can be moved when "lock toolbar position" is turned off. closes #902 2018-05-19 12:57:29 -05:00
David Sparer
860e1ccfaa fix a mismerged language item 2018-05-18 21:33:16 -05:00
David Sparer
49967b38d4 update changelog 2018-05-18 21:32:51 -05:00
David Sparer
36038fff6d fix minor code typo 2018-05-18 20:52:17 -05:00
David Sparer
c5958954b0 apply language later in app startup 2018-05-18 20:45:27 -05:00
David Sparer
d0d63016ca Merge branch 'pr_948_target' into release/v1.76
# Conflicts:
#	mRemoteV1/Resources/Language/Language.resx
#	mRemoteV1/UI/Forms/frmMain.Designer.cs
#	mRemoteV1/UI/Menu/ViewMenu.cs
2018-05-18 20:04:23 -05:00
David Sparer
35f2484adf Merge pull request #948 from farosch/translation
some changes regarding tranlsation
2018-05-18 18:41:06 -05:00
Sean Kaim
662b5bde31 code clean up 2018-05-16 22:58:12 -04:00
Sean Kaim
388a4ed75b minor code clean up
* No need to kick off the registry provider here (it's done already in PuttySessionsManager#StartWatcher())

* if (Directory.Exists(sessionsFolderPath)) thows an exception even though it should have just fallen through... but if (!Directory.Exists(sessionsFolderPath)) doesn't throw and logs a message with a graceful return????

IDK... I had a Uri.IsWellFormedUriString test in there to avoid the exception, but it seems unnecessary...
2018-05-16 21:55:24 -04:00
David Sparer
c2cf496ded updated changelog and credits 2018-04-29 12:00:08 -05:00
David Sparer
8a172f02a9 updated changelog and credits for #942 2018-04-19 08:08:44 -05:00
David Sparer
f27935ea61 Merge pull request #942 from sli-pro/develop
Made several strings translatable and added Russian translations
2018-04-19 07:58:16 -05:00
Cristian Abelleira Olañeta
5311b522b7 Added InheritRedirectClipboard to CsvSerializer 2018-04-18 18:07:52 +02:00
Cristian Abelleira Olañeta
ea682e218d Fixed multiple errors in implementation 2018-04-15 20:13:28 +02:00
Cristian Abelleira Olañeta
aa5f7ef2a8 Implemented clipboard sharing setting for RDP protocol 2018-04-15 10:41:39 +02:00
Faryan Rezagholi
043df0aec3 fixed wording 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
63a2e18760 added missing items 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
c3ced7ed03 fix: translations of main file menu items were not loaded 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
f597e14b3d fix group box was not translatable 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
aff4ba9115 fix: set labels dock mode to fill (wasnt displaying longer translated texts) 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
554e0805e3 fix: title of options page was not translatable 2018-04-14 11:56:01 +02:00
Faryan Rezagholi
f4efa74a23 Added missing translation options in viewMenu.cs 2018-04-14 11:56:01 +02:00
Vladimir Semenov
ddc19587fa Edited and added a translation of the Russian language in the forms
- File/import
- File/Import from AD
- File/Export to File
- View/Lock Toolbar position
- View/Mylti SSH toolbar
- Tools/Options/Additionally
Related to question #940.
2018-04-10 13:41:34 +03:00
Vladimir Semenov
5f1232727e Edit and add a translation on the external tools form.
Added and corrected Russian and English translations in the external tools tab.
Adjusted the placement of components on the external tools form so that the text does not overlap during translation.
Related to question #940.
2018-04-10 09:58:59 +03:00
David Sparer
9c373e8f0a Merge pull request #938 from sli-pro/develop
Small visual correction of the forms
2018-04-07 11:25:55 -05:00
David Sparer
83942d788f Merge branch '916_default_properties_not_saving' into develop 2018-04-06 15:05:35 -05:00
David Sparer
73d6fec6f3 updated changelog 2018-04-06 15:05:00 -05:00
David Sparer
a37b5deaa1 finished updating some tests for default inheritance 2018-04-06 15:02:14 -05:00
Vladimir Semenov
3b9de847e7 Small visual correction of the forms
- for the main form set the minimum resolution 1140; 603.
- for the form of port scans, done visual editing of components.
2018-04-06 20:59:15 +03:00
David Sparer
924f1f1e48 improved tests for default connection info 2018-04-05 16:37:22 -05:00
David Sparer
7bdebbe25b Merge pull request #936 from sli-pro/develop
Update Language ru
2018-04-05 15:16:31 -05:00
David Sparer
8f46c25dc9 Merge pull request #935 from marcomsousa/develop
Update Language es
2018-04-05 15:15:04 -05:00
Vladimir Semenov
8bb4a03639 Update Language ru
Fix typos in Russian language
2018-04-05 18:51:47 +03:00
Marco Sousa
7b5bc5e057 Update Language es 2018-04-05 12:39:02 +02:00
Aleksei Reytsman
2c62218fd6 Add context menu items to close other and other to the right tabs 2018-03-28 18:21:47 +03:00
David Sparer
35582a5e6a fixed bug with saving and loading default connection info data
updated tests to better cover this feature. related to #916
2018-03-22 16:54:50 -05:00
David Sparer
20340fd31f Merge pull request #913 from mRemoteNG/github-templates
Update .github templates
2018-03-22 07:44:10 -05:00
David Sparer
d6d7664b48 update readme shield 2018-03-14 19:30:25 -05:00
David Sparer
ce97e63876 bump version 2018-03-14 19:17:29 -05:00
David Sparer
378b98ff89 set release date 2018-03-14 19:09:02 -05:00
David Sparer
ce31199e57 updated changelog 2018-03-10 17:55:15 -06:00
David Sparer
227f3b2924 fix csv serialization bug where some empty fields would not be included
related to #911
2018-03-10 17:47:33 -06:00
David Sparer
5076f1354c fix bug where inheritance is incorrectly allowed on nodes under the root node after deserializing 2018-03-10 16:37:54 -06:00
Bennett Blodinger
e5a34388ae Update .github templates
Bumping up the quality of the templates with help from https://www.talater.com/open-source-templates
2018-03-09 09:46:03 -05:00
David Sparer
6a5f65c018 add a bit more documentation to the ps script that creates bulk connections 2018-03-09 08:08:29 -06:00
David Sparer
6d5f41b3d8 forgot to bump the stable branch when 1.75.7012 was released 2018-03-03 09:39:37 -06:00
David Sparer
64f10ead63 bump development channel download shield 2018-03-03 09:31:27 -06:00
745 changed files with 51139 additions and 31910 deletions

View File

@@ -1,16 +1,30 @@
<!--
Only file GitHub issues for bugs and feature requests. All other topics will be closed.
<!--- Provide a general summary of the issue in the Title above -->
Before opening an issue, please search for a duplicate or closed issue.
Please provide as much detail as possible for us to fix your issue.
-->
## Expected Behavior
<!--- If you're describing a bug, tell us what should happen -->
<!--- If you're suggesting a change/improvement, tell us how it should work -->
<!-- Bug -->
|Detail|Value|
|--:|---|
|Operating system | Windows 10 x64 |
|mRemoteNG version| 1.75.7008 |
## Current Behavior
<!--- If describing a bug, tell us what happens instead of the expected behavior -->
<!--- If suggesting a change/improvement, explain the difference from current behavior -->
## Possible Solution
<!--- Not obligatory, but suggest a fix/reason for the bug, -->
<!--- or ideas how to implement the addition or change -->
<!-- Feature Request -->
<!-- If you file a feature request, please delete the bug section -->
## Steps to Reproduce (for bugs)
<!--- Provide an unambiguous set of steps to reproduce -->
<!--- this bug. Include code to reproduce, if relevant -->
1.
2.
3.
4.
## Context
<!--- How has this issue affected you? What are you trying to accomplish? -->
<!--- Providing context helps us come up with a solution that is most useful in the real world -->
## Your Environment
<!--- Include as many relevant details about the environment you experienced the bug in -->
* Version used:
* Operating System and version (e.g. Windows 10 1709 x64):

View File

@@ -1,4 +1,29 @@
<!--
Please provide as much detail as possible with what your pull request does.
Include a reference to a filed issue if it exists.
-->
<!--- Provide a general summary of your changes in the Title above -->
## Description
<!--- Describe your changes in detail -->
## Motivation and Context
<!--- Why is this change required? What problem does it solve? -->
<!--- If it fixes an open issue, please link to the issue here. -->
## How Has This Been Tested?
<!--- Please describe in detail how you tested your changes. -->
<!--- Include details of your testing environment, and the tests you ran to -->
<!--- see how your change affects other areas of the code, etc. -->
## Screenshots (if appropriate):
## Types of changes
<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
## Checklist:
<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
- [ ] My code follows the code style of this project.
- [ ] My change requires a change to the documentation.
- [ ] I have updated the documentation accordingly.
- [ ] I have read the **CONTRIBUTING** document.

3
.gitignore vendored
View File

@@ -283,9 +283,6 @@ Installer Projects/Installer/Fragments/HelpFilesFragment.wxs
InstallerProjects/Installer/Fragments/FilesFragment.wxs
InstallerProjects/Installer/Resources/License.rtf
# user preference: .editorconfig - http://editorconfig.org/
.editorconfig
# gh-pages info
runlocal.bat
/_site

View File

@@ -1,3 +1,174 @@
1.77.0 (2018-xx-xx):
Features/Enhancements:
----------------------
#1223: Open External Links in Default Web Browser
#1141: 'Copy Hostname' option added to connection tree context menu
#1129: Spanish translation improvements
#1072: Russian translation improvements
#1016: Chinese (simplified) translation improvements
#951: Added property to Enable/Disable Clipboard Sharing for RDP connections
#928: Add context menu items to 'Close all but this' and 'Close all tabs to the right'
#765: Port Scan Issues (single port scan option now available)
#155: Replace MagicLibrary with DockPanelSuite
#154: MR-139: Close Button on Each Tab - new default theme has a close button on each tab
Fixes:
------
#1248: RemoveMagicLib Bugs - various bugs that cropped up as a result of removing magiclib
#1245: Options form takes nearly 3 seconds to appear when Theming is active
#1240: Theming problem with NGNumericUpDown
#1238: Connection panel not translated until opened for the first time
#1186: Fixed several dialog boxes to use localized button text
#1170: Prevent Options window from showing up in taskbar
#1064: "Esc" button does does not close some dialogs
#1044: Dragging (grabbing) the program window requires 2 clicks
1.76.15 (2019-03-09):
Fixes:
------
#1303: Exception on first connection with new SQL server database
#1304: Resolved several issues with importing multiple RDP Manager v2.7 files
Features/Enhancements:
----------------------
Importing multiple files now only causes 1 save event, rather than 1 per file imported.
1.76.14 (2019-02-08):
Features/Enhancements:
----------------------
#222: Allow FIPS to be enabled
1.76.13 (2018-12-22):
Changes:
--------
#222: Pre-Release Test build for running on systems with FIPS Enabled
1.76.12 (2018-11-08):
Features/Enhancements:
----------------------
#1180: Allow saving certain connection properties locally when using database
Fixes:
------
#1181: Connections sometimes dont immediately load when switching to sql feature
#1173: Fixed memory leak when loading connections multiple times
#1168: Autohide Connection and Config tab won't open when ssh connection active
#1134: Fixed issue where opening a connection opens same connection on other clients when using database feature
#449: Encrypt passwords saved to database
1.76.11 (2018-10-18):
Fixes:
------
#1139: Feature "Reconnect to previously opened sessions" not working
#1136: Putty window not maximized
1.76.10 (2018-10-07):
Fixes:
------
#1124: Enabling themes causes an exception
1.76.9 (2018-10-07):
Fixes:
------
#1117: Duplicate panel created when "Reconnect on Startup" and "Create Empty Panel" settings enabled
#1115: Exception when changing from xml data storage to SQL
#1110: Pressing Delete button during connection rename attempts to delete the connection instead of the text
#1106: Inheritance does not work when parent has C# default type set
#1092: Invalid Cast Exceptions loading default connectioninfo
#1091: Minor themeing issues
#853: Added some additional safety checks and logging to help address RDP crashes
1.76.8 (2018-08-25):
Fixes:
------
#1088: Delete and Launch buttons are not disabled when last external tool deleted
#1087: 'Save connections after every edit' setting not honored
#1082: Connections not given GUID if Id is empty in connection xml
1.76.7 (2018-08-22):
Fixes:
------
#1076: Wrong object selected when duplicating connection then switching between properties and inheritance in config window
#1068: Fixed some toolbar positioning bugs
1.76.6 (2018-08-03):
Fixes:
------
#1062: Entering correct password when starting app does not load connections file
1.76.5 (2018-08-02):
Fixes:
------
#1057: Hitting F2 with no connection node selected caused unhandled exception
#1052: 'Switch to notification panel' feature does not always switch
#1051: Tooltips always displayed regardless of 'Show description tooltips in connection tree' setting
#1050: Config window retains access to previously selected node after loading new connections file
#1045: Config window shows several incorrect properties for HTTPS connections
#1040: Canceling "select panel" form does not cancel
#1039: Set default theme when themes disabled
#1038: Unable to add connection with active filter
#1036: Exception when themes are active and options page closed on Connections then reopened
#1034: Connection context menu not being translated
#1030: Exception thrown if importing from port scan and no tree node is selected
#1020: BackupFileKeepCount setting not limiting backup file count
#1004: Duplicating root or PuTTy node through hotkey causes unhandled exception
#1002: Disabling filtering without clearing keyword leaves filtered state
#1001: Connection tree context menu hotkeys stop working and disappear in some cases
#999: Some hotkeys stop working if File menu was called when PuTTy Saved Sessions was selected
#998: Can sometimes add connection under PuTTY Sessions node
#991: Error when deleting host in filtered view
#971: Portable Settings now apply to any machine they are used on
#961: Connections file overwritten if correct decryption password not provided
#893: Removed unneeded files from build/package
#868: if statement returned the same value
#762: Increased button size to fit locaized text
1.76.4 Alpha 6 (2018-06-03):
Features/Enhancements:
----------------------
#948: Fixed issue where many menu item translations were not being used
#942: Improved Russian translation of several items
#924: Notification for "No Host Specified" when clicking folders in quick-connect menu
#902: Menu bar can once again be moved. View -> "Lock toolbar positions" now also locks the menu position
Added option for creating an empty panel on startup
Fixes:
------
#938: Minor layout improvements on the Port Scan screen
#916: Default properties were not being saved
1.76.3 Alpha 5 (2018-03-14):
Fixes:
------
#911: Csv exports sometimes do not include all fields
#807: Inheritance is sometimes turned on for nodes under root Connections node
1.76.2 Alpha 4 (2018-03-03):
Fixes:

View File

@@ -16,13 +16,18 @@ github.com/peterchenadded
Brandon Wulf (github.com/mrwulf)
Pedro Rodrigues (github.com/pedro2555)
github.com/dekelMP
github.com/farosch
Faryan Rezagholi (github.com/farosch)
Bruce (github.com/brucetp)
Camilo Alvarez (github.com/jotatsu)
github.com/DamianBis
github.com/pfjason
github.com/sirLoaf
github.com/Fyers
Vladimir Semenov (github.com/sli-pro)
Stephan (github.com/st-schuler)
Aleksey Reytsman (github.com/areytsman)
Cristian Abelleira (github.com/CrAbelleira)
github.com/MitchellBot
Past Contributors
@@ -59,6 +64,11 @@ Lukas Plachy (github.com/rheingold)
Gyuha Shin
Stefan (github.com/polluks)
github.com/emazv72
Vladimir Semenov (github.com/sli-pro)
Marco Sousa (github.com/marcomsousa)
github.com/wwj402
github.com/Fyers
github.com/pablomh
Included Source Code
@@ -95,7 +105,7 @@ Copyright
http://www.codeproject.com/KB/selection/ADPickerCtrl.aspx
DockPanel Suite
Copyright <20> 2016 @roken and @lextm (formerly Weifen Luo)
Copyright <20> 2018 @roken and @lextm (formerly Weifen Luo)
MIT License
https://github.com/dockpanelsuite/dockpanelsuite

View File

@@ -14,6 +14,9 @@
<Component Id="C.Readme" Guid="*">
<File Id="ReadmeFile" Name="Readme.txt" Source="$(var.SolutionDir)README.TXT" KeyPath="yes" />
</Component>
<Component Id="C.TileManifest" Guid="*">
<File Id="TileManifest" Name="mRemoteNG.VisualElementsManifest.xml" Source="$(var.SolutionDir)mRemoteV1\bin\Release\mRemoteNG.VisualElementsManifest.xml" KeyPath="yes" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>

View File

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

View File

@@ -41,10 +41,10 @@
<ItemGroup>
<Content Include="Filters\Harvest_Filter.xslt" />
<Content Include="Includes\Config.wxi" />
<Content Include="Resources\header.bmp" />
<Content Include="Resources\AppIcon.ico" />
<Content Include="Resources\Installer_Header.png" />
<Content Include="Resources\Installer_Side.png" />
<Content Include="Resources\License.rtf" />
<Content Include="Resources\mRemoteNG.ico" />
<Content Include="Resources\welcome.bmp" />
</ItemGroup>
<ItemGroup>
<Folder Include="CustomActions" />
@@ -57,10 +57,6 @@
<Folder Include="Resources" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Localizations\ru-RU.wxl" />
<EmbeddedResource Include="Localizations\ja-JP.wxl" />
<EmbeddedResource Include="Localizations\cs-CZ.wxl" />
<EmbeddedResource Include="Localizations\de-DE.wxl" />
<EmbeddedResource Include="Localizations\en-US.wxl" />
</ItemGroup>
<ItemGroup>
@@ -114,21 +110,6 @@
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release Portable|x86' ">
<DefineConstants>HarvestPath=$(SolutionDir)mRemoteV1\bin\Release Portable;HelpFilesHarvestPath=$(SolutionDir)mRemoteV1\Resources\Help</DefineConstants>
</PropertyGroup>
<PropertyGroup>
<PostBuildEvent>:: When passing paths to powershell scripts, check if the path ends with a backslash "\"
:: If it does, then the backslash may be interpreted as an escape character. Add another backslash to cancel the first one.
powershell -noprofile -command "sleep 2"
set /p buildenv=&lt;buildenv.tmp
set solutionDir=$(SolutionDir)\
set targetDir=%25cd%25
set psScriptsDir=$(SolutionDir)Tools
set certPath=$(CertPath)
set certPassword=$(CertPassword)
:: Call the post build powershell script
powershell.exe -ExecutionPolicy Bypass -File "%25psScriptsDir%25\postbuild_installer.ps1" -SolutionDir "%25solutionDir%25" -TargetDir "%25targetDir%25" -TargetFileName "mRemoteNG.exe" -ConfigurationName "%25buildenv%25" -CertificatePath "%25certPath%25" -CertificatePassword "%25certPassword%25"</PostBuildEvent>
</PropertyGroup>
<PropertyGroup>
<PreBuildEvent>REM Clean the TargetDir
rmdir /S /Q "$(TargetDir)"
@@ -141,4 +122,18 @@ REM Harvest bin directory of the mRemoteV1 project
REM Convert the license file "COPYING.TXT" to "License.rtf" to be shown in the installer GUI
"$(ProjectDir)Resources\Pandoc\pandoc.exe" -s -t rtf -o "$(ProjectDir)\Resources\License.rtf" "$(SolutionDir)COPYING.TXT"</PreBuildEvent>
</PropertyGroup>
<PropertyGroup>
<PostBuildEvent>:: When passing paths to powershell scripts, check if the path ends with a backslash "\"
:: If it does, then the backslash may be interpreted as an escape character. Add another backslash to cancel the first one.
powershell -noprofile -command "sleep 2"
set /p buildenv=&lt;buildenv.tmp
:: Manual builds, set the cert password and uncomment below.
:: IF "%25APPVEYOR_BUILD_FOLDER"=="" ( set cert_pwd= )
:: Call the post build powershell script
powershell.exe -ExecutionPolicy Bypass -File "$(SolutionDir)Tools\postbuild_installer.ps1" -SolutionDir "$(SolutionDir)\" -TargetDir "%25cd%25" -TargetFileName "mRemoteNG.exe" -ConfigurationName "%25buildenv%25" -CertificatePath "$(CertPath)" -CertificatePassword "%25cert_pwd%25" -ExcludeFromSigning "PuTTYNG.exe"</PostBuildEvent>
</PropertyGroup>
</Project>

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<WixLocalization Culture="cs-CZ" Language="1029" xmlns="http://schemas.microsoft.com/wix/2006/localization">
<!-- Install Conditions -->
<String Id="Upgrade_NewerVersionInstalled" Overridable="yes">A newer version of [ProductName] is already installed.</String>
<String Id="Install_NeedToBeAdminToInstall">You need to be an administrator to install this product.</String>
<String Id="Install_NeedDotNetFrameworkVersion">mRemoteNG requires Microsoft .NET Framework $(var.RequiredDotNetFrameworkVersion).</String>
<String Id="Install_OSVersionRequirement">mRemoteNG requires Windows 7 SP1 or higher to run. Please update your operating system and try again.</String>
<String Id="Install_RDP80Requirement">mRemoteNG requires RDP 8.0 or higher to run. Windows 7 users will need to install KB2592687</String>
<String Id="Install_Win7RequiresSP1">For mRemoteNG to run on Windows 7, it requires Service Pack 1 to be installed. Please install Service Pack 1 and try again.</String>
<!-- Directories and File names -->
<String Id="Folders_Desktop">Desktop</String>
<String Id="File_Credits">Credits</String>
<String Id="File_License">License</String>
<String Id="File_VersionHistory">Version History</String>
<!-- Features and install options -->
<String Id="Feature_Complete">Complete</String>
<String Id="Feature_DesktopShortcut">Desktop Shortcut</String>
<String Id="Feature_StartMenuShortcut">Start menu shortcut</String>
<!-- GUI Page Text -->
<String Id="FinishPage_LaunchMremoteNow" Overridable="yes">Launch [ProductName] Now</String>
</WixLocalization>

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<WixLocalization Culture="de-DE" Language="1031" xmlns="http://schemas.microsoft.com/wix/2006/localization">
<!-- Install Conditions -->
<String Id="Upgrade_NewerVersionInstalled" Overridable="yes">A newer version of [ProductName] is already installed.</String>
<String Id="Install_NeedToBeAdminToInstall">You need to be an administrator to install this product.</String>
<String Id="Install_NeedDotNetFrameworkVersion">mRemoteNG requires Microsoft .NET Framework $(var.RequiredDotNetFrameworkVersion).</String>
<String Id="Install_OSVersionRequirement">mRemoteNG requires Windows 7 SP1 or higher to run. Please update your operating system and try again.</String>
<String Id="Install_RDP80Requirement">mRemoteNG requires RDP 8.0 or higher to run. Windows 7 users will need to install KB2592687</String>
<String Id="Install_Win7RequiresSP1">For mRemoteNG to run on Windows 7, it requires Service Pack 1 to be installed. Please install Service Pack 1 and try again.</String>
<!-- Directories and File names -->
<String Id="Folders_Desktop">Desktop</String>
<String Id="File_Credits">Credits</String>
<String Id="File_License">License</String>
<String Id="File_VersionHistory">Version History</String>
<!-- Features and install options -->
<String Id="Feature_Complete">Complete</String>
<String Id="Feature_DesktopShortcut">Desktop Shortcut</String>
<String Id="Feature_StartMenuShortcut">Start menu shortcut</String>
<!-- GUI Page Text -->
<String Id="FinishPage_LaunchMremoteNow" Overridable="yes">mRemoteNG jetzt Starten</String>
</WixLocalization>

View File

@@ -22,6 +22,6 @@
<String Id="Feature_StartMenuShortcut">Start menu shortcut</String>
<!-- GUI Page Text -->
<String Id="FinishPage_LaunchMremoteNow" Overridable="yes">Launch mRemoteNG Now</String>
<String Id="FinishPage_LaunchMremoteNow" Overridable="yes">Launch mRemoteNG now</String>
</WixLocalization>

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<WixLocalization Culture="ja-JP" Language="1041" xmlns="http://schemas.microsoft.com/wix/2006/localization">
<!-- Install Conditions -->
<String Id="Upgrade_NewerVersionInstalled" Overridable="yes">A newer version of [ProductName] is already installed.</String>
<String Id="Install_NeedToBeAdminToInstall">You need to be an administrator to install this product.</String>
<String Id="Install_NeedDotNetFrameworkVersion">mRemoteNG requires Microsoft .NET Framework $(var.RequiredDotNetFrameworkVersion).</String>
<String Id="Install_OSVersionRequirement">mRemoteNG requires Windows 7 SP1 or higher to run. Please update your operating system and try again.</String>
<String Id="Install_RDP80Requirement">mRemoteNG requires RDP 8.0 or higher to run. Windows 7 users will need to install KB2592687</String>
<String Id="Install_Win7RequiresSP1">For mRemoteNG to run on Windows 7, it requires Service Pack 1 to be installed. Please install Service Pack 1 and try again.</String>
<!-- Directories and File names -->
<String Id="Folders_Desktop">Desktop</String>
<String Id="File_Credits">Credits</String>
<String Id="File_License">License</String>
<String Id="File_VersionHistory">Version History</String>
<!-- Features and install options -->
<String Id="Feature_Complete">Complete</String>
<String Id="Feature_DesktopShortcut">Desktop Shortcut</String>
<String Id="Feature_StartMenuShortcut">Start menu shortcut</String>
<!-- GUI Page Text -->
<String Id="FinishPage_LaunchMremoteNow" Overridable="yes">Launch [ProductName] Now</String>
</WixLocalization>

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<WixLocalization Culture="ru-RU" Language="1049" xmlns="http://schemas.microsoft.com/wix/2006/localization">
<!-- Install Conditions -->
<String Id="Upgrade_NewerVersionInstalled" Overridable="yes">A newer version of [ProductName] is already installed.</String>
<String Id="Install_NeedToBeAdminToInstall">You need to be an administrator to install this product.</String>
<String Id="Install_NeedDotNetFrameworkVersion">mRemoteNG requires Microsoft .NET Framework $(var.RequiredDotNetFrameworkVersion).</String>
<String Id="Install_OSVersionRequirement">mRemoteNG requires Windows 7 SP1 or higher to run. Please update your operating system and try again.</String>
<String Id="Install_RDP80Requirement">mRemoteNG requires RDP 8.0 or higher to run. Windows 7 users will need to install KB2592687</String>
<String Id="Install_Win7RequiresSP1">For mRemoteNG to run on Windows 7, it requires Service Pack 1 to be installed. Please install Service Pack 1 and try again.</String>
<!-- Directories and File names -->
<String Id="Folders_Desktop">Desktop</String>
<String Id="File_Credits">Credits</String>
<String Id="File_License">License</String>
<String Id="File_VersionHistory">Version History</String>
<!-- Features and install options -->
<String Id="Feature_Complete">Complete</String>
<String Id="Feature_DesktopShortcut">Desktop Shortcut</String>
<String Id="Feature_StartMenuShortcut">Start menu shortcut</String>
<!-- GUI Page Text -->
<String Id="FinishPage_LaunchMremoteNow" Overridable="yes">Launch [ProductName] Now</String>
</WixLocalization>

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -0,0 +1,82 @@
{\rtf1\ansi\deff0{\fonttbl{\f0 \fswiss Helvetica;}{\f1 Courier;}}
{\colortbl;\red255\green0\blue0;\red0\green0\blue255;}
\widowctrl\hyphauto
{\pard \ql \f0 \sa180 \li0 \fi0 \f1 GNU GENERAL PUBLIC LICENSE\line
Version 2, June 1991\par}
{\pard \ql \f0 \sa180 \li0 \fi0 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 \f1 Preamble\par}
{\pard \ql \f0 \sa180 \li0 \fi0 The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 The precise terms and conditions for copying, distribution and modification follow.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 \f1 GNU GENERAL PUBLIC LICENSE\par}
{\pard \ql \f0 \sa180 \li0 \fi0 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\par}
{\pard \ql \f0 \sa0 \li360 \fi-360 0.\tx360\tab This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".\sa180\par}
{\pard \ql \f0 \sa180 \li0 \fi0 Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.\par}
{\pard \ql \f0 \sa0 \li360 \fi-360 1.\tx360\tab You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.\sa180\par}
{\pard \ql \f0 \sa180 \li0 \fi0 You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.\par}
{\pard \ql \f0 \sa180 \li360 \fi-360 2.\tx360\tab You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:\par}
{\pard \ql \f0 \sa180 \li720 \fi-360 a)\tx360\tab You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.\par}
{\pard \ql \f0 \sa180 \li720 \fi-360 b)\tx360\tab You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.\par}
{\pard \ql \f0 \sa180 \li720 \fi-360 c)\tx360\tab If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)\sa180\sa180\par}
{\pard \ql \f0 \sa180 \li0 \fi0 These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.\par}
{\pard \ql \f0 \sa180 \li360 \fi-360 3.\tx360\tab You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:\par}
{\pard \ql \f0 \sa180 \li720 \fi-360 a)\tx360\tab Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,\par}
{\pard \ql \f0 \sa180 \li720 \fi-360 b)\tx360\tab Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,\par}
{\pard \ql \f0 \sa180 \li720 \fi-360 c)\tx360\tab Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)\sa180\sa180\par}
{\pard \ql \f0 \sa180 \li0 \fi0 The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.\par}
{\pard \ql \f0 \sa180 \li360 \fi-360 4.\tx360\tab You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.\par}
{\pard \ql \f0 \sa180 \li360 \fi-360 5.\tx360\tab You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.\par}
{\pard \ql \f0 \sa180 \li360 \fi-360 6.\tx360\tab Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.\par}
{\pard \ql \f0 \sa180 \li360 \fi-360 7.\tx360\tab If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.\sa180\par}
{\pard \ql \f0 \sa180 \li0 \fi0 If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.\par}
{\pard \ql \f0 \sa180 \li360 \fi-360 8.\tx360\tab If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.\par}
{\pard \ql \f0 \sa180 \li360 \fi-360 9.\tx360\tab The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.\sa180\par}
{\pard \ql \f0 \sa180 \li0 \fi0 Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.\par}
{\pard \ql \f0 \sa180 \li360 \fi-360 10.\tx360\tab If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.\par}
{\pard \ql \f0 \sa180 \li360 \fi0 \f1 NO WARRANTY\par}
{\pard \ql \f0 \sa180 \li360 \fi-360 11.\tx360\tab BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\par}
{\pard \ql \f0 \sa180 \li360 \fi-360 12.\tx360\tab IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\par}
{\pard \ql \f0 \sa180 \li360 \fi0 \f1 END OF TERMS AND CONDITIONS\line
\line
How to Apply These Terms to Your New Programs\sa180\par}
{\pard \ql \f0 \sa180 \li0 \fi0 If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 \f1 <one line to give the program's name and a brief idea of what it does.>\line
Copyright (C) <year> <name of author>\line
\line
This program is free software; you can redistribute it and/or modify\line
it under the terms of the GNU General Public License as published by\line
the Free Software Foundation; either version 2 of the License, or\line
(at your option) any later version.\line
\line
This program is distributed in the hope that it will be useful,\line
but WITHOUT ANY WARRANTY; without even the implied warranty of\line
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\line
GNU General Public License for more details.\line
\line
You should have received a copy of the GNU General Public License along\line
with this program; if not, write to the Free Software Foundation, Inc.,\line
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 Also add information on how to contact you by electronic and paper mail.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 If the program is interactive, make it output a short notice like this when it starts in an interactive mode:\par}
{\pard \ql \f0 \sa180 \li0 \fi0 \f1 Gnomovision version 69, Copyright (C) year name of author\line
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\line
This is free software, and you are welcome to redistribute it\line
under certain conditions; type `show c' for details.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 The hypothetical commands {\f1 show w' and}show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than {\f1 show w' and}show c'; they could even be mouse-clicks or menu items--whatever suits your program.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:\par}
{\pard \ql \f0 \sa180 \li0 \fi0 Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.\par}
{\pard \ql \f0 \sa180 \li0 \fi0 , 1 April 1989 Ty Coon, President of Vice\par}
{\pard \ql \f0 \sa180 \li0 \fi0 This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.\par}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 451 KiB

View File

@@ -11,7 +11,7 @@
<MediaTemplate EmbedCab="yes" />
<Binary Id="CustomActions.CA.dll" SourceFile="$(var.SolutionDir)InstallerProjects\CustomActions\bin\$(var.Configuration)\CustomActions.CA.dll" />
<Property Id="MsiLogging" Value="v" />
<Property Id="ARPPRODUCTICON" Value="mRemoteNG.ico" />
<Property Id="ARPPRODUCTICON" Value="AppIcon.ico" />
<Property Id="ARPHELPLINK" Value="http://www.mremoteng.org" />
<SetProperty Id="ARPINSTALLLOCATION" Value="[INSTALLDIR]" After="CostFinalize" />
<Property Id="MAINEXE" Value="$(var.ExeProcessName)" />
@@ -27,7 +27,7 @@
<Property Id='LEGACYVERSIONINSTALLED' Value='0' />
<PropertyRef Id="NETFRAMEWORK40FULL" />
<PropertyRef Id="WIX_IS_NETFRAMEWORK_40_OR_LATER_INSTALLED" />
<Icon Id="mRemoteNG.ico" SourceFile="Resources\mRemoteNG.ico" />
<Icon Id="AppIcon.ico" SourceFile="Resources\AppIcon.ico" />
<CustomActionRef Id='SaveCmdlineINSTALLDIR' />
@@ -106,8 +106,8 @@
</UI>
<WixVariable Id="WixUILicenseRtf" Value="Resources\License.rtf" />
<WixVariable Id="WixUIDialogBmp" Value="Resources\welcome.bmp" />
<WixVariable Id="WixUIBannerBmp" Value="Resources\header.bmp" />
<WixVariable Id="WixUIDialogBmp" Value="Resources\Installer_Side.png" />
<WixVariable Id="WixUIBannerBmp" Value="Resources\Installer_Header.png" />
<!-- Provide option to run app after install -->
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="!(loc.FinishPage_LaunchMremoteNow)" />

8
Jenkinsfile vendored
View File

@@ -1,8 +1,8 @@
#!groovy
node('windows') {
def jobDir = pwd()
def solutionFilePath = "\"${jobDir}\\mRemoteV1.sln\""
def vsToolsDir = "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\Tools"
def vsExtensionsDir = "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\IDE\\CommonExtensions\\Microsoft\\TestWindow"
def msBuild = "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\MSBuild\\15.0\\Bin\\msbuild.exe"
def nunitConsolePath = "${jobDir}\\packages\\NUnit.ConsoleRunner.3.7.0\\tools\\nunit3-console.exe"
def openCoverPath = "${jobDir}\\packages\\OpenCover.4.6.519\\tools\\OpenCover.Console.exe"
def reportGeneratorPath = "${jobDir}\\packages\\ReportGenerator.3.0.2\\tools\\ReportGenerator.exe"
@@ -24,11 +24,11 @@ node('windows') {
}
stage ('Build mRemoteNG (Normal)') {
bat "\"${vsToolsDir}\\VsDevCmd.bat\" && msbuild.exe /nologo /p:Platform=x86 \"${jobDir}\\mRemoteV1.sln\""
bat "\"${msBuild}\" /nologo /p:Platform=x86 \"${jobDir}\\mRemoteV1.sln\""
}
stage ('Build mRemoteNG (Portable)') {
bat "\"${vsToolsDir}\\VsDevCmd.bat\" && msbuild.exe /nologo /p:Configuration=\"Debug Portable\";Platform=x86 \"${jobDir}\\mRemoteV1.sln\""
bat "\"${msBuild}\" /nologo /p:Configuration=\"Debug Portable\";Platform=x86 \"${jobDir}\\mRemoteV1.sln\""
}
stage ('Run Unit Tests (Normal, w/coverage)') {

View File

@@ -1,9 +1,13 @@
node('windows') {
def jobDir = pwd()
def solutionFilePath = "\"${jobDir}\\mRemoteV1.sln\""
def vsToolsDir = "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\Tools"
def vsExtensionsDir = "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\IDE\\CommonExtensions\\Microsoft\\TestWindow"
def nunitTestAdapterPath = "C:\\Users\\Administrator\\AppData\\Local\\Microsoft\\VisualStudio\\14.0\\Extensions"
def msBuild = "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\MSBuild\\15.0\\Bin\\msbuild.exe"
def nunitConsolePath = "${jobDir}\\packages\\NUnit.ConsoleRunner.3.7.0\\tools\\nunit3-console.exe"
def openCoverPath = "${jobDir}\\packages\\OpenCover.4.6.519\\tools\\OpenCover.Console.exe"
def testResultFilePrefix = "TestResult"
def testResultFileNormal = "${testResultFilePrefix}_UnitTests_normal.xml"
def testResultFilePortable = "${testResultFilePrefix}_UnitTests_portable.xml"
def coverageReport = "code_coverage_report.xml"
stage ('Clean output dir') {
@@ -32,24 +36,24 @@ node('windows') {
withCredentials([file(credentialsId: '9b674d57-6792-48e3-984a-4d1bab2abb64', variable: 'CODE_SIGNING_CERT')]) {
withCredentials([usernamePassword(credentialsId: '05b7449b-05c0-490f-8661-236242526e62', passwordVariable: 'MRNG_CERT_PASSWORD', usernameVariable: 'NO_USERNAME')]) {
stage ('Build mRemoteNG (Normal - MSI)') {
bat "\"${vsToolsDir}\\VsDevCmd.bat\" && msbuild.exe /nologo /t:Clean,Build /p:Configuration=\"Release Installer\" /p:Platform=x86 /p:CertPath=\"${env.CODE_SIGNING_CERT}\" /p:CertPassword=${env.MRNG_CERT_PASSWORD} \"${jobDir}\\mRemoteV1.sln\""
bat "\"${msBuild}\" /nologo /t:Clean,Build /p:Configuration=\"Release Installer\" /p:Platform=x86 /p:CertPath=\"${env.CODE_SIGNING_CERT}\" /p:CertPassword=${env.MRNG_CERT_PASSWORD} \"${jobDir}\\mRemoteV1.sln\""
archiveArtifacts artifacts: "Release\\*.msi", caseSensitive: false, onlyIfSuccessful: true, fingerprint: true
}
stage ('Build mRemoteNG (Portable)') {
bat "\"${vsToolsDir}\\VsDevCmd.bat\" && msbuild.exe /nologo /t:Clean,Build /p:Configuration=\"Release Portable\" /p:Platform=x86 /p:CertPath=\"${env.CODE_SIGNING_CERT}\" /p:CertPassword=${env.MRNG_CERT_PASSWORD} \"${jobDir}\\mRemoteV1.sln\""
bat "\"${msBuild}\" /nologo /t:Clean,Build /p:Configuration=\"Release Portable\" /p:Platform=x86 /p:CertPath=\"${env.CODE_SIGNING_CERT}\" /p:CertPassword=${env.MRNG_CERT_PASSWORD} \"${jobDir}\\mRemoteV1.sln\""
archiveArtifacts artifacts: "Release\\*.zip", caseSensitive: false, onlyIfSuccessful: true, fingerprint: true
}
}
}
stage ('Run Unit Tests (Normal - MSI)') {
bat "\"${vsToolsDir}\\VsDevCmd.bat\" && VSTest.Console.exe /logger:trx /TestAdapterPath:${nunitTestAdapterPath} \"${jobDir}\\mRemoteNGTests\\bin\\Release\\mRemoteNGTests.dll\""
}
stage ('Run Unit Tests (Portable)') {
bat "\"${vsToolsDir}\\VsDevCmd.bat\" && VSTest.Console.exe /logger:trx /TestAdapterPath:${nunitTestAdapterPath} \"${jobDir}\\mRemoteNGTests\\bin\\Release Portable\\mRemoteNGTests.dll\""
}
stage ('Run Unit Tests (Normal - MSI)') {
bat "\"${nunitConsolePath}\" \"${jobDir}\\mRemoteNGTests\\bin\\release\\mRemoteNGTests.dll\" --result=${testResultFileNormal} --x86"
}
stage ('Run Unit Tests (Portable)') {
bat "\"${nunitConsolePath}\" \"${jobDir}\\mRemoteNGTests\\bin\\release portable\\mRemoteNGTests.dll\" --result=${testResultFilePortable} --x86"
}
stage ('Generate UpdateCheck Files') {
bat "powershell -ExecutionPolicy Bypass -File \"${jobDir}\\Tools\\create_upg_chk_files.ps1\" -TagName \"${env.TagName}\" -UpdateChannel \"${env.UpdateChannel}\""
@@ -58,11 +62,10 @@ node('windows') {
stage ('Publish to GitHub') {
withCredentials([string(credentialsId: '5443a369-dbe8-42d3-b4e8-04d0b4e9039a', variable: 'GH_AUTH_TOKEN')]) {
def zipPath = "${jobDir}\\Release\\*.zip"
def msiPath = "${jobDir}\\Release\\*.msi"
def releaseFolder = "${jobDir}\\Release"
// because batch files suck at handling newline characters, we have to convert to base64 in groovy and back to text in powershell
def base64Description = env.ReleaseDescription.bytes.encodeBase64().toString()
bat "powershell -ExecutionPolicy Bypass -File \"${jobDir}\\Tools\\publish_to_github.ps1\" -Owner \"mRemoteNG\" -Repository \"mRemoteNG\" -ReleaseTitle \"${env.ReleaseTitle}\" -TagName \"${env.TagName}\" -TargetCommitish \"${env.TargetBranch}\" -Description \"${base64Description}\" -IsDraft ${env.IsDraft} -IsPrerelease ${env.IsPreRelease} -ZipFilePath \"${zipPath}\" -MsiFilePath \"${msiPath}\" -AuthToken \"${env.GH_AUTH_TOKEN}\" -DescriptionIsBase64Encoded"
bat "powershell -ExecutionPolicy Bypass -File \"${jobDir}\\Tools\\publish_to_github.ps1\" -Owner \"mRemoteNG\" -Repository \"mRemoteNG\" -ReleaseTitle \"${env.ReleaseTitle}\" -TagName \"${env.TagName}\" -TargetCommitish \"${env.TargetBranch}\" -Description \"${base64Description}\" -IsDraft ${env.IsDraft} -IsPrerelease ${env.IsPreRelease} -ReleaseFolderPath \"${releaseFolder}\" -AuthToken \"${env.GH_AUTH_TOKEN}\" -DescriptionIsBase64Encoded"
}
}
}

View File

@@ -4,15 +4,15 @@
[![Join the chat at https://gitter.im/mRemoteNG/PublicChat/](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mRemoteNG/PublicChat)
[![PayPal](https://img.shields.io/badge/%24-PayPal-blue.svg)](https://www.paypal.me/DavidSparer)
[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/529/badge)](https://bestpractices.coreinfrastructure.org/projects/529)
[![Github Releases](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/total.svg?style=flat-square)](https://github.com/mRemoteNG/mRemoteNG/releases/)
[![Issues In Progress](https://badge.waffle.io/mRemoteNG/mRemoteNG.png?label=In%20Progress&title=In%20Progress)](https://waffle.io/mRemoteNG/mRemoteNG)
[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/529/badge)](https://bestpractices.coreinfrastructure.org/projects/529)
| Update Channel | Build Status | Downloads |
| ---------------|--------------|-----------|
| Stable | [![Build status](https://ci.appveyor.com/api/projects/status/k0sdbxmq90fgdmj6/branch/master?svg=true)](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/master) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.75.7011/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.75.7011) |
| Beta | | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.75.7011/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.75.7011) |
| Development | [![Build status](https://ci.appveyor.com/api/projects/status/k0sdbxmq90fgdmj6/branch/develop?svg=true)](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/develop) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.76Alpha3/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.76Alpha3) |
| Stable | [![Build status](https://ci.appveyor.com/api/projects/status/k0sdbxmq90fgdmj6/branch/master?svg=true)](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/master) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.76.15/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.76.15) |
| Beta | | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.76.15/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.76.15) |
| Development | [![Build status](https://ci.appveyor.com/api/projects/status/k0sdbxmq90fgdmj6/branch/develop?svg=true)](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/develop) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.76.15/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.76.15) |
mRemoteNG is the next generation of mRemote, a full-featured, multi-tab remote connections manager.
@@ -54,6 +54,6 @@ If you find mRemoteNG useful and would like to contribute, it would be greatly a
Check out the [Wiki page](https://github.com/mRemoteNG/mRemoteNG/wiki/Development) on how to configure your development environment and submit a pull request.
### Translate
Check out the [Wiki page](https://github.com/mRemoteNG/mRemoteNG/wiki/How%20to%20Help%20Translating%20mRemoteNG) on how to help make mRemoteNG a polygot
Check out the [Wiki page](https://github.com/mRemoteNG/mRemoteNG/wiki/How%20to%20Help%20Translating%20mRemoteNG) on how to help make mRemoteNG a polyglot
[![Developed with ReSharper](https://raw.githubusercontent.com/mRemoteNG/mRemoteNG/develop/.github/icon_ReSharper.png)](https://www.jetbrains.com/resharper/)

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -3,7 +3,7 @@
License for use and distribution
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Copyright (C) 1999-2016 Igor Pavlov.
Copyright (C) 1999-2018 Igor Pavlov.
7-Zip Extra files are under the GNU LGPL license.

View File

@@ -1,6 +1,25 @@
7-Zip Extra history
-------------------
This file contains only information about changes related to that package exclusively.
The full history of changes is listed in history.txt in main 7-Zip program.
18.05 2018-04-30
-------------------------
- The speed for LZMA/LZMA2 compressing was increased
by 8% for fastest/fast compression levels and
by 3% for normal/maximum compression levels.
18.03 beta 2018-03-04
-------------------------
- The speed for single-thread LZMA/LZMA2 decoding
was increased by 30% in x64 version and by 3% in x86 version.
- 7-Zip now can use multi-threading for 7z/LZMA2 decoding,
if there are multiple independent data chunks in LZMA2 stream.
9.35 beta 2014-12-07
------------------------------
- SFX modules were moved to LZMA SDK package.

View File

@@ -1,9 +1,9 @@
7-Zip Extra 16.02
7-Zip Extra 18.05
-----------------
7-Zip Extra is package of extra modules of 7-Zip.
7-Zip Copyright (C) 1999-2016 Igor Pavlov.
7-Zip Copyright (C) 1999-2018 Igor Pavlov.
7-Zip is free software. Read License.txt for more information about license.

View File

@@ -1,106 +1,294 @@
$EncryptionKey = (Get-Credential -Message "Enter the encryption key you would like to use. This must match the encryption key used by the rest of the confCons file." -UserName "DontNeedUsername").Password
$PathToMrngFolder = "C:\Users\SparerD\Downloads\mRemoteNG-Portable-1.75.7012.16846"
#####################################
# Authors: David Sparer & Jack Denton
# Summary:
# This is intended to be a template for creating connections in bulk. This uses the serializers directly from the mRemoteNG binaries.
# You will still need to create the connection info objects, but the library will handle serialization. It is expected that you
# are familiar with PowerShell. If this is not the case, reach out to the mRemoteNG community for help.
# Usage:
# Replace or modify the examples that are shown toward the end of the script to create your own connection info objects.
#####################################
if ($PathToMrngFolder -eq "") {
Write-Error -Message 'You must set the $PathToMrngFolder variable in this script to the folder which contains mRemoteNG.exe'
foreach ($Path in 'HKLM:\SOFTWARE\WOW6432Node\mRemoteNG', 'HKLM:\SOFTWARE\mRemoteNG') {
Try {
$mRNGPath = (Get-ItemProperty -Path $Path -Name InstallDir -ErrorAction Stop).InstallDir
break
}
Catch {
continue
}
}
if (!$mRNGPath) {
Add-Type -AssemblyName System.Windows.Forms
$FolderBrowser = [System.Windows.Forms.FolderBrowserDialog]@{
Description = 'Please select the folder which contains mRemoteNG.exe'
ShowNewFolderButton = $false
}
$Response = $FolderBrowser.ShowDialog()
if ($Response.value__ -eq 1) {
$mRNGPath = $FolderBrowser.SelectedPath
}
elseif ($Response.value__ -eq 2) {
Write-Warning 'A folder containing mRemoteNG.exe has not been selected'
return
}
}
$null = [System.Reflection.Assembly]::LoadFile((Join-Path -Path $mRNGPath -ChildPath "mRemoteNG.exe"))
Add-Type -Path (Join-Path -Path $mRNGPath -ChildPath "BouncyCastle.Crypto.dll")
function ConvertTo-mRNGSerializedXml {
[CmdletBinding()]
Param (
[Parameter(Mandatory)]
[mRemoteNG.Connection.ConnectionInfo[]]
$Xml
)
function Get-ChildNodes {
Param ($Xml)
$Xml
if ($Xml -is [mRemoteNG.Container.ContainerInfo] -and $Xml.HasChildren()) {
foreach ($Node in $Xml.Children) {
Get-ChildNodes -Xml $Node
}
}
}
$AllNodes = Get-ChildNodes -Xml $Xml
if (
$AllNodes.Password -or
$AllNodes.RDGatewayPassword -or
$AllNodes.VNCProxyPassword
) {
$Password = Read-Host -Message 'If you have password protected your ConfCons.xml please enter the password here otherwise just press enter' -AsSecureString
}
else {
$Password = [securestring]::new()
}
$CryptoProvider = [mRemoteNG.Security.SymmetricEncryption.AeadCryptographyProvider]::new()
$SaveFilter = [mRemoteNG.Security.SaveFilter]::new()
$ConnectionNodeSerializer = [mRemoteNG.Config.Serializers.Xml.XmlConnectionNodeSerializer26]::new($CryptoProvider, $Password, $SaveFilter)
$XmlSerializer = [mRemoteNG.Config.Serializers.Xml.XmlConnectionsSerializer]::new($CryptoProvider, $ConnectionNodeSerializer)
$RootNode = [mRemoteNG.Tree.Root.RootNodeInfo]::new('Connection')
foreach ($Node in $Xml) {
$RootNode.AddChild($Node)
}
$XmlSerializer.Serialize($RootNode)
}
$assembly = [System.Reflection.Assembly]::LoadFile((Join-Path -Path $PathToMrngFolder -ChildPath "mRemoteNG.exe"))
$assembly = [System.Reflection.Assembly]::LoadFile((Join-Path -Path $PathToMrngFolder -ChildPath "BouncyCastle.Crypto.dll"))
function New-mRNGConnection {
[CmdletBinding(DefaultParameterSetName = 'Credential')]
Param (
[Parameter(Mandatory)]
[string]
$Name,
function New-mRemoteNGXmlSerializer {
[CmdletBinding()]
param (
[SecureString]
$EncryptionKey
[Parameter(Mandatory)]
[string]
$Hostname,
[Parameter(Mandatory)]
[mRemoteNG.Connection.Protocol.ProtocolType]
$Protocol,
[Parameter(ParameterSetName = 'Credential')]
[pscredential]
$Credential,
[Parameter(ParameterSetName = 'InheritCredential')]
[switch]
$InheritCredential,
[Parameter()]
[mRemoteNG.Container.ContainerInfo]
$ParentContainer,
[Parameter()]
[switch]
$PassThru
)
PROCESS {
$cryptoProvider = New-Object -TypeName mRemoteNG.Security.SymmetricEncryption.AeadCryptographyProvider
$saveFilter = New-Object -TypeName mRemoteNG.Security.SaveFilter -ArgumentList @($false)
$xmlSerializer = New-Object -TypeName mRemoteNG.Config.Serializers.XmlConnectionNodeSerializer -ArgumentList @($cryptoProvider, $encryptionKey, $saveFilter)
Write-Output $xmlSerializer
$Connection = [mRemoteNG.Connection.ConnectionInfo]@{
Name = $Name
Hostname = $Hostname
Protocol = $Protocol
}
if ($Credential) {
$Connection.Username = $Credential.GetNetworkCredential().UserName
$Connection.Domain = $Credential.GetNetworkCredential().Domain
$Connection.Password = $Credential.GetNetworkCredential().Password
}
if ($InheritCredential) {
$Connection.Inheritance.Username = $true
$Connection.Inheritance.Domain = $true
$Connection.Inheritance.Password = $true
}
if ($ParentContainer) {
$ParentContainer.AddChild($Connection)
if ($PSBoundParameters.ContainsKey('PassThru')) {
$Connection
}
}
else {
$Connection
}
}
function New-mRemoteNGConnectionInfo {
[CmdletBinding()]
param (
function New-mRNGContainer {
[CmdletBinding(DefaultParameterSetName = 'Credential')]
Param (
[Parameter(Mandatory)]
[string]
$Name,
[Parameter(ParameterSetName = 'Credential')]
[pscredential]
$Credential,
[Parameter(ParameterSetName = 'InheritCredential')]
[switch]
$InheritCredential,
[Parameter()]
[mRemoteNG.Container.ContainerInfo]
$ParentContainer
)
PROCESS {
$connectionInfo = New-Object -TypeName mRemoteNG.Connection.ConnectionInfo
Write-Output $connectionInfo
$Container = [mRemoteNG.Container.ContainerInfo]@{
Name = $Name
}
if ($Credential) {
$Container.Username = $Credential.GetNetworkCredential().UserName
$Container.Domain = $Credential.GetNetworkCredential().Domain
$Container.Password = $Credential.GetNetworkCredential().Password
}
if ($InheritCredential) {
$Container.Inheritance.Username = $true
$Container.Inheritance.Domain = $true
$Container.Inheritance.Password = $true
}
if ($ParentContainer) {
$ParentContainer.AddChild($Container)
}
$Container
}
function New-mRemoteNGContainerInfo {
function Export-mRNGXml {
[CmdletBinding()]
param (
[Parameter()]
[string]
$Path,
[Parameter()]
[string]
$SerializedXml
)
PROCESS {
$connectionInfo = New-Object -TypeName mRemoteNG.Container.ContainerInfo
Write-Output $connectionInfo
}
$FilePathProvider = [mRemoteNG.Config.DataProviders.FileDataProvider]::new($Path)
$filePathProvider.Save($SerializedXml)
}
# Setup the services needed to do serialization
$xmlSerializer = New-mRemoteNGXmlSerializer -EncryptionKey $EncryptionKey
#----------------------------------------------------------------
# Example 1: serialize many connections
# Example 1: serialize many connections, no containers
# Here you can define the number of connection info objects to create
# You can also provide a list of desired hostnames and iterate over those
$xml = ""
foreach($i in 1..5)
{
$connectionInfo = New-mRemoteNGConnectionInfo
# Set connection info properties
$connectionInfo.Name = "server-$i"
$connectionInfo.Hostname = "some-win-server-$i"
$connectionInfo.Protocol = [mRemoteNG.Connection.Protocol.ProtocolType]::RDP
$connectionInfo.Inheritance.Username = $true
$connectionInfo.Inheritance.Domain = $true
$connectionInfo.Inheritance.Password = $true
$serializedConnection = $xmlSerializer.SerializeConnectionInfo($connectionInfo).ToString()
$xml += $serializedConnection + [System.Environment]::NewLine
$Connections = foreach ($i in 1..5) {
# Create new connection
$Splat = @{
Name = 'Server-{0:D2}' -f $i
Hostname = 'Server-{0:D2}' -f $i
Protocol = 'RDP'
InheritCredential = $true
}
New-mRNGConnection @Splat
}
Write-Output $xml
# Serialize the connections
$SerializedXml = ConvertTo-mRNGSerializedXml -Xml $Connections
# Write the XML to a file ready to import into mRemoteNG
Export-mRNGXml -Path "$ENV:APPDATA\mRemoteNG\PowerShellGenerated.xml" -SerializedXml $SerializedXml
# Now open up mRemoteNG and press Ctrl+O and open up the exported XML file
#----------------------------------------------------------------
# Example 2: serialize a container which has connections
# You can also create containers and add connections to them, which will be nested correctly when serialized
$xml = ""
$container = New-mRemoteNGContainerInfo
$container.Name = "ProductionServers"
$serializedContainer = $xmlSerializer.SerializeConnectionInfo($container)
# You can also create containers and add connections and containers to them, which will be nested correctly when serialized
# If you specify the ParentContainer parameter for new connections then there will be no output unless the PassThru parameter is also used
foreach($i in 1..3)
{
$connectionInfo = New-mRemoteNGConnectionInfo
$ProdServerCreds = Get-Credential
$ProdServers = New-mRNGContainer -Name 'ProdServers' -Credential $ProdServerCreds
# Set connection info properties
$connectionInfo.Name = "server-$i"
$connectionInfo.Hostname = "some-linux-server-$i"
$connectionInfo.Protocol = [mRemoteNG.Connection.Protocol.ProtocolType]::SSH2
$connectionInfo.Inheritance.Username = $true
$connectionInfo.Inheritance.Domain = $true
$connectionInfo.Inheritance.Password = $true
# serialize the connection
$serializedConnection = $xmlSerializer.SerializeConnectionInfo($connectionInfo)
# add the connection to the container
$serializedContainer.Add($serializedConnection)
foreach ($i in 1..3) {
# Create new connection
$Splat = @{
Name = 'Server-{0:D2}' -f $i
Hostname = 'Server-{0:D2}' -f $i
Protocol = 'RDP'
InheritCredential = $true
ParentContainer = $ProdServers
}
New-mRNGConnection @Splat
}
# get the raw xml text
Write-Output $serializedContainer.ToString()
$ProdWebServers = New-mRNGContainer -Name 'WebServers' -ParentContainer $ProdServers -InheritCredential
foreach ($i in 1..3) {
# Create new connection
$Splat = @{
Name = 'WebServer-{0:D2}' -f $i
Hostname = 'WebServer-{0:D2}' -f $i
Protocol = 'SSH1'
InheritCredential = $true
ParentContainer = $ProdWebServers
}
New-mRNGConnection @Splat
}
$DevServers = New-mRNGContainer -Name 'DevServers'
foreach ($i in 1..3) {
# Create new connection
$Splat = @{
Name = 'DevServer-{0:D2}' -f $i
Hostname = 'DevServer-{0:D2}' -f $i
Protocol = 'RDP'
InheritCredential = $true
ParentContainer = $DevServers
PassThru = $true
}
# Specified the PassThru parameter in order to catch the connection and change a property
$Connection = New-mRNGConnection @Splat
$Connection.Resolution = 'FullScreen'
}
# Serialize the container
$SerializedXml = ConvertTo-mRNGSerializedXml -Xml $ProdServers, $DevServers
# Write the XML to a file ready to import into mRemoteNG
Export-mRNGXml -Path "$ENV:APPDATA\mRemoteNG\PowerShellGenerated.xml" -SerializedXml $SerializedXml
# Now open up mRemoteNG and press Ctrl+O and open up the exported XML file

View File

@@ -0,0 +1,73 @@
if([string]::IsNullOrEmpty($Env:APPVEYOR_BUILD_FOLDER)) {
Write-Output "NOT running via Appveyor - Exiting"
Exit
}
$appvDir = $Env:APPVEYOR_BUILD_FOLDER
Write-Output "Appveyor Build Dir: '$($appvDir)'"
$ConfigurationName = $Env:CONFIGURATION.Trim()
Write-Output "Config Name (tirmmed): '$($ConfigurationName)'"
$SIGCHECK="Tools\exes\sigcheck.exe"
$SEVENZIP="Tools\7zip\7za.exe"
if ($ConfigurationName -eq "Release Portable") {
Write-Output "Packaging Release Portable ZIP"
$version = & $SIGCHECK /accepteula -q -n "mRemoteV1\bin\$($ConfigurationName)\mRemoteNG.exe"
Write-Output "Version is $($version)"
$PortableZip="Release\mRemoteNG-Portable-$($version).zip"
Remove-Item -Recurse "mRemoteV1\bin\package" -ErrorAction SilentlyContinue | Out-Null
New-Item "mRemoteV1\bin\package" -ItemType "directory" | Out-Null
Copy-Item "mRemoteV1\Resources\PuTTYNG.exe" -Destination "mRemoteV1\bin\package"
Copy-Item "mRemoteV1\bin\$ConfigurationName\*" -Destination "mRemoteV1\bin\package" -Recurse -Force -Exclude *.pdb
Copy-Item "*.txt" -Destination "mRemoteV1\bin\package"
Write-Output "Creating portable ZIP file $($PortableZip)"
Remove-Item -Force $PortableZip -ErrorAction SilentlyContinue
& $SEVENZIP a -bt -bd -bb1 -mx=9 -tzip -y -r $PortableZip ".\mRemoteV1\bin\package\*.*"
}
else {
Write-Output "We will not zip anything - this isnt a portable release build."
}
Write-Output ""
Write-Output ""
if ($ConfigurationName -match "Release" -And $ConfigurationName -ne "Release Installer") {
Write-Output "Packaging debug symbols"
$version = & $SIGCHECK /accepteula -q -n "mRemoteV1\bin\$($ConfigurationName)\mRemoteNG.exe"
Write-Output "Version is $($version)"
if ($ConfigurationName -match "Portable") {
$zipFilePrefix = "mRemoteNG-Portable-symbols"
} else {
$zipFilePrefix = "mRemoteNG-symbols"
}
$outputZipPath="Release\$zipFilePrefix-$($version).zip"
Write-Output "Creating debug symbols ZIP file $($outputZipPath)"
Remove-Item -Force $outputZipPath -ErrorAction SilentlyContinue
$SymPath = (Join-Path -Path mRemoteV1\bin\$($ConfigurationName) -ChildPath "*.pdb")
if(Test-Path "$SymPath") {
& $SEVENZIP a -bt -bd -bb1 -mx=9 -tzip -y -r $outputZipPath "$SymPath"
} else {
Write-Output "No Debugging Symbols Found..."
}
}
else {
Write-Output "We will not package debug symbols for this configuration $($ConfigurationName)"
}
Write-Output ""

View File

@@ -0,0 +1,83 @@
if([string]::IsNullOrEmpty($Env:APPVEYOR_BUILD_FOLDER)) {
Write-Output "NOT running via Appveyor - Exiting"
Throw "NOT running via Appveyor - Exiting"
}
$appvDir = $Env:APPVEYOR_BUILD_FOLDER
$SIGCHECK="Tools\exes\sigcheck.exe"
$SEVENZIP="Tools\7zip\7za.exe"
Write-Output "Appveyor Build Dir: '$($appvDir)'"
Write-Output "Decrypt Cert"
& appveyor-tools\secure-file -decrypt "$($Env:cert_path).enc" -secret "$Env:cert_decrypt_pwd"
if(-Not (Test-Path $Env:cert_path)) {
Write-Output "decrypt cert does not exist..."
Throw "Could not decrypt cert"
}
Write-Output "Restoring NuGets"
& nuget restore
Write-Output "Build Release Installer"
& msbuild "$($appvDir)\mRemoteV1.sln" /nologo /t:Clean,Build /p:Configuration="Release Installer" /p:Platform=x86 /p:CertPath="$($Env:cert_path)" /p:CertPassword="$Env:cert_pwd" /m /verbosity:normal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
Write-Output "Packaging debug symbols"
$version = & $SIGCHECK /accepteula -q -n "mRemoteV1\bin\Release\mRemoteNG.exe"
Write-Output "Version is $($version)"
$zipFilePrefix = "mRemoteNG-symbols"
$outputZipPath="Release\$zipFilePrefix-$($version).zip"
Write-Output "Creating debug symbols ZIP file $($outputZipPath)"
Remove-Item -Force $outputZipPath -ErrorAction SilentlyContinue
$SymPath = (Join-Path -Path "mRemoteV1\bin\Release" -ChildPath "*.pdb")
if(Test-Path "$SymPath") {
& $SEVENZIP a -bt -bd -bb1 -mx=9 -tzip -y -r $outputZipPath "$SymPath"
} else {
Write-Output "No Debugging Symbols Found..."
}
Write-Output "Build Release Portable"
& msbuild "$($appvDir)\mRemoteV1.sln" /nologo /t:Clean,Build /p:Configuration="Release Portable" /p:Platform=x86 /p:CertPath="$($Env:cert_path)" /p:CertPassword="$Env:cert_pwd" /m /verbosity:normal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
Write-Output "Packaging Release Portable ZIP"
$version = & $SIGCHECK /accepteula -q -n "mRemoteV1\bin\Release Portable\mRemoteNG.exe"
Write-Output "Version is $($version)"
$zipFilePrefix = "mRemoteNG-Portable-symbols"
$outputZipPath="Release\$zipFilePrefix-$($version).zip"
Write-Output "Creating debug symbols ZIP file $($outputZipPath)"
Remove-Item -Force $outputZipPath -ErrorAction SilentlyContinue
$SymPath = (Join-Path -Path "mRemoteV1\bin\Release Portable" -ChildPath "*.pdb")
if(Test-Path "$SymPath") {
& $SEVENZIP a -bt -bd -bb1 -mx=9 -tzip -y -r $outputZipPath "$SymPath"
} else {
Write-Output "No Debugging Symbols Found..."
}
$PortableZip="Release\mRemoteNG-Portable-$($version).zip"
Remove-Item -Recurse "mRemoteV1\bin\package" -ErrorAction SilentlyContinue | Out-Null
New-Item "mRemoteV1\bin\package" -ItemType "directory" | Out-Null
Copy-Item "mRemoteV1\Resources\PuTTYNG.exe" -Destination "mRemoteV1\bin\package"
Copy-Item "mRemoteV1\bin\Release Portable\*" -Destination "mRemoteV1\bin\package" -Recurse -Force
Copy-Item "*.txt" -Destination "mRemoteV1\bin\package"
Write-Output "Creating portable ZIP file $($PortableZip)"
Remove-Item -Force $PortableZip -ErrorAction SilentlyContinue
& $SEVENZIP a -bt -bd -bb1 -mx=9 -tzip -y -r $PortableZip ".\mRemoteV1\bin\package\*.*"

Binary file not shown.

19
Tools/copy_tiles.ps1 Normal file
View File

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

View File

@@ -171,13 +171,27 @@ function Upload-GitHubReleaseAsset {
[string]
[Parameter(Mandatory=$true)]
# The OAuth2 token to use for authentication.
$AuthToken
$AuthToken,
[string]
# A short description label for the asset
$Label = ""
)
$UploadUri = $UploadUri -replace "(\{[\w,\?]*\})$"
$file = Get-Item -Path $FilePath
$files = Get-Item -Path $FilePath
$req_uploadZipAsset = Invoke-WebRequest -Uri "$($UploadUri)?name=$($file.Name)" -Method Post -Headers @{"Authorization"="token $AuthToken"} -ContentType $ContentType -InFile $file.FullName -ErrorAction Stop
$labelParam = ""
if ($Label -ne "") {
$labelParam = "&label=$Label"
}
# Get-Item could produce an array of files if a wildcard is provided. (C:\*.txt)
# Upload each matching item individually
foreach ($file in $files) {
Write-Output "Uploading asset to GitHub release: '$($file.FullName)'"
$req_uploadZipAsset = Invoke-WebRequest -Uri "$($UploadUri)?name=$($file.Name)$labelParam" -Method Post -Headers @{"Authorization"="token $AuthToken"} -ContentType $ContentType -InFile $file.FullName -ErrorAction Stop
}
}

View File

@@ -33,11 +33,12 @@ Format-Table -AutoSize -Wrap -InputObject @{
"TargetDir" = $TargetDir
"TargetFileName" = $TargetFileName
"ConfigurationName" = $ConfigurationName
"CertificatePath" = $CertificatePath
"ExcludeFromSigning" = $ExcludeFromSigning
}
& "$PSScriptRoot\sign_binaries.ps1" -TargetDir $TargetDir -CertificatePath $CertificatePath -CertificatePassword $CertificatePassword -ConfigurationName $ConfigurationName -Exclude $ExcludeFromSigning
& "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName -CertificatePath $CertificatePath
& "$PSScriptRoot\sign_binaries.ps1" -TargetDir $TargetDir -CertificatePath $CertificatePath -CertificatePassword $CertificatePassword -ConfigurationName $ConfigurationName -Exclude $ExcludeFromSigning -SolutionDir $SolutionDir
& "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName -CertificatePath $CertificatePath -SolutionDir $SolutionDir
& "$PSScriptRoot\rename_installer_with_version.ps1" -SolutionDir $SolutionDir
& "$PSScriptRoot\copy_release_installer.ps1" -SourcePath $TargetDir -DestinationDir (Join-Path -Path $SolutionDir -ChildPath "Release")

View File

@@ -33,6 +33,7 @@ Format-Table -AutoSize -Wrap -InputObject @{
"TargetDir" = $TargetDir
"TargetFileName" = $TargetFileName
"ConfigurationName" = $ConfigurationName
"CertificatePath" = $CertificatePath
"ExcludeFromSigning" = $ExcludeFromSigning
}
@@ -40,10 +41,12 @@ Format-Table -AutoSize -Wrap -InputObject @{
& "$PSScriptRoot\copy_puttyng.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir
& "$PSScriptRoot\copy_themes.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir
& "$PSScriptRoot\copy_tiles.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir
& "$PSScriptRoot\move_help_files.ps1" -TargetDir $TargetDir
& "$PSScriptRoot\set_LargeAddressAware.ps1" -TargetDir $TargetDir -TargetFileName $TargetFileName
& "$PSScriptRoot\verify_LargeAddressAware.ps1" -TargetDir $TargetDir -TargetFileName $TargetFileName
& "$PSScriptRoot\tidy_files_for_release.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName
& "$PSScriptRoot\sign_binaries.ps1" -TargetDir $TargetDir -CertificatePath $CertificatePath -CertificatePassword $CertificatePassword -ConfigurationName $ConfigurationName -Exclude $ExcludeFromSigning
& "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName -CertificatePath $CertificatePath
& "$PSScriptRoot\sign_binaries.ps1" -TargetDir $TargetDir -CertificatePath $CertificatePath -CertificatePassword $CertificatePassword -ConfigurationName $ConfigurationName -Exclude $ExcludeFromSigning -SolutionDir $SolutionDir
& "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName -CertificatePath $CertificatePath -SolutionDir $SolutionDir
& "$PSScriptRoot\zip_symbols.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -ConfigurationName $ConfigurationName
& "$PSScriptRoot\zip_portable_files.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -ConfigurationName $ConfigurationName

View File

@@ -43,13 +43,8 @@ param (
[string]
[Parameter(Mandatory=$true)]
# Path to the zip file to upload with the release
$ZipFilePath,
[string]
[Parameter(Mandatory=$true)]
#Path to the msi file to upload with the release
$MsiFilePath,
# Path to the folder which contains release assets to upload
$ReleaseFolderPath,
[string]
[Parameter(Mandatory=$true)]
@@ -70,7 +65,17 @@ if ($DescriptionIsBase64Encoded) {
. "$PSScriptRoot\github_functions.ps1"
$releaseFolderItems = Get-ChildItem -Path $ReleaseFolderPath
$mrngPortablePath = ($releaseFolderItems | ?{$_.Name -match "portable-[\d\.]+\.zip"}).FullName
$mrngNormalPath = ($releaseFolderItems | ?{$_.Name -match "installer-[\d\.]+\.msi"}).FullName
$mrngPortableSymbolsPath = ($releaseFolderItems | ?{$_.Name -match "mremoteng-portable-symbols-[\d\.]+\.zip"}).FullName
$mrngNormalSymbolsPath = ($releaseFolderItems | ?{$_.Name -match "mremoteng-symbols-[\d\.]+\.zip"}).FullName
$release = Publish-GitHubRelease -Owner $Owner -Repository $Repository -ReleaseTitle $ReleaseTitle -TagName $TagName -TargetCommitish $TargetCommitish -Description $Description -IsDraft ([bool]::Parse($IsDraft)) -IsPrerelease ([bool]::Parse($IsPrerelease)) -AuthToken $AuthToken
$zipUpload = Upload-GitHubReleaseAsset -UploadUri $release.upload_url -FilePath $ZipFilePath -ContentType "application/zip" -AuthToken $AuthToken
$msiUpload = Upload-GitHubReleaseAsset -UploadUri $release.upload_url -FilePath $MsiFilePath -ContentType "application/octet-stream" -AuthToken $AuthToken
$zipUpload = Upload-GitHubReleaseAsset -UploadUri $release.upload_url -FilePath $mrngPortablePath -ContentType "application/zip" -AuthToken $AuthToken -Label "Portable Edition (zip)"
$msiUpload = Upload-GitHubReleaseAsset -UploadUri $release.upload_url -FilePath $mrngNormalPath -ContentType "application/octet-stream" -AuthToken $AuthToken -Label "Normal Edition (msi)"
$portableEditionSymbols = Upload-GitHubReleaseAsset -UploadUri $release.upload_url -FilePath $mrngPortableSymbolsPath -ContentType "application/zip" -AuthToken $AuthToken -Label "Portable Edition Debug Symbols"
$normalEditionSymbols = Upload-GitHubReleaseAsset -UploadUri $release.upload_url -FilePath $mrngNormalSymbolsPath -ContentType "application/zip" -AuthToken $AuthToken -Label "Normal Edition Debug Symbols"
Write-Output (Get-GitHubRelease -Owner $Owner -Repository $Repository -ReleaseId $release.id -AuthToken $AuthToken)

View File

@@ -12,12 +12,16 @@ param (
$Exclude,
[string]
[AllowEmptyString()]
# The code signing certificate to use when signing the files.
$CertificatePath,
[string]
# Password to unlock the code signing certificate.
$CertificatePassword
$CertificatePassword,
[string]
$SolutionDir
)
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
@@ -26,51 +30,59 @@ Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
$timeserver = "http://timestamp.verisign.com/scripts/timstamp.dll"
if ($ConfigurationName -notmatch "Release") {
Write-Output "This is not a release build - we won't sign files."
return
}
# validate release versions and if the certificate value was passed
if ($ConfigurationName -match "Release" -And ($CertificatePath)) {
if ($CertificatePath -eq "" -or !(Test-Path -Path $CertificatePath -PathType Leaf)) {
Write-Output "Certificate is not present - we won't sign files."
return
}
if(-Not ([string]::IsNullOrEmpty($Env:APPVEYOR_BUILD_FOLDER)) ) {
$CertificatePath = Join-Path -Path $SolutionDir -ChildPath $CertificatePath
}
if ($CertificatePassword -eq "") {
Write-Output "No certificate password was provided - we won't sign files."
return
}
# make sure the cert is actually available
if ($CertificatePath -eq "" -or !(Test-Path -Path $CertificatePath -PathType Leaf))
{
Write-Output "Certificate is not present - we won't sign files."
return
}
try {
$certKeyStore = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::MachineKeySet
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertificatePath, $CertificatePassword, $certKeyStore) -ErrorAction Stop
} catch {
Write-Output "Error loading certificate file - we won't sign files."
Write-Output $Error[0]
return
}
if ($CertificatePassword -eq "") {
Write-Output "No certificate password was provided - we won't sign files."
return
}
# Sign MSI if we are building a release version and the certificate is available
Write-Output "Signing Binaries"
Write-Output "Getting files from path: $TargetDir"
$signableFiles = Get-ChildItem -Path $TargetDir -Recurse | ?{$_.Extension -match "dll|exe|msi"} | ?{$Exclude -notcontains $_.Name}
try {
$certKeyStore = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::MachineKeySet
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertificatePath, $CertificatePassword, $certKeyStore) -ErrorAction Stop
} catch {
Write-Output "Error loading certificate file - we won't sign files."
Write-Output $Error[0]
return
}
$excluded_files = Get-ChildItem -Path $TargetDir -Recurse | ?{$_.Extension -match "dll|exe|msi"} | ?{$Exclude -contains $_.Name}
$excluded_files | ForEach-Object `
-Begin { Write-Output "The following files were excluded from signing due to being on the exclusion list:" } `
-Process { Write-Output "-- $($_.FullName)" }
# Sign MSI if we are building a release version and the certificate is available
Write-Output "Signing Binaries"
Write-Output "Getting files from path: $TargetDir"
$signableFiles = Get-ChildItem -Path $TargetDir -Recurse | ?{$_.Extension -match "dll|exe|msi"} | ?{$Exclude -notcontains $_.Name}
Write-Output "Signable files count: $($signableFiles.Count)"
$excluded_files = Get-ChildItem -Path $TargetDir -Recurse | ?{$_.Extension -match "dll|exe|msi"} | ?{$Exclude -contains $_.Name}
$excluded_files | ForEach-Object `
-Begin { Write-Output "The following files were excluded from signing due to being on the exclusion list:" } `
-Process { Write-Output "-- $($_.FullName)" }
Write-Output "Signable files count: $($signableFiles.Count)"
foreach ($file in $signableFiles) {
Set-AuthenticodeSignature -Certificate $cert -TimestampServer $timeserver -IncludeChain all -FilePath $file.FullName
}
foreach ($file in $signableFiles) {
Set-AuthenticodeSignature -Certificate $cert -TimestampServer $timeserver -IncludeChain all -FilePath $file.FullName
}
# Release certificate
if ($cert -ne $null) {
$cert.Dispose()
# Release certificate
if ($cert -ne $null) {
$cert.Dispose()
}
} else {
Write-Output "This is not a release build or CertificatePath wasn't provided - we won't sign files."
Write-Output "Config: $($ConfigurationName)`tCertPath: $($CertificatePath)"
}
Write-Output ""

View File

@@ -15,14 +15,15 @@ if ($ConfigurationName -match "Release") {
Write-Output "Removing unnecessary files from Release versions"
Remove-Item -Path (Join-Path -Path $TargetDir -ChildPath "app.publish") -Recurse -Force
$filesToDelete = Get-ChildItem -Path $TargetDir -Recurse -Include @(
"*.pdb",
"*.publish",
"*.xml",
"*.backup",
"*.log",
"*vshost*",
"*.tmp"
)
) -Exclude @(
"mRemoteNG.VisualElementsManifest.xml"
)
Remove-Item -Path $filesToDelete.FullName
Write-Output $filesToDelete.FullName
}

View File

@@ -9,15 +9,25 @@ param (
[string]
[Parameter(Mandatory=$true)]
[AllowEmptyString()]
# The code signing certificate to use when signing the files.
$CertificatePath
$CertificatePath,
[string]
[Parameter(Mandatory=$true)]
$SolutionDir
)
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
# validate release versions and if the certificate is available
if ($ConfigurationName -match "Release") {
# validate release versions and if the certificate value was passed
if ($ConfigurationName -match "Release" -And ($CertificatePath)) {
if(-Not ([string]::IsNullOrEmpty($Env:APPVEYOR_BUILD_FOLDER)) ) {
$CertificatePath = Join-Path -Path $SolutionDir -ChildPath $CertificatePath
}
# make sure the cert is actually available
if ($CertificatePath -eq "" -or !(Test-Path -Path $CertificatePath -PathType Leaf))
{
Write-Output "Certificate is not present - files likely not signed - we won't verify file signatures."
@@ -42,7 +52,8 @@ if ($ConfigurationName -match "Release") {
Write-Output "All files have valid signatures."
}
} else {
Write-Output "This is not a release build - we won't verify file signatures."
Write-Output "This is not a release build or CertificatePath wasn't provided - we won't verify file signatures."
Write-Output "Config: $($ConfigurationName)`tCertPath: $($CertificatePath)"
}
Write-Output ""

View File

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

56
Tools/zip_symbols.ps1 Normal file
View File

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

View File

@@ -1,20 +1,46 @@
version: 1.0.{build}
version: 1.76.{build}
pull_requests:
do_not_increment_build_number: true
skip_tags: true
skip_branch_with_pr: true
image: Visual Studio 2017
configuration:
- Release
- Release Portable
- Release Installer
platform: x86
shallow_clone: true
clone_depth: 1
install:
- ps: C:\projects\mremoteng\mRemoteV1\Resources\CitrixReceiver.exe DONOTSTARTCC=1 ENABLE_SSON="No" /silent | out-null
- ps: >-
date
mRemoteV1\Resources\CitrixReceiver.exe ENABLE_SSON="No" /silent /noreboot /EnableCEIP=false /AutoUpdateCheck=disabled /EnableTracing=false | out-null
date
before_build:
- cmd: nuget restore
- cmd: >-
echo %TIME%
nuget restore
echo %TIME%
build:
project: mRemoteV1.sln
parallel: true
verbosity: normal
after_build:
- ps: "if([string]::IsNullOrEmpty($Env:APPVEYOR_BUILD_FOLDER)) {\n Write-Output \"NOT running via Appveyor - Exiting\"\n Exit\n}\n\n$appvDir = $Env:APPVEYOR_BUILD_FOLDER\n\nWrite-Output \"Appveyor Build Dir: '$($appvDir)'\"\n$ConfigurationName = $Env:CONFIGURATION.Trim()\nWrite-Output \"Config Name (tirmmed): '$($ConfigurationName)'\"\n\n\n$SIGCHECK=\"Tools\\exes\\sigcheck.exe\"\n$SEVENZIP=\"Tools\\7zip\\7za.exe\"\n\nif ($ConfigurationName -eq \"Release Portable\") {\n Write-Output \"Packaging Release Portable ZIP\"\n \n $version = & $SIGCHECK /accepteula -q -n \"mRemoteV1\\bin\\$($ConfigurationName)\\mRemoteNG.exe\"\n\n Write-Output \"Version is $($version)\"\n\n $PortableZip=\"Release\\mRemoteNG-Portable-$($version).zip\"\n\n Remove-Item -Recurse \"mRemoteV1\\bin\\package\" -ErrorAction SilentlyContinue | Out-Null\n New-Item \"mRemoteV1\\bin\\package\" -ItemType \"directory\" | Out-Null\n \n Copy-Item \"mRemoteV1\\Resources\\PuTTYNG.exe\" -Destination \"mRemoteV1\\bin\\package\"\n\n Copy-Item \"mRemoteV1\\bin\\$ConfigurationName\\*\" -Destination \"mRemoteV1\\bin\\package\" -Recurse -Force -Exclude *.pdb\n Copy-Item \"*.txt\" -Destination \"mRemoteV1\\bin\\package\"\n\n Write-Output \"Creating portable ZIP file $($PortableZip)\"\n Remove-Item -Force $PortableZip -ErrorAction SilentlyContinue\n & $SEVENZIP a -bt -bd -bb1 -mx=9 -tzip -y -r $PortableZip \".\\mRemoteV1\\bin\\package\\*.*\"\n}\nelse {\n Write-Output \"We will not zip anything - this isnt a portable release build.\"\n}\n\nWrite-Output \"\"\nWrite-Output \"\"\n\nif ($ConfigurationName -match \"Release\" -And $ConfigurationName -ne \"Release Installer\") {\n Write-Output \"Packaging debug symbols\"\n \n $version = & $SIGCHECK /accepteula -q -n \"mRemoteV1\\bin\\$($ConfigurationName)\\mRemoteNG.exe\"\n\n Write-Output \"Version is $($version)\"\n\n if ($ConfigurationName -match \"Portable\") {\n $zipFilePrefix = \"mRemoteNG-Portable-symbols\"\n } else {\n $zipFilePrefix = \"mRemoteNG-symbols\"\n }\n\n $outputZipPath=\"Release\\$zipFilePrefix-$($version).zip\"\n\n Write-Output \"Creating debug symbols ZIP file $($outputZipPath)\"\n Remove-Item -Force $outputZipPath -ErrorAction SilentlyContinue\n $SymPath = (Join-Path -Path mRemoteV1\\bin\\$($ConfigurationName) -ChildPath \"*.pdb\")\n if(Test-Path \"$SymPath\") {\n & $SEVENZIP a -bt -bd -bb1 -mx=9 -tzip -y -r $outputZipPath \"$SymPath\"\n } else {\n Write-Output \"No Debugging Symbols Found...\"\n }\n \n}\nelse {\n Write-Output \"We will not package debug symbols for this configuration $($ConfigurationName)\"\n}\n\nWrite-Output \"\""
test:
assemblies:
only:
- mRemoteNGTests\bin\$(configuration)\mRemoteNGTests.dll
- mRemoteNGTests\bin\$(configuration)\mRemoteNGTests.dll
artifacts:
- path: Release\*.msi
name: mRemoteNG-installer.msi
- path: Release\mRemoteNG-Portable-1.*.zip
name: mRemoteNG-portable.zip
- path: Release\mRemoteNG-Portable-symbols*.zip
name: mRemoteNG-Portable-symbols.zip
- path: Release\mRemoteNG-symbols*.zip
name: mRemoteNG-symbols.zip

View File

@@ -7,7 +7,7 @@
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="WeifenLuo.WinFormsUI.Docking" publicKeyToken="5cded1a1a0a7b481" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.16.0.0" newVersion="2.16.0.0" />
<bindingRedirect oldVersion="0.0.0.0-3.0.6.0" newVersion="3.0.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\NUnit.3.11.0\build\NUnit.props" Condition="Exists('..\packages\NUnit.3.11.0\build\NUnit.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -12,6 +13,8 @@
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -34,8 +37,8 @@
<Reference Include="Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="nunit.framework, Version=3.9.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll</HintPath>
<Reference Include="nunit.framework, Version=3.11.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.11.0\lib\net45\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
@@ -89,6 +92,12 @@
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\NUnit.3.11.0\build\NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit.3.11.0\build\NUnit.props'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">

View File

@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="10.0.3" targetFramework="net46" />
<package id="NUnit" version="3.9.0" targetFramework="net46" />
<package id="NUnit.Console" version="3.7.0" targetFramework="net46" />
<package id="NUnit.ConsoleRunner" version="3.7.0" targetFramework="net46" />
<package id="NUnit" version="3.11.0" targetFramework="net46" />
<package id="NUnit.Console" version="3.9.0" targetFramework="net46" />
<package id="NUnit.ConsoleRunner" version="3.9.0" targetFramework="net46" />
<package id="NUnit.Extension.NUnitProjectLoader" version="3.6.0" targetFramework="net46" />
<package id="NUnit.Extension.NUnitV2Driver" version="3.7.0" targetFramework="net46" />
<package id="NUnit.Extension.NUnitV2ResultWriter" version="3.6.0" targetFramework="net46" />
<package id="NUnit.Extension.TeamCityEventListener" version="1.0.3" targetFramework="net46" />
<package id="NUnit.Extension.VSProjectLoader" version="3.7.0" targetFramework="net46" />
<package id="NUnit.Runners" version="3.7.0" targetFramework="net46" />
<package id="NUnit.Extension.TeamCityEventListener" version="1.0.5" targetFramework="net46" />
<package id="NUnit.Extension.VSProjectLoader" version="3.8.0" targetFramework="net46" />
<package id="NUnit.Runners" version="3.9.0" targetFramework="net46" />
<package id="SpecFlow" version="2.2.1" targetFramework="net46" />
<package id="SpecFlow.NUnit" version="2.2.1" targetFramework="net46" />
<package id="SpecFlow.NUnit.Runners" version="2.2.1" targetFramework="net46" />

View File

@@ -0,0 +1,47 @@
using System.IO;
using mRemoteNG.App;
using mRemoteNG.Config.Putty;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNGTests.Properties;
using mRemoteNGTests.TestHelpers;
using NUnit.Framework;
namespace mRemoteNGTests.App
{
public class ImportTests
{
[Test]
public void ErrorHandlerCalledWhenUnsupportedFileExtensionFound()
{
using (FileTestHelpers.DisposableTempFile(out var file, ".blah"))
{
var conService = new ConnectionsService(PuttySessionsManager.Instance);
var container = new ContainerInfo();
var exceptionOccurred = false;
Import.HeadlessFileImport(new []{file}, container, conService, s => exceptionOccurred = true);
Assert.That(exceptionOccurred);
}
}
[Test]
public void AnErrorInOneFileDoNotPreventOtherFilesFromProcessing()
{
using (FileTestHelpers.DisposableTempFile(out var badFile, ".blah"))
using (FileTestHelpers.DisposableTempFile(out var rdpFile, ".rdp"))
{
File.AppendAllText(rdpFile, Resources.test_remotedesktopconnection_rdp);
var conService = new ConnectionsService(PuttySessionsManager.Instance);
var container = new ContainerInfo();
var exceptionCount = 0;
Import.HeadlessFileImport(new[] { badFile, rdpFile }, container, conService, s => exceptionCount++);
Assert.That(exceptionCount, Is.EqualTo(1));
Assert.That(container.Children, Has.One.Items);
}
}
}
}

View File

@@ -1,9 +1,4 @@
using System;
using System.Linq;
using System.Security;
using System.Xml.Linq;
using mRemoteNG.Config;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Connection;
using mRemoteNG.Container;
@@ -11,6 +6,10 @@ using mRemoteNG.Security;
using mRemoteNG.Security.Factories;
using mRemoteNG.Tree.Root;
using NUnit.Framework;
using System;
using System.Linq;
using System.Security;
using System.Xml.Linq;
namespace mRemoteNGTests.Config
@@ -122,7 +121,7 @@ namespace mRemoteNGTests.Config
{
var rootNode = new RootNodeInfo(RootNodeType.Connection) {PasswordString = _key.ConvertToUnsecureString()};
rootNode.AddChild(connectionInfo);
var nodeSerializer = new XmlConnectionNodeSerializer26(_cryptographyProvider, _key, new SaveFilter());
var nodeSerializer = new XmlConnectionNodeSerializer27(_cryptographyProvider, _key, new SaveFilter());
var serializer = new XmlConnectionsSerializer(_cryptographyProvider, nodeSerializer);
var serializedData = serializer.Serialize(rootNode);
return XDocument.Parse(serializedData);

View File

@@ -19,20 +19,20 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Csv
public class CsvConnectionsDeserializerMremotengFormatTests
{
private CsvConnectionsDeserializerMremotengFormat _deserializer;
private ICredentialRepositoryList _credentialRepositoryList;
private CsvConnectionsSerializerMremotengFormat _serializer;
[SetUp]
public void Setup()
{
_deserializer = new CsvConnectionsDeserializerMremotengFormat();
_credentialRepositoryList = Substitute.For<ICredentialRepositoryList>();
var credentialRepositoryList = Substitute.For<ICredentialRepositoryList>();
_serializer = new CsvConnectionsSerializerMremotengFormat(new SaveFilter(), credentialRepositoryList);
}
[TestCaseSource(typeof(DeserializationTestSource), nameof(DeserializationTestSource.ConnectionPropertyTestCases))]
public object ConnectionPropertiesDeserializedCorrectly(string propertyToCheck)
{
var serializer = new CsvConnectionsSerializerMremotengFormat(new SaveFilter(), _credentialRepositoryList);
var csv = serializer.Serialize(GetTestConnection());
var csv = _serializer.Serialize(GetTestConnection());
var deserializedConnections = _deserializer.Deserialize(csv);
var connection = deserializedConnections.GetRecursiveChildList().FirstOrDefault();
var propertyValue = typeof(ConnectionInfo).GetProperty(propertyToCheck)?.GetValue(connection);
@@ -42,10 +42,10 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Csv
[TestCaseSource(typeof(DeserializationTestSource), nameof(DeserializationTestSource.InheritanceTestCases))]
public object InheritancePropertiesDeserializedCorrectly(string propertyToCheck)
{
var serializer = new CsvConnectionsSerializerMremotengFormat(new SaveFilter(), _credentialRepositoryList);
var csv = serializer.Serialize(GetTestConnectionWithAllInherited());
var csv = _serializer.Serialize(GetTestConnectionWithAllInherited());
var deserializedConnections = _deserializer.Deserialize(csv);
var connection = deserializedConnections.GetRecursiveChildList().FirstOrDefault();
connection?.RemoveParent();
var propertyValue = typeof(ConnectionInfoInheritance).GetProperty(propertyToCheck)?.GetValue(connection?.Inheritance);
return propertyValue;
}
@@ -58,8 +58,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Csv
// | |- Con1
// |- Con2
var treeModel = new ConnectionTreeModelBuilder().Build();
var serializer = new CsvConnectionsSerializerMremotengFormat(new SaveFilter(), _credentialRepositoryList);
var csv = serializer.Serialize(treeModel);
var csv = _serializer.Serialize(treeModel);
var deserializedConnections = _deserializer.Deserialize(csv);
var con1 = deserializedConnections.GetRecursiveChildList().First(info => info.Name == "Con1");
var folder1 = deserializedConnections.GetRecursiveChildList().First(info => info.Name == "folder1");
@@ -84,6 +83,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Csv
PostExtApp = "SomePostExtApp",
MacAddress = "SomeMacAddress",
UserField = "SomeUserField",
Favorite = true,
ExtApp = "SomeExtApp",
VNCProxyUsername = "SomeVNCProxyUsername",
VNCProxyPassword = "SomeVNCProxyPassword",

View File

@@ -1,17 +1,16 @@
using System;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Connection;
using mRemoteNG.Security;
using mRemoteNG.Security.SymmetricEncryption;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using NUnit.Framework;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Xml;
using System.Xml.Schema;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Security;
using mRemoteNG.Security.SymmetricEncryption;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNGTests.TestHelpers;
using NUnit.Framework;
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
{
@@ -25,9 +24,13 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
[SetUp]
public void Setup()
{
_connectionTreeModel = new ConnectionTreeModelBuilder().Build();
_connectionTreeModel = new ConnectionTreeModel();
var root = new RootNodeInfo(RootNodeType.Connection);
root.AddChild(new ConnectionInfo());
_connectionTreeModel.AddRootNode(root);
_cryptographyProvider = new AeadCryptographyProvider();
var connectionNodeSerializer = new XmlConnectionNodeSerializer26(
var connectionNodeSerializer = new XmlConnectionNodeSerializer27(
_cryptographyProvider,
_connectionTreeModel.RootNodes.OfType<RootNodeInfo>().First().PasswordString.ConvertToSecureString(),
new SaveFilter());
@@ -47,7 +50,8 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
var sb = new StringBuilder();
var xml = _serializer.Serialize(_connectionTreeModel);
var schemaFile = GetTargetPath("mremoteng_confcons_v2_6.xsd");
var schemaFileName = $"mremoteng_confcons_v{_serializer.Version.Major}_{_serializer.Version.Minor}.xsd";
var schemaFile = GetTargetPath(schemaFileName);
_xmlReaderSettings.Schemas.Add("http://mremoteng.org", schemaFile);
_xmlReaderSettings.ValidationEventHandler += (sender, args) =>
{

View File

@@ -1,7 +1,6 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Connection;
using mRemoteNG.Container;
@@ -19,7 +18,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
public void Setup(string confCons, string password)
{
_xmlConnectionsDeserializer = new XmlConnectionsDeserializer(password.ConvertToSecureString);
_xmlConnectionsDeserializer = new XmlConnectionsDeserializer(() => password.ConvertToSecureString());
_connectionTreeModel = _xmlConnectionsDeserializer.Deserialize(confCons);
}

View File

@@ -1,7 +1,4 @@
using System.Linq;
using System.Xml.XPath;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Security;
@@ -9,10 +6,12 @@ using mRemoteNG.Security.Factories;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using NUnit.Framework;
using System.Linq;
using System.Xml.XPath;
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
{
public class XmlConnectionsDocumentCompilerTests
public class XmlConnectionsDocumentCompilerTests
{
private XmlConnectionsDocumentCompiler _documentCompiler;
private ConnectionTreeModel _connectionTreeModel;
@@ -31,7 +30,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
{
_connectionTreeModel = SetupConnectionTreeModel();
_cryptographyProvider = new CryptoProviderFactory(BlockCipherEngines.AES, BlockCipherModes.GCM).Build();
var connectionNodeSerializer = new XmlConnectionNodeSerializer26(
var connectionNodeSerializer = new XmlConnectionNodeSerializer27(
_cryptographyProvider,
_connectionTreeModel.RootNodes.OfType<RootNodeInfo>().First().PasswordString.ConvertToSecureString(),
new SaveFilter());

View File

@@ -1,7 +1,4 @@
using System.Linq;
using System.Xml.Linq;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Security;
@@ -9,10 +6,12 @@ using mRemoteNG.Security.Factories;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using NUnit.Framework;
using System.Linq;
using System.Xml.Linq;
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
{
public class XmlConnectionsDocumentEncryptorTests
public class XmlConnectionsDocumentEncryptorTests
{
private XmlConnectionsDocumentEncryptor _documentEncryptor;
private XDocument _originalDocument;
@@ -22,7 +21,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
{
var connectionTreeModel = SetupConnectionTreeModel();
var cryptoProvider = new CryptoProviderFactory(BlockCipherEngines.AES, BlockCipherModes.GCM).Build();
var connectionNodeSerializer = new XmlConnectionNodeSerializer26(
var connectionNodeSerializer = new XmlConnectionNodeSerializer27(
cryptoProvider,
connectionTreeModel.RootNodes.OfType<RootNodeInfo>().First().PasswordString.ConvertToSecureString(),
new SaveFilter());

View File

@@ -1,8 +1,4 @@
using System.Linq;
using System.Xml;
using System.Xml.Linq;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Security;
@@ -10,10 +6,13 @@ using mRemoteNG.Security.SymmetricEncryption;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using NUnit.Framework;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
{
public class XmlConnectionsSerializerTests
public class XmlConnectionsSerializerTests
{
private XmlConnectionsSerializer _serializer;
private ConnectionTreeModel _connectionTreeModel;
@@ -25,7 +24,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
{
_connectionTreeModel = SetupConnectionTreeModel();
_cryptographyProvider = new AeadCryptographyProvider();
var connectionNodeSerializer = new XmlConnectionNodeSerializer26(
var connectionNodeSerializer = new XmlConnectionNodeSerializer27(
_cryptographyProvider,
_connectionTreeModel.RootNodes.OfType<RootNodeInfo>().First().PasswordString.ConvertToSecureString(),
new SaveFilter());
@@ -59,7 +58,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
[TestCase("InheritAutomaticResize", "false")]
public void SerializerRespectsSaveFilterSettings(string attributeName, string expectedValue)
{
var connectionNodeSerializer = new XmlConnectionNodeSerializer26(
var connectionNodeSerializer = new XmlConnectionNodeSerializer27(
_cryptographyProvider,
_connectionTreeModel.RootNodes.OfType<RootNodeInfo>().First().PasswordString.ConvertToSecureString(),
new SaveFilter(true));

View File

@@ -1,7 +1,6 @@
using System;
using System.Collections;
using System.Xml.Linq;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Security;
using mRemoteNG.Security.Factories;
@@ -11,11 +10,12 @@ using NUnit.Framework;
namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
{
public class XmlRootNodeSerializerTests
public class XmlRootNodeSerializerTests
{
private XmlRootNodeSerializer _rootNodeSerializer;
private ICryptographyProvider _cryptographyProvider;
private RootNodeInfo _rootNodeInfo;
private Version _version;
[SetUp]
public void Setup()
@@ -23,19 +23,21 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
_rootNodeSerializer = new XmlRootNodeSerializer();
_cryptographyProvider = new AeadCryptographyProvider();
_rootNodeInfo = new RootNodeInfo(RootNodeType.Connection);
_version = new Version(99, 1);
}
[Test]
public void RootElementNamedConnections()
{
var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, _cryptographyProvider);
var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, _cryptographyProvider, _version);
Assert.That(element.Name.LocalName, Is.EqualTo("Connections"));
}
[Test]
[SetUICulture("en-US")]
public void RootNodeInfoNameSerialized()
{
var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, _cryptographyProvider);
var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, _cryptographyProvider, _version);
var attributeValue = element.Attribute(XName.Get("Name"))?.Value;
Assert.That(attributeValue, Is.EqualTo("Connections"));
}
@@ -44,7 +46,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
public void EncryptionEngineSerialized(BlockCipherEngines engine, BlockCipherModes mode)
{
var cryptoProvider = new CryptoProviderFactory(engine, mode).Build();
var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, cryptoProvider);
var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, cryptoProvider, _version);
var attributeValue = element.Attribute(XName.Get("EncryptionEngine"))?.Value;
Assert.That(attributeValue, Is.EqualTo(engine.ToString()));
}
@@ -53,7 +55,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
public void EncryptionModeSerialized(BlockCipherEngines engine, BlockCipherModes mode)
{
var cryptoProvider = new CryptoProviderFactory(engine, mode).Build();
var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, cryptoProvider);
var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, cryptoProvider, _version);
var attributeValue = element.Attribute(XName.Get("BlockCipherMode"))?.Value;
Assert.That(attributeValue, Is.EqualTo(mode.ToString()));
}
@@ -65,7 +67,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
public void KdfIterationsSerialized(int iterations)
{
_cryptographyProvider.KeyDerivationIterations = iterations;
var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, _cryptographyProvider);
var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, _cryptographyProvider, _version);
var attributeValue = element.Attribute(XName.Get("KdfIterations"))?.Value;
Assert.That(attributeValue, Is.EqualTo(iterations.ToString()));
}
@@ -74,7 +76,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
[TestCase(false)]
public void FullFileEncryptionFlagSerialized(bool fullFileEncryption)
{
var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, _cryptographyProvider, fullFileEncryption);
var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, _cryptographyProvider, _version, fullFileEncryption);
var attributeValue = element.Attribute(XName.Get("FullFileEncryption"))?.Value;
Assert.That(bool.Parse(attributeValue), Is.EqualTo(fullFileEncryption));
}
@@ -86,7 +88,7 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
public void ProtectedStringSerialized(string customPassword, string expectedPlainText)
{
_rootNodeInfo.PasswordString = customPassword;
var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, _cryptographyProvider);
var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, _cryptographyProvider, _version);
var attributeValue = element.Attribute(XName.Get("Protected"))?.Value;
var attributeValuePlainText = _cryptographyProvider.Decrypt(attributeValue, _rootNodeInfo.PasswordString.ConvertToSecureString());
Assert.That(attributeValuePlainText, Is.EqualTo(expectedPlainText));
@@ -95,10 +97,10 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Xml
[Test]
public void ConfVersionSerialized()
{
var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, _cryptographyProvider);
var element = _rootNodeSerializer.SerializeRootNodeInfo(_rootNodeInfo, _cryptographyProvider, _version);
var attributeValue = element.Attribute(XName.Get("ConfVersion"))?.Value ?? "";
var versionAsNumber = double.Parse(attributeValue);
Assert.That(versionAsNumber, Is.GreaterThan(0));
var confVersion = Version.Parse(attributeValue);
Assert.That(confVersion, Is.EqualTo(_version));
}
private class TestCaseSources

View File

@@ -1,9 +1,10 @@
using System.Linq;
using System.Xml.Linq;
using mRemoteNG.Config.Serializers.CredentialSerializer;
using mRemoteNG.Config.Serializers.CredentialSerializer;
using mRemoteNG.Credential;
using mRemoteNG.Security;
using NUnit.Framework;
using System;
using System.Linq;
using System.Xml.Linq;
namespace mRemoteNGTests.Config.Serializers.CredentialSerializers
{
@@ -41,7 +42,8 @@ namespace mRemoteNGTests.Config.Serializers.CredentialSerializers
{
var serialized = _serializer.Serialize(new[] { _cred1 });
var xdoc = XDocument.Parse(serialized);
Assert.That(xdoc.Root?.Attribute("SchemaVersion")?.Value, Is.EqualTo(_serializer.SchemaVersion));
var version = Version.Parse(xdoc.Root?.Attribute("SchemaVersion")?.Value ?? "");
Assert.That(version, Is.EqualTo(_serializer.Version));
}
}
}

View File

@@ -1,10 +1,12 @@
using System.Data;
using System.Linq;
using mRemoteNG.Config.Serializers;
using System.Security;
using mRemoteNG.Config.Serializers.MsSql;
using mRemoteNG.Connection;
using mRemoteNG.Security;
using mRemoteNG.Security.SymmetricEncryption;
using mRemoteNG.Tree;
using mRemoteNGTests.TestHelpers;
using NSubstitute;
using NUnit.Framework;
namespace mRemoteNGTests.Config.Serializers
@@ -12,30 +14,37 @@ namespace mRemoteNGTests.Config.Serializers
public class DataTableDeserializerTests
{
private DataTableDeserializer _deserializer;
private ICryptographyProvider _cryptographyProvider;
[SetUp]
public void Setup()
{
_cryptographyProvider = new LegacyRijndaelCryptographyProvider();
}
[Test]
public void WeCanDeserializeATree()
{
var model = CreateConnectionTreeModel();
var dataTable = CreateDataTable(model.RootNodes[0]);
_deserializer = new DataTableDeserializer();
_deserializer = new DataTableDeserializer(_cryptographyProvider, new SecureString());
var output = _deserializer.Deserialize(dataTable);
Assert.That(output.GetRecursiveChildList().Count(), Is.EqualTo(model.GetRecursiveChildList().Count()));
Assert.That(output.GetRecursiveChildList().Count, Is.EqualTo(model.GetRecursiveChildList().Count));
}
[Test]
public void WeCanDeserializeASingleEntry()
{
var dataTable = CreateDataTable(new ConnectionInfo());
_deserializer = new DataTableDeserializer();
_deserializer = new DataTableDeserializer(_cryptographyProvider, new SecureString());
var output = _deserializer.Deserialize(dataTable);
Assert.That(output.GetRecursiveChildList().Count(), Is.EqualTo(1));
Assert.That(output.GetRecursiveChildList().Count, Is.EqualTo(1));
}
private DataTable CreateDataTable(ConnectionInfo tableContent)
{
var serializer = new DataTableSerializer(new SaveFilter());
var serializer = new DataTableSerializer(new SaveFilter(), _cryptographyProvider, new SecureString());
return serializer.Serialize(tableContent);
}

View File

@@ -1,11 +1,15 @@
using System.Linq;
using System.Security;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.MsSql;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Security;
using mRemoteNG.Security.SymmetricEncryption;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNGTests.TestHelpers;
using NSubstitute;
using NUnit.Framework;
namespace mRemoteNGTests.Config.Serializers
@@ -19,7 +23,10 @@ namespace mRemoteNGTests.Config.Serializers
public void Setup()
{
_saveFilter = new SaveFilter();
_dataTableSerializer = new DataTableSerializer(_saveFilter);
_dataTableSerializer = new DataTableSerializer(
_saveFilter,
new LegacyRijndaelCryptographyProvider(),
new SecureString());
}
[Test]

View File

@@ -1,10 +1,10 @@
using System.Linq;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol.RDP;
using mRemoteNG.Tree;
using mRemoteNGTests.Properties;
using NUnit.Framework;
using System.Linq;
namespace mRemoteNGTests.Config.Serializers.MiscSerializers
{
@@ -17,6 +17,7 @@ namespace mRemoteNGTests.Config.Serializers.MiscSerializers
private const string ExpectedUserName = "myusernamehere";
private const string ExpectedDomain = "myspecialdomain";
private const string ExpectedGatewayHostname = "gatewayhostname.domain.com";
private const string ExpectedLoadBalanceInfo = "tsv://MS Terminal Services Plugin.1.RDS-NAME";
private const int ExpectedPort = 9933;
private const RdpProtocol.RDPColors ExpectedColors = RdpProtocol.RDPColors.Colors24Bit;
private const bool ExpectedBitmapCaching = false;
@@ -166,6 +167,13 @@ namespace mRemoteNGTests.Config.Serializers.MiscSerializers
Assert.That(connectionInfo.RedirectSound, Is.EqualTo(ExpectedSoundRedirection));
}
[Test]
public void LoadBalanceInfoImportedCorrectly()
{
var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First();
Assert.That(connectionInfo.LoadBalanceInfo, Is.EqualTo(ExpectedLoadBalanceInfo));
}
//[Test]
//public void GatewayHostnameImportedCorrectly()
//{

View File

@@ -1,20 +1,21 @@
using System.IO;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Connection.Protocol.RDP;
using mRemoteNG.Container;
using mRemoteNG.Tree;
using mRemoteNGTests.Properties;
using NUnit.Framework;
namespace mRemoteNGTests.Config.Serializers.MiscSerializers
{
public class RemoteDesktopConnectionManager27DeserializerTests
public class RemoteDesktopConnectionManager27DeserializerTests
{
private string _connectionFileContents;
private RemoteDesktopConnectionManagerDeserializer _deserializer;
private ConnectionTreeModel _connectionTreeModel;
private const string ExpectedName = "server1_displayname";
private const string ExpectedHostname = "server1";
private const string ExpectedDescription = "Comment text here";
@@ -44,262 +45,62 @@ namespace mRemoteNGTests.Config.Serializers.MiscSerializers
{
_connectionFileContents = Resources.test_rdcman_v2_7_schema3;
_deserializer = new RemoteDesktopConnectionManagerDeserializer();
_connectionTreeModel = _deserializer.Deserialize(_connectionFileContents);
}
[Test]
public void ConnectionTreeModelHasARootNode()
{
var numberOfRootNodes = _connectionTreeModel.RootNodes.Count;
var connectionTreeModel = _deserializer.Deserialize(_connectionFileContents);
var numberOfRootNodes = connectionTreeModel.RootNodes.Count;
Assert.That(numberOfRootNodes, Is.GreaterThan(0));
}
[Test]
public void RootNodeHasContents()
{
var rootNodeContents = _connectionTreeModel.RootNodes.First().Children;
var connectionTreeModel = _deserializer.Deserialize(_connectionFileContents);
var rootNodeContents = connectionTreeModel.RootNodes.First().Children;
Assert.That(rootNodeContents, Is.Not.Empty);
}
[Test]
public void AllSubRootFoldersImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var connectionTreeModel = _deserializer.Deserialize(_connectionFileContents);
var rootNode = connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var rootNodeContents = importedRdcmanRootNode.Children.Count(node => node.Name == "Group1" || node.Name == "Group2");
Assert.That(rootNodeContents, Is.EqualTo(2));
}
[Test]
public void ConnectionDisplayNameImported()
[TestCaseSource(nameof(ExpectedPropertyValues))]
public void PropertiesWithValuesAreCorrectlyImported(Func<ConnectionInfo, object> propSelector, object expectedValue)
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.Name, Is.EqualTo(ExpectedName));
var connectionTreeModel = _deserializer.Deserialize(_connectionFileContents);
var connection = connectionTreeModel
.GetRecursiveChildList()
.OfType<ContainerInfo>()
.First(node => node.Name == "Group1")
.Children
.First();
Assert.That(propSelector(connection), Is.EqualTo(expectedValue));
}
[Test]
public void ConnectionHostnameImported()
[TestCaseSource(nameof(NullPropertyValues))]
public void PropertiesWithoutValuesAreIgnored(Func<ConnectionInfo, object> propSelector)
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.Hostname, Is.EqualTo(ExpectedHostname));
}
var connectionTreeModel = _deserializer.Deserialize(Resources.test_rdcman_v2_7_schema3_null_values);
[Test]
public void ConnectionDescriptionImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.Description, Is.EqualTo(ExpectedDescription));
}
var importedConnection = connectionTreeModel
.GetRecursiveChildList()
.OfType<ContainerInfo>()
.First(node => node.Name == "Group1")
.Children
.First();
[Test]
public void ConnectionUsernameImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.Username, Is.EqualTo(ExpectedUsername));
}
[Test]
public void ConnectionDomainImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.Domain, Is.EqualTo(ExpectedDomain));
}
// Since password is encrypted with a machine key, cant test decryption on another machine
//[Test]
//public void ConnectionPasswordImported()
//{
// var rootNode = _connectionTreeModel.RootNodes.First();
// var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
// var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
// var connection = group1.Children.First();
// Assert.That(connection.Password, Is.EqualTo(ExpectedPassword));
//}
[Test]
public void ConnectionProtocolSetToRdp()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.Protocol, Is.EqualTo(ProtocolType.RDP));
}
[Test]
public void ConnectionUseConsoleSessionImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.UseConsoleSession, Is.EqualTo(ExpectedUseConsoleSession));
}
[Test]
public void ConnectionPortImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.Port, Is.EqualTo(ExpectedPort));
}
[Test]
public void ConnectionGatewayUsageMethodImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.RDGatewayUsageMethod, Is.EqualTo(ExpectedGatewayUsageMethod));
}
[Test]
public void ConnectionGatewayHostnameImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.RDGatewayHostname, Is.EqualTo(ExpectedGatewayHostname));
}
[Test]
public void ConnectionGatewayUsernameImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.RDGatewayUsername, Is.EqualTo(ExpectedGatewayUsername));
}
// Since password is encrypted with a machine key, cant test decryption on another machine
//[Test]
//public void ConnectionGatewayPasswordImported()
//{
// var rootNode = _connectionTreeModel.RootNodes.First();
// var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
// var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
// var connection = group1.Children.First();
// Assert.That(connection.RDGatewayPassword, Is.EqualTo(ExpectedGatewayPassword));
//}
[Test]
public void ConnectionGatewayDomainImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.RDGatewayDomain, Is.EqualTo(ExpectedGatewayDomain));
}
[Test]
public void ConnectionResolutionImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.Resolution, Is.EqualTo(ExpectedRdpResolution));
}
[Test]
public void ConnectionColorDepthImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.Colors, Is.EqualTo(ExpectedRdpColorDepth));
}
[Test]
public void ConnectionAudioRedirectionImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.RedirectSound, Is.EqualTo(ExpectedAudioRedirection));
}
[Test]
public void ConnectionKeyRedirectionImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.RedirectKeys, Is.EqualTo(ExpectedKeyRedirection));
}
[Test]
public void ConnectionDriveRedirectionImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.RedirectDiskDrives, Is.EqualTo(ExpectedDriveRedirection));
}
[Test]
public void ConnectionPortRedirectionImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.RedirectPorts, Is.EqualTo(ExpectedPortRedirection));
}
[Test]
public void ConnectionPrinterRedirectionImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.RedirectPrinters, Is.EqualTo(ExpectedPrinterRedirection));
}
[Test]
public void ConnectionSmartcardRedirectionImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.RedirectSmartCards, Is.EqualTo(ExpectedSmartcardRedirection));
}
[Test]
public void ConnectionauthenticationLevelImported()
{
var rootNode = _connectionTreeModel.RootNodes.First();
var importedRdcmanRootNode = rootNode.Children.OfType<ContainerInfo>().First();
var group1 = importedRdcmanRootNode.Children.OfType<ContainerInfo>().First(node => node.Name == "Group1");
var connection = group1.Children.First();
Assert.That(connection.RDPAuthenticationLevel, Is.EqualTo(ExpectedAuthLevel));
Assert.That(propSelector(importedConnection), Is.EqualTo(propSelector(new ConnectionInfo())));
}
[Test]
@@ -322,5 +123,61 @@ namespace mRemoteNGTests.Config.Serializers.MiscSerializers
var badFileContents = Resources.test_rdcman_noversion;
Assert.That(() => _deserializer.Deserialize(badFileContents), Throws.TypeOf<FileFormatException>());
}
private static IEnumerable<TestCaseData> ExpectedPropertyValues()
{
return new[]
{
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Name), ExpectedName).SetName(nameof(ConnectionInfo.Name)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Hostname), ExpectedHostname).SetName(nameof(ConnectionInfo.Hostname)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Description), ExpectedDescription).SetName(nameof(ConnectionInfo.Description)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Username), ExpectedUsername).SetName(nameof(ConnectionInfo.Username)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Domain), ExpectedDomain).SetName(nameof(ConnectionInfo.Domain)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Protocol), ProtocolType.RDP).SetName(nameof(ConnectionInfo.Protocol)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.UseConsoleSession), ExpectedUseConsoleSession).SetName(nameof(ConnectionInfo.UseConsoleSession)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Port), ExpectedPort).SetName(nameof(ConnectionInfo.Port)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RDGatewayUsageMethod), ExpectedGatewayUsageMethod).SetName(nameof(ConnectionInfo.RDGatewayUsageMethod)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RDGatewayHostname), ExpectedGatewayHostname).SetName(nameof(ConnectionInfo.RDGatewayHostname)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RDGatewayUsername), ExpectedGatewayUsername).SetName(nameof(ConnectionInfo.RDGatewayUsername)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RDGatewayDomain), ExpectedGatewayDomain).SetName(nameof(ConnectionInfo.RDGatewayDomain)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Resolution), ExpectedRdpResolution).SetName(nameof(ConnectionInfo.Resolution)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Colors), ExpectedRdpColorDepth).SetName(nameof(ConnectionInfo.Colors)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RedirectSound), ExpectedAudioRedirection).SetName(nameof(ConnectionInfo.RedirectSound)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RedirectKeys), ExpectedKeyRedirection).SetName(nameof(ConnectionInfo.RedirectKeys)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RDPAuthenticationLevel), ExpectedAuthLevel).SetName(nameof(ConnectionInfo.RDPAuthenticationLevel)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RedirectSmartCards), ExpectedSmartcardRedirection).SetName(nameof(ConnectionInfo.RedirectSmartCards)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RedirectPrinters), ExpectedPrinterRedirection).SetName(nameof(ConnectionInfo.RedirectPrinters)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RedirectPorts), ExpectedPortRedirection).SetName(nameof(ConnectionInfo.RedirectPorts)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RedirectDiskDrives), ExpectedDriveRedirection).SetName(nameof(ConnectionInfo.RedirectDiskDrives)),
};
}
private static IEnumerable<TestCaseData> NullPropertyValues()
{
return new[]
{
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Name)).SetName(nameof(ConnectionInfo.Name)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Hostname)).SetName(nameof(ConnectionInfo.Hostname)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Description)).SetName(nameof(ConnectionInfo.Description)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Username)).SetName(nameof(ConnectionInfo.Username)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Domain)).SetName(nameof(ConnectionInfo.Domain)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Protocol)).SetName(nameof(ConnectionInfo.Protocol)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.UseConsoleSession)).SetName(nameof(ConnectionInfo.UseConsoleSession)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Port)).SetName(nameof(ConnectionInfo.Port)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RDGatewayUsageMethod)).SetName(nameof(ConnectionInfo.RDGatewayUsageMethod)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RDGatewayHostname)).SetName(nameof(ConnectionInfo.RDGatewayHostname)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RDGatewayUsername)).SetName(nameof(ConnectionInfo.RDGatewayUsername)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RDGatewayDomain)).SetName(nameof(ConnectionInfo.RDGatewayDomain)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Resolution)).SetName(nameof(ConnectionInfo.Resolution)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.Colors)).SetName(nameof(ConnectionInfo.Colors)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RedirectSound)).SetName(nameof(ConnectionInfo.RedirectSound)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RedirectKeys)).SetName(nameof(ConnectionInfo.RedirectKeys)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RDPAuthenticationLevel)).SetName(nameof(ConnectionInfo.RDPAuthenticationLevel)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RedirectSmartCards)).SetName(nameof(ConnectionInfo.RedirectSmartCards)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RedirectPrinters)).SetName(nameof(ConnectionInfo.RedirectPrinters)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RedirectPorts)).SetName(nameof(ConnectionInfo.RedirectPorts)),
new TestCaseData((Func<ConnectionInfo,object>)(con => con.RedirectDiskDrives)).SetName(nameof(ConnectionInfo.RedirectDiskDrives)),
};
}
}
}

View File

@@ -412,6 +412,15 @@ namespace mRemoteNGTests.Connection
Assert.That(wasCalled, Is.True);
}
[Test]
public void FavoriteNotifiesOnValueChange()
{
var wasCalled = false;
_testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true;
_testAbstractConnectionInfoData.Favorite = true;
Assert.That(wasCalled, Is.True);
}
[Test]
public void VncCompressionNotifiesOnValueChange()
{

View File

@@ -1,8 +1,9 @@
using mRemoteNG.Connection;
using mRemoteNG.Container;
using NUnit.Framework;
using System.Reflection;
using System.Collections;
using System.Linq;
using System.Reflection;
namespace mRemoteNGTests.Connection
{
@@ -74,6 +75,22 @@ namespace mRemoteNGTests.Connection
Assert.That(hasEverythingInheritedProperty, Is.False);
}
[Test]
public void AlwaysReturnInheritedValueIfRequested()
{
var expectedSetting = false;
var container = new ContainerInfo { AutomaticResize = expectedSetting };
var con1 = new ConnectionInfo
{
AutomaticResize = true,
Inheritance = {AutomaticResize = true}
};
container.AddChild(con1);
Assert.That(con1.AutomaticResize, Is.EqualTo(expectedSetting));
}
private bool AllInheritancePropertiesAreTrue()
{
var allPropertiesTrue = true;

View File

@@ -43,6 +43,20 @@ namespace mRemoteNGTests.Connection
Assert.That(clonedConnection.Parent, Is.Null);
}
[Test]
public void CloneAlsoCopiesInheritanceObject()
{
var clonedConnection = _connectionInfo.Clone();
Assert.That(clonedConnection.Inheritance, Is.Not.EqualTo(_connectionInfo.Inheritance));
}
[Test]
public void CloneCorrectlySetsParentOfInheritanceObject()
{
var clonedConnection = _connectionInfo.Clone();
Assert.That(clonedConnection.Inheritance.Parent, Is.EqualTo(clonedConnection));
}
[Test]
public void CopyFromCopiesProperties()
{

View File

@@ -1,73 +1,62 @@
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using System.Collections.Generic;
using System.Reflection;
using mRemoteNG.Connection;
using mRemoteNGTests.TestHelpers;
using NUnit.Framework;
namespace mRemoteNGTests.Connection
{
public class DefaultConnectionInfoTests
{
private string _testDomain = "somedomain";
public class DefaultConnectionInfoTests
{
private ConnectionInfo _randomizedConnectionInfo;
[SetUp]
public void Setup()
{
DefaultConnectionInfo.Instance.Domain = "";
_randomizedConnectionInfo = ConnectionInfoHelpers.GetRandomizedConnectionInfo();
}
[Test]
public void LoadingDefaultInfoUpdatesAllProperties()
[TestCaseSource(nameof(GetConnectionInfoProperties))]
public void LoadingDefaultInfoUpdatesAllProperties(PropertyInfo property)
{
var connectionInfoSource = new ConnectionInfo { Domain = _testDomain };
DefaultConnectionInfo.Instance.LoadFrom(connectionInfoSource);
Assert.That(DefaultConnectionInfo.Instance.Domain, Is.EqualTo(_testDomain));
DefaultConnectionInfo.Instance.LoadFrom(_randomizedConnectionInfo);
var valueInDestination = property.GetValue(DefaultConnectionInfo.Instance);
var valueInSource = property.GetValue(_randomizedConnectionInfo);
Assert.That(valueInDestination, Is.EqualTo(valueInSource));
}
[Test]
public void SavingDefaultConnectionInfoExportsAllProperties()
[TestCaseSource(nameof(GetConnectionInfoProperties))]
public void SavingDefaultConnectionInfoExportsAllProperties(PropertyInfo property)
{
var saveTarget = new ConnectionInfo();
DefaultConnectionInfo.Instance.Domain = _testDomain;
var randomizedValue = property.GetValue(_randomizedConnectionInfo);
property.SetValue(DefaultConnectionInfo.Instance, randomizedValue);
DefaultConnectionInfo.Instance.SaveTo(saveTarget);
Assert.That(saveTarget.Domain, Is.EqualTo(_testDomain));
var valueInDestination = property.GetValue(saveTarget);
var valueInSource = property.GetValue(DefaultConnectionInfo.Instance);
Assert.That(valueInDestination, Is.EqualTo(valueInSource));
}
[Test]
public void CanSaveEnumValuesToString()
{
const ProtocolType targetProtocol = ProtocolType.RAW;
var saveTarget = new AllStringPropertySaveTarget();
DefaultConnectionInfo.Instance.Protocol = targetProtocol;
[TestCaseSource(nameof(GetConnectionInfoProperties))]
public void CanSaveDefaultConnectionToModelWithAllStringProperties(PropertyInfo property)
{
var saveTarget = new SerializableConnectionInfoAllPropertiesOfType<string>();
// randomize default connnection values to ensure we dont get false passing tests
var randomizedValue = property.GetValue(_randomizedConnectionInfo);
property.SetValue(DefaultConnectionInfo.Instance, randomizedValue);
DefaultConnectionInfo.Instance.SaveTo(saveTarget);
Assert.That(saveTarget.Protocol, Is.EqualTo(targetProtocol.ToString()));
var valueInSource = property.GetValue(DefaultConnectionInfo.Instance).ToString();
var valueInDestination = saveTarget.GetType().GetProperty(property.Name).GetValue(saveTarget).ToString();
Assert.That(valueInDestination, Is.EqualTo(valueInSource));
}
[Test]
public void CanSaveIntegerValuesToString()
{
const int targetValue = 123;
var saveTarget = new AllStringPropertySaveTarget();
DefaultConnectionInfo.Instance.RDPMinutesToIdleTimeout = targetValue;
DefaultConnectionInfo.Instance.SaveTo(saveTarget);
Assert.That(saveTarget.RDPMinutesToIdleTimeout, Is.EqualTo(targetValue.ToString()));
}
[Test]
public void CanSaveStringValuesToString()
{
const string targetName = "hello";
var saveTarget = new AllStringPropertySaveTarget();
DefaultConnectionInfo.Instance.Username = targetName;
DefaultConnectionInfo.Instance.SaveTo(saveTarget);
Assert.That(saveTarget.Username, Is.EqualTo(targetName));
}
private class AllStringPropertySaveTarget
{
public string Username { get; set; }
public string Protocol { get; set; }
public string RDPMinutesToIdleTimeout { get; set; }
}
private static IEnumerable<PropertyInfo> GetConnectionInfoProperties()
{
return new ConnectionInfo().GetSerializableProperties();
}
}
}

View File

@@ -1,34 +1,40 @@
using mRemoteNG.Connection;
using System.Collections.Generic;
using System.Reflection;
using mRemoteNG.Connection;
using NUnit.Framework;
namespace mRemoteNGTests.Connection
{
public class DefaultConnectionInheritanceTests
public class DefaultConnectionInheritanceTests
{
[SetUp]
public void Setup()
[TestCaseSource(nameof(GetInheritanceProperties))]
public void LoadingDefaultInheritanceUpdatesAllProperties(PropertyInfo property)
{
DefaultConnectionInheritance.Instance.TurnOffInheritanceCompletely();
}
[Test]
public void LoadingDefaultInheritanceUpdatesAllProperties()
{
var inheritanceSource = new ConnectionInfoInheritance(new object(), true);
var inheritanceSource = new ConnectionInfoInheritance(new object(), true);
inheritanceSource.TurnOnInheritanceCompletely();
DefaultConnectionInheritance.Instance.LoadFrom(inheritanceSource);
Assert.That(DefaultConnectionInheritance.Instance.EverythingInherited, Is.True);
}
DefaultConnectionInheritance.Instance.TurnOffInheritanceCompletely();
[Test]
public void SavingDefaultInheritanceExportsAllProperties()
DefaultConnectionInheritance.Instance.LoadFrom(inheritanceSource);
var valueInDestination = property.GetValue(DefaultConnectionInheritance.Instance);
var valueInSource = property.GetValue(inheritanceSource);
Assert.That(valueInDestination, Is.EqualTo(valueInSource));
}
[TestCaseSource(nameof(GetInheritanceProperties))]
public void SavingDefaultInheritanceExportsAllProperties(PropertyInfo property)
{
var inheritanceDestination = new ConnectionInfoInheritance(new object(), true);
DefaultConnectionInheritance.Instance.AutomaticResize = true;
DefaultConnectionInheritance.Instance.SaveTo(inheritanceDestination);
Assert.That(inheritanceDestination.AutomaticResize, Is.True);
}
var saveTarget = new ConnectionInfoInheritance(new object(), true);
saveTarget.TurnOffInheritanceCompletely();
DefaultConnectionInheritance.Instance.TurnOnInheritanceCompletely();
DefaultConnectionInheritance.Instance.SaveTo(saveTarget);
var valueInDestination = property.GetValue(saveTarget);
var valueInSource = property.GetValue(DefaultConnectionInheritance.Instance);
Assert.That(valueInDestination, Is.EqualTo(valueInSource));
}
[Test]
public void NewInheritanceInstancesCreatedWithDefaultInheritanceValues()
@@ -38,12 +44,20 @@ namespace mRemoteNGTests.Connection
Assert.That(inheritanceInstance.Domain, Is.True);
}
[Test]
public void NewInheritanceInstancesCreatedWithAllDefaultInheritanceValues()
[TestCaseSource(nameof(GetInheritanceProperties))]
public void NewInheritanceInstancesCreatedWithAllDefaultInheritanceValues(PropertyInfo property)
{
DefaultConnectionInheritance.Instance.TurnOnInheritanceCompletely();
var inheritanceInstance = new ConnectionInfoInheritance(new object());
Assert.That(inheritanceInstance.EverythingInherited, Is.True);
}
}
var valueInDestination = property.GetValue(inheritanceInstance);
var valueInSource = property.GetValue(DefaultConnectionInheritance.Instance);
Assert.That(valueInDestination, Is.EqualTo(valueInSource));
}
private static IEnumerable<PropertyInfo> GetInheritanceProperties()
{
return new ConnectionInfoInheritance(new object(), true).GetProperties();
}
}
}

View File

@@ -51,8 +51,8 @@ namespace mRemoteNGTests.Connection.Protocol
private InterfaceControl BuildInterfaceControl(string extAppName, ProtocolBase sut)
{
var connectionWindow = new ConnectionWindow(new DockContent());
var connectionInfo = new ConnectionInfo {ExtApp = extAppName};
return new InterfaceControl(connectionWindow, sut, connectionInfo);
var connectionInfo = new ConnectionInfo {ExtApp = extAppName, Protocol = ProtocolType.IntApp};
return new InterfaceControl(connectionWindow, sut, connectionInfo);
}
}
}

View File

@@ -0,0 +1,18 @@
using mRemoteNG.Connection;
using mRemoteNG.Tree.Root;
using NUnit.Framework;
namespace mRemoteNGTests.Container
{
public class RootNodeInfoTests
{
[Test]
public void InheritanceIsDisabledForNodesDirectlyUnderRootNode()
{
var rootNode = new RootNodeInfo(RootNodeType.Connection);
var con1 = new ConnectionInfo { Inheritance = { Password = true } };
rootNode.AddChild(con1);
Assert.That(con1.Inheritance.Password, Is.False);
}
}
}

View File

@@ -1,14 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.CredentialSerializer;
using mRemoteNG.Credential;
using mRemoteNG.Security;
using mRemoteNG.Security.Factories;
using NSubstitute;
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security;
namespace mRemoteNGTests.IntegrationTests
{

View File

@@ -1,18 +1,20 @@
using System.Linq;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Config.Serializers.Xml;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Security;
using mRemoteNG.Security.Factories;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNGTests.TestHelpers;
using NUnit.Framework;
using System;
using System.Linq;
using System.Text;
namespace mRemoteNGTests.IntegrationTests
{
public class XmlSerializationLifeCycleTests
public class XmlSerializationLifeCycleTests
{
private XmlConnectionsSerializer _serializer;
private XmlConnectionsDeserializer _deserializer;
@@ -24,25 +26,24 @@ namespace mRemoteNGTests.IntegrationTests
{
_originalModel = SetupConnectionTreeModel();
var cryptoProvider = _cryptoFactory.Build();
var nodeSerializer = new XmlConnectionNodeSerializer26(
var nodeSerializer = new XmlConnectionNodeSerializer27(
cryptoProvider,
_originalModel.RootNodes.OfType<RootNodeInfo>().First().PasswordString.ConvertToSecureString(),
new SaveFilter());
_serializer = new XmlConnectionsSerializer(cryptoProvider, nodeSerializer);
_deserializer = new XmlConnectionsDeserializer();
}
[TearDown]
public void Teardown()
{
_serializer = null;
_deserializer = null;
}
[Test]
public void SerializeThenDeserialize()
{
var serializedContent = _serializer.Serialize(_originalModel);
_deserializer = new XmlConnectionsDeserializer();
var deserializedModel = _deserializer.Deserialize(serializedContent);
var nodeNamesFromDeserializedModel = deserializedModel.GetRecursiveChildList().Select(node => node.Name);
var nodeNamesFromOriginalModel = _originalModel.GetRecursiveChildList().Select(node => node.Name);
@@ -54,7 +55,6 @@ namespace mRemoteNGTests.IntegrationTests
{
_serializer.UseFullEncryption = true;
var serializedContent = _serializer.Serialize(_originalModel);
_deserializer = new XmlConnectionsDeserializer();
var deserializedModel = _deserializer.Deserialize(serializedContent);
var nodeNamesFromDeserializedModel = deserializedModel.GetRecursiveChildList().Select(node => node.Name);
var nodeNamesFromOriginalModel = _originalModel.GetRecursiveChildList().Select(node => node.Name);
@@ -66,7 +66,6 @@ namespace mRemoteNGTests.IntegrationTests
{
var originalConnectionInfo = new ConnectionInfo {Name = "con1", Description = "£°úg¶┬ä" };
var serializedContent = _serializer.Serialize(originalConnectionInfo);
_deserializer = new XmlConnectionsDeserializer();
var deserializedModel = _deserializer.Deserialize(serializedContent);
var deserializedConnectionInfo = deserializedModel.GetRecursiveChildList().First(node => node.Name == originalConnectionInfo.Name);
Assert.That(deserializedConnectionInfo.Description, Is.EqualTo(originalConnectionInfo.Description));
@@ -78,19 +77,86 @@ namespace mRemoteNGTests.IntegrationTests
{
var cryptoProvider = _cryptoFactory.Build();
cryptoProvider.KeyDerivationIterations = 5000;
var nodeSerializer = new XmlConnectionNodeSerializer26(
var nodeSerializer = new XmlConnectionNodeSerializer27(
cryptoProvider,
_originalModel.RootNodes.OfType<RootNodeInfo>().First().PasswordString.ConvertToSecureString(),
new SaveFilter());
_serializer = new XmlConnectionsSerializer(cryptoProvider, nodeSerializer);
var serializedContent = _serializer.Serialize(_originalModel);
_deserializer = new XmlConnectionsDeserializer();
var deserializedModel = _deserializer.Deserialize(serializedContent);
var nodeNamesFromDeserializedModel = deserializedModel.GetRecursiveChildList().Select(node => node.Name);
var nodeNamesFromOriginalModel = _originalModel.GetRecursiveChildList().Select(node => node.Name);
Assert.That(nodeNamesFromDeserializedModel, Is.EquivalentTo(nodeNamesFromOriginalModel));
}
[Test]
public void GuidCreatedIfNonExistedInXml()
{
var originalConnectionInfo = new ConnectionInfo { Name = "con1" };
var serializedContent = _serializer.Serialize(originalConnectionInfo);
// remove GUID from connection xml
serializedContent = serializedContent.Replace(originalConnectionInfo.ConstantID, "");
var deserializedModel = _deserializer.Deserialize(serializedContent);
var deserializedConnectionInfo = deserializedModel.GetRecursiveChildList().First(node => node.Name == originalConnectionInfo.Name);
Assert.That(Guid.TryParse(deserializedConnectionInfo.ConstantID, out var guid));
}
[Test]
public void AllPropertiesCorrectWhenSerializingThenDeserializing()
{
var originalConnectionInfo = new ConnectionInfo().RandomizeValues();
originalConnectionInfo.Inheritance.TurnOffInheritanceCompletely();
var serializedContent = _serializer.Serialize(originalConnectionInfo);
var deserializedModel = _deserializer.Deserialize(serializedContent);
var deserializedConnectionInfo = deserializedModel
.GetRecursiveChildList()
.First(info => info.GetTreeNodeType() == TreeNodeType.Connection);
var sb = new StringBuilder();
foreach (var property in originalConnectionInfo.GetSerializableProperties())
{
var originalValue = property.GetValue(originalConnectionInfo);
var deserializedValue = property.GetValue(deserializedConnectionInfo);
if (originalValue.Equals(deserializedValue))
continue;
sb.AppendLine($"Property: {property.Name}");
}
Assert.That(sb.Length, Is.EqualTo(0), "Some properties are not being serialized properly:\n" + sb);
}
[Test]
public void AllInheritanceCorrectWhenSerializingThenDeserializing()
{
var originalConnectionInfo = new ConnectionInfo();
originalConnectionInfo.Inheritance.ToggleAllBooleanProperties(excludeProperties: nameof(ConnectionInfoInheritance.EverythingInherited));
var container = new ContainerInfo();
container.AddChild(originalConnectionInfo);
var serializedContent = _serializer.Serialize(container);
var deserializedModel = _deserializer.Deserialize(serializedContent);
var deserializedConnectionInfo = deserializedModel
.GetRecursiveChildList()
.First(info => info.GetTreeNodeType() == TreeNodeType.Connection);
var sb = new StringBuilder();
foreach (var property in originalConnectionInfo.Inheritance.GetProperties())
{
var originalValue = property.GetValue(originalConnectionInfo.Inheritance);
var deserializedValue = property.GetValue(deserializedConnectionInfo.Inheritance);
if (originalValue.Equals(deserializedValue))
continue;
sb.AppendLine($"Property: Inheritance.{property.Name}");
}
Assert.That(sb.Length, Is.EqualTo(0), "Some properties are not being serialized properly:\n" + sb);
}
private ConnectionTreeModel SetupConnectionTreeModel()
{

View File

@@ -298,6 +298,32 @@ namespace mRemoteNGTests.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
///&lt;RDCMan programVersion=&quot;2.7&quot; schemaVersion=&quot;3&quot;&gt;
/// &lt;file&gt;
/// &lt;credentialsProfiles /&gt;
/// &lt;properties&gt;
/// &lt;expanded&gt;True&lt;/expanded&gt;
/// &lt;name&gt;test_RDCMan_connections&lt;/name&gt;
/// &lt;/properties&gt;
/// &lt;smartGroup&gt;
/// &lt;properties&gt;
/// &lt;expanded&gt;False&lt;/expanded&gt;
/// &lt;name&gt;AllServers&lt;/name&gt;
/// &lt;/properties&gt;
/// &lt;ruleGroup operator=&quot;All&quot;&gt;
/// &lt;rule&gt;
/// &lt;property&gt;DisplayName&lt;/property&gt;
/// &lt;operator&gt;Matches&lt;/operator&gt;
/// [rest of string was truncated]&quot;;.
/// </summary>
internal static string test_rdcman_v2_7_schema3_null_values {
get {
return ResourceManager.GetString("test_rdcman_v2_7_schema3_null_values", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to screen mode id:i:1
///use multimon:i:0
@@ -329,6 +355,16 @@ namespace mRemoteNGTests.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap TestImage {
get {
object obj = ResourceManager.GetObject("TestImage", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized string similar to Version: 1.75.6164.27544
///dURL: https://github.com/mRemoteNG/mRemoteNG/releases/download/v1.75Beta3/mRemoteNG-Installer-1.75.6179.28160.msi

View File

@@ -154,6 +154,9 @@
<data name="dev_update_portable" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\dev-update-portable.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
<data name="TestImage" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\TestImage.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="test_puttyConnectionManager_database" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\test_puttyConnectionManager_database.dat;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16</value>
</data>
@@ -172,6 +175,9 @@
<data name="test_rdcman_v2_7_schema3" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\test_RDCMan_v2_7_schema3.rdg;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="test_rdcman_v2_7_schema3_null_values" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\test_rdcman_v2_7_schema3_null_values.rdg;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="test_remotedesktopconnection_rdp" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\test_remotedesktopconnection.rdp;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16</value>
</data>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?>
<RDCMan programVersion="2.7" schemaVersion="3">
<file>
<credentialsProfiles />
<properties>
<expanded>True</expanded>
<name>test_RDCMan_connections</name>
</properties>
<smartGroup>
<properties>
<expanded>False</expanded>
<name>AllServers</name>
</properties>
<ruleGroup operator="All">
<rule>
<property>DisplayName</property>
<operator>Matches</operator>
<value>server</value>
</rule>
</ruleGroup>
</smartGroup>
<group>
<properties>
<expanded>True</expanded>
<name>Group1</name>
</properties>
<server>
<properties>
<displayName></displayName>
<name></name>
<comment></comment>
</properties>
<logonCredentials inherit="None">
<profileName scope="Local"></profileName>
<userName></userName>
<password></password>
<domain></domain>
</logonCredentials>
<connectionSettings inherit="None">
<connectToConsole></connectToConsole>
<startProgram />
<workingDir />
<port></port>
<loadBalanceInfo />
</connectionSettings>
<gatewaySettings inherit="None">
<enabled></enabled>
<hostName></hostName>
<logonMethod></logonMethod>
<localBypass></localBypass>
<credSharing></credSharing>
<profileName scope="Local"></profileName>
<userName></userName>
<password />
<domain></domain>
</gatewaySettings>
<remoteDesktop inherit="None">
<sameSizeAsClientArea></sameSizeAsClientArea>
<fullScreen></fullScreen>
<colorDepth></colorDepth>
</remoteDesktop>
<localResources inherit="None">
<audioRedirection></audioRedirection>
<audioRedirectionQuality></audioRedirectionQuality>
<audioCaptureRedirection></audioCaptureRedirection>
<keyboardHook></keyboardHook>
<redirectClipboard></redirectClipboard>
<redirectDrives></redirectDrives>
<redirectDrivesList>
<item></item>
<item></item>
<item></item>
<item></item>
<item></item>
</redirectDrivesList>
<redirectPrinters></redirectPrinters>
<redirectPorts></redirectPorts>
<redirectSmartCards></redirectSmartCards>
<redirectPnpDevices></redirectPnpDevices>
</localResources>
<displaySettings inherit="None">
<thumbnailScale></thumbnailScale>
<smartSizeDockedWindows></smartSizeDockedWindows>
<smartSizeUndockedWindows></smartSizeUndockedWindows>
</displaySettings>
<securitySettings inherit="None">
<authentication></authentication>
</securitySettings>
</server>
</group>
</file>
<connected />
<favorites />
<recentlyUsed />
</RDCMan>

View File

@@ -1,11 +1,11 @@
using System;
using System.Collections;
using System.Security;
using mRemoteNG.Security;
using mRemoteNG.Security;
using mRemoteNG.Security.Factories;
using mRemoteNG.Security.SymmetricEncryption;
using NUnit.Framework;
using NUnit.Framework.Constraints;
using System;
using System.Collections;
using System.Security;
namespace mRemoteNGTests.Security
@@ -97,6 +97,12 @@ namespace mRemoteNGTests.Security
Assert.That(cryptoProvider.CipherMode, Is.EqualTo(mode));
}
[Test]
public void ProvidingEmptyEncryptionKeyThrowsException()
{
Assert.Throws<ArgumentException>(() => _cryptographyProvider.Encrypt(_plainText, new SecureString()));
}
private class TestCaseSources
{

View File

@@ -2,6 +2,7 @@
using mRemoteNG.Security;
using mRemoteNG.Security.Authentication;
using mRemoteNG.Security.SymmetricEncryption;
using mRemoteNG.Tools;
using NUnit.Framework;
@@ -9,35 +10,31 @@ namespace mRemoteNGTests.Security.Authentication
{
public class PasswordAuthenticatorTests
{
private PasswordAuthenticator _authenticator;
private ICryptographyProvider _cryptographyProvider;
private string _cipherText;
private readonly SecureString _correctPassword = "9theCorrectPass#5".ConvertToSecureString();
private readonly SecureString _wrongPassword = "wrongPassword".ConvertToSecureString();
[SetUp]
public void Setup()
{
var cryptoProvider = new AeadCryptographyProvider {KeyDerivationIterations = 10000};
const string cipherText = "MPELiwk7+xeNlruIyt5uxTvVB+/RLVoLdUGnwY4CWCqwKe7T2IBwWo4oaKum5hdv7447g5m2nZsYPrfARSlotQB4r1KZQg==";
_authenticator = new PasswordAuthenticator(cryptoProvider, cipherText);
}
[TearDown]
public void Teardown()
{
_authenticator = null;
_cryptographyProvider = new AeadCryptographyProvider {KeyDerivationIterations = 10000};
_cipherText = "MPELiwk7+xeNlruIyt5uxTvVB+/RLVoLdUGnwY4CWCqwKe7T2IBwWo4oaKum5hdv7447g5m2nZsYPrfARSlotQB4r1KZQg==";
}
[Test]
public void AuthenticatingWithCorrectPasswordReturnsTrue()
{
var authenticated = _authenticator.Authenticate(_correctPassword);
var authenticator = new PasswordAuthenticator(_cryptographyProvider, _cipherText, () => Optional<SecureString>.Empty);
var authenticated = authenticator.Authenticate(_correctPassword);
Assert.That(authenticated);
}
[Test]
public void AuthenticatingWithWrongPasswordReturnsFalse()
{
var authenticated = _authenticator.Authenticate(_wrongPassword);
var authenticator = new PasswordAuthenticator(_cryptographyProvider, _cipherText, () => Optional<SecureString>.Empty);
var authenticated = authenticator.Authenticate(_wrongPassword);
Assert.That(!authenticated);
}
@@ -45,12 +42,15 @@ namespace mRemoteNGTests.Security.Authentication
public void AuthenticationRequestorIsCalledWhenInitialPasswordIsWrong()
{
var wasCalled = false;
_authenticator.AuthenticationRequestor = () =>
Optional<SecureString> AuthenticationRequestor()
{
wasCalled = true;
return _correctPassword;
};
_authenticator.Authenticate(_wrongPassword);
}
var authenticator = new PasswordAuthenticator(_cryptographyProvider, _cipherText, AuthenticationRequestor);
authenticator.Authenticate(_wrongPassword);
Assert.That(wasCalled);
}
@@ -58,28 +58,30 @@ namespace mRemoteNGTests.Security.Authentication
public void AuthenticationRequestorNotCalledWhenInitialPasswordIsCorrect()
{
var wasCalled = false;
_authenticator.AuthenticationRequestor = () =>
Optional<SecureString> AuthenticationRequestor()
{
wasCalled = true;
return _correctPassword;
};
_authenticator.Authenticate(_correctPassword);
}
var authenticator = new PasswordAuthenticator(_cryptographyProvider, _cipherText, AuthenticationRequestor);
authenticator.Authenticate(_correctPassword);
Assert.That(!wasCalled);
}
[Test]
public void ProvidingCorrectPasswordToTheAuthenticationRequestorReturnsTrue()
{
_authenticator.AuthenticationRequestor = () => _correctPassword;
var authenticated = _authenticator.Authenticate(_wrongPassword);
var authenticator = new PasswordAuthenticator(_cryptographyProvider, _cipherText, () => _correctPassword);
var authenticated = authenticator.Authenticate(_wrongPassword);
Assert.That(authenticated);
}
[Test]
public void AuthenticationFailsWhenAuthenticationRequestorGivenEmptyPassword()
{
_authenticator.AuthenticationRequestor = () => new SecureString();
var authenticated = _authenticator.Authenticate(_wrongPassword);
var authenticator = new PasswordAuthenticator(_cryptographyProvider, _cipherText, () => new SecureString());
var authenticated = authenticator.Authenticate(_wrongPassword);
Assert.That(!authenticated);
}
@@ -87,27 +89,34 @@ namespace mRemoteNGTests.Security.Authentication
public void AuthenticatorRespectsMaxAttempts()
{
var authAttempts = 0;
_authenticator.AuthenticationRequestor = () =>
Optional<SecureString> AuthenticationRequestor()
{
authAttempts++;
return _wrongPassword;
};
_authenticator.Authenticate(_wrongPassword);
Assert.That(authAttempts == _authenticator.MaxAttempts);
}
var authenticator = new PasswordAuthenticator(_cryptographyProvider, _cipherText, AuthenticationRequestor);
authenticator.Authenticate(_wrongPassword);
Assert.That(authAttempts == authenticator.MaxAttempts);
}
[Test]
public void AuthenticatorRespectsMaxAttemptsCustomValue()
{
const int customMaxAttempts = 5;
_authenticator.MaxAttempts = customMaxAttempts;
var authAttempts = 0;
_authenticator.AuthenticationRequestor = () =>
Optional<SecureString> AuthenticationRequestor()
{
authAttempts++;
return _wrongPassword;
};
_authenticator.Authenticate(_wrongPassword);
}
var authenticator =
new PasswordAuthenticator(_cryptographyProvider, _cipherText, AuthenticationRequestor)
{
MaxAttempts = customMaxAttempts
};
authenticator.Authenticate(_wrongPassword);
Assert.That(authAttempts == customMaxAttempts);
}
}

View File

@@ -0,0 +1,133 @@
using System;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Connection.Protocol.Http;
using mRemoteNG.Connection.Protocol.ICA;
using mRemoteNG.Connection.Protocol.RDP;
using mRemoteNG.Connection.Protocol.VNC;
namespace mRemoteNGTests.TestHelpers
{
internal static class ConnectionInfoHelpers
{
private static readonly Random _random = new Random();
/// <summary>
/// Returns a <see cref="ConnectionInfo"/> object with randomized
/// values in all fields.
/// </summary>
internal static ConnectionInfo GetRandomizedConnectionInfo(bool randomizeInheritance = false)
{
var connectionInfo = new ConnectionInfo
{
// string types
Name = RandomString(),
Hostname = RandomString(),
Description = RandomString(),
Domain = RandomString(),
ExtApp = RandomString(),
Icon = RandomString(),
LoadBalanceInfo = RandomString(),
MacAddress = RandomString(),
Panel = RandomString(),
Password = RandomString(),
PostExtApp = RandomString(),
PreExtApp = RandomString(),
PuttySession = RandomString(),
RDGatewayHostname = RandomString(),
RDGatewayUsername = RandomString(),
RDGatewayDomain = RandomString(),
RDGatewayPassword = RandomString(),
UserField = RandomString(),
Username = RandomString(),
VNCProxyIP = RandomString(),
VNCProxyPassword = RandomString(),
VNCProxyUsername = RandomString(),
// bool types
AutomaticResize = RandomBool(),
CacheBitmaps = RandomBool(),
DisplayThemes = RandomBool(),
DisplayWallpaper = RandomBool(),
EnableDesktopComposition = RandomBool(),
EnableFontSmoothing = RandomBool(),
IsContainer = RandomBool(),
IsDefault = RandomBool(),
IsQuickConnect = RandomBool(),
PleaseConnect = RandomBool(),
RDPAlertIdleTimeout = RandomBool(),
RedirectDiskDrives = RandomBool(),
RedirectKeys = RandomBool(),
RedirectPorts = RandomBool(),
RedirectPrinters = RandomBool(),
RedirectSmartCards = RandomBool(),
UseConsoleSession = RandomBool(),
UseCredSsp = RandomBool(),
VNCViewOnly = RandomBool(),
Favorite = RandomBool(),
// ints
Port = RandomInt(),
RDPMinutesToIdleTimeout = RandomInt(),
VNCProxyPort = RandomInt(),
// enums
Colors = RandomEnum<RdpProtocol.RDPColors>(),
ICAEncryptionStrength = RandomEnum<IcaProtocol.EncryptionStrength> (),
Protocol = RandomEnum<ProtocolType>(),
RDGatewayUsageMethod = RandomEnum<RdpProtocol.RDGatewayUsageMethod>(),
RDGatewayUseConnectionCredentials = RandomEnum<RdpProtocol.RDGatewayUseConnectionCredentials>(),
RDPAuthenticationLevel = RandomEnum<RdpProtocol.AuthenticationLevel>(),
RedirectSound = RandomEnum<RdpProtocol.RDPSounds>(),
RenderingEngine = RandomEnum<HTTPBase.RenderingEngine>(),
Resolution = RandomEnum<RdpProtocol.RDPResolutions>(),
SoundQuality = RandomEnum<RdpProtocol.RDPSoundQuality>(),
VNCAuthMode = RandomEnum<ProtocolVNC.AuthMode>(),
VNCColors = RandomEnum<ProtocolVNC.Colors>(),
VNCCompression = RandomEnum<ProtocolVNC.Compression>(),
VNCEncoding = RandomEnum<ProtocolVNC.Encoding>(),
VNCProxyType = RandomEnum<ProtocolVNC.ProxyType>(),
VNCSmartSizeMode = RandomEnum<ProtocolVNC.SmartSizeMode>(),
};
if (randomizeInheritance)
connectionInfo.Inheritance = GetRandomizedInheritance(connectionInfo);
return connectionInfo;
}
internal static ConnectionInfoInheritance GetRandomizedInheritance(ConnectionInfo parent)
{
var inheritance = new ConnectionInfoInheritance(parent, true);
foreach (var property in inheritance.GetProperties())
{
property.SetValue(inheritance, RandomBool());
}
return inheritance;
}
internal static string RandomString()
{
return Guid.NewGuid().ToString("N");
}
internal static bool RandomBool()
{
return _random.Next() % 2 == 0;
}
internal static int RandomInt()
{
return _random.Next();
}
internal static T RandomEnum<T>() where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
throw new ArgumentException("T must be an enum");
var values = Enum.GetValues(typeof(T));
return (T)values.GetValue(_random.Next(values.Length));
}
}
}

View File

@@ -1,4 +1,5 @@
using System.IO;
using mRemoteNG.Tools;
namespace mRemoteNGTests.TestHelpers
{
@@ -18,9 +19,17 @@ namespace mRemoteNGTests.TestHelpers
File.Delete(file);
}
public static string NewTempFilePath()
public static void DeleteDirectory(string directory)
{
if (Directory.Exists(directory))
Directory.Delete(directory, true);
}
public static string NewTempFilePath(string extension = "")
{
var newPath = Path.Combine(GetTestSpecificTempDirectory(), Path.GetRandomFileName());
if (!string.IsNullOrWhiteSpace(extension))
newPath = newPath + extension;
var folderPath = Path.GetDirectoryName(newPath);
if (!Directory.Exists(folderPath))
Directory.CreateDirectory(folderPath);
@@ -35,5 +44,15 @@ namespace mRemoteNGTests.TestHelpers
{
return Path.Combine(Path.GetTempPath(), "mRemoteNGTests", Path.GetRandomFileName());
}
public static DisposableAction DisposableTempFile(out string filePath, string extension = "")
{
var file = NewTempFilePath(extension);
filePath = file;
File.AppendAllText(file, "");
return new DisposableAction(
() => {},
() => DeleteDirectory(Path.GetDirectoryName(file)));
}
}
}

View File

@@ -0,0 +1,136 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Enum = System.Enum;
namespace mRemoteNGTests.TestHelpers
{
internal static class Randomizer
{
private static readonly Random Random = new Random();
internal static string RandomString(params string[] excludedStrings)
{
return GetNonExcludedValue(() => Guid.NewGuid().ToString("N"), excludedStrings);
}
internal static bool RandomBool(bool? excludedBool = null)
{
if (excludedBool.HasValue)
return !excludedBool.Value;
return Random.Next() % 2 == 0;
}
internal static int RandomInt(int minValue = int.MinValue, int maxValue = int.MaxValue, params int[] excludeInts)
{
return GetNonExcludedValue(() => Random.Next(minValue, maxValue), excludeInts);
}
internal static DateTime RandomDateTime(params DateTime[] excludeTimes)
{
var date = GetNonExcludedValue(() =>
new DateTime(
RandomInt(minValue: 1990, maxValue: 2019),
RandomInt(minValue: 1, maxValue: 13),
RandomInt(minValue: 1, maxValue: 29),
RandomInt(minValue: 0, maxValue: 24),
RandomInt(minValue: 0, maxValue: 60),
RandomInt(minValue: 0, maxValue: 60)),
excludeTimes);
return date;
}
internal static T RandomEnum<T>(params object[] excludeValues) where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
throw new ArgumentException("T must be an enum");
return (T)RandomEnum(typeof(T), excludeValues);
}
internal static object RandomEnum(Type enumType, params object[] excludeValues)
{
if (!enumType.IsEnum)
throw new ArgumentException("enumType must be an enum");
var values = Enum.GetValues(enumType);
return GetNonExcludedValue(() => values.GetValue(Random.Next(values.Length)), excludeValues);
}
private static T GetNonExcludedValue<T>(Func<T> builder, params object[] excludedValues)
{
do
{
var value = builder();
if (!excludedValues.Contains(value))
return value;
} while (true);
}
/// <summary>
/// Randomizes the primitive-type settable properties of the given object.
/// Returns the same object instance to enable fluent method calls. It will
/// never choose the value that the property current holds. For booleans, this
/// means they will always be toggled rather than truly randomized.
/// </summary>
internal static T RandomizeValues<T>(this T con)
where T : class
{
var opByType = new Dictionary<Type, Action<PropertyInfo, T>>
{
{ typeof(int), (p, c) => p.SetValue(c, RandomInt(minValue: 0, excludeInts:(int)p.GetValue(c))) },
{ typeof(bool), (p, c) => p.SetValue(c, !(bool)p.GetValue(c)) },
{ typeof(string), (p, c) => p.SetValue(c, RandomString((string)p.GetValue(c))) },
{ typeof(DateTime), (p, c) => p.SetValue(c, RandomDateTime((DateTime)p.GetValue(c))) },
{ typeof(Enum), (p, c) => p.SetValue(c, RandomEnum(p.PropertyType, p.GetValue(c))) },
};
var settableProperties = con
.GetType()
.GetProperties()
.Where(p => p.GetSetMethod() != null);
foreach (var property in settableProperties)
{
if (opByType.TryGetValue(property.PropertyType, out var mutator))
mutator(property, con);
else if (opByType.TryGetValue(property.PropertyType.BaseType, out var mutator2))
mutator2(property, con);
}
return con;
}
/// <summary>
/// Toggles all <see cref="bool"/> settable properties
/// on the given object.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <param name="excludeProperties"></param>
/// <returns></returns>
internal static T ToggleAllBooleanProperties<T>(this T obj, params string[] excludeProperties)
where T : class
{
var settableBooleanProperties = obj
.GetType()
.GetProperties()
.Where(p =>
p.GetSetMethod() != null &&
p.PropertyType == typeof(bool) &&
!excludeProperties.Contains(p.Name));
foreach (var property in settableBooleanProperties)
{
var currentValue = (bool)property.GetValue(obj);
property.SetValue(obj, !currentValue);
}
return obj;
}
}
}

View File

@@ -0,0 +1,65 @@
namespace mRemoteNGTests.TestHelpers
{
/// <summary>
/// A ConnectionInfo that has only the serializable properties as string types.
/// Only used for testing.
/// </summary>
internal class SerializableConnectionInfoAllPropertiesOfType<TType>
{
public TType Description { get; set; }
public TType Icon { get; set; }
public TType Panel { get; set; }
public TType Username { get; set; }
public TType Password { get; set; }
public TType Domain { get; set; }
public TType Protocol { get; set; }
public TType ExtApp { get; set; }
public TType PuttySession { get; set; }
public TType ICAEncryptionStrength { get; set; }
public TType UseConsoleSession { get; set; }
public TType RDPAuthenticationLevel { get; set; }
public TType RDPMinutesToIdleTimeout { get; set; }
public TType RDPAlertIdleTimeout { get; set; }
public TType LoadBalanceInfo { get; set; }
public TType RenderingEngine { get; set; }
public TType UseCredSsp { get; set; }
public TType RDGatewayUsageMethod { get; set; }
public TType RDGatewayHostname { get; set; }
public TType RDGatewayUseConnectionCredentials { get; set; }
public TType RDGatewayUsername { get; set; }
public TType RDGatewayPassword { get; set; }
public TType RDGatewayDomain { get; set; }
public TType Resolution { get; set; }
public TType AutomaticResize { get; set; }
public TType Colors { get; set; }
public TType CacheBitmaps { get; set; }
public TType DisplayWallpaper { get; set; }
public TType DisplayThemes { get; set; }
public TType EnableFontSmoothing { get; set; }
public TType EnableDesktopComposition { get; set; }
public TType RedirectKeys { get; set; }
public TType RedirectDiskDrives { get; set; }
public TType RedirectPrinters { get; set; }
public TType RedirectClipboard { get; set; }
public TType RedirectPorts { get; set; }
public TType RedirectSmartCards { get; set; }
public TType RedirectSound { get; set; }
public TType SoundQuality { get; set; }
public TType PreExtApp { get; set; }
public TType PostExtApp { get; set; }
public TType MacAddress { get; set; }
public TType UserField { get; set; }
public TType Favorite { get; set; }
public TType VNCCompression { get; set; }
public TType VNCEncoding { get; set; }
public TType VNCAuthMode { get; set; }
public TType VNCProxyType { get; set; }
public TType VNCProxyIP { get; set; }
public TType VNCProxyPort { get; set; }
public TType VNCProxyUsername { get; set; }
public TType VNCProxyPassword { get; set; }
public TType VNCColors { get; set; }
public TType VNCSmartSizeMode { get; set; }
public TType VNCViewOnly { get; set; }
}
}

View File

@@ -0,0 +1,42 @@
using mRemoteNG.Tools;
using NUnit.Framework;
namespace mRemoteNGTests.Tools
{
public class DisposableActionTests
{
[Test]
public void InitializerActionRunsWhenObjectIsCreated()
{
var initializerRan = false;
new DisposableAction(() => initializerRan = true, () => { });
Assert.That(initializerRan);
}
[Test]
public void DisposalActionRunsWhenDisposeIsCalled()
{
var disposeActionRan = false;
var action = new DisposableAction(() => {}, () => disposeActionRan = true);
Assert.That(disposeActionRan, Is.False);
action.Dispose();
Assert.That(disposeActionRan, Is.True);
}
[Test]
public void DisposeActionOnlyExecutedOnceWhenCallingDisposeMultipleTimes()
{
var invokeCount = 0;
var action = new DisposableAction(() => { }, () => invokeCount++);
action.Dispose();
action.Dispose();
action.Dispose();
action.Dispose();
action.Dispose();
Assert.That(invokeCount, Is.EqualTo(1));
}
}
}

View File

@@ -0,0 +1,50 @@
using System;
using System.Linq;
using mRemoteNG.Tools.WindowsRegistry;
using NUnit.Framework;
namespace mRemoteNGTests.Tools.Registry
{
public class WindowsRegistryTests
{
private WindowsRegistry _registry;
[SetUp]
public void Setup()
{
_registry = new WindowsRegistry();
}
[Test]
public void CanGetSubkeyNames()
{
var subKeyNames = _registry.GetSubKeyNames(RegistryHive.CurrentUser, "Software");
Assert.That(subKeyNames, Does.Contain("Microsoft"));
}
[Test]
public void GetSubkeyNamesThrowsIfGivenNullKeyPath()
{
Assert.Throws<ArgumentNullException>(() => _registry.GetSubKeyNames(RegistryHive.CurrentUser, null));
}
[Test]
public void CanGetKeyValue()
{
var keyValue = _registry.GetKeyValue(RegistryHive.ClassesRoot, @".dll\PersistentHandler", "");
Assert.That(keyValue.FirstOrDefault(), Is.EqualTo("{098f2470-bae0-11cd-b579-08002b30bfeb}"));
}
[Test]
public void GetKeyValueThrowsIfGivenNullKeyPath()
{
Assert.Throws<ArgumentNullException>(() => _registry.GetKeyValue(RegistryHive.CurrentUser, null, ""));
}
[Test]
public void GetKeyValueThrowsIfGivenNullPropertyName()
{
Assert.Throws<ArgumentNullException>(() => _registry.GetKeyValue(RegistryHive.CurrentUser, "", null));
}
}
}

View File

@@ -8,7 +8,7 @@ using NUnit.Framework;
namespace mRemoteNGTests.Tree
{
public class NodeSearcherTests
public class NodeSearcherTests
{
private NodeSearcher _nodeSearcher;
private ContainerInfo _folder1;
@@ -104,6 +104,14 @@ namespace mRemoteNGTests.Tree
_con4 = new ConnectionInfo { Name = "con4", Description="description6", Hostname="hostname6" };
_con5 = new ConnectionInfo { Name = "con5", Description="description7", Hostname="hostname7" };
_folder1.Inheritance.TurnOffInheritanceCompletely();
_con1.Inheritance.TurnOffInheritanceCompletely();
_con2.Inheritance.TurnOffInheritanceCompletely();
_folder2.Inheritance.TurnOffInheritanceCompletely();
_con3.Inheritance.TurnOffInheritanceCompletely();
_con4.Inheritance.TurnOffInheritanceCompletely();
_con5.Inheritance.TurnOffInheritanceCompletely();
connectionTreeModel.AddRootNode(root);
root.AddChildRange(new [] { _folder1, _folder2, _con5 });
_folder1.AddChildRange(new [] { _con1, _con2 });

View File

@@ -1,4 +1,5 @@
using mRemoteNG.Tree.Root;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using NUnit.Framework;
@@ -46,5 +47,13 @@ namespace mRemoteNGTests.Tree
_rootNodeInfo.PasswordString = password;
Assert.That(_rootNodeInfo.PasswordString, Is.EqualTo(password));
}
[TestCase(RootNodeType.Connection, TreeNodeType.Root)]
[TestCase(RootNodeType.PuttySessions, TreeNodeType.PuttyRoot)]
public void RootNodeHasCorrectTreeNodeType(RootNodeType rootNodeType, TreeNodeType expectedTreeNodeType)
{
var rootNode = new RootNodeInfo(rootNodeType);
Assert.That(rootNode.GetTreeNodeType(), Is.EqualTo(expectedTreeNodeType));
}
}
}

View File

@@ -1,7 +1,7 @@
using System.Windows.Forms;
using mRemoteNG.Connection;
using mRemoteNG.Connection;
using mRemoteNG.Tree;
using NUnit.Framework;
using System.Windows.Forms;
namespace mRemoteNGTests.Tree
@@ -30,12 +30,12 @@ namespace mRemoteNGTests.Tree
Assert.That(deletionConfirmer.Confirm(_testConnectionInfo), Is.False);
}
private DialogResult MockClickYes(string promptMessage, string title, MessageBoxButtons buttons, MessageBoxIcon icon)
private DialogResult MockClickYes(string promptMessage)
{
return DialogResult.Yes;
}
private DialogResult MockClickNo(string promptMessage, string title, MessageBoxButtons buttons, MessageBoxIcon icon)
private DialogResult MockClickNo(string promptMessage)
{
return DialogResult.No;
}

View File

@@ -0,0 +1,323 @@
using System.Linq;
using System.Threading;
using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Tools.Clipboard;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNG.UI.Controls;
using NSubstitute;
using NUnit.Framework;
namespace mRemoteNGTests.UI.Controls
{
public class ConnectionTreeTests
{
private ConnectionTreeSearchTextFilter _filter;
private ConnectionTree _connectionTree;
[SetUp]
public void Setup()
{
_filter = new ConnectionTreeSearchTextFilter();
_connectionTree = new ConnectionTree
{
UseFiltering = true
};
}
[Test]
[Apartment(ApartmentState.STA)]
public void FilteringIsRetainedAndUpdatedWhenNodeDeleted()
{
// root
// |- folder1
// | |- con1
// | |- dontshowme
// |- folder2
// |- con2
var connectionTreeModel = new ConnectionTreeModel();
var root = new RootNodeInfo(RootNodeType.Connection);
var folder1 = new ContainerInfo {Name = "folder1"};
var folder2 = new ContainerInfo {Name = "folder2"};
var con1 = new ConnectionInfo {Name = "con1"};
var con2 = new ConnectionInfo {Name = "con2"};
var conDontShow = new ConnectionInfo {Name = "dontshowme" };
root.AddChildRange(new []{folder1, folder2});
folder1.AddChildRange(new []{con1, conDontShow});
folder2.AddChild(con2);
connectionTreeModel.AddRootNode(root);
_connectionTree.ConnectionTreeModel = connectionTreeModel;
// ensure all folders expanded
_connectionTree.ExpandAll();
// apply filtering on the tree
_filter.FilterText = "con";
_connectionTree.ModelFilter = _filter;
connectionTreeModel.DeleteNode(con1);
Assert.That(_connectionTree.IsFiltering, Is.True);
Assert.That(_connectionTree.FilteredObjects, Does.Not.Contain(con1));
Assert.That(_connectionTree.FilteredObjects, Does.Not.Contain(conDontShow));
Assert.That(_connectionTree.FilteredObjects, Does.Contain(con2));
}
[Test]
[Apartment(ApartmentState.STA)]
public void CannotAddConnectionToPuttySessionNode()
{
var connectionTreeModel = new ConnectionTreeModel();
var root = new RootNodeInfo(RootNodeType.Connection);
var puttyRoot = new RootNodeInfo(RootNodeType.PuttySessions);
connectionTreeModel.AddRootNode(root);
connectionTreeModel.AddRootNode(puttyRoot);
_connectionTree.ConnectionTreeModel = connectionTreeModel;
_connectionTree.ExpandAll();
_connectionTree.SelectedObject = puttyRoot;
_connectionTree.AddConnection();
Assert.That(puttyRoot.Children, Is.Empty);
}
[Test]
[Apartment(ApartmentState.STA)]
public void CannotAddFolderToPuttySessionNode()
{
var connectionTreeModel = new ConnectionTreeModel();
var root = new RootNodeInfo(RootNodeType.Connection);
var puttyRoot = new RootNodeInfo(RootNodeType.PuttySessions);
connectionTreeModel.AddRootNode(root);
connectionTreeModel.AddRootNode(puttyRoot);
_connectionTree.ConnectionTreeModel = connectionTreeModel;
_connectionTree.ExpandAll();
_connectionTree.SelectedObject = puttyRoot;
_connectionTree.AddFolder();
Assert.That(puttyRoot.Children, Is.Empty);
}
[Test]
[Apartment(ApartmentState.STA)]
public void CannotDuplicateRootConnectionNode()
{
var connectionTreeModel = new ConnectionTreeModel();
var root = new RootNodeInfo(RootNodeType.Connection);
connectionTreeModel.AddRootNode(root);
_connectionTree.ConnectionTreeModel = connectionTreeModel;
_connectionTree.ExpandAll();
_connectionTree.SelectedObject = root;
_connectionTree.DuplicateSelectedNode();
Assert.That(connectionTreeModel.RootNodes, Has.One.Items);
}
[Test]
[Apartment(ApartmentState.STA)]
public void CanDuplicateConnectionNode()
{
var connectionTreeModel = new ConnectionTreeModel();
var root = new RootNodeInfo(RootNodeType.Connection);
var con1 = new ConnectionInfo();
root.AddChild(con1);
connectionTreeModel.AddRootNode(root);
_connectionTree.ConnectionTreeModel = connectionTreeModel;
_connectionTree.ExpandAll();
_connectionTree.SelectedObject = con1;
_connectionTree.DuplicateSelectedNode();
Assert.That(root.Children, Has.Exactly(2).Items);
}
[Test]
[Apartment(ApartmentState.STA)]
public void CannotDuplicateRootPuttyNode()
{
var connectionTreeModel = new ConnectionTreeModel();
var puttyRoot = new RootNodeInfo(RootNodeType.PuttySessions);
connectionTreeModel.AddRootNode(puttyRoot);
_connectionTree.ConnectionTreeModel = connectionTreeModel;
_connectionTree.ExpandAll();
_connectionTree.SelectedObject = puttyRoot;
_connectionTree.DuplicateSelectedNode();
Assert.That(connectionTreeModel.RootNodes, Has.One.Items);
}
[Test]
[Apartment(ApartmentState.STA)]
public void CannotDuplicatePuttyConnectionNode()
{
var connectionTreeModel = new ConnectionTreeModel();
var puttyRoot = new RootNodeInfo(RootNodeType.PuttySessions);
var puttyConnection = new PuttySessionInfo();
puttyRoot.AddChild(puttyConnection);
connectionTreeModel.AddRootNode(puttyRoot);
_connectionTree.ConnectionTreeModel = connectionTreeModel;
_connectionTree.ExpandAll();
_connectionTree.SelectedObject = puttyConnection;
_connectionTree.DuplicateSelectedNode();
Assert.That(puttyRoot.Children, Has.One.Items);
}
[Test]
[Apartment(ApartmentState.STA)]
public void DuplicatingWithNoNodeSelectedDoesNothing()
{
var connectionTreeModel = new ConnectionTreeModel();
var puttyRoot = new RootNodeInfo(RootNodeType.PuttySessions);
connectionTreeModel.AddRootNode(puttyRoot);
_connectionTree.ConnectionTreeModel = connectionTreeModel;
_connectionTree.ExpandAll();
_connectionTree.SelectedObject = null;
_connectionTree.DuplicateSelectedNode();
Assert.That(connectionTreeModel.RootNodes, Has.One.Items);
}
[Test]
[Apartment(ApartmentState.STA)]
public void ExpandingAllItemsUpdatesColumnWidthAppropriately()
{
var connectionTreeModel = new ConnectionTreeModel();
var root = new RootNodeInfo(RootNodeType.Connection);
connectionTreeModel.AddRootNode(root);
ContainerInfo parent = root;
foreach (var i in Enumerable.Repeat("", 8))
{
var newContainer = new ContainerInfo {IsExpanded = false};
parent.AddChild(newContainer);
parent = newContainer;
}
_connectionTree.ConnectionTreeModel = connectionTreeModel;
var widthBefore = _connectionTree.Columns[0].Width;
_connectionTree.ExpandAll();
var widthAfter = _connectionTree.Columns[0].Width;
Assert.That(widthAfter, Is.GreaterThan(widthBefore));
}
[Test]
[Apartment(ApartmentState.STA)]
public void RenamingNodeWithNothingSelectedDoesNothing()
{
var connectionTreeModel = new ConnectionTreeModel();
var root = new RootNodeInfo(RootNodeType.Connection);
connectionTreeModel.AddRootNode(root);
_connectionTree.ConnectionTreeModel = connectionTreeModel;
_connectionTree.ExpandAll();
_connectionTree.SelectedObject = null;
Assert.DoesNotThrow(() => _connectionTree.RenameSelectedNode());
}
[Test]
[Apartment(ApartmentState.STA)]
public void CopyHostnameCopiesTheHostnameOfTheSelectedConnection()
{
var connectionTreeModel = new ConnectionTreeModel();
var root = new RootNodeInfo(RootNodeType.Connection);
var con1 = new ConnectionInfo {Hostname = "MyHost"};
root.AddChild(con1);
connectionTreeModel.AddRootNode(root);
_connectionTree.ConnectionTreeModel = connectionTreeModel;
_connectionTree.ExpandAll();
_connectionTree.SelectedObject = con1;
var clipboard = Substitute.For<IClipboard>();
_connectionTree.CopyHostnameSelectedNode(clipboard);
clipboard.Received(1).SetText(con1.Hostname);
}
[Test]
[Apartment(ApartmentState.STA)]
public void CopyHostnameCopiesTheNodeNameOfTheSelectedContainer()
{
var connectionTreeModel = new ConnectionTreeModel();
var root = new RootNodeInfo(RootNodeType.Connection);
var container = new ContainerInfo { Name = "MyFolder" };
root.AddChild(container);
connectionTreeModel.AddRootNode(root);
_connectionTree.ConnectionTreeModel = connectionTreeModel;
_connectionTree.ExpandAll();
_connectionTree.SelectedObject = container;
var clipboard = Substitute.For<IClipboard>();
_connectionTree.CopyHostnameSelectedNode(clipboard);
clipboard.Received(1).SetText(container.Name);
}
[Test]
[Apartment(ApartmentState.STA)]
public void CopyHostnameDoesNotCopyAnythingIfNoNodeSelected()
{
var connectionTreeModel = new ConnectionTreeModel();
var root = new RootNodeInfo(RootNodeType.Connection);
var con1 = new ConnectionInfo { Hostname = "MyHost" };
root.AddChild(con1);
connectionTreeModel.AddRootNode(root);
_connectionTree.ConnectionTreeModel = connectionTreeModel;
_connectionTree.ExpandAll();
_connectionTree.SelectedObject = null;
var clipboard = Substitute.For<IClipboard>();
_connectionTree.CopyHostnameSelectedNode(clipboard);
clipboard.DidNotReceiveWithAnyArgs().SetText("");
}
[Test]
[Apartment(ApartmentState.STA)]
public void CopyHostnameDoesNotCopyAnythingIfHostnameOfSelectedConnectionIsEmpty()
{
var connectionTreeModel = new ConnectionTreeModel();
var root = new RootNodeInfo(RootNodeType.Connection);
var con1 = new ConnectionInfo { Hostname = string.Empty };
root.AddChild(con1);
connectionTreeModel.AddRootNode(root);
_connectionTree.ConnectionTreeModel = connectionTreeModel;
_connectionTree.ExpandAll();
_connectionTree.SelectedObject = con1;
var clipboard = Substitute.For<IClipboard>();
_connectionTree.CopyHostnameSelectedNode(clipboard);
clipboard.DidNotReceiveWithAnyArgs().SetText("");
}
[Test]
[Apartment(ApartmentState.STA)]
public void CopyHostnameDoesNotCopyAnythingIfNameOfSelectedContainerIsEmpty()
{
var connectionTreeModel = new ConnectionTreeModel();
var root = new RootNodeInfo(RootNodeType.Connection);
var con1 = new ContainerInfo { Name = string.Empty};
root.AddChild(con1);
connectionTreeModel.AddRootNode(root);
_connectionTree.ConnectionTreeModel = connectionTreeModel;
_connectionTree.ExpandAll();
_connectionTree.SelectedObject = con1;
var clipboard = Substitute.For<IClipboard>();
_connectionTree.CopyHostnameSelectedNode(clipboard);
clipboard.DidNotReceiveWithAnyArgs().SetText("");
}
}
}

View File

@@ -43,8 +43,8 @@ namespace mRemoteNGTests.UI.Controls
//
// SecureTextBoxTestForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.ClientSize = new System.Drawing.Size(256, 45);
this.Controls.Add(this.secureTextBox1);
this.Name = "SecureTextBoxTestForm";

View File

@@ -32,8 +32,8 @@
//
// TestForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.ClientSize = new System.Drawing.Size(284, 262);
this.Name = "TestForm";
this.Text = "TestForm";

View File

@@ -40,8 +40,8 @@
//
// TextBoxExtensionsTestForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.ClientSize = new System.Drawing.Size(220, 48);
this.Controls.Add(this.textBox1);
this.Name = "TextBoxExtensionsTestForm";

View File

@@ -0,0 +1,123 @@
using System;
using System.Drawing;
using mRemoteNG.UI;
using mRemoteNG.UI.GraphicsUtilities;
using mRemoteNGTests.Properties;
using NSubstitute;
using NUnit.Framework;
namespace mRemoteNGTests.UI
{
public class DisplayPropertiesTests
{
[Test]
public void ScaleHeightReturnsValueScaledByHeightScalingFactor()
{
var graphics = Substitute.For<IGraphicsProvider>();
graphics.GetResolutionScalingFactor().Returns(new SizeF(4, 2));
var sut = new DisplayProperties(graphics);
var initialValue = 10;
var scaledValue = sut.ScaleHeight(initialValue);
Assert.That(scaledValue, Is.EqualTo(sut.ResolutionScalingFactor.Height * initialValue));
}
[Test]
public void ScaleWidthReturnsValueScaledByWidthScalingFactor()
{
var graphics = Substitute.For<IGraphicsProvider>();
graphics.GetResolutionScalingFactor().Returns(new SizeF(4, 2));
var sut = new DisplayProperties(graphics);
var initialValue = 10;
var scaledValue = sut.ScaleWidth(initialValue);
Assert.That(scaledValue, Is.EqualTo(sut.ResolutionScalingFactor.Width * initialValue));
}
[Test]
public void ScaleSizeReturnsNewSizeWithCorrectlyScaledHeight()
{
var graphics = Substitute.For<IGraphicsProvider>();
graphics.GetResolutionScalingFactor().Returns(new SizeF(4, 2));
var sut = new DisplayProperties(graphics);
var initialValue = new Size(12, 16);
var scaledValue = sut.ScaleSize(initialValue);
Assert.That(scaledValue.Height, Is.EqualTo(sut.ResolutionScalingFactor.Height * initialValue.Height));
}
[Test]
public void ScaleSizeReturnsNewSizeWithCorrectlyScaledWidth()
{
var graphics = Substitute.For<IGraphicsProvider>();
graphics.GetResolutionScalingFactor().Returns(new SizeF(4, 2));
var sut = new DisplayProperties(graphics);
var initialValue = new Size(12, 16);
var scaledValue = sut.ScaleSize(initialValue);
Assert.That(scaledValue.Width, Is.EqualTo(sut.ResolutionScalingFactor.Width * initialValue.Width));
}
[Test]
public void ScaleImageReturnsNewImageWithCorrectlyScaledHeight()
{
var graphics = Substitute.For<IGraphicsProvider>();
graphics.GetResolutionScalingFactor().Returns(new SizeF(4, 2));
var sut = new DisplayProperties(graphics);
var initialValue = Resources.TestImage;
var scaledValue = sut.ScaleImage(initialValue);
Assert.That(scaledValue.Height, Is.EqualTo(sut.ResolutionScalingFactor.Height * initialValue.Height));
}
[Test]
public void ScaleImageReturnsNewImageWithCorrectlyScaledWidth()
{
var graphics = Substitute.For<IGraphicsProvider>();
graphics.GetResolutionScalingFactor().Returns(new SizeF(4, 2));
var sut = new DisplayProperties(graphics);
var initialValue = Resources.TestImage;
var scaledValue = sut.ScaleImage(initialValue);
Assert.That(scaledValue.Width, Is.EqualTo(sut.ResolutionScalingFactor.Width * initialValue.Width));
}
[Test]
public void ResolutionScalingFactorAlwaysReturnsMostUpdatedValue()
{
var graphics = Substitute.For<IGraphicsProvider>();
graphics.GetResolutionScalingFactor().Returns(new SizeF(4, 4));
var sut = new DisplayProperties(graphics);
graphics.GetResolutionScalingFactor().Returns(new SizeF(8, 8));
Assert.That(sut.ResolutionScalingFactor.Width, Is.EqualTo(8));
}
[Test]
public void AttemptingToScaleANullImageWillThrowAnException()
{
var sut = new DisplayProperties(Substitute.For<IGraphicsProvider>());
Assert.Throws<ArgumentNullException>(() => sut.ScaleImage((Image)null));
}
[Test]
public void AttemptingToScaleANullIconWillThrowAnException()
{
var sut = new DisplayProperties(Substitute.For<IGraphicsProvider>());
Assert.Throws<ArgumentNullException>(() => sut.ScaleImage((Icon)null));
}
[Test]
public void AttemptingToCallConstructorWithNullGraphicsProviderWillThrow()
{
// ReSharper disable once ObjectCreationAsStatement
Assert.Throws<ArgumentNullException>(() => new DisplayProperties(null));
}
}
}

View File

@@ -5,7 +5,7 @@ namespace mRemoteNGTests.UI.Forms
{
public class OptionsFormSetupAndTeardown
{
protected frmOptions _optionsForm;
protected FrmOptions _optionsForm;
[OneTimeSetUp]
public void OnetimeSetup()
@@ -15,7 +15,7 @@ namespace mRemoteNGTests.UI.Forms
[SetUp]
public void Setup()
{
_optionsForm = new frmOptions();
_optionsForm = new FrmOptions();
_optionsForm.Show();
}

View File

@@ -1,10 +1,10 @@
using NUnit.Framework;
using mRemoteNG.UI.Forms;
using NUnit.Extensions.Forms;
using mRemoteNG.UI.Forms;
using NUnit.Framework;
namespace mRemoteNGTests.UI.Forms
{
[TestFixture]
[TestFixture]
public class PasswordFormTests
{
PasswordForm _passwordForm;
@@ -27,6 +27,7 @@ namespace mRemoteNGTests.UI.Forms
}
[Test]
[SetUICulture("en-US")]
public void PasswordFormText()
{
FormTester formTester = new FormTester("PasswordForm");

View File

@@ -0,0 +1,226 @@
using System;
using System.Collections.Generic;
using System.Linq;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Connection.Protocol.RDP;
using mRemoteNG.Connection.Protocol.VNC;
using mRemoteNG.Container;
using mRemoteNG.Tree.Root;
using mRemoteNG.UI.Window;
using NUnit.Framework;
namespace mRemoteNGTests.UI.Window.ConfigWindowTests
{
public class ConfigWindowGeneralTests
{
private ConfigWindow _configWindow;
[SetUp]
public void Setup()
{
_configWindow = new ConfigWindow
{
PropertiesVisible = true
};
}
[TestCaseSource(nameof(ConnectionInfoGeneralTestCases))]
public void PropertyGridShowCorrectPropertiesForConnectionInfo(ConnectionInfo connectionInfo, IEnumerable<string> expectedVisibleProperties)
{
_configWindow.SelectedTreeNode = connectionInfo;
Assert.That(_configWindow.VisibleObjectProperties, Is.EquivalentTo(expectedVisibleProperties));
}
[Test]
public void PropertyGridShowCorrectPropertiesForRootConnectionInfo()
{
var expectedVisibleProperties = new[]
{
nameof(RootNodeInfo.Name),
nameof(RootNodeInfo.Password),
};
_configWindow.SelectedTreeNode = new RootNodeInfo(RootNodeType.Connection);
Assert.That(_configWindow.VisibleObjectProperties, Is.EquivalentTo(expectedVisibleProperties));
}
[Test]
public void PropertyGridShowCorrectPropertiesForRootPuttyInfo()
{
var expectedVisibleProperties = new[]
{
nameof(RootNodeInfo.Name),
};
_configWindow.SelectedTreeNode = new RootPuttySessionsNodeInfo();
Assert.That(_configWindow.VisibleObjectProperties, Is.EquivalentTo(expectedVisibleProperties));
}
private static IEnumerable<TestCaseData> ConnectionInfoGeneralTestCases()
{
var protocolTypes = typeof(ProtocolType).GetEnumValues().OfType<ProtocolType>();
var testCases = new List<TestCaseData>();
foreach (var protocol in protocolTypes)
{
var expectedPropertyListConnection = BuildExpectedConnectionInfoPropertyList(protocol, false);
var connectionInfo = ConstructConnectionInfo(protocol, false);
var testCaseConnection = new TestCaseData(connectionInfo, expectedPropertyListConnection)
.SetName(protocol + ", ConnectionInfo");
testCases.Add(testCaseConnection);
var expectedPropertyListContainer = BuildExpectedConnectionInfoPropertyList(protocol, true);
var containerInfo = ConstructConnectionInfo(protocol, true);
var testCaseContainer = new TestCaseData(containerInfo, expectedPropertyListContainer)
.SetName(protocol + ", ContainerInfo");
testCases.Add(testCaseContainer);
}
return testCases;
}
internal static ConnectionInfo ConstructConnectionInfo(ProtocolType protocol, bool isContainer)
{
// build connection info. set certain connection properties so
// that toggled properties are hidden in the property grid. We
// will test those separately in the special protocol tests.
var node = isContainer
? new ContainerInfo()
: new ConnectionInfo();
node.Protocol = protocol;
node.Resolution = RdpProtocol.RDPResolutions.Res800x600;
node.RDGatewayUsageMethod = RdpProtocol.RDGatewayUsageMethod.Never;
node.RDGatewayUseConnectionCredentials = RdpProtocol.RDGatewayUseConnectionCredentials.Yes;
node.RedirectSound = RdpProtocol.RDPSounds.DoNotPlay;
node.VNCAuthMode = ProtocolVNC.AuthMode.AuthVNC;
node.VNCProxyType = ProtocolVNC.ProxyType.ProxyNone;
node.Inheritance.TurnOffInheritanceCompletely();
return node;
}
internal static List<string> BuildExpectedConnectionInfoPropertyList(ProtocolType protocol, bool isContainer)
{
var expectedProperties = new List<string>
{
nameof(ConnectionInfo.Name),
nameof(ConnectionInfo.Description),
nameof(ConnectionInfo.Icon),
nameof(ConnectionInfo.Panel),
nameof(ConnectionInfo.Protocol),
nameof(ConnectionInfo.PreExtApp),
nameof(ConnectionInfo.PostExtApp),
nameof(ConnectionInfo.MacAddress),
nameof(ConnectionInfo.UserField),
nameof(ConnectionInfo.Favorite),
};
if (!isContainer)
{
expectedProperties.AddRange(new []
{
nameof(ConnectionInfo.Hostname),
});
}
switch (protocol)
{
case ProtocolType.RDP:
expectedProperties.AddRange(new []
{
nameof(ConnectionInfo.Username),
nameof(ConnectionInfo.Password),
nameof(ConnectionInfo.Domain),
nameof(ConnectionInfo.Port),
nameof(ConnectionInfo.UseConsoleSession),
nameof(ConnectionInfo.RDPAuthenticationLevel),
nameof(ConnectionInfo.RDPMinutesToIdleTimeout),
nameof(ConnectionInfo.LoadBalanceInfo),
nameof(ConnectionInfo.UseCredSsp),
nameof(ConnectionInfo.RDGatewayUsageMethod),
nameof(ConnectionInfo.Resolution),
nameof(ConnectionInfo.Colors),
nameof(ConnectionInfo.CacheBitmaps),
nameof(ConnectionInfo.DisplayWallpaper),
nameof(ConnectionInfo.DisplayThemes),
nameof(ConnectionInfo.EnableFontSmoothing),
nameof(ConnectionInfo.EnableDesktopComposition),
nameof(ConnectionInfo.RedirectKeys),
nameof(ConnectionInfo.RedirectDiskDrives),
nameof(ConnectionInfo.RedirectPrinters),
nameof(ConnectionInfo.RedirectClipboard),
nameof(ConnectionInfo.RedirectPorts),
nameof(ConnectionInfo.RedirectSmartCards),
nameof(ConnectionInfo.RedirectSound),
});
break;
case ProtocolType.VNC:
expectedProperties.AddRange(new []
{
nameof(ConnectionInfo.Password),
nameof(ConnectionInfo.Port),
nameof(ConnectionInfo.VNCSmartSizeMode),
nameof(ConnectionInfo.VNCViewOnly),
});
break;
case ProtocolType.SSH1:
case ProtocolType.SSH2:
expectedProperties.AddRange(new []
{
nameof(ConnectionInfo.Username),
nameof(ConnectionInfo.Password),
nameof(ConnectionInfo.Port),
nameof(ConnectionInfo.PuttySession)
});
break;
case ProtocolType.Telnet:
case ProtocolType.Rlogin:
case ProtocolType.RAW:
expectedProperties.AddRange(new[]
{
nameof(ConnectionInfo.Port),
nameof(ConnectionInfo.PuttySession),
});
break;
case ProtocolType.HTTP:
case ProtocolType.HTTPS:
expectedProperties.AddRange(new []
{
nameof(ConnectionInfo.Username),
nameof(ConnectionInfo.Password),
nameof(ConnectionInfo.Port),
nameof(ConnectionInfo.RenderingEngine),
});
break;
case ProtocolType.ICA:
expectedProperties.AddRange(new []
{
nameof(ConnectionInfo.Username),
nameof(ConnectionInfo.Password),
nameof(ConnectionInfo.Domain),
nameof(ConnectionInfo.ICAEncryptionStrength),
nameof(ConnectionInfo.Resolution),
nameof(ConnectionInfo.Colors),
nameof(ConnectionInfo.CacheBitmaps),
});
break;
case ProtocolType.IntApp:
expectedProperties.AddRange(new[]
{
nameof(ConnectionInfo.Username),
nameof(ConnectionInfo.Password),
nameof(ConnectionInfo.Domain),
nameof(ConnectionInfo.Port),
nameof(ConnectionInfo.ExtApp),
});
break;
default:
throw new ArgumentOutOfRangeException(nameof(protocol), protocol, null);
}
return expectedProperties;
}
}
}

View File

@@ -0,0 +1,73 @@
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Connection.Protocol.RDP;
using NUnit.Framework;
namespace mRemoteNGTests.UI.Window.ConfigWindowTests
{
public class ConfigWindowRdpSpecialTests : ConfigWindowSpecialTestsBase
{
protected override ProtocolType Protocol => ProtocolType.RDP;
[Test]
public void PropertyShownWhenActive_RdpMinutesToIdleTimeout()
{
ConnectionInfo.RDPMinutesToIdleTimeout = 1;
ExpectedPropertyList.Add(nameof(mRemoteNG.Connection.ConnectionInfo.RDPAlertIdleTimeout));
RunVerification();
}
[TestCase(RdpProtocol.RDGatewayUsageMethod.Always)]
[TestCase(RdpProtocol.RDGatewayUsageMethod.Detect)]
public void RdGatewayPropertiesShown_WhenRdGatewayUsageMethodIsNotNever(RdpProtocol.RDGatewayUsageMethod gatewayUsageMethod)
{
ConnectionInfo.RDGatewayUsageMethod = gatewayUsageMethod;
ConnectionInfo.RDGatewayUseConnectionCredentials = RdpProtocol.RDGatewayUseConnectionCredentials.Yes;
ExpectedPropertyList.AddRange(new []
{
nameof(mRemoteNG.Connection.ConnectionInfo.RDGatewayHostname),
nameof(mRemoteNG.Connection.ConnectionInfo.RDGatewayUseConnectionCredentials)
});
RunVerification();
}
[TestCase(RdpProtocol.RDGatewayUseConnectionCredentials.No)]
[TestCase(RdpProtocol.RDGatewayUseConnectionCredentials.SmartCard)]
public void RdGatewayPropertiesShown_WhenRDGatewayUseConnectionCredentialsIsNotYes(RdpProtocol.RDGatewayUseConnectionCredentials useConnectionCredentials)
{
ConnectionInfo.RDGatewayUsageMethod = RdpProtocol.RDGatewayUsageMethod.Always;
ConnectionInfo.RDGatewayUseConnectionCredentials = useConnectionCredentials;
ExpectedPropertyList.AddRange(new []
{
nameof(mRemoteNG.Connection.ConnectionInfo.RDGatewayHostname),
nameof(mRemoteNG.Connection.ConnectionInfo.RDGatewayUsername),
nameof(mRemoteNG.Connection.ConnectionInfo.RDGatewayPassword),
nameof(mRemoteNG.Connection.ConnectionInfo.RDGatewayDomain),
nameof(mRemoteNG.Connection.ConnectionInfo.RDGatewayUseConnectionCredentials)
});
RunVerification();
}
[Test]
public void SoundQualityPropertyShown_WhenRdpSoundsSetToBringToThisComputer()
{
ConnectionInfo.RedirectSound = RdpProtocol.RDPSounds.BringToThisComputer;
ExpectedPropertyList.Add(nameof(mRemoteNG.Connection.ConnectionInfo.SoundQuality));
RunVerification();
}
[TestCase(RdpProtocol.RDPResolutions.FitToWindow)]
[TestCase(RdpProtocol.RDPResolutions.Fullscreen)]
public void AutomaticResizePropertyShown_WhenResolutionIsDynamic(RdpProtocol.RDPResolutions resolution)
{
ConnectionInfo.Resolution = resolution;
ExpectedPropertyList.Add(nameof(mRemoteNG.Connection.ConnectionInfo.AutomaticResize));
RunVerification();
}
}
}

View File

@@ -0,0 +1,37 @@
using System.Collections.Generic;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.UI.Window;
using NUnit.Framework;
namespace mRemoteNGTests.UI.Window.ConfigWindowTests
{
public abstract class ConfigWindowSpecialTestsBase
{
protected abstract ProtocolType Protocol { get; }
protected bool TestAgainstContainerInfo { get; set; } = false;
protected ConfigWindow ConfigWindow;
protected ConnectionInfo ConnectionInfo;
protected List<string> ExpectedPropertyList;
[SetUp]
public virtual void Setup()
{
ConnectionInfo = ConfigWindowGeneralTests.ConstructConnectionInfo(Protocol, TestAgainstContainerInfo);
ExpectedPropertyList = ConfigWindowGeneralTests.BuildExpectedConnectionInfoPropertyList(Protocol, TestAgainstContainerInfo);
ConfigWindow = new ConfigWindow
{
PropertiesVisible = true,
};
}
public void RunVerification()
{
ConfigWindow.SelectedTreeNode = ConnectionInfo;
Assert.That(
ConfigWindow.VisibleObjectProperties,
Is.EquivalentTo(ExpectedPropertyList));
}
}
}

View File

@@ -0,0 +1,37 @@
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Connection.Protocol.VNC;
using NUnit.Framework;
namespace mRemoteNGTests.UI.Window.ConfigWindowTests
{
public class ConfigWindowVncSpecialTests : ConfigWindowSpecialTestsBase
{
protected override ProtocolType Protocol => ProtocolType.VNC;
[Test]
public void UserDomainPropertiesShown_WhenAuthModeIsWindows()
{
ConnectionInfo.VNCAuthMode = ProtocolVNC.AuthMode.AuthWin;
ExpectedPropertyList.AddRange(new []
{
nameof(ConnectionInfo.Username),
nameof(ConnectionInfo.Domain),
});
}
[TestCase(ProtocolVNC.ProxyType.ProxyHTTP)]
[TestCase(ProtocolVNC.ProxyType.ProxySocks5)]
[TestCase(ProtocolVNC.ProxyType.ProxyUltra)]
public void ProxyPropertiesShown_WhenProxyModeIsNotNone(ProtocolVNC.ProxyType proxyType)
{
ConnectionInfo.VNCProxyType = proxyType;
ExpectedPropertyList.AddRange(new[]
{
nameof(ConnectionInfo.VNCProxyIP),
nameof(ConnectionInfo.VNCProxyPort),
nameof(ConnectionInfo.VNCProxyUsername),
nameof(ConnectionInfo.VNCProxyPassword),
});
}
}
}

View File

@@ -4,11 +4,11 @@
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="WeifenLuo.WinFormsUI.Docking" publicKeyToken="5cded1a1a0a7b481" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.16.0.0" newVersion="2.16.0.0" />
<bindingRedirect oldVersion="0.0.0.0-3.0.6.0" newVersion="3.0.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\NUnit.3.11.0\build\NUnit.props" Condition="Exists('..\packages\NUnit.3.11.0\build\NUnit.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
@@ -17,6 +18,8 @@
<IsCodedUITest>False</IsCodedUITest>
<TestProjectType>UnitTest</TestProjectType>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
@@ -55,21 +58,21 @@
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="BouncyCastle.Crypto, Version=1.8.1.0, Culture=neutral, PublicKeyToken=0e99375e54769942">
<HintPath>..\packages\BouncyCastle.1.8.1\lib\BouncyCastle.Crypto.dll</HintPath>
<Reference Include="BouncyCastle.Crypto, Version=1.8.4.0, Culture=neutral, PublicKeyToken=0e99375e54769942">
<HintPath>..\packages\BouncyCastle.1.8.4\lib\BouncyCastle.Crypto.dll</HintPath>
</Reference>
<Reference Include="Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>..\packages\Castle.Core.4.2.0\lib\net45\Castle.Core.dll</HintPath>
<HintPath>..\packages\Castle.Core.4.3.1\lib\net45\Castle.Core.dll</HintPath>
</Reference>
<Reference Include="log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\packages\log4net.2.0.8\lib\net45-full\log4net.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="NSubstitute, Version=3.1.0.0, Culture=neutral, PublicKeyToken=92dd2e9066daa5ca, processorArchitecture=MSIL">
<HintPath>..\packages\NSubstitute.3.1.0\lib\net46\NSubstitute.dll</HintPath>
<Reference Include="NSubstitute, Version=4.0.0.0, Culture=neutral, PublicKeyToken=92dd2e9066daa5ca, processorArchitecture=MSIL">
<HintPath>..\packages\NSubstitute.4.0.0\lib\net46\NSubstitute.dll</HintPath>
</Reference>
<Reference Include="nunit.framework, Version=3.9.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll</HintPath>
<Reference Include="nunit.framework, Version=3.11.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.11.0\lib\net45\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="NUnitForms">
<HintPath>nUnitForms\bin\NUnitForms.dll</HintPath>
@@ -82,14 +85,17 @@
<Reference Include="System.Data" />
<Reference Include="System.DirectoryServices" />
<Reference Include="System.Drawing" />
<Reference Include="System.Threading.Tasks.Extensions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.4.0\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Extensions.dll</HintPath>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard1.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.2\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" />
<Reference Include="WeifenLuo.WinFormsUI.Docking, Version=2.16.0.0, Culture=neutral, PublicKeyToken=5cded1a1a0a7b481, processorArchitecture=MSIL">
<HintPath>..\packages\DockPanelSuite.2.16.1\lib\net40\WeifenLuo.WinFormsUI.Docking.dll</HintPath>
<Reference Include="WeifenLuo.WinFormsUI.Docking, Version=3.0.6.0, Culture=neutral, PublicKeyToken=5cded1a1a0a7b481, processorArchitecture=MSIL">
<HintPath>..\packages\DockPanelSuite.3.0.6\lib\net40\WeifenLuo.WinFormsUI.Docking.dll</HintPath>
</Reference>
<Reference Include="WindowsBase" />
</ItemGroup>
@@ -108,6 +114,7 @@
</Otherwise>
</Choose>
<ItemGroup>
<Compile Include="App\ImportTests.cs" />
<Compile Include="App\UpdaterTests.cs" />
<Compile Include="BinaryFileTests.cs" />
<Compile Include="Config\Connections\Multiuser\ConnectionsUpdateAvailableEventArgsTests.cs" />
@@ -146,6 +153,7 @@
<Compile Include="Connection\ConnectionInfoComparerTests.cs" />
<Compile Include="Connection\Protocol\IntegratedProgramTests.cs" />
<Compile Include="Connection\Protocol\ProtocolListTests.cs" />
<Compile Include="Container\RootNodeInfoTests.cs" />
<Compile Include="Credential\CompositeRepositoryUnlockerTests.cs" />
<Compile Include="Credential\CredentialChangedEventArgsTests.cs" />
<Compile Include="Credential\CredentialDeletionMsgBoxConfirmerTests.cs" />
@@ -169,12 +177,17 @@
<Compile Include="Security\PasswordCreation\PasswordLengthConstraintTests.cs" />
<Compile Include="Security\RandomGeneratorTests.cs" />
<Compile Include="Security\SecureStringExtensionsTests.cs" />
<Compile Include="TestHelpers\ConnectionInfoHelpers.cs" />
<Compile Include="TestHelpers\ConnectionTreeModelBuilder.cs" />
<Compile Include="Security\XmlCryptoProviderBuilderTests.cs" />
<Compile Include="TestHelpers\FileTestHelpers.cs" />
<Compile Include="TestHelpers\Randomizer.cs" />
<Compile Include="TestHelpers\SerializableConnectionInfoAllPropertiesOfType.cs" />
<Compile Include="Tools\DisposableActionTests.cs" />
<Compile Include="Tools\ExternalToolsArgumentParserTests.cs" />
<Compile Include="Tools\FullyObservableCollectionTests.cs" />
<Compile Include="Tools\OptionalTests.cs" />
<Compile Include="Tools\Registry\WindowsRegistryTests.cs" />
<Compile Include="Tree\ClickHandlers\TreeNodeCompositeClickHandlerTests.cs" />
<Compile Include="Tree\ConnectionTreeDragAndDropHandlerTests.cs" />
<Compile Include="Tree\ConnectionTreeModelTests.cs" />
@@ -204,6 +217,7 @@
<Compile Include="Tree\RootNodeInfoTests.cs" />
<Compile Include="Tree\ClickHandlers\SwitchToConnectionClickHandlerTests.cs" />
<Compile Include="Tree\SelectedConnectionDeletionConfirmerTests.cs" />
<Compile Include="UI\Controls\ConnectionTreeTests.cs" />
<Compile Include="UI\Controls\PageSequenceTests.cs" />
<Compile Include="UI\Controls\SecureTextBoxTestForm.cs">
<SubType>Form</SubType>
@@ -225,9 +239,14 @@
<DependentUpon>TextBoxExtensionsTestForm.cs</DependentUpon>
</Compile>
<Compile Include="UI\Controls\TextBoxExtensionsTests.cs" />
<Compile Include="UI\DisplayPropertiesTests.cs" />
<Compile Include="UI\Forms\OptionsFormSetupAndTeardown.cs" />
<Compile Include="UI\Forms\PasswordFormTests.cs" />
<Compile Include="UI\WindowListTests.cs" />
<Compile Include="UI\Window\ConfigWindowTests\ConfigWindowGeneralTests.cs" />
<Compile Include="UI\Window\ConfigWindowTests\ConfigWindowRdpSpecialTests.cs" />
<Compile Include="UI\Window\ConfigWindowTests\ConfigWindowSpecialTestsBase.cs" />
<Compile Include="UI\Window\ConfigWindowTests\ConfigWindowVncSpecialTests.cs" />
<Compile Include="UI\Window\ConnectionTreeWindowTests.cs" />
</ItemGroup>
<ItemGroup>
@@ -257,6 +276,7 @@
<None Include="Resources\test_rdcman_v2_2_badschemaversion.rdg" />
<None Include="Resources\test_rdcman_v2_2_schema1.rdg" />
<None Include="Resources\test_RDCMan_v2_7_schema3.rdg" />
<None Include="Resources\test_rdcman_v2_7_schema3_null_values.rdg" />
<None Include="Resources\test_remotedesktopconnection.rdp" />
</ItemGroup>
<ItemGroup>
@@ -285,6 +305,7 @@
<Content Include="Resources\beta-update.txt" />
<Content Include="Resources\dev-update-portable.txt" />
<Content Include="Resources\dev-update.txt" />
<None Include="Resources\TestImage.bmp" />
<Content Include="Resources\update-portable.txt" />
<Content Include="Resources\update.txt" />
</ItemGroup>
@@ -314,6 +335,12 @@
</Choose>
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\NUnit.3.11.0\build\NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit.3.11.0\build\NUnit.props'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">

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