diff --git a/mRemoteV1/App/Import.cs b/mRemoteV1/App/Import.cs index 92da5bad..8b7db78a 100644 --- a/mRemoteV1/App/Import.cs +++ b/mRemoteV1/App/Import.cs @@ -24,7 +24,6 @@ namespace mRemoteNG.App } #region Public Methods - //TODO Fix for TreeListView public static void ImportFromFile(ContainerInfo importDestinationContainer, bool alwaysUseSelectedTreeNode = false) { try @@ -46,9 +45,7 @@ namespace mRemoteNG.App openFileDialog.Filter = string.Join("|", fileTypes.ToArray()); if (openFileDialog.ShowDialog() != DialogResult.OK) - { return; - } foreach (var fileName in openFileDialog.FileNames) { @@ -91,34 +88,17 @@ namespace mRemoteNG.App } } - public static void ImportFromActiveDirectory(string ldapPath) + public static void ImportFromActiveDirectory(string ldapPath, ContainerInfo importDestinationContainer) { try { - var rootTreeNode = ConnectionTree.TreeView.Nodes[0]; - var selectedTreeNode = ConnectionTree.TreeView.SelectedNode; - - var parentTreeNode = GetParentTreeNode(rootTreeNode, selectedTreeNode); - if (parentTreeNode == null) - { - return; - } - - ActiveDirectoryImporter.Import(ldapPath, parentTreeNode); - - parentTreeNode.Expand(); - var parentContainer = (ContainerInfo) parentTreeNode.Tag; - if (parentContainer != null) - { - parentContainer.IsExpanded = true; - } - + var importer = new ActiveDirectoryImporter(); + importer.Import(ldapPath, importDestinationContainer); Runtime.SaveConnectionsBG(); } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromActiveDirectory() failed.", ex, - logOnly: true); + Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromActiveDirectory() failed.", ex, logOnly: true); } } @@ -152,13 +132,9 @@ namespace mRemoteNG.App logOnly: true); } } - #endregion - #region Private Methods - - private static TreeNode GetParentTreeNode(TreeNode rootTreeNode, TreeNode selectedTreeNode, - bool alwaysUseSelectedTreeNode = false) + private static TreeNode GetParentTreeNode(TreeNode rootTreeNode, TreeNode selectedTreeNode, bool alwaysUseSelectedTreeNode = false) { TreeNode parentTreeNode; @@ -229,6 +205,5 @@ namespace mRemoteNG.App return FileType.Unknown; } } - #endregion } } \ No newline at end of file diff --git a/mRemoteV1/Config/Import/ActiveDirectoryImporter.cs b/mRemoteV1/Config/Import/ActiveDirectoryImporter.cs index 8eaf08fa..39be73d7 100644 --- a/mRemoteV1/Config/Import/ActiveDirectoryImporter.cs +++ b/mRemoteV1/Config/Import/ActiveDirectoryImporter.cs @@ -1,115 +1,36 @@ using System; -using System.Windows.Forms; -using System.DirectoryServices; +using System.Linq; using mRemoteNG.App; -using System.Text.RegularExpressions; -using mRemoteNG.Connection; +using mRemoteNG.Config.Serializers; using mRemoteNG.Container; -using mRemoteNG.Tree; + namespace mRemoteNG.Config.Import { - public class ActiveDirectoryImporter + public class ActiveDirectoryImporter : IConnectionImporter { - public static void Import(string ldapPath, TreeNode parentTreeNode) + public void Import(object ldapPath, ContainerInfo destinationContainer) + { + var ldapPathAsString = ldapPath as string; + if (ldapPathAsString == null) return; + Import(ldapPathAsString, destinationContainer); + } + + public void Import(string ldapPath, ContainerInfo destinationContainer) { try { - var treeNode = ConnectionTreeNode.AddNode(TreeNodeType.Container); - - var containerInfo = new ContainerInfo(); - containerInfo.TreeNode = treeNode; - - var name = ""; - var match = Regex.Match(ldapPath, "ou=([^,]*)", RegexOptions.IgnoreCase); - if (match.Success) - { - name = match.Groups[1].Captures[0].Value; - } - else - { - name = Language.strActiveDirectory; - } - - containerInfo.Name = name; - - // We can only inherit from a container node, not the root node or connection nodes - if (ConnectionTreeNode.GetNodeType(parentTreeNode) == TreeNodeType.Container) - { - containerInfo.Parent = (ContainerInfo)parentTreeNode.Tag; - } - else - { - containerInfo.Inheritance.DisableInheritance(); - } - - treeNode.Text = name; - treeNode.Name = name; - treeNode.Tag = containerInfo; - Runtime.ContainerList.Add(containerInfo); - - ImportComputers(ldapPath, treeNode); - - parentTreeNode.Nodes.Add(treeNode); - } + var deserializer = new ActiveDirectoryDeserializer(ldapPath); + var connectionTreeModel = deserializer.Deserialize(); + var importedRootNode = connectionTreeModel.RootNodes.First(); + if (importedRootNode == null) return; + var childrenToAdd = importedRootNode.Children.ToArray(); + destinationContainer.AddChildRange(childrenToAdd); + } catch (Exception ex) { Runtime.MessageCollector.AddExceptionMessage("Config.Import.ActiveDirectory.Import() failed.", ex, logOnly: true); } } - - private static void ImportComputers(string ldapPath, TreeNode parentTreeNode) - { - try - { - const string ldapFilter = "(objectClass=computer)"; - - var ldapSearcher = new DirectorySearcher(); - var ldapResults = default(SearchResultCollection); - var ldapResult = default(SearchResult); - - ldapSearcher.SearchRoot = new DirectoryEntry(ldapPath); - ldapSearcher.PropertiesToLoad.AddRange(new[] {"securityEquals", "cn"}); - ldapSearcher.Filter = ldapFilter; - ldapSearcher.SearchScope = SearchScope.OneLevel; - - ldapResults = ldapSearcher.FindAll(); - - foreach (SearchResult tempLoopVar_ldapResult in ldapResults) - { - ldapResult = tempLoopVar_ldapResult; - var with_2 = ldapResult.GetDirectoryEntry(); - var displayName = Convert.ToString(with_2.Properties["cn"].Value); - var description = Convert.ToString(with_2.Properties["Description"].Value); - var hostName = Convert.ToString(with_2.Properties["dNSHostName"].Value); - - var treeNode = ConnectionTreeNode.AddNode(TreeNodeType.Connection, displayName); - - var connectionInfo = new ConnectionInfo(); - var inheritanceInfo = new ConnectionInfoInheritance(connectionInfo); - inheritanceInfo.TurnOnInheritanceCompletely(); - inheritanceInfo.Description = false; - if (parentTreeNode.Tag is ContainerInfo) - { - connectionInfo.Parent = (ContainerInfo)parentTreeNode.Tag; - } - connectionInfo.Inheritance = inheritanceInfo; - connectionInfo.Name = displayName; - connectionInfo.Hostname = hostName; - connectionInfo.Description = description; - connectionInfo.TreeNode = treeNode; - treeNode.Name = displayName; - treeNode.Tag = connectionInfo; //set the nodes tag to the conI - //add connection to connections - Runtime.ConnectionList.Add(connectionInfo); - - parentTreeNode.Nodes.Add(treeNode); - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionMessage("Config.Import.ActiveDirectory.ImportComputers() failed.", ex, logOnly: true); - } - } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Serializers/ActiveDirectoryDeserializer.cs b/mRemoteV1/Config/Serializers/ActiveDirectoryDeserializer.cs new file mode 100644 index 00000000..f97dd5d0 --- /dev/null +++ b/mRemoteV1/Config/Serializers/ActiveDirectoryDeserializer.cs @@ -0,0 +1,89 @@ +using System; +using System.DirectoryServices; +using System.Text.RegularExpressions; +using mRemoteNG.App; +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; + + +namespace mRemoteNG.Config.Serializers +{ + public class ActiveDirectoryDeserializer : IDeserializer + { + private readonly string _ldapPath; + + public ActiveDirectoryDeserializer(string ldapPath) + { + _ldapPath = ldapPath; + } + + public ConnectionTreeModel Deserialize() + { + var connectionTreeModel = new ConnectionTreeModel(); + var root = new RootNodeInfo(RootNodeType.Connection); + connectionTreeModel.AddRootNode(root); + + ImportContainers(_ldapPath, root); + + return connectionTreeModel; + } + + private void ImportContainers(string ldapPath, ContainerInfo parentContainer) + { + var match = Regex.Match(ldapPath, "ou=([^,]*)", RegexOptions.IgnoreCase); + var name = match.Success ? match.Groups[1].Captures[0].Value : Language.strActiveDirectory; + + var newContainer = new ContainerInfo {Name = name}; + parentContainer.AddChild(newContainer); + + ImportComputers(ldapPath, newContainer); + } + + private void ImportComputers(string ldapPath, ContainerInfo parentContainer) + { + try + { + const string ldapFilter = "(objectClass=computer)"; + using (var ldapSearcher = new DirectorySearcher()) + { + ldapSearcher.SearchRoot = new DirectoryEntry(ldapPath); + ldapSearcher.Filter = ldapFilter; + ldapSearcher.SearchScope = SearchScope.OneLevel; + ldapSearcher.PropertiesToLoad.AddRange(new[] { "securityEquals", "cn" }); + + var ldapResults = ldapSearcher.FindAll(); + foreach (SearchResult ldapResult in ldapResults) + { + using (var directoryEntry = ldapResult.GetDirectoryEntry()) + DeserializeConnection(directoryEntry, parentContainer); + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage("Config.Import.ActiveDirectory.ImportComputers() failed.", ex, logOnly: true); + } + } + + private void DeserializeConnection(DirectoryEntry directoryEntry, ContainerInfo parentContainer) + { + var displayName = Convert.ToString(directoryEntry.Properties["cn"].Value); + var description = Convert.ToString(directoryEntry.Properties["Description"].Value); + var hostName = Convert.ToString(directoryEntry.Properties["dNSHostName"].Value); + + var newConnectionInfo = new ConnectionInfo + { + Name = displayName, + Hostname = hostName, + Description = description + }; + newConnectionInfo.Inheritance.TurnOnInheritanceCompletely(); + newConnectionInfo.Inheritance.Description = false; + + parentContainer.AddChild(newConnectionInfo); + Runtime.ConnectionList.Add(newConnectionInfo); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/UI/Window/ActiveDirectoryImportWindow.cs b/mRemoteV1/UI/Window/ActiveDirectoryImportWindow.cs index 4ddc5b20..397b059e 100644 --- a/mRemoteV1/UI/Window/ActiveDirectoryImportWindow.cs +++ b/mRemoteV1/UI/Window/ActiveDirectoryImportWindow.cs @@ -2,6 +2,7 @@ using System; using System.Windows.Forms; using WeifenLuo.WinFormsUI.Docking; using mRemoteNG.App; +using mRemoteNG.Container; namespace mRemoteNG.UI.Window @@ -27,22 +28,22 @@ namespace mRemoteNG.UI.Window EnableDisableImportButton(); } - public void btnImport_Click(Object sender, EventArgs e) + public void btnImport_Click(object sender, EventArgs e) { - Import.ImportFromActiveDirectory(ActiveDirectoryTree.ADPath); + var selectedNodeAsContainer = Windows.treeForm.SelectedNode as ContainerInfo ?? + Windows.treeForm.SelectedNode.Parent; + Import.ImportFromActiveDirectory(ActiveDirectoryTree.ADPath, selectedNodeAsContainer); DialogResult = DialogResult.OK; Close(); } - static public void txtDomain_PreviewKeyDown(Object sender, PreviewKeyDownEventArgs e) + public static void txtDomain_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { if (e.KeyCode == Keys.Enter) - { e.IsInputKey = true; - } } - public void txtDomain_KeyDown(Object sender, KeyEventArgs e) + public void txtDomain_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { @@ -51,7 +52,7 @@ namespace mRemoteNG.UI.Window } } - public void btnChangeDomain_Click(Object sender, EventArgs e) + public void btnChangeDomain_Click(object sender, EventArgs e) { ChangeDomain(); } diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index ab4b06f4..d9922c34 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -126,6 +126,7 @@ +