Files
mRemoteNG/mRemoteV1/Config/Config.Connections.Load.vb
Riley McArdle 5d63ec6d2a Fix issue MR-459 - Maximized -> Minimized -> Restored results in mangled active display
Fix issue MR-463 - Add support for LoadBalanceInfo to RDP
2013-05-08 19:17:51 -05:00

1099 lines
57 KiB
VB.net

Imports System.Windows.Forms
Imports System.Xml
Imports System.Globalization
Imports mRemoteNG.App.Runtime
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Imports PSTaskDialog
Namespace Config
Namespace Connections
Public Class Load
#Region "Private Properties"
Private xDom As XmlDocument
Private confVersion As Double
Private pW As String = App.Info.General.EncryptionKey
Private sqlCon As SqlConnection
Private sqlQuery As SqlCommand
Private sqlRd As SqlDataReader
Private selNode As TreeNode
#End Region
#Region "Public Properties"
Private _UseSQL As Boolean
Public Property UseSQL() As Boolean
Get
Return _UseSQL
End Get
Set(ByVal value As Boolean)
_UseSQL = value
End Set
End Property
Private _SQLHost As String
Public Property SQLHost() As String
Get
Return _SQLHost
End Get
Set(ByVal value As String)
_SQLHost = value
End Set
End Property
Private _SQLDatabaseName As String
Public Property SQLDatabaseName() As String
Get
Return _SQLDatabaseName
End Get
Set(ByVal value As String)
_SQLDatabaseName = value
End Set
End Property
Private _SQLUsername As String
Public Property SQLUsername() As String
Get
Return _SQLUsername
End Get
Set(ByVal value As String)
_SQLUsername = value
End Set
End Property
Private _SQLPassword As String
Public Property SQLPassword() As String
Get
Return _SQLPassword
End Get
Set(ByVal value As String)
_SQLPassword = value
End Set
End Property
Private _SQLUpdate As Boolean
Public Property SQLUpdate() As Boolean
Get
Return _SQLUpdate
End Get
Set(ByVal value As Boolean)
_SQLUpdate = value
End Set
End Property
Private _PreviousSelected As String
Public Property PreviousSelected() As String
Get
Return _PreviousSelected
End Get
Set(ByVal value As String)
_PreviousSelected = value
End Set
End Property
Private _ConnectionFileName As String
Public Property ConnectionFileName() As String
Get
Return Me._ConnectionFileName
End Get
Set(ByVal value As String)
Me._ConnectionFileName = value
End Set
End Property
Private _RootTreeNode As TreeNode
Public Property RootTreeNode() As TreeNode
Get
Return Me._RootTreeNode
End Get
Set(ByVal value As TreeNode)
Me._RootTreeNode = value
End Set
End Property
Private _ConnectionList As Connection.List
Public Property ConnectionList() As Connection.List
Get
Return Me._ConnectionList
End Get
Set(ByVal value As Connection.List)
Me._ConnectionList = value
End Set
End Property
Private _ContainerList As Container.List
Public Property ContainerList() As Container.List
Get
Return Me._ContainerList
End Get
Set(ByVal value As Container.List)
Me._ContainerList = value
End Set
End Property
Private _PreviousConnectionList As Connection.List
Public Property PreviousConnectionList() As Connection.List
Get
Return _PreviousConnectionList
End Get
Set(ByVal value As Connection.List)
_PreviousConnectionList = value
End Set
End Property
Private _PreviousContainerList As Container.List
Public Property PreviousContainerList() As Container.List
Get
Return _PreviousContainerList
End Get
Set(ByVal value As Container.List)
_PreviousContainerList = value
End Set
End Property
#End Region
#Region "Public Methods"
Public Sub Load(ByVal import As Boolean)
If _UseSQL = True Then
LoadFromSQL()
SetMainFormText("SQL Server")
Else
Dim strCons As String = DecryptCompleteFile()
LoadFromXML(strCons, import)
End If
If import = False Then
SetMainFormText(ConnectionFileName)
PuttySessions.AddSessionsToTree()
End If
End Sub
#End Region
#Region "SQL"
Private Sub LoadFromSQL()
Try
App.Runtime.IsConnectionsFileLoaded = False
If _SQLUsername <> "" Then
sqlCon = New SqlConnection("Data Source=" & _SQLHost & ";Initial Catalog=" & _SQLDatabaseName & ";User Id=" & _SQLUsername & ";Password=" & _SQLPassword)
Else
sqlCon = New SqlConnection("Data Source=" & _SQLHost & ";Initial Catalog=" & _SQLDatabaseName & ";Integrated Security=True")
End If
sqlCon.Open()
sqlQuery = New SqlCommand("SELECT * FROM tblRoot", sqlCon)
sqlRd = sqlQuery.ExecuteReader(CommandBehavior.CloseConnection)
sqlRd.Read()
If sqlRd.HasRows = False Then
App.Runtime.SaveConnections()
sqlQuery = New SqlCommand("SELECT * FROM tblRoot", sqlCon)
sqlRd = sqlQuery.ExecuteReader(CommandBehavior.CloseConnection)
sqlRd.Read()
End If
confVersion = Convert.ToDouble(sqlRd.Item("confVersion"), CultureInfo.InvariantCulture)
Const maxSupportedSchemaVersion As Double = 2.5
If confVersion > maxSupportedSchemaVersion Then
cTaskDialog.ShowTaskDialogBox(frmMain, Application.ProductName, "Incompatible database schema", String.Format("The database schema on the server is not supported. Please upgrade to a newer version of {0}.", Application.ProductName), String.Format("Schema Version: {1}{0}Highest Supported Version: {2}", vbNewLine, confVersion.ToString(), maxSupportedSchemaVersion.ToString()), "", "", "", "", eTaskDialogButtons.OK, eSysIcons.Error, Nothing)
Throw New Exception(String.Format("Incompatible database schema (schema version {0}).", confVersion))
End If
Dim rootNode As TreeNode
rootNode = New TreeNode(sqlRd.Item("Name"))
Dim rInfo As New Root.Info(Root.Info.RootType.Connection)
rInfo.Name = rootNode.Text
rInfo.TreeNode = rootNode
rootNode.Tag = rInfo
rootNode.ImageIndex = Images.Enums.TreeImage.Root
rootNode.SelectedImageIndex = Images.Enums.TreeImage.Root
If Security.Crypt.Decrypt(sqlRd.Item("Protected"), pW) <> "ThisIsNotProtected" Then
If Authenticate(sqlRd.Item("Protected"), False, rInfo) = False Then
My.Settings.LoadConsFromCustomLocation = False
My.Settings.CustomConsPath = ""
rootNode.Remove()
Exit Sub
End If
End If
'Me._RootTreeNode.Text = rootNode.Text
'Me._RootTreeNode.Tag = rootNode.Tag
'Me._RootTreeNode.ImageIndex = Images.Enums.TreeImage.Root
'Me._RootTreeNode.SelectedImageIndex = Images.Enums.TreeImage.Root
sqlRd.Close()
Windows.treeForm.tvConnections.BeginUpdate()
' SECTION 3. Populate the TreeView with the DOM nodes.
AddNodesFromSQL(rootNode)
'AddNodeFromXml(xDom.DocumentElement, Me._RootTreeNode)
rootNode.Expand()
'expand containers
For Each contI As Container.Info In Me._ContainerList
If contI.IsExpanded = True Then
contI.TreeNode.Expand()
End If
Next
Windows.treeForm.tvConnections.EndUpdate()
'open connections from last mremote session
If My.Settings.OpenConsFromLastSession = True And My.Settings.NoReconnect = False Then
For Each conI As Connection.Info In Me._ConnectionList
If conI.PleaseConnect = True Then
App.Runtime.OpenConnection(conI)
End If
Next
End If
'Tree.Node.TreeView.Nodes.Clear()
'Tree.Node.TreeView.Nodes.Add(rootNode)
AddNodeToTree(rootNode)
SetSelectedNode(selNode)
App.Runtime.IsConnectionsFileLoaded = True
'App.Runtime.Windows.treeForm.InitialRefresh()
Catch ex As Exception
Throw
Finally
If sqlCon IsNot Nothing Then
sqlCon.Close()
End If
End Try
End Sub
Private Delegate Sub AddNodeToTreeCB(ByVal TreeNode As TreeNode)
Private Sub AddNodeToTree(ByVal TreeNode As TreeNode)
If Tree.Node.TreeView.InvokeRequired Then
Dim d As New AddNodeToTreeCB(AddressOf AddNodeToTree)
App.Runtime.Windows.treeForm.Invoke(d, New Object() {TreeNode})
Else
App.Runtime.Windows.treeForm.tvConnections.Nodes.Clear()
App.Runtime.Windows.treeForm.tvConnections.Nodes.Add(TreeNode)
App.Runtime.Windows.treeForm.InitialRefresh()
End If
End Sub
Private Delegate Sub SetSelectedNodeCB(ByVal TreeNode As TreeNode)
Private Sub SetSelectedNode(ByVal TreeNode As TreeNode)
If Tree.Node.TreeView.InvokeRequired Then
Dim d As New SetSelectedNodeCB(AddressOf SetSelectedNode)
App.Runtime.Windows.treeForm.Invoke(d, New Object() {TreeNode})
Else
App.Runtime.Windows.treeForm.tvConnections.SelectedNode = TreeNode
End If
End Sub
Private Sub AddNodesFromSQL(ByVal baseNode As TreeNode)
Try
sqlCon.Open()
sqlQuery = New SqlCommand("SELECT * FROM tblCons ORDER BY PositionID ASC", sqlCon)
sqlRd = sqlQuery.ExecuteReader(CommandBehavior.CloseConnection)
If sqlRd.HasRows = False Then
Exit Sub
End If
Dim tNode As TreeNode
While sqlRd.Read
tNode = New TreeNode(sqlRd.Item("Name"))
'baseNode.Nodes.Add(tNode)
If Tree.Node.GetNodeTypeFromString(sqlRd.Item("Type")) = Tree.Node.Type.Connection Then
Dim conI As Connection.Info = GetConnectionInfoFromSQL()
conI.TreeNode = tNode
'conI.Parent = _previousContainer 'NEW
Me._ConnectionList.Add(conI)
tNode.Tag = conI
If SQLUpdate = True Then
Dim prevCon As Connection.Info = PreviousConnectionList.FindByConstantID(conI.ConstantID)
If prevCon IsNot Nothing Then
For Each prot As Connection.Protocol.Base In prevCon.OpenConnections
prot.InterfaceControl.Info = conI
conI.OpenConnections.Add(prot)
Next
If conI.OpenConnections.Count > 0 Then
tNode.ImageIndex = Images.Enums.TreeImage.ConnectionOpen
tNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionOpen
Else
tNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed
tNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionClosed
End If
Else
tNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed
tNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionClosed
End If
If conI.ConstantID = _PreviousSelected Then
selNode = tNode
End If
Else
tNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed
tNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionClosed
End If
ElseIf Tree.Node.GetNodeTypeFromString(sqlRd.Item("Type")) = Tree.Node.Type.Container Then
Dim contI As New Container.Info
'If tNode.Parent IsNot Nothing Then
' If Tree.Node.GetNodeType(tNode.Parent) = Tree.Node.Type.Container Then
' contI.Parent = tNode.Parent.Tag
' End If
'End If
'_previousContainer = contI 'NEW
contI.TreeNode = tNode
contI.Name = sqlRd.Item("Name")
Dim conI As Connection.Info
conI = GetConnectionInfoFromSQL()
conI.Parent = contI
conI.IsContainer = True
contI.ConnectionInfo = conI
If SQLUpdate = True Then
Dim prevCont As Container.Info = PreviousContainerList.FindByConstantID(conI.ConstantID)
If prevCont IsNot Nothing Then
contI.IsExpanded = prevCont.IsExpanded
End If
If conI.ConstantID = _PreviousSelected Then
selNode = tNode
End If
Else
If sqlRd.Item("Expanded") = True Then
contI.IsExpanded = True
Else
contI.IsExpanded = False
End If
End If
Me._ContainerList.Add(contI)
Me._ConnectionList.Add(conI)
tNode.Tag = contI
tNode.ImageIndex = Images.Enums.TreeImage.Container
tNode.SelectedImageIndex = Images.Enums.TreeImage.Container
End If
If sqlRd.Item("ParentID") <> 0 Then
Dim pNode As TreeNode = Tree.Node.GetNodeFromConstantID(sqlRd.Item("ParentID"))
If pNode IsNot Nothing Then
pNode.Nodes.Add(tNode)
If Tree.Node.GetNodeType(tNode) = Tree.Node.Type.Connection Then
TryCast(tNode.Tag, Connection.Info).Parent = pNode.Tag
ElseIf Tree.Node.GetNodeType(tNode) = Tree.Node.Type.Container Then
TryCast(tNode.Tag, Container.Info).Parent = pNode.Tag
End If
Else
baseNode.Nodes.Add(tNode)
End If
Else
baseNode.Nodes.Add(tNode)
End If
'AddNodesFromSQL(tNode)
End While
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strAddNodesFromSqlFailed & vbNewLine & ex.Message, True)
End Try
End Sub
Private Function GetConnectionInfoFromSQL() As Connection.Info
Try
Dim conI As New Connection.Info
With sqlRd
conI.PositionID = .Item("PositionID")
conI.ConstantID = .Item("ConstantID")
conI.Name = .Item("Name")
conI.Description = .Item("Description")
conI.Hostname = .Item("Hostname")
conI.Username = .Item("Username")
conI.Password = Security.Crypt.Decrypt(.Item("Password"), pW)
conI.Domain = .Item("DomainName")
conI.DisplayWallpaper = .Item("DisplayWallpaper")
conI.DisplayThemes = .Item("DisplayThemes")
conI.CacheBitmaps = .Item("CacheBitmaps")
conI.UseConsoleSession = .Item("ConnectToConsole")
conI.RedirectDiskDrives = .Item("RedirectDiskDrives")
conI.RedirectPrinters = .Item("RedirectPrinters")
conI.RedirectPorts = .Item("RedirectPorts")
conI.RedirectSmartCards = .Item("RedirectSmartCards")
conI.RedirectKeys = .Item("RedirectKeys")
conI.RedirectSound = Tools.Misc.StringToEnum(GetType(Connection.Protocol.RDP.RDPSounds), .Item("RedirectSound"))
conI.Protocol = Tools.Misc.StringToEnum(GetType(Connection.Protocol.Protocols), .Item("Protocol"))
conI.Port = .Item("Port")
conI.PuttySession = .Item("PuttySession")
conI.Colors = Tools.Misc.StringToEnum(GetType(Connection.Protocol.RDP.RDPColors), .Item("Colors"))
conI.Resolution = Tools.Misc.StringToEnum(GetType(Connection.Protocol.RDP.RDPResolutions), .Item("Resolution"))
conI.Inherit = New Connection.Info.Inheritance(conI)
conI.Inherit.CacheBitmaps = .Item("InheritCacheBitmaps")
conI.Inherit.Colors = .Item("InheritColors")
conI.Inherit.Description = .Item("InheritDescription")
conI.Inherit.DisplayThemes = .Item("InheritDisplayThemes")
conI.Inherit.DisplayWallpaper = .Item("InheritDisplayWallpaper")
conI.Inherit.Domain = .Item("InheritDomain")
conI.Inherit.Icon = .Item("InheritIcon")
conI.Inherit.Panel = .Item("InheritPanel")
conI.Inherit.Password = .Item("InheritPassword")
conI.Inherit.Port = .Item("InheritPort")
conI.Inherit.Protocol = .Item("InheritProtocol")
conI.Inherit.PuttySession = .Item("InheritPuttySession")
conI.Inherit.RedirectDiskDrives = .Item("InheritRedirectDiskDrives")
conI.Inherit.RedirectKeys = .Item("InheritRedirectKeys")
conI.Inherit.RedirectPorts = .Item("InheritRedirectPorts")
conI.Inherit.RedirectPrinters = .Item("InheritRedirectPrinters")
conI.Inherit.RedirectSmartCards = .Item("InheritRedirectSmartCards")
conI.Inherit.RedirectSound = .Item("InheritRedirectSound")
conI.Inherit.Resolution = .Item("InheritResolution")
conI.Inherit.UseConsoleSession = .Item("InheritUseConsoleSession")
conI.Inherit.Username = .Item("InheritUsername")
conI.Icon = .Item("Icon")
conI.Panel = .Item("Panel")
If Me.confVersion > 1.5 Then '1.6
conI.ICAEncryption = Tools.Misc.StringToEnum(GetType(Connection.Protocol.ICA.EncryptionStrength), .Item("ICAEncryptionStrength"))
conI.Inherit.ICAEncryption = .Item("InheritICAEncryptionStrength")
conI.PreExtApp = .Item("PreExtApp")
conI.PostExtApp = .Item("PostExtApp")
conI.Inherit.PreExtApp = .Item("InheritPreExtApp")
conI.Inherit.PostExtApp = .Item("InheritPostExtApp")
End If
If Me.confVersion > 1.6 Then '1.7
conI.VNCCompression = Tools.Misc.StringToEnum(GetType(Connection.Protocol.VNC.Compression), .Item("VNCCompression"))
conI.VNCEncoding = Tools.Misc.StringToEnum(GetType(Connection.Protocol.VNC.Encoding), .Item("VNCEncoding"))
conI.VNCAuthMode = Tools.Misc.StringToEnum(GetType(Connection.Protocol.VNC.AuthMode), .Item("VNCAuthMode"))
conI.VNCProxyType = Tools.Misc.StringToEnum(GetType(Connection.Protocol.VNC.ProxyType), .Item("VNCProxyType"))
conI.VNCProxyIP = .Item("VNCProxyIP")
conI.VNCProxyPort = .Item("VNCProxyPort")
conI.VNCProxyUsername = .Item("VNCProxyUsername")
conI.VNCProxyPassword = Security.Crypt.Decrypt(.Item("VNCProxyPassword"), pW)
conI.VNCColors = Tools.Misc.StringToEnum(GetType(Connection.Protocol.VNC.Colors), .Item("VNCColors"))
conI.VNCSmartSizeMode = Tools.Misc.StringToEnum(GetType(Connection.Protocol.VNC.SmartSizeMode), .Item("VNCSmartSizeMode"))
conI.VNCViewOnly = .Item("VNCViewOnly")
conI.Inherit.VNCCompression = .Item("InheritVNCCompression")
conI.Inherit.VNCEncoding = .Item("InheritVNCEncoding")
conI.Inherit.VNCAuthMode = .Item("InheritVNCAuthMode")
conI.Inherit.VNCProxyType = .Item("InheritVNCProxyType")
conI.Inherit.VNCProxyIP = .Item("InheritVNCProxyIP")
conI.Inherit.VNCProxyPort = .Item("InheritVNCProxyPort")
conI.Inherit.VNCProxyUsername = .Item("InheritVNCProxyUsername")
conI.Inherit.VNCProxyPassword = .Item("InheritVNCProxyPassword")
conI.Inherit.VNCColors = .Item("InheritVNCColors")
conI.Inherit.VNCSmartSizeMode = .Item("InheritVNCSmartSizeMode")
conI.Inherit.VNCViewOnly = .Item("InheritVNCViewOnly")
End If
If Me.confVersion > 1.7 Then '1.8
conI.RDPAuthenticationLevel = Tools.Misc.StringToEnum(GetType(Connection.Protocol.RDP.AuthenticationLevel), .Item("RDPAuthenticationLevel"))
conI.Inherit.RDPAuthenticationLevel = .Item("InheritRDPAuthenticationLevel")
End If
If Me.confVersion > 1.8 Then '1.9
conI.RenderingEngine = Tools.Misc.StringToEnum(GetType(Connection.Protocol.HTTPBase.RenderingEngine), .Item("RenderingEngine"))
conI.MacAddress = .Item("MacAddress")
conI.Inherit.RenderingEngine = .Item("InheritRenderingEngine")
conI.Inherit.MacAddress = .Item("InheritMacAddress")
End If
If Me.confVersion > 1.9 Then '2.0
conI.UserField = .Item("UserField")
conI.Inherit.UserField = .Item("InheritUserField")
End If
If Me.confVersion > 2.0 Then '2.1
conI.ExtApp = .Item("ExtApp")
conI.Inherit.ExtApp = .Item("InheritExtApp")
End If
If Me.confVersion >= 2.2 Then
conI.RDGatewayUsageMethod = Tools.Misc.StringToEnum(GetType(mRemoteNG.Connection.Protocol.RDP.RDGatewayUsageMethod), .Item("RDGatewayUsageMethod"))
conI.RDGatewayHostname = .Item("RDGatewayHostname")
conI.RDGatewayUseConnectionCredentials = Tools.Misc.StringToEnum(GetType(mRemoteNG.Connection.Protocol.RDP.RDGatewayUseConnectionCredentials), .Item("RDGatewayUseConnectionCredentials"))
conI.RDGatewayUsername = .Item("RDGatewayUsername")
conI.RDGatewayPassword = Security.Crypt.Decrypt(.Item("RDGatewayPassword"), pW)
conI.RDGatewayDomain = .Item("RDGatewayDomain")
conI.Inherit.RDGatewayUsageMethod = .Item("InheritRDGatewayUsageMethod")
conI.Inherit.RDGatewayHostname = .Item("InheritRDGatewayHostname")
conI.Inherit.RDGatewayUsername = .Item("InheritRDGatewayUsername")
conI.Inherit.RDGatewayPassword = .Item("InheritRDGatewayPassword")
conI.Inherit.RDGatewayDomain = .Item("InheritRDGatewayDomain")
End If
If Me.confVersion >= 2.3 Then
conI.EnableFontSmoothing = .Item("EnableFontSmoothing")
conI.EnableDesktopComposition = .Item("EnableDesktopComposition")
conI.Inherit.EnableFontSmoothing = .Item("InheritEnableFontSmoothing")
conI.Inherit.EnableDesktopComposition = .Item("InheritEnableDesktopComposition")
End If
If confVersion >= 2.4 Then
conI.UseCredSsp = .Item("UseCredSsp")
conI.Inherit.UseCredSsp = .Item("InheritUseCredSsp")
End If
If confVersion >= 2.5 Then
conI.LoadBalanceInfo = .Item("LoadBalanceInfo")
conI.AutomaticResize = .Item("AutomaticResize")
conI.Inherit.LoadBalanceInfo = .Item("InheritLoadBalanceInfo")
conI.Inherit.AutomaticResize = .Item("InheritAutomaticResize")
End If
If SQLUpdate = True Then
conI.PleaseConnect = .Item("Connected")
End If
End With
Return conI
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strGetConnectionInfoFromSqlFailed & vbNewLine & ex.Message, True)
End Try
Return Nothing
End Function
#End Region
#Region "XML"
Private Function DecryptCompleteFile() As String
Dim sRd As New StreamReader(Me._ConnectionFileName)
Dim strCons As String
strCons = sRd.ReadToEnd
sRd.Close()
If strCons <> "" Then
Dim strDecr As String = ""
Dim notDecr As Boolean = True
If strCons.Contains("<?xml version=""1.0"" encoding=""utf-8""?>") Then
strDecr = strCons
Return strDecr
End If
Try
strDecr = Security.Crypt.Decrypt(strCons, pW)
If strDecr <> strCons Then
notDecr = False
Else
notDecr = True
End If
Catch ex As Exception
notDecr = True
End Try
If notDecr Then
If Authenticate(strCons, True) = True Then
strDecr = Security.Crypt.Decrypt(strCons, pW)
notDecr = False
Else
notDecr = True
End If
If notDecr = False Then
Return strDecr
End If
Else
Return strDecr
End If
End If
Return ""
End Function
Private Sub LoadFromXML(ByVal cons As String, ByVal import As Boolean)
Try
App.Runtime.IsConnectionsFileLoaded = False
' SECTION 1. Create a DOM Document and load the XML data into it.
Me.xDom = New XmlDocument()
If cons <> "" Then
xDom.LoadXml(cons)
Else
xDom.Load(Me._ConnectionFileName)
End If
If xDom.DocumentElement.HasAttribute("ConfVersion") Then
Me.confVersion = Convert.ToDouble(xDom.DocumentElement.Attributes("ConfVersion").Value.Replace(",", "."), CultureInfo.InvariantCulture)
Else
MessageCollector.AddMessage(Messages.MessageClass.WarningMsg, My.Language.strOldConffile)
End If
Const maxSupportedConfVersion As Double = 2.5
If confVersion > maxSupportedConfVersion Then
cTaskDialog.ShowTaskDialogBox(frmMain, Application.ProductName, "Incompatible connection file format", String.Format("The format of this connection file is not supported. Please upgrade to a newer version of {0}.", Application.ProductName), String.Format("{1}{0}File Format Version: {2}{0}Highest Supported Version: {3}", vbNewLine, ConnectionFileName, confVersion.ToString(), maxSupportedConfVersion.ToString()), "", "", "", "", eTaskDialogButtons.OK, eSysIcons.Error, Nothing)
Throw New Exception(String.Format("Incompatible connection file format (file format version {0}).", confVersion))
End If
' SECTION 2. Initialize the treeview control.
Dim rootNode As TreeNode
Dim rootNodeName As String = ""
If xDom.DocumentElement.HasAttribute("Name") Then rootNodeName = xDom.DocumentElement.Attributes("Name").Value.Trim()
If Not String.IsNullOrEmpty(rootNodeName) Then
rootNode = New TreeNode(rootNodeName)
Else
rootNode = New TreeNode(xDom.DocumentElement.Name)
End If
Dim rInfo As New Root.Info(Root.Info.RootType.Connection)
rInfo.Name = rootNode.Text
rInfo.TreeNode = rootNode
rootNode.Tag = rInfo
If Me.confVersion > 1.3 Then '1.4
If Security.Crypt.Decrypt(xDom.DocumentElement.Attributes("Protected").Value, pW) <> "ThisIsNotProtected" Then
If Authenticate(xDom.DocumentElement.Attributes("Protected").Value, False, rInfo) = False Then
My.Settings.LoadConsFromCustomLocation = False
My.Settings.CustomConsPath = ""
_RootTreeNode.Remove()
Exit Sub
End If
End If
End If
Dim isExportFile As Boolean = False
If confVersion >= 1.0 Then
If xDom.DocumentElement.Attributes("Export").Value = True Then
isExportFile = True
End If
End If
If import And Not isExportFile Then
MessageCollector.AddMessage(Messages.MessageClass.InformationMsg, My.Language.strCannotImportNormalSessionFile)
Return
End If
If Not isExportFile Then
_RootTreeNode.Text = rootNode.Text
_RootTreeNode.Tag = rootNode.Tag
_RootTreeNode.ImageIndex = Images.Enums.TreeImage.Root
_RootTreeNode.SelectedImageIndex = Images.Enums.TreeImage.Root
End If
Windows.treeForm.tvConnections.BeginUpdate()
' SECTION 3. Populate the TreeView with the DOM nodes.
AddNodeFromXml(xDom.DocumentElement, _RootTreeNode)
Me._RootTreeNode.Expand()
'expand containers
For Each contI As Container.Info In Me._ContainerList
If contI.IsExpanded = True Then
contI.TreeNode.Expand()
End If
Next
Windows.treeForm.tvConnections.EndUpdate()
'open connections from last mremote session
If My.Settings.OpenConsFromLastSession = True And My.Settings.NoReconnect = False Then
For Each conI As Connection.Info In Me._ConnectionList
If conI.PleaseConnect = True Then
App.Runtime.OpenConnection(conI)
End If
Next
End If
Me._RootTreeNode.EnsureVisible()
App.Runtime.IsConnectionsFileLoaded = True
App.Runtime.Windows.treeForm.InitialRefresh()
Catch ex As Exception
App.Runtime.IsConnectionsFileLoaded = False
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strLoadFromXmlFailed & vbNewLine & ex.Message & vbNewLine & ex.StackTrace, True)
Throw
End Try
End Sub
Private _previousContainer As Container.Info
Private Sub AddNodeFromXml(ByRef parentXmlNode As XmlNode, ByRef parentTreeNode As TreeNode)
Try
' Loop through the XML nodes until the leaf is reached.
' Add the nodes to the TreeView during the looping process.
If parentXmlNode.HasChildNodes() Then
For Each xmlNode As XmlNode In parentXmlNode.ChildNodes
Dim treeNode As TreeNode = New TreeNode(xmlNode.Attributes("Name").Value)
parentTreeNode.Nodes.Add(TreeNode)
If Tree.Node.GetNodeTypeFromString(xmlNode.Attributes("Type").Value) = Tree.Node.Type.Connection Then 'connection info
Dim connectionInfo As Connection.Info = GetConnectionInfoFromXml(xmlNode)
connectionInfo.TreeNode = treeNode
connectionInfo.Parent = _previousContainer 'NEW
ConnectionList.Add(connectionInfo)
treeNode.Tag = connectionInfo
treeNode.ImageIndex = Images.Enums.TreeImage.ConnectionClosed
treeNode.SelectedImageIndex = Images.Enums.TreeImage.ConnectionClosed
ElseIf Tree.Node.GetNodeTypeFromString(xmlNode.Attributes("Type").Value) = Tree.Node.Type.Container Then 'container info
Dim containerInfo As New Container.Info
If treeNode.Parent IsNot Nothing Then
If Tree.Node.GetNodeType(treeNode.Parent) = Tree.Node.Type.Container Then
containerInfo.Parent = treeNode.Parent.Tag
End If
End If
_previousContainer = containerInfo 'NEW
containerInfo.TreeNode = treeNode
containerInfo.Name = xmlNode.Attributes("Name").Value
If confVersion >= 0.8 Then
If xmlNode.Attributes("Expanded").Value = "True" Then
containerInfo.IsExpanded = True
Else
containerInfo.IsExpanded = False
End If
End If
Dim connectionInfo As Connection.Info
If confVersion >= 0.9 Then
connectionInfo = GetConnectionInfoFromXml(xmlNode)
Else
connectionInfo = New Connection.Info
End If
connectionInfo.Parent = containerInfo
connectionInfo.IsContainer = True
containerInfo.ConnectionInfo = connectionInfo
ContainerList.Add(containerInfo)
treeNode.Tag = containerInfo
treeNode.ImageIndex = Images.Enums.TreeImage.Container
treeNode.SelectedImageIndex = Images.Enums.TreeImage.Container
End If
AddNodeFromXml(xmlNode, treeNode)
Next
Else
Dim nodeName As String = ""
Dim nameAttribute As XmlAttribute = parentXmlNode.Attributes("Name")
If Not IsNothing(nameAttribute) Then nodeName = nameAttribute.Value.Trim()
If Not String.IsNullOrEmpty(nodeName) Then
parentTreeNode.Text = nodeName
Else
parentTreeNode.Text = parentXmlNode.Name
End If
End If
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, My.Language.strAddNodeFromXmlFailed & vbNewLine & ex.Message & ex.StackTrace, True)
Throw
End Try
End Sub
Private Function GetConnectionInfoFromXml(ByVal xxNode As XmlNode) As Connection.Info
Dim conI As New Connection.Info
Try
With xxNode
If Me.confVersion > 0.1 Then '0.2
conI.Name = .Attributes("Name").Value
conI.Description = .Attributes("Descr").Value
conI.Hostname = .Attributes("Hostname").Value
conI.Username = .Attributes("Username").Value
conI.Password = Security.Crypt.Decrypt(.Attributes("Password").Value, pW)
conI.Domain = .Attributes("Domain").Value
conI.DisplayWallpaper = .Attributes("DisplayWallpaper").Value
conI.DisplayThemes = .Attributes("DisplayThemes").Value
conI.CacheBitmaps = .Attributes("CacheBitmaps").Value
If Me.confVersion < 1.1 Then '1.0 - 0.1
If .Attributes("Fullscreen").Value = True Then
conI.Resolution = Connection.Protocol.RDP.RDPResolutions.Fullscreen
Else
conI.Resolution = Connection.Protocol.RDP.RDPResolutions.FitToWindow
End If
End If
End If
If Me.confVersion > 0.2 Then '0.3
If Me.confVersion < 0.7 Then
If CType(.Attributes("UseVNC").Value, Boolean) = True Then
conI.Protocol = Connection.Protocol.Protocols.VNC
conI.Port = .Attributes("VNCPort").Value
Else
conI.Protocol = Connection.Protocol.Protocols.RDP
End If
End If
Else
conI.Port = Connection.Protocol.RDP.Defaults.Port
conI.Protocol = Connection.Protocol.Protocols.RDP
End If
If Me.confVersion > 0.3 Then '0.4
If Me.confVersion < 0.7 Then
If CType(.Attributes("UseVNC").Value, Boolean) = True Then
conI.Port = .Attributes("VNCPort").Value
Else
conI.Port = .Attributes("RDPPort").Value
End If
End If
conI.UseConsoleSession = .Attributes("ConnectToConsole").Value
Else
If Me.confVersion < 0.7 Then
If CType(.Attributes("UseVNC").Value, Boolean) = True Then
conI.Port = Connection.Protocol.VNC.Defaults.Port
Else
conI.Port = Connection.Protocol.RDP.Defaults.Port
End If
End If
conI.UseConsoleSession = False
End If
If Me.confVersion > 0.4 Then '0.5 and 0.6
conI.RedirectDiskDrives = .Attributes("RedirectDiskDrives").Value
conI.RedirectPrinters = .Attributes("RedirectPrinters").Value
conI.RedirectPorts = .Attributes("RedirectPorts").Value
conI.RedirectSmartCards = .Attributes("RedirectSmartCards").Value
Else
conI.RedirectDiskDrives = False
conI.RedirectPrinters = False
conI.RedirectPorts = False
conI.RedirectSmartCards = False
End If
If Me.confVersion > 0.6 Then '0.7
conI.Protocol = Tools.Misc.StringToEnum(GetType(Connection.Protocol.Protocols), .Attributes("Protocol").Value)
conI.Port = .Attributes("Port").Value
End If
If Me.confVersion > 0.9 Then '1.0
conI.RedirectKeys = .Attributes("RedirectKeys").Value
End If
If Me.confVersion > 1.1 Then '1.2
conI.PuttySession = .Attributes("PuttySession").Value
End If
If Me.confVersion > 1.2 Then '1.3
conI.Colors = Tools.Misc.StringToEnum(GetType(Connection.Protocol.RDP.RDPColors), .Attributes("Colors").Value)
conI.Resolution = Tools.Misc.StringToEnum(GetType(Connection.Protocol.RDP.RDPResolutions), .Attributes("Resolution").Value)
conI.RedirectSound = Tools.Misc.StringToEnum(GetType(Connection.Protocol.RDP.RDPSounds), .Attributes("RedirectSound").Value)
Else
Select Case .Attributes("Colors").Value
Case 0
conI.Colors = Connection.Protocol.RDP.RDPColors.Colors256
Case 1
conI.Colors = Connection.Protocol.RDP.RDPColors.Colors16Bit
Case 2
conI.Colors = Connection.Protocol.RDP.RDPColors.Colors24Bit
Case 3
conI.Colors = Connection.Protocol.RDP.RDPColors.Colors32Bit
Case 4
conI.Colors = Connection.Protocol.RDP.RDPColors.Colors15Bit
End Select
conI.RedirectSound = .Attributes("RedirectSound").Value
End If
If Me.confVersion > 1.2 Then '1.3
conI.Inherit = New Connection.Info.Inheritance(conI)
conI.Inherit.CacheBitmaps = .Attributes("InheritCacheBitmaps").Value
conI.Inherit.Colors = .Attributes("InheritColors").Value
conI.Inherit.Description = .Attributes("InheritDescription").Value
conI.Inherit.DisplayThemes = .Attributes("InheritDisplayThemes").Value
conI.Inherit.DisplayWallpaper = .Attributes("InheritDisplayWallpaper").Value
conI.Inherit.Domain = .Attributes("InheritDomain").Value
conI.Inherit.Icon = .Attributes("InheritIcon").Value
conI.Inherit.Panel = .Attributes("InheritPanel").Value
conI.Inherit.Password = .Attributes("InheritPassword").Value
conI.Inherit.Port = .Attributes("InheritPort").Value
conI.Inherit.Protocol = .Attributes("InheritProtocol").Value
conI.Inherit.PuttySession = .Attributes("InheritPuttySession").Value
conI.Inherit.RedirectDiskDrives = .Attributes("InheritRedirectDiskDrives").Value
conI.Inherit.RedirectKeys = .Attributes("InheritRedirectKeys").Value
conI.Inherit.RedirectPorts = .Attributes("InheritRedirectPorts").Value
conI.Inherit.RedirectPrinters = .Attributes("InheritRedirectPrinters").Value
conI.Inherit.RedirectSmartCards = .Attributes("InheritRedirectSmartCards").Value
conI.Inherit.RedirectSound = .Attributes("InheritRedirectSound").Value
conI.Inherit.Resolution = .Attributes("InheritResolution").Value
conI.Inherit.UseConsoleSession = .Attributes("InheritUseConsoleSession").Value
conI.Inherit.Username = .Attributes("InheritUsername").Value
conI.Icon = .Attributes("Icon").Value
conI.Panel = .Attributes("Panel").Value
Else
conI.Inherit = New Connection.Info.Inheritance(conI, .Attributes("Inherit").Value)
conI.Icon = .Attributes("Icon").Value.Replace(".ico", "")
conI.Panel = My.Language.strGeneral
End If
If Me.confVersion > 1.4 Then '1.5
conI.PleaseConnect = .Attributes("Connected").Value
End If
If Me.confVersion > 1.5 Then '1.6
conI.ICAEncryption = Tools.Misc.StringToEnum(GetType(mRemoteNG.Connection.Protocol.ICA.EncryptionStrength), .Attributes("ICAEncryptionStrength").Value)
conI.Inherit.ICAEncryption = .Attributes("InheritICAEncryptionStrength").Value
conI.PreExtApp = .Attributes("PreExtApp").Value
conI.PostExtApp = .Attributes("PostExtApp").Value
conI.Inherit.PreExtApp = .Attributes("InheritPreExtApp").Value
conI.Inherit.PostExtApp = .Attributes("InheritPostExtApp").Value
End If
If Me.confVersion > 1.6 Then '1.7
conI.VNCCompression = Tools.Misc.StringToEnum(GetType(mRemoteNG.Connection.Protocol.VNC.Compression), .Attributes("VNCCompression").Value)
conI.VNCEncoding = Tools.Misc.StringToEnum(GetType(mRemoteNG.Connection.Protocol.VNC.Encoding), .Attributes("VNCEncoding").Value)
conI.VNCAuthMode = Tools.Misc.StringToEnum(GetType(mRemoteNG.Connection.Protocol.VNC.AuthMode), .Attributes("VNCAuthMode").Value)
conI.VNCProxyType = Tools.Misc.StringToEnum(GetType(mRemoteNG.Connection.Protocol.VNC.ProxyType), .Attributes("VNCProxyType").Value)
conI.VNCProxyIP = .Attributes("VNCProxyIP").Value
conI.VNCProxyPort = .Attributes("VNCProxyPort").Value
conI.VNCProxyUsername = .Attributes("VNCProxyUsername").Value
conI.VNCProxyPassword = Security.Crypt.Decrypt(.Attributes("VNCProxyPassword").Value, pW)
conI.VNCColors = Tools.Misc.StringToEnum(GetType(mRemoteNG.Connection.Protocol.VNC.Colors), .Attributes("VNCColors").Value)
conI.VNCSmartSizeMode = Tools.Misc.StringToEnum(GetType(mRemoteNG.Connection.Protocol.VNC.SmartSizeMode), .Attributes("VNCSmartSizeMode").Value)
conI.VNCViewOnly = .Attributes("VNCViewOnly").Value
conI.Inherit.VNCCompression = .Attributes("InheritVNCCompression").Value
conI.Inherit.VNCEncoding = .Attributes("InheritVNCEncoding").Value
conI.Inherit.VNCAuthMode = .Attributes("InheritVNCAuthMode").Value
conI.Inherit.VNCProxyType = .Attributes("InheritVNCProxyType").Value
conI.Inherit.VNCProxyIP = .Attributes("InheritVNCProxyIP").Value
conI.Inherit.VNCProxyPort = .Attributes("InheritVNCProxyPort").Value
conI.Inherit.VNCProxyUsername = .Attributes("InheritVNCProxyUsername").Value
conI.Inherit.VNCProxyPassword = .Attributes("InheritVNCProxyPassword").Value
conI.Inherit.VNCColors = .Attributes("InheritVNCColors").Value
conI.Inherit.VNCSmartSizeMode = .Attributes("InheritVNCSmartSizeMode").Value
conI.Inherit.VNCViewOnly = .Attributes("InheritVNCViewOnly").Value
End If
If Me.confVersion > 1.7 Then '1.8
conI.RDPAuthenticationLevel = Tools.Misc.StringToEnum(GetType(mRemoteNG.Connection.Protocol.RDP.AuthenticationLevel), .Attributes("RDPAuthenticationLevel").Value)
conI.Inherit.RDPAuthenticationLevel = .Attributes("InheritRDPAuthenticationLevel").Value
End If
If Me.confVersion > 1.8 Then '1.9
conI.RenderingEngine = Tools.Misc.StringToEnum(GetType(mRemoteNG.Connection.Protocol.HTTPBase.RenderingEngine), .Attributes("RenderingEngine").Value)
conI.MacAddress = .Attributes("MacAddress").Value
conI.Inherit.RenderingEngine = .Attributes("InheritRenderingEngine").Value
conI.Inherit.MacAddress = .Attributes("InheritMacAddress").Value
End If
If Me.confVersion > 1.9 Then '2.0
conI.UserField = .Attributes("UserField").Value
conI.Inherit.UserField = .Attributes("InheritUserField").Value
End If
If Me.confVersion > 2.0 Then '2.1
conI.ExtApp = .Attributes("ExtApp").Value
conI.Inherit.ExtApp = .Attributes("InheritExtApp").Value
End If
If Me.confVersion > 2.1 Then '2.2
' Get settings
conI.RDGatewayUsageMethod = Tools.Misc.StringToEnum(GetType(mRemoteNG.Connection.Protocol.RDP.RDGatewayUsageMethod), .Attributes("RDGatewayUsageMethod").Value)
conI.RDGatewayHostname = .Attributes("RDGatewayHostname").Value
conI.RDGatewayUseConnectionCredentials = Tools.Misc.StringToEnum(GetType(mRemoteNG.Connection.Protocol.RDP.RDGatewayUseConnectionCredentials), .Attributes("RDGatewayUseConnectionCredentials").Value)
conI.RDGatewayUsername = .Attributes("RDGatewayUsername").Value
conI.RDGatewayPassword = Security.Crypt.Decrypt(.Attributes("RDGatewayPassword").Value, pW)
conI.RDGatewayDomain = .Attributes("RDGatewayDomain").Value
' Get inheritance settings
conI.Inherit.RDGatewayUsageMethod = .Attributes("InheritRDGatewayUsageMethod").Value
conI.Inherit.RDGatewayHostname = .Attributes("InheritRDGatewayHostname").Value
conI.Inherit.RDGatewayUseConnectionCredentials = .Attributes("InheritRDGatewayUseConnectionCredentials").Value
conI.Inherit.RDGatewayUsername = .Attributes("InheritRDGatewayUsername").Value
conI.Inherit.RDGatewayPassword = .Attributes("InheritRDGatewayPassword").Value
conI.Inherit.RDGatewayDomain = .Attributes("InheritRDGatewayDomain").Value
End If
If Me.confVersion > 2.2 Then '2.3
' Get settings
conI.EnableFontSmoothing = .Attributes("EnableFontSmoothing").Value
conI.EnableDesktopComposition = .Attributes("EnableDesktopComposition").Value
' Get inheritance settings
conI.Inherit.EnableFontSmoothing = .Attributes("InheritEnableFontSmoothing").Value
conI.Inherit.EnableDesktopComposition = .Attributes("InheritEnableDesktopComposition").Value
End If
If confVersion >= 2.4 Then
conI.UseCredSsp = .Attributes("UseCredSsp").Value
conI.Inherit.UseCredSsp = .Attributes("InheritUseCredSsp").Value
End If
If confVersion >= 2.5 Then
conI.LoadBalanceInfo = .Attributes("LoadBalanceInfo").Value
conI.AutomaticResize = .Attributes("AutomaticResize").Value
conI.Inherit.LoadBalanceInfo = .Attributes("InheritLoadBalanceInfo").Value
conI.Inherit.AutomaticResize = .Attributes("InheritAutomaticResize").Value
End If
End With
Catch ex As Exception
MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, String.Format(My.Language.strGetConnectionInfoFromXmlFailed, conI.Name, Me.ConnectionFileName, ex.Message), False)
End Try
Return conI
End Function
Private Function Authenticate(ByVal Value As String, ByVal CompareToOriginalValue As Boolean, Optional ByVal RootInfo As mRemoteNG.Root.Info = Nothing) As Boolean
If CompareToOriginalValue Then
Do Until Security.Crypt.Decrypt(Value, pW) <> Value
pW = Tools.Misc.PasswordDialog(False)
If pW = "" Then
Return False
End If
Loop
Else
Do Until Security.Crypt.Decrypt(Value, pW) = "ThisIsProtected"
pW = Tools.Misc.PasswordDialog(False)
If pW = "" Then
Return False
End If
Loop
RootInfo.Password = True
RootInfo.PasswordString = pW
End If
Return True
End Function
#End Region
End Class
End Namespace
End Namespace