mirror of
https://github.com/elisspace/autopsy.git
synced 2026-10-01 23:09:56 +00:00
integrating and refactoring
This commit is contained in:
+15
-3
@@ -40,7 +40,7 @@ import org.sleuthkit.datamodel.TskCoreException;
|
||||
/**
|
||||
* Providing data for the data source analysis tab.
|
||||
*/
|
||||
public class DataSourceAnalysisSummary {
|
||||
public class AnalysisSummary implements DataSourceSummaryDataModel {
|
||||
|
||||
private static final BlackboardAttribute.Type TYPE_SET_NAME = new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_SET_NAME);
|
||||
|
||||
@@ -51,13 +51,20 @@ public class DataSourceAnalysisSummary {
|
||||
"URLS",
|
||||
"CREDIT CARD NUMBERS"
|
||||
));
|
||||
|
||||
private static final Set<Integer> ARTIFACT_UPDATE_TYPE_IDS = new HashSet<>(Arrays.asList(
|
||||
ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID(),
|
||||
ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID(),
|
||||
ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID(),
|
||||
ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID()
|
||||
));
|
||||
|
||||
private final SleuthkitCaseProvider provider;
|
||||
|
||||
/**
|
||||
* Main constructor.
|
||||
*/
|
||||
public DataSourceAnalysisSummary() {
|
||||
public AnalysisSummary() {
|
||||
this(SleuthkitCaseProvider.DEFAULT);
|
||||
}
|
||||
|
||||
@@ -66,9 +73,14 @@ public class DataSourceAnalysisSummary {
|
||||
*
|
||||
* @param provider The means of obtaining a sleuthkit case.
|
||||
*/
|
||||
public DataSourceAnalysisSummary(SleuthkitCaseProvider provider) {
|
||||
public AnalysisSummary(SleuthkitCaseProvider provider) {
|
||||
this.provider = provider;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Integer> getArtifactIdUpdates() {
|
||||
return ARTIFACT_UPDATE_TYPE_IDS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets counts for hashset hits.
|
||||
+25
-48
@@ -26,13 +26,9 @@ import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.SortedMap;
|
||||
import java.util.TreeMap;
|
||||
import java.util.logging.Level;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||
import org.sleuthkit.datamodel.BlackboardAttribute;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.SleuthkitCaseProvider.SleuthkitCaseProviderException;
|
||||
@@ -47,8 +43,6 @@ import org.sleuthkit.datamodel.TskData.TSK_FS_META_TYPE_ENUM;
|
||||
*/
|
||||
final class DataSourceInfoUtilities {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(DataSourceInfoUtilities.class.getName());
|
||||
|
||||
/**
|
||||
* Gets a count of tsk_files for a particular datasource where dir_type is
|
||||
* not a virtual directory and has a name.
|
||||
@@ -58,18 +52,17 @@ final class DataSourceInfoUtilities {
|
||||
* @param onError The message to log on error.
|
||||
*
|
||||
* @return The count of files or null on error.
|
||||
*
|
||||
* @throws SleuthkitCaseProviderException
|
||||
* @throws TskCoreException
|
||||
* @throws SQLException
|
||||
*/
|
||||
static Long getCountOfTskFiles(DataSource currentDataSource, String additionalWhere, String onError) {
|
||||
static Long getCountOfTskFiles(SleuthkitCase skCase, DataSource currentDataSource, String additionalWhere)
|
||||
throws TskCoreException, SQLException {
|
||||
if (currentDataSource != null) {
|
||||
try {
|
||||
SleuthkitCase skCase = Case.getCurrentCaseThrows().getSleuthkitCase();
|
||||
return skCase.countFilesWhere(
|
||||
"data_source_obj_id=" + currentDataSource.getId()
|
||||
+ (StringUtils.isBlank(additionalWhere) ? "" : (" AND " + additionalWhere)));
|
||||
} catch (TskCoreException | NoCurrentCaseException ex) {
|
||||
logger.log(Level.WARNING, onError, ex);
|
||||
//unable to get count of files for the specified types cell will be displayed as empty
|
||||
}
|
||||
return skCase.countFilesWhere(
|
||||
"data_source_obj_id=" + currentDataSource.getId()
|
||||
+ (StringUtils.isBlank(additionalWhere) ? "" : (" AND " + additionalWhere)));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -78,20 +71,24 @@ final class DataSourceInfoUtilities {
|
||||
* Gets a count of regular files for a particular datasource where the
|
||||
* dir_type and type are not a virtual directory and has a name.
|
||||
*
|
||||
* @param skCase The current SleuthkitCase.
|
||||
* @param currentDataSource The datasource.
|
||||
* @param additionalWhere Additional sql where clauses.
|
||||
* @param onError The message to log on error.
|
||||
*
|
||||
* @return The count of files or null on error.
|
||||
*
|
||||
* @throws TskCoreException
|
||||
* @throws SQLException
|
||||
*/
|
||||
static Long getCountOfRegularFiles(DataSource currentDataSource, String additionalWhere, String onError) {
|
||||
static Long getCountOfRegularFiles(SleuthkitCase skCase, DataSource currentDataSource, String additionalWhere)
|
||||
throws TskCoreException, SQLException {
|
||||
String whereClause = "meta_type=" + TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_REG.getValue();
|
||||
|
||||
if (StringUtils.isNotBlank(additionalWhere)) {
|
||||
whereClause += " AND " + additionalWhere;
|
||||
}
|
||||
|
||||
return getCountOfTskFiles(currentDataSource, whereClause, onError);
|
||||
return getCountOfTskFiles(skCase, currentDataSource, whereClause);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -105,42 +102,22 @@ final class DataSourceInfoUtilities {
|
||||
/**
|
||||
* Retrieves a result based on the provided query.
|
||||
*
|
||||
* @param query The query.
|
||||
* @param processor The result set handler.
|
||||
* @param errorMessage The error message to display if there is an error
|
||||
* retrieving the resultset.
|
||||
* @param skCase The current SleuthkitCase.
|
||||
* @param query The query.
|
||||
* @param processor The result set handler.
|
||||
*
|
||||
* @return The ResultSetHandler value or null if no ResultSet could be
|
||||
* obtained.
|
||||
*/
|
||||
static <T> T getBaseQueryResult(String query, ResultSetHandler<T> processor, String errorMessage) {
|
||||
return getBaseQueryResult(SleuthkitCaseProvider.DEFAULT, query, processor, errorMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a result based on the provided query.
|
||||
*
|
||||
* @param provider The means of obtaining a SleuthkitCase.
|
||||
* @param query The query.
|
||||
* @param processor The result set handler.
|
||||
* @param errorMessage The error message to display if there is an error
|
||||
* retrieving the resultset.
|
||||
*
|
||||
* @return The ResultSetHandler value or null if no ResultSet could be
|
||||
* obtained.
|
||||
* @throws TskCoreException
|
||||
* @throws SQLException
|
||||
*/
|
||||
static <T> T getBaseQueryResult(SleuthkitCaseProvider provider, String query, ResultSetHandler<T> processor, String errorMessage) {
|
||||
try (SleuthkitCase.CaseDbQuery dbQuery = provider.get().executeQuery(query)) {
|
||||
static <T> T getBaseQueryResult(SleuthkitCase skCase, String query, ResultSetHandler<T> processor)
|
||||
throws TskCoreException, SQLException {
|
||||
try (SleuthkitCase.CaseDbQuery dbQuery = skCase.executeQuery(query)) {
|
||||
ResultSet resultSet = dbQuery.getResultSet();
|
||||
try {
|
||||
return processor.process(resultSet);
|
||||
} catch (SQLException ex) {
|
||||
logger.log(Level.WARNING, errorMessage, ex);
|
||||
}
|
||||
} catch (TskCoreException | SleuthkitCaseProviderException ex) {
|
||||
logger.log(Level.WARNING, errorMessage, ex);
|
||||
return processor.process(resultSet);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+3
-3
@@ -31,9 +31,9 @@ import org.sleuthkit.datamodel.TskData;
|
||||
/**
|
||||
* Provides information for the DataSourceSummaryCountsPanel.
|
||||
*/
|
||||
public class DataSourceCountsSummary {
|
||||
public class DataSourceTypesSummary {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(DataSourceCountsSummary.class.getName());
|
||||
private static final Logger logger = Logger.getLogger(DataSourceTypesSummary.class.getName());
|
||||
|
||||
/**
|
||||
* Get count of regular files (not directories) in a data source.
|
||||
@@ -153,6 +153,6 @@ public class DataSourceCountsSummary {
|
||||
};
|
||||
}
|
||||
|
||||
private DataSourceCountsSummary() {
|
||||
private DataSourceTypesSummary() {
|
||||
}
|
||||
}
|
||||
@@ -22,9 +22,12 @@ import java.nio.file.Paths;
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.SortedMap;
|
||||
import java.util.TreeMap;
|
||||
import org.sleuthkit.datamodel.AbstractFile;
|
||||
@@ -39,11 +42,12 @@ import org.sleuthkit.datamodel.DataSource;
|
||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.SleuthkitCaseProvider.SleuthkitCaseProviderException;
|
||||
import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
|
||||
|
||||
/**
|
||||
* Helper class for getting data for the Recent Files Data Summary tab.
|
||||
*/
|
||||
public class RecentFilesSummary {
|
||||
public class RecentFilesSummary implements DataSourceSummaryDataModel {
|
||||
|
||||
private final static BlackboardAttribute.Type DATETIME_ACCESSED_ATT = new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED);
|
||||
private final static BlackboardAttribute.Type DOMAIN_ATT = new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN);
|
||||
@@ -56,6 +60,15 @@ public class RecentFilesSummary {
|
||||
|
||||
private static final DateFormat DATETIME_FORMAT = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss", Locale.getDefault());
|
||||
|
||||
private static final Set<Integer> ARTIFACT_UPDATE_TYPE_IDS = new HashSet<>(Arrays.asList(
|
||||
ARTIFACT_TYPE.TSK_RECENT_OBJECT.getTypeID(),
|
||||
ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID(),
|
||||
ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT.getTypeID(),
|
||||
ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID(),
|
||||
ARTIFACT_TYPE.TSK_MESSAGE.getTypeID()
|
||||
));
|
||||
|
||||
|
||||
private final SleuthkitCaseProvider provider;
|
||||
|
||||
/**
|
||||
@@ -78,6 +91,13 @@ public class RecentFilesSummary {
|
||||
this.provider = provider;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Integer> getArtifactIdUpdates() {
|
||||
return ARTIFACT_UPDATE_TYPE_IDS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Return a list of the most recently opened documents based on the
|
||||
* TSK_RECENT_OBJECT artifact.
|
||||
|
||||
+49
-39
@@ -19,28 +19,33 @@
|
||||
package org.sleuthkit.autopsy.datasourcesummary.datamodel;
|
||||
|
||||
import java.io.File;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.util.logging.Level;
|
||||
import java.util.stream.Collectors;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import static org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceInfoUtilities.getBaseQueryResult;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.SleuthkitCaseProvider.SleuthkitCaseProviderException;
|
||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||
import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
|
||||
import org.sleuthkit.datamodel.BlackboardAttribute;
|
||||
import org.sleuthkit.datamodel.DataSource;
|
||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
|
||||
/**
|
||||
* Provides information to populate Top Programs Summary queries.
|
||||
*/
|
||||
public class DataSourceTopProgramsSummary {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(DataSourceTopProgramsSummary.class.getName());
|
||||
public class TopProgramsSummary implements DataSourceSummaryDataModel {
|
||||
private static final Set<Integer> ARTIFACT_UPDATE_TYPE_IDS = new HashSet<>(Arrays.asList(
|
||||
ARTIFACT_TYPE.TSK_PROG_RUN.getTypeID()
|
||||
));
|
||||
|
||||
/**
|
||||
* A SQL join type.
|
||||
@@ -95,7 +100,7 @@ public class DataSourceTopProgramsSummary {
|
||||
return null;
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
* Creates a sql statement querying the blackboard attributes table for a
|
||||
* particular attribute type and returning a specified value. That query
|
||||
@@ -168,18 +173,22 @@ public class DataSourceTopProgramsSummary {
|
||||
private static String getLikeClause(String column, String likeString, boolean isLike) {
|
||||
return column + (isLike ? "" : " NOT") + " LIKE '" + likeString + "'";
|
||||
}
|
||||
|
||||
|
||||
|
||||
private final SleuthkitCaseProvider provider;
|
||||
|
||||
public DataSourceTopProgramsSummary() {
|
||||
|
||||
public TopProgramsSummary() {
|
||||
this(SleuthkitCaseProvider.DEFAULT);
|
||||
}
|
||||
|
||||
public DataSourceTopProgramsSummary(SleuthkitCaseProvider provider) {
|
||||
|
||||
public TopProgramsSummary(SleuthkitCaseProvider provider) {
|
||||
this.provider = provider;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Integer> getArtifactIdUpdates() {
|
||||
return ARTIFACT_UPDATE_TYPE_IDS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a list of the top programs used on the data source. Currently
|
||||
* determines this based off of which prefetch results return the highest
|
||||
@@ -188,9 +197,14 @@ public class DataSourceTopProgramsSummary {
|
||||
* @param dataSource The data source.
|
||||
* @param count The number of programs to return.
|
||||
*
|
||||
* @return
|
||||
* @return The top results objects found.
|
||||
*
|
||||
* @throws SleuthkitCaseProviderException
|
||||
* @throws TskCoreException
|
||||
* @throws SQLException
|
||||
*/
|
||||
public List<TopProgramsResult> getTopPrograms(DataSource dataSource, int count) {
|
||||
public List<TopProgramsResult> getTopPrograms(DataSource dataSource, int count)
|
||||
throws SleuthkitCaseProviderException, TskCoreException, SQLException {
|
||||
if (dataSource == null || count <= 0) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
@@ -231,44 +245,40 @@ public class DataSourceTopProgramsSummary {
|
||||
+ " MAX(" + getFullKey(lastRunParam) + ") DESC,\n"
|
||||
+ " " + getFullKey(nameParam) + " ASC";
|
||||
|
||||
final String errorMessage = "Unable to get top program results; returning null.";
|
||||
|
||||
DataSourceInfoUtilities.ResultSetHandler<List<TopProgramsResult>> handler = (resultSet) -> {
|
||||
List<TopProgramsResult> progResults = new ArrayList<>();
|
||||
|
||||
boolean quitAtCount = false;
|
||||
|
||||
while (resultSet.next() && (!quitAtCount || progResults.size() < count)) {
|
||||
try {
|
||||
long lastRunEpoch = resultSet.getLong(lastRunParam);
|
||||
Date lastRun = (resultSet.wasNull()) ? null : new Date(lastRunEpoch * 1000);
|
||||
long lastRunEpoch = resultSet.getLong(lastRunParam);
|
||||
Date lastRun = (resultSet.wasNull()) ? null : new Date(lastRunEpoch * 1000);
|
||||
|
||||
Long runCount = resultSet.getLong(runCountParam);
|
||||
if (resultSet.wasNull()) {
|
||||
runCount = null;
|
||||
}
|
||||
|
||||
if (lastRun != null || runCount != null) {
|
||||
quitAtCount = true;
|
||||
}
|
||||
|
||||
progResults.add(new TopProgramsResult(
|
||||
resultSet.getString(nameParam),
|
||||
resultSet.getString(pathParam),
|
||||
runCount,
|
||||
lastRun));
|
||||
|
||||
} catch (SQLException ex) {
|
||||
logger.log(Level.WARNING, "Failed to get a top program result from the result set.", ex);
|
||||
Long runCount = resultSet.getLong(runCountParam);
|
||||
if (resultSet.wasNull()) {
|
||||
runCount = null;
|
||||
}
|
||||
|
||||
if (lastRun != null || runCount != null) {
|
||||
quitAtCount = true;
|
||||
}
|
||||
|
||||
progResults.add(new TopProgramsResult(
|
||||
resultSet.getString(nameParam),
|
||||
resultSet.getString(pathParam),
|
||||
runCount,
|
||||
lastRun));
|
||||
}
|
||||
|
||||
return progResults;
|
||||
};
|
||||
|
||||
return getBaseQueryResult(provider, query, handler, errorMessage);
|
||||
try (SleuthkitCase.CaseDbQuery dbQuery = provider.get().executeQuery(query)) {
|
||||
ResultSet resultSet = dbQuery.getResultSet();
|
||||
return handler.process(resultSet);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Determines a short folder name if any. Otherwise, returns empty string.
|
||||
+23
-5
@@ -18,10 +18,13 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.datasourcesummary.datamodel;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Comparator;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Level;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.IntStream;
|
||||
@@ -44,7 +47,7 @@ import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE;
|
||||
* time, the data being provided for domains is fictitious and is done as a
|
||||
* placeholder.
|
||||
*/
|
||||
public class DataSourceUserActivitySummary {
|
||||
public class UserActivitySummary implements DataSourceSummaryDataModel {
|
||||
|
||||
private static final BlackboardArtifact.Type TYPE_DEVICE_ATTACHED = new BlackboardArtifact.Type(ARTIFACT_TYPE.TSK_DEVICE_ATTACHED);
|
||||
|
||||
@@ -65,6 +68,16 @@ public class DataSourceUserActivitySummary {
|
||||
private static final Comparator<TopWebSearchResult> TOP_WEBSEARCH_RESULT_DATE_COMPARE = (a, b) -> a.getDateAccessed().compareTo(b.getDateAccessed());
|
||||
private static final String ROOT_HUB_IDENTIFIER = "ROOT_HUB";
|
||||
|
||||
private static final Set<Integer> ARTIFACT_UPDATE_TYPE_IDS = new HashSet<>(Arrays.asList(
|
||||
ARTIFACT_TYPE.TSK_WEB_SEARCH_QUERY.getTypeID(),
|
||||
|
||||
ARTIFACT_TYPE.TSK_MESSAGE.getTypeID(),
|
||||
ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID(),
|
||||
ARTIFACT_TYPE.TSK_CALLLOG.getTypeID(),
|
||||
|
||||
ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID()
|
||||
));
|
||||
|
||||
private static final long SLEEP_TIME = 5000;
|
||||
|
||||
/**
|
||||
@@ -106,9 +119,9 @@ public class DataSourceUserActivitySummary {
|
||||
/**
|
||||
* Main constructor.
|
||||
*/
|
||||
public DataSourceUserActivitySummary() {
|
||||
public UserActivitySummary() {
|
||||
this(SleuthkitCaseProvider.DEFAULT, TextTranslationService.getInstance(),
|
||||
org.sleuthkit.autopsy.coreutils.Logger.getLogger(DataSourceUserActivitySummary.class.getName()));
|
||||
org.sleuthkit.autopsy.coreutils.Logger.getLogger(UserActivitySummary.class.getName()));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -120,7 +133,7 @@ public class DataSourceUserActivitySummary {
|
||||
* @param translationService The translation service.
|
||||
* @param logger The logger to use.
|
||||
*/
|
||||
public DataSourceUserActivitySummary(
|
||||
public UserActivitySummary(
|
||||
SleuthkitCaseProvider provider,
|
||||
TextTranslationService translationService,
|
||||
java.util.logging.Logger logger) {
|
||||
@@ -129,6 +142,11 @@ public class DataSourceUserActivitySummary {
|
||||
this.translationService = translationService;
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Integer> getArtifactIdUpdates() {
|
||||
return ARTIFACT_UPDATE_TYPE_IDS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws an IllegalArgumentException if count <= 0.
|
||||
@@ -183,7 +201,7 @@ public class DataSourceUserActivitySummary {
|
||||
Collection<List<TopWebSearchResult>> resultGroups = webSearchArtifacts
|
||||
.stream()
|
||||
// get items where search string and date is not null
|
||||
.map(DataSourceUserActivitySummary::getWebSearchResult)
|
||||
.map(UserActivitySummary::getWebSearchResult)
|
||||
// remove null records
|
||||
.filter(result -> result != null)
|
||||
// get these messages grouped by search to string
|
||||
@@ -22,7 +22,7 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceAnalysisSummary;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.AnalysisSummary;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.CellModelTableCellRenderer.DefaultCellModel;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.JTablePanel;
|
||||
@@ -79,10 +79,12 @@ public class AnalysisPanel extends BaseDataSourceSummaryPanel {
|
||||
* Creates a new DataSourceUserActivityPanel.
|
||||
*/
|
||||
public AnalysisPanel() {
|
||||
this(new DataSourceAnalysisSummary());
|
||||
this(new AnalysisSummary());
|
||||
}
|
||||
|
||||
public AnalysisPanel(DataSourceAnalysisSummary analysisData) {
|
||||
public AnalysisPanel(AnalysisSummary analysisData) {
|
||||
super(analysisData);
|
||||
|
||||
// set up data acquisition methods
|
||||
dataFetchComponents = Arrays.asList(
|
||||
// hashset hits loading components
|
||||
@@ -101,6 +103,16 @@ public class AnalysisPanel extends BaseDataSourceSummaryPanel {
|
||||
|
||||
initComponents();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void fetchInformation(DataSource dataSource) {
|
||||
fetchInformation(dataFetchComponents, dataSource);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onNewDataSource(DataSource dataSource) {
|
||||
onNewDataSource(dataFetchComponents, tables, dataSource);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
@@ -178,6 +190,7 @@ public class AnalysisPanel extends BaseDataSourceSummaryPanel {
|
||||
);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
// End of variables declaration//GEN-END:variables
|
||||
}
|
||||
|
||||
+26
-18
@@ -20,15 +20,17 @@ package org.sleuthkit.autopsy.datasourcesummary.ui;
|
||||
|
||||
import java.beans.PropertyChangeEvent;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingWorker;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceSummaryDataModel;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchResult;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker.DataFetchComponents;
|
||||
@@ -49,8 +51,6 @@ abstract class BaseDataSourceSummaryPanel extends JPanel {
|
||||
|
||||
private final SwingWorkerSequentialExecutor executor = new SwingWorkerSequentialExecutor();
|
||||
|
||||
|
||||
|
||||
private final RefreshThrottler refreshThrottler = new RefreshThrottler(new RefreshThrottler.Refresher() {
|
||||
@Override
|
||||
public void refresh() {
|
||||
@@ -88,15 +88,26 @@ abstract class BaseDataSourceSummaryPanel extends JPanel {
|
||||
private final boolean refreshOnNewContent;
|
||||
|
||||
private DataSource dataSource;
|
||||
|
||||
/**
|
||||
* Main constructor
|
||||
*/
|
||||
|
||||
private static <I, O> Set<O> getUnionSet(Function<I, Collection<? extends O>> mapper, I... items) {
|
||||
return Stream.of(items)
|
||||
.flatMap((item) -> mapper.apply(item).stream())
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
protected BaseDataSourceSummaryPanel(DataSourceSummaryDataModel...dataModels) {
|
||||
this(
|
||||
getUnionSet(DataSourceSummaryDataModel::getCaseEventUpdates, dataModels),
|
||||
getUnionSet(DataSourceSummaryDataModel::getArtifactIdUpdates, dataModels),
|
||||
Stream.of(dataModels).anyMatch(DataSourceSummaryDataModel::shouldRefreshOnNewContent)
|
||||
);
|
||||
}
|
||||
|
||||
protected BaseDataSourceSummaryPanel(Set<Case.Events> caseEvents, Set<Integer> artifactTypesForRefresh, boolean refreshOnNewContent) {
|
||||
this.artifactTypesForRefresh = (artifactTypesForRefresh == null)
|
||||
? new HashSet<>()
|
||||
: new HashSet<>(artifactTypesForRefresh);
|
||||
|
||||
|
||||
this.refreshOnNewContent = refreshOnNewContent;
|
||||
|
||||
if (refreshOnNewContent || this.artifactTypesForRefresh.size() > 0) {
|
||||
@@ -162,11 +173,7 @@ abstract class BaseDataSourceSummaryPanel extends JPanel {
|
||||
* @param dataSource The datasource to fetch information about.
|
||||
*/
|
||||
protected abstract void fetchInformation(DataSource dataSource);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
protected void fetchInformation(List<DataFetchComponents<DataSource, ?>> dataFetchComponents, DataSource dataSource) {
|
||||
// create swing workers to run for each loadable item
|
||||
List<DataFetchWorker<?, ?>> workers = dataFetchComponents
|
||||
@@ -179,17 +186,18 @@ abstract class BaseDataSourceSummaryPanel extends JPanel {
|
||||
submit(workers);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* When a new dataSource is added, this method is called.
|
||||
*
|
||||
* @param dataSource The new dataSource.
|
||||
*/
|
||||
protected abstract void onNewDataSource(DataSource dataSource);
|
||||
|
||||
|
||||
|
||||
protected void onNewDataSource(List<DataFetchComponents<DataSource, ?>> dataFetchComponents, List<LoadableComponent<?>> loadableComponents, DataSource dataSource) {
|
||||
protected void onNewDataSource(
|
||||
List<DataFetchComponents<DataSource, ?>> dataFetchComponents,
|
||||
List<? extends LoadableComponent<?>> loadableComponents,
|
||||
DataSource dataSource) {
|
||||
// if no data source is present or the case is not open,
|
||||
// set results for tables to null.
|
||||
if (dataSource == null || !Case.isCaseOpen()) {
|
||||
|
||||
@@ -28,11 +28,11 @@ DataSourceSummaryDetailsPanel.acquisitionDetailsTextArea.text=
|
||||
DataSourceSummaryDetailsPanel.acquisitionDetailsLabel.text=Acquisition Details:
|
||||
DataSourceSummaryDetailsPanel.unallocatedSizeLabel.text=Unallocated Space:
|
||||
DataSourceSummaryDetailsPanel.unallocatedSizeValue.text=
|
||||
DataSourceSummaryUserActivityPanel.programsRunLabel.text=Recent Programs
|
||||
DataSourceSummaryUserActivityPanel.recentAccountsLabel.text=Recent Accounts
|
||||
DataSourceSummaryUserActivityPanel.topWebSearchLabel.text=Recent Web Searches
|
||||
DataSourceSummaryUserActivityPanel.topDevicesAttachedLabel.text=Recent Devices Attached
|
||||
DataSourceSummaryUserActivityPanel.recentDomainsLabel.text=Recent Domains
|
||||
UserActivityPanel.programsRunLabel.text=Recent Programs
|
||||
UserActivityPanel.recentAccountsLabel.text=Recent Accounts
|
||||
UserActivityPanel.topWebSearchLabel.text=Recent Web Searches
|
||||
UserActivityPanel.topDevicesAttachedLabel.text=Recent Devices Attached
|
||||
UserActivityPanel.recentDomainsLabel.text=Recent Domains
|
||||
AnalysisPanel.hashsetHitsLabel.text=Hashset Hits
|
||||
AnalysisPanel.keywordHitsLabel.text=Keyword Hits
|
||||
AnalysisPanel.interestingItemLabel.text=Interesting Item Hits
|
||||
|
||||
@@ -47,31 +47,31 @@ DataSourceSummaryTabbedPane_ingestHistoryTab_title=Ingest History
|
||||
DataSourceSummaryTabbedPane_recentFileTab_title=Recent Files
|
||||
DataSourceSummaryTabbedPane_typesTab_title=Types
|
||||
DataSourceSummaryTabbedPane_userActivityTab_title=User Activity
|
||||
DataSourceSummaryUserActivityPanel.programsRunLabel.text=Recent Programs
|
||||
DataSourceSummaryUserActivityPanel.recentAccountsLabel.text=Recent Accounts
|
||||
DataSourceSummaryUserActivityPanel.topWebSearchLabel.text=Recent Web Searches
|
||||
DataSourceSummaryUserActivityPanel.topDevicesAttachedLabel.text=Recent Devices Attached
|
||||
DataSourceSummaryUserActivityPanel.recentDomainsLabel.text=Recent Domains
|
||||
UserActivityPanel.programsRunLabel.text=Recent Programs
|
||||
UserActivityPanel.recentAccountsLabel.text=Recent Accounts
|
||||
UserActivityPanel.topWebSearchLabel.text=Recent Web Searches
|
||||
UserActivityPanel.topDevicesAttachedLabel.text=Recent Devices Attached
|
||||
UserActivityPanel.recentDomainsLabel.text=Recent Domains
|
||||
AnalysisPanel.hashsetHitsLabel.text=Hashset Hits
|
||||
AnalysisPanel.keywordHitsLabel.text=Keyword Hits
|
||||
AnalysisPanel.interestingItemLabel.text=Interesting Item Hits
|
||||
DataSourceSummaryUserActivityPanel_noDataExists=No communication data exists
|
||||
DataSourceSummaryUserActivityPanel_tab_title=User Activity
|
||||
DataSourceSummaryUserActivityPanel_TopAccountTableModel_accountType_header=Account Type
|
||||
DataSourceSummaryUserActivityPanel_TopAccountTableModel_lastAccess_header=Last Accessed
|
||||
DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_dateAccessed_header=Last Accessed
|
||||
DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_deviceId_header=Device Id
|
||||
DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_makeModel_header=Make and Model
|
||||
DataSourceSummaryUserActivityPanel_TopDomainsTableModel_domain_header=Domain
|
||||
DataSourceSummaryUserActivityPanel_TopDomainsTableModel_lastAccess_header=Last Access
|
||||
DataSourceSummaryUserActivityPanel_TopDomainsTableModel_url_header=URL
|
||||
DataSourceSummaryUserActivityPanel_TopProgramsTableModel_count_header=Run Times
|
||||
DataSourceSummaryUserActivityPanel_TopProgramsTableModel_folder_header=Folder
|
||||
DataSourceSummaryUserActivityPanel_TopProgramsTableModel_lastrun_header=Last Run
|
||||
DataSourceSummaryUserActivityPanel_TopProgramsTableModel_name_header=Program
|
||||
DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_dateAccessed_header=Date Accessed
|
||||
DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_searchString_header=Search String
|
||||
DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_translatedResult_header=Translated
|
||||
UserActivityPanel_noDataExists=No communication data exists
|
||||
UserActivityPanel_tab_title=User Activity
|
||||
UserActivityPanel_TopAccountTableModel_accountType_header=Account Type
|
||||
UserActivityPanel_TopAccountTableModel_lastAccess_header=Last Accessed
|
||||
UserActivityPanel_TopDeviceAttachedTableModel_dateAccessed_header=Last Accessed
|
||||
UserActivityPanel_TopDeviceAttachedTableModel_deviceId_header=Device Id
|
||||
UserActivityPanel_TopDeviceAttachedTableModel_makeModel_header=Make and Model
|
||||
UserActivityPanel_TopDomainsTableModel_domain_header=Domain
|
||||
UserActivityPanel_TopDomainsTableModel_lastAccess_header=Last Access
|
||||
UserActivityPanel_TopDomainsTableModel_url_header=URL
|
||||
UserActivityPanel_TopProgramsTableModel_count_header=Run Times
|
||||
UserActivityPanel_TopProgramsTableModel_folder_header=Folder
|
||||
UserActivityPanel_TopProgramsTableModel_lastrun_header=Last Run
|
||||
UserActivityPanel_TopProgramsTableModel_name_header=Program
|
||||
UserActivityPanel_TopWebSearchTableModel_dateAccessed_header=Date Accessed
|
||||
UserActivityPanel_TopWebSearchTableModel_searchString_header=Search String
|
||||
UserActivityPanel_TopWebSearchTableModel_translatedResult_header=Translated
|
||||
RecentFilePanel_col_header_domain=Domain
|
||||
RecentFilePanel_col_header_path=Path
|
||||
RecentFilePanel_col_header_sender=Sender
|
||||
|
||||
+1
-1
@@ -115,7 +115,7 @@ public class DataSourceSummaryTabbedPane extends JTabbedPane {
|
||||
|
||||
private final List<DataSourceTab> tabs = Arrays.asList(
|
||||
new DataSourceTab(Bundle.DataSourceSummaryTabbedPane_typesTab_title(), new TypesPanel()),
|
||||
new DataSourceTab(Bundle.DataSourceSummaryTabbedPane_userActivityTab_title(), new DataSourceSummaryUserActivityPanel()),
|
||||
new DataSourceTab(Bundle.DataSourceSummaryTabbedPane_userActivityTab_title(), new UserActivityPanel()),
|
||||
new DataSourceTab(Bundle.DataSourceSummaryTabbedPane_recentFileTab_title(), new RecentFilesPanel()),
|
||||
new DataSourceTab(Bundle.DataSourceSummaryTabbedPane_analysisTab_title(), new AnalysisPanel()),
|
||||
new DataSourceTab(Bundle.DataSourceSummaryTabbedPane_ingestHistoryTab_title(), ingestHistoryPanel, ingestHistoryPanel::setDataSource, () -> {
|
||||
|
||||
-398
@@ -1,398 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||
<AuxValues>
|
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,3,-35,0,0,2,-42"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JScrollPane" name="contentScrollPane">
|
||||
<Properties>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="null"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="null"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
</AuxValues>
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||
<BorderConstraints direction="Center"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JPanel" name="contentPanel">
|
||||
<Properties>
|
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
||||
<Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
|
||||
<EmptyBorder bottom="10" left="10" right="10" top="10"/>
|
||||
</Border>
|
||||
</Property>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[32767, 450]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[10, 450]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout">
|
||||
<Property name="axis" type="int" value="3"/>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JLabel" name="programsRunLabel">
|
||||
<Properties>
|
||||
<Property name="horizontalAlignment" type="int" value="2"/>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties" key="DataSourceSummaryUserActivityPanel.programsRunLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="alignmentX" type="float" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||
<Connection code="Component.LEFT_ALIGNMENT" type="code"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Component class="javax.swing.Box$Filler" name="filler1">
|
||||
<Properties>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 2]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 2]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 2]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="classDetails" type="java.lang.String" value="Box.Filler.RigidArea"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Container class="javax.swing.JPanel" name="topProgramsTablePanel">
|
||||
<Properties>
|
||||
<Property name="alignmentX" type="float" value="0.0"/>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[32767, 106]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[10, 106]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[10, 106]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="topProgramsTable"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout"/>
|
||||
</Container>
|
||||
<Component class="javax.swing.Box$Filler" name="filler3">
|
||||
<Properties>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 20]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 20]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 20]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="classDetails" type="java.lang.String" value="Box.Filler.RigidArea"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="recentDomainsLabel">
|
||||
<Properties>
|
||||
<Property name="horizontalAlignment" type="int" value="2"/>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties" key="DataSourceSummaryUserActivityPanel.recentDomainsLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Component class="javax.swing.Box$Filler" name="filler2">
|
||||
<Properties>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 2]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 2]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 2]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="classDetails" type="java.lang.String" value="Box.Filler.RigidArea"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Container class="javax.swing.JPanel" name="recentDomainsTablePanel">
|
||||
<Properties>
|
||||
<Property name="alignmentX" type="float" value="0.0"/>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[32767, 106]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[10, 106]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[10, 106]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="recentDomainsTable"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout"/>
|
||||
</Container>
|
||||
<Component class="javax.swing.Box$Filler" name="filler4">
|
||||
<Properties>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 20]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 20]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 20]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="classDetails" type="java.lang.String" value="Box.Filler.RigidArea"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="topWebSearchLabel">
|
||||
<Properties>
|
||||
<Property name="horizontalAlignment" type="int" value="2"/>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties" key="DataSourceSummaryUserActivityPanel.topWebSearchLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Component class="javax.swing.Box$Filler" name="filler5">
|
||||
<Properties>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 2]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 2]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 2]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="classDetails" type="java.lang.String" value="Box.Filler.RigidArea"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Container class="javax.swing.JPanel" name="topWebSearches">
|
||||
<Properties>
|
||||
<Property name="alignmentX" type="float" value="0.0"/>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[32767, 106]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[10, 106]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[10, 106]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="topWebSearchesTable"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout"/>
|
||||
</Container>
|
||||
<Component class="javax.swing.Box$Filler" name="filler6">
|
||||
<Properties>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 20]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 20]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 20]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="classDetails" type="java.lang.String" value="Box.Filler.RigidArea"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="topDevicesAttachedLabel">
|
||||
<Properties>
|
||||
<Property name="horizontalAlignment" type="int" value="2"/>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties" key="DataSourceSummaryUserActivityPanel.topDevicesAttachedLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Component class="javax.swing.Box$Filler" name="filler7">
|
||||
<Properties>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 2]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 2]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 2]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="classDetails" type="java.lang.String" value="Box.Filler.RigidArea"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Container class="javax.swing.JPanel" name="recentDevicesAttached">
|
||||
<Properties>
|
||||
<Property name="alignmentX" type="float" value="0.0"/>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[32767, 106]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[10, 106]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[10, 106]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="topDevicesAttachedTable"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout"/>
|
||||
</Container>
|
||||
<Component class="javax.swing.Box$Filler" name="filler8">
|
||||
<Properties>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 20]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 20]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 20]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="classDetails" type="java.lang.String" value="Box.Filler.RigidArea"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="recentAccountsLabel">
|
||||
<Properties>
|
||||
<Property name="horizontalAlignment" type="int" value="2"/>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties" key="DataSourceSummaryUserActivityPanel.recentAccountsLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Component class="javax.swing.Box$Filler" name="filler9">
|
||||
<Properties>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 2]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 2]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[0, 2]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="classDetails" type="java.lang.String" value="Box.Filler.RigidArea"/>
|
||||
</AuxValues>
|
||||
</Component>
|
||||
<Container class="javax.swing.JPanel" name="topAccounts">
|
||||
<Properties>
|
||||
<Property name="alignmentX" type="float" value="0.0"/>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[32767, 106]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[10, 106]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[10, 106]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="topAccountsTable"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout"/>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Form>
|
||||
-390
@@ -1,390 +0,0 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2020 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> 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.datasourcesummary.ui;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceUserActivitySummary;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceTopProgramsSummary;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceUserActivitySummary.TopAccountResult;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceUserActivitySummary.TopDeviceAttachedResult;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceUserActivitySummary.TopWebSearchResult;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.TopDomainsResult;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.TopProgramsResult;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.CellModelTableCellRenderer.DefaultCellModel;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker.DataFetchComponents;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.JTablePanel;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.JTablePanel.ColumnModel;
|
||||
import org.sleuthkit.datamodel.DataSource;
|
||||
|
||||
/**
|
||||
* A panel to display user activity.
|
||||
*/
|
||||
@Messages({
|
||||
"DataSourceSummaryUserActivityPanel_tab_title=User Activity",
|
||||
"DataSourceSummaryUserActivityPanel_TopProgramsTableModel_name_header=Program",
|
||||
"DataSourceSummaryUserActivityPanel_TopProgramsTableModel_folder_header=Folder",
|
||||
"DataSourceSummaryUserActivityPanel_TopProgramsTableModel_count_header=Run Times",
|
||||
"DataSourceSummaryUserActivityPanel_TopProgramsTableModel_lastrun_header=Last Run",
|
||||
"DataSourceSummaryUserActivityPanel_TopDomainsTableModel_domain_header=Domain",
|
||||
"DataSourceSummaryUserActivityPanel_TopDomainsTableModel_url_header=URL",
|
||||
"DataSourceSummaryUserActivityPanel_TopDomainsTableModel_lastAccess_header=Last Access",
|
||||
"DataSourceSummaryUserActivityPanel_noDataExists=No communication data exists",
|
||||
"DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_searchString_header=Search String",
|
||||
"DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_dateAccessed_header=Date Accessed",
|
||||
"DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_translatedResult_header=Translated",
|
||||
"DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_deviceId_header=Device Id",
|
||||
"DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_makeModel_header=Make and Model",
|
||||
"DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_dateAccessed_header=Last Accessed",
|
||||
"DataSourceSummaryUserActivityPanel_TopAccountTableModel_accountType_header=Account Type",
|
||||
"DataSourceSummaryUserActivityPanel_TopAccountTableModel_lastAccess_header=Last Accessed",})
|
||||
public class DataSourceSummaryUserActivityPanel extends BaseDataSourceSummaryPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final DateFormat DATETIME_FORMAT = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss", Locale.getDefault());
|
||||
private static final int TOP_PROGS_COUNT = 10;
|
||||
private static final int TOP_DOMAINS_COUNT = 10;
|
||||
private static final int TOP_SEARCHES_COUNT = 10;
|
||||
private static final int TOP_ACCOUNTS_COUNT = 5;
|
||||
private static final int TOP_DEVICES_COUNT = 10;
|
||||
|
||||
/**
|
||||
* Gets a string formatted date or returns empty string if the date is null.
|
||||
*
|
||||
* @param date The date.
|
||||
*
|
||||
* @return The formatted date string or empty string if the date is null.
|
||||
*/
|
||||
private static String getFormatted(Date date) {
|
||||
return date == null ? "" : DATETIME_FORMAT.format(date);
|
||||
}
|
||||
|
||||
// set up recent programs table
|
||||
private final JTablePanel<TopProgramsResult> topProgramsTable = JTablePanel.getJTablePanel(Arrays.asList(
|
||||
// program name column
|
||||
new ColumnModel<>(
|
||||
Bundle.DataSourceSummaryUserActivityPanel_TopProgramsTableModel_name_header(),
|
||||
(prog) -> {
|
||||
return new DefaultCellModel(prog.getProgramName())
|
||||
.setTooltip(prog.getProgramPath());
|
||||
},
|
||||
250),
|
||||
// program folder column
|
||||
new ColumnModel<>(
|
||||
Bundle.DataSourceSummaryUserActivityPanel_TopProgramsTableModel_folder_header(),
|
||||
(prog) -> {
|
||||
return new DefaultCellModel(
|
||||
getShortFolderName(
|
||||
prog.getProgramPath(),
|
||||
prog.getProgramName()))
|
||||
.setTooltip(prog.getProgramPath());
|
||||
},
|
||||
150),
|
||||
// run count column
|
||||
new ColumnModel<>(
|
||||
Bundle.DataSourceSummaryUserActivityPanel_TopProgramsTableModel_count_header(),
|
||||
(prog) -> {
|
||||
String runTimes = prog.getRunTimes() == null ? "" : Long.toString(prog.getRunTimes());
|
||||
return new DefaultCellModel(runTimes);
|
||||
},
|
||||
80),
|
||||
// last run date column
|
||||
new ColumnModel<>(
|
||||
Bundle.DataSourceSummaryUserActivityPanel_TopProgramsTableModel_lastrun_header(),
|
||||
(prog) -> new DefaultCellModel(getFormatted(prog.getLastRun())),
|
||||
150)
|
||||
));
|
||||
|
||||
// set up recent domains table
|
||||
private final JTablePanel<TopDomainsResult> recentDomainsTable = JTablePanel.getJTablePanel(Arrays.asList(
|
||||
// domain column
|
||||
new ColumnModel<>(
|
||||
Bundle.DataSourceSummaryUserActivityPanel_TopDomainsTableModel_domain_header(),
|
||||
(recentDomain) -> new DefaultCellModel(recentDomain.getDomain()),
|
||||
250),
|
||||
// url column
|
||||
new ColumnModel<>(
|
||||
Bundle.DataSourceSummaryUserActivityPanel_TopDomainsTableModel_url_header(),
|
||||
(recentDomain) -> new DefaultCellModel(recentDomain.getUrl()),
|
||||
250),
|
||||
// last accessed column
|
||||
new ColumnModel<>(
|
||||
Bundle.DataSourceSummaryUserActivityPanel_TopDomainsTableModel_lastAccess_header(),
|
||||
(recentDomain) -> new DefaultCellModel(getFormatted(recentDomain.getLastVisit())),
|
||||
150)
|
||||
));
|
||||
|
||||
// top web searches table
|
||||
private final JTablePanel<TopWebSearchResult> topWebSearchesTable = JTablePanel.getJTablePanel(Arrays.asList(
|
||||
// search string column
|
||||
new ColumnModel<>(
|
||||
Bundle.DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_searchString_header(),
|
||||
(webSearch) -> new DefaultCellModel(webSearch.getSearchString()),
|
||||
250
|
||||
),
|
||||
// last accessed
|
||||
new ColumnModel<>(
|
||||
Bundle.DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_dateAccessed_header(),
|
||||
(webSearch) -> new DefaultCellModel(getFormatted(webSearch.getDateAccessed())),
|
||||
150
|
||||
),
|
||||
// translated value
|
||||
new ColumnModel<>(
|
||||
Bundle.DataSourceSummaryUserActivityPanel_TopWebSearchTableModel_translatedResult_header(),
|
||||
(webSearch) -> new DefaultCellModel(webSearch.getTranslatedResult()),
|
||||
250
|
||||
)
|
||||
));
|
||||
|
||||
// top devices attached table
|
||||
private final JTablePanel<TopDeviceAttachedResult> topDevicesAttachedTable = JTablePanel.getJTablePanel(Arrays.asList(
|
||||
// device id column
|
||||
new ColumnModel<>(
|
||||
Bundle.DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_deviceId_header(),
|
||||
(device) -> new DefaultCellModel(device.getDeviceId()),
|
||||
250
|
||||
),
|
||||
// last accessed
|
||||
new ColumnModel<>(
|
||||
Bundle.DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_dateAccessed_header(),
|
||||
(device) -> new DefaultCellModel(getFormatted(device.getDateAccessed())),
|
||||
150
|
||||
),
|
||||
// make and model
|
||||
new ColumnModel<>(
|
||||
Bundle.DataSourceSummaryUserActivityPanel_TopDeviceAttachedTableModel_makeModel_header(),
|
||||
(device) -> {
|
||||
String make = StringUtils.isBlank(device.getDeviceMake()) ? "" : device.getDeviceMake().trim();
|
||||
String model = StringUtils.isBlank(device.getDeviceModel()) ? "" : device.getDeviceModel().trim();
|
||||
String makeModelString = (make.isEmpty() || model.isEmpty())
|
||||
? make + model
|
||||
: String.format("%s - %s", make, model);
|
||||
return new DefaultCellModel(makeModelString);
|
||||
},
|
||||
250
|
||||
)
|
||||
));
|
||||
|
||||
// top accounts table
|
||||
private final JTablePanel<TopAccountResult> topAccountsTable = JTablePanel.getJTablePanel(Arrays.asList(
|
||||
// account type column
|
||||
new ColumnModel<>(
|
||||
Bundle.DataSourceSummaryUserActivityPanel_TopAccountTableModel_accountType_header(),
|
||||
(account) -> new DefaultCellModel(account.getAccountType()),
|
||||
250
|
||||
),
|
||||
// last accessed
|
||||
new ColumnModel<>(
|
||||
Bundle.DataSourceSummaryUserActivityPanel_TopAccountTableModel_lastAccess_header(),
|
||||
(account) -> new DefaultCellModel(getFormatted(account.getLastAccess())),
|
||||
150
|
||||
)
|
||||
));
|
||||
|
||||
private final List<JTablePanel<?>> tables = Arrays.asList(
|
||||
topProgramsTable,
|
||||
recentDomainsTable,
|
||||
topWebSearchesTable,
|
||||
topDevicesAttachedTable,
|
||||
topAccountsTable
|
||||
);
|
||||
|
||||
private final List<DataFetchComponents<DataSource, ?>> dataFetchComponents;
|
||||
private final DataSourceTopProgramsSummary topProgramsData;
|
||||
|
||||
/**
|
||||
* Creates a new DataSourceSummaryUserActivityPanel.
|
||||
*/
|
||||
public DataSourceSummaryUserActivityPanel() {
|
||||
this(new DataSourceTopProgramsSummary(), new DataSourceUserActivitySummary());
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new DataSourceSummaryUserActivityPanel.
|
||||
*
|
||||
* @param topProgramsData Class from which to obtain top programs data.
|
||||
* @param userActivityData Class from which to obtain remaining user
|
||||
* activity data.
|
||||
*/
|
||||
public DataSourceSummaryUserActivityPanel(
|
||||
DataSourceTopProgramsSummary topProgramsData,
|
||||
DataSourceUserActivitySummary userActivityData) {
|
||||
|
||||
this.topProgramsData = topProgramsData;
|
||||
|
||||
// set up data acquisition methods
|
||||
this.dataFetchComponents = Arrays.asList(
|
||||
// top programs query
|
||||
new DataFetchComponents<>(
|
||||
(dataSource) -> topProgramsData.getTopPrograms(dataSource, TOP_PROGS_COUNT),
|
||||
(result) -> topProgramsTable.showDataFetchResult(result, JTablePanel.getDefaultErrorMessage(),
|
||||
Bundle.DataSourceSummaryUserActivityPanel_noDataExists())),
|
||||
// top domains query
|
||||
new DataFetchComponents<>(
|
||||
(dataSource) -> userActivityData.getRecentDomains(dataSource, TOP_DOMAINS_COUNT),
|
||||
(result) -> recentDomainsTable.showDataFetchResult(result, JTablePanel.getDefaultErrorMessage(),
|
||||
Bundle.DataSourceSummaryUserActivityPanel_noDataExists())),
|
||||
// top web searches query
|
||||
new DataFetchComponents<>(
|
||||
(dataSource) -> userActivityData.getMostRecentWebSearches(dataSource, TOP_SEARCHES_COUNT),
|
||||
(result) -> topWebSearchesTable.showDataFetchResult(result, JTablePanel.getDefaultErrorMessage(),
|
||||
Bundle.DataSourceSummaryUserActivityPanel_noDataExists())),
|
||||
// top devices query
|
||||
new DataFetchComponents<>(
|
||||
(dataSource) -> userActivityData.getRecentDevices(dataSource, TOP_DEVICES_COUNT),
|
||||
(result) -> topDevicesAttachedTable.showDataFetchResult(result, JTablePanel.getDefaultErrorMessage(),
|
||||
Bundle.DataSourceSummaryUserActivityPanel_noDataExists())),
|
||||
// top accounts query
|
||||
new DataFetchComponents<>(
|
||||
(dataSource) -> userActivityData.getRecentAccounts(dataSource, TOP_ACCOUNTS_COUNT),
|
||||
(result) -> topAccountsTable.showDataFetchResult(result, JTablePanel.getDefaultErrorMessage(),
|
||||
Bundle.DataSourceSummaryUserActivityPanel_noDataExists()))
|
||||
);
|
||||
|
||||
initComponents();
|
||||
}
|
||||
|
||||
/**
|
||||
* Queries DataSourceTopProgramsSummary instance for short folder name.
|
||||
*
|
||||
* @param path The path for the application.
|
||||
* @param appName The application name.
|
||||
*
|
||||
* @return The underlying short folder name if one exists.
|
||||
*/
|
||||
private String getShortFolderName(String path, String appName) {
|
||||
return this.topProgramsData.getShortFolderName(path, appName);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
* regenerated by the Form Editor.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
javax.swing.JScrollPane contentScrollPane = new javax.swing.JScrollPane();
|
||||
javax.swing.JPanel contentPanel = new javax.swing.JPanel();
|
||||
javax.swing.JLabel programsRunLabel = new javax.swing.JLabel();
|
||||
javax.swing.Box.Filler filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2));
|
||||
javax.swing.JPanel topProgramsTablePanel = topProgramsTable;
|
||||
javax.swing.Box.Filler filler3 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20));
|
||||
javax.swing.JLabel recentDomainsLabel = new javax.swing.JLabel();
|
||||
javax.swing.Box.Filler filler2 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2));
|
||||
javax.swing.JPanel recentDomainsTablePanel = recentDomainsTable;
|
||||
javax.swing.Box.Filler filler4 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20));
|
||||
javax.swing.JLabel topWebSearchLabel = new javax.swing.JLabel();
|
||||
javax.swing.Box.Filler filler5 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2));
|
||||
javax.swing.JPanel topWebSearches = topWebSearchesTable;
|
||||
javax.swing.Box.Filler filler6 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20));
|
||||
javax.swing.JLabel topDevicesAttachedLabel = new javax.swing.JLabel();
|
||||
javax.swing.Box.Filler filler7 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2));
|
||||
javax.swing.JPanel recentDevicesAttached = topDevicesAttachedTable;
|
||||
javax.swing.Box.Filler filler8 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20), new java.awt.Dimension(0, 20));
|
||||
javax.swing.JLabel recentAccountsLabel = new javax.swing.JLabel();
|
||||
javax.swing.Box.Filler filler9 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2), new java.awt.Dimension(0, 2));
|
||||
javax.swing.JPanel topAccounts = topAccountsTable;
|
||||
|
||||
setLayout(new java.awt.BorderLayout());
|
||||
|
||||
contentScrollPane.setMaximumSize(null);
|
||||
contentScrollPane.setMinimumSize(null);
|
||||
|
||||
contentPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));
|
||||
contentPanel.setMaximumSize(new java.awt.Dimension(32767, 450));
|
||||
contentPanel.setMinimumSize(new java.awt.Dimension(10, 450));
|
||||
contentPanel.setLayout(new javax.swing.BoxLayout(contentPanel, javax.swing.BoxLayout.PAGE_AXIS));
|
||||
|
||||
programsRunLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
|
||||
org.openide.awt.Mnemonics.setLocalizedText(programsRunLabel, org.openide.util.NbBundle.getMessage(DataSourceSummaryUserActivityPanel.class, "DataSourceSummaryUserActivityPanel.programsRunLabel.text")); // NOI18N
|
||||
programsRunLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
|
||||
contentPanel.add(programsRunLabel);
|
||||
contentPanel.add(filler1);
|
||||
|
||||
topProgramsTablePanel.setAlignmentX(0.0F);
|
||||
topProgramsTablePanel.setMaximumSize(new java.awt.Dimension(32767, 106));
|
||||
topProgramsTablePanel.setMinimumSize(new java.awt.Dimension(10, 106));
|
||||
topProgramsTablePanel.setPreferredSize(new java.awt.Dimension(10, 106));
|
||||
contentPanel.add(topProgramsTablePanel);
|
||||
contentPanel.add(filler3);
|
||||
|
||||
recentDomainsLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
|
||||
org.openide.awt.Mnemonics.setLocalizedText(recentDomainsLabel, org.openide.util.NbBundle.getMessage(DataSourceSummaryUserActivityPanel.class, "DataSourceSummaryUserActivityPanel.recentDomainsLabel.text")); // NOI18N
|
||||
contentPanel.add(recentDomainsLabel);
|
||||
contentPanel.add(filler2);
|
||||
|
||||
recentDomainsTablePanel.setAlignmentX(0.0F);
|
||||
recentDomainsTablePanel.setMaximumSize(new java.awt.Dimension(32767, 106));
|
||||
recentDomainsTablePanel.setMinimumSize(new java.awt.Dimension(10, 106));
|
||||
recentDomainsTablePanel.setPreferredSize(new java.awt.Dimension(10, 106));
|
||||
contentPanel.add(recentDomainsTablePanel);
|
||||
contentPanel.add(filler4);
|
||||
|
||||
topWebSearchLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
|
||||
org.openide.awt.Mnemonics.setLocalizedText(topWebSearchLabel, org.openide.util.NbBundle.getMessage(DataSourceSummaryUserActivityPanel.class, "DataSourceSummaryUserActivityPanel.topWebSearchLabel.text")); // NOI18N
|
||||
contentPanel.add(topWebSearchLabel);
|
||||
contentPanel.add(filler5);
|
||||
|
||||
topWebSearches.setAlignmentX(0.0F);
|
||||
topWebSearches.setMaximumSize(new java.awt.Dimension(32767, 106));
|
||||
topWebSearches.setMinimumSize(new java.awt.Dimension(10, 106));
|
||||
topWebSearches.setPreferredSize(new java.awt.Dimension(10, 106));
|
||||
contentPanel.add(topWebSearches);
|
||||
contentPanel.add(filler6);
|
||||
|
||||
topDevicesAttachedLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
|
||||
org.openide.awt.Mnemonics.setLocalizedText(topDevicesAttachedLabel, org.openide.util.NbBundle.getMessage(DataSourceSummaryUserActivityPanel.class, "DataSourceSummaryUserActivityPanel.topDevicesAttachedLabel.text")); // NOI18N
|
||||
contentPanel.add(topDevicesAttachedLabel);
|
||||
contentPanel.add(filler7);
|
||||
|
||||
recentDevicesAttached.setAlignmentX(0.0F);
|
||||
recentDevicesAttached.setMaximumSize(new java.awt.Dimension(32767, 106));
|
||||
recentDevicesAttached.setMinimumSize(new java.awt.Dimension(10, 106));
|
||||
recentDevicesAttached.setPreferredSize(new java.awt.Dimension(10, 106));
|
||||
contentPanel.add(recentDevicesAttached);
|
||||
contentPanel.add(filler8);
|
||||
|
||||
recentAccountsLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
|
||||
org.openide.awt.Mnemonics.setLocalizedText(recentAccountsLabel, org.openide.util.NbBundle.getMessage(DataSourceSummaryUserActivityPanel.class, "DataSourceSummaryUserActivityPanel.recentAccountsLabel.text")); // NOI18N
|
||||
contentPanel.add(recentAccountsLabel);
|
||||
contentPanel.add(filler9);
|
||||
|
||||
topAccounts.setAlignmentX(0.0F);
|
||||
topAccounts.setMaximumSize(new java.awt.Dimension(32767, 106));
|
||||
topAccounts.setMinimumSize(new java.awt.Dimension(10, 106));
|
||||
topAccounts.setPreferredSize(new java.awt.Dimension(10, 106));
|
||||
contentPanel.add(topAccounts);
|
||||
|
||||
contentScrollPane.setViewportView(contentPanel);
|
||||
|
||||
add(contentScrollPane, java.awt.BorderLayout.CENTER);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
// End of variables declaration//GEN-END:variables
|
||||
}
|
||||
@@ -63,11 +63,23 @@ public final class RecentFilesPanel extends BaseDataSourceSummaryPanel {
|
||||
* Creates new form RecentFilesPanel
|
||||
*/
|
||||
public RecentFilesPanel(RecentFilesSummary dataHandler) {
|
||||
super(dataHandler);
|
||||
this.dataHandler = dataHandler;
|
||||
|
||||
initComponents();
|
||||
initalizeTables();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void fetchInformation(DataSource dataSource) {
|
||||
fetchInformation(dataFetchComponents, dataSource);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onNewDataSource(DataSource dataSource) {
|
||||
onNewDataSource(dataFetchComponents, tablePanelList, dataSource);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Setup the data model and columns for the panel tables.
|
||||
@@ -271,5 +283,4 @@ public final class RecentFilesPanel extends BaseDataSourceSummaryPanel {
|
||||
private javax.swing.JPanel downloadsPane;
|
||||
private javax.swing.JPanel openedDocPane;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ import org.apache.commons.lang3.tuple.Pair;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.coreutils.FileTypeUtils.FileTypeCategory;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceCountsSummary;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceTypesSummary;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceDetailsSummary;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.DataSourceMimeTypeSummary;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.AbstractLoadableComponent;
|
||||
@@ -143,8 +143,7 @@ class TypesPanel extends BaseDataSourceSummaryPanel {
|
||||
);
|
||||
|
||||
// all of the means for obtaining data for the gui components.
|
||||
private final List<DataFetchComponents<DataSource, ?>> dataFetchComponents = Arrays.asList(
|
||||
// usage label worker
|
||||
private final List<DataFetchComponents<DataSource, ?>> dataFetchComponents = Arrays.asList(// usage label worker
|
||||
new DataFetchWorker.DataFetchComponents<>(
|
||||
DataSourceDetailsSummary::getDataSourceType,
|
||||
usageLabel::showDataFetchResult),
|
||||
@@ -165,19 +164,19 @@ class TypesPanel extends BaseDataSourceSummaryPanel {
|
||||
fileMimeTypesChart::showDataFetchResult),
|
||||
// allocated files worker
|
||||
new DataFetchWorker.DataFetchComponents<>(
|
||||
(dataSource) -> getStringOrZero(DataSourceCountsSummary.getCountOfAllocatedFiles(dataSource)),
|
||||
(dataSource) -> getStringOrZero(DataSourceTypesSummary.getCountOfAllocatedFiles(dataSource)),
|
||||
allocatedLabel::showDataFetchResult),
|
||||
// unallocated files worker
|
||||
new DataFetchWorker.DataFetchComponents<>(
|
||||
(dataSource) -> getStringOrZero(DataSourceCountsSummary.getCountOfUnallocatedFiles(dataSource)),
|
||||
(dataSource) -> getStringOrZero(DataSourceTypesSummary.getCountOfUnallocatedFiles(dataSource)),
|
||||
unallocatedLabel::showDataFetchResult),
|
||||
// slack files worker
|
||||
new DataFetchWorker.DataFetchComponents<>(
|
||||
(dataSource) -> getStringOrZero(DataSourceCountsSummary.getCountOfSlackFiles(dataSource)),
|
||||
(dataSource) -> getStringOrZero(DataSourceTypesSummary.getCountOfSlackFiles(dataSource)),
|
||||
slackLabel::showDataFetchResult),
|
||||
// directories worker
|
||||
new DataFetchWorker.DataFetchComponents<>(
|
||||
(dataSource) -> getStringOrZero(DataSourceCountsSummary.getCountOfDirectories(dataSource)),
|
||||
(dataSource) -> getStringOrZero(DataSourceTypesSummary.getCountOfDirectories(dataSource)),
|
||||
directoriesLabel::showDataFetchResult)
|
||||
);
|
||||
|
||||
@@ -186,8 +185,6 @@ class TypesPanel extends BaseDataSourceSummaryPanel {
|
||||
*/
|
||||
public TypesPanel() {
|
||||
initComponents();
|
||||
setDataFetchComponents(this.dataFetchComponents);
|
||||
setLoadableComponents(this.loadables);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user