bug fixes

This commit is contained in:
Greg DiCristofaro 2021-11-12 15:47:20 -05:00
parent c1646d7c0d
commit 942689f28f
3 changed files with 53 additions and 47 deletions

View File

@ -740,7 +740,7 @@ public class AnalysisResultDAO extends BlackboardArtifactDAO {
setMap.computeIfAbsent(Pair.of(art.getArtifactTypeID(), setName), (k) -> new HashSet<>()) setMap.computeIfAbsent(Pair.of(art.getArtifactTypeID(), setName), (k) -> new HashSet<>())
.add(art.getDataSourceObjectID()); .add(art.getDataSourceObjectID());
} else if (BlackboardArtifact.Category.DATA_ARTIFACT.equals(art.getType().getCategory())) { } else if (BlackboardArtifact.Category.ANALYSIS_RESULT.equals(art.getType().getCategory())) {
analysisResultMap.computeIfAbsent(art.getArtifactTypeID(), (k) -> new HashSet<>()) analysisResultMap.computeIfAbsent(art.getArtifactTypeID(), (k) -> new HashSet<>())
.add(art.getDataSourceObjectID()); .add(art.getDataSourceObjectID());
} }

View File

@ -25,6 +25,7 @@ import com.google.common.collect.ImmutableList;
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport; import java.beans.PropertyChangeSupport;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.List; import java.util.List;
@ -33,6 +34,7 @@ import java.util.prefs.PreferenceChangeListener;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.python.google.common.collect.ImmutableSet;
import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.autopsy.ingest.IngestManager; import org.sleuthkit.autopsy.ingest.IngestManager;
@ -43,8 +45,18 @@ import org.sleuthkit.autopsy.ingest.IngestManager;
*/ */
public class MainDAO extends AbstractDAO { public class MainDAO extends AbstractDAO {
private static final Set<IngestManager.IngestModuleEvent> INGEST_MODULE_EVENTS = EnumSet.of(IngestManager.IngestModuleEvent.CONTENT_CHANGED, IngestManager.IngestModuleEvent.DATA_ADDED); private static final Set<IngestManager.IngestModuleEvent> INGEST_MODULE_EVENTS = EnumSet.of(
private static final Set<Case.Events> CASE_EVENTS = EnumSet.of(Case.Events.CURRENT_CASE); IngestManager.IngestModuleEvent.CONTENT_CHANGED,
IngestManager.IngestModuleEvent.DATA_ADDED
);
private static final Set<String> QUEUED_CASE_EVENTS = ImmutableSet.of(
Case.Events.OS_ACCOUNTS_ADDED.toString(),
Case.Events.OS_ACCOUNTS_UPDATED.toString(),
Case.Events.OS_ACCOUNTS_DELETED.toString(),
Case.Events.OS_ACCT_INSTANCES_ADDED.toString()
);
private static final long MILLIS_BATCH = 5000; private static final long MILLIS_BATCH = 5000;
private static MainDAO instance = null; private static MainDAO instance = null;
@ -64,8 +76,11 @@ public class MainDAO extends AbstractDAO {
private final PropertyChangeListener caseEventListener = (evt) -> { private final PropertyChangeListener caseEventListener = (evt) -> {
if (evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) { if (evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) {
this.clearCaches(); this.clearCaches();
} else if (QUEUED_CASE_EVENTS.contains(evt.getPropertyName())) {
queueAutopsyEvent(evt);
} else { } else {
handleAutopsyEvent(evt); // handle case events immediately
handleAutopsyEvent(Arrays.asList(evt));
} }
}; };
@ -80,7 +95,7 @@ public class MainDAO extends AbstractDAO {
* The ingest module event listener. * The ingest module event listener.
*/ */
private final PropertyChangeListener ingestModuleEventListener = (evt) -> { private final PropertyChangeListener ingestModuleEventListener = (evt) -> {
handleAutopsyEvent(evt); queueAutopsyEvent(evt);
}; };
private final PropertyChangeSupport support = new PropertyChangeSupport(this); private final PropertyChangeSupport support = new PropertyChangeSupport(this);
@ -166,7 +181,7 @@ public class MainDAO extends AbstractDAO {
*/ */
void register() { void register() {
IngestManager.getInstance().addIngestModuleEventListener(INGEST_MODULE_EVENTS, ingestModuleEventListener); IngestManager.getInstance().addIngestModuleEventListener(INGEST_MODULE_EVENTS, ingestModuleEventListener);
Case.addEventTypeSubscriber(CASE_EVENTS, caseEventListener); Case.addPropertyChangeListener(caseEventListener);
UserPreferences.addChangeListener(userPreferenceListener); UserPreferences.addChangeListener(userPreferenceListener);
} }
@ -180,7 +195,7 @@ public class MainDAO extends AbstractDAO {
*/ */
void unregister() { void unregister() {
IngestManager.getInstance().removeIngestModuleEventListener(INGEST_MODULE_EVENTS, ingestModuleEventListener); IngestManager.getInstance().removeIngestModuleEventListener(INGEST_MODULE_EVENTS, ingestModuleEventListener);
Case.removeEventTypeSubscriber(CASE_EVENTS, caseEventListener); Case.removePropertyChangeListener(caseEventListener);
UserPreferences.removeChangeListener(userPreferenceListener); UserPreferences.removeChangeListener(userPreferenceListener);
} }
@ -189,7 +204,7 @@ public class MainDAO extends AbstractDAO {
* *
* @param autopsyEvent The autopsy event. * @param autopsyEvent The autopsy event.
*/ */
private void handleAutopsyEvent(PropertyChangeEvent autopsyEvent) { private void queueAutopsyEvent(PropertyChangeEvent autopsyEvent) {
this.eventBatcher.queueEvent(autopsyEvent); this.eventBatcher.queueEvent(autopsyEvent);
} }
} }

View File

@ -327,7 +327,7 @@ public class TagsDAO extends AbstractDAO {
.add(Optional.ofNullable(data.getRight())); .add(Optional.ofNullable(data.getRight()));
} }
} }
// don't continue if no mapping entries // don't continue if no mapping entries
if (mapping.isEmpty()) { if (mapping.isEmpty()) {
return Collections.emptyList(); return Collections.emptyList();
@ -369,44 +369,35 @@ public class TagsDAO extends AbstractDAO {
* from event). * from event).
*/ */
private Triple<TagType, Long, Long> getTagData(PropertyChangeEvent evt) { private Triple<TagType, Long, Long> getTagData(PropertyChangeEvent evt) {
if (evt instanceof BlackBoardArtifactTagAddedEvent) {
BlackBoardArtifactTagAddedEvent event = (BlackBoardArtifactTagAddedEvent) evt;
// ensure tag added event has a valid content id
if (event.getAddedTag() != null
&& event.getAddedTag().getContent() != null
&& event.getAddedTag().getArtifact() != null) {
return Triple.of(TagType.RESULT, event.getAddedTag().getName().getId(), event.getAddedTag().getArtifact().getDataSourceObjectID());
}
String eventType = evt.getPropertyName(); } else if (evt instanceof BlackBoardArtifactTagDeletedEvent) {
BlackBoardArtifactTagDeletedEvent event = (BlackBoardArtifactTagDeletedEvent) evt;
if (eventType.equals(Case.Events.BLACKBOARD_ARTIFACT_TAG_ADDED.toString()) BlackBoardArtifactTagDeletedEvent.DeletedBlackboardArtifactTagInfo deletedTagInfo = event.getDeletedTagInfo();
|| eventType.equals(Case.Events.BLACKBOARD_ARTIFACT_TAG_DELETED.toString()) if (deletedTagInfo != null) {
|| eventType.equals(Case.Events.CONTENT_TAG_ADDED.toString()) return Triple.of(TagType.RESULT, deletedTagInfo.getName().getId(), null);
|| eventType.equals(Case.Events.CONTENT_TAG_DELETED.toString())) { }
} else if (evt instanceof ContentTagAddedEvent) {
if (evt instanceof BlackBoardArtifactTagAddedEvent) { ContentTagAddedEvent event = (ContentTagAddedEvent) evt;
BlackBoardArtifactTagAddedEvent event = (BlackBoardArtifactTagAddedEvent) evt; // ensure tag added event has a valid content id
// ensure tag added event has a valid content id if (event.getAddedTag() != null && event.getAddedTag().getContent() != null) {
if (event.getAddedTag() != null Content content = event.getAddedTag().getContent();
&& event.getAddedTag().getContent() != null Long dsId = content instanceof AbstractFile ? ((AbstractFile) content).getDataSourceObjectId() : null;
&& event.getAddedTag().getArtifact() != null) { return Triple.of(TagType.FILE, event.getAddedTag().getName().getId(), dsId);
return Triple.of(TagType.RESULT, event.getAddedTag().getName().getId(), event.getAddedTag().getArtifact().getDataSourceObjectID()); }
} } else if (evt instanceof ContentTagDeletedEvent) {
ContentTagDeletedEvent event = (ContentTagDeletedEvent) evt;
} else if (evt instanceof BlackBoardArtifactTagDeletedEvent) { // ensure tag deleted event has a valid content id
BlackBoardArtifactTagDeletedEvent event = (BlackBoardArtifactTagDeletedEvent) evt; ContentTagDeletedEvent.DeletedContentTagInfo deletedTagInfo = event.getDeletedTagInfo();
BlackBoardArtifactTagDeletedEvent.DeletedBlackboardArtifactTagInfo deletedTagInfo = event.getDeletedTagInfo(); if (deletedTagInfo != null) {
if (deletedTagInfo != null) { return Triple.of(TagType.FILE, deletedTagInfo.getName().getId(), null);
return Triple.of(TagType.RESULT, deletedTagInfo.getName().getId(), null);
}
} else if (evt instanceof ContentTagAddedEvent) {
ContentTagAddedEvent event = (ContentTagAddedEvent) evt;
// ensure tag added event has a valid content id
if (event.getAddedTag() != null && event.getAddedTag().getContent() != null) {
Content content = event.getAddedTag().getContent();
Long dsId = content instanceof AbstractFile ? ((AbstractFile) content).getDataSourceObjectId() : null;
return Triple.of(TagType.FILE, event.getAddedTag().getName().getId(), dsId);
}
} else if (evt instanceof ContentTagDeletedEvent) {
ContentTagDeletedEvent event = (ContentTagDeletedEvent) evt;
// ensure tag deleted event has a valid content id
ContentTagDeletedEvent.DeletedContentTagInfo deletedTagInfo = event.getDeletedTagInfo();
if (deletedTagInfo != null) {
return Triple.of(TagType.FILE, deletedTagInfo.getName().getId(), null);
}
} }
} }
return null; return null;
@ -418,7 +409,7 @@ public class TagsDAO extends AbstractDAO {
public static class TagFetcher extends DAOFetcher<TagsSearchParams> { public static class TagFetcher extends DAOFetcher<TagsSearchParams> {
private final TagsDAO dao; private final TagsDAO dao;
/** /**
* Main constructor. * Main constructor.
* *