mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-14 17:06:16 +00:00
Added an application package to the cr package and renamed some classes
This commit is contained in:
parent
2ccf455568
commit
a1c92306c9
@ -0,0 +1,8 @@
|
||||
OtherOccurrences.csvHeader.attribute=Matched Attribute
|
||||
OtherOccurrences.csvHeader.case=Case
|
||||
OtherOccurrences.csvHeader.comment=Comment
|
||||
OtherOccurrences.csvHeader.dataSource=Data Source
|
||||
OtherOccurrences.csvHeader.device=Device
|
||||
OtherOccurrences.csvHeader.known=Known
|
||||
OtherOccurrences.csvHeader.path=Path
|
||||
OtherOccurrences.csvHeader.value=Attribute Value
|
@ -16,7 +16,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.sleuthkit.autopsy.centralrepository.contentviewer;
|
||||
package org.sleuthkit.autopsy.centralrepository.application;
|
||||
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance;
|
||||
@ -30,7 +30,7 @@ import org.sleuthkit.datamodel.TskDataException;
|
||||
/**
|
||||
* Class for populating the Other Occurrences tab
|
||||
*/
|
||||
class OtherOccurrenceNodeInstanceData implements OtherOccurrenceNodeData {
|
||||
public class NodeData {
|
||||
|
||||
// For now hard code the string for the central repo files type, since
|
||||
// getting it dynamically can fail.
|
||||
@ -56,7 +56,7 @@ class OtherOccurrenceNodeInstanceData implements OtherOccurrenceNodeData {
|
||||
* @param type The type of the instance
|
||||
* @param value The value of the instance
|
||||
*/
|
||||
OtherOccurrenceNodeInstanceData(CorrelationAttributeInstance instance, CorrelationAttributeInstance.Type type, String value) {
|
||||
public NodeData(CorrelationAttributeInstance instance, CorrelationAttributeInstance.Type type, String value) {
|
||||
caseName = instance.getCorrelationCase().getDisplayName();
|
||||
deviceID = instance.getCorrelationDataSource().getDeviceID();
|
||||
dataSourceName = instance.getCorrelationDataSource().getName();
|
||||
@ -77,7 +77,7 @@ class OtherOccurrenceNodeInstanceData implements OtherOccurrenceNodeData {
|
||||
*
|
||||
* @throws CentralRepoException
|
||||
*/
|
||||
OtherOccurrenceNodeInstanceData(AbstractFile newFile, Case autopsyCase) throws CentralRepoException {
|
||||
NodeData(AbstractFile newFile, Case autopsyCase) throws CentralRepoException {
|
||||
caseName = autopsyCase.getDisplayName();
|
||||
try {
|
||||
DataSource dataSource = autopsyCase.getSleuthkitCase().getDataSource(newFile.getDataSource().getId());
|
||||
@ -119,7 +119,7 @@ class OtherOccurrenceNodeInstanceData implements OtherOccurrenceNodeData {
|
||||
*
|
||||
* @param newComment The new comment
|
||||
*/
|
||||
void updateComment(String newComment) {
|
||||
public void updateComment(String newComment) {
|
||||
comment = newComment;
|
||||
}
|
||||
|
||||
@ -129,7 +129,7 @@ class OtherOccurrenceNodeInstanceData implements OtherOccurrenceNodeData {
|
||||
* @return true if this node was created from a central repo instance, false
|
||||
* otherwise
|
||||
*/
|
||||
boolean isCentralRepoNode() {
|
||||
public boolean isCentralRepoNode() {
|
||||
return (originalCorrelationInstance != null);
|
||||
}
|
||||
|
||||
@ -138,7 +138,7 @@ class OtherOccurrenceNodeInstanceData implements OtherOccurrenceNodeData {
|
||||
*
|
||||
* @return the case name
|
||||
*/
|
||||
String getCaseName() {
|
||||
public String getCaseName() {
|
||||
return caseName;
|
||||
}
|
||||
|
||||
@ -147,7 +147,7 @@ class OtherOccurrenceNodeInstanceData implements OtherOccurrenceNodeData {
|
||||
*
|
||||
* @return the device ID
|
||||
*/
|
||||
String getDeviceID() {
|
||||
public String getDeviceID() {
|
||||
return deviceID;
|
||||
}
|
||||
|
||||
@ -156,7 +156,7 @@ class OtherOccurrenceNodeInstanceData implements OtherOccurrenceNodeData {
|
||||
*
|
||||
* @return the data source name
|
||||
*/
|
||||
String getDataSourceName() {
|
||||
public String getDataSourceName() {
|
||||
return dataSourceName;
|
||||
}
|
||||
|
||||
@ -165,7 +165,7 @@ class OtherOccurrenceNodeInstanceData implements OtherOccurrenceNodeData {
|
||||
*
|
||||
* @return the file path
|
||||
*/
|
||||
String getFilePath() {
|
||||
public String getFilePath() {
|
||||
return filePath;
|
||||
}
|
||||
|
||||
@ -174,7 +174,7 @@ class OtherOccurrenceNodeInstanceData implements OtherOccurrenceNodeData {
|
||||
*
|
||||
* @return the type
|
||||
*/
|
||||
String getType() {
|
||||
public String getType() {
|
||||
return typeStr;
|
||||
}
|
||||
|
||||
@ -183,7 +183,7 @@ class OtherOccurrenceNodeInstanceData implements OtherOccurrenceNodeData {
|
||||
*
|
||||
* @return the value
|
||||
*/
|
||||
String getValue() {
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@ -192,7 +192,7 @@ class OtherOccurrenceNodeInstanceData implements OtherOccurrenceNodeData {
|
||||
*
|
||||
* @return the known status
|
||||
*/
|
||||
TskData.FileKnown getKnown() {
|
||||
public TskData.FileKnown getKnown() {
|
||||
return known;
|
||||
}
|
||||
|
||||
@ -201,7 +201,7 @@ class OtherOccurrenceNodeInstanceData implements OtherOccurrenceNodeData {
|
||||
*
|
||||
* @return the comment
|
||||
*/
|
||||
String getComment() {
|
||||
public String getComment() {
|
||||
return comment;
|
||||
}
|
||||
|
||||
@ -211,7 +211,7 @@ class OtherOccurrenceNodeInstanceData implements OtherOccurrenceNodeData {
|
||||
*
|
||||
* @return the original abstract file
|
||||
*/
|
||||
AbstractFile getAbstractFile() throws CentralRepoException {
|
||||
public AbstractFile getAbstractFile() throws CentralRepoException {
|
||||
if (originalAbstractFile == null) {
|
||||
throw new CentralRepoException("AbstractFile is null");
|
||||
}
|
||||
@ -226,7 +226,7 @@ class OtherOccurrenceNodeInstanceData implements OtherOccurrenceNodeData {
|
||||
*
|
||||
* @throws CentralRepoException
|
||||
*/
|
||||
CorrelationAttributeInstance getCorrelationAttributeInstance() throws CentralRepoException {
|
||||
public CorrelationAttributeInstance getCorrelationAttributeInstance() throws CentralRepoException {
|
||||
if (originalCorrelationInstance == null) {
|
||||
throw new CentralRepoException("CorrelationAttributeInstance is null");
|
||||
}
|
||||
@ -239,7 +239,7 @@ class OtherOccurrenceNodeInstanceData implements OtherOccurrenceNodeData {
|
||||
*
|
||||
* @return the CSV_ITEM_SEPARATOR string
|
||||
*/
|
||||
static String getCsvItemSeparator() {
|
||||
public static String getCsvItemSeparator() {
|
||||
return CSV_ITEM_SEPARATOR;
|
||||
}
|
||||
|
@ -16,7 +16,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.sleuthkit.autopsy.centralrepository.contentviewer;
|
||||
package org.sleuthkit.autopsy.centralrepository.application;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
@ -60,11 +60,13 @@ import org.sleuthkit.datamodel.TskData;
|
||||
* Contains most of the methods for gathering data from the DB and CR for the
|
||||
* OtherOccurrencesPanel.
|
||||
*/
|
||||
class OtherOccurrenceUtilities {
|
||||
public final class OtherOccurrences {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(OtherOccurrenceUtilities.class.getName());
|
||||
private static final Logger logger = Logger.getLogger(OtherOccurrences.class.getName());
|
||||
|
||||
private static final String UUID_PLACEHOLDER_STRING = "NoCorrelationAttributeInstance";
|
||||
|
||||
private OtherOccurrenceUtilities() {
|
||||
private OtherOccurrences() {
|
||||
}
|
||||
|
||||
/**
|
||||
@ -75,7 +77,7 @@ class OtherOccurrenceUtilities {
|
||||
*
|
||||
* @return A list of attributes that can be used for correlation
|
||||
*/
|
||||
static Collection<CorrelationAttributeInstance> getCorrelationAttributesFromNode(Node node, AbstractFile file) {
|
||||
public static Collection<CorrelationAttributeInstance> getCorrelationAttributesFromNode(Node node, AbstractFile file) {
|
||||
Collection<CorrelationAttributeInstance> ret = new ArrayList<>();
|
||||
|
||||
// correlate on blackboard artifact attributes if they exist and supported
|
||||
@ -144,7 +146,7 @@ class OtherOccurrenceUtilities {
|
||||
*
|
||||
* @return The associated BlackboardArtifact, or null
|
||||
*/
|
||||
static BlackboardArtifact getBlackboardArtifactFromNode(Node node) {
|
||||
public static BlackboardArtifact getBlackboardArtifactFromNode(Node node) {
|
||||
BlackboardArtifactTag nodeBbArtifactTag = node.getLookup().lookup(BlackboardArtifactTag.class);
|
||||
BlackboardArtifact nodeBbArtifact = node.getLookup().lookup(BlackboardArtifact.class);
|
||||
|
||||
@ -165,7 +167,7 @@ class OtherOccurrenceUtilities {
|
||||
*
|
||||
* @return The associated AbstractFile, or null
|
||||
*/
|
||||
static AbstractFile getAbstractFileFromNode(Node node) {
|
||||
public static AbstractFile getAbstractFileFromNode(Node node) {
|
||||
BlackboardArtifactTag nodeBbArtifactTag = node.getLookup().lookup(BlackboardArtifactTag.class);
|
||||
ContentTag nodeContentTag = node.getLookup().lookup(ContentTag.class);
|
||||
BlackboardArtifact nodeBbArtifact = node.getLookup().lookup(BlackboardArtifact.class);
|
||||
@ -210,12 +212,12 @@ class OtherOccurrenceUtilities {
|
||||
*
|
||||
* @return A collection of correlated artifact instances
|
||||
*/
|
||||
static Map<UniquePathKey, OtherOccurrenceNodeInstanceData> getCorrelatedInstances(AbstractFile file, String deviceId, String dataSourceName, CorrelationAttributeInstance corAttr) {
|
||||
public static Map<UniquePathKey, NodeData> getCorrelatedInstances(AbstractFile file, String deviceId, String dataSourceName, CorrelationAttributeInstance corAttr) {
|
||||
// @@@ Check exception
|
||||
try {
|
||||
final Case openCase = Case.getCurrentCaseThrows();
|
||||
String caseUUID = openCase.getName();
|
||||
HashMap<UniquePathKey, OtherOccurrenceNodeInstanceData> nodeDataMap = new HashMap<>();
|
||||
HashMap<UniquePathKey, NodeData> nodeDataMap = new HashMap<>();
|
||||
|
||||
if (CentralRepository.isEnabled()) {
|
||||
List<CorrelationAttributeInstance> instances = CentralRepository.getInstance().getArtifactInstancesByTypeValue(corAttr.getCorrelationType(), corAttr.getCorrelationValue());
|
||||
@ -234,7 +236,7 @@ class OtherOccurrenceUtilities {
|
||||
&& (file != null && artifactInstance.getFilePath().equalsIgnoreCase(file.getParentPath() + file.getName()))) {
|
||||
continue;
|
||||
}
|
||||
OtherOccurrenceNodeInstanceData newNode = new OtherOccurrenceNodeInstanceData(artifactInstance, corAttr.getCorrelationType(), corAttr.getCorrelationValue());
|
||||
NodeData newNode = new NodeData(artifactInstance, corAttr.getCorrelationType(), corAttr.getCorrelationValue());
|
||||
UniquePathKey uniquePathKey = new UniquePathKey(newNode);
|
||||
nodeDataMap.put(uniquePathKey, newNode);
|
||||
}
|
||||
@ -277,7 +279,7 @@ class OtherOccurrenceUtilities {
|
||||
* @throws TskCoreException
|
||||
* @throws CentralRepoException
|
||||
*/
|
||||
static List<AbstractFile> getCaseDbMatches(CorrelationAttributeInstance corAttr, Case openCase, AbstractFile file) throws NoCurrentCaseException, TskCoreException, CentralRepoException {
|
||||
public static List<AbstractFile> getCaseDbMatches(CorrelationAttributeInstance corAttr, Case openCase, AbstractFile file) throws NoCurrentCaseException, TskCoreException, CentralRepoException {
|
||||
List<AbstractFile> caseDbArtifactInstances = new ArrayList<>();
|
||||
if (file != null) {
|
||||
String md5 = corAttr.getCorrelationValue();
|
||||
@ -305,9 +307,9 @@ class OtherOccurrenceUtilities {
|
||||
* @throws TskCoreException
|
||||
* @throws CentralRepoException
|
||||
*/
|
||||
static void addOrUpdateNodeData(final Case autopsyCase, Map<UniquePathKey, OtherOccurrenceNodeInstanceData> nodeDataMap, AbstractFile newFile) throws TskCoreException, CentralRepoException {
|
||||
public static void addOrUpdateNodeData(final Case autopsyCase, Map<UniquePathKey, NodeData> nodeDataMap, AbstractFile newFile) throws TskCoreException, CentralRepoException {
|
||||
|
||||
OtherOccurrenceNodeInstanceData newNode = new OtherOccurrenceNodeInstanceData(newFile, autopsyCase);
|
||||
NodeData newNode = new NodeData(newFile, autopsyCase);
|
||||
|
||||
// If the caseDB object has a notable tag associated with it, update
|
||||
// the known status to BAD
|
||||
@ -330,7 +332,7 @@ class OtherOccurrenceUtilities {
|
||||
// Otherwise this is a new node so add the new node to the map.
|
||||
if (nodeDataMap.containsKey(uniquePathKey)) {
|
||||
if (newNode.getKnown() == TskData.FileKnown.BAD) {
|
||||
OtherOccurrenceNodeInstanceData prevInstance = nodeDataMap.get(uniquePathKey);
|
||||
NodeData prevInstance = nodeDataMap.get(uniquePathKey);
|
||||
prevInstance.updateKnown(newNode.getKnown());
|
||||
}
|
||||
} else {
|
||||
@ -342,17 +344,16 @@ class OtherOccurrenceUtilities {
|
||||
* Create a unique string to be used as a key for deduping data sources as
|
||||
* best as possible
|
||||
*/
|
||||
static String makeDataSourceString(String caseUUID, String deviceId, String dataSourceName) {
|
||||
public static String makeDataSourceString(String caseUUID, String deviceId, String dataSourceName) {
|
||||
return caseUUID + deviceId + dataSourceName;
|
||||
}
|
||||
|
||||
@NbBundle.Messages({"OtherOccurrencesPanel.earliestCaseNotAvailable= Not Enabled."})
|
||||
|
||||
/**
|
||||
* Gets the list of Eam Cases and determines the earliest case creation
|
||||
* date. Sets the label to display the earliest date string to the user.
|
||||
*/
|
||||
static String getEarliestCaseDate() throws CentralRepoException {
|
||||
String dateStringDisplay = Bundle.OtherOccurrencesPanel_earliestCaseNotAvailable();
|
||||
public static String getEarliestCaseDate() throws CentralRepoException {
|
||||
String dateStringDisplay = "";
|
||||
|
||||
if (CentralRepository.isEnabled()) {
|
||||
LocalDateTime earliestDate = LocalDateTime.now(DateTimeZone.UTC);
|
||||
@ -376,6 +377,17 @@ class OtherOccurrenceUtilities {
|
||||
|
||||
return dateStringDisplay;
|
||||
}
|
||||
|
||||
@NbBundle.Messages({
|
||||
"OtherOccurrences.csvHeader.case=Case",
|
||||
"OtherOccurrences.csvHeader.device=Device",
|
||||
"OtherOccurrences.csvHeader.dataSource=Data Source",
|
||||
"OtherOccurrences.csvHeader.attribute=Matched Attribute",
|
||||
"OtherOccurrences.csvHeader.value=Attribute Value",
|
||||
"OtherOccurrences.csvHeader.known=Known",
|
||||
"OtherOccurrences.csvHeader.path=Path",
|
||||
"OtherOccurrences.csvHeader.comment=Comment"
|
||||
})
|
||||
|
||||
/**
|
||||
* Create a cvs file of occurrences for the given parameters.
|
||||
@ -389,28 +401,38 @@ class OtherOccurrenceUtilities {
|
||||
*
|
||||
* @throws IOException
|
||||
*/
|
||||
static void writeOtherOccurrencesToFileAsCSV(File destFile, AbstractFile abstractFile, Collection<CorrelationAttributeInstance> correlationAttList, String dataSourceName, String deviceId) throws IOException {
|
||||
public static void writeOtherOccurrencesToFileAsCSV(File destFile, AbstractFile abstractFile, Collection<CorrelationAttributeInstance> correlationAttList, String dataSourceName, String deviceId) throws IOException {
|
||||
try (BufferedWriter writer = Files.newBufferedWriter(destFile.toPath())) {
|
||||
//write headers
|
||||
StringBuilder headers = new StringBuilder("\"");
|
||||
headers.append(Bundle.OtherOccurrencesPanel_csvHeader_case())
|
||||
.append(OtherOccurrenceNodeInstanceData.getCsvItemSeparator()).append(Bundle.OtherOccurrencesPanel_csvHeader_dataSource())
|
||||
.append(OtherOccurrenceNodeInstanceData.getCsvItemSeparator()).append(Bundle.OtherOccurrencesPanel_csvHeader_attribute())
|
||||
.append(OtherOccurrenceNodeInstanceData.getCsvItemSeparator()).append(Bundle.OtherOccurrencesPanel_csvHeader_value())
|
||||
.append(OtherOccurrenceNodeInstanceData.getCsvItemSeparator()).append(Bundle.OtherOccurrencesPanel_csvHeader_known())
|
||||
.append(OtherOccurrenceNodeInstanceData.getCsvItemSeparator()).append(Bundle.OtherOccurrencesPanel_csvHeader_path())
|
||||
.append(OtherOccurrenceNodeInstanceData.getCsvItemSeparator()).append(Bundle.OtherOccurrencesPanel_csvHeader_comment())
|
||||
headers.append(Bundle.OtherOccurrences_csvHeader_case())
|
||||
.append(NodeData.getCsvItemSeparator()).append(Bundle.OtherOccurrences_csvHeader_dataSource())
|
||||
.append(NodeData.getCsvItemSeparator()).append(Bundle.OtherOccurrences_csvHeader_attribute())
|
||||
.append(NodeData.getCsvItemSeparator()).append(Bundle.OtherOccurrences_csvHeader_value())
|
||||
.append(NodeData.getCsvItemSeparator()).append(Bundle.OtherOccurrences_csvHeader_known())
|
||||
.append(NodeData.getCsvItemSeparator()).append(Bundle.OtherOccurrences_csvHeader_path())
|
||||
.append(NodeData.getCsvItemSeparator()).append(Bundle.OtherOccurrences_csvHeader_comment())
|
||||
.append('"').append(System.getProperty("line.separator"));
|
||||
writer.write(headers.toString());
|
||||
//write content
|
||||
for (CorrelationAttributeInstance corAttr : correlationAttList) {
|
||||
Map<UniquePathKey, OtherOccurrenceNodeInstanceData> correlatedNodeDataMap = new HashMap<>(0);
|
||||
Map<UniquePathKey, NodeData> correlatedNodeDataMap = new HashMap<>(0);
|
||||
// get correlation and reference set instances from DB
|
||||
correlatedNodeDataMap.putAll(getCorrelatedInstances(abstractFile, deviceId, dataSourceName, corAttr));
|
||||
for (OtherOccurrenceNodeInstanceData nodeData : correlatedNodeDataMap.values()) {
|
||||
for (NodeData nodeData : correlatedNodeDataMap.values()) {
|
||||
writer.write(nodeData.toCsvString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a placeholder string to use in place of case uuid when it isn't
|
||||
* available
|
||||
*
|
||||
* @return UUID_PLACEHOLDER_STRING
|
||||
*/
|
||||
public static String getPlaceholderUUID() {
|
||||
return UUID_PLACEHOLDER_STRING;
|
||||
}
|
||||
}
|
@ -16,12 +16,13 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.sleuthkit.autopsy.centralrepository.contentviewer;
|
||||
package org.sleuthkit.autopsy.centralrepository.application;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.logging.Level;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.autopsy.centralrepository.contentviewer.OtherOccurrencesPanel;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
|
||||
@ -29,7 +30,7 @@ import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
* Used as a key to ensure we eliminate duplicates from the result set by not
|
||||
* overwriting CR correlation instances.
|
||||
*/
|
||||
final class UniquePathKey {
|
||||
public final class UniquePathKey {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(UniquePathKey.class.getName());
|
||||
private final String dataSourceID;
|
||||
@ -37,7 +38,7 @@ final class UniquePathKey {
|
||||
private final String type;
|
||||
private final String caseUUID;
|
||||
|
||||
UniquePathKey(OtherOccurrenceNodeInstanceData nodeData) {
|
||||
public UniquePathKey(NodeData nodeData) {
|
||||
super();
|
||||
dataSourceID = nodeData.getDeviceID();
|
||||
if (nodeData.getFilePath() != null) {
|
||||
@ -56,7 +57,7 @@ final class UniquePathKey {
|
||||
//place holder value will be used since correlation attribute was unavailble
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
logger.log(Level.WARNING, "Unable to get current case", ex);
|
||||
tempCaseUUID = OtherOccurrencesPanel.getPlaceholderUUID();
|
||||
tempCaseUUID = OtherOccurrences.getPlaceholderUUID();
|
||||
}
|
||||
}
|
||||
caseUUID = tempCaseUUID;
|
@ -31,18 +31,9 @@ OtherOccurrencesPanel.correlatedArtifacts.byType={0}% of data sources have {2} (
|
||||
OtherOccurrencesPanel.correlatedArtifacts.failed=Failed to get frequency details.
|
||||
OtherOccurrencesPanel.correlatedArtifacts.isEmpty=There are no files or artifacts to correlate.
|
||||
OtherOccurrencesPanel.correlatedArtifacts.title=Attribute Frequency
|
||||
OtherOccurrencesPanel.csvHeader.attribute=Matched Attribute
|
||||
OtherOccurrencesPanel.csvHeader.case=Case
|
||||
OtherOccurrencesPanel.csvHeader.comment=Comment
|
||||
OtherOccurrencesPanel.csvHeader.dataSource=Data Source
|
||||
OtherOccurrencesPanel.csvHeader.device=Device
|
||||
OtherOccurrencesPanel.csvHeader.known=Known
|
||||
OtherOccurrencesPanel.csvHeader.path=Path
|
||||
OtherOccurrencesPanel.csvHeader.value=Attribute Value
|
||||
OtherOccurrencesPanel.earliestCaseLabel.toolTipText=
|
||||
OtherOccurrencesPanel.earliestCaseLabel.text=Central Repository Starting Date:
|
||||
OtherOccurrencesPanel.earliestCaseDate.text=Earliest Case Date
|
||||
OtherOccurrencesPanel.earliestCaseNotAvailable=\ Not Enabled.
|
||||
OtherOccurrencesPanel.foundIn.text=Found %d instances in %d cases and %d data sources.
|
||||
OtherOccurrencesPanel.foundInLabel.text=
|
||||
OtherOccurrencesPanel.filesTable.toolTipText=Click column name to sort. Right-click on the table for more options.
|
||||
@ -52,4 +43,5 @@ OtherOccurrencesPanel.showCommonalityMenuItem.text=Show Frequency
|
||||
OtherOccurrencesPanel.showCaseDetailsMenuItem.text=Show Case Details
|
||||
OtherOccurrencesPanel.table.noArtifacts=Item has no attributes with which to search.
|
||||
OtherOccurrencesPanel.table.noResultsFound=No results found.
|
||||
OtherOccurrencesPanel_earliestCaseNotAvailable=Not Availble.
|
||||
OtherOccurrencesPanel_table_loadingResults=Loading results
|
||||
|
@ -27,6 +27,7 @@ import javax.swing.JPanel;
|
||||
import org.openide.nodes.Node;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.openide.util.lookup.ServiceProvider;
|
||||
import org.sleuthkit.autopsy.centralrepository.application.OtherOccurrences;
|
||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataContentViewer;
|
||||
import org.sleuthkit.datamodel.AbstractFile;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository;
|
||||
@ -92,9 +93,9 @@ public final class DataContentViewerOtherCases extends JPanel implements DataCon
|
||||
// - The central repo is enabled and the node has correlatable content
|
||||
// (either through the MD5 hash of the associated file or through a BlackboardArtifact)
|
||||
// - The central repo is disabled and the backing file has a valid MD5 hash
|
||||
AbstractFile file = OtherOccurrenceUtilities.getAbstractFileFromNode(node);
|
||||
AbstractFile file = OtherOccurrences.getAbstractFileFromNode(node);
|
||||
if (CentralRepository.isEnabled()) {
|
||||
return !OtherOccurrenceUtilities.getCorrelationAttributesFromNode(node, file).isEmpty();
|
||||
return !OtherOccurrences.getCorrelationAttributesFromNode(node, file).isEmpty();
|
||||
} else {
|
||||
return file != null
|
||||
&& file.getSize() > 0
|
||||
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.centralrepository.contentviewer;
|
||||
|
||||
import org.sleuthkit.autopsy.centralrepository.application.NodeData;
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import java.util.ArrayList;
|
||||
@ -50,7 +51,7 @@ final class OccurrencePanel extends javax.swing.JPanel {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private int gridY = 0;
|
||||
private final List<OtherOccurrenceNodeData> nodeDataList;
|
||||
private final List<NodeData> nodeDataList;
|
||||
private final Map<String, String> caseNamesAndDates = new HashMap<>();
|
||||
private final Set<String> dataSourceNames = new HashSet<>();
|
||||
private final Set<String> filePaths = new HashSet<>();
|
||||
@ -97,7 +98,7 @@ final class OccurrencePanel extends javax.swing.JPanel {
|
||||
* @param nodeDataList the list of OtherOccurrenceNodeData representing
|
||||
* common properties for the file
|
||||
*/
|
||||
OccurrencePanel(List<OtherOccurrenceNodeData> nodeDataList) {
|
||||
OccurrencePanel(List<NodeData> nodeDataList) {
|
||||
this.nodeDataList = nodeDataList;
|
||||
customizeComponents();
|
||||
}
|
||||
@ -148,9 +149,9 @@ final class OccurrencePanel extends javax.swing.JPanel {
|
||||
addItemToBag(gridY, 0, TOP_INSET, 0, commonPropertiesLabel);
|
||||
gridY++;
|
||||
//for each other occurrence
|
||||
for (OtherOccurrenceNodeData occurrence : nodeDataList) {
|
||||
if (occurrence instanceof OtherOccurrenceNodeInstanceData) {
|
||||
String type = ((OtherOccurrenceNodeInstanceData) occurrence).getType();
|
||||
for (NodeData occurrence : nodeDataList) {
|
||||
if (occurrence instanceof NodeData) {
|
||||
String type = occurrence.getType();
|
||||
if (!type.isEmpty()) {
|
||||
javax.swing.JLabel typeLabel = new javax.swing.JLabel();
|
||||
org.openide.awt.Mnemonics.setLocalizedText(typeLabel, Bundle.OccurrencePanel_commonPropertyTypeLabel_text());
|
||||
@ -160,7 +161,7 @@ final class OccurrencePanel extends javax.swing.JPanel {
|
||||
addItemToBag(gridY, 1, VERTICAL_GAP, 0, typeFieldValue);
|
||||
gridY++;
|
||||
}
|
||||
String value = ((OtherOccurrenceNodeInstanceData) occurrence).getValue();
|
||||
String value = occurrence.getValue();
|
||||
if (!value.isEmpty()) {
|
||||
javax.swing.JLabel valueLabel = new javax.swing.JLabel();
|
||||
org.openide.awt.Mnemonics.setLocalizedText(valueLabel, Bundle.OccurrencePanel_commonPropertyValueLabel_text());
|
||||
@ -170,7 +171,7 @@ final class OccurrencePanel extends javax.swing.JPanel {
|
||||
addItemToBag(gridY, 1, 0, 0, valueFieldValue);
|
||||
gridY++;
|
||||
}
|
||||
TskData.FileKnown knownStatus = ((OtherOccurrenceNodeInstanceData) occurrence).getKnown();
|
||||
TskData.FileKnown knownStatus = occurrence.getKnown();
|
||||
javax.swing.JLabel knownStatusLabel = new javax.swing.JLabel();
|
||||
org.openide.awt.Mnemonics.setLocalizedText(knownStatusLabel, Bundle.OccurrencePanel_commonPropertyKnownStatusLabel_text());
|
||||
addItemToBag(gridY, 0, 0, 0, knownStatusLabel);
|
||||
@ -181,7 +182,7 @@ final class OccurrencePanel extends javax.swing.JPanel {
|
||||
}
|
||||
addItemToBag(gridY, 1, 0, 0, knownStatusValue);
|
||||
gridY++;
|
||||
String comment = ((OtherOccurrenceNodeInstanceData) occurrence).getComment();
|
||||
String comment = occurrence.getComment();
|
||||
if (!comment.isEmpty()) {
|
||||
javax.swing.JLabel commentLabel = new javax.swing.JLabel();
|
||||
org.openide.awt.Mnemonics.setLocalizedText(commentLabel, Bundle.OccurrencePanel_commonPropertyCommentLabel_text());
|
||||
@ -201,10 +202,9 @@ final class OccurrencePanel extends javax.swing.JPanel {
|
||||
}
|
||||
String caseDate = "";
|
||||
try {
|
||||
OtherOccurrenceNodeInstanceData nodeData = ((OtherOccurrenceNodeInstanceData) occurrence);
|
||||
if (nodeData.isCentralRepoNode()) {
|
||||
if (occurrence.isCentralRepoNode()) {
|
||||
if (CentralRepository.isEnabled()) {
|
||||
CorrelationCase partialCase = nodeData.getCorrelationAttributeInstance().getCorrelationCase();
|
||||
CorrelationCase partialCase = occurrence.getCorrelationAttributeInstance().getCorrelationCase();
|
||||
caseDate = CentralRepository.getInstance().getCaseByUUID(partialCase.getCaseUUID()).getCreationDate();
|
||||
}
|
||||
} else {
|
||||
@ -214,9 +214,9 @@ final class OccurrencePanel extends javax.swing.JPanel {
|
||||
LOGGER.log(Level.WARNING, "Error getting case created date for other occurrence content viewer", ex);
|
||||
}
|
||||
//Collect the data that is necessary for the other sections
|
||||
caseNamesAndDates.put(((OtherOccurrenceNodeInstanceData) occurrence).getCaseName(), caseDate);
|
||||
dataSourceNames.add(((OtherOccurrenceNodeInstanceData) occurrence).getDataSourceName());
|
||||
filePaths.add(((OtherOccurrenceNodeInstanceData) occurrence).getFilePath());
|
||||
caseNamesAndDates.put(occurrence.getCaseName(), caseDate);
|
||||
dataSourceNames.add(occurrence.getDataSourceName());
|
||||
filePaths.add(occurrence.getFilePath());
|
||||
}
|
||||
}
|
||||
//end for each
|
||||
|
@ -1,25 +0,0 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.sleuthkit.autopsy.centralrepository.contentviewer;
|
||||
/**
|
||||
* Marker interface for Other Occurrences nodes.
|
||||
*/
|
||||
interface OtherOccurrenceNodeData {
|
||||
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.sleuthkit.autopsy.centralrepository.contentviewer;
|
||||
|
||||
/**
|
||||
* Class for populating the Other Occurrences tab with a single message.
|
||||
*/
|
||||
final class OtherOccurrenceNodeMessageData implements OtherOccurrenceNodeData {
|
||||
private final String displayMessage;
|
||||
|
||||
OtherOccurrenceNodeMessageData(String displayMessage) {
|
||||
this.displayMessage = displayMessage;
|
||||
}
|
||||
|
||||
String getDisplayMessage() {
|
||||
return displayMessage;
|
||||
}
|
||||
}
|
@ -30,6 +30,9 @@ import javax.swing.SwingWorker;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.autopsy.centralrepository.application.NodeData;
|
||||
import org.sleuthkit.autopsy.centralrepository.application.OtherOccurrences;
|
||||
import org.sleuthkit.autopsy.centralrepository.application.UniquePathKey;
|
||||
import org.sleuthkit.autopsy.centralrepository.contentviewer.OtherOccurrenceOneTypeWorker.OneTypeData;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository;
|
||||
@ -77,13 +80,13 @@ class OtherOccurrenceOneTypeWorker extends SwingWorker<OneTypeData, Void> {
|
||||
int totalCount = 0;
|
||||
Set<String> dataSources = new HashSet<>();
|
||||
Collection<CorrelationAttributeInstance> correlationAttributesToAdd = new ArrayList<>();
|
||||
String earliestDate = OtherOccurrenceUtilities.getEarliestCaseDate();
|
||||
String earliestDate = OtherOccurrences.getEarliestCaseDate();
|
||||
OneTypeData results = null;
|
||||
|
||||
if (CentralRepository.isEnabled()) {
|
||||
List<CorrelationAttributeInstance> instances;
|
||||
instances = CentralRepository.getInstance().getArtifactInstancesByTypeValue(aType, value);
|
||||
HashMap<UniquePathKey, OtherOccurrenceNodeInstanceData> nodeDataMap = new HashMap<>();
|
||||
HashMap<UniquePathKey, NodeData> nodeDataMap = new HashMap<>();
|
||||
String caseUUID = Case.getCurrentCase().getName();
|
||||
for (CorrelationAttributeInstance artifactInstance : instances) {
|
||||
if (isCancelled()) {
|
||||
@ -104,26 +107,26 @@ class OtherOccurrenceOneTypeWorker extends SwingWorker<OneTypeData, Void> {
|
||||
continue;
|
||||
}
|
||||
correlationAttributesToAdd.add(artifactInstance);
|
||||
OtherOccurrenceNodeInstanceData newNode = new OtherOccurrenceNodeInstanceData(artifactInstance, aType, value);
|
||||
NodeData newNode = new NodeData(artifactInstance, aType, value);
|
||||
UniquePathKey uniquePathKey = new UniquePathKey(newNode);
|
||||
nodeDataMap.put(uniquePathKey, newNode);
|
||||
}
|
||||
|
||||
for (OtherOccurrenceNodeInstanceData nodeData : nodeDataMap.values()) {
|
||||
for (NodeData nodeData : nodeDataMap.values()) {
|
||||
if (isCancelled()) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (nodeData.isCentralRepoNode()) {
|
||||
try {
|
||||
dataSources.add(OtherOccurrenceUtilities.makeDataSourceString(nodeData.getCorrelationAttributeInstance().getCorrelationCase().getCaseUUID(), nodeData.getDeviceID(), nodeData.getDataSourceName()));
|
||||
dataSources.add(OtherOccurrences.makeDataSourceString(nodeData.getCorrelationAttributeInstance().getCorrelationCase().getCaseUUID(), nodeData.getDeviceID(), nodeData.getDataSourceName()));
|
||||
caseNames.put(nodeData.getCorrelationAttributeInstance().getCorrelationCase().getCaseUUID(), nodeData.getCorrelationAttributeInstance().getCorrelationCase());
|
||||
} catch (CentralRepoException ex) {
|
||||
logger.log(Level.WARNING, "Unable to get correlation case for displaying other occurrence for case: " + nodeData.getCaseName(), ex);
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
dataSources.add(OtherOccurrenceUtilities.makeDataSourceString(Case.getCurrentCaseThrows().getName(), nodeData.getDeviceID(), nodeData.getDataSourceName()));
|
||||
dataSources.add(OtherOccurrences.makeDataSourceString(Case.getCurrentCaseThrows().getName(), nodeData.getDeviceID(), nodeData.getDataSourceName()));
|
||||
caseNames.put(Case.getCurrentCaseThrows().getName(), new CorrelationCase(Case.getCurrentCaseThrows().getName(), Case.getCurrentCaseThrows().getDisplayName()));
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
logger.log(Level.WARNING, "No current case open for other occurrences", ex);
|
||||
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.centralrepository.contentviewer;
|
||||
|
||||
import org.sleuthkit.autopsy.centralrepository.application.NodeData;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
@ -26,6 +27,7 @@ import javax.swing.table.AbstractTableModel;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.autopsy.centralrepository.application.OtherOccurrences;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
|
||||
@ -139,11 +141,10 @@ final class OtherOccurrencesDataSourcesTableModel extends AbstractTableModel {
|
||||
*
|
||||
* @param newNodeData data to add to the table
|
||||
*/
|
||||
void addNodeData(OtherOccurrenceNodeData newNodeData) {
|
||||
OtherOccurrenceNodeInstanceData nodeData = (OtherOccurrenceNodeInstanceData) newNodeData;
|
||||
void addNodeData(NodeData newNodeData) {
|
||||
String caseUUID;
|
||||
try {
|
||||
caseUUID = nodeData.getCorrelationAttributeInstance().getCorrelationCase().getCaseUUID();
|
||||
caseUUID = newNodeData.getCorrelationAttributeInstance().getCorrelationCase().getCaseUUID();
|
||||
} catch (CentralRepoException ignored) {
|
||||
//non central repo nodeData won't have a correlation case
|
||||
try {
|
||||
@ -151,10 +152,10 @@ final class OtherOccurrencesDataSourcesTableModel extends AbstractTableModel {
|
||||
//place holder value will be used since correlation attribute was unavailble
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
logger.log(Level.WARNING, "Unable to get current case", ex);
|
||||
caseUUID = OtherOccurrencesPanel.getPlaceholderUUID();
|
||||
caseUUID = OtherOccurrences.getPlaceholderUUID();
|
||||
}
|
||||
}
|
||||
dataSourceSet.add(new DataSourceColumnItem(nodeData.getCaseName(), nodeData.getDeviceID(), nodeData.getDataSourceName(), caseUUID));
|
||||
dataSourceSet.add(new DataSourceColumnItem(newNodeData.getCaseName(), newNodeData.getDeviceID(), newNodeData.getDataSourceName(), caseUUID));
|
||||
fireTableDataChanged();
|
||||
}
|
||||
|
||||
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.centralrepository.contentviewer;
|
||||
|
||||
import org.sleuthkit.autopsy.centralrepository.application.NodeData;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@ -28,6 +29,7 @@ import org.openide.util.NbBundle.Messages;
|
||||
import org.apache.commons.io.FilenameUtils;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.autopsy.centralrepository.application.OtherOccurrences;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
|
||||
@ -40,7 +42,7 @@ public class OtherOccurrencesFilesTableModel extends AbstractTableModel {
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final Logger logger = Logger.getLogger(OtherOccurrencesFilesTableModel.class.getName());
|
||||
private final List<String> nodeKeys = new ArrayList<>();
|
||||
private final Map<String, List<OtherOccurrenceNodeData>> nodeMap = new HashMap<>();
|
||||
private final Map<String, List<NodeData>> nodeMap = new HashMap<>();
|
||||
|
||||
/**
|
||||
* Create a table model for displaying file names
|
||||
@ -75,7 +77,7 @@ public class OtherOccurrencesFilesTableModel extends AbstractTableModel {
|
||||
|| nodeMap.get(nodeKeys.get(rowIdx)).isEmpty()) {
|
||||
return Bundle.OtherOccurrencesFilesTableModel_noData();
|
||||
}
|
||||
return FilenameUtils.getName(((OtherOccurrenceNodeInstanceData) nodeMap.get(nodeKeys.get(rowIdx)).get(0)).getFilePath());
|
||||
return FilenameUtils.getName( nodeMap.get(nodeKeys.get(rowIdx)).get(0).getFilePath());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -87,7 +89,7 @@ public class OtherOccurrencesFilesTableModel extends AbstractTableModel {
|
||||
* @return a list of OtherOccurrenceNodeData for the specified index or an
|
||||
* empty list if no data was found
|
||||
*/
|
||||
List<OtherOccurrenceNodeData> getListOfNodesForFile(int rowIdx) {
|
||||
List<NodeData> getListOfNodesForFile(int rowIdx) {
|
||||
//if anything would prevent this from working return an empty list
|
||||
if (nodeMap.isEmpty() || nodeKeys.isEmpty() || rowIdx < 0
|
||||
|| rowIdx >= nodeKeys.size() || nodeKeys.get(rowIdx) == null
|
||||
@ -107,9 +109,9 @@ public class OtherOccurrencesFilesTableModel extends AbstractTableModel {
|
||||
*
|
||||
* @param newNodeData data to add to the table
|
||||
*/
|
||||
void addNodeData(OtherOccurrenceNodeData newNodeData) {
|
||||
String newNodeKey = createNodeKey((OtherOccurrenceNodeInstanceData) newNodeData);//FilenameUtils.getName(((OtherOccurrenceNodeInstanceData)newNodeData).getFilePath());
|
||||
List<OtherOccurrenceNodeData> nodeList = nodeMap.get(newNodeKey);
|
||||
void addNodeData(NodeData newNodeData) {
|
||||
String newNodeKey = createNodeKey((NodeData) newNodeData);//FilenameUtils.getName(((OtherOccurrenceNodeInstanceData)newNodeData).getFilePath());
|
||||
List<NodeData> nodeList = nodeMap.get(newNodeKey);
|
||||
if (nodeList == null) {
|
||||
nodeKeys.add(newNodeKey);
|
||||
nodeList = new ArrayList<>();
|
||||
@ -119,7 +121,7 @@ public class OtherOccurrencesFilesTableModel extends AbstractTableModel {
|
||||
fireTableDataChanged();
|
||||
}
|
||||
|
||||
private String createNodeKey(OtherOccurrenceNodeInstanceData nodeData) {
|
||||
private String createNodeKey(NodeData nodeData) {
|
||||
String caseUUID;
|
||||
try {
|
||||
caseUUID = nodeData.getCorrelationAttributeInstance().getCorrelationCase().getCaseUUID();
|
||||
@ -130,7 +132,7 @@ public class OtherOccurrencesFilesTableModel extends AbstractTableModel {
|
||||
//place holder value will be used since correlation attribute was unavailble
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
logger.log(Level.WARNING, "Unable to get current case", ex);
|
||||
caseUUID = OtherOccurrencesPanel.getPlaceholderUUID();
|
||||
caseUUID = OtherOccurrences.getPlaceholderUUID();
|
||||
}
|
||||
}
|
||||
return nodeData.getCaseName() + nodeData.getDataSourceName() + nodeData.getDeviceID() + nodeData.getFilePath() + caseUUID;
|
||||
|
@ -28,6 +28,8 @@ import javax.swing.SwingWorker;
|
||||
import org.openide.nodes.Node;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.autopsy.centralrepository.application.NodeData;
|
||||
import org.sleuthkit.autopsy.centralrepository.application.OtherOccurrences;
|
||||
import org.sleuthkit.autopsy.centralrepository.contentviewer.OtherOccurrencesNodeWorker.OtherOccurrencesData;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance;
|
||||
@ -58,7 +60,7 @@ class OtherOccurrencesNodeWorker extends SwingWorker<OtherOccurrencesData, Void>
|
||||
|
||||
@Override
|
||||
protected OtherOccurrencesData doInBackground() throws Exception {
|
||||
AbstractFile file = OtherOccurrenceUtilities.getAbstractFileFromNode(node);
|
||||
AbstractFile file = OtherOccurrences.getAbstractFileFromNode(node);
|
||||
String deviceId = "";
|
||||
String dataSourceName = "";
|
||||
Map<String, CorrelationCase> caseNames = new HashMap<>();
|
||||
@ -75,22 +77,22 @@ class OtherOccurrencesNodeWorker extends SwingWorker<OtherOccurrencesData, Void>
|
||||
// @@@ Review this behavior
|
||||
return null;
|
||||
}
|
||||
Collection<CorrelationAttributeInstance> correlationAttributes = OtherOccurrenceUtilities.getCorrelationAttributesFromNode(node, file);
|
||||
Collection<CorrelationAttributeInstance> correlationAttributes = OtherOccurrences.getCorrelationAttributesFromNode(node, file);
|
||||
|
||||
int totalCount = 0;
|
||||
Set<String> dataSources = new HashSet<>();
|
||||
for (CorrelationAttributeInstance corAttr : correlationAttributes) {
|
||||
for (OtherOccurrenceNodeInstanceData nodeData : OtherOccurrenceUtilities.getCorrelatedInstances(file, deviceId, dataSourceName, corAttr).values()) {
|
||||
for (NodeData nodeData : OtherOccurrences.getCorrelatedInstances(file, deviceId, dataSourceName, corAttr).values()) {
|
||||
if (nodeData.isCentralRepoNode()) {
|
||||
try {
|
||||
dataSources.add(OtherOccurrenceUtilities.makeDataSourceString(nodeData.getCorrelationAttributeInstance().getCorrelationCase().getCaseUUID(), nodeData.getDeviceID(), nodeData.getDataSourceName()));
|
||||
dataSources.add(OtherOccurrences.makeDataSourceString(nodeData.getCorrelationAttributeInstance().getCorrelationCase().getCaseUUID(), nodeData.getDeviceID(), nodeData.getDataSourceName()));
|
||||
caseNames.put(nodeData.getCorrelationAttributeInstance().getCorrelationCase().getCaseUUID(), nodeData.getCorrelationAttributeInstance().getCorrelationCase());
|
||||
} catch (CentralRepoException ex) {
|
||||
logger.log(Level.WARNING, "Unable to get correlation case for displaying other occurrence for case: " + nodeData.getCaseName(), ex);
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
dataSources.add(OtherOccurrenceUtilities.makeDataSourceString(Case.getCurrentCaseThrows().getName(), nodeData.getDeviceID(), nodeData.getDataSourceName()));
|
||||
dataSources.add(OtherOccurrences.makeDataSourceString(Case.getCurrentCaseThrows().getName(), nodeData.getDeviceID(), nodeData.getDataSourceName()));
|
||||
caseNames.put(Case.getCurrentCaseThrows().getName(), new CorrelationCase(Case.getCurrentCaseThrows().getName(), Case.getCurrentCaseThrows().getDisplayName()));
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
logger.log(Level.WARNING, "No current case open for other occurrences", ex);
|
||||
@ -105,7 +107,7 @@ class OtherOccurrencesNodeWorker extends SwingWorker<OtherOccurrencesData, Void>
|
||||
}
|
||||
|
||||
if (!isCancelled()) {
|
||||
data = new OtherOccurrencesData(correlationAttributes, file, dataSourceName, deviceId, caseNames, totalCount, dataSources.size(), OtherOccurrenceUtilities.getEarliestCaseDate());
|
||||
data = new OtherOccurrencesData(correlationAttributes, file, dataSourceName, deviceId, caseNames, totalCount, dataSources.size(), OtherOccurrences.getEarliestCaseDate());
|
||||
}
|
||||
|
||||
return data;
|
||||
|
@ -18,6 +18,9 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.centralrepository.contentviewer;
|
||||
|
||||
import org.sleuthkit.autopsy.centralrepository.application.NodeData;
|
||||
import org.sleuthkit.autopsy.centralrepository.application.UniquePathKey;
|
||||
import org.sleuthkit.autopsy.centralrepository.application.OtherOccurrences;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
@ -68,7 +71,6 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
|
||||
private static final CorrelationCaseWrapper NO_ARTIFACTS_CASE = new CorrelationCaseWrapper(Bundle.OtherOccurrencesPanel_table_noArtifacts());
|
||||
private static final CorrelationCaseWrapper NO_RESULTS_CASE = new CorrelationCaseWrapper(Bundle.OtherOccurrencesPanel_table_noResultsFound());
|
||||
private static final CorrelationCaseWrapper LOADING_CASE = new CorrelationCaseWrapper(Bundle.OtherOccurrencesPanel_table_loadingResults());
|
||||
private static final String UUID_PLACEHOLDER_STRING = "NoCorrelationAttributeInstance";
|
||||
private static final Logger logger = Logger.getLogger(OtherOccurrencesPanel.class.getName());
|
||||
private static final long serialVersionUID = 1L;
|
||||
private final OtherOccurrencesFilesTableModel filesTableModel;
|
||||
@ -93,15 +95,6 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
|
||||
customizeComponents();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a placeholder string to use in place of case uuid when it isn't
|
||||
* available
|
||||
*
|
||||
* @return UUID_PLACEHOLDER_STRING
|
||||
*/
|
||||
static String getPlaceholderUUID() {
|
||||
return UUID_PLACEHOLDER_STRING;
|
||||
}
|
||||
|
||||
private void customizeComponents() {
|
||||
ActionListener actList = (ActionEvent e) -> {
|
||||
@ -223,21 +216,17 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
|
||||
if (-1 != selectedRowViewIdx) {
|
||||
CentralRepository dbManager = CentralRepository.getInstance();
|
||||
int selectedRowModelIdx = filesTable.convertRowIndexToModel(selectedRowViewIdx);
|
||||
List<OtherOccurrenceNodeData> rowList = filesTableModel.getListOfNodesForFile(selectedRowModelIdx);
|
||||
List<NodeData> rowList = filesTableModel.getListOfNodesForFile(selectedRowModelIdx);
|
||||
if (!rowList.isEmpty()) {
|
||||
if (rowList.get(0) instanceof OtherOccurrenceNodeInstanceData) {
|
||||
CorrelationCase eamCasePartial = ((OtherOccurrenceNodeInstanceData) rowList.get(0)).getCorrelationAttributeInstance().getCorrelationCase();
|
||||
caseDisplayName = eamCasePartial.getDisplayName();
|
||||
// query case details
|
||||
CorrelationCase eamCase = dbManager.getCaseByUUID(eamCasePartial.getCaseUUID());
|
||||
if (eamCase != null) {
|
||||
details = eamCase.getCaseDetailsOptionsPaneDialog();
|
||||
} else {
|
||||
details = Bundle.OtherOccurrencesPanel_caseDetailsDialog_noDetails();
|
||||
}
|
||||
CorrelationCase eamCasePartial = rowList.get(0).getCorrelationAttributeInstance().getCorrelationCase();
|
||||
caseDisplayName = eamCasePartial.getDisplayName();
|
||||
// query case details
|
||||
CorrelationCase eamCase = dbManager.getCaseByUUID(eamCasePartial.getCaseUUID());
|
||||
if (eamCase != null) {
|
||||
details = eamCase.getCaseDetailsOptionsPaneDialog();
|
||||
} else {
|
||||
details = Bundle.OtherOccurrencesPanel_caseDetailsDialog_notSelected();
|
||||
}
|
||||
details = Bundle.OtherOccurrencesPanel_caseDetailsDialog_noDetails();
|
||||
}
|
||||
} else {
|
||||
details = Bundle.OtherOccurrencesPanel_caseDetailsDialog_noDetailsReference();
|
||||
}
|
||||
@ -272,18 +261,8 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@NbBundle.Messages({
|
||||
"OtherOccurrencesPanel.csvHeader.case=Case",
|
||||
"OtherOccurrencesPanel.csvHeader.device=Device",
|
||||
"OtherOccurrencesPanel.csvHeader.dataSource=Data Source",
|
||||
"OtherOccurrencesPanel.csvHeader.attribute=Matched Attribute",
|
||||
"OtherOccurrencesPanel.csvHeader.value=Attribute Value",
|
||||
"OtherOccurrencesPanel.csvHeader.known=Known",
|
||||
"OtherOccurrencesPanel.csvHeader.path=Path",
|
||||
"OtherOccurrencesPanel.csvHeader.comment=Comment"
|
||||
})
|
||||
|
||||
|
||||
@NbBundle.Messages({"OtherOccurrencesPanel_earliestCaseNotAvailable=Not Availble."})
|
||||
/**
|
||||
* Reset the UI and clear cached data.
|
||||
*/
|
||||
@ -330,7 +309,8 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
|
||||
} else if (caseCount == 0) {
|
||||
casesTableModel.addCorrelationCase(NO_RESULTS_CASE);
|
||||
}
|
||||
earliestCaseDate.setText(data.getEarliestCaseDate());
|
||||
String earliestDate = data.getEarliestCaseDate();
|
||||
earliestCaseDate.setText(earliestDate.isEmpty() ? Bundle.OtherOccurrencesPanel_earliestCaseNotAvailable() : earliestDate);
|
||||
foundInLabel.setText(String.format(Bundle.OtherOccurrencesPanel_foundIn_text(), data.getTotalCount(), caseCount, data.getDataSourceCount()));
|
||||
if (caseCount > 0) {
|
||||
casesTable.setRowSelectionInterval(0, 0);
|
||||
@ -379,7 +359,8 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
|
||||
} else if (caseCount == 0) {
|
||||
casesTableModel.addCorrelationCase(NO_RESULTS_CASE);
|
||||
}
|
||||
earliestCaseDate.setText(data.getEarliestCaseDate());
|
||||
String earliestDate = data.getEarliestCaseDate();
|
||||
earliestCaseDate.setText(earliestDate.isEmpty() ? Bundle.OtherOccurrencesPanel_earliestCaseNotAvailable() : earliestDate);
|
||||
foundInLabel.setText(String.format(Bundle.OtherOccurrencesPanel_foundIn_text(), data.getInstanceDataCount(), caseCount, data.getDataSourceCount()));
|
||||
if (caseCount > 0) {
|
||||
casesTable.setRowSelectionInterval(0, 0);
|
||||
@ -410,11 +391,11 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
|
||||
logger.log(Level.WARNING, "Unable to get current case for other occurrences content viewer", ex);
|
||||
}
|
||||
for (CorrelationAttributeInstance corAttr : correlationAttributes) {
|
||||
Map<UniquePathKey, OtherOccurrenceNodeInstanceData> correlatedNodeDataMap = new HashMap<>(0);
|
||||
Map<UniquePathKey, NodeData> correlatedNodeDataMap = new HashMap<>(0);
|
||||
|
||||
// get correlation and reference set instances from DB
|
||||
correlatedNodeDataMap.putAll(OtherOccurrenceUtilities.getCorrelatedInstances(file, deviceId, dataSourceName, corAttr));
|
||||
for (OtherOccurrenceNodeInstanceData nodeData : correlatedNodeDataMap.values()) {
|
||||
correlatedNodeDataMap.putAll(OtherOccurrences.getCorrelatedInstances(file, deviceId, dataSourceName, corAttr));
|
||||
for (NodeData nodeData : correlatedNodeDataMap.values()) {
|
||||
for (int selectedRow : selectedCaseIndexes) {
|
||||
try {
|
||||
if (nodeData.isCentralRepoNode()) {
|
||||
@ -450,11 +431,11 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
|
||||
int[] selectedDataSources = dataSourcesTable.getSelectedRows();
|
||||
filesTableModel.clearTable();
|
||||
for (CorrelationAttributeInstance corAttr : correlationAttributes) {
|
||||
Map<UniquePathKey, OtherOccurrenceNodeInstanceData> correlatedNodeDataMap = new HashMap<>(0);
|
||||
Map<UniquePathKey, NodeData> correlatedNodeDataMap = new HashMap<>(0);
|
||||
|
||||
// get correlation and reference set instances from DB
|
||||
correlatedNodeDataMap.putAll(OtherOccurrenceUtilities.getCorrelatedInstances(file, deviceId, dataSourceName, corAttr));
|
||||
for (OtherOccurrenceNodeInstanceData nodeData : correlatedNodeDataMap.values()) {
|
||||
correlatedNodeDataMap.putAll(OtherOccurrences.getCorrelatedInstances(file, deviceId, dataSourceName, corAttr));
|
||||
for (NodeData nodeData : correlatedNodeDataMap.values()) {
|
||||
for (int selectedDataSourceRow : selectedDataSources) {
|
||||
try {
|
||||
if (nodeData.isCentralRepoNode()) {
|
||||
@ -585,7 +566,7 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
|
||||
|
||||
@Override
|
||||
protected Void doInBackground() throws Exception {
|
||||
OtherOccurrenceUtilities.writeOtherOccurrencesToFileAsCSV(this.destFile, this.abstractFile, this.correlationAttList, this.dataSourceName, this.deviceId);
|
||||
OtherOccurrences.writeOtherOccurrencesToFileAsCSV(this.destFile, this.abstractFile, this.correlationAttList, this.dataSourceName, this.deviceId);
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -778,9 +759,9 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
|
||||
boolean enableCentralRepoActions = false;
|
||||
if (CentralRepository.isEnabled() && filesTable.getSelectedRowCount() == 1) {
|
||||
int rowIndex = filesTable.getSelectedRow();
|
||||
List<OtherOccurrenceNodeData> selectedFile = filesTableModel.getListOfNodesForFile(rowIndex);
|
||||
if (!selectedFile.isEmpty() && selectedFile.get(0) instanceof OtherOccurrenceNodeInstanceData) {
|
||||
OtherOccurrenceNodeInstanceData instanceData = (OtherOccurrenceNodeInstanceData) selectedFile.get(0);
|
||||
List<NodeData> selectedFile = filesTableModel.getListOfNodesForFile(rowIndex);
|
||||
if (!selectedFile.isEmpty() && selectedFile.get(0) instanceof NodeData) {
|
||||
NodeData instanceData = selectedFile.get(0);
|
||||
enableCentralRepoActions = instanceData.isCentralRepoNode();
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user