mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-19 11:07:43 +00:00
3501-Remove status column from open multi-user case browser
This commit is contained in:
parent
16418659d4
commit
eefc085bc1
@ -31,14 +31,12 @@ import java.awt.EventQueue;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.HashMap;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.swing.SwingWorker;
|
import javax.swing.SwingWorker;
|
||||||
import org.openide.explorer.ExplorerManager;
|
import org.openide.explorer.ExplorerManager;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.sleuthkit.autopsy.coordinationservice.CaseNodeData;
|
|
||||||
import org.sleuthkit.autopsy.coordinationservice.CoordinationService;
|
import org.sleuthkit.autopsy.coordinationservice.CoordinationService;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.datamodel.EmptyNode;
|
import org.sleuthkit.autopsy.datamodel.EmptyNode;
|
||||||
@ -59,7 +57,7 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
|
|||||||
private final org.openide.explorer.view.OutlineView outlineView;
|
private final org.openide.explorer.view.OutlineView outlineView;
|
||||||
private int originalPathColumnIndex = 0;
|
private int originalPathColumnIndex = 0;
|
||||||
private static final Logger LOGGER = Logger.getLogger(CaseBrowser.class.getName());
|
private static final Logger LOGGER = Logger.getLogger(CaseBrowser.class.getName());
|
||||||
private LoadCaseMapWorker tableWorker;
|
private LoadCaseListWorker tableWorker;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ExplorerManager getExplorerManager() {
|
public ExplorerManager getExplorerManager() {
|
||||||
@ -76,7 +74,6 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
|
|||||||
outline = outlineView.getOutline();
|
outline = outlineView.getOutline();
|
||||||
outlineView.setPropertyColumns(
|
outlineView.setPropertyColumns(
|
||||||
Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(),
|
Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(),
|
||||||
Bundle.CaseNode_column_status(), Bundle.CaseNode_column_status(),
|
|
||||||
Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath());
|
Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath());
|
||||||
((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.CaseNode_column_name());
|
((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.CaseNode_column_name());
|
||||||
customize();
|
customize();
|
||||||
@ -160,7 +157,7 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
|
|||||||
//set the table to display text informing the user that the list is being retreived and disable case selection
|
//set the table to display text informing the user that the list is being retreived and disable case selection
|
||||||
EmptyNode emptyNode = new EmptyNode(Bundle.CaseBrowser_caseListLoading_message());
|
EmptyNode emptyNode = new EmptyNode(Bundle.CaseBrowser_caseListLoading_message());
|
||||||
em.setRootContext(emptyNode);
|
em.setRootContext(emptyNode);
|
||||||
tableWorker = new LoadCaseMapWorker();
|
tableWorker = new LoadCaseListWorker();
|
||||||
tableWorker.execute();
|
tableWorker.execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -192,13 +189,11 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
|
|||||||
// End of variables declaration//GEN-END:variables
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Swingworker to fetch the updated map of cases and their status in a
|
* Swingworker to fetch the updated List of cases in a background thread
|
||||||
* background thread
|
|
||||||
*/
|
*/
|
||||||
private class LoadCaseMapWorker extends SwingWorker<Void, Void> {
|
private class LoadCaseListWorker extends SwingWorker<Void, Void> {
|
||||||
|
|
||||||
private static final String ALERT_FILE_NAME = "autoingest.alert";
|
private List<CaseMetadata> cases;
|
||||||
private Map<CaseMetadata, Boolean> cases;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a list of the cases in the top level case folder
|
* Gets a list of the cases in the top level case folder
|
||||||
@ -207,8 +202,8 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
|
|||||||
*
|
*
|
||||||
* @throws CoordinationServiceException
|
* @throws CoordinationServiceException
|
||||||
*/
|
*/
|
||||||
private Map<CaseMetadata, Boolean> getCases() throws CoordinationService.CoordinationServiceException {
|
private List<CaseMetadata> getCases() throws CoordinationService.CoordinationServiceException {
|
||||||
Map<CaseMetadata, Boolean> casesMap = new HashMap<>();
|
List<CaseMetadata> caseList = new ArrayList<>();
|
||||||
List<String> nodeList = CoordinationService.getInstance().getNodeList(CoordinationService.CategoryNode.CASES);
|
List<String> nodeList = CoordinationService.getInstance().getNodeList(CoordinationService.CategoryNode.CASES);
|
||||||
|
|
||||||
for (String node : nodeList) {
|
for (String node : nodeList) {
|
||||||
@ -216,64 +211,27 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
|
|||||||
File caseFolder = casePath.toFile();
|
File caseFolder = casePath.toFile();
|
||||||
if (caseFolder.exists()) {
|
if (caseFolder.exists()) {
|
||||||
/*
|
/*
|
||||||
* Search for '*.aut' and 'autoingest.alert' files.
|
* Search for '*.aut' files.
|
||||||
*/
|
*/
|
||||||
File[] fileArray = caseFolder.listFiles();
|
File[] fileArray = caseFolder.listFiles();
|
||||||
if (fileArray == null) {
|
if (fileArray == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
String autFilePath = null;
|
String autFilePath = null;
|
||||||
boolean alertFileFound = false;
|
|
||||||
for (File file : fileArray) {
|
for (File file : fileArray) {
|
||||||
String name = file.getName().toLowerCase();
|
String name = file.getName().toLowerCase();
|
||||||
if (autFilePath == null && name.endsWith(".aut")) {
|
if (autFilePath == null && name.endsWith(".aut")) {
|
||||||
autFilePath = file.getAbsolutePath();
|
try {
|
||||||
if (!alertFileFound) {
|
caseList.add(new CaseMetadata(Paths.get(file.getAbsolutePath())));
|
||||||
continue;
|
} catch (CaseMetadata.CaseMetadataException ex) {
|
||||||
|
LOGGER.log(Level.SEVERE, String.format("Error reading case metadata file '%s'.", autFilePath), ex);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (!alertFileFound && name.endsWith(ALERT_FILE_NAME)) {
|
|
||||||
alertFileFound = true;
|
|
||||||
}
|
|
||||||
if (autFilePath != null && alertFileFound) {
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (autFilePath != null) {
|
|
||||||
try {
|
|
||||||
boolean hasAlertStatus = false;
|
|
||||||
if (alertFileFound) {
|
|
||||||
/*
|
|
||||||
* When an alert file exists, ignore the node
|
|
||||||
* data and use the ALERT status.
|
|
||||||
*/
|
|
||||||
hasAlertStatus = true;
|
|
||||||
} else {
|
|
||||||
byte[] rawData = CoordinationService.getInstance().getNodeData(CoordinationService.CategoryNode.CASES, node);
|
|
||||||
if (rawData != null && rawData.length > 0) {
|
|
||||||
/*
|
|
||||||
* When node data exists, use the status
|
|
||||||
* stored in the node data.
|
|
||||||
*/
|
|
||||||
CaseNodeData caseNodeData = new CaseNodeData(rawData);
|
|
||||||
if (caseNodeData.getErrorsOccurred()) {
|
|
||||||
hasAlertStatus = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
return caseList;
|
||||||
|
|
||||||
CaseMetadata caseMetadata = new CaseMetadata(Paths.get(autFilePath));
|
|
||||||
casesMap.put(caseMetadata, hasAlertStatus);
|
|
||||||
} catch (CaseMetadata.CaseMetadataException ex) {
|
|
||||||
LOGGER.log(Level.SEVERE, String.format("Error reading case metadata file '%s'.", autFilePath), ex);
|
|
||||||
} catch (InterruptedException | CaseNodeData.InvalidDataException ex) {
|
|
||||||
LOGGER.log(Level.SEVERE, String.format("Error reading case node data for '%s'.", node), ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return casesMap;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -25,8 +25,6 @@ import java.nio.file.Path;
|
|||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.swing.AbstractAction;
|
import javax.swing.AbstractAction;
|
||||||
import javax.swing.Action;
|
import javax.swing.Action;
|
||||||
@ -49,7 +47,6 @@ final class MultiUserNode extends AbstractNode {
|
|||||||
|
|
||||||
@Messages({"CaseNode.column.name=Name",
|
@Messages({"CaseNode.column.name=Name",
|
||||||
"CaseNode.column.createdTime=Created Time",
|
"CaseNode.column.createdTime=Created Time",
|
||||||
"CaseNode.column.status=Status",
|
|
||||||
"CaseNode.column.metadataFilePath=Path"})
|
"CaseNode.column.metadataFilePath=Path"})
|
||||||
private static final Logger LOGGER = Logger.getLogger(MultiUserNode.class.getName());
|
private static final Logger LOGGER = Logger.getLogger(MultiUserNode.class.getName());
|
||||||
private static final String LOG_FILE_NAME = "auto_ingest_log.txt";
|
private static final String LOG_FILE_NAME = "auto_ingest_log.txt";
|
||||||
@ -57,31 +54,30 @@ final class MultiUserNode extends AbstractNode {
|
|||||||
/**
|
/**
|
||||||
* Provides a root node with children which each represent a case.
|
* Provides a root node with children which each represent a case.
|
||||||
*
|
*
|
||||||
* @param caseMap the map of cases and a boolean indicating if they have an
|
* @param caseList the list of CaseMetadata objects representing the cases
|
||||||
* alert
|
|
||||||
*/
|
*/
|
||||||
MultiUserNode(Map<CaseMetadata, Boolean> caseMap) {
|
MultiUserNode(List<CaseMetadata> caseList) {
|
||||||
super(Children.create(new MultiUserNodeChildren(caseMap), true));
|
super(Children.create(new MultiUserNodeChildren(caseList), true));
|
||||||
}
|
}
|
||||||
|
|
||||||
static class MultiUserNodeChildren extends ChildFactory<Entry<CaseMetadata, Boolean>> {
|
static class MultiUserNodeChildren extends ChildFactory<CaseMetadata> {
|
||||||
|
|
||||||
private final Map<CaseMetadata, Boolean> caseMap;
|
private final List<CaseMetadata> caseList;
|
||||||
|
|
||||||
MultiUserNodeChildren(Map<CaseMetadata, Boolean> caseMap) {
|
MultiUserNodeChildren(List<CaseMetadata> caseList) {
|
||||||
this.caseMap = caseMap;
|
this.caseList = caseList;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean createKeys(List<Entry<CaseMetadata, Boolean>> list) {
|
protected boolean createKeys(List<CaseMetadata> list) {
|
||||||
if (caseMap != null && caseMap.size() > 0) {
|
if (caseList != null && caseList.size() > 0) {
|
||||||
list.addAll(caseMap.entrySet());
|
list.addAll(caseList);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Node createNodeForKey(Entry<CaseMetadata, Boolean> key) {
|
protected Node createNodeForKey(CaseMetadata key) {
|
||||||
return new MultiUserCaseNode(key);
|
return new MultiUserCaseNode(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,19 +91,17 @@ final class MultiUserNode extends AbstractNode {
|
|||||||
private final String caseName;
|
private final String caseName;
|
||||||
private final String caseCreatedDate;
|
private final String caseCreatedDate;
|
||||||
private final String caseMetadataFilePath;
|
private final String caseMetadataFilePath;
|
||||||
private final boolean caseHasAlert;
|
|
||||||
private final Path caseLogFilePath;
|
private final Path caseLogFilePath;
|
||||||
|
|
||||||
MultiUserCaseNode(Entry<CaseMetadata, Boolean> multiUserCase) {
|
MultiUserCaseNode(CaseMetadata multiUserCase) {
|
||||||
super(Children.LEAF);
|
super(Children.LEAF);
|
||||||
caseName = multiUserCase.getKey().getCaseDisplayName();
|
caseName = multiUserCase.getCaseDisplayName();
|
||||||
caseCreatedDate = multiUserCase.getKey().getCreatedDate();
|
caseCreatedDate = multiUserCase.getCreatedDate();
|
||||||
caseHasAlert = multiUserCase.getValue();
|
|
||||||
super.setName(caseName);
|
super.setName(caseName);
|
||||||
setName(caseName);
|
setName(caseName);
|
||||||
setDisplayName(caseName);
|
setDisplayName(caseName);
|
||||||
caseMetadataFilePath = multiUserCase.getKey().getFilePath().toString();
|
caseMetadataFilePath = multiUserCase.getFilePath().toString();
|
||||||
caseLogFilePath = Paths.get(multiUserCase.getKey().getCaseDirectory(), LOG_FILE_NAME);
|
caseLogFilePath = Paths.get(multiUserCase.getCaseDirectory(), LOG_FILE_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -119,7 +113,6 @@ final class MultiUserNode extends AbstractNode {
|
|||||||
return new OpenMultiUserCaseAction(caseMetadataFilePath);
|
return new OpenMultiUserCaseAction(caseMetadataFilePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Messages({"MultiUserNode.AlertColumn.text=Alert"}) //text to display when there is an alert present
|
|
||||||
@Override
|
@Override
|
||||||
protected Sheet createSheet() {
|
protected Sheet createSheet() {
|
||||||
Sheet s = super.createSheet();
|
Sheet s = super.createSheet();
|
||||||
@ -132,8 +125,6 @@ final class MultiUserNode extends AbstractNode {
|
|||||||
caseName));
|
caseName));
|
||||||
ss.put(new NodeProperty<>(Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(),
|
ss.put(new NodeProperty<>(Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(),
|
||||||
caseCreatedDate));
|
caseCreatedDate));
|
||||||
ss.put(new NodeProperty<>(Bundle.CaseNode_column_status(), Bundle.CaseNode_column_status(), Bundle.CaseNode_column_status(),
|
|
||||||
(caseHasAlert == true ? Bundle.MultiUserNode_AlertColumn_text() : "")));
|
|
||||||
ss.put(new NodeProperty<>(Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath(),
|
ss.put(new NodeProperty<>(Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath(),
|
||||||
caseMetadataFilePath));
|
caseMetadataFilePath));
|
||||||
return s;
|
return s;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user