diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CentralRepoDbUtil.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CentralRepoDbUtil.java index 6ba23b65b5..5105aed2e9 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CentralRepoDbUtil.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CentralRepoDbUtil.java @@ -262,9 +262,7 @@ public class CentralRepoDbUtil { * used */ public static void setUseCentralRepo(boolean centralRepoCheckBoxIsSelected) { - if (!centralRepoCheckBoxIsSelected) { - closePersonasTopComponent(); - } + closePersonasTopComponent(); ModuleSettings.setConfigSetting(CENTRAL_REPO_NAME, CENTRAL_REPO_USE_KEY, Boolean.toString(centralRepoCheckBoxIsSelected)); } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/RdbmsCentralRepo.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/RdbmsCentralRepo.java index 2a68f1e1d9..b48797e3fc 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/RdbmsCentralRepo.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/RdbmsCentralRepo.java @@ -1085,8 +1085,19 @@ abstract class RdbmsCentralRepo implements CentralRepository { // Get the account fom the accounts table String normalizedAccountID = CentralRepoAccount.normalizeAccountIdentifier(crAccountType, accountUniqueID); - String insertSQL = "INSERT INTO accounts (account_type_id, account_unique_identifier) " - + "VALUES (?, ?) " + getConflictClause(); + // insert the account. If there is a conflict, ignore it. + String insertSQL; + switch (CentralRepoDbManager.getSavedDbChoice().getDbPlatform()) { + case POSTGRESQL: + insertSQL = "INSERT INTO accounts (account_type_id, account_unique_identifier) VALUES (?, ?) " + getConflictClause(); //NON-NLS + break; + case SQLITE: + insertSQL = "INSERT OR IGNORE INTO accounts (account_type_id, account_unique_identifier) VALUES (?, ?) "; //NON-NLS + break; + default: + throw new CentralRepoException(String.format("Cannot add account to currently selected CR database platform %s", CentralRepoDbManager.getSavedDbChoice().getDbPlatform())); //NON-NLS + } + try (Connection connection = connect(); PreparedStatement preparedStatement = connection.prepareStatement(insertSQL);) { diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java index 675e7c8807..f30c402513 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java @@ -43,6 +43,7 @@ import javax.swing.event.DocumentListener; import javax.swing.filechooser.FileFilter; import org.openide.util.NbBundle; import org.openide.util.NbBundle.Messages; +import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoDbChoice; import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoDbManager; @@ -660,6 +661,8 @@ public class EamDbSettingsDialog extends JDialog { * found. */ private static boolean testStatusAndCreate(Component parent, CentralRepoDbManager manager, EamDbSettingsDialog dialog) { + closePersonasTopComponent(); + parent.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); manager.testStatus(); @@ -690,6 +693,21 @@ public class EamDbSettingsDialog extends JDialog { parent.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); return true; } + + + + /** + * Closes Personas top component if it exists. + */ + private static void closePersonasTopComponent() { + SwingUtilities.invokeLater(() -> { + TopComponent personasWindow = WindowManager.getDefault().findTopComponent("PersonasTopComponent"); + if (personasWindow != null && personasWindow.isOpened()) { + personasWindow.close(); + } + }); + } + /** * This method returns if changes to the central repository configuration diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonasTopComponent.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonasTopComponent.java index d38b379078..e051529f11 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonasTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonasTopComponent.java @@ -20,6 +20,8 @@ package org.sleuthkit.autopsy.centralrepository.persona; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -60,28 +62,6 @@ public final class PersonasTopComponent extends TopComponent { private List currentResults = null; private Persona selectedPersona = null; - /** - * Listens for when this component will be rendered and executes a search to - * update gui when it is displayed. - */ - private final AncestorListener onAddListener = new AncestorListener() { - @Override - public void ancestorAdded(AncestorEvent event) { - resetSearchControls(); - setKeywordSearchEnabled(false, true); - } - - @Override - public void ancestorRemoved(AncestorEvent event) { - //Empty - } - - @Override - public void ancestorMoved(AncestorEvent event) { - //Empty - } - }; - @Messages({ "PersonasTopComponent_Name=Personas", "PersonasTopComponent_delete_exception_Title=Delete failure", @@ -165,7 +145,17 @@ public final class PersonasTopComponent extends TopComponent { } }); - addAncestorListener(onAddListener); + /** + * Listens for when this component will be rendered and executes a + * search to update gui when it is displayed. + */ + addComponentListener(new ComponentAdapter() { + @Override + public void componentShown(ComponentEvent e) { + resetSearchControls(); + setKeywordSearchEnabled(false, true); + } + }); } /** @@ -276,7 +266,7 @@ public final class PersonasTopComponent extends TopComponent { } @Messages({ - "PersonasTopComponent_search_exception_Title=Search failure", + "PersonasTopComponent_search_exception_Title=There was a failure during the search. Try opening a case to fully initialize the central repository database.", "PersonasTopComponent_search_exception_msg=Failed to search personas.", "PersonasTopComponent_noCR_msg=Central Repository is not enabled.",}) private void executeSearch() { diff --git a/Core/src/org/sleuthkit/autopsy/communications/relationships/MessageNode.java b/Core/src/org/sleuthkit/autopsy/communications/relationships/MessageNode.java index dece917507..744408b30d 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/relationships/MessageNode.java +++ b/Core/src/org/sleuthkit/autopsy/communications/relationships/MessageNode.java @@ -18,7 +18,9 @@ */ package org.sleuthkit.autopsy.communications.relationships; +import java.awt.event.ActionEvent; import java.util.logging.Level; +import javax.swing.AbstractAction; import javax.swing.Action; import org.apache.commons.lang3.StringUtils; import org.openide.nodes.Sheet; @@ -55,6 +57,8 @@ class MessageNode extends BlackboardArtifactNode { private final Action preferredAction; + private final Action defaultNoopAction = new DefaultMessageAction(); + MessageNode(BlackboardArtifact artifact, String threadID, Action preferredAction) { super(artifact); @@ -148,7 +152,7 @@ class MessageNode extends BlackboardArtifactNode { @Override public Action getPreferredAction() { - return preferredAction; + return preferredAction != null ? preferredAction : defaultNoopAction; } private int getAttachmentsCount() throws TskCoreException { @@ -171,4 +175,17 @@ class MessageNode extends BlackboardArtifactNode { return attachmentsCount; } + + /** + * A no op action to override the default action of BlackboardArtifactNode + */ + private class DefaultMessageAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + // Do Nothing. + } + } } diff --git a/NEWS.txt b/NEWS.txt index 068408b413..aa3418c5e0 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -1,3 +1,59 @@ +---------------- VERSION 4.16.0 -------------- +Ingest: +- Added streaming ingest capability for disk images that allow files to be analyzed as soon as they are added to the database. +- Changed backend code so that disk image-based files are added by Java code instead of C/C++ code. + +Ingest Modules: +- Include Interesting File set rules for cloud storage, encryption, cryptocurrency and privacy programs. +- Updated PhotoRec 7.1 and include 64-bit version +- Updated RegRipper in Recent Activity to 2.8 +- Create artifacts for Prefetch, Background Activity Monitor, and System Resource Usage. +- Support MBOX files greater than 2GB +- Document metadata is saved as explicit artifacts and added to the timeline. +- New “no change” hashset type that does not change status of file. + + +Central Repository / Personas: +- Accounts in the Central Repository can be grouped together and associated with a digital persona +- All accounts are now stored in the Central Repository to support correlation and persona creation. + +Content viewers: +- Created artifact-specific viewers in the Results viewer for contact book and call log. +- Moved Message viewer to a Results sub-viewer and expanded to show accounts. +- Added Application sub-viewer for PDF files based on IcePDF. +- Annotation viewer now includes comments from hash set hit and interesting file set hit artifacts + +Geolocation Viewer +- Different data types now are displayed using different colors +- Track points in a track are now displayed as small, connected circles instead of full pins. +- Filter panel shows only data sources with geo location data. +- Geolocation artifact points can be tagged and commented upon + +File Discovery +- Changed UI to have more of a search flow and content viewer is hidden until an item is selected. + +Reports +- Can be generated for a single data source instead of the entire case. +- CASE / UCO report module now includes artifacts in addition to files. +- Added backend concept of Tag Sets to support Project Vic categories from different countries. + +Performance: +- Add throttling of UI refreshes to ensure data is quickly displayed and the tree does not get backed up with requests. +- Improved efficiency of adding a data source with many orphan files +- Improved efficiency of loading file systems +- Jython interpreter is preloaded at application startup + +Misc bug fixes and improvements +- Fixed bug from last release where hex content viewer text was no longer fixed width +- Altered locking to allow multiple data sources to be added at once more smoothly and to support batch inserts of file data +- Central repository comments will no longer store tag descriptions +- Account type nodes in the Accounts tree show counts +- Full time stamps displayed for messages in ingest inbox +- More detailed status during file exports +- Improved efficiency of adding timeline events +- Fixed bug with CVT most recent filter +- Improved documentation and support for running on Linux/macOS + ---------------- VERSION 4.15.0 -------------- New UI Features: - Added Document view to File Discovery.