diff --git a/mRemoteNG.lutconfig b/mRemoteNG.lutconfig new file mode 100644 index 00000000..596a8603 --- /dev/null +++ b/mRemoteNG.lutconfig @@ -0,0 +1,6 @@ + + + true + true + 180000 + \ No newline at end of file diff --git a/mRemoteNG/App/Info/ConnectionsFileInfo.cs b/mRemoteNG/App/Info/ConnectionsFileInfo.cs index ded493ff..05f2ce09 100644 --- a/mRemoteNG/App/Info/ConnectionsFileInfo.cs +++ b/mRemoteNG/App/Info/ConnectionsFileInfo.cs @@ -9,6 +9,6 @@ namespace mRemoteNG.App.Info public static readonly string DefaultConnectionsPath = SettingsFileInfo.SettingsPath; public static readonly string DefaultConnectionsFile = "confCons.xml"; public static readonly string DefaultConnectionsFileNew = "confConsNew.xml"; - public static readonly Version ConnectionFileVersion = new Version(3, 0); + public static readonly Version ConnectionFileVersion = new Version(2, 8); } } \ No newline at end of file diff --git a/mRemoteNG/App/Info/GeneralAppInfo.cs b/mRemoteNG/App/Info/GeneralAppInfo.cs index b40ae9e6..639922e1 100644 --- a/mRemoteNG/App/Info/GeneralAppInfo.cs +++ b/mRemoteNG/App/Info/GeneralAppInfo.cs @@ -20,7 +20,7 @@ namespace mRemoteNG.App.Info public const string UrlDocumentation = "https://mremoteng.readthedocs.io/en/latest/"; public static string ApplicationVersion = Application.ProductVersion; public static readonly string ProductName = Application.ProductName; - public static readonly string Copyright = ((AssemblyCopyrightAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyCopyrightAttribute), false)).Copyright; + public static readonly string Copyright = ((AssemblyCopyrightAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyCopyrightAttribute), false))?.Copyright; public static readonly string HomePath = Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location); //public static string ReportingFilePath = ""; diff --git a/mRemoteNG/App/Initialization/StartupDataLogger.cs b/mRemoteNG/App/Initialization/StartupDataLogger.cs index 58efbf8b..33faa4ba 100644 --- a/mRemoteNG/App/Initialization/StartupDataLogger.cs +++ b/mRemoteNG/App/Initialization/StartupDataLogger.cs @@ -15,10 +15,7 @@ namespace mRemoteNG.App.Initialization public StartupDataLogger(MessageCollector messageCollector) { - if (messageCollector == null) - throw new ArgumentNullException(nameof(messageCollector)); - - _messageCollector = messageCollector; + _messageCollector = messageCollector ?? throw new ArgumentNullException(nameof(messageCollector)); } public void LogStartupData() @@ -50,7 +47,7 @@ namespace mRemoteNG.App.Initialization .Get()) { var managementObject = (ManagementObject)o; - osVersion = Convert.ToString(managementObject.GetPropertyValue("Caption")).Trim(); + osVersion = Convert.ToString(managementObject.GetPropertyValue("Caption"))?.Trim(); servicePack = GetOSServicePack(servicePack, managementObject); } } @@ -79,8 +76,7 @@ namespace mRemoteNG.App.Initialization var architecture = string.Empty; try { - foreach (var o in new ManagementObjectSearcher("SELECT AddressWidth FROM Win32_Processor WHERE DeviceID=\'CPU0\'") - .Get()) + foreach (var o in new ManagementObjectSearcher("SELECT AddressWidth FROM Win32_Processor WHERE DeviceID=\'CPU0\'").Get()) { var managementObject = (ManagementObject)o; var addressWidth = Convert.ToInt32(managementObject.GetPropertyValue("AddressWidth")); @@ -118,8 +114,7 @@ namespace mRemoteNG.App.Initialization private void LogCultureData() { - var data = - $"System Culture: {Thread.CurrentThread.CurrentUICulture.Name}/{Thread.CurrentThread.CurrentUICulture.NativeName}"; + var data = $"System Culture: {Thread.CurrentThread.CurrentUICulture.Name}/{Thread.CurrentThread.CurrentUICulture.NativeName}"; _messageCollector.AddMessage(MessageClass.InformationMsg, data, true); } } diff --git a/mRemoteNG/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs b/mRemoteNG/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs index a9d25fa7..89c96a02 100644 --- a/mRemoteNG/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs +++ b/mRemoteNG/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs @@ -29,8 +29,7 @@ namespace mRemoteNG.Config.Connections.Multiuser { _updateChecker.UpdateCheckStarted += OnUpdateCheckStarted; _updateChecker.UpdateCheckFinished += OnUpdateCheckFinished; - _updateChecker.ConnectionsUpdateAvailable += - (sender, args) => ConnectionsUpdateAvailable?.Invoke(sender, args); + _updateChecker.ConnectionsUpdateAvailable += (sender, args) => ConnectionsUpdateAvailable?.Invoke(sender, args); _updateTimer.Elapsed += (sender, args) => _updateChecker.IsUpdateAvailableAsync(); ConnectionsUpdateAvailable += Load; } diff --git a/mRemoteNG/Config/Connections/SaveConnectionsOnEdit.cs b/mRemoteNG/Config/Connections/SaveConnectionsOnEdit.cs index 25af6205..2e5e1cce 100644 --- a/mRemoteNG/Config/Connections/SaveConnectionsOnEdit.cs +++ b/mRemoteNG/Config/Connections/SaveConnectionsOnEdit.cs @@ -24,8 +24,7 @@ namespace mRemoteNG.Config.Connections private void ConnectionsServiceOnConnectionsLoaded(object sender, ConnectionsLoadedEventArgs connectionsLoadedEventArgs) { - connectionsLoadedEventArgs.NewConnectionTreeModel.CollectionChanged += - ConnectionTreeModelOnCollectionChanged; + connectionsLoadedEventArgs.NewConnectionTreeModel.CollectionChanged += ConnectionTreeModelOnCollectionChanged; connectionsLoadedEventArgs.NewConnectionTreeModel.PropertyChanged += ConnectionTreeModelOnPropertyChanged; foreach (var oldTree in connectionsLoadedEventArgs.PreviousConnectionTreeModel) diff --git a/mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/SqlDatabaseMetaDataRetriever.cs b/mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/SqlDatabaseMetaDataRetriever.cs index 784aff7a..57515288 100644 --- a/mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/SqlDatabaseMetaDataRetriever.cs +++ b/mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/SqlDatabaseMetaDataRetriever.cs @@ -146,6 +146,10 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql if (databaseConnector.GetType() == typeof(MSSqlDatabaseConnector)) { + // ********************************* + // ********* MICROSOFT SQL ********* + // ********************************* + sql = @" if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tblCons]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) @@ -322,6 +326,7 @@ CREATE TABLE [dbo].[tblCons] ( [EC2InstanceId] varchar(32) NULL, [ExternalCredentialProvider] varchar(256) NULL, [ExternalAddressProvider] varchar(256) NULL, + [UserViaAPI] varchar(512) NOT NULL, ) ON [PRIMARY] CREATE TABLE [dbo].[tblRoot] ( @@ -338,6 +343,10 @@ CREATE TABLE [dbo].[tblUpdate] ( } else if (databaseConnector.GetType() == typeof(MySqlDatabaseConnector)) { + // ************************** + // ********* MY SQL ********* + // ************************** + sql = @" /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -520,6 +529,7 @@ CREATE TABLE `tblCons` ( `EC2InstanceId` varchar(32) DEFAULT NULL, `ExternalCredentialProvider` varchar(256) DEFAULT NULL, `ExternalAddressProvider` varchar(256) DEFAULT NULL, + `UserViaAPI` varchar(512) NOT NULL, PRIMARY KEY (`ConstantID`), UNIQUE KEY `ID_UNIQUE` (`ID`), UNIQUE KEY `ConstantID_UNIQUE` (`ConstantID`) @@ -564,227 +574,6 @@ CREATE TABLE `tblUpdate` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; "; - - - - - - - -// sql = @" -///*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -///*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -///*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -///*!40101 SET NAMES utf8 */; -///*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -///*!40103 SET TIME_ZONE='+00:00' */; -///*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -///*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -///*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -///*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - -//-- -//-- Table structure for table `tblCons` -//-- - -//DROP TABLE IF EXISTS `tblCons`; -///*!40101 SET @saved_cs_client = @@character_set_client */; -///*!40101 SET character_set_client = utf8 */; -//CREATE TABLE `tblCons` ( -// `ID` int(11) NOT NULL AUTO_INCREMENT, -// `ConstantID` varchar(128) NOT NULL, -// `PositionID` int(11) NOT NULL, -// `ParentID` varchar(128) DEFAULT NULL, -// `LastChange` datetime NOT NULL, -// `Name` varchar(128) NOT NULL, -// `Type` varchar(32) NOT NULL, -// `Expanded` tinyint NOT NULL, -// `AutomaticResize` tinyint NOT NULL DEFAULT 1, -// `CacheBitmaps` tinyint NOT NULL, -// `Colors` varchar(32) NOT NULL, -// `ConnectToConsole` tinyint NOT NULL, -// `Connected` tinyint NOT NULL, -// `Description` varchar(1024) DEFAULT NULL, -// `DisableCursorBlinking` tinyint NOT NULL, -// `DisableCursorShadow` tinyint NOT NULL, -// `DisableFullWindowDrag` tinyint NOT NULL, -// `DisableMenuAnimations` tinyint NOT NULL, -// `DisplayThemes` tinyint NOT NULL, -// `DisplayWallpaper` tinyint NOT NULL, -// `Domain` varchar(512) DEFAULT NULL, -// `EnableDesktopComposition` tinyint NOT NULL, -// `EnableFontSmoothing` tinyint NOT NULL, -// `ExtApp` varchar(256) DEFAULT NULL, -// `Favorite` tinyint NOT NULL, -// `Hostname` varchar(512) DEFAULT NULL, -// `LoadBalanceInfo` varchar(1024) DEFAULT NULL, -// `MacAddress` varchar(32) DEFAULT NULL, -// `Panel` varchar(128) NOT NULL, -// `Password` varchar(1024) DEFAULT NULL, -// `Port` int(11) NOT NULL, -// `PostExtApp` varchar(256) DEFAULT NULL, -// `PreExtApp` varchar(256) DEFAULT NULL, -// `Protocol` varchar(32) NOT NULL, -// `PuttySession` varchar(128) DEFAULT NULL, -// `RDGatewayDomain` varchar(512) DEFAULT NULL, -// `RDGatewayHostname` varchar(512) DEFAULT NULL, -// `RDGatewayPassword` varchar(1024) DEFAULT NULL, -// `RDGatewayUsageMethod` varchar(32) NOT NULL, -// `RDGatewayUseConnectionCredentials` varchar(32) NOT NULL, -// `RDGatewayUsername` varchar(512) DEFAULT NULL, -// `RDPAlertIdleTimeout` tinyint NOT NULL, -// `RDPAuthenticationLevel` varchar(32) NOT NULL, -// `RDPMinutesToIdleTimeout` int(11) NOT NULL, -// `RdpVersion` varchar(10) DEFAULT NULL, -// `RedirectAudioCapture` tinyint NOT NULL, -// `RedirectClipboard` tinyint NOT NULL DEFAULT 0, -// `RedirectDiskDrives` tinyint NOT NULL, -// `RedirectKeys` tinyint NOT NULL, -// `RedirectPorts` tinyint NOT NULL, -// `RedirectPrinters` tinyint NOT NULL, -// `RedirectSmartCards` tinyint NOT NULL, -// `RedirectSound` varchar(64) NOT NULL, -// `RenderingEngine` varchar(10) DEFAULT NULL, -// `Resolution` varchar(32) NOT NULL, -// `SSHOptions` varchar(1024) NOT NULL, -// `SSHTunnelConnectionName` varchar(128) NOT NULL, -// `SoundQuality` varchar(20) NOT NULL, -// `UseCredSsp` tinyint NOT NULL, -// `UseEnhancedMode` tinyint DEFAULT NULL, -// `UseVmId` tinyint DEFAULT NULL, -// `UserField` varchar(256) DEFAULT NULL, -// `Username` varchar(512) DEFAULT NULL, -// `VNCAuthMode` varchar(10) DEFAULT NULL, -// `VNCColors` varchar(10) DEFAULT NULL, -// `VNCCompression` varchar(10) DEFAULT NULL, -// `VNCEncoding` varchar(20) DEFAULT NULL, -// `VNCProxyIP` varchar(128) DEFAULT NULL, -// `VNCProxyPassword` varchar(1024) DEFAULT NULL, -// `VNCProxyPort` int(11) DEFAULT NULL, -// `VNCProxyType` varchar(20) DEFAULT NULL, -// `VNCProxyUsername` varchar(512) DEFAULT NULL, -// `VNCSmartSizeMode` varchar(20) DEFAULT NULL, -// `VNCViewOnly` tinyint NOT NULL, -// `VmId` varchar(512) DEFAULT NULL, -// `ICAEncryptionStrength` varchar(32) NOT NULL, -// `Icon` varchar(128) NOT NULL, -// `InheritAutomaticResize` tinyint NOT NULL DEFAULT 0, -// `InheritCacheBitmaps` tinyint NOT NULL, -// `InheritColors` tinyint NOT NULL, -// `InheritDescription` tinyint NOT NULL, -// `InheritDisableCursorBlinking` tinyint NOT NULL, -// `InheritDisableCursorShadow` tinyint NOT NULL, -// `InheritDisableFullWindowDrag` tinyint NOT NULL, -// `InheritDisableMenuAnimations` tinyint NOT NULL, -// `InheritDisplayThemes` tinyint NOT NULL, -// `InheritDisplayWallpaper` tinyint NOT NULL, -// `InheritDomain` tinyint NOT NULL, -// `InheritEnableDesktopComposition` tinyint NOT NULL, -// `InheritEnableFontSmoothing` tinyint NOT NULL, -// `InheritExtApp` tinyint NOT NULL, -// `InheritFavorite` tinyint NOT NULL, -// `InheritICAEncryptionStrength` tinyint NOT NULL, -// `InheritIcon` tinyint NOT NULL, -// `InheritLoadBalanceInfo` tinyint NOT NULL DEFAULT 0, -// `InheritMacAddress` tinyint NOT NULL, -// `InheritPanel` tinyint NOT NULL, -// `InheritPassword` tinyint NOT NULL, -// `InheritPort` tinyint NOT NULL, -// `InheritPostExtApp` tinyint NOT NULL, -// `InheritPreExtApp` tinyint NOT NULL, -// `InheritProtocol` tinyint NOT NULL, -// `InheritPuttySession` tinyint NOT NULL, -// `InheritRDGatewayDomain` tinyint NOT NULL, -// `InheritRDGatewayHostname` tinyint NOT NULL, -// `InheritRDGatewayPassword` tinyint NOT NULL, -// `InheritRDGatewayUsageMethod` tinyint NOT NULL, -// `InheritRDGatewayUseConnectionCredentials` tinyint NOT NULL, -// `InheritRDGatewayUsername` tinyint NOT NULL, -// `InheritRDPAlertIdleTimeout` tinyint NOT NULL, -// `InheritRDPAuthenticationLevel` tinyint NOT NULL, -// `InheritRDPMinutesToIdleTimeout` tinyint NOT NULL, -// `InheritRdpVersion` tinyint NOT NULL DEFAULT 0, -// `InheritRedirectAudioCapture` tinyint NOT NULL, -// `InheritRedirectClipboard` tinyint NOT NULL DEFAULT 0, -// `InheritRedirectDiskDrives` tinyint NOT NULL, -// `InheritRedirectKeys` tinyint NOT NULL, -// `InheritRedirectPorts` tinyint NOT NULL, -// `InheritRedirectPrinters` tinyint NOT NULL, -// `InheritRedirectSmartCards` tinyint NOT NULL, -// `InheritRedirectSound` tinyint NOT NULL, -// `InheritRenderingEngine` tinyint NOT NULL, -// `InheritResolution` tinyint NOT NULL, -// `InheritSSHOptions` tinyint NOT NULL, -// `InheritSSHTunnelConnectionName` tinyint NOT NULL, -// `InheritSoundQuality` tinyint NOT NULL, -// `InheritUseConsoleSession` tinyint NOT NULL, -// `InheritUseCredSsp` tinyint NOT NULL, -// `InheritUseEnhancedMode` tinyint DEFAULT NULL, -// `InheritUseVmId` tinyint DEFAULT NULL, -// `InheritUserField` tinyint NOT NULL, -// `InheritUsername` tinyint NOT NULL, -// `InheritVNCAuthMode` tinyint NOT NULL, -// `InheritVNCColors` tinyint NOT NULL, -// `InheritVNCCompression` tinyint NOT NULL, -// `InheritVNCEncoding` tinyint NOT NULL, -// `InheritVNCProxyIP` tinyint NOT NULL, -// `InheritVNCProxyPassword` tinyint NOT NULL, -// `InheritVNCProxyPort` tinyint NOT NULL, -// `InheritVNCProxyType` tinyint NOT NULL, -// `InheritVNCProxyUsername` tinyint NOT NULL, -// `InheritVNCSmartSizeMode` tinyint NOT NULL, -// `InheritVNCViewOnly` tinyint NOT NULL, -// `InheritVmId` tinyint DEFAULT NULL, -// PRIMARY KEY (`ConstantID`), -// UNIQUE (`ID`) -//) ENGINE=InnoDB AUTO_INCREMENT=3324 DEFAULT CHARSET=latin1; -///*!40101 SET character_set_client = @saved_cs_client */; - -//-- -//-- Table structure for table `tblRoot` -//-- - -//DROP TABLE IF EXISTS `tblRoot`; -///*!40101 SET @saved_cs_client = @@character_set_client */; -///*!40101 SET character_set_client = utf8 */; -//CREATE TABLE `tblRoot` ( -// `Name` varchar(2048) NOT NULL, -// `Export` tinyint NOT NULL, -// `Protected` varchar(4048) NOT NULL, -// `ConfVersion` double NOT NULL -//) ENGINE=InnoDB DEFAULT CHARSET=latin1; -///*!40101 SET character_set_client = @saved_cs_client */; - -//-- -//-- Table structure for table `tblUpdate` -//-- - -//DROP TABLE IF EXISTS `tblUpdate`; -///*!40101 SET @saved_cs_client = @@character_set_client */; -///*!40101 SET character_set_client = utf8 */; -//CREATE TABLE `tblUpdate` ( -// `LastUpdate` datetime(3) DEFAULT NULL -//) ENGINE=InnoDB DEFAULT CHARSET=latin1; -///*!40101 SET character_set_client = @saved_cs_client */; - - -///*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -///*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -///*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -///*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -///*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -///*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -///*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -///*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -//"; - - - - - - - } else { diff --git a/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionNodeSerializer27.cs b/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionNodeSerializer27.cs index d052ea1c..2a2d59f5 100644 --- a/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionNodeSerializer27.cs +++ b/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionNodeSerializer27.cs @@ -23,16 +23,9 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml SecureString encryptionKey, SaveFilter saveFilter) { - if (cryptographyProvider == null) - throw new ArgumentNullException(nameof(cryptographyProvider)); - if (encryptionKey == null) - throw new ArgumentNullException(nameof(encryptionKey)); - if (saveFilter == null) - throw new ArgumentNullException(nameof(saveFilter)); - - _cryptographyProvider = cryptographyProvider; - _encryptionKey = encryptionKey; - _saveFilter = saveFilter; + _cryptographyProvider = cryptographyProvider ?? throw new ArgumentNullException(nameof(cryptographyProvider)); + _encryptionKey = encryptionKey ?? throw new ArgumentNullException(nameof(encryptionKey)); + _saveFilter = saveFilter ?? throw new ArgumentNullException(nameof(saveFilter)); } public XElement Serialize(ConnectionInfo connectionInfo) diff --git a/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionNodeSerializer28.cs b/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionNodeSerializer28.cs index f073a515..76f845ad 100644 --- a/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionNodeSerializer28.cs +++ b/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionNodeSerializer28.cs @@ -23,16 +23,9 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml SecureString encryptionKey, SaveFilter saveFilter) { - if (cryptographyProvider == null) - throw new ArgumentNullException(nameof(cryptographyProvider)); - if (encryptionKey == null) - throw new ArgumentNullException(nameof(encryptionKey)); - if (saveFilter == null) - throw new ArgumentNullException(nameof(saveFilter)); - - _cryptographyProvider = cryptographyProvider; - _encryptionKey = encryptionKey; - _saveFilter = saveFilter; + _cryptographyProvider = cryptographyProvider ?? throw new ArgumentNullException(nameof(cryptographyProvider)); + _encryptionKey = encryptionKey ?? throw new ArgumentNullException(nameof(encryptionKey)); + _saveFilter = saveFilter ?? throw new ArgumentNullException(nameof(saveFilter)); } public XElement Serialize(ConnectionInfo connectionInfo) @@ -168,160 +161,159 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml private void SetInheritanceAttributes(XContainer element, IInheritable connectionInfo) { - if (_saveFilter.SaveInheritance) - { - var inheritance = connectionInfo.Inheritance; + if (!_saveFilter.SaveInheritance) return; - if (inheritance.CacheBitmaps) - element.Add(new XAttribute("InheritCacheBitmaps", inheritance.CacheBitmaps.ToString().ToLowerInvariant())); - if (inheritance.Colors) - element.Add(new XAttribute("InheritColors", inheritance.Colors.ToString().ToLowerInvariant())); - if (inheritance.Description) - element.Add(new XAttribute("InheritDescription", inheritance.Description.ToString().ToLowerInvariant())); - if (inheritance.DisplayThemes) - element.Add(new XAttribute("InheritDisplayThemes", inheritance.DisplayThemes.ToString().ToLowerInvariant())); - if (inheritance.DisplayWallpaper) - element.Add(new XAttribute("InheritDisplayWallpaper", inheritance.DisplayWallpaper.ToString().ToLowerInvariant())); - if (inheritance.EnableFontSmoothing) - element.Add(new XAttribute("InheritEnableFontSmoothing", inheritance.EnableFontSmoothing.ToString().ToLowerInvariant())); - if (inheritance.EnableDesktopComposition) - element.Add(new XAttribute("InheritEnableDesktopComposition", inheritance.EnableDesktopComposition.ToString().ToLowerInvariant())); - if (inheritance.DisableFullWindowDrag) - element.Add(new XAttribute("InheritDisableFullWindowDrag", inheritance.DisableFullWindowDrag.ToString().ToLowerInvariant())); - if (inheritance.DisableMenuAnimations) - element.Add(new XAttribute("InheritDisableMenuAnimations", inheritance.DisableMenuAnimations.ToString().ToLowerInvariant())); - if (inheritance.DisableCursorShadow) - element.Add(new XAttribute("InheritDisableCursorShadow", inheritance.DisableCursorShadow.ToString().ToLowerInvariant())); - if (inheritance.DisableCursorBlinking) - element.Add(new XAttribute("InheritDisableCursorBlinking", inheritance.DisableCursorBlinking.ToString().ToLowerInvariant())); - if (inheritance.Domain) - element.Add(new XAttribute("InheritDomain", inheritance.Domain.ToString().ToLowerInvariant())); - if (inheritance.Icon) - element.Add(new XAttribute("InheritIcon", inheritance.Icon.ToString().ToLowerInvariant())); - if (inheritance.Panel) - element.Add(new XAttribute("InheritPanel", inheritance.Panel.ToString().ToLowerInvariant())); - if (inheritance.Password) - element.Add(new XAttribute("InheritPassword", inheritance.Password.ToString().ToLowerInvariant())); - if (inheritance.Port) - element.Add(new XAttribute("InheritPort", inheritance.Port.ToString().ToLowerInvariant())); - if (inheritance.Protocol) - element.Add(new XAttribute("InheritProtocol", inheritance.Protocol.ToString().ToLowerInvariant())); - if (inheritance.RdpVersion) - element.Add(new XAttribute("InheritRdpVersion", inheritance.RdpVersion.ToString().ToLowerInvariant())); - if (inheritance.SSHTunnelConnectionName) - element.Add(new XAttribute("InheritSSHTunnelConnectionName", inheritance.SSHTunnelConnectionName.ToString().ToLowerInvariant())); - if (inheritance.OpeningCommand) - element.Add(new XAttribute("InheritOpeningCommand", inheritance.OpeningCommand.ToString().ToLowerInvariant())); - if (inheritance.SSHOptions) - element.Add(new XAttribute("InheritSSHOptions", inheritance.SSHOptions.ToString().ToLowerInvariant())); - if (inheritance.PuttySession) - element.Add(new XAttribute("InheritPuttySession", inheritance.PuttySession.ToString().ToLowerInvariant())); - if (inheritance.RedirectDiskDrives) - element.Add(new XAttribute("InheritRedirectDiskDrives", inheritance.RedirectDiskDrives.ToString().ToLowerInvariant())); - if (inheritance.RedirectDiskDrivesCustom) - element.Add(new XAttribute("InheritRedirectDiskDrivesCustom", inheritance.RedirectDiskDrivesCustom.ToString().ToLowerInvariant())); - if (inheritance.RedirectKeys) - element.Add(new XAttribute("InheritRedirectKeys", inheritance.RedirectKeys.ToString().ToLowerInvariant())); - if (inheritance.RedirectPorts) - element.Add(new XAttribute("InheritRedirectPorts", inheritance.RedirectPorts.ToString().ToLowerInvariant())); - if (inheritance.RedirectPrinters) - element.Add(new XAttribute("InheritRedirectPrinters", inheritance.RedirectPrinters.ToString().ToLowerInvariant())); - if (inheritance.RedirectClipboard) - element.Add(new XAttribute("InheritRedirectClipboard", inheritance.RedirectClipboard.ToString().ToLowerInvariant())); - if (inheritance.RedirectSmartCards) - element.Add(new XAttribute("InheritRedirectSmartCards", inheritance.RedirectSmartCards.ToString().ToLowerInvariant())); - if (inheritance.RedirectSound) - element.Add(new XAttribute("InheritRedirectSound", inheritance.RedirectSound.ToString().ToLowerInvariant())); - if (inheritance.SoundQuality) - element.Add(new XAttribute("InheritSoundQuality", inheritance.SoundQuality.ToString().ToLowerInvariant())); - if (inheritance.RedirectAudioCapture) - element.Add(new XAttribute("InheritRedirectAudioCapture", inheritance.RedirectAudioCapture.ToString().ToLowerInvariant())); - if (inheritance.Resolution) - element.Add(new XAttribute("InheritResolution", inheritance.Resolution.ToString().ToLowerInvariant())); - if (inheritance.AutomaticResize) - element.Add(new XAttribute("InheritAutomaticResize", inheritance.AutomaticResize.ToString().ToLowerInvariant())); - if (inheritance.UseConsoleSession) - element.Add(new XAttribute("InheritUseConsoleSession", inheritance.UseConsoleSession.ToString().ToLowerInvariant())); - if (inheritance.UseCredSsp) - element.Add(new XAttribute("InheritUseCredSsp", inheritance.UseCredSsp.ToString().ToLowerInvariant())); - if (inheritance.RenderingEngine) - element.Add(new XAttribute("InheritRenderingEngine", inheritance.RenderingEngine.ToString().ToLowerInvariant())); - if (inheritance.Username) - element.Add(new XAttribute("InheritUsername", inheritance.Username.ToString().ToLowerInvariant())); - if (inheritance.RDPAuthenticationLevel) - element.Add(new XAttribute("InheritRDPAuthenticationLevel", inheritance.RDPAuthenticationLevel.ToString().ToLowerInvariant())); - if (inheritance.RDPMinutesToIdleTimeout) - element.Add(new XAttribute("InheritRDPMinutesToIdleTimeout", inheritance.RDPMinutesToIdleTimeout.ToString().ToLowerInvariant())); - if (inheritance.RDPAlertIdleTimeout) - element.Add(new XAttribute("InheritRDPAlertIdleTimeout", inheritance.RDPAlertIdleTimeout.ToString().ToLowerInvariant())); - if (inheritance.LoadBalanceInfo) - element.Add(new XAttribute("InheritLoadBalanceInfo", inheritance.LoadBalanceInfo.ToString().ToLowerInvariant())); - if (inheritance.PreExtApp) - element.Add(new XAttribute("InheritPreExtApp", inheritance.PreExtApp.ToString().ToLowerInvariant())); - if (inheritance.PostExtApp) - element.Add(new XAttribute("InheritPostExtApp", inheritance.PostExtApp.ToString().ToLowerInvariant())); - if (inheritance.MacAddress) - element.Add(new XAttribute("InheritMacAddress", inheritance.MacAddress.ToString().ToLowerInvariant())); - if (inheritance.UserField) - element.Add(new XAttribute("InheritUserField", inheritance.UserField.ToString().ToLowerInvariant())); - if (inheritance.Favorite) - element.Add(new XAttribute("InheritFavorite", inheritance.Favorite.ToString().ToLowerInvariant())); - if (inheritance.ExtApp) - element.Add(new XAttribute("InheritExtApp", inheritance.ExtApp.ToString().ToLowerInvariant())); - if (inheritance.VNCCompression) - element.Add(new XAttribute("InheritVNCCompression", inheritance.VNCCompression.ToString().ToLowerInvariant())); - if (inheritance.VNCEncoding) - element.Add(new XAttribute("InheritVNCEncoding", inheritance.VNCEncoding.ToString().ToLowerInvariant())); - if (inheritance.VNCAuthMode) - element.Add(new XAttribute("InheritVNCAuthMode", inheritance.VNCAuthMode.ToString().ToLowerInvariant())); - if (inheritance.VNCProxyType) - element.Add(new XAttribute("InheritVNCProxyType", inheritance.VNCProxyType.ToString().ToLowerInvariant())); - if (inheritance.VNCProxyIP) - element.Add(new XAttribute("InheritVNCProxyIP", inheritance.VNCProxyIP.ToString().ToLowerInvariant())); - if (inheritance.VNCProxyPort) - element.Add(new XAttribute("InheritVNCProxyPort", inheritance.VNCProxyPort.ToString().ToLowerInvariant())); - if (inheritance.VNCProxyUsername) - element.Add(new XAttribute("InheritVNCProxyUsername", inheritance.VNCProxyUsername.ToString().ToLowerInvariant())); - if (inheritance.VNCProxyPassword) - element.Add(new XAttribute("InheritVNCProxyPassword", inheritance.VNCProxyPassword.ToString().ToLowerInvariant())); - if (inheritance.VNCColors) - element.Add(new XAttribute("InheritVNCColors", inheritance.VNCColors.ToString().ToLowerInvariant())); - if (inheritance.VNCSmartSizeMode) - element.Add(new XAttribute("InheritVNCSmartSizeMode", inheritance.VNCSmartSizeMode.ToString().ToLowerInvariant())); - if (inheritance.VNCViewOnly) - element.Add(new XAttribute("InheritVNCViewOnly", inheritance.VNCViewOnly.ToString().ToLowerInvariant())); - if (inheritance.RDGatewayUsageMethod) - element.Add(new XAttribute("InheritRDGatewayUsageMethod", inheritance.RDGatewayUsageMethod.ToString().ToLowerInvariant())); - if (inheritance.RDGatewayHostname) - element.Add(new XAttribute("InheritRDGatewayHostname", inheritance.RDGatewayHostname.ToString().ToLowerInvariant())); - if (inheritance.RDGatewayUseConnectionCredentials) - element.Add(new XAttribute("InheritRDGatewayUseConnectionCredentials", inheritance.RDGatewayUseConnectionCredentials.ToString().ToLowerInvariant())); - if (inheritance.RDGatewayUsername) - element.Add(new XAttribute("InheritRDGatewayUsername", inheritance.RDGatewayUsername.ToString().ToLowerInvariant())); - if (inheritance.RDGatewayPassword) - element.Add(new XAttribute("InheritRDGatewayPassword", inheritance.RDGatewayPassword.ToString().ToLowerInvariant())); - if (inheritance.RDGatewayDomain) - element.Add(new XAttribute("InheritRDGatewayDomain", inheritance.RDGatewayDomain.ToString().ToLowerInvariant())); - if (inheritance.RDGatewayExternalCredentialProvider) - element.Add(new XAttribute("InheritRDGatewayExternalCredentialProvider", inheritance.RDGatewayExternalCredentialProvider.ToString().ToLowerInvariant())); - if (inheritance.RDGatewayUserViaAPI) - element.Add(new XAttribute("InheritRDGatewayUserViaAPI", inheritance.RDGatewayUserViaAPI.ToString().ToLowerInvariant())); + var inheritance = connectionInfo.Inheritance; - if (inheritance.VmId) - element.Add(new XAttribute("InheritVmId", inheritance.VmId.ToString().ToLowerInvariant())); - if (inheritance.UseVmId) - element.Add(new XAttribute("InheritUseVmId", inheritance.UseVmId.ToString().ToLowerInvariant())); - if (inheritance.UseEnhancedMode) - element.Add(new XAttribute("InheritUseEnhancedMode", inheritance.UseEnhancedMode.ToString().ToLowerInvariant())); - if (inheritance.ExternalCredentialProvider) - element.Add(new XAttribute("InheritExternalCredentialProvider", inheritance.ExternalCredentialProvider.ToString().ToLowerInvariant())); - if (inheritance.UserViaAPI) - element.Add(new XAttribute("InheritUserViaAPI", inheritance.UserViaAPI.ToString().ToLowerInvariant())); - if (inheritance.UseRCG) - element.Add(new XAttribute("InheritUseRCG", inheritance.UseRCG.ToString().ToLowerInvariant())); - if (inheritance.UseRestrictedAdmin) - element.Add(new XAttribute("InheritUseRestrictedAdmin", inheritance.UseRestrictedAdmin.ToString().ToLowerInvariant())); - } + if (inheritance.CacheBitmaps) + element.Add(new XAttribute("InheritCacheBitmaps", inheritance.CacheBitmaps.ToString().ToLowerInvariant())); + if (inheritance.Colors) + element.Add(new XAttribute("InheritColors", inheritance.Colors.ToString().ToLowerInvariant())); + if (inheritance.Description) + element.Add(new XAttribute("InheritDescription", inheritance.Description.ToString().ToLowerInvariant())); + if (inheritance.DisplayThemes) + element.Add(new XAttribute("InheritDisplayThemes", inheritance.DisplayThemes.ToString().ToLowerInvariant())); + if (inheritance.DisplayWallpaper) + element.Add(new XAttribute("InheritDisplayWallpaper", inheritance.DisplayWallpaper.ToString().ToLowerInvariant())); + if (inheritance.EnableFontSmoothing) + element.Add(new XAttribute("InheritEnableFontSmoothing", inheritance.EnableFontSmoothing.ToString().ToLowerInvariant())); + if (inheritance.EnableDesktopComposition) + element.Add(new XAttribute("InheritEnableDesktopComposition", inheritance.EnableDesktopComposition.ToString().ToLowerInvariant())); + if (inheritance.DisableFullWindowDrag) + element.Add(new XAttribute("InheritDisableFullWindowDrag", inheritance.DisableFullWindowDrag.ToString().ToLowerInvariant())); + if (inheritance.DisableMenuAnimations) + element.Add(new XAttribute("InheritDisableMenuAnimations", inheritance.DisableMenuAnimations.ToString().ToLowerInvariant())); + if (inheritance.DisableCursorShadow) + element.Add(new XAttribute("InheritDisableCursorShadow", inheritance.DisableCursorShadow.ToString().ToLowerInvariant())); + if (inheritance.DisableCursorBlinking) + element.Add(new XAttribute("InheritDisableCursorBlinking", inheritance.DisableCursorBlinking.ToString().ToLowerInvariant())); + if (inheritance.Domain) + element.Add(new XAttribute("InheritDomain", inheritance.Domain.ToString().ToLowerInvariant())); + if (inheritance.Icon) + element.Add(new XAttribute("InheritIcon", inheritance.Icon.ToString().ToLowerInvariant())); + if (inheritance.Panel) + element.Add(new XAttribute("InheritPanel", inheritance.Panel.ToString().ToLowerInvariant())); + if (inheritance.Password) + element.Add(new XAttribute("InheritPassword", inheritance.Password.ToString().ToLowerInvariant())); + if (inheritance.Port) + element.Add(new XAttribute("InheritPort", inheritance.Port.ToString().ToLowerInvariant())); + if (inheritance.Protocol) + element.Add(new XAttribute("InheritProtocol", inheritance.Protocol.ToString().ToLowerInvariant())); + if (inheritance.RdpVersion) + element.Add(new XAttribute("InheritRdpVersion", inheritance.RdpVersion.ToString().ToLowerInvariant())); + if (inheritance.SSHTunnelConnectionName) + element.Add(new XAttribute("InheritSSHTunnelConnectionName", inheritance.SSHTunnelConnectionName.ToString().ToLowerInvariant())); + if (inheritance.OpeningCommand) + element.Add(new XAttribute("InheritOpeningCommand", inheritance.OpeningCommand.ToString().ToLowerInvariant())); + if (inheritance.SSHOptions) + element.Add(new XAttribute("InheritSSHOptions", inheritance.SSHOptions.ToString().ToLowerInvariant())); + if (inheritance.PuttySession) + element.Add(new XAttribute("InheritPuttySession", inheritance.PuttySession.ToString().ToLowerInvariant())); + if (inheritance.RedirectDiskDrives) + element.Add(new XAttribute("InheritRedirectDiskDrives", inheritance.RedirectDiskDrives.ToString().ToLowerInvariant())); + if (inheritance.RedirectDiskDrivesCustom) + element.Add(new XAttribute("InheritRedirectDiskDrivesCustom", inheritance.RedirectDiskDrivesCustom.ToString().ToLowerInvariant())); + if (inheritance.RedirectKeys) + element.Add(new XAttribute("InheritRedirectKeys", inheritance.RedirectKeys.ToString().ToLowerInvariant())); + if (inheritance.RedirectPorts) + element.Add(new XAttribute("InheritRedirectPorts", inheritance.RedirectPorts.ToString().ToLowerInvariant())); + if (inheritance.RedirectPrinters) + element.Add(new XAttribute("InheritRedirectPrinters", inheritance.RedirectPrinters.ToString().ToLowerInvariant())); + if (inheritance.RedirectClipboard) + element.Add(new XAttribute("InheritRedirectClipboard", inheritance.RedirectClipboard.ToString().ToLowerInvariant())); + if (inheritance.RedirectSmartCards) + element.Add(new XAttribute("InheritRedirectSmartCards", inheritance.RedirectSmartCards.ToString().ToLowerInvariant())); + if (inheritance.RedirectSound) + element.Add(new XAttribute("InheritRedirectSound", inheritance.RedirectSound.ToString().ToLowerInvariant())); + if (inheritance.SoundQuality) + element.Add(new XAttribute("InheritSoundQuality", inheritance.SoundQuality.ToString().ToLowerInvariant())); + if (inheritance.RedirectAudioCapture) + element.Add(new XAttribute("InheritRedirectAudioCapture", inheritance.RedirectAudioCapture.ToString().ToLowerInvariant())); + if (inheritance.Resolution) + element.Add(new XAttribute("InheritResolution", inheritance.Resolution.ToString().ToLowerInvariant())); + if (inheritance.AutomaticResize) + element.Add(new XAttribute("InheritAutomaticResize", inheritance.AutomaticResize.ToString().ToLowerInvariant())); + if (inheritance.UseConsoleSession) + element.Add(new XAttribute("InheritUseConsoleSession", inheritance.UseConsoleSession.ToString().ToLowerInvariant())); + if (inheritance.UseCredSsp) + element.Add(new XAttribute("InheritUseCredSsp", inheritance.UseCredSsp.ToString().ToLowerInvariant())); + if (inheritance.RenderingEngine) + element.Add(new XAttribute("InheritRenderingEngine", inheritance.RenderingEngine.ToString().ToLowerInvariant())); + if (inheritance.Username) + element.Add(new XAttribute("InheritUsername", inheritance.Username.ToString().ToLowerInvariant())); + if (inheritance.RDPAuthenticationLevel) + element.Add(new XAttribute("InheritRDPAuthenticationLevel", inheritance.RDPAuthenticationLevel.ToString().ToLowerInvariant())); + if (inheritance.RDPMinutesToIdleTimeout) + element.Add(new XAttribute("InheritRDPMinutesToIdleTimeout", inheritance.RDPMinutesToIdleTimeout.ToString().ToLowerInvariant())); + if (inheritance.RDPAlertIdleTimeout) + element.Add(new XAttribute("InheritRDPAlertIdleTimeout", inheritance.RDPAlertIdleTimeout.ToString().ToLowerInvariant())); + if (inheritance.LoadBalanceInfo) + element.Add(new XAttribute("InheritLoadBalanceInfo", inheritance.LoadBalanceInfo.ToString().ToLowerInvariant())); + if (inheritance.PreExtApp) + element.Add(new XAttribute("InheritPreExtApp", inheritance.PreExtApp.ToString().ToLowerInvariant())); + if (inheritance.PostExtApp) + element.Add(new XAttribute("InheritPostExtApp", inheritance.PostExtApp.ToString().ToLowerInvariant())); + if (inheritance.MacAddress) + element.Add(new XAttribute("InheritMacAddress", inheritance.MacAddress.ToString().ToLowerInvariant())); + if (inheritance.UserField) + element.Add(new XAttribute("InheritUserField", inheritance.UserField.ToString().ToLowerInvariant())); + if (inheritance.Favorite) + element.Add(new XAttribute("InheritFavorite", inheritance.Favorite.ToString().ToLowerInvariant())); + if (inheritance.ExtApp) + element.Add(new XAttribute("InheritExtApp", inheritance.ExtApp.ToString().ToLowerInvariant())); + if (inheritance.VNCCompression) + element.Add(new XAttribute("InheritVNCCompression", inheritance.VNCCompression.ToString().ToLowerInvariant())); + if (inheritance.VNCEncoding) + element.Add(new XAttribute("InheritVNCEncoding", inheritance.VNCEncoding.ToString().ToLowerInvariant())); + if (inheritance.VNCAuthMode) + element.Add(new XAttribute("InheritVNCAuthMode", inheritance.VNCAuthMode.ToString().ToLowerInvariant())); + if (inheritance.VNCProxyType) + element.Add(new XAttribute("InheritVNCProxyType", inheritance.VNCProxyType.ToString().ToLowerInvariant())); + if (inheritance.VNCProxyIP) + element.Add(new XAttribute("InheritVNCProxyIP", inheritance.VNCProxyIP.ToString().ToLowerInvariant())); + if (inheritance.VNCProxyPort) + element.Add(new XAttribute("InheritVNCProxyPort", inheritance.VNCProxyPort.ToString().ToLowerInvariant())); + if (inheritance.VNCProxyUsername) + element.Add(new XAttribute("InheritVNCProxyUsername", inheritance.VNCProxyUsername.ToString().ToLowerInvariant())); + if (inheritance.VNCProxyPassword) + element.Add(new XAttribute("InheritVNCProxyPassword", inheritance.VNCProxyPassword.ToString().ToLowerInvariant())); + if (inheritance.VNCColors) + element.Add(new XAttribute("InheritVNCColors", inheritance.VNCColors.ToString().ToLowerInvariant())); + if (inheritance.VNCSmartSizeMode) + element.Add(new XAttribute("InheritVNCSmartSizeMode", inheritance.VNCSmartSizeMode.ToString().ToLowerInvariant())); + if (inheritance.VNCViewOnly) + element.Add(new XAttribute("InheritVNCViewOnly", inheritance.VNCViewOnly.ToString().ToLowerInvariant())); + if (inheritance.RDGatewayUsageMethod) + element.Add(new XAttribute("InheritRDGatewayUsageMethod", inheritance.RDGatewayUsageMethod.ToString().ToLowerInvariant())); + if (inheritance.RDGatewayHostname) + element.Add(new XAttribute("InheritRDGatewayHostname", inheritance.RDGatewayHostname.ToString().ToLowerInvariant())); + if (inheritance.RDGatewayUseConnectionCredentials) + element.Add(new XAttribute("InheritRDGatewayUseConnectionCredentials", inheritance.RDGatewayUseConnectionCredentials.ToString().ToLowerInvariant())); + if (inheritance.RDGatewayUsername) + element.Add(new XAttribute("InheritRDGatewayUsername", inheritance.RDGatewayUsername.ToString().ToLowerInvariant())); + if (inheritance.RDGatewayPassword) + element.Add(new XAttribute("InheritRDGatewayPassword", inheritance.RDGatewayPassword.ToString().ToLowerInvariant())); + if (inheritance.RDGatewayDomain) + element.Add(new XAttribute("InheritRDGatewayDomain", inheritance.RDGatewayDomain.ToString().ToLowerInvariant())); + if (inheritance.RDGatewayExternalCredentialProvider) + element.Add(new XAttribute("InheritRDGatewayExternalCredentialProvider", inheritance.RDGatewayExternalCredentialProvider.ToString().ToLowerInvariant())); + if (inheritance.RDGatewayUserViaAPI) + element.Add(new XAttribute("InheritRDGatewayUserViaAPI", inheritance.RDGatewayUserViaAPI.ToString().ToLowerInvariant())); + + if (inheritance.VmId) + element.Add(new XAttribute("InheritVmId", inheritance.VmId.ToString().ToLowerInvariant())); + if (inheritance.UseVmId) + element.Add(new XAttribute("InheritUseVmId", inheritance.UseVmId.ToString().ToLowerInvariant())); + if (inheritance.UseEnhancedMode) + element.Add(new XAttribute("InheritUseEnhancedMode", inheritance.UseEnhancedMode.ToString().ToLowerInvariant())); + if (inheritance.ExternalCredentialProvider) + element.Add(new XAttribute("InheritExternalCredentialProvider", inheritance.ExternalCredentialProvider.ToString().ToLowerInvariant())); + if (inheritance.UserViaAPI) + element.Add(new XAttribute("InheritUserViaAPI", inheritance.UserViaAPI.ToString().ToLowerInvariant())); + if (inheritance.UseRCG) + element.Add(new XAttribute("InheritUseRCG", inheritance.UseRCG.ToString().ToLowerInvariant())); + if (inheritance.UseRestrictedAdmin) + element.Add(new XAttribute("InheritUseRestrictedAdmin", inheritance.UseRestrictedAdmin.ToString().ToLowerInvariant())); } } } \ No newline at end of file diff --git a/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionSerializerFactory.cs b/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionSerializerFactory.cs index ece3d65b..9c6119b3 100644 --- a/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionSerializerFactory.cs +++ b/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionSerializerFactory.cs @@ -21,7 +21,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml .First().PasswordString .ConvertToSecureString(); - var connectionNodeSerializer = new XmlConnectionNodeSerializer27( + var connectionNodeSerializer = new XmlConnectionNodeSerializer28( cryptographyProvider, encryptionKey, saveFilter ?? new SaveFilter()); diff --git a/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDeserializer.cs b/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDeserializer.cs index 15f7ce3b..b874022f 100644 --- a/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDeserializer.cs +++ b/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDeserializer.cs @@ -569,7 +569,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml switch (_confVersion) { - case >= 3.0: + case >= 2.8: connectionInfo.RedirectDiskDrives = xmlnode.GetAttributeAsEnum("RedirectDiskDrives"); connectionInfo.RedirectDiskDrivesCustom = xmlnode.GetAttributeAsString("RedirectDiskDrivesCustom"); connectionInfo.Inheritance.RedirectDiskDrivesCustom = xmlnode.GetAttributeAsBool("InheritRedirectDiskDrivesCustom"); diff --git a/mRemoteNG/Config/Serializers/MiscSerializers/RemoteDesktopConnectionDeserializer.cs b/mRemoteNG/Config/Serializers/MiscSerializers/RemoteDesktopConnectionDeserializer.cs index 6b05f91b..95c9734f 100644 --- a/mRemoteNG/Config/Serializers/MiscSerializers/RemoteDesktopConnectionDeserializer.cs +++ b/mRemoteNG/Config/Serializers/MiscSerializers/RemoteDesktopConnectionDeserializer.cs @@ -107,6 +107,9 @@ namespace mRemoteNG.Config.Serializers.MiscSerializers case "redirectdrives": connectionInfo.RedirectDiskDrives = (value == "1" ? RDPDiskDrives.Local : RDPDiskDrives.None); break; + case "redirectdrivescustom": + connectionInfo.RedirectDiskDrivesCustom = value; + break; case "redirectcomports": connectionInfo.RedirectPorts = value == "1"; break; diff --git a/mRemoteNG/Config/Serializers/Versioning/SqlVersion29To30Upgrader.cs b/mRemoteNG/Config/Serializers/Versioning/SqlVersion29To30Upgrader.cs index 5e90f565..b06f03bc 100644 --- a/mRemoteNG/Config/Serializers/Versioning/SqlVersion29To30Upgrader.cs +++ b/mRemoteNG/Config/Serializers/Versioning/SqlVersion29To30Upgrader.cs @@ -37,6 +37,7 @@ ALTER TABLE tblCons MODIFY COLUMN `RenderingEngine` varchar(32) DEFAULT NULL; ALTER TABLE tblCons MODIFY COLUMN `RedirectDiskDrives` varchar(32) DEFAULT NULL; ALTER TABLE tblCons ADD COLUMN `RedirectDiskDrivesCustom` varchar(32) DEFAULT NULL; ALTER TABLE tblCons ADD COLUMN `InheritRedirectDiskDrivesCustom` tinyint NOT NULL; +ALTER TABLE tblCons ADD COLUMN `UserViaAPI` varchar(512) NOT NULL; -- mysql tinyint(1) is deprecated - modify all tinyint(1) columns to tinyint ALTER TABLE tblCons MODIFY COLUMN `Expanded` tinyint NOT NULL; @@ -151,6 +152,7 @@ ALTER TABLE tblCons ALTER COLUMN RenderingEngine varchar(32) DEFAULT NULL; ALTER TABLE tblCons ALTER COLUMN RedirectDiskDrives varchar(32) DEFAULT NULL; ALTER TABLE tblCons ADD RedirectDiskDrivesCustom varchar(32) DEFAULT NULL; ALTER TABLE tblCons ADD InheritRedirectDiskDrivesCustom bit NOT NULL; +ALTER TABLE tblCons ADD `UserViaAPI` varchar(512) NOT NULL; "; const string msSqlUpdate = @"UPDATE tblRoot SET ConfVersion=@confVersion;"; diff --git a/mRemoteNG/Connection/DefaultConnectionInfo.cs b/mRemoteNG/Connection/DefaultConnectionInfo.cs index 21b596d8..ebe86d79 100644 --- a/mRemoteNG/Connection/DefaultConnectionInfo.cs +++ b/mRemoteNG/Connection/DefaultConnectionInfo.cs @@ -69,8 +69,7 @@ namespace mRemoteNG.Connection throw new SettingsPropertyNotFoundException($"No property with name '{expectedPropertyName}' found."); // ensure value is of correct type - var value = Convert.ChangeType(property.GetValue(Instance, null), - propertyFromDestination.PropertyType); + var value = Convert.ChangeType(property.GetValue(Instance, null), propertyFromDestination.PropertyType); propertyFromDestination.SetValue(destinationInstance, value, null); } diff --git a/mRemoteNG/Schemas/mremoteng_confcons_v2_8.xsd b/mRemoteNG/Schemas/mremoteng_confcons_v2_8.xsd index 0b8a9ece..8d6a2af4 100644 --- a/mRemoteNG/Schemas/mremoteng_confcons_v2_8.xsd +++ b/mRemoteNG/Schemas/mremoteng_confcons_v2_8.xsd @@ -127,7 +127,7 @@ - + diff --git a/mRemoteNGTests/Config/CredentialHarvesterTests.cs b/mRemoteNGTests/Config/CredentialHarvesterTests.cs index b6be27f6..57d5d07f 100644 --- a/mRemoteNGTests/Config/CredentialHarvesterTests.cs +++ b/mRemoteNGTests/Config/CredentialHarvesterTests.cs @@ -113,13 +113,13 @@ public class CredentialHarvesterTests var map = _credentialHarvester.ConnectionToCredentialMap; Assert.That(map[con1Id], Is.EqualTo(map[con2Id])); } - + private XDocument CreateTestData(ConnectionInfo connectionInfo) { var rootNode = new RootNodeInfo(RootNodeType.Connection) { PasswordString = _key.ConvertToUnsecureString() }; rootNode.AddChild(connectionInfo); - var nodeSerializer = new XmlConnectionNodeSerializer27(_cryptographyProvider, _key, new SaveFilter()); + var nodeSerializer = new XmlConnectionNodeSerializer28(_cryptographyProvider, _key, new SaveFilter()); var serializer = new XmlConnectionsSerializer(_cryptographyProvider, nodeSerializer); var serializedData = serializer.Serialize(rootNode); return XDocument.Parse(serializedData); diff --git a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Xml/ValidateXmlSchemas.cs b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Xml/ValidateXmlSchemas.cs index efb51fae..6a5c2c0d 100644 --- a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Xml/ValidateXmlSchemas.cs +++ b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Xml/ValidateXmlSchemas.cs @@ -30,7 +30,7 @@ public class ValidateXmlSchemas _connectionTreeModel.AddRootNode(root); _cryptographyProvider = new AeadCryptographyProvider(); - var connectionNodeSerializer = new XmlConnectionNodeSerializer27( + var connectionNodeSerializer = new XmlConnectionNodeSerializer28( _cryptographyProvider, _connectionTreeModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), new SaveFilter()); diff --git a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDocumentCompilerTests.cs b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDocumentCompilerTests.cs index b9631e55..e4355b41 100644 --- a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDocumentCompilerTests.cs +++ b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDocumentCompilerTests.cs @@ -30,7 +30,7 @@ public class XmlConnectionsDocumentCompilerTests { _connectionTreeModel = SetupConnectionTreeModel(); _cryptographyProvider = new CryptoProviderFactory(BlockCipherEngines.AES, BlockCipherModes.GCM).Build(); - var connectionNodeSerializer = new XmlConnectionNodeSerializer27( + var connectionNodeSerializer = new XmlConnectionNodeSerializer28( _cryptographyProvider, _connectionTreeModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), new SaveFilter()); diff --git a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDocumentEncryptorTests.cs b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDocumentEncryptorTests.cs index 9a4a3f50..6650d8d3 100644 --- a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDocumentEncryptorTests.cs +++ b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDocumentEncryptorTests.cs @@ -21,7 +21,7 @@ public class XmlConnectionsDocumentEncryptorTests { var connectionTreeModel = SetupConnectionTreeModel(); var cryptoProvider = new CryptoProviderFactory(BlockCipherEngines.AES, BlockCipherModes.GCM).Build(); - var connectionNodeSerializer = new XmlConnectionNodeSerializer27( + var connectionNodeSerializer = new XmlConnectionNodeSerializer28( cryptoProvider, connectionTreeModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), new SaveFilter()); diff --git a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsSerializerTests.cs b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsSerializerTests.cs index 07694567..747b60d1 100644 --- a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsSerializerTests.cs +++ b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsSerializerTests.cs @@ -24,7 +24,7 @@ public class XmlConnectionsSerializerTests { _connectionTreeModel = SetupConnectionTreeModel(); _cryptographyProvider = new AeadCryptographyProvider(); - var connectionNodeSerializer = new XmlConnectionNodeSerializer27( + var connectionNodeSerializer = new XmlConnectionNodeSerializer28( _cryptographyProvider, _connectionTreeModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), new SaveFilter()); @@ -37,8 +37,7 @@ public class XmlConnectionsSerializerTests var serializedConnections = _serializer.Serialize(_connectionTreeModel); var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(serializedConnections); - var nodeCon4 = - xmlDoc.DocumentElement?.SelectSingleNode("Node[@Name='folder2']/Node[@Name='folder3']/Node[@Name='con4']"); + var nodeCon4 = xmlDoc.DocumentElement?.SelectSingleNode("Node[@Name='folder2']/Node[@Name='folder3']/Node[@Name='con4']"); Assert.That(nodeCon4, Is.Not.Null); } @@ -59,7 +58,7 @@ public class XmlConnectionsSerializerTests [TestCase("InheritAutomaticResize", null)] public void SerializerRespectsSaveFilterSettings(string attributeName, string expectedValue) { - var connectionNodeSerializer = new XmlConnectionNodeSerializer27( + var connectionNodeSerializer = new XmlConnectionNodeSerializer28( _cryptographyProvider, _connectionTreeModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), new SaveFilter(true)); diff --git a/mRemoteNGTests/Connection/DefaultConnectionInfoTests.cs b/mRemoteNGTests/Connection/DefaultConnectionInfoTests.cs index bafb4e14..7407a366 100644 --- a/mRemoteNGTests/Connection/DefaultConnectionInfoTests.cs +++ b/mRemoteNGTests/Connection/DefaultConnectionInfoTests.cs @@ -43,13 +43,13 @@ namespace mRemoteNGTests.Connection { var saveTarget = new SerializableConnectionInfoAllPropertiesOfType(); - // randomize default connnection values to ensure we dont get false passing tests + // randomize default connection values to ensure we don't get false passing tests var randomizedValue = property.GetValue(_randomizedConnectionInfo); property.SetValue(DefaultConnectionInfo.Instance, randomizedValue); DefaultConnectionInfo.Instance.SaveTo(saveTarget); - var valueInSource = property.GetValue(DefaultConnectionInfo.Instance).ToString(); + var valueInSource = property.GetValue(DefaultConnectionInfo.Instance)?.ToString(); var valueInDestination = saveTarget.GetType().GetProperty(property.Name)?.GetValue(saveTarget)?.ToString(); Assert.That(valueInDestination, Is.EqualTo(valueInSource)); } diff --git a/mRemoteNGTests/IntegrationTests/XmlSerializationLifeCycleTests.cs b/mRemoteNGTests/IntegrationTests/XmlSerializationLifeCycleTests.cs index 44c547e5..24c4d25f 100644 --- a/mRemoteNGTests/IntegrationTests/XmlSerializationLifeCycleTests.cs +++ b/mRemoteNGTests/IntegrationTests/XmlSerializationLifeCycleTests.cs @@ -11,7 +11,6 @@ using System.Linq; using System.Text; using mRemoteNG.Config.Serializers.ConnectionSerializers.Xml; - namespace mRemoteNGTests.IntegrationTests { public class XmlSerializationLifeCycleTests @@ -26,7 +25,7 @@ namespace mRemoteNGTests.IntegrationTests { _originalModel = SetupConnectionTreeModel(); var cryptoProvider = _cryptoFactory.Build(); - var nodeSerializer = new XmlConnectionNodeSerializer27( + var nodeSerializer = new XmlConnectionNodeSerializer28( cryptoProvider, _originalModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), new SaveFilter()); @@ -71,13 +70,12 @@ namespace mRemoteNGTests.IntegrationTests Assert.That(deserializedConnectionInfo.Description, Is.EqualTo(originalConnectionInfo.Description)); } - [Test] public void SerializeAndDeserializeWithCustomKdfIterationsValue() { var cryptoProvider = _cryptoFactory.Build(); cryptoProvider.KeyDerivationIterations = 5000; - var nodeSerializer = new XmlConnectionNodeSerializer27( + var nodeSerializer = new XmlConnectionNodeSerializer28( cryptoProvider, _originalModel.RootNodes.OfType().First().PasswordString.ConvertToSecureString(), new SaveFilter()); diff --git a/mRemoteNGTests/TestHelpers/SerializableConnectionInfoAllPropertiesOfType.cs b/mRemoteNGTests/TestHelpers/SerializableConnectionInfoAllPropertiesOfType.cs index fae209a0..8fd38322 100644 --- a/mRemoteNGTests/TestHelpers/SerializableConnectionInfoAllPropertiesOfType.cs +++ b/mRemoteNGTests/TestHelpers/SerializableConnectionInfoAllPropertiesOfType.cs @@ -47,7 +47,8 @@ public TType DisableCursorBlinking { get; set; } public TType RedirectKeys { get; set; } public TType RedirectDiskDrives { get; set; } - public TType RedirectPrinters { get; set; } + public TType RedirectDiskDrivesCustom { get; set; } + public TType RedirectPrinters { get; set; } public TType RedirectClipboard { get; set; } public TType RedirectPorts { get; set; } public TType RedirectSmartCards { get; set; } diff --git a/mRemoteNGTests/UI/Window/ConfigWindowTests/ConfigWindowGeneralTests.cs b/mRemoteNGTests/UI/Window/ConfigWindowTests/ConfigWindowGeneralTests.cs index 02f7e59d..0257612d 100644 --- a/mRemoteNGTests/UI/Window/ConfigWindowTests/ConfigWindowGeneralTests.cs +++ b/mRemoteNGTests/UI/Window/ConfigWindowTests/ConfigWindowGeneralTests.cs @@ -254,6 +254,7 @@ namespace mRemoteNGTests.UI.Window.ConfigWindowTests nameof(ConnectionInfo.DisableCursorBlinking), nameof(ConnectionInfo.RedirectKeys), nameof(ConnectionInfo.RedirectDiskDrives), + nameof(ConnectionInfo.RedirectDiskDrivesCustom), nameof(ConnectionInfo.RedirectPrinters), nameof(ConnectionInfo.RedirectClipboard), nameof(ConnectionInfo.RedirectPorts), @@ -267,6 +268,7 @@ namespace mRemoteNGTests.UI.Window.ConfigWindowTests nameof(ConnectionInfo.RDGatewayUserViaAPI), nameof(ConnectionInfo.ExternalCredentialProvider), nameof(ConnectionInfo.ExternalAddressProvider), + nameof(ConnectionInfo.UserViaAPI), }); break; case ProtocolType.VNC: