From fc8e9c7689d5a0282dfe2c3ccb9829f29f60d430 Mon Sep 17 00:00:00 2001 From: BlueBlock Date: Thu, 23 Mar 2023 16:20:01 -0400 Subject: [PATCH] rename class from mssql to sql This class is not dedicated to mssql but is used by all sql databases. Rename to reflect this. --- .../{MsSql => Sql}/DataTableDeserializer.cs | 562 +++--- .../{MsSql => Sql}/DataTableSerializer.cs | 1581 ++++++++--------- .../LocalConnectionPropertiesModel.cs | 2 +- .../LocalConnectionPropertiesXmlSerializer.cs | 2 +- .../SqlConnectionListMetaData.cs | 2 +- .../SqlDatabaseMetaDataRetriever.cs | 468 +++-- 6 files changed, 1420 insertions(+), 1197 deletions(-) rename mRemoteNG/Config/Serializers/ConnectionSerializers/{MsSql => Sql}/DataTableDeserializer.cs (50%) rename mRemoteNG/Config/Serializers/ConnectionSerializers/{MsSql => Sql}/DataTableSerializer.cs (60%) rename mRemoteNG/Config/Serializers/ConnectionSerializers/{MsSql => Sql}/LocalConnectionPropertiesModel.cs (99%) rename mRemoteNG/Config/Serializers/ConnectionSerializers/{MsSql => Sql}/LocalConnectionPropertiesXmlSerializer.cs (97%) rename mRemoteNG/Config/Serializers/ConnectionSerializers/{MsSql => Sql}/SqlConnectionListMetaData.cs (79%) rename mRemoteNG/Config/Serializers/ConnectionSerializers/{MsSql => Sql}/SqlDatabaseMetaDataRetriever.cs (54%) diff --git a/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/DataTableDeserializer.cs b/mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/DataTableDeserializer.cs similarity index 50% rename from mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/DataTableDeserializer.cs rename to mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/DataTableDeserializer.cs index 5f29a2ef..f2f92b07 100644 --- a/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/DataTableDeserializer.cs +++ b/mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/DataTableDeserializer.cs @@ -1,282 +1,282 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Runtime.Versioning; -using System.Security; -using mRemoteNG.App; -using mRemoteNG.Connection; -using mRemoteNG.Connection.Protocol; -using mRemoteNG.Connection.Protocol.Http; -using mRemoteNG.Connection.Protocol.RDP; -using mRemoteNG.Connection.Protocol.VNC; -using mRemoteNG.Container; -using mRemoteNG.Security; -using mRemoteNG.Tools; -using mRemoteNG.Tree; -using mRemoteNG.Tree.Root; - -namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql -{ - [SupportedOSPlatform("windows")] - public class DataTableDeserializer : IDeserializer - { - private readonly ICryptographyProvider _cryptographyProvider; - private readonly SecureString _decryptionKey; - - public DataTableDeserializer(ICryptographyProvider cryptographyProvider, SecureString decryptionKey) - { - _cryptographyProvider = cryptographyProvider.ThrowIfNull(nameof(cryptographyProvider)); - _decryptionKey = decryptionKey.ThrowIfNull(nameof(decryptionKey)); - } - - public ConnectionTreeModel Deserialize(DataTable table) - { - var connectionList = CreateNodesFromTable(table); - var connectionTreeModel = CreateNodeHierarchy(connectionList, table); - Runtime.ConnectionsService.IsConnectionsFileLoaded = true; - return connectionTreeModel; - } - - private List CreateNodesFromTable(DataTable table) - { - var nodeList = new List(); - foreach (DataRow row in table.Rows) - { - // ReSharper disable once SwitchStatementMissingSomeCases - switch ((string)row["Type"]) - { - case "Connection": - nodeList.Add(DeserializeConnectionInfo(row)); - break; - case "Container": - nodeList.Add(DeserializeContainerInfo(row)); - break; - } - } - - return nodeList; - } - - private ConnectionInfo DeserializeConnectionInfo(DataRow row) - { - var connectionId = row["ConstantID"] as string ?? Guid.NewGuid().ToString(); - var connectionInfo = new ConnectionInfo(connectionId); - PopulateConnectionInfoFromDatarow(row, connectionInfo); - return connectionInfo; - } - - private ContainerInfo DeserializeContainerInfo(DataRow row) - { - var containerId = row["ConstantID"] as string ?? Guid.NewGuid().ToString(); - var containerInfo = new ContainerInfo(containerId); - PopulateConnectionInfoFromDatarow(row, containerInfo); - return containerInfo; - } - - private void PopulateConnectionInfoFromDatarow(DataRow dataRow, ConnectionInfo connectionInfo) - { - connectionInfo.Name = (string)dataRow["Name"]; - - // This throws a NPE - Parent is a connectionInfo object which will be null at this point. - // The Parent object is linked properly later in CreateNodeHierarchy() - //connectionInfo.Parent.ConstantID = (string)dataRow["ParentID"]; - - connectionInfo.Description = (string)dataRow["Description"]; - connectionInfo.Icon = (string)dataRow["Icon"]; - connectionInfo.Panel = (string)dataRow["Panel"]; - //connectionInfo.ExternalCredentialProvider = (ExternalCredentialProvider)Enum.Parse(typeof(ExternalCredentialProvider), (string)dataRow["ExternalCredentialProvider"]); - //connectionInfo.UserViaAPI = (string)dataRow["UserViaAPI"]; - connectionInfo.Username = (string)dataRow["Username"]; - connectionInfo.Domain = (string)dataRow["Domain"]; - connectionInfo.Password = DecryptValue((string)dataRow["Password"]); - connectionInfo.Hostname = (string)dataRow["Hostname"]; - //connectionInfo.ExternalAddressProvider = (ExternalAddressProvider)Enum.Parse(typeof(ExternalAddressProvider), (string)dataRow["ExternalAddressProvider"]); - //connectionInfo.EC2Region = (string)dataRow["EC2Region"]; - //connectionInfo.EC2InstanceId = (string)dataRow["EC2InstanceId"]; - connectionInfo.VmId = (string)dataRow["VmId"]; - connectionInfo.UseEnhancedMode = (bool)dataRow["UseEnhancedMode"]; - connectionInfo.Protocol = (ProtocolType)Enum.Parse(typeof(ProtocolType), (string)dataRow["Protocol"]); - connectionInfo.SSHTunnelConnectionName = (string)dataRow["SSHTunnelConnectionName"]; - connectionInfo.OpeningCommand = (string)dataRow["OpeningCommand"]; - connectionInfo.SSHOptions = (string)dataRow["SSHOptions"]; - connectionInfo.PuttySession = (string)dataRow["PuttySession"]; - connectionInfo.Port = (int)dataRow["Port"]; - connectionInfo.UseConsoleSession = (bool)dataRow["ConnectToConsole"]; - connectionInfo.UseCredSsp = (bool)dataRow["UseCredSsp"]; - connectionInfo.UseRestrictedAdmin = (bool)dataRow["UseRestrictedAdmin"]; - connectionInfo.UseRCG = (bool)dataRow["UseRCG"]; - connectionInfo.UseVmId = (bool)dataRow["UseVmId"]; - connectionInfo.RenderingEngine = (HTTPBase.RenderingEngine)Enum.Parse(typeof(HTTPBase.RenderingEngine), (string)dataRow["RenderingEngine"]); - connectionInfo.RDPAuthenticationLevel = (AuthenticationLevel)Enum.Parse(typeof(AuthenticationLevel), (string)dataRow["RDPAuthenticationLevel"]); - connectionInfo.RDPMinutesToIdleTimeout = (int)dataRow["RDPMinutesToIdleTimeout"]; - connectionInfo.RDPAlertIdleTimeout = (bool)dataRow["RDPAlertIdleTimeout"]; - connectionInfo.LoadBalanceInfo = (string)dataRow["LoadBalanceInfo"]; - connectionInfo.Colors = (RDPColors)Enum.Parse(typeof(RDPColors), (string)dataRow["Colors"]); - connectionInfo.Resolution = (RDPResolutions)Enum.Parse(typeof(RDPResolutions), (string)dataRow["Resolution"]); - connectionInfo.AutomaticResize = (bool)dataRow["AutomaticResize"]; - connectionInfo.DisplayWallpaper = (bool)dataRow["DisplayWallpaper"]; - connectionInfo.DisplayThemes = (bool)dataRow["DisplayThemes"]; - connectionInfo.EnableFontSmoothing = (bool)dataRow["EnableFontSmoothing"]; - connectionInfo.EnableDesktopComposition = (bool)dataRow["EnableDesktopComposition"]; - connectionInfo.DisableFullWindowDrag = (bool)dataRow["DisableFullWindowDrag"]; - connectionInfo.DisableMenuAnimations = (bool)dataRow["DisableMenuAnimations"]; - connectionInfo.DisableCursorShadow = (bool)dataRow["DisableCursorShadow"]; - connectionInfo.DisableCursorBlinking = (bool)dataRow["DisableCursorBlinking"]; - connectionInfo.CacheBitmaps = (bool)dataRow["CacheBitmaps"]; - connectionInfo.RedirectDiskDrives = (RDPDiskDrives)Enum.Parse(typeof(RDPDiskDrives), (string)dataRow["RedirectDiskDrives"]); - connectionInfo.RedirectDiskDrivesCustom = (string)dataRow["RedirectDiskDrivesCustom"]; - connectionInfo.RedirectPorts = (bool)dataRow["RedirectPorts"]; - connectionInfo.RedirectPrinters = (bool)dataRow["RedirectPrinters"]; - connectionInfo.RedirectClipboard = (bool)dataRow["RedirectClipboard"]; - connectionInfo.RedirectSmartCards = (bool)dataRow["RedirectSmartCards"]; - connectionInfo.RedirectSound = (RDPSounds)Enum.Parse(typeof(RDPSounds), (string)dataRow["RedirectSound"]); - connectionInfo.SoundQuality = (RDPSoundQuality)Enum.Parse(typeof(RDPSoundQuality), (string)dataRow["SoundQuality"]); - connectionInfo.RedirectAudioCapture = (bool)dataRow["RedirectAudioCapture"]; - connectionInfo.RDPStartProgram = (string)dataRow["StartProgram"]; - connectionInfo.RDPStartProgramWorkDir = (string)dataRow["StartProgramWorkDir"]; - connectionInfo.RedirectKeys = (bool)dataRow["RedirectKeys"]; - connectionInfo.OpeningCommand = (string)dataRow["OpeningCommand"]; - connectionInfo.PreExtApp = (string)dataRow["PreExtApp"]; - connectionInfo.PostExtApp = (string)dataRow["PostExtApp"]; - connectionInfo.MacAddress = (string)dataRow["MacAddress"]; - connectionInfo.UserField = (string)dataRow["UserField"]; - connectionInfo.ExtApp = (string)dataRow["ExtApp"]; - connectionInfo.VNCCompression = (ProtocolVNC.Compression)Enum.Parse(typeof(ProtocolVNC.Compression), (string)dataRow["VNCCompression"]); - connectionInfo.VNCEncoding = (ProtocolVNC.Encoding)Enum.Parse(typeof(ProtocolVNC.Encoding), (string)dataRow["VNCEncoding"]); - connectionInfo.VNCAuthMode = (ProtocolVNC.AuthMode)Enum.Parse(typeof(ProtocolVNC.AuthMode), (string)dataRow["VNCAuthMode"]); - connectionInfo.VNCProxyType = (ProtocolVNC.ProxyType)Enum.Parse(typeof(ProtocolVNC.ProxyType), (string)dataRow["VNCProxyType"]); - connectionInfo.VNCProxyIP = (string)dataRow["VNCProxyIP"]; - connectionInfo.VNCProxyPort = (int)dataRow["VNCProxyPort"]; - connectionInfo.VNCProxyUsername = (string)dataRow["VNCProxyUsername"]; - connectionInfo.VNCProxyPassword = DecryptValue((string)dataRow["VNCProxyPassword"]); - connectionInfo.VNCColors = (ProtocolVNC.Colors)Enum.Parse(typeof(ProtocolVNC.Colors), (string)dataRow["VNCColors"]); - connectionInfo.VNCSmartSizeMode = (ProtocolVNC.SmartSizeMode)Enum.Parse(typeof(ProtocolVNC.SmartSizeMode), (string)dataRow["VNCSmartSizeMode"]); - connectionInfo.VNCViewOnly = (bool)dataRow["VNCViewOnly"]; - connectionInfo.RDGatewayUsageMethod = (RDGatewayUsageMethod)Enum.Parse(typeof(RDGatewayUsageMethod), (string)dataRow["RDGatewayUsageMethod"]); - connectionInfo.RDGatewayHostname = (string)dataRow["RDGatewayHostname"]; - connectionInfo.RDGatewayUseConnectionCredentials = (RDGatewayUseConnectionCredentials)Enum.Parse(typeof(RDGatewayUseConnectionCredentials), (string)dataRow["RDGatewayUseConnectionCredentials"]); - connectionInfo.RDGatewayUsername = (string)dataRow["RDGatewayUsername"]; - connectionInfo.RDGatewayPassword = DecryptValue((string)dataRow["RDGatewayPassword"]); - connectionInfo.RDGatewayDomain = (string)dataRow["RDGatewayDomain"]; - //connectionInfo.RDGatewayExternalCredentialProvider = (ExternalCredentialProvider)Enum.Parse(typeof(ExternalCredentialProvider), (string)dataRow["RDGatewayExternalCredentialProvider"]); - //connectionInfo.RDGatewayUserViaAPI = (string)dataRow["RDGatewayUserViaAPI"]; - - if (!dataRow.IsNull("RdpVersion")) // table allows null values which must be handled - if (Enum.TryParse((string)dataRow["RdpVersion"], true, out RdpVersion rdpVersion)) - connectionInfo.RdpVersion = rdpVersion; - - connectionInfo.Inheritance.CacheBitmaps = (bool)dataRow["InheritCacheBitmaps"]; - connectionInfo.Inheritance.Colors = (bool)dataRow["InheritColors"]; - connectionInfo.Inheritance.Description = (bool)dataRow["InheritDescription"]; - connectionInfo.Inheritance.DisplayThemes = (bool)dataRow["InheritDisplayThemes"]; - connectionInfo.Inheritance.DisplayWallpaper = (bool)dataRow["InheritDisplayWallpaper"]; - connectionInfo.Inheritance.EnableFontSmoothing = (bool)dataRow["InheritEnableFontSmoothing"]; - connectionInfo.Inheritance.EnableDesktopComposition = (bool)dataRow["InheritEnableDesktopComposition"]; - connectionInfo.Inheritance.DisableFullWindowDrag = (bool)dataRow["InheritDisableFullWindowDrag"]; - connectionInfo.Inheritance.DisableMenuAnimations = (bool)dataRow["InheritDisableMenuAnimations"]; - connectionInfo.Inheritance.DisableCursorShadow = (bool)dataRow["InheritDisableCursorShadow"]; - connectionInfo.Inheritance.DisableCursorBlinking = (bool)dataRow["InheritDisableCursorBlinking"]; - //connectionInfo.Inheritance.ExternalCredentialProvider = (bool)dataRow["InheritExternalCredentialProvider"]; - //connectionInfo.Inheritance.UserViaAPI = (bool)dataRow["InheritUserViaAPI"]; - connectionInfo.Inheritance.Domain = (bool)dataRow["InheritDomain"]; - connectionInfo.Inheritance.Icon = (bool)dataRow["InheritIcon"]; - connectionInfo.Inheritance.Panel = (bool)dataRow["InheritPanel"]; - connectionInfo.Inheritance.Password = (bool)dataRow["InheritPassword"]; - connectionInfo.Inheritance.Port = (bool)dataRow["InheritPort"]; - connectionInfo.Inheritance.Protocol = (bool)dataRow["InheritProtocol"]; - connectionInfo.Inheritance.SSHTunnelConnectionName = (bool)dataRow["InheritSSHTunnelConnectionName"]; - connectionInfo.Inheritance.OpeningCommand = (bool)dataRow["InheritOpeningCommand"]; - connectionInfo.Inheritance.SSHOptions = (bool)dataRow["InheritSSHOptions"]; - connectionInfo.Inheritance.PuttySession = (bool)dataRow["InheritPuttySession"]; - connectionInfo.Inheritance.RedirectDiskDrives = (bool)dataRow["InheritRedirectDiskDrives"]; - connectionInfo.Inheritance.RedirectDiskDrivesCustom = (bool)dataRow["InheritRedirectDiskDrivesCustom"]; - connectionInfo.Inheritance.RedirectKeys = (bool)dataRow["InheritRedirectKeys"]; - connectionInfo.Inheritance.RedirectPorts = (bool)dataRow["InheritRedirectPorts"]; - connectionInfo.Inheritance.RedirectPrinters = (bool)dataRow["InheritRedirectPrinters"]; - connectionInfo.Inheritance.RedirectClipboard = (bool)dataRow["InheritRedirectClipboard"]; - connectionInfo.Inheritance.RedirectSmartCards = (bool)dataRow["InheritRedirectSmartCards"]; - connectionInfo.Inheritance.RedirectSound = (bool)dataRow["InheritRedirectSound"]; - connectionInfo.Inheritance.SoundQuality = (bool)dataRow["InheritSoundQuality"]; - connectionInfo.Inheritance.RedirectAudioCapture = (bool)dataRow["InheritRedirectAudioCapture"]; - connectionInfo.Inheritance.Resolution = (bool)dataRow["InheritResolution"]; - connectionInfo.Inheritance.AutomaticResize = (bool)dataRow["InheritAutomaticResize"]; - connectionInfo.Inheritance.UseConsoleSession = (bool)dataRow["InheritUseConsoleSession"]; - connectionInfo.Inheritance.UseCredSsp = (bool)dataRow["InheritUseCredSsp"]; - connectionInfo.Inheritance.UseRestrictedAdmin = (bool)dataRow["InheritUseRestrictedAdmin"]; - connectionInfo.Inheritance.UseRCG = (bool)dataRow["InheritUseRCG"]; - connectionInfo.Inheritance.UseVmId = (bool)dataRow["InheritUseVmId"]; - connectionInfo.Inheritance.UseEnhancedMode = (bool)dataRow["InheritUseEnhancedMode"]; - connectionInfo.Inheritance.VmId = (bool)dataRow["InheritVmId"]; - connectionInfo.Inheritance.RenderingEngine = (bool)dataRow["InheritRenderingEngine"]; - connectionInfo.Inheritance.Username = (bool)dataRow["InheritUsername"]; - connectionInfo.Inheritance.RDPAuthenticationLevel = (bool)dataRow["InheritRDPAuthenticationLevel"]; - connectionInfo.Inheritance.RDPAlertIdleTimeout = (bool)dataRow["InheritRDPAlertIdleTimeout"]; - connectionInfo.Inheritance.RDPMinutesToIdleTimeout = (bool)dataRow["InheritRDPMinutesToIdleTimeout"]; - connectionInfo.Inheritance.LoadBalanceInfo = (bool)dataRow["InheritLoadBalanceInfo"]; - connectionInfo.Inheritance.OpeningCommand = (bool)dataRow["InheritOpeningCommand"]; - connectionInfo.Inheritance.PreExtApp = (bool)dataRow["InheritPreExtApp"]; - connectionInfo.Inheritance.PostExtApp = (bool)dataRow["InheritPostExtApp"]; - connectionInfo.Inheritance.MacAddress = (bool)dataRow["InheritMacAddress"]; - connectionInfo.Inheritance.UserField = (bool)dataRow["InheritUserField"]; - connectionInfo.Inheritance.ExtApp = (bool)dataRow["InheritExtApp"]; - connectionInfo.Inheritance.VNCCompression = (bool)dataRow["InheritVNCCompression"]; - connectionInfo.Inheritance.VNCEncoding = (bool)dataRow["InheritVNCEncoding"]; - connectionInfo.Inheritance.VNCAuthMode = (bool)dataRow["InheritVNCAuthMode"]; - connectionInfo.Inheritance.VNCProxyType = (bool)dataRow["InheritVNCProxyType"]; - connectionInfo.Inheritance.VNCProxyIP = (bool)dataRow["InheritVNCProxyIP"]; - connectionInfo.Inheritance.VNCProxyPort = (bool)dataRow["InheritVNCProxyPort"]; - connectionInfo.Inheritance.VNCProxyUsername = (bool)dataRow["InheritVNCProxyUsername"]; - connectionInfo.Inheritance.VNCProxyPassword = (bool)dataRow["InheritVNCProxyPassword"]; - connectionInfo.Inheritance.VNCColors = (bool)dataRow["InheritVNCColors"]; - connectionInfo.Inheritance.VNCSmartSizeMode = (bool)dataRow["InheritVNCSmartSizeMode"]; - connectionInfo.Inheritance.VNCViewOnly = (bool)dataRow["InheritVNCViewOnly"]; - connectionInfo.Inheritance.RDGatewayUsageMethod = (bool)dataRow["InheritRDGatewayUsageMethod"]; - connectionInfo.Inheritance.RDGatewayHostname = (bool)dataRow["InheritRDGatewayHostname"]; - connectionInfo.Inheritance.RDGatewayUseConnectionCredentials = (bool)dataRow["InheritRDGatewayUseConnectionCredentials"]; - connectionInfo.Inheritance.RDGatewayUsername = (bool)dataRow["InheritRDGatewayUsername"]; - connectionInfo.Inheritance.RDGatewayPassword = (bool)dataRow["InheritRDGatewayPassword"]; - connectionInfo.Inheritance.RDGatewayDomain = (bool)dataRow["InheritRDGatewayDomain"]; - //connectionInfo.Inheritance.RDGatewayExternalCredentialProvider = (bool)dataRow["InheritRDGatewayExternalCredentialProvider"]; - //connectionInfo.Inheritance.RDGatewayUserViaAPI = (bool)dataRow["InheritRDGatewayUserViaAPI"]; - connectionInfo.Inheritance.RdpVersion = (bool)dataRow["InheritRdpVersion"]; - } - - private string DecryptValue(string cipherText) - { - try - { - return _cryptographyProvider.Decrypt(cipherText, _decryptionKey); - } - catch (EncryptionException) - { - // value may not be encrypted - return cipherText; - } - } - - private ConnectionTreeModel CreateNodeHierarchy(List connectionList, DataTable dataTable) - { - var connectionTreeModel = new ConnectionTreeModel(); - var rootNode = new RootNodeInfo(RootNodeType.Connection, "0") - { - PasswordString = _decryptionKey.ConvertToUnsecureString() - }; - connectionTreeModel.AddRootNode(rootNode); - - foreach (DataRow row in dataTable.Rows) - { - var id = (string)row["ConstantID"]; - var connectionInfo = connectionList.First(node => node.ConstantID == id); - var parentId = (string)row["ParentID"]; - if (parentId == "0" || connectionList.All(node => node.ConstantID != parentId)) - rootNode.AddChild(connectionInfo); - else - (connectionList.First(node => node.ConstantID == parentId) as ContainerInfo)?.AddChild( - connectionInfo); - } - - return connectionTreeModel; - } - } +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Runtime.Versioning; +using System.Security; +using mRemoteNG.App; +using mRemoteNG.Connection; +using mRemoteNG.Connection.Protocol; +using mRemoteNG.Connection.Protocol.Http; +using mRemoteNG.Connection.Protocol.RDP; +using mRemoteNG.Connection.Protocol.VNC; +using mRemoteNG.Container; +using mRemoteNG.Messages; +using mRemoteNG.Security; +using mRemoteNG.Tools; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; + +namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql +{ + [SupportedOSPlatform("windows")] + public class DataTableDeserializer : IDeserializer + { + private readonly ICryptographyProvider _cryptographyProvider; + private readonly SecureString _decryptionKey; + + public DataTableDeserializer(ICryptographyProvider cryptographyProvider, SecureString decryptionKey) + { + _cryptographyProvider = cryptographyProvider.ThrowIfNull(nameof(cryptographyProvider)); + _decryptionKey = decryptionKey.ThrowIfNull(nameof(decryptionKey)); + } + + public ConnectionTreeModel Deserialize(DataTable table) + { + var connectionList = CreateNodesFromTable(table); + var connectionTreeModel = CreateNodeHierarchy(connectionList, table); + Runtime.ConnectionsService.IsConnectionsFileLoaded = true; + return connectionTreeModel; + } + + private List CreateNodesFromTable(DataTable table) + { + var nodeList = new List(); + foreach (DataRow row in table.Rows) + { + // ReSharper disable once SwitchStatementMissingSomeCases + switch ((string)row["Type"]) + { + case "Connection": + nodeList.Add(DeserializeConnectionInfo(row)); + break; + case "Container": + nodeList.Add(DeserializeContainerInfo(row)); + break; + } + } + + return nodeList; + } + + private ConnectionInfo DeserializeConnectionInfo(DataRow row) + { + var connectionId = row["ConstantID"] as string ?? Guid.NewGuid().ToString(); + var connectionInfo = new ConnectionInfo(connectionId); + PopulateConnectionInfoFromDatarow(row, connectionInfo); + return connectionInfo; + } + + private ContainerInfo DeserializeContainerInfo(DataRow row) + { + var containerId = row["ConstantID"] as string ?? Guid.NewGuid().ToString(); + var containerInfo = new ContainerInfo(containerId); + PopulateConnectionInfoFromDatarow(row, containerInfo); + return containerInfo; + } + + private void PopulateConnectionInfoFromDatarow(DataRow dataRow, ConnectionInfo connectionInfo) + { + connectionInfo.Name = (string)dataRow["Name"]; + + // This throws a NPE - Parent is a connectionInfo object which will be null at this point. + // The Parent object is linked properly later in CreateNodeHierarchy() + //connectionInfo.Parent.ConstantID = (string)dataRow["ParentID"]; + + //connectionInfo.EC2InstanceId = (string)dataRow["EC2InstanceId"]; + //connectionInfo.EC2Region = (string)dataRow["EC2Region"]; + //connectionInfo.ExternalAddressProvider = (ExternalAddressProvider)Enum.Parse(typeof(ExternalAddressProvider), (string)dataRow["ExternalAddressProvider"]); + //connectionInfo.ExternalCredentialProvider = (ExternalCredentialProvider)Enum.Parse(typeof(ExternalCredentialProvider), (string)dataRow["ExternalCredentialProvider"]); + //connectionInfo.RDGatewayExternalCredentialProvider = (ExternalCredentialProvider)Enum.Parse(typeof(ExternalCredentialProvider), (string)dataRow["RDGatewayExternalCredentialProvider"]); + //connectionInfo.RDGatewayUserViaAPI = (string)dataRow["RDGatewayUserViaAPI"]; + //connectionInfo.UserViaAPI = (string)dataRow["UserViaAPI"]; + connectionInfo.AutomaticResize = MiscTools.GetBooleanValue(dataRow["AutomaticResize"]); + connectionInfo.CacheBitmaps = MiscTools.GetBooleanValue(dataRow["CacheBitmaps"]); + connectionInfo.Colors = (RDPColors)Enum.Parse(typeof(RDPColors), (string)dataRow["Colors"]); + connectionInfo.Description = (string)dataRow["Description"]; + connectionInfo.DisableCursorBlinking = MiscTools.GetBooleanValue(dataRow["DisableCursorBlinking"]); + connectionInfo.DisableCursorShadow = MiscTools.GetBooleanValue(dataRow["DisableCursorShadow"]); + connectionInfo.DisableFullWindowDrag = MiscTools.GetBooleanValue(dataRow["DisableFullWindowDrag"]); + connectionInfo.DisableMenuAnimations = MiscTools.GetBooleanValue(dataRow["DisableMenuAnimations"]); + connectionInfo.DisplayThemes = MiscTools.GetBooleanValue(dataRow["DisplayThemes"]); + connectionInfo.DisplayWallpaper = MiscTools.GetBooleanValue(dataRow["DisplayWallpaper"]); + connectionInfo.Domain = (string)dataRow["Domain"]; + connectionInfo.EnableDesktopComposition = MiscTools.GetBooleanValue(dataRow["EnableDesktopComposition"]); + connectionInfo.EnableFontSmoothing = MiscTools.GetBooleanValue(dataRow["EnableFontSmoothing"]); + connectionInfo.ExtApp = (string)dataRow["ExtApp"]; + connectionInfo.Hostname = (string)dataRow["Hostname"]; + connectionInfo.Icon = (string)dataRow["Icon"]; + connectionInfo.LoadBalanceInfo = (string)dataRow["LoadBalanceInfo"]; + connectionInfo.MacAddress = (string)dataRow["MacAddress"]; + connectionInfo.OpeningCommand = (string)dataRow["OpeningCommand"]; + connectionInfo.OpeningCommand = (string)dataRow["OpeningCommand"]; + connectionInfo.Panel = (string)dataRow["Panel"]; + connectionInfo.Password = DecryptValue((string)dataRow["Password"]); + connectionInfo.Port = (int)dataRow["Port"]; + connectionInfo.PostExtApp = (string)dataRow["PostExtApp"]; + connectionInfo.PreExtApp = (string)dataRow["PreExtApp"]; + connectionInfo.Protocol = (ProtocolType)Enum.Parse(typeof(ProtocolType), (string)dataRow["Protocol"]); + connectionInfo.PuttySession = (string)dataRow["PuttySession"]; + connectionInfo.RDGatewayDomain = (string)dataRow["RDGatewayDomain"]; + connectionInfo.RDGatewayHostname = (string)dataRow["RDGatewayHostname"]; + connectionInfo.RDGatewayPassword = DecryptValue((string)dataRow["RDGatewayPassword"]); + connectionInfo.RDGatewayUsageMethod = (RDGatewayUsageMethod)Enum.Parse(typeof(RDGatewayUsageMethod), (string)dataRow["RDGatewayUsageMethod"]); + connectionInfo.RDGatewayUseConnectionCredentials = (RDGatewayUseConnectionCredentials)Enum.Parse(typeof(RDGatewayUseConnectionCredentials), (string)dataRow["RDGatewayUseConnectionCredentials"]); + connectionInfo.RDGatewayUsername = (string)dataRow["RDGatewayUsername"]; + connectionInfo.RDPAlertIdleTimeout = MiscTools.GetBooleanValue(dataRow["RDPAlertIdleTimeout"]); + connectionInfo.RDPAuthenticationLevel = (AuthenticationLevel)Enum.Parse(typeof(AuthenticationLevel), (string)dataRow["RDPAuthenticationLevel"]); + connectionInfo.RDPMinutesToIdleTimeout = (int)dataRow["RDPMinutesToIdleTimeout"]; + connectionInfo.RDPStartProgram = (string)dataRow["StartProgram"]; + connectionInfo.RDPStartProgramWorkDir = (string)dataRow["StartProgramWorkDir"]; + connectionInfo.RedirectAudioCapture = MiscTools.GetBooleanValue(dataRow["RedirectAudioCapture"]); + connectionInfo.RedirectClipboard = MiscTools.GetBooleanValue(dataRow["RedirectClipboard"]); + connectionInfo.RedirectDiskDrives = (RDPDiskDrives)Enum.Parse(typeof(RDPDiskDrives), (string)dataRow["RedirectDiskDrives"]); + connectionInfo.RedirectDiskDrivesCustom = (string)dataRow["RedirectDiskDrivesCustom"]; + connectionInfo.RedirectKeys = MiscTools.GetBooleanValue(dataRow["RedirectKeys"]); + connectionInfo.RedirectPorts = MiscTools.GetBooleanValue(dataRow["RedirectPorts"]); + connectionInfo.RedirectPrinters = MiscTools.GetBooleanValue(dataRow["RedirectPrinters"]); + connectionInfo.RedirectSmartCards = MiscTools.GetBooleanValue(dataRow["RedirectSmartCards"]); + connectionInfo.RedirectSound = (RDPSounds)Enum.Parse(typeof(RDPSounds), (string)dataRow["RedirectSound"]); + connectionInfo.RenderingEngine = (HTTPBase.RenderingEngine)Enum.Parse(typeof(HTTPBase.RenderingEngine), (string)dataRow["RenderingEngine"]); + connectionInfo.Resolution = (RDPResolutions)Enum.Parse(typeof(RDPResolutions), (string)dataRow["Resolution"]); + connectionInfo.SoundQuality = (RDPSoundQuality)Enum.Parse(typeof(RDPSoundQuality), (string)dataRow["SoundQuality"]); + connectionInfo.SSHOptions = (string)dataRow["SSHOptions"]; + connectionInfo.SSHTunnelConnectionName = (string)dataRow["SSHTunnelConnectionName"]; + connectionInfo.UseConsoleSession = MiscTools.GetBooleanValue(dataRow["ConnectToConsole"]); + connectionInfo.UseCredSsp = MiscTools.GetBooleanValue(dataRow["UseCredSsp"]); + connectionInfo.UseEnhancedMode = MiscTools.GetBooleanValue(dataRow["UseEnhancedMode"]); + connectionInfo.UseRCG = MiscTools.GetBooleanValue(dataRow["UseRCG"]); + connectionInfo.UseRestrictedAdmin = MiscTools.GetBooleanValue(dataRow["UseRestrictedAdmin"]); + connectionInfo.UserField = (string)dataRow["UserField"]; + connectionInfo.Username = (string)dataRow["Username"]; + connectionInfo.UseVmId = MiscTools.GetBooleanValue(dataRow["UseVmId"]); + connectionInfo.VmId = (string)dataRow["VmId"]; + connectionInfo.VNCAuthMode = (ProtocolVNC.AuthMode)Enum.Parse(typeof(ProtocolVNC.AuthMode), (string)dataRow["VNCAuthMode"]); + connectionInfo.VNCColors = (ProtocolVNC.Colors)Enum.Parse(typeof(ProtocolVNC.Colors), (string)dataRow["VNCColors"]); + connectionInfo.VNCCompression = (ProtocolVNC.Compression)Enum.Parse(typeof(ProtocolVNC.Compression), (string)dataRow["VNCCompression"]); + connectionInfo.VNCEncoding = (ProtocolVNC.Encoding)Enum.Parse(typeof(ProtocolVNC.Encoding), (string)dataRow["VNCEncoding"]); + connectionInfo.VNCProxyIP = (string)dataRow["VNCProxyIP"]; + connectionInfo.VNCProxyPassword = DecryptValue((string)dataRow["VNCProxyPassword"]); + connectionInfo.VNCProxyPort = (int)dataRow["VNCProxyPort"]; + connectionInfo.VNCProxyType = (ProtocolVNC.ProxyType)Enum.Parse(typeof(ProtocolVNC.ProxyType), (string)dataRow["VNCProxyType"]); + connectionInfo.VNCProxyUsername = (string)dataRow["VNCProxyUsername"]; + connectionInfo.VNCSmartSizeMode = (ProtocolVNC.SmartSizeMode)Enum.Parse(typeof(ProtocolVNC.SmartSizeMode), (string)dataRow["VNCSmartSizeMode"]); + connectionInfo.VNCViewOnly = MiscTools.GetBooleanValue(dataRow["VNCViewOnly"]); + + if (!dataRow.IsNull("RdpVersion")) // table allows null values which must be handled + if (Enum.TryParse((string)dataRow["RdpVersion"], true, out RdpVersion rdpVersion)) + connectionInfo.RdpVersion = rdpVersion; + + //connectionInfo.Inheritance.ExternalCredentialProvider = MiscTools.GetBooleanValue(dataRow["InheritExternalCredentialProvider"]); + //connectionInfo.Inheritance.RDGatewayExternalCredentialProvider = MiscTools.GetBooleanValue(dataRow["InheritRDGatewayExternalCredentialProvider"]); + //connectionInfo.Inheritance.RDGatewayUserViaAPI = MiscTools.GetBooleanValue(dataRow["InheritRDGatewayUserViaAPI"]); + //connectionInfo.Inheritance.UserViaAPI = MiscTools.GetBooleanValue(dataRow["InheritUserViaAPI"]); + connectionInfo.Inheritance.AutomaticResize = MiscTools.GetBooleanValue(dataRow["InheritAutomaticResize"]); + connectionInfo.Inheritance.CacheBitmaps = MiscTools.GetBooleanValue(dataRow["InheritCacheBitmaps"]); + connectionInfo.Inheritance.Colors = MiscTools.GetBooleanValue(dataRow["InheritColors"]); + connectionInfo.Inheritance.Description = MiscTools.GetBooleanValue(dataRow["InheritDescription"]); + connectionInfo.Inheritance.DisableCursorBlinking = MiscTools.GetBooleanValue(dataRow["InheritDisableCursorBlinking"]); + connectionInfo.Inheritance.DisableCursorShadow = MiscTools.GetBooleanValue(dataRow["InheritDisableCursorShadow"]); + connectionInfo.Inheritance.DisableFullWindowDrag = MiscTools.GetBooleanValue(dataRow["InheritDisableFullWindowDrag"]); + connectionInfo.Inheritance.DisableMenuAnimations = MiscTools.GetBooleanValue(dataRow["InheritDisableMenuAnimations"]); + connectionInfo.Inheritance.DisplayThemes = MiscTools.GetBooleanValue(dataRow["InheritDisplayThemes"]); + connectionInfo.Inheritance.DisplayWallpaper = MiscTools.GetBooleanValue(dataRow["InheritDisplayWallpaper"]); + connectionInfo.Inheritance.Domain = MiscTools.GetBooleanValue(dataRow["InheritDomain"]); + connectionInfo.Inheritance.EnableDesktopComposition = MiscTools.GetBooleanValue(dataRow["InheritEnableDesktopComposition"]); + connectionInfo.Inheritance.EnableFontSmoothing = MiscTools.GetBooleanValue(dataRow["InheritEnableFontSmoothing"]); + connectionInfo.Inheritance.ExtApp = MiscTools.GetBooleanValue(dataRow["InheritExtApp"]); + connectionInfo.Inheritance.Icon = MiscTools.GetBooleanValue(dataRow["InheritIcon"]); + connectionInfo.Inheritance.LoadBalanceInfo = MiscTools.GetBooleanValue(dataRow["InheritLoadBalanceInfo"]); + connectionInfo.Inheritance.MacAddress = MiscTools.GetBooleanValue(dataRow["InheritMacAddress"]); + connectionInfo.Inheritance.OpeningCommand = MiscTools.GetBooleanValue(dataRow["InheritOpeningCommand"]); + connectionInfo.Inheritance.OpeningCommand = MiscTools.GetBooleanValue(dataRow["InheritOpeningCommand"]); + connectionInfo.Inheritance.Panel = MiscTools.GetBooleanValue(dataRow["InheritPanel"]); + connectionInfo.Inheritance.Password = MiscTools.GetBooleanValue(dataRow["InheritPassword"]); + connectionInfo.Inheritance.Port = MiscTools.GetBooleanValue(dataRow["InheritPort"]); + connectionInfo.Inheritance.PostExtApp = MiscTools.GetBooleanValue(dataRow["InheritPostExtApp"]); + connectionInfo.Inheritance.PreExtApp = MiscTools.GetBooleanValue(dataRow["InheritPreExtApp"]); + connectionInfo.Inheritance.Protocol = MiscTools.GetBooleanValue(dataRow["InheritProtocol"]); + connectionInfo.Inheritance.PuttySession = MiscTools.GetBooleanValue(dataRow["InheritPuttySession"]); + connectionInfo.Inheritance.RDGatewayDomain = MiscTools.GetBooleanValue(dataRow["InheritRDGatewayDomain"]); + connectionInfo.Inheritance.RDGatewayHostname = MiscTools.GetBooleanValue(dataRow["InheritRDGatewayHostname"]); + connectionInfo.Inheritance.RDGatewayPassword = MiscTools.GetBooleanValue(dataRow["InheritRDGatewayPassword"]); + connectionInfo.Inheritance.RDGatewayUsageMethod = MiscTools.GetBooleanValue(dataRow["InheritRDGatewayUsageMethod"]); + connectionInfo.Inheritance.RDGatewayUseConnectionCredentials = MiscTools.GetBooleanValue(dataRow["InheritRDGatewayUseConnectionCredentials"]); + connectionInfo.Inheritance.RDGatewayUsername = MiscTools.GetBooleanValue(dataRow["InheritRDGatewayUsername"]); + connectionInfo.Inheritance.RDPAlertIdleTimeout = MiscTools.GetBooleanValue(dataRow["InheritRDPAlertIdleTimeout"]); + connectionInfo.Inheritance.RDPAuthenticationLevel = MiscTools.GetBooleanValue(dataRow["InheritRDPAuthenticationLevel"]); + connectionInfo.Inheritance.RDPMinutesToIdleTimeout = MiscTools.GetBooleanValue(dataRow["InheritRDPMinutesToIdleTimeout"]); + connectionInfo.Inheritance.RdpVersion = MiscTools.GetBooleanValue(dataRow["InheritRdpVersion"]); + connectionInfo.Inheritance.RedirectAudioCapture = MiscTools.GetBooleanValue(dataRow["InheritRedirectAudioCapture"]); + connectionInfo.Inheritance.RedirectClipboard = MiscTools.GetBooleanValue(dataRow["InheritRedirectClipboard"]); + connectionInfo.Inheritance.RedirectDiskDrives = MiscTools.GetBooleanValue(dataRow["InheritRedirectDiskDrives"]); + connectionInfo.Inheritance.RedirectDiskDrivesCustom = MiscTools.GetBooleanValue(dataRow["InheritRedirectDiskDrivesCustom"]); + connectionInfo.Inheritance.RedirectKeys = MiscTools.GetBooleanValue(dataRow["InheritRedirectKeys"]); + connectionInfo.Inheritance.RedirectPorts = MiscTools.GetBooleanValue(dataRow["InheritRedirectPorts"]); + connectionInfo.Inheritance.RedirectPrinters = MiscTools.GetBooleanValue(dataRow["InheritRedirectPrinters"]); + connectionInfo.Inheritance.RedirectSmartCards = MiscTools.GetBooleanValue(dataRow["InheritRedirectSmartCards"]); + connectionInfo.Inheritance.RedirectSound = MiscTools.GetBooleanValue(dataRow["InheritRedirectSound"]); + connectionInfo.Inheritance.RenderingEngine = MiscTools.GetBooleanValue(dataRow["InheritRenderingEngine"]); + connectionInfo.Inheritance.Resolution = MiscTools.GetBooleanValue(dataRow["InheritResolution"]); + connectionInfo.Inheritance.SoundQuality = MiscTools.GetBooleanValue(dataRow["InheritSoundQuality"]); + connectionInfo.Inheritance.SSHOptions = MiscTools.GetBooleanValue(dataRow["InheritSSHOptions"]); + connectionInfo.Inheritance.SSHTunnelConnectionName = MiscTools.GetBooleanValue(dataRow["InheritSSHTunnelConnectionName"]); + connectionInfo.Inheritance.UseConsoleSession = MiscTools.GetBooleanValue(dataRow["InheritUseConsoleSession"]); + connectionInfo.Inheritance.UseCredSsp = MiscTools.GetBooleanValue(dataRow["InheritUseCredSsp"]); + connectionInfo.Inheritance.UseEnhancedMode = MiscTools.GetBooleanValue(dataRow["InheritUseEnhancedMode"]); + connectionInfo.Inheritance.UseRCG = MiscTools.GetBooleanValue(dataRow["InheritUseRCG"]); + connectionInfo.Inheritance.UseRestrictedAdmin = MiscTools.GetBooleanValue(dataRow["InheritUseRestrictedAdmin"]); + connectionInfo.Inheritance.UserField = MiscTools.GetBooleanValue(dataRow["InheritUserField"]); + connectionInfo.Inheritance.Username = MiscTools.GetBooleanValue(dataRow["InheritUsername"]); + connectionInfo.Inheritance.UseVmId = MiscTools.GetBooleanValue(dataRow["InheritUseVmId"]); + connectionInfo.Inheritance.VmId = MiscTools.GetBooleanValue(dataRow["InheritVmId"]); + connectionInfo.Inheritance.VNCAuthMode = MiscTools.GetBooleanValue(dataRow["InheritVNCAuthMode"]); + connectionInfo.Inheritance.VNCColors = MiscTools.GetBooleanValue(dataRow["InheritVNCColors"]); + connectionInfo.Inheritance.VNCCompression = MiscTools.GetBooleanValue(dataRow["InheritVNCCompression"]); + connectionInfo.Inheritance.VNCEncoding = MiscTools.GetBooleanValue(dataRow["InheritVNCEncoding"]); + connectionInfo.Inheritance.VNCProxyIP = MiscTools.GetBooleanValue(dataRow["InheritVNCProxyIP"]); + connectionInfo.Inheritance.VNCProxyPassword = MiscTools.GetBooleanValue(dataRow["InheritVNCProxyPassword"]); + connectionInfo.Inheritance.VNCProxyPort = MiscTools.GetBooleanValue(dataRow["InheritVNCProxyPort"]); + connectionInfo.Inheritance.VNCProxyType = MiscTools.GetBooleanValue(dataRow["InheritVNCProxyType"]); + connectionInfo.Inheritance.VNCProxyUsername = MiscTools.GetBooleanValue(dataRow["InheritVNCProxyUsername"]); + connectionInfo.Inheritance.VNCSmartSizeMode = MiscTools.GetBooleanValue(dataRow["InheritVNCSmartSizeMode"]); + connectionInfo.Inheritance.VNCViewOnly = MiscTools.GetBooleanValue(dataRow["InheritVNCViewOnly"]); + } + + private string DecryptValue(string cipherText) + { + try + { + return _cryptographyProvider.Decrypt(cipherText, _decryptionKey); + } + catch (EncryptionException) + { + // value may not be encrypted + return cipherText; + } + } + + private ConnectionTreeModel CreateNodeHierarchy(List connectionList, DataTable dataTable) + { + var connectionTreeModel = new ConnectionTreeModel(); + var rootNode = new RootNodeInfo(RootNodeType.Connection, "0") + { + PasswordString = _decryptionKey.ConvertToUnsecureString() + }; + connectionTreeModel.AddRootNode(rootNode); + + foreach (DataRow row in dataTable.Rows) + { + var id = (string)row["ConstantID"]; + var connectionInfo = connectionList.First(node => node.ConstantID == id); + var parentId = (string)row["ParentID"]; + if (parentId == "0" || connectionList.All(node => node.ConstantID != parentId)) + rootNode.AddChild(connectionInfo); + else + (connectionList.First(node => node.ConstantID == parentId) as ContainerInfo)?.AddChild(connectionInfo); + } + + return connectionTreeModel; + } + } } \ No newline at end of file diff --git a/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/DataTableSerializer.cs b/mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/DataTableSerializer.cs similarity index 60% rename from mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/DataTableSerializer.cs rename to mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/DataTableSerializer.cs index 82c0b019..27d4afbb 100644 --- a/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/DataTableSerializer.cs +++ b/mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/DataTableSerializer.cs @@ -1,793 +1,790 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Runtime.Versioning; -using System.Security; -using mRemoteNG.Connection; -using mRemoteNG.Container; -using mRemoteNG.Security; -using mRemoteNG.Tools; -using mRemoteNG.Tree; -using mRemoteNG.Tree.Root; - -namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql -{ - [SupportedOSPlatform("windows")] - public class DataTableSerializer : ISerializer - { - public readonly int DELETE = 0; - private readonly ICryptographyProvider _cryptographyProvider; - private readonly SecureString _encryptionKey; - private DataTable _dataTable; - private DataTable _sourceDataTable; - private Dictionary sourcePrimaryKeyDict = new Dictionary(); - private const string TableName = "tblCons"; - private readonly SaveFilter _saveFilter; - private int _currentNodeIndex; - - public Version Version { get; } = new Version(2, 8); - - public DataTableSerializer(SaveFilter saveFilter, - ICryptographyProvider cryptographyProvider, - SecureString encryptionKey) - { - _saveFilter = saveFilter.ThrowIfNull(nameof(saveFilter)); - _cryptographyProvider = cryptographyProvider.ThrowIfNull(nameof(cryptographyProvider)); - _encryptionKey = encryptionKey.ThrowIfNull(nameof(encryptionKey)); - } - - public void SetSourceDataTable(DataTable sourceDataTable) - { - _sourceDataTable = sourceDataTable; - } - - - public DataTable Serialize(ConnectionTreeModel connectionTreeModel) - { - try - { - _dataTable = BuildTable(); - _currentNodeIndex = 0; - var rootNode = connectionTreeModel.RootNodes.First(node => node is RootNodeInfo); - return Serialize(rootNode); - } - catch - { - return _dataTable; - } - } - - public DataTable Serialize(ConnectionInfo serializationTarget) - { - _dataTable = BuildTable(); - _currentNodeIndex = 0; - // Register add or update row - SerializeNodesRecursive(serializationTarget); - var entryToDelete = sourcePrimaryKeyDict.Keys.ToList(); - foreach( var entry in entryToDelete) - { - _dataTable.Rows.Find(entry).Delete(); - } - return _dataTable; - } - - private DataTable BuildTable() - { - DataTable dataTable; - if (_sourceDataTable != null) - { - dataTable = _sourceDataTable; - }else - { - dataTable = new DataTable(TableName); - - } - if (dataTable.Columns.Count == 0) CreateSchema(dataTable); - if (dataTable.PrimaryKey.Length == 0 ) SetPrimaryKey(dataTable); - foreach(DataRow row in dataTable.Rows) - { - sourcePrimaryKeyDict.Add((string)row["ConstantID"], DELETE); - } - return dataTable; - } - - private void CreateSchema(DataTable dataTable) - { - // Note: these columns must be defined in the same order that they exist in the DB - dataTable.Columns.Add("ID", typeof(int)); - dataTable.Columns[0].AutoIncrement = true; - dataTable.Columns.Add("ConstantID", typeof(string)); - dataTable.Columns.Add("PositionID", typeof(int)); - dataTable.Columns.Add("ParentID", typeof(string)); - dataTable.Columns.Add("LastChange", MiscTools.DBTimeStampType()); - dataTable.Columns.Add("Name", typeof(string)); - dataTable.Columns.Add("Type", typeof(string)); - dataTable.Columns.Add("Expanded", typeof(bool)); - dataTable.Columns.Add("Description", typeof(string)); - dataTable.Columns.Add("Icon", typeof(string)); - dataTable.Columns.Add("Panel", typeof(string)); - dataTable.Columns.Add("ExternalCredentialProvider", typeof(string)); - dataTable.Columns.Add("UserViaAPI", typeof(string)); - dataTable.Columns.Add("Username", typeof(string)); - dataTable.Columns.Add("Domain", typeof(string)); - dataTable.Columns.Add("Password", typeof(string)); - dataTable.Columns.Add("Hostname", typeof(string)); - dataTable.Columns.Add("ExternalAddressProvider", typeof(string)); - dataTable.Columns.Add("EC2Region", typeof(string)); - dataTable.Columns.Add("EC2InstanceId", typeof(string)); - dataTable.Columns.Add("Port", typeof(int)); - dataTable.Columns.Add("Protocol", typeof(string)); - dataTable.Columns.Add("SSHTunnelConnectionName", typeof(string)); - dataTable.Columns.Add("SSHOptions", typeof(string)); - dataTable.Columns.Add("PuttySession", typeof(string)); - dataTable.Columns.Add("ConnectToConsole", typeof(bool)); - dataTable.Columns.Add("UseCredSsp", typeof(bool)); - dataTable.Columns.Add("UseRestrictedAdmin", typeof(bool)); - dataTable.Columns.Add("UseRCG", typeof(bool)); - dataTable.Columns.Add("RenderingEngine", typeof(string)); - dataTable.Columns.Add("RDPAuthenticationLevel", typeof(string)); - dataTable.Columns.Add("Colors", typeof(string)); - dataTable.Columns.Add("Resolution", typeof(string)); - dataTable.Columns.Add("DisplayWallpaper", typeof(bool)); - dataTable.Columns.Add("DisplayThemes", typeof(bool)); - dataTable.Columns.Add("EnableFontSmoothing", typeof(bool)); - dataTable.Columns.Add("EnableDesktopComposition", typeof(bool)); - dataTable.Columns.Add("DisableFullWindowDrag", typeof(bool)); - dataTable.Columns.Add("DisableMenuAnimations", typeof(bool)); - dataTable.Columns.Add("DisableCursorShadow", typeof(bool)); - dataTable.Columns.Add("DisableCursorBlinking", typeof(bool)); - dataTable.Columns.Add("CacheBitmaps", typeof(bool)); - dataTable.Columns.Add("RedirectDiskDrives", typeof(bool)); - dataTable.Columns.Add("RedirectPorts", typeof(bool)); - dataTable.Columns.Add("RedirectPrinters", typeof(bool)); - dataTable.Columns.Add("RedirectClipboard", typeof(bool)); - dataTable.Columns.Add("RedirectSmartCards", typeof(bool)); - dataTable.Columns.Add("RedirectSound", typeof(string)); - dataTable.Columns.Add("RedirectAudioCapture", typeof(bool)); - dataTable.Columns.Add("RedirectKeys", typeof(bool)); - dataTable.Columns.Add("Connected", typeof(bool)); - dataTable.Columns.Add("OpeningCommand", typeof(string)); - dataTable.Columns.Add("PreExtApp", typeof(string)); - dataTable.Columns.Add("PostExtApp", typeof(string)); - dataTable.Columns.Add("MacAddress", typeof(string)); - dataTable.Columns.Add("UserField", typeof(string)); - dataTable.Columns.Add("ExtApp", typeof(string)); - dataTable.Columns.Add("VNCCompression", typeof(string)); - dataTable.Columns.Add("VNCEncoding", typeof(string)); - dataTable.Columns.Add("VNCAuthMode", typeof(string)); - dataTable.Columns.Add("VNCProxyType", typeof(string)); - dataTable.Columns.Add("VNCProxyIP", typeof(string)); - dataTable.Columns.Add("VNCProxyPort", typeof(int)); - dataTable.Columns.Add("VNCProxyUsername", typeof(string)); - dataTable.Columns.Add("VNCProxyPassword", typeof(string)); - dataTable.Columns.Add("VNCColors", typeof(string)); - dataTable.Columns.Add("VNCSmartSizeMode", typeof(string)); - dataTable.Columns.Add("VNCViewOnly", typeof(bool)); - dataTable.Columns.Add("RDGatewayUsageMethod", typeof(string)); - dataTable.Columns.Add("RDGatewayHostname", typeof(string)); - dataTable.Columns.Add("RDGatewayUseConnectionCredentials", typeof(string)); - dataTable.Columns.Add("RDGatewayUsername", typeof(string)); - dataTable.Columns.Add("RDGatewayPassword", typeof(string)); - dataTable.Columns.Add("RDGatewayDomain", typeof(string)); - dataTable.Columns.Add("RDGatewayExternalCredentialProvider", typeof(string)); - dataTable.Columns.Add("RDGatewayUserViaAPI", typeof(string)); - dataTable.Columns.Add("InheritCacheBitmaps", typeof(bool)); - dataTable.Columns.Add("InheritColors", typeof(bool)); - dataTable.Columns.Add("InheritDescription", typeof(bool)); - dataTable.Columns.Add("InheritDisplayThemes", typeof(bool)); - dataTable.Columns.Add("InheritDisplayWallpaper", typeof(bool)); - dataTable.Columns.Add("InheritEnableFontSmoothing", typeof(bool)); - dataTable.Columns.Add("InheritEnableDesktopComposition", typeof(bool)); - dataTable.Columns.Add("InheritDisableFullWindowDrag", typeof(bool)); - dataTable.Columns.Add("InheritDisableMenuAnimations", typeof(bool)); - dataTable.Columns.Add("InheritDisableCursorShadow", typeof(bool)); - dataTable.Columns.Add("InheritDisableCursorBlinking", typeof(bool)); - dataTable.Columns.Add("InheritDomain", typeof(bool)); - dataTable.Columns.Add("InheritIcon", typeof(bool)); - dataTable.Columns.Add("InheritPanel", typeof(bool)); - dataTable.Columns.Add("InheritPassword", typeof(bool)); - dataTable.Columns.Add("InheritPort", typeof(bool)); - dataTable.Columns.Add("InheritProtocol", typeof(bool)); - dataTable.Columns.Add("InheritExternalCredentialProvider", typeof(bool)); - dataTable.Columns.Add("InheritUserViaAPI", typeof(bool)); - dataTable.Columns.Add("InheritSSHTunnelConnectionName", typeof(bool)); - dataTable.Columns.Add("InheritSSHOptions", typeof(bool)); - dataTable.Columns.Add("InheritPuttySession", typeof(bool)); - dataTable.Columns.Add("InheritRedirectDiskDrives", typeof(bool)); - dataTable.Columns.Add("InheritRedirectKeys", typeof(bool)); - dataTable.Columns.Add("InheritRedirectPorts", typeof(bool)); - dataTable.Columns.Add("InheritRedirectPrinters", typeof(bool)); - dataTable.Columns.Add("InheritRedirectClipboard", typeof(bool)); - dataTable.Columns.Add("InheritRedirectSmartCards", typeof(bool)); - dataTable.Columns.Add("InheritRedirectSound", typeof(bool)); - dataTable.Columns.Add("InheritRedirectAudioCapture", typeof(bool)); - dataTable.Columns.Add("InheritResolution", typeof(bool)); - dataTable.Columns.Add("InheritUseConsoleSession", typeof(bool)); - dataTable.Columns.Add("InheritUseCredSsp", typeof(bool)); - dataTable.Columns.Add("InheritUseRestrictedAdmin", typeof(bool)); - dataTable.Columns.Add("InheritUseRCG", typeof(bool)); - dataTable.Columns.Add("InheritRenderingEngine", typeof(bool)); - dataTable.Columns.Add("InheritRDPAuthenticationLevel", typeof(bool)); - dataTable.Columns.Add("InheritUsername", typeof(bool)); - dataTable.Columns.Add("InheritOpeningCommand", typeof(bool)); - dataTable.Columns.Add("InheritPreExtApp", typeof(bool)); - dataTable.Columns.Add("InheritPostExtApp", typeof(bool)); - dataTable.Columns.Add("InheritMacAddress", typeof(bool)); - dataTable.Columns.Add("InheritUserField", typeof(bool)); - dataTable.Columns.Add("InheritExtApp", typeof(bool)); - dataTable.Columns.Add("InheritVNCCompression", typeof(bool)); - dataTable.Columns.Add("InheritVNCEncoding", typeof(bool)); - dataTable.Columns.Add("InheritVNCAuthMode", typeof(bool)); - dataTable.Columns.Add("InheritVNCProxyType", typeof(bool)); - dataTable.Columns.Add("InheritVNCProxyIP", typeof(bool)); - dataTable.Columns.Add("InheritVNCProxyPort", typeof(bool)); - dataTable.Columns.Add("InheritVNCProxyUsername", typeof(bool)); - dataTable.Columns.Add("InheritVNCProxyPassword", typeof(bool)); - dataTable.Columns.Add("InheritVNCColors", typeof(bool)); - dataTable.Columns.Add("InheritVNCSmartSizeMode", typeof(bool)); - dataTable.Columns.Add("InheritVNCViewOnly", typeof(bool)); - dataTable.Columns.Add("InheritRDGatewayUsageMethod", typeof(bool)); - dataTable.Columns.Add("InheritRDGatewayHostname", typeof(bool)); - dataTable.Columns.Add("InheritRDGatewayUseConnectionCredentials", typeof(bool)); - dataTable.Columns.Add("InheritRDGatewayUsername", typeof(bool)); - dataTable.Columns.Add("InheritRDGatewayPassword", typeof(bool)); - dataTable.Columns.Add("InheritRDGatewayDomain", typeof(bool)); - dataTable.Columns.Add("InheritRDGatewayExternalCredentialProvider", typeof(bool)); - dataTable.Columns.Add("InheritRDGatewayUserViaAPI", typeof(bool)); - dataTable.Columns.Add("LoadBalanceInfo", typeof(string)); - dataTable.Columns.Add("AutomaticResize", typeof(bool)); - dataTable.Columns.Add("InheritLoadBalanceInfo", typeof(bool)); - dataTable.Columns.Add("InheritAutomaticResize", typeof(bool)); - dataTable.Columns.Add("RDPMinutesToIdleTimeout", typeof(int)); - dataTable.Columns.Add("RDPAlertIdleTimeout", typeof(bool)); - dataTable.Columns.Add("SoundQuality", typeof(string)); - dataTable.Columns.Add("InheritRDPMinutesToIdleTimeout", typeof(bool)); - dataTable.Columns.Add("InheritRDPAlertIdleTimeout", typeof(bool)); - dataTable.Columns.Add("InheritSoundQuality", typeof(bool)); - dataTable.Columns.Add("VmId", typeof(string)); - dataTable.Columns.Add("UseVmId", typeof(bool)); - dataTable.Columns.Add("UseEnhancedMode", typeof(bool)); - dataTable.Columns.Add("InheritVmId", typeof(bool)); - dataTable.Columns.Add("InheritUseVmId", typeof(bool)); - dataTable.Columns.Add("InheritUseEnhancedMode", typeof(bool)); - dataTable.Columns.Add("RdpVersion", typeof(string)); - dataTable.Columns.Add("InheritRdpVersion", typeof(bool)); - dataTable.Columns.Add("EnhancedMode", typeof(bool)); - dataTable.Columns.Add("InheritEnhancedMode", typeof(bool)); - dataTable.Columns.Add("Favorite", typeof(bool)); - dataTable.Columns.Add("InheritFavorite", typeof(bool)); - dataTable.Columns.Add("ICAEncryptionStrength", typeof(string)); - dataTable.Columns.Add("InheritICAEncryptionStrength", typeof(bool)); - dataTable.Columns.Add("StartProgram", typeof(string)); - dataTable.Columns.Add("StartProgramWorkDir", typeof(string)); - } - - private void SetPrimaryKey(DataTable dataTable) - { - dataTable.PrimaryKey = new[] {dataTable.Columns["ConstantID"]}; - } - - private void SerializeNodesRecursive(ConnectionInfo connectionInfo) - { - if (!(connectionInfo is RootNodeInfo)) - SerializeConnectionInfo(connectionInfo); - var containerInfo = connectionInfo as ContainerInfo; - if (containerInfo == null) return; - foreach (var child in containerInfo.Children) - SerializeNodesRecursive(child); - } - - public bool isRowUpdated(ConnectionInfo connectionInfo, DataRow dataRow) - { - var isFieldNotChange = dataRow["Name"].Equals(connectionInfo.Name) && - dataRow["Type"].Equals(connectionInfo.GetTreeNodeType().ToString()) && - dataRow["ParentID"].Equals(connectionInfo.Parent?.ConstantID ?? "") && - dataRow["PositionID"].Equals(_currentNodeIndex) && - dataRow["Expanded"].Equals(false) && - dataRow["Description"].Equals(connectionInfo.Description) && - dataRow["Icon"].Equals(connectionInfo.Icon) && - dataRow["Panel"].Equals(connectionInfo.Panel) && - dataRow["Username"].Equals(_saveFilter.SaveUsername ? connectionInfo.Username : "") && - dataRow["Domain"].Equals(_saveFilter.SaveDomain ? connectionInfo.Domain : ""); - - isFieldNotChange = isFieldNotChange && dataRow["Hostname"].Equals(connectionInfo.Hostname); - isFieldNotChange = isFieldNotChange && dataRow["EC2Region"].Equals(connectionInfo.EC2Region); - isFieldNotChange = isFieldNotChange && dataRow["EC2InstanceId"].Equals(connectionInfo.EC2InstanceId); - isFieldNotChange = isFieldNotChange && dataRow["ExternalAddressProvider"].Equals(connectionInfo.ExternalAddressProvider); - isFieldNotChange = isFieldNotChange && dataRow["ExternalCredentialProvider"].Equals(connectionInfo.ExternalCredentialProvider); - isFieldNotChange = isFieldNotChange && dataRow["UserViaAPI"].Equals(connectionInfo.UserViaAPI); - isFieldNotChange = isFieldNotChange && dataRow["VmId"].Equals(connectionInfo.VmId); - isFieldNotChange = isFieldNotChange && dataRow["Protocol"].Equals(connectionInfo.Protocol.ToString()); - isFieldNotChange = isFieldNotChange && dataRow["PuttySession"].Equals(connectionInfo.PuttySession); - isFieldNotChange = isFieldNotChange && - dataRow["Port"].Equals(connectionInfo.Port); - isFieldNotChange = isFieldNotChange && - dataRow["ConnectToConsole"].Equals(connectionInfo.UseConsoleSession); - isFieldNotChange = isFieldNotChange && - dataRow["UseCredSsp"].Equals(connectionInfo.UseCredSsp); - isFieldNotChange = isFieldNotChange && - dataRow["UseRestrictedAdmin"].Equals(connectionInfo.UseRestrictedAdmin); - isFieldNotChange = isFieldNotChange && - dataRow["UseRCG"].Equals(connectionInfo.UseRCG); - isFieldNotChange = isFieldNotChange && - dataRow["UseVmId"].Equals(connectionInfo.UseVmId); - isFieldNotChange = isFieldNotChange && - dataRow["UseEnhancedMode"].Equals(connectionInfo.UseEnhancedMode); - isFieldNotChange = isFieldNotChange && - dataRow["RenderingEngine"].Equals(connectionInfo.RenderingEngine.ToString()); - isFieldNotChange = isFieldNotChange && - dataRow["RDPAuthenticationLevel"].Equals(connectionInfo.RDPAuthenticationLevel.ToString()); - isFieldNotChange = isFieldNotChange && - dataRow["RDPMinutesToIdleTimeout"].Equals(connectionInfo.RDPMinutesToIdleTimeout); - isFieldNotChange = isFieldNotChange && - dataRow["RDPAlertIdleTimeout"].Equals(connectionInfo.RDPAlertIdleTimeout); - isFieldNotChange = isFieldNotChange && - dataRow["LoadBalanceInfo"].Equals(connectionInfo.LoadBalanceInfo); - isFieldNotChange = isFieldNotChange && - dataRow["Colors"].Equals(connectionInfo.Colors.ToString()); - isFieldNotChange = isFieldNotChange && - dataRow["Resolution"].Equals(connectionInfo.Resolution.ToString()); - isFieldNotChange = isFieldNotChange && - dataRow["AutomaticResize"].Equals(connectionInfo.AutomaticResize); - isFieldNotChange = isFieldNotChange && - dataRow["DisplayWallpaper"].Equals(connectionInfo.DisplayWallpaper) && - dataRow["DisplayThemes"].Equals(connectionInfo.DisplayThemes) && - dataRow["EnableFontSmoothing"].Equals(connectionInfo.EnableFontSmoothing) && - dataRow["EnableDesktopComposition"].Equals(connectionInfo.EnableDesktopComposition) && - dataRow["DisableFullWindowDrag"].Equals(connectionInfo.DisableFullWindowDrag) && - dataRow["DisableMenuAnimations"].Equals(connectionInfo.DisableMenuAnimations) && - dataRow["DisableCursorShadow"].Equals(connectionInfo.DisableCursorShadow) && - dataRow["DisableCursorBlinking"].Equals(connectionInfo.DisableCursorBlinking) && - dataRow["CacheBitmaps"].Equals(connectionInfo.CacheBitmaps) && - dataRow["RedirectDiskDrives"].Equals(connectionInfo.RedirectDiskDrives) && - dataRow["RedirectPorts"].Equals(connectionInfo.RedirectPorts) && - dataRow["RedirectPrinters"].Equals(connectionInfo.RedirectPrinters) && - dataRow["RedirectClipboard"].Equals(connectionInfo.RedirectClipboard) && - dataRow["RedirectSmartCards"].Equals(connectionInfo.RedirectSmartCards) && - dataRow["RedirectSound"].Equals(connectionInfo.RedirectSound.ToString()) && - dataRow["SoundQuality"].Equals(connectionInfo.SoundQuality.ToString()) && - dataRow["RedirectAudioCapture"].Equals(connectionInfo.RedirectAudioCapture) && - dataRow["RedirectKeys"].Equals(connectionInfo.RedirectKeys) && - dataRow["StartProgram"].Equals(connectionInfo.RDPStartProgram) && - dataRow["StartProgramWorkDir"].Equals(connectionInfo.RDPStartProgramWorkDir); - - isFieldNotChange = isFieldNotChange && - dataRow["Connected"].Equals(false) && // TODO: this column can eventually be removed. we now save this property locally - dataRow["OpeningCommand"].Equals(connectionInfo.OpeningCommand) && - dataRow["PreExtApp"].Equals(connectionInfo.PreExtApp) && - dataRow["PostExtApp"].Equals(connectionInfo.PostExtApp) && - dataRow["MacAddress"].Equals(connectionInfo.MacAddress) && - dataRow["UserField"].Equals(connectionInfo.UserField) && - dataRow["ExtApp"].Equals(connectionInfo.ExtApp) && - dataRow["VNCCompression"].Equals(connectionInfo.VNCCompression.ToString()) && - dataRow["VNCEncoding"].Equals(connectionInfo.VNCEncoding.ToString()) && - dataRow["VNCAuthMode"].Equals(connectionInfo.VNCAuthMode.ToString()) && - dataRow["VNCProxyType"].Equals(connectionInfo.VNCProxyType.ToString()) && - dataRow["VNCProxyIP"].Equals(connectionInfo.VNCProxyIP) && - dataRow["VNCProxyPort"].Equals(connectionInfo.VNCProxyPort) && - dataRow["VNCProxyUsername"].Equals(connectionInfo.VNCProxyUsername) && - dataRow["VNCColors"].Equals(connectionInfo.VNCColors.ToString()) && - dataRow["VNCSmartSizeMode"].Equals(connectionInfo.VNCSmartSizeMode.ToString()) && - dataRow["VNCViewOnly"].Equals(connectionInfo.VNCViewOnly) && - dataRow["RDGatewayUsageMethod"].Equals(connectionInfo.RDGatewayUsageMethod.ToString()) && - dataRow["RDGatewayHostname"].Equals(connectionInfo.RDGatewayHostname) && - dataRow["RDGatewayUseConnectionCredentials"].Equals(connectionInfo.RDGatewayUseConnectionCredentials.ToString()) && - dataRow["RDGatewayExternalCredentialProvider"].Equals(connectionInfo.RDGatewayExternalCredentialProvider) && - dataRow["RDGatewayUsername"].Equals(connectionInfo.RDGatewayUsername) && - dataRow["RDGatewayDomain"].Equals(connectionInfo.RDGatewayDomain) && - dataRow["RDGatewayUserViaAPI"].Equals(connectionInfo.RDGatewayUserViaAPI) && - dataRow["RdpVersion"].Equals(connectionInfo.RdpVersion.ToString()); - - var isInheritanceFieldNotChange = false; - if (_saveFilter.SaveInheritance) - { - isInheritanceFieldNotChange = (dataRow["InheritCacheBitmaps"].Equals(connectionInfo.Inheritance.CacheBitmaps) && - dataRow["InheritColors"].Equals(connectionInfo.Inheritance.Colors) && - dataRow["InheritDescription"].Equals(connectionInfo.Inheritance.Description) && - dataRow["InheritDisplayThemes"].Equals(connectionInfo.Inheritance.DisplayThemes) && - dataRow["InheritDisplayWallpaper"].Equals(connectionInfo.Inheritance.DisplayWallpaper) && - dataRow["InheritEnableFontSmoothing"].Equals(connectionInfo.Inheritance.EnableFontSmoothing) && - dataRow["InheritEnableDesktopComposition"].Equals(connectionInfo.Inheritance.EnableDesktopComposition) && - dataRow["InheritDisableFullWindowDrag"].Equals(connectionInfo.Inheritance.DisableFullWindowDrag) && - dataRow["InheritDisableMenuAnimations"].Equals(connectionInfo.Inheritance.DisableMenuAnimations) && - dataRow["InheritDisableCursorShadow"].Equals(connectionInfo.Inheritance.DisableCursorShadow) && - dataRow["InheritDisableCursorBlinking"].Equals(connectionInfo.Inheritance.DisableCursorBlinking) && - dataRow["InheritDomain"].Equals(connectionInfo.Inheritance.Domain) && - dataRow["InheritIcon"].Equals(connectionInfo.Inheritance.Icon) && - dataRow["InheritPanel"].Equals(connectionInfo.Inheritance.Panel) && - dataRow["InheritPassword"].Equals(connectionInfo.Inheritance.Password) && - dataRow["InheritPort"].Equals(connectionInfo.Inheritance.Port) && - dataRow["InheritProtocol"].Equals(connectionInfo.Inheritance.Protocol) && - dataRow["InheritExternalCredentialProvider"].Equals(connectionInfo.Inheritance.ExternalCredentialProvider) && - dataRow["InheritUserViaAPI"].Equals(connectionInfo.Inheritance.UserViaAPI) && - dataRow["InheritPuttySession"].Equals(connectionInfo.Inheritance.PuttySession) && - dataRow["InheritRedirectDiskDrives"].Equals(connectionInfo.Inheritance.RedirectDiskDrives) && - dataRow["InheritRedirectKeys"].Equals(connectionInfo.Inheritance.RedirectKeys) && - dataRow["InheritRedirectPorts"].Equals(connectionInfo.Inheritance.RedirectPorts) && - dataRow["InheritRedirectPrinters"].Equals(connectionInfo.Inheritance.RedirectPrinters) && - dataRow["InheritRedirectClipboard"].Equals(connectionInfo.Inheritance.RedirectClipboard) && - dataRow["InheritRedirectSmartCards"].Equals(connectionInfo.Inheritance.RedirectSmartCards) && - dataRow["InheritRedirectSound"].Equals(connectionInfo.Inheritance.RedirectSound) && - dataRow["InheritSoundQuality"].Equals(connectionInfo.Inheritance.SoundQuality) && - dataRow["InheritRedirectAudioCapture"].Equals(connectionInfo.Inheritance.RedirectAudioCapture) && - dataRow["InheritResolution"].Equals(connectionInfo.Inheritance.Resolution) && - dataRow["InheritAutomaticResize"].Equals(connectionInfo.Inheritance.AutomaticResize) && - dataRow["InheritUseConsoleSession"].Equals(connectionInfo.Inheritance.UseConsoleSession) && - dataRow["InheritUseCredSsp"].Equals(connectionInfo.Inheritance.UseCredSsp) && - dataRow["InheritUseRestrictedAdmin"].Equals(connectionInfo.Inheritance.UseRestrictedAdmin) && - dataRow["InheritUseRCG"].Equals(connectionInfo.Inheritance.UseRCG) && - dataRow["InheritRenderingEngine"].Equals(connectionInfo.Inheritance.RenderingEngine) && - dataRow["InheritUsername"].Equals(connectionInfo.Inheritance.Username) && - dataRow["InheritVmId"].Equals(connectionInfo.Inheritance.VmId) && - dataRow["InheritUseVmId"].Equals(connectionInfo.Inheritance.UseVmId) && - dataRow["InheritUseEnhancedMode"].Equals(connectionInfo.Inheritance.UseEnhancedMode) && - dataRow["InheritRDPAuthenticationLevel"].Equals(connectionInfo.Inheritance.RDPAuthenticationLevel) && - dataRow["InheritRDPMinutesToIdleTimeout"].Equals(connectionInfo.Inheritance.RDPMinutesToIdleTimeout) && - dataRow["InheritRDPAlertIdleTimeout"].Equals(connectionInfo.Inheritance.RDPAlertIdleTimeout) && - dataRow["InheritLoadBalanceInfo"].Equals(connectionInfo.Inheritance.LoadBalanceInfo) && - dataRow["InheritOpeningCommand"].Equals(connectionInfo.Inheritance.OpeningCommand) && - dataRow["InheritPreExtApp"].Equals(connectionInfo.Inheritance.PreExtApp) && - dataRow["InheritPostExtApp"].Equals(connectionInfo.Inheritance.PostExtApp) && - dataRow["InheritMacAddress"].Equals(connectionInfo.Inheritance.MacAddress) && - dataRow["InheritUserField"].Equals(connectionInfo.Inheritance.UserField) && - dataRow["InheritExtApp"].Equals(connectionInfo.Inheritance.ExtApp) && - dataRow["InheritVNCCompression"].Equals(connectionInfo.Inheritance.VNCCompression) && - dataRow["InheritVNCEncoding"].Equals(connectionInfo.Inheritance.VNCEncoding) && - dataRow["InheritVNCAuthMode"].Equals(connectionInfo.Inheritance.VNCAuthMode) && - dataRow["InheritVNCProxyType"].Equals(connectionInfo.Inheritance.VNCProxyType) && - dataRow["InheritVNCProxyIP"].Equals(connectionInfo.Inheritance.VNCProxyIP) && - dataRow["InheritVNCProxyPort"].Equals(connectionInfo.Inheritance.VNCProxyPort) && - dataRow["InheritVNCProxyUsername"].Equals(connectionInfo.Inheritance.VNCProxyUsername) && - dataRow["InheritVNCProxyPassword"].Equals(connectionInfo.Inheritance.VNCProxyPassword) && - dataRow["InheritVNCColors"].Equals(connectionInfo.Inheritance.VNCColors) && - dataRow["InheritVNCSmartSizeMode"].Equals(connectionInfo.Inheritance.VNCSmartSizeMode) && - dataRow["InheritVNCViewOnly"].Equals(connectionInfo.Inheritance.VNCViewOnly) && - dataRow["InheritRDGatewayUsageMethod"].Equals(connectionInfo.Inheritance.RDGatewayUsageMethod) && - dataRow["InheritRDGatewayHostname"].Equals(connectionInfo.Inheritance.RDGatewayHostname) && - dataRow["InheritRDGatewayUseConnectionCredentials"].Equals(connectionInfo.Inheritance.RDGatewayUseConnectionCredentials) && - dataRow["InheritRDGatewayExternalCredentialProvider"].Equals(connectionInfo.Inheritance.RDGatewayExternalCredentialProvider) && - dataRow["InheritRDGatewayUsername"].Equals(connectionInfo.Inheritance.RDGatewayUsername) && - dataRow["InheritRDGatewayPassword"].Equals(connectionInfo.Inheritance.RDGatewayPassword) && - dataRow["InheritRDGatewayDomain"].Equals(connectionInfo.Inheritance.RDGatewayDomain) && - dataRow["InheritRDGatewayUserViaAPI"].Equals(connectionInfo.Inheritance.RDGatewayUserViaAPI) && - dataRow["InheritRdpVersion"].Equals(connectionInfo.Inheritance.RdpVersion)); - } - else - { - isInheritanceFieldNotChange = (dataRow["InheritCacheBitmaps"].Equals(false) && - dataRow["InheritColors"].Equals(false) && - dataRow["InheritDescription"].Equals(false) && - dataRow["InheritDisplayThemes"].Equals(false) && - dataRow["InheritDisplayWallpaper"].Equals(false) && - dataRow["InheritEnableFontSmoothing"].Equals(false) && - dataRow["InheritEnableDesktopComposition"].Equals(false) && - dataRow["InheritDisableFullWindowDrag"].Equals(false) && - dataRow["InheritDisableMenuAnimations"].Equals(false) && - dataRow["InheritDisableCursorShadow"].Equals(false) && - dataRow["InheritDisableCursorBlinking"].Equals(false) && - dataRow["InheritDomain"].Equals(false) && - dataRow["InheritIcon"].Equals(false) && - dataRow["InheritPanel"].Equals(false) && - dataRow["InheritPassword"].Equals(false) && - dataRow["InheritPort"].Equals(false) && - dataRow["InheritProtocol"].Equals(false) && - dataRow["InheritExternalCredentialProvider"].Equals(false) && - dataRow["InheritUserViaAPI"].Equals(false) && - dataRow["InheritPuttySession"].Equals(false) && - dataRow["InheritRedirectDiskDrives"].Equals(false) && - dataRow["InheritRedirectKeys"].Equals(false) && - dataRow["InheritRedirectPorts"].Equals(false) && - dataRow["InheritRedirectPrinters"].Equals(false) && - dataRow["InheritRedirectClipboard"].Equals(false) && - dataRow["InheritRedirectSmartCards"].Equals(false) && - dataRow["InheritRedirectSound"].Equals(false) && - dataRow["InheritSoundQuality"].Equals(false) && - dataRow["InheritRedirectAudioCapture"].Equals(false) && - dataRow["InheritResolution"].Equals(false) && - dataRow["InheritAutomaticResize"].Equals(false) && - dataRow["InheritUseConsoleSession"].Equals(false) && - dataRow["InheritUseCredSsp"].Equals(false) && - dataRow["InheritUseRestrictedAdmin"].Equals(false) && - dataRow["InheritUseRCG"].Equals(false) && - dataRow["InheritRenderingEngine"].Equals(false) && - dataRow["InheritUsername"].Equals(false) && - dataRow["InheritRDPAuthenticationLevel"].Equals(false) && - dataRow["InheritRDPMinutesToIdleTimeout"].Equals(false) && - dataRow["InheritRDPAlertIdleTimeout"].Equals(false) && - dataRow["InheritLoadBalanceInfo"].Equals(false) && - dataRow["InheritOpeningCommand"].Equals(false) && - dataRow["InheritPreExtApp"].Equals(false) && - dataRow["InheritPostExtApp"].Equals(false) && - dataRow["InheritMacAddress"].Equals(false) && - dataRow["InheritUserField"].Equals(false) && - dataRow["InheritExtApp"].Equals(false) && - dataRow["InheritVNCCompression"].Equals(false) && - dataRow["InheritVNCEncoding"].Equals(false) && - dataRow["InheritVNCAuthMode"].Equals(false) && - dataRow["InheritVNCProxyType"].Equals(false) && - dataRow["InheritVNCProxyIP"].Equals(false) && - dataRow["InheritVNCProxyPort"].Equals(false) && - dataRow["InheritVNCProxyUsername"].Equals(false) && - dataRow["InheritVNCProxyPassword"].Equals(false) && - dataRow["InheritVNCColors"].Equals(false) && - dataRow["InheritVNCSmartSizeMode"].Equals(false) && - dataRow["InheritVNCViewOnly"].Equals(false) && - dataRow["InheritRDGatewayUsageMethod"].Equals(false) && - dataRow["InheritRDGatewayHostname"].Equals(false) && - dataRow["InheritRDGatewayUseConnectionCredentials"].Equals(false) && - dataRow["InheritRDGatewayExternalCredentialProvider"].Equals(connectionInfo.Inheritance.RDGatewayExternalCredentialProvider) && - dataRow["InheritRDGatewayUsername"].Equals(false) && - dataRow["InheritRDGatewayPassword"].Equals(false) && - dataRow["InheritRDGatewayDomain"].Equals(false) && - dataRow["InheritRDGatewayUserViaAPI"].Equals(false) && - dataRow["InheritRdpVersion"].Equals(false)); - } - - var pwd = dataRow["Password"].Equals(_saveFilter.SavePassword ? _cryptographyProvider.Encrypt(connectionInfo.Password, _encryptionKey) : "") && - dataRow["VNCProxyPassword"].Equals(_cryptographyProvider.Encrypt(connectionInfo.VNCProxyPassword, _encryptionKey)) && - dataRow["RDGatewayPassword"].Equals(_cryptographyProvider.Encrypt(connectionInfo.RDGatewayPassword, _encryptionKey)); - return !(pwd && isFieldNotChange && isInheritanceFieldNotChange); - } - - private void SerializeConnectionInfo(ConnectionInfo connectionInfo) - { - _currentNodeIndex++; - var isNewRow = false; - DataRow dataRow = _dataTable.Rows.Find(connectionInfo.ConstantID); - if (dataRow == null) - { - dataRow = _dataTable.NewRow(); - dataRow["ConstantID"] = connectionInfo.ConstantID; - isNewRow = true; - } - else - { - sourcePrimaryKeyDict.Remove(connectionInfo.ConstantID); - } - var tmp = isRowUpdated(connectionInfo, dataRow); - if (!tmp){ - return; - } - dataRow["Name"] = connectionInfo.Name; - dataRow["Type"] = connectionInfo.GetTreeNodeType().ToString(); - dataRow["ParentID"] = connectionInfo.Parent?.ConstantID ?? ""; - dataRow["PositionID"] = _currentNodeIndex; - dataRow["LastChange"] = MiscTools.DBTimeStampNow(); - dataRow["Expanded"] = - false; // TODO: this column can eventually be removed. we now save this property locally - dataRow["Description"] = connectionInfo.Description; - dataRow["Icon"] = connectionInfo.Icon; - dataRow["Panel"] = connectionInfo.Panel; - dataRow["Username"] = _saveFilter.SaveUsername ? connectionInfo.Username : ""; - dataRow["Domain"] = _saveFilter.SaveDomain ? connectionInfo.Domain : ""; - dataRow["Password"] = _saveFilter.SavePassword - ? _cryptographyProvider.Encrypt(connectionInfo.Password, _encryptionKey) - : ""; - dataRow["Hostname"] = connectionInfo.Hostname; - dataRow["VmId"] = connectionInfo.VmId; - dataRow["Protocol"] = connectionInfo.Protocol; - dataRow["SSHTunnelConnectionName"] = connectionInfo.SSHTunnelConnectionName; - dataRow["OpeningCommand"] = connectionInfo.OpeningCommand; - dataRow["SSHOptions"] = connectionInfo.SSHOptions; - dataRow["PuttySession"] = connectionInfo.PuttySession; - dataRow["Port"] = connectionInfo.Port; - dataRow["ConnectToConsole"] = connectionInfo.UseConsoleSession; - dataRow["UseCredSsp"] = connectionInfo.UseCredSsp; - dataRow["UseRestrictedAdmin"] = connectionInfo.UseRestrictedAdmin; - dataRow["UseRCG"] = connectionInfo.UseRCG; - dataRow["UseVmId"] = connectionInfo.UseVmId; - dataRow["UseEnhancedMode"] = connectionInfo.UseEnhancedMode; - dataRow["RenderingEngine"] = connectionInfo.RenderingEngine; - dataRow["RDPAuthenticationLevel"] = connectionInfo.RDPAuthenticationLevel; - dataRow["RDPMinutesToIdleTimeout"] = connectionInfo.RDPMinutesToIdleTimeout; - dataRow["RDPAlertIdleTimeout"] = connectionInfo.RDPAlertIdleTimeout; - dataRow["LoadBalanceInfo"] = connectionInfo.LoadBalanceInfo; - dataRow["Colors"] = connectionInfo.Colors; - dataRow["Resolution"] = connectionInfo.Resolution; - dataRow["AutomaticResize"] = connectionInfo.AutomaticResize; - dataRow["DisplayWallpaper"] = connectionInfo.DisplayWallpaper; - dataRow["DisplayThemes"] = connectionInfo.DisplayThemes; - dataRow["EnableFontSmoothing"] = connectionInfo.EnableFontSmoothing; - dataRow["EnableDesktopComposition"] = connectionInfo.EnableDesktopComposition; - dataRow["DisableFullWindowDrag"] = connectionInfo.DisableFullWindowDrag; - dataRow["DisableMenuAnimations"] = connectionInfo.DisableMenuAnimations; - dataRow["DisableCursorShadow"] = connectionInfo.DisableCursorShadow; - dataRow["DisableCursorBlinking"] = connectionInfo.DisableCursorBlinking; - dataRow["CacheBitmaps"] = connectionInfo.CacheBitmaps; - dataRow["RedirectDiskDrives"] = connectionInfo.RedirectDiskDrives; - dataRow["RedirectPorts"] = connectionInfo.RedirectPorts; - dataRow["RedirectPrinters"] = connectionInfo.RedirectPrinters; - dataRow["RedirectClipboard"] = connectionInfo.RedirectClipboard; - dataRow["RedirectSmartCards"] = connectionInfo.RedirectSmartCards; - dataRow["RedirectSound"] = connectionInfo.RedirectSound; - dataRow["SoundQuality"] = connectionInfo.SoundQuality; - dataRow["RedirectAudioCapture"] = connectionInfo.RedirectAudioCapture; - dataRow["RedirectKeys"] = connectionInfo.RedirectKeys; - dataRow["Connected"] = false; // TODO: this column can eventually be removed. we now save this property locally - dataRow["OpeningCommand"] = connectionInfo.OpeningCommand; - dataRow["PreExtApp"] = connectionInfo.PreExtApp; - dataRow["PostExtApp"] = connectionInfo.PostExtApp; - dataRow["MacAddress"] = connectionInfo.MacAddress; - dataRow["UserField"] = connectionInfo.UserField; - dataRow["ExtApp"] = connectionInfo.ExtApp; - dataRow["VNCCompression"] = connectionInfo.VNCCompression; - dataRow["VNCEncoding"] = connectionInfo.VNCEncoding; - dataRow["VNCAuthMode"] = connectionInfo.VNCAuthMode; - dataRow["VNCProxyType"] = connectionInfo.VNCProxyType; - dataRow["VNCProxyIP"] = connectionInfo.VNCProxyIP; - dataRow["VNCProxyPort"] = connectionInfo.VNCProxyPort; - dataRow["VNCProxyUsername"] = connectionInfo.VNCProxyUsername; - dataRow["VNCProxyPassword"] = - _cryptographyProvider.Encrypt(connectionInfo.VNCProxyPassword, _encryptionKey); - dataRow["VNCColors"] = connectionInfo.VNCColors; - dataRow["VNCSmartSizeMode"] = connectionInfo.VNCSmartSizeMode; - dataRow["VNCViewOnly"] = connectionInfo.VNCViewOnly; - dataRow["RDGatewayUsageMethod"] = connectionInfo.RDGatewayUsageMethod; - dataRow["RDGatewayHostname"] = connectionInfo.RDGatewayHostname; - dataRow["RDGatewayUseConnectionCredentials"] = connectionInfo.RDGatewayUseConnectionCredentials; - dataRow["RDGatewayUsername"] = connectionInfo.RDGatewayUsername; - dataRow["RDGatewayPassword"] = _cryptographyProvider.Encrypt(connectionInfo.RDGatewayPassword, _encryptionKey); - dataRow["RDGatewayDomain"] = connectionInfo.RDGatewayDomain; - dataRow["RdpVersion"] = connectionInfo.RdpVersion; - dataRow["Favorite"] = connectionInfo.Favorite; - dataRow["ICAEncryptionStrength"] = string.Empty; - dataRow["StartProgram"] = connectionInfo.RDPStartProgram; - dataRow["StartProgramWorkDir"] = connectionInfo.RDPStartProgramWorkDir; - - if (_saveFilter.SaveInheritance) - { - dataRow["InheritCacheBitmaps"] = connectionInfo.Inheritance.CacheBitmaps; - dataRow["InheritColors"] = connectionInfo.Inheritance.Colors; - dataRow["InheritDescription"] = connectionInfo.Inheritance.Description; - dataRow["InheritDisplayThemes"] = connectionInfo.Inheritance.DisplayThemes; - dataRow["InheritDisplayWallpaper"] = connectionInfo.Inheritance.DisplayWallpaper; - dataRow["InheritEnableFontSmoothing"] = connectionInfo.Inheritance.EnableFontSmoothing; - dataRow["InheritEnableDesktopComposition"] = connectionInfo.Inheritance.EnableDesktopComposition; - dataRow["InheritDisableFullWindowDrag"] = connectionInfo.Inheritance.DisableFullWindowDrag; - dataRow["InheritDisableMenuAnimations"] = connectionInfo.Inheritance.DisableMenuAnimations; - dataRow["InheritDisableCursorShadow"] = connectionInfo.Inheritance.DisableCursorShadow; - dataRow["InheritDisableCursorBlinking"] = connectionInfo.Inheritance.DisableCursorBlinking; - dataRow["InheritDomain"] = connectionInfo.Inheritance.Domain; - dataRow["InheritIcon"] = connectionInfo.Inheritance.Icon; - dataRow["InheritPanel"] = connectionInfo.Inheritance.Panel; - dataRow["InheritPassword"] = connectionInfo.Inheritance.Password; - dataRow["InheritPort"] = connectionInfo.Inheritance.Port; - dataRow["InheritProtocol"] = connectionInfo.Inheritance.Protocol; - dataRow["InheritExternalCredentialProvider"] = connectionInfo.Inheritance.ExternalCredentialProvider; - dataRow["InheritUserViaAPI"] = connectionInfo.Inheritance.UserViaAPI; - dataRow["InheritSSHTunnelConnectionName"] = connectionInfo.Inheritance.SSHTunnelConnectionName; - dataRow["InheritOpeningCommand"] = connectionInfo.Inheritance.OpeningCommand; - dataRow["InheritSSHOptions"] = connectionInfo.Inheritance.SSHOptions; - dataRow["InheritPuttySession"] = connectionInfo.Inheritance.PuttySession; - dataRow["InheritRedirectDiskDrives"] = connectionInfo.Inheritance.RedirectDiskDrives; - dataRow["InheritRedirectKeys"] = connectionInfo.Inheritance.RedirectKeys; - dataRow["InheritRedirectPorts"] = connectionInfo.Inheritance.RedirectPorts; - dataRow["InheritRedirectPrinters"] = connectionInfo.Inheritance.RedirectPrinters; - dataRow["InheritRedirectClipboard"] = connectionInfo.Inheritance.RedirectClipboard; - dataRow["InheritRedirectSmartCards"] = connectionInfo.Inheritance.RedirectSmartCards; - dataRow["InheritRedirectSound"] = connectionInfo.Inheritance.RedirectSound; - dataRow["InheritSoundQuality"] = connectionInfo.Inheritance.SoundQuality; - dataRow["InheritRedirectAudioCapture"] = connectionInfo.Inheritance.RedirectAudioCapture; - dataRow["InheritResolution"] = connectionInfo.Inheritance.Resolution; - dataRow["InheritAutomaticResize"] = connectionInfo.Inheritance.AutomaticResize; - dataRow["InheritUseConsoleSession"] = connectionInfo.Inheritance.UseConsoleSession; - dataRow["InheritUseCredSsp"] = connectionInfo.Inheritance.UseCredSsp; - dataRow["InheritUseRestrictedAdmin"] = connectionInfo.Inheritance.UseRestrictedAdmin; - dataRow["InheritUseRCG"] = connectionInfo.Inheritance.UseRCG; - dataRow["InheritRenderingEngine"] = connectionInfo.Inheritance.RenderingEngine; - dataRow["InheritUsername"] = connectionInfo.Inheritance.Username; - dataRow["InheritVmId"] = connectionInfo.Inheritance.VmId; - dataRow["InheritUseVmId"] = connectionInfo.Inheritance.UseVmId; - dataRow["InheritUseEnhancedMode"] = connectionInfo.Inheritance.UseEnhancedMode; - dataRow["InheritRDPAuthenticationLevel"] = connectionInfo.Inheritance.RDPAuthenticationLevel; - dataRow["InheritRDPMinutesToIdleTimeout"] = connectionInfo.Inheritance.RDPMinutesToIdleTimeout; - dataRow["InheritRDPAlertIdleTimeout"] = connectionInfo.Inheritance.RDPAlertIdleTimeout; - dataRow["InheritLoadBalanceInfo"] = connectionInfo.Inheritance.LoadBalanceInfo; - dataRow["InheritOpeningCommand"] = connectionInfo.Inheritance.OpeningCommand; - dataRow["InheritPreExtApp"] = connectionInfo.Inheritance.PreExtApp; - dataRow["InheritPostExtApp"] = connectionInfo.Inheritance.PostExtApp; - dataRow["InheritMacAddress"] = connectionInfo.Inheritance.MacAddress; - dataRow["InheritUserField"] = connectionInfo.Inheritance.UserField; - dataRow["InheritExtApp"] = connectionInfo.Inheritance.ExtApp; - dataRow["InheritVNCCompression"] = connectionInfo.Inheritance.VNCCompression; - dataRow["InheritVNCEncoding"] = connectionInfo.Inheritance.VNCEncoding; - dataRow["InheritVNCAuthMode"] = connectionInfo.Inheritance.VNCAuthMode; - dataRow["InheritVNCProxyType"] = connectionInfo.Inheritance.VNCProxyType; - dataRow["InheritVNCProxyIP"] = connectionInfo.Inheritance.VNCProxyIP; - dataRow["InheritVNCProxyPort"] = connectionInfo.Inheritance.VNCProxyPort; - dataRow["InheritVNCProxyUsername"] = connectionInfo.Inheritance.VNCProxyUsername; - dataRow["InheritVNCProxyPassword"] = connectionInfo.Inheritance.VNCProxyPassword; - dataRow["InheritVNCColors"] = connectionInfo.Inheritance.VNCColors; - dataRow["InheritVNCSmartSizeMode"] = connectionInfo.Inheritance.VNCSmartSizeMode; - dataRow["InheritVNCViewOnly"] = connectionInfo.Inheritance.VNCViewOnly; - dataRow["InheritRDGatewayUsageMethod"] = connectionInfo.Inheritance.RDGatewayUsageMethod; - dataRow["InheritRDGatewayHostname"] = connectionInfo.Inheritance.RDGatewayHostname; - dataRow["InheritRDGatewayUseConnectionCredentials"] = connectionInfo.Inheritance.RDGatewayUseConnectionCredentials; - dataRow["InheritRDGatewayExternalCredentialProvider"] = connectionInfo.Inheritance.RDGatewayExternalCredentialProvider; - dataRow["InheritRDGatewayUsername"] = connectionInfo.Inheritance.RDGatewayUsername; - dataRow["InheritRDGatewayPassword"] = connectionInfo.Inheritance.RDGatewayPassword; - dataRow["InheritRDGatewayDomain"] = connectionInfo.Inheritance.RDGatewayDomain; - dataRow["InheritRDGatewayUserViaAPI"] = connectionInfo.Inheritance.RDGatewayUserViaAPI; - dataRow["InheritRdpVersion"] = connectionInfo.Inheritance.RdpVersion; - dataRow["InheritFavorite"] = connectionInfo.Inheritance.Favorite; - dataRow["InheritICAEncryptionStrength"] = false; - } - else - { - dataRow["InheritCacheBitmaps"] = false; - dataRow["InheritColors"] = false; - dataRow["InheritDescription"] = false; - dataRow["InheritDisplayThemes"] = false; - dataRow["InheritDisplayWallpaper"] = false; - dataRow["InheritEnableFontSmoothing"] = false; - dataRow["InheritEnableDesktopComposition"] = false; - dataRow["InheritDisableFullWindowDrag"] = false; - dataRow["InheritDisableMenuAnimations"] = false; - dataRow["InheritDisableCursorShadow"] = false; - dataRow["InheritDisableCursorBlinking"] = false; - dataRow["InheritDomain"] = false; - dataRow["InheritIcon"] = false; - dataRow["InheritPanel"] = false; - dataRow["InheritPassword"] = false; - dataRow["InheritPort"] = false; - dataRow["InheritProtocol"] = false; - dataRow["InheritExternalCredentialProvider"] = false; - dataRow["InheritUserViaAPI"] = false; - dataRow["InheritSSHTunnelConnectionName"] = false; - dataRow["InheritSSHOptions"] = false; - dataRow["InheritPuttySession"] = false; - dataRow["InheritRedirectDiskDrives"] = false; - dataRow["InheritRedirectKeys"] = false; - dataRow["InheritRedirectPorts"] = false; - dataRow["InheritRedirectPrinters"] = false; - dataRow["InheritRedirectClipboard"] = false; - dataRow["InheritRedirectSmartCards"] = false; - dataRow["InheritRedirectSound"] = false; - dataRow["InheritSoundQuality"] = false; - dataRow["InheritRedirectAudioCapture"] = false; - dataRow["InheritResolution"] = false; - dataRow["InheritAutomaticResize"] = false; - dataRow["InheritUseConsoleSession"] = false; - dataRow["InheritUseCredSsp"] = false; - dataRow["InheritUseRestrictedAdmin"] = false; - dataRow["InheritUseRCG"] = false; - dataRow["InheritRenderingEngine"] = false; - dataRow["InheritUsername"] = false; - dataRow["InheritRDPAuthenticationLevel"] = false; - dataRow["InheritRDPMinutesToIdleTimeout"] = false; - dataRow["InheritRDPAlertIdleTimeout"] = false; - dataRow["InheritLoadBalanceInfo"] = false; - dataRow["InheritOpeningCommand"] = false; - dataRow["InheritPreExtApp"] = false; - dataRow["InheritPostExtApp"] = false; - dataRow["InheritMacAddress"] = false; - dataRow["InheritUserField"] = false; - dataRow["InheritExtApp"] = false; - dataRow["InheritVNCCompression"] = false; - dataRow["InheritVNCEncoding"] = false; - dataRow["InheritVNCAuthMode"] = false; - dataRow["InheritVNCProxyType"] = false; - dataRow["InheritVNCProxyIP"] = false; - dataRow["InheritVNCProxyPort"] = false; - dataRow["InheritVNCProxyUsername"] = false; - dataRow["InheritVNCProxyPassword"] = false; - dataRow["InheritVNCColors"] = false; - dataRow["InheritVNCSmartSizeMode"] = false; - dataRow["InheritVNCViewOnly"] = false; - dataRow["InheritRDGatewayUsageMethod"] = false; - dataRow["InheritRDGatewayHostname"] = false; - dataRow["InheritRDGatewayUseConnectionCredentials"] = false; - dataRow["InheritRDGatewayExternalCredentialProvider"] = false; - dataRow["InheritRDGatewayUsername"] = false; - dataRow["InheritRDGatewayPassword"] = false; - dataRow["InheritRDGatewayDomain"] = false; - dataRow["InheritRDGatewayUserViaAPI"] = false; - dataRow["InheritRdpVersion"] = false; - dataRow["InheritFavorite"] = false; - dataRow["InheritICAEncryptionStrength"] = false; - } - if (isNewRow)_dataTable.Rows.Add(dataRow); - } - } +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Runtime.Versioning; +using System.Security; +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNG.Security; +using mRemoteNG.Tools; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; + +namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql +{ + [SupportedOSPlatform("windows")] + public class DataTableSerializer : ISerializer + { + private const int DELETE = 0; + private readonly ICryptographyProvider _cryptographyProvider; + private readonly SecureString _encryptionKey; + private DataTable _dataTable; + private DataTable _sourceDataTable; + private readonly Dictionary _sourcePrimaryKeyDict = new Dictionary(); + private const string TABLE_NAME = "tblCons"; + private readonly SaveFilter _saveFilter; + private int _currentNodeIndex; + + public Version Version { get; } = new Version(3, 0); + + public DataTableSerializer(SaveFilter saveFilter, ICryptographyProvider cryptographyProvider, SecureString encryptionKey) + { + _saveFilter = saveFilter.ThrowIfNull(nameof(saveFilter)); + _cryptographyProvider = cryptographyProvider.ThrowIfNull(nameof(cryptographyProvider)); + _encryptionKey = encryptionKey.ThrowIfNull(nameof(encryptionKey)); + } + + public void SetSourceDataTable(DataTable sourceDataTable) + { + _sourceDataTable = sourceDataTable; + } + + public DataTable Serialize(ConnectionTreeModel connectionTreeModel) + { + try + { + _dataTable = BuildTable(); + + _currentNodeIndex = 0; + + ContainerInfo rootNode = connectionTreeModel.RootNodes.First(node => node is RootNodeInfo); + + return Serialize(rootNode); + } + catch (Exception ex) + { + return _dataTable; + } + } + + public DataTable Serialize(ConnectionInfo serializationTarget) + { + _dataTable = BuildTable(); + + _currentNodeIndex = 0; + + // Register add or update row + SerializeNodesRecursive(serializationTarget); + + List entryToDelete = _sourcePrimaryKeyDict.Keys.ToList(); + + foreach (var entry in entryToDelete) + { + _dataTable.Rows.Find(entry)?.Delete(); + } + + return _dataTable; + } + + private DataTable BuildTable() + { + DataTable dataTable = _sourceDataTable ?? new DataTable(TABLE_NAME); + + if (dataTable.Columns.Count == 0) CreateSchema(dataTable); + + if (dataTable.PrimaryKey.Length == 0) SetPrimaryKey(dataTable); + + foreach (DataRow row in dataTable.Rows) + { + _sourcePrimaryKeyDict.Add((string)row["ConstantID"], DELETE); + } + + return dataTable; + } + + private void CreateSchema(DataTable dataTable) + { + dataTable.Columns.Add("AutomaticResize", typeof(bool)); + dataTable.Columns.Add("CacheBitmaps", typeof(bool)); + dataTable.Columns.Add("Colors", typeof(string)); + dataTable.Columns.Add("ConnectToConsole", typeof(bool)); + dataTable.Columns.Add("Connected", typeof(bool)); + dataTable.Columns.Add("ConstantID", typeof(string)); + dataTable.Columns.Add("Description", typeof(string)); + dataTable.Columns.Add("DisableCursorBlinking", typeof(bool)); + dataTable.Columns.Add("DisableCursorShadow", typeof(bool)); + dataTable.Columns.Add("DisableFullWindowDrag", typeof(bool)); + dataTable.Columns.Add("DisableMenuAnimations", typeof(bool)); + dataTable.Columns.Add("DisplayThemes", typeof(bool)); + dataTable.Columns.Add("DisplayWallpaper", typeof(bool)); + dataTable.Columns.Add("Domain", typeof(string)); + dataTable.Columns.Add("EC2InstanceId", typeof(string)); + dataTable.Columns.Add("EC2Region", typeof(string)); + dataTable.Columns.Add("EnableDesktopComposition", typeof(bool)); + dataTable.Columns.Add("EnableFontSmoothing", typeof(bool)); + dataTable.Columns.Add("EnhancedMode", typeof(bool)); + dataTable.Columns.Add("Expanded", typeof(bool)); + dataTable.Columns.Add("ExtApp", typeof(string)); + dataTable.Columns.Add("ExternalAddressProvider", typeof(string)); + dataTable.Columns.Add("ExternalCredentialProvider", typeof(string)); + dataTable.Columns.Add("Favorite", typeof(bool)); + dataTable.Columns.Add("Hostname", typeof(string)); + dataTable.Columns.Add("ICAEncryptionStrength", typeof(string)); + dataTable.Columns.Add("Icon", typeof(string)); + dataTable.Columns.Add("InheritAutomaticResize", typeof(bool)); + dataTable.Columns.Add("InheritCacheBitmaps", typeof(bool)); + dataTable.Columns.Add("InheritColors", typeof(bool)); + dataTable.Columns.Add("InheritDescription", typeof(bool)); + dataTable.Columns.Add("InheritDisableCursorBlinking", typeof(bool)); + dataTable.Columns.Add("InheritDisableCursorShadow", typeof(bool)); + dataTable.Columns.Add("InheritDisableFullWindowDrag", typeof(bool)); + dataTable.Columns.Add("InheritDisableMenuAnimations", typeof(bool)); + dataTable.Columns.Add("InheritDisplayThemes", typeof(bool)); + dataTable.Columns.Add("InheritDisplayWallpaper", typeof(bool)); + dataTable.Columns.Add("InheritDomain", typeof(bool)); + dataTable.Columns.Add("InheritEnableDesktopComposition", typeof(bool)); + dataTable.Columns.Add("InheritEnableFontSmoothing", typeof(bool)); + dataTable.Columns.Add("InheritEnhancedMode", typeof(bool)); + dataTable.Columns.Add("InheritExtApp", typeof(bool)); + dataTable.Columns.Add("InheritExternalCredentialProvider", typeof(bool)); + dataTable.Columns.Add("InheritFavorite", typeof(bool)); + dataTable.Columns.Add("InheritICAEncryptionStrength", typeof(bool)); + dataTable.Columns.Add("InheritIcon", typeof(bool)); + dataTable.Columns.Add("InheritLoadBalanceInfo", typeof(bool)); + dataTable.Columns.Add("InheritMacAddress", typeof(bool)); + dataTable.Columns.Add("InheritOpeningCommand", typeof(bool)); + dataTable.Columns.Add("InheritPanel", typeof(bool)); + dataTable.Columns.Add("InheritPassword", typeof(bool)); + dataTable.Columns.Add("InheritPort", typeof(bool)); + dataTable.Columns.Add("InheritPostExtApp", typeof(bool)); + dataTable.Columns.Add("InheritPreExtApp", typeof(bool)); + dataTable.Columns.Add("InheritProtocol", typeof(bool)); + dataTable.Columns.Add("InheritPuttySession", typeof(bool)); + dataTable.Columns.Add("InheritRDGatewayDomain", typeof(bool)); + dataTable.Columns.Add("InheritRDGatewayExternalCredentialProvider", typeof(bool)); + dataTable.Columns.Add("InheritRDGatewayHostname", typeof(bool)); + dataTable.Columns.Add("InheritRDGatewayPassword", typeof(bool)); + dataTable.Columns.Add("InheritRDGatewayUsageMethod", typeof(bool)); + dataTable.Columns.Add("InheritRDGatewayUseConnectionCredentials", typeof(bool)); + dataTable.Columns.Add("InheritRDGatewayUserViaAPI", typeof(bool)); + dataTable.Columns.Add("InheritRDGatewayUsername", typeof(bool)); + dataTable.Columns.Add("InheritRDPAlertIdleTimeout", typeof(bool)); + dataTable.Columns.Add("InheritRDPAuthenticationLevel", typeof(bool)); + dataTable.Columns.Add("InheritRDPMinutesToIdleTimeout", typeof(bool)); + dataTable.Columns.Add("InheritRdpVersion", typeof(bool)); + dataTable.Columns.Add("InheritRedirectAudioCapture", typeof(bool)); + dataTable.Columns.Add("InheritRedirectClipboard", typeof(bool)); + dataTable.Columns.Add("InheritRedirectDiskDrives", typeof(bool)); + dataTable.Columns.Add("InheritRedirectDiskDrivesCustom", typeof(bool)); + dataTable.Columns.Add("InheritRedirectKeys", typeof(bool)); + dataTable.Columns.Add("InheritRedirectPorts", typeof(bool)); + dataTable.Columns.Add("InheritRedirectPrinters", typeof(bool)); + dataTable.Columns.Add("InheritRedirectSmartCards", typeof(bool)); + dataTable.Columns.Add("InheritRedirectSound", typeof(bool)); + dataTable.Columns.Add("InheritRenderingEngine", typeof(bool)); + dataTable.Columns.Add("InheritResolution", typeof(bool)); + dataTable.Columns.Add("InheritSSHOptions", typeof(bool)); + dataTable.Columns.Add("InheritSSHTunnelConnectionName", typeof(bool)); + dataTable.Columns.Add("InheritSoundQuality", typeof(bool)); + dataTable.Columns.Add("InheritUseConsoleSession", typeof(bool)); + dataTable.Columns.Add("InheritUseCredSsp", typeof(bool)); + dataTable.Columns.Add("InheritUseEnhancedMode", typeof(bool)); + dataTable.Columns.Add("InheritUseRCG", typeof(bool)); + dataTable.Columns.Add("InheritUseRestrictedAdmin", typeof(bool)); + dataTable.Columns.Add("InheritUseVmId", typeof(bool)); + dataTable.Columns.Add("InheritUserField", typeof(bool)); + dataTable.Columns.Add("InheritUserViaAPI", typeof(bool)); + dataTable.Columns.Add("InheritUsername", typeof(bool)); + dataTable.Columns.Add("InheritVNCAuthMode", typeof(bool)); + dataTable.Columns.Add("InheritVNCColors", typeof(bool)); + dataTable.Columns.Add("InheritVNCCompression", typeof(bool)); + dataTable.Columns.Add("InheritVNCEncoding", typeof(bool)); + dataTable.Columns.Add("InheritVNCProxyIP", typeof(bool)); + dataTable.Columns.Add("InheritVNCProxyPassword", typeof(bool)); + dataTable.Columns.Add("InheritVNCProxyPort", typeof(bool)); + dataTable.Columns.Add("InheritVNCProxyType", typeof(bool)); + dataTable.Columns.Add("InheritVNCProxyUsername", typeof(bool)); + dataTable.Columns.Add("InheritVNCSmartSizeMode", typeof(bool)); + dataTable.Columns.Add("InheritVNCViewOnly", typeof(bool)); + dataTable.Columns.Add("InheritVmId", typeof(bool)); + dataTable.Columns.Add("LastChange", MiscTools.DBTimeStampType()); + dataTable.Columns.Add("LoadBalanceInfo", typeof(string)); + dataTable.Columns.Add("MacAddress", typeof(string)); + dataTable.Columns.Add("Name", typeof(string)); + dataTable.Columns.Add("OpeningCommand", typeof(string)); + dataTable.Columns.Add("Panel", typeof(string)); + dataTable.Columns.Add("ParentID", typeof(string)); + dataTable.Columns.Add("Password", typeof(string)); + dataTable.Columns.Add("Port", typeof(int)); + dataTable.Columns.Add("PositionID", typeof(int)); + dataTable.Columns.Add("PostExtApp", typeof(string)); + dataTable.Columns.Add("PreExtApp", typeof(string)); + dataTable.Columns.Add("Protocol", typeof(string)); + dataTable.Columns.Add("PuttySession", typeof(string)); + dataTable.Columns.Add("RDGatewayDomain", typeof(string)); + dataTable.Columns.Add("RDGatewayExternalCredentialProvider", typeof(string)); + dataTable.Columns.Add("RDGatewayHostname", typeof(string)); + dataTable.Columns.Add("RDGatewayPassword", typeof(string)); + dataTable.Columns.Add("RDGatewayUsageMethod", typeof(string)); + dataTable.Columns.Add("RDGatewayUseConnectionCredentials", typeof(string)); + dataTable.Columns.Add("RDGatewayUserViaAPI", typeof(string)); + dataTable.Columns.Add("RDGatewayUsername", typeof(string)); + dataTable.Columns.Add("RDPAlertIdleTimeout", typeof(bool)); + dataTable.Columns.Add("RDPAuthenticationLevel", typeof(string)); + dataTable.Columns.Add("RDPMinutesToIdleTimeout", typeof(int)); + dataTable.Columns.Add("RdpVersion", typeof(string)); + dataTable.Columns.Add("RedirectAudioCapture", typeof(bool)); + dataTable.Columns.Add("RedirectClipboard", typeof(bool)); + dataTable.Columns.Add("RedirectDiskDrives", typeof(string)); + dataTable.Columns.Add("RedirectDiskDrivesCustom", typeof(string)); + dataTable.Columns.Add("RedirectKeys", typeof(bool)); + dataTable.Columns.Add("RedirectPorts", typeof(bool)); + dataTable.Columns.Add("RedirectPrinters", typeof(bool)); + dataTable.Columns.Add("RedirectSmartCards", typeof(bool)); + dataTable.Columns.Add("RedirectSound", typeof(string)); + dataTable.Columns.Add("RenderingEngine", typeof(string)); + dataTable.Columns.Add("Resolution", typeof(string)); + dataTable.Columns.Add("SSHOptions", typeof(string)); + dataTable.Columns.Add("SSHTunnelConnectionName", typeof(string)); + dataTable.Columns.Add("SoundQuality", typeof(string)); + dataTable.Columns.Add("StartProgram", typeof(string)); + dataTable.Columns.Add("StartProgramWorkDir", typeof(string)); + dataTable.Columns.Add("Type", typeof(string)); + dataTable.Columns.Add("UseCredSsp", typeof(bool)); + dataTable.Columns.Add("UseEnhancedMode", typeof(bool)); + dataTable.Columns.Add("UseRCG", typeof(bool)); + dataTable.Columns.Add("UseRestrictedAdmin", typeof(bool)); + dataTable.Columns.Add("UseVmId", typeof(bool)); + dataTable.Columns.Add("UserField", typeof(string)); + dataTable.Columns.Add("UserViaAPI", typeof(string)); + dataTable.Columns.Add("Username", typeof(string)); + dataTable.Columns.Add("VNCAuthMode", typeof(string)); + dataTable.Columns.Add("VNCColors", typeof(string)); + dataTable.Columns.Add("VNCCompression", typeof(string)); + dataTable.Columns.Add("VNCEncoding", typeof(string)); + dataTable.Columns.Add("VNCProxyIP", typeof(string)); + dataTable.Columns.Add("VNCProxyPassword", typeof(string)); + dataTable.Columns.Add("VNCProxyPort", typeof(int)); + dataTable.Columns.Add("VNCProxyType", typeof(string)); + dataTable.Columns.Add("VNCProxyUsername", typeof(string)); + dataTable.Columns.Add("VNCSmartSizeMode", typeof(string)); + dataTable.Columns.Add("VNCViewOnly", typeof(bool)); + dataTable.Columns.Add("VmId", typeof(string)); + dataTable.Columns[0].AutoIncrement = true; + dataTable.Columns.Add("ID", typeof(int)); + } + + private void SetPrimaryKey(DataTable dataTable) + { + dataTable.PrimaryKey = new[] { dataTable.Columns["ConstantID"] }; + } + + private void SerializeNodesRecursive(ConnectionInfo connectionInfo) + { + if (connectionInfo is not RootNodeInfo) + { + SerializeConnectionInfo(connectionInfo); + } + + var containerInfo = connectionInfo as ContainerInfo; + if (containerInfo == null) return; + + foreach (ConnectionInfo child in containerInfo.Children) + { + SerializeNodesRecursive(child); + } + } + + private bool IsRowUpdated(ConnectionInfo connectionInfo, DataRow dataRow) + { + var isFieldNotChange = dataRow["Name"].Equals(connectionInfo.Name) && + dataRow["Type"].Equals(connectionInfo.GetTreeNodeType().ToString()) && + dataRow["ParentID"].Equals(connectionInfo.Parent?.ConstantID ?? "") && + dataRow["PositionID"].Equals(_currentNodeIndex) && + dataRow["Expanded"].Equals(false) && + dataRow["Description"].Equals(connectionInfo.Description) && + dataRow["Icon"].Equals(connectionInfo.Icon) && + dataRow["Panel"].Equals(connectionInfo.Panel) && + dataRow["Username"].Equals(_saveFilter.SaveUsername ? connectionInfo.Username : "") && + dataRow["Domain"].Equals(_saveFilter.SaveDomain ? connectionInfo.Domain : ""); + + isFieldNotChange = isFieldNotChange && dataRow["AutomaticResize"].Equals(connectionInfo.AutomaticResize); + isFieldNotChange = isFieldNotChange && dataRow["CacheBitmaps"].Equals(connectionInfo.CacheBitmaps); + isFieldNotChange = isFieldNotChange && dataRow["Colors"].Equals(connectionInfo.Colors.ToString()); + isFieldNotChange = isFieldNotChange && dataRow["ConnectToConsole"].Equals(connectionInfo.UseConsoleSession); + isFieldNotChange = isFieldNotChange && dataRow["Connected"].Equals(false); // TODO: this column can eventually be removed. we now save this property locally + isFieldNotChange = isFieldNotChange && dataRow["DisableCursorBlinking"].Equals(connectionInfo.DisableCursorBlinking); + isFieldNotChange = isFieldNotChange && dataRow["DisableCursorShadow"].Equals(connectionInfo.DisableCursorShadow); + isFieldNotChange = isFieldNotChange && dataRow["DisableFullWindowDrag"].Equals(connectionInfo.DisableFullWindowDrag); + isFieldNotChange = isFieldNotChange && dataRow["DisableMenuAnimations"].Equals(connectionInfo.DisableMenuAnimations); + isFieldNotChange = isFieldNotChange && dataRow["DisplayThemes"].Equals(connectionInfo.DisplayThemes); + isFieldNotChange = isFieldNotChange && dataRow["DisplayWallpaper"].Equals(connectionInfo.DisplayWallpaper); + isFieldNotChange = isFieldNotChange && dataRow["EC2InstanceId"].Equals(connectionInfo.EC2InstanceId); + isFieldNotChange = isFieldNotChange && dataRow["EC2Region"].Equals(connectionInfo.EC2Region); + isFieldNotChange = isFieldNotChange && dataRow["EnableDesktopComposition"].Equals(connectionInfo.EnableDesktopComposition); + isFieldNotChange = isFieldNotChange && dataRow["EnableFontSmoothing"].Equals(connectionInfo.EnableFontSmoothing); + isFieldNotChange = isFieldNotChange && dataRow["ExtApp"].Equals(connectionInfo.ExtApp); + isFieldNotChange = isFieldNotChange && dataRow["ExternalAddressProvider"].Equals(connectionInfo.ExternalAddressProvider); + isFieldNotChange = isFieldNotChange && dataRow["ExternalCredentialProvider"].Equals(connectionInfo.ExternalCredentialProvider); + isFieldNotChange = isFieldNotChange && dataRow["Hostname"].Equals(connectionInfo.Hostname); + isFieldNotChange = isFieldNotChange && dataRow["LoadBalanceInfo"].Equals(connectionInfo.LoadBalanceInfo); + isFieldNotChange = isFieldNotChange && dataRow["MacAddress"].Equals(connectionInfo.MacAddress); + isFieldNotChange = isFieldNotChange && dataRow["OpeningCommand"].Equals(connectionInfo.OpeningCommand); + isFieldNotChange = isFieldNotChange && dataRow["Port"].Equals(connectionInfo.Port); + isFieldNotChange = isFieldNotChange && dataRow["PostExtApp"].Equals(connectionInfo.PostExtApp); + isFieldNotChange = isFieldNotChange && dataRow["PreExtApp"].Equals(connectionInfo.PreExtApp); + isFieldNotChange = isFieldNotChange && dataRow["Protocol"].Equals(connectionInfo.Protocol.ToString()); + isFieldNotChange = isFieldNotChange && dataRow["PuttySession"].Equals(connectionInfo.PuttySession); + isFieldNotChange = isFieldNotChange && dataRow["RDGatewayDomain"].Equals(connectionInfo.RDGatewayDomain); + isFieldNotChange = isFieldNotChange && dataRow["RDGatewayExternalCredentialProvider"].Equals(connectionInfo.RDGatewayExternalCredentialProvider); + isFieldNotChange = isFieldNotChange && dataRow["RDGatewayHostname"].Equals(connectionInfo.RDGatewayHostname); + isFieldNotChange = isFieldNotChange && dataRow["RDGatewayUsageMethod"].Equals(connectionInfo.RDGatewayUsageMethod.ToString()); + isFieldNotChange = isFieldNotChange && dataRow["RDGatewayUseConnectionCredentials"].Equals(connectionInfo.RDGatewayUseConnectionCredentials.ToString()); + isFieldNotChange = isFieldNotChange && dataRow["RDGatewayUserViaAPI"].Equals(connectionInfo.RDGatewayUserViaAPI); + isFieldNotChange = isFieldNotChange && dataRow["RDGatewayUsername"].Equals(connectionInfo.RDGatewayUsername); + isFieldNotChange = isFieldNotChange && dataRow["RDPAlertIdleTimeout"].Equals(connectionInfo.RDPAlertIdleTimeout); + isFieldNotChange = isFieldNotChange && dataRow["RDPAuthenticationLevel"].Equals(connectionInfo.RDPAuthenticationLevel.ToString()); + isFieldNotChange = isFieldNotChange && dataRow["RDPMinutesToIdleTimeout"].Equals(connectionInfo.RDPMinutesToIdleTimeout); + isFieldNotChange = isFieldNotChange && dataRow["RdpVersion"].Equals(connectionInfo.RdpVersion.ToString()); + isFieldNotChange = isFieldNotChange && dataRow["RedirectAudioCapture"].Equals(connectionInfo.RedirectAudioCapture); + isFieldNotChange = isFieldNotChange && dataRow["RedirectClipboard"].Equals(connectionInfo.RedirectClipboard); + isFieldNotChange = isFieldNotChange && dataRow["RedirectDiskDrives"].Equals(connectionInfo.RedirectDiskDrives.ToString()); + isFieldNotChange = isFieldNotChange && dataRow["RedirectDiskDrivesCustom"].Equals(connectionInfo.RedirectDiskDrivesCustom); + isFieldNotChange = isFieldNotChange && dataRow["RedirectKeys"].Equals(connectionInfo.RedirectKeys); + isFieldNotChange = isFieldNotChange && dataRow["RedirectPorts"].Equals(connectionInfo.RedirectPorts); + isFieldNotChange = isFieldNotChange && dataRow["RedirectPrinters"].Equals(connectionInfo.RedirectPrinters); + isFieldNotChange = isFieldNotChange && dataRow["RedirectSmartCards"].Equals(connectionInfo.RedirectSmartCards); + isFieldNotChange = isFieldNotChange && dataRow["RedirectSound"].Equals(connectionInfo.RedirectSound.ToString()); + isFieldNotChange = isFieldNotChange && dataRow["RenderingEngine"].Equals(connectionInfo.RenderingEngine.ToString()); + isFieldNotChange = isFieldNotChange && dataRow["Resolution"].Equals(connectionInfo.Resolution.ToString()); + isFieldNotChange = isFieldNotChange && dataRow["SoundQuality"].Equals(connectionInfo.SoundQuality.ToString()); + isFieldNotChange = isFieldNotChange && dataRow["StartProgram"].Equals(connectionInfo.RDPStartProgram); + isFieldNotChange = isFieldNotChange && dataRow["StartProgramWorkDir"].Equals(connectionInfo.RDPStartProgramWorkDir); + isFieldNotChange = isFieldNotChange && dataRow["UseCredSsp"].Equals(connectionInfo.UseCredSsp); + isFieldNotChange = isFieldNotChange && dataRow["UseEnhancedMode"].Equals(connectionInfo.UseEnhancedMode); + isFieldNotChange = isFieldNotChange && dataRow["UseRCG"].Equals(connectionInfo.UseRCG); + isFieldNotChange = isFieldNotChange && dataRow["UseRestrictedAdmin"].Equals(connectionInfo.UseRestrictedAdmin); + isFieldNotChange = isFieldNotChange && dataRow["UseVmId"].Equals(connectionInfo.UseVmId); + isFieldNotChange = isFieldNotChange && dataRow["UserField"].Equals(connectionInfo.UserField); + isFieldNotChange = isFieldNotChange && dataRow["UserViaAPI"].Equals(connectionInfo.UserViaAPI); + isFieldNotChange = isFieldNotChange && dataRow["VNCAuthMode"].Equals(connectionInfo.VNCAuthMode.ToString()); + isFieldNotChange = isFieldNotChange && dataRow["VNCColors"].Equals(connectionInfo.VNCColors.ToString()); + isFieldNotChange = isFieldNotChange && dataRow["VNCCompression"].Equals(connectionInfo.VNCCompression.ToString()); + isFieldNotChange = isFieldNotChange && dataRow["VNCEncoding"].Equals(connectionInfo.VNCEncoding.ToString()); + isFieldNotChange = isFieldNotChange && dataRow["VNCProxyIP"].Equals(connectionInfo.VNCProxyIP); + isFieldNotChange = isFieldNotChange && dataRow["VNCProxyPort"].Equals(connectionInfo.VNCProxyPort); + isFieldNotChange = isFieldNotChange && dataRow["VNCProxyType"].Equals(connectionInfo.VNCProxyType.ToString()); + isFieldNotChange = isFieldNotChange && dataRow["VNCProxyUsername"].Equals(connectionInfo.VNCProxyUsername); + isFieldNotChange = isFieldNotChange && dataRow["VNCSmartSizeMode"].Equals(connectionInfo.VNCSmartSizeMode.ToString()); + isFieldNotChange = isFieldNotChange && dataRow["VNCViewOnly"].Equals(connectionInfo.VNCViewOnly); + isFieldNotChange = isFieldNotChange && dataRow["VmId"].Equals(connectionInfo.VmId); + + var isInheritanceFieldNotChange = false; + if (_saveFilter.SaveInheritance) + { + isInheritanceFieldNotChange = + dataRow["InheritAutomaticResize"].Equals(connectionInfo.Inheritance.AutomaticResize) && + dataRow["InheritCacheBitmaps"].Equals(connectionInfo.Inheritance.CacheBitmaps) && + dataRow["InheritColors"].Equals(connectionInfo.Inheritance.Colors) && + dataRow["InheritDescription"].Equals(connectionInfo.Inheritance.Description) && + dataRow["InheritDisableCursorBlinking"].Equals(connectionInfo.Inheritance.DisableCursorBlinking) && + dataRow["InheritDisableCursorShadow"].Equals(connectionInfo.Inheritance.DisableCursorShadow) && + dataRow["InheritDisableFullWindowDrag"].Equals(connectionInfo.Inheritance.DisableFullWindowDrag) && + dataRow["InheritDisableMenuAnimations"].Equals(connectionInfo.Inheritance.DisableMenuAnimations) && + dataRow["InheritDisplayThemes"].Equals(connectionInfo.Inheritance.DisplayThemes) && + dataRow["InheritDisplayWallpaper"].Equals(connectionInfo.Inheritance.DisplayWallpaper) && + dataRow["InheritDomain"].Equals(connectionInfo.Inheritance.Domain) && + dataRow["InheritEnableDesktopComposition"].Equals(connectionInfo.Inheritance.EnableDesktopComposition) && + dataRow["InheritEnableFontSmoothing"].Equals(connectionInfo.Inheritance.EnableFontSmoothing) && + dataRow["InheritExtApp"].Equals(connectionInfo.Inheritance.ExtApp) && + dataRow["InheritExternalCredentialProvider"].Equals(connectionInfo.Inheritance.ExternalCredentialProvider) && + dataRow["InheritIcon"].Equals(connectionInfo.Inheritance.Icon) && + dataRow["InheritLoadBalanceInfo"].Equals(connectionInfo.Inheritance.LoadBalanceInfo) && + dataRow["InheritMacAddress"].Equals(connectionInfo.Inheritance.MacAddress) && + dataRow["InheritOpeningCommand"].Equals(connectionInfo.Inheritance.OpeningCommand) && + dataRow["InheritPanel"].Equals(connectionInfo.Inheritance.Panel) && + dataRow["InheritPassword"].Equals(connectionInfo.Inheritance.Password) && + dataRow["InheritPort"].Equals(connectionInfo.Inheritance.Port) && + dataRow["InheritPostExtApp"].Equals(connectionInfo.Inheritance.PostExtApp) && + dataRow["InheritPreExtApp"].Equals(connectionInfo.Inheritance.PreExtApp) && + dataRow["InheritProtocol"].Equals(connectionInfo.Inheritance.Protocol) && + dataRow["InheritPuttySession"].Equals(connectionInfo.Inheritance.PuttySession) && + dataRow["InheritRDGatewayDomain"].Equals(connectionInfo.Inheritance.RDGatewayDomain) && + dataRow["InheritRDGatewayExternalCredentialProvider"].Equals(connectionInfo.Inheritance.RDGatewayExternalCredentialProvider) && + dataRow["InheritRDGatewayHostname"].Equals(connectionInfo.Inheritance.RDGatewayHostname) && + dataRow["InheritRDGatewayPassword"].Equals(connectionInfo.Inheritance.RDGatewayPassword) && + dataRow["InheritRDGatewayUsageMethod"].Equals(connectionInfo.Inheritance.RDGatewayUsageMethod) && + dataRow["InheritRDGatewayUseConnectionCredentials"].Equals(connectionInfo.Inheritance.RDGatewayUseConnectionCredentials) && + dataRow["InheritRDGatewayUsername"].Equals(connectionInfo.Inheritance.RDGatewayUsername) && + dataRow["InheritRDGatewayUserViaAPI"].Equals(connectionInfo.Inheritance.RDGatewayUserViaAPI) && + dataRow["InheritRDPAlertIdleTimeout"].Equals(connectionInfo.Inheritance.RDPAlertIdleTimeout) && + dataRow["InheritRDPAuthenticationLevel"].Equals(connectionInfo.Inheritance.RDPAuthenticationLevel) && + dataRow["InheritRDPMinutesToIdleTimeout"].Equals(connectionInfo.Inheritance.RDPMinutesToIdleTimeout) && + dataRow["InheritRdpVersion"].Equals(connectionInfo.Inheritance.RdpVersion) && + dataRow["InheritRedirectAudioCapture"].Equals(connectionInfo.Inheritance.RedirectAudioCapture) && + dataRow["InheritRedirectClipboard"].Equals(connectionInfo.Inheritance.RedirectClipboard) && + dataRow["InheritRedirectDiskDrives"].Equals(connectionInfo.Inheritance.RedirectDiskDrives) && + dataRow["InheritRedirectDiskDrivesCustom"].Equals(connectionInfo.Inheritance.RedirectDiskDrivesCustom) && + dataRow["InheritRedirectKeys"].Equals(connectionInfo.Inheritance.RedirectKeys) && + dataRow["InheritRedirectPorts"].Equals(connectionInfo.Inheritance.RedirectPorts) && + dataRow["InheritRedirectPrinters"].Equals(connectionInfo.Inheritance.RedirectPrinters) && + dataRow["InheritRedirectSmartCards"].Equals(connectionInfo.Inheritance.RedirectSmartCards) && + dataRow["InheritRedirectSound"].Equals(connectionInfo.Inheritance.RedirectSound) && + dataRow["InheritRenderingEngine"].Equals(connectionInfo.Inheritance.RenderingEngine) && + dataRow["InheritResolution"].Equals(connectionInfo.Inheritance.Resolution) && + dataRow["InheritSoundQuality"].Equals(connectionInfo.Inheritance.SoundQuality) && + dataRow["InheritUseConsoleSession"].Equals(connectionInfo.Inheritance.UseConsoleSession) && + dataRow["InheritUseCredSsp"].Equals(connectionInfo.Inheritance.UseCredSsp) && + dataRow["InheritUseEnhancedMode"].Equals(connectionInfo.Inheritance.UseEnhancedMode) && + dataRow["InheritUseRCG"].Equals(connectionInfo.Inheritance.UseRCG) && + dataRow["InheritUseRestrictedAdmin"].Equals(connectionInfo.Inheritance.UseRestrictedAdmin) && + dataRow["InheritUserField"].Equals(connectionInfo.Inheritance.UserField) && + dataRow["InheritUsername"].Equals(connectionInfo.Inheritance.Username) && + dataRow["InheritUserViaAPI"].Equals(connectionInfo.Inheritance.UserViaAPI) && + dataRow["InheritUseVmId"].Equals(connectionInfo.Inheritance.UseVmId) && + dataRow["InheritVmId"].Equals(connectionInfo.Inheritance.VmId) && + dataRow["InheritVNCAuthMode"].Equals(connectionInfo.Inheritance.VNCAuthMode) && + dataRow["InheritVNCColors"].Equals(connectionInfo.Inheritance.VNCColors) && + dataRow["InheritVNCCompression"].Equals(connectionInfo.Inheritance.VNCCompression) && + dataRow["InheritVNCEncoding"].Equals(connectionInfo.Inheritance.VNCEncoding) && + dataRow["InheritVNCProxyIP"].Equals(connectionInfo.Inheritance.VNCProxyIP) && + dataRow["InheritVNCProxyPassword"].Equals(connectionInfo.Inheritance.VNCProxyPassword) && + dataRow["InheritVNCProxyPort"].Equals(connectionInfo.Inheritance.VNCProxyPort) && + dataRow["InheritVNCProxyType"].Equals(connectionInfo.Inheritance.VNCProxyType) && + dataRow["InheritVNCProxyUsername"].Equals(connectionInfo.Inheritance.VNCProxyUsername) && + dataRow["InheritVNCSmartSizeMode"].Equals(connectionInfo.Inheritance.VNCSmartSizeMode) && + dataRow["InheritVNCViewOnly"].Equals(connectionInfo.Inheritance.VNCViewOnly); + } + else + { + isInheritanceFieldNotChange = + dataRow["InheritAutomaticResize"].Equals(false) && + dataRow["InheritCacheBitmaps"].Equals(false) && + dataRow["InheritColors"].Equals(false) && + dataRow["InheritDescription"].Equals(false) && + dataRow["InheritDisableCursorBlinking"].Equals(false) && + dataRow["InheritDisableCursorShadow"].Equals(false) && + dataRow["InheritDisableFullWindowDrag"].Equals(false) && + dataRow["InheritDisableMenuAnimations"].Equals(false) && + dataRow["InheritDisplayThemes"].Equals(false) && + dataRow["InheritDisplayWallpaper"].Equals(false) && + dataRow["InheritDomain"].Equals(false) && + dataRow["InheritEnableDesktopComposition"].Equals(false) && + dataRow["InheritEnableFontSmoothing"].Equals(false) && + dataRow["InheritExtApp"].Equals(false) && + dataRow["InheritExternalCredentialProvider"].Equals(false) && + dataRow["InheritIcon"].Equals(false) && + dataRow["InheritLoadBalanceInfo"].Equals(false) && + dataRow["InheritMacAddress"].Equals(false) && + dataRow["InheritOpeningCommand"].Equals(false) && + dataRow["InheritPanel"].Equals(false) && + dataRow["InheritPassword"].Equals(false) && + dataRow["InheritPort"].Equals(false) && + dataRow["InheritPostExtApp"].Equals(false) && + dataRow["InheritPreExtApp"].Equals(false) && + dataRow["InheritProtocol"].Equals(false) && + dataRow["InheritPuttySession"].Equals(false) && + dataRow["InheritRDGatewayDomain"].Equals(false) && + dataRow["InheritRDGatewayExternalCredentialProvider"].Equals(connectionInfo.Inheritance.RDGatewayExternalCredentialProvider) && + dataRow["InheritRDGatewayHostname"].Equals(false) && + dataRow["InheritRDGatewayPassword"].Equals(false) && + dataRow["InheritRDGatewayUsageMethod"].Equals(false) && + dataRow["InheritRDGatewayUseConnectionCredentials"].Equals(false) && + dataRow["InheritRDGatewayUsername"].Equals(false) && + dataRow["InheritRDGatewayUserViaAPI"].Equals(false) && + dataRow["InheritRDPAlertIdleTimeout"].Equals(false) && + dataRow["InheritRDPAuthenticationLevel"].Equals(false) && + dataRow["InheritRDPMinutesToIdleTimeout"].Equals(false) && + dataRow["InheritRdpVersion"].Equals(false) && + dataRow["InheritRedirectAudioCapture"].Equals(false) && + dataRow["InheritRedirectClipboard"].Equals(false) && + dataRow["InheritRedirectDiskDrives"].Equals(false) && + dataRow["InheritRedirectDiskDrivesCustom"].Equals(false) && + dataRow["InheritRedirectKeys"].Equals(false) && + dataRow["InheritRedirectPorts"].Equals(false) && + dataRow["InheritRedirectPrinters"].Equals(false) && + dataRow["InheritRedirectSmartCards"].Equals(false) && + dataRow["InheritRedirectSound"].Equals(false) && + dataRow["InheritRenderingEngine"].Equals(false) && + dataRow["InheritResolution"].Equals(false) && + dataRow["InheritSoundQuality"].Equals(false) && + dataRow["InheritUseConsoleSession"].Equals(false) && + dataRow["InheritUseCredSsp"].Equals(false) && + dataRow["InheritUseRCG"].Equals(false) && + dataRow["InheritUseRestrictedAdmin"].Equals(false) && + dataRow["InheritUserField"].Equals(false) && + dataRow["InheritUsername"].Equals(false) && + dataRow["InheritUserViaAPI"].Equals(false) && + dataRow["InheritVNCAuthMode"].Equals(false) && + dataRow["InheritVNCColors"].Equals(false) && + dataRow["InheritVNCCompression"].Equals(false) && + dataRow["InheritVNCEncoding"].Equals(false) && + dataRow["InheritVNCProxyIP"].Equals(false) && + dataRow["InheritVNCProxyPassword"].Equals(false) && + dataRow["InheritVNCProxyPort"].Equals(false) && + dataRow["InheritVNCProxyType"].Equals(false) && + dataRow["InheritVNCProxyUsername"].Equals(false) && + dataRow["InheritVNCSmartSizeMode"].Equals(false) && + dataRow["InheritVNCViewOnly"].Equals(false); + } + + var pwd = dataRow["Password"].Equals(_saveFilter.SavePassword ? _cryptographyProvider.Encrypt(connectionInfo.Password, _encryptionKey) : "") && + dataRow["VNCProxyPassword"].Equals(_cryptographyProvider.Encrypt(connectionInfo.VNCProxyPassword, _encryptionKey)) && + dataRow["RDGatewayPassword"].Equals(_cryptographyProvider.Encrypt(connectionInfo.RDGatewayPassword, _encryptionKey)); + return !(pwd && isFieldNotChange && isInheritanceFieldNotChange); + } + + private void SerializeConnectionInfo(ConnectionInfo connectionInfo) + { + _currentNodeIndex++; + var isNewRow = false; + DataRow dataRow = _dataTable.Rows.Find(connectionInfo.ConstantID); + if (dataRow == null) + { + dataRow = _dataTable.NewRow(); + dataRow["ConstantID"] = connectionInfo.ConstantID; + isNewRow = true; + } + else + { + _sourcePrimaryKeyDict.Remove(connectionInfo.ConstantID); + } + var tmp = IsRowUpdated(connectionInfo, dataRow); + if (!tmp) + { + return; + } + + dataRow["AutomaticResize"] = connectionInfo.AutomaticResize; + dataRow["CacheBitmaps"] = connectionInfo.CacheBitmaps; + dataRow["Colors"] = connectionInfo.Colors; + dataRow["ConnectToConsole"] = connectionInfo.UseConsoleSession; + dataRow["Connected"] = false; + dataRow["Description"] = connectionInfo.Description; // TODO: this column can eventually be removed. we now save this property locally + dataRow["DisableCursorBlinking"] = connectionInfo.DisableCursorBlinking; + dataRow["DisableCursorShadow"] = connectionInfo.DisableCursorShadow; + dataRow["DisableFullWindowDrag"] = connectionInfo.DisableFullWindowDrag; + dataRow["DisableMenuAnimations"] = connectionInfo.DisableMenuAnimations; + dataRow["DisplayThemes"] = connectionInfo.DisplayThemes; + dataRow["DisplayWallpaper"] = connectionInfo.DisplayWallpaper; + dataRow["Domain"] = _saveFilter.SaveDomain ? connectionInfo.Domain : ""; + dataRow["EnableDesktopComposition"] = connectionInfo.EnableDesktopComposition; + dataRow["EnableFontSmoothing"] = connectionInfo.EnableFontSmoothing; + dataRow["Expanded"] = false; + dataRow["ExtApp"] = connectionInfo.ExtApp; + dataRow["Favorite"] = connectionInfo.Favorite; + dataRow["Hostname"] = connectionInfo.Hostname; + dataRow["ICAEncryptionStrength"] = string.Empty; + dataRow["Icon"] = connectionInfo.Icon; + dataRow["LastChange"] = MiscTools.DBTimeStampNow(); + dataRow["LoadBalanceInfo"] = connectionInfo.LoadBalanceInfo; + dataRow["MacAddress"] = connectionInfo.MacAddress; + dataRow["Name"] = connectionInfo.Name; + dataRow["OpeningCommand"] = connectionInfo.OpeningCommand; + dataRow["OpeningCommand"] = connectionInfo.OpeningCommand; + dataRow["Panel"] = connectionInfo.Panel; + dataRow["ParentID"] = connectionInfo.Parent?.ConstantID ?? ""; + dataRow["Password"] = _saveFilter.SavePassword ? _cryptographyProvider.Encrypt(connectionInfo.Password, _encryptionKey) : ""; + dataRow["Port"] = connectionInfo.Port; + dataRow["PositionID"] = _currentNodeIndex; + dataRow["PostExtApp"] = connectionInfo.PostExtApp; + dataRow["PreExtApp"] = connectionInfo.PreExtApp; + dataRow["Protocol"] = connectionInfo.Protocol; + dataRow["PuttySession"] = connectionInfo.PuttySession; + dataRow["RDGatewayDomain"] = connectionInfo.RDGatewayDomain; + dataRow["RDGatewayHostname"] = connectionInfo.RDGatewayHostname; + dataRow["RDGatewayPassword"] = _cryptographyProvider.Encrypt(connectionInfo.RDGatewayPassword, _encryptionKey); + dataRow["RDGatewayUsageMethod"] = connectionInfo.RDGatewayUsageMethod; + dataRow["RDGatewayUseConnectionCredentials"] = connectionInfo.RDGatewayUseConnectionCredentials; + dataRow["RDGatewayUsername"] = connectionInfo.RDGatewayUsername; + dataRow["RDPAlertIdleTimeout"] = connectionInfo.RDPAlertIdleTimeout; + dataRow["RDPAuthenticationLevel"] = connectionInfo.RDPAuthenticationLevel; + dataRow["RDPMinutesToIdleTimeout"] = connectionInfo.RDPMinutesToIdleTimeout; + dataRow["RdpVersion"] = connectionInfo.RdpVersion; + dataRow["RedirectAudioCapture"] = connectionInfo.RedirectAudioCapture; + dataRow["RedirectClipboard"] = connectionInfo.RedirectClipboard; + dataRow["RedirectDiskDrives"] = connectionInfo.RedirectDiskDrives; + dataRow["RedirectDiskDrivesCustom"] = connectionInfo.RedirectDiskDrivesCustom; + dataRow["RedirectKeys"] = connectionInfo.RedirectKeys; + dataRow["RedirectPorts"] = connectionInfo.RedirectPorts; + dataRow["RedirectPrinters"] = connectionInfo.RedirectPrinters; + dataRow["RedirectSmartCards"] = connectionInfo.RedirectSmartCards; + dataRow["RedirectSound"] = connectionInfo.RedirectSound; + dataRow["RenderingEngine"] = connectionInfo.RenderingEngine; + dataRow["Resolution"] = connectionInfo.Resolution; + dataRow["SSHOptions"] = connectionInfo.SSHOptions; + dataRow["SSHTunnelConnectionName"] = connectionInfo.SSHTunnelConnectionName; + dataRow["SoundQuality"] = connectionInfo.SoundQuality; + dataRow["StartProgram"] = connectionInfo.RDPStartProgram; + dataRow["StartProgramWorkDir"] = connectionInfo.RDPStartProgramWorkDir; + dataRow["Type"] = connectionInfo.GetTreeNodeType().ToString(); + dataRow["UseCredSsp"] = connectionInfo.UseCredSsp; + dataRow["UseEnhancedMode"] = connectionInfo.UseEnhancedMode; + dataRow["UseRCG"] = connectionInfo.UseRCG; + dataRow["UseRestrictedAdmin"] = connectionInfo.UseRestrictedAdmin; + dataRow["UseVmId"] = connectionInfo.UseVmId; + dataRow["UserField"] = connectionInfo.UserField; + dataRow["Username"] = _saveFilter.SaveUsername ? connectionInfo.Username : ""; + dataRow["VNCAuthMode"] = connectionInfo.VNCAuthMode; + dataRow["VNCColors"] = connectionInfo.VNCColors; + dataRow["VNCCompression"] = connectionInfo.VNCCompression; + dataRow["VNCEncoding"] = connectionInfo.VNCEncoding; + dataRow["VNCProxyIP"] = connectionInfo.VNCProxyIP; + dataRow["VNCProxyPassword"] = _cryptographyProvider.Encrypt(connectionInfo.VNCProxyPassword, _encryptionKey); + dataRow["VNCProxyPort"] = connectionInfo.VNCProxyPort; + dataRow["VNCProxyType"] = connectionInfo.VNCProxyType; + dataRow["VNCProxyUsername"] = connectionInfo.VNCProxyUsername; + dataRow["VNCSmartSizeMode"] = connectionInfo.VNCSmartSizeMode; + dataRow["VNCViewOnly"] = connectionInfo.VNCViewOnly; // TODO: this column can eventually be removed. we now save this property locally + dataRow["VmId"] = connectionInfo.VmId; + + if (_saveFilter.SaveInheritance) + { + dataRow["InheritAutomaticResize"] = connectionInfo.Inheritance.AutomaticResize; + dataRow["InheritColors"] = connectionInfo.Inheritance.Colors; + dataRow["InheritDescription"] = connectionInfo.Inheritance.Description; + dataRow["InheritDisableCursorBlinking"] = connectionInfo.Inheritance.DisableCursorBlinking; + dataRow["InheritDisableCursorShadow"] = connectionInfo.Inheritance.DisableCursorShadow; + dataRow["InheritDisableFullWindowDrag"] = connectionInfo.Inheritance.DisableFullWindowDrag; + dataRow["InheritDisableMenuAnimations"] = connectionInfo.Inheritance.DisableMenuAnimations; + dataRow["InheritDisplayThemes"] = connectionInfo.Inheritance.DisplayThemes; + dataRow["InheritDisplayWallpaper"] = connectionInfo.Inheritance.DisplayWallpaper; + dataRow["InheritDomain"] = connectionInfo.Inheritance.Domain; + dataRow["InheritEnableDesktopComposition"] = connectionInfo.Inheritance.EnableDesktopComposition; + dataRow["InheritEnableFontSmoothing"] = connectionInfo.Inheritance.EnableFontSmoothing; + dataRow["InheritExtApp"] = connectionInfo.Inheritance.ExtApp; + dataRow["InheritExternalCredentialProvider"] = connectionInfo.Inheritance.ExternalCredentialProvider; + dataRow["InheritFavorite"] = connectionInfo.Inheritance.Favorite; + dataRow["InheritICAEncryptionStrength"] = false; + dataRow["InheritIcon"] = connectionInfo.Inheritance.Icon; + dataRow["InheritLoadBalanceInfo"] = connectionInfo.Inheritance.LoadBalanceInfo; + dataRow["InheritMacAddress"] = connectionInfo.Inheritance.MacAddress; + dataRow["InheritOpeningCommand"] = connectionInfo.Inheritance.OpeningCommand; + dataRow["InheritOpeningCommand"] = connectionInfo.Inheritance.OpeningCommand; + dataRow["InheritPanel"] = connectionInfo.Inheritance.Panel; + dataRow["InheritPassword"] = connectionInfo.Inheritance.Password; + dataRow["InheritPort"] = connectionInfo.Inheritance.Port; + dataRow["InheritPostExtApp"] = connectionInfo.Inheritance.PostExtApp; + dataRow["InheritPreExtApp"] = connectionInfo.Inheritance.PreExtApp; + dataRow["InheritProtocol"] = connectionInfo.Inheritance.Protocol; + dataRow["InheritPuttySession"] = connectionInfo.Inheritance.PuttySession; + dataRow["InheritRDGatewayDomain"] = connectionInfo.Inheritance.RDGatewayDomain; + dataRow["InheritRDGatewayExternalCredentialProvider"] = connectionInfo.Inheritance.RDGatewayExternalCredentialProvider; + dataRow["InheritRDGatewayHostname"] = connectionInfo.Inheritance.RDGatewayHostname; + dataRow["InheritRDGatewayPassword"] = connectionInfo.Inheritance.RDGatewayPassword; + dataRow["InheritRDGatewayUsageMethod"] = connectionInfo.Inheritance.RDGatewayUsageMethod; + dataRow["InheritRDGatewayUseConnectionCredentials"] = connectionInfo.Inheritance.RDGatewayUseConnectionCredentials; + dataRow["InheritRDGatewayUserViaAPI"] = connectionInfo.Inheritance.RDGatewayUserViaAPI; + dataRow["InheritRDGatewayUsername"] = connectionInfo.Inheritance.RDGatewayUsername; + dataRow["InheritRDPAlertIdleTimeout"] = connectionInfo.Inheritance.RDPAlertIdleTimeout; + dataRow["InheritRDPAuthenticationLevel"] = connectionInfo.Inheritance.RDPAuthenticationLevel; + dataRow["InheritRDPMinutesToIdleTimeout"] = connectionInfo.Inheritance.RDPMinutesToIdleTimeout; + dataRow["InheritRdpVersion"] = connectionInfo.Inheritance.RdpVersion; + dataRow["InheritRedirectAudioCapture"] = connectionInfo.Inheritance.RedirectAudioCapture; + dataRow["InheritRedirectClipboard"] = connectionInfo.Inheritance.RedirectClipboard; + dataRow["InheritRedirectDiskDrives"] = connectionInfo.Inheritance.RedirectDiskDrives; + dataRow["InheritRedirectDiskDrivesCustom"] = connectionInfo.Inheritance.RedirectDiskDrivesCustom; + dataRow["InheritRedirectKeys"] = connectionInfo.Inheritance.RedirectKeys; + dataRow["InheritRedirectPorts"] = connectionInfo.Inheritance.RedirectPorts; + dataRow["InheritRedirectPrinters"] = connectionInfo.Inheritance.RedirectPrinters; + dataRow["InheritRedirectSmartCards"] = connectionInfo.Inheritance.RedirectSmartCards; + dataRow["InheritRedirectSound"] = connectionInfo.Inheritance.RedirectSound; + dataRow["InheritRenderingEngine"] = connectionInfo.Inheritance.RenderingEngine; + dataRow["InheritResolution"] = connectionInfo.Inheritance.Resolution; + dataRow["InheritSSHOptions"] = connectionInfo.Inheritance.SSHOptions; + dataRow["InheritSSHTunnelConnectionName"] = connectionInfo.Inheritance.SSHTunnelConnectionName; + dataRow["InheritSoundQuality"] = connectionInfo.Inheritance.SoundQuality; + dataRow["InheritUseConsoleSession"] = connectionInfo.Inheritance.UseConsoleSession; + dataRow["InheritUseCredSsp"] = connectionInfo.Inheritance.UseCredSsp; + dataRow["InheritUseEnhancedMode"] = connectionInfo.Inheritance.UseEnhancedMode; + dataRow["InheritUseRCG"] = connectionInfo.Inheritance.UseRCG; + dataRow["InheritUseRestrictedAdmin"] = connectionInfo.Inheritance.UseRestrictedAdmin; + dataRow["InheritUseVmId"] = connectionInfo.Inheritance.UseVmId; + dataRow["InheritUserField"] = connectionInfo.Inheritance.UserField; + dataRow["InheritUserViaAPI"] = connectionInfo.Inheritance.UserViaAPI; + dataRow["InheritUsername"] = connectionInfo.Inheritance.Username; + dataRow["InheritVNCAuthMode"] = connectionInfo.Inheritance.VNCAuthMode; + dataRow["InheritVNCColors"] = connectionInfo.Inheritance.VNCColors; + dataRow["InheritVNCCompression"] = connectionInfo.Inheritance.VNCCompression; + dataRow["InheritVNCEncoding"] = connectionInfo.Inheritance.VNCEncoding; + dataRow["InheritVNCProxyIP"] = connectionInfo.Inheritance.VNCProxyIP; + dataRow["InheritVNCProxyPassword"] = connectionInfo.Inheritance.VNCProxyPassword; + dataRow["InheritVNCProxyPort"] = connectionInfo.Inheritance.VNCProxyPort; + dataRow["InheritVNCProxyType"] = connectionInfo.Inheritance.VNCProxyType; + dataRow["InheritVNCProxyUsername"] = connectionInfo.Inheritance.VNCProxyUsername; + dataRow["InheritVNCSmartSizeMode"] = connectionInfo.Inheritance.VNCSmartSizeMode; + dataRow["InheritVNCViewOnly"] = connectionInfo.Inheritance.VNCViewOnly; + dataRow["InheritVmId"] = connectionInfo.Inheritance.VmId; + dataRow["InheritCacheBitmaps"] = connectionInfo.Inheritance.CacheBitmaps; + } + else + { + dataRow["InheritAutomaticResize"] = false; + dataRow["InheritColors"] = false; + dataRow["InheritDescription"] = false; + dataRow["InheritDisableCursorBlinking"] = false; + dataRow["InheritDisableCursorShadow"] = false; + dataRow["InheritDisableFullWindowDrag"] = false; + dataRow["InheritDisableMenuAnimations"] = false; + dataRow["InheritDisplayThemes"] = false; + dataRow["InheritDisplayWallpaper"] = false; + dataRow["InheritDomain"] = false; + dataRow["InheritEnableDesktopComposition"] = false; + dataRow["InheritEnableFontSmoothing"] = false; + dataRow["InheritExtApp"] = false; + dataRow["InheritExternalCredentialProvider"] = false; + dataRow["InheritFavorite"] = false; + dataRow["InheritICAEncryptionStrength"] = false; + dataRow["InheritIcon"] = false; + dataRow["InheritLoadBalanceInfo"] = false; + dataRow["InheritMacAddress"] = false; + dataRow["InheritOpeningCommand"] = false; + dataRow["InheritPanel"] = false; + dataRow["InheritPassword"] = false; + dataRow["InheritPort"] = false; + dataRow["InheritPostExtApp"] = false; + dataRow["InheritPreExtApp"] = false; + dataRow["InheritProtocol"] = false; + dataRow["InheritPuttySession"] = false; + dataRow["InheritRDGatewayDomain"] = false; + dataRow["InheritRDGatewayExternalCredentialProvider"] = false; + dataRow["InheritRDGatewayHostname"] = false; + dataRow["InheritRDGatewayPassword"] = false; + dataRow["InheritRDGatewayUsageMethod"] = false; + dataRow["InheritRDGatewayUseConnectionCredentials"] = false; + dataRow["InheritRDGatewayUserViaAPI"] = false; + dataRow["InheritRDGatewayUsername"] = false; + dataRow["InheritRDPAlertIdleTimeout"] = false; + dataRow["InheritRDPAuthenticationLevel"] = false; + dataRow["InheritRDPMinutesToIdleTimeout"] = false; + dataRow["InheritRdpVersion"] = false; + dataRow["InheritRedirectAudioCapture"] = false; + dataRow["InheritRedirectClipboard"] = false; + dataRow["InheritRedirectDiskDrives"] = false; + dataRow["InheritRedirectDiskDrivesCustom"] = false; + dataRow["InheritRedirectKeys"] = false; + dataRow["InheritRedirectPorts"] = false; + dataRow["InheritRedirectPrinters"] = false; + dataRow["InheritRedirectSmartCards"] = false; + dataRow["InheritRedirectSound"] = false; + dataRow["InheritRenderingEngine"] = false; + dataRow["InheritResolution"] = false; + dataRow["InheritSSHOptions"] = false; + dataRow["InheritSSHTunnelConnectionName"] = false; + dataRow["InheritSoundQuality"] = false; + dataRow["InheritUseConsoleSession"] = false; + dataRow["InheritUseCredSsp"] = false; + dataRow["InheritUseRCG"] = false; + dataRow["InheritUseRestrictedAdmin"] = false; + dataRow["InheritUserField"] = false; + dataRow["InheritUserViaAPI"] = false; + dataRow["InheritUsername"] = false; + dataRow["InheritVNCAuthMode"] = false; + dataRow["InheritVNCColors"] = false; + dataRow["InheritVNCCompression"] = false; + dataRow["InheritVNCEncoding"] = false; + dataRow["InheritVNCProxyIP"] = false; + dataRow["InheritVNCProxyPassword"] = false; + dataRow["InheritVNCProxyPort"] = false; + dataRow["InheritVNCProxyType"] = false; + dataRow["InheritVNCProxyUsername"] = false; + dataRow["InheritVNCSmartSizeMode"] = false; + dataRow["InheritVNCViewOnly"] = false; + dataRow["InheritCacheBitmaps"] = false; + } + + if (isNewRow) _dataTable.Rows.Add(dataRow); + } + } } \ No newline at end of file diff --git a/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/LocalConnectionPropertiesModel.cs b/mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/LocalConnectionPropertiesModel.cs similarity index 99% rename from mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/LocalConnectionPropertiesModel.cs rename to mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/LocalConnectionPropertiesModel.cs index 1df5fa90..f29b0311 100644 --- a/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/LocalConnectionPropertiesModel.cs +++ b/mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/LocalConnectionPropertiesModel.cs @@ -1,4 +1,4 @@ -namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql +namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql { public class LocalConnectionPropertiesModel { diff --git a/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/LocalConnectionPropertiesXmlSerializer.cs b/mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/LocalConnectionPropertiesXmlSerializer.cs similarity index 97% rename from mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/LocalConnectionPropertiesXmlSerializer.cs rename to mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/LocalConnectionPropertiesXmlSerializer.cs index c644b73b..83dd9cd1 100644 --- a/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/LocalConnectionPropertiesXmlSerializer.cs +++ b/mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/LocalConnectionPropertiesXmlSerializer.cs @@ -6,7 +6,7 @@ using System.Text; using System.Xml; using System.Xml.Linq; -namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql +namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql { public class LocalConnectionPropertiesXmlSerializer : ISerializer, string>, diff --git a/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/SqlConnectionListMetaData.cs b/mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/SqlConnectionListMetaData.cs similarity index 79% rename from mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/SqlConnectionListMetaData.cs rename to mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/SqlConnectionListMetaData.cs index 525c811c..e4281d63 100644 --- a/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/SqlConnectionListMetaData.cs +++ b/mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/SqlConnectionListMetaData.cs @@ -1,6 +1,6 @@ using System; -namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql +namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql { public class SqlConnectionListMetaData { diff --git a/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/SqlDatabaseMetaDataRetriever.cs b/mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/SqlDatabaseMetaDataRetriever.cs similarity index 54% rename from mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/SqlDatabaseMetaDataRetriever.cs rename to mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/SqlDatabaseMetaDataRetriever.cs index c7eef763..784aff7a 100644 --- a/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/SqlDatabaseMetaDataRetriever.cs +++ b/mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/SqlDatabaseMetaDataRetriever.cs @@ -2,6 +2,7 @@ using System.Data.Common; using System.Globalization; using System.Runtime.Versioning; +using System.Security; using mRemoteNG.App; using mRemoteNG.App.Info; using mRemoteNG.Config.DatabaseConnectors; @@ -11,7 +12,7 @@ using mRemoteNG.Security.SymmetricEncryption; using mRemoteNG.Tools; using mRemoteNG.Tree.Root; -namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql +namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Sql { [SupportedOSPlatform("windows")] public class SqlDatabaseMetaDataRetriever @@ -48,7 +49,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql { Name = dbDataReader["Name"] as string ?? "", Protected = dbDataReader["Protected"] as string ?? "", - Export = (bool)dbDataReader["Export"], + Export = dbDataReader["Export"].Equals(1), ConfVersion = new Version(Convert.ToString(dbDataReader["confVersion"], CultureInfo.InvariantCulture) ?? string.Empty) }; } @@ -68,13 +69,18 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql public void WriteDatabaseMetaData(RootNodeInfo rootTreeNode, IDatabaseConnector databaseConnector) { + // TODO: use transaction + var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); + string strProtected; + if (rootTreeNode != null) { if (rootTreeNode.Password) { - var password = rootTreeNode.PasswordString.ConvertToSecureString(); + SecureString password = rootTreeNode.PasswordString.ConvertToSecureString(); + strProtected = cryptographyProvider.Encrypt("ThisIsProtected", password); } else @@ -87,7 +93,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql strProtected = cryptographyProvider.Encrypt("ThisIsNotProtected", Runtime.EncryptionKey); } - var cmd = databaseConnector.DbCommand("DELETE FROM tblRoot"); + var cmd = databaseConnector.DbCommand("TRUNCATE TABLE tblRoot"); cmd.ExecuteNonQuery(); if (rootTreeNode != null) @@ -95,7 +101,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql cmd = databaseConnector.DbCommand( "INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES('" + MiscTools.PrepareValueForDB(rootTreeNode.Name) + "', 0, '" + strProtected + "','" + - ConnectionsFileInfo.ConnectionFileVersion.ToString() + "')"); + ConnectionsFileInfo.ConnectionFileVersion + "')"); + cmd.ExecuteNonQuery(); } else @@ -112,8 +119,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql { // ANSI SQL way. Works in PostgreSQL, MSSQL, MySQL. var cmd = databaseConnector.DbCommand("select case when exists((select * from information_schema.tables where table_name = '" + tableName + "')) then 1 else 0 end"); - cmd.ExecuteNonQuery(); - exists = (int)(long)cmd.ExecuteScalar()! == 1; + var cmdResult = Convert.ToInt16(cmd.ExecuteScalar()); + exists = (cmdResult == 1); } catch { @@ -121,7 +128,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql { // Other RDBMS. Graceful degradation exists = true; - var cmdOthers = databaseConnector.DbCommand("select 1 from " + tableName + " where 1 = 0"); + DbCommand cmdOthers = databaseConnector.DbCommand("select 1 from " + tableName + " where 1 = 0"); cmdOthers.ExecuteNonQuery(); } catch @@ -136,9 +143,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql private void InitializeDatabaseSchema(IDatabaseConnector databaseConnector) { string sql; - - var t = databaseConnector.GetType(); - + if (databaseConnector.GetType() == typeof(MSSqlDatabaseConnector)) { sql = @" @@ -204,13 +209,14 @@ CREATE TABLE [dbo].[tblCons] ( [RdpVersion] varchar(10) NULL, [RedirectAudioCapture] bit NOT NULL, [RedirectClipboard] bit NOT NULL, - [RedirectDiskDrives] bit NOT NULL, + [RedirectDiskDrives] varchar(32) DEFAULT NULL, + [RedirectDiskDrivesCustom] varchar(32) DEFAULT NULL, [RedirectKeys] bit NOT NULL, [RedirectPorts] bit NOT NULL, [RedirectPrinters] bit NOT NULL, [RedirectSmartCards] bit NOT NULL, [RedirectSound] varchar(64) NOT NULL, - [RenderingEngine] varchar(16) NULL, + [RenderingEngine] varchar(32) NULL, [Resolution] varchar(32) NOT NULL, [SSHOptions] varchar(1024) NOT NULL, [SSHTunnelConnectionName] varchar(128) NOT NULL, @@ -275,6 +281,7 @@ CREATE TABLE [dbo].[tblCons] ( [InheritRedirectAudioCapture] bit NOT NULL, [InheritRedirectClipboard] bit NOT NULL, [InheritRedirectDiskDrives] bit NOT NULL, + [InheritRedirectDiskDrivesCustom] bit NOT NULL, [InheritRedirectKeys] bit NOT NULL, [InheritRedirectPorts] bit NOT NULL, [InheritRedirectPrinters] bit NOT NULL, @@ -358,24 +365,24 @@ CREATE TABLE `tblCons` ( `LastChange` datetime NOT NULL, `Name` varchar(128) NOT NULL, `Type` varchar(32) NOT NULL, - `Expanded` tinyint(1) NOT NULL, - `AutomaticResize` tinyint(1) NOT NULL DEFAULT 1, - `CacheBitmaps` tinyint(1) NOT NULL, + `Expanded` tinyint NOT NULL, + `AutomaticResize` tinyint NOT NULL DEFAULT 1, + `CacheBitmaps` tinyint NOT NULL, `Colors` varchar(32) NOT NULL, - `ConnectToConsole` tinyint(1) NOT NULL, - `Connected` tinyint(1) NOT NULL, + `ConnectToConsole` tinyint NOT NULL, + `Connected` tinyint NOT NULL, `Description` varchar(1024) DEFAULT NULL, - `DisableCursorBlinking` tinyint(1) NOT NULL, - `DisableCursorShadow` tinyint(1) NOT NULL, - `DisableFullWindowDrag` tinyint(1) NOT NULL, - `DisableMenuAnimations` tinyint(1) NOT NULL, - `DisplayThemes` tinyint(1) NOT NULL, - `DisplayWallpaper` tinyint(1) NOT 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(1) NOT NULL, - `EnableFontSmoothing` tinyint(1) NOT NULL, + `EnableDesktopComposition` tinyint NOT NULL, + `EnableFontSmoothing` tinyint NOT NULL, `ExtApp` varchar(256) DEFAULT NULL, - `Favorite` tinyint(1) NOT NULL, + `Favorite` tinyint NOT NULL, `Hostname` varchar(512) DEFAULT NULL, `Icon` varchar(128) NOT NULL, `LoadBalanceInfo` varchar(1024) DEFAULT NULL, @@ -394,26 +401,27 @@ CREATE TABLE `tblCons` ( `RDGatewayUsageMethod` varchar(32) NOT NULL, `RDGatewayUseConnectionCredentials` varchar(32) NOT NULL, `RDGatewayUsername` varchar(512) DEFAULT NULL, - `RDPAlertIdleTimeout` tinyint(1) NOT NULL, + `RDPAlertIdleTimeout` tinyint NOT NULL, `RDPAuthenticationLevel` varchar(32) NOT NULL, `RDPMinutesToIdleTimeout` int(11) NOT NULL, `RdpVersion` varchar(10) DEFAULT NULL, - `RedirectAudioCapture` tinyint(1) NOT NULL, - `RedirectClipboard` tinyint(1) NOT NULL, - `RedirectDiskDrives` tinyint(1) NOT NULL, - `RedirectKeys` tinyint(1) NOT NULL, - `RedirectPorts` tinyint(1) NOT NULL, - `RedirectPrinters` tinyint(1) NOT NULL, - `RedirectSmartCards` tinyint(1) NOT NULL, + `RedirectAudioCapture` tinyint NOT NULL, + `RedirectClipboard` tinyint NOT NULL, + `RedirectDiskDrives` varchar(32) DEFAULT NULL, + `RedirectDiskDrivesCustom` varchar(32) DEFAULT NULL, + `RedirectKeys` tinyint NOT NULL, + `RedirectPorts` tinyint NOT NULL, + `RedirectPrinters` tinyint NOT NULL, + `RedirectSmartCards` tinyint NOT NULL, `RedirectSound` varchar(64) NOT NULL, - `RenderingEngine` varchar(16) DEFAULT NULL, + `RenderingEngine` varchar(32) DEFAULT NULL, `Resolution` varchar(32) NOT NULL, `SSHOptions` varchar(1024) NOT NULL, `SSHTunnelConnectionName` varchar(128) NOT NULL, `SoundQuality` varchar(20) NOT NULL, - `UseCredSsp` tinyint(1) NOT NULL, - `UseEnhancedMode` tinyint(1) NOT NULL, - `UseVmId` tinyint(1) NOT NULL, + `UseCredSsp` tinyint NOT NULL, + `UseEnhancedMode` tinyint NOT NULL, + `UseVmId` tinyint NOT NULL, `UserField` varchar(256) DEFAULT NULL, `Username` varchar(512) DEFAULT NULL, `VNCAuthMode` varchar(10) DEFAULT NULL, @@ -426,85 +434,86 @@ CREATE TABLE `tblCons` ( `VNCProxyType` varchar(20) DEFAULT NULL, `VNCProxyUsername` varchar(512) DEFAULT NULL, `VNCSmartSizeMode` varchar(20) DEFAULT NULL, - `VNCViewOnly` tinyint(1) NOT NULL, + `VNCViewOnly` tinyint NOT NULL, `VmId` varchar(512) DEFAULT NULL, `ICAEncryptionStrength` varchar(32) NOT NULL, - `InheritAutomaticResize` tinyint(1) NOT NULL, - `InheritCacheBitmaps` tinyint(1) NOT NULL, - `InheritColors` tinyint(1) NOT NULL, - `InheritDescription` tinyint(1) NOT NULL, - `InheritDisableCursorBlinking` tinyint(1) NOT NULL, - `InheritDisableCursorShadow` tinyint(1) NOT NULL, - `InheritDisableFullWindowDrag` tinyint(1) NOT NULL, - `InheritDisableMenuAnimations` tinyint(1) NOT NULL, - `InheritDisplayThemes` tinyint(1) NOT NULL, - `InheritDisplayWallpaper` tinyint(1) NOT NULL, - `InheritDomain` tinyint(1) NOT NULL, - `InheritEnableDesktopComposition` tinyint(1) NOT NULL, - `InheritEnableFontSmoothing` tinyint(1) NOT NULL, - `InheritExtApp` tinyint(1) NOT NULL, - `InheritFavorite` tinyint(1) NOT NULL, - `InheritICAEncryptionStrength` tinyint(1) NOT NULL, - `InheritIcon` tinyint(1) NOT NULL, - `InheritLoadBalanceInfo` tinyint(1) NOT NULL, - `InheritMacAddress` tinyint(1) NOT NULL, - `InheritOpeningCommand` tinyint(1) NOT NULL, - `InheritPanel` tinyint(1) NOT NULL, - `InheritPassword` tinyint(1) NOT NULL, - `InheritPort` tinyint(1) NOT NULL, - `InheritPostExtApp` tinyint(1) NOT NULL, - `InheritPreExtApp` tinyint(1) NOT NULL, - `InheritProtocol` tinyint(1) NOT NULL, - `InheritPuttySession` tinyint(1) NOT NULL, - `InheritRDGatewayDomain` tinyint(1) NOT NULL, - `InheritRDGatewayHostname` tinyint(1) NOT NULL, - `InheritRDGatewayPassword` tinyint(1) NOT NULL, - `InheritRDGatewayUsageMethod` tinyint(1) NOT NULL, - `InheritRDGatewayUseConnectionCredentials` tinyint(1) NOT NULL, - `InheritRDGatewayExternalCredentialProvider` tinyint(1) NOT NULL, - `InheritRDGatewayUsername` tinyint(1) NOT NULL, - `InheritRDGatewayUserViaAPI` tinyint(1) NOT NULL, - `InheritRDPAlertIdleTimeout` tinyint(1) NOT NULL, - `InheritRDPAuthenticationLevel` tinyint(1) NOT NULL, - `InheritRDPMinutesToIdleTimeout` tinyint(1) NOT NULL, - `InheritRdpVersion` tinyint(1) NOT NULL, - `InheritRedirectAudioCapture` tinyint(1) NOT NULL, - `InheritRedirectClipboard` tinyint(1) NOT NULL, - `InheritRedirectDiskDrives` tinyint(1) NOT NULL, - `InheritRedirectKeys` tinyint(1) NOT NULL, - `InheritRedirectPorts` tinyint(1) NOT NULL, - `InheritRedirectPrinters` tinyint(1) NOT NULL, - `InheritRedirectSmartCards` tinyint(1) NOT NULL, - `InheritRedirectSound` tinyint(1) NOT NULL, - `InheritRenderingEngine` tinyint(1) NOT NULL, - `InheritResolution` tinyint(1) NOT NULL, - `InheritSSHOptions` tinyint(1) NOT NULL, - `InheritSSHTunnelConnectionName` tinyint(1) NOT NULL, - `InheritSoundQuality` tinyint(1) NOT NULL, - `InheritUseConsoleSession` tinyint(1) NOT NULL, - `InheritUseCredSsp` tinyint(1) NOT NULL, - `InheritUseRestrictedAdmin` tinyint(1) NOT NULL, - `InheritUseRCG` tinyint(1) NOT NULL, - `InheritExternalCredentialProvider` tinyint(1) NOT NULL, - `InheritUserViaAPI` tinyint(1) NOT NULL, - `UseRestrictedAdmin` tinyint(1) NOT NULL, - `UseRCG` tinyint(1) NOT NULL, - `InheritUseEnhancedMode` tinyint(1) DEFAULT NULL, - `InheritUseVmId` tinyint(1) DEFAULT NULL, - `InheritUserField` tinyint(1) NOT NULL, - `InheritUsername` tinyint(1) NOT NULL, - `InheritVNCAuthMode` tinyint(1) NOT NULL, - `InheritVNCColors` tinyint(1) NOT NULL, - `InheritVNCCompression` tinyint(1) NOT NULL, - `InheritVNCEncoding` tinyint(1) NOT NULL, - `InheritVNCProxyIP` tinyint(1) NOT NULL, - `InheritVNCProxyPassword` tinyint(1) NOT NULL, - `InheritVNCProxyPort` tinyint(1) NOT NULL, - `InheritVNCProxyType` tinyint(1) NOT NULL, - `InheritVNCProxyUsername` tinyint(1) NOT NULL, - `InheritVNCSmartSizeMode` tinyint(1) NOT NULL, - `InheritVNCViewOnly` tinyint(1) NOT NULL, - `InheritVmId` tinyint(1) NOT NULL, + `InheritAutomaticResize` tinyint NOT NULL, + `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, + `InheritMacAddress` tinyint NOT NULL, + `InheritOpeningCommand` 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, + `InheritRDGatewayExternalCredentialProvider` tinyint NOT NULL, + `InheritRDGatewayUsername` tinyint NOT NULL, + `InheritRDGatewayUserViaAPI` tinyint NOT NULL, + `InheritRDPAlertIdleTimeout` tinyint NOT NULL, + `InheritRDPAuthenticationLevel` tinyint NOT NULL, + `InheritRDPMinutesToIdleTimeout` tinyint NOT NULL, + `InheritRdpVersion` tinyint NOT NULL, + `InheritRedirectAudioCapture` tinyint NOT NULL, + `InheritRedirectClipboard` tinyint NOT NULL, + `InheritRedirectDiskDrives` tinyint NOT NULL, + `InheritRedirectDiskDrivesCustom` 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, + `InheritUseRestrictedAdmin` tinyint NOT NULL, + `InheritUseRCG` tinyint NOT NULL, + `InheritExternalCredentialProvider` tinyint NOT NULL, + `InheritUserViaAPI` tinyint NOT NULL, + `UseRestrictedAdmin` tinyint NOT NULL, + `UseRCG` 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 NOT NULL, `StartProgram` varchar(512) DEFAULT NULL, `StartProgramWorkDir` varchar(512) DEFAULT NULL, `EC2Region` varchar(32) DEFAULT NULL, @@ -526,7 +535,7 @@ DROP TABLE IF EXISTS `tblRoot`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `tblRoot` ( `Name` varchar(2048) NOT NULL, - `Export` tinyint(1) NOT NULL, + `Export` tinyint NOT NULL, `Protected` varchar(4048) NOT NULL, `ConfVersion` varchar(15) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; @@ -555,6 +564,227 @@ 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 { @@ -567,7 +797,3 @@ CREATE TABLE `tblUpdate` ( } } - -//// MySql.Data.MySqlClient.MySqlException: 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(`ConstantID`), -//UNIQUE(`ID`) -// ) ENGINE = InnoDB AUTO_INCREMENT = 3324 DEFAULT ' at line 156' \ No newline at end of file