mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-17 18:17:43 +00:00
3202 remove confirmation for changing tag status in current case
This commit is contained in:
parent
bb40f1d8e8
commit
9b7ada8f64
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
@ -69,6 +69,7 @@ public final class TagsOptionsPanelController extends OptionsPanelController {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void cancel() {
|
public void cancel() {
|
||||||
|
getPanel().cancelChanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user