19 package org.sleuthkit.autopsy.centralrepository.eventlisteners;
21 import com.google.common.util.concurrent.ThreadFactoryBuilder;
22 import java.beans.PropertyChangeEvent;
23 import java.beans.PropertyChangeListener;
24 import java.util.List;
25 import java.util.concurrent.ExecutorService;
26 import java.util.concurrent.Executors;
27 import java.util.logging.Level;
28 import java.util.stream.Collectors;
29 import org.apache.commons.lang.StringUtils;
30 import org.openide.util.NbBundle.Messages;
61 @Messages({
"caseeventlistener.evidencetag=Evidence"})
62 final class CaseEventListener implements PropertyChangeListener {
65 private final ExecutorService jobProcessingExecutor;
66 private static final String CASE_EVENT_THREAD_NAME =
"Case-Event-Listener-%d";
69 jobProcessingExecutor = Executors.newSingleThreadExecutor(
new ThreadFactoryBuilder().setNameFormat(CASE_EVENT_THREAD_NAME).build());
77 public void propertyChange(PropertyChangeEvent evt) {
82 LOGGER.log(Level.SEVERE,
"Failed to get instance of db manager.", ex);
85 switch (
Case.
Events.valueOf(evt.getPropertyName())) {
86 case CONTENT_TAG_ADDED:
87 case CONTENT_TAG_DELETED: {
88 jobProcessingExecutor.submit(
new ContentTagTask(dbManager, evt));
92 case BLACKBOARD_ARTIFACT_TAG_DELETED:
93 case BLACKBOARD_ARTIFACT_TAG_ADDED: {
94 jobProcessingExecutor.submit(
new BlackboardTagTask(dbManager, evt));
98 case DATA_SOURCE_ADDED: {
99 jobProcessingExecutor.submit(
new DataSourceAddedTask(dbManager, evt));
102 case TAG_DEFINITION_CHANGED: {
103 jobProcessingExecutor.submit(
new TagDefinitionChangeTask(evt));
107 jobProcessingExecutor.submit(
new CurrentCaseTask(dbManager, evt));
110 case DATA_SOURCE_NAME_CHANGED: {
111 jobProcessingExecutor.submit(
new DataSourceNameChangedTask(dbManager, evt));
120 private final PropertyChangeEvent
event;
134 TskData.FileKnown knownStatus;
140 final ContentTag tagAdded = tagAddedEvent.getAddedTag();
143 if (tagAdded.getContent() instanceof AbstractFile) {
144 af = (AbstractFile) tagAdded.getContent();
145 knownStatus = TskData.FileKnown.BAD;
146 comment = tagAdded.getComment();
148 LOGGER.log(Level.WARNING,
"Error updating non-file object");
175 .map(tag -> tag.getName().getDisplayName())
177 .collect(Collectors.toList())
181 if (content instanceof AbstractFile) {
182 af = (AbstractFile) content;
183 knownStatus = TskData.FileKnown.UNKNOWN;
186 LOGGER.log(Level.WARNING,
"Error updating non-file object");
194 LOGGER.log(Level.SEVERE,
"Failed to find content", ex);
201 if (eamArtifact != null) {
206 LOGGER.log(Level.SEVERE,
"Error connecting to Central Repository database while setting artifact known status.", ex);
215 private final PropertyChangeEvent
event;
229 BlackboardArtifact bbArtifact;
230 TskData.FileKnown knownStatus;
236 final BlackboardArtifactTag tagAdded = tagAddedEvent.getAddedTag();
239 content = tagAdded.getContent();
240 bbArtifact = tagAdded.getArtifact();
241 knownStatus = TskData.FileKnown.BAD;
242 comment = tagAdded.getComment();
252 LOGGER.log(Level.SEVERE,
"Exception while getting open case.", ex);
276 .map(tag -> tag.getName().getDisplayName())
278 .collect(Collectors.toList())
282 knownStatus = TskData.FileKnown.UNKNOWN;
289 }
catch (TskCoreException ex) {
290 LOGGER.log(Level.SEVERE,
"Failed to find content", ex);
295 if ((content instanceof AbstractFile) && (((AbstractFile) content).getKnown() == TskData.FileKnown.KNOWN)) {
301 eamArtifact.setComment(comment);
305 LOGGER.log(Level.SEVERE,
"Error connecting to Central Repository database while setting artifact known status.", ex);
314 private final PropertyChangeEvent
event;
326 String modifiedTagName = (String) event.getOldValue();
337 for (BlackboardArtifactTag bbTag : artifactTags) {
339 boolean hasTagWithConflictingKnownStatus =
false;
343 if (tagName.getKnownStatus() == TskData.FileKnown.UNKNOWN) {
344 Content content = bbTag.getContent();
347 if ((content instanceof AbstractFile) && (((AbstractFile) content).getKnown() == TskData.FileKnown.KNOWN)) {
351 BlackboardArtifact bbArtifact = bbTag.getArtifact();
355 for (BlackboardArtifactTag t : tags) {
357 if (t.getName().equals(tagName)) {
361 if (TskData.FileKnown.BAD == t.getName().getKnownStatus()) {
363 hasTagWithConflictingKnownStatus =
true;
369 if (!hasTagWithConflictingKnownStatus) {
382 for (ContentTag contentTag : fileTags) {
384 boolean hasTagWithConflictingKnownStatus =
false;
388 if (tagName.getKnownStatus() == TskData.FileKnown.UNKNOWN) {
389 Content content = contentTag.getContent();
393 for (ContentTag t : tags) {
395 if (t.getName().equals(tagName)) {
399 if (TskData.FileKnown.BAD == t.getName().getKnownStatus()) {
401 hasTagWithConflictingKnownStatus =
true;
407 if (!hasTagWithConflictingKnownStatus) {
408 Content taggedContent = contentTag.getContent();
409 if (taggedContent instanceof AbstractFile) {
411 if (eamArtifact != null) {
417 }
catch (TskCoreException ex) {
418 LOGGER.log(Level.SEVERE,
"Cannot update known status in central repository for tag: " + modifiedTagName, ex);
420 LOGGER.log(Level.SEVERE,
"Cannot get central repository for tag: " + modifiedTagName, ex);
422 LOGGER.log(Level.SEVERE,
"Exception while getting open case.", ex);
430 private final PropertyChangeEvent
event;
446 LOGGER.log(Level.SEVERE,
"Exception while getting open case.", ex);
451 Content newDataSource = dataSourceAddedEvent.
getDataSource();
455 if (null == dbManager.
getDataSource(correlationCase, newDataSource.getId())) {
459 LOGGER.log(Level.SEVERE,
"Error adding new data source to the central repository", ex);
467 private final PropertyChangeEvent
event;
480 if ((null == event.getOldValue()) && (event.getNewValue() instanceof
Case)) {
481 Case curCase = (
Case) event.getNewValue();
491 if (dbManager.
getCase(curCase) == null) {
495 LOGGER.log(Level.SEVERE,
"Error connecting to Central Repository database.", ex);
504 private final PropertyChangeEvent
event;
515 Content dataSource = dataSourceNameChangedEvent.
getDataSource();
516 String newName = (String) event.getNewValue();
518 if (!StringUtils.isEmpty(newName)) {
529 LOGGER.log(Level.SEVERE,
"Error updating data source with ID " + dataSource.getId() +
" to " + newName, ex);
531 LOGGER.log(Level.SEVERE,
"No open case", ex);
final PropertyChangeEvent event
final CentralRepository dbManager
ContentTagTask(CentralRepository db, PropertyChangeEvent evt)
DataSourceAddedTask(CentralRepository db, PropertyChangeEvent evt)
final PropertyChangeEvent event
final CentralRepository dbManager
DeletedBlackboardArtifactTagInfo getDeletedTagInfo()
static CorrelationDataSource fromTSKDataSource(CorrelationCase correlationCase, Content dataSource)
static CorrelationAttributeInstance makeCorrAttrFromFile(AbstractFile file)
CorrelationCase getCase(Case autopsyCase)
void setAttributeInstanceKnownStatus(CorrelationAttributeInstance eamArtifact, TskData.FileKnown knownStatus)
CurrentCaseTask(CentralRepository db, PropertyChangeEvent evt)
static List< CorrelationAttributeInstance > makeCorrAttrsForCorrelation(BlackboardArtifact artifact)
TskData.FileKnown getKnownStatus()
TagDefinitionChangeTask(PropertyChangeEvent evt)
static void shutDownTaskExecutor(ExecutorService executor)
final CentralRepository dbManager
TagsManager getTagsManager()
final CentralRepository dbManager
CorrelationCase newCase(CorrelationCase eamCase)
final CentralRepository dbManager
SleuthkitCase getSleuthkitCase()
DataSourceNameChangedTask(CentralRepository db, PropertyChangeEvent evt)
void updateDataSourceName(CorrelationDataSource eamDataSource, String newName)
BLACKBOARD_ARTIFACT_TAG_ADDED
BlackboardTagTask(CentralRepository db, PropertyChangeEvent evt)
CorrelationDataSource getDataSource(CorrelationCase correlationCase, Long caseDbDataSourceId)
synchronized static Logger getLogger(String name)
static Case getCurrentCaseThrows()
final PropertyChangeEvent event
final PropertyChangeEvent event
DeletedContentTagInfo getDeletedTagInfo()
final PropertyChangeEvent event
static CentralRepository getInstance()
final PropertyChangeEvent event
static boolean isEnabled()