3202 remove confirmation for changing tag status in current case

This commit is contained in:
William Schaefer 2017-11-14 17:32:11 -05:00
parent bb40f1d8e8
commit 9b7ada8f64
4 changed files with 99 additions and 45 deletions

View File

@ -57,7 +57,6 @@ public final class TagNameDefinition implements Comparable<TagNameDefinition> {
* @param color The color for the tag name. * @param color The color for the tag name.
* @param knownStatus The status denoted by the tag. * @param knownStatus The status denoted by the tag.
*/ */
public TagNameDefinition(String displayName, String description, TagName.HTML_COLOR color, TskData.FileKnown status) { public TagNameDefinition(String displayName, String description, TagName.HTML_COLOR color, TskData.FileKnown status) {
this.displayName = displayName; this.displayName = displayName;
@ -93,7 +92,6 @@ public final class TagNameDefinition implements Comparable<TagNameDefinition> {
return color; return color;
} }
public TskData.FileKnown getKnownStatus() { public TskData.FileKnown getKnownStatus() {
return knownStatusDenoted; return knownStatusDenoted;
} }
@ -139,8 +137,9 @@ public final class TagNameDefinition implements Comparable<TagNameDefinition> {
if (!(obj instanceof TagNameDefinition)) { if (!(obj instanceof TagNameDefinition)) {
return false; return false;
} }
TagNameDefinition thatTagName = (TagNameDefinition) obj; boolean sameName = this.getDisplayName().equals(((TagNameDefinition) obj).getDisplayName());
return this.getDisplayName().equals(thatTagName.getDisplayName()); boolean sameStatus = this.getKnownStatus().equals(((TagNameDefinition) obj).getKnownStatus());
return sameName && sameStatus;
} }
/** /**

View File

@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.casemodule.services;
import java.awt.EventQueue; import java.awt.EventQueue;
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.TreeSet; import java.util.TreeSet;
import javax.swing.DefaultListModel; import javax.swing.DefaultListModel;
@ -28,6 +29,7 @@ import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionEvent;
import org.netbeans.spi.options.OptionsPanelController; import org.netbeans.spi.options.OptionsPanelController;
import org.openide.util.NbBundle; import org.openide.util.NbBundle;
import org.openide.util.NbBundle.Messages;
import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.corecomponents.OptionsPanel; import org.sleuthkit.autopsy.corecomponents.OptionsPanel;
import org.sleuthkit.autopsy.ingest.IngestManager; import org.sleuthkit.autopsy.ingest.IngestManager;
@ -40,11 +42,11 @@ import org.sleuthkit.datamodel.TskData;
final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel { final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final String DEFAULT_DESCRIPTION = "";
private static final TagName.HTML_COLOR DEFAULT_COLOR = TagName.HTML_COLOR.NONE; private static final TagName.HTML_COLOR DEFAULT_COLOR = TagName.HTML_COLOR.NONE;
private final DefaultListModel<TagNameDefinition> tagTypesListModel; private final DefaultListModel<TagNameDefinition> tagTypesListModel;
private Set<TagNameDefinition> tagTypes; private Set<TagNameDefinition> tagTypes;
private IngestJobEventPropertyChangeListener ingestJobEventsListener; private IngestJobEventPropertyChangeListener ingestJobEventsListener;
private Set<TagPair> updatedStatusTags;
/** /**
* Creates new form TagOptionsPanel * Creates new form TagOptionsPanel
@ -52,6 +54,7 @@ final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
TagOptionsPanel() { TagOptionsPanel() {
tagTypesListModel = new DefaultListModel<>(); tagTypesListModel = new DefaultListModel<>();
tagTypes = new TreeSet<>(TagNameDefinition.getTagNameDefinitions()); tagTypes = new TreeSet<>(TagNameDefinition.getTagNameDefinitions());
updatedStatusTags = new HashSet<>();
initComponents(); initComponents();
customizeComponents(); customizeComponents();
} }
@ -295,12 +298,15 @@ final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
); );
}// </editor-fold>//GEN-END:initComponents }// </editor-fold>//GEN-END:initComponents
@Messages({"TagOptionsPanel.TagNameDialog.tagNameAlreadyExists.message=Tag name must be unique. A tag with this name already exists.",
"TagOptionsPanel.TagNameDialog.tagNameAlreadyExists.title=Duplicate Tag Name"})
private void newTagNameButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newTagNameButtonActionPerformed private void newTagNameButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newTagNameButtonActionPerformed
TagNameDialog dialog = new TagNameDialog(); TagNameDialog dialog = new TagNameDialog();
TagNameDialog.BUTTON_PRESSED result = dialog.getResult(); TagNameDialog.BUTTON_PRESSED result = dialog.getResult();
if (result == TagNameDialog.BUTTON_PRESSED.OK) { if (result == TagNameDialog.BUTTON_PRESSED.OK) {
TskData.FileKnown status = dialog.isTagNotable() ? TskData.FileKnown.BAD : TskData.FileKnown.UNKNOWN; TskData.FileKnown status = dialog.isTagNotable() ? TskData.FileKnown.BAD : TskData.FileKnown.UNKNOWN;
TagNameDefinition newTagType = new TagNameDefinition(dialog.getTagName(), DEFAULT_DESCRIPTION, DEFAULT_COLOR, status); TagNameDefinition newTagType = new TagNameDefinition(dialog.getTagName(), dialog.getTagDesciption(), DEFAULT_COLOR, status);
/* /*
* If tag name already exists, don't add the tag name. * If tag name already exists, don't add the tag name.
*/ */
@ -312,8 +318,8 @@ final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
} else { } else {
JOptionPane.showMessageDialog(null, JOptionPane.showMessageDialog(null,
NbBundle.getMessage(TagOptionsPanel.class, "TagNamesSettingsPanel.JOptionPane.tagNameAlreadyExists.message"), NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.TagNameDialog.tagNameAlreadyExists.message"),
NbBundle.getMessage(TagOptionsPanel.class, "TagNamesSettingsPanel.JOptionPane.tagNameAlreadyExists.title"), NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.TagNameDialog.tagNameAlreadyExists.title"),
JOptionPane.INFORMATION_MESSAGE); JOptionPane.INFORMATION_MESSAGE);
} }
} }
@ -337,15 +343,15 @@ final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
TagNameDefinition newTagType = new TagNameDefinition(dialog.getTagName(), dialog.getTagDesciption(), DEFAULT_COLOR, status); TagNameDefinition newTagType = new TagNameDefinition(dialog.getTagName(), dialog.getTagDesciption(), DEFAULT_COLOR, status);
/* /*
* If tag name already exists, don't add the tag name. * If tag name already exists, don't add the tag name.
*/ */
tagTypes.remove(originalTagName); tagTypes.remove(originalTagName);
tagTypes.add(newTagType); tagTypes.add(newTagType);
updateTagNamesListModel(); updateTagNamesListModel();
tagNamesList.setSelectedValue(newTagType, true); tagNamesList.setSelectedValue(newTagType, true);
updatePanel(); updatePanel();
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
if (originalTagName.getKnownStatus() != newTagType.getKnownStatus() && Case.isCaseOpen()){ if (originalTagName.getKnownStatus() != newTagType.getKnownStatus() && Case.isCaseOpen()) {
Case.getCurrentCase().notifyTagStatusChanged(originalTagName,newTagType); updatedStatusTags.add(new TagPair(originalTagName, newTagType));
} }
} }
}//GEN-LAST:event_editTagNameButtonActionPerformed }//GEN-LAST:event_editTagNameButtonActionPerformed
@ -398,6 +404,18 @@ final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
@Override @Override
public void store() { public void store() {
TagNameDefinition.setTagNameDefinitions(tagTypes); TagNameDefinition.setTagNameDefinitions(tagTypes);
sendStatusChangedEvents();
}
void cancelChanges() {
updatedStatusTags.clear();
}
private void sendStatusChangedEvents() {
for (TagPair modifiedTag : updatedStatusTags) {
Case.getCurrentCase().notifyTagStatusChanged(modifiedTag.getOldValue(), modifiedTag.getNewValue());
}
updatedStatusTags.clear();
} }
/** /**
@ -440,6 +458,42 @@ final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
super.finalize(); super.finalize();
} }
private class TagPair implements Comparable<TagPair> {
private TagNameDefinition oldValue;
private TagNameDefinition newValue;
private TagPair(TagNameDefinition oldV, TagNameDefinition newV) {
oldValue = oldV;
newValue = newV;
}
private TagNameDefinition getOldValue() {
return oldValue;
}
private TagNameDefinition getNewValue() {
return newValue;
}
/**
* Compares this tag name definition with the specified tag name
* definition for order.
*
* @param other The tag name definition to which to compare this tag
* name definition.
*
* @return Negative integer, zero, or a positive integer to indicate
* that this tag name definition is less than, equal to, or
* greater than the specified tag name definition.
*/
@Override
public int compareTo(TagPair other) {
return this.getNewValue().compareTo(other.getNewValue());
}
}
/** /**
* A property change listener that listens to ingest job events. * A property change listener that listens to ingest job events.
*/ */

View File

@ -69,6 +69,7 @@ public final class TagsOptionsPanelController extends OptionsPanelController {
*/ */
@Override @Override
public void cancel() { public void cancel() {
getPanel().cancelChanges();
} }
@Override @Override

View File

@ -100,10 +100,9 @@ final class CaseEventListener implements PropertyChangeListener {
} }
break; break;
case TAG_STATUS_CHANGED: { case TAG_STATUS_CHANGED: {
//WJS-TODO actaully do stuff when event is seen.
jobProcessingExecutor.submit(new TagStatusChangeTask(dbManager, evt)); jobProcessingExecutor.submit(new TagStatusChangeTask(dbManager, evt));
} }
break;
case CURRENT_CASE: { case CURRENT_CASE: {
jobProcessingExecutor.submit(new CurrentCaseTask(dbManager, evt)); jobProcessingExecutor.submit(new CurrentCaseTask(dbManager, evt));
} }
@ -318,12 +317,9 @@ final class CaseEventListener implements PropertyChangeListener {
TskData.FileKnown status = ((TagNameDefinition) event.getNewValue()).getKnownStatus(); TskData.FileKnown status = ((TagNameDefinition) event.getNewValue()).getKnownStatus();
/** /**
* Set knownBad status for all files/artifacts in the given case * Set knownBad status for all files/artifacts in the given case
* that are tagged with the given tag name. Files/artifacts that are * that are tagged with the given tag name.
* not already in the database will be added.
*
* @param tagName The name of the tag to search for
* @param curCase The case to search in
*/ */
System.out.println("TAG " + ((TagNameDefinition) event.getNewValue()).getDisplayName() + " event FROM " + ((TagNameDefinition) event.getOldValue()).getKnownStatus().toString() + " TO " + status.toString());
try { try {
TagName tagName = Case.getCurrentCase().getServices().getTagsManager().getDisplayNamesToTagNamesMap().get(((TagNameDefinition) event.getNewValue()).getDisplayName()); TagName tagName = Case.getCurrentCase().getServices().getTagsManager().getDisplayNamesToTagNamesMap().get(((TagNameDefinition) event.getNewValue()).getDisplayName());
// First find any matching artifacts // First find any matching artifacts
@ -332,50 +328,54 @@ final class CaseEventListener implements PropertyChangeListener {
for (BlackboardArtifactTag bbTag : artifactTags) { for (BlackboardArtifactTag bbTag : artifactTags) {
List<CorrelationAttribute> convertedArtifacts = EamArtifactUtil.getCorrelationAttributeFromBlackboardArtifact(bbTag.getArtifact(), true, true); List<CorrelationAttribute> convertedArtifacts = EamArtifactUtil.getCorrelationAttributeFromBlackboardArtifact(bbTag.getArtifact(), true, true);
for (CorrelationAttribute eamArtifact : convertedArtifacts) { for (CorrelationAttribute eamArtifact : convertedArtifacts) {
boolean hasOtherBadTags = false;
if (status == TskData.FileKnown.UNKNOWN) { if (status == TskData.FileKnown.UNKNOWN) {
Content content = bbTag.getContent(); Content content = bbTag.getContent();
BlackboardArtifact bbArtifact = bbTag.getArtifact();
TagsManager tagsManager = Case.getCurrentCase().getServices().getTagsManager();
List<BlackboardArtifactTag> tags = tagsManager.getBlackboardArtifactTagsByArtifact(bbArtifact);
if (!(tags.stream()
.map(tag -> tag.getName().getDisplayName())
.filter(notableTags::contains)
.collect(Collectors.toList())
.isEmpty())) { // There are more bad tags on the object
break;
}
if ((content instanceof AbstractFile) && (((AbstractFile) content).getKnown() == TskData.FileKnown.KNOWN)) { if ((content instanceof AbstractFile) && (((AbstractFile) content).getKnown() == TskData.FileKnown.KNOWN)) {
break; break;
} }
BlackboardArtifact bbArtifact = bbTag.getArtifact();
TagsManager tagsManager = Case.getCurrentCase().getServices().getTagsManager();
List<BlackboardArtifactTag> tags = tagsManager.getBlackboardArtifactTagsByArtifact(bbArtifact);
for (BlackboardArtifactTag t : tags) {
if (t.getName().equals(tagName)) {
continue;
}
if (notableTags.contains(t.getName().getDisplayName())) {
hasOtherBadTags = true;
break;
}
}
}
if (!hasOtherBadTags) {
EamDb.getInstance().setArtifactInstanceKnownStatus(eamArtifact, status);
} }
System.out.println(
"TAG " + ((TagNameDefinition) event.getNewValue()).getDisplayName() + " event FROM " + ((TagNameDefinition) event.getOldValue()).getKnownStatus() + " TO " + ((TagNameDefinition) event.getNewValue()).getKnownStatus());
EamDb.getInstance().setArtifactInstanceKnownStatus(eamArtifact, status);
} }
} }
// Now search for files // Now search for files
List<ContentTag> fileTags = Case.getCurrentCase().getSleuthkitCase().getContentTagsByTagName(tagName); List<ContentTag> fileTags = Case.getCurrentCase().getSleuthkitCase().getContentTagsByTagName(tagName);
for (ContentTag contentTag : fileTags) { for (ContentTag contentTag : fileTags) {
boolean hasOtherBadTags = false;
if (status == TskData.FileKnown.UNKNOWN) { if (status == TskData.FileKnown.UNKNOWN) {
Content content = contentTag.getContent(); Content content = contentTag.getContent();
TagsManager tagsManager = Case.getCurrentCase().getServices().getTagsManager(); TagsManager tagsManager = Case.getCurrentCase().getServices().getTagsManager();
List<ContentTag> tags = tagsManager.getContentTagsByContent(content); List<ContentTag> tags = tagsManager.getContentTagsByContent(content);
if (!(tags.stream() for (ContentTag t : tags) {
.map(tag -> tag.getName().getDisplayName()) if (t.getName().equals(tagName)) {
.filter(notableTags::contains) continue;
.collect(Collectors.toList()) }
.isEmpty())) { // There are more bad tags on the object if (notableTags.contains(t.getName().getDisplayName())) {
continue; hasOtherBadTags = true;
break;
}
} }
} }
System.out.println("MAKING ARTIFACT"); if (!hasOtherBadTags) {
final CorrelationAttribute eamArtifact = EamArtifactUtil.getEamArtifactFromContent(contentTag.getContent(), final CorrelationAttribute eamArtifact = EamArtifactUtil.getEamArtifactFromContent(contentTag.getContent(),
TskData.FileKnown.BAD, ""); status, "");
if (eamArtifact != null) { if (eamArtifact != null) {
EamDb.getInstance().setArtifactInstanceKnownStatus(eamArtifact, status); EamDb.getInstance().setArtifactInstanceKnownStatus(eamArtifact, status);
System.out.println( }
"TAG " + ((TagNameDefinition) event.getNewValue()).getDisplayName() + " event FROM " + ((TagNameDefinition) event.getOldValue()).getKnownStatus() + " TO " + ((TagNameDefinition) event.getNewValue()).getKnownStatus());
} }
} }
} catch (TskCoreException ex) { } catch (TskCoreException ex) {