From f1962bd082ecdf5c5d863a6c6c8ce839d12a4303 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 9 Apr 2019 10:34:55 -0400 Subject: [PATCH 01/32] Inital POC of new Communications Relationship Panel --- .../communications/ContactsViewer.form | 45 ++++++++++ .../communications/ContactsViewer.java | 88 +++++++++++++++++++ .../communications/MessagesViewer.form | 45 ++++++++++ .../communications/MessagesViewer.java | 88 +++++++++++++++++++ .../communications/RelationshipBrowser.form | 34 +++++++ .../communications/RelationshipBrowser.java | 75 ++++++++++++++++ .../communications/RelationshipsViewer.java | 34 +++++++ .../autopsy/communications/SelectionInfo.java | 46 ++++++++++ 8 files changed, 455 insertions(+) create mode 100755 Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form create mode 100755 Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java create mode 100755 Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form create mode 100755 Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java create mode 100755 Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form create mode 100755 Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java create mode 100755 Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java create mode 100755 Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form new file mode 100755 index 0000000000..81e1e314ef --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form @@ -0,0 +1,45 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java new file mode 100755 index 0000000000..66c22fa4d2 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java @@ -0,0 +1,88 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obt ain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.communications; + +import javax.swing.JPanel; +import org.openide.util.lookup.ServiceProvider; + +/** + * Visualization for contacts + * + */ +@ServiceProvider(service=RelationshipsViewer.class) +public class ContactsViewer extends JPanel implements RelationshipsViewer{ + + /** + * Creates new form ContactsViewer + */ + public ContactsViewer() { + initComponents(); + } + + @Override + public String getDisplayName() { + return "Contacts"; + } + + @Override + public JPanel getPanel() { + return this; + } + + @Override + public void setSelectionInfo(SelectionInfo info) { + testLabel.setText(info.getString()); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + testLabel = new javax.swing.JLabel(); + + org.openide.awt.Mnemonics.setLocalizedText(testLabel, org.openide.util.NbBundle.getMessage(ContactsViewer.class, "ContactsViewer.testLabel.text")); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(testLabel) + .addContainerGap(294, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(testLabel) + .addContainerGap(264, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel testLabel; + // End of variables declaration//GEN-END:variables +} diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form new file mode 100755 index 0000000000..a80677b2ee --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form @@ -0,0 +1,45 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java new file mode 100755 index 0000000000..4624005140 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java @@ -0,0 +1,88 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obt ain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.communications; + +import javax.swing.JPanel; +import org.openide.util.lookup.ServiceProvider; + +/** + * Visualation for Contacts + * + */ +@ServiceProvider(service=RelationshipsViewer.class) +public class MessagesViewer extends JPanel implements RelationshipsViewer{ + + /** + * Creates new form MessagesViewer + */ + public MessagesViewer() { + initComponents(); + } + + @Override + public String getDisplayName() { + return "Messages"; + } + + @Override + public JPanel getPanel() { + return this; + } + + @Override + public void setSelectionInfo(SelectionInfo info) { + testLabel.setText(info.getString()); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + testLabel = new javax.swing.JLabel(); + + org.openide.awt.Mnemonics.setLocalizedText(testLabel, org.openide.util.NbBundle.getMessage(MessagesViewer.class, "MessagesViewer.testLabel.text")); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(testLabel) + .addContainerGap(294, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(testLabel) + .addContainerGap(264, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel testLabel; + // End of variables declaration//GEN-END:variables +} diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form new file mode 100755 index 0000000000..a6a3e195a6 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form @@ -0,0 +1,34 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java new file mode 100755 index 0000000000..75f2a5beb4 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java @@ -0,0 +1,75 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obt ain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.communications; + +import javax.swing.JPanel; +import org.openide.util.Lookup; + +/** + * + * + */ +public class RelationshipBrowser extends JPanel { + + /** + * Creates new form RelationshipBrowser + */ + public RelationshipBrowser() { + initComponents(); + + Lookup.getDefault().lookupAll(RelationshipsViewer.class).forEach((viewer) -> { + tabPane.add(viewer.getDisplayName(), viewer.getPanel()); + }); + } + + public void setSelectionInfo(SelectionInfo info) { + ((RelationshipsViewer)tabPane.getSelectedComponent()).setSelectionInfo(info); + + // TODO If we only pass the info to the currently selected tab, we + // need to do something when the tab changes + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + tabPane = new javax.swing.JTabbedPane(); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(tabPane, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(tabPane, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) + ); + }// //GEN-END:initComponents + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JTabbedPane tabPane; + // End of variables declaration//GEN-END:variables +} diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java b/Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java new file mode 100755 index 0000000000..9a35b42a66 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java @@ -0,0 +1,34 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obt ain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.communications; + +import javax.swing.JPanel; + +/** + * + * + */ +public interface RelationshipsViewer { + + public String getDisplayName(); + + public JPanel getPanel(); + + public void setSelectionInfo(SelectionInfo info); +} diff --git a/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java b/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java new file mode 100755 index 0000000000..0b63e1c129 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java @@ -0,0 +1,46 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obt ain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.communications; + +import java.util.Date; + + +/** + * Class to wrap the details of the current selection from the AccountBrowser or + * VisualizationPane + * + */ +public class SelectionInfo { + + private final String displayString; + + SelectionInfo() { + displayString = (new Date()).toString(); + } + + /** + * Temporary function for testing data flow + * + * @return A String representing the time the object was created + */ + public String getString() { + return displayString; + } + +} From ee7df91d725bf6fbe107d98037867c30b7a8bed1 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 9 Apr 2019 10:45:28 -0400 Subject: [PATCH 02/32] Cleaned up comments --- .../communications/AccountsBrowser.java | 14 +++++- .../autopsy/communications/Bundle.properties | 2 + .../communications/Bundle.properties-MERGED | 2 + .../autopsy/communications/MessageNode.java | 40 ++++++++++++++++ .../communications/MessageNodeFactory.java | 48 +++++++++++++++++++ .../RelaionshipSetNodeFactory.java | 19 ++++++-- .../communications/RelationshipBrowser.form | 2 +- .../communications/RelationshipBrowser.java | 2 +- .../communications/RelationshipsViewer.java | 19 +++++++- .../keywordsearch/Bundle.properties-MERGED | 2 +- .../recentactivity/Bundle.properties-MERGED | 2 +- 11 files changed, 142 insertions(+), 10 deletions(-) create mode 100755 Core/src/org/sleuthkit/autopsy/communications/MessageNode.java create mode 100755 Core/src/org/sleuthkit/autopsy/communications/MessageNodeFactory.java diff --git a/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java index 006fbd846f..d52d2341ab 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java @@ -20,6 +20,9 @@ package org.sleuthkit.autopsy.communications; import com.google.common.eventbus.Subscribe; import java.awt.Component; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; import java.util.logging.Level; import javax.swing.JPanel; import javax.swing.ListSelectionModel; @@ -31,11 +34,13 @@ import org.openide.explorer.ExplorerManager; import org.openide.explorer.ExplorerUtils; import org.openide.nodes.AbstractNode; import org.openide.nodes.Children; +import org.openide.nodes.Node; import org.openide.util.Lookup; import org.openide.util.lookup.ProxyLookup; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.datamodel.AccountDeviceInstance; import org.sleuthkit.datamodel.CommunicationsManager; import org.sleuthkit.datamodel.TskCoreException; @@ -58,6 +63,8 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro private final ExplorerManager messageBrowserEM = new ExplorerManager(); private final ExplorerManager accountsTableEM = new ExplorerManager(); + + final RelationshipBrowser relationshipBrowser; /* * This lookup proxies the selection lookup of both he accounts table and @@ -78,17 +85,22 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro ((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.AccountNode_accountName()); outline.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); outline.setColumnSorted(3, false, 1); //it would be nice if the column index wasn't hardcoded + + relationshipBrowser = new RelationshipBrowser(); + jSplitPane1.setRightComponent(relationshipBrowser); accountsTableEM.addPropertyChangeListener(evt -> { if (ExplorerManager.PROP_ROOT_CONTEXT.equals(evt.getPropertyName())) { SwingUtilities.invokeLater(this::setColumnWidths); } else if (ExplorerManager.PROP_EXPLORED_CONTEXT.equals(evt.getPropertyName())) { SwingUtilities.invokeLater(this::setColumnWidths); + } else if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) { + relationshipBrowser.setSelectionInfo(new SelectionInfo()); } }); final MessageBrowser messageBrowser = new MessageBrowser(accountsTableEM, messageBrowserEM); - jSplitPane1.setRightComponent(messageBrowser); +// jSplitPane1.setRightComponent(messageBrowser); proxyLookup = new ProxyLookup( messageBrowser.getLookup(), diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties index 6665c2e958..de986e82e2 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties @@ -39,3 +39,5 @@ VisualizationPanel.fastOrganicLayoutButton.text=Fast Organic VisualizationPanel.hierarchyLayoutButton.text=Hierarchical VisualizationPanel.clearVizButton.text_1=Clear Viz. VisualizationPanel.snapshotButton.text_1=Snapshot Report +ContactsViewer.testLabel.text=No Value Set +MessagesViewer.testLabel.text=No Value Set diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED index e4daded09b..88ddd57253 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED @@ -83,6 +83,8 @@ VisualizationPanel.fastOrganicLayoutButton.text=Fast Organic VisualizationPanel.hierarchyLayoutButton.text=Hierarchical VisualizationPanel.clearVizButton.text_1=Clear Viz. VisualizationPanel.snapshotButton.text_1=Snapshot Report +ContactsViewer.testLabel.text=No Value Set +MessagesViewer.testLabel.text=No Value Set VisualizationPanel_action_dialogs_title=Communications VisualizationPanel_action_name_text=Snapshot Report VisualizationPanel_module_name=Communications diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java new file mode 100755 index 0000000000..12c1231628 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java @@ -0,0 +1,40 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.communications; + +import org.apache.commons.lang3.StringUtils; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; +import org.sleuthkit.datamodel.BlackboardArtifact; + +/** + * + * + */ +final class MessageNode extends BlackboardArtifactNode { + private static final Logger logger = Logger.getLogger(RelationshipNode.class.getName()); + + MessageNode(BlackboardArtifact artifact) { + super(artifact); + // Grabbed this from RelationshipNode, does always work even with internalization? + final String stripEnd = StringUtils.stripEnd(artifact.getDisplayName(), "s"); // NON-NLS + String removeEndIgnoreCase = StringUtils.removeEndIgnoreCase(stripEnd, "message"); // NON-NLS + setDisplayName(removeEndIgnoreCase.isEmpty() ? stripEnd : removeEndIgnoreCase); + } +} diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessageNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/MessageNodeFactory.java new file mode 100755 index 0000000000..c06bffe692 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/MessageNodeFactory.java @@ -0,0 +1,48 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.communications; + +import java.util.Collection; +import java.util.List; +import org.openide.nodes.ChildFactory; +import org.openide.nodes.Node; +import org.sleuthkit.datamodel.BlackboardArtifact; + +/** + * + * + */ +public class MessageNodeFactory extends ChildFactory { + private final Collection artifacts; + + MessageNodeFactory(Collection artifacts) { + this.artifacts = artifacts; + } + + @Override + protected boolean createKeys(List list) { + list.addAll(artifacts); + return true; + } + + @Override + protected Node createNodeForKey(BlackboardArtifact key) { + return new MessageNode(key); + } +} diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelaionshipSetNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/RelaionshipSetNodeFactory.java index b147ea9537..ac2e5d1c54 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/RelaionshipSetNodeFactory.java +++ b/Core/src/org/sleuthkit/autopsy/communications/RelaionshipSetNodeFactory.java @@ -1,7 +1,20 @@ /* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. + * Autopsy Forensic Browser + * + * Copyright 2017-2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.sleuthkit.autopsy.communications; diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form index a6a3e195a6..7b6fa1d18f 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form @@ -1,6 +1,6 @@ -
+ diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java index 75f2a5beb4..c934ebade9 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java @@ -22,7 +22,7 @@ import javax.swing.JPanel; import org.openide.util.Lookup; /** - * + * Displays the Relationship information for the currently selected accounts. * */ public class RelationshipBrowser extends JPanel { diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java b/Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java index 9a35b42a66..82464de4ba 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java @@ -21,14 +21,29 @@ package org.sleuthkit.autopsy.communications; import javax.swing.JPanel; /** - * - * + * Interface for Controls wishing to appear in the RelationshipBrowser tabPane. */ public interface RelationshipsViewer { + /** + * Returns the value to be displayed on the "tab" + * + * @return String display name + */ public String getDisplayName(); + /** + * Returns the JPanel to be displayed in the RelationshipBrowser. + * + * @return JPanel to be displayed + */ public JPanel getPanel(); + /** + * Sets current SelectionInfo allowing the panel to update accordingly. + * + * @param info SelectionInfo instance representing the currently selected + * accounts + */ public void setSelectionInfo(SelectionInfo info); } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED index 6f95dfc82f..ab7e11a07f 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED @@ -35,7 +35,7 @@ KeywordSearchResultFactory.createNodeForKey.noResultsFound.text=No results found KeywordSearchResultFactory.query.exception.msg=Could not perform the query OpenIDE-Module-Display-Category=Ingest Module -OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\nThe module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found. +OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\n\The module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found. OpenIDE-Module-Name=KeywordSearch OptionsCategory_Name_KeywordSearchOptions=Keyword Search OptionsCategory_Keywords_KeywordSearchOptions=Keyword Search diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED index 17d744eee1..7da2ebca7b 100755 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED @@ -64,7 +64,7 @@ ExtractZone_progress_Msg=Extracting :Zone.Identifer files ExtractZone_Restricted=Restricted Sites Zone ExtractZone_Trusted=Trusted Sites Zone OpenIDE-Module-Display-Category=Ingest Module -OpenIDE-Module-Long-Description=Recent Activity ingest module.\n\nThe module extracts useful information about the recent user activity on the disk image being ingested, such as:\n\n- Recently open documents,\n- Web activity (sites visited, stored cookies, book marked sites, search engine queries, file downloads),\n- Recently attached devices,\n- Installed programs.\n\nThe module currently supports Windows only disk images.\nThe plugin is also fully functional when deployed on Windows version of Autopsy. +OpenIDE-Module-Long-Description=Recent Activity ingest module.\n\n\The module extracts useful information about the recent user activity on the disk image being ingested, such as:\n\n- Recently open documents,\n- Web activity (sites visited, stored cookies, book marked sites, search engine queries, file downloads),\n- Recently attached devices,\n- Installed programs.\n\nThe module currently supports Windows only disk images.\nThe plugin is also fully functional when deployed on Windows version of Autopsy. OpenIDE-Module-Name=RecentActivity OpenIDE-Module-Short-Description=Recent Activity finder ingest module Chrome.moduleName=Chrome From 3b810693b8d7ab9297a318fba5c3788e8d847c6d Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Wed, 10 Apr 2019 11:35:32 -0400 Subject: [PATCH 03/32] Added OutlineView in the messages tab for displaying the messages of the currently selected accounts --- .../communications/AccountsBrowser.java | 26 ++-- .../autopsy/communications/Bundle.properties | 1 - .../communications/Bundle.properties-MERGED | 1 - .../communications/ContactsViewer.java | 2 +- .../autopsy/communications/MessageNode.java | 136 +++++++++++++++++- .../communications/MessageNodeFactory.java | 48 ------- .../MessagesChildNodeFactory.java | 102 +++++++++++++ .../communications/MessagesViewer.form | 18 +-- .../communications/MessagesViewer.java | 72 +++++++--- .../autopsy/communications/SelectionInfo.java | 28 ++-- 10 files changed, 324 insertions(+), 110 deletions(-) delete mode 100755 Core/src/org/sleuthkit/autopsy/communications/MessageNodeFactory.java create mode 100755 Core/src/org/sleuthkit/autopsy/communications/MessagesChildNodeFactory.java diff --git a/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java index d52d2341ab..671f5ed8a2 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java @@ -20,7 +20,6 @@ package org.sleuthkit.autopsy.communications; import com.google.common.eventbus.Subscribe; import java.awt.Component; -import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.logging.Level; @@ -36,11 +35,11 @@ import org.openide.nodes.AbstractNode; import org.openide.nodes.Children; import org.openide.nodes.Node; import org.openide.util.Lookup; -import org.openide.util.lookup.ProxyLookup; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.datamodel.AccountDeviceInstance; +import org.sleuthkit.datamodel.CommunicationsFilter; import org.sleuthkit.datamodel.CommunicationsManager; import org.sleuthkit.datamodel.TskCoreException; @@ -70,7 +69,7 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro * This lookup proxies the selection lookup of both he accounts table and * the messages table. */ - private final ProxyLookup proxyLookup; + private final Lookup lookup; public AccountsBrowser() { initComponents(); @@ -95,16 +94,19 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro } else if (ExplorerManager.PROP_EXPLORED_CONTEXT.equals(evt.getPropertyName())) { SwingUtilities.invokeLater(this::setColumnWidths); } else if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) { - relationshipBrowser.setSelectionInfo(new SelectionInfo()); + final Node[] selectedNodes = accountsTableEM.getSelectedNodes(); + final Set accountDeviceInstances = new HashSet<>(); + + CommunicationsFilter filter = null; + for (final Node node : selectedNodes) { + accountDeviceInstances.add(((AccountDeviceInstanceNode) node).getAccountDeviceInstance()); + filter = ((AccountDeviceInstanceNode)node).getFilter(); + } + relationshipBrowser.setSelectionInfo(new SelectionInfo(accountDeviceInstances, filter)); } }); - final MessageBrowser messageBrowser = new MessageBrowser(accountsTableEM, messageBrowserEM); - -// jSplitPane1.setRightComponent(messageBrowser); - - proxyLookup = new ProxyLookup( - messageBrowser.getLookup(), - ExplorerUtils.createLookup(accountsTableEM, getActionMap())); + + lookup = ExplorerUtils.createLookup(accountsTableEM, getActionMap()); } private void setColumnWidths() { @@ -176,6 +178,6 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro @Override public Lookup getLookup() { - return proxyLookup; + return lookup; } } diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties index de986e82e2..70fb3bc757 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties @@ -40,4 +40,3 @@ VisualizationPanel.hierarchyLayoutButton.text=Hierarchical VisualizationPanel.clearVizButton.text_1=Clear Viz. VisualizationPanel.snapshotButton.text_1=Snapshot Report ContactsViewer.testLabel.text=No Value Set -MessagesViewer.testLabel.text=No Value Set diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED index 88ddd57253..c3c4fbc6f1 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED @@ -84,7 +84,6 @@ VisualizationPanel.hierarchyLayoutButton.text=Hierarchical VisualizationPanel.clearVizButton.text_1=Clear Viz. VisualizationPanel.snapshotButton.text_1=Snapshot Report ContactsViewer.testLabel.text=No Value Set -MessagesViewer.testLabel.text=No Value Set VisualizationPanel_action_dialogs_title=Communications VisualizationPanel_action_name_text=Snapshot Report VisualizationPanel_module_name=Communications diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java index 66c22fa4d2..1808c8bb62 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java @@ -47,7 +47,7 @@ public class ContactsViewer extends JPanel implements RelationshipsViewer{ @Override public void setSelectionInfo(SelectionInfo info) { - testLabel.setText(info.getString()); + } /** diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java index 12c1231628..c557809a54 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java @@ -18,23 +18,147 @@ */ package org.sleuthkit.autopsy.communications; +import java.util.TimeZone; +import java.util.logging.Level; import org.apache.commons.lang3.StringUtils; +import org.openide.nodes.AbstractNode; +import org.openide.nodes.Children; +import org.openide.nodes.Sheet; +import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; +import org.sleuthkit.autopsy.datamodel.ExtractedContent; +import org.sleuthkit.autopsy.datamodel.NodeProperty; import org.sleuthkit.datamodel.BlackboardArtifact; +import org.sleuthkit.datamodel.BlackboardAttribute; +import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME; +import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT; +import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START; +import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_FROM; +import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_TO; +import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM; +import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO; +import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT; +import static org.sleuthkit.datamodel.BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME; +import org.sleuthkit.datamodel.TimeUtilities; +import org.sleuthkit.datamodel.TskCoreException; /** - * - * + * Wraps a BlackboardArtifact as an AbstractNode for use in an OutlookView */ -final class MessageNode extends BlackboardArtifactNode { +final class MessageNode extends AbstractNode { private static final Logger logger = Logger.getLogger(RelationshipNode.class.getName()); + private final BlackboardArtifact artifact; + MessageNode(BlackboardArtifact artifact) { - super(artifact); - // Grabbed this from RelationshipNode, does always work even with internalization? + super(Children.LEAF, Lookups.fixed(artifact)); + this.artifact = artifact; + final String stripEnd = StringUtils.stripEnd(artifact.getDisplayName(), "s"); // NON-NLS String removeEndIgnoreCase = StringUtils.removeEndIgnoreCase(stripEnd, "message"); // NON-NLS setDisplayName(removeEndIgnoreCase.isEmpty() ? stripEnd : removeEndIgnoreCase); + + int typeID = artifact.getArtifactTypeID(); + + String filePath = "org/sleuthkit/autopsy/images/"; //NON-NLS + if( typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID()) { + filePath = filePath + "mail-icon-16.png"; //NON-NLS + } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE.getTypeID()) { + filePath = filePath + "message.png"; //NON-NLS + } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG.getTypeID()) { + filePath = filePath + "calllog.png"; //NON-NLS + } + + setIconBaseWithExtension(filePath); + } + + @Override + protected Sheet createSheet() { + Sheet sheet = new Sheet(); + Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES); + if (sheetSet == null) { + sheetSet = Sheet.createPropertiesSet(); + sheet.put(sheetSet); + } + + sheetSet.put(new NodeProperty<>("Type", "Type", "Type", getDisplayName())); //NON-NLS + + BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID()); + if (null != fromID) { + //Consider refactoring this to reduce boilerplate + switch (fromID) { + case TSK_EMAIL_MSG: + sheetSet.put(new NodeProperty<>("From", "From", "From", + StringUtils.strip(getAttributeDisplayString(artifact, TSK_EMAIL_FROM), " \t\n;"))); //NON-NLS + sheetSet.put(new NodeProperty<>("To", "To", "To", + StringUtils.strip(getAttributeDisplayString(artifact, TSK_EMAIL_TO), " \t\n;"))); //NON-NLS + sheetSet.put(new NodeProperty<>("Date", "Date", "Date", + getAttributeDisplayString(artifact, TSK_DATETIME_SENT))); //NON-NLS + sheetSet.put(new NodeProperty<>("Subject", "Subject", "Subject", + getAttributeDisplayString(artifact, TSK_SUBJECT))); //NON-NLS + try { + sheetSet.put(new NodeProperty<>("Attms", "Attms", "Attms", artifact.getChildrenCount())); //NON-NLS + } catch (TskCoreException ex) { + logger.log(Level.WARNING, "Error loading attachment count for " + artifact, ex); //NON-NLS + } + + break; + case TSK_MESSAGE: + sheetSet.put(new NodeProperty<>("From", "From", "From", + getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_FROM))); //NON-NLS + sheetSet.put(new NodeProperty<>("To", "To", "To", + getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_TO))); //NON-NLS + sheetSet.put(new NodeProperty<>("Date", "Date", "Date", + getAttributeDisplayString(artifact, TSK_DATETIME))); //NON-NLS + sheetSet.put(new NodeProperty<>("Subject", "Subject", "Subject", + getAttributeDisplayString(artifact, TSK_SUBJECT))); //NON-NLS + try { + sheetSet.put(new NodeProperty<>("Attms", "Attms", "Attms", artifact.getChildrenCount())); //NON-NLS + } catch (TskCoreException ex) { + logger.log(Level.WARNING, "Error loading attachment count for " + artifact, ex); //NON-NLS + } + break; + case TSK_CALLLOG: + sheetSet.put(new NodeProperty<>("From", "From", "From", + getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_FROM))); //NON-NLS + sheetSet.put(new NodeProperty<>("To", "To", "To", + getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_TO))); //NON-NLS + sheetSet.put(new NodeProperty<>("Date", "Date", "Date", + getAttributeDisplayString(artifact, TSK_DATETIME_START))); //NON-NLS + break; + default: + break; + } + } + + return sheet; + } + + /** + * + * Get the display string for the attribute of the given type from the given + * artifact. + * + * @param artifact the value of artifact + * @param attributeType the value of TSK_SUBJECT1 + * + * @return The display string, or an empty string if there is no such + * attribute or an an error. + */ + private static String getAttributeDisplayString(final BlackboardArtifact artifact, final BlackboardAttribute.ATTRIBUTE_TYPE attributeType) { + try { + BlackboardAttribute attribute = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.fromID(attributeType.getTypeID()))); + if (attribute == null) { + return ""; + } else if (attributeType.getValueType() == DATETIME) { + return TimeUtilities.epochToTime(attribute.getValueLong(), + TimeZone.getTimeZone(Utils.getUserPreferredZoneId())); + } else { + return attribute.getDisplayString(); + } + } catch (TskCoreException tskCoreException) { + logger.log(Level.WARNING, "Error getting attribute value.", tskCoreException); //NON-NLS + return ""; + } } } diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessageNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/MessageNodeFactory.java deleted file mode 100755 index c06bffe692..0000000000 --- a/Core/src/org/sleuthkit/autopsy/communications/MessageNodeFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2019 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.autopsy.communications; - -import java.util.Collection; -import java.util.List; -import org.openide.nodes.ChildFactory; -import org.openide.nodes.Node; -import org.sleuthkit.datamodel.BlackboardArtifact; - -/** - * - * - */ -public class MessageNodeFactory extends ChildFactory { - private final Collection artifacts; - - MessageNodeFactory(Collection artifacts) { - this.artifacts = artifacts; - } - - @Override - protected boolean createKeys(List list) { - list.addAll(artifacts); - return true; - } - - @Override - protected Node createNodeForKey(BlackboardArtifact key) { - return new MessageNode(key); - } -} diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesChildNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/MessagesChildNodeFactory.java new file mode 100755 index 0000000000..9a1c7d1024 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/MessagesChildNodeFactory.java @@ -0,0 +1,102 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.communications; + +import java.util.List; +import java.util.Set; +import java.util.logging.Level; +import org.openide.nodes.ChildFactory; +import org.openide.nodes.Node; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.datamodel.BlackboardArtifact; +import org.sleuthkit.datamodel.CommunicationsManager; +import org.sleuthkit.datamodel.Content; +import org.sleuthkit.datamodel.TskCoreException; + +/** + * ChildFactory that creates createKeys and nodes from a given selectionInfo for + * only emails, call logs and messages. + * + */ +public class MessagesChildNodeFactory extends ChildFactory { + + private static final Logger logger = Logger.getLogger(MessagesChildNodeFactory.class.getName()); + + private CommunicationsManager communicationManager = null; + private final SelectionInfo selectionInfo; + + /** + * Construct a new MessageChildNodeFactory from the currently selectionInfo + * + * @param selectionInfo SelectionInfo object for the currently selected + * accounts + */ + MessagesChildNodeFactory(SelectionInfo selectionInfo) { + this.selectionInfo = selectionInfo; + + try { + communicationManager = Case.getCurrentCaseThrows().getSleuthkitCase().getCommunicationsManager(); + } catch (NoCurrentCaseException | TskCoreException ex) { + logger.log(Level.SEVERE, "Failed to get communications manager from case.", ex); //NON-NLS + } + } + + /** + * Creates a list of Keys (BlackboardArtifact) for only messages for the + * currently selected accounts + * @param list List of BlackboardArtifact to populate + * @return True on success + */ + @Override + protected boolean createKeys(List list) { + if (communicationManager == null) { + return false; + } + + final Set relationshipSources; + + try { + relationshipSources = communicationManager.getRelationshipSources(selectionInfo.getAccountDevicesInstances(), selectionInfo.getCommunicationsFilter()); + + relationshipSources.stream().filter((content) -> (content instanceof BlackboardArtifact)).forEachOrdered((content) -> { + + BlackboardArtifact bba = (BlackboardArtifact) content; + BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(bba.getArtifactTypeID()); + + if (fromID == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG + || fromID == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG + || fromID == BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE) { + list.add(bba); + } + }); + + } catch (TskCoreException ex) { + logger.log(Level.SEVERE, "Failed to get relationship sources.", ex); //NON-NLS + } + + return true; + } + + @Override + protected Node createNodeForKey(BlackboardArtifact key) { + return new MessageNode(key); + } +} diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form index a80677b2ee..a8a0606f8f 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form +++ b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form @@ -16,30 +16,20 @@ - - - - - + - - - + + - - - - - - + diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java index 4624005140..b5b5159aa3 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java @@ -19,25 +19,61 @@ package org.sleuthkit.autopsy.communications; import javax.swing.JPanel; +import javax.swing.ListSelectionModel; +import org.netbeans.swing.outline.DefaultOutlineModel; +import org.netbeans.swing.outline.Outline; +import org.openide.explorer.ExplorerManager; +import org.openide.explorer.ExplorerUtils; +import org.openide.nodes.AbstractNode; +import org.openide.nodes.Children; +import org.openide.util.Lookup; +import org.openide.util.NbBundle.Messages; import org.openide.util.lookup.ServiceProvider; /** - * Visualation for Contacts - * + * Visualation for the messages of the currently selected accounts. */ @ServiceProvider(service=RelationshipsViewer.class) -public class MessagesViewer extends JPanel implements RelationshipsViewer{ +public class MessagesViewer extends JPanel implements RelationshipsViewer, ExplorerManager.Provider, Lookup.Provider { + private final ExplorerManager tableEM = new ExplorerManager(); + private final Lookup lookup; + private final Outline outline; + + @Messages({ + "MessageViewer_tabTitle=Messages", + "MessageViewer_columnHeader_From=From", + "MessageViewer_columnHeader_To=To", + "MessageViewer_columnHeader_Date=Date", + "MessageViewer_columnHeader_Subject=Subject", + "MessageViewer_columnHeader_Attms=Attachments" + }) + /** * Creates new form MessagesViewer */ public MessagesViewer() { initComponents(); + + outline = outlineView.getOutline(); + outlineView.setPropertyColumns( + "From", Bundle.MessageViewer_columnHeader_From(), + "To", Bundle.MessageViewer_columnHeader_To(), + "Date", Bundle.MessageViewer_columnHeader_Date(), + "Subject", Bundle.MessageViewer_columnHeader_Subject(), + "Attms", Bundle.MessageViewer_columnHeader_Attms() + + ); + outline.setRootVisible(false); + outline.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + ((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.AccountNode_accountName()); + + lookup = ExplorerUtils.createLookup(tableEM, getActionMap()); } @Override public String getDisplayName() { - return "Messages"; + return Bundle.MessageViewer_tabTitle(); } @Override @@ -47,7 +83,17 @@ public class MessagesViewer extends JPanel implements RelationshipsViewer{ @Override public void setSelectionInfo(SelectionInfo info) { - testLabel.setText(info.getString()); + tableEM.setRootContext(new AbstractNode(Children.create(new MessagesChildNodeFactory(info), true))); + } + + @Override + public ExplorerManager getExplorerManager() { + return tableEM; + } + + @Override + public Lookup getLookup() { + return lookup; } /** @@ -59,30 +105,24 @@ public class MessagesViewer extends JPanel implements RelationshipsViewer{ // //GEN-BEGIN:initComponents private void initComponents() { - testLabel = new javax.swing.JLabel(); - - org.openide.awt.Mnemonics.setLocalizedText(testLabel, org.openide.util.NbBundle.getMessage(MessagesViewer.class, "MessagesViewer.testLabel.text")); // NOI18N + outlineView = new org.openide.explorer.view.OutlineView(); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(testLabel) - .addContainerGap(294, Short.MAX_VALUE)) + .addComponent(outlineView, javax.swing.GroupLayout.DEFAULT_SIZE, 480, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(testLabel) - .addContainerGap(264, Short.MAX_VALUE)) + .addComponent(outlineView, javax.swing.GroupLayout.PREFERRED_SIZE, 475, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 16, Short.MAX_VALUE)) ); }// //GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JLabel testLabel; + private org.openide.explorer.view.OutlineView outlineView; // End of variables declaration//GEN-END:variables } diff --git a/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java b/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java index 0b63e1c129..6dc370841b 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java +++ b/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java @@ -18,7 +18,10 @@ */ package org.sleuthkit.autopsy.communications; -import java.util.Date; +import java.util.Set; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.datamodel.AccountDeviceInstance; +import org.sleuthkit.datamodel.CommunicationsFilter; /** @@ -28,19 +31,22 @@ import java.util.Date; */ public class SelectionInfo { - private final String displayString; + static final private Logger logger = Logger.getLogger(SelectionInfo.class.getName()); + + private final Set accountDeviceInstances; + private final CommunicationsFilter communicationFilter; - SelectionInfo() { - displayString = (new Date()).toString(); + SelectionInfo(Set accountDeviceInstances, CommunicationsFilter communicationFilter) { + this.accountDeviceInstances = accountDeviceInstances; + this.communicationFilter = communicationFilter; } - /** - * Temporary function for testing data flow - * - * @return A String representing the time the object was created - */ - public String getString() { - return displayString; + public Set getAccountDevicesInstances(){ + return accountDeviceInstances; + } + + public CommunicationsFilter getCommunicationsFilter() { + return communicationFilter; } } From 6fcb97429640fcef669ec837db96d7552feab4ba Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Wed, 10 Apr 2019 11:40:15 -0400 Subject: [PATCH 04/32] Removed unused import --- .../autopsy/communications/Bundle.properties-MERGED | 6 ++++++ .../org/sleuthkit/autopsy/communications/MessageNode.java | 1 - 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED index c3c4fbc6f1..e5f00998a6 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED @@ -23,6 +23,12 @@ FiltersPanel.deviceRequiredLabel.text=Select at least one. FiltersPanel.accountTypeRequiredLabel.text=Select at least one. FiltersPanel.needsRefreshLabel.text=Displayed data is out of date. Press Refresh. MessageBrowser.DataResultViewerTable.title=Messages +MessageViewer_columnHeader_Attms=Attachments +MessageViewer_columnHeader_Date=Date +MessageViewer_columnHeader_From=From +MessageViewer_columnHeader_Subject=Subject +MessageViewer_columnHeader_To=To +MessageViewer_tabTitle=Messages OpenCVTAction.displayName=Communications PinAccountsAction.pluralText=Add Selected Accounts to Visualization PinAccountsAction.singularText=Add Selected Account to Visualization diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java index c557809a54..4a02a1d0ce 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java @@ -26,7 +26,6 @@ import org.openide.nodes.Children; import org.openide.nodes.Sheet; import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.datamodel.ExtractedContent; import org.sleuthkit.autopsy.datamodel.NodeProperty; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; From f4c6d70ff7bfe38419bad411e9713f5735088044 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Thu, 11 Apr 2019 11:46:41 -0400 Subject: [PATCH 05/32] Added the message content viewer to the MessageBrowser --- .../autopsy/communications/Bundle.properties | 1 - .../communications/Bundle.properties-MERGED | 1 - .../communications/ContactsViewer.form | 21 +--- .../communications/ContactsViewer.java | 15 +-- .../autopsy/communications/MessageNode.java | 53 +++++---- .../communications/MessagesViewer.form | 13 ++- .../communications/MessagesViewer.java | 101 ++++++++++++++---- .../RelaionshipSetNodeFactory.java | 48 --------- .../communications/RelationshipBrowser.form | 3 + .../communications/RelationshipBrowser.java | 22 +++- 10 files changed, 147 insertions(+), 131 deletions(-) delete mode 100644 Core/src/org/sleuthkit/autopsy/communications/RelaionshipSetNodeFactory.java diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties index 70fb3bc757..6665c2e958 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties @@ -39,4 +39,3 @@ VisualizationPanel.fastOrganicLayoutButton.text=Fast Organic VisualizationPanel.hierarchyLayoutButton.text=Hierarchical VisualizationPanel.clearVizButton.text_1=Clear Viz. VisualizationPanel.snapshotButton.text_1=Snapshot Report -ContactsViewer.testLabel.text=No Value Set diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED index e5f00998a6..1716b3c7e8 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED @@ -89,7 +89,6 @@ VisualizationPanel.fastOrganicLayoutButton.text=Fast Organic VisualizationPanel.hierarchyLayoutButton.text=Hierarchical VisualizationPanel.clearVizButton.text_1=Clear Viz. VisualizationPanel.snapshotButton.text_1=Snapshot Report -ContactsViewer.testLabel.text=No Value Set VisualizationPanel_action_dialogs_title=Communications VisualizationPanel_action_name_text=Snapshot Report VisualizationPanel_module_name=Communications diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form index 81e1e314ef..e7e306cf63 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form @@ -16,30 +16,13 @@ - - - - - + - - - - - + - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java index 1808c8bb62..0473ba0e13 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java @@ -59,30 +59,19 @@ public class ContactsViewer extends JPanel implements RelationshipsViewer{ // //GEN-BEGIN:initComponents private void initComponents() { - testLabel = new javax.swing.JLabel(); - - org.openide.awt.Mnemonics.setLocalizedText(testLabel, org.openide.util.NbBundle.getMessage(ContactsViewer.class, "ContactsViewer.testLabel.text")); // NOI18N - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(testLabel) - .addContainerGap(294, Short.MAX_VALUE)) + .addGap(0, 692, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(testLabel) - .addContainerGap(264, Short.MAX_VALUE)) + .addGap(0, 573, Short.MAX_VALUE) ); }// //GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JLabel testLabel; // End of variables declaration//GEN-END:variables } diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java index 4a02a1d0ce..963cd2369e 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java @@ -18,14 +18,15 @@ */ package org.sleuthkit.autopsy.communications; +import java.util.List; import java.util.TimeZone; import java.util.logging.Level; import org.apache.commons.lang3.StringUtils; -import org.openide.nodes.AbstractNode; -import org.openide.nodes.Children; import org.openide.nodes.Sheet; -import org.openide.util.lookup.Lookups; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance; +import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; import org.sleuthkit.autopsy.datamodel.NodeProperty; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; @@ -38,42 +39,28 @@ import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHO import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT; import static org.sleuthkit.datamodel.BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME; +import org.sleuthkit.datamodel.Tag; import org.sleuthkit.datamodel.TimeUtilities; import org.sleuthkit.datamodel.TskCoreException; /** * Wraps a BlackboardArtifact as an AbstractNode for use in an OutlookView */ -final class MessageNode extends AbstractNode { +final class MessageNode extends BlackboardArtifactNode { private static final Logger logger = Logger.getLogger(RelationshipNode.class.getName()); - private final BlackboardArtifact artifact; - MessageNode(BlackboardArtifact artifact) { - super(Children.LEAF, Lookups.fixed(artifact)); - this.artifact = artifact; + super(artifact); final String stripEnd = StringUtils.stripEnd(artifact.getDisplayName(), "s"); // NON-NLS String removeEndIgnoreCase = StringUtils.removeEndIgnoreCase(stripEnd, "message"); // NON-NLS setDisplayName(removeEndIgnoreCase.isEmpty() ? stripEnd : removeEndIgnoreCase); - - int typeID = artifact.getArtifactTypeID(); - - String filePath = "org/sleuthkit/autopsy/images/"; //NON-NLS - if( typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID()) { - filePath = filePath + "mail-icon-16.png"; //NON-NLS - } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE.getTypeID()) { - filePath = filePath + "message.png"; //NON-NLS - } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG.getTypeID()) { - filePath = filePath + "calllog.png"; //NON-NLS - } - - setIconBaseWithExtension(filePath); } @Override protected Sheet createSheet() { Sheet sheet = new Sheet(); + List tags = getAllTagsFromDatabase(); Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES); if (sheetSet == null) { sheetSet = Sheet.createPropertiesSet(); @@ -82,6 +69,19 @@ final class MessageNode extends AbstractNode { sheetSet.put(new NodeProperty<>("Type", "Type", "Type", getDisplayName())); //NON-NLS + addScoreProperty(sheetSet, tags); + + CorrelationAttributeInstance correlationAttribute = null; + if (UserPreferences.hideCentralRepoCommentsAndOccurrences()== false) { + correlationAttribute = getCorrelationAttributeInstance(); + } + addCommentProperty(sheetSet, tags, correlationAttribute); + + if (UserPreferences.hideCentralRepoCommentsAndOccurrences()== false) { + addCountProperty(sheetSet, correlationAttribute); + } + final BlackboardArtifact artifact = getArtifact(); + BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID()); if (null != fromID) { //Consider refactoring this to reduce boilerplate @@ -160,4 +160,15 @@ final class MessageNode extends AbstractNode { return ""; } } + + /** + * Circumvent DataResultFilterNode's slightly odd delegation to + * BlackboardArtifactNode.getSourceName(). + * + * @return the displayName of this Node, which is the type. + */ + @Override + public String getSourceName() { + return getDisplayName(); + } } diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form index a8a0606f8f..7368b264e5 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form +++ b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form @@ -16,14 +16,16 @@ - + + - - + + + @@ -31,5 +33,10 @@ + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java index b5b5159aa3..e58bf3a39c 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java @@ -18,28 +18,36 @@ */ package org.sleuthkit.autopsy.communications; +import java.awt.Component; +import java.awt.KeyboardFocusManager; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import javax.swing.JPanel; import javax.swing.ListSelectionModel; +import static javax.swing.SwingUtilities.isDescendingFrom; import org.netbeans.swing.outline.DefaultOutlineModel; import org.netbeans.swing.outline.Outline; import org.openide.explorer.ExplorerManager; -import org.openide.explorer.ExplorerUtils; +import static org.openide.explorer.ExplorerUtils.createLookup; import org.openide.nodes.AbstractNode; import org.openide.nodes.Children; +import org.openide.nodes.Node; import org.openide.util.Lookup; import org.openide.util.NbBundle.Messages; import org.openide.util.lookup.ServiceProvider; +import org.sleuthkit.autopsy.directorytree.DataResultFilterNode; /** * Visualation for the messages of the currently selected accounts. */ -@ServiceProvider(service=RelationshipsViewer.class) -public class MessagesViewer extends JPanel implements RelationshipsViewer, ExplorerManager.Provider, Lookup.Provider { +@ServiceProvider(service = RelationshipsViewer.class) +public class MessagesViewer extends JPanel implements RelationshipsViewer, ExplorerManager.Provider, Lookup.Provider{ - private final ExplorerManager tableEM = new ExplorerManager(); - private final Lookup lookup; + private final ExplorerManager tableEM; private final Outline outline; - + private final ModifiableProxyLookup proxyLookup; + private final PropertyChangeListener focusPropertyListener; + @Messages({ "MessageViewer_tabTitle=Messages", "MessageViewer_columnHeader_From=From", @@ -48,13 +56,36 @@ public class MessagesViewer extends JPanel implements RelationshipsViewer, Explo "MessageViewer_columnHeader_Subject=Subject", "MessageViewer_columnHeader_Attms=Attachments" }) - + /** * Creates new form MessagesViewer */ public MessagesViewer() { + tableEM = new ExplorerManager(); + proxyLookup = new ModifiableProxyLookup(createLookup(tableEM, getActionMap())); + + // See org.sleuthkit.autopsy.timeline.TimeLineTopComponent for a detailed + // explaination of focusPropertyListener + focusPropertyListener = (final PropertyChangeEvent focusEvent) -> { + if (focusEvent.getPropertyName().equalsIgnoreCase("focusOwner")) { + final Component newFocusOwner = (Component) focusEvent.getNewValue(); + + if (newFocusOwner == null) { + return; + } + if (isDescendingFrom(newFocusOwner, contentViewer)) { + //if the focus owner is within the MessageContentViewer (the attachments table) + proxyLookup.setNewLookups(createLookup(((MessageDataContent) contentViewer).getExplorerManager(), getActionMap())); + } else if (isDescendingFrom(newFocusOwner, MessagesViewer.this)) { + //... or if it is within the Results table. + proxyLookup.setNewLookups(createLookup(tableEM, getActionMap())); + + } + } + } ; + initComponents(); - + outline = outlineView.getOutline(); outlineView.setPropertyColumns( "From", Bundle.MessageViewer_columnHeader_From(), @@ -62,38 +93,60 @@ public class MessagesViewer extends JPanel implements RelationshipsViewer, Explo "Date", Bundle.MessageViewer_columnHeader_Date(), "Subject", Bundle.MessageViewer_columnHeader_Subject(), "Attms", Bundle.MessageViewer_columnHeader_Attms() - ); outline.setRootVisible(false); outline.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); ((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.AccountNode_accountName()); - - lookup = ExplorerUtils.createLookup(tableEM, getActionMap()); + + tableEM.addPropertyChangeListener((PropertyChangeEvent evt) -> { + if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) { + final Node[] nodes = tableEM.getSelectedNodes(); + + if (nodes != null && nodes.length > 0) { + contentViewer.setNode(nodes[0]); + } + } + }); } - + @Override public String getDisplayName() { return Bundle.MessageViewer_tabTitle(); } - + @Override public JPanel getPanel() { return this; } - + @Override public void setSelectionInfo(SelectionInfo info) { - tableEM.setRootContext(new AbstractNode(Children.create(new MessagesChildNodeFactory(info), true))); + tableEM.setRootContext(new DataResultFilterNode(new AbstractNode(Children.create(new MessagesChildNodeFactory(info), true)), getExplorerManager())); } - - @Override + + @Override public ExplorerManager getExplorerManager() { return tableEM; } - + @Override public Lookup getLookup() { - return lookup; + return proxyLookup; + } + + @Override + public void addNotify() { + super.addNotify(); + //add listener that maintains correct selection in the Global Actions Context + KeyboardFocusManager.getCurrentKeyboardFocusManager() + .addPropertyChangeListener("focusOwner", focusPropertyListener); + } + + @Override + public void removeNotify() { + super.removeNotify(); + KeyboardFocusManager.getCurrentKeyboardFocusManager() + .removePropertyChangeListener("focusOwner", focusPropertyListener); } /** @@ -106,23 +159,27 @@ public class MessagesViewer extends JPanel implements RelationshipsViewer, Explo private void initComponents() { outlineView = new org.openide.explorer.view.OutlineView(); + contentViewer = new MessageDataContent(); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(outlineView, javax.swing.GroupLayout.DEFAULT_SIZE, 480, Short.MAX_VALUE) + .addComponent(outlineView, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(contentViewer, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addComponent(outlineView, javax.swing.GroupLayout.PREFERRED_SIZE, 475, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 16, Short.MAX_VALUE)) + .addComponent(outlineView, javax.swing.GroupLayout.PREFERRED_SIZE, 190, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(contentViewer, javax.swing.GroupLayout.DEFAULT_SIZE, 778, Short.MAX_VALUE)) ); }// //GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables + private org.sleuthkit.autopsy.contentviewers.MessageContentViewer contentViewer; private org.openide.explorer.view.OutlineView outlineView; // End of variables declaration//GEN-END:variables } diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelaionshipSetNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/RelaionshipSetNodeFactory.java deleted file mode 100644 index ac2e5d1c54..0000000000 --- a/Core/src/org/sleuthkit/autopsy/communications/RelaionshipSetNodeFactory.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2017-2019 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.autopsy.communications; - -import java.util.Collection; -import java.util.List; -import org.openide.nodes.ChildFactory; -import org.openide.nodes.Node; -import org.sleuthkit.datamodel.BlackboardArtifact; - -/** - * - */ -public class RelaionshipSetNodeFactory extends ChildFactory { - - private final Collection artifacts; - - public RelaionshipSetNodeFactory(Collection artifacts) { - this.artifacts = artifacts; - } - - @Override - protected boolean createKeys(List list) { - list.addAll(artifacts); - return true; - } - - @Override - protected Node createNodeForKey(BlackboardArtifact key) { - return new RelationshipNode(key); - } -} diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form index 7b6fa1d18f..a664317372 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form @@ -27,6 +27,9 @@ + + + diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java index c934ebade9..6f60981278 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java @@ -27,6 +27,8 @@ import org.openide.util.Lookup; */ public class RelationshipBrowser extends JPanel { + private SelectionInfo currentSelection; + /** * Creates new form RelationshipBrowser */ @@ -38,11 +40,15 @@ public class RelationshipBrowser extends JPanel { }); } + /** + * Sets the value of currentSelection and passes the SelectionInfo onto + * the currently selected\visible tab. + * + * @param info Currently selected account nodes + */ public void setSelectionInfo(SelectionInfo info) { + currentSelection = info; ((RelationshipsViewer)tabPane.getSelectedComponent()).setSelectionInfo(info); - - // TODO If we only pass the info to the currently selected tab, we - // need to do something when the tab changes } /** @@ -56,6 +62,12 @@ public class RelationshipBrowser extends JPanel { tabPane = new javax.swing.JTabbedPane(); + tabPane.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + tabPaneStateChanged(evt); + } + }); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -68,6 +80,10 @@ public class RelationshipBrowser extends JPanel { ); }// //GEN-END:initComponents + private void tabPaneStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_tabPaneStateChanged + ((RelationshipsViewer)tabPane.getSelectedComponent()).setSelectionInfo(currentSelection); + }//GEN-LAST:event_tabPaneStateChanged + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTabbedPane tabPane; From 6bf77cc1e0a924e0be1cdaf654b2aa201297bf70 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Fri, 12 Apr 2019 15:44:26 -0400 Subject: [PATCH 06/32] Relationship viewer with contacts tab is completed --- .../autopsy/communications/Bundle.properties | 1 + .../communications/Bundle.properties-MERGED | 12 ++ .../communications/ContactDetailsPane.form | 61 ++++++++ .../communications/ContactDetailsPane.java | 99 +++++++++++++ .../autopsy/communications/ContactNode.java | 126 +++++++++++++++++ .../ContactsChildNodeFactory.java | 98 +++++++++++++ .../communications/ContactsViewer.form | 18 ++- .../communications/ContactsViewer.java | 131 ++++++++++++++++-- .../autopsy/communications/FiltersPanel.java | 3 +- .../autopsy/communications/MessageNode.java | 23 +-- .../MessagesChildNodeFactory.java | 4 +- .../communications/MessagesViewer.java | 18 +-- .../communications/RelationshipBrowser.java | 18 +-- .../communications/RelationshipsViewer.java | 16 +-- .../autopsy/communications/SelectionInfo.java | 55 +++++--- 15 files changed, 609 insertions(+), 74 deletions(-) create mode 100755 Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.form create mode 100755 Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java create mode 100755 Core/src/org/sleuthkit/autopsy/communications/ContactNode.java create mode 100755 Core/src/org/sleuthkit/autopsy/communications/ContactsChildNodeFactory.java diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties index 6665c2e958..5f1dd31ce7 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties @@ -39,3 +39,4 @@ VisualizationPanel.fastOrganicLayoutButton.text=Fast Organic VisualizationPanel.hierarchyLayoutButton.text=Hierarchical VisualizationPanel.clearVizButton.text_1=Clear Viz. VisualizationPanel.snapshotButton.text_1=Snapshot Report +ContactDetailsPane.nameLabel.text=jLabel1 diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED index 1716b3c7e8..de288e42f3 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED @@ -3,6 +3,17 @@ AccountNode.accountType=Type AccountNode.device=Device AccountNode.messageCount=Msgs applyText=Apply +ContactNode_Email=Email Address +ContactNode_Home_Number=Home Number +ContactNode_Mobile_Number=Mobile Number +ContactNode_Name=Name +ContactNode_Office_Number=Office Number +ContactNode_Phone=Phone Number +ContactNode_URL=URL +ContactsViewer_columnHeader_Email=Email +ContactsViewer_columnHeader_Name=Name +ContactsViewer_columnHeader_Phone=Phone +ContactsViewer_tabTitle=Contacts CTL_OpenCVTAction=Communications CVTTopComponent.name=\ Communications Visualization CVTTopComponent.TabConstraints.tabTitle=Visualize @@ -89,6 +100,7 @@ VisualizationPanel.fastOrganicLayoutButton.text=Fast Organic VisualizationPanel.hierarchyLayoutButton.text=Hierarchical VisualizationPanel.clearVizButton.text_1=Clear Viz. VisualizationPanel.snapshotButton.text_1=Snapshot Report +ContactDetailsPane.nameLabel.text=jLabel1 VisualizationPanel_action_dialogs_title=Communications VisualizationPanel_action_name_text=Snapshot Report VisualizationPanel_module_name=Communications diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.form b/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.form new file mode 100755 index 0000000000..2cf54c02ea --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.form @@ -0,0 +1,61 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java b/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java new file mode 100755 index 0000000000..0d466dac88 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java @@ -0,0 +1,99 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.sleuthkit.autopsy.communications; + +import org.openide.explorer.ExplorerManager; +import org.openide.nodes.Node; + +/** + * Displays the propertied of a ContactNode in a PropertySheet. + */ +public final class ContactDetailsPane extends javax.swing.JPanel implements ExplorerManager.Provider { + + final private ExplorerManager explorerManager = new ExplorerManager(); + + /** + * Displays the propertied of a ContactNode in a PropertySheet. + */ + public ContactDetailsPane() { + initComponents(); + this.setEnabled(false); + } + + /** + * Sets the list of nodes for the property sheet. + * + * @param nodes List of nodes to set + */ + public void setNode(Node[] nodes) { + if (nodes != null) { + nameLabel.setText(nodes[0].getDisplayName()); + } else { + nameLabel.setText(""); + } + + propertySheet.setNodes(nodes); + } + + @Override + public ExplorerManager getExplorerManager() { + return explorerManager; + } + + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + nameLabel.setEnabled(enabled); + propertySheet.setEnabled(enabled); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + nameLabel = new javax.swing.JLabel(); + propertySheet = new org.openide.explorer.propertysheet.PropertySheet(); + + nameLabel.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(nameLabel, org.openide.util.NbBundle.getMessage(ContactDetailsPane.class, "ContactDetailsPane.nameLabel.text")); // NOI18N + + propertySheet.setDescriptionAreaVisible(false); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(propertySheet, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(nameLabel) + .addGap(0, 0, Short.MAX_VALUE))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(nameLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(propertySheet, javax.swing.GroupLayout.DEFAULT_SIZE, 283, Short.MAX_VALUE) + .addContainerGap()) + ); + }// //GEN-END:initComponents + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel nameLabel; + private org.openide.explorer.propertysheet.PropertySheet propertySheet; + // End of variables declaration//GEN-END:variables +} diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java new file mode 100755 index 0000000000..4792e70af8 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java @@ -0,0 +1,126 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.communications; + +import java.util.List; +import java.util.TimeZone; +import java.util.logging.Level; +import org.openide.nodes.Sheet; +import org.openide.util.NbBundle.Messages; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; +import org.sleuthkit.autopsy.datamodel.NodeProperty; +import org.sleuthkit.datamodel.BlackboardArtifact; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT; +import org.sleuthkit.datamodel.BlackboardAttribute; +import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL; +import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME; +import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER; +import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_HOME; +import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_MOBILE; +import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_OFFICE; +import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL; +import static org.sleuthkit.datamodel.BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME; +import org.sleuthkit.datamodel.Tag; +import org.sleuthkit.datamodel.TimeUtilities; +import org.sleuthkit.datamodel.TskCoreException; + +/** + * Extends BlackboardArtifactNode to override createSheet to create a contact + * artifact specific sheet. + */ +final class ContactNode extends BlackboardArtifactNode { + + private static final Logger logger = Logger.getLogger(RelationshipNode.class.getName()); + + @Messages({ + "ContactNode_Name=Name", + "ContactNode_Phone=Phone Number", + "ContactNode_Email=Email Address", + "ContactNode_Mobile_Number=Mobile Number", + "ContactNode_Office_Number=Office Number", + "ContactNode_URL=URL", + "ContactNode_Home_Number=Home Number",}) + + ContactNode(BlackboardArtifact artifact) { + super(artifact); + + setDisplayName(getAttributeDisplayString(artifact, TSK_NAME)); + } + + @Override + protected Sheet createSheet() { + final BlackboardArtifact artifact = getArtifact(); + BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID()); + if (fromID != TSK_CONTACT) { + return super.createSheet(); + } + + Sheet sheet = new Sheet(); + List tags = getAllTagsFromDatabase(); + Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES); + if (sheetSet == null) { + sheetSet = Sheet.createPropertiesSet(); + sheet.put(sheetSet); + } + + sheetSet.put(new NodeProperty<>("email", Bundle.ContactNode_Email(), "", + getAttributeDisplayString(artifact, TSK_EMAIL))); //NON-NLS + sheetSet.put(new NodeProperty<>("phone", Bundle.ContactNode_Phone(), "", + getAttributeDisplayString(artifact, TSK_PHONE_NUMBER))); //NON-NLS + sheetSet.put(new NodeProperty<>("mobile", Bundle.ContactNode_Mobile_Number(), "", + getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_MOBILE))); //NON-NLS + sheetSet.put(new NodeProperty<>("home", Bundle.ContactNode_Home_Number(), "", + getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_HOME))); //NON-NLS + sheetSet.put(new NodeProperty<>("office", Bundle.ContactNode_Office_Number(), "", + getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_OFFICE))); //NON-NLS + sheetSet.put(new NodeProperty<>("url", Bundle.ContactNode_URL(), "", + getAttributeDisplayString(artifact, TSK_URL))); //NON-NLS + + return sheet; + } + + private static String getAttributeDisplayString(final BlackboardArtifact artifact, final BlackboardAttribute.ATTRIBUTE_TYPE attributeType) { + try { + BlackboardAttribute attribute = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.fromID(attributeType.getTypeID()))); + if (attribute == null) { + return ""; + } else if (attributeType.getValueType() == DATETIME) { + return TimeUtilities.epochToTime(attribute.getValueLong(), + TimeZone.getTimeZone(Utils.getUserPreferredZoneId())); + } else { + return attribute.getDisplayString(); + } + } catch (TskCoreException tskCoreException) { + logger.log(Level.WARNING, "Error getting attribute value.", tskCoreException); //NON-NLS + return ""; + } + } + + /** + * Circumvent DataResultFilterNode's slightly odd delegation to + * BlackboardArtifactNode.getSourceName(). + * + * @return the displayName of this Node, which is the type. + */ + @Override + public String getSourceName() { + return getDisplayName(); + } +} diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsChildNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/ContactsChildNodeFactory.java new file mode 100755 index 0000000000..4e5df13589 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactsChildNodeFactory.java @@ -0,0 +1,98 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.communications; + +import java.util.List; +import java.util.Set; +import java.util.logging.Level; +import org.openide.nodes.ChildFactory; +import org.openide.nodes.Node; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.datamodel.BlackboardArtifact; +import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT; +import org.sleuthkit.datamodel.CommunicationsManager; +import org.sleuthkit.datamodel.Content; +import org.sleuthkit.datamodel.TskCoreException; + +/** + * ChildFactory for ContactNodes. + */ +final class ContactsChildNodeFactory extends ChildFactory{ + private static final Logger logger = Logger.getLogger(MessagesChildNodeFactory.class.getName()); + + private CommunicationsManager communicationManager = null; + private final SelectionInfo selectionInfo; + + /** + * Construct a new ContactsChildNodeFactory from the currently selectionInfo + * + * @param selectionInfo SelectionInfo object for the currently selected + * accounts + */ + ContactsChildNodeFactory(SelectionInfo selectionInfo) { + this.selectionInfo = selectionInfo; + + try { + communicationManager = Case.getCurrentCaseThrows().getSleuthkitCase().getCommunicationsManager(); + } catch (NoCurrentCaseException | TskCoreException ex) { + logger.log(Level.SEVERE, "Failed to get communications manager from case.", ex); //NON-NLS + } + } + + /** + * Creates a list of Keys (BlackboardArtifact) for only contacts of the + * currently selected accounts + * @param list List of BlackboardArtifact to populate + * @return True on success + */ + @Override + protected boolean createKeys(List list) { + if (communicationManager == null) { + return false; + } + + final Set relationshipSources; + + try { + relationshipSources = communicationManager.getRelationshipSources(selectionInfo.getAccountDevicesInstances(), selectionInfo.getCommunicationsFilter()); + + relationshipSources.stream().filter((content) -> (content instanceof BlackboardArtifact)).forEachOrdered((content) -> { + + BlackboardArtifact bba = (BlackboardArtifact) content; + BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(bba.getArtifactTypeID()); + + if (fromID == TSK_CONTACT) { + list.add(bba); + } + }); + + } catch (TskCoreException ex) { + logger.log(Level.SEVERE, "Failed to get relationship sources.", ex); //NON-NLS + } + + return true; + } + + @Override + protected Node createNodeForKey(BlackboardArtifact key) { + return new ContactNode(key); + } +} diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form index e7e306cf63..166fd065bf 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form @@ -16,13 +16,27 @@ - + + - + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java index 0473ba0e13..3e794f48a8 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java @@ -18,36 +18,134 @@ */ package org.sleuthkit.autopsy.communications; +import java.awt.Component; +import java.awt.KeyboardFocusManager; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import javax.swing.JPanel; +import javax.swing.ListSelectionModel; +import static javax.swing.SwingUtilities.isDescendingFrom; +import org.netbeans.swing.outline.DefaultOutlineModel; +import org.netbeans.swing.outline.Outline; +import org.openide.explorer.ExplorerManager; +import static org.openide.explorer.ExplorerUtils.createLookup; +import org.openide.nodes.AbstractNode; +import org.openide.nodes.Children; +import org.openide.nodes.Node; +import org.openide.util.Lookup; +import org.openide.util.NbBundle; import org.openide.util.lookup.ServiceProvider; +import org.sleuthkit.autopsy.corecomponents.TableFilterNode; +import org.sleuthkit.autopsy.directorytree.DataResultFilterNode; /** - * Visualization for contacts - * + * Visualization for contact nodes. + * */ -@ServiceProvider(service=RelationshipsViewer.class) -public class ContactsViewer extends JPanel implements RelationshipsViewer{ +@ServiceProvider(service = RelationshipsViewer.class) +public final class ContactsViewer extends JPanel implements RelationshipsViewer, ExplorerManager.Provider, Lookup.Provider { + + private final ExplorerManager tableEM; + private final Outline outline; + private final ModifiableProxyLookup proxyLookup; + private final PropertyChangeListener focusPropertyListener; + + @NbBundle.Messages({ + "ContactsViewer_tabTitle=Contacts", + "ContactsViewer_columnHeader_Name=Name", + "ContactsViewer_columnHeader_Phone=Phone", + "ContactsViewer_columnHeader_Email=Email",}) /** - * Creates new form ContactsViewer + * Visualization for contact nodes. */ public ContactsViewer() { + tableEM = new ExplorerManager(); + proxyLookup = new ModifiableProxyLookup(createLookup(tableEM, getActionMap())); + + // See org.sleuthkit.autopsy.timeline.TimeLineTopComponent for a detailed + // explaination of focusPropertyListener + focusPropertyListener = (final PropertyChangeEvent focusEvent) -> { + if (focusEvent.getPropertyName().equalsIgnoreCase("focusOwner")) { + final Component newFocusOwner = (Component) focusEvent.getNewValue(); + + if (newFocusOwner == null) { + return; + } + if (isDescendingFrom(newFocusOwner, contactPane)) { + //if the focus owner is within the MessageContentViewer (the attachments table) + proxyLookup.setNewLookups(createLookup(contactPane.getExplorerManager(), getActionMap())); + } else if (isDescendingFrom(newFocusOwner, ContactsViewer.this)) { + //... or if it is within the Results table. + proxyLookup.setNewLookups(createLookup(tableEM, getActionMap())); + + } + } + }; + initComponents(); + + outline = outlineView.getOutline(); + outlineView.setPropertyColumns( + "email", Bundle.ContactsViewer_columnHeader_Email(), + "phone", Bundle.ContactsViewer_columnHeader_Phone() + ); + outline.setRootVisible(false); + outline.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + ((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.ContactsViewer_columnHeader_Name()); + + tableEM.addPropertyChangeListener((PropertyChangeEvent evt) -> { + if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) { + final Node[] nodes = tableEM.getSelectedNodes(); + + if (nodes != null && nodes.length > 0) { + contactPane.setEnabled(true); + contactPane.setNode(nodes); + } + } + }); } - + @Override public String getDisplayName() { - return "Contacts"; + return Bundle.ContactsViewer_tabTitle(); } - + @Override public JPanel getPanel() { return this; } - + @Override public void setSelectionInfo(SelectionInfo info) { - + contactPane.setNode(new Node[]{new AbstractNode(Children.LEAF)}); + contactPane.setEnabled(false); + tableEM.setRootContext(new TableFilterNode(new DataResultFilterNode(new AbstractNode(Children.create(new ContactsChildNodeFactory(info), true)), getExplorerManager()), true)); + } + + @Override + public ExplorerManager getExplorerManager() { + return tableEM; + } + + @Override + public Lookup getLookup() { + return proxyLookup; + } + + @Override + public void addNotify() { + super.addNotify(); + //add listener that maintains correct selection in the Global Actions Context + KeyboardFocusManager.getCurrentKeyboardFocusManager() + .addPropertyChangeListener("focusOwner", focusPropertyListener); + } + + @Override + public void removeNotify() { + super.removeNotify(); + KeyboardFocusManager.getCurrentKeyboardFocusManager() + .removePropertyChangeListener("focusOwner", focusPropertyListener); } /** @@ -59,19 +157,28 @@ public class ContactsViewer extends JPanel implements RelationshipsViewer{ // //GEN-BEGIN:initComponents private void initComponents() { + outlineView = new org.openide.explorer.view.OutlineView(); + contactPane = new org.sleuthkit.autopsy.communications.ContactDetailsPane(); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 692, Short.MAX_VALUE) + .addComponent(outlineView, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(contactPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 573, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(outlineView, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(contactPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) ); }// //GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables + private org.sleuthkit.autopsy.communications.ContactDetailsPane contactPane; + private org.openide.explorer.view.OutlineView outlineView; // End of variables declaration//GEN-END:variables } diff --git a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java index 587bf47260..287b6f9ae9 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/FiltersPanel.java @@ -49,6 +49,7 @@ import org.sleuthkit.datamodel.CommunicationsFilter.DateRangeFilter; import org.sleuthkit.datamodel.CommunicationsFilter.DeviceFilter; import org.sleuthkit.datamodel.DataSource; import static org.sleuthkit.datamodel.Relationship.Type.CALL_LOG; +import static org.sleuthkit.datamodel.Relationship.Type.CONTACT; import static org.sleuthkit.datamodel.Relationship.Type.MESSAGE; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; @@ -514,7 +515,7 @@ final public class FiltersPanel extends JPanel { commsFilter.addAndFilter(getAccountTypeFilter()); commsFilter.addAndFilter(getDateRangeFilter()); commsFilter.addAndFilter(new CommunicationsFilter.RelationshipTypeFilter( - ImmutableSet.of(CALL_LOG, MESSAGE))); + ImmutableSet.of(CALL_LOG, MESSAGE, CONTACT))); return commsFilter; } diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java index 963cd2369e..8fd5e44d96 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java @@ -47,16 +47,17 @@ import org.sleuthkit.datamodel.TskCoreException; * Wraps a BlackboardArtifact as an AbstractNode for use in an OutlookView */ final class MessageNode extends BlackboardArtifactNode { + private static final Logger logger = Logger.getLogger(RelationshipNode.class.getName()); - + MessageNode(BlackboardArtifact artifact) { super(artifact); - + final String stripEnd = StringUtils.stripEnd(artifact.getDisplayName(), "s"); // NON-NLS String removeEndIgnoreCase = StringUtils.removeEndIgnoreCase(stripEnd, "message"); // NON-NLS setDisplayName(removeEndIgnoreCase.isEmpty() ? stripEnd : removeEndIgnoreCase); } - + @Override protected Sheet createSheet() { Sheet sheet = new Sheet(); @@ -68,20 +69,20 @@ final class MessageNode extends BlackboardArtifactNode { } sheetSet.put(new NodeProperty<>("Type", "Type", "Type", getDisplayName())); //NON-NLS - + addScoreProperty(sheetSet, tags); - + CorrelationAttributeInstance correlationAttribute = null; - if (UserPreferences.hideCentralRepoCommentsAndOccurrences()== false) { + if (UserPreferences.hideCentralRepoCommentsAndOccurrences() == false) { correlationAttribute = getCorrelationAttributeInstance(); } addCommentProperty(sheetSet, tags, correlationAttribute); - - if (UserPreferences.hideCentralRepoCommentsAndOccurrences()== false) { + + if (UserPreferences.hideCentralRepoCommentsAndOccurrences() == false) { addCountProperty(sheetSet, correlationAttribute); } final BlackboardArtifact artifact = getArtifact(); - + BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID()); if (null != fromID) { //Consider refactoring this to reduce boilerplate @@ -160,8 +161,8 @@ final class MessageNode extends BlackboardArtifactNode { return ""; } } - - /** + + /** * Circumvent DataResultFilterNode's slightly odd delegation to * BlackboardArtifactNode.getSourceName(). * diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesChildNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/MessagesChildNodeFactory.java index 9a1c7d1024..220e3f718f 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessagesChildNodeFactory.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessagesChildNodeFactory.java @@ -36,7 +36,7 @@ import org.sleuthkit.datamodel.TskCoreException; * only emails, call logs and messages. * */ -public class MessagesChildNodeFactory extends ChildFactory { +final class MessagesChildNodeFactory extends ChildFactory { private static final Logger logger = Logger.getLogger(MessagesChildNodeFactory.class.getName()); @@ -62,7 +62,9 @@ public class MessagesChildNodeFactory extends ChildFactory { /** * Creates a list of Keys (BlackboardArtifact) for only messages for the * currently selected accounts + * * @param list List of BlackboardArtifact to populate + * * @return True on success */ @Override diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java index e58bf3a39c..ca185eee90 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java @@ -35,13 +35,14 @@ import org.openide.nodes.Node; import org.openide.util.Lookup; import org.openide.util.NbBundle.Messages; import org.openide.util.lookup.ServiceProvider; +import org.sleuthkit.autopsy.corecomponents.TableFilterNode; import org.sleuthkit.autopsy.directorytree.DataResultFilterNode; /** * Visualation for the messages of the currently selected accounts. */ @ServiceProvider(service = RelationshipsViewer.class) -public class MessagesViewer extends JPanel implements RelationshipsViewer, ExplorerManager.Provider, Lookup.Provider{ +public final class MessagesViewer extends JPanel implements RelationshipsViewer, ExplorerManager.Provider, Lookup.Provider { private final ExplorerManager tableEM; private final Outline outline; @@ -58,7 +59,7 @@ public class MessagesViewer extends JPanel implements RelationshipsViewer, Explo }) /** - * Creates new form MessagesViewer + * Visualation for the messages of the currently selected accounts. */ public MessagesViewer() { tableEM = new ExplorerManager(); @@ -69,7 +70,7 @@ public class MessagesViewer extends JPanel implements RelationshipsViewer, Explo focusPropertyListener = (final PropertyChangeEvent focusEvent) -> { if (focusEvent.getPropertyName().equalsIgnoreCase("focusOwner")) { final Component newFocusOwner = (Component) focusEvent.getNewValue(); - + if (newFocusOwner == null) { return; } @@ -79,10 +80,10 @@ public class MessagesViewer extends JPanel implements RelationshipsViewer, Explo } else if (isDescendingFrom(newFocusOwner, MessagesViewer.this)) { //... or if it is within the Results table. proxyLookup.setNewLookups(createLookup(tableEM, getActionMap())); - + } } - } ; + }; initComponents(); @@ -92,11 +93,12 @@ public class MessagesViewer extends JPanel implements RelationshipsViewer, Explo "To", Bundle.MessageViewer_columnHeader_To(), "Date", Bundle.MessageViewer_columnHeader_Date(), "Subject", Bundle.MessageViewer_columnHeader_Subject(), - "Attms", Bundle.MessageViewer_columnHeader_Attms() + "Attms", Bundle.MessageViewer_columnHeader_Attms(), + "Type", "Type" ); outline.setRootVisible(false); outline.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - ((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.AccountNode_accountName()); + ((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel("Type"); tableEM.addPropertyChangeListener((PropertyChangeEvent evt) -> { if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) { @@ -121,7 +123,7 @@ public class MessagesViewer extends JPanel implements RelationshipsViewer, Explo @Override public void setSelectionInfo(SelectionInfo info) { - tableEM.setRootContext(new DataResultFilterNode(new AbstractNode(Children.create(new MessagesChildNodeFactory(info), true)), getExplorerManager())); + tableEM.setRootContext(new TableFilterNode(new DataResultFilterNode(new AbstractNode(Children.create(new MessagesChildNodeFactory(info), true)), getExplorerManager()), true)); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java index 6f60981278..8fa082fc2c 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java @@ -23,12 +23,12 @@ import org.openide.util.Lookup; /** * Displays the Relationship information for the currently selected accounts. - * + * */ -public class RelationshipBrowser extends JPanel { +final class RelationshipBrowser extends JPanel { private SelectionInfo currentSelection; - + /** * Creates new form RelationshipBrowser */ @@ -39,16 +39,16 @@ public class RelationshipBrowser extends JPanel { tabPane.add(viewer.getDisplayName(), viewer.getPanel()); }); } - + /** - * Sets the value of currentSelection and passes the SelectionInfo onto - * the currently selected\visible tab. - * + * Sets the value of currentSelection and passes the SelectionInfo onto the + * currently selected\visible tab. + * * @param info Currently selected account nodes */ public void setSelectionInfo(SelectionInfo info) { currentSelection = info; - ((RelationshipsViewer)tabPane.getSelectedComponent()).setSelectionInfo(info); + ((RelationshipsViewer) tabPane.getSelectedComponent()).setSelectionInfo(info); } /** @@ -81,7 +81,7 @@ public class RelationshipBrowser extends JPanel { }// //GEN-END:initComponents private void tabPaneStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_tabPaneStateChanged - ((RelationshipsViewer)tabPane.getSelectedComponent()).setSelectionInfo(currentSelection); + ((RelationshipsViewer) tabPane.getSelectedComponent()).setSelectionInfo(currentSelection); }//GEN-LAST:event_tabPaneStateChanged diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java b/Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java index 82464de4ba..395182f5d6 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java @@ -24,26 +24,26 @@ import javax.swing.JPanel; * Interface for Controls wishing to appear in the RelationshipBrowser tabPane. */ public interface RelationshipsViewer { - + /** * Returns the value to be displayed on the "tab" - * + * * @return String display name */ public String getDisplayName(); - + /** * Returns the JPanel to be displayed in the RelationshipBrowser. - * + * * @return JPanel to be displayed */ public JPanel getPanel(); - + /** * Sets current SelectionInfo allowing the panel to update accordingly. - * + * * @param info SelectionInfo instance representing the currently selected - * accounts + * accounts */ - public void setSelectionInfo(SelectionInfo info); + public void setSelectionInfo(SelectionInfo info); } diff --git a/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java b/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java index 6dc370841b..d4131b2024 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java +++ b/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java @@ -19,34 +19,45 @@ package org.sleuthkit.autopsy.communications; import java.util.Set; -import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.datamodel.AccountDeviceInstance; import org.sleuthkit.datamodel.CommunicationsFilter; - /** * Class to wrap the details of the current selection from the AccountBrowser or * VisualizationPane - * */ -public class SelectionInfo { - - static final private Logger logger = Logger.getLogger(SelectionInfo.class.getName()); +final class SelectionInfo { + + private final Set accountDeviceInstances; + private final CommunicationsFilter communicationFilter; + + /** + * Wraps the details of the currently selected accounts. + * + * @param accountDeviceInstances Selected accountDecivedInstances + * @param communicationFilter Currently selected communications filters + */ + SelectionInfo(Set accountDeviceInstances, CommunicationsFilter communicationFilter) { + this.accountDeviceInstances = accountDeviceInstances; + this.communicationFilter = communicationFilter; + } + + /** + * Returns the currently selected accountDeviceInstances + * + * @return Set of AccountDeviceInstance + */ + public Set getAccountDevicesInstances() { + return accountDeviceInstances; + } + + /** + * Returns the currently selected communications filters. + * + * @return Instance of CommunicationsFilter + */ + public CommunicationsFilter getCommunicationsFilter() { + return communicationFilter; + } - private final Set accountDeviceInstances; - private final CommunicationsFilter communicationFilter; - - SelectionInfo(Set accountDeviceInstances, CommunicationsFilter communicationFilter) { - this.accountDeviceInstances = accountDeviceInstances; - this.communicationFilter = communicationFilter; - } - - public Set getAccountDevicesInstances(){ - return accountDeviceInstances; - } - - public CommunicationsFilter getCommunicationsFilter() { - return communicationFilter; - } - } From febbb1212338aff2b45dbb8f0c274ae40b53c234 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Fri, 12 Apr 2019 16:35:17 -0400 Subject: [PATCH 07/32] Added the refresh node functionality to the node factories. --- .../ContactsChildNodeFactory.java | 29 +++++++++++++------ .../communications/ContactsViewer.java | 7 ++++- .../MessagesChildNodeFactory.java | 29 +++++++++++++------ .../communications/MessagesViewer.java | 7 ++++- .../autopsy/communications/SelectionInfo.java | 2 +- 5 files changed, 53 insertions(+), 21 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsChildNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/ContactsChildNodeFactory.java index 4e5df13589..08471c5324 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactsChildNodeFactory.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactsChildNodeFactory.java @@ -38,8 +38,7 @@ import org.sleuthkit.datamodel.TskCoreException; final class ContactsChildNodeFactory extends ChildFactory{ private static final Logger logger = Logger.getLogger(MessagesChildNodeFactory.class.getName()); - private CommunicationsManager communicationManager = null; - private final SelectionInfo selectionInfo; + private SelectionInfo selectionInfo; /** * Construct a new ContactsChildNodeFactory from the currently selectionInfo @@ -48,13 +47,17 @@ final class ContactsChildNodeFactory extends ChildFactory{ * accounts */ ContactsChildNodeFactory(SelectionInfo selectionInfo) { + this.selectionInfo = selectionInfo; + } + + /** + * Updates the current instance of selectionInfo and calls the refresh method. + * + * @param selectionInfo New instance of the currently selected accounts + */ + public void refresh(SelectionInfo selectionInfo) { this.selectionInfo = selectionInfo; - - try { - communicationManager = Case.getCurrentCaseThrows().getSleuthkitCase().getCommunicationsManager(); - } catch (NoCurrentCaseException | TskCoreException ex) { - logger.log(Level.SEVERE, "Failed to get communications manager from case.", ex); //NON-NLS - } + refresh(true); } /** @@ -65,9 +68,17 @@ final class ContactsChildNodeFactory extends ChildFactory{ */ @Override protected boolean createKeys(List list) { - if (communicationManager == null) { + CommunicationsManager communicationManager; + try { + communicationManager = Case.getCurrentCaseThrows().getSleuthkitCase().getCommunicationsManager(); + } catch (NoCurrentCaseException | TskCoreException ex) { + logger.log(Level.SEVERE, "Failed to get communications manager from case.", ex); //NON-NLS return false; } + + if(selectionInfo == null) { + return true; + } final Set relationshipSources; diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java index 3e794f48a8..3c8cebedd5 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java @@ -49,6 +49,7 @@ public final class ContactsViewer extends JPanel implements RelationshipsViewer, private final Outline outline; private final ModifiableProxyLookup proxyLookup; private final PropertyChangeListener focusPropertyListener; + private final ContactsChildNodeFactory nodeFactory; @NbBundle.Messages({ "ContactsViewer_tabTitle=Contacts", @@ -62,6 +63,7 @@ public final class ContactsViewer extends JPanel implements RelationshipsViewer, public ContactsViewer() { tableEM = new ExplorerManager(); proxyLookup = new ModifiableProxyLookup(createLookup(tableEM, getActionMap())); + nodeFactory = new ContactsChildNodeFactory(null); // See org.sleuthkit.autopsy.timeline.TimeLineTopComponent for a detailed // explaination of focusPropertyListener @@ -104,6 +106,8 @@ public final class ContactsViewer extends JPanel implements RelationshipsViewer, } } }); + + tableEM.setRootContext(new TableFilterNode(new DataResultFilterNode(new AbstractNode(Children.create(nodeFactory, true)), getExplorerManager()), true)); } @Override @@ -120,7 +124,8 @@ public final class ContactsViewer extends JPanel implements RelationshipsViewer, public void setSelectionInfo(SelectionInfo info) { contactPane.setNode(new Node[]{new AbstractNode(Children.LEAF)}); contactPane.setEnabled(false); - tableEM.setRootContext(new TableFilterNode(new DataResultFilterNode(new AbstractNode(Children.create(new ContactsChildNodeFactory(info), true)), getExplorerManager()), true)); + + nodeFactory.refresh(info); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesChildNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/MessagesChildNodeFactory.java index 220e3f718f..38d5cfa8f0 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessagesChildNodeFactory.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessagesChildNodeFactory.java @@ -40,8 +40,7 @@ final class MessagesChildNodeFactory extends ChildFactory { private static final Logger logger = Logger.getLogger(MessagesChildNodeFactory.class.getName()); - private CommunicationsManager communicationManager = null; - private final SelectionInfo selectionInfo; + private SelectionInfo selectionInfo; /** * Construct a new MessageChildNodeFactory from the currently selectionInfo @@ -51,12 +50,16 @@ final class MessagesChildNodeFactory extends ChildFactory { */ MessagesChildNodeFactory(SelectionInfo selectionInfo) { this.selectionInfo = selectionInfo; - - try { - communicationManager = Case.getCurrentCaseThrows().getSleuthkitCase().getCommunicationsManager(); - } catch (NoCurrentCaseException | TskCoreException ex) { - logger.log(Level.SEVERE, "Failed to get communications manager from case.", ex); //NON-NLS - } + } + + /** + * Updates the current instance of selectionInfo and calls the refresh method. + * + * @param selectionInfo New instance of the currently selected accounts + */ + public void refresh(SelectionInfo selectionInfo) { + this.selectionInfo = selectionInfo; + refresh(true); } /** @@ -69,9 +72,17 @@ final class MessagesChildNodeFactory extends ChildFactory { */ @Override protected boolean createKeys(List list) { - if (communicationManager == null) { + CommunicationsManager communicationManager; + try { + communicationManager = Case.getCurrentCaseThrows().getSleuthkitCase().getCommunicationsManager(); + } catch (NoCurrentCaseException | TskCoreException ex) { + logger.log(Level.SEVERE, "Failed to get communications manager from case.", ex); //NON-NLS return false; } + + if(selectionInfo == null) { + return true; + } final Set relationshipSources; diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java index ca185eee90..45b121e243 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java @@ -48,6 +48,7 @@ public final class MessagesViewer extends JPanel implements RelationshipsViewer, private final Outline outline; private final ModifiableProxyLookup proxyLookup; private final PropertyChangeListener focusPropertyListener; + private final MessagesChildNodeFactory nodeFactory; @Messages({ "MessageViewer_tabTitle=Messages", @@ -64,6 +65,7 @@ public final class MessagesViewer extends JPanel implements RelationshipsViewer, public MessagesViewer() { tableEM = new ExplorerManager(); proxyLookup = new ModifiableProxyLookup(createLookup(tableEM, getActionMap())); + nodeFactory = new MessagesChildNodeFactory(null); // See org.sleuthkit.autopsy.timeline.TimeLineTopComponent for a detailed // explaination of focusPropertyListener @@ -109,6 +111,8 @@ public final class MessagesViewer extends JPanel implements RelationshipsViewer, } } }); + + tableEM.setRootContext(new TableFilterNode(new DataResultFilterNode(new AbstractNode(Children.create(nodeFactory, true)), getExplorerManager()), true)); } @Override @@ -123,7 +127,8 @@ public final class MessagesViewer extends JPanel implements RelationshipsViewer, @Override public void setSelectionInfo(SelectionInfo info) { - tableEM.setRootContext(new TableFilterNode(new DataResultFilterNode(new AbstractNode(Children.create(new MessagesChildNodeFactory(info), true)), getExplorerManager()), true)); +// tableEM.setRootContext(new TableFilterNode(new DataResultFilterNode(new AbstractNode(Children.create(new MessagesChildNodeFactory(info), true)), getExplorerManager()), true)); + nodeFactory.refresh(info); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java b/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java index d4131b2024..d1a28eb2d6 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java +++ b/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java @@ -26,7 +26,7 @@ import org.sleuthkit.datamodel.CommunicationsFilter; * Class to wrap the details of the current selection from the AccountBrowser or * VisualizationPane */ -final class SelectionInfo { +public final class SelectionInfo { private final Set accountDeviceInstances; private final CommunicationsFilter communicationFilter; From 7e7ba8b4deb8151363a930e13b1fc7372bf487ce Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 16 Apr 2019 10:48:56 -0400 Subject: [PATCH 08/32] Added the new MessageBrowser to the VisualizationPanel --- .../communications/AccountDetailsNode.java | 88 ------- .../communications/CVTTopComponent.java | 8 +- .../communications/MessageBrowser.form | 56 ----- .../communications/MessageBrowser.java | 231 ------------------ .../autopsy/communications/MessageNode.java | 2 +- .../communications/MessagesViewer.java | 4 +- .../communications/RelationshipBrowser.java | 18 +- .../communications/RelationshipNode.java | 174 ------------- .../autopsy/communications/SelectionNode.java | 140 ----------- .../communications/VisualizationPanel.java | 66 ++--- .../keywordsearch/Bundle.properties-MERGED | 2 +- .../recentactivity/Bundle.properties-MERGED | 2 +- 12 files changed, 42 insertions(+), 749 deletions(-) delete mode 100644 Core/src/org/sleuthkit/autopsy/communications/AccountDetailsNode.java delete mode 100644 Core/src/org/sleuthkit/autopsy/communications/MessageBrowser.form delete mode 100644 Core/src/org/sleuthkit/autopsy/communications/MessageBrowser.java delete mode 100644 Core/src/org/sleuthkit/autopsy/communications/RelationshipNode.java delete mode 100644 Core/src/org/sleuthkit/autopsy/communications/SelectionNode.java diff --git a/Core/src/org/sleuthkit/autopsy/communications/AccountDetailsNode.java b/Core/src/org/sleuthkit/autopsy/communications/AccountDetailsNode.java deleted file mode 100644 index 39eae2b9f3..0000000000 --- a/Core/src/org/sleuthkit/autopsy/communications/AccountDetailsNode.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2017 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.autopsy.communications; - -import java.util.List; -import java.util.Set; -import java.util.logging.Level; -import org.openide.nodes.AbstractNode; -import org.openide.nodes.ChildFactory; -import org.openide.nodes.Children; -import org.openide.nodes.Node; -import org.python.google.common.collect.Iterables; -import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.datamodel.AccountDeviceInstance; -import org.sleuthkit.datamodel.BlackboardArtifact; -import org.sleuthkit.datamodel.CommunicationsFilter; -import org.sleuthkit.datamodel.CommunicationsManager; -import org.sleuthkit.datamodel.Content; -import org.sleuthkit.datamodel.TskCoreException; - -/** - * 'Root' Node for the Account/Messages area. Has children which are all the - * relationships of all the accounts in this node. - * - */ -final class AccountDetailsNode extends AbstractNode { - - private final static Logger logger = Logger.getLogger(AccountDetailsNode.class.getName()); - - AccountDetailsNode(Set accountDeviceInstances, CommunicationsFilter filter, CommunicationsManager commsManager) { - super(Children.create(new AccountRelationshipChildren(accountDeviceInstances, commsManager, filter), true)); - String displayName = (accountDeviceInstances.size() == 1) - ? Iterables.getOnlyElement(accountDeviceInstances).getAccount().getTypeSpecificID() - : accountDeviceInstances.size() + " accounts"; - setDisplayName(displayName); - } - - /** - * Children object for the relationships that the accounts are part of. - */ - private static class AccountRelationshipChildren extends ChildFactory { - - private final Set accountDeviceInstances; - private final CommunicationsManager commsManager; - private final CommunicationsFilter filter; - - private AccountRelationshipChildren(Set accountDeviceInstances, CommunicationsManager commsManager, CommunicationsFilter filter) { - this.accountDeviceInstances = accountDeviceInstances; - this.commsManager = commsManager; - this.filter = filter; - } - - @Override - protected boolean createKeys(List list) { - try { - list.addAll(commsManager.getRelationshipSources(accountDeviceInstances, filter)); - } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Error getting communications", ex); - } - return true; - } - - @Override - protected Node createNodeForKey(Content t) { - if (t instanceof BlackboardArtifact) { - return new RelationshipNode((BlackboardArtifact) t); - } else { - throw new UnsupportedOperationException("Cannot create a RelationshipNode for non BlackboardArtifact content."); - } - } - } -} diff --git a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java index 1e1004de25..d8a53784b7 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/communications/CVTTopComponent.java @@ -19,6 +19,7 @@ package org.sleuthkit.autopsy.communications; import com.google.common.eventbus.Subscribe; +import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.util.List; @@ -61,8 +62,11 @@ public final class CVTTopComponent extends TopComponent { associateLookup(proxyLookup); // Make sure the Global Actions Context is proxying the selection of the active tab. browseVisualizeTabPane.addChangeListener(changeEvent -> { - Lookup.Provider selectedComponent = (Lookup.Provider) browseVisualizeTabPane.getSelectedComponent(); - proxyLookup.setNewLookups(selectedComponent.getLookup()); + Component selectedComponent = browseVisualizeTabPane.getSelectedComponent(); + if(selectedComponent instanceof Lookup.Provider) { + Lookup lookup = ((Lookup.Provider)selectedComponent).getLookup(); + proxyLookup.setNewLookups(lookup); + } filtersPane.setDeviceAccountTypeEnabled(browseVisualizeTabPane.getSelectedIndex() != 0); }); diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessageBrowser.form b/Core/src/org/sleuthkit/autopsy/communications/MessageBrowser.form deleted file mode 100644 index 58e19523f1..0000000000 --- a/Core/src/org/sleuthkit/autopsy/communications/MessageBrowser.form +++ /dev/null @@ -1,56 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessageBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/MessageBrowser.java deleted file mode 100644 index 339e842280..0000000000 --- a/Core/src/org/sleuthkit/autopsy/communications/MessageBrowser.java +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2017-2018 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obt ain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.autopsy.communications; - -import java.awt.Component; -import java.awt.KeyboardFocusManager; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.util.HashSet; -import java.util.Set; -import javax.swing.JPanel; -import static javax.swing.SwingUtilities.isDescendingFrom; -import org.openide.explorer.ExplorerManager; -import static org.openide.explorer.ExplorerUtils.createLookup; -import org.openide.nodes.Node; -import org.openide.util.Lookup; -import org.openide.util.NbBundle; -import org.sleuthkit.autopsy.corecomponents.DataResultPanel; -import org.sleuthkit.autopsy.corecomponents.DataResultViewerTable; -import org.sleuthkit.autopsy.corecomponents.TableFilterNode; -import org.sleuthkit.autopsy.directorytree.DataResultFilterNode; - -/** - * The right hand side of the CVT. Has a DataResultPanel to show a listing of - * messages and other account details, and a ContentViewer to show individual - * messages. - */ -@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives -public final class MessageBrowser extends JPanel implements ExplorerManager.Provider, Lookup.Provider { - - private static final long serialVersionUID = 1L; - private final ExplorerManager tableEM; - private final ExplorerManager gacExplorerManager; - private final DataResultPanel messagesResultPanel; - /* lookup that will be exposed through the (Global Actions Context) */ - private final ModifiableProxyLookup proxyLookup = new ModifiableProxyLookup(); - - private final PropertyChangeListener focusPropertyListener = new PropertyChangeListener() { - /** - * Listener that keeps the proxyLookup in sync with the focused area of - * the UI. - * - * Since the embedded MessageContentViewer (attachments panel) is not in - * its own TopComponenet, its selection does not get proxied into the - * Global Actions Context (GAC), and many of the available actions don't - * work on it. Further, we can't put the selection from both the - * Messages table and the Attachments table in the GAC because they - * could both include AbstractFiles, muddling the selection seen by the - * actions. Instead, depending on where the focus is in the window, we - * want to put different Content in the Global Actions Context to be - * picked up by, e.g., the tagging actions. The best way I could figure - * to do this was to listen to all focus events and swap out what is in - * the lookup appropriately. An alternative to this would be to - * investigate using the ContextAwareAction interface. - * - * @see org.sleuthkit.autopsy.timeline.TimeLineTopComponent for a - * similar situation and a similar solution. - * - * @param focusEvent The focus change event. - */ - @Override - public void propertyChange(final PropertyChangeEvent focusEvent) { - if (focusEvent.getPropertyName().equalsIgnoreCase("focusOwner")) { - final Component newFocusOwner = (Component) focusEvent.getNewValue(); - - if (newFocusOwner == null) { - return; - } - if (isDescendingFrom(newFocusOwner, messageDataContent)) { - //if the focus owner is within the MessageContentViewer ( the attachments table) - proxyLookup.setNewLookups(createLookup(messageDataContent.getExplorerManager(), getActionMap())); - } else if (isDescendingFrom(newFocusOwner, messagesResultPanel)) { - //... or if it is within the Messages table. - proxyLookup.setNewLookups(createLookup(gacExplorerManager, getActionMap())); - } - - } - } - }; - - /** - * Constructs the right hand side of the Communications Visualization Tool - * (CVT). - * - * @param tableEM An explorer manager to listen to as the driver - * of the Message Table. - * @param gacExplorerManager An explorer manager associated with the - * GlobalActionsContext (GAC) so that selections - * in the messages browser can be exposed to - * context-sensitive actions. - */ - @NbBundle.Messages({"MessageBrowser.DataResultViewerTable.title=Messages"}) - MessageBrowser(final ExplorerManager tableEM, final ExplorerManager gacExplorerManager) { - this.tableEM = tableEM; - this.gacExplorerManager = gacExplorerManager; - initComponents(); - //create an uninitialized DataResultPanel so we can control the ResultViewers that get added. - messagesResultPanel = DataResultPanel.createInstanceUninitialized("Account", "", Node.EMPTY, 0, messageDataContent); - splitPane.setTopComponent(messagesResultPanel); - splitPane.setBottomComponent(messageDataContent); - messagesResultPanel.addResultViewer(new DataResultViewerTable(gacExplorerManager, - Bundle.MessageBrowser_DataResultViewerTable_title())); - messagesResultPanel.open(); - - this.tableEM.addPropertyChangeListener(new PropertyChangeListener() { - /** - * Listener that pushes selections in the tableEM (the Accounts - * table) into the Messages table. - * - * @param pce The ExplorerManager event. - */ - @Override - public void propertyChange(PropertyChangeEvent pce) { - if (pce.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) { - final Node[] selectedNodes = MessageBrowser.this.tableEM.getSelectedNodes(); - messagesResultPanel.setNumberOfChildNodes(0); - messagesResultPanel.setNode(null); - messagesResultPanel.setPath(""); - if (selectedNodes.length > 0) { - Node rootNode; - final Node selectedNode = selectedNodes[0]; - - if (selectedNode instanceof AccountDeviceInstanceNode) { - rootNode = makeRootNodeFromAccountDeviceInstanceNodes(selectedNodes); - } else { - rootNode = selectedNode; - } - messagesResultPanel.setPath(rootNode.getDisplayName()); - messagesResultPanel.setNode(new TableFilterNode(new DataResultFilterNode(rootNode, gacExplorerManager), true)); - } - } - } - - private Node makeRootNodeFromAccountDeviceInstanceNodes(final Node[] selectedNodes) { - //Use lookup here? - final AccountDeviceInstanceNode adiNode = (AccountDeviceInstanceNode) selectedNodes[0]; - - final Set accountDeviceInstances = new HashSet<>(); - for (final Node n : selectedNodes) { - //Use lookup here? - accountDeviceInstances.add(((AccountDeviceInstanceNode) n).getAccountDeviceInstanceKey()); - } - return SelectionNode.createFromAccounts(accountDeviceInstances, adiNode.getFilter(), adiNode.getCommsManager()); - } - } - ); - } - - @Override - public ExplorerManager getExplorerManager() { - return gacExplorerManager; - } - - @Override - public Lookup getLookup() { - return proxyLookup; - } - - @Override - public void addNotify() { - super.addNotify(); - //add listener that maintains correct selection in the Global Actions Context - KeyboardFocusManager.getCurrentKeyboardFocusManager() - .addPropertyChangeListener("focusOwner", focusPropertyListener); - } - - @Override - public void removeNotify() { - super.removeNotify(); - KeyboardFocusManager.getCurrentKeyboardFocusManager() - .removePropertyChangeListener("focusOwner", focusPropertyListener); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // //GEN-BEGIN:initComponents - private void initComponents() { - - splitPane = new javax.swing.JSplitPane(); - messageDataContent = new org.sleuthkit.autopsy.communications.MessageDataContent(); - - splitPane.setDividerLocation(400); - splitPane.setDividerSize(10); - splitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); - splitPane.setResizeWeight(0.5); - splitPane.setBottomComponent(messageDataContent); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addGap(0, 0, 0) - .addComponent(splitPane)) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(0, 0, 0) - .addComponent(splitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 1083, Short.MAX_VALUE) - .addGap(0, 0, 0)) - ); - }// //GEN-END:initComponents - - - // Variables declaration - do not modify//GEN-BEGIN:variables - private org.sleuthkit.autopsy.communications.MessageDataContent messageDataContent; - private javax.swing.JSplitPane splitPane; - // End of variables declaration//GEN-END:variables - -} diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java index 8fd5e44d96..56870afe32 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java @@ -48,7 +48,7 @@ import org.sleuthkit.datamodel.TskCoreException; */ final class MessageNode extends BlackboardArtifactNode { - private static final Logger logger = Logger.getLogger(RelationshipNode.class.getName()); + private static final Logger logger = Logger.getLogger(MessageNode.class.getName()); MessageNode(BlackboardArtifact artifact) { super(artifact); diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java index 45b121e243..fde59ed8f2 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java @@ -109,6 +109,9 @@ public final class MessagesViewer extends JPanel implements RelationshipsViewer, if (nodes != null && nodes.length > 0) { contentViewer.setNode(nodes[0]); } + else { + contentViewer.setNode(null); + } } }); @@ -127,7 +130,6 @@ public final class MessagesViewer extends JPanel implements RelationshipsViewer, @Override public void setSelectionInfo(SelectionInfo info) { -// tableEM.setRootContext(new TableFilterNode(new DataResultFilterNode(new AbstractNode(Children.create(new MessagesChildNodeFactory(info), true)), getExplorerManager()), true)); nodeFactory.refresh(info); } diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java index 8fa082fc2c..0ee0aad79f 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java @@ -19,7 +19,6 @@ package org.sleuthkit.autopsy.communications; import javax.swing.JPanel; -import org.openide.util.Lookup; /** * Displays the Relationship information for the currently selected accounts. @@ -28,16 +27,21 @@ import org.openide.util.Lookup; final class RelationshipBrowser extends JPanel { private SelectionInfo currentSelection; + + private final MessagesViewer messagesViewer; + private final ContactsViewer contactsViewer; /** * Creates new form RelationshipBrowser */ public RelationshipBrowser() { initComponents(); - - Lookup.getDefault().lookupAll(RelationshipsViewer.class).forEach((viewer) -> { - tabPane.add(viewer.getDisplayName(), viewer.getPanel()); - }); + + messagesViewer = new MessagesViewer(); + contactsViewer = new ContactsViewer(); + + tabPane.add(messagesViewer.getDisplayName(), messagesViewer); + tabPane.add(contactsViewer.getDisplayName(), contactsViewer); } /** @@ -81,7 +85,9 @@ final class RelationshipBrowser extends JPanel { }// //GEN-END:initComponents private void tabPaneStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_tabPaneStateChanged - ((RelationshipsViewer) tabPane.getSelectedComponent()).setSelectionInfo(currentSelection); + if(currentSelection != null) { + ((RelationshipsViewer) tabPane.getSelectedComponent()).setSelectionInfo(currentSelection); + } }//GEN-LAST:event_tabPaneStateChanged diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipNode.java b/Core/src/org/sleuthkit/autopsy/communications/RelationshipNode.java deleted file mode 100644 index 3fc7e36e4e..0000000000 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipNode.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2017-2018 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.autopsy.communications; - -import java.util.List; -import java.util.TimeZone; -import java.util.logging.Level; -import org.apache.commons.lang3.StringUtils; -import org.openide.nodes.Sheet; -import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance; -import org.sleuthkit.autopsy.core.UserPreferences; -import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; -import org.sleuthkit.autopsy.datamodel.NodeProperty; -import org.sleuthkit.datamodel.BlackboardArtifact; -import org.sleuthkit.datamodel.BlackboardAttribute; -import org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_FROM; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_TO; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT; -import static org.sleuthkit.datamodel.BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME; -import org.sleuthkit.datamodel.Tag; -import org.sleuthkit.datamodel.TimeUtilities; -import org.sleuthkit.datamodel.TskCoreException; - -/** - * Node for a relationship, as represented by a BlackboardArtifact. - */ -final class RelationshipNode extends BlackboardArtifactNode { - - private static final Logger logger = Logger.getLogger(RelationshipNode.class.getName()); - - RelationshipNode(BlackboardArtifact artifact) { - super(artifact); - final String stripEnd = StringUtils.stripEnd(artifact.getDisplayName(), "s"); - String removeEndIgnoreCase = StringUtils.removeEndIgnoreCase(stripEnd, "message"); - setDisplayName(removeEndIgnoreCase.isEmpty() ? stripEnd : removeEndIgnoreCase); - } - - @Override - protected Sheet createSheet() { - Sheet sheet = new Sheet(); - List tags = getAllTagsFromDatabase(); - Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES); - if (sheetSet == null) { - sheetSet = Sheet.createPropertiesSet(); - sheet.put(sheetSet); - } - - sheetSet.put(new NodeProperty<>("Type", "Type", "Type", getDisplayName())); - - addScoreProperty(sheetSet, tags); - - CorrelationAttributeInstance correlationAttribute = null; - if (UserPreferences.hideCentralRepoCommentsAndOccurrences()== false) { - correlationAttribute = getCorrelationAttributeInstance(); - } - addCommentProperty(sheetSet, tags, correlationAttribute); - - if (UserPreferences.hideCentralRepoCommentsAndOccurrences()== false) { - addCountProperty(sheetSet, correlationAttribute); - } - final BlackboardArtifact artifact = getArtifact(); - BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(getArtifact().getArtifactTypeID()); - if (null != fromID) { - //Consider refactoring this to reduce boilerplate - switch (fromID) { - case TSK_EMAIL_MSG: - sheetSet.put(new NodeProperty<>("From", "From", "From", - StringUtils.strip(getAttributeDisplayString(artifact, TSK_EMAIL_FROM), " \t\n;"))); - sheetSet.put(new NodeProperty<>("To", "To", "To", - StringUtils.strip(getAttributeDisplayString(artifact, TSK_EMAIL_TO), " \t\n;"))); - sheetSet.put(new NodeProperty<>("Date", "Date", "Date", - getAttributeDisplayString(artifact, TSK_DATETIME_SENT))); - sheetSet.put(new NodeProperty<>("Subject", "Subject", "Subject", - getAttributeDisplayString(artifact, TSK_SUBJECT))); - try { - sheetSet.put(new NodeProperty<>("Attms", "Attms", "Attms", artifact.getChildrenCount())); - } catch (TskCoreException ex) { - logger.log(Level.WARNING, "Error loading attachment count for " + artifact, ex); - } - - break; - case TSK_MESSAGE: - sheetSet.put(new NodeProperty<>("From", "From", "From", - getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_FROM))); - sheetSet.put(new NodeProperty<>("To", "To", "To", - getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_TO))); - sheetSet.put(new NodeProperty<>("Date", "Date", "Date", - getAttributeDisplayString(artifact, TSK_DATETIME))); - sheetSet.put(new NodeProperty<>("Subject", "Subject", "Subject", - getAttributeDisplayString(artifact, TSK_SUBJECT))); - try { - sheetSet.put(new NodeProperty<>("Attms", "Attms", "Attms", artifact.getChildrenCount())); - } catch (TskCoreException ex) { - logger.log(Level.WARNING, "Error loading attachment count for " + artifact, ex); - } - break; - case TSK_CALLLOG: - sheetSet.put(new NodeProperty<>("From", "From", "From", - getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_FROM))); - sheetSet.put(new NodeProperty<>("To", "To", "To", - getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_TO))); - sheetSet.put(new NodeProperty<>("Date", "Date", "Date", - getAttributeDisplayString(artifact, TSK_DATETIME_START))); - break; - default: - break; - } - } - - return sheet; - } - - /** - * - * Get the display string for the attribute of the given type from the given - * artifact. - * - * @param artifact the value of artifact - * @param attributeType the value of TSK_SUBJECT1 - * - * @return The display string, or an empty string if there is no such - * attribute or an an error. - */ - private static String getAttributeDisplayString(final BlackboardArtifact artifact, final ATTRIBUTE_TYPE attributeType) { - try { - BlackboardAttribute attribute = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.fromID(attributeType.getTypeID()))); - if (attribute == null) { - return ""; - } else if (attributeType.getValueType() == DATETIME) { - return TimeUtilities.epochToTime(attribute.getValueLong(), - TimeZone.getTimeZone(Utils.getUserPreferredZoneId())); - } else { - return attribute.getDisplayString(); - } - } catch (TskCoreException tskCoreException) { - logger.log(Level.WARNING, "Error getting attribute value.", tskCoreException); - return ""; - } - } - - /** - * Circumvent DataResultFilterNode's slightly odd delegation to - * BlackboardArtifactNode.getSourceName(). - * - * @return the displayName of this Node, which is the type. - */ - @Override - public String getSourceName() { - return getDisplayName(); - } -} diff --git a/Core/src/org/sleuthkit/autopsy/communications/SelectionNode.java b/Core/src/org/sleuthkit/autopsy/communications/SelectionNode.java deleted file mode 100644 index 1618bb9ecc..0000000000 --- a/Core/src/org/sleuthkit/autopsy/communications/SelectionNode.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2018 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.autopsy.communications; - -import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.logging.Level; -import java.util.stream.Collectors; -import org.openide.nodes.AbstractNode; -import org.openide.nodes.ChildFactory; -import org.openide.nodes.Children; -import org.openide.nodes.Node; -import org.openide.util.Lookup; -import org.openide.util.lookup.Lookups; -import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.datamodel.AccountDeviceInstance; -import org.sleuthkit.datamodel.BlackboardArtifact; -import org.sleuthkit.datamodel.CommunicationsFilter; -import org.sleuthkit.datamodel.CommunicationsManager; -import org.sleuthkit.datamodel.Content; -import org.sleuthkit.datamodel.TskCoreException; - -/** - * 'Root' Node for the Account/Messages area. Represents all the relationships - * that are selected in the AccountsBrowser or the VisualizationPanel. Can be - * populated with AccountDeviceInstance and/or directly with relationships - * (Content). - */ -final class SelectionNode extends AbstractNode { - - private SelectionNode(Children children, Lookup lookup) { - super(children, lookup); - } - - static SelectionNode createFromAccountsAndRelationships( - Set edgeRelationshipArtifacts, - Set accountDeviceInstanceKeys, - CommunicationsFilter filter, - CommunicationsManager commsManager) { - - Set accountDeviceInstances = accountDeviceInstanceKeys.stream() - .map(AccountDeviceInstanceKey::getAccountDeviceInstance) - .collect(Collectors.toSet()); - - SelectionNode node = new SelectionNode(Children.create( - new RelationshipChildren( - edgeRelationshipArtifacts, - accountDeviceInstances, - commsManager, - filter), - true), Lookups.fixed(accountDeviceInstanceKeys.toArray())); - - //This is not good for internationalization!!! - String name = ""; - final int accounts = accountDeviceInstances.size(); - if (accounts > 1) { - name = accounts + " accounts"; - } else if (accounts == 1) { - name = Iterables.getOnlyElement(accountDeviceInstances).getAccount().getTypeSpecificID(); - } - - final int edges = edgeRelationshipArtifacts.size(); - - if (edges > 0) { - name = name + (name.isEmpty() ? "" : " and ") + edges + " relationship" + (edges > 1 ? "s" : ""); - } - - node.setDisplayName(name); - return node; - } - - static SelectionNode createFromAccounts( - Set accountDeviceInstances, - CommunicationsFilter filter, - CommunicationsManager commsManager) { - - return createFromAccountsAndRelationships(Collections.emptySet(), accountDeviceInstances, filter, commsManager); - } - - /** - * Children object for the relationships that the accounts are part of. - */ - private static class RelationshipChildren extends ChildFactory { - - static final private Logger logger = Logger.getLogger(RelationshipChildren.class.getName()); - - private final Set edgeRelationshipArtifacts; - - private final Set accountDeviceInstances; - - private final CommunicationsManager commsManager; - private final CommunicationsFilter filter; - - private RelationshipChildren(Set selectedEdgeRelationshipSources, Set selecedAccountDeviceInstances, CommunicationsManager commsManager, CommunicationsFilter filter) { - this.edgeRelationshipArtifacts = selectedEdgeRelationshipSources; - this.accountDeviceInstances = selecedAccountDeviceInstances; - this.commsManager = commsManager; - this.filter = filter; - } - - @Override - protected boolean createKeys(List list) { - try { - final Set relationshipSources = commsManager.getRelationshipSources(accountDeviceInstances, filter); - list.addAll(Sets.union(relationshipSources, edgeRelationshipArtifacts)); - } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Error getting communications", ex); - } - return true; - } - - @Override - protected Node createNodeForKey(Content content) { - if (content instanceof BlackboardArtifact) { - return new RelationshipNode((BlackboardArtifact) content); - } else { - throw new UnsupportedOperationException("Cannot create a RelationshipNode for non BlackboardArtifact content."); - } - } - } -} diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java index f3d4f95bb2..d9bbcb8d39 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java @@ -55,7 +55,6 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; import java.awt.image.BufferedImage; import java.beans.PropertyChangeEvent; -import java.beans.PropertyVetoException; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -63,11 +62,11 @@ import java.nio.file.Paths; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Arrays; +import java.util.Collections; import java.util.Date; import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; @@ -99,12 +98,8 @@ import org.apache.commons.lang3.StringUtils; import org.controlsfx.control.Notifications; import org.jdesktop.layout.GroupLayout; import org.jdesktop.layout.LayoutStyle; -import org.openide.explorer.ExplorerManager; -import org.openide.explorer.ExplorerUtils; -import org.openide.nodes.Node; import org.openide.util.Lookup; import org.openide.util.NbBundle; -import org.openide.util.lookup.ProxyLookup; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; @@ -113,9 +108,9 @@ import org.sleuthkit.autopsy.coreutils.FileUtil; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ThreadConfined; import org.sleuthkit.autopsy.progress.ModalDialogProgressIndicator; +import org.sleuthkit.datamodel.AccountDeviceInstance; import org.sleuthkit.datamodel.CommunicationsFilter; import org.sleuthkit.datamodel.CommunicationsManager; -import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.TskCoreException; /** * A panel that goes in the Visualize tab of the Communications Visualization @@ -128,7 +123,7 @@ import org.sleuthkit.datamodel.TskCoreException; * actions to work correctly. */ @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives -final public class VisualizationPanel extends JPanel implements Lookup.Provider { +final public class VisualizationPanel extends JPanel { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(VisualizationPanel.class.getName()); @@ -141,9 +136,6 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider @NbBundle.Messages("VisualizationPanel.cancelButton.text=Cancel") private static final String CANCEL = Bundle.VisualizationPanel_cancelButton_text(); - private final ExplorerManager vizEM = new ExplorerManager(); - private final ExplorerManager gacEM = new ExplorerManager(); - private final ProxyLookup proxyLookup; private Frame windowAncestor; private CommunicationsManager commsManager; @@ -162,6 +154,8 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider private final Map layoutButtons = new HashMap<>(); private NamedGraphLayout currentLayout; + + private final RelationshipBrowser relationshipBrowser; @NbBundle.Messages("VisalizationPanel.paintingError=Problem painting visualization.") public VisualizationPanel() { @@ -224,13 +218,9 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider final GraphMouseListener graphMouseListener = new GraphMouseListener(); graphComponent.getGraphControl().addMouseWheelListener(graphMouseListener); graphComponent.getGraphControl().addMouseListener(graphMouseListener); - - final MessageBrowser messageBrowser = new MessageBrowser(vizEM, gacEM); - splitPane.setRightComponent(messageBrowser); - proxyLookup = new ProxyLookup( - ExplorerUtils.createLookup(vizEM, getActionMap()), - messageBrowser.getLookup() - ); + + relationshipBrowser = new RelationshipBrowser(); + splitPane.setRightComponent(relationshipBrowser); //feed selection to explorermanager graph.getSelectionModel().addListener(mxEvent.CHANGE, new SelectionListener()); @@ -259,12 +249,7 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider applyLayout(fastOrganicLayout); } - - @Override - public Lookup getLookup() { - return proxyLookup; - } - + @Subscribe void handle(LockedVertexModel.VertexLockEvent event) { final Set vertices = event.getVertices(); @@ -884,40 +869,25 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider @Override public void invoke(Object sender, mxEventObject evt) { Object[] selectionCells = graph.getSelectionCells(); - Node rootNode = Node.EMPTY; - Node[] selectedNodes = new Node[0]; if (selectionCells.length > 0) { mxICell[] selectedCells = Arrays.asList(selectionCells).toArray(new mxCell[selectionCells.length]); - HashSet relationshipSources = new HashSet<>(); - HashSet adis = new HashSet<>(); + HashSet deviceInstances = new HashSet<>(); for (mxICell cell : selectedCells) { if (cell.isEdge()) { mxICell source = (mxICell) graph.getModel().getTerminal(cell, true); - AccountDeviceInstanceKey account1 = (AccountDeviceInstanceKey) source.getValue(); mxICell target = (mxICell) graph.getModel().getTerminal(cell, false); - AccountDeviceInstanceKey account2 = (AccountDeviceInstanceKey) target.getValue(); - try { - final List relationshipSources1 = commsManager.getRelationshipSources( - account1.getAccountDeviceInstance(), - account2.getAccountDeviceInstance(), - currentFilter); - relationshipSources.addAll(relationshipSources1); - } catch (TskCoreException tskCoreException) { - logger.log(Level.SEVERE, " Error getting relationsips....", tskCoreException); - } + + deviceInstances.add(((AccountDeviceInstanceKey) source.getValue()).getAccountDeviceInstance()); + deviceInstances.add(((AccountDeviceInstanceKey) target.getValue()).getAccountDeviceInstance()); + } else if (cell.isVertex()) { - adis.add((AccountDeviceInstanceKey) cell.getValue()); + deviceInstances.add(((AccountDeviceInstanceKey) cell.getValue()).getAccountDeviceInstance()); } } - rootNode = SelectionNode.createFromAccountsAndRelationships(relationshipSources, adis, currentFilter, commsManager); - selectedNodes = new Node[]{rootNode}; - } - vizEM.setRootContext(rootNode); - try { - vizEM.setSelectedNodes(selectedNodes); - } catch (PropertyVetoException ex) { - logger.log(Level.SEVERE, "Selection vetoed.", ex); + relationshipBrowser.setSelectionInfo(new SelectionInfo(deviceInstances, currentFilter)); + } else { + relationshipBrowser.setSelectionInfo(new SelectionInfo(Collections.EMPTY_SET, currentFilter)); } } } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED index ab7e11a07f..6f95dfc82f 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED @@ -35,7 +35,7 @@ KeywordSearchResultFactory.createNodeForKey.noResultsFound.text=No results found KeywordSearchResultFactory.query.exception.msg=Could not perform the query OpenIDE-Module-Display-Category=Ingest Module -OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\n\The module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found. +OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\nThe module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found. OpenIDE-Module-Name=KeywordSearch OptionsCategory_Name_KeywordSearchOptions=Keyword Search OptionsCategory_Keywords_KeywordSearchOptions=Keyword Search diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED index 7da2ebca7b..17d744eee1 100755 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED @@ -64,7 +64,7 @@ ExtractZone_progress_Msg=Extracting :Zone.Identifer files ExtractZone_Restricted=Restricted Sites Zone ExtractZone_Trusted=Trusted Sites Zone OpenIDE-Module-Display-Category=Ingest Module -OpenIDE-Module-Long-Description=Recent Activity ingest module.\n\n\The module extracts useful information about the recent user activity on the disk image being ingested, such as:\n\n- Recently open documents,\n- Web activity (sites visited, stored cookies, book marked sites, search engine queries, file downloads),\n- Recently attached devices,\n- Installed programs.\n\nThe module currently supports Windows only disk images.\nThe plugin is also fully functional when deployed on Windows version of Autopsy. +OpenIDE-Module-Long-Description=Recent Activity ingest module.\n\nThe module extracts useful information about the recent user activity on the disk image being ingested, such as:\n\n- Recently open documents,\n- Web activity (sites visited, stored cookies, book marked sites, search engine queries, file downloads),\n- Recently attached devices,\n- Installed programs.\n\nThe module currently supports Windows only disk images.\nThe plugin is also fully functional when deployed on Windows version of Autopsy. OpenIDE-Module-Name=RecentActivity OpenIDE-Module-Short-Description=Recent Activity finder ingest module Chrome.moduleName=Chrome From c0bfa90032f16227bb480e797e4f9388c8a07348 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 16 Apr 2019 11:23:47 -0400 Subject: [PATCH 09/32] getLogger was referencing wrong class --- Core/src/org/sleuthkit/autopsy/communications/ContactNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java index 4792e70af8..3ed9ffa799 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java @@ -47,7 +47,7 @@ import org.sleuthkit.datamodel.TskCoreException; */ final class ContactNode extends BlackboardArtifactNode { - private static final Logger logger = Logger.getLogger(RelationshipNode.class.getName()); + private static final Logger logger = Logger.getLogger(ContactNode.class.getName()); @Messages({ "ContactNode_Name=Name", From d60e12e9083d6502dd43cc5a79230a550ce82f7f Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 16 Apr 2019 11:35:34 -0400 Subject: [PATCH 10/32] Put user visible strings into Messages --- .../autopsy/communications/MessageNode.java | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java index 4a02a1d0ce..ff64185d25 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java @@ -24,6 +24,7 @@ import org.apache.commons.lang3.StringUtils; import org.openide.nodes.AbstractNode; import org.openide.nodes.Children; import org.openide.nodes.Sheet; +import org.openide.util.NbBundle.Messages; import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.NodeProperty; @@ -71,6 +72,15 @@ final class MessageNode extends AbstractNode { setIconBaseWithExtension(filePath); } + @Messages({ + "MessageNode_Node_Property_Type=Type", + "MessageNode_Node_Property_From=From", + "MessageNode_Node_Property_To=To", + "MessageNode_Node_Property_Date=Date", + "MessageNode_Node_Property_Subject=Subject", + "MessageNode_Node_Property_Attms=Attachments" + }) + @Override protected Sheet createSheet() { Sheet sheet = new Sheet(); @@ -80,49 +90,49 @@ final class MessageNode extends AbstractNode { sheet.put(sheetSet); } - sheetSet.put(new NodeProperty<>("Type", "Type", "Type", getDisplayName())); //NON-NLS + sheetSet.put(new NodeProperty<>("Type", Bundle.MessageNode_Node_Property_Type(), "", getDisplayName())); //NON-NLS BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID()); if (null != fromID) { //Consider refactoring this to reduce boilerplate switch (fromID) { case TSK_EMAIL_MSG: - sheetSet.put(new NodeProperty<>("From", "From", "From", + sheetSet.put(new NodeProperty<>("From", Bundle.MessageNode_Node_Property_From(), "", StringUtils.strip(getAttributeDisplayString(artifact, TSK_EMAIL_FROM), " \t\n;"))); //NON-NLS - sheetSet.put(new NodeProperty<>("To", "To", "To", + sheetSet.put(new NodeProperty<>("To", Bundle.MessageNode_Node_Property_To(), "", StringUtils.strip(getAttributeDisplayString(artifact, TSK_EMAIL_TO), " \t\n;"))); //NON-NLS - sheetSet.put(new NodeProperty<>("Date", "Date", "Date", + sheetSet.put(new NodeProperty<>("Date", Bundle.MessageNode_Node_Property_Date(), "", getAttributeDisplayString(artifact, TSK_DATETIME_SENT))); //NON-NLS - sheetSet.put(new NodeProperty<>("Subject", "Subject", "Subject", + sheetSet.put(new NodeProperty<>("Subject", Bundle.MessageNode_Node_Property_Subject(), "", getAttributeDisplayString(artifact, TSK_SUBJECT))); //NON-NLS try { - sheetSet.put(new NodeProperty<>("Attms", "Attms", "Attms", artifact.getChildrenCount())); //NON-NLS + sheetSet.put(new NodeProperty<>("Attms", Bundle.MessageNode_Node_Property_Attms(), "", artifact.getChildrenCount())); //NON-NLS } catch (TskCoreException ex) { logger.log(Level.WARNING, "Error loading attachment count for " + artifact, ex); //NON-NLS } break; case TSK_MESSAGE: - sheetSet.put(new NodeProperty<>("From", "From", "From", + sheetSet.put(new NodeProperty<>("From", Bundle.MessageNode_Node_Property_From(), "", getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_FROM))); //NON-NLS - sheetSet.put(new NodeProperty<>("To", "To", "To", + sheetSet.put(new NodeProperty<>("To", Bundle.MessageNode_Node_Property_To(), "", getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_TO))); //NON-NLS - sheetSet.put(new NodeProperty<>("Date", "Date", "Date", + sheetSet.put(new NodeProperty<>("Date", Bundle.MessageNode_Node_Property_Date(), "", getAttributeDisplayString(artifact, TSK_DATETIME))); //NON-NLS - sheetSet.put(new NodeProperty<>("Subject", "Subject", "Subject", + sheetSet.put(new NodeProperty<>("Subject", Bundle.MessageNode_Node_Property_Subject(), "", getAttributeDisplayString(artifact, TSK_SUBJECT))); //NON-NLS try { - sheetSet.put(new NodeProperty<>("Attms", "Attms", "Attms", artifact.getChildrenCount())); //NON-NLS + sheetSet.put(new NodeProperty<>("Attms", Bundle.MessageNode_Node_Property_Attms(), "", artifact.getChildrenCount())); //NON-NLS } catch (TskCoreException ex) { logger.log(Level.WARNING, "Error loading attachment count for " + artifact, ex); //NON-NLS } break; case TSK_CALLLOG: - sheetSet.put(new NodeProperty<>("From", "From", "From", + sheetSet.put(new NodeProperty<>("From", Bundle.MessageNode_Node_Property_From(), "", getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_FROM))); //NON-NLS - sheetSet.put(new NodeProperty<>("To", "To", "To", + sheetSet.put(new NodeProperty<>("To", Bundle.MessageNode_Node_Property_To(), "", getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_TO))); //NON-NLS - sheetSet.put(new NodeProperty<>("Date", "Date", "Date", + sheetSet.put(new NodeProperty<>("Date", Bundle.MessageNode_Node_Property_Date(), "", getAttributeDisplayString(artifact, TSK_DATETIME_START))); //NON-NLS break; default: From a8a6735ecff28af2374b6ced4b010cca04804ec6 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 16 Apr 2019 12:59:01 -0400 Subject: [PATCH 11/32] updated based on review comments --- .../communications/Bundle.properties-MERGED | 7 ++++++- .../communications/ContactDetailsPane.java | 19 ++++++++++++++++--- .../autopsy/communications/ContactNode.java | 1 - 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED index de288e42f3..0a92efdbf8 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED @@ -33,7 +33,12 @@ FiltersPanel.refreshButton.text=Refresh FiltersPanel.deviceRequiredLabel.text=Select at least one. FiltersPanel.accountTypeRequiredLabel.text=Select at least one. FiltersPanel.needsRefreshLabel.text=Displayed data is out of date. Press Refresh. -MessageBrowser.DataResultViewerTable.title=Messages +MessageNode_Node_Property_Attms=Attachments +MessageNode_Node_Property_Date=Date +MessageNode_Node_Property_From=From +MessageNode_Node_Property_Subject=Subject +MessageNode_Node_Property_To=To +MessageNode_Node_Property_Type=Type MessageViewer_columnHeader_Attms=Attachments MessageViewer_columnHeader_Date=Date MessageViewer_columnHeader_From=From diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java b/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java index 0d466dac88..c22f60fb7e 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java @@ -1,7 +1,20 @@ /* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.sleuthkit.autopsy.communications; diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java index 4792e70af8..f70cbcf682 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java @@ -73,7 +73,6 @@ final class ContactNode extends BlackboardArtifactNode { } Sheet sheet = new Sheet(); - List tags = getAllTagsFromDatabase(); Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES); if (sheetSet == null) { sheetSet = Sheet.createPropertiesSet(); From 8a0a84a6f8f80874c068d721bcefb816b4162808 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 16 Apr 2019 13:00:32 -0400 Subject: [PATCH 12/32] update based on review comments --- Core/src/org/sleuthkit/autopsy/communications/ContactNode.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java index f70cbcf682..c73cfff430 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java @@ -18,7 +18,6 @@ */ package org.sleuthkit.autopsy.communications; -import java.util.List; import java.util.TimeZone; import java.util.logging.Level; import org.openide.nodes.Sheet; @@ -37,7 +36,6 @@ import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHO import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_OFFICE; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL; import static org.sleuthkit.datamodel.BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME; -import org.sleuthkit.datamodel.Tag; import org.sleuthkit.datamodel.TimeUtilities; import org.sleuthkit.datamodel.TskCoreException; From 475bd75fc85a97e96299467059fe110ecade0f3e Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Wed, 17 Apr 2019 11:31:08 -0400 Subject: [PATCH 13/32] Inital work on thumbnailViewer --- .../communications/Bundle.properties-MERGED | 1 + .../communications/RelationshipBrowser.java | 3 + .../autopsy/communications/ThumbnailNode.java | 27 +++++ .../communications/ThumbnailNodeFactory.java | 87 ++++++++++++++ .../communications/ThumbnailViewer.form | 42 +++++++ .../communications/ThumbnailViewer.java | 112 ++++++++++++++++++ 6 files changed, 272 insertions(+) create mode 100755 Core/src/org/sleuthkit/autopsy/communications/ThumbnailNode.java create mode 100755 Core/src/org/sleuthkit/autopsy/communications/ThumbnailNodeFactory.java create mode 100755 Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form create mode 100755 Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED index 0a92efdbf8..22bc2cdd10 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED @@ -51,6 +51,7 @@ PinAccountsAction.singularText=Add Selected Account to Visualization refreshText=Refresh Results ResetAndPinAccountsAction.pluralText=Visualize Only Selected Accounts ResetAndPinAccountsAction.singularText=Visualize Only Selected Account +ThumbnailViewer_Name=Thumbnails UnpinAccountsAction.pluralText=Remove Selected Accounts UnpinAccountsAction.singularText=Remove Selected Account VisalizationPanel.paintingError=Problem painting visualization. diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java index 0ee0aad79f..83fe1b3ef2 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java @@ -30,6 +30,7 @@ final class RelationshipBrowser extends JPanel { private final MessagesViewer messagesViewer; private final ContactsViewer contactsViewer; + private final ThumbnailViewer thumbnailViewer; /** * Creates new form RelationshipBrowser @@ -39,9 +40,11 @@ final class RelationshipBrowser extends JPanel { messagesViewer = new MessagesViewer(); contactsViewer = new ContactsViewer(); + thumbnailViewer = new ThumbnailViewer(); tabPane.add(messagesViewer.getDisplayName(), messagesViewer); tabPane.add(contactsViewer.getDisplayName(), contactsViewer); + tabPane.add(thumbnailViewer.getDisplayName(), thumbnailViewer); } /** diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailNode.java b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailNode.java new file mode 100755 index 0000000000..229174efea --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailNode.java @@ -0,0 +1,27 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.sleuthkit.autopsy.communications; + +import org.openide.nodes.AbstractNode; +import org.openide.nodes.Children; +import org.sleuthkit.datamodel.AbstractContent; + +/** + * + * + */ +public class ThumbnailNode extends AbstractNode{ + + private final AbstractContent content; + + public ThumbnailNode(AbstractContent content) { + super(Children.LEAF); + this.content = content; + + setDisplayName(content.getName()); + } + +} diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailNodeFactory.java new file mode 100755 index 0000000000..529239a056 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailNodeFactory.java @@ -0,0 +1,87 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.sleuthkit.autopsy.communications; + +import java.util.List; +import java.util.Set; +import java.util.logging.Level; +import org.openide.nodes.ChildFactory; +import org.openide.nodes.Node; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; +import org.sleuthkit.datamodel.AbstractContent; +import org.sleuthkit.datamodel.BlackboardArtifact; +import org.sleuthkit.datamodel.CommunicationsManager; +import org.sleuthkit.datamodel.Content; +import org.sleuthkit.datamodel.TskCoreException; + +/** + * + * @author kelly + */ +public class ThumbnailNodeFactory extends ChildFactory { + private static final Logger logger = Logger.getLogger(ThumbnailNodeFactory.class.getName()); + + private SelectionInfo selectionInfo; + + ThumbnailNodeFactory(SelectionInfo selectionInfo) { + this.selectionInfo = selectionInfo; + } + + @Override + protected boolean createKeys(List list) { + CommunicationsManager communicationManager; + try { + communicationManager = Case.getCurrentCaseThrows().getSleuthkitCase().getCommunicationsManager(); + } catch (NoCurrentCaseException | TskCoreException ex) { + logger.log(Level.SEVERE, "Failed to get communications manager from case.", ex); //NON-NLS + return false; + } + + if(selectionInfo == null) { + return true; + } + + final Set relationshipSources; + + try { + relationshipSources = communicationManager.getRelationshipSources(selectionInfo.getAccountDevicesInstances(), selectionInfo.getCommunicationsFilter()); + } catch (TskCoreException ex) { + logger.log(Level.SEVERE, "Failed to get relationship sources.", ex); //NON-NLS + return false; + } + + relationshipSources.stream().filter((content) -> (content instanceof BlackboardArtifact)).forEachOrdered((content) -> { + + BlackboardArtifact bba = (BlackboardArtifact) content; + BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(bba.getArtifactTypeID()); + + if (fromID == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG + || fromID == BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE) { + + try{ + if(bba.hasChildren()) { + + for(Content child: bba.getChildren()) { + list.add(child); + } + } + } catch(TskCoreException ex) { + + } + } + }); + + return true; + } + + @Override + protected Node createNodeForKey(Content key) { + return new ThumbnailNode((AbstractContent)key); + } +} diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form new file mode 100755 index 0000000000..3a7a0d392b --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form @@ -0,0 +1,42 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java new file mode 100755 index 0000000000..84306847e6 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java @@ -0,0 +1,112 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obt ain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.communications; + +import javax.swing.JPanel; +import org.openide.explorer.ExplorerManager; +import static org.openide.explorer.ExplorerUtils.createLookup; +import org.openide.nodes.AbstractNode; +import org.openide.nodes.Children; +import org.openide.util.Lookup; +import org.openide.util.NbBundle.Messages; +import org.sleuthkit.autopsy.corecomponents.TableFilterNode; +import org.sleuthkit.autopsy.directorytree.DataResultFilterNode; + +/** + * + */ +public class ThumbnailViewer extends JPanel implements RelationshipsViewer, ExplorerManager.Provider, Lookup.Provider { + + private final ExplorerManager tableEM = new ExplorerManager(); + + private final ModifiableProxyLookup proxyLookup; + + @Messages({ + "ThumbnailViewer_Name=Thumbnails" + }) + /** + * Creates new form ThumbnailViewer + */ + public ThumbnailViewer() { + proxyLookup = new ModifiableProxyLookup(createLookup(tableEM, getActionMap())); + + initComponents(); + } + + @Override + public String getDisplayName() { + return Bundle.ThumbnailViewer_Name(); + } + + @Override + public JPanel getPanel() { + return this; + } + + @Override + public void setSelectionInfo(SelectionInfo info) { +// thumbnailViewer.setNode(new TableFilterNode(new DataResultFilterNode(new AbstractNode(Children.create(new ThumbnailNodeFactory(info), true)), getExplorerManager()), true)); + tableEM.setRootContext(new TableFilterNode(new DataResultFilterNode(new AbstractNode(Children.create(new ThumbnailNodeFactory(info), true)), getExplorerManager()), true)); + } + + @Override + public ExplorerManager getExplorerManager() { + return tableEM; + } + + @Override + public Lookup getLookup() { + return proxyLookup; + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + thumbnailViewer = new org.sleuthkit.autopsy.corecomponents.DataResultViewerThumbnail(tableEM); + contentViewer = new org.sleuthkit.autopsy.contentviewers.MessageContentViewer(); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(thumbnailViewer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(contentViewer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(thumbnailViewer, javax.swing.GroupLayout.PREFERRED_SIZE, 443, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, Short.MAX_VALUE) + .addComponent(contentViewer, javax.swing.GroupLayout.PREFERRED_SIZE, 532, javax.swing.GroupLayout.PREFERRED_SIZE)) + ); + }// //GEN-END:initComponents + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private org.sleuthkit.autopsy.contentviewers.MessageContentViewer contentViewer; + private org.sleuthkit.autopsy.corecomponents.DataResultViewerThumbnail thumbnailViewer; + // End of variables declaration//GEN-END:variables + +} From d96e9f19d3b379f7aa8e4e329e9fa749d57b1926 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Thu, 18 Apr 2019 10:22:40 -0400 Subject: [PATCH 14/32] Fixed issue displaying contact information for vcards --- .../autopsy/communications/ContactNode.java | 30 +++++++++++-------- .../communications/ContactsViewer.java | 5 ++-- .../keywordsearch/Bundle.properties-MERGED | 2 +- .../recentactivity/Bundle.properties-MERGED | 2 +- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java index e6c9b64b34..9a59b82a99 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java @@ -18,6 +18,7 @@ */ package org.sleuthkit.autopsy.communications; +import java.util.List; import java.util.TimeZone; import java.util.logging.Level; import org.openide.nodes.Sheet; @@ -30,12 +31,14 @@ import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTA import org.sleuthkit.datamodel.BlackboardAttribute; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME; +import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME_PERSON; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_HOME; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_MOBILE; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_OFFICE; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL; import static org.sleuthkit.datamodel.BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME; +import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.TimeUtilities; import org.sleuthkit.datamodel.TskCoreException; @@ -59,7 +62,12 @@ final class ContactNode extends BlackboardArtifactNode { ContactNode(BlackboardArtifact artifact) { super(artifact); - setDisplayName(getAttributeDisplayString(artifact, TSK_NAME)); + String name = getAttributeDisplayString(artifact, TSK_NAME); + if(name == null || name.trim().isEmpty()) { + // VCards use TSK_NAME_PERSON instead of TSK_NAME + name = getAttributeDisplayString(artifact, TSK_NAME_PERSON); + } + setDisplayName(name); } @Override @@ -76,19 +84,15 @@ final class ContactNode extends BlackboardArtifactNode { sheetSet = Sheet.createPropertiesSet(); sheet.put(sheetSet); } + + try { + for (BlackboardAttribute bba : artifact.getAttributes()) { + sheetSet.put(new NodeProperty<>(bba.getAttributeType().getTypeName(), bba.getAttributeType().getDisplayName(), "", bba.getDisplayString())); + } - sheetSet.put(new NodeProperty<>("email", Bundle.ContactNode_Email(), "", - getAttributeDisplayString(artifact, TSK_EMAIL))); //NON-NLS - sheetSet.put(new NodeProperty<>("phone", Bundle.ContactNode_Phone(), "", - getAttributeDisplayString(artifact, TSK_PHONE_NUMBER))); //NON-NLS - sheetSet.put(new NodeProperty<>("mobile", Bundle.ContactNode_Mobile_Number(), "", - getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_MOBILE))); //NON-NLS - sheetSet.put(new NodeProperty<>("home", Bundle.ContactNode_Home_Number(), "", - getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_HOME))); //NON-NLS - sheetSet.put(new NodeProperty<>("office", Bundle.ContactNode_Office_Number(), "", - getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_OFFICE))); //NON-NLS - sheetSet.put(new NodeProperty<>("url", Bundle.ContactNode_URL(), "", - getAttributeDisplayString(artifact, TSK_URL))); //NON-NLS + } catch (TskCoreException ex) { + logger.log(Level.WARNING, "Error getting attribute values.", ex); //NON-NLS + } return sheet; } diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java index 3c8cebedd5..5e500b3482 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java @@ -37,6 +37,7 @@ import org.openide.util.NbBundle; import org.openide.util.lookup.ServiceProvider; import org.sleuthkit.autopsy.corecomponents.TableFilterNode; import org.sleuthkit.autopsy.directorytree.DataResultFilterNode; +import org.sleuthkit.datamodel.BlackboardAttribute; /** * Visualization for contact nodes. @@ -89,8 +90,8 @@ public final class ContactsViewer extends JPanel implements RelationshipsViewer, outline = outlineView.getOutline(); outlineView.setPropertyColumns( - "email", Bundle.ContactsViewer_columnHeader_Email(), - "phone", Bundle.ContactsViewer_columnHeader_Phone() + "TSK_EMAIL", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL.getDisplayName(), + "TSK_PHONE_NUMBER", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER.getDisplayName() ); outline.setRootVisible(false); outline.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED index 6f95dfc82f..ab7e11a07f 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED @@ -35,7 +35,7 @@ KeywordSearchResultFactory.createNodeForKey.noResultsFound.text=No results found KeywordSearchResultFactory.query.exception.msg=Could not perform the query OpenIDE-Module-Display-Category=Ingest Module -OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\nThe module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found. +OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\n\The module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found. OpenIDE-Module-Name=KeywordSearch OptionsCategory_Name_KeywordSearchOptions=Keyword Search OptionsCategory_Keywords_KeywordSearchOptions=Keyword Search diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED index 17d744eee1..7da2ebca7b 100755 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED @@ -64,7 +64,7 @@ ExtractZone_progress_Msg=Extracting :Zone.Identifer files ExtractZone_Restricted=Restricted Sites Zone ExtractZone_Trusted=Trusted Sites Zone OpenIDE-Module-Display-Category=Ingest Module -OpenIDE-Module-Long-Description=Recent Activity ingest module.\n\nThe module extracts useful information about the recent user activity on the disk image being ingested, such as:\n\n- Recently open documents,\n- Web activity (sites visited, stored cookies, book marked sites, search engine queries, file downloads),\n- Recently attached devices,\n- Installed programs.\n\nThe module currently supports Windows only disk images.\nThe plugin is also fully functional when deployed on Windows version of Autopsy. +OpenIDE-Module-Long-Description=Recent Activity ingest module.\n\n\The module extracts useful information about the recent user activity on the disk image being ingested, such as:\n\n- Recently open documents,\n- Web activity (sites visited, stored cookies, book marked sites, search engine queries, file downloads),\n- Recently attached devices,\n- Installed programs.\n\nThe module currently supports Windows only disk images.\nThe plugin is also fully functional when deployed on Windows version of Autopsy. OpenIDE-Module-Name=RecentActivity OpenIDE-Module-Short-Description=Recent Activity finder ingest module Chrome.moduleName=Chrome From 24c256f3d2988c61bf262b08aa06c35bcda5b9fb Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Thu, 18 Apr 2019 14:00:03 -0400 Subject: [PATCH 15/32] Modified ContactNode so that all attributes are correctly being displayed from vcards and contacts with multiple attrbutes of the same type --- .../communications/ContactDetailsPane.java | 2 + .../autopsy/communications/ContactNode.java | 55 ++++++++++++++++++- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java b/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java index c22f60fb7e..d699c7cddf 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java @@ -34,6 +34,8 @@ public final class ContactDetailsPane extends javax.swing.JPanel implements Expl public ContactDetailsPane() { initComponents(); this.setEnabled(false); + + nameLabel.setText(""); } /** diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java index 9a59b82a99..e58161b4f0 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java @@ -18,6 +18,8 @@ */ package org.sleuthkit.autopsy.communications; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.TimeZone; import java.util.logging.Level; @@ -63,7 +65,7 @@ final class ContactNode extends BlackboardArtifactNode { super(artifact); String name = getAttributeDisplayString(artifact, TSK_NAME); - if(name == null || name.trim().isEmpty()) { + if (name == null || name.trim().isEmpty()) { // VCards use TSK_NAME_PERSON instead of TSK_NAME name = getAttributeDisplayString(artifact, TSK_NAME_PERSON); } @@ -84,10 +86,57 @@ final class ContactNode extends BlackboardArtifactNode { sheetSet = Sheet.createPropertiesSet(); sheet.put(sheetSet); } - + + // Sorting the attributes by type so that the duplicates can be removed + // and they can be grouped by type for display. try { + HashMap phoneNumList = new HashMap<>(); + HashMap emailList = new HashMap<>(); + HashMap nameList = new HashMap<>(); + HashMap otherList = new HashMap<>(); for (BlackboardAttribute bba : artifact.getAttributes()) { - sheetSet.put(new NodeProperty<>(bba.getAttributeType().getTypeName(), bba.getAttributeType().getDisplayName(), "", bba.getDisplayString())); + if (bba.getAttributeType().getTypeName().contains("TSK_PHONE")) { + phoneNumList.put(bba.getDisplayString(), bba); + } else if (bba.getAttributeType().getTypeName().contains("TSK_EMAIL")) { + emailList.put(bba.getDisplayString(), bba); + } else if (bba.getAttributeType().getTypeName().contains("TSK_NAME")) { + nameList.put(bba.getDisplayString(), bba); + } else { + otherList.put(bba.getDisplayString(), bba); + } + } + String propertyID = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME.getLabel(); + int count = 0; + for (BlackboardAttribute bba : nameList.values()) { + if (count++ > 0) { + sheetSet.put(new NodeProperty<>(propertyID + "_" + count, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString())); + } else { + sheetSet.put(new NodeProperty<>(propertyID, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString())); + } + } + + propertyID = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER.getLabel(); + count = 0; + for (BlackboardAttribute bba : phoneNumList.values()) { + if (count++ > 0) { + sheetSet.put(new NodeProperty<>(propertyID + "_" + count, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString())); + } else { + sheetSet.put(new NodeProperty<>(propertyID, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString())); + } + } + + propertyID = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL.getLabel(); + count = 0; + for (BlackboardAttribute bba : emailList.values()) { + if (count++ > 0) { + sheetSet.put(new NodeProperty<>(propertyID + "_" + count, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString())); + } else { + sheetSet.put(new NodeProperty<>(propertyID, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString())); + } + } + + for (BlackboardAttribute bba1 : otherList.values()) { + sheetSet.put(new NodeProperty<>(bba1.getAttributeType().getTypeName(), bba1.getAttributeType().getDisplayName(), "", bba1.getDisplayString())); } } catch (TskCoreException ex) { From 72b30ea922094eb2c021f08dfa69aa4616944243 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Fri, 19 Apr 2019 16:36:36 -0400 Subject: [PATCH 16/32] Updated after review comments from will --- .../autopsy/communications/ContactDetailsPane.java | 2 +- .../sleuthkit/autopsy/communications/ContactNode.java | 9 --------- .../sleuthkit/autopsy/communications/ContactsViewer.java | 6 +----- .../autopsy/communications/VisualizationPanel.java | 1 - 4 files changed, 2 insertions(+), 16 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java b/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java index d699c7cddf..a092d41483 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java @@ -44,7 +44,7 @@ public final class ContactDetailsPane extends javax.swing.JPanel implements Expl * @param nodes List of nodes to set */ public void setNode(Node[] nodes) { - if (nodes != null) { + if (nodes != null && nodes.length > 0) { nameLabel.setText(nodes[0].getDisplayName()); } else { nameLabel.setText(""); diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java index e58161b4f0..1f1a54038b 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java @@ -18,9 +18,7 @@ */ package org.sleuthkit.autopsy.communications; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.TimeZone; import java.util.logging.Level; import org.openide.nodes.Sheet; @@ -31,16 +29,9 @@ import org.sleuthkit.autopsy.datamodel.NodeProperty; import org.sleuthkit.datamodel.BlackboardArtifact; import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT; import org.sleuthkit.datamodel.BlackboardAttribute; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME_PERSON; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_HOME; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_MOBILE; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_OFFICE; -import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL; import static org.sleuthkit.datamodel.BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME; -import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.TimeUtilities; import org.sleuthkit.datamodel.TskCoreException; diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java index 5e500b3482..cf1369661c 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java @@ -100,11 +100,7 @@ public final class ContactsViewer extends JPanel implements RelationshipsViewer, tableEM.addPropertyChangeListener((PropertyChangeEvent evt) -> { if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) { final Node[] nodes = tableEM.getSelectedNodes(); - - if (nodes != null && nodes.length > 0) { - contactPane.setEnabled(true); - contactPane.setNode(nodes); - } + contactPane.setNode(nodes); } }); diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java index d9bbcb8d39..210b0dfbb0 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java @@ -98,7 +98,6 @@ import org.apache.commons.lang3.StringUtils; import org.controlsfx.control.Notifications; import org.jdesktop.layout.GroupLayout; import org.jdesktop.layout.LayoutStyle; -import org.openide.util.Lookup; import org.openide.util.NbBundle; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.casemodule.Case; From ae796dfcb013750e79b8db2bb4ce2c965278a3c3 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Mon, 22 Apr 2019 10:37:56 -0400 Subject: [PATCH 17/32] Fixed bugs with contact creation --- .../sleuthkit/autopsy/modules/iOS/ContactAnalyzer.java | 8 ++++++++ InternalPythonModules/android/contact.py | 1 + .../sleuthkit/autopsy/thunderbirdparser/VcardParser.java | 4 ++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/modules/iOS/ContactAnalyzer.java b/Core/src/org/sleuthkit/autopsy/modules/iOS/ContactAnalyzer.java index 85fa762300..ce3f971bee 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/iOS/ContactAnalyzer.java +++ b/Core/src/org/sleuthkit/autopsy/modules/iOS/ContactAnalyzer.java @@ -163,6 +163,8 @@ final class ContactAnalyzer { data1 = resultSet.getString("data1"); //NON-NLS mimetype = resultSet.getString("mimetype"); //NON-NLS if (name.equals(oldName) == false) { + bba = file.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT); + attributes = new ArrayList<>(); attributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME, moduleName, name)); } if (mimetype.equals("vnd.android.cursor.item/phone_v2")) { //NON-NLS @@ -170,6 +172,12 @@ final class ContactAnalyzer { } else { attributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL, moduleName, data1)); } + + // TODO: If this code comes back to life, add code to create the account + // and relationship between the phone numbers & emails. Also + // investigate if the mimetype "vnd.android.cursor.item/phone_v2" + // makes sense in an ios word + oldName = name; bba.addAttributes(attributes); diff --git a/InternalPythonModules/android/contact.py b/InternalPythonModules/android/contact.py index e387d73920..2d442c8e4a 100644 --- a/InternalPythonModules/android/contact.py +++ b/InternalPythonModules/android/contact.py @@ -141,6 +141,7 @@ class ContactAnalyzer(general.AndroidComponentAnalyzer): name = resultSet.getString("display_name") data1 = resultSet.getString("data1") # the phone number or email mimetype = resultSet.getString("mimetype") # either phone or email + attributes = ArrayList() if name != oldName: artifact = abstractFile.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT) attributes.add(BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME, general.MODULE_NAME, name)) diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/VcardParser.java b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/VcardParser.java index d1f5f25777..15d52b536e 100755 --- a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/VcardParser.java +++ b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/VcardParser.java @@ -193,7 +193,7 @@ final class VcardParser { } } } - ThunderbirdMboxFileIngestModule.addArtifactAttribute(name, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME_PERSON, attributes); + ThunderbirdMboxFileIngestModule.addArtifactAttribute(name, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME, attributes); for (Telephone telephone : vcard.getTelephoneNumbers()) { addPhoneAttributes(telephone, abstractFile, attributes); @@ -412,7 +412,7 @@ final class VcardParser { type.getValue().toUpperCase().replaceAll("\\s+","").split(",")); for (String splitType : splitTelephoneTypes) { - String attributeTypeName = "TSK_PHONE_" + splitType; + String attributeTypeName = "TSK_PHONE_NUMBER_" + splitType; try { BlackboardAttribute.Type attributeType = tskCase.getAttributeType(attributeTypeName); if (attributeType == null) { From 6554fe819dd59706ff467fece7f60e6d514eed5d Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 23 Apr 2019 14:20:12 -0400 Subject: [PATCH 18/32] committing current changes before playing with thumbnail viewer layout --- .../autopsy/communications/MessageNode.java | 1 + .../communications/ThumbnailChildren.java | 110 ++++++++++++++++ .../autopsy/communications/ThumbnailNode.java | 27 ---- .../communications/ThumbnailNodeFactory.java | 87 ------------- .../communications/ThumbnailViewer.form | 9 +- .../communications/ThumbnailViewer.java | 122 ++++++++++++++++-- .../DataResultViewerThumbnail.java | 8 +- 7 files changed, 235 insertions(+), 129 deletions(-) create mode 100755 Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java delete mode 100755 Core/src/org/sleuthkit/autopsy/communications/ThumbnailNode.java delete mode 100755 Core/src/org/sleuthkit/autopsy/communications/ThumbnailNodeFactory.java diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java index 9b9a94ac31..1b43441a0a 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java @@ -70,6 +70,7 @@ final class MessageNode extends BlackboardArtifactNode { @Override protected Sheet createSheet() { + super.createSheet(); Sheet sheet = new Sheet(); List tags = getAllTagsFromDatabase(); Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES); diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java new file mode 100755 index 0000000000..9312147f41 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java @@ -0,0 +1,110 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obt ain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.communications; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.logging.Level; +import org.openide.nodes.Children; +import org.openide.nodes.Node; +import org.openide.nodes.Sheet; +import org.openide.util.NbBundle; +import org.sleuthkit.autopsy.coreutils.ImageUtils; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.datamodel.AbstractAbstractFileNode; +import org.sleuthkit.autopsy.datamodel.FileNode; +import org.sleuthkit.datamodel.AbstractFile; +import org.sleuthkit.datamodel.BlackboardArtifact; +import org.sleuthkit.datamodel.Content; +import org.sleuthkit.datamodel.TskCoreException; + +/** + * Factory for creating thumbnail children nodes. + * + */ +public class ThumbnailChildren extends Children.Keys { + private static final Logger logger = Logger.getLogger(ThumbnailChildren.class.getName()); + + private final Set thumbnails; + + /* + * Creates the list of thumbnails from the given list of BlackboardArtifacts + */ + ThumbnailChildren(Set artifacts) { + super(false); + thumbnails = new HashSet<>(); + + artifacts.forEach((bba) -> { + try{ + for(Content childContent: bba.getChildren()) { + if(childContent instanceof AbstractFile && ImageUtils.thumbnailSupported((AbstractFile)childContent)) { + thumbnails.add((AbstractFile)childContent); + } + } + } catch(TskCoreException ex) { + logger.log(Level.WARNING, "Unable to get children from artifact.", ex); //NON-NLS + } + }); + } + + @Override + protected Node[] createNodes(AbstractFile t) { + return new Node[]{new ThumbnailNode(t)}; + } + + @Override + protected void addNotify() { + super.addNotify(); + setKeys(thumbnails); + } + + /** + * A node for representing a thumbnail. + */ + private static class ThumbnailNode extends FileNode { + + ThumbnailNode(AbstractFile file) { + super(file, false); + } + + @Override + protected Sheet createSheet() { + Sheet sheet = super.createSheet(); + Set keepProps = new HashSet<>(Arrays.asList( + NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.nameColLbl"), + NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.createSheet.score.name"), + NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.createSheet.comment.name"), + NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.createSheet.count.name"), + NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.sizeColLbl"), + NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.mimeType"), + NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.knownColLbl"))); + + //Remove all other props except for the ones above + Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES); + for(Node.Property p : sheetSet.getProperties()) { + if(!keepProps.contains(p.getName())){ + sheetSet.remove(p.getName()); + } + } + + return sheet; + } + } +} diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailNode.java b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailNode.java deleted file mode 100755 index 229174efea..0000000000 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailNode.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package org.sleuthkit.autopsy.communications; - -import org.openide.nodes.AbstractNode; -import org.openide.nodes.Children; -import org.sleuthkit.datamodel.AbstractContent; - -/** - * - * - */ -public class ThumbnailNode extends AbstractNode{ - - private final AbstractContent content; - - public ThumbnailNode(AbstractContent content) { - super(Children.LEAF); - this.content = content; - - setDisplayName(content.getName()); - } - -} diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailNodeFactory.java deleted file mode 100755 index 529239a056..0000000000 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailNodeFactory.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package org.sleuthkit.autopsy.communications; - -import java.util.List; -import java.util.Set; -import java.util.logging.Level; -import org.openide.nodes.ChildFactory; -import org.openide.nodes.Node; -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; -import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; -import org.sleuthkit.datamodel.AbstractContent; -import org.sleuthkit.datamodel.BlackboardArtifact; -import org.sleuthkit.datamodel.CommunicationsManager; -import org.sleuthkit.datamodel.Content; -import org.sleuthkit.datamodel.TskCoreException; - -/** - * - * @author kelly - */ -public class ThumbnailNodeFactory extends ChildFactory { - private static final Logger logger = Logger.getLogger(ThumbnailNodeFactory.class.getName()); - - private SelectionInfo selectionInfo; - - ThumbnailNodeFactory(SelectionInfo selectionInfo) { - this.selectionInfo = selectionInfo; - } - - @Override - protected boolean createKeys(List list) { - CommunicationsManager communicationManager; - try { - communicationManager = Case.getCurrentCaseThrows().getSleuthkitCase().getCommunicationsManager(); - } catch (NoCurrentCaseException | TskCoreException ex) { - logger.log(Level.SEVERE, "Failed to get communications manager from case.", ex); //NON-NLS - return false; - } - - if(selectionInfo == null) { - return true; - } - - final Set relationshipSources; - - try { - relationshipSources = communicationManager.getRelationshipSources(selectionInfo.getAccountDevicesInstances(), selectionInfo.getCommunicationsFilter()); - } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Failed to get relationship sources.", ex); //NON-NLS - return false; - } - - relationshipSources.stream().filter((content) -> (content instanceof BlackboardArtifact)).forEachOrdered((content) -> { - - BlackboardArtifact bba = (BlackboardArtifact) content; - BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(bba.getArtifactTypeID()); - - if (fromID == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG - || fromID == BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE) { - - try{ - if(bba.hasChildren()) { - - for(Content child: bba.getChildren()) { - list.add(child); - } - } - } catch(TskCoreException ex) { - - } - } - }); - - return true; - } - - @Override - protected Node createNodeForKey(Content key) { - return new ThumbnailNode((AbstractContent)key); - } -} diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form index 3a7a0d392b..94fe03a560 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form +++ b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form @@ -1,6 +1,6 @@ -
+ @@ -23,9 +23,9 @@ - + - + @@ -37,6 +37,9 @@ + + +
diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java index 84306847e6..5014a6c767 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java @@ -18,25 +18,45 @@ */ package org.sleuthkit.autopsy.communications; +import java.awt.Component; +import java.awt.KeyboardFocusManager; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.HashSet; +import java.util.Set; +import java.util.logging.Level; import javax.swing.JPanel; +import static javax.swing.SwingUtilities.isDescendingFrom; import org.openide.explorer.ExplorerManager; import static org.openide.explorer.ExplorerUtils.createLookup; import org.openide.nodes.AbstractNode; -import org.openide.nodes.Children; +import org.openide.nodes.Node; import org.openide.util.Lookup; import org.openide.util.NbBundle.Messages; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.corecomponents.TableFilterNode; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; import org.sleuthkit.autopsy.directorytree.DataResultFilterNode; +import org.sleuthkit.datamodel.AbstractContent; +import org.sleuthkit.datamodel.BlackboardArtifact; +import org.sleuthkit.datamodel.CommunicationsManager; +import org.sleuthkit.datamodel.Content; +import org.sleuthkit.datamodel.TskCoreException; /** * */ -public class ThumbnailViewer extends JPanel implements RelationshipsViewer, ExplorerManager.Provider, Lookup.Provider { +public class ThumbnailViewer extends JPanel implements RelationshipsViewer, ExplorerManager.Provider, Lookup.Provider { + + private static final Logger logger = Logger.getLogger(ThumbnailChildren.class.getName()); private final ExplorerManager tableEM = new ExplorerManager(); - + private final PropertyChangeListener focusPropertyListener; + private final ModifiableProxyLookup proxyLookup; - + @Messages({ "ThumbnailViewer_Name=Thumbnails" }) @@ -45,10 +65,36 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl */ public ThumbnailViewer() { proxyLookup = new ModifiableProxyLookup(createLookup(tableEM, getActionMap())); - + + // See org.sleuthkit.autopsy.timeline.TimeLineTopComponent for a detailed + // explaination of focusPropertyListener + focusPropertyListener = (final PropertyChangeEvent focusEvent) -> { + if (focusEvent.getPropertyName().equalsIgnoreCase("focusOwner")) { + final Component newFocusOwner = (Component) focusEvent.getNewValue(); + + if (newFocusOwner == null) { + return; + } + if (isDescendingFrom(newFocusOwner, contentViewer)) { + //if the focus owner is within the MessageContentViewer (the attachments table) + proxyLookup.setNewLookups(createLookup(((MessageDataContent) contentViewer).getExplorerManager(), getActionMap())); + } else if (isDescendingFrom(newFocusOwner, ThumbnailViewer.this)) { + //... or if it is within the Results table. + proxyLookup.setNewLookups(createLookup(tableEM, getActionMap())); + + } + } + }; + initComponents(); + + tableEM.addPropertyChangeListener((PropertyChangeEvent evt) -> { + if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) { + handleNodeSelectionChange(); + } + }); } - + @Override public String getDisplayName() { return Bundle.ThumbnailViewer_Name(); @@ -61,8 +107,24 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl @Override public void setSelectionInfo(SelectionInfo info) { -// thumbnailViewer.setNode(new TableFilterNode(new DataResultFilterNode(new AbstractNode(Children.create(new ThumbnailNodeFactory(info), true)), getExplorerManager()), true)); - tableEM.setRootContext(new TableFilterNode(new DataResultFilterNode(new AbstractNode(Children.create(new ThumbnailNodeFactory(info), true)), getExplorerManager()), true)); + final Set relationshipSources; + + CommunicationsManager communicationManager; + Set artifactList = new HashSet<>(); + + try { + communicationManager = Case.getCurrentCaseThrows().getSleuthkitCase().getCommunicationsManager(); + relationshipSources = communicationManager.getRelationshipSources(info.getAccountDevicesInstances(), info.getCommunicationsFilter()); + + relationshipSources.stream().filter((content) -> (content instanceof BlackboardArtifact)).forEachOrdered((content) -> { + artifactList.add((BlackboardArtifact) content); + }); + + } catch (TskCoreException | NoCurrentCaseException ex) { + + } + + thumbnailViewer.setNode(new TableFilterNode(new DataResultFilterNode(new AbstractNode(new ThumbnailChildren(artifactList)), tableEM), true)); } @Override @@ -75,6 +137,44 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl return proxyLookup; } + @Override + public void addNotify() { + super.addNotify(); + //add listener that maintains correct selection in the Global Actions Context + KeyboardFocusManager.getCurrentKeyboardFocusManager() + .addPropertyChangeListener("focusOwner", focusPropertyListener); + } + + @Override + public void removeNotify() { + super.removeNotify(); + KeyboardFocusManager.getCurrentKeyboardFocusManager() + .removePropertyChangeListener("focusOwner", focusPropertyListener); + } + + /** + * Handle the change in thumbnail node selection. + */ + private void handleNodeSelectionChange() { + final Node[] nodes = tableEM.getSelectedNodes(); + + if (nodes != null && nodes.length > 0) { + AbstractContent thumbnail = nodes[0].getLookup().lookup(AbstractContent.class); + if (thumbnail != null) { + try { + Content parentContent = thumbnail.getParent(); + if (parentContent != null && parentContent instanceof BlackboardArtifact) { + contentViewer.setNode(new BlackboardArtifactNode((BlackboardArtifact) parentContent)); + } + } catch (TskCoreException ex) { + logger.log(Level.WARNING, "Unable to get parent Content from AbstraceContent instance.", ex); //NON-NLS + } + } + } else { + contentViewer.setNode(null); + } + } + /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always @@ -85,7 +185,7 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl private void initComponents() { thumbnailViewer = new org.sleuthkit.autopsy.corecomponents.DataResultViewerThumbnail(tableEM); - contentViewer = new org.sleuthkit.autopsy.contentviewers.MessageContentViewer(); + contentViewer = new MessageDataContent(); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); @@ -97,9 +197,9 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addComponent(thumbnailViewer, javax.swing.GroupLayout.PREFERRED_SIZE, 443, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(thumbnailViewer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGap(18, 18, Short.MAX_VALUE) - .addComponent(contentViewer, javax.swing.GroupLayout.PREFERRED_SIZE, 532, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(contentViewer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); }// //GEN-END:initComponents diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java index f03c7b01cf..4f4e41d04e 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java @@ -386,7 +386,13 @@ public final class DataResultViewerThumbnail extends AbstractDataResultViewer { rootNodeChildren.cancelLoadingThumbnails(); } try { - if (givenNode != null) { + // There is an issue with ThumbnailViewChildren + // addNotify, that it's call to getChildren.getNodes() does not cause the + // children nodes to be created. Adding a call to getChildren.getNodesCount() + // here will assure that the children nodes are created particularly in the + // case where the DataResultViewerThumbnail stands along from the + // DataResultViewer. See DataResultViewer setNode for more information. + if (givenNode != null && givenNode.getChildren().getNodesCount() > 0) { rootNode = (TableFilterNode) givenNode; /* * Wrap the given node in a ThumbnailViewChildren that will From 682f153c301739d643b24744de2515e66b0a2eda Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 23 Apr 2019 15:24:37 -0400 Subject: [PATCH 19/32] Mucked with all three viewer make sure everything is sizing correctly. Added horizontal scroll pane to RelationshipBrowser. --- .../communications/ContactsViewer.form | 6 ++-- .../communications/ContactsViewer.java | 6 ++-- .../communications/MessagesViewer.form | 4 +-- .../communications/MessagesViewer.java | 4 +-- .../communications/RelationshipBrowser.form | 29 +++++++++++++----- .../communications/RelationshipBrowser.java | 13 ++++++-- .../communications/ThumbnailViewer.form | 30 +++++++++++++++---- .../communications/ThumbnailViewer.java | 23 ++++++++++---- 8 files changed, 86 insertions(+), 29 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form index 166fd065bf..efb5c893a3 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form @@ -23,9 +23,9 @@ - - - + + + diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java index cf1369661c..b43aac70b3 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java @@ -172,9 +172,9 @@ public final class ContactsViewer extends JPanel implements RelationshipsViewer, layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addComponent(outlineView, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(contactPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(outlineView, javax.swing.GroupLayout.DEFAULT_SIZE, 350, Short.MAX_VALUE) + .addGap(1, 1, 1) + .addComponent(contactPane, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)) ); }// //GEN-END:initComponents diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form index 7368b264e5..76cf240254 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form +++ b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form @@ -23,9 +23,9 @@ - + - + diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java index fde59ed8f2..3d8ce847c1 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java @@ -180,9 +180,9 @@ public final class MessagesViewer extends JPanel implements RelationshipsViewer, layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addComponent(outlineView, javax.swing.GroupLayout.PREFERRED_SIZE, 190, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(outlineView, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(contentViewer, javax.swing.GroupLayout.DEFAULT_SIZE, 778, Short.MAX_VALUE)) + .addComponent(contentViewer, javax.swing.GroupLayout.DEFAULT_SIZE, 500, Short.MAX_VALUE)) ); }// //GEN-END:initComponents diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form index a664317372..ac40867a25 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form @@ -16,22 +16,37 @@ - + + + + - + + + + - - - - + + + + - + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java index 83fe1b3ef2..85695e2eb7 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java @@ -67,23 +67,31 @@ final class RelationshipBrowser extends JPanel { // //GEN-BEGIN:initComponents private void initComponents() { + scrollPane = new javax.swing.JScrollPane(); tabPane = new javax.swing.JTabbedPane(); + scrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER); + tabPane.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { tabPaneStateChanged(evt); } }); + scrollPane.setViewportView(tabPane); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(tabPane, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE) + .addGap(0, 400, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(scrollPane, javax.swing.GroupLayout.Alignment.TRAILING)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(tabPane, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) + .addGap(0, 300, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(scrollPane)) ); }// //GEN-END:initComponents @@ -95,6 +103,7 @@ final class RelationshipBrowser extends JPanel { // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JScrollPane scrollPane; private javax.swing.JTabbedPane tabPane; // End of variables declaration//GEN-END:variables } diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form index 94fe03a560..a55bacb9bc 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form +++ b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form @@ -16,30 +16,50 @@ - - + + + + + + + - - - + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java index 5014a6c767..e6029cba92 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java @@ -186,26 +186,39 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl thumbnailViewer = new org.sleuthkit.autopsy.corecomponents.DataResultViewerThumbnail(tableEM); contentViewer = new MessageDataContent(); + separator = new javax.swing.JSeparator(); + + thumbnailViewer.setMinimumSize(new java.awt.Dimension(350, 102)); + + contentViewer.setPreferredSize(new java.awt.Dimension(450, 400)); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(thumbnailViewer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(contentViewer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(thumbnailViewer, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(contentViewer, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(separator) + .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addComponent(thumbnailViewer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGap(18, 18, Short.MAX_VALUE) - .addComponent(contentViewer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(thumbnailViewer, javax.swing.GroupLayout.DEFAULT_SIZE, 350, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(separator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(contentViewer, javax.swing.GroupLayout.PREFERRED_SIZE, 450, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(3, 3, 3)) ); }// //GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private org.sleuthkit.autopsy.contentviewers.MessageContentViewer contentViewer; + private javax.swing.JSeparator separator; private org.sleuthkit.autopsy.corecomponents.DataResultViewerThumbnail thumbnailViewer; // End of variables declaration//GEN-END:variables From 849ca42c04d44c4465601db330a49de803858e91 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Wed, 24 Apr 2019 13:18:20 -0400 Subject: [PATCH 20/32] Final cleanup --- .../org/sleuthkit/autopsy/communications/ThumbnailChildren.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java index 9312147f41..fb23d94eb7 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java @@ -45,7 +45,7 @@ public class ThumbnailChildren extends Children.Keys { private final Set thumbnails; /* - * Creates the list of thumbnails from the given list of BlackboardArtifacts + * Creates the list of thumbnails from the given list of BlackboardArtifacts. */ ThumbnailChildren(Set artifacts) { super(false); From bf9c815359c321e3d320f365c91091b71e298b7c Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Fri, 26 Apr 2019 11:32:26 -0400 Subject: [PATCH 21/32] Updated code with propogating lookups and default sorting on size. --- .../communications/AccountsBrowser.java | 9 +-- .../communications/Bundle.properties-MERGED | 2 +- .../communications/RelationshipBrowser.java | 32 +++++++-- .../communications/RelationshipsViewer.java | 3 +- .../communications/ThumbnailChildren.java | 69 ++++++++++++------- .../communications/ThumbnailViewer.java | 10 ++- 6 files changed, 85 insertions(+), 40 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java index 671f5ed8a2..37f2df996c 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java @@ -35,6 +35,7 @@ import org.openide.nodes.AbstractNode; import org.openide.nodes.Children; import org.openide.nodes.Node; import org.openide.util.Lookup; +import org.openide.util.lookup.ProxyLookup; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.coreutils.Logger; @@ -60,7 +61,6 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro private final Outline outline; - private final ExplorerManager messageBrowserEM = new ExplorerManager(); private final ExplorerManager accountsTableEM = new ExplorerManager(); final RelationshipBrowser relationshipBrowser; @@ -69,7 +69,7 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro * This lookup proxies the selection lookup of both he accounts table and * the messages table. */ - private final Lookup lookup; + private final ProxyLookup proxyLookup; public AccountsBrowser() { initComponents(); @@ -106,7 +106,8 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro } }); - lookup = ExplorerUtils.createLookup(accountsTableEM, getActionMap()); + proxyLookup = new ProxyLookup(relationshipBrowser.getLookup(), + ExplorerUtils.createLookup(accountsTableEM, getActionMap())); } private void setColumnWidths() { @@ -178,6 +179,6 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro @Override public Lookup getLookup() { - return lookup; + return proxyLookup; } } diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED index 22bc2cdd10..7c5889eada 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED @@ -51,7 +51,7 @@ PinAccountsAction.singularText=Add Selected Account to Visualization refreshText=Refresh Results ResetAndPinAccountsAction.pluralText=Visualize Only Selected Accounts ResetAndPinAccountsAction.singularText=Visualize Only Selected Account -ThumbnailViewer_Name=Thumbnails +ThumbnailViewer_Name=Media UnpinAccountsAction.pluralText=Remove Selected Accounts UnpinAccountsAction.singularText=Remove Selected Account VisalizationPanel.paintingError=Problem painting visualization. diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java index 85695e2eb7..432f5e1dd7 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java @@ -18,33 +18,42 @@ */ package org.sleuthkit.autopsy.communications; +import java.awt.Component; import javax.swing.JPanel; +import org.openide.util.Lookup; +import org.openide.util.lookup.ProxyLookup; /** * Displays the Relationship information for the currently selected accounts. * */ -final class RelationshipBrowser extends JPanel { +final class RelationshipBrowser extends JPanel implements Lookup.Provider { private SelectionInfo currentSelection; private final MessagesViewer messagesViewer; private final ContactsViewer contactsViewer; - private final ThumbnailViewer thumbnailViewer; + private final ThumbnailViewer thumbnailsViewer; + + private final ModifiableProxyLookup proxyLookup; /** * Creates new form RelationshipBrowser */ public RelationshipBrowser() { - initComponents(); - messagesViewer = new MessagesViewer(); contactsViewer = new ContactsViewer(); - thumbnailViewer = new ThumbnailViewer(); + thumbnailsViewer = new ThumbnailViewer(); + + proxyLookup = new ModifiableProxyLookup(messagesViewer.getLookup()); + + initComponents(); tabPane.add(messagesViewer.getDisplayName(), messagesViewer); tabPane.add(contactsViewer.getDisplayName(), contactsViewer); - tabPane.add(thumbnailViewer.getDisplayName(), thumbnailViewer); + tabPane.add(thumbnailsViewer.getDisplayName(), thumbnailsViewer); + + } /** @@ -99,6 +108,12 @@ final class RelationshipBrowser extends JPanel { if(currentSelection != null) { ((RelationshipsViewer) tabPane.getSelectedComponent()).setSelectionInfo(currentSelection); } + + Component selectedComponent = tabPane.getSelectedComponent(); + if(selectedComponent instanceof Lookup.Provider) { + Lookup lookup = ((Lookup.Provider)selectedComponent).getLookup(); + proxyLookup.setNewLookups(lookup); + } }//GEN-LAST:event_tabPaneStateChanged @@ -106,4 +121,9 @@ final class RelationshipBrowser extends JPanel { private javax.swing.JScrollPane scrollPane; private javax.swing.JTabbedPane tabPane; // End of variables declaration//GEN-END:variables + + @Override + public Lookup getLookup() { + return proxyLookup; + } } diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java b/Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java index 395182f5d6..ed2accee07 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java @@ -19,11 +19,12 @@ package org.sleuthkit.autopsy.communications; import javax.swing.JPanel; +import org.openide.util.Lookup; /** * Interface for Controls wishing to appear in the RelationshipBrowser tabPane. */ -public interface RelationshipsViewer { +public interface RelationshipsViewer extends Lookup.Provider { /** * Returns the value to be displayed on the "tab" diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java index fb23d94eb7..30a95f35aa 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.communications; import java.util.Arrays; import java.util.HashSet; import java.util.Set; +import java.util.TreeSet; import java.util.logging.Level; import org.openide.nodes.Children; import org.openide.nodes.Node; @@ -38,32 +39,48 @@ import org.sleuthkit.datamodel.TskCoreException; /** * Factory for creating thumbnail children nodes. * + * Given the current way that DataResultViewerThumbnail works this class must + * extend Children.Keys not ChildNodeFactory. When a ChildNodeFactory is used + * the addNotify function in ThumbnailChildNode ends up wtih a list containing + * just the wait node and the thumbanils never appear. */ -public class ThumbnailChildren extends Children.Keys { +final class ThumbnailChildren extends Children.Keys { + private static final Logger logger = Logger.getLogger(ThumbnailChildren.class.getName()); - + private final Set thumbnails; - + /* - * Creates the list of thumbnails from the given list of BlackboardArtifacts. + * Creates the list of thumbnails from the given list of + * BlackboardArtifacts. + * + * The thumbnails will be initialls sorted by size, then name so that they + * appear sorted by size by default. */ ThumbnailChildren(Set artifacts) { super(false); - thumbnails = new HashSet<>(); - + thumbnails = new TreeSet<>((AbstractFile file1, AbstractFile file2) -> { + int result = Long.compare(file1.getSize(), file2.getSize()); + if (result == 0) { + result = file1.getName().compareTo(file2.getName()); + } + + return result; + }); + artifacts.forEach((bba) -> { - try{ - for(Content childContent: bba.getChildren()) { - if(childContent instanceof AbstractFile && ImageUtils.thumbnailSupported((AbstractFile)childContent)) { - thumbnails.add((AbstractFile)childContent); + try { + for (Content childContent : bba.getChildren()) { + if (childContent instanceof AbstractFile && ImageUtils.thumbnailSupported((AbstractFile) childContent)) { + thumbnails.add((AbstractFile) childContent); } } - } catch(TskCoreException ex) { + } catch (TskCoreException ex) { logger.log(Level.WARNING, "Unable to get children from artifact.", ex); //NON-NLS } }); } - + @Override protected Node[] createNodes(AbstractFile t) { return new Node[]{new ThumbnailNode(t)}; @@ -74,13 +91,13 @@ public class ThumbnailChildren extends Children.Keys { super.addNotify(); setKeys(thumbnails); } - + /** * A node for representing a thumbnail. */ - private static class ThumbnailNode extends FileNode { - - ThumbnailNode(AbstractFile file) { + static class ThumbnailNode extends FileNode { + + ThumbnailNode(AbstractFile file) { super(file, false); } @@ -88,18 +105,18 @@ public class ThumbnailChildren extends Children.Keys { protected Sheet createSheet() { Sheet sheet = super.createSheet(); Set keepProps = new HashSet<>(Arrays.asList( - NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.nameColLbl"), - NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.createSheet.score.name"), - NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.createSheet.comment.name"), - NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.createSheet.count.name"), - NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.sizeColLbl"), - NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.mimeType"), - NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.knownColLbl"))); - + NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.nameColLbl"), + NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.createSheet.score.name"), + NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.createSheet.comment.name"), + NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.createSheet.count.name"), + NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.sizeColLbl"), + NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.mimeType"), + NbBundle.getMessage(AbstractAbstractFileNode.class, "AbstractAbstractFileNode.knownColLbl"))); + //Remove all other props except for the ones above Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES); - for(Node.Property p : sheetSet.getProperties()) { - if(!keepProps.contains(p.getName())){ + for (Node.Property p : sheetSet.getProperties()) { + if (!keepProps.contains(p.getName())) { sheetSet.remove(p.getName()); } } diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java index e6029cba92..a4dea6493f 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java @@ -58,7 +58,7 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl private final ModifiableProxyLookup proxyLookup; @Messages({ - "ThumbnailViewer_Name=Thumbnails" + "ThumbnailViewer_Name=Media" }) /** * Creates new form ThumbnailViewer @@ -93,6 +93,8 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl handleNodeSelectionChange(); } }); + + thumbnailViewer.resetComponent(); } @Override @@ -121,7 +123,11 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl }); } catch (TskCoreException | NoCurrentCaseException ex) { - + logger.log(Level.WARNING, "Unable to update selection." , ex); + } + + if(artifactList.size() == 0) { + thumbnailViewer.resetComponent(); } thumbnailViewer.setNode(new TableFilterNode(new DataResultFilterNode(new AbstractNode(new ThumbnailChildren(artifactList)), tableEM), true)); From 6deb2f526f008b58630ebc1e789b80d21f08e9a5 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Mon, 29 Apr 2019 17:53:35 -0400 Subject: [PATCH 22/32] Updated based on review comments on contact code --- .../autopsy/communications/ContactNode.java | 78 +++++++++---------- 1 file changed, 35 insertions(+), 43 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java index 1f1a54038b..f91fe1be78 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java @@ -19,6 +19,7 @@ package org.sleuthkit.autopsy.communications; import java.util.HashMap; +import java.util.Map; import java.util.TimeZone; import java.util.logging.Level; import org.openide.nodes.Sheet; @@ -79,55 +80,35 @@ final class ContactNode extends BlackboardArtifactNode { } // Sorting the attributes by type so that the duplicates can be removed - // and they can be grouped by type for display. + // and they can be grouped by type for display. The attribute prefixes + // are used so that all attributed of that type are found, including + // ones that are not predefined as part of BlackboardAttributes try { - HashMap phoneNumList = new HashMap<>(); - HashMap emailList = new HashMap<>(); - HashMap nameList = new HashMap<>(); - HashMap otherList = new HashMap<>(); + HashMap phoneNumMap = new HashMap<>(); + HashMap emailMap = new HashMap<>(); + HashMap nameMap = new HashMap<>(); + HashMap otherMap = new HashMap<>(); for (BlackboardAttribute bba : artifact.getAttributes()) { - if (bba.getAttributeType().getTypeName().contains("TSK_PHONE")) { - phoneNumList.put(bba.getDisplayString(), bba); - } else if (bba.getAttributeType().getTypeName().contains("TSK_EMAIL")) { - emailList.put(bba.getDisplayString(), bba); - } else if (bba.getAttributeType().getTypeName().contains("TSK_NAME")) { - nameList.put(bba.getDisplayString(), bba); + if (bba.getAttributeType().getTypeName().startsWith("TSK_PHONE")) { + phoneNumMap.put(bba.getDisplayString(), bba); + } else if (bba.getAttributeType().getTypeName().startsWith("TSK_EMAIL")) { + emailMap.put(bba.getDisplayString(), bba); + } else if (bba.getAttributeType().getTypeName().startsWith("TSK_NAME")) { + nameMap.put(bba.getDisplayString(), bba); } else { - otherList.put(bba.getDisplayString(), bba); - } - } - String propertyID = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME.getLabel(); - int count = 0; - for (BlackboardAttribute bba : nameList.values()) { - if (count++ > 0) { - sheetSet.put(new NodeProperty<>(propertyID + "_" + count, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString())); - } else { - sheetSet.put(new NodeProperty<>(propertyID, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString())); + otherMap.put(bba.getDisplayString(), bba); } } + + addPropertiesToSheet(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME.getLabel(), + sheetSet, nameMap); + addPropertiesToSheet(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER.getLabel(), + sheetSet, phoneNumMap); + addPropertiesToSheet(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL.getLabel(), + sheetSet, emailMap); - propertyID = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER.getLabel(); - count = 0; - for (BlackboardAttribute bba : phoneNumList.values()) { - if (count++ > 0) { - sheetSet.put(new NodeProperty<>(propertyID + "_" + count, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString())); - } else { - sheetSet.put(new NodeProperty<>(propertyID, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString())); - } - } - - propertyID = BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL.getLabel(); - count = 0; - for (BlackboardAttribute bba : emailList.values()) { - if (count++ > 0) { - sheetSet.put(new NodeProperty<>(propertyID + "_" + count, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString())); - } else { - sheetSet.put(new NodeProperty<>(propertyID, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString())); - } - } - - for (BlackboardAttribute bba1 : otherList.values()) { - sheetSet.put(new NodeProperty<>(bba1.getAttributeType().getTypeName(), bba1.getAttributeType().getDisplayName(), "", bba1.getDisplayString())); + for (BlackboardAttribute bba : otherMap.values()) { + sheetSet.put(new NodeProperty<>(bba.getAttributeType().getTypeName(), bba.getAttributeType().getDisplayName(), "", bba.getDisplayString())); } } catch (TskCoreException ex) { @@ -136,6 +117,17 @@ final class ContactNode extends BlackboardArtifactNode { return sheet; } + + private void addPropertiesToSheet(String propertyID, Sheet.Set sheetSet, Map attributeMap) { + int count = 0; + for (BlackboardAttribute bba : attributeMap.values()) { + if (count++ > 0) { + sheetSet.put(new NodeProperty<>(propertyID + "_" + count, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString())); + } else { + sheetSet.put(new NodeProperty<>(propertyID, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString())); + } + } + } private static String getAttributeDisplayString(final BlackboardArtifact artifact, final BlackboardAttribute.ATTRIBUTE_TYPE attributeType) { try { From ad6c84bc859d555589c8331778badade3b30a140 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 30 Apr 2019 08:08:12 -0400 Subject: [PATCH 23/32] Updated based on review comment --- .../org/sleuthkit/autopsy/communications/ThumbnailChildren.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java index 30a95f35aa..8d9b0bdc4b 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java @@ -40,7 +40,7 @@ import org.sleuthkit.datamodel.TskCoreException; * Factory for creating thumbnail children nodes. * * Given the current way that DataResultViewerThumbnail works this class must - * extend Children.Keys not ChildNodeFactory. When a ChildNodeFactory is used + * extend Children.Keys not ChildFactory. When a ChildFactory is used * the addNotify function in ThumbnailChildNode ends up wtih a list containing * just the wait node and the thumbanils never appear. */ From 6658ca44d5d18fabcd83d8fd43c4d5265717de8f Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 30 Apr 2019 12:26:56 -0400 Subject: [PATCH 24/32] Removed comment from ThumbnailChildren and initalization of the keys to addNotify --- .../communications/ThumbnailChildren.java | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java index 8d9b0bdc4b..6f60d2cb75 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java @@ -38,17 +38,12 @@ import org.sleuthkit.datamodel.TskCoreException; /** * Factory for creating thumbnail children nodes. - * - * Given the current way that DataResultViewerThumbnail works this class must - * extend Children.Keys not ChildFactory. When a ChildFactory is used - * the addNotify function in ThumbnailChildNode ends up wtih a list containing - * just the wait node and the thumbanils never appear. */ final class ThumbnailChildren extends Children.Keys { private static final Logger logger = Logger.getLogger(ThumbnailChildren.class.getName()); - private final Set thumbnails; + private final Set artifacts; /* * Creates the list of thumbnails from the given list of @@ -59,7 +54,22 @@ final class ThumbnailChildren extends Children.Keys { */ ThumbnailChildren(Set artifacts) { super(false); - thumbnails = new TreeSet<>((AbstractFile file1, AbstractFile file2) -> { + + this.artifacts = artifacts; + + + } + + @Override + protected Node[] createNodes(AbstractFile t) { + return new Node[]{new ThumbnailNode(t)}; + } + + @Override + protected void addNotify() { + super.addNotify(); + + Set thumbnails = new TreeSet<>((AbstractFile file1, AbstractFile file2) -> { int result = Long.compare(file1.getSize(), file2.getSize()); if (result == 0) { result = file1.getName().compareTo(file2.getName()); @@ -71,7 +81,7 @@ final class ThumbnailChildren extends Children.Keys { artifacts.forEach((bba) -> { try { for (Content childContent : bba.getChildren()) { - if (childContent instanceof AbstractFile && ImageUtils.thumbnailSupported((AbstractFile) childContent)) { + if (childContent instanceof AbstractFile) { thumbnails.add((AbstractFile) childContent); } } @@ -79,16 +89,7 @@ final class ThumbnailChildren extends Children.Keys { logger.log(Level.WARNING, "Unable to get children from artifact.", ex); //NON-NLS } }); - } - - @Override - protected Node[] createNodes(AbstractFile t) { - return new Node[]{new ThumbnailNode(t)}; - } - - @Override - protected void addNotify() { - super.addNotify(); + setKeys(thumbnails); } From 3f3e8f859140a9f05d06ef497038d8dabdf36652 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Thu, 2 May 2019 09:18:42 -0400 Subject: [PATCH 25/32] Updated code fixing issues found in review by Will --- .../autopsy/communications/Bundle.properties | 2 +- .../communications/Bundle.properties-MERGED | 2 +- .../communications/ContactDetailsPane.java | 6 +- .../communications/ContactsViewer.java | 1 - .../communications/MessagesViewer.java | 3 +- .../communications/ThumbnailViewer.java | 4 +- .../communications/VisualizationPanel.java | 292 +++++++++--------- .../contentviewers/MessageContentViewer.java | 3 +- 8 files changed, 158 insertions(+), 155 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties index 0463c566e0..08c5b50959 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties @@ -32,7 +32,7 @@ VisualizationPanel.zoomInButton.toolTipText=Zoom in VisualizationPanel.zoomInButton.text= VisualizationPanel.zoomOutButton.toolTipText=Zoom out VisualizationPanel.zoomOutButton.text= -VisualizationPanel.fastOrganicLayoutButton.text=Redraw +VisualizationPanel.fastOrganicLayoutButton.text= VisualizationPanel.backButton.text_1= VisualizationPanel.circleLayoutButton.text=Circle VisualizationPanel.organicLayoutButton.text=Organic diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED index 843370320d..b840b64e62 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED @@ -99,7 +99,7 @@ VisualizationPanel.zoomInButton.toolTipText=Zoom in VisualizationPanel.zoomInButton.text= VisualizationPanel.zoomOutButton.toolTipText=Zoom out VisualizationPanel.zoomOutButton.text= -VisualizationPanel.fastOrganicLayoutButton.text=Redraw +VisualizationPanel.fastOrganicLayoutButton.text= VisualizationPanel.backButton.text_1= VisualizationPanel.circleLayoutButton.text=Circle VisualizationPanel.organicLayoutButton.text=Organic diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java b/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java index a092d41483..4006877d23 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java @@ -44,13 +44,13 @@ public final class ContactDetailsPane extends javax.swing.JPanel implements Expl * @param nodes List of nodes to set */ public void setNode(Node[] nodes) { - if (nodes != null && nodes.length > 0) { + if (nodes != null && nodes.length == 1) { nameLabel.setText(nodes[0].getDisplayName()); + propertySheet.setNodes(nodes); } else { nameLabel.setText(""); + propertySheet.setNodes(null); } - - propertySheet.setNodes(nodes); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java index b43aac70b3..2bb186aaaf 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java @@ -94,7 +94,6 @@ public final class ContactsViewer extends JPanel implements RelationshipsViewer, "TSK_PHONE_NUMBER", BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER.getDisplayName() ); outline.setRootVisible(false); - outline.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); ((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.ContactsViewer_columnHeader_Name()); tableEM.addPropertyChangeListener((PropertyChangeEvent evt) -> { diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java index 3d8ce847c1..4eb3b1b61e 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java @@ -99,14 +99,13 @@ public final class MessagesViewer extends JPanel implements RelationshipsViewer, "Type", "Type" ); outline.setRootVisible(false); - outline.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); ((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel("Type"); tableEM.addPropertyChangeListener((PropertyChangeEvent evt) -> { if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) { final Node[] nodes = tableEM.getSelectedNodes(); - if (nodes != null && nodes.length > 0) { + if (nodes != null && nodes.length == 1) { contentViewer.setNode(nodes[0]); } else { diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java index a4dea6493f..72807810d0 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java @@ -130,7 +130,7 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl thumbnailViewer.resetComponent(); } - thumbnailViewer.setNode(new TableFilterNode(new DataResultFilterNode(new AbstractNode(new ThumbnailChildren(artifactList)), tableEM), true)); + thumbnailViewer.setNode(new TableFilterNode(new DataResultFilterNode(new AbstractNode(new ThumbnailChildren(artifactList)), tableEM), true, this.getClass().getName())); } @Override @@ -164,7 +164,7 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl private void handleNodeSelectionChange() { final Node[] nodes = tableEM.getSelectedNodes(); - if (nodes != null && nodes.length > 0) { + if (nodes != null && nodes.length == 1) { AbstractContent thumbnail = nodes[0].getLookup().lookup(AbstractContent.class); if (thumbnail != null) { try { diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java index e87d6464c1..8f202d289b 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java @@ -371,219 +371,223 @@ final public class VisualizationPanel extends JPanel { // //GEN-BEGIN:initComponents private void initComponents() { - splitPane = new JSplitPane(); - borderLayoutPanel = new JPanel(); - placeHolderPanel = new JPanel(); - jTextArea1 = new JTextArea(); - toolbar = new JPanel(); - fastOrganicLayoutButton = new JButton(); - zoomOutButton = new JButton(); - zoomInButton = new JButton(); - zoomActualButton = new JButton(); - fitZoomButton = new JButton(); - jLabel2 = new JLabel(); - zoomLabel = new JLabel(); - clearVizButton = new JButton(); - jSeparator2 = new JToolBar.Separator(); - backButton = new JButton(); - forwardButton = new JButton(); - snapshotButton = new JButton(); - jSeparator3 = new JToolBar.Separator(); - jSeparator4 = new JToolBar.Separator(); - notificationsJFXPanel = new JFXPanel(); + splitPane = new javax.swing.JSplitPane(); + borderLayoutPanel = new javax.swing.JPanel(); + placeHolderPanel = new javax.swing.JPanel(); + jTextArea1 = new javax.swing.JTextArea(); + toolbar = new javax.swing.JPanel(); + fastOrganicLayoutButton = new javax.swing.JButton(); + zoomOutButton = new javax.swing.JButton(); + zoomInButton = new javax.swing.JButton(); + zoomActualButton = new javax.swing.JButton(); + fitZoomButton = new javax.swing.JButton(); + jLabel2 = new javax.swing.JLabel(); + zoomLabel = new javax.swing.JLabel(); + clearVizButton = new javax.swing.JButton(); + jSeparator2 = new javax.swing.JToolBar.Separator(); + backButton = new javax.swing.JButton(); + forwardButton = new javax.swing.JButton(); + snapshotButton = new javax.swing.JButton(); + jSeparator3 = new javax.swing.JToolBar.Separator(); + jSeparator4 = new javax.swing.JToolBar.Separator(); + notificationsJFXPanel = new javafx.embed.swing.JFXPanel(); - setLayout(new BorderLayout()); + setLayout(new java.awt.BorderLayout()); splitPane.setDividerLocation(800); splitPane.setResizeWeight(0.5); - borderLayoutPanel.setLayout(new BorderLayout()); + borderLayoutPanel.setLayout(new java.awt.BorderLayout()); - jTextArea1.setBackground(new Color(240, 240, 240)); + jTextArea1.setBackground(new java.awt.Color(240, 240, 240)); jTextArea1.setColumns(20); jTextArea1.setLineWrap(true); jTextArea1.setRows(5); - jTextArea1.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.jTextArea1.text")); // NOI18N + jTextArea1.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.jTextArea1.text")); // NOI18N - GroupLayout placeHolderPanelLayout = new GroupLayout(placeHolderPanel); + org.jdesktop.layout.GroupLayout placeHolderPanelLayout = new org.jdesktop.layout.GroupLayout(placeHolderPanel); placeHolderPanel.setLayout(placeHolderPanelLayout); - placeHolderPanelLayout.setHorizontalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING) + placeHolderPanelLayout.setHorizontalGroup( + placeHolderPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(placeHolderPanelLayout.createSequentialGroup() .addContainerGap(250, Short.MAX_VALUE) - .add(jTextArea1, GroupLayout.PREFERRED_SIZE, 424, GroupLayout.PREFERRED_SIZE) + .add(jTextArea1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 424, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addContainerGap(423, Short.MAX_VALUE)) ); - placeHolderPanelLayout.setVerticalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING) + placeHolderPanelLayout.setVerticalGroup( + placeHolderPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(placeHolderPanelLayout.createSequentialGroup() - .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .add(jTextArea1, GroupLayout.PREFERRED_SIZE, 47, GroupLayout.PREFERRED_SIZE) - .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(jTextArea1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 47, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); - borderLayoutPanel.add(placeHolderPanel, BorderLayout.CENTER); + borderLayoutPanel.add(placeHolderPanel, java.awt.BorderLayout.CENTER); - fastOrganicLayoutButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-circle-double-135.png"))); // NOI18N - fastOrganicLayoutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.text")); // NOI18N - fastOrganicLayoutButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.toolTipText")); // NOI18N + fastOrganicLayoutButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-circle-double-135.png"))); // NOI18N + fastOrganicLayoutButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.text")); // NOI18N + fastOrganicLayoutButton.setToolTipText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.toolTipText")); // NOI18N fastOrganicLayoutButton.setFocusable(false); - fastOrganicLayoutButton.setVerticalTextPosition(SwingConstants.BOTTOM); + fastOrganicLayoutButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - zoomOutButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-out-red.png"))); // NOI18N - zoomOutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomOutButton.text")); // NOI18N - zoomOutButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomOutButton.toolTipText")); // NOI18N + zoomOutButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-out-red.png"))); // NOI18N + zoomOutButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomOutButton.text")); // NOI18N + zoomOutButton.setToolTipText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomOutButton.toolTipText")); // NOI18N zoomOutButton.setFocusable(false); - zoomOutButton.setHorizontalTextPosition(SwingConstants.CENTER); - zoomOutButton.setVerticalTextPosition(SwingConstants.BOTTOM); - zoomOutButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { + zoomOutButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + zoomOutButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + zoomOutButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { zoomOutButtonActionPerformed(evt); } }); - zoomInButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"))); // NOI18N - zoomInButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.text")); // NOI18N - zoomInButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.toolTipText")); // NOI18N + zoomInButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"))); // NOI18N + zoomInButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.text")); // NOI18N + zoomInButton.setToolTipText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.toolTipText")); // NOI18N zoomInButton.setFocusable(false); - zoomInButton.setHorizontalTextPosition(SwingConstants.CENTER); - zoomInButton.setVerticalTextPosition(SwingConstants.BOTTOM); - zoomInButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { + zoomInButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + zoomInButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + zoomInButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { zoomInButtonActionPerformed(evt); } }); - zoomActualButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-actual.png"))); // NOI18N - zoomActualButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.text")); // NOI18N - zoomActualButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.toolTipText")); // NOI18N + zoomActualButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-actual.png"))); // NOI18N + zoomActualButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.text")); // NOI18N + zoomActualButton.setToolTipText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.toolTipText")); // NOI18N zoomActualButton.setFocusable(false); - zoomActualButton.setHorizontalTextPosition(SwingConstants.CENTER); - zoomActualButton.setVerticalTextPosition(SwingConstants.BOTTOM); - zoomActualButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { + zoomActualButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + zoomActualButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + zoomActualButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { zoomActualButtonActionPerformed(evt); } }); - fitZoomButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-fit.png"))); // NOI18N - fitZoomButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fitZoomButton.text")); // NOI18N - fitZoomButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fitZoomButton.toolTipText")); // NOI18N + fitZoomButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-fit.png"))); // NOI18N + fitZoomButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fitZoomButton.text")); // NOI18N + fitZoomButton.setToolTipText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fitZoomButton.toolTipText")); // NOI18N fitZoomButton.setFocusable(false); - fitZoomButton.setHorizontalTextPosition(SwingConstants.CENTER); - fitZoomButton.setVerticalTextPosition(SwingConstants.BOTTOM); - fitZoomButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { + fitZoomButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + fitZoomButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + fitZoomButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { fitZoomButtonActionPerformed(evt); } }); - jLabel2.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.jLabel2.text")); // NOI18N + jLabel2.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.jLabel2.text")); // NOI18N - zoomLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomLabel.text")); // NOI18N + zoomLabel.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomLabel.text")); // NOI18N - clearVizButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/broom.png"))); // NOI18N - clearVizButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.text_1")); // NOI18N - clearVizButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.toolTipText")); // NOI18N - clearVizButton.setActionCommand(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.actionCommand")); // NOI18N - clearVizButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { + clearVizButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/broom.png"))); // NOI18N + clearVizButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.text_1")); // NOI18N + clearVizButton.setToolTipText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.toolTipText")); // NOI18N + clearVizButton.setActionCommand(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.actionCommand")); // NOI18N + clearVizButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { clearVizButtonActionPerformed(evt); } }); - jSeparator2.setOrientation(SwingConstants.VERTICAL); + jSeparator2.setOrientation(javax.swing.SwingConstants.VERTICAL); - backButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_previous.png"))); // NOI18N - backButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.text_1")); // NOI18N - backButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.toolTipText")); // NOI18N - backButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { + backButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_previous.png"))); // NOI18N + backButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.text_1")); // NOI18N + backButton.setToolTipText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.toolTipText")); // NOI18N + backButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { backButtonActionPerformed(evt); } }); - forwardButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_next.png"))); // NOI18N - forwardButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.text")); // NOI18N - forwardButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.toolTipText")); // NOI18N - forwardButton.setHorizontalTextPosition(SwingConstants.LEADING); - forwardButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { + forwardButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_next.png"))); // NOI18N + forwardButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.text")); // NOI18N + forwardButton.setToolTipText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.toolTipText")); // NOI18N + forwardButton.setHorizontalTextPosition(javax.swing.SwingConstants.LEADING); + forwardButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { forwardButtonActionPerformed(evt); } }); - snapshotButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/report/images/image.png"))); // NOI18N - snapshotButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.snapshotButton.text_1")); // NOI18N - snapshotButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { + snapshotButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/report/images/image.png"))); // NOI18N + snapshotButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.snapshotButton.text_1")); // NOI18N + snapshotButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { snapshotButtonActionPerformed(evt); } }); - jSeparator3.setOrientation(SwingConstants.VERTICAL); + jSeparator3.setOrientation(javax.swing.SwingConstants.VERTICAL); - jSeparator4.setOrientation(SwingConstants.VERTICAL); + jSeparator4.setOrientation(javax.swing.SwingConstants.VERTICAL); - GroupLayout toolbarLayout = new GroupLayout(toolbar); + org.jdesktop.layout.GroupLayout toolbarLayout = new org.jdesktop.layout.GroupLayout(toolbar); toolbar.setLayout(toolbarLayout); - toolbarLayout.setHorizontalGroup(toolbarLayout.createParallelGroup(GroupLayout.LEADING) + toolbarLayout.setHorizontalGroup( + toolbarLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(toolbarLayout.createSequentialGroup() .addContainerGap() .add(backButton) - .addPreferredGap(LayoutStyle.RELATED) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(forwardButton) - .addPreferredGap(LayoutStyle.RELATED) - .add(jSeparator4, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE) - .addPreferredGap(LayoutStyle.RELATED) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(jSeparator4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 10, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(fastOrganicLayoutButton) - .addPreferredGap(LayoutStyle.RELATED) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(clearVizButton) - .addPreferredGap(LayoutStyle.RELATED) - .add(jSeparator2, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE) - .addPreferredGap(LayoutStyle.RELATED) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(jSeparator2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 10, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel2) - .addPreferredGap(LayoutStyle.RELATED) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(zoomLabel) - .addPreferredGap(LayoutStyle.RELATED) - .add(zoomOutButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE) - .addPreferredGap(LayoutStyle.RELATED) - .add(zoomInButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE) - .addPreferredGap(LayoutStyle.RELATED) - .add(zoomActualButton, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE) - .addPreferredGap(LayoutStyle.RELATED) - .add(fitZoomButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE) - .addPreferredGap(LayoutStyle.RELATED) - .add(jSeparator3, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE) - .addPreferredGap(LayoutStyle.RELATED) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(zoomOutButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 32, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(zoomInButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 32, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(zoomActualButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 33, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(fitZoomButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 32, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(jSeparator3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 10, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(snapshotButton) - .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); - toolbarLayout.setVerticalGroup(toolbarLayout.createParallelGroup(GroupLayout.LEADING) + toolbarLayout.setVerticalGroup( + toolbarLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(toolbarLayout.createSequentialGroup() .add(3, 3, 3) - .add(toolbarLayout.createParallelGroup(GroupLayout.CENTER) + .add(toolbarLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.CENTER) .add(fastOrganicLayoutButton) .add(zoomOutButton) - .add(zoomInButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .add(zoomActualButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .add(fitZoomButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(zoomInButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(zoomActualButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(fitZoomButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(jLabel2) .add(zoomLabel) .add(clearVizButton) - .add(jSeparator2, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(jSeparator2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(backButton) .add(forwardButton) .add(snapshotButton) - .add(jSeparator3, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .add(jSeparator4, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .add(jSeparator3, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(jSeparator4, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .add(3, 3, 3)) ); - borderLayoutPanel.add(toolbar, BorderLayout.PAGE_START); - borderLayoutPanel.add(notificationsJFXPanel, BorderLayout.PAGE_END); + borderLayoutPanel.add(toolbar, java.awt.BorderLayout.PAGE_START); + borderLayoutPanel.add(notificationsJFXPanel, java.awt.BorderLayout.PAGE_END); splitPane.setLeftComponent(borderLayoutPanel); - add(splitPane, BorderLayout.CENTER); + add(splitPane, java.awt.BorderLayout.CENTER); }// //GEN-END:initComponents private void fitZoomButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fitZoomButtonActionPerformed @@ -874,26 +878,26 @@ final public class VisualizationPanel extends JPanel { } // Variables declaration - do not modify//GEN-BEGIN:variables - private JButton backButton; - private JPanel borderLayoutPanel; - private JButton clearVizButton; - private JButton fastOrganicLayoutButton; - private JButton fitZoomButton; - private JButton forwardButton; - private JLabel jLabel2; - private JToolBar.Separator jSeparator2; - private JToolBar.Separator jSeparator3; - private JToolBar.Separator jSeparator4; - private JTextArea jTextArea1; - private JFXPanel notificationsJFXPanel; - private JPanel placeHolderPanel; - private JButton snapshotButton; - private JSplitPane splitPane; - private JPanel toolbar; - private JButton zoomActualButton; - private JButton zoomInButton; - private JLabel zoomLabel; - private JButton zoomOutButton; + private javax.swing.JButton backButton; + private javax.swing.JPanel borderLayoutPanel; + private javax.swing.JButton clearVizButton; + private javax.swing.JButton fastOrganicLayoutButton; + private javax.swing.JButton fitZoomButton; + private javax.swing.JButton forwardButton; + private javax.swing.JLabel jLabel2; + private javax.swing.JToolBar.Separator jSeparator2; + private javax.swing.JToolBar.Separator jSeparator3; + private javax.swing.JToolBar.Separator jSeparator4; + private javax.swing.JTextArea jTextArea1; + private javafx.embed.swing.JFXPanel notificationsJFXPanel; + private javax.swing.JPanel placeHolderPanel; + private javax.swing.JButton snapshotButton; + private javax.swing.JSplitPane splitPane; + private javax.swing.JPanel toolbar; + private javax.swing.JButton zoomActualButton; + private javax.swing.JButton zoomInButton; + private javax.swing.JLabel zoomLabel; + private javax.swing.JButton zoomOutButton; // End of variables declaration//GEN-END:variables /** diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java b/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java index 00c87b3417..e4c99287a9 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java @@ -467,6 +467,7 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont htmlPanel.reset(); textbodyTextArea.setText(""); msgbodyTabbedPane.setEnabled(false); + drp.setNode(null); } @Override @@ -561,7 +562,7 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont msgbodyTabbedPane.setEnabledAt(ATTM_TAB_INDEX, numberOfAttachments > 0); msgbodyTabbedPane.setTitleAt(ATTM_TAB_INDEX, "Attachments (" + numberOfAttachments + ")"); drp.setNode(new TableFilterNode(new DataResultFilterNode(new AbstractNode( - new AttachmentsChildren(attachments)), null), true)); + new AttachmentsChildren(attachments)), drp.getExplorerManager()), true)); } private static String wrapInHtmlBody(String htmlText) { From 806eb76f7fd0933ba98b93cba41912f902cdfda7 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Thu, 2 May 2019 11:43:04 -0400 Subject: [PATCH 26/32] inital commit with a message of a merge from my other branch --- ...hildren.java => AttachementsChildren.java} | 44 ++++++++++--------- ...{ThumbnailViewer.form => MediaViewer.form} | 0 ...{ThumbnailViewer.java => MediaViewer.java} | 12 ++--- .../communications/RelationshipBrowser.java | 4 +- .../contentviewers/MessageContentViewer.java | 2 +- .../directorytree/DataResultFilterNode.java | 25 ++++++++++- 6 files changed, 55 insertions(+), 32 deletions(-) rename Core/src/org/sleuthkit/autopsy/communications/{ThumbnailChildren.java => AttachementsChildren.java} (83%) rename Core/src/org/sleuthkit/autopsy/communications/{ThumbnailViewer.form => MediaViewer.form} (100%) rename Core/src/org/sleuthkit/autopsy/communications/{ThumbnailViewer.java => MediaViewer.java} (95%) diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java b/Core/src/org/sleuthkit/autopsy/communications/AttachementsChildren.java similarity index 83% rename from Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java rename to Core/src/org/sleuthkit/autopsy/communications/AttachementsChildren.java index 30a95f35aa..429e44d2e7 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java +++ b/Core/src/org/sleuthkit/autopsy/communications/AttachementsChildren.java @@ -27,7 +27,6 @@ import org.openide.nodes.Children; import org.openide.nodes.Node; import org.openide.nodes.Sheet; import org.openide.util.NbBundle; -import org.sleuthkit.autopsy.coreutils.ImageUtils; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.AbstractAbstractFileNode; import org.sleuthkit.autopsy.datamodel.FileNode; @@ -44,11 +43,11 @@ import org.sleuthkit.datamodel.TskCoreException; * the addNotify function in ThumbnailChildNode ends up wtih a list containing * just the wait node and the thumbanils never appear. */ -final class ThumbnailChildren extends Children.Keys { +final class AttachementsChildren extends Children.Keys { - private static final Logger logger = Logger.getLogger(ThumbnailChildren.class.getName()); + private static final Logger logger = Logger.getLogger(AttachementsChildren.class.getName()); - private final Set thumbnails; + private final Set artifacts; /* * Creates the list of thumbnails from the given list of @@ -57,9 +56,21 @@ final class ThumbnailChildren extends Children.Keys { * The thumbnails will be initialls sorted by size, then name so that they * appear sorted by size by default. */ - ThumbnailChildren(Set artifacts) { + AttachementsChildren(Set artifacts) { super(false); - thumbnails = new TreeSet<>((AbstractFile file1, AbstractFile file2) -> { + this.artifacts = artifacts; + } + + @Override + protected Node[] createNodes(AbstractFile t) { + return new Node[]{new AttachmentNode(t)}; + } + + @Override + protected void addNotify() { + super.addNotify(); + + Set attachments = new TreeSet<>((AbstractFile file1, AbstractFile file2) -> { int result = Long.compare(file1.getSize(), file2.getSize()); if (result == 0) { result = file1.getName().compareTo(file2.getName()); @@ -71,33 +82,24 @@ final class ThumbnailChildren extends Children.Keys { artifacts.forEach((bba) -> { try { for (Content childContent : bba.getChildren()) { - if (childContent instanceof AbstractFile && ImageUtils.thumbnailSupported((AbstractFile) childContent)) { - thumbnails.add((AbstractFile) childContent); + if (childContent instanceof AbstractFile) { + attachments.add((AbstractFile) childContent); } } } catch (TskCoreException ex) { logger.log(Level.WARNING, "Unable to get children from artifact.", ex); //NON-NLS } }); - } - @Override - protected Node[] createNodes(AbstractFile t) { - return new Node[]{new ThumbnailNode(t)}; - } - - @Override - protected void addNotify() { - super.addNotify(); - setKeys(thumbnails); + setKeys(attachments); } /** - * A node for representing a thumbnail. + * A node for representing a attachememt. */ - static class ThumbnailNode extends FileNode { + static class AttachmentNode extends FileNode { - ThumbnailNode(AbstractFile file) { + AttachmentNode(AbstractFile file) { super(file, false); } diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form b/Core/src/org/sleuthkit/autopsy/communications/MediaViewer.form similarity index 100% rename from Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form rename to Core/src/org/sleuthkit/autopsy/communications/MediaViewer.form diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java b/Core/src/org/sleuthkit/autopsy/communications/MediaViewer.java similarity index 95% rename from Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java rename to Core/src/org/sleuthkit/autopsy/communications/MediaViewer.java index a4dea6493f..775f9c5f09 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MediaViewer.java @@ -46,11 +46,11 @@ import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.TskCoreException; /** - * + * This panel is a RelationshipsViewer panel */ -public class ThumbnailViewer extends JPanel implements RelationshipsViewer, ExplorerManager.Provider, Lookup.Provider { +public class MediaViewer extends JPanel implements RelationshipsViewer, ExplorerManager.Provider, Lookup.Provider { - private static final Logger logger = Logger.getLogger(ThumbnailChildren.class.getName()); + private static final Logger logger = Logger.getLogger(MediaViewer.class.getName()); private final ExplorerManager tableEM = new ExplorerManager(); private final PropertyChangeListener focusPropertyListener; @@ -63,7 +63,7 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl /** * Creates new form ThumbnailViewer */ - public ThumbnailViewer() { + public MediaViewer() { proxyLookup = new ModifiableProxyLookup(createLookup(tableEM, getActionMap())); // See org.sleuthkit.autopsy.timeline.TimeLineTopComponent for a detailed @@ -78,7 +78,7 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl if (isDescendingFrom(newFocusOwner, contentViewer)) { //if the focus owner is within the MessageContentViewer (the attachments table) proxyLookup.setNewLookups(createLookup(((MessageDataContent) contentViewer).getExplorerManager(), getActionMap())); - } else if (isDescendingFrom(newFocusOwner, ThumbnailViewer.this)) { + } else if (isDescendingFrom(newFocusOwner, MediaViewer.this)) { //... or if it is within the Results table. proxyLookup.setNewLookups(createLookup(tableEM, getActionMap())); @@ -130,7 +130,7 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl thumbnailViewer.resetComponent(); } - thumbnailViewer.setNode(new TableFilterNode(new DataResultFilterNode(new AbstractNode(new ThumbnailChildren(artifactList)), tableEM), true)); + thumbnailViewer.setNode(new TableFilterNode(new DataResultFilterNode(new AbstractNode(new AttachementsChildren(artifactList)), tableEM), true)); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java index 432f5e1dd7..49275e4b22 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java @@ -33,7 +33,7 @@ final class RelationshipBrowser extends JPanel implements Lookup.Provider { private final MessagesViewer messagesViewer; private final ContactsViewer contactsViewer; - private final ThumbnailViewer thumbnailsViewer; + private final MediaViewer thumbnailsViewer; private final ModifiableProxyLookup proxyLookup; @@ -43,7 +43,7 @@ final class RelationshipBrowser extends JPanel implements Lookup.Provider { public RelationshipBrowser() { messagesViewer = new MessagesViewer(); contactsViewer = new ContactsViewer(); - thumbnailsViewer = new ThumbnailViewer(); + thumbnailsViewer = new MediaViewer(); proxyLookup = new ModifiableProxyLookup(messagesViewer.getLookup()); diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java b/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java index 00c87b3417..92efe43891 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java @@ -561,7 +561,7 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont msgbodyTabbedPane.setEnabledAt(ATTM_TAB_INDEX, numberOfAttachments > 0); msgbodyTabbedPane.setTitleAt(ATTM_TAB_INDEX, "Attachments (" + numberOfAttachments + ")"); drp.setNode(new TableFilterNode(new DataResultFilterNode(new AbstractNode( - new AttachmentsChildren(attachments)), null), true)); + new AttachmentsChildren(attachments))), true)); } private static String wrapInHtmlBody(String htmlText) { diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java index c375c7f02b..ef209beee5 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java @@ -125,9 +125,23 @@ public class DataResultFilterNode extends FilterNode { static private final DisplayableItemNodeVisitor> getActionsDIV = new GetPopupActionsDisplayableItemNodeVisitor(); private final DisplayableItemNodeVisitor getPreferredActionsDIV = new GetPreferredActionsDisplayableItemNodeVisitor(); + + // In GetPreferredActionsDisplayableItemNodeVisitor this is expected + // to be the directory tree explorer manager + private final ExplorerManager sourceEm; - private final ExplorerManager sourceEm; - + /** + * Constructs a node used to wrap another node before passing it to the + * result viewers. The wrapper node defines the actions associated with the + * wrapped node and may filter out some of its children. + * + * @param node The node to wrap. + */ + public DataResultFilterNode(Node node) { + super(node, null); + this.sourceEm = null; + } + /** * Constructs a node used to wrap another node before passing it to the * result viewers. The wrapper node defines the actions associated with the @@ -635,6 +649,10 @@ public class DataResultFilterNode extends FilterNode { // is a DirectoryTreeFilterNode that wraps the dataModelNode. We need // to set that wrapped node as the selection and root context of the // directory tree explorer manager (sourceEm) + if(sourceEm == null) { + return null; + } + final Node currentSelectionInDirectoryTree = sourceEm.getSelectedNodes()[0]; return new AbstractAction() { @@ -675,6 +693,9 @@ public class DataResultFilterNode extends FilterNode { * @return */ private AbstractAction openParent(AbstractNode node) { + if(sourceEm == null) { + return null; + } // @@@ Why do we ignore node? Node[] selectedFilterNodes = sourceEm.getSelectedNodes(); Node selectedFilterNode = selectedFilterNodes[0]; From d52b9cfc4dbeb0d6b23aced30028566c8321b743 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Thu, 2 May 2019 12:15:58 -0400 Subject: [PATCH 27/32] Revert "inital commit with a message of a merge from my other branch" This reverts commit 806eb76f7fd0933ba98b93cba41912f902cdfda7. --- .../communications/RelationshipBrowser.java | 4 +- ...tsChildren.java => ThumbnailChildren.java} | 44 +++++++++---------- ...{MediaViewer.form => ThumbnailViewer.form} | 0 ...{MediaViewer.java => ThumbnailViewer.java} | 12 ++--- .../contentviewers/MessageContentViewer.java | 2 +- .../directorytree/DataResultFilterNode.java | 25 +---------- 6 files changed, 32 insertions(+), 55 deletions(-) rename Core/src/org/sleuthkit/autopsy/communications/{AttachementsChildren.java => ThumbnailChildren.java} (83%) rename Core/src/org/sleuthkit/autopsy/communications/{MediaViewer.form => ThumbnailViewer.form} (100%) rename Core/src/org/sleuthkit/autopsy/communications/{MediaViewer.java => ThumbnailViewer.java} (95%) diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java index 49275e4b22..432f5e1dd7 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java @@ -33,7 +33,7 @@ final class RelationshipBrowser extends JPanel implements Lookup.Provider { private final MessagesViewer messagesViewer; private final ContactsViewer contactsViewer; - private final MediaViewer thumbnailsViewer; + private final ThumbnailViewer thumbnailsViewer; private final ModifiableProxyLookup proxyLookup; @@ -43,7 +43,7 @@ final class RelationshipBrowser extends JPanel implements Lookup.Provider { public RelationshipBrowser() { messagesViewer = new MessagesViewer(); contactsViewer = new ContactsViewer(); - thumbnailsViewer = new MediaViewer(); + thumbnailsViewer = new ThumbnailViewer(); proxyLookup = new ModifiableProxyLookup(messagesViewer.getLookup()); diff --git a/Core/src/org/sleuthkit/autopsy/communications/AttachementsChildren.java b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java similarity index 83% rename from Core/src/org/sleuthkit/autopsy/communications/AttachementsChildren.java rename to Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java index 429e44d2e7..30a95f35aa 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/AttachementsChildren.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java @@ -27,6 +27,7 @@ import org.openide.nodes.Children; import org.openide.nodes.Node; import org.openide.nodes.Sheet; import org.openide.util.NbBundle; +import org.sleuthkit.autopsy.coreutils.ImageUtils; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.AbstractAbstractFileNode; import org.sleuthkit.autopsy.datamodel.FileNode; @@ -43,11 +44,11 @@ import org.sleuthkit.datamodel.TskCoreException; * the addNotify function in ThumbnailChildNode ends up wtih a list containing * just the wait node and the thumbanils never appear. */ -final class AttachementsChildren extends Children.Keys { +final class ThumbnailChildren extends Children.Keys { - private static final Logger logger = Logger.getLogger(AttachementsChildren.class.getName()); + private static final Logger logger = Logger.getLogger(ThumbnailChildren.class.getName()); - private final Set artifacts; + private final Set thumbnails; /* * Creates the list of thumbnails from the given list of @@ -56,21 +57,9 @@ final class AttachementsChildren extends Children.Keys { * The thumbnails will be initialls sorted by size, then name so that they * appear sorted by size by default. */ - AttachementsChildren(Set artifacts) { + ThumbnailChildren(Set artifacts) { super(false); - this.artifacts = artifacts; - } - - @Override - protected Node[] createNodes(AbstractFile t) { - return new Node[]{new AttachmentNode(t)}; - } - - @Override - protected void addNotify() { - super.addNotify(); - - Set attachments = new TreeSet<>((AbstractFile file1, AbstractFile file2) -> { + thumbnails = new TreeSet<>((AbstractFile file1, AbstractFile file2) -> { int result = Long.compare(file1.getSize(), file2.getSize()); if (result == 0) { result = file1.getName().compareTo(file2.getName()); @@ -82,24 +71,33 @@ final class AttachementsChildren extends Children.Keys { artifacts.forEach((bba) -> { try { for (Content childContent : bba.getChildren()) { - if (childContent instanceof AbstractFile) { - attachments.add((AbstractFile) childContent); + if (childContent instanceof AbstractFile && ImageUtils.thumbnailSupported((AbstractFile) childContent)) { + thumbnails.add((AbstractFile) childContent); } } } catch (TskCoreException ex) { logger.log(Level.WARNING, "Unable to get children from artifact.", ex); //NON-NLS } }); + } - setKeys(attachments); + @Override + protected Node[] createNodes(AbstractFile t) { + return new Node[]{new ThumbnailNode(t)}; + } + + @Override + protected void addNotify() { + super.addNotify(); + setKeys(thumbnails); } /** - * A node for representing a attachememt. + * A node for representing a thumbnail. */ - static class AttachmentNode extends FileNode { + static class ThumbnailNode extends FileNode { - AttachmentNode(AbstractFile file) { + ThumbnailNode(AbstractFile file) { super(file, false); } diff --git a/Core/src/org/sleuthkit/autopsy/communications/MediaViewer.form b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form similarity index 100% rename from Core/src/org/sleuthkit/autopsy/communications/MediaViewer.form rename to Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form diff --git a/Core/src/org/sleuthkit/autopsy/communications/MediaViewer.java b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java similarity index 95% rename from Core/src/org/sleuthkit/autopsy/communications/MediaViewer.java rename to Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java index 775f9c5f09..a4dea6493f 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MediaViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java @@ -46,11 +46,11 @@ import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.TskCoreException; /** - * This panel is a RelationshipsViewer panel + * */ -public class MediaViewer extends JPanel implements RelationshipsViewer, ExplorerManager.Provider, Lookup.Provider { +public class ThumbnailViewer extends JPanel implements RelationshipsViewer, ExplorerManager.Provider, Lookup.Provider { - private static final Logger logger = Logger.getLogger(MediaViewer.class.getName()); + private static final Logger logger = Logger.getLogger(ThumbnailChildren.class.getName()); private final ExplorerManager tableEM = new ExplorerManager(); private final PropertyChangeListener focusPropertyListener; @@ -63,7 +63,7 @@ public class MediaViewer extends JPanel implements RelationshipsViewer, Explorer /** * Creates new form ThumbnailViewer */ - public MediaViewer() { + public ThumbnailViewer() { proxyLookup = new ModifiableProxyLookup(createLookup(tableEM, getActionMap())); // See org.sleuthkit.autopsy.timeline.TimeLineTopComponent for a detailed @@ -78,7 +78,7 @@ public class MediaViewer extends JPanel implements RelationshipsViewer, Explorer if (isDescendingFrom(newFocusOwner, contentViewer)) { //if the focus owner is within the MessageContentViewer (the attachments table) proxyLookup.setNewLookups(createLookup(((MessageDataContent) contentViewer).getExplorerManager(), getActionMap())); - } else if (isDescendingFrom(newFocusOwner, MediaViewer.this)) { + } else if (isDescendingFrom(newFocusOwner, ThumbnailViewer.this)) { //... or if it is within the Results table. proxyLookup.setNewLookups(createLookup(tableEM, getActionMap())); @@ -130,7 +130,7 @@ public class MediaViewer extends JPanel implements RelationshipsViewer, Explorer thumbnailViewer.resetComponent(); } - thumbnailViewer.setNode(new TableFilterNode(new DataResultFilterNode(new AbstractNode(new AttachementsChildren(artifactList)), tableEM), true)); + thumbnailViewer.setNode(new TableFilterNode(new DataResultFilterNode(new AbstractNode(new ThumbnailChildren(artifactList)), tableEM), true)); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java b/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java index 92efe43891..00c87b3417 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java @@ -561,7 +561,7 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont msgbodyTabbedPane.setEnabledAt(ATTM_TAB_INDEX, numberOfAttachments > 0); msgbodyTabbedPane.setTitleAt(ATTM_TAB_INDEX, "Attachments (" + numberOfAttachments + ")"); drp.setNode(new TableFilterNode(new DataResultFilterNode(new AbstractNode( - new AttachmentsChildren(attachments))), true)); + new AttachmentsChildren(attachments)), null), true)); } private static String wrapInHtmlBody(String htmlText) { diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java index ef209beee5..c375c7f02b 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java @@ -125,23 +125,9 @@ public class DataResultFilterNode extends FilterNode { static private final DisplayableItemNodeVisitor> getActionsDIV = new GetPopupActionsDisplayableItemNodeVisitor(); private final DisplayableItemNodeVisitor getPreferredActionsDIV = new GetPreferredActionsDisplayableItemNodeVisitor(); - - // In GetPreferredActionsDisplayableItemNodeVisitor this is expected - // to be the directory tree explorer manager - private final ExplorerManager sourceEm; - /** - * Constructs a node used to wrap another node before passing it to the - * result viewers. The wrapper node defines the actions associated with the - * wrapped node and may filter out some of its children. - * - * @param node The node to wrap. - */ - public DataResultFilterNode(Node node) { - super(node, null); - this.sourceEm = null; - } - + private final ExplorerManager sourceEm; + /** * Constructs a node used to wrap another node before passing it to the * result viewers. The wrapper node defines the actions associated with the @@ -649,10 +635,6 @@ public class DataResultFilterNode extends FilterNode { // is a DirectoryTreeFilterNode that wraps the dataModelNode. We need // to set that wrapped node as the selection and root context of the // directory tree explorer manager (sourceEm) - if(sourceEm == null) { - return null; - } - final Node currentSelectionInDirectoryTree = sourceEm.getSelectedNodes()[0]; return new AbstractAction() { @@ -693,9 +675,6 @@ public class DataResultFilterNode extends FilterNode { * @return */ private AbstractAction openParent(AbstractNode node) { - if(sourceEm == null) { - return null; - } // @@@ Why do we ignore node? Node[] selectedFilterNodes = sourceEm.getSelectedNodes(); Node selectedFilterNode = selectedFilterNodes[0]; From c8e41658f90fddf2aa661745ad1630033aa4351b Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Thu, 2 May 2019 12:49:04 -0400 Subject: [PATCH 28/32] Updated based on comments from Richard and Will, added constructor to DataResultFilterNode that doesn't take an explorermanger --- ...Children.java => AttachmentsChildren.java} | 13 ++++++------- .../communications/Bundle.properties-MERGED | 2 +- ...{ThumbnailViewer.form => MediaViewer.form} | 3 +++ ...{ThumbnailViewer.java => MediaViewer.java} | 17 +++++++++-------- .../communications/RelationshipBrowser.java | 7 +++---- .../contentviewers/MessageContentViewer.java | 2 +- .../directorytree/DataResultFilterNode.java | 19 +++++++++++++++++++ 7 files changed, 42 insertions(+), 21 deletions(-) rename Core/src/org/sleuthkit/autopsy/communications/{ThumbnailChildren.java => AttachmentsChildren.java} (91%) rename Core/src/org/sleuthkit/autopsy/communications/{ThumbnailViewer.form => MediaViewer.form} (94%) rename Core/src/org/sleuthkit/autopsy/communications/{ThumbnailViewer.java => MediaViewer.java} (93%) diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java b/Core/src/org/sleuthkit/autopsy/communications/AttachmentsChildren.java similarity index 91% rename from Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java rename to Core/src/org/sleuthkit/autopsy/communications/AttachmentsChildren.java index 6f60d2cb75..d53e9c6475 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java +++ b/Core/src/org/sleuthkit/autopsy/communications/AttachmentsChildren.java @@ -27,7 +27,6 @@ import org.openide.nodes.Children; import org.openide.nodes.Node; import org.openide.nodes.Sheet; import org.openide.util.NbBundle; -import org.sleuthkit.autopsy.coreutils.ImageUtils; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.AbstractAbstractFileNode; import org.sleuthkit.autopsy.datamodel.FileNode; @@ -39,9 +38,9 @@ import org.sleuthkit.datamodel.TskCoreException; /** * Factory for creating thumbnail children nodes. */ -final class ThumbnailChildren extends Children.Keys { +final class AttachmentsChildren extends Children.Keys { - private static final Logger logger = Logger.getLogger(ThumbnailChildren.class.getName()); + private static final Logger logger = Logger.getLogger(AttachmentsChildren.class.getName()); private final Set artifacts; @@ -52,7 +51,7 @@ final class ThumbnailChildren extends Children.Keys { * The thumbnails will be initialls sorted by size, then name so that they * appear sorted by size by default. */ - ThumbnailChildren(Set artifacts) { + AttachmentsChildren(Set artifacts) { super(false); this.artifacts = artifacts; @@ -62,7 +61,7 @@ final class ThumbnailChildren extends Children.Keys { @Override protected Node[] createNodes(AbstractFile t) { - return new Node[]{new ThumbnailNode(t)}; + return new Node[]{new AttachementNode(t)}; } @Override @@ -96,9 +95,9 @@ final class ThumbnailChildren extends Children.Keys { /** * A node for representing a thumbnail. */ - static class ThumbnailNode extends FileNode { + static class AttachementNode extends FileNode { - ThumbnailNode(AbstractFile file) { + AttachementNode(AbstractFile file) { super(file, false); } diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED index b840b64e62..7fe9cce0c1 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED @@ -33,6 +33,7 @@ FiltersPanel.refreshButton.text=Refresh FiltersPanel.deviceRequiredLabel.text=Select at least one. FiltersPanel.accountTypeRequiredLabel.text=Select at least one. FiltersPanel.needsRefreshLabel.text=Displayed data is out of date. Press Refresh. +MediaViewer_Name=Media MessageNode_Node_Property_Attms=Attachments MessageNode_Node_Property_Date=Date MessageNode_Node_Property_From=From @@ -51,7 +52,6 @@ PinAccountsAction.singularText=Add Selected Account to Visualization refreshText=Refresh Results ResetAndPinAccountsAction.pluralText=Visualize Only Selected Accounts ResetAndPinAccountsAction.singularText=Visualize Only Selected Account -ThumbnailViewer_Name=Media UnpinAccountsAction.pluralText=Remove Selected Accounts UnpinAccountsAction.singularText=Remove Selected Account VisalizationPanel.paintingError=Problem painting visualization. diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form b/Core/src/org/sleuthkit/autopsy/communications/MediaViewer.form similarity index 94% rename from Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form rename to Core/src/org/sleuthkit/autopsy/communications/MediaViewer.form index a55bacb9bc..8f311d3dd4 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form +++ b/Core/src/org/sleuthkit/autopsy/communications/MediaViewer.form @@ -44,6 +44,9 @@ + + + diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java b/Core/src/org/sleuthkit/autopsy/communications/MediaViewer.java similarity index 93% rename from Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java rename to Core/src/org/sleuthkit/autopsy/communications/MediaViewer.java index 72807810d0..aa7d5ce707 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MediaViewer.java @@ -46,11 +46,11 @@ import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.TskCoreException; /** - * + * A Panel that shows the media (thumbnails) for the selected account. */ -public class ThumbnailViewer extends JPanel implements RelationshipsViewer, ExplorerManager.Provider, Lookup.Provider { +final class MediaViewer extends JPanel implements RelationshipsViewer, ExplorerManager.Provider, Lookup.Provider { - private static final Logger logger = Logger.getLogger(ThumbnailChildren.class.getName()); + private static final Logger logger = Logger.getLogger(MediaViewer.class.getName()); private final ExplorerManager tableEM = new ExplorerManager(); private final PropertyChangeListener focusPropertyListener; @@ -58,12 +58,12 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl private final ModifiableProxyLookup proxyLookup; @Messages({ - "ThumbnailViewer_Name=Media" + "MediaViewer_Name=Media" }) /** * Creates new form ThumbnailViewer */ - public ThumbnailViewer() { + public MediaViewer() { proxyLookup = new ModifiableProxyLookup(createLookup(tableEM, getActionMap())); // See org.sleuthkit.autopsy.timeline.TimeLineTopComponent for a detailed @@ -78,7 +78,7 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl if (isDescendingFrom(newFocusOwner, contentViewer)) { //if the focus owner is within the MessageContentViewer (the attachments table) proxyLookup.setNewLookups(createLookup(((MessageDataContent) contentViewer).getExplorerManager(), getActionMap())); - } else if (isDescendingFrom(newFocusOwner, ThumbnailViewer.this)) { + } else if (isDescendingFrom(newFocusOwner, MediaViewer.this)) { //... or if it is within the Results table. proxyLookup.setNewLookups(createLookup(tableEM, getActionMap())); @@ -99,7 +99,7 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl @Override public String getDisplayName() { - return Bundle.ThumbnailViewer_Name(); + return Bundle.MediaViewer_Name(); } @Override @@ -130,7 +130,7 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl thumbnailViewer.resetComponent(); } - thumbnailViewer.setNode(new TableFilterNode(new DataResultFilterNode(new AbstractNode(new ThumbnailChildren(artifactList)), tableEM), true, this.getClass().getName())); + thumbnailViewer.setNode(new TableFilterNode(new DataResultFilterNode(new AbstractNode(new AttachmentsChildren(artifactList)), tableEM), true, this.getClass().getName())); } @Override @@ -195,6 +195,7 @@ public class ThumbnailViewer extends JPanel implements RelationshipsViewer, Expl separator = new javax.swing.JSeparator(); thumbnailViewer.setMinimumSize(new java.awt.Dimension(350, 102)); + thumbnailViewer.setPreferredSize(new java.awt.Dimension(450, 400)); contentViewer.setPreferredSize(new java.awt.Dimension(450, 400)); diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java index 432f5e1dd7..2bf82f5e81 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java @@ -21,7 +21,6 @@ package org.sleuthkit.autopsy.communications; import java.awt.Component; import javax.swing.JPanel; import org.openide.util.Lookup; -import org.openide.util.lookup.ProxyLookup; /** * Displays the Relationship information for the currently selected accounts. @@ -33,7 +32,7 @@ final class RelationshipBrowser extends JPanel implements Lookup.Provider { private final MessagesViewer messagesViewer; private final ContactsViewer contactsViewer; - private final ThumbnailViewer thumbnailsViewer; + private final MediaViewer mediaViewer; private final ModifiableProxyLookup proxyLookup; @@ -43,7 +42,7 @@ final class RelationshipBrowser extends JPanel implements Lookup.Provider { public RelationshipBrowser() { messagesViewer = new MessagesViewer(); contactsViewer = new ContactsViewer(); - thumbnailsViewer = new ThumbnailViewer(); + mediaViewer = new MediaViewer(); proxyLookup = new ModifiableProxyLookup(messagesViewer.getLookup()); @@ -51,7 +50,7 @@ final class RelationshipBrowser extends JPanel implements Lookup.Provider { tabPane.add(messagesViewer.getDisplayName(), messagesViewer); tabPane.add(contactsViewer.getDisplayName(), contactsViewer); - tabPane.add(thumbnailsViewer.getDisplayName(), thumbnailsViewer); + tabPane.add(mediaViewer.getDisplayName(), mediaViewer); } diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java b/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java index e4c99287a9..48f7e4e82e 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/MessageContentViewer.java @@ -562,7 +562,7 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont msgbodyTabbedPane.setEnabledAt(ATTM_TAB_INDEX, numberOfAttachments > 0); msgbodyTabbedPane.setTitleAt(ATTM_TAB_INDEX, "Attachments (" + numberOfAttachments + ")"); drp.setNode(new TableFilterNode(new DataResultFilterNode(new AbstractNode( - new AttachmentsChildren(attachments)), drp.getExplorerManager()), true)); + new AttachmentsChildren(attachments))), true)); } private static String wrapInHtmlBody(String htmlText) { diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java index c375c7f02b..d98e58fe70 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java @@ -126,7 +126,20 @@ public class DataResultFilterNode extends FilterNode { static private final DisplayableItemNodeVisitor> getActionsDIV = new GetPopupActionsDisplayableItemNodeVisitor(); private final DisplayableItemNodeVisitor getPreferredActionsDIV = new GetPreferredActionsDisplayableItemNodeVisitor(); + // Assumptions are made in GetPreferredActionsDisplayableItemNodeVisitor that + // sourceEm is the directory tree explorer manager. private final ExplorerManager sourceEm; + + /** + * Constructs a node used to wrap another node before passing it to the + * result viewers. The wrapper node defines the actions associated with the + * wrapped node and may filter out some of its children. + * + * @param node The node to wrap. + */ + public DataResultFilterNode(Node node) { + this(node, null); + } /** * Constructs a node used to wrap another node before passing it to the @@ -635,6 +648,9 @@ public class DataResultFilterNode extends FilterNode { // is a DirectoryTreeFilterNode that wraps the dataModelNode. We need // to set that wrapped node as the selection and root context of the // directory tree explorer manager (sourceEm) + if(sourceEm == null) { + return null; + } final Node currentSelectionInDirectoryTree = sourceEm.getSelectedNodes()[0]; return new AbstractAction() { @@ -675,6 +691,9 @@ public class DataResultFilterNode extends FilterNode { * @return */ private AbstractAction openParent(AbstractNode node) { + if(sourceEm == null) { + return null; + } // @@@ Why do we ignore node? Node[] selectedFilterNodes = sourceEm.getSelectedNodes(); Node selectedFilterNode = selectedFilterNodes[0]; From b5fa09b5f6e0d75307bc9973d0aae2bd72aaae63 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Mon, 6 May 2019 10:07:31 -0400 Subject: [PATCH 29/32] new account summary panel for communications window. --- .../AccountSourceContentChildNodeFactory.java | 96 ++++++ .../autopsy/communications/Bundle.properties | 14 + .../communications/Bundle.properties-MERGED | 18 + .../CorrelationCaseChildNodeFactory.java | 169 ++++++++++ .../communications/OutlineViewPanel.form | 60 ++++ .../communications/OutlineViewPanel.java | 132 ++++++++ .../communications/RelationshipBrowser.java | 4 +- .../autopsy/communications/SelectionInfo.java | 123 +++++++ .../autopsy/communications/SummaryViewer.form | 215 ++++++++++++ .../autopsy/communications/SummaryViewer.java | 312 ++++++++++++++++++ 10 files changed, 1142 insertions(+), 1 deletion(-) create mode 100755 Core/src/org/sleuthkit/autopsy/communications/AccountSourceContentChildNodeFactory.java create mode 100755 Core/src/org/sleuthkit/autopsy/communications/CorrelationCaseChildNodeFactory.java create mode 100755 Core/src/org/sleuthkit/autopsy/communications/OutlineViewPanel.form create mode 100755 Core/src/org/sleuthkit/autopsy/communications/OutlineViewPanel.java create mode 100755 Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.form create mode 100755 Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.java diff --git a/Core/src/org/sleuthkit/autopsy/communications/AccountSourceContentChildNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/AccountSourceContentChildNodeFactory.java new file mode 100755 index 0000000000..f7a5065476 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/AccountSourceContentChildNodeFactory.java @@ -0,0 +1,96 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.sleuthkit.autopsy.communications; + +import java.util.List; +import java.util.Set; +import java.util.logging.Level; +import org.openide.nodes.AbstractNode; +import org.openide.nodes.ChildFactory; +import org.openide.nodes.Children; +import org.openide.nodes.Node; +import org.openide.util.Exceptions; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.datamodel.Account; +import org.sleuthkit.datamodel.AccountFileInstance; +import org.sleuthkit.datamodel.CommunicationsManager; +import org.sleuthkit.datamodel.Content; +import org.sleuthkit.datamodel.TskCoreException; + +/** + * ChildFactory that creates ContentNode representing the files that reference + * the given list of accounts. + */ +final class AccountSourceContentChildNodeFactory extends ChildFactory { + + private static final Logger logger = Logger.getLogger(AccountSourceContentChildNodeFactory.class.getName()); + + private final Set accounts; + + AccountSourceContentChildNodeFactory(Set accounts) { + this.accounts = accounts; + } + + @Override + protected boolean createKeys(List list) { + if (accounts == null || accounts.isEmpty()) { + return true; + } + + CommunicationsManager communicationManager; + try { + communicationManager = Case.getCurrentCaseThrows().getSleuthkitCase().getCommunicationsManager(); + } catch (NoCurrentCaseException | TskCoreException ex) { + logger.log(Level.WARNING, "Failed to get communications manager from case.", ex); //NON-NLS + return false; + } + + accounts.forEach((account) -> { + try { + List accountFileInstanceList = communicationManager.getAccountFileInstances(account); + + for (AccountFileInstance fileInstance : accountFileInstanceList) { + list.add(fileInstance.getFile()); + } + + } catch (TskCoreException ex) { + logger.log(Level.WARNING, String.format("Failed to getAccountFileInstances for account: %d", account.getAccountID()), ex); //NON-NLS + } + }); + + return true; + } + + @Override + protected Node createNodeForKey(Content content) { + return new ContentNode(content); + } + + /** + * Simple AbstractNode for a Content (file) object. + */ + final class ContentNode extends AbstractNode { + + private final Content content; + + ContentNode(Content content) { + super(Children.LEAF); + this.content = content; + + try { + setDisplayName(content.getUniquePath()); + } catch (TskCoreException ex) { + logger.log(Level.WARNING, String.format("Unable to getUniquePath for Content: %d", content.getId()), ex); //NON-NLS + setDisplayName(content.getName()); + } + + setIconBaseWithExtension("org/sleuthkit/autopsy/images/file-icon.png"); + } + } + +} diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties index 0463c566e0..8430265e2e 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties @@ -46,3 +46,17 @@ VisualizationPanel.forwardButton.toolTipText=Click to go forward VisualizationPanel.fastOrganicLayoutButton.toolTipText=Click to redraw the chart VisualizationPanel.clearVizButton.toolTipText=Click to clear the chart VisualizationPanel.forwardButton.text= +SummaryViewer.countsPanel.border.title=Counts +SummaryViewer.emailLabel.text=Emails: +SummaryViewer.contactsLabel.text=Contacts: +SummaryViewer.attachmentsLabel.text=Attachments: +SummaryViewer.fileReferencesPanel.border.title=File References in Current Case +SummaryViewer.caseReferencesPanel.border.title=Case References +OutlineViewPanel.messageLabel.text= +SummaryViewer.messagesDataLabel.text=messages +SummaryViewer.callLogsDataLabel.text=callLogs +SummaryViewer.contactsDataLabel.text=contacts +SummaryViewer.emailDataLabel.text=emails +SummaryViewer.attachmentsDataLabel.text=attachments +SummaryViewer.messagesLabel.text=Messages: +SummaryViewer.callLogsLabel.text=Call Logs: diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED index 843370320d..9cd3694ba0 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED @@ -51,6 +51,10 @@ PinAccountsAction.singularText=Add Selected Account to Visualization refreshText=Refresh Results ResetAndPinAccountsAction.pluralText=Visualize Only Selected Accounts ResetAndPinAccountsAction.singularText=Visualize Only Selected Account +SummaryViewer_CaseRefNameColumn_Title=Case Name +SummaryViewer_CentralRepository_Message= +SummaryViewer_FileRefNameColumn_Title=Path +SummaryViewer_TabTitle=Summary ThumbnailViewer_Name=Media UnpinAccountsAction.pluralText=Remove Selected Accounts UnpinAccountsAction.singularText=Remove Selected Account @@ -113,6 +117,20 @@ VisualizationPanel.forwardButton.toolTipText=Click to go forward VisualizationPanel.fastOrganicLayoutButton.toolTipText=Click to redraw the chart VisualizationPanel.clearVizButton.toolTipText=Click to clear the chart VisualizationPanel.forwardButton.text= +SummaryViewer.countsPanel.border.title=Counts +SummaryViewer.emailLabel.text=Emails: +SummaryViewer.contactsLabel.text=Contacts: +SummaryViewer.attachmentsLabel.text=Attachments: +SummaryViewer.fileReferencesPanel.border.title=File References in Current Case +SummaryViewer.caseReferencesPanel.border.title=Case References +OutlineViewPanel.messageLabel.text= +SummaryViewer.messagesDataLabel.text=messages +SummaryViewer.callLogsDataLabel.text=callLogs +SummaryViewer.contactsDataLabel.text=contacts +SummaryViewer.emailDataLabel.text=emails +SummaryViewer.attachmentsDataLabel.text=attachments +SummaryViewer.messagesLabel.text=Messages: +SummaryViewer.callLogsLabel.text=Call Logs: VisualizationPanel_action_dialogs_title=Communications VisualizationPanel_action_name_text=Snapshot Report VisualizationPanel_module_name=Communications diff --git a/Core/src/org/sleuthkit/autopsy/communications/CorrelationCaseChildNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/CorrelationCaseChildNodeFactory.java new file mode 100755 index 0000000000..a539918078 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/CorrelationCaseChildNodeFactory.java @@ -0,0 +1,169 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2018 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.communications; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.logging.Level; +import org.openide.nodes.AbstractNode; +import org.openide.nodes.ChildFactory; +import org.openide.nodes.Children; +import org.openide.nodes.Node; +import org.openide.nodes.Sheet; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeNormalizationException; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.datamodel.NodeProperty; +import org.sleuthkit.datamodel.Account; + +/** + * ChildFactory for CorrelationCases. Finds the cases that reference the given + * list of accounts. + */ +final class CorrelationCaseChildNodeFactory extends ChildFactory { + + private static final Logger logger = Logger.getLogger(CorrelationCaseChildNodeFactory.class.getName()); + + private Map correlationTypeMap; + private final Set accounts; + + /** + * ChildFactory for CorrelationCases. + * + * @param accounts List of Account objects + */ + CorrelationCaseChildNodeFactory(Set accounts) { + this.accounts = accounts; + } + + @Override + protected boolean createKeys(List list) { + if (!EamDb.isEnabled()) { + return true; + } + + EamDb dbInstance; + try { + dbInstance = EamDb.getInstance(); + } catch (EamDbException ex) { + logger.log(Level.SEVERE, "Unable to connect to the Central Repository database.", ex); + return false; + } + + Map uniqueCaseMap = new HashMap<>(); + + accounts.forEach((account) -> { + try { + CorrelationAttributeInstance.Type correlationType = getCorrelationType(account.getAccountType()); + if (correlationType != null) { + List correlationInstances = dbInstance.getArtifactInstancesByTypeValue(correlationType, account.getTypeSpecificID()); + correlationInstances.forEach((correlationInstance) -> { + CorrelationCase correlationCase = correlationInstance.getCorrelationCase(); + uniqueCaseMap.put(correlationCase.getCaseUUID(), correlationCase); + }); + } + } catch (EamDbException | CorrelationAttributeNormalizationException ex) { + logger.log(Level.WARNING, String.format("Unable to getArtifactInstance for accountID: %d", account.getAccountID()), ex); + } + }); + + list.addAll(uniqueCaseMap.values()); + + return true; + } + + @Override + protected Node createNodeForKey(CorrelationCase correlationCase) { + return new CaseNode(correlationCase); + } + + /** + * Find the CorrelationAttributeInstance.Type for the given Account.Type. + * + * @param accountType Account type + * + * @return CorrelationAttributeInstance.Type for given account or null if + * there is no match + * + * @throws EamDbException + */ + private CorrelationAttributeInstance.Type getCorrelationType(Account.Type accountType) throws EamDbException { + if (correlationTypeMap == null) { + correlationTypeMap = new HashMap<>(); + List correcationTypeList = CorrelationAttributeInstance.getDefaultCorrelationTypes(); + correcationTypeList.forEach((type) -> { + correlationTypeMap.put(type.getId(), type); + }); + } + + if (Account.Type.EMAIL.equals(accountType)) { + return correlationTypeMap.get(CorrelationAttributeInstance.EMAIL_TYPE_ID); + } else if (Account.Type.PHONE.equals(accountType)) { + return correlationTypeMap.get(CorrelationAttributeInstance.PHONE_TYPE_ID); + } else { + return null; + } + } + + /** + * Simple AbstractNode for a CorrelationCase. The property sheet only + * contains the creation date. + */ + final class CaseNode extends AbstractNode { + + private final CorrelationCase correlationCase; + + /** + * Construct the object, set the display name and icon. + * + * @param correlationCase + */ + CaseNode(CorrelationCase correlationCase) { + super(Children.LEAF); + this.correlationCase = correlationCase; + + setDisplayName(correlationCase.getDisplayName()); + setIconBaseWithExtension("org/sleuthkit/autopsy/images/briefcase.png"); + } + + @Override + protected Sheet createSheet() { + super.createSheet(); + Sheet sheet = new Sheet(); + Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES); + if (sheetSet == null) { + sheetSet = Sheet.createPropertiesSet(); + sheet.put(sheetSet); + } + + sheetSet.put(new NodeProperty<>("creationDate", + correlationCase.getTitleCreationDate(), + correlationCase.getTitleCreationDate(), + correlationCase.getCreationDate())); + + return sheet; + } + } + +} diff --git a/Core/src/org/sleuthkit/autopsy/communications/OutlineViewPanel.form b/Core/src/org/sleuthkit/autopsy/communications/OutlineViewPanel.form new file mode 100755 index 0000000000..584e1e221d --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/OutlineViewPanel.form @@ -0,0 +1,60 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/Core/src/org/sleuthkit/autopsy/communications/OutlineViewPanel.java b/Core/src/org/sleuthkit/autopsy/communications/OutlineViewPanel.java new file mode 100755 index 0000000000..183ebdc0d9 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/OutlineViewPanel.java @@ -0,0 +1,132 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obt ain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.communications; + +import java.awt.CardLayout; +import org.openide.explorer.ExplorerManager; +import static org.openide.explorer.ExplorerUtils.createLookup; +import org.openide.explorer.view.OutlineView; +import org.openide.nodes.Node;; +import org.openide.util.Lookup; + +/** + * This class is a simple wrapper around a OutlineView with its own ExplorerManager. + * + * This panel has the added feature of being able to hide the OutlineView and show + * a message. + * + */ +public class OutlineViewPanel extends javax.swing.JPanel implements ExplorerManager.Provider, Lookup.Provider{ + + private final ExplorerManager tableEm; + private final Lookup lookup; + /** + * Creates new form OutlineViewPanel + */ + public OutlineViewPanel() { + tableEm = new ExplorerManager(); + lookup = createLookup(tableEm, getActionMap()); + + initComponents(); + } + + @Override + public ExplorerManager getExplorerManager() { + return tableEm; + } + + @Override + public Lookup getLookup() { + return lookup; + } + + /** + * Hide the OutlineView and replace with a panel with the given message. + * + * @param message String message to show on the panel. + */ + public void hideOutlineView(String message) { + CardLayout layout = (CardLayout)this.getLayout(); + layout.show(this, "messageCard"); //NON-NLS + messageLabel.setText(message); + } + + /** + * Hides the message panel and shows the OutlineView. + */ + public void showOutlineView() { + CardLayout layout = (CardLayout)this.getLayout(); + layout.show(this, "outlineCard"); //NON-NLS + } + + /** + * Returns the OutlineView instance for ease of customization. + * + * @return Returns the OutlineView + */ + public OutlineView getOutlineView() { + return outlineView; + } + + public void setNode(Node node) { + tableEm.setRootContext(node); + } + + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + outlineView.setEnabled(enabled); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + outlineView = new org.openide.explorer.view.OutlineView(); + messagePanel = new javax.swing.JPanel(); + messageLabel = new javax.swing.JLabel(); + + setLayout(new java.awt.CardLayout(5, 5)); + + outlineView.setPreferredSize(new java.awt.Dimension(300, 400)); + add(outlineView, "outlineCard"); + + messagePanel.setLayout(new java.awt.BorderLayout()); + + messageLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + org.openide.awt.Mnemonics.setLocalizedText(messageLabel, org.openide.util.NbBundle.getMessage(OutlineViewPanel.class, "OutlineViewPanel.messageLabel.text")); // NOI18N + messageLabel.setEnabled(false); + messagePanel.add(messageLabel, java.awt.BorderLayout.CENTER); + + add(messagePanel, "messageCard"); + }// //GEN-END:initComponents + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel messageLabel; + private javax.swing.JPanel messagePanel; + private org.openide.explorer.view.OutlineView outlineView; + // End of variables declaration//GEN-END:variables + +} diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java index 432f5e1dd7..aaeafa7c3a 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java @@ -21,7 +21,6 @@ package org.sleuthkit.autopsy.communications; import java.awt.Component; import javax.swing.JPanel; import org.openide.util.Lookup; -import org.openide.util.lookup.ProxyLookup; /** * Displays the Relationship information for the currently selected accounts. @@ -34,6 +33,7 @@ final class RelationshipBrowser extends JPanel implements Lookup.Provider { private final MessagesViewer messagesViewer; private final ContactsViewer contactsViewer; private final ThumbnailViewer thumbnailsViewer; + private final SummaryViewer summaryViewer; private final ModifiableProxyLookup proxyLookup; @@ -44,11 +44,13 @@ final class RelationshipBrowser extends JPanel implements Lookup.Provider { messagesViewer = new MessagesViewer(); contactsViewer = new ContactsViewer(); thumbnailsViewer = new ThumbnailViewer(); + summaryViewer = new SummaryViewer(); proxyLookup = new ModifiableProxyLookup(messagesViewer.getLookup()); initComponents(); + tabPane.add(summaryViewer.getDisplayName(), summaryViewer); tabPane.add(messagesViewer.getDisplayName(), messagesViewer); tabPane.add(contactsViewer.getDisplayName(), contactsViewer); tabPane.add(thumbnailsViewer.getDisplayName(), thumbnailsViewer); diff --git a/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java b/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java index d1a28eb2d6..a67b442f51 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java +++ b/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java @@ -18,18 +18,35 @@ */ package org.sleuthkit.autopsy.communications; +import java.util.HashSet; import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.openide.util.Exceptions; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.datamodel.Account; import org.sleuthkit.datamodel.AccountDeviceInstance; +import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.CommunicationsFilter; +import org.sleuthkit.datamodel.CommunicationsManager; +import org.sleuthkit.datamodel.Content; +import org.sleuthkit.datamodel.TskCoreException; /** * Class to wrap the details of the current selection from the AccountBrowser or * VisualizationPane */ public final class SelectionInfo { + + private static final Logger logger = Logger.getLogger(SelectionInfo.class.getName()); private final Set accountDeviceInstances; private final CommunicationsFilter communicationFilter; + private final Set accounts; + + private Set accountArtifacts = null; + private SelectionSummary summary = null; /** * Wraps the details of the currently selected accounts. @@ -40,6 +57,11 @@ public final class SelectionInfo { SelectionInfo(Set accountDeviceInstances, CommunicationsFilter communicationFilter) { this.accountDeviceInstances = accountDeviceInstances; this.communicationFilter = communicationFilter; + + accounts = new HashSet<>(); + accountDeviceInstances.forEach((instance) -> { + accounts.add(instance.getAccount()); + }); } /** @@ -59,5 +81,106 @@ public final class SelectionInfo { public CommunicationsFilter getCommunicationsFilter() { return communicationFilter; } + + public Set getAccounts() { + return accounts; + } + + public Set getArtifacts() { + if(accountArtifacts == null) { + accountArtifacts = new HashSet<>(); + CommunicationsManager communicationManager; + try { + communicationManager = Case.getCurrentCaseThrows().getSleuthkitCase().getCommunicationsManager(); + } catch (NoCurrentCaseException | TskCoreException ex) { + logger.log(Level.SEVERE, "Failed to get communications manager from case.", ex); //NON-NLS + return null; + } + + final Set relationshipSources; + + try { + relationshipSources = communicationManager.getRelationshipSources(getAccountDevicesInstances(), getCommunicationsFilter()); + + relationshipSources.stream().filter((content) -> (content instanceof BlackboardArtifact)).forEachOrdered((content) -> { + accountArtifacts.add((BlackboardArtifact) content); + }); + + } catch (TskCoreException ex) { + logger.log(Level.SEVERE, "Failed to get relationship sources.", ex); //NON-NLS + } + } + + return accountArtifacts; + } + + public SelectionSummary getSummary() { + if(summary == null) { + summary = new SelectionSummary(); + } + + return summary; + } + + final class SelectionSummary{ + int attachmentCnt; + int messagesCnt; + int emailCnt; + int callLogCnt; + int contactsCnt; + + SelectionSummary() { + getCounts(); + } + + private void getCounts(){ + for(BlackboardArtifact artifact: getArtifacts()) { + BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID()); + if(null != fromID) switch (fromID) { + case TSK_EMAIL_MSG: + emailCnt++; + break; + case TSK_CALLLOG: + callLogCnt++; + break; + case TSK_MESSAGE: + messagesCnt++; + break; + case TSK_CONTACT: + contactsCnt++; + break; + default: + break; + } + try{ + attachmentCnt+= artifact.getChildrenCount(); + } catch (TskCoreException ex) { + logger.log(Level.WARNING, String.format("Exception thrown " + + "from getChildrenCount artifactID: %d", + artifact.getArtifactID()), ex); //NON-NLS + } + } + } + + public int getAttachmentCnt() { + return attachmentCnt; + } + + public int getMessagesCnt() { + return messagesCnt; + } + + public int getEmailCnt() { + return emailCnt; + } + + public int getCallLogCnt() { + return callLogCnt; + } + + public int getContactsCnt() { + return contactsCnt; + } + } } diff --git a/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.form b/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.form new file mode 100755 index 0000000000..2859fff954 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.form @@ -0,0 +1,215 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.java b/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.java new file mode 100755 index 0000000000..19e7f9eb75 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.java @@ -0,0 +1,312 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obt ain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.communications; + +import java.util.Set; +import javax.swing.JPanel; +import org.netbeans.swing.outline.DefaultOutlineModel; +import org.netbeans.swing.outline.Outline; +import org.openide.explorer.view.OutlineView; +import org.openide.nodes.AbstractNode; +import org.openide.nodes.Children; +import org.openide.util.Lookup; +import org.openide.util.NbBundle.Messages; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; +import org.sleuthkit.autopsy.communications.SelectionInfo.SelectionSummary; +import org.sleuthkit.datamodel.Account; + +/** + * Account Summary View Panel. This panel shows a list of various counts related + * to the currently selected account. As well has a panel showing a list of + * cases and files that reference the account. + * + */ +public class SummaryViewer extends javax.swing.JPanel implements RelationshipsViewer { + + private final Lookup lookup; + + @Messages({ + "SummaryViewer_TabTitle=Summary", + "SummaryViewer_FileRefNameColumn_Title=Path", + "SummaryViewer_CaseRefNameColumn_Title=Case Name", + "SummaryViewer_CentralRepository_Message=" + }) + + /** + * Creates new form SummaryViewer + */ + public SummaryViewer() { + lookup = Lookup.getDefault(); + initComponents(); + + OutlineView outlineView = fileReferencesPanel.getOutlineView(); + Outline outline = outlineView.getOutline(); + + outline.setRootVisible(false); + ((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.SummaryViewer_FileRefNameColumn_Title()); + + outlineView = caseReferencesPanel.getOutlineView(); + outline = outlineView.getOutline(); + outlineView.setPropertyColumns("creationDate", "Creation Date"); + + outline.setRootVisible(false); + ((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.SummaryViewer_CaseRefNameColumn_Title()); + + clearControls(); + } + + @Override + public String getDisplayName() { + return Bundle.SummaryViewer_TabTitle(); + } + + @Override + public JPanel getPanel() { + return this; + } + + @Override + public void setSelectionInfo(SelectionInfo info) { + + if (!EamDb.isEnabled()) { + caseReferencesPanel.hideOutlineView(Bundle.SummaryViewer_CentralRepository_Message()); + } else { + caseReferencesPanel.showOutlineView(); + } + + // Request is that the SummaryViewer only show information if one + // account is selected + if (info.getAccounts().size() != 1) { + setEnabled(false); + clearControls(); + + } else { + SelectionSummary summaryDetails = info.getSummary(); + + attachmentsDataLabel.setText(Integer.toString(summaryDetails.getAttachmentCnt())); + callLogsDataLabel.setText(Integer.toString(summaryDetails.getCallLogCnt())); + contactsDataLabel.setText(Integer.toString(summaryDetails.getContactsCnt())); + emailDataLabel.setText(Integer.toString(summaryDetails.getEmailCnt())); + messagesDataLabel.setText(Integer.toString(summaryDetails.getMessagesCnt())); + + fileReferencesPanel.setNode(new AbstractNode(Children.create(new AccountSourceContentChildNodeFactory(info.getAccounts()), true))); + caseReferencesPanel.setNode(new AbstractNode(Children.create(new CorrelationCaseChildNodeFactory(info.getAccounts()), true))); + + setEnabled(true); + } + } + + @Override + public Lookup getLookup() { + return lookup; + } + + /** + * Sets whether or not the text fields are enabled. + * + * @param enabled true if this component should be enabled, false otherwise + */ + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + attachmentsLabel.setEnabled(enabled); + callLogsLabel.setEnabled(enabled); + contactsLabel.setEnabled(enabled); + emailLabel.setEnabled(enabled); + messagesLabel.setEnabled(enabled); + caseReferencesPanel.setEnabled(enabled); + fileReferencesPanel.setEnabled(enabled); + countsPanel.setEnabled(enabled); + } + + /** + * Clears the text fields and OutlookViews. + */ + private void clearControls() { + attachmentsDataLabel.setText(""); + callLogsDataLabel.setText(""); + contactsDataLabel.setText(""); + emailDataLabel.setText(""); + messagesDataLabel.setText(""); + + fileReferencesPanel.setNode(new AbstractNode(Children.LEAF)); + caseReferencesPanel.setNode(new AbstractNode(Children.LEAF)); + } + + /** + * For the given accounts create a comma separated string of all of the + * names (TypeSpecificID). + * + * @param accounts Set of selected accounts + * + * @return String listing the account names + */ + private String createAccountLabel(Set accounts) { + StringBuilder buffer = new StringBuilder(); + accounts.stream().map((account) -> { + buffer.append(account.getTypeSpecificID()); + return account; + }).forEachOrdered((_item) -> { + buffer.append(", "); + }); + + return buffer.toString().substring(0, buffer.length() - 2); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + countsPanel = new javax.swing.JPanel(); + emailLabel = new javax.swing.JLabel(); + contactsLabel = new javax.swing.JLabel(); + messagesLabel = new javax.swing.JLabel(); + callLogsLabel = new javax.swing.JLabel(); + attachmentsLabel = new javax.swing.JLabel(); + attachmentsDataLabel = new javax.swing.JLabel(); + messagesDataLabel = new javax.swing.JLabel(); + callLogsDataLabel = new javax.swing.JLabel(); + contactsDataLabel = new javax.swing.JLabel(); + emailDataLabel = new javax.swing.JLabel(); + fileReferencesPanel = new org.sleuthkit.autopsy.communications.OutlineViewPanel(); + caseReferencesPanel = new org.sleuthkit.autopsy.communications.OutlineViewPanel(); + + countsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.countsPanel.border.title"))); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(emailLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.emailLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(contactsLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.contactsLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(messagesLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.messagesLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(callLogsLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.callLogsLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(attachmentsLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.attachmentsLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(attachmentsDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.attachmentsDataLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(messagesDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.messagesDataLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(callLogsDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.callLogsDataLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(contactsDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.contactsDataLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(emailDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.emailDataLabel.text")); // NOI18N + + javax.swing.GroupLayout countsPanelLayout = new javax.swing.GroupLayout(countsPanel); + countsPanel.setLayout(countsPanelLayout); + countsPanelLayout.setHorizontalGroup( + countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(countsPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(attachmentsLabel) + .addComponent(messagesLabel) + .addComponent(callLogsLabel) + .addComponent(contactsLabel) + .addComponent(emailLabel)) + .addGap(18, 18, 18) + .addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(emailDataLabel) + .addComponent(contactsDataLabel) + .addComponent(callLogsDataLabel) + .addComponent(messagesDataLabel) + .addComponent(attachmentsDataLabel)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + countsPanelLayout.setVerticalGroup( + countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(countsPanelLayout.createSequentialGroup() + .addGap(7, 7, 7) + .addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(attachmentsLabel) + .addComponent(attachmentsDataLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(messagesLabel) + .addComponent(messagesDataLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(callLogsLabel) + .addComponent(callLogsDataLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(contactsLabel) + .addComponent(contactsDataLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(emailLabel) + .addComponent(emailDataLabel)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + fileReferencesPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.fileReferencesPanel.border.title"))); // NOI18N + fileReferencesPanel.setPreferredSize(new java.awt.Dimension(472, 300)); + + caseReferencesPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.caseReferencesPanel.border.title"))); // NOI18N + caseReferencesPanel.setPreferredSize(new java.awt.Dimension(472, 300)); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(countsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(fileReferencesPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 485, Short.MAX_VALUE) + .addComponent(caseReferencesPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(countsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(fileReferencesPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(caseReferencesPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel attachmentsDataLabel; + private javax.swing.JLabel attachmentsLabel; + private javax.swing.JLabel callLogsDataLabel; + private javax.swing.JLabel callLogsLabel; + private org.sleuthkit.autopsy.communications.OutlineViewPanel caseReferencesPanel; + private javax.swing.JLabel contactsDataLabel; + private javax.swing.JLabel contactsLabel; + private javax.swing.JPanel countsPanel; + private javax.swing.JLabel emailDataLabel; + private javax.swing.JLabel emailLabel; + private org.sleuthkit.autopsy.communications.OutlineViewPanel fileReferencesPanel; + private javax.swing.JLabel messagesDataLabel; + private javax.swing.JLabel messagesLabel; + // End of variables declaration//GEN-END:variables + +} From 83f6f1ff849412dfe756cba1678123f11fa7e431 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Mon, 6 May 2019 10:45:10 -0400 Subject: [PATCH 30/32] Removed not needed exceptions and changed a panel title. --- .../AccountSourceContentChildNodeFactory.java | 3 +-- .../sleuthkit/autopsy/communications/Bundle.properties | 2 +- .../autopsy/communications/Bundle.properties-MERGED | 3 ++- .../communications/CorrelationCaseChildNodeFactory.java | 8 ++++---- .../sleuthkit/autopsy/communications/SummaryViewer.form | 2 +- .../sleuthkit/autopsy/communications/SummaryViewer.java | 5 +++-- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/AccountSourceContentChildNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/AccountSourceContentChildNodeFactory.java index f7a5065476..0b91987a0b 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/AccountSourceContentChildNodeFactory.java +++ b/Core/src/org/sleuthkit/autopsy/communications/AccountSourceContentChildNodeFactory.java @@ -12,7 +12,6 @@ import org.openide.nodes.AbstractNode; import org.openide.nodes.ChildFactory; import org.openide.nodes.Children; import org.openide.nodes.Node; -import org.openide.util.Exceptions; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.coreutils.Logger; @@ -89,7 +88,7 @@ final class AccountSourceContentChildNodeFactory extends ChildFactory { setDisplayName(content.getName()); } - setIconBaseWithExtension("org/sleuthkit/autopsy/images/file-icon.png"); + setIconBaseWithExtension("org/sleuthkit/autopsy/images/file-icon.png"); //NON-NLS } } diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties index 8430265e2e..54c65bfc8e 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties @@ -51,7 +51,7 @@ SummaryViewer.emailLabel.text=Emails: SummaryViewer.contactsLabel.text=Contacts: SummaryViewer.attachmentsLabel.text=Attachments: SummaryViewer.fileReferencesPanel.border.title=File References in Current Case -SummaryViewer.caseReferencesPanel.border.title=Case References +SummaryViewer.caseReferencesPanel.border.title=Other Occurrences OutlineViewPanel.messageLabel.text= SummaryViewer.messagesDataLabel.text=messages SummaryViewer.callLogsDataLabel.text=callLogs diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED index 9cd3694ba0..8739aacaed 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED @@ -53,6 +53,7 @@ ResetAndPinAccountsAction.pluralText=Visualize Only Selected Accounts ResetAndPinAccountsAction.singularText=Visualize Only Selected Account SummaryViewer_CaseRefNameColumn_Title=Case Name SummaryViewer_CentralRepository_Message= +SummaryViewer_Creation_Date_Title=Creation Date SummaryViewer_FileRefNameColumn_Title=Path SummaryViewer_TabTitle=Summary ThumbnailViewer_Name=Media @@ -122,7 +123,7 @@ SummaryViewer.emailLabel.text=Emails: SummaryViewer.contactsLabel.text=Contacts: SummaryViewer.attachmentsLabel.text=Attachments: SummaryViewer.fileReferencesPanel.border.title=File References in Current Case -SummaryViewer.caseReferencesPanel.border.title=Case References +SummaryViewer.caseReferencesPanel.border.title=Other Occurrences OutlineViewPanel.messageLabel.text= SummaryViewer.messagesDataLabel.text=messages SummaryViewer.callLogsDataLabel.text=callLogs diff --git a/Core/src/org/sleuthkit/autopsy/communications/CorrelationCaseChildNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/CorrelationCaseChildNodeFactory.java index a539918078..539bc0e028 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/CorrelationCaseChildNodeFactory.java +++ b/Core/src/org/sleuthkit/autopsy/communications/CorrelationCaseChildNodeFactory.java @@ -67,7 +67,7 @@ final class CorrelationCaseChildNodeFactory extends ChildFactory("creationDate", + sheetSet.put(new NodeProperty<>("creationDate", //NON-NLS correlationCase.getTitleCreationDate(), correlationCase.getTitleCreationDate(), correlationCase.getCreationDate())); diff --git a/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.form b/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.form index 2859fff954..c9c708d871 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.form +++ b/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.form @@ -201,7 +201,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.java b/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.java index 19e7f9eb75..659dd1aac4 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.java @@ -45,7 +45,8 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi "SummaryViewer_TabTitle=Summary", "SummaryViewer_FileRefNameColumn_Title=Path", "SummaryViewer_CaseRefNameColumn_Title=Case Name", - "SummaryViewer_CentralRepository_Message=" + "SummaryViewer_CentralRepository_Message=", + "SummaryViewer_Creation_Date_Title=Creation Date" }) /** @@ -63,7 +64,7 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi outlineView = caseReferencesPanel.getOutlineView(); outline = outlineView.getOutline(); - outlineView.setPropertyColumns("creationDate", "Creation Date"); + outlineView.setPropertyColumns("creationDate", Bundle.SummaryViewer_Creation_Date_Title()); //NON-NLS outline.setRootVisible(false); ((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.SummaryViewer_CaseRefNameColumn_Title()); From e96868240ba5eacb263c19ca4923e43957a3d3cf Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Mon, 6 May 2019 14:45:43 -0400 Subject: [PATCH 31/32] moved relationship browser code into its own package --- .../communications/AccountsBrowser.java | 2 + .../autopsy/communications/Bundle.properties | 15 ------- .../communications/Bundle.properties-MERGED | 44 ------------------- .../communications/ModifiableProxyLookup.java | 4 +- .../autopsy/communications/Utils.java | 6 +-- .../communications/VisualizationPanel.java | 2 + .../AccountSourceContentChildNodeFactory.java | 2 +- .../relationships/Bundle.properties | 15 +++++++ .../relationships/Bundle.properties-MERGED | 44 +++++++++++++++++++ .../ContactDetailsPane.form | 4 ++ .../ContactDetailsPane.java | 4 +- .../{ => relationships}/ContactNode.java | 3 +- .../ContactsChildNodeFactory.java | 2 +- .../{ => relationships}/ContactsViewer.form | 2 +- .../{ => relationships}/ContactsViewer.java | 11 ++--- .../CorrelationCaseChildNodeFactory.java | 2 +- .../MessageDataContent.java | 2 +- .../{ => relationships}/MessageNode.java | 3 +- .../MessagesChildNodeFactory.java | 2 +- .../{ => relationships}/MessagesViewer.form | 0 .../{ => relationships}/MessagesViewer.java | 3 +- .../{ => relationships}/OutlineViewPanel.form | 2 +- .../{ => relationships}/OutlineViewPanel.java | 2 +- .../RelationshipBrowser.form | 0 .../RelationshipBrowser.java | 5 ++- .../RelationshipsViewer.java | 2 +- .../{ => relationships}/SelectionInfo.java | 5 +-- .../{ => relationships}/SummaryViewer.form | 24 +++++----- .../{ => relationships}/SummaryViewer.java | 18 ++++---- .../ThumbnailChildren.java | 2 +- .../{ => relationships}/ThumbnailViewer.form | 0 .../{ => relationships}/ThumbnailViewer.java | 3 +- 32 files changed, 125 insertions(+), 110 deletions(-) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/AccountSourceContentChildNodeFactory.java (98%) create mode 100755 Core/src/org/sleuthkit/autopsy/communications/relationships/Bundle.properties create mode 100755 Core/src/org/sleuthkit/autopsy/communications/relationships/Bundle.properties-MERGED rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/ContactDetailsPane.form (94%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/ContactDetailsPane.java (94%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/ContactNode.java (98%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/ContactsChildNodeFactory.java (98%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/ContactsViewer.form (94%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/ContactsViewer.java (95%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/CorrelationCaseChildNodeFactory.java (99%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/MessageDataContent.java (96%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/MessageNode.java (98%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/MessagesChildNodeFactory.java (98%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/MessagesViewer.form (100%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/MessagesViewer.java (98%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/OutlineViewPanel.form (94%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/OutlineViewPanel.java (98%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/RelationshipBrowser.form (100%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/RelationshipBrowser.java (95%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/RelationshipsViewer.java (96%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/SelectionInfo.java (96%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/SummaryViewer.form (83%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/SummaryViewer.java (97%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/ThumbnailChildren.java (98%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/ThumbnailViewer.form (100%) rename Core/src/org/sleuthkit/autopsy/communications/{ => relationships}/ThumbnailViewer.java (98%) diff --git a/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java index 4461b45604..fcf64182a3 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/AccountsBrowser.java @@ -38,6 +38,8 @@ import org.openide.util.Lookup; import org.openide.util.lookup.ProxyLookup; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.communications.relationships.RelationshipBrowser; +import org.sleuthkit.autopsy.communications.relationships.SelectionInfo; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.datamodel.AccountDeviceInstance; import org.sleuthkit.datamodel.CommunicationsFilter; diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties index 54c65bfc8e..62fc17b917 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties @@ -39,24 +39,9 @@ VisualizationPanel.organicLayoutButton.text=Organic VisualizationPanel.hierarchyLayoutButton.text=Hierarchical VisualizationPanel.clearVizButton.text_1= VisualizationPanel.snapshotButton.text_1=Snapshot Report -ContactDetailsPane.nameLabel.text=jLabel1 VisualizationPanel.clearVizButton.actionCommand= VisualizationPanel.backButton.toolTipText=Click to go back VisualizationPanel.forwardButton.toolTipText=Click to go forward VisualizationPanel.fastOrganicLayoutButton.toolTipText=Click to redraw the chart VisualizationPanel.clearVizButton.toolTipText=Click to clear the chart VisualizationPanel.forwardButton.text= -SummaryViewer.countsPanel.border.title=Counts -SummaryViewer.emailLabel.text=Emails: -SummaryViewer.contactsLabel.text=Contacts: -SummaryViewer.attachmentsLabel.text=Attachments: -SummaryViewer.fileReferencesPanel.border.title=File References in Current Case -SummaryViewer.caseReferencesPanel.border.title=Other Occurrences -OutlineViewPanel.messageLabel.text= -SummaryViewer.messagesDataLabel.text=messages -SummaryViewer.callLogsDataLabel.text=callLogs -SummaryViewer.contactsDataLabel.text=contacts -SummaryViewer.emailDataLabel.text=emails -SummaryViewer.attachmentsDataLabel.text=attachments -SummaryViewer.messagesLabel.text=Messages: -SummaryViewer.callLogsLabel.text=Call Logs: diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED index 8739aacaed..b9292e1d14 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties-MERGED @@ -3,17 +3,6 @@ AccountNode.accountType=Type AccountNode.device=Device AccountNode.messageCount=Msgs applyText=Apply -ContactNode_Email=Email Address -ContactNode_Home_Number=Home Number -ContactNode_Mobile_Number=Mobile Number -ContactNode_Name=Name -ContactNode_Office_Number=Office Number -ContactNode_Phone=Phone Number -ContactNode_URL=URL -ContactsViewer_columnHeader_Email=Email -ContactsViewer_columnHeader_Name=Name -ContactsViewer_columnHeader_Phone=Phone -ContactsViewer_tabTitle=Contacts CTL_OpenCVTAction=Communications CVTTopComponent.name=\ Communications Visualization CVTTopComponent.TabConstraints.tabTitle=Visualize @@ -33,30 +22,12 @@ FiltersPanel.refreshButton.text=Refresh FiltersPanel.deviceRequiredLabel.text=Select at least one. FiltersPanel.accountTypeRequiredLabel.text=Select at least one. FiltersPanel.needsRefreshLabel.text=Displayed data is out of date. Press Refresh. -MessageNode_Node_Property_Attms=Attachments -MessageNode_Node_Property_Date=Date -MessageNode_Node_Property_From=From -MessageNode_Node_Property_Subject=Subject -MessageNode_Node_Property_To=To -MessageNode_Node_Property_Type=Type -MessageViewer_columnHeader_Attms=Attachments -MessageViewer_columnHeader_Date=Date -MessageViewer_columnHeader_From=From -MessageViewer_columnHeader_Subject=Subject -MessageViewer_columnHeader_To=To -MessageViewer_tabTitle=Messages OpenCVTAction.displayName=Communications PinAccountsAction.pluralText=Add Selected Accounts to Visualization PinAccountsAction.singularText=Add Selected Account to Visualization refreshText=Refresh Results ResetAndPinAccountsAction.pluralText=Visualize Only Selected Accounts ResetAndPinAccountsAction.singularText=Visualize Only Selected Account -SummaryViewer_CaseRefNameColumn_Title=Case Name -SummaryViewer_CentralRepository_Message= -SummaryViewer_Creation_Date_Title=Creation Date -SummaryViewer_FileRefNameColumn_Title=Path -SummaryViewer_TabTitle=Summary -ThumbnailViewer_Name=Media UnpinAccountsAction.pluralText=Remove Selected Accounts UnpinAccountsAction.singularText=Remove Selected Account VisalizationPanel.paintingError=Problem painting visualization. @@ -111,27 +82,12 @@ VisualizationPanel.organicLayoutButton.text=Organic VisualizationPanel.hierarchyLayoutButton.text=Hierarchical VisualizationPanel.clearVizButton.text_1= VisualizationPanel.snapshotButton.text_1=Snapshot Report -ContactDetailsPane.nameLabel.text=jLabel1 VisualizationPanel.clearVizButton.actionCommand= VisualizationPanel.backButton.toolTipText=Click to go back VisualizationPanel.forwardButton.toolTipText=Click to go forward VisualizationPanel.fastOrganicLayoutButton.toolTipText=Click to redraw the chart VisualizationPanel.clearVizButton.toolTipText=Click to clear the chart VisualizationPanel.forwardButton.text= -SummaryViewer.countsPanel.border.title=Counts -SummaryViewer.emailLabel.text=Emails: -SummaryViewer.contactsLabel.text=Contacts: -SummaryViewer.attachmentsLabel.text=Attachments: -SummaryViewer.fileReferencesPanel.border.title=File References in Current Case -SummaryViewer.caseReferencesPanel.border.title=Other Occurrences -OutlineViewPanel.messageLabel.text= -SummaryViewer.messagesDataLabel.text=messages -SummaryViewer.callLogsDataLabel.text=callLogs -SummaryViewer.contactsDataLabel.text=contacts -SummaryViewer.emailDataLabel.text=emails -SummaryViewer.attachmentsDataLabel.text=attachments -SummaryViewer.messagesLabel.text=Messages: -SummaryViewer.callLogsLabel.text=Call Logs: VisualizationPanel_action_dialogs_title=Communications VisualizationPanel_action_name_text=Snapshot Report VisualizationPanel_module_name=Communications diff --git a/Core/src/org/sleuthkit/autopsy/communications/ModifiableProxyLookup.java b/Core/src/org/sleuthkit/autopsy/communications/ModifiableProxyLookup.java index ad3babc504..0eccb8bf10 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/ModifiableProxyLookup.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ModifiableProxyLookup.java @@ -26,9 +26,9 @@ import org.openide.util.lookup.ProxyLookup; * delegated to. * */ -final class ModifiableProxyLookup extends ProxyLookup { +final public class ModifiableProxyLookup extends ProxyLookup { - ModifiableProxyLookup(final Lookup... lookups) { + public ModifiableProxyLookup(final Lookup... lookups) { super(lookups); } diff --git a/Core/src/org/sleuthkit/autopsy/communications/Utils.java b/Core/src/org/sleuthkit/autopsy/communications/Utils.java index c4a62209c7..4a3e03e1f2 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/Utils.java +++ b/Core/src/org/sleuthkit/autopsy/communications/Utils.java @@ -28,12 +28,12 @@ import org.sleuthkit.datamodel.Account; /** * Utility class with helpers for dealing with accounts. */ -class Utils { +public final class Utils { private Utils() { } - static ZoneId getUserPreferredZoneId() { + static public ZoneId getUserPreferredZoneId() { ZoneId zone = UserPreferences.displayTimesInLocalTime() ? ZoneOffset.systemDefault() : TimeZone.getTimeZone(UserPreferences.getTimeZoneForDisplays()).toZoneId(); return zone; @@ -44,7 +44,7 @@ class Utils { * * @return The path of the icon for the given Account Type. */ - static final String getIconFilePath(Account.Type type) { + static public final String getIconFilePath(Account.Type type) { return Accounts.getIconFilePath(type); } diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java index e87d6464c1..39acafb3a6 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java @@ -101,6 +101,8 @@ import org.openide.util.NbBundle; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.communications.relationships.RelationshipBrowser; +import org.sleuthkit.autopsy.communications.relationships.SelectionInfo; import org.sleuthkit.autopsy.communications.snapshot.CommSnapShotReportWriter; import org.sleuthkit.autopsy.coreutils.FileUtil; import org.sleuthkit.autopsy.coreutils.Logger; diff --git a/Core/src/org/sleuthkit/autopsy/communications/AccountSourceContentChildNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/AccountSourceContentChildNodeFactory.java similarity index 98% rename from Core/src/org/sleuthkit/autopsy/communications/AccountSourceContentChildNodeFactory.java rename to Core/src/org/sleuthkit/autopsy/communications/relationships/AccountSourceContentChildNodeFactory.java index 0b91987a0b..17154e4608 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/AccountSourceContentChildNodeFactory.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/AccountSourceContentChildNodeFactory.java @@ -3,7 +3,7 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package org.sleuthkit.autopsy.communications; +package org.sleuthkit.autopsy.communications.relationships; import java.util.List; import java.util.Set; diff --git a/Core/src/org/sleuthkit/autopsy/communications/relationships/Bundle.properties b/Core/src/org/sleuthkit/autopsy/communications/relationships/Bundle.properties new file mode 100755 index 0000000000..6ef03951af --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/Bundle.properties @@ -0,0 +1,15 @@ +ContactDetailsPane.nameLabel.text=Placeholder +SummaryViewer.countsPanel.border.title=Counts +SummaryViewer.emailLabel.text=Emails: +SummaryViewer.contactsLabel.text=Contacts: +SummaryViewer.attachmentsLabel.text=Attachments: +SummaryViewer.fileReferencesPanel.border.title=File References in Current Case +SummaryViewer.caseReferencesPanel.border.title=Other Occurrences +OutlineViewPanel.messageLabel.text= +SummaryViewer.messagesDataLabel.text=messages +SummaryViewer.callLogsDataLabel.text=callLogs +SummaryViewer.contactsDataLabel.text=contacts +SummaryViewer.emailDataLabel.text=emails +SummaryViewer.attachmentsDataLabel.text=attachments +SummaryViewer.messagesLabel.text=Messages: +SummaryViewer.callLogsLabel.text=Call Logs: diff --git a/Core/src/org/sleuthkit/autopsy/communications/relationships/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/communications/relationships/Bundle.properties-MERGED new file mode 100755 index 0000000000..ed84d8be86 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/Bundle.properties-MERGED @@ -0,0 +1,44 @@ +ContactDetailsPane.nameLabel.text=Placeholder +ContactNode_Email=Email Address +ContactNode_Home_Number=Home Number +ContactNode_Mobile_Number=Mobile Number +ContactNode_Name=Name +ContactNode_Office_Number=Office Number +ContactNode_Phone=Phone Number +ContactNode_URL=URL +ContactsViewer_columnHeader_Email=Email +ContactsViewer_columnHeader_Name=Name +ContactsViewer_columnHeader_Phone=Phone +ContactsViewer_tabTitle=Contacts +MessageNode_Node_Property_Attms=Attachments +MessageNode_Node_Property_Date=Date +MessageNode_Node_Property_From=From +MessageNode_Node_Property_Subject=Subject +MessageNode_Node_Property_To=To +MessageNode_Node_Property_Type=Type +MessageViewer_columnHeader_Attms=Attachments +MessageViewer_columnHeader_Date=Date +MessageViewer_columnHeader_From=From +MessageViewer_columnHeader_Subject=Subject +MessageViewer_columnHeader_To=To +MessageViewer_tabTitle=Messages +SummaryViewer.countsPanel.border.title=Counts +SummaryViewer.emailLabel.text=Emails: +SummaryViewer.contactsLabel.text=Contacts: +SummaryViewer.attachmentsLabel.text=Attachments: +SummaryViewer.fileReferencesPanel.border.title=File References in Current Case +SummaryViewer.caseReferencesPanel.border.title=Other Occurrences +OutlineViewPanel.messageLabel.text= +SummaryViewer.messagesDataLabel.text=messages +SummaryViewer.callLogsDataLabel.text=callLogs +SummaryViewer.contactsDataLabel.text=contacts +SummaryViewer.emailDataLabel.text=emails +SummaryViewer.attachmentsDataLabel.text=attachments +SummaryViewer.messagesLabel.text=Messages: +SummaryViewer.callLogsLabel.text=Call Logs: +SummaryViewer_CaseRefNameColumn_Title=Case Name +SummaryViewer_CentralRepository_Message= +SummaryViewer_Creation_Date_Title=Creation Date +SummaryViewer_FileRefNameColumn_Title=Path +SummaryViewer_TabTitle=Summary +ThumbnailViewer_Name=Media diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.form b/Core/src/org/sleuthkit/autopsy/communications/relationships/ContactDetailsPane.form similarity index 94% rename from Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.form rename to Core/src/org/sleuthkit/autopsy/communications/relationships/ContactDetailsPane.form index 2cf54c02ea..2ae2165358 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.form +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/ContactDetailsPane.form @@ -1,6 +1,10 @@
+ + + + diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/ContactDetailsPane.java similarity index 94% rename from Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java rename to Core/src/org/sleuthkit/autopsy/communications/relationships/ContactDetailsPane.java index a092d41483..1d9746a4f9 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactDetailsPane.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/ContactDetailsPane.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.communications; +package org.sleuthkit.autopsy.communications.relationships; import org.openide.explorer.ExplorerManager; import org.openide.nodes.Node; @@ -74,6 +74,7 @@ public final class ContactDetailsPane extends javax.swing.JPanel implements Expl // //GEN-BEGIN:initComponents private void initComponents() { + messageContentViewer1 = new org.sleuthkit.autopsy.contentviewers.MessageContentViewer(); nameLabel = new javax.swing.JLabel(); propertySheet = new org.openide.explorer.propertysheet.PropertySheet(); @@ -108,6 +109,7 @@ public final class ContactDetailsPane extends javax.swing.JPanel implements Expl // Variables declaration - do not modify//GEN-BEGIN:variables + private org.sleuthkit.autopsy.contentviewers.MessageContentViewer messageContentViewer1; private javax.swing.JLabel nameLabel; private org.openide.explorer.propertysheet.PropertySheet propertySheet; // End of variables declaration//GEN-END:variables diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/ContactNode.java similarity index 98% rename from Core/src/org/sleuthkit/autopsy/communications/ContactNode.java rename to Core/src/org/sleuthkit/autopsy/communications/relationships/ContactNode.java index 1f1a54038b..e98e7079e3 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/ContactNode.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.communications; +package org.sleuthkit.autopsy.communications.relationships; import java.util.HashMap; import java.util.TimeZone; @@ -34,6 +34,7 @@ import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAM import static org.sleuthkit.datamodel.BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME; import org.sleuthkit.datamodel.TimeUtilities; import org.sleuthkit.datamodel.TskCoreException; +import org.sleuthkit.autopsy.communications.Utils; /** * Extends BlackboardArtifactNode to override createSheet to create a contact diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsChildNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/ContactsChildNodeFactory.java similarity index 98% rename from Core/src/org/sleuthkit/autopsy/communications/ContactsChildNodeFactory.java rename to Core/src/org/sleuthkit/autopsy/communications/relationships/ContactsChildNodeFactory.java index 08471c5324..681a572b96 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactsChildNodeFactory.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/ContactsChildNodeFactory.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.communications; +package org.sleuthkit.autopsy.communications.relationships; import java.util.List; import java.util.Set; diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form b/Core/src/org/sleuthkit/autopsy/communications/relationships/ContactsViewer.form similarity index 94% rename from Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form rename to Core/src/org/sleuthkit/autopsy/communications/relationships/ContactsViewer.form index efb5c893a3..82fb67dad9 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.form +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/ContactsViewer.form @@ -36,7 +36,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/ContactsViewer.java similarity index 95% rename from Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java rename to Core/src/org/sleuthkit/autopsy/communications/relationships/ContactsViewer.java index b43aac70b3..12141988fa 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactsViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/ContactsViewer.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.communications; +package org.sleuthkit.autopsy.communications.relationships; import java.awt.Component; import java.awt.KeyboardFocusManager; @@ -35,6 +35,7 @@ import org.openide.nodes.Node; import org.openide.util.Lookup; import org.openide.util.NbBundle; import org.openide.util.lookup.ServiceProvider; +import org.sleuthkit.autopsy.communications.ModifiableProxyLookup; import org.sleuthkit.autopsy.corecomponents.TableFilterNode; import org.sleuthkit.autopsy.directorytree.DataResultFilterNode; import org.sleuthkit.datamodel.BlackboardAttribute; @@ -103,7 +104,7 @@ public final class ContactsViewer extends JPanel implements RelationshipsViewer, contactPane.setNode(nodes); } }); - + tableEM.setRootContext(new TableFilterNode(new DataResultFilterNode(new AbstractNode(Children.create(nodeFactory, true)), getExplorerManager()), true)); } @@ -121,7 +122,7 @@ public final class ContactsViewer extends JPanel implements RelationshipsViewer, public void setSelectionInfo(SelectionInfo info) { contactPane.setNode(new Node[]{new AbstractNode(Children.LEAF)}); contactPane.setEnabled(false); - + nodeFactory.refresh(info); } @@ -160,7 +161,7 @@ public final class ContactsViewer extends JPanel implements RelationshipsViewer, private void initComponents() { outlineView = new org.openide.explorer.view.OutlineView(); - contactPane = new org.sleuthkit.autopsy.communications.ContactDetailsPane(); + contactPane = new org.sleuthkit.autopsy.communications.relationships.ContactDetailsPane(); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); @@ -180,7 +181,7 @@ public final class ContactsViewer extends JPanel implements RelationshipsViewer, // Variables declaration - do not modify//GEN-BEGIN:variables - private org.sleuthkit.autopsy.communications.ContactDetailsPane contactPane; + private org.sleuthkit.autopsy.communications.relationships.ContactDetailsPane contactPane; private org.openide.explorer.view.OutlineView outlineView; // End of variables declaration//GEN-END:variables } diff --git a/Core/src/org/sleuthkit/autopsy/communications/CorrelationCaseChildNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/CorrelationCaseChildNodeFactory.java similarity index 99% rename from Core/src/org/sleuthkit/autopsy/communications/CorrelationCaseChildNodeFactory.java rename to Core/src/org/sleuthkit/autopsy/communications/relationships/CorrelationCaseChildNodeFactory.java index 539bc0e028..94a3978814 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/CorrelationCaseChildNodeFactory.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/CorrelationCaseChildNodeFactory.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.communications; +package org.sleuthkit.autopsy.communications.relationships; import java.util.HashMap; import java.util.List; diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessageDataContent.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/MessageDataContent.java similarity index 96% rename from Core/src/org/sleuthkit/autopsy/communications/MessageDataContent.java rename to Core/src/org/sleuthkit/autopsy/communications/relationships/MessageDataContent.java index 33df9bd3d9..108ce7dc20 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/MessageDataContent.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/MessageDataContent.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.communications; +package org.sleuthkit.autopsy.communications.relationships; import java.beans.PropertyChangeEvent; import org.openide.explorer.ExplorerManager; diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/MessageNode.java similarity index 98% rename from Core/src/org/sleuthkit/autopsy/communications/MessageNode.java rename to Core/src/org/sleuthkit/autopsy/communications/relationships/MessageNode.java index 1b43441a0a..da8e11c7ed 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/MessageNode.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.communications; +package org.sleuthkit.autopsy.communications.relationships; import java.util.List; import java.util.TimeZone; @@ -43,6 +43,7 @@ import static org.sleuthkit.datamodel.BlackboardAttribute.TSK_BLACKBOARD_ATTRIBU import org.sleuthkit.datamodel.Tag; import org.sleuthkit.datamodel.TimeUtilities; import org.sleuthkit.datamodel.TskCoreException; +import org.sleuthkit.autopsy.communications.Utils; /** * Wraps a BlackboardArtifact as an AbstractNode for use in an OutlookView diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesChildNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/MessagesChildNodeFactory.java similarity index 98% rename from Core/src/org/sleuthkit/autopsy/communications/MessagesChildNodeFactory.java rename to Core/src/org/sleuthkit/autopsy/communications/relationships/MessagesChildNodeFactory.java index 38d5cfa8f0..bb986c3920 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessagesChildNodeFactory.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/MessagesChildNodeFactory.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.communications; +package org.sleuthkit.autopsy.communications.relationships; import java.util.List; import java.util.Set; diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form b/Core/src/org/sleuthkit/autopsy/communications/relationships/MessagesViewer.form similarity index 100% rename from Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.form rename to Core/src/org/sleuthkit/autopsy/communications/relationships/MessagesViewer.form diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/MessagesViewer.java similarity index 98% rename from Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java rename to Core/src/org/sleuthkit/autopsy/communications/relationships/MessagesViewer.java index 3d8ce847c1..bbcf14e2d4 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessagesViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/MessagesViewer.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.communications; +package org.sleuthkit.autopsy.communications.relationships; import java.awt.Component; import java.awt.KeyboardFocusManager; @@ -35,6 +35,7 @@ import org.openide.nodes.Node; import org.openide.util.Lookup; import org.openide.util.NbBundle.Messages; import org.openide.util.lookup.ServiceProvider; +import org.sleuthkit.autopsy.communications.ModifiableProxyLookup; import org.sleuthkit.autopsy.corecomponents.TableFilterNode; import org.sleuthkit.autopsy.directorytree.DataResultFilterNode; diff --git a/Core/src/org/sleuthkit/autopsy/communications/OutlineViewPanel.form b/Core/src/org/sleuthkit/autopsy/communications/relationships/OutlineViewPanel.form similarity index 94% rename from Core/src/org/sleuthkit/autopsy/communications/OutlineViewPanel.form rename to Core/src/org/sleuthkit/autopsy/communications/relationships/OutlineViewPanel.form index 584e1e221d..5efb16c2b1 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/OutlineViewPanel.form +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/OutlineViewPanel.form @@ -44,7 +44,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/communications/OutlineViewPanel.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/OutlineViewPanel.java similarity index 98% rename from Core/src/org/sleuthkit/autopsy/communications/OutlineViewPanel.java rename to Core/src/org/sleuthkit/autopsy/communications/relationships/OutlineViewPanel.java index 183ebdc0d9..c84c7ae0a7 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/OutlineViewPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/OutlineViewPanel.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.communications; +package org.sleuthkit.autopsy.communications.relationships; import java.awt.CardLayout; import org.openide.explorer.ExplorerManager; diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form b/Core/src/org/sleuthkit/autopsy/communications/relationships/RelationshipBrowser.form similarity index 100% rename from Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.form rename to Core/src/org/sleuthkit/autopsy/communications/relationships/RelationshipBrowser.form diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/RelationshipBrowser.java similarity index 95% rename from Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java rename to Core/src/org/sleuthkit/autopsy/communications/relationships/RelationshipBrowser.java index aaeafa7c3a..1cdaee8692 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/RelationshipBrowser.java @@ -16,17 +16,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.communications; +package org.sleuthkit.autopsy.communications.relationships; import java.awt.Component; import javax.swing.JPanel; import org.openide.util.Lookup; +import org.sleuthkit.autopsy.communications.ModifiableProxyLookup; /** * Displays the Relationship information for the currently selected accounts. * */ -final class RelationshipBrowser extends JPanel implements Lookup.Provider { +public final class RelationshipBrowser extends JPanel implements Lookup.Provider { private SelectionInfo currentSelection; diff --git a/Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/RelationshipsViewer.java similarity index 96% rename from Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java rename to Core/src/org/sleuthkit/autopsy/communications/relationships/RelationshipsViewer.java index ed2accee07..25f5c83701 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/RelationshipsViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/RelationshipsViewer.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.communications; +package org.sleuthkit.autopsy.communications.relationships; import javax.swing.JPanel; import org.openide.util.Lookup; diff --git a/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/SelectionInfo.java similarity index 96% rename from Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java rename to Core/src/org/sleuthkit/autopsy/communications/relationships/SelectionInfo.java index a67b442f51..16c92b3b94 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/SelectionInfo.java @@ -16,13 +16,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.communications; +package org.sleuthkit.autopsy.communications.relationships; import java.util.HashSet; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import org.openide.util.Exceptions; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.datamodel.Account; @@ -54,7 +53,7 @@ public final class SelectionInfo { * @param accountDeviceInstances Selected accountDecivedInstances * @param communicationFilter Currently selected communications filters */ - SelectionInfo(Set accountDeviceInstances, CommunicationsFilter communicationFilter) { + public SelectionInfo(Set accountDeviceInstances, CommunicationsFilter communicationFilter) { this.accountDeviceInstances = accountDeviceInstances; this.communicationFilter = communicationFilter; diff --git a/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.form b/Core/src/org/sleuthkit/autopsy/communications/relationships/SummaryViewer.form similarity index 83% rename from Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.form rename to Core/src/org/sleuthkit/autopsy/communications/relationships/SummaryViewer.form index c9c708d871..af02a7dee7 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.form +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/SummaryViewer.form @@ -47,7 +47,7 @@ - + @@ -114,7 +114,7 @@ - + @@ -128,56 +128,56 @@ - + - + - + - + - + - + - + - + @@ -188,7 +188,7 @@ - + @@ -202,7 +202,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/SummaryViewer.java similarity index 97% rename from Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.java rename to Core/src/org/sleuthkit/autopsy/communications/relationships/SummaryViewer.java index 659dd1aac4..5641fad521 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/SummaryViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/SummaryViewer.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.communications; +package org.sleuthkit.autopsy.communications.relationships; import java.util.Set; import javax.swing.JPanel; @@ -28,7 +28,7 @@ import org.openide.nodes.Children; import org.openide.util.Lookup; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; -import org.sleuthkit.autopsy.communications.SelectionInfo.SelectionSummary; +import org.sleuthkit.autopsy.communications.relationships.SelectionInfo.SelectionSummary; import org.sleuthkit.datamodel.Account; /** @@ -68,7 +68,7 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi outline.setRootVisible(false); ((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.SummaryViewer_CaseRefNameColumn_Title()); - + clearControls(); } @@ -91,7 +91,7 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi caseReferencesPanel.showOutlineView(); } - // Request is that the SummaryViewer only show information if one + // Request is that the SummaryViewer only show information if one // account is selected if (info.getAccounts().size() != 1) { setEnabled(false); @@ -120,7 +120,7 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi /** * Sets whether or not the text fields are enabled. - * + * * @param enabled true if this component should be enabled, false otherwise */ @Override @@ -190,8 +190,8 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi callLogsDataLabel = new javax.swing.JLabel(); contactsDataLabel = new javax.swing.JLabel(); emailDataLabel = new javax.swing.JLabel(); - fileReferencesPanel = new org.sleuthkit.autopsy.communications.OutlineViewPanel(); - caseReferencesPanel = new org.sleuthkit.autopsy.communications.OutlineViewPanel(); + fileReferencesPanel = new org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel(); + caseReferencesPanel = new org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel(); countsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.countsPanel.border.title"))); // NOI18N @@ -299,13 +299,13 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi private javax.swing.JLabel attachmentsLabel; private javax.swing.JLabel callLogsDataLabel; private javax.swing.JLabel callLogsLabel; - private org.sleuthkit.autopsy.communications.OutlineViewPanel caseReferencesPanel; + private org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel caseReferencesPanel; private javax.swing.JLabel contactsDataLabel; private javax.swing.JLabel contactsLabel; private javax.swing.JPanel countsPanel; private javax.swing.JLabel emailDataLabel; private javax.swing.JLabel emailLabel; - private org.sleuthkit.autopsy.communications.OutlineViewPanel fileReferencesPanel; + private org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel fileReferencesPanel; private javax.swing.JLabel messagesDataLabel; private javax.swing.JLabel messagesLabel; // End of variables declaration//GEN-END:variables diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/ThumbnailChildren.java similarity index 98% rename from Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java rename to Core/src/org/sleuthkit/autopsy/communications/relationships/ThumbnailChildren.java index 30a95f35aa..0e89b34d79 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailChildren.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/ThumbnailChildren.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.communications; +package org.sleuthkit.autopsy.communications.relationships; import java.util.Arrays; import java.util.HashSet; diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form b/Core/src/org/sleuthkit/autopsy/communications/relationships/ThumbnailViewer.form similarity index 100% rename from Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.form rename to Core/src/org/sleuthkit/autopsy/communications/relationships/ThumbnailViewer.form diff --git a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/ThumbnailViewer.java similarity index 98% rename from Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java rename to Core/src/org/sleuthkit/autopsy/communications/relationships/ThumbnailViewer.java index a4dea6493f..763b6d394d 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ThumbnailViewer.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/ThumbnailViewer.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.communications; +package org.sleuthkit.autopsy.communications.relationships; import java.awt.Component; import java.awt.KeyboardFocusManager; @@ -35,6 +35,7 @@ import org.openide.util.Lookup; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.communications.ModifiableProxyLookup; import org.sleuthkit.autopsy.corecomponents.TableFilterNode; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; From 97d53efbdc51dac5c1ab9513bfb57f8995715b8c Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 7 May 2019 15:03:36 -0400 Subject: [PATCH 32/32] Updated based on review comments --- .../AccountSourceContentChildNodeFactory.java | 19 ++++++++++++++++--- .../autopsy/communications/ContactNode.java | 5 +++-- .../CorrelationCaseChildNodeFactory.java | 2 +- .../autopsy/communications/MessageNode.java | 3 +-- .../autopsy/communications/SelectionInfo.java | 1 - 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/AccountSourceContentChildNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/AccountSourceContentChildNodeFactory.java index 0b91987a0b..37e1eb633c 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/AccountSourceContentChildNodeFactory.java +++ b/Core/src/org/sleuthkit/autopsy/communications/AccountSourceContentChildNodeFactory.java @@ -1,7 +1,20 @@ /* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.sleuthkit.autopsy.communications; diff --git a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java index 1f1a54038b..67f8239463 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/ContactNode.java @@ -65,13 +65,14 @@ final class ContactNode extends BlackboardArtifactNode { @Override protected Sheet createSheet() { + Sheet sheet = super.createSheet(); + final BlackboardArtifact artifact = getArtifact(); BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID()); if (fromID != TSK_CONTACT) { - return super.createSheet(); + return sheet; } - Sheet sheet = new Sheet(); Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES); if (sheetSet == null) { sheetSet = Sheet.createPropertiesSet(); diff --git a/Core/src/org/sleuthkit/autopsy/communications/CorrelationCaseChildNodeFactory.java b/Core/src/org/sleuthkit/autopsy/communications/CorrelationCaseChildNodeFactory.java index 539bc0e028..32ab3b511c 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/CorrelationCaseChildNodeFactory.java +++ b/Core/src/org/sleuthkit/autopsy/communications/CorrelationCaseChildNodeFactory.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2018 Basis Technology Corp. + * Copyright 2019 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java index 1b43441a0a..559ff5b7cd 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/MessageNode.java @@ -70,8 +70,7 @@ final class MessageNode extends BlackboardArtifactNode { @Override protected Sheet createSheet() { - super.createSheet(); - Sheet sheet = new Sheet(); + Sheet sheet = super.createSheet(); List tags = getAllTagsFromDatabase(); Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES); if (sheetSet == null) { diff --git a/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java b/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java index a67b442f51..b6c475f340 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java +++ b/Core/src/org/sleuthkit/autopsy/communications/SelectionInfo.java @@ -22,7 +22,6 @@ import java.util.HashSet; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import org.openide.util.Exceptions; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.datamodel.Account;