mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-06 21:00:22 +00:00
Merge pull request #3997 from sleuthkit/release-4.8.0
Merge in release 4.8.0 branch
This commit is contained in:
commit
8093d9610f
@ -2,7 +2,7 @@ Manifest-Version: 1.0
|
||||
OpenIDE-Module: org.sleuthkit.autopsy.core/10
|
||||
OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/core/Bundle.properties
|
||||
OpenIDE-Module-Layer: org/sleuthkit/autopsy/core/layer.xml
|
||||
OpenIDE-Module-Implementation-Version: 23
|
||||
OpenIDE-Module-Implementation-Version: 24
|
||||
OpenIDE-Module-Requires: org.openide.windows.WindowManager
|
||||
AutoUpdate-Show-In-Client: true
|
||||
AutoUpdate-Essential-Module: true
|
||||
|
@ -17,7 +17,6 @@ file.reference.sevenzipjbinding-AllPlatforms.jar=release/modules/ext/sevenzipjbi
|
||||
file.reference.sevenzipjbinding.jar=release/modules/ext/sevenzipjbinding.jar
|
||||
file.reference.sqlite-jdbc-3.8.11.jar=release/modules/ext/sqlite-jdbc-3.8.11.jar
|
||||
file.reference.StixLib.jar=release/modules/ext/StixLib.jar
|
||||
file.reference.sleuthkit-postgresql-4.6.1.jar=release/modules/ext/sleuthkit-postgresql-4.6.1.jar
|
||||
file.reference.bcprov-jdk15on-1.54.jar=release/modules/ext/bcprov-jdk15on-1.54.jar
|
||||
file.reference.jackcess-2.1.8.jar=release/modules/ext/jackcess-2.1.8.jar
|
||||
file.reference.jackcess-encrypt-2.1.2.jar=release/modules/ext/jackcess-encrypt-2.1.2.jar
|
||||
@ -30,7 +29,7 @@ file.reference.cxf-rt-transports-http-3.0.16.jar=release/modules/ext/cxf-rt-tran
|
||||
file.reference.fontbox-2.0.8.jar=release/modules/ext/fontbox-2.0.8.jar
|
||||
file.reference.pdfbox-2.0.8.jar=release/modules/ext/pdfbox-2.0.8.jar
|
||||
file.reference.pdfbox-tools-2.0.8.jar=release/modules/ext/pdfbox-tools-2.0.8.jar
|
||||
file.reference.sleuthkit-postgresql-4.6.1.jar=release/modules/ext/sleuthkit-postgresql-4.6.1.jar
|
||||
file.reference.sleuthkit-postgresql-4.6.2.jar=release/modules/ext/sleuthkit-postgresql-4.6.2.jar
|
||||
file.reference.tika-core-1.17.jar=release/modules/ext/tika-core-1.17.jar
|
||||
file.reference.tika-parsers-1.17.jar=release/modules/ext/tika-parsers-1.17.jar
|
||||
file.reference.curator-client-2.8.0.jar=release/modules/ext/curator-client-2.8.0.jar
|
||||
@ -47,5 +46,5 @@ nbm.homepage=http://www.sleuthkit.org/
|
||||
nbm.module.author=Brian Carrier
|
||||
nbm.needs.restart=true
|
||||
source.reference.curator-recipes-2.8.0.jar=release/modules/ext/curator-recipes-2.8.0-sources.jar
|
||||
spec.version.base=10.11
|
||||
spec.version.base=10.12
|
||||
|
||||
|
@ -251,7 +251,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>3</release-version>
|
||||
<specification-version>1.1</specification-version>
|
||||
<specification-version>1.2</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
</module-dependencies>
|
||||
@ -412,8 +412,8 @@
|
||||
<binary-origin>release/modules/ext/metadata-extractor-2.10.1.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/sleuthkit-postgresql-4.6.1.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/sleuthkit-postgresql-4.6.1.jar</binary-origin>
|
||||
<runtime-relative-path>ext/sleuthkit-postgresql-4.6.2.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/sleuthkit-postgresql-4.6.2.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/tika-core-1.17.jar</runtime-relative-path>
|
||||
|
@ -21,51 +21,48 @@ package org.sleuthkit.autopsy.centralrepository;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.AbstractAction;
|
||||
import org.openide.DialogDisplayer;
|
||||
import org.openide.NotifyDescriptor;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttribute;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifactUtil;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.datamodel.AbstractFile;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
|
||||
/**
|
||||
* An AbstractAction to manage adding and modifying a Central Repository file
|
||||
* instance comment.
|
||||
*/
|
||||
@Messages({"AddEditCentralRepoCommentAction.menuItemText.addEditCentralRepoComment=Add/Edit Central Repository Comment"})
|
||||
public final class AddEditCentralRepoCommentAction extends AbstractAction {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(AddEditCentralRepoCommentAction.class.getName());
|
||||
|
||||
private boolean addToDatabase;
|
||||
private CorrelationAttribute correlationAttribute;
|
||||
String title;
|
||||
private String comment;
|
||||
|
||||
/**
|
||||
* Private constructor to create an instance given a CorrelationAttribute.
|
||||
* Constructor to create an instance given a CorrelationAttribute.
|
||||
*
|
||||
* @param correlationAttribute The correlation attribute to modify.
|
||||
* @param title The text for the menu item.
|
||||
*/
|
||||
private AddEditCentralRepoCommentAction(CorrelationAttribute correlationAttribute, String title) {
|
||||
super(title);
|
||||
this.title = title;
|
||||
public AddEditCentralRepoCommentAction(CorrelationAttribute correlationAttribute) {
|
||||
super(Bundle.AddEditCentralRepoCommentAction_menuItemText_addEditCentralRepoComment());
|
||||
this.correlationAttribute = correlationAttribute;
|
||||
}
|
||||
|
||||
/**
|
||||
* Private constructor to create an instance given an AbstractFile.
|
||||
* Constructor to create an instance given an AbstractFile.
|
||||
*
|
||||
* @param file The file from which a correlation attribute to modify is
|
||||
* derived.
|
||||
* @param title The text for the menu item.
|
||||
*/
|
||||
private AddEditCentralRepoCommentAction(AbstractFile file, String title) {
|
||||
|
||||
super(title);
|
||||
this.title = title;
|
||||
public AddEditCentralRepoCommentAction(AbstractFile file) {
|
||||
super(Bundle.AddEditCentralRepoCommentAction_menuItemText_addEditCentralRepoComment());
|
||||
correlationAttribute = EamArtifactUtil.getCorrelationAttributeFromContent(file);
|
||||
if (correlationAttribute == null) {
|
||||
addToDatabase = true;
|
||||
@ -73,26 +70,24 @@ public final class AddEditCentralRepoCommentAction extends AbstractAction {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent event) {
|
||||
addEditCentralRepoComment();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a Add/Edit dialog for the correlation attribute file instance
|
||||
* comment. The comment will be updated in the database if the file instance
|
||||
* exists there, or a new file instance will be added to the database with
|
||||
* the comment attached otherwise.
|
||||
*
|
||||
* The current comment for this instance is returned in case it is needed to
|
||||
* update the display.
|
||||
*
|
||||
* @return the current comment for this instance
|
||||
* The current comment for this instance is saved in case it is needed to
|
||||
* update the display. If the comment was not changed either due to the
|
||||
* action being canceled or the occurrence of an error, the comment will be
|
||||
* null.
|
||||
*/
|
||||
public String addEditCentralRepoComment() {
|
||||
CentralRepoCommentDialog centralRepoCommentDialog = new CentralRepoCommentDialog(correlationAttribute, title);
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent event) {
|
||||
CentralRepoCommentDialog centralRepoCommentDialog = new CentralRepoCommentDialog(correlationAttribute);
|
||||
centralRepoCommentDialog.display();
|
||||
|
||||
comment = null;
|
||||
|
||||
if (centralRepoCommentDialog.isCommentUpdated()) {
|
||||
EamDb dbManager;
|
||||
|
||||
@ -104,45 +99,35 @@ public final class AddEditCentralRepoCommentAction extends AbstractAction {
|
||||
} else {
|
||||
dbManager.updateAttributeInstanceComment(correlationAttribute);
|
||||
}
|
||||
|
||||
comment = centralRepoCommentDialog.getComment();
|
||||
} catch (EamDbException ex) {
|
||||
logger.log(Level.SEVERE, "Error adding comment", ex);
|
||||
NotifyDescriptor notifyDescriptor = new NotifyDescriptor.Message(
|
||||
"An error occurred while trying to save the comment to the central repository.",
|
||||
NotifyDescriptor.ERROR_MESSAGE);
|
||||
DialogDisplayer.getDefault().notify(notifyDescriptor);
|
||||
}
|
||||
}
|
||||
return centralRepoCommentDialog.getComment();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance labeled "Add/Edit Central Repository Comment" given an
|
||||
* AbstractFile. This is intended for the result view.
|
||||
* Retrieve the comment that was last saved. If a comment update was
|
||||
* canceled or an error occurred while attempting to save the comment, the
|
||||
* comment will be null.
|
||||
*
|
||||
* @param file The file from which a correlation attribute to modify is
|
||||
* derived.
|
||||
*
|
||||
* @return The instance.
|
||||
*
|
||||
* @throws EamDbException
|
||||
* @throws NoCurrentCaseException
|
||||
* @throws TskCoreException
|
||||
* @return The comment.
|
||||
*/
|
||||
@Messages({"AddEditCentralRepoCommentAction.menuItemText.addEditCentralRepoComment=Add/Edit Central Repository Comment"})
|
||||
public static AddEditCentralRepoCommentAction createAddEditCentralRepoCommentAction(AbstractFile file) {
|
||||
|
||||
return new AddEditCentralRepoCommentAction(file,
|
||||
Bundle.AddEditCentralRepoCommentAction_menuItemText_addEditCentralRepoComment());
|
||||
public String getComment() {
|
||||
return comment;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance labeled "Add/Edit Comment" given a
|
||||
* CorrelationAttribute. This is intended for the content view.
|
||||
* Retrieve the associated correlation attribute.
|
||||
*
|
||||
* @param correlationAttribute The correlation attribute to modify.
|
||||
*
|
||||
* @return The instance.
|
||||
* @return The correlation attribute.
|
||||
*/
|
||||
@Messages({"AddEditCentralRepoCommentAction.menuItemText.addEditComment=Add/Edit Comment"})
|
||||
public static AddEditCentralRepoCommentAction createAddEditCommentAction(CorrelationAttribute correlationAttribute) {
|
||||
|
||||
return new AddEditCentralRepoCommentAction(correlationAttribute,
|
||||
Bundle.AddEditCentralRepoCommentAction_menuItemText_addEditComment());
|
||||
public CorrelationAttribute getCorrelationAttribute() {
|
||||
return correlationAttribute;
|
||||
}
|
||||
}
|
||||
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.centralrepository;
|
||||
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.openide.windows.WindowManager;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttribute;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance;
|
||||
@ -26,6 +27,7 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeIns
|
||||
* Dialog to allow Central Repository file instance comments to be added and
|
||||
* modified.
|
||||
*/
|
||||
@Messages({"CentralRepoCommentDialog.title.addEditCentralRepoComment=Add/Edit Central Repository Comment"})
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class CentralRepoCommentDialog extends javax.swing.JDialog {
|
||||
|
||||
@ -37,10 +39,9 @@ final class CentralRepoCommentDialog extends javax.swing.JDialog {
|
||||
* Create an instance.
|
||||
*
|
||||
* @param correlationAttribute The correlation attribute to be modified.
|
||||
* @param title The title to assign the dialog.
|
||||
*/
|
||||
CentralRepoCommentDialog(CorrelationAttribute correlationAttribute, String title) {
|
||||
super(WindowManager.getDefault().getMainWindow(), title);
|
||||
CentralRepoCommentDialog(CorrelationAttribute correlationAttribute) {
|
||||
super(WindowManager.getDefault().getMainWindow(), Bundle.CentralRepoCommentDialog_title_addEditCentralRepoComment());
|
||||
|
||||
initComponents();
|
||||
|
||||
@ -82,6 +83,7 @@ final class CentralRepoCommentDialog extends javax.swing.JDialog {
|
||||
* Get the current comment.
|
||||
* If the user hit OK, this will be the new comment.
|
||||
* If the user canceled, this will be the original comment.
|
||||
*
|
||||
* @return the comment
|
||||
*/
|
||||
String getComment() {
|
||||
|
@ -38,19 +38,23 @@ public class CentralRepoContextMenuActionsProvider implements ContextMenuActions
|
||||
|
||||
@Override
|
||||
public List<Action> getActions() {
|
||||
ArrayList<Action> actions = new ArrayList<>();
|
||||
ArrayList<Action> actionsList = new ArrayList<>();
|
||||
Collection<? extends AbstractFile> selectedFiles = Utilities.actionsGlobalContext().lookupAll(AbstractFile.class);
|
||||
|
||||
if (selectedFiles.size() != 1) {
|
||||
return actions;
|
||||
return actionsList;
|
||||
}
|
||||
|
||||
for (AbstractFile file : selectedFiles) {
|
||||
if (EamDbUtil.useCentralRepo() && EamArtifactUtil.isSupportedAbstractFileType(file) && file.isFile()) {
|
||||
actions.add(AddEditCentralRepoCommentAction.createAddEditCentralRepoCommentAction(file));
|
||||
AddEditCentralRepoCommentAction action = new AddEditCentralRepoCommentAction(file);
|
||||
if (action.getCorrelationAttribute() == null) {
|
||||
action.setEnabled(false);
|
||||
}
|
||||
actionsList.add(action);
|
||||
}
|
||||
}
|
||||
|
||||
return actions;
|
||||
return actionsList;
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ DataContentViewerOtherCases.showCaseDetailsMenuItem.text=Show Case Details
|
||||
DataContentViewerOtherCases.table.toolTip.text=Click column name to sort. Right-click on the table for more options.
|
||||
DataContentViewerOtherCases.exportToCSVMenuItem.text=Export Selected Rows to CSV
|
||||
DataContentViewerOtherCases.showCommonalityMenuItem.text=Show Frequency
|
||||
DataContentViewerOtherCases.addCommentMenuItem.text=Add/Edit Comment
|
||||
DataContentViewerOtherCases.addCommentMenuItem.text=Add/Edit Central Repository Comment
|
||||
DataContentViewerOtherCases.earliestCaseDate.text=Earliest Case Date
|
||||
DataContentViewerOtherCases.earliestCaseLabel.toolTipText=
|
||||
DataContentViewerOtherCases.earliestCaseLabel.text=Central Repository Starting Date:
|
||||
|
@ -38,7 +38,6 @@ import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.logging.Level;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import java.util.stream.Collectors;
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.JMenuItem;
|
||||
import javax.swing.JOptionPane;
|
||||
@ -127,12 +126,15 @@ public class DataContentViewerOtherCases extends JPanel implements DataContentVi
|
||||
} else if (jmi.equals(addCommentMenuItem)) {
|
||||
try {
|
||||
OtherOccurrenceNodeData selectedNode = (OtherOccurrenceNodeData) tableModel.getRow(otherCasesTable.getSelectedRow());
|
||||
AddEditCentralRepoCommentAction action = AddEditCentralRepoCommentAction.createAddEditCommentAction(selectedNode.createCorrelationAttribute());
|
||||
String currentComment = action.addEditCentralRepoComment();
|
||||
selectedNode.updateComment(currentComment);
|
||||
AddEditCentralRepoCommentAction action = new AddEditCentralRepoCommentAction(selectedNode.createCorrelationAttribute());
|
||||
action.actionPerformed(null);
|
||||
String currentComment = action.getComment();
|
||||
if (currentComment != null) {
|
||||
selectedNode.updateComment(action.getComment());
|
||||
otherCasesTable.repaint();
|
||||
}
|
||||
} catch (EamDbException ex) {
|
||||
logger.log(Level.SEVERE, "Error performing Add/Edit Comment action", ex);
|
||||
logger.log(Level.SEVERE, "Error performing Add/Edit Central Repository Comment action", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -235,21 +235,37 @@ public class EamArtifactUtil {
|
||||
return null;
|
||||
}
|
||||
|
||||
CorrelationAttribute correlationAttribute = null;
|
||||
CorrelationAttribute correlationAttribute;
|
||||
CorrelationAttribute.Type type;
|
||||
CorrelationCase correlationCase;
|
||||
CorrelationDataSource correlationDataSource;
|
||||
String value;
|
||||
String filePath;
|
||||
|
||||
try {
|
||||
CorrelationAttribute.Type type = EamDb.getInstance().getCorrelationTypeById(CorrelationAttribute.FILES_TYPE_ID);
|
||||
CorrelationCase correlationCase = EamDb.getInstance().getCase(Case.getCurrentCaseThrows());
|
||||
type = EamDb.getInstance().getCorrelationTypeById(CorrelationAttribute.FILES_TYPE_ID);
|
||||
correlationCase = EamDb.getInstance().getCase(Case.getCurrentCaseThrows());
|
||||
if (null == correlationCase) {
|
||||
correlationCase = EamDb.getInstance().newCase(Case.getCurrentCaseThrows());
|
||||
}
|
||||
CorrelationDataSource correlationDataSource = CorrelationDataSource.fromTSKDataSource(correlationCase, file.getDataSource());
|
||||
String value = file.getMd5Hash();
|
||||
String filePath = (file.getParentPath() + file.getName()).toLowerCase();
|
||||
|
||||
correlationAttribute = EamDb.getInstance().getCorrelationAttribute(type, correlationCase, correlationDataSource, value, filePath);
|
||||
} catch (TskCoreException | EamDbException | NoCurrentCaseException ex) {
|
||||
correlationDataSource = CorrelationDataSource.fromTSKDataSource(correlationCase, file.getDataSource());
|
||||
value = file.getMd5Hash();
|
||||
filePath = (file.getParentPath() + file.getName()).toLowerCase();
|
||||
} catch (TskCoreException | EamDbException ex) {
|
||||
logger.log(Level.SEVERE, "Error retrieving correlation attribute.", ex);
|
||||
return null;
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
logger.log(Level.SEVERE, "Case is closed.", ex);
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
correlationAttribute = EamDb.getInstance().getCorrelationAttribute(type, correlationCase, correlationDataSource, value, filePath);
|
||||
} catch (EamDbException ex) {
|
||||
logger.log(Level.WARNING, String.format(
|
||||
"Correlation attribute could not be retrieved for '%s' (id=%d): %s",
|
||||
content.getName(), content.getId(), ex.getMessage()));
|
||||
return null;
|
||||
}
|
||||
|
||||
return correlationAttribute;
|
||||
@ -300,9 +316,12 @@ public class EamArtifactUtil {
|
||||
af.getParentPath() + af.getName());
|
||||
eamArtifact.addInstance(cei);
|
||||
return eamArtifact;
|
||||
} catch (TskCoreException | EamDbException | NoCurrentCaseException ex) {
|
||||
} catch (TskCoreException | EamDbException ex) {
|
||||
logger.log(Level.SEVERE, "Error making correlation attribute.", ex);
|
||||
return null;
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
logger.log(Level.SEVERE, "Case is closed.", ex);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -77,7 +77,7 @@ public class FileInstanceNode extends FileNode {
|
||||
|
||||
sheetSet.put(new NodeProperty<>(Bundle.CommonFilesSearchResultsViewerTable_filesColLbl(), Bundle.CommonFilesSearchResultsViewerTable_filesColLbl(), NO_DESCR, this.getContent().getName()));
|
||||
sheetSet.put(new NodeProperty<>(Bundle.CommonFilesSearchResultsViewerTable_pathColLbl(), Bundle.CommonFilesSearchResultsViewerTable_pathColLbl(), NO_DESCR, this.getContent().getParentPath()));
|
||||
sheetSet.put(new NodeProperty<>(Bundle.CommonFilesSearchResultsViewerTable_hashsetHitsColLbl(), Bundle.CommonFilesSearchResultsViewerTable_hashsetHitsColLbl(), NO_DESCR, getHashSetHitsForFile(this.getContent())));
|
||||
sheetSet.put(new NodeProperty<>(Bundle.CommonFilesSearchResultsViewerTable_hashsetHitsColLbl(), Bundle.CommonFilesSearchResultsViewerTable_hashsetHitsColLbl(), NO_DESCR, getHashSetHitsCsvList(this.getContent())));
|
||||
sheetSet.put(new NodeProperty<>(Bundle.CommonFilesSearchResultsViewerTable_dataSourceColLbl(), Bundle.CommonFilesSearchResultsViewerTable_dataSourceColLbl(), NO_DESCR, this.getDataSource()));
|
||||
sheetSet.put(new NodeProperty<>(Bundle.CommonFilesSearchResultsViewerTable_mimeTypeColLbl(), Bundle.CommonFilesSearchResultsViewerTable_mimeTypeColLbl(), NO_DESCR, StringUtils.defaultString(this.getContent().getMIMEType())));
|
||||
|
||||
|
@ -26,7 +26,7 @@ import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import javax.swing.JTabbedPane;
|
||||
import javax.swing.SwingWorker;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
import javax.swing.event.ChangeListener;
|
||||
import org.openide.explorer.ExplorerManager;
|
||||
@ -579,29 +579,6 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Worker for RootNodeListener childrenAdded.
|
||||
*/
|
||||
class SetupTabsChildrenWorker extends SwingWorker<Void, Void> {
|
||||
|
||||
private final Node childNode;
|
||||
|
||||
SetupTabsChildrenWorker(Node aChildNode) {
|
||||
childNode = aChildNode;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Void doInBackground() throws Exception {
|
||||
setupTabs(childNode);
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void done() {
|
||||
setupTabs(childNode);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Responds to changes in the root node due to asynchronous child node
|
||||
* creation.
|
||||
@ -628,8 +605,13 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
|
||||
*/
|
||||
if (waitingForData && containsReal(delta)) {
|
||||
waitingForData = false;
|
||||
Node childNode = nme.getNode();
|
||||
new SetupTabsChildrenWorker(childNode).execute();
|
||||
if (SwingUtilities.isEventDispatchThread()) {
|
||||
setupTabs(nme.getNode());
|
||||
} else {
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
setupTabs(nme.getNode());
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -208,6 +208,11 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
||||
@Override
|
||||
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
||||
public void setNode(Node rootNode) {
|
||||
if (! SwingUtilities.isEventDispatchThread()) {
|
||||
LOGGER.log(Level.SEVERE, "Attempting to run setNode() from non-EDT thread");
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* The quick filter must be reset because when determining column width,
|
||||
* ETable.getRowCount is called, and the documentation states that quick
|
||||
|
@ -251,7 +251,7 @@ public abstract class AbstractAbstractFileNode<T extends AbstractFile> extends A
|
||||
map.put(TYPE_DIR.toString(), content.getDirType().getLabel());
|
||||
map.put(TYPE_META.toString(), content.getMetaType().toString());
|
||||
map.put(KNOWN.toString(), content.getKnown().getName());
|
||||
map.put(HASHSETS.toString(), getHashSetHitsForFile(content));
|
||||
map.put(HASHSETS.toString(), getHashSetHitsCsvList(content));
|
||||
map.put(MD5HASH.toString(), StringUtils.defaultString(content.getMd5Hash()));
|
||||
map.put(ObjectID.toString(), content.getId());
|
||||
map.put(MIMETYPE.toString(), StringUtils.defaultString(content.getMIMEType()));
|
||||
@ -301,7 +301,15 @@ public abstract class AbstractAbstractFileNode<T extends AbstractFile> extends A
|
||||
}
|
||||
}
|
||||
|
||||
public static String getHashSetHitsForFile(AbstractFile file) {
|
||||
/**
|
||||
* Gets a comma-separated values list of the names of the hash sets
|
||||
* currently identified as including a given file.
|
||||
*
|
||||
* @param file The file.
|
||||
*
|
||||
* @return The CSV list of hash set names.
|
||||
*/
|
||||
protected static String getHashSetHitsCsvList(AbstractFile file) {
|
||||
try {
|
||||
return StringUtils.join(file.getHashSetNames(), ", ");
|
||||
} catch (TskCoreException tskCoreException) {
|
||||
|
@ -41,9 +41,9 @@ import org.sleuthkit.datamodel.TskCoreException;
|
||||
* Child factory to create the top level children of the autopsy tree
|
||||
*
|
||||
*/
|
||||
public class AutopsyTreeChildrenFactory extends ChildFactory.Detachable<Object> {
|
||||
public final class AutopsyTreeChildFactory extends ChildFactory.Detachable<Object> {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(AutopsyTreeChildrenFactory.class.getName());
|
||||
private static final Logger logger = Logger.getLogger(AutopsyTreeChildFactory.class.getName());
|
||||
|
||||
/**
|
||||
* Listener for handling DATA_SOURCE_ADDED events.
|
@ -80,7 +80,7 @@ import org.sleuthkit.autopsy.datamodel.FileTypesByMimeType;
|
||||
import org.sleuthkit.autopsy.datamodel.InterestingHits;
|
||||
import org.sleuthkit.autopsy.datamodel.KeywordHits;
|
||||
import org.sleuthkit.autopsy.datamodel.ResultsNode;
|
||||
import org.sleuthkit.autopsy.datamodel.AutopsyTreeChildrenFactory;
|
||||
import org.sleuthkit.autopsy.datamodel.AutopsyTreeChildFactory;
|
||||
import org.sleuthkit.autopsy.datamodel.ViewsNode;
|
||||
import org.sleuthkit.autopsy.datamodel.accounts.Accounts;
|
||||
import org.sleuthkit.autopsy.datamodel.accounts.BINRange;
|
||||
@ -108,7 +108,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat
|
||||
private final LinkedList<String[]> forwardList;
|
||||
private static final String PREFERRED_ID = "DirectoryTreeTopComponent"; //NON-NLS
|
||||
private static final Logger LOGGER = Logger.getLogger(DirectoryTreeTopComponent.class.getName());
|
||||
private AutopsyTreeChildrenFactory autopsyTreeChildrenFactory;
|
||||
private AutopsyTreeChildFactory autopsyTreeChildFactory;
|
||||
private Children autopsyTreeChildren;
|
||||
private static final long DEFAULT_DATASOURCE_GROUPING_THRESHOLD = 5; // Threshold for prompting the user about grouping by data source
|
||||
private static final String GROUPING_THRESHOLD_NAME = "GroupDataSourceThreshold";
|
||||
@ -476,8 +476,8 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat
|
||||
}
|
||||
|
||||
// if there's at least one image, load the image and open the top componen
|
||||
autopsyTreeChildrenFactory = new AutopsyTreeChildrenFactory();
|
||||
autopsyTreeChildren = Children.create(autopsyTreeChildrenFactory, true);
|
||||
autopsyTreeChildFactory = new AutopsyTreeChildFactory();
|
||||
autopsyTreeChildren = Children.create(autopsyTreeChildFactory, true);
|
||||
Node root = new AbstractNode(autopsyTreeChildren) {
|
||||
//JIRA-2807: What is the point of these overrides?
|
||||
/**
|
||||
@ -735,9 +735,11 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat
|
||||
* responsible for opening core windows. Consider moving
|
||||
* this elsewhere.
|
||||
*/
|
||||
if (!this.isOpened()) {
|
||||
SwingUtilities.invokeLater(CoreComponentControl::openCoreWindows);
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
if (! DirectoryTreeTopComponent.this.isOpened()) {
|
||||
CoreComponentControl.openCoreWindows();
|
||||
}
|
||||
});
|
||||
} catch (NoCurrentCaseException notUsed) {
|
||||
/**
|
||||
* Case is closed, do nothing.
|
||||
@ -907,7 +909,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat
|
||||
}
|
||||
|
||||
// refresh all children of the root.
|
||||
autopsyTreeChildrenFactory.refreshChildren();
|
||||
autopsyTreeChildFactory.refreshChildren();
|
||||
|
||||
// Select the first node and reset the selection history
|
||||
// This should happen on the EDT once the tree has been rebuilt.
|
||||
|
@ -134,7 +134,7 @@ class ImageWriter implements PropertyChangeListener{
|
||||
|
||||
@Messages({
|
||||
"# {0} - data source name",
|
||||
"ImageWriter.progressBar.message=Finishing acquisition of {0}"
|
||||
"ImageWriter.progressBar.message=Finishing acquisition of {0} (unplug device to cancel)"
|
||||
})
|
||||
private void startFinishImage(String dataSourceName){
|
||||
|
||||
|
@ -97,6 +97,9 @@
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ReportVisualPanel2.allResultsRadioButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="allResultsRadioButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="dataLabel">
|
||||
<Properties>
|
||||
|
@ -124,7 +124,9 @@ final class ReportVisualPanel2 extends JPanel {
|
||||
tagsList.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mousePressed(MouseEvent evt) {
|
||||
|
||||
if (!taggedResultsRadioButton.isSelected()) {
|
||||
return;
|
||||
}
|
||||
int index = tagsList.locationToIndex(evt.getPoint());
|
||||
if (index < tagsModel.getSize() && index >= 0) {
|
||||
String value = tagsModel.getElementAt(index);
|
||||
@ -184,16 +186,26 @@ final class ReportVisualPanel2 extends JPanel {
|
||||
return tagStates;
|
||||
}
|
||||
|
||||
/**
|
||||
* Are any tags selected?
|
||||
*
|
||||
* @return True if any tags are selected; otherwise false.
|
||||
*/
|
||||
private boolean areTagsSelected() {
|
||||
boolean result = false;
|
||||
for (Entry<String, Boolean> entry : tagStates.entrySet()) {
|
||||
if (entry.getValue()) {
|
||||
result = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the Finish button as either enabled or disabled depending on the UI
|
||||
* component selections.
|
||||
*/
|
||||
private void updateFinishButton() {
|
||||
if (taggedResultsRadioButton.isSelected()) {
|
||||
wizPanel.setFinish(areTagsSelected());
|
||||
@ -209,6 +221,19 @@ final class ReportVisualPanel2 extends JPanel {
|
||||
return taggedResultsRadioButton.isSelected();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set all tagged results as either selected or unselected.
|
||||
*
|
||||
* @param selected Should all tagged results be selected?
|
||||
*/
|
||||
void setAllTaggedResultsSelected(boolean selected) {
|
||||
for (String tag : tags) {
|
||||
tagStates.put(tag, (selected ? Boolean.TRUE : Boolean.FALSE));
|
||||
}
|
||||
tagsList.repaint();
|
||||
wizPanel.setFinish(selected);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
@ -234,6 +259,11 @@ final class ReportVisualPanel2 extends JPanel {
|
||||
|
||||
optionsButtonGroup.add(allResultsRadioButton);
|
||||
org.openide.awt.Mnemonics.setLocalizedText(allResultsRadioButton, org.openide.util.NbBundle.getMessage(ReportVisualPanel2.class, "ReportVisualPanel2.allResultsRadioButton.text")); // NOI18N
|
||||
allResultsRadioButton.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
allResultsRadioButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(dataLabel, org.openide.util.NbBundle.getMessage(ReportVisualPanel2.class, "ReportVisualPanel2.dataLabel.text")); // NOI18N
|
||||
|
||||
@ -312,25 +342,21 @@ final class ReportVisualPanel2 extends JPanel {
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void selectAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectAllButtonActionPerformed
|
||||
for (String tag : tags) {
|
||||
tagStates.put(tag, Boolean.TRUE);
|
||||
}
|
||||
tagsList.repaint();
|
||||
wizPanel.setFinish(true);
|
||||
setAllTaggedResultsSelected(true);
|
||||
}//GEN-LAST:event_selectAllButtonActionPerformed
|
||||
|
||||
private void deselectAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deselectAllButtonActionPerformed
|
||||
for (String tag : tags) {
|
||||
tagStates.put(tag, Boolean.FALSE);
|
||||
}
|
||||
tagsList.repaint();
|
||||
wizPanel.setFinish(false);
|
||||
setAllTaggedResultsSelected(false);
|
||||
}//GEN-LAST:event_deselectAllButtonActionPerformed
|
||||
|
||||
private void advancedButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_advancedButtonActionPerformed
|
||||
artifactStates = dialog.display();
|
||||
}//GEN-LAST:event_advancedButtonActionPerformed
|
||||
|
||||
private void allResultsRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_allResultsRadioButtonActionPerformed
|
||||
setAllTaggedResultsSelected(false);
|
||||
}//GEN-LAST:event_allResultsRadioButtonActionPerformed
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton advancedButton;
|
||||
private javax.swing.JRadioButton allResultsRadioButton;
|
||||
|
@ -1,8 +1,8 @@
|
||||
Manifest-Version: 1.0
|
||||
OpenIDE-Module: org.sleuthkit.autopsy.corelibs/3
|
||||
OpenIDE-Module-Implementation-Version: 4
|
||||
OpenIDE-Module-Implementation-Version: 5
|
||||
OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/corelibs/Bundle.properties
|
||||
OpenIDE-Module-Specification-Version: 1.1
|
||||
OpenIDE-Module-Specification-Version: 1.2
|
||||
AutoUpdate-Show-In-Client: true
|
||||
AutoUpdate-Essential-Module: true
|
||||
|
||||
|
@ -135,7 +135,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>10</release-version>
|
||||
<specification-version>10.11</specification-version>
|
||||
<specification-version>10.12</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@ -144,7 +144,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>3</release-version>
|
||||
<specification-version>1.1</specification-version>
|
||||
<specification-version>1.2</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
|
@ -19,14 +19,11 @@
|
||||
package org.sleuthkit.autopsy.experimental.objectdetection;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Level;
|
||||
import org.apache.commons.io.FilenameUtils;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.opencv.core.CvException;
|
||||
import org.opencv.core.Mat;
|
||||
import org.opencv.core.MatOfByte;
|
||||
@ -52,7 +49,6 @@ import org.sleuthkit.datamodel.AbstractFile;
|
||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||
import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_OBJECT_DETECTED;
|
||||
import org.sleuthkit.datamodel.BlackboardAttribute;
|
||||
import org.sleuthkit.datamodel.ReadContentInputStream;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
|
||||
/**
|
||||
@ -61,6 +57,7 @@ import org.sleuthkit.datamodel.TskCoreException;
|
||||
public class ObjectDetectectionFileIngestModule extends FileIngestModuleAdapter {
|
||||
|
||||
private final static Logger logger = Logger.getLogger(ObjectDetectectionFileIngestModule.class.getName());
|
||||
private final static int MAX_FILE_SIZE = 100000000; //Max size of pictures to perform object detection on
|
||||
private static final IngestModuleReferenceCounter refCounter = new IngestModuleReferenceCounter();
|
||||
private long jobId;
|
||||
private Map<String, CascadeClassifier> classifiers;
|
||||
@ -101,14 +98,23 @@ public class ObjectDetectectionFileIngestModule extends FileIngestModuleAdapter
|
||||
public ProcessResult process(AbstractFile file) {
|
||||
if (!classifiers.isEmpty() && ImageUtils.isImageThumbnailSupported(file)) {
|
||||
//Any image we can create a thumbnail for is one we should apply the classifiers to
|
||||
InputStream inputStream = new ReadContentInputStream(file);
|
||||
byte[] imageInMemory;
|
||||
|
||||
if (file.getSize() > MAX_FILE_SIZE) {
|
||||
//prevent it from allocating gigabytes of memory for extremely large files
|
||||
logger.log(Level.INFO, "Encountered file " + file.getParentPath() + file.getName() + " with object id of "
|
||||
+ file.getId() + " which exceeds max file size of " + MAX_FILE_SIZE + " bytes, with a size of " + file.getSize());
|
||||
return IngestModule.ProcessResult.OK;
|
||||
}
|
||||
|
||||
byte[] imageInMemory = new byte[(int) file.getSize()];
|
||||
|
||||
try {
|
||||
imageInMemory = IOUtils.toByteArray(inputStream);
|
||||
} catch (IOException ex) {
|
||||
file.read(imageInMemory, 0, file.getSize());
|
||||
} catch (TskCoreException ex) {
|
||||
logger.log(Level.WARNING, "Unable to read image to byte array for performing object detection on " + file.getParentPath() + file.getName() + " with object id of " + file.getId(), ex);
|
||||
return IngestModule.ProcessResult.ERROR;
|
||||
}
|
||||
|
||||
Mat originalImage;
|
||||
try {
|
||||
originalImage = Highgui.imdecode(new MatOfByte(imageInMemory), Highgui.IMREAD_GRAYSCALE);
|
||||
@ -121,7 +127,6 @@ public class ObjectDetectectionFileIngestModule extends FileIngestModuleAdapter
|
||||
logger.log(Level.SEVERE, "Unexpected Exception encountered attempting to use OpenCV to decode picture: " + file.getParentPath() + file.getName() + " with object id of " + file.getId(), unexpectedException);
|
||||
return IngestModule.ProcessResult.ERROR;
|
||||
}
|
||||
|
||||
MatOfRect detectionRectangles = new MatOfRect(); //the rectangles which reprent the coordinates on the image for where objects were detected
|
||||
for (String classifierKey : classifiers.keySet()) {
|
||||
//apply each classifier to the file
|
||||
@ -132,7 +137,7 @@ public class ObjectDetectectionFileIngestModule extends FileIngestModuleAdapter
|
||||
continue;
|
||||
} catch (Exception unexpectedException) {
|
||||
//hopefully an unnecessary generic exception catch but currently present to catch any exceptions OpenCv throws which may not be documented
|
||||
logger.log(Level.SEVERE, "Unexpected Exception encountered for image " + file.getParentPath() + file.getName() + " with object id of " + file.getId() +" while trying to apply classifier " + classifierKey, unexpectedException);
|
||||
logger.log(Level.SEVERE, "Unexpected Exception encountered for image " + file.getParentPath() + file.getName() + " with object id of " + file.getId() + " while trying to apply classifier " + classifierKey, unexpectedException);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -163,10 +168,14 @@ public class ObjectDetectectionFileIngestModule extends FileIngestModuleAdapter
|
||||
|
||||
} catch (TskCoreException ex) {
|
||||
logger.log(Level.SEVERE, String.format("Failed to create blackboard artifact for '%s'.", file.getParentPath() + file.getName()), ex); //NON-NLS
|
||||
detectionRectangles.release();
|
||||
originalImage.release();
|
||||
return IngestModule.ProcessResult.ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
detectionRectangles.release();
|
||||
originalImage.release();
|
||||
}
|
||||
|
||||
return IngestModule.ProcessResult.OK;
|
||||
|
@ -127,7 +127,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>10</release-version>
|
||||
<specification-version>10.11</specification-version>
|
||||
<specification-version>10.12</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@ -136,7 +136,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>3</release-version>
|
||||
<specification-version>1.1</specification-version>
|
||||
<specification-version>1.2</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
</module-dependencies>
|
||||
|
@ -1,7 +1,7 @@
|
||||
Manifest-Version: 1.0
|
||||
AutoUpdate-Show-In-Client: true
|
||||
OpenIDE-Module: org.sleuthkit.autopsy.keywordsearch/6
|
||||
OpenIDE-Module-Implementation-Version: 19
|
||||
OpenIDE-Module-Implementation-Version: 20
|
||||
OpenIDE-Module-Install: org/sleuthkit/autopsy/keywordsearch/Installer.class
|
||||
OpenIDE-Module-Layer: org/sleuthkit/autopsy/keywordsearch/layer.xml
|
||||
OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/keywordsearch/Bundle.properties
|
||||
|
@ -119,7 +119,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>10</release-version>
|
||||
<specification-version>10.11</specification-version>
|
||||
<specification-version>10.12</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@ -128,7 +128,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>3</release-version>
|
||||
<specification-version>1.1</specification-version>
|
||||
<specification-version>1.2</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
</module-dependencies>
|
||||
|
@ -1,6 +1,6 @@
|
||||
Manifest-Version: 1.0
|
||||
OpenIDE-Module: org.sleuthkit.autopsy.recentactivity/6
|
||||
OpenIDE-Module-Implementation-Version: 15
|
||||
OpenIDE-Module-Implementation-Version: 16
|
||||
OpenIDE-Module-Layer: org/sleuthkit/autopsy/recentactivity/layer.xml
|
||||
OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/recentactivity/Bundle.properties
|
||||
OpenIDE-Module-Requires:
|
||||
|
@ -60,7 +60,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>10</release-version>
|
||||
<specification-version>10.11</specification-version>
|
||||
<specification-version>10.12</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
</module-dependencies>
|
||||
|
@ -1,3 +1,3 @@
|
||||
<project name="TSK_VERSION">
|
||||
<property name="TSK_VERSION" value="4.6.1"/>
|
||||
<property name="TSK_VERSION" value="4.6.2"/>
|
||||
</project>
|
||||
|
@ -36,7 +36,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>10</release-version>
|
||||
<specification-version>10.11</specification-version>
|
||||
<specification-version>10.12</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
# Verifies programs are installed and copies native code into the Autopsy folder structure
|
||||
|
||||
TSK_VERSION=4.6.1
|
||||
TSK_VERSION=4.6.2
|
||||
|
||||
# Verify PhotoRec was installed
|
||||
photorec_filepath=/usr/bin/photorec
|
||||
|
Loading…
x
Reference in New Issue
Block a user