mirror of
https://github.com/elisspace/autopsy.git
synced 2026-10-02 07:19:53 +00:00
Merge branch 'collaborative' of https://github.com/sleuthkit/autopsy into collaborative
This commit is contained in:
@@ -1392,29 +1392,33 @@ public class Case {
|
||||
Case.clearTempFolder();
|
||||
checkSubFolders(toChangeTo);
|
||||
|
||||
// enable these menus
|
||||
CallableSystemAction.get(AddImageAction.class).setEnabled(true);
|
||||
CallableSystemAction.get(CaseCloseAction.class).setEnabled(true);
|
||||
CallableSystemAction.get(CasePropertiesAction.class).setEnabled(true);
|
||||
CallableSystemAction.get(CaseDeleteAction.class).setEnabled(true); // Delete Case menu
|
||||
if (IngestManager.getInstance().isRunningInteractively()) {
|
||||
// enable these menus
|
||||
CallableSystemAction.get(AddImageAction.class).setEnabled(true);
|
||||
CallableSystemAction.get(CaseCloseAction.class).setEnabled(true);
|
||||
CallableSystemAction.get(CasePropertiesAction.class).setEnabled(true);
|
||||
CallableSystemAction.get(CaseDeleteAction.class).setEnabled(true); // Delete Case menu
|
||||
|
||||
if (toChangeTo.hasData()) {
|
||||
// open all top components
|
||||
CoreComponentControl.openCoreWindows();
|
||||
} else {
|
||||
// close all top components
|
||||
CoreComponentControl.closeCoreWindows();
|
||||
if (toChangeTo.hasData()) {
|
||||
// open all top components
|
||||
CoreComponentControl.openCoreWindows();
|
||||
} else {
|
||||
// close all top components
|
||||
CoreComponentControl.closeCoreWindows();
|
||||
}
|
||||
}
|
||||
} else { // case is closed
|
||||
// close all top components first
|
||||
CoreComponentControl.closeCoreWindows();
|
||||
|
||||
// disable these menus
|
||||
CallableSystemAction.get(AddImageAction.class).setEnabled(false); // Add Image menu
|
||||
CallableSystemAction.get(CaseCloseAction.class).setEnabled(false); // Case Close menu
|
||||
CallableSystemAction.get(CasePropertiesAction.class).setEnabled(false); // Case Properties menu
|
||||
CallableSystemAction.get(CaseDeleteAction.class).setEnabled(false); // Delete Case menu
|
||||
if (IngestManager.getInstance().isRunningInteractively()) {
|
||||
// close all top components first
|
||||
CoreComponentControl.closeCoreWindows();
|
||||
|
||||
// disable these menus
|
||||
CallableSystemAction.get(AddImageAction.class).setEnabled(false); // Add Image menu
|
||||
CallableSystemAction.get(CaseCloseAction.class).setEnabled(false); // Case Close menu
|
||||
CallableSystemAction.get(CasePropertiesAction.class).setEnabled(false); // Case Properties menu
|
||||
CallableSystemAction.get(CaseDeleteAction.class).setEnabled(false); // Delete Case menu
|
||||
}
|
||||
|
||||
//clear pending notifications
|
||||
MessageNotifyUtil.Notify.clear();
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2013-2014 Basis Technology Corp.
|
||||
* Copyright 2013-2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -180,17 +180,16 @@ public class DeletedContent implements AutopsyVisitableItem {
|
||||
@Override
|
||||
public void propertyChange(PropertyChangeEvent evt) {
|
||||
String eventType = evt.getPropertyName();
|
||||
|
||||
// new file was added
|
||||
if (eventType.equals(IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out.
|
||||
* Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
* Checking for a current case is a stop gap measure
|
||||
* until a different way of handling the closing of
|
||||
* cases is worked out. Currently, remote events may be
|
||||
* received for a case that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
// new file was added
|
||||
// @@@ COULD CHECK If the new file is deleted before notifying...
|
||||
update();
|
||||
} catch (IllegalStateException notUsed) {
|
||||
@@ -202,10 +201,10 @@ public class DeletedContent implements AutopsyVisitableItem {
|
||||
|| eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())
|
||||
|| eventType.equals(Case.Events.DATA_SOURCE_ADDED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out.
|
||||
* Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
* Checking for a current case is a stop gap measure
|
||||
* until a different way of handling the closing of
|
||||
* cases is worked out. Currently, remote events may be
|
||||
* received for a case that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
|
||||
@@ -206,18 +206,19 @@ public class EmailExtracted implements AutopsyVisitableItem {
|
||||
String eventType = evt.getPropertyName();
|
||||
if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked
|
||||
* out. Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
/**
|
||||
* Due to some unresolved issues with how cases are
|
||||
* closed, it is possible for the event to have a null
|
||||
* oldValue if the event is a remote event.
|
||||
*/
|
||||
/**
|
||||
* Even with the check above, it is still possible that the
|
||||
* case will be closed in a different thread before this
|
||||
* code executes. If that happens, it is possible for the
|
||||
* event to have a null oldValue.
|
||||
*/
|
||||
ModuleDataEvent eventData = (ModuleDataEvent) evt.getOldValue();
|
||||
if (null != eventData && eventData.getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG) {
|
||||
emailResults.update();
|
||||
@@ -230,10 +231,10 @@ public class EmailExtracted implements AutopsyVisitableItem {
|
||||
} else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
|
||||
|| eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked
|
||||
* out. Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
@@ -243,8 +244,7 @@ public class EmailExtracted implements AutopsyVisitableItem {
|
||||
* Case is closed, do nothing.
|
||||
*/
|
||||
}
|
||||
}
|
||||
else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
|
||||
} else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
|
||||
// case was closed. Remove listeners so that we don't get called with a stale case handle
|
||||
if (evt.getNewValue() == null) {
|
||||
removeNotify();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2014 Basis Technology Corp.
|
||||
* Copyright 2011-2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -126,7 +126,7 @@ public class ExtractedContent implements AutopsyVisitableItem {
|
||||
* more specific form elsewhere in the tree.
|
||||
*/
|
||||
private class TypeFactory extends ChildFactory.Detachable<BlackboardArtifact.ARTIFACT_TYPE> {
|
||||
private final ArrayList<BlackboardArtifact.ARTIFACT_TYPE> doNotShow;
|
||||
private final ArrayList<BlackboardArtifact.ARTIFACT_TYPE> doNotShow = new ArrayList<>();
|
||||
// maps the artifact type to its child node
|
||||
private final HashMap<BlackboardArtifact.ARTIFACT_TYPE, TypeNode> typeNodeList = new HashMap<>();
|
||||
|
||||
@@ -134,7 +134,6 @@ public class ExtractedContent implements AutopsyVisitableItem {
|
||||
super();
|
||||
|
||||
// these are shown in other parts of the UI tree
|
||||
doNotShow = new ArrayList<>();
|
||||
doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO);
|
||||
doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG);
|
||||
doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT);
|
||||
@@ -143,56 +142,53 @@ public class ExtractedContent implements AutopsyVisitableItem {
|
||||
doNotShow.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT);
|
||||
}
|
||||
|
||||
private final PropertyChangeListener pcl = new PropertyChangeListener() {
|
||||
@Override
|
||||
public void propertyChange(PropertyChangeEvent evt) {
|
||||
String eventType = evt.getPropertyName();
|
||||
if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
|
||||
private final PropertyChangeListener pcl = (PropertyChangeEvent evt) -> {
|
||||
String eventType = evt.getPropertyName();
|
||||
if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
* Due to some unresolved issues with how cases are
|
||||
* closed, it is possible for the event to have a null
|
||||
* oldValue if the event is a remote event.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
/**
|
||||
* Due to some unresolved issues with how cases are
|
||||
* closed, it is possible for the event to have a null
|
||||
* oldValue if the event is a remote event.
|
||||
*/
|
||||
final ModuleDataEvent event = (ModuleDataEvent) evt.getOldValue();
|
||||
if (null != event && doNotShow.contains(event.getArtifactType()) == false) {
|
||||
refresh(true);
|
||||
}
|
||||
} catch (IllegalStateException notUsed) {
|
||||
/**
|
||||
* Case is closed, do nothing.
|
||||
*/
|
||||
}
|
||||
} else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
|
||||
|| eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
final ModuleDataEvent event = (ModuleDataEvent) evt.getOldValue();
|
||||
if (null != event && doNotShow.contains(event.getArtifactType()) == false) {
|
||||
refresh(true);
|
||||
} catch (IllegalStateException notUsed) {
|
||||
/**
|
||||
* Case is closed, do nothing.
|
||||
*/
|
||||
}
|
||||
} catch (IllegalStateException notUsed) {
|
||||
/**
|
||||
* Case is closed, do nothing.
|
||||
*/
|
||||
}
|
||||
else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
|
||||
// case was closed. Remove listeners so that we don't get called with a stale case handle
|
||||
if (evt.getNewValue() == null) {
|
||||
removeNotify();
|
||||
skCase = null;
|
||||
}
|
||||
} else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
|
||||
|| eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
refresh(true);
|
||||
} catch (IllegalStateException notUsed) {
|
||||
/**
|
||||
* Case is closed, do nothing.
|
||||
*/
|
||||
}
|
||||
}
|
||||
else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
|
||||
// case was closed. Remove listeners so that we don't get called with a stale case handle
|
||||
if (evt.getNewValue() == null) {
|
||||
removeNotify();
|
||||
skCase = null;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -394,17 +390,18 @@ public class ExtractedContent implements AutopsyVisitableItem {
|
||||
String eventType = evt.getPropertyName();
|
||||
if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked
|
||||
* out. Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
/**
|
||||
* Due to some unresolved issues with how cases are
|
||||
* closed, it is possible for the event to have a null
|
||||
* oldValue if the event is a remote event.
|
||||
* Even with the check above, it is still possible that
|
||||
* the case will be closed in a different thread before
|
||||
* this code executes. If that happens, it is possible
|
||||
* for the event to have a null oldValue.
|
||||
*/
|
||||
final ModuleDataEvent event = (ModuleDataEvent) evt.getOldValue();
|
||||
if (null != event && event.getArtifactType() == type) {
|
||||
@@ -418,10 +415,10 @@ public class ExtractedContent implements AutopsyVisitableItem {
|
||||
} else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
|
||||
|| eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked
|
||||
* out. Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2013-2014 Basis Technology Corp.
|
||||
* Copyright 2013-2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -178,15 +178,15 @@ public class FileSize implements AutopsyVisitableItem {
|
||||
public void propertyChange(PropertyChangeEvent evt) {
|
||||
String eventType = evt.getPropertyName();
|
||||
|
||||
// new file was added
|
||||
if (eventType.equals(IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out.
|
||||
* Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
* Checking for a current case is a stop gap measure
|
||||
* until a different way of handling the closing of
|
||||
* cases is worked out. Currently, remote events may be
|
||||
* received for a case that is already closed.
|
||||
*/
|
||||
try {
|
||||
// new file was added
|
||||
// @@@ could check the size here and only fire off updates if we know the file meets the min size criteria
|
||||
Case.getCurrentCase();
|
||||
update();
|
||||
@@ -199,10 +199,10 @@ public class FileSize implements AutopsyVisitableItem {
|
||||
|| eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())
|
||||
|| eventType.equals(Case.Events.DATA_SOURCE_ADDED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out.
|
||||
* Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
* Checking for a current case is a stop gap measure
|
||||
* until a different way of handling the closing of
|
||||
* cases is worked out. Currently, remote events may be
|
||||
* received for a case that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2014 Basis Technology Corp.
|
||||
* Copyright 2011-2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -157,10 +157,10 @@ public class FileTypesNode extends DisplayableItemNode {
|
||||
|| eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())
|
||||
|| eventType.equals(Case.Events.DATA_SOURCE_ADDED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out.
|
||||
* Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
* Checking for a current case is a stop gap measure
|
||||
* until a different way of handling the closing of
|
||||
* cases is worked out. Currently, remote events may be
|
||||
* received for a case that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2014 Basis Technology Corp.
|
||||
* Copyright 2011-2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -180,13 +180,13 @@ public class HashsetHits implements AutopsyVisitableItem {
|
||||
private final PropertyChangeListener pcl = new PropertyChangeListener() {
|
||||
@Override
|
||||
public void propertyChange(PropertyChangeEvent evt) {
|
||||
String eventType = evt.getPropertyName();
|
||||
String eventType = evt.getPropertyName();
|
||||
if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked
|
||||
* out. Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
@@ -207,10 +207,10 @@ public class HashsetHits implements AutopsyVisitableItem {
|
||||
} else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
|
||||
|| eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked
|
||||
* out. Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
@@ -220,8 +220,7 @@ public class HashsetHits implements AutopsyVisitableItem {
|
||||
* Case is closed, do nothing.
|
||||
*/
|
||||
}
|
||||
}
|
||||
else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
|
||||
} else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
|
||||
// case was closed. Remove listeners so that we don't get called with a stale case handle
|
||||
if (evt.getNewValue() == null) {
|
||||
removeNotify();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011 Basis Technology Corp.
|
||||
* Copyright 2011-2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -177,17 +177,18 @@ public class InterestingHits implements AutopsyVisitableItem {
|
||||
String eventType = evt.getPropertyName();
|
||||
if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked
|
||||
* out. Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
/**
|
||||
* Due to some unresolved issues with how cases are
|
||||
* closed, it is possible for the event to have a null
|
||||
* oldValue if the event is a remote event.
|
||||
* Even with the check above, it is still possible that
|
||||
* the case will be closed in a different thread before
|
||||
* this code executes. If that happens, it is possible
|
||||
* for the event to have a null oldValue.
|
||||
*/
|
||||
ModuleDataEvent eventData = (ModuleDataEvent) evt.getOldValue();
|
||||
if (null != eventData && (eventData.getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT
|
||||
@@ -202,10 +203,10 @@ public class InterestingHits implements AutopsyVisitableItem {
|
||||
} else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
|
||||
|| eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked
|
||||
* out. Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2014 Basis Technology Corp.
|
||||
* Copyright 2011-2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -248,17 +248,18 @@ public class KeywordHits implements AutopsyVisitableItem {
|
||||
String eventType = evt.getPropertyName();
|
||||
if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked
|
||||
* out. Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
/**
|
||||
* Due to some unresolved issues with how cases are
|
||||
* closed, it is possible for the event to have a null
|
||||
* oldValue if the event is a remote event.
|
||||
* Even with the check above, it is still possible that
|
||||
* the case will be closed in a different thread before
|
||||
* this code executes. If that happens, it is possible
|
||||
* for the event to have a null oldValue.
|
||||
*/
|
||||
ModuleDataEvent eventData = (ModuleDataEvent) evt.getOldValue();
|
||||
if (null != eventData && eventData.getArtifactType() == BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT) {
|
||||
@@ -272,10 +273,10 @@ public class KeywordHits implements AutopsyVisitableItem {
|
||||
} else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
|
||||
|| eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked
|
||||
* out. Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
@@ -285,8 +286,7 @@ public class KeywordHits implements AutopsyVisitableItem {
|
||||
* Case is closed, do nothing.
|
||||
*/
|
||||
}
|
||||
}
|
||||
else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
|
||||
} else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
|
||||
// case was closed. Remove listeners so that we don't get called with a stale case handle
|
||||
if (evt.getNewValue() == null) {
|
||||
removeNotify();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2014 Basis Technology Corp.
|
||||
* Copyright 2011-2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -99,10 +99,10 @@ public final class Reports implements AutopsyVisitableItem {
|
||||
String eventType = evt.getPropertyName();
|
||||
if (eventType.equals(Case.Events.REPORT_ADDED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out.
|
||||
* Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
* Checking for a current case is a stop gap measure
|
||||
* until a different way of handling the closing of
|
||||
* cases is worked out. Currently, remote events may be
|
||||
* received for a case that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2013 Basis Technology Corp.
|
||||
* Copyright 2011-2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -121,19 +121,20 @@ public class Tags implements AutopsyVisitableItem {
|
||||
String eventType = evt.getPropertyName();
|
||||
if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked
|
||||
* out. Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
/**
|
||||
* There are two things to note here. It is possible for
|
||||
* the event to have a null oldValue if the event is a
|
||||
* remote event and the case is closed after the above
|
||||
* call, but before this code executes. Second, the use
|
||||
* of deprecated artifact types here is explained by the
|
||||
* There are two things to note here. * First, even with
|
||||
* the check above, it is still possible that the case
|
||||
* will be closed in a different thread before this code
|
||||
* executes. If that happens, it is possible for the
|
||||
* event to have a null oldValue. Second, the use of
|
||||
* deprecated artifact types here is explained by the
|
||||
* fact that in an ideal world, the TagsManager would
|
||||
* fire tag-related events so that the tags tree would
|
||||
* refresh. But, we haven't had a chance to add that, so
|
||||
@@ -154,10 +155,10 @@ public class Tags implements AutopsyVisitableItem {
|
||||
}
|
||||
} else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString()) || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked
|
||||
* out. Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
|
||||
@@ -34,7 +34,6 @@ import java.util.logging.Level;
|
||||
import java.util.prefs.PreferenceChangeEvent;
|
||||
import java.util.prefs.PreferenceChangeListener;
|
||||
import javax.swing.Action;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.tree.TreeSelectionModel;
|
||||
import org.openide.explorer.ExplorerManager;
|
||||
@@ -524,78 +523,82 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat
|
||||
*/
|
||||
@Override
|
||||
public void propertyChange(PropertyChangeEvent evt) {
|
||||
String changed = evt.getPropertyName();
|
||||
if (changed.equals(Case.Events.CURRENT_CASE.toString())) { // changed current case
|
||||
// When a case is closed, the old value of this property is the
|
||||
// closed Case object and the new value is null. When a case is
|
||||
// opened, the old value is null and the new value is the new Case
|
||||
// object.
|
||||
// @@@ This needs to be revisited. Perhaps case closed and case
|
||||
// opened events instead of property change events would be a better
|
||||
// solution. Either way, more probably needs to be done to clean up
|
||||
// data model objects when a case is closed.
|
||||
if (evt.getOldValue() != null && evt.getNewValue() == null) {
|
||||
// The current case has been closed. Reset the ExplorerManager.
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
Node emptyNode = new AbstractNode(Children.LEAF);
|
||||
em.setRootContext(emptyNode);
|
||||
});
|
||||
} else if (evt.getNewValue() != null) {
|
||||
// A new case has been opened. Reset the ExplorerManager.
|
||||
Case newCase = (Case) evt.getNewValue();
|
||||
final String newCaseName = newCase.getName();
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
em.getRootContext().setName(newCaseName);
|
||||
em.getRootContext().setDisplayName(newCaseName);
|
||||
if (IngestManager.getInstance().isRunningInteractively()) {
|
||||
String changed = evt.getPropertyName();
|
||||
if (changed.equals(Case.Events.CURRENT_CASE.toString())) { // changed current case
|
||||
// When a case is closed, the old value of this property is the
|
||||
// closed Case object and the new value is null. When a case is
|
||||
// opened, the old value is null and the new value is the new Case
|
||||
// object.
|
||||
// @@@ This needs to be revisited. Perhaps case closed and case
|
||||
// opened events instead of property change events would be a better
|
||||
// solution. Either way, more probably needs to be done to clean up
|
||||
// data model objects when a case is closed.
|
||||
if (evt.getOldValue() != null && evt.getNewValue() == null) {
|
||||
// The current case has been closed. Reset the ExplorerManager.
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
Node emptyNode = new AbstractNode(Children.LEAF);
|
||||
em.setRootContext(emptyNode);
|
||||
});
|
||||
} else if (evt.getNewValue() != null) {
|
||||
// A new case has been opened. Reset the ExplorerManager.
|
||||
Case newCase = (Case) evt.getNewValue();
|
||||
final String newCaseName = newCase.getName();
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
em.getRootContext().setName(newCaseName);
|
||||
em.getRootContext().setDisplayName(newCaseName);
|
||||
|
||||
// Reset the forward and back
|
||||
// buttons. Note that a call to CoreComponentControl.openCoreWindows()
|
||||
// by the new Case object will lead to a componentOpened() call
|
||||
// that will repopulate the tree.
|
||||
// @@@ The repopulation of the tree in this fashion also merits
|
||||
// reconsideration.
|
||||
resetHistory();
|
||||
// buttons. Note that a call to CoreComponentControl.openCoreWindows()
|
||||
// by the new Case object will lead to a componentOpened() call
|
||||
// that will repopulate the tree.
|
||||
// @@@ The repopulation of the tree in this fashion also merits
|
||||
// reconsideration.
|
||||
resetHistory();
|
||||
});
|
||||
}
|
||||
} // if the image is added to the case
|
||||
else if (changed.equals(Case.Events.DATA_SOURCE_ADDED.toString())) {
|
||||
/**
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked out.
|
||||
* Currently, remote events may be received for a case that is
|
||||
* already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
CoreComponentControl.openCoreWindows();
|
||||
SwingUtilities.invokeLater(this::componentOpened);
|
||||
} catch (IllegalStateException notUsed) {
|
||||
/**
|
||||
* Case is closed, do nothing.
|
||||
*/
|
||||
}
|
||||
} // change in node selection
|
||||
else if (changed.equals(ExplorerManager.PROP_SELECTED_NODES)) {
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
respondSelection((Node[]) evt.getOldValue(), (Node[]) evt.getNewValue());
|
||||
});
|
||||
}
|
||||
} // if the image is added to the case
|
||||
else if (changed.equals(Case.Events.DATA_SOURCE_ADDED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of handling the
|
||||
* closing of cases is worked out. Currently, remote events may be
|
||||
* received for a case that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
CoreComponentControl.openCoreWindows();
|
||||
SwingUtilities.invokeLater(this::componentOpened);
|
||||
} catch (IllegalStateException notUsed) {
|
||||
/**
|
||||
* Case is closed, do nothing.
|
||||
*/
|
||||
}
|
||||
} // change in node selection
|
||||
else if (changed.equals(ExplorerManager.PROP_SELECTED_NODES)) {
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
respondSelection((Node[]) evt.getOldValue(), (Node[]) evt.getNewValue());
|
||||
});
|
||||
} else if (changed.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
|
||||
} else if (changed.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
|
||||
// nothing to do here.
|
||||
// all nodes should be listening for these events and update accordingly.
|
||||
} else if (changed.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
|
||||
|| changed.equals(IngestManager.IngestJobEvent.CANCELLED.toString())
|
||||
|| changed.equals(IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString())) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of handling the
|
||||
* closing of cases is worked out. Currently, remote events may be
|
||||
* received for a case that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
SwingUtilities.invokeLater(this::refreshDataSourceTree);
|
||||
} catch (IllegalStateException notUsed) {
|
||||
// all nodes should be listening for these events and update accordingly.
|
||||
} else if (changed.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
|
||||
|| changed.equals(IngestManager.IngestJobEvent.CANCELLED.toString())
|
||||
|| changed.equals(IngestManager.IngestModuleEvent.CONTENT_CHANGED.toString())) {
|
||||
/**
|
||||
* Case is closed, do nothing.
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked out.
|
||||
* Currently, remote events may be received for a case that is
|
||||
* already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
SwingUtilities.invokeLater(this::refreshDataSourceTree);
|
||||
} catch (IllegalStateException notUsed) {
|
||||
/**
|
||||
* Case is closed, do nothing.
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ import javax.jms.Topic;
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.ingest.IngestManager;
|
||||
|
||||
/**
|
||||
* Provides thread-safe support for publishing events to registered subscribers
|
||||
@@ -135,38 +136,40 @@ final class RemoteEventPublisher {
|
||||
*/
|
||||
@Override
|
||||
public void onMessage(Message message) {
|
||||
/**
|
||||
* This is a stop gap measure until a different way of handling the
|
||||
* closing of cases is worked out. Currently, Case.currentCase is
|
||||
* set to null before Case.Event.CURRENT_CASE is published. That
|
||||
* means that clients of this class have not had the chance to close
|
||||
* their remote event channels and remote events may be received for
|
||||
* a case that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
} catch (IllegalStateException notUsed) {
|
||||
if (IngestManager.getInstance().isRunningInteractively()) {
|
||||
/**
|
||||
* Case is closed, do not publish the event.
|
||||
* This is a stop gap measure until a different way of handling
|
||||
* the closing of cases is worked out. Currently,
|
||||
* Case.currentCase is set to null before
|
||||
* Case.Event.CURRENT_CASE is published. That means that clients
|
||||
* of this class have not had the chance to close their remote
|
||||
* event channels and remote events may be received for a case
|
||||
* that is already closed.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
if (message instanceof ObjectMessage) {
|
||||
ObjectMessage objectMessage = (ObjectMessage) message;
|
||||
Object object = objectMessage.getObject();
|
||||
if (object instanceof AutopsyEvent) {
|
||||
AutopsyEvent event = (AutopsyEvent) object;
|
||||
event.setSourceType(AutopsyEvent.SourceType.REMOTE);
|
||||
localPublisher.publish(event);
|
||||
}
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
} catch (IllegalStateException notUsed) {
|
||||
/**
|
||||
* Case is closed, do not publish the event.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
if (message instanceof ObjectMessage) {
|
||||
ObjectMessage objectMessage = (ObjectMessage) message;
|
||||
Object object = objectMessage.getObject();
|
||||
if (object instanceof AutopsyEvent) {
|
||||
AutopsyEvent event = (AutopsyEvent) object;
|
||||
event.setSourceType(AutopsyEvent.SourceType.REMOTE);
|
||||
localPublisher.publish(event);
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
logger.log(Level.SEVERE, "Error receiving message", ex);
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
logger.log(Level.SEVERE, "Error receiving message", ex);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -254,10 +254,10 @@ class DateSearchFilter extends AbstractFileSearchFilter<DateSearchPanel> {
|
||||
case DATA_SOURCE_ADDED:
|
||||
case DATA_SOURCE_DELETED:
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked
|
||||
* out. Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
|
||||
@@ -362,7 +362,7 @@ public class IngestManager {
|
||||
* ingest message box, NetBeans progress handles, etc. Running interactively
|
||||
* is the default.
|
||||
*/
|
||||
synchronized boolean isRunningInteractively() {
|
||||
public synchronized boolean isRunningInteractively() {
|
||||
return this.runInteractively;
|
||||
}
|
||||
|
||||
|
||||
@@ -680,10 +680,23 @@ public class TimeLineController {
|
||||
public void propertyChange(PropertyChangeEvent evt) {
|
||||
switch (IngestManager.IngestModuleEvent.valueOf(evt.getPropertyName())) {
|
||||
case FILE_DONE:
|
||||
Platform.runLater(() -> {
|
||||
newEventsFlag.set(true);
|
||||
});
|
||||
break;
|
||||
/**
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked
|
||||
* out. Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
Platform.runLater(() -> {
|
||||
newEventsFlag.set(true);
|
||||
});
|
||||
break;
|
||||
} catch (IllegalStateException notUsed) {
|
||||
/**
|
||||
* Case is closed, do nothing.
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -697,10 +710,10 @@ public class TimeLineController {
|
||||
case CANCELLED:
|
||||
case COMPLETED:
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked
|
||||
* out. Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
@@ -725,10 +738,10 @@ public class TimeLineController {
|
||||
switch (Case.Events.valueOf(evt.getPropertyName())) {
|
||||
case DATA_SOURCE_ADDED:
|
||||
/**
|
||||
* This is a stop gap measure until a different way of
|
||||
* handling the closing of cases is worked out. Currently,
|
||||
* remote events may be received for a case that is already
|
||||
* closed.
|
||||
* Checking for a current case is a stop gap measure until a
|
||||
* different way of handling the closing of cases is worked
|
||||
* out. Currently, remote events may be received for a case
|
||||
* that is already closed.
|
||||
*/
|
||||
try {
|
||||
Case.getCurrentCase();
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#Updated by build script
|
||||
#Mon, 08 Jun 2015 11:37:44 -0400
|
||||
#Fri, 19 Jun 2015 13:59:39 -0400
|
||||
LBL_splash_window_title=Starting Autopsy
|
||||
SPLASH_HEIGHT=314
|
||||
SPLASH_WIDTH=538
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
#Updated by build script
|
||||
#Mon, 08 Jun 2015 11:37:44 -0400
|
||||
#Fri, 19 Jun 2015 13:59:39 -0400
|
||||
|
||||
CTL_MainWindow_Title=Autopsy 3.1.2
|
||||
CTL_MainWindow_Title_No_Project=Autopsy 3.1.2
|
||||
|
||||
Reference in New Issue
Block a user