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 knownStatus The status denoted by the tag.
*/
public TagNameDefinition(String displayName, String description, TagName.HTML_COLOR color, TskData.FileKnown status) {
this.displayName = displayName;
@ -93,7 +92,6 @@ public final class TagNameDefinition implements Comparable<TagNameDefinition> {
return color;
}
public TskData.FileKnown getKnownStatus() {
return knownStatusDenoted;
}
@ -139,8 +137,9 @@ public final class TagNameDefinition implements Comparable<TagNameDefinition> {
if (!(obj instanceof TagNameDefinition)) {
return false;
}
TagNameDefinition thatTagName = (TagNameDefinition) obj;
return this.getDisplayName().equals(thatTagName.getDisplayName());
boolean sameName = this.getDisplayName().equals(((TagNameDefinition) obj).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.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
import javax.swing.DefaultListModel;
@ -28,6 +29,7 @@ import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import org.netbeans.spi.options.OptionsPanelController;
import org.openide.util.NbBundle;
import org.openide.util.NbBundle.Messages;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.corecomponents.OptionsPanel;
import org.sleuthkit.autopsy.ingest.IngestManager;
@ -40,11 +42,11 @@ import org.sleuthkit.datamodel.TskData;
final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
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 final DefaultListModel<TagNameDefinition> tagTypesListModel;
private Set<TagNameDefinition> tagTypes;
private IngestJobEventPropertyChangeListener ingestJobEventsListener;
private Set<TagPair> updatedStatusTags;
/**
* Creates new form TagOptionsPanel
@ -52,6 +54,7 @@ final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
TagOptionsPanel() {
tagTypesListModel = new DefaultListModel<>();
tagTypes = new TreeSet<>(TagNameDefinition.getTagNameDefinitions());
updatedStatusTags = new HashSet<>();
initComponents();
customizeComponents();
}
@ -295,12 +298,15 @@ final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
);
}// </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
TagNameDialog dialog = new TagNameDialog();
TagNameDialog.BUTTON_PRESSED result = dialog.getResult();
if (result == TagNameDialog.BUTTON_PRESSED.OK) {
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.
*/
@ -312,8 +318,8 @@ final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
} else {
JOptionPane.showMessageDialog(null,
NbBundle.getMessage(TagOptionsPanel.class, "TagNamesSettingsPanel.JOptionPane.tagNameAlreadyExists.message"),
NbBundle.getMessage(TagOptionsPanel.class, "TagNamesSettingsPanel.JOptionPane.tagNameAlreadyExists.title"),
NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.TagNameDialog.tagNameAlreadyExists.message"),
NbBundle.getMessage(TagOptionsPanel.class, "TagOptionsPanel.TagNameDialog.tagNameAlreadyExists.title"),
JOptionPane.INFORMATION_MESSAGE);
}
}
@ -344,8 +350,8 @@ final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
tagNamesList.setSelectedValue(newTagType, true);
updatePanel();
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
if (originalTagName.getKnownStatus() != newTagType.getKnownStatus() && Case.isCaseOpen()){
Case.getCurrentCase().notifyTagStatusChanged(originalTagName,newTagType);
if (originalTagName.getKnownStatus() != newTagType.getKnownStatus() && Case.isCaseOpen()) {
updatedStatusTags.add(new TagPair(originalTagName, newTagType));
}
}
}//GEN-LAST:event_editTagNameButtonActionPerformed
@ -398,6 +404,18 @@ final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
@Override
public void store() {
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();
}
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.
*/

View File

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

View File

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