From 9b7ada8f64f63d1e2e571ffae6bd92c682a89798 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 14 Nov 2017 17:32:11 -0500 Subject: [PATCH] 3202 remove confirmation for changing tag status in current case --- .../services/TagNameDefinition.java | 7 +- .../casemodule/services/TagOptionsPanel.java | 68 +++++++++++++++++-- .../services/TagsOptionsPanelController.java | 1 + .../eventlisteners/CaseEventListener.java | 68 +++++++++---------- 4 files changed, 99 insertions(+), 45 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java index f039a40d92..38581aa83f 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java @@ -57,7 +57,6 @@ public final class TagNameDefinition implements Comparable { * @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 { return color; } - public TskData.FileKnown getKnownStatus() { return knownStatusDenoted; } @@ -139,8 +137,9 @@ public final class TagNameDefinition implements Comparable { 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; } /** diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java index 082827a94a..02f3b925fb 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java @@ -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 tagTypesListModel; private Set tagTypes; private IngestJobEventPropertyChangeListener ingestJobEventsListener; + private Set 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 { ); }// //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); } } @@ -337,15 +343,15 @@ final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel { TagNameDefinition newTagType = new TagNameDefinition(dialog.getTagName(), dialog.getTagDesciption(), DEFAULT_COLOR, status); /* * If tag name already exists, don't add the tag name. - */ + */ tagTypes.remove(originalTagName); tagTypes.add(newTagType); updateTagNamesListModel(); 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 { + + 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. */ diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsOptionsPanelController.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsOptionsPanelController.java index c27835f83a..fcd2131f90 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsOptionsPanelController.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsOptionsPanelController.java @@ -69,6 +69,7 @@ public final class TagsOptionsPanelController extends OptionsPanelController { */ @Override public void cancel() { + getPanel().cancelChanges(); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java index 064f04fd78..6ecc0edb4a 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java @@ -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 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 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 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 List 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 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 - continue; + for (ContentTag t : tags) { + if (t.getName().equals(tagName)) { + continue; + } + if (notableTags.contains(t.getName().getDisplayName())) { + hasOtherBadTags = true; + break; + } } } - System.out.println("MAKING ARTIFACT"); - final CorrelationAttribute eamArtifact = EamArtifactUtil.getEamArtifactFromContent(contentTag.getContent(), - TskData.FileKnown.BAD, ""); - 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()); + if (!hasOtherBadTags) { + final CorrelationAttribute eamArtifact = EamArtifactUtil.getEamArtifactFromContent(contentTag.getContent(), + status, ""); + if (eamArtifact != null) { + EamDb.getInstance().setArtifactInstanceKnownStatus(eamArtifact, status); + } } } } catch (TskCoreException ex) {