Merge branch 'master' of github.com:sleuthkit/autopsy

This commit is contained in:
Brian Carrier 2013-09-24 12:31:45 -04:00
commit 4943f8242e
13 changed files with 622 additions and 463 deletions

View File

@ -101,7 +101,7 @@ class AddImageWizardAddingProgressPanel implements WizardDescriptor.Panel<Wizard
*/
void setStateStarted() {
component.getProgressBar().setIndeterminate(true);
component.setProgressBarTextAndColor("*This process take some time for large data sources.", 0, Color.black);
component.setProgressBarTextAndColor("*This process may take some time for large data sources.", 0, Color.black);
}
/**

View File

@ -62,6 +62,9 @@ class OpenRecentCasePanel extends javax.swing.JPanel {
// If there are any images, let's select the first one
if (imagesTable.getRowCount() > 0) {
imagesTable.setRowSelectionInterval(0, 0);
openButton.setEnabled(true);
} else {
openButton.setEnabled(false);
}
}

View File

@ -49,7 +49,7 @@ import org.sleuthkit.datamodel.TskException;
public class DataContentViewerArtifact extends javax.swing.JPanel implements DataContentViewer{
private final static Logger logger = Logger.getLogger(DataContentViewerArtifact.class.getName());
private final static String WAIT_TEXT = "Preparing display, please wait...";
private final static String WAIT_TEXT = "Retrieving and preparing data, please wait...";
private final static String ERROR_TEXT = "Error retrieving result";
private Node currentNode; // @@@ Remove this when the redundant setNode() calls problem is fixed.
private int currentPage = 1;

View File

@ -26,10 +26,15 @@ import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.openide.explorer.ExplorerManager;
import org.openide.nodes.Node;
import org.openide.nodes.NodeEvent;
import org.openide.nodes.NodeListener;
import org.openide.nodes.NodeMemberEvent;
import org.openide.nodes.NodeReorderEvent;
import org.openide.util.Lookup;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataContent;
@ -59,6 +64,7 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
private DataContent customContentViewer;
private boolean isMain;
private String title;
private final DummyNodeListener dummyNodeListener = new DummyNodeListener();
private static final Logger logger = Logger.getLogger(DataResultPanel.class.getName() );
private boolean listeningToTabbedPane = false;
@ -340,6 +346,9 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
@Override
public void setNode(Node selectedNode) {
if (this.rootNode != null) {
this.rootNode.removeNodeListener(dummyNodeListener);
}
// Deferring becoming a listener to the tabbed pane until this point
// eliminates handling a superfluous stateChanged event during construction.
if (listeningToTabbedPane == false) {
@ -348,8 +357,14 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
}
this.rootNode = selectedNode;
if (this.rootNode != null) {
this.rootNode.addNodeListener(dummyNodeListener);
}
setupTabs(selectedNode);
if (selectedNode != null) {
int childrenCount = selectedNode.getChildren().getNodesCount(true);
int childrenCount = selectedNode.getChildren().getNodesCount();
this.numberMatchLabel.setText(Integer.toString(childrenCount));
}
this.numberMatchLabel.setVisible(true);
@ -357,6 +372,18 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
resetTabs(selectedNode);
// set the display on the current active tab
int currentActiveTab = this.dataResultTabbedPanel.getSelectedIndex();
if (currentActiveTab != -1) {
UpdateWrapper drv = viewers.get(currentActiveTab);
drv.setNode(selectedNode);
}
}
private void setupTabs(final Node selectedNode) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//update/disable tabs based on if supported for this node
int drvC = 0;
for (UpdateWrapper drv : viewers) {
@ -371,7 +398,7 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
// if the current tab is no longer enabled, then find one that is
boolean hasViewerEnabled = true;
int currentActiveTab = this.dataResultTabbedPanel.getSelectedIndex();
int currentActiveTab = dataResultTabbedPanel.getSelectedIndex();
if ((currentActiveTab == -1) || (dataResultTabbedPanel.isEnabledAt(currentActiveTab) == false)) {
hasViewerEnabled = false;
for (int i = 0; i < dataResultTabbedPanel.getTabCount(); i++) {
@ -391,6 +418,9 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
viewers.get(currentActiveTab).setNode(selectedNode);
}
}
});
}
@Override
public void setTitle(String title) {
@ -579,4 +609,34 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
public void setNumMatches(int numMatches) {
this.numberMatchLabel.setText(Integer.toString(numMatches));
}
private class DummyNodeListener implements NodeListener {
private static final String DUMMY_NODE_DISPLAY_NAME = "Please Wait...";
@Override
public void childrenAdded(final NodeMemberEvent nme) {
Node added = nme.getNode();
if (added.getDisplayName().equals(DUMMY_NODE_DISPLAY_NAME)) {
// don't set up tabs if the new node is a waiting node
return;
}
setupTabs(nme.getNode());
}
@Override
public void childrenRemoved(NodeMemberEvent nme) {
}
@Override
public void childrenReordered(NodeReorderEvent nre) {
}
@Override
public void nodeDestroyed(NodeEvent ne) {
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
}
}
}

View File

@ -22,14 +22,17 @@ import java.awt.Cursor;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.dnd.DnDConstants;
import java.beans.PropertyChangeEvent;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import org.sleuthkit.autopsy.coreutils.Logger;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import org.netbeans.swing.outline.DefaultOutlineModel;
import org.openide.explorer.ExplorerManager;
import org.openide.explorer.view.OutlineView;
@ -38,6 +41,10 @@ import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.openide.nodes.Node.Property;
import org.openide.nodes.Node.PropertySet;
import org.openide.nodes.NodeEvent;
import org.openide.nodes.NodeListener;
import org.openide.nodes.NodeMemberEvent;
import org.openide.nodes.NodeReorderEvent;
import org.openide.nodes.Sheet;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer;
@ -53,6 +60,7 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
private String firstColumnLabel = "Name";
private Set<Property> propertiesAcc = new LinkedHashSet<>();
private static final Logger logger = Logger.getLogger(DataResultViewerTable.class.getName());
private final DummyNodeListener dummyNodeListener = new DummyNodeListener();
/**
* Creates a DataResultViewerTable object that is compatible with node
@ -241,11 +249,38 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
hasChildren = selectedNode.getChildren().getNodesCount() > 0;
}
Node oldNode = this.em.getRootContext();
if (oldNode != null) {
oldNode.removeNodeListener(dummyNodeListener);
}
// if there's no selection node, do nothing
if (hasChildren) {
Node root = selectedNode;
root.addNodeListener(dummyNodeListener);
setupTable(root);
} else {
final OutlineView ov = ((OutlineView) this.tableScrollPanel);
Node emptyNode = new AbstractNode(Children.LEAF);
em.setRootContext(emptyNode); // make empty node
ov.getOutline().setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
ov.setPropertyColumns(); // set the empty property header
}
} finally {
this.setCursor(null);
}
}
/**
* Create Column Headers based on the Content represented by the Nodes in
* the table.
*
* @param root The parent Node of the ContentNodes
*/
private void setupTable(final Node root) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//wrap to filter out children
//note: this breaks the tree view mode in this generic viewer,
//so wrap nodes earlier if want 1 level view
@ -256,11 +291,11 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
em.setRootContext(root);
final OutlineView ov = ((OutlineView) this.tableScrollPanel);
final OutlineView ov = ((OutlineView) DataResultViewerTable.this.tableScrollPanel);
propertiesAcc.clear();
this.getAllChildPropertyHeadersRec(selectedNode, 100);
DataResultViewerTable.this.getAllChildPropertyHeadersRec(root, 100);
List<Node.Property> props = new ArrayList<Node.Property>(propertiesAcc);
if (props.size() > 0) {
Node.Property prop = props.remove(0);
@ -310,7 +345,7 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
// get first 100 rows values for the table
Object[][] content = null;
content = getRowValues(selectedNode, 100);
content = getRowValues(root, 100);
if (content != null) {
@ -336,17 +371,8 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
// turn on the auto resize
ov.getOutline().setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
}
} else {
final OutlineView ov = ((OutlineView) this.tableScrollPanel);
Node emptyNode = new AbstractNode(Children.LEAF);
em.setRootContext(emptyNode); // make empty node
ov.getOutline().setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
ov.setPropertyColumns(); // set the empty property header
}
} finally {
this.setCursor(null);
}
});
}
private static Object[][] getRowValues(Node node, int rows) {
@ -449,4 +475,36 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
super.clearComponent();
}
private class DummyNodeListener implements NodeListener {
private static final String DUMMY_NODE_DISPLAY_NAME = "Please Wait...";
@Override
public void childrenAdded(NodeMemberEvent nme) {
Node added = nme.getNode();
if (added.getDisplayName().equals(DUMMY_NODE_DISPLAY_NAME)) {
// If it's the dummy waiting node, we don't want
// to reload the table headers
return;
}
setupTable(added);
}
@Override
public void childrenRemoved(NodeMemberEvent nme) {
}
@Override
public void childrenReordered(NodeReorderEvent nre) {
}
@Override
public void nodeDestroyed(NodeEvent ne) {
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
}
}
}

View File

@ -343,15 +343,6 @@ public class FXVideoPanel extends MediaViewVideoPanel {
private static final String STOP_TEXT = "X";
/** CSS-formatted skin for pauseButton when showing PLAY_TEXT. **/
private static final String PLAY_STYLE = "-fx-text-fill: green;";
/** CSS-formatted skin for pauseButton when showing PAUSE_TEXT. **/
private static final String PAUSE_STYLE = "-fx-font-weight: bolder;";
/** CSS-formatted skin for stopButton. **/
private static final String STOP_STYLE = "-fx-text-fill: red; -fx-font-weight: bold;";
public MediaPane() {
// Video Display
mediaViewPane = new HBox();
@ -368,9 +359,7 @@ public class FXVideoPanel extends MediaViewVideoPanel {
mediaTools.setPadding(new Insets(5, 10, 5, 10));
pauseButton = new Button(PLAY_TEXT);
pauseButton.setStyle(PLAY_STYLE);
stopButton = new Button(STOP_TEXT);
stopButton.setStyle(STOP_STYLE);
mediaTools.getChildren().add(pauseButton);
mediaTools.getChildren().add(new Label(" "));
mediaTools.getChildren().add(stopButton);
@ -670,7 +659,6 @@ public class FXVideoPanel extends MediaViewVideoPanel {
@Override
public void run() {
pauseButton.setText(PLAY_TEXT);
pauseButton.setStyle(PLAY_STYLE);
}
}
@ -681,7 +669,6 @@ public class FXVideoPanel extends MediaViewVideoPanel {
@Override
public void run() {
pauseButton.setText(PAUSE_TEXT);
pauseButton.setStyle(PAUSE_STYLE);
}
}
}

View File

@ -46,7 +46,7 @@ import org.sleuthkit.datamodel.VirtualDirectory;
public final class ContentUtils {
private final static Logger logger = Logger.getLogger(ContentUtils.class.getName());
private static final SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static final SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
private static final SimpleDateFormat dateFormatterISO8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
// don't instantiate
@ -105,6 +105,10 @@ public final class ContentUtils {
public static TimeZone getTimeZone(Content c) {
try {
if (false) {
return TimeZone.getTimeZone("GMT");
}
else {
final Image image = c.getImage();
if (image != null) {
return TimeZone.getTimeZone(image.getTimeZone());
@ -112,6 +116,7 @@ public final class ContentUtils {
//case such as top level VirtualDirectory
return TimeZone.getDefault();
}
}
} catch (TskException ex) {
return TimeZone.getDefault();
}

View File

@ -22,6 +22,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.ChildFactory;
import org.openide.nodes.Children;
@ -214,6 +216,8 @@ public class DeletedContent implements AutopsyVisitableItem {
private DeletedContent.DeletedContentFilter filter;
private final Logger logger = Logger.getLogger(DeletedContentChildren.class.getName());
private static final int MAX_OBJECTS = 2001;
DeletedContentChildren(DeletedContent.DeletedContentFilter filter, SleuthkitCase skCase) {
this.skCase = skCase;
this.filter = filter;
@ -221,7 +225,20 @@ public class DeletedContent implements AutopsyVisitableItem {
@Override
protected boolean createKeys(List<AbstractFile> list) {
list.addAll(runFsQuery());
List<AbstractFile> queryList = runFsQuery();
if (queryList.size() == MAX_OBJECTS) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(null, "There are more Deleted Files than can be displayed. Only the first "
+ (MAX_OBJECTS - 1)
+ " Deleted Files will be shown.");
}
});
}
queryList.remove(queryList.size() - 1);
list.addAll(queryList);
return true;
}
@ -258,6 +275,7 @@ public class DeletedContent implements AutopsyVisitableItem {
}
query += " LIMIT " + MAX_OBJECTS;
return query;
}

View File

@ -58,7 +58,6 @@ class FileTypeChildren extends ChildFactory<Content> {
return true;
}
private String createQuery(){
String query = "(dir_type = " + TskData.TSK_FS_NAME_TYPE_ENUM.REG.getValue() + ")"
+ " AND (known IS NULL OR known != " + TskData.FileKnown.KNOWN.getFileKnownValue() + ") AND (0";
@ -66,7 +65,7 @@ class FileTypeChildren extends ChildFactory<Content> {
query += " OR name LIKE '%" + s + "'";
}
query += ')';
//query += " LIMIT " + MAX_OBJECTS;
// query += " LIMIT " + MAX_OBJECTS;
return query;
}
@ -74,10 +73,7 @@ class FileTypeChildren extends ChildFactory<Content> {
private List<AbstractFile> runQuery(){
List<AbstractFile> list = new ArrayList<>();
try {
List<AbstractFile> res = skCase.findAllFilesWhere(createQuery());
for(AbstractFile c : res){
list.add(c);
}
list = skCase.findAllFilesWhere(createQuery());
} catch (TskCoreException ex) {
logger.log(Level.SEVERE, "Couldn't get search results", ex);
}

View File

@ -247,7 +247,7 @@ public class ExplorerNodeActionVisitor extends ContentVisitor.Default<List<? ext
Boolean counter = false;
imgDetailPanel.setImgNameValue(img.getName());
imgDetailPanel.setImgTypeValue(Image.imageTypeToString(img.getType()));
imgDetailPanel.setImgTypeValue(img.getType().getName());
imgDetailPanel.setImgSectorSizeValue(Long.toString(img.getSsize()));
counter = true;

View File

@ -27,6 +27,17 @@
<condition property="jre.home.64">
<isset property="env.JRE_HOME_64"/>
</condition>
<!-- Update configuration file to include jre -->
<property name="inst.property.file" value="${inst-path}/etc/${app.name}.conf" />
<property name="jvm.options" value="&quot;--branding ${app.name} -J-Xms24m -J-Xmx512m -J-XX:MaxPermSize=128M -J-Xverify:none -J-Xdock:name=${app.title}&quot;" />
<propertyfile file="${inst.property.file}">
<!-- Note: can be higher on 64 bit systems, should be in sync with project.properties -->
<entry key="default_options" value="@JVM_OPTIONS" />
<entry key="jdkhome" value="&quot;jre7&quot;" />
</propertyfile>
<!-- workaround for ant escaping : and = when setting properties -->
<replace file="${inst.property.file}" token="@JVM_OPTIONS" value="${jvm.options}" />
</target>
<target name="autoAIPath" description="Attempt to find the AI path based on standard installation location">
@ -72,6 +83,10 @@
<var name="aut-bin-name" value="${app.name}.exe"/>
<var name="jre-path" value="${env.JRE_HOME_32}"/>
<var name="package-type" value="x86" />
<var name="jvm.max.mem" value="512" />
<exec executable="${ai-exe-path}">
<arg line="/edit ${aip-path} /SetAppdir -buildname DefaultBuild -path [ProgramFilesFolder][ProductName]-${app.version}"/>
</exec>
<antcall target="run-ai-32" inheritAll="true" inheritRefs="true" />
<delete dir="${nbdist.dir}/installer_${app.name}_32-cache"/>
<move file="${nbdist.dir}/installer_${app.name}_32-SetupFiles/installer_${app.name}_32.msi" tofile="${nbdist.dir}/${app.name}-${app.version}-32bit.msi" />
@ -86,7 +101,11 @@
<var name="aut-bin-name" value="${app.name}64.exe"/>
<var name="jre-path" value="${env.JRE_HOME_64}"/>
<var name="package-type" value="x64" />
<var name="jvm.max.mem" value="2048"/>
<echo message="aip-path: ${aip-path}" />
<exec executable="${ai-exe-path}">
<arg line="/edit ${aip-path} /SetAppdir -buildname DefaultBuild -path [ProgramFiles64Folder][ProductName]-${app.version}"/>
</exec>
<antcall target="run-ai-64" inheritAll="true" inheritRefs="true" />
<delete dir="${nbdist.dir}/installer_${app.name}_64-cache"/>
<move file="${nbdist.dir}/installer_${app.name}_64-SetupFiles/installer_${app.name}_64.msi" tofile="${nbdist.dir}/${app.name}-${app.version}-64bit.msi" />
@ -118,7 +137,22 @@
replace="ProductVersion&quot; Value=&quot;${app.version}" />
</target>
<target name="add-ai-files" description="Add the files in the installation path to the installer file">
<target name="update-config" description="Updates configuration file with correct JVM args.">
<!-- Update configuration file to include jre -->
<property name="inst.property.file" value="${inst-path}/etc/${app.name}.conf" />
<!-- Sets max heap size to be ${jvm.max.mem} which is set in the run-ai-(32/64) target -->
<var name="jvm.args" value="&quot;--branding ${app.name} -J-Xms24m -J-Xmx${jvm.max.mem}m -J-XX:MaxPermSize=128M -J-Xverify:none -J-Xdock:name=${app.title}&quot;" />
<propertyfile file="${inst.property.file}">
<!-- Note: can be higher on 64 bit systems, should be in sync with project.properties -->
<entry key="default_options" value="@JVM_OPTIONS" />
<entry key="jdkhome" value="&quot;jre7&quot;" />
</propertyfile>
<!-- workaround for ant escaping : and = when setting properties -->
<replace file="${inst.property.file}" token="@JVM_OPTIONS" value="${jvm.args}" />
</target>
<target name="add-ai-files" depends="update-config" description="Add the files in the installation path to the installer file">
<foreach target="add-file-or-dir" param="theFile" inheritall="true" inheritrefs="true">
<path>
<fileset dir="${inst-path}">
@ -136,7 +170,6 @@
</target>
<target name="add-file-or-dir" depends="is-file-or-folder">
<echo message="${ai-exe-path}" />
<echo message="Adding ${file-or-folder} to installer: ${theFile}"/>
<exec executable="${ai-exe-path}">
<arg line="/edit ${aip-path} /Add${file-or-folder} APPDIR ${theFile}" />
@ -174,7 +207,7 @@
<arg line="/edit ${aip-path} /NewEnvironment -name GSTREAMER_PATH -value [APPDIR]gstreamer\bin -install_operation CreateUpdate -behavior Append -system_variable"/>
</exec>
<exec executable="${ai-exe-path}">
<arg line="/edit ${aip-path} /NewEnvironment -name GSTREAMER_PATH -value [APPDIR]gstreamer\lib\gstreamer-0.10 -install_operation CreateUpdate -behavior Append -system_variable"/>
<arg line="/edit ${aip-path} /NewEnvironment -name GSTREAMER_PATH -value [APPDIR]gstreamer\lib -install_operation CreateUpdate -behavior Append -system_variable"/>
</exec>
<exec executable="${ai-exe-path}">
<arg line="/edit ${aip-path} /NewEnvironment -name PATH -value %GSTREAMER_PATH% -install_operation CreateUpdate -behavior Append -system_variable"/>

View File

@ -78,7 +78,6 @@
<propertyfile file="${app.property.file}">
<!-- Note: can be higher on 64 bit systems, should be in sync with project.properties -->
<entry key="default_options" value="@JVM_OPTIONS" />
<entry key="jdkhome" value="&quot;jre7&quot;" />
</propertyfile>
<!-- workaround for ant escaping : and = when setting properties -->
<replace file="${app.property.file}" token="@JVM_OPTIONS" value="${jvm.options}" />

View File

@ -12,7 +12,7 @@ build.type=DEVELOPMENT
update_versions=false
#custom JVM options
#Note: can be higher on 64 bit systems, should be in sync with build.xml
run.args.extra=-J-Xms24m -J-Xmx512m -J-XX:MaxPermSize=128M -J-Xverify:none
run.args.extra=-J-Xms24m -J-Xmx2048m -J-XX:MaxPermSize=128M -J-Xverify:none
auxiliary.org-netbeans-modules-apisupport-installer.license-type=apache.v2
auxiliary.org-netbeans-modules-apisupport-installer.os-linux=false
auxiliary.org-netbeans-modules-apisupport-installer.os-macosx=false