More tests, code cleanup

This commit is contained in:
Eugene Livis 2021-11-15 13:27:41 -05:00
parent 0144996d4d
commit 2764c5a2ce
2 changed files with 32 additions and 82 deletions

View File

@ -21,64 +21,38 @@ package org.sleuthkit.autopsy.mainui.datamodel;
import com.google.common.cache.Cache; import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.apache.commons.lang3.StringUtils;
import org.openide.util.Exceptions;
import org.openide.util.NbBundle; import org.openide.util.NbBundle;
import org.openide.util.NbBundle.Messages; import org.openide.util.NbBundle.Messages;
import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
import org.sleuthkit.autopsy.casemodule.events.BlackBoardArtifactTagAddedEvent;
import org.sleuthkit.autopsy.casemodule.events.BlackBoardArtifactTagDeletedEvent;
import org.sleuthkit.autopsy.casemodule.events.ContentTagAddedEvent;
import org.sleuthkit.autopsy.casemodule.events.ContentTagDeletedEvent;
import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.autopsy.coreutils.TimeZoneUtils;
import org.sleuthkit.autopsy.events.AutopsyEvent;
import org.sleuthkit.autopsy.ingest.IngestManager; import org.sleuthkit.autopsy.ingest.IngestManager;
import org.sleuthkit.autopsy.ingest.ModuleDataEvent; import org.sleuthkit.autopsy.ingest.ModuleDataEvent;
import org.sleuthkit.autopsy.mainui.nodes.DAOFetcher; import org.sleuthkit.autopsy.mainui.nodes.DAOFetcher;
import org.sleuthkit.datamodel.AbstractFile;
import org.sleuthkit.datamodel.Account; import org.sleuthkit.datamodel.Account;
import org.sleuthkit.datamodel.Blackboard; import org.sleuthkit.datamodel.Blackboard;
import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardArtifact;
import org.sleuthkit.datamodel.BlackboardArtifactTag;
import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.BlackboardAttribute;
import org.sleuthkit.datamodel.Content;
import org.sleuthkit.datamodel.ContentTag;
import org.sleuthkit.datamodel.DataArtifact;
import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.SleuthkitCase;
import org.sleuthkit.datamodel.Tag;
import org.sleuthkit.datamodel.TagName;
import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskCoreException;
/** /**
* Provides information to populate the results viewer for data in the * Provides information to populate the results viewer for data in the
* Communication Accounts section. * Communication Accounts section.
*/ */
@Messages({"CommAccountsDAO.fileColumns.originalName=Source Name", @Messages({"CommAccountsDAO.fileColumns.noDescription=No Description"})
"CommAccountsDAO.fileColumns.noDescription=No Description"})
public class CommAccountsDAO { public class CommAccountsDAO {
private static final int CACHE_SIZE = Account.Type.PREDEFINED_ACCOUNT_TYPES.size(); // number of cached SearchParams sub-types private static final int CACHE_SIZE = Account.Type.PREDEFINED_ACCOUNT_TYPES.size(); // number of cached SearchParams sub-types
private static final long CACHE_DURATION = 2; private static final long CACHE_DURATION = 2;
private static final TimeUnit CACHE_DURATION_UNITS = TimeUnit.MINUTES; private static final TimeUnit CACHE_DURATION_UNITS = TimeUnit.MINUTES;
private final Cache<SearchParams<?>, SearchResultsDTO> searchParamsCache = CacheBuilder.newBuilder().maximumSize(CACHE_SIZE).expireAfterAccess(CACHE_DURATION, CACHE_DURATION_UNITS).build(); private final Cache<SearchParams<?>, SearchResultsDTO> searchParamsCache = CacheBuilder.newBuilder().maximumSize(CACHE_SIZE).expireAfterAccess(CACHE_DURATION, CACHE_DURATION_UNITS).build();
private static final List<ColumnKey> FILE_TAG_COLUMNS = Arrays.asList(
getFileColumnKey(Bundle.CommAccountsDAO_fileColumns_originalName()) // GVDTODO handle translation
);
private static CommAccountsDAO instance = null; private static CommAccountsDAO instance = null;
@ -90,10 +64,6 @@ public class CommAccountsDAO {
return instance; return instance;
} }
private static ColumnKey getFileColumnKey(String name) {
return new ColumnKey(name, name, Bundle.CommAccountsDAO_fileColumns_noDescription());
}
public SearchResultsDTO getCommAcounts(CommAccountsSearchParams key, long startItem, Long maxCount, boolean hardRefresh) throws ExecutionException, IllegalArgumentException { public SearchResultsDTO getCommAcounts(CommAccountsSearchParams key, long startItem, Long maxCount, boolean hardRefresh) throws ExecutionException, IllegalArgumentException {
if (key.getType() == null) { if (key.getType() == null) {
throw new IllegalArgumentException("Must have non-null type"); throw new IllegalArgumentException("Must have non-null type");
@ -165,51 +135,10 @@ public class CommAccountsDAO {
// Populate the attributes for paged artifacts in the list. This is done using one database call as an efficient way to // Populate the attributes for paged artifacts in the list. This is done using one database call as an efficient way to
// load many artifacts/attributes at once. // load many artifacts/attributes at once.
blackboard.loadBlackboardAttributes(pagedArtifacts); blackboard.loadBlackboardAttributes(pagedArtifacts);
List<RowDTO> fileRows = new ArrayList<>();
DataArtifactDAO dataArtDAO = MainDAO.getInstance().getDataArtifactsDAO(); DataArtifactDAO dataArtDAO = MainDAO.getInstance().getDataArtifactsDAO();
BlackboardArtifactDAO.TableData tableData = dataArtDAO.createTableData(BlackboardArtifact.Type.TSK_ACCOUNT, pagedArtifacts); BlackboardArtifactDAO.TableData tableData = dataArtDAO.createTableData(BlackboardArtifact.Type.TSK_ACCOUNT, pagedArtifacts);
return new DataArtifactTableSearchResultsDTO(BlackboardArtifact.Type.TSK_ACCOUNT, tableData.columnKeys, tableData.rows, cacheKey.getStartItem(), allArtifacts.size()); return new DataArtifactTableSearchResultsDTO(BlackboardArtifact.Type.TSK_ACCOUNT, tableData.columnKeys, tableData.rows, cacheKey.getStartItem(), allArtifacts.size());
/*
while (rs.next()) {
tempList.add(rs.getLong("artifact_obj_id")); // NON-NLS
}
long totalResultsCount = getTotalResultsCount(cacheKey, numResults);
for (DataArtifact account : arts) {
Account blackboardTag = (Account) account;
String name = blackboardTag.getContent().getName(); // As a backup.
try {
name = blackboardTag.getArtifact().getShortDescription();
} catch (TskCoreException ignore) {
// it's a WARNING, skip
}
String contentPath;
try {
contentPath = blackboardTag.getContent().getUniquePath();
} catch (TskCoreException ex) {
contentPath = NbBundle.getMessage(this.getClass(), "BlackboardArtifactTagNode.createSheet.unavail.text");
}
List<Object> cellValues = Arrays.asList(name,
null, // GVDTODO translation column
contentPath,
blackboardTag.getArtifact().getDisplayName(),
blackboardTag.getComment(),
blackboardTag.getUserName());
fileRows.add(new BlackboardArtifactTagsRowDTO(
blackboardTag,
cellValues,
blackboardTag.getId()));
}
return new BaseSearchResultsDTO(BlackboardArtifactTagsRowDTO.getTypeIdForClass(), Bundle.ResultTag_name_text(), RESULT_TAG_COLUMNS, fileRows, 0, allAccounts.size());*/
} }
/** /**

View File

@ -136,8 +136,8 @@ public class TableSearchTest extends NbTestCase {
private static final String EMAIL_A = "aaa@yahoo.com"; private static final String EMAIL_A = "aaa@yahoo.com";
private static final String EMAIL_B = "bbb@gmail.com"; private static final String EMAIL_B = "bbb@gmail.com";
private static final String EMAIL_C = "ccc@funmail.com"; private static final String EMAIL_C = "ccc@funmail.com";
private static final String PHONENUM_1 = "111 777 1111"; private static final String PHONENUM_1 = "1117771111";
private static final String PHONENUM_2 = "222 333 7777"; private static final String PHONENUM_2 = "2223337777";
///////////////////////////////////////////////// /////////////////////////////////////////////////
// Data to be used across the test methods. // Data to be used across the test methods.
@ -509,9 +509,11 @@ public class TableSearchTest extends NbTestCase {
// Add communication accounts // Add communication accounts
openCase.getSleuthkitCase().getCommunicationsManager().createAccountFileInstance(Account.Type.EMAIL, EMAIL_A, "Test Module", fileA1); openCase.getSleuthkitCase().getCommunicationsManager().createAccountFileInstance(Account.Type.EMAIL, EMAIL_A, "Test Module", fileA1);
openCase.getSleuthkitCase().getCommunicationsManager().createAccountFileInstance(Account.Type.EMAIL, EMAIL_B, "Test Module", fileA2); openCase.getSleuthkitCase().getCommunicationsManager().createAccountFileInstance(Account.Type.EMAIL, EMAIL_B, "Test Module", fileA2);
AccountFileInstance deviceAccount_2 = openCase.getSleuthkitCase().getCommunicationsManager().createAccountFileInstance(Account.Type.DEVICE, "devId1", "Test Module", fileA2); openCase.getSleuthkitCase().getCommunicationsManager().createAccountFileInstance(Account.Type.DEVICE, "devId1", "Test Module", fileA2);
openCase.getSleuthkitCase().getCommunicationsManager().createAccountFileInstance(Account.Type.PHONE, PHONENUM_1, "Test Module", fileA2);
openCase.getSleuthkitCase().getCommunicationsManager().createAccountFileInstance(Account.Type.EMAIL, EMAIL_C, "Test Module", customFile); openCase.getSleuthkitCase().getCommunicationsManager().createAccountFileInstance(Account.Type.EMAIL, EMAIL_C, "Test Module", customFile);
openCase.getSleuthkitCase().getCommunicationsManager().createAccountFileInstance(Account.Type.PHONE, PHONENUM_2, "Test Module", customFile);
} catch (TestUtilsException | TskCoreException | BlackboardException | TagsManager.TagNameAlreadyExistsException | OsAccountManager.NotUserSIDException ex) { } catch (TestUtilsException | TskCoreException | BlackboardException | TagsManager.TagNameAlreadyExistsException | OsAccountManager.NotUserSIDException ex) {
if (trans != null) { if (trans != null) {
@ -633,23 +635,21 @@ public class TableSearchTest extends NbTestCase {
assertTrue(db != null); assertTrue(db != null);
try { try {
// Get all contacts
CommAccountsDAO commAccountsDAO = MainDAO.getInstance().getCommAccountsDAO(); CommAccountsDAO commAccountsDAO = MainDAO.getInstance().getCommAccountsDAO();
// Get emails from all data sources
CommAccountsSearchParams param = new CommAccountsSearchParams(Account.Type.EMAIL, null); CommAccountsSearchParams param = new CommAccountsSearchParams(Account.Type.EMAIL, null);
SearchResultsDTO results = commAccountsDAO.getCommAcounts(param, 0, null, false); SearchResultsDTO results = commAccountsDAO.getCommAcounts(param, 0, null, false);
//assertEquals(BlackboardArtifact.Type.TSK_CONTACT, results.getArtifactType());
assertEquals(3, results.getTotalResultsCount()); assertEquals(3, results.getTotalResultsCount());
assertEquals(3, results.getItems().size()); assertEquals(3, results.getItems().size());
// Get contacts from data source 2 // Get device accounts from data source 1
param = new CommAccountsSearchParams(Account.Type.DEVICE, dataSource1.getId()); param = new CommAccountsSearchParams(Account.Type.DEVICE, dataSource1.getId());
results = commAccountsDAO.getCommAcounts(param, 0, null, false); results = commAccountsDAO.getCommAcounts(param, 0, null, false);
//assertEquals(BlackboardArtifact.Type.TSK_CONTACT, results.getArtifactType());
assertEquals(1, results.getTotalResultsCount()); assertEquals(1, results.getTotalResultsCount());
assertEquals(1, results.getItems().size()); assertEquals(1, results.getItems().size());
// Get bookmarks from data source 2 // Get email accounts from data source 2
param = new CommAccountsSearchParams(Account.Type.EMAIL, dataSource2.getId()); param = new CommAccountsSearchParams(Account.Type.EMAIL, dataSource2.getId());
results = commAccountsDAO.getCommAcounts(param, 0, null, false); results = commAccountsDAO.getCommAcounts(param, 0, null, false);
assertEquals(1, results.getTotalResultsCount()); assertEquals(1, results.getTotalResultsCount());
@ -665,8 +665,29 @@ public class TableSearchTest extends NbTestCase {
assertTrue(rowDTO instanceof DataArtifactRowDTO); assertTrue(rowDTO instanceof DataArtifactRowDTO);
DataArtifactRowDTO accountResultRowDTO = (DataArtifactRowDTO) rowDTO; DataArtifactRowDTO accountResultRowDTO = (DataArtifactRowDTO) rowDTO;
// Check that some of the expected result tag column values are present // Check that some of the expected result column values are present
assertTrue(accountResultRowDTO.getCellValues().contains(EMAIL_C)); assertTrue(accountResultRowDTO.getCellValues().contains(EMAIL_C));
assertTrue(accountResultRowDTO.getCellValues().contains(customFile.getName()));
// Get phone accounts from all data sources
param = new CommAccountsSearchParams(Account.Type.PHONE, null);
results = commAccountsDAO.getCommAcounts(param, 0, null, false);
assertEquals(2, results.getTotalResultsCount());
assertEquals(2, results.getItems().size());
// Get phone accounts from data source 2
param = new CommAccountsSearchParams(Account.Type.PHONE, dataSource2.getId());
results = commAccountsDAO.getCommAcounts(param, 0, null, false);
assertEquals(1, results.getTotalResultsCount());
assertEquals(1, results.getItems().size());
// Get the row
rowDTO = results.getItems().get(0);
assertTrue(rowDTO instanceof DataArtifactRowDTO);
accountResultRowDTO = (DataArtifactRowDTO) rowDTO;
// Check that some of the expected result column values are present
assertTrue(accountResultRowDTO.getCellValues().contains(PHONENUM_2));
assertTrue(accountResultRowDTO.getCellValues().contains(customFile.getName())); assertTrue(accountResultRowDTO.getCellValues().contains(customFile.getName()));
} catch (ExecutionException ex) { } catch (ExecutionException ex) {