From b5849851343594aea708bf8eac1c977d15d4a23f Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Wed, 24 Feb 2021 20:48:32 -0500 Subject: [PATCH] view source result fix --- .../autopsy/datamodel/ResultsNode.java | 6 +- .../DirectoryTreeTopComponent.java | 92 +++++++++++++++++-- 2 files changed, 90 insertions(+), 8 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ResultsNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/ResultsNode.java index 339c6bb29b..e9b2eba696 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ResultsNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/ResultsNode.java @@ -31,8 +31,12 @@ import org.sleuthkit.datamodel.SleuthkitCase; public class ResultsNode extends DisplayableItemNode { @NbBundle.Messages("ResultsNode.name.text=Results") - public static final String NAME = Bundle.ResultsNode_name_text(); + private static final String NAME = Bundle.ResultsNode_name_text(); + public static String getNameIdentifier() { + return NAME; + } + public ResultsNode(SleuthkitCase sleuthkitCase) { this(sleuthkitCase, 0); } diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java index b4c9e29658..e616b4ac9c 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java @@ -35,6 +35,7 @@ import java.util.concurrent.ExecutionException; import java.util.logging.Level; import java.util.prefs.PreferenceChangeEvent; import java.util.prefs.PreferenceChangeListener; +import java.util.stream.Stream; import javax.swing.Action; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; @@ -81,6 +82,8 @@ import org.sleuthkit.autopsy.datamodel.InterestingHits; import org.sleuthkit.autopsy.datamodel.KeywordHits; import org.sleuthkit.autopsy.datamodel.ResultsNode; import org.sleuthkit.autopsy.datamodel.AutopsyTreeChildFactory; +import org.sleuthkit.autopsy.datamodel.DataSourceGrouping; +import org.sleuthkit.autopsy.datamodel.DataSourcesByTypeNode; import org.sleuthkit.autopsy.datamodel.Tags; import org.sleuthkit.autopsy.datamodel.ViewsNode; import org.sleuthkit.autopsy.datamodel.accounts.Accounts; @@ -89,6 +92,9 @@ import org.sleuthkit.datamodel.Account; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.Content; +import org.sleuthkit.datamodel.DataSource; +import org.sleuthkit.datamodel.Host; +import org.sleuthkit.datamodel.Person; import org.sleuthkit.datamodel.TskCoreException; /** @@ -193,7 +199,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat private void preExpandNodes(Children rootChildren) { BeanTreeView tree = getTree(); - Node results = rootChildren.findChild(ResultsNode.NAME); + Node results = rootChildren.findChild(ResultsNode.getNameIdentifier()); if (!Objects.isNull(results)) { tree.expandNode(results); Children resultsChildren = results.getChildren(); @@ -265,7 +271,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat * Setter to determine if rejected results should be shown or not. * * @param showRejectedResults True if showing rejected results; otherwise - * false. + * false. */ public void setShowRejectedResults(boolean showRejectedResults) { this.showRejectedResults = showRejectedResults; @@ -797,7 +803,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat } // change in node selection else if (changed.equals(ExplorerManager.PROP_SELECTED_NODES)) { respondSelection((Node[]) event.getOldValue(), (Node[]) event.getNewValue()); - } + } } } @@ -1012,8 +1018,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat * Set the selected node using a path to a previously selected node. * * @param previouslySelectedNodePath Path to a previously selected node. - * @param rootNodeName Name of the root node to match, may be - * null. + * @param rootNodeName Name of the root node to match, may be null. */ private void setSelectedNode(final String[] previouslySelectedNodePath, final String rootNodeName) { if (previouslySelectedNodePath == null) { @@ -1070,12 +1075,85 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat return false; } + /** + * Does dfs search of node while nodes are Host, Person, or + * DataSourcesByType looking for the Results Node. + * + * @param node The node. + * @return The child nodes that are at the data source level. + */ + private Node getResultsNodeSearch(Node node, long dataSourceId) { + if (node == null) { + return null; + } else if (node.getLookup().lookup(Host.class) != null + || node.getLookup().lookup(Person.class) != null) { + Children children = node.getChildren(); + Node[] childNodes = children == null ? null : children.getNodes(); + if (childNodes != null) { + for (Node child : childNodes) { + Node foundExtracted = getResultsNodeSearch(child, dataSourceId); + if (foundExtracted != null) { + return foundExtracted; + } + } + } + } else { + DataSource dataSource = node.getLookup().lookup(DataSource.class); + if (dataSource != null && dataSource.getId() == dataSourceId) { + Children dsChildren = node.getChildren(); + if (dsChildren != null) { + return dsChildren.findChild(ResultsNode.getNameIdentifier()); + } + } + } + return null; + } + + /** + * Finds the results node for the specific artifact. + * + * @param art The artifact to find the relevant Results Node. + * @return THe Results Node or null. + */ + private Node getResultsNode(final BlackboardArtifact art) { + Children rootChilds = em.getRootContext().getChildren(); + + Node resultsNode = rootChilds.findChild(ResultsNode.getNameIdentifier()); + if (resultsNode != null) { + return resultsNode; + } + + long dataSourceId; + try { + dataSourceId = art.getDataSource().getId(); + } catch (TskCoreException ex) { + LOGGER.log(Level.WARNING, "There was an error fetching the data source id for artifact.", ex); + return null; + } + + Node[] rootNodes = rootChilds.getNodes(); + if (rootNodes != null) { + for (Node rootNode : rootNodes) { + resultsNode = getResultsNodeSearch(rootNode, dataSourceId); + if (resultsNode != null) { + return resultsNode; + } + } + } + + return null; + } + public void viewArtifact(final BlackboardArtifact art) { int typeID = art.getArtifactTypeID(); String typeName = art.getArtifactTypeName(); - Children rootChilds = em.getRootContext().getChildren(); Node treeNode = null; - Node resultsNode = rootChilds.findChild(ResultsNode.NAME); + + Node resultsNode = getResultsNode(art); + if (resultsNode == null) { + return; + } + Children resultsChilds = resultsNode.getChildren(); if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID()) { Node hashsetRootNode = resultsChilds.findChild(typeName);