From daf0077d274e26928e6385b9dc07a773a7b4590f Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 19 Sep 2017 18:04:02 -0400 Subject: [PATCH 01/18] 3037 Minimum size for indexed text area set larger than control area --- .../autopsy/keywordsearch/ExtractedContentPanel.form | 4 ++-- .../autopsy/keywordsearch/ExtractedContentPanel.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.form index 14da920189..5d6181e832 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.form +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.form @@ -27,7 +27,7 @@ - + @@ -78,7 +78,7 @@ - + diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java index d63163ff61..904dba9ab8 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java @@ -173,7 +173,7 @@ class ExtractedContentPanel extends javax.swing.JPanel { selectAllMenuItem.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.selectAllMenuItem.text")); // NOI18N rightClickMenu.add(selectAllMenuItem); - setPreferredSize(new java.awt.Dimension(50, 10)); + setPreferredSize(new java.awt.Dimension(640, 58)); jScrollPane1.setBackground(new java.awt.Color(255, 255, 255)); jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); @@ -303,7 +303,7 @@ class ExtractedContentPanel extends javax.swing.JPanel { .addComponent(pageNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 56, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(sourceComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) From d88ddb9cd3b1a6bcb0450823c3013d3999e031f4 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 20 Sep 2017 10:25:10 -0400 Subject: [PATCH 02/18] 3067 changed type of known_status in CR from string to integer --- .../autopsy/centralrepository/datamodel/AbstractSqlEamDb.java | 4 ++-- .../centralrepository/datamodel/PostgresEamDbSettings.java | 4 ++-- .../centralrepository/datamodel/SqliteEamDbSettings.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index 1f5af1104c..fb9662a0ca 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -1948,7 +1948,7 @@ public abstract class AbstractSqlEamDb implements EamDb { new EamDataSource(resultSet.getString("device_id"), resultSet.getString("name")), resultSet.getString("file_path"), resultSet.getString("comment"), - TskData.FileKnown.valueOf(resultSet.getString("known_status")), + TskData.FileKnown.valueOf(resultSet.getByte("known_status")), EamArtifactInstance.GlobalStatus.LOCAL ); @@ -1996,7 +1996,7 @@ public abstract class AbstractSqlEamDb implements EamDb { resultSet.getInt("id"), resultSet.getInt("reference_set_id"), resultSet.getString("value"), - TskData.FileKnown.valueOf(resultSet.getString("known_status")), + TskData.FileKnown.valueOf(resultSet.getByte("known_status")), resultSet.getString("comment") ); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java index e35ba6b026..81a1aadd5e 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java @@ -380,7 +380,7 @@ public final class PostgresEamDbSettings { createReferenceTypesTableTemplate.append("id SERIAL PRIMARY KEY,"); createReferenceTypesTableTemplate.append("reference_set_id integer,"); createReferenceTypesTableTemplate.append("value text NOT NULL,"); - createReferenceTypesTableTemplate.append("known_status text NOT NULL,"); + createReferenceTypesTableTemplate.append("known_status integer NOT NULL,"); createReferenceTypesTableTemplate.append("comment text,"); createReferenceTypesTableTemplate.append("CONSTRAINT %s_multi_unique UNIQUE (reference_set_id, value),"); createReferenceTypesTableTemplate.append("foreign key (reference_set_id) references reference_sets(id) ON UPDATE SET NULL ON DELETE SET NULL"); @@ -408,7 +408,7 @@ public final class PostgresEamDbSettings { createArtifactInstancesTableTemplate.append("data_source_id integer,"); createArtifactInstancesTableTemplate.append("value text NOT NULL,"); createArtifactInstancesTableTemplate.append("file_path text NOT NULL,"); - createArtifactInstancesTableTemplate.append("known_status text NOT NULL,"); + createArtifactInstancesTableTemplate.append("known_status integer NOT NULL,"); createArtifactInstancesTableTemplate.append("comment text,"); createArtifactInstancesTableTemplate.append("CONSTRAINT %s_multi_unique_ UNIQUE (case_id, data_source_id, value, file_path),"); createArtifactInstancesTableTemplate.append("foreign key (case_id) references cases(id) ON UPDATE SET NULL ON DELETE SET NULL,"); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java index bfff0dc778..ca3dec0c33 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java @@ -322,7 +322,7 @@ public final class SqliteEamDbSettings { createReferenceTypesTableTemplate.append("id integer primary key autoincrement NOT NULL,"); createReferenceTypesTableTemplate.append("reference_set_id integer,"); createReferenceTypesTableTemplate.append("value text NOT NULL,"); - createReferenceTypesTableTemplate.append("known_status text NOT NULL,"); + createReferenceTypesTableTemplate.append("known_status integer NOT NULL,"); createReferenceTypesTableTemplate.append("comment text,"); createReferenceTypesTableTemplate.append("CONSTRAINT %s_multi_unique UNIQUE(reference_set_id, value) ON CONFLICT IGNORE,"); createReferenceTypesTableTemplate.append("foreign key (reference_set_id) references reference_sets(id) ON UPDATE SET NULL ON DELETE SET NULL"); @@ -350,7 +350,7 @@ public final class SqliteEamDbSettings { createArtifactInstancesTableTemplate.append("data_source_id integer,"); createArtifactInstancesTableTemplate.append("value text NOT NULL,"); createArtifactInstancesTableTemplate.append("file_path text NOT NULL,"); - createArtifactInstancesTableTemplate.append("known_status text NOT NULL,"); + createArtifactInstancesTableTemplate.append("known_status integer NOT NULL,"); createArtifactInstancesTableTemplate.append("comment text,"); createArtifactInstancesTableTemplate.append("CONSTRAINT %s_multi_unique UNIQUE(case_id, data_source_id, value, file_path) ON CONFLICT IGNORE,"); createArtifactInstancesTableTemplate.append("foreign key (case_id) references cases(id) ON UPDATE SET NULL ON DELETE SET NULL,"); From ff2f878572ba7180051c011be00d434289c71b43 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 20 Sep 2017 13:34:07 -0400 Subject: [PATCH 03/18] 3067 additional changes to support known_status being integer for postgres --- .../datamodel/AbstractSqlEamDb.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index fb9662a0ca..39c2ec2eb6 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -570,7 +570,7 @@ public abstract class AbstractSqlEamDb implements EamDb { preparedStatement.setString(2, eamInstance.getEamDataSource().getDeviceID()); preparedStatement.setString(3, eamArtifact.getCorrelationValue()); preparedStatement.setString(4, eamInstance.getFilePath()); - preparedStatement.setString(5, eamInstance.getKnownStatus().name()); + preparedStatement.setByte(5, eamInstance.getKnownStatus().getFileKnownValue()); if ("".equals(eamInstance.getComment())) { preparedStatement.setNull(6, Types.INTEGER); } else { @@ -957,7 +957,7 @@ public abstract class AbstractSqlEamDb implements EamDb { bulkPs.setString(2, eamInstance.getEamDataSource().getDeviceID()); bulkPs.setString(3, eamArtifact.getCorrelationValue()); bulkPs.setString(4, eamInstance.getFilePath()); - bulkPs.setString(5, eamInstance.getKnownStatus().name()); + bulkPs.setByte(5, eamInstance.getKnownStatus().getFileKnownValue()); if ("".equals(eamInstance.getComment())) { bulkPs.setNull(6, Types.INTEGER); } else { @@ -1109,7 +1109,7 @@ public abstract class AbstractSqlEamDb implements EamDb { int instance_id = resultSet.getInt("id"); preparedUpdate = conn.prepareStatement(sqlUpdate.toString()); - preparedUpdate.setString(1, knownStatus.name()); + preparedUpdate.setByte(1, knownStatus.getFileKnownValue()); // NOTE: if the user tags the same instance as BAD multiple times, // the comment from the most recent tagging is the one that will // prevail in the DB. @@ -1184,7 +1184,7 @@ public abstract class AbstractSqlEamDb implements EamDb { try { preparedStatement = conn.prepareStatement(sql.toString()); preparedStatement.setString(1, value); - preparedStatement.setString(2, TskData.FileKnown.BAD.name()); + preparedStatement.setByte(2, TskData.FileKnown.BAD.getFileKnownValue()); resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { artifactInstance = getEamArtifactInstanceFromResultSet(resultSet); @@ -1226,7 +1226,7 @@ public abstract class AbstractSqlEamDb implements EamDb { try { preparedStatement = conn.prepareStatement(sql.toString()); preparedStatement.setString(1, value); - preparedStatement.setString(2, TskData.FileKnown.BAD.name()); + preparedStatement.setByte(2, TskData.FileKnown.BAD.getFileKnownValue()); resultSet = preparedStatement.executeQuery(); resultSet.next(); badInstances = resultSet.getLong(1); @@ -1277,7 +1277,7 @@ public abstract class AbstractSqlEamDb implements EamDb { try { preparedStatement = conn.prepareStatement(sql.toString()); preparedStatement.setString(1, value); - preparedStatement.setString(2, TskData.FileKnown.BAD.name()); + preparedStatement.setByte(2, TskData.FileKnown.BAD.getFileKnownValue()); resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { caseNames.add(resultSet.getString("case_name")); @@ -1319,7 +1319,7 @@ public abstract class AbstractSqlEamDb implements EamDb { try { preparedStatement = conn.prepareStatement(String.format(sql, EamDbUtil.correlationTypeToReferenceTableName(aType))); preparedStatement.setString(1, value); - preparedStatement.setString(2, TskData.FileKnown.BAD.name()); + preparedStatement.setByte(2, TskData.FileKnown.BAD.getFileKnownValue()); resultSet = preparedStatement.executeQuery(); resultSet.next(); badInstances = resultSet.getLong(1); @@ -1532,7 +1532,7 @@ public abstract class AbstractSqlEamDb implements EamDb { preparedStatement = conn.prepareStatement(String.format(sql, EamDbUtil.correlationTypeToReferenceTableName(correlationType))); preparedStatement.setInt(1, eamGlobalFileInstance.getGlobalSetID()); preparedStatement.setString(2, eamGlobalFileInstance.getMD5Hash()); - preparedStatement.setString(3, eamGlobalFileInstance.getKnownStatus().name()); + preparedStatement.setByte(3, eamGlobalFileInstance.getKnownStatus().getFileKnownValue()); preparedStatement.setString(4, eamGlobalFileInstance.getComment()); preparedStatement.executeUpdate(); } catch (SQLException ex) { @@ -1565,7 +1565,7 @@ public abstract class AbstractSqlEamDb implements EamDb { for (EamGlobalFileInstance globalInstance : globalInstances) { bulkPs.setInt(1, globalInstance.getGlobalSetID()); bulkPs.setString(2, globalInstance.getMD5Hash()); - bulkPs.setString(3, globalInstance.getKnownStatus().name()); + bulkPs.setByte(3, globalInstance.getKnownStatus().getFileKnownValue()); bulkPs.setString(4, globalInstance.getComment()); bulkPs.addBatch(); } From d515dc81acce4fa7b31f44685fc5d6a7be6d0c8c Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 20 Sep 2017 15:29:44 -0400 Subject: [PATCH 04/18] 3037 fixed Indexed Text content viewer to be wide enough for vert scrollbar --- .../sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.form | 2 +- .../sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.form index 5d6181e832..102d8a35cf 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.form +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.form @@ -27,7 +27,7 @@ - + diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java index 904dba9ab8..01647f2a46 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java @@ -173,7 +173,7 @@ class ExtractedContentPanel extends javax.swing.JPanel { selectAllMenuItem.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.selectAllMenuItem.text")); // NOI18N rightClickMenu.add(selectAllMenuItem); - setPreferredSize(new java.awt.Dimension(640, 58)); + setPreferredSize(new java.awt.Dimension(717, 58)); jScrollPane1.setBackground(new java.awt.Color(255, 255, 255)); jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); From 43659e2cc1f4a3ce67ef54945ddff0aa4e715f65 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 21 Sep 2017 13:34:12 -0400 Subject: [PATCH 05/18] Move management of snapshot synch into auto ingest monitor --- .../autoingest/AutoIngestDashboard.java | 35 ++----------------- .../autoingest/AutoIngestMonitor.java | 14 ++++---- 2 files changed, 8 insertions(+), 41 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index 5b6c1da4b2..e6b9a474e0 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -18,7 +18,6 @@ */ package org.sleuthkit.autopsy.experimental.autoingest; -import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.awt.Cursor; import java.awt.EventQueue; import java.nio.file.Path; @@ -45,8 +44,6 @@ import org.sleuthkit.autopsy.core.ServicesMonitor; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestMonitor.JobsSnapshot; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; /** * A dashboard for monitoring an automated ingest cluster. @@ -75,13 +72,11 @@ public final class AutoIngestDashboard extends JPanel implements Observer { private static final int COMPLETED_TIME_COL_MIN_WIDTH = 30; private static final int COMPLETED_TIME_COL_MAX_WIDTH = 2000; private static final int COMPLETED_TIME_COL_PREFERRED_WIDTH = 280; - private static final String UPDATE_TASKS_THREAD_NAME = "AID-update-tasks-%d"; private static final Logger logger = Logger.getLogger(AutoIngestDashboard.class.getName()); private final DefaultTableModel pendingTableModel; private final DefaultTableModel runningTableModel; private final DefaultTableModel completedTableModel; private AutoIngestMonitor autoIngestMonitor; - private ExecutorService updateExecutor; /** * Creates a dashboard for monitoring an automated ingest cluster. @@ -427,20 +422,11 @@ public final class AutoIngestDashboard extends JPanel implements Observer { autoIngestMonitor = new AutoIngestMonitor(); autoIngestMonitor.addObserver(this); autoIngestMonitor.startUp(); - updateExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(UPDATE_TASKS_THREAD_NAME).build()); - updateExecutor.submit(new UpdateJobsSnapshotTask()); } @Override public void update(Observable observable, Object arg) { - /* - * By creating a task to get the latest jobs snapshot, the possibility - * of queuing a refresh task for the EDT with snaphot rendered stale by - * the handling of a user prioritization action, etc. on the EDT is - * avoided. This is why the snapshot pushed ny the auto ingest jobs - * monitor is ignored. - */ - updateExecutor.submit(new UpdateJobsSnapshotTask()); + EventQueue.invokeLater(new RefreshComponentsTask((JobsSnapshot) arg)); } /** @@ -545,7 +531,7 @@ public final class AutoIngestDashboard extends JPanel implements Observer { } /* - * The enum is used in conjunction with the DefaultTableModel class to + * This enum is used in conjunction with the DefaultTableModel class to * provide table models for the JTables used to display a view of the * pending jobs queue, running jobs list, and completed jobs list for an * auto ingest cluster. The enum allows the columns of the table model to be @@ -592,23 +578,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer { }; }; - /** - * A task that gets the latest auto ingest jobs snapshot from the autop - * ingest monitor and queues a components refresh task for execution in the - * EDT. - */ - private class UpdateJobsSnapshotTask implements Runnable { - - /** - * @inheritDoc - */ - @Override - public void run() { - JobsSnapshot jobsSnapshot = AutoIngestDashboard.this.autoIngestMonitor.getJobsSnapshot(); - EventQueue.invokeLater(new RefreshComponentsTask(jobsSnapshot)); - } - } - /** * A task that refreshes the UI components on this panel to reflect a * snapshot of the pending, running and completed auto ingest jobs lists of diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index 3fcc5648ba..0c0b3e3823 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -219,9 +219,8 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang * @return The refreshed snapshot. */ JobsSnapshot refreshJobsSnapshot() { - JobsSnapshot newJobsSnapshot = queryCoordinationService(); synchronized (jobsLock) { - jobsSnapshot = newJobsSnapshot; + jobsSnapshot = queryCoordinationService(); return jobsSnapshot; } } @@ -283,9 +282,9 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang * @param job The job to be prioritized. */ JobsSnapshot prioritizeJob(AutoIngestJob job) throws AutoIngestMonitorException { - int highestPriority = 0; - AutoIngestJob prioritizedJob = null; synchronized (jobsLock) { + int highestPriority = 0; + AutoIngestJob prioritizedJob = null; /* * Get the highest known priority and make sure the job is still in * the pending jobs queue. @@ -343,11 +342,10 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang @Override public void run() { if (!Thread.currentThread().isInterrupted()) { - JobsSnapshot newJobsSnapshot = queryCoordinationService(); synchronized (jobsLock) { - jobsSnapshot = newJobsSnapshot; + jobsSnapshot = queryCoordinationService(); setChanged(); - notifyObservers(null); + notifyObservers(jobsSnapshot); } } } @@ -471,7 +469,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang } } - + /** * Exception type thrown when there is an error completing an auto ingest * monitor operation. From 94fe2dfaf743f46f1efc56b67340f61e9dc77910 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Thu, 21 Sep 2017 13:47:28 -0400 Subject: [PATCH 06/18] Update hashDb docs/images for switch to "notable" --- docs/doxygen-user/hashdb_lookup.dox | 10 +++++----- .../images/central_repo_content_viewer.png | Bin 13020 -> 12948 bytes docs/doxygen-user/images/hash-lookup.PNG | Bin 48703 -> 48359 bytes .../images/nsrl_import_process.PNG | Bin 77366 -> 71547 bytes 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/doxygen-user/hashdb_lookup.dox b/docs/doxygen-user/hashdb_lookup.dox index 44b9174d2e..c0c080df72 100755 --- a/docs/doxygen-user/hashdb_lookup.dox +++ b/docs/doxygen-user/hashdb_lookup.dox @@ -3,31 +3,31 @@ What Does It Do ======== -The Hash Database Lookup Module calculates MD5 hash values for files and looks up hash values in a database to determine if the file is known bad, known (in general), or unknown. +The Hash Database Lookup Module calculates MD5 hash values for files and looks up hash values in a database to determine if the file is notable, known (in general), or unknown. Configuration ======= The Hash Database Management window is where you can set and update your hash database information. Hash databases are used to identify files that are 'known'. \li Known good files are those that can be safely ignored. This set of files frequently includes standard OS and application files. Ignoring such uninteresting-to-the-investigator files, can greatly reduce image analysis time. -\li Known bad (also called notable) files are those that should raise awareness. This set will vary depending on the type of investigation, but common examples include contraband images and malware. +\li Notable (or known bad) files are those that should raise awareness. This set will vary depending on the type of investigation, but common examples include contraband images and malware. \section notable_known_bad_hashsets Notable / Known Bad Hashsets -Autopsy allows for multiple known bad hash databases to be set. Autopsy supports the following formats: +Autopsy allows for multiple notable hash databases to be set. Autopsy supports the following formats: \li EnCase: An EnCase hashset file. \li MD5sum: Output from running the md5, md5sum, or md5deep program on a set of files. \li NSRL: The format of the NSRL database. \li HashKeeper: Hashset file conforming to the HashKeeper standard. \section adding_hashsets Adding Hashsets -Autopsy needs an index of the hashset to actualy use a hash database. It can create the index if you import only the hashset. When you select the database from within this window, it will tell you if the index needs to be created. Autopsy uses the hash database management system from The Sleuth Kit. You can manually create an index using the 'hfind' command line tool or you can use Autopsy. If you attempt proceed without indexing a database, Autopsy will offer to automatically produce an index for you. +Autopsy needs an index of the hashset to actually use a hash database. It can create the index if you import only the hashset. When you select the database from within this window, it will tell you if the index needs to be created. Autopsy uses the hash database management system from The Sleuth Kit. You can manually create an index using the 'hfind' command line tool or you can use Autopsy. If you attempt proceed without indexing a database, Autopsy will offer to automatically produce an index for you. You can also specify only the index file and not use the full hashset - the index file is sufficient to identify known files. This can save space. To do this, specify the .idx file from the Hash Database Management window.
\section using_hashsets Using Hashsets There is an \ref ingest_page "ingest module" that will hash the files and look them up in the hashsets. It will flag files that were in the notable hashset and those results will be shown in the Results tree of the \ref tree_viewer_page. Other ingest modules are able to use the known status of a file to decide if they should ignore the file or process it. -You can also see the results in the \ref how_to_open_file_search "File Search" window. There is an option to choose the 'known status'. From here, you can do a search to see all 'known bad' files. From here, you can also choose to ignore all 'known' files that were found in the NSRL. You can also see the status of the file in a column when the file is listed. +You can also see the results in the \ref how_to_open_file_search "File Search" window. There is an option to choose the 'known status'. From here, you can do a search to see all 'notable' files. From here, you can also choose to ignore all 'known' files that were found in the NSRL. You can also see the status of the file in a column when the file is listed.
NIST NSRL ------ diff --git a/docs/doxygen-user/images/central_repo_content_viewer.png b/docs/doxygen-user/images/central_repo_content_viewer.png index b5751f67cc1b54e5154c921521173923e85ef9cb..7f79baaf93adfa30bf48c4775f0ec1650eef1e9a 100644 GIT binary patch literal 12948 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 literal 13020 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 Hp8x*<5%z2V diff --git a/docs/doxygen-user/images/hash-lookup.PNG b/docs/doxygen-user/images/hash-lookup.PNG index 33f9ae804a77595c2ec484b024282272bbdcd1cd..5f195052a2586de046f99cfdbe21ad09eb7e4995 100755 GIT binary patch literal 48359 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 z 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%0DX@wewOw0y&n0lKO=#Z$hcHl*gc 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%0AEoiTY+MAS;CV$S9QP%$;Ws2WiVATs0 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 diff --git a/docs/doxygen-user/images/nsrl_import_process.PNG b/docs/doxygen-user/images/nsrl_import_process.PNG index 48f2fbde8352bfcfa21ed4127b20ecc157d566a4..87c132eb0d9d465a00b18a7286311b0a64a81feb 100755 GIT binary patch literal 71547 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

1~ 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 z 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 literal 77366 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 d2ks>AgmJaWRu$s{etYF9 Date: Thu, 21 Sep 2017 14:11:19 -0400 Subject: [PATCH 07/18] Improved user message for partial case deletion via AID 1.0 --- .../autopsy/experimental/autoingest/AutoIngestControlPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java index 40bd33f67f..891975223a 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java @@ -1570,7 +1570,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { JOptionPane.INFORMATION_MESSAGE); } else if (CaseDeletionResult.PARTIALLY_DELETED == result) { JOptionPane.showMessageDialog(this, - String.format("Could not delete case %s. See system log for details.", caseName), + String.format("Could not fully delete case %s. See system log for details.", caseName), org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.DeletionFailed"), JOptionPane.INFORMATION_MESSAGE); } From f7f071b11edc94035cad8e54d45130738f603a26 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Thu, 21 Sep 2017 14:44:48 -0400 Subject: [PATCH 08/18] Check for null return value from getEamArtifactFromContent --- .../eventlisteners/CaseEventListener.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java index 6a38a7e7b8..df26adc571 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java @@ -142,11 +142,15 @@ public class CaseEventListener implements PropertyChangeListener { final EamArtifact eamArtifact = EamArtifactUtil.getEamArtifactFromContent(af, knownStatus, comment); - // send update to Central Repository db - Runnable r = new KnownStatusChangeRunner(eamArtifact, knownStatus); - // TODO: send r into a thread pool instead - Thread t = new Thread(r); - t.start(); + if(eamArtifact != null){ + // send update to Central Repository db + Runnable r = new KnownStatusChangeRunner(eamArtifact, knownStatus); + // TODO: send r into a thread pool instead + Thread t = new Thread(r); + t.start(); + } else { + LOGGER.log(Level.SEVERE, "Error creating artifact instance for {0}", af.getName()); + } } // CONTENT_TAG_ADDED, CONTENT_TAG_DELETED break; From 50b57a98867f05238954babec0e8ee39947be8a4 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Thu, 21 Sep 2017 20:45:51 +0200 Subject: [PATCH 09/18] add the @RetainLocation("editor") annotation to DataResultTopComponent; some other minor cleanup --- .../DataResultTopComponent.java | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultTopComponent.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultTopComponent.java index 702c36e212..e511112536 100755 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultTopComponent.java @@ -21,18 +21,19 @@ package org.sleuthkit.autopsy.corecomponents; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import org.sleuthkit.autopsy.corecomponentinterfaces.DataResult; import java.util.logging.Level; import javax.swing.JComponent; import org.openide.explorer.ExplorerManager; import org.openide.explorer.ExplorerUtils; -import org.openide.util.NbBundle; -import org.openide.windows.TopComponent; import org.openide.nodes.Node; +import org.openide.util.NbBundle; import org.openide.windows.Mode; +import org.openide.windows.RetainLocation; +import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.actions.AddBookmarkTagAction; import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.corecomponentinterfaces.DataResult; import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer; import org.sleuthkit.autopsy.coreutils.Logger; @@ -55,11 +56,12 @@ import org.sleuthkit.autopsy.coreutils.Logger; * Implements DataResult interface by delegating to the encapsulated * DataResultPanel. */ +@RetainLocation("editor") public class DataResultTopComponent extends TopComponent implements DataResult, ExplorerManager.Provider { private static final Logger logger = Logger.getLogger(DataResultTopComponent.class.getName()); - private ExplorerManager explorerManager = new ExplorerManager(); - private DataResultPanel dataResultPanel; //embedded component with all the logic + private final ExplorerManager explorerManager = new ExplorerManager(); + private final DataResultPanel dataResultPanel; //embedded component with all the logic private boolean isMain; private String customModeName; @@ -86,7 +88,7 @@ public class DataResultTopComponent extends TopComponent implements DataResult, * * @param name unique name of the data result window, also * used as title - * @param customModeName custom mode to dock into + * @param mode custom mode to dock into * @param customContentViewer custom content viewer to send selection events * to */ @@ -255,16 +257,10 @@ public class DataResultTopComponent extends TopComponent implements DataResult, if (customModeName != null) { Mode mode = WindowManager.getDefault().findMode(customModeName); if (mode != null) { - StringBuilder message = new StringBuilder("Found custom mode, setting: "); //NON-NLS - message.append(customModeName); - logger.log(Level.INFO, message.toString()); + logger.log(Level.INFO, "Found custom mode, setting: {0}", customModeName);//NON-NLS mode.dockInto(this); - } else { - StringBuilder message = new StringBuilder("Could not find mode: "); //NON-NLS - message.append(customModeName); - message.append(", will dock into the default one"); //NON-NLS - logger.log(Level.WARNING, message.toString()); + logger.log(Level.WARNING, "Could not find mode: {0}, will dock into the default one", customModeName);//NON-NLS } } } From 2abb7557032f079c284a6ced62cecc23a24d2eff Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 21 Sep 2017 15:23:30 -0400 Subject: [PATCH 10/18] Add deep copying of auto ingest monitor snapshots --- .../autoingest/AutoIngestJob.java | 47 +++++++++++++++++++ .../autoingest/AutoIngestMonitor.java | 33 ++++++++++--- 2 files changed, 73 insertions(+), 7 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java index b43b00d3fd..d8a46c00d5 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java @@ -148,6 +148,37 @@ public final class AutoIngestJob implements Comparable, Serializa this.stageDetails = this.getProcessingStageDetails(); } + /** + * Copy constructs an automated ingest job. + * + * @param job The job to be copied. + */ + AutoIngestJob(AutoIngestJob job) { + /* + * Version 0 fields. + */ + this.manifest = job.getManifest(); // Manifest is immutable. + this.nodeName = job.getProcessingHostName(); + this.caseDirectoryPath = job.getCaseDirectoryPath().toString(); + this.priority = job.getPriority(); + this.stage = job.getProcessingStage(); + this.stageStartDate = job.getProcessingStageStartDate(); + this.dataSourceProcessor = job.getDataSourceProcessor(); + this.ingestJob = job.getIngestJob(); + this.cancelled = job.isCanceled(); + this.completed = job.isCompleted(); + this.completedDate = new Date(job.getCompletedDate().getTime()); + this.errorsOccurred = job.getErrorsOccurred(); + + /* + * Version 1 fields. + */ + this.version = job.getVersion(); + this.processingStatus = job.getProcessingStatus(); + this.numberOfCrashes = job.getNumberOfCrashes(); + this.stageDetails = job.getProcessingStageDetails(); // StageDetails is immutable. + } + /** * Gets the job manifest. * @@ -292,6 +323,13 @@ public final class AutoIngestJob implements Comparable, Serializa this.dataSourceProcessor = dataSourceProcessor; } + /** + * Gets the data source processor for the job. + */ + private DataSourceProcessor getDataSourceProcessor() { + return this.dataSourceProcessor; + } + /** * Sets the ingest job for the auto ingest job. Used for obtaining * processing stage details, cancelling the currently running data source @@ -498,6 +536,15 @@ public final class AutoIngestJob implements Comparable, Serializa return -this.getManifest().getDateFileCreated().compareTo(otherJob.getManifest().getDateFileCreated()); } + /** + * gest the version number of the job data. + * + * @return The version number. + */ + private int getVersion() { + return this.version; + } + /** * Comparator that supports doing a descending sort of jobs based on job * completion date. diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index 0c0b3e3823..1469553496 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -142,7 +142,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang jobsSnapshot.removePendingJob(event.getJob()); jobsSnapshot.addOrReplaceRunningJob(event.getJob()); setChanged(); - notifyObservers(jobsSnapshot); + notifyObservers(jobsSnapshot.deepCopy()); } } @@ -160,7 +160,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang jobsSnapshot.removePendingJob(job); jobsSnapshot.addOrReplaceRunningJob(job); setChanged(); - notifyObservers(jobsSnapshot); + notifyObservers(jobsSnapshot.deepCopy()); } } @@ -176,7 +176,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang jobsSnapshot.removeRunningJob(job); jobsSnapshot.addOrReplaceCompletedJob(job); setChanged(); - notifyObservers(jobsSnapshot); + notifyObservers(jobsSnapshot.deepCopy()); } } @@ -207,7 +207,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang */ JobsSnapshot getJobsSnapshot() { synchronized (jobsLock) { - return jobsSnapshot; + return jobsSnapshot.deepCopy(); } } @@ -323,7 +323,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang }).start(); } - return jobsSnapshot; + return jobsSnapshot.deepCopy(); } } @@ -345,7 +345,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang synchronized (jobsLock) { jobsSnapshot = queryCoordinationService(); setChanged(); - notifyObservers(jobsSnapshot); + notifyObservers(jobsSnapshot.deepCopy()); } } } @@ -468,8 +468,27 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang jobSet.add(job); } + /** + * Creates a deep copy of a jobs snapshot. + * + * @return The deep copy. + */ + private JobsSnapshot deepCopy() { + JobsSnapshot copy = new JobsSnapshot(); + this.pendingJobs.forEach((job) -> { + this.addOrReplacePendingJob(new AutoIngestJob(job)); + }); + this.runningJobs.forEach((job) -> { + this.addOrReplacePendingJob(new AutoIngestJob(job)); + }); + this.completedJobs.forEach((job) -> { + this.addOrReplacePendingJob(new AutoIngestJob(job)); + }); + return copy; + } + } - + /** * Exception type thrown when there is an error completing an auto ingest * monitor operation. From 3049f60e0e74f508cfa4957783a96c028afc23a5 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 21 Sep 2017 16:09:03 -0400 Subject: [PATCH 11/18] Add missing snapshot deep copy to auto ingest monitor --- .../autopsy/experimental/autoingest/AutoIngestMonitor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index 1469553496..064c4a587c 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -221,7 +221,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang JobsSnapshot refreshJobsSnapshot() { synchronized (jobsLock) { jobsSnapshot = queryCoordinationService(); - return jobsSnapshot; + return jobsSnapshot.deepCopy(); } } From cd92352db1325a217928ff0e0f140e11835c937f Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 21 Sep 2017 17:46:37 -0400 Subject: [PATCH 12/18] Revert "Add missing snapshot deep copy to auto ingest monitor" This reverts commit 3049f60e0e74f508cfa4957783a96c028afc23a5. --- .../autopsy/experimental/autoingest/AutoIngestMonitor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index 064c4a587c..1469553496 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -221,7 +221,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang JobsSnapshot refreshJobsSnapshot() { synchronized (jobsLock) { jobsSnapshot = queryCoordinationService(); - return jobsSnapshot.deepCopy(); + return jobsSnapshot; } } From 5ba6cc2e3ca77171cad77d5f0b92779c47d0e456 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 21 Sep 2017 17:47:10 -0400 Subject: [PATCH 13/18] Revert "Add deep copying of auto ingest monitor snapshots" This reverts commit 2abb7557032f079c284a6ced62cecc23a24d2eff. --- .../autoingest/AutoIngestJob.java | 47 ------------------- .../autoingest/AutoIngestMonitor.java | 33 +++---------- 2 files changed, 7 insertions(+), 73 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java index d8a46c00d5..b43b00d3fd 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestJob.java @@ -148,37 +148,6 @@ public final class AutoIngestJob implements Comparable, Serializa this.stageDetails = this.getProcessingStageDetails(); } - /** - * Copy constructs an automated ingest job. - * - * @param job The job to be copied. - */ - AutoIngestJob(AutoIngestJob job) { - /* - * Version 0 fields. - */ - this.manifest = job.getManifest(); // Manifest is immutable. - this.nodeName = job.getProcessingHostName(); - this.caseDirectoryPath = job.getCaseDirectoryPath().toString(); - this.priority = job.getPriority(); - this.stage = job.getProcessingStage(); - this.stageStartDate = job.getProcessingStageStartDate(); - this.dataSourceProcessor = job.getDataSourceProcessor(); - this.ingestJob = job.getIngestJob(); - this.cancelled = job.isCanceled(); - this.completed = job.isCompleted(); - this.completedDate = new Date(job.getCompletedDate().getTime()); - this.errorsOccurred = job.getErrorsOccurred(); - - /* - * Version 1 fields. - */ - this.version = job.getVersion(); - this.processingStatus = job.getProcessingStatus(); - this.numberOfCrashes = job.getNumberOfCrashes(); - this.stageDetails = job.getProcessingStageDetails(); // StageDetails is immutable. - } - /** * Gets the job manifest. * @@ -323,13 +292,6 @@ public final class AutoIngestJob implements Comparable, Serializa this.dataSourceProcessor = dataSourceProcessor; } - /** - * Gets the data source processor for the job. - */ - private DataSourceProcessor getDataSourceProcessor() { - return this.dataSourceProcessor; - } - /** * Sets the ingest job for the auto ingest job. Used for obtaining * processing stage details, cancelling the currently running data source @@ -536,15 +498,6 @@ public final class AutoIngestJob implements Comparable, Serializa return -this.getManifest().getDateFileCreated().compareTo(otherJob.getManifest().getDateFileCreated()); } - /** - * gest the version number of the job data. - * - * @return The version number. - */ - private int getVersion() { - return this.version; - } - /** * Comparator that supports doing a descending sort of jobs based on job * completion date. diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index 1469553496..0c0b3e3823 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -142,7 +142,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang jobsSnapshot.removePendingJob(event.getJob()); jobsSnapshot.addOrReplaceRunningJob(event.getJob()); setChanged(); - notifyObservers(jobsSnapshot.deepCopy()); + notifyObservers(jobsSnapshot); } } @@ -160,7 +160,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang jobsSnapshot.removePendingJob(job); jobsSnapshot.addOrReplaceRunningJob(job); setChanged(); - notifyObservers(jobsSnapshot.deepCopy()); + notifyObservers(jobsSnapshot); } } @@ -176,7 +176,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang jobsSnapshot.removeRunningJob(job); jobsSnapshot.addOrReplaceCompletedJob(job); setChanged(); - notifyObservers(jobsSnapshot.deepCopy()); + notifyObservers(jobsSnapshot); } } @@ -207,7 +207,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang */ JobsSnapshot getJobsSnapshot() { synchronized (jobsLock) { - return jobsSnapshot.deepCopy(); + return jobsSnapshot; } } @@ -323,7 +323,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang }).start(); } - return jobsSnapshot.deepCopy(); + return jobsSnapshot; } } @@ -345,7 +345,7 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang synchronized (jobsLock) { jobsSnapshot = queryCoordinationService(); setChanged(); - notifyObservers(jobsSnapshot.deepCopy()); + notifyObservers(jobsSnapshot); } } } @@ -468,27 +468,8 @@ public final class AutoIngestMonitor extends Observable implements PropertyChang jobSet.add(job); } - /** - * Creates a deep copy of a jobs snapshot. - * - * @return The deep copy. - */ - private JobsSnapshot deepCopy() { - JobsSnapshot copy = new JobsSnapshot(); - this.pendingJobs.forEach((job) -> { - this.addOrReplacePendingJob(new AutoIngestJob(job)); - }); - this.runningJobs.forEach((job) -> { - this.addOrReplacePendingJob(new AutoIngestJob(job)); - }); - this.completedJobs.forEach((job) -> { - this.addOrReplacePendingJob(new AutoIngestJob(job)); - }); - return copy; - } - } - + /** * Exception type thrown when there is an error completing an auto ingest * monitor operation. From b88c3b2213067198a4ed3bba5061dd2315f9c04d Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Fri, 22 Sep 2017 08:30:37 -0400 Subject: [PATCH 14/18] Improved handling of null result --- .../centralrepository/datamodel/EamArtifactUtil.java | 8 ++++++-- .../eventlisteners/CaseEventListener.java | 2 -- .../centralrepository/optionspanel/ManageTagsDialog.java | 4 +++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactUtil.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactUtil.java index c8bfdddad7..8b78e397ba 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactUtil.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactUtil.java @@ -196,8 +196,12 @@ public class EamArtifactUtil { /** * Create an EamArtifact from the given Content. - * Will return null if an artifact can not be created. Does not - * add the artifact to the database. + * Will return null if an artifact can not be created - this is not + * necessarily an error case, it just means an artifact can't be made. + * If creation fails due to an error (and not that the file is the wrong type + * or it has no hash), the error will be logged before returning. + * + * Does not add the artifact to the database. * * @param content The content object * @param knownStatus Unknown, notable, or known diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java index df26adc571..eb6a7ec505 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java @@ -148,8 +148,6 @@ public class CaseEventListener implements PropertyChangeListener { // TODO: send r into a thread pool instead Thread t = new Thread(r); t.start(); - } else { - LOGGER.log(Level.SEVERE, "Error creating artifact instance for {0}", af.getName()); } } // CONTENT_TAG_ADDED, CONTENT_TAG_DELETED break; diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageTagsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageTagsDialog.java index 8f65bbf61d..e835436466 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageTagsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageTagsDialog.java @@ -348,7 +348,9 @@ final class ManageTagsDialog extends javax.swing.JDialog { for(ContentTag contentTag:fileTags){ final EamArtifact eamArtifact = EamArtifactUtil.getEamArtifactFromContent(contentTag.getContent(), TskData.FileKnown.BAD, ""); - EamDb.getInstance().setArtifactInstanceKnownStatus(eamArtifact, TskData.FileKnown.BAD); + if(eamArtifact != null){ + EamDb.getInstance().setArtifactInstanceKnownStatus(eamArtifact, TskData.FileKnown.BAD); + } } } catch (TskCoreException ex){ throw new EamDbException("Error updating artifacts", ex); From b0845d62418fbbc0722776a3fa7fe45f9e29dd0c Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Fri, 22 Sep 2017 14:10:44 -0400 Subject: [PATCH 15/18] Added copyright headers. --- .../datamodel/EamDbUtil.java | 19 ++++++++++++++++--- .../optionspanel/EamDbSettingsDialog.java | 19 ++++++++++++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbUtil.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbUtil.java index 489f4cb12e..dc43b8ba51 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbUtil.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbUtil.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. + * Central Repository + * + * Copyright 2015-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.centralrepository.datamodel; diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java index f6abcf896d..28b9217bc2 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.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. + * Central Repository + * + * Copyright 2015-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.centralrepository.optionspanel; From 36fd426ddfc9c650f7e02ac5351fec9ee7bdd69a Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Fri, 22 Sep 2017 16:54:42 -0400 Subject: [PATCH 16/18] renamed some methods/classes for clarity. Fixed some content viewer bugs. Reduced duplicate code --- .../README-POSTGRES-TESTING.md | 77 ------- .../README_MONGODB_TESTING.md | 168 --------------- .../contentviewer/Bundle.properties | 2 +- .../DataContentViewerOtherCases.java | 201 ++++++++---------- ...tentViewerOtherCasesTableCellRenderer.java | 3 +- ...DataContentViewerOtherCasesTableModel.java | 17 +- .../datamodel/AbstractSqlEamDb.java | 181 +++++++--------- ...rtifact.java => CorrelationAttribute.java} | 39 ++-- ...java => CorrelationAttributeInstance.java} | 33 +-- .../datamodel/CorrelationDataSource.java | 103 +++++++++ .../datamodel/EamArtifactUtil.java | 133 ++++++------ .../datamodel/EamDataSource.java | 101 --------- .../centralrepository/datamodel/EamDb.java | 69 +++--- .../datamodel/EamDbUtil.java | 8 +- .../datamodel/PostgresEamDb.java | 4 +- .../datamodel/PostgresEamDbSettings.java | 6 +- .../datamodel/SqliteEamDb.java | 78 +++---- .../datamodel/SqliteEamDbSettings.java | 6 +- .../eventlisteners/CaseEventListener.java | 28 ++- .../eventlisteners/IngestEventsListener.java | 48 ++--- .../KnownStatusChangeRunner.java | 6 +- .../eventlisteners/NewArtifactsRunner.java | 8 +- .../ingestmodule/IngestModule.java | 30 ++- .../license-centralrepository.txt | 19 -- .../ImportHashDatabaseDialog.java | 10 +- .../ManageCorrelationPropertiesDialog.java | 6 +- .../optionspanel/ManageTagsDialog.java | 9 +- 27 files changed, 523 insertions(+), 870 deletions(-) delete mode 100755 Core/src/org/sleuthkit/autopsy/centralrepository/README-POSTGRES-TESTING.md delete mode 100755 Core/src/org/sleuthkit/autopsy/centralrepository/README_MONGODB_TESTING.md rename Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/{EamArtifact.java => CorrelationAttribute.java} (86%) rename Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/{EamArtifactInstance.java => CorrelationAttributeInstance.java} (87%) create mode 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationDataSource.java delete mode 100755 Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDataSource.java delete mode 100755 Core/src/org/sleuthkit/autopsy/centralrepository/license-centralrepository.txt diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/README-POSTGRES-TESTING.md b/Core/src/org/sleuthkit/autopsy/centralrepository/README-POSTGRES-TESTING.md deleted file mode 100755 index ed202b3fe5..0000000000 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/README-POSTGRES-TESTING.md +++ /dev/null @@ -1,77 +0,0 @@ -# Setting up the PostgreSQL DB for use in Enterprise Artifact Manager - -## Using Command Line (cmd.exe) - -The easiest way to do this is with the scripts that come with the PostgreSQL server. -Add the PostgreSQL Server bin directory to your path in your user's environment -variables. - - PATH=$PATH;c:\Program Files\PostgreSQL\9.6\bin - -Note: I've had issues getting these Windows PostgreSQL binaries to run in -a cygwin terminal. But they work perfectly in cmd.exe. - -### Create Role - -The role we use has user name "testuser" and password "testpass". - - $ createuser -U postgres -P testuser - -When prompted for a password enter "testpass". - -### Create Database - -The database we use is named "enterpriseartifactmanagerdb". - - $ createdb -T template0 -U postgres -O testuser enterpriseartifactmanagerdb - -### Drop Database - -If we want to reset the database, it's easiest to just drop it. - - $ dropdb -U postgres enterpriseartifactmanagerdb - -### Load the database content from a .sql file - -Before loading a schema.sql file, you must have an empty database named -enterpriseartifactmanagerdb and an existing user named testuser that is the database owner. -Use the schema.sql files to create the tables, indices, and other required settings. - - $ psql -U postgres enterpriseartifactmanagerdb < c:\path\to\schema.sql - -## Using pgAdmin tool - -### Create Role - -Use the right-click menus to create a role named "testuser" with a password of -"testpass". - -### Create Database - -Use the right-click menus to create a database named "enterpriseartifactmanagerdb" -and set testuser as the owner. - -### Load the database content from a .sql file - -Right-click on the enterpriseartifactmanagerdb database and select "CREATE script". -In the new window, delete all of the content and paste in the content of the -schema.sql file. -Click on the lightning icon to execute the contents you just pasted. - -## Notes - -- The schema.sql file does not contain commands to check for the existence of -existing table objects, nor does it drop them before trying to add new ones. -So, it is best to drop and create the database freshly before loading the schema. -- pg_restore cannot load a .sql file. -- The schema.sql file cannot have commands to drop/create the database. - -### Purpose of each schema file - -schema1 - 2 non-normalized tables, no FKs, no enforced uniqueness - -schema2 - 2 non-normalized tables, no FKs, enforced uniqueness on artifacts -- requires PostgreSQL Server ver 9.2+ -- postgresql automatically creates a unique index when a unique constraint is defined, -so there is no need to manually create a unique index for the same column(s). -Doing so would duplicate the automatically-created index. \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/README_MONGODB_TESTING.md b/Core/src/org/sleuthkit/autopsy/centralrepository/README_MONGODB_TESTING.md deleted file mode 100755 index 73c1a33ce1..0000000000 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/README_MONGODB_TESTING.md +++ /dev/null @@ -1,168 +0,0 @@ -# Mongo Database for testing - -These instructions assume that you already have MongoDB Server 3.4 installed and -that the server binary is at: - - C:\Program Files\MongoDB\Server\3.4\bin\mongod.exe - -## Using multiple configurations - -It is possible to use a configuration file and even to run MongoDB as a service, -but for our testing, we want one instance that is the default non-secure instance. -And we want a second instance that has auth enabled and has a defined role for -our test user. - -The the easiest way to have multiple instances of MongoDB that have -unique configurations is to have each of them use distinct directories. - -The default directories are: - - C:\data\db - C:\data\log - -So, we need to create a second set of directories at: - - C:\dataauth\db - C:\dataauth\log - -### Create config files, so it is easier to start MongoDB - -The config file is YAML formatted, so do not use TABs. And every -sub-level should be indented 2 spaces from the previous level. - -We will not define the host/port values in the config files, because we assume -that you are using the default port and host values AND -that you will only run ONE of these two instances at a time. -If you want them to run at the same time, include the net.port and net.bindIp -parameters in the config file and make sure they are not both using the same -port/IP pair. - -The first config file is for the default instance, create a new file: - - C:\data\mongod.cfg - -Enter the following content into that file: - - systemLog: - destination: file - path: c:\data\log\mongod.log - storage: - dbPath: c:\data\db - -The second config file is for the auth instance, create a new file: - - C:\dataauth\mongod.cfg - -Enter the following content into that file: - - systemLog: - destination: file - path: c:\dataauth\log\mongod.log - storage: - dbPath: c:\dataauth\db - security: - authorization: enabled - -Note: Ensure Windows did not name your file ending with cfg.txt. You'll -have to go to Folder Options -> View and uncheck the option to hide file extensions -for common files. - -Also, if you will be running mongod using a windows terminal (cmd.exe or powershell), -make sure to use correct Windows path separators (i.e. c:\data\db). -If you are instead using cygwin, make sure to use valid cygwin/unix path -separators (i.e. c:/data/db). - -### To start MongoDB using a config file - -for Windows cmd or ps: - - C:\path\to\bin\mongod.exe --config C:\data\mongod.cfg - -or - - C:\path\to\bin\mongod.exe --config C:\dataauth\mongod.cfg - -for cygwin/unix: - - cd /cygdrive/c/path/to/bin/ - ./mongod.exe --config C:/data/mongod.cfg - -or - - ./mongod.exe --config C:/dataauth/mongod.cfg - - -If it starts correctly, you'll see nothing in the terminal and all logs will -go to the specified log file. -If there is a problem it will display an error in the terminal and fail to start. - -### Setting up the auth'd instance - -The first time you start this mongod instance, you MUST start with auth disabled, -so it will let you create the admin user. Do this in the config file: - - security: - authorization: disabled - -Now start the auth'd mongod in one terminal. - -#### Create admin user - -In a second terminal, connect to that instance with mongo client. - - C:\path\to\mongo.exe - -Enter the following in the mongo client: - - use admin - db.createUser( - { - user: "adminuser", - pwd: "adminpass", - roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] - } - ) - -Logout of the mongo client. -Stop mongod. -Set security.authorization to enabled in the auth'd mongod.cfg. -Start the auth'd mongod. -From now on, you can always start this instance of mongod with authorization -enabled. - -#### Create test user - -In the second terminal, connect to the auth'd instance with mongo client. - - C:\path\to\mongo.exe - -Authenticate as the admin user: - - use admin - db.auth("adminuser", "adminpass") - -Create the test user in the enterpriseartifactmanagerdb database with the readWrite role: - - use enterpriseartifactmanagerdb - db.createUser( - { - user: "testuser", - pwd: "testpass", - roles: [ { role: "readWrite", db: "enterpriseartifactmanagerdb" } ] - } - ) - -Now the EnterpriseArtifactManager code can use the user "testuser" to use the -enterpriseartifactmanagerdb database. This includes creating/dropping indices/collections -along with the usual insert/update/delete commands. - -NOTE: The database where a user is created is that user's "authentication database". -So, when that user needs to authenticate, they need to provide their username, -password, and authentication database. - -### References - -Installation and setup: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/ -Config file: https://docs.mongodb.com/manual/reference/configuration-options/ -Enabling Auth: https://docs.mongodb.com/manual/tutorial/enable-authentication/ -readWrite Role: https://docs.mongodb.com/manual/reference/built-in-roles/#readWrite \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/Bundle.properties index f1ab298155..8b18108d52 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/Bundle.properties @@ -2,4 +2,4 @@ DataContentViewerOtherCases.selectAllMenuItem.text=Select All DataContentViewerOtherCases.showCaseDetailsMenuItem.text=Show Case Details DataContentViewerOtherCases.table.toolTip.text=Click column name to sort. Right-click on the table for more options. DataContentViewerOtherCases.exportToCSVMenuItem.text=Export Selected Rows to CSV -DataContentViewerOtherCases.showCommonalityMenuItem.text=Show Commonality +DataContentViewerOtherCases.showCommonalityMenuItem.text=Show Frequency diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCases.java b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCases.java index 8ab241fa3b..ac71624da7 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCases.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCases.java @@ -47,8 +47,8 @@ import org.openide.util.NbBundle.Messages; import org.openide.util.lookup.ServiceProvider; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.corecomponentinterfaces.DataContentViewer; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifact; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifactInstance; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttribute; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance; import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifactUtil; import org.sleuthkit.autopsy.centralrepository.datamodel.EamCase; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; @@ -73,18 +73,18 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D private final static Logger LOGGER = Logger.getLogger(DataContentViewerOtherCases.class.getName()); private final DataContentViewerOtherCasesTableModel tableModel; - private final Collection correlatedArtifacts; + private final Collection correlationAttributes; /** * Creates new form DataContentViewerOtherCases */ public DataContentViewerOtherCases() { this.tableModel = new DataContentViewerOtherCasesTableModel(); - this.correlatedArtifacts = new ArrayList<>(); + this.correlationAttributes = new ArrayList<>(); initComponents(); customizeComponents(); - readSettings(); + reset(); } private void customizeComponents() { @@ -119,11 +119,14 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D "# {0} - commonality percentage", "# {1} - correlation type", "# {2} - correlation value", - "DataContentViewerOtherCases.correlatedArtifacts.byType={0}% for Correlation Type: {1} and Correlation Value: {2}.\n", - "DataContentViewerOtherCases.correlatedArtifacts.title=Commonality Percentages", - "DataContentViewerOtherCases.correlatedArtifacts.failed=Failed to get commonality details."}) + "DataContentViewerOtherCases.correlatedArtifacts.byType={0}% of data sources have {2} (type: {1})\n", + "DataContentViewerOtherCases.correlatedArtifacts.title=Attribute Frequency", + "DataContentViewerOtherCases.correlatedArtifacts.failed=Failed to get frequency details."}) + /** + * Show how common the selected + */ private void showCommonalityDetails() { - if (correlatedArtifacts.isEmpty()) { + if (correlationAttributes.isEmpty()) { JOptionPane.showConfirmDialog(showCommonalityMenuItem, Bundle.DataContentViewerOtherCases_correlatedArtifacts_isEmpty(), Bundle.DataContentViewerOtherCases_correlatedArtifacts_title(), @@ -133,8 +136,8 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D int percentage; try { EamDb dbManager = EamDb.getInstance(); - for (EamArtifact eamArtifact : correlatedArtifacts) { - percentage = dbManager.getCommonalityPercentageForTypeValue(eamArtifact.getCorrelationType(), eamArtifact.getCorrelationValue()); + for (CorrelationAttribute eamArtifact : correlationAttributes) { + percentage = dbManager.getFrequencyPercentage(eamArtifact); msg.append(Bundle.DataContentViewerOtherCases_correlatedArtifacts_byType(percentage, eamArtifact.getCorrelationType().getDisplayName(), eamArtifact.getCorrelationValue())); @@ -163,7 +166,7 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D if (-1 != selectedRowViewIdx) { EamDb dbManager = EamDb.getInstance(); int selectedRowModelIdx = otherCasesTable.convertRowIndexToModel(selectedRowViewIdx); - EamArtifact eamArtifact = (EamArtifact) tableModel.getRow(selectedRowModelIdx); + CorrelationAttribute eamArtifact = (CorrelationAttribute) tableModel.getRow(selectedRowModelIdx); EamCase eamCasePartial = eamArtifact.getInstances().get(0).getEamCase(); if (eamCasePartial == null) { JOptionPane.showConfirmDialog(showCaseDetailsMenuItem, @@ -262,14 +265,12 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D } /** - * Read the module settings from the config file and reset the table model. + * Reset the UI and clear cached data. */ - private boolean readSettings() { + private void reset() { // start with empty table tableModel.clearTable(); - correlatedArtifacts.clear(); - - return true; + correlationAttributes.clear(); } @Override @@ -294,7 +295,7 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D @Override public void resetComponent() { - readSettings(); + reset(); } @Override @@ -365,102 +366,61 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D } /** - * Scan a Node for blackboard artifacts / content that we can correlate on - * and create the corresponding Central Repository artifacts for display + * Determine what attributes can be used for correlation based on the node. * - * @param node The node to view + * @param node The node to correlate * - * @return A collection of central repository artifacts to display + * @return A list of attributes that can be used for correlation */ - private Collection getArtifactsFromCorrelatableAttributes(Node node) { - Collection ret = new ArrayList<>(); + private Collection getCorrelationAttributesFromNode(Node node) { + Collection ret = new ArrayList<>(); - /* - * If the user selected a blackboard artifact or tag of a BB artifact, - * correlate both the artifact and the associated file. If the user - * selected a file, correlate only the file - */ - BlackboardArtifact bbArtifact = getBlackboardArtifactFromNode(node); - AbstractFile abstractFile = getAbstractFileFromNode(node); - List artifactTypes = null; - try { - EamDb dbManager = EamDb.getInstance(); - artifactTypes = dbManager.getCorrelationTypes(); - if (bbArtifact != null) { - ret.addAll(EamArtifactUtil.fromBlackboardArtifact(bbArtifact, false, artifactTypes, false)); - } - } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Error retrieving correlation types", ex); // NON-NLS + // correlate on blackboard artifact attributes if they exist and supported + BlackboardArtifact bbArtifact = getBlackboardArtifactFromNode(node); + if (bbArtifact != null) { + ret.addAll(EamArtifactUtil.getCorrelationAttributeFromBlackboardArtifact(bbArtifact, false, false)); } - + + // we can correlate based on the MD5 if it is enabled + AbstractFile abstractFile = getAbstractFileFromNode(node); if (abstractFile != null) { - String md5 = abstractFile.getMd5Hash(); - if (md5 != null && !md5.isEmpty() && null != artifactTypes && !artifactTypes.isEmpty()) { - for (EamArtifact.Type aType : artifactTypes) { - if (aType.getId() == EamArtifact.FILES_TYPE_ID) { - ret.add(new EamArtifact(aType, md5)); - break; + try { + List artifactTypes = EamDb.getInstance().getDefinedCorrelationTypes(); + String md5 = abstractFile.getMd5Hash(); + if (md5 != null && !md5.isEmpty() && null != artifactTypes && !artifactTypes.isEmpty()) { + for (CorrelationAttribute.Type aType : artifactTypes) { + if (aType.getId() == CorrelationAttribute.FILES_TYPE_ID) { + ret.add(new CorrelationAttribute(aType, md5)); + break; + } } } + } catch (EamDbException ex) { + LOGGER.log(Level.SEVERE, "Error connecting to DB", ex); // NON-NLS } } return ret; } - /** - * Given a node, return the associated data source - * - * @param node The node - * - * @return The name of the data source - */ - private String getDataSourceNameFromNode(Node node) { - AbstractFile af = getAbstractFileFromNode(node); - try { - if (af != null) { - return af.getDataSource().getName(); - } - } catch (TskException ex) { - return ""; - } - return ""; - } - - /** - * Given a node, return the associated data source's device ID - * - * @param node The node - * - * @return The ID of the data source's device - */ - private String getDeviceIdFromNode(Node node) { - AbstractFile af = getAbstractFileFromNode(node); - try { - if (af != null) { - return Case.getCurrentCase().getSleuthkitCase().getDataSource(af.getDataSource().getId()).getDeviceId(); - } - } catch (TskException ex) { - return ""; - } - - return ""; - } /** * Query the db for artifact instances from other cases correlated to the - * given central repository artifact. + * given central repository artifact. Will not show instances from the same datasource / device * - * @param eamArtifact The artifact to correlate against + * @param corAttr CorrelationAttribute to query for + * @param dataSourceName Data source to filter results + * @param deviceId Device Id to filter results * * @return A collection of correlated artifact instances from other cases */ - private Collection getCorrelatedInstances(EamArtifact.Type aType, String value, String dataSourceName, String deviceId) { + private Collection getCorrelatedInstances(CorrelationAttribute corAttr, String dataSourceName, String deviceId) { + // @@@ Check exception String caseUUID = Case.getCurrentCase().getName(); try { EamDb dbManager = EamDb.getInstance(); - Collection artifactInstances = dbManager.getArtifactInstancesByTypeValue(aType, value).stream() + Collection artifactInstances = dbManager.getArtifactInstancesByTypeValue(corAttr.getCorrelationType(), corAttr.getCorrelationValue()).stream() .filter(artifactInstance -> !artifactInstance.getEamCase().getCaseUUID().equals(caseUUID) || !artifactInstance.getEamDataSource().getName().equals(dataSourceName) || !artifactInstance.getEamDataSource().getDeviceID().equals(deviceId)) @@ -475,25 +435,25 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D /** * Get the global file instances matching the given eamArtifact and convert - * them to central repository artifact instancess. + * them to central repository artifact instances. * * @param eamArtifact Artifact to use for ArtifactTypeEnum matching * * @return List of central repository artifact instances, empty list if none * found */ - public Collection getReferenceInstancesAsArtifactInstances(EamArtifact eamArtifact) { - Collection eamArtifactInstances = new ArrayList<>(); + public Collection getReferenceInstancesAsArtifactInstances(CorrelationAttribute eamArtifact) { + Collection eamArtifactInstances = new ArrayList<>(); // FUTURE: support other reference types - if (eamArtifact.getCorrelationType().getId() != EamArtifact.FILES_TYPE_ID) { + if (eamArtifact.getCorrelationType().getId() != CorrelationAttribute.FILES_TYPE_ID) { return Collections.emptyList(); } try { EamDb dbManager = EamDb.getInstance(); Collection eamGlobalFileInstances = dbManager.getReferenceInstancesByTypeValue(eamArtifact.getCorrelationType(), eamArtifact.getCorrelationValue()); eamGlobalFileInstances.forEach((eamGlobalFileInstance) -> { - eamArtifactInstances.add(new EamArtifactInstance( - null, null, "", eamGlobalFileInstance.getComment(), eamGlobalFileInstance.getKnownStatus(), EamArtifactInstance.GlobalStatus.GLOBAL + eamArtifactInstances.add(new CorrelationAttributeInstance( + null, null, "", eamGlobalFileInstance.getComment(), eamGlobalFileInstance.getKnownStatus(), CorrelationAttributeInstance.GlobalStatus.GLOBAL )); }); return eamArtifactInstances; @@ -510,7 +470,7 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D } // Is supported if this node has correlatable content (File, BlackboardArtifact) - return !getArtifactsFromCorrelatableAttributes(node).isEmpty(); + return !getCorrelationAttributesFromNode(node).isEmpty(); } @Override @@ -520,7 +480,10 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D return; } - readSettings(); // reset the table to empty. + reset(); // reset the table to empty. + if (node == null) { + return; + } populateTable(node); } @@ -533,26 +496,40 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D @Messages({"DataContentViewerOtherCases.table.isempty=There are no associated artifacts or files from other occurrences to display.", "DataContentViewerOtherCases.table.noArtifacts=Correlation cannot be performed on the selected file."}) private void populateTable(Node node) { - String dataSourceName = getDataSourceNameFromNode(node); - String deviceId = getDeviceIdFromNode(node); - correlatedArtifacts.addAll(getArtifactsFromCorrelatableAttributes(node)); - correlatedArtifacts.forEach((eamArtifact) -> { - // get local instances - Collection eamArtifactInstances = getCorrelatedInstances(eamArtifact.getCorrelationType(), eamArtifact.getCorrelationValue(), dataSourceName, deviceId); - // get global instances - eamArtifactInstances.addAll(getReferenceInstancesAsArtifactInstances(eamArtifact)); + AbstractFile af = getAbstractFileFromNode(node); + String dataSourceName = ""; + String deviceId = ""; + try { + if (af != null) { + Content dataSource = af.getDataSource(); + dataSourceName = dataSource.getName(); + deviceId = Case.getCurrentCase().getSleuthkitCase().getDataSource(dataSource.getId()).getDeviceId(); + } + } catch (TskException ex) { + // do nothing. + // @@@ Review this behavior + } + + // get the attributes we can correlate on + correlationAttributes.addAll(getCorrelationAttributesFromNode(node)); + for (CorrelationAttribute corAttr : correlationAttributes) { + Collection corAttrInstances = new ArrayList<>(); + + // get correlation and reference set instances from DB + corAttrInstances.addAll(getCorrelatedInstances(corAttr, dataSourceName, deviceId)); + corAttrInstances.addAll(getReferenceInstancesAsArtifactInstances(corAttr)); - eamArtifactInstances.forEach((eamArtifactInstance) -> { - EamArtifact newCeArtifact = new EamArtifact( - eamArtifact.getCorrelationType(), - eamArtifact.getCorrelationValue() + corAttrInstances.forEach((corAttrInstance) -> { + CorrelationAttribute newCeArtifact = new CorrelationAttribute( + corAttr.getCorrelationType(), + corAttr.getCorrelationValue() ); - newCeArtifact.addInstance(eamArtifactInstance); + newCeArtifact.addInstance(corAttrInstance); tableModel.addEamArtifact(newCeArtifact); }); - }); + } - if (correlatedArtifacts.isEmpty()) { + if (correlationAttributes.isEmpty()) { displayMessageOnTableStatusPanel(Bundle.DataContentViewerOtherCases_table_noArtifacts()); } else if (0 == tableModel.getRowCount()) { displayMessageOnTableStatusPanel(Bundle.DataContentViewerOtherCases_table_isempty()); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCasesTableCellRenderer.java b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCasesTableCellRenderer.java index 3a657e3d02..0c2968fe6b 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCasesTableCellRenderer.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCasesTableCellRenderer.java @@ -55,7 +55,8 @@ public class DataContentViewerOtherCasesTableCellRenderer implements TableCellRe background = Color.RED; } else if (known_status.equals(TskData.FileKnown.UNKNOWN.getName())) { foreground = Color.BLACK; - background = Color.YELLOW; + //background = Color.YELLOW; + background = Color.WHITE; } else { foreground = Color.BLACK; background = Color.WHITE; diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCasesTableModel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCasesTableModel.java index ba2358d75c..b27b6880d6 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCasesTableModel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/contentviewer/DataContentViewerOtherCasesTableModel.java @@ -22,8 +22,8 @@ import java.util.ArrayList; import java.util.List; import javax.swing.table.AbstractTableModel; import org.openide.util.NbBundle.Messages; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifact; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifactInstance; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttribute; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance; /** * Model for cells in data content viewer table @@ -45,13 +45,13 @@ public class DataContentViewerOtherCasesTableModel extends AbstractTableModel { // If order is changed, update the CellRenderer to ensure correct row coloring. CASE_NAME(Bundle.DataContentViewerOtherCasesTableModel_case(), 75), DATA_SOURCE(Bundle.DataContentViewerOtherCasesTableModel_dataSource(), 75), - DEVICE(Bundle.DataContentViewerOtherCasesTableModel_device(), 145), TYPE(Bundle.DataContentViewerOtherCasesTableModel_type(), 40), VALUE(Bundle.DataContentViewerOtherCasesTableModel_value(), 145), KNOWN(Bundle.DataContentViewerOtherCasesTableModel_known(), 45), SCOPE(Bundle.DataContentViewerOtherCasesTableModel_scope(), 20), COMMENT(Bundle.DataContentViewerOtherCasesTableModel_comment(), 200), - FILE_PATH(Bundle.DataContentViewerOtherCasesTableModel_path(), 250); + FILE_PATH(Bundle.DataContentViewerOtherCasesTableModel_path(), 250), + DEVICE(Bundle.DataContentViewerOtherCasesTableModel_device(), 145); private final String columnName; private final int columnWidth; @@ -70,7 +70,7 @@ public class DataContentViewerOtherCasesTableModel extends AbstractTableModel { } }; - List eamArtifacts; + List eamArtifacts; DataContentViewerOtherCasesTableModel() { eamArtifacts = new ArrayList<>(); @@ -127,8 +127,8 @@ public class DataContentViewerOtherCasesTableModel extends AbstractTableModel { * @return value in the cell */ private Object mapValueById(int rowIdx, TableColumns colId) { - EamArtifact eamArtifact = eamArtifacts.get(rowIdx); - EamArtifactInstance eamArtifactInstance = eamArtifact.getInstances().get(0); + CorrelationAttribute eamArtifact = eamArtifacts.get(rowIdx); + CorrelationAttributeInstance eamArtifactInstance = eamArtifact.getInstances().get(0); String value = Bundle.DataContentViewerOtherCasesTableModel_noData(); switch (colId) { @@ -180,13 +180,14 @@ public class DataContentViewerOtherCasesTableModel extends AbstractTableModel { * @param eamArtifact central repository artifact to add to the * table */ - public void addEamArtifact(EamArtifact eamArtifact) { + public void addEamArtifact(CorrelationAttribute eamArtifact) { eamArtifacts.add(eamArtifact); fireTableDataChanged(); } public void clearTable() { eamArtifacts.clear(); + fireTableDataChanged(); } } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index cae074db95..accd263d57 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -47,11 +47,11 @@ public abstract class AbstractSqlEamDb implements EamDb { private final static Logger LOGGER = Logger.getLogger(AbstractSqlEamDb.class.getName()); - protected final List DEFAULT_CORRELATION_TYPES; + protected final List DEFAULT_CORRELATION_TYPES; private int bulkArtifactsCount; protected int bulkArtifactsThreshold; - private final Map> bulkArtifacts; + private final Map> bulkArtifacts; private final List badTags; /** @@ -64,7 +64,7 @@ public abstract class AbstractSqlEamDb implements EamDb { bulkArtifactsCount = 0; bulkArtifacts = new HashMap<>(); - DEFAULT_CORRELATION_TYPES = EamArtifact.getDefaultCorrelationTypes(); + DEFAULT_CORRELATION_TYPES = CorrelationAttribute.getDefaultCorrelationTypes(); DEFAULT_CORRELATION_TYPES.forEach((type) -> { bulkArtifacts.put(type.getDbTableName(), new ArrayList<>()); }); @@ -423,7 +423,7 @@ public abstract class AbstractSqlEamDb implements EamDb { * @param eamDataSource the data source to add */ @Override - public void newDataSource(EamDataSource eamDataSource) throws EamDbException { + public void newDataSource(CorrelationDataSource eamDataSource) throws EamDbException { Connection conn = connect(); PreparedStatement preparedStatement = null; @@ -451,7 +451,7 @@ public abstract class AbstractSqlEamDb implements EamDb { * @param eamDataSource the data source to update */ @Override - public void updateDataSource(EamDataSource eamDataSource) throws EamDbException { + public void updateDataSource(CorrelationDataSource eamDataSource) throws EamDbException { Connection conn = connect(); PreparedStatement preparedStatement = null; @@ -480,10 +480,10 @@ public abstract class AbstractSqlEamDb implements EamDb { * @return The data source */ @Override - public EamDataSource getDataSourceDetails(String dataSourceDeviceId) throws EamDbException { + public CorrelationDataSource getDataSourceDetails(String dataSourceDeviceId) throws EamDbException { Connection conn = connect(); - EamDataSource eamDataSourceResult = null; + CorrelationDataSource eamDataSourceResult = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; @@ -513,11 +513,11 @@ public abstract class AbstractSqlEamDb implements EamDb { * @return list of data sources in the DB */ @Override - public List getDataSources() throws EamDbException { + public List getDataSources() throws EamDbException { Connection conn = connect(); - List dataSources = new ArrayList<>(); - EamDataSource eamDataSourceResult; + List dataSources = new ArrayList<>(); + CorrelationDataSource eamDataSourceResult; PreparedStatement preparedStatement = null; ResultSet resultSet = null; @@ -548,12 +548,14 @@ public abstract class AbstractSqlEamDb implements EamDb { * @param eamArtifact The artifact to add */ @Override - public void addArtifact(EamArtifact eamArtifact) throws EamDbException { + public void addArtifact(CorrelationAttribute eamArtifact) throws EamDbException { Connection conn = connect(); - List eamInstances = eamArtifact.getInstances(); + List eamInstances = eamArtifact.getInstances(); PreparedStatement preparedStatement = null; + + // @@@ We should cache the case and data source IDs in memory String tableName = EamDbUtil.correlationTypeToInstanceTableName(eamArtifact.getCorrelationType()); StringBuilder sql = new StringBuilder(); sql.append("INSERT INTO "); @@ -564,7 +566,7 @@ public abstract class AbstractSqlEamDb implements EamDb { try { preparedStatement = conn.prepareStatement(sql.toString()); - for (EamArtifactInstance eamInstance : eamInstances) { + for (CorrelationAttributeInstance eamInstance : eamInstances) { if(! eamArtifact.getCorrelationValue().isEmpty()){ preparedStatement.setString(1, eamInstance.getEamCase().getCaseUUID()); preparedStatement.setString(2, eamInstance.getEamDataSource().getDeviceID()); @@ -597,12 +599,12 @@ public abstract class AbstractSqlEamDb implements EamDb { * @return List of artifact instances for a given type/value */ @Override - public List getArtifactInstancesByTypeValue(EamArtifact.Type aType, String value) throws EamDbException { + public List getArtifactInstancesByTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException { Connection conn = connect(); - List artifactInstances = new ArrayList<>(); + List artifactInstances = new ArrayList<>(); - EamArtifactInstance artifactInstance; + CorrelationAttributeInstance artifactInstance; PreparedStatement preparedStatement = null; ResultSet resultSet = null; @@ -649,12 +651,12 @@ public abstract class AbstractSqlEamDb implements EamDb { * @throws EamDbException */ @Override - public List getArtifactInstancesByPath(EamArtifact.Type aType, String filePath) throws EamDbException { + public List getArtifactInstancesByPath(CorrelationAttribute.Type aType, String filePath) throws EamDbException { Connection conn = connect(); - List artifactInstances = new ArrayList<>(); + List artifactInstances = new ArrayList<>(); - EamArtifactInstance artifactInstance; + CorrelationAttributeInstance artifactInstance; PreparedStatement preparedStatement = null; ResultSet resultSet = null; @@ -700,7 +702,7 @@ public abstract class AbstractSqlEamDb implements EamDb { * ArtifactValue. */ @Override - public Long getCountArtifactInstancesByTypeValue(EamArtifact.Type aType, String value) throws EamDbException { + public Long getCountArtifactInstancesByTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException { Connection conn = connect(); Long instanceCount = 0L; @@ -730,21 +732,11 @@ public abstract class AbstractSqlEamDb implements EamDb { return instanceCount; } - /** - * Using the ArtifactType and ArtifactValue from the given eamArtfact, - * compute the ratio of: (The number of unique case_id/datasource_id tuples - * where Type/Value is found) divided by (The total number of unique - * case_id/datasource_id tuples in the database) expressed as a percentage. - * - * @param eamArtifact Artifact with artifactType and artifactValue to search - * for - * - * @return Int between 0 and 100 - */ + @Override - public int getCommonalityPercentageForTypeValue(EamArtifact.Type aType, String value) throws EamDbException { - Double uniqueTypeValueTuples = getCountUniqueCaseDataSourceTuplesHavingTypeValue(aType, value).doubleValue(); - Double uniqueCaseDataSourceTuples = getCountUniqueCaseDataSourceTuples().doubleValue(); + public int getFrequencyPercentage(CorrelationAttribute corAttr) throws EamDbException { + Double uniqueTypeValueTuples = getCountUniqueCaseDataSourceTuplesHavingTypeValue(corAttr.getCorrelationType(), corAttr.getCorrelationValue()).doubleValue(); + Double uniqueCaseDataSourceTuples = getCountUniqueDataSources().doubleValue(); Double commonalityPercentage = uniqueTypeValueTuples / uniqueCaseDataSourceTuples * 100; return commonalityPercentage.intValue(); } @@ -760,7 +752,7 @@ public abstract class AbstractSqlEamDb implements EamDb { * @return Number of unique tuples */ @Override - public Long getCountUniqueCaseDataSourceTuplesHavingTypeValue(EamArtifact.Type aType, String value) throws EamDbException { + public Long getCountUniqueCaseDataSourceTuplesHavingTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException { Connection conn = connect(); Long instanceCount = 0L; @@ -792,41 +784,24 @@ public abstract class AbstractSqlEamDb implements EamDb { return instanceCount; } - /** - * Retrieves number of unique caseDisplayName/dataSource tuples in the - * database. - * - * @return Number of unique tuples - */ + @Override - public Long getCountUniqueCaseDataSourceTuples() throws EamDbException { + public Long getCountUniqueDataSources() throws EamDbException { Connection conn = connect(); Long instanceCount = 0L; - List artifactTypes = getCorrelationTypes(); PreparedStatement preparedStatement = null; ResultSet resultSet = null; - StringBuilder sql = new StringBuilder(); - sql.append("SELECT 0 "); - - for (EamArtifact.Type type : artifactTypes) { - String table_name = EamDbUtil.correlationTypeToInstanceTableName(type); - - sql.append("+ (SELECT count(*) FROM (SELECT DISTINCT case_id, data_source_id FROM "); - sql.append(table_name); - sql.append(") AS "); - sql.append(table_name); - sql.append("_distinct_case_data_source_tuple) "); - } + String stmt = "SELECT count(*) FROM data_sources"; try { - preparedStatement = conn.prepareStatement(sql.toString()); + preparedStatement = conn.prepareStatement(stmt); resultSet = preparedStatement.executeQuery(); resultSet.next(); instanceCount = resultSet.getLong(1); } catch (SQLException ex) { - throw new EamDbException("Error counting unique caseDisplayName/dataSource tuples.", ex); // NON-NLS + throw new EamDbException("Error counting data sources.", ex); // NON-NLS } finally { EamDbUtil.closePreparedStatement(preparedStatement); EamDbUtil.closeResultSet(resultSet); @@ -852,7 +827,7 @@ public abstract class AbstractSqlEamDb implements EamDb { Connection conn = connect(); Long instanceCount = 0L; - List artifactTypes = getCorrelationTypes(); + List artifactTypes = getDefinedCorrelationTypes(); PreparedStatement preparedStatement = null; ResultSet resultSet = null; @@ -860,7 +835,7 @@ public abstract class AbstractSqlEamDb implements EamDb { StringBuilder sql = new StringBuilder(); sql.append("SELECT 0 "); - for (EamArtifact.Type type : artifactTypes) { + for (CorrelationAttribute.Type type : artifactTypes) { String table_name = EamDbUtil.correlationTypeToInstanceTableName(type); sql.append("+ (SELECT count(*) FROM "); @@ -898,7 +873,7 @@ public abstract class AbstractSqlEamDb implements EamDb { * @param eamArtifact The artifact to add */ @Override - public void prepareBulkArtifact(EamArtifact eamArtifact) throws EamDbException { + public void prepareBulkArtifact(CorrelationAttribute eamArtifact) throws EamDbException { synchronized (bulkArtifacts) { bulkArtifacts.get(eamArtifact.getCorrelationType().getDbTableName()).add(eamArtifact); @@ -923,7 +898,7 @@ public abstract class AbstractSqlEamDb implements EamDb { */ @Override public void bulkInsertArtifacts() throws EamDbException { - List artifactTypes = getCorrelationTypes(); + List artifactTypes = getDefinedCorrelationTypes(); Connection conn = connect(); PreparedStatement bulkPs = null; @@ -934,7 +909,7 @@ public abstract class AbstractSqlEamDb implements EamDb { return; } - for (EamArtifact.Type type : artifactTypes) { + for (CorrelationAttribute.Type type : artifactTypes) { String tableName = EamDbUtil.correlationTypeToInstanceTableName(type); StringBuilder sql = new StringBuilder(); @@ -947,11 +922,11 @@ public abstract class AbstractSqlEamDb implements EamDb { bulkPs = conn.prepareStatement(sql.toString()); - Collection eamArtifacts = bulkArtifacts.get(type.getDbTableName()); - for (EamArtifact eamArtifact : eamArtifacts) { - List eamInstances = eamArtifact.getInstances(); + Collection eamArtifacts = bulkArtifacts.get(type.getDbTableName()); + for (CorrelationAttribute eamArtifact : eamArtifacts) { + List eamInstances = eamArtifact.getInstances(); - for (EamArtifactInstance eamInstance : eamInstances) { + for (CorrelationAttributeInstance eamInstance : eamInstances) { if(! eamArtifact.getCorrelationValue().isEmpty()){ bulkPs.setString(1, eamInstance.getEamCase().getCaseUUID()); bulkPs.setString(2, eamInstance.getEamDataSource().getDeviceID()); @@ -1068,15 +1043,15 @@ public abstract class AbstractSqlEamDb implements EamDb { * @param FileKnown The status to change the artifact to */ @Override - public void setArtifactInstanceKnownStatus(EamArtifact eamArtifact, TskData.FileKnown knownStatus) throws EamDbException { + public void setArtifactInstanceKnownStatus(CorrelationAttribute eamArtifact, TskData.FileKnown knownStatus) throws EamDbException { Connection conn = connect(); if (1 != eamArtifact.getInstances().size()) { throw new EamDbException("Error: Artifact must have exactly one (1) Artifact Instance to set as notable."); // NON-NLS } - List eamInstances = eamArtifact.getInstances(); - EamArtifactInstance eamInstance = eamInstances.get(0); + List eamInstances = eamArtifact.getInstances(); + CorrelationAttributeInstance eamInstance = eamInstances.get(0); PreparedStatement preparedUpdate = null; PreparedStatement preparedQuery = null; @@ -1160,12 +1135,12 @@ public abstract class AbstractSqlEamDb implements EamDb { * @return List with 0 or more matching eamArtifact instances. */ @Override - public List getArtifactInstancesKnownBad(EamArtifact.Type aType, String value) throws EamDbException { + public List getArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException { Connection conn = connect(); - List artifactInstances = new ArrayList<>(); + List artifactInstances = new ArrayList<>(); - EamArtifactInstance artifactInstance; + CorrelationAttributeInstance artifactInstance; PreparedStatement preparedStatement = null; ResultSet resultSet = null; @@ -1210,7 +1185,7 @@ public abstract class AbstractSqlEamDb implements EamDb { * @return Number of matching eamArtifacts */ @Override - public Long getCountArtifactInstancesKnownBad(EamArtifact.Type aType, String value) throws EamDbException { + public Long getCountArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException { Connection conn = connect(); Long badInstances = 0L; @@ -1254,7 +1229,7 @@ public abstract class AbstractSqlEamDb implements EamDb { * @throws EamDbException */ @Override - public List getListCasesHavingArtifactInstancesKnownBad(EamArtifact.Type aType, String value) throws EamDbException { + public List getListCasesHavingArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException { Connection conn = connect(); Collection caseNames = new LinkedHashSet<>(); @@ -1302,10 +1277,10 @@ public abstract class AbstractSqlEamDb implements EamDb { * @return Global known status of the artifact */ @Override - public boolean isArtifactlKnownBadByReference(EamArtifact.Type aType, String value) throws EamDbException { + public boolean isArtifactlKnownBadByReference(CorrelationAttribute.Type aType, String value) throws EamDbException { // TEMP: Only support file correlation type - if (aType.getId() != EamArtifact.FILES_TYPE_ID) { + if (aType.getId() != CorrelationAttribute.FILES_TYPE_ID) { return false; } @@ -1521,7 +1496,7 @@ public abstract class AbstractSqlEamDb implements EamDb { * @throws EamDbException */ @Override - public void addReferenceInstance(EamGlobalFileInstance eamGlobalFileInstance, EamArtifact.Type correlationType) throws EamDbException { + public void addReferenceInstance(EamGlobalFileInstance eamGlobalFileInstance, CorrelationAttribute.Type correlationType) throws EamDbException { Connection conn = connect(); PreparedStatement preparedStatement = null; @@ -1549,7 +1524,7 @@ public abstract class AbstractSqlEamDb implements EamDb { * @throws EamDbException */ @Override - public void bulkInsertReferenceTypeEntries(Set globalInstances, EamArtifact.Type contentType) throws EamDbException { + public void bulkInsertReferenceTypeEntries(Set globalInstances, CorrelationAttribute.Type contentType) throws EamDbException { Connection conn = connect(); PreparedStatement bulkPs = null; @@ -1596,7 +1571,7 @@ public abstract class AbstractSqlEamDb implements EamDb { * @throws EamDbException */ @Override - public List getReferenceInstancesByTypeValue(EamArtifact.Type aType, String aValue) throws EamDbException { + public List getReferenceInstancesByTypeValue(CorrelationAttribute.Type aType, String aValue) throws EamDbException { Connection conn = connect(); List globalFileInstances = new ArrayList<>(); @@ -1632,7 +1607,7 @@ public abstract class AbstractSqlEamDb implements EamDb { * @throws EamDbException */ @Override - public int newCorrelationType(EamArtifact.Type newType) throws EamDbException { + public int newCorrelationType(CorrelationAttribute.Type newType) throws EamDbException { Connection conn = connect(); PreparedStatement preparedStatement = null; @@ -1673,7 +1648,7 @@ public abstract class AbstractSqlEamDb implements EamDb { resultSet = preparedStatementQuery.executeQuery(); if (resultSet.next()) { - EamArtifact.Type correlationType = getCorrelationTypeFromResultSet(resultSet); + CorrelationAttribute.Type correlationType = getCorrelationTypeFromResultSet(resultSet); typeId = correlationType.getId(); } } catch (SQLException ex) { @@ -1687,20 +1662,12 @@ public abstract class AbstractSqlEamDb implements EamDb { return typeId; } - /** - * Get the list of EamArtifact.Type's that will be used to correlate - * artifacts. - * - * @return List of EamArtifact.Type's. If none are defined in the database, - * the default list will be returned. - * - * @throws EamDbException - */ + @Override - public List getCorrelationTypes() throws EamDbException { + public List getDefinedCorrelationTypes() throws EamDbException { Connection conn = connect(); - List aTypes = new ArrayList<>(); + List aTypes = new ArrayList<>(); PreparedStatement preparedStatement = null; ResultSet resultSet = null; String sql = "SELECT * FROM correlation_types"; @@ -1732,10 +1699,10 @@ public abstract class AbstractSqlEamDb implements EamDb { * @throws EamDbException */ @Override - public List getEnabledCorrelationTypes() throws EamDbException { + public List getEnabledCorrelationTypes() throws EamDbException { Connection conn = connect(); - List aTypes = new ArrayList<>(); + List aTypes = new ArrayList<>(); PreparedStatement preparedStatement = null; ResultSet resultSet = null; String sql = "SELECT * FROM correlation_types WHERE enabled=1"; @@ -1767,10 +1734,10 @@ public abstract class AbstractSqlEamDb implements EamDb { * @throws EamDbException */ @Override - public List getSupportedCorrelationTypes() throws EamDbException { + public List getSupportedCorrelationTypes() throws EamDbException { Connection conn = connect(); - List aTypes = new ArrayList<>(); + List aTypes = new ArrayList<>(); PreparedStatement preparedStatement = null; ResultSet resultSet = null; String sql = "SELECT * FROM correlation_types WHERE supported=1"; @@ -1800,7 +1767,7 @@ public abstract class AbstractSqlEamDb implements EamDb { * @throws EamDbException */ @Override - public void updateCorrelationType(EamArtifact.Type aType) throws EamDbException { + public void updateCorrelationType(CorrelationAttribute.Type aType) throws EamDbException { Connection conn = connect(); PreparedStatement preparedStatement = null; @@ -1834,10 +1801,10 @@ public abstract class AbstractSqlEamDb implements EamDb { * @throws EamDbException */ @Override - public EamArtifact.Type getCorrelationTypeById(int typeId) throws EamDbException { + public CorrelationAttribute.Type getCorrelationTypeById(int typeId) throws EamDbException { Connection conn = connect(); - EamArtifact.Type aType; + CorrelationAttribute.Type aType; PreparedStatement preparedStatement = null; ResultSet resultSet = null; String sql = "SELECT * FROM correlation_types WHERE id=?"; @@ -1899,12 +1866,12 @@ public abstract class AbstractSqlEamDb implements EamDb { return eamCase; } - private EamDataSource getEamDataSourceFromResultSet(ResultSet resultSet) throws SQLException { + private CorrelationDataSource getEamDataSourceFromResultSet(ResultSet resultSet) throws SQLException { if (null == resultSet) { return null; } - EamDataSource eamDataSource = new EamDataSource( + CorrelationDataSource eamDataSource = new CorrelationDataSource( resultSet.getInt("id"), resultSet.getString("device_id"), resultSet.getString("name") @@ -1913,12 +1880,12 @@ public abstract class AbstractSqlEamDb implements EamDb { return eamDataSource; } - private EamArtifact.Type getCorrelationTypeFromResultSet(ResultSet resultSet) throws EamDbException, SQLException { + private CorrelationAttribute.Type getCorrelationTypeFromResultSet(ResultSet resultSet) throws EamDbException, SQLException { if (null == resultSet) { return null; } - EamArtifact.Type eamArtifactType = new EamArtifact.Type( + CorrelationAttribute.Type eamArtifactType = new CorrelationAttribute.Type( resultSet.getInt("id"), resultSet.getString("display_name"), resultSet.getString("db_table_name"), @@ -1939,17 +1906,17 @@ public abstract class AbstractSqlEamDb implements EamDb { * * @throws SQLException when an expected column name is not in the resultSet */ - private EamArtifactInstance getEamArtifactInstanceFromResultSet(ResultSet resultSet) throws SQLException { + private CorrelationAttributeInstance getEamArtifactInstanceFromResultSet(ResultSet resultSet) throws SQLException { if (null == resultSet) { return null; } - EamArtifactInstance eamArtifactInstance = new EamArtifactInstance( + CorrelationAttributeInstance eamArtifactInstance = new CorrelationAttributeInstance( new EamCase(resultSet.getString("case_uid"), resultSet.getString("case_name")), - new EamDataSource(resultSet.getString("device_id"), resultSet.getString("name")), + new CorrelationDataSource(-1, resultSet.getString("device_id"), resultSet.getString("name")), resultSet.getString("file_path"), resultSet.getString("comment"), TskData.FileKnown.valueOf(resultSet.getByte("known_status")), - EamArtifactInstance.GlobalStatus.LOCAL + CorrelationAttributeInstance.GlobalStatus.LOCAL ); return eamArtifactInstance; diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifact.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationAttribute.java similarity index 86% rename from Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifact.java rename to Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationAttribute.java index 7c7a7b0afb..59bb6a200a 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifact.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationAttribute.java @@ -26,17 +26,18 @@ import java.util.regex.Pattern; import org.openide.util.NbBundle.Messages; /** - * - * Used to store info about a specific artifact. + * Represents a type and value pair that can be used for correlation. + * CorrelationAttributeInstances store information about the actual + * occurences of the attribute. */ -public class EamArtifact implements Serializable { +public class CorrelationAttribute implements Serializable { private static final long serialVersionUID = 1L; private String ID; private String correlationValue; private Type correlationType; - private final List artifactInstances; + private final List artifactInstances; // Type ID's for Default Correlation Types public static final int FILES_TYPE_ID = 0; @@ -55,17 +56,17 @@ public class EamArtifact implements Serializable { "CorrelationType.EMAIL.displayName=Email Addresses", "CorrelationType.PHONE.displayName=Phone Numbers", "CorrelationType.USBID.displayName=USB Devices"}) - public static List getDefaultCorrelationTypes() throws EamDbException { - List DEFAULT_CORRELATION_TYPES = new ArrayList<>(); - DEFAULT_CORRELATION_TYPES.add(new EamArtifact.Type(FILES_TYPE_ID, Bundle.CorrelationType_FILES_displayName(), "file", true, true)); // NON-NLS - DEFAULT_CORRELATION_TYPES.add(new EamArtifact.Type(DOMAIN_TYPE_ID, Bundle.CorrelationType_DOMAIN_displayName(), "domain", true, false)); // NON-NLS - DEFAULT_CORRELATION_TYPES.add(new EamArtifact.Type(EMAIL_TYPE_ID, Bundle.CorrelationType_EMAIL_displayName(), "email_address", true, false)); // NON-NLS - DEFAULT_CORRELATION_TYPES.add(new EamArtifact.Type(PHONE_TYPE_ID, Bundle.CorrelationType_PHONE_displayName(), "phone_number", true, false)); // NON-NLS - DEFAULT_CORRELATION_TYPES.add(new EamArtifact.Type(USBID_TYPE_ID, Bundle.CorrelationType_USBID_displayName(), "usb_devices", true, false)); // NON-NLS + public static List getDefaultCorrelationTypes() throws EamDbException { + List DEFAULT_CORRELATION_TYPES = new ArrayList<>(); + DEFAULT_CORRELATION_TYPES.add(new CorrelationAttribute.Type(FILES_TYPE_ID, Bundle.CorrelationType_FILES_displayName(), "file", true, true)); // NON-NLS + DEFAULT_CORRELATION_TYPES.add(new CorrelationAttribute.Type(DOMAIN_TYPE_ID, Bundle.CorrelationType_DOMAIN_displayName(), "domain", true, false)); // NON-NLS + DEFAULT_CORRELATION_TYPES.add(new CorrelationAttribute.Type(EMAIL_TYPE_ID, Bundle.CorrelationType_EMAIL_displayName(), "email_address", true, false)); // NON-NLS + DEFAULT_CORRELATION_TYPES.add(new CorrelationAttribute.Type(PHONE_TYPE_ID, Bundle.CorrelationType_PHONE_displayName(), "phone_number", true, false)); // NON-NLS + DEFAULT_CORRELATION_TYPES.add(new CorrelationAttribute.Type(USBID_TYPE_ID, Bundle.CorrelationType_USBID_displayName(), "usb_devices", true, false)); // NON-NLS return DEFAULT_CORRELATION_TYPES; } - public EamArtifact(Type correlationType, String correlationValue) { + public CorrelationAttribute(Type correlationType, String correlationValue) { this.ID = ""; this.correlationType = correlationType; // Lower-case all values to normalize and improve correlation hits, going forward make sure this makes sense for all correlation types @@ -73,7 +74,7 @@ public class EamArtifact implements Serializable { this.artifactInstances = new ArrayList<>(); } - public Boolean equals(EamArtifact otherArtifact) { + public Boolean equals(CorrelationAttribute otherArtifact) { return ((this.getID().equals(otherArtifact.getID())) && (this.getCorrelationType().equals(otherArtifact.getCorrelationType())) && (this.getCorrelationValue().equals(otherArtifact.getCorrelationValue())) @@ -136,14 +137,14 @@ public class EamArtifact implements Serializable { * @return the List of artifactInstances; empty list of none have been * added. */ - public List getInstances() { + public List getInstances() { return new ArrayList<>(artifactInstances); } /** * @param artifactInstances the List of artifactInstances to set. */ - public void setInstances(List artifactInstances) { + public void setInstances(List artifactInstances) { this.artifactInstances.clear(); if (null != artifactInstances) { this.artifactInstances.addAll(artifactInstances); @@ -153,7 +154,7 @@ public class EamArtifact implements Serializable { /** * @param instance the instance to add */ - public void addInstance(EamArtifactInstance artifactInstance) { + public void addInstance(CorrelationAttributeInstance artifactInstance) { this.artifactInstances.add(artifactInstance); } @@ -214,10 +215,10 @@ public class EamArtifact implements Serializable { public boolean equals(Object that) { if (this == that) { return true; - } else if (!(that instanceof EamArtifact.Type)) { + } else if (!(that instanceof CorrelationAttribute.Type)) { return false; } else { - return ((EamArtifact.Type) that).sameType(this); + return ((CorrelationAttribute.Type) that).sameType(this); } } @@ -229,7 +230,7 @@ public class EamArtifact implements Serializable { * * @return true if it is the same type */ - private boolean sameType(EamArtifact.Type that) { + private boolean sameType(CorrelationAttribute.Type that) { return this.id == that.getId() && Objects.equals(this.supported, that.isSupported()) && Objects.equals(this.enabled, that.isEnabled()); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactInstance.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationAttributeInstance.java similarity index 87% rename from Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactInstance.java rename to Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationAttributeInstance.java index 4e73c7562b..e6f2aab4b2 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactInstance.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationAttributeInstance.java @@ -24,7 +24,8 @@ import org.sleuthkit.datamodel.TskData; /** * - * Used to store info about a specific Artifact Instance. + * Used to store details about a specific instance of a + * CorrelationAttribute. Includes its data source, path, etc. * */ @Messages({"EamArtifactInstances.globalStatus.local=Local", @@ -32,7 +33,7 @@ import org.sleuthkit.datamodel.TskData; "EamArtifactInstances.knownStatus.bad=Bad", "EamArtifactInstances.knownStatus.known=Known", "EamArtifactInstances.knownStatus.unknown=Unknown"}) -public class EamArtifactInstance implements Serializable { +public class CorrelationAttributeInstance implements Serializable { public enum GlobalStatus { LOCAL(Bundle.EamArtifactInstances_globalStatus_local()), @@ -54,39 +55,39 @@ public class EamArtifactInstance implements Serializable { private String ID; private EamCase eamCase; - private EamDataSource eamDataSource; + private CorrelationDataSource eamDataSource; private String filePath; private String comment; private TskData.FileKnown knownStatus; private GlobalStatus globalStatus; - public EamArtifactInstance( + public CorrelationAttributeInstance( EamCase eamCase, - EamDataSource eamDataSource + CorrelationDataSource eamDataSource ) { this("", eamCase, eamDataSource, "", null, TskData.FileKnown.UNKNOWN, GlobalStatus.LOCAL); } - public EamArtifactInstance( + public CorrelationAttributeInstance( EamCase eamCase, - EamDataSource eamDataSource, + CorrelationDataSource eamDataSource, String filePath ) { this("", eamCase, eamDataSource, filePath, null, TskData.FileKnown.UNKNOWN, GlobalStatus.LOCAL); } - public EamArtifactInstance( + public CorrelationAttributeInstance( EamCase eamCase, - EamDataSource eamDataSource, + CorrelationDataSource eamDataSource, String filePath, String comment ) { this("", eamCase, eamDataSource, filePath, comment, TskData.FileKnown.UNKNOWN, GlobalStatus.LOCAL); } - public EamArtifactInstance( + public CorrelationAttributeInstance( EamCase eamCase, - EamDataSource eamDataSource, + CorrelationDataSource eamDataSource, String filePath, String comment, TskData.FileKnown knownStatus, @@ -95,10 +96,10 @@ public class EamArtifactInstance implements Serializable { this("", eamCase, eamDataSource, filePath, comment, knownStatus, globalStatus); } - public EamArtifactInstance( + public CorrelationAttributeInstance( String ID, EamCase eamCase, - EamDataSource eamDataSource, + CorrelationDataSource eamDataSource, String filePath, String comment, TskData.FileKnown knownStatus, @@ -114,7 +115,7 @@ public class EamArtifactInstance implements Serializable { this.globalStatus = globalStatus; } - public Boolean equals(EamArtifactInstance otherInstance) { + public Boolean equals(CorrelationAttributeInstance otherInstance) { return ((this.getID().equals(otherInstance.getID())) && (this.getEamCase().equals(otherInstance.getEamCase())) && (this.getEamDataSource().equals(otherInstance.getEamDataSource())) @@ -166,14 +167,14 @@ public class EamArtifactInstance implements Serializable { /** * @return the eamDataSource */ - public EamDataSource getEamDataSource() { + public CorrelationDataSource getEamDataSource() { return eamDataSource; } /** * @param eamDataSource the eamDataSource to set */ - public void setEamDataSource(EamDataSource eamDataSource) { + public void setEamDataSource(CorrelationDataSource eamDataSource) { this.eamDataSource = eamDataSource; } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationDataSource.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationDataSource.java new file mode 100755 index 0000000000..9b7480bee7 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationDataSource.java @@ -0,0 +1,103 @@ +/* + * Central Repository + * + * Copyright 2015-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.centralrepository.datamodel; + +import java.io.Serializable; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.datamodel.Content; +import org.sleuthkit.datamodel.TskCoreException; +import org.sleuthkit.datamodel.TskDataException; + +/** + * + * Stores information about a Data Source in the correlation engine + * + */ +public class CorrelationDataSource implements Serializable { + + private static final long serialVersionUID = 1L; + + private final int dataSourceId; //< Id in the central repo + private final String deviceID; + private final String name; + + + CorrelationDataSource(int dataSourceId, + String deviceID, + String name) { + this.dataSourceId = dataSourceId; + this.deviceID = deviceID; + this.name = name; + } + + /** + * Create a CorrelationDataSource object from a TSK Content object. + * + * @param dataSource + * @return + * @throws EamDbException + */ + public static CorrelationDataSource fromTSKDataSource(Content dataSource) throws EamDbException { + Case curCase; + try { + curCase = Case.getCurrentCase(); + } catch (IllegalStateException ex) { + throw new EamDbException("Autopsy case is closed"); + } + String deviceId; + try { + deviceId = curCase.getSleuthkitCase().getDataSource(dataSource.getId()).getDeviceId(); + } catch (TskDataException | TskCoreException ex) { + throw new EamDbException("Error getting data source info: " + ex.getMessage()); + } + return new CorrelationDataSource(-1, deviceId, dataSource.getName()); + } + + @Override + public String toString() { + StringBuilder str = new StringBuilder(); + str.append("("); + str.append("ID=").append(Integer.toString(getDataSourceID())); + str.append(",deviceID=").append(getDeviceID()); + str.append(",name=").append(getName()); + str.append(")"); + return str.toString(); + } + + /** + * @return the ID + */ + public int getDataSourceID() { + return dataSourceId; + } + + /** + * @return the deviceID + */ + public String getDeviceID() { + return deviceID; + } + + /** + * @return the name + */ + public String getName() { + return name; + } +} diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactUtil.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactUtil.java index c8bfdddad7..11523150a3 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactUtil.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamArtifactUtil.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.centralrepository.datamodel; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; +import org.openide.util.Exceptions; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; @@ -55,53 +56,65 @@ public class EamArtifactUtil { * null. * * @param bbArtifact BlackboardArtifact to examine + * @param addInstanceDetails If true, add instance details from bbArtifact into the returned structure + * @param checkEnabled If true, only create a CorrelationAttribute if it is enabled + * @return List of EamArtifacts */ - public static List fromBlackboardArtifact(BlackboardArtifact bbArtifact, - boolean includeInstances, - List artifactTypes, - boolean checkEnabled) { + public static List getCorrelationAttributeFromBlackboardArtifact(BlackboardArtifact bbArtifact, + boolean addInstanceDetails, boolean checkEnabled) { + + List eamArtifacts = new ArrayList<>(); - List eamArtifacts = new ArrayList<>(); - - for (EamArtifact.Type aType : artifactTypes) { - if ((checkEnabled && aType.isEnabled()) || !checkEnabled) { - EamArtifact eamArtifact = getTypeFromBlackboardArtifact(aType, bbArtifact); - if (eamArtifact != null) { - eamArtifacts.add(eamArtifact); + try { + // Cycle through the types and see if there is a correlation attribute that works + // for the given blackboard artifact + // + // @@@ This seems ineffecient. Instead of cycling based on correlation type, we should just + // have switch based on artifact type + for (CorrelationAttribute.Type aType : EamDb.getInstance().getDefinedCorrelationTypes()) { + if ((checkEnabled && aType.isEnabled()) || !checkEnabled) { + CorrelationAttribute eamArtifact = EamArtifactUtil.getCorrelationAttributeFromBlackboardArtifact(aType, bbArtifact); + if (eamArtifact != null) { + eamArtifacts.add(eamArtifact); + } } } + } catch (EamDbException ex) { + LOGGER.log(Level.SEVERE, "Error getting defined correlation types.", ex); // NON-NLS + return eamArtifacts; } - if (!eamArtifacts.isEmpty() && includeInstances) { + // if they asked for it, add the instance details associated with this occurance. + if (!eamArtifacts.isEmpty() && addInstanceDetails) { try { - AbstractFile af = Case.getCurrentCase().getSleuthkitCase().getAbstractFileById(bbArtifact.getObjectID()); - if (null == af) { - return null; + Case currentCase = Case.getCurrentCase(); + AbstractFile bbSourceFile = currentCase.getSleuthkitCase().getAbstractFileById(bbArtifact.getObjectID()); + if (null == bbSourceFile) { + //@@@ Log this + return eamArtifacts; } - String deviceId = ""; - try { - deviceId = Case.getCurrentCase().getSleuthkitCase().getDataSource(af.getDataSource().getId()).getDeviceId(); - } catch (TskCoreException | TskDataException ex) { - LOGGER.log(Level.SEVERE, "Error, failed to get deviceID or data source from current case.", ex); - } - - EamArtifactInstance eamInstance = new EamArtifactInstance( - new EamCase(Case.getCurrentCase().getName(), Case.getCurrentCase().getDisplayName()), - new EamDataSource(deviceId, af.getDataSource().getName()), - af.getParentPath() + af.getName(), + // make an instance for the BB source file + CorrelationAttributeInstance eamInstance = new CorrelationAttributeInstance( + new EamCase(currentCase.getName(), currentCase.getDisplayName()), + CorrelationDataSource.fromTSKDataSource(bbSourceFile.getDataSource()), + bbSourceFile.getParentPath() + bbSourceFile.getName(), "", TskData.FileKnown.UNKNOWN, - EamArtifactInstance.GlobalStatus.LOCAL + CorrelationAttributeInstance.GlobalStatus.LOCAL ); - for (EamArtifact eamArtifact : eamArtifacts) { + // add the instance details + for (CorrelationAttribute eamArtifact : eamArtifacts) { eamArtifact.addInstance(eamInstance); } - } catch (TskCoreException ex) { + } catch (TskCoreException | EamDbException ex) { LOGGER.log(Level.SEVERE, "Error creating artifact instance.", ex); // NON-NLS - return null; + return eamArtifacts; + } catch (IllegalStateException ex) { + LOGGER.log(Level.SEVERE, "Case is closed.", ex); // NON-NLS + return eamArtifacts; } } @@ -109,16 +122,16 @@ public class EamArtifactUtil { } /** - * Convert a blackboard artifact to an EamArtifact. - * Returns null if the converted artifact does not contain valid - * correlation data. + * Create an EamArtifact of type correlationType if one can be generated + * based on the data in the blackboard artifact. * - * @param aType The Central Repository artifact type to create - * @param bbArtifact The blackboard artifact to convert + * @param correlationType The Central Repository artifact type to create + * @param bbArtifact The blackboard artifact to pull data from * - * @return the new EamArtifact, or null if one was not created + * @return the new EamArtifact, or null if one was not created because bbArtifact + * did not contain the needed data */ - public static EamArtifact getTypeFromBlackboardArtifact(EamArtifact.Type aType, BlackboardArtifact bbArtifact) { + private static CorrelationAttribute getCorrelationAttributeFromBlackboardArtifact(CorrelationAttribute.Type correlationType, BlackboardArtifact bbArtifact) { String value = null; int artifactTypeID = bbArtifact.getArtifactTypeID(); @@ -128,10 +141,10 @@ public class EamArtifactUtil { BlackboardAttribute attribute = bbArtifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT)); if (attribute != null) { BlackboardArtifact associatedArtifact = Case.getCurrentCase().getSleuthkitCase().getBlackboardArtifact(attribute.getValueLong()); - return getTypeFromBlackboardArtifact(aType, associatedArtifact); + return EamArtifactUtil.getCorrelationAttributeFromBlackboardArtifact(correlationType, associatedArtifact); } - } else if (aType.getId() == EamArtifact.EMAIL_TYPE_ID + } else if (correlationType.getId() == CorrelationAttribute.EMAIL_TYPE_ID && BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() == artifactTypeID) { BlackboardAttribute setNameAttr = bbArtifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME)); @@ -139,7 +152,7 @@ public class EamArtifactUtil { && EamArtifactUtil.getEmailAddressAttrString().equals(setNameAttr.getValueString())) { value = bbArtifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD)).getValueString(); } - } else if (aType.getId() == EamArtifact.DOMAIN_TYPE_ID + } else if (correlationType.getId() == CorrelationAttribute.DOMAIN_TYPE_ID && (BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID() == artifactTypeID || BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID() == artifactTypeID || BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID() == artifactTypeID @@ -147,7 +160,7 @@ public class EamArtifactUtil { // Lower-case this to normalize domains value = bbArtifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN)).getValueString(); - } else if (aType.getId() == EamArtifact.PHONE_TYPE_ID + } else if (correlationType.getId() == CorrelationAttribute.PHONE_TYPE_ID && (BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT.getTypeID() == artifactTypeID || BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG.getTypeID() == artifactTypeID || BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE.getTypeID() == artifactTypeID)) { @@ -176,7 +189,7 @@ public class EamArtifactUtil { } } - } else if (aType.getId() == EamArtifact.USBID_TYPE_ID + } else if (correlationType.getId() == CorrelationAttribute.USBID_TYPE_ID && BlackboardArtifact.ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID() == artifactTypeID) { value = bbArtifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_ID)).getValueString(); @@ -188,7 +201,7 @@ public class EamArtifactUtil { } if (null != value) { - return new EamArtifact(aType, value); + return new CorrelationAttribute(correlationType, value); } else { return null; } @@ -204,7 +217,7 @@ public class EamArtifactUtil { * @param comment The comment for the new artifact (generally used for a tag comment) * @return The new EamArtifact or null if creation failed */ - public static EamArtifact getEamArtifactFromContent(Content content, TskData.FileKnown knownStatus, String comment){ + public static CorrelationAttribute getEamArtifactFromContent(Content content, TskData.FileKnown knownStatus, String comment){ if(! (content instanceof AbstractFile)){ return null; @@ -220,45 +233,29 @@ public class EamArtifactUtil { || (!af.isMetaFlagSet(TskData.TSK_FS_META_FLAG_ENUM.ALLOC))) { return null; } - - String dsName; - try { - dsName = af.getDataSource().getName(); - } catch (TskCoreException ex) { - LOGGER.log(Level.SEVERE, "Error, unable to get name of data source from abstract file.", ex); - return null; - } // We need a hash to make the artifact String md5 = af.getMd5Hash(); if (md5 == null || md5.isEmpty()) { return null; } - - String deviceId; - try { - deviceId = Case.getCurrentCase().getSleuthkitCase().getDataSource(af.getDataSource().getId()).getDeviceId(); - } catch (TskCoreException | TskDataException ex) { - LOGGER.log(Level.SEVERE, "Error, failed to get deviceID or data source from current case.", ex); - return null; - } - EamArtifact eamArtifact; + CorrelationAttribute eamArtifact; try { - EamArtifact.Type filesType = EamDb.getInstance().getCorrelationTypeById(EamArtifact.FILES_TYPE_ID); - eamArtifact = new EamArtifact(filesType, af.getMd5Hash()); - EamArtifactInstance cei = new EamArtifactInstance( + CorrelationAttribute.Type filesType = EamDb.getInstance().getCorrelationTypeById(CorrelationAttribute.FILES_TYPE_ID); + eamArtifact = new CorrelationAttribute(filesType, af.getMd5Hash()); + CorrelationAttributeInstance cei = new CorrelationAttributeInstance( new EamCase(Case.getCurrentCase().getName(), Case.getCurrentCase().getDisplayName()), - new EamDataSource(deviceId, dsName), + CorrelationDataSource.fromTSKDataSource(af.getDataSource()), af.getParentPath() + af.getName(), comment, TskData.FileKnown.BAD, - EamArtifactInstance.GlobalStatus.LOCAL + CorrelationAttributeInstance.GlobalStatus.LOCAL ); eamArtifact.addInstance(cei); return eamArtifact; - } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Error, unable to get FILES correlation type.", ex); + } catch (TskCoreException | EamDbException ex) { + LOGGER.log(Level.SEVERE, "Error making correlation attribute.", ex); return null; } } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDataSource.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDataSource.java deleted file mode 100755 index cde6536e62..0000000000 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDataSource.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Central Repository - * - * Copyright 2015-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.centralrepository.datamodel; - -import java.io.Serializable; - -/** - * - * Used to store info about a case. - * - */ -public class EamDataSource implements Serializable { - - private static long serialVersionUID = 1L; - - private int ID; - private String deviceID; - private String name; - - public EamDataSource(String deviceID, String name) { - this(-1, deviceID, name); - } - - public EamDataSource(int ID, - String deviceID, - String name) { - this.ID = ID; - this.deviceID = deviceID; - this.name = name; - } - - @Override - public String toString() { - StringBuilder str = new StringBuilder(); - str.append("("); - str.append("ID=").append(Integer.toString(getID())); - str.append(",deviceID=").append(getDeviceID()); - str.append(",name=").append(getName()); - str.append(")"); - return str.toString(); - } - - /** - * @return the ID - */ - public int getID() { - return ID; - } - - /** - * @param ID the ID to set - */ - public void setID(int ID) { - this.ID = ID; - } - - /** - * @return the deviceID - */ - public String getDeviceID() { - return deviceID; - } - - /** - * @param deviceID the deviceID to set - */ - public void setDeviceID(String deviceID) { - this.deviceID = deviceID; - } - - /** - * @return the name - */ - public String getName() { - return name; - } - - /** - * @param name the name to set - */ - public void setName(String name) { - this.name = name; - } - -} diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java index fff8bbf540..d3addef488 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java @@ -184,14 +184,14 @@ public interface EamDb { * * @param eamDataSource the data source to add */ - void newDataSource(EamDataSource eamDataSource) throws EamDbException; + void newDataSource(CorrelationDataSource eamDataSource) throws EamDbException; /** * Updates a Data Source in the database * * @param eamDataSource the data source to update */ - void updateDataSource(EamDataSource eamDataSource) throws EamDbException; + void updateDataSource(CorrelationDataSource eamDataSource) throws EamDbException; /** * Retrieves Data Source details based on data source device ID @@ -200,14 +200,14 @@ public interface EamDb { * * @return The data source */ - EamDataSource getDataSourceDetails(String dataSourceDeviceId) throws EamDbException; + CorrelationDataSource getDataSourceDetails(String dataSourceDeviceId) throws EamDbException; /** * Retrieves data sources that are in DB * * @return List of data sources */ - List getDataSources() throws EamDbException; + List getDataSources() throws EamDbException; /** * Inserts new Artifact(s) into the database. Should add associated Case and @@ -215,7 +215,7 @@ public interface EamDb { * * @param eamArtifact The artifact to add */ - void addArtifact(EamArtifact eamArtifact) throws EamDbException; + void addArtifact(CorrelationAttribute eamArtifact) throws EamDbException; /** * Retrieves eamArtifact instances from the database that are associated @@ -226,7 +226,7 @@ public interface EamDb { * * @return List of artifact instances for a given type/value */ - List getArtifactInstancesByTypeValue(EamArtifact.Type aType, String value) throws EamDbException; + List getArtifactInstancesByTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException; /** * Retrieves eamArtifact instances from the database that are associated @@ -239,7 +239,7 @@ public interface EamDb { * * @throws EamDbException */ - List getArtifactInstancesByPath(EamArtifact.Type aType, String filePath) throws EamDbException; + List getArtifactInstancesByPath(CorrelationAttribute.Type aType, String filePath) throws EamDbException; /** * Retrieves number of artifact instances in the database that are @@ -251,20 +251,16 @@ public interface EamDb { * @return Number of artifact instances having ArtifactType and * ArtifactValue. */ - Long getCountArtifactInstancesByTypeValue(EamArtifact.Type aType, String value) throws EamDbException; + Long getCountArtifactInstancesByTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException; /** - * Using the ArtifactType and ArtifactValue from the given eamArtfact, - * compute the ratio of: (The number of unique case_id/datasource_id tuples - * where Type/Value is found) divided by (The total number of unique - * case_id/datasource_id tuples in the database) expressed as a percentage. + * Calculate the percentage of data sources that have this attribute value. * - * @param aType EamArtifact.Type to search for - * @param value Value to search for + * @param corAttr Attribute type and value to get data about * * @return Int between 0 and 100 */ - int getCommonalityPercentageForTypeValue(EamArtifact.Type aType, String value) throws EamDbException; + int getFrequencyPercentage(CorrelationAttribute corAttr) throws EamDbException; /** * Retrieves number of unique caseDisplayName / dataSource tuples in the @@ -276,15 +272,14 @@ public interface EamDb { * * @return Number of unique tuples */ - Long getCountUniqueCaseDataSourceTuplesHavingTypeValue(EamArtifact.Type aType, String value) throws EamDbException; + Long getCountUniqueCaseDataSourceTuplesHavingTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException; /** - * Retrieves number of unique caseDisplayName/dataSource tuples in the - * database. + * Retrieves number of data sources in the database. * - * @return Number of unique tuples + * @return Number of unique data sources */ - Long getCountUniqueCaseDataSourceTuples() throws EamDbException; + Long getCountUniqueDataSources() throws EamDbException; /** * Retrieves number of eamArtifact instances in the database that are @@ -306,7 +301,7 @@ public interface EamDb { * * @param eamArtifact The artifact to add */ - void prepareBulkArtifact(EamArtifact eamArtifact) throws EamDbException; + void prepareBulkArtifact(CorrelationAttribute eamArtifact) throws EamDbException; /** * Executes a bulk insert of the eamArtifacts added from the @@ -326,7 +321,7 @@ public interface EamDb { * @param eamArtifact Artifact containing exactly one (1) ArtifactInstance. * @param FileKnown The status to change the artifact to */ - void setArtifactInstanceKnownStatus(EamArtifact eamArtifact, TskData.FileKnown knownStatus) throws EamDbException; + void setArtifactInstanceKnownStatus(CorrelationAttribute eamArtifact, TskData.FileKnown knownStatus) throws EamDbException; /** * Gets list of matching eamArtifact instances that have knownStatus = @@ -337,7 +332,7 @@ public interface EamDb { * * @return List with 0 or more matching eamArtifact instances. */ - List getArtifactInstancesKnownBad(EamArtifact.Type aType, String value) throws EamDbException; + List getArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException; /** * Count matching eamArtifacts instances that have knownStatus = "Bad". @@ -347,7 +342,7 @@ public interface EamDb { * * @return Number of matching eamArtifacts */ - Long getCountArtifactInstancesKnownBad(EamArtifact.Type aType, String value) throws EamDbException; + Long getCountArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException; /** * Gets list of distinct case display names, where each case has 1+ Artifact @@ -361,7 +356,7 @@ public interface EamDb { * * @throws EamDbException */ - List getListCasesHavingArtifactInstancesKnownBad(EamArtifact.Type aType, String value) throws EamDbException; + List getListCasesHavingArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException; /** * Is the artifact known as bad according to the reference entries? @@ -371,7 +366,7 @@ public interface EamDb { * * @return Global known status of the artifact */ - boolean isArtifactlKnownBadByReference(EamArtifact.Type aType, String value) throws EamDbException; + boolean isArtifactlKnownBadByReference(CorrelationAttribute.Type aType, String value) throws EamDbException; /** * Add a new organization @@ -433,7 +428,7 @@ public interface EamDb { * * @throws EamDbException */ - void addReferenceInstance(EamGlobalFileInstance eamGlobalFileInstance, EamArtifact.Type correlationType) throws EamDbException; + void addReferenceInstance(EamGlobalFileInstance eamGlobalFileInstance, CorrelationAttribute.Type correlationType) throws EamDbException; /** * Add a new global file instance to the bulk collection @@ -452,7 +447,7 @@ public interface EamDb { * * @throws EamDbException */ - void bulkInsertReferenceTypeEntries(Set globalInstances, EamArtifact.Type contentType) throws EamDbException; + void bulkInsertReferenceTypeEntries(Set globalInstances, CorrelationAttribute.Type contentType) throws EamDbException; /** * Get all reference entries having a given correlation type and value @@ -464,7 +459,7 @@ public interface EamDb { * * @throws EamDbException */ - List getReferenceInstancesByTypeValue(EamArtifact.Type aType, String aValue) throws EamDbException; + List getReferenceInstancesByTypeValue(CorrelationAttribute.Type aType, String aValue) throws EamDbException; /** * Add a new EamArtifact.Type to the db. @@ -475,18 +470,18 @@ public interface EamDb { * * @throws EamDbException */ - public int newCorrelationType(EamArtifact.Type newType) throws EamDbException; + public int newCorrelationType(CorrelationAttribute.Type newType) throws EamDbException; /** - * Get the list of EamArtifact.Type's that will be used to correlate - * artifacts. + * Get the list of EamArtifact.Type's that are defined in the DB and can be + * used to correlate artifacts. * * @return List of EamArtifact.Type's. If none are defined in the database, * the default list will be returned. * * @throws EamDbException */ - public List getCorrelationTypes() throws EamDbException; + public List getDefinedCorrelationTypes() throws EamDbException; /** * Get the list of enabled EamArtifact.Type's that will be used to correlate @@ -497,7 +492,7 @@ public interface EamDb { * * @throws EamDbException */ - public List getEnabledCorrelationTypes() throws EamDbException; + public List getEnabledCorrelationTypes() throws EamDbException; /** * Get the list of supported EamArtifact.Type's that can be used to @@ -508,7 +503,7 @@ public interface EamDb { * * @throws EamDbException */ - public List getSupportedCorrelationTypes() throws EamDbException; + public List getSupportedCorrelationTypes() throws EamDbException; /** * Update a EamArtifact.Type. @@ -517,7 +512,7 @@ public interface EamDb { * * @throws EamDbException */ - public void updateCorrelationType(EamArtifact.Type aType) throws EamDbException; + public void updateCorrelationType(CorrelationAttribute.Type aType) throws EamDbException; /** * Get the EamArtifact.Type that has the given Type.Id. @@ -528,5 +523,5 @@ public interface EamDb { * * @throws EamDbException */ - public EamArtifact.Type getCorrelationTypeById(int typeId) throws EamDbException; + public CorrelationAttribute.Type getCorrelationTypeById(int typeId) throws EamDbException; } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbUtil.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbUtil.java index 489f4cb12e..6faa649a34 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbUtil.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDbUtil.java @@ -88,9 +88,9 @@ public class EamDbUtil { String sql = "INSERT INTO correlation_types(id, display_name, db_table_name, supported, enabled) VALUES (?, ?, ?, ?, ?)"; try { - List DEFAULT_CORRELATION_TYPES = EamArtifact.getDefaultCorrelationTypes(); + List DEFAULT_CORRELATION_TYPES = CorrelationAttribute.getDefaultCorrelationTypes(); preparedStatement = conn.prepareStatement(sql); - for (EamArtifact.Type newType : DEFAULT_CORRELATION_TYPES) { + for (CorrelationAttribute.Type newType : DEFAULT_CORRELATION_TYPES) { preparedStatement.setInt(1, newType.getId()); preparedStatement.setString(2, newType.getDisplayName()); preparedStatement.setString(3, newType.getDbTableName()); @@ -217,7 +217,7 @@ public class EamDbUtil { * * @return Instance table name for this Type. */ - public static String correlationTypeToInstanceTableName(EamArtifact.Type type) { + public static String correlationTypeToInstanceTableName(CorrelationAttribute.Type type) { return type.getDbTableName() + "_instances"; } @@ -228,7 +228,7 @@ public class EamDbUtil { * * @return Reference table name for this Type. */ - public static String correlationTypeToReferenceTableName(EamArtifact.Type type) { + public static String correlationTypeToReferenceTableName(CorrelationAttribute.Type type) { return "reference_" + type.getDbTableName(); } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDb.java index 208ded1998..cecba78f4e 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDb.java @@ -112,10 +112,10 @@ public class PostgresEamDb extends AbstractSqlEamDb { String instancesTemplate = "TRUNCATE TABLE %s_instances RESTART IDENTITY CASCADE"; String referencesTemplate = "TRUNCATE TABLE reference_%s RESTART IDENTITY CASCADE"; - for (EamArtifact.Type type : DEFAULT_CORRELATION_TYPES) { + for (CorrelationAttribute.Type type : DEFAULT_CORRELATION_TYPES) { dropContent.executeUpdate(String.format(instancesTemplate, type.getDbTableName())); // FUTURE: support other reference types - if (type.getId() == EamArtifact.FILES_TYPE_ID) { + if (type.getId() == CorrelationAttribute.FILES_TYPE_ID) { dropContent.executeUpdate(String.format(referencesTemplate, type.getDbTableName())); } } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java index 81a1aadd5e..6856b407f6 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java @@ -455,11 +455,11 @@ public final class PostgresEamDbSettings { stmt.execute(createDbInfoTable.toString()); // Create a separate instance and reference table for each correlation type - List DEFAULT_CORRELATION_TYPES = EamArtifact.getDefaultCorrelationTypes(); + List DEFAULT_CORRELATION_TYPES = CorrelationAttribute.getDefaultCorrelationTypes(); String reference_type_dbname; String instance_type_dbname; - for (EamArtifact.Type type : DEFAULT_CORRELATION_TYPES) { + for (CorrelationAttribute.Type type : DEFAULT_CORRELATION_TYPES) { reference_type_dbname = EamDbUtil.correlationTypeToReferenceTableName(type); instance_type_dbname = EamDbUtil.correlationTypeToInstanceTableName(type); @@ -470,7 +470,7 @@ public final class PostgresEamDbSettings { stmt.execute(String.format(instancesIdx4, instance_type_dbname, instance_type_dbname)); // FUTURE: allow more than the FILES type - if (type.getId() == EamArtifact.FILES_TYPE_ID) { + if (type.getId() == CorrelationAttribute.FILES_TYPE_ID) { stmt.execute(String.format(createReferenceTypesTableTemplate.toString(), reference_type_dbname, reference_type_dbname)); stmt.execute(String.format(referenceTypesIdx1, reference_type_dbname, reference_type_dbname)); stmt.execute(String.format(referenceTypesIdx2, reference_type_dbname, reference_type_dbname)); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java index 1e1bc7227e..536fe5e5aa 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java @@ -123,10 +123,10 @@ public class SqliteEamDb extends AbstractSqlEamDb { String instancesTemplate = "DELETE FROM %s_instances"; String referencesTemplate = "DELETE FROM global_files"; - for (EamArtifact.Type type : DEFAULT_CORRELATION_TYPES) { + for (CorrelationAttribute.Type type : DEFAULT_CORRELATION_TYPES) { dropContent.executeUpdate(String.format(instancesTemplate, type.getDbTableName())); // FUTURE: support other reference types - if (type.getId() == EamArtifact.FILES_TYPE_ID) { + if (type.getId() == CorrelationAttribute.FILES_TYPE_ID) { dropContent.executeUpdate(String.format(referencesTemplate, type.getDbTableName())); } } @@ -350,7 +350,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @param eamDataSource the data source to add */ @Override - public void newDataSource(EamDataSource eamDataSource) throws EamDbException { + public void newDataSource(CorrelationDataSource eamDataSource) throws EamDbException { try{ acquireExclusiveLock(); super.newDataSource(eamDataSource); @@ -365,7 +365,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @param eamDataSource the data source to update */ @Override - public void updateDataSource(EamDataSource eamDataSource) throws EamDbException { + public void updateDataSource(CorrelationDataSource eamDataSource) throws EamDbException { try{ acquireExclusiveLock(); super.updateDataSource(eamDataSource); @@ -382,7 +382,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @return The data source */ @Override - public EamDataSource getDataSourceDetails(String dataSourceDeviceId) throws EamDbException { + public CorrelationDataSource getDataSourceDetails(String dataSourceDeviceId) throws EamDbException { try{ acquireSharedLock(); return super.getDataSourceDetails(dataSourceDeviceId); @@ -397,7 +397,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @return list of data sources in the DB */ @Override - public List getDataSources() throws EamDbException { + public List getDataSources() throws EamDbException { try{ acquireSharedLock(); return super.getDataSources(); @@ -413,7 +413,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @param eamArtifact The artifact to add */ @Override - public void addArtifact(EamArtifact eamArtifact) throws EamDbException { + public void addArtifact(CorrelationAttribute eamArtifact) throws EamDbException { try{ acquireExclusiveLock(); super.addArtifact(eamArtifact); @@ -431,7 +431,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @return List of artifact instances for a given type/value */ @Override - public List getArtifactInstancesByTypeValue(EamArtifact.Type aType, String value) throws EamDbException { + public List getArtifactInstancesByTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException { try{ acquireSharedLock(); return super.getArtifactInstancesByTypeValue(aType, value); @@ -452,7 +452,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @throws EamDbException */ @Override - public List getArtifactInstancesByPath(EamArtifact.Type aType, String filePath) throws EamDbException { + public List getArtifactInstancesByPath(CorrelationAttribute.Type aType, String filePath) throws EamDbException { try{ acquireSharedLock(); return super.getArtifactInstancesByPath(aType, filePath); @@ -472,7 +472,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * ArtifactValue. */ @Override - public Long getCountArtifactInstancesByTypeValue(EamArtifact.Type aType, String value) throws EamDbException { + public Long getCountArtifactInstancesByTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException { try{ acquireSharedLock(); return super.getCountArtifactInstancesByTypeValue(aType, value); @@ -481,22 +481,11 @@ public class SqliteEamDb extends AbstractSqlEamDb { } } - /** - * Using the ArtifactType and ArtifactValue from the given eamArtfact, - * compute the ratio of: (The number of unique case_id/datasource_id tuples - * where Type/Value is found) divided by (The total number of unique - * case_id/datasource_id tuples in the database) expressed as a percentage. - * - * @param eamArtifact Artifact with artifactType and artifactValue to search - * for - * - * @return Int between 0 and 100 - */ @Override - public int getCommonalityPercentageForTypeValue(EamArtifact.Type aType, String value) throws EamDbException { + public int getFrequencyPercentage(CorrelationAttribute corAttr) throws EamDbException { try{ acquireSharedLock(); - return super.getCommonalityPercentageForTypeValue(aType, value); + return super.getFrequencyPercentage(corAttr); } finally { releaseSharedLock(); } @@ -513,7 +502,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @return Number of unique tuples */ @Override - public Long getCountUniqueCaseDataSourceTuplesHavingTypeValue(EamArtifact.Type aType, String value) throws EamDbException { + public Long getCountUniqueCaseDataSourceTuplesHavingTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException { try{ acquireSharedLock(); return super.getCountUniqueCaseDataSourceTuplesHavingTypeValue(aType, value); @@ -522,17 +511,12 @@ public class SqliteEamDb extends AbstractSqlEamDb { } } - /** - * Retrieves number of unique caseDisplayName/dataSource tuples in the - * database. - * - * @return Number of unique tuples - */ + @Override - public Long getCountUniqueCaseDataSourceTuples() throws EamDbException { + public Long getCountUniqueDataSources() throws EamDbException { try{ acquireSharedLock(); - return super.getCountUniqueCaseDataSourceTuples(); + return super.getCountUniqueDataSources(); } finally { releaseSharedLock(); } @@ -593,7 +577,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @param eamArtifact Artifact containing exactly one (1) ArtifactInstance. */ @Override - public void setArtifactInstanceKnownStatus(EamArtifact eamArtifact, TskData.FileKnown knownStatus) throws EamDbException { + public void setArtifactInstanceKnownStatus(CorrelationAttribute eamArtifact, TskData.FileKnown knownStatus) throws EamDbException { try{ acquireExclusiveLock(); super.setArtifactInstanceKnownStatus(eamArtifact, knownStatus); @@ -612,7 +596,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @return List with 0 or more matching eamArtifact instances. */ @Override - public List getArtifactInstancesKnownBad(EamArtifact.Type aType, String value) throws EamDbException { + public List getArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException { try{ acquireSharedLock(); return super.getArtifactInstancesKnownBad(aType, value); @@ -630,7 +614,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @return Number of matching eamArtifacts */ @Override - public Long getCountArtifactInstancesKnownBad(EamArtifact.Type aType, String value) throws EamDbException { + public Long getCountArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException { try{ acquireSharedLock(); return super.getCountArtifactInstancesKnownBad(aType, value); @@ -652,7 +636,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @throws EamDbException */ @Override - public List getListCasesHavingArtifactInstancesKnownBad(EamArtifact.Type aType, String value) throws EamDbException { + public List getListCasesHavingArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException { try{ acquireSharedLock(); return super.getListCasesHavingArtifactInstancesKnownBad(aType, value); @@ -670,7 +654,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @return Global known status of the artifact */ @Override - public boolean isArtifactlKnownBadByReference(EamArtifact.Type aType, String value) throws EamDbException { + public boolean isArtifactlKnownBadByReference(CorrelationAttribute.Type aType, String value) throws EamDbException { try{ acquireSharedLock(); return super.isArtifactlKnownBadByReference(aType, value); @@ -780,7 +764,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @throws EamDbException */ @Override - public void addReferenceInstance(EamGlobalFileInstance eamGlobalFileInstance, EamArtifact.Type correlationType) throws EamDbException { + public void addReferenceInstance(EamGlobalFileInstance eamGlobalFileInstance, CorrelationAttribute.Type correlationType) throws EamDbException { try{ acquireExclusiveLock(); super.addReferenceInstance(eamGlobalFileInstance, correlationType); @@ -795,7 +779,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @throws EamDbException */ @Override - public void bulkInsertReferenceTypeEntries(Set globalInstances, EamArtifact.Type contentType) throws EamDbException { + public void bulkInsertReferenceTypeEntries(Set globalInstances, CorrelationAttribute.Type contentType) throws EamDbException { try{ acquireExclusiveLock(); super.bulkInsertReferenceTypeEntries(globalInstances, contentType); @@ -815,7 +799,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @throws EamDbException */ @Override - public List getReferenceInstancesByTypeValue(EamArtifact.Type aType, String aValue) throws EamDbException { + public List getReferenceInstancesByTypeValue(CorrelationAttribute.Type aType, String aValue) throws EamDbException { try{ acquireSharedLock(); return super.getReferenceInstancesByTypeValue(aType, aValue); @@ -834,7 +818,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @throws EamDbException */ @Override - public int newCorrelationType(EamArtifact.Type newType) throws EamDbException { + public int newCorrelationType(CorrelationAttribute.Type newType) throws EamDbException { try{ acquireExclusiveLock(); return super.newCorrelationType(newType); @@ -853,10 +837,10 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @throws EamDbException */ @Override - public List getCorrelationTypes() throws EamDbException { + public List getDefinedCorrelationTypes() throws EamDbException { try{ acquireSharedLock(); - return super.getCorrelationTypes(); + return super.getDefinedCorrelationTypes(); } finally { releaseSharedLock(); } @@ -872,7 +856,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @throws EamDbException */ @Override - public List getEnabledCorrelationTypes() throws EamDbException { + public List getEnabledCorrelationTypes() throws EamDbException { try{ acquireSharedLock(); return super.getEnabledCorrelationTypes(); @@ -891,7 +875,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @throws EamDbException */ @Override - public List getSupportedCorrelationTypes() throws EamDbException { + public List getSupportedCorrelationTypes() throws EamDbException { try{ acquireSharedLock(); return super.getSupportedCorrelationTypes(); @@ -908,7 +892,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @throws EamDbException */ @Override - public void updateCorrelationType(EamArtifact.Type aType) throws EamDbException { + public void updateCorrelationType(CorrelationAttribute.Type aType) throws EamDbException { try{ acquireExclusiveLock(); super.updateCorrelationType(aType); @@ -927,7 +911,7 @@ public class SqliteEamDb extends AbstractSqlEamDb { * @throws EamDbException */ @Override - public EamArtifact.Type getCorrelationTypeById(int typeId) throws EamDbException { + public CorrelationAttribute.Type getCorrelationTypeById(int typeId) throws EamDbException { try{ acquireSharedLock(); return super.getCorrelationTypeById(typeId); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java index ca3dec0c33..1010b6b56e 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java @@ -403,11 +403,11 @@ public final class SqliteEamDbSettings { stmt.execute(createDbInfoTable.toString()); // Create a separate instance and reference table for each artifact type - List DEFAULT_CORRELATION_TYPES = EamArtifact.getDefaultCorrelationTypes(); + List DEFAULT_CORRELATION_TYPES = CorrelationAttribute.getDefaultCorrelationTypes(); String reference_type_dbname; String instance_type_dbname; - for (EamArtifact.Type type : DEFAULT_CORRELATION_TYPES) { + for (CorrelationAttribute.Type type : DEFAULT_CORRELATION_TYPES) { reference_type_dbname = EamDbUtil.correlationTypeToReferenceTableName(type); instance_type_dbname = EamDbUtil.correlationTypeToInstanceTableName(type); @@ -418,7 +418,7 @@ public final class SqliteEamDbSettings { stmt.execute(String.format(instancesIdx4, instance_type_dbname, instance_type_dbname)); // FUTURE: allow more than the FILES type - if (type.getId() == EamArtifact.FILES_TYPE_ID) { + if (type.getId() == CorrelationAttribute.FILES_TYPE_ID) { stmt.execute(String.format(createReferenceTypesTableTemplate.toString(), reference_type_dbname, reference_type_dbname)); stmt.execute(String.format(referenceTypesIdx1, reference_type_dbname, reference_type_dbname)); stmt.execute(String.format(referenceTypesIdx2, reference_type_dbname, reference_type_dbname)); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java index 6a38a7e7b8..d7ac0f290c 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java @@ -32,10 +32,10 @@ import org.sleuthkit.autopsy.casemodule.events.ContentTagDeletedEvent; import org.sleuthkit.autopsy.casemodule.events.DataSourceAddedEvent; import org.sleuthkit.autopsy.casemodule.services.TagsManager; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifact; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttribute; import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifactUtil; import org.sleuthkit.autopsy.centralrepository.datamodel.EamCase; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamDataSource; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationDataSource; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; @@ -139,7 +139,7 @@ public class CaseEventListener implements PropertyChangeListener { } } - final EamArtifact eamArtifact = EamArtifactUtil.getEamArtifactFromContent(af, + final CorrelationAttribute eamArtifact = EamArtifactUtil.getEamArtifactFromContent(af, knownStatus, comment); // send update to Central Repository db @@ -220,18 +220,15 @@ public class CaseEventListener implements PropertyChangeListener { return; } - try { - List convertedArtifacts = EamArtifactUtil.fromBlackboardArtifact(bbArtifact, true, dbManager.getCorrelationTypes(), true); - for (EamArtifact eamArtifact : convertedArtifacts) { - eamArtifact.getInstances().get(0).setComment(comment); - Runnable r = new KnownStatusChangeRunner(eamArtifact, knownStatus); - // TODO: send r into a thread pool instead - Thread t = new Thread(r); - t.start(); - } - } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Error, unable to get artifact types during BLACKBOARD_ARTIFACT_TAG_ADDED/BLACKBOARD_ARTIFACT_TAG_DELETED event.", ex); + List convertedArtifacts = EamArtifactUtil.getCorrelationAttributeFromBlackboardArtifact(bbArtifact, true, true); + for (CorrelationAttribute eamArtifact : convertedArtifacts) { + eamArtifact.getInstances().get(0).setComment(comment); + Runnable r = new KnownStatusChangeRunner(eamArtifact, knownStatus); + // TODO: send r into a thread pool instead + Thread t = new Thread(r); + t.start(); } + } // BLACKBOARD_ARTIFACT_TAG_ADDED, BLACKBOARD_ARTIFACT_TAG_DELETED break; @@ -245,9 +242,8 @@ public class CaseEventListener implements PropertyChangeListener { try { String deviceId = Case.getCurrentCase().getSleuthkitCase().getDataSource(newDataSource.getId()).getDeviceId(); - if (null == dbManager.getDataSourceDetails(deviceId)) { - dbManager.newDataSource(new EamDataSource(deviceId, newDataSource.getName())); + dbManager.newDataSource(CorrelationDataSource.fromTSKDataSource(newDataSource)); } } catch (EamDbException ex) { LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java index cdedd03c83..3f9e3e14aa 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java @@ -34,7 +34,7 @@ import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.ingest.IngestManager; import org.sleuthkit.autopsy.ingest.IngestServices; import org.sleuthkit.autopsy.ingest.ModuleDataEvent; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifact; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttribute; import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifactUtil; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.datamodel.AbstractFile; @@ -49,7 +49,7 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; */ public class IngestEventsListener { - private static final Logger LOGGER = Logger.getLogger(EamArtifact.class.getName()); + private static final Logger LOGGER = Logger.getLogger(CorrelationAttribute.class.getName()); final Collection addedCeArtifactTrackerSet = new LinkedHashSet<>(); private static int ceModuleInstanceCount = 0; @@ -131,34 +131,32 @@ public class IngestEventsListener { if (null == bbArtifacts) { //the ModuleDataEvents don't always have a collection of artifacts set return; } - List eamArtifacts = new ArrayList<>(); - try { - for (BlackboardArtifact bbArtifact : bbArtifacts) { - // eamArtifact will be null OR a EamArtifact containing one EamArtifactInstance. - List convertedArtifacts = EamArtifactUtil.fromBlackboardArtifact(bbArtifact, true, dbManager.getCorrelationTypes(), true); - for (EamArtifact eamArtifact : convertedArtifacts) { - try { - // Only do something with this artifact if it's unique within the job - if (addedCeArtifactTrackerSet.add(eamArtifact.toString())) { - // Was it previously marked as bad? - // query db for artifact instances having this TYPE/VALUE and knownStatus = "Bad". - // if gettKnownStatus() is "Unknown" and this artifact instance was marked bad in a previous case, - // create TSK_INTERESTING_ARTIFACT_HIT artifact on BB. - List caseDisplayNames = dbManager.getListCasesHavingArtifactInstancesKnownBad(eamArtifact.getCorrelationType(), eamArtifact.getCorrelationValue()); - if (!caseDisplayNames.isEmpty()) { - postCorrelatedBadArtifactToBlackboard(bbArtifact, - caseDisplayNames); - } - eamArtifacts.add(eamArtifact); + List eamArtifacts = new ArrayList<>(); + + for (BlackboardArtifact bbArtifact : bbArtifacts) { + // eamArtifact will be null OR a EamArtifact containing one EamArtifactInstance. + List convertedArtifacts = EamArtifactUtil.getCorrelationAttributeFromBlackboardArtifact(bbArtifact, true, true); + for (CorrelationAttribute eamArtifact : convertedArtifacts) { + try { + // Only do something with this artifact if it's unique within the job + if (addedCeArtifactTrackerSet.add(eamArtifact.toString())) { + // Was it previously marked as bad? + // query db for artifact instances having this TYPE/VALUE and knownStatus = "Bad". + // if gettKnownStatus() is "Unknown" and this artifact instance was marked bad in a previous case, + // create TSK_INTERESTING_ARTIFACT_HIT artifact on BB. + List caseDisplayNames = dbManager.getListCasesHavingArtifactInstancesKnownBad(eamArtifact.getCorrelationType(), eamArtifact.getCorrelationValue()); + if (!caseDisplayNames.isEmpty()) { + postCorrelatedBadArtifactToBlackboard(bbArtifact, + caseDisplayNames); } - } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Error counting notable artifacts.", ex); + eamArtifacts.add(eamArtifact); } + } catch (EamDbException ex) { + LOGGER.log(Level.SEVERE, "Error counting notable artifacts.", ex); } } - } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Error getting correlation types.", ex); } + if (FALSE == eamArtifacts.isEmpty()) { // send update to entperirse artifact manager db Runnable r = new NewArtifactsRunner(eamArtifacts); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/KnownStatusChangeRunner.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/KnownStatusChangeRunner.java index 8e3e0c496e..4761f77370 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/KnownStatusChangeRunner.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/KnownStatusChangeRunner.java @@ -20,7 +20,7 @@ package org.sleuthkit.autopsy.centralrepository.eventlisteners; import java.util.logging.Level; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifact; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttribute; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; import org.sleuthkit.datamodel.TskData.FileKnown; @@ -33,10 +33,10 @@ public class KnownStatusChangeRunner implements Runnable { private static final Logger LOGGER = Logger.getLogger(KnownStatusChangeRunner.class.getName()); private static final long serialVersionUID = 1L; - private final EamArtifact artifact; + private final CorrelationAttribute artifact; private final FileKnown knownStatus; - public KnownStatusChangeRunner(EamArtifact artifact, FileKnown knownStatus) { + public KnownStatusChangeRunner(CorrelationAttribute artifact, FileKnown knownStatus) { this.artifact = artifact; this.knownStatus = knownStatus; } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/NewArtifactsRunner.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/NewArtifactsRunner.java index 1aabf9bd48..11697e7215 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/NewArtifactsRunner.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/NewArtifactsRunner.java @@ -22,7 +22,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.logging.Level; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifact; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttribute; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; @@ -34,10 +34,10 @@ public class NewArtifactsRunner implements Runnable { private static final Logger LOGGER = Logger.getLogger(NewArtifactsRunner.class.getName()); private static final long serialVersionUID = 1L; - private final Collection eamArtifacts; + private final Collection eamArtifacts; @SuppressWarnings(value = {"unchecked", "rawtypes"}) - public NewArtifactsRunner(Collection eamArtifacts) { + public NewArtifactsRunner(Collection eamArtifacts) { this.eamArtifacts = new ArrayList(eamArtifacts); } @@ -51,7 +51,7 @@ public class NewArtifactsRunner implements Runnable { try { EamDb dbManager = EamDb.getInstance(); - for (EamArtifact eamArtifact : eamArtifacts) { + for (CorrelationAttribute eamArtifact : eamArtifacts) { dbManager.addArtifact(eamArtifact); } } catch (EamDbException ex) { diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java b/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java index 0b283d9ec1..518ac55a1a 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java @@ -23,6 +23,7 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import java.util.List; import java.util.logging.Level; import java.util.stream.Collectors; +import org.openide.util.Exceptions; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.casemodule.Case; @@ -35,9 +36,9 @@ import org.sleuthkit.autopsy.ingest.IngestMessage; import org.sleuthkit.autopsy.ingest.IngestModuleReferenceCounter; import org.sleuthkit.autopsy.ingest.IngestServices; import org.sleuthkit.autopsy.ingest.ModuleDataEvent; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifact; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifactInstance; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamDataSource; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttribute; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationDataSource; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbPlatformEnum; import org.sleuthkit.datamodel.AbstractFile; @@ -64,9 +65,9 @@ class IngestModule implements FileIngestModule { private static final IngestModuleReferenceCounter warningMsgRefCounter = new IngestModuleReferenceCounter(); private long jobId; private EamCase eamCase; - private EamDataSource eamDataSource; + private CorrelationDataSource eamDataSource; private Blackboard blackboard; - private EamArtifact.Type filesType; + private CorrelationAttribute.Type filesType; @Override public ProcessResult process(AbstractFile af) { @@ -137,14 +138,14 @@ class IngestModule implements FileIngestModule { } try { - EamArtifact eamArtifact = new EamArtifact(filesType, md5); - EamArtifactInstance cefi = new EamArtifactInstance( + CorrelationAttribute eamArtifact = new CorrelationAttribute(filesType, md5); + CorrelationAttributeInstance cefi = new CorrelationAttributeInstance( eamCase, eamDataSource, af.getParentPath() + af.getName(), null, TskData.FileKnown.UNKNOWN, - EamArtifactInstance.GlobalStatus.LOCAL + CorrelationAttributeInstance.GlobalStatus.LOCAL ); eamArtifact.addInstance(cefi); dbManager.prepareBulkArtifact(eamArtifact); @@ -217,16 +218,13 @@ class IngestModule implements FileIngestModule { jobId = context.getJobId(); eamCase = new EamCase(Case.getCurrentCase().getName(), Case.getCurrentCase().getDisplayName()); - String deviceId; try { - deviceId = Case.getCurrentCase().getSleuthkitCase().getDataSource(context.getDataSource().getId()).getDeviceId(); - } catch (TskCoreException | TskDataException ex) { - LOGGER.log(Level.SEVERE, "Error getting data source device id in ingest module start up.", ex); // NON-NLS - throw new IngestModuleException("Error getting data source device id in ingest module start up.", ex); // NON-NLS + eamDataSource = CorrelationDataSource.fromTSKDataSource(context.getDataSource()); + } catch (EamDbException ex) { + LOGGER.log(Level.SEVERE, "Error getting data source info.", ex); // NON-NLS + throw new IngestModuleException("Error getting data source info.", ex); // NON-NLS } - eamDataSource = new EamDataSource(deviceId, context.getDataSource().getName()); - EamDb dbManager; try { dbManager = EamDb.getInstance(); @@ -236,7 +234,7 @@ class IngestModule implements FileIngestModule { } try { - filesType = dbManager.getCorrelationTypeById(EamArtifact.FILES_TYPE_ID); + filesType = dbManager.getCorrelationTypeById(CorrelationAttribute.FILES_TYPE_ID); } catch (EamDbException ex) { LOGGER.log(Level.SEVERE, "Error getting correlation type FILES in ingest module start up.", ex); // NON-NLS throw new IngestModuleException("Error getting correlation type FILES in ingest module start up.", ex); // NON-NLS diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/license-centralrepository.txt b/Core/src/org/sleuthkit/autopsy/centralrepository/license-centralrepository.txt deleted file mode 100755 index ebd777cdad..0000000000 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/license-centralrepository.txt +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Central Repository - * - * Copyright 2015-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. - */ - diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java index d324ad3830..e041f87a03 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportHashDatabaseDialog.java @@ -50,10 +50,10 @@ import org.openide.util.Exceptions; import org.openide.util.NbBundle; import org.openide.util.NbBundle.Messages; import org.openide.windows.WindowManager; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifact; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttribute; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ModuleSettings; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifactInstance; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.centralrepository.datamodel.EamGlobalFileInstance; import org.sleuthkit.autopsy.centralrepository.datamodel.EamGlobalSet; @@ -535,7 +535,7 @@ final class ImportHashDatabaseDialog extends javax.swing.JDialog { // Future, make UI handle more than the "FILES" type. try { EamDb dbManager = EamDb.getInstance(); - EamArtifact.Type contentType = dbManager.getCorrelationTypeById(EamArtifact.FILES_TYPE_ID); // get "FILES" type + CorrelationAttribute.Type contentType = dbManager.getCorrelationTypeById(CorrelationAttribute.FILES_TYPE_ID); // get "FILES" type // run in the background and close dialog SwingUtilities.invokeLater(new ImportHashDatabaseWorker(selectedFilePath, knownStatus, globalSetID, contentType)::execute); dispose(); @@ -577,9 +577,9 @@ final class ImportHashDatabaseDialog extends javax.swing.JDialog { private final TskData.FileKnown knownStatus; private final int globalSetID; private final ProgressHandle progress; - private final EamArtifact.Type contentType; + private final CorrelationAttribute.Type contentType; - public ImportHashDatabaseWorker(String filename, TskData.FileKnown knownStatus, int globalSetID, EamArtifact.Type contentType) throws EamDbException, UnknownHostException { + public ImportHashDatabaseWorker(String filename, TskData.FileKnown knownStatus, int globalSetID, CorrelationAttribute.Type contentType) throws EamDbException, UnknownHostException { this.file = new File(filename); this.knownStatus = knownStatus; this.globalSetID = globalSetID; diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageCorrelationPropertiesDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageCorrelationPropertiesDialog.java index 0d45c51d2f..d0bfd114e7 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageCorrelationPropertiesDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageCorrelationPropertiesDialog.java @@ -32,7 +32,7 @@ import org.openide.util.Exceptions; import org.openide.util.NbBundle.Messages; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifact; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttribute; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; @@ -44,7 +44,7 @@ final class ManageCorrelationPropertiesDialog extends javax.swing.JDialog { private static final Logger LOGGER = Logger.getLogger(ManageCorrelationPropertiesDialog.class.getName()); - private final List correlationTypes; + private final List correlationTypes; /** * Displays a dialog that allows a user to select which Type(s) should be @@ -73,7 +73,7 @@ final class ManageCorrelationPropertiesDialog extends javax.swing.JDialog { try { EamDb dbManager = EamDb.getInstance(); correlationTypes.clear(); - correlationTypes.addAll(dbManager.getCorrelationTypes()); + correlationTypes.addAll(dbManager.getDefinedCorrelationTypes()); } catch (EamDbException ex) { Exceptions.printStackTrace(ex); } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageTagsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageTagsDialog.java index 8f65bbf61d..79a3337b9b 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageTagsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageTagsDialog.java @@ -37,7 +37,7 @@ import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.services.TagsManager; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifact; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttribute; import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifactUtil; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.datamodel.TskCoreException; @@ -336,9 +336,8 @@ final class ManageTagsDialog extends javax.swing.JDialog { List artifactTags = curCase.getSleuthkitCase().getBlackboardArtifactTagsByTagName(tagName); for(BlackboardArtifactTag bbTag:artifactTags){ - List convertedArtifacts = EamArtifactUtil.fromBlackboardArtifact(bbTag.getArtifact(), true, - EamDb.getInstance().getCorrelationTypes(), true); - for (EamArtifact eamArtifact : convertedArtifacts) { + List convertedArtifacts = EamArtifactUtil.getCorrelationAttributeFromBlackboardArtifact(bbTag.getArtifact(), true, true); + for (CorrelationAttribute eamArtifact : convertedArtifacts) { EamDb.getInstance().setArtifactInstanceKnownStatus(eamArtifact,TskData.FileKnown.BAD); } } @@ -346,7 +345,7 @@ final class ManageTagsDialog extends javax.swing.JDialog { // Now search for files List fileTags = curCase.getSleuthkitCase().getContentTagsByTagName(tagName); for(ContentTag contentTag:fileTags){ - final EamArtifact eamArtifact = EamArtifactUtil.getEamArtifactFromContent(contentTag.getContent(), + final CorrelationAttribute eamArtifact = EamArtifactUtil.getEamArtifactFromContent(contentTag.getContent(), TskData.FileKnown.BAD, ""); EamDb.getInstance().setArtifactInstanceKnownStatus(eamArtifact, TskData.FileKnown.BAD); } From dbbcd7c199f44c1589407126ad266028de19b2d3 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Mon, 25 Sep 2017 10:27:17 -0400 Subject: [PATCH 17/18] Only use visible files/artifacts to determine whether a node should be shown in the tree --- .../autopsy/directorytree/DirectoryTreeFilterChildren.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java index 4ca9e458c6..959b2c6653 100755 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java @@ -286,17 +286,17 @@ class DirectoryTreeFilterChildren extends FilterNode.Children { @Override public Boolean visit(LocalFileNode lfn) { - return lfn.hasContentChildren(); + return lfn.hasVisibleContentChildren(); } @Override public Boolean visit(LayoutFileNode ln) { - return ln.hasContentChildren(); + return ln.hasVisibleContentChildren(); } @Override public Boolean visit(SlackFileNode sfn) { - return sfn.hasContentChildren(); + return sfn.hasVisibleContentChildren(); } @Override From f6e9d33b1c516f4b87c752e4de802f36b34d88b9 Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Mon, 25 Sep 2017 13:29:58 -0400 Subject: [PATCH 18/18] Update build.xml --- build.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.xml b/build.xml index deda12f21e..bba4207f1b 100755 --- a/build.xml +++ b/build.xml @@ -263,9 +263,11 @@ - + + +