diff --git a/Core/src/org/sleuthkit/autopsy/discovery/search/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/discovery/search/Bundle.properties-MERGED index 0ba7683fcb..ac2756ea33 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/search/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/discovery/search/Bundle.properties-MERGED @@ -57,6 +57,7 @@ FileSorter.SortingMethod.fullPath.displayName=Full Path FileSorter.SortingMethod.keywordlist.displayName=Keyword List Names FileSorter.SortingMethod.pageViews.displayName=Page Views ResultDomain_getDefaultCategory=Uncategorized +ResultDomain_noAccountTypes=Unknown ResultFile.score.interestingResult.description=At least one instance of the file has an interesting result associated with it. ResultFile.score.notableFile.description=At least one instance of the file was recognized as notable. ResultFile.score.notableTaggedFile.description=At least one instance of the file is tagged with a notable tag. diff --git a/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCacheLoader.java b/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCacheLoader.java index afc305e53a..6c233bd37d 100755 --- a/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCacheLoader.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCacheLoader.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2020 Basis Technology Corp. + * Copyright 2020-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -44,11 +44,13 @@ import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_D import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_HISTORY; import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_ACCOUNT_TYPE; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN; +import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TEXT; import org.sleuthkit.datamodel.CaseDbAccessManager; import org.sleuthkit.datamodel.CaseDbAccessManager.CaseDbAccessQueryCallback; import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; +import org.sleuthkit.datamodel.TskData; /** * Loads domain search results for cache misses. This loader is a Guava cache @@ -103,11 +105,9 @@ class DomainSearchCacheLoader extends CacheLoader filterClauses = createWhereAndHavingClause(key.getFilters()); - final String whereClause = filterClauses.getLeft(); - final String havingClause = filterClauses.getRight(); - - // You may think of each row of this result as a TSK_DOMAIN attribute, where the parent + final Pair domainsFilterClauses = createWhereAndHavingClause(key.getFilters()); + final String domainsWhereClause = domainsFilterClauses.getLeft(); + final String domainsHavingClause = domainsFilterClauses.getRight(); // artifact type is within the (optional) filter and the parent artifact // had a date time attribute that was within the (optional) filter. With this // table in hand, we can simply group by domain and apply aggregate functions @@ -118,10 +118,31 @@ class DomainSearchCacheLoader extends CacheLoader '' " + + " AND (artifact_type_id = " + TSK_WEB_ACCOUNT_TYPE.getTypeID() + ")) " + + "GROUP BY artifact_id "; + // Needed to populate the visitsInLast60 data. final Instant mostRecentActivityDate = Instant.ofEpochSecond(caseDb.getTimelineManager().getMaxEventTime()); final Instant sixtyDaysAgo = mostRecentActivityDate.minus(60, ChronoUnit.DAYS); @@ -166,16 +187,18 @@ class DomainSearchCacheLoader extends CacheLoader createWhereAndHavingClause(List filters) { - final StringJoiner whereClause = new StringJoiner(" OR "); - final StringJoiner havingClause = new StringJoiner(" AND "); + final StringJoiner whereClause = new StringJoiner(" OR ", "(", ")"); + final StringJoiner havingClause = new StringJoiner(" AND ", "(", ")"); // Capture all types by default. ArtifactTypeFilter artifactTypeFilter = new ArtifactTypeFilter(SearchData.Type.DOMAIN.getArtifactTypes()); @@ -219,7 +242,7 @@ class DomainSearchCacheLoader extends CacheLoader 0; } + /** + * Get the account types which are associated with this domain. + * + * @return A comma seperated list of account types which are associated with + * this domain, or "Unknown" if no account types were associated + * with it. + */ + @NbBundle.Messages({ + "ResultDomain_noAccountTypes=Unknown" + }) + public String getAccountTypes() { + if (StringUtils.isBlank(accountTypes)) { + return Bundle.ResultDomain_noAccountTypes(); + } + return accountTypes; + } + @Override public long getDataSourceObjectId() { return this.dataSourceId; diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/discovery/ui/Bundle.properties-MERGED index 82752e24e9..f24ec80db6 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/Bundle.properties-MERGED @@ -59,13 +59,12 @@ DomainDetailsPanel.miniTimelineTitle.text=Timeline DomainSummaryPanel.activity.text=Activity: {0} to {1} DomainSummaryPanel.category.text=Category: DomainSummaryPanel.downloads.text=Files downloaded: -DomainSummaryPanel.known.text=User role: Known account type(s) DomainSummaryPanel.loadingImages.text=Loading thumbnail... DomainSummaryPanel.no.text=No DomainSummaryPanel.notability.text=Previously tagged as notable: DomainSummaryPanel.pages.text=Page views in final 60 days: DomainSummaryPanel.totalPages.text=Total page views: -DomainSummaryPanel.unknown.text=User role: Unknown +DomainSummaryPanel.userRole.text=Account type: DomainSummaryPanel.yes.text=Yes GroupsListPanel.noDomainResults.message.text=No domains were found for the selected filters.\n\nReminder:\n -The Recent Activity module must be run on each data source you want to find results in.\n -The Central Repository module must be run on each data source if you want to filter or sort by past occurrences.\n -The iOS Analyzer (iLEAPP) module must be run on each data source which contains data from an iOS device.\n GroupsListPanel.noFileResults.message.text=No files were found for the selected filters.\n\nReminder:\n -The File Type Identification module must be run on each data source you want to find results in.\n -The Hash Lookup module must be run on each data source if you want to filter by past occurrence.\n -The Picture Analyzer module must be run on each data source if you are filtering by User Created content. diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainSummaryPanel.form b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainSummaryPanel.form index 9e7fd5fd3c..68f72f9a78 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainSummaryPanel.form +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainSummaryPanel.form @@ -27,20 +27,23 @@ - + + - - + + + + + - + - + + - - @@ -58,12 +61,12 @@ - + - + @@ -73,8 +76,11 @@ - - + + + + + @@ -131,5 +137,7 @@ + + diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainSummaryPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainSummaryPanel.java index 6076fc9aa0..1d5a2f6d99 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainSummaryPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainSummaryPanel.java @@ -1,7 +1,7 @@ /* * Autopsy * - * Copyright 2020 Basis Technology Corp. + * Copyright 2020-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -69,6 +69,7 @@ class DomainSummaryPanel extends javax.swing.JPanel implements ListCellRenderer< totalVisitsLabel = new javax.swing.JLabel(); domainNotabilityLabel = new javax.swing.JLabel(); categoryLabel = new javax.swing.JLabel(); + knownAccountTypesLabel = new javax.swing.JLabel(); setBorder(javax.swing.BorderFactory.createEtchedBorder()); @@ -90,17 +91,19 @@ class DomainSummaryPanel extends javax.swing.JPanel implements ListCellRenderer< .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(domainNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(pagesLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) - .addComponent(filesDownloadedLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) - .addComponent(activityLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(totalVisitsLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(filesDownloadedLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) + .addComponent(activityLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(domainNotabilityLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) - .addComponent(categoryLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGap(4, 4, 4)) - .addComponent(pagesLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(totalVisitsLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(domainNotabilityLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 295, Short.MAX_VALUE) + .addComponent(categoryLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(knownAccountTypesLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(4, 4, 4))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(numberOfImagesLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) @@ -117,11 +120,11 @@ class DomainSummaryPanel extends javax.swing.JPanel implements ListCellRenderer< .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(numberOfImagesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 8, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(sampleImageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addComponent(domainNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, 15, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(activityLabel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(domainNotabilityLabel, javax.swing.GroupLayout.Alignment.TRAILING)) @@ -129,8 +132,10 @@ class DomainSummaryPanel extends javax.swing.JPanel implements ListCellRenderer< .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(filesDownloadedLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 14, Short.MAX_VALUE) .addComponent(categoryLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(totalVisitsLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 14, Short.MAX_VALUE) + .addGap(9, 9, 9) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(totalVisitsLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 14, Short.MAX_VALUE) + .addComponent(knownAccountTypesLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(pagesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(1, 1, 1))) @@ -150,6 +155,7 @@ class DomainSummaryPanel extends javax.swing.JPanel implements ListCellRenderer< private javax.swing.JLabel domainNameLabel; private javax.swing.JLabel domainNotabilityLabel; private javax.swing.JLabel filesDownloadedLabel; + private javax.swing.JLabel knownAccountTypesLabel; private javax.swing.JLabel numberOfImagesLabel; private javax.swing.JLabel pagesLabel; private javax.swing.JLabel sampleImageLabel; @@ -164,8 +170,7 @@ class DomainSummaryPanel extends javax.swing.JPanel implements ListCellRenderer< "DomainSummaryPanel.totalPages.text=Total page views: ", "DomainSummaryPanel.downloads.text=Files downloaded: ", "DomainSummaryPanel.notability.text=Previously tagged as notable: ", - "DomainSummaryPanel.unknown.text=User role: Unknown", - "DomainSummaryPanel.known.text=User role: Known account type(s)", + "DomainSummaryPanel.userRole.text=Account type: ", "DomainSummaryPanel.category.text=Category: ", "DomainSummaryPanel.loadingImages.text=Loading thumbnail...", "DomainSummaryPanel.no.text=No", @@ -188,6 +193,7 @@ class DomainSummaryPanel extends javax.swing.JPanel implements ListCellRenderer< totalVisitsLabel.setText(Bundle.DomainSummaryPanel_totalPages_text() + value.getResultDomain().getTotalPageViews()); pagesLabel.setText(Bundle.DomainSummaryPanel_pages_text() + value.getResultDomain().getPageViewsInLast60Days()); filesDownloadedLabel.setText(Bundle.DomainSummaryPanel_downloads_text() + value.getResultDomain().getFilesDownloaded()); + knownAccountTypesLabel.setText(Bundle.DomainSummaryPanel_userRole_text() + value.getResultDomain().getAccountTypes()); if (value.getThumbnail() == null) { numberOfImagesLabel.setText(Bundle.DomainSummaryPanel_loadingImages_text()); sampleImageLabel.setIcon(null); diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestTaskPipeline.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestTaskPipeline.java index 5e918d4ddb..f7451dd9d8 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestTaskPipeline.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestTaskPipeline.java @@ -323,6 +323,11 @@ abstract class IngestTaskPipeline { * performing the task. */ abstract void performTask(IngestJobPipeline ingestJobPipeline, T task) throws IngestModuleException; + + @Override + public void shutDown() { + module.shutDown(); + } }