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

This commit is contained in:
Dick Fickling
2012-02-16 17:31:33 -05:00
11 changed files with 404 additions and 111 deletions
@@ -18,7 +18,6 @@
*/
package org.sleuthkit.autopsy.ingest;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.text.DateFormat;
@@ -46,7 +45,6 @@ import org.netbeans.api.progress.ProgressHandle;
import org.netbeans.api.progress.ProgressHandleFactory;
import org.openide.util.Cancellable;
import org.openide.util.Lookup;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.ingest.IngestMessage.MessageType;
import org.sleuthkit.datamodel.FsContent;
import org.sleuthkit.datamodel.Image;
@@ -88,7 +86,7 @@ public class IngestManager {
public final static String SERVICE_STOPPED_EVT = IngestManagerEvents.SERVICE_STOPPED.name();
public final static String SERVICE_HAS_DATA_EVT = IngestManagerEvents.SERVICE_HAS_DATA.name();
//ui
private IngestUI ui = IngestTopComponent.getDefault();
private IngestUI ui = IngestMessageTopComponent.findInstance();
//singleton
private static IngestManager instance;
@@ -97,14 +95,13 @@ public class IngestManager {
}
static synchronized IngestManager getDefault() {
logger.log(Level.INFO, "creating manager instance");
if (instance == null) {
logger.log(Level.INFO, "creating manager instance");
instance = new IngestManager();
}
return instance;
}
/**
* Add property change listener to listen to ingest events
* @param l PropertyChangeListener to add
@@ -129,10 +126,9 @@ public class IngestManager {
void execute(final Collection<IngestServiceAbstract> services, final Collection<Image> images) {
logger.log(Level.INFO, "Will enqueue number of images: " + images.size());
logger.log(Level.INFO, "Starting enqueue worker");
queueWorker = new EnqueueWorker(services, images);
queueWorker.execute();
ui.restoreMessages();
//logger.log(Level.INFO, "Queues: " + imageQueue.toString() + " " + fsContentQueue.toString());
}
@@ -276,21 +272,34 @@ public class IngestManager {
* test if any of image of fscontent ingesters are running
* @return true if any service is running, false otherwise
*/
synchronized boolean isIngestRunning() {
//enqueue running?
public synchronized boolean isIngestRunning() {
if (isEnqueueRunning()) {
return true;
} else if (isFileIngestRunning()) {
return true;
} else if (isImageIngestRunning()) {
return true;
} else {
return false;
}
}
public synchronized boolean isEnqueueRunning() {
if (queueWorker != null && !queueWorker.isDone()) {
return true;
}
return false;
}
//enque not running
//file ingester running?
public synchronized boolean isFileIngestRunning() {
if (fsContentIngester != null && !fsContentIngester.isDone()) {
return true;
}
return false;
}
//file ingester not running
public synchronized boolean isImageIngestRunning() {
if (imageIngesters.isEmpty()) {
return false;
}
@@ -305,9 +314,9 @@ public class IngestManager {
}
if (allDone) {
return false;
} else {
return true;
}
return true;
}
/**
@@ -351,7 +360,6 @@ public class IngestManager {
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ui.displayMessage(message);
@@ -487,16 +495,6 @@ public class IngestManager {
});
}
private void updateMainProgress(final int progress) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ui.updateProgress(progress);
}
});
}
//image worker to remove itself when complete or interrupted
void removeImageIngestWorker(IngestImageThread worker) {
//remove worker
@@ -970,7 +968,6 @@ public class IngestManager {
}
progress.progress(unit.content.getName(), ++processedFiles);
updateMainProgress(processedFiles);
--numFsContents;
}
logger.log(Level.INFO, "Done background processing");
@@ -0,0 +1,28 @@
<?xml version="1.1" encoding="UTF-8" ?>
<Form version="1.5" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
</AuxValues>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="385" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="362" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
</Layout>
</Form>
@@ -0,0 +1,272 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2011 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.ingest;
import java.awt.BorderLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import org.openide.util.ImageUtilities;
import org.openide.util.NbBundle;
import org.openide.windows.Mode;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.datamodel.Image;
/**
* Top component which displays something.
*/
public final class IngestMessageTopComponent extends TopComponent implements IngestUI {
private static IngestMessageTopComponent instance;
private static final Logger logger = Logger.getLogger(IngestMessageTopComponent.class.getName());
private IngestMessagePanel messagePanel;
private IngestManager manager;
private static String PREFERRED_ID = "IngestMessageTopComponent";
public IngestMessageTopComponent() {
initComponents();
customizeComponents();
registerListeners();
setName(NbBundle.getMessage(IngestMessageTopComponent.class, "CTL_IngestMessageTopComponent"));
setToolTipText(NbBundle.getMessage(IngestMessageTopComponent.class, "HINT_IngestMessageTopComponent"));
//putClientProperty(TopComponent.PROP_CLOSING_DISABLED, Boolean.TRUE);
}
private static synchronized IngestMessageTopComponent getDefault() {
if (instance == null) {
instance = new IngestMessageTopComponent();
}
return instance;
}
public static synchronized IngestMessageTopComponent findInstance() {
TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
if (win == null) {
return getDefault();
}
if (win instanceof IngestMessageTopComponent) {
return (IngestMessageTopComponent) win;
}
return getDefault();
}
/** 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 regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 385, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 362, Short.MAX_VALUE)
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables
@Override
public void componentOpened() {
logger.log(Level.INFO, "OPENED");
//create manager instance
if (manager == null)
manager = IngestManager.getDefault();
}
@Override
public void componentClosed() {
logger.log(Level.INFO, "CLOSED");
// TODO add custom code on component closing
// WindowManager.getDefault().findMode("bottomSlidingSide").dockInto(this);
if (manager.isIngestRunning()) {
/*
Mode mode = WindowManager.getDefault().findMode("floatingLeftBottom");
//Mode mode = WindowManager.getDefault().findMode("bottomSlidingSide");
if (mode != null) {
mode.dockInto(this);
this.open();
}
return;
*/
}
Mode mode = WindowManager.getDefault().findMode("dockedBottom");
if (mode != null) {
mode.dockInto(this);
this.open();
}
}
@Override
protected void componentShowing() {
logger.log(Level.INFO, "SHOWING");
Mode mode = WindowManager.getDefault().findMode("floatingLeftBottom");
if (mode != null) {
mode.dockInto(this);
this.open();
}
}
@Override
protected void componentHidden() {
logger.log(Level.INFO, "HIDDEN");
}
@Override
protected void componentActivated() {
super.componentActivated();
}
@Override
protected void componentDeactivated() {
super.componentDeactivated();
}
@Override
public boolean canClose() {
return true;
}
@Override
public int getPersistenceType() {
return TopComponent.PERSISTENCE_NEVER;
}
@Override
public java.awt.Image getIcon() {
return ImageUtilities.loadImage(
"org/sleuthkit/autopsy/ingest/ingest-msg-icon.png");
}
void writeProperties(java.util.Properties p) {
// better to version settings since initial version as advocated at
// http://wiki.apidesign.org/wiki/PropertyFiles
p.setProperty("version", "1.0");
// TODO store your settings
}
void readProperties(java.util.Properties p) {
String version = p.getProperty("version");
// TODO read your settings according to their version
}
private void registerListeners() {
//handle case change
Case.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(Case.CASE_CURRENT_CASE)) {
Case oldCase = (Case) evt.getOldValue();
if (oldCase == null) //nothing to do, new case had been opened
{
return;
}
//stop workers if running
IngestManager.getDefault().stopAll();
//clear inbox
clearMessages();
} else if (evt.getPropertyName().equals(Case.CASE_ADD_IMAGE)) {
final Image image = (Image) evt.getNewValue();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
displayIngestDialog(image);
}
});
}
}
});
}
private void customizeComponents() {
//custom GUI setup not done by builder
messagePanel = new IngestMessagePanel();
messagePanel.setOpaque(false);
setLayout(new BorderLayout());
add(messagePanel, BorderLayout.CENTER);
}
/**
* Display ingest summary report in some dialog
*/
@Override
public void displayReport(String ingestReport) {
JOptionPane.showMessageDialog(
null,
ingestReport,
"File Ingest Summary",
JOptionPane.INFORMATION_MESSAGE);
}
/**
* Display IngestMessage from service (forwarded by IngestManager)
*/
@Override
public void displayMessage(IngestMessage ingestMessage) {
messagePanel.addMessage(ingestMessage);
}
@Override
public void initProgress(int maximum) {
}
@Override
public void updateProgress(int progress) {
}
@Override
public void clearMessages() {
clearMessages();
}
@Override
public void displayIngestDialog(final Image image) {
final IngestDialog ingestDialog = new IngestDialog();
ingestDialog.setImage(image);
ingestDialog.display();
}
@Override
public void restoreMessages() {
componentShowing();
}
}
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE tc-ref PUBLIC "-//NetBeans//DTD Top Component in Mode Properties 2.0//EN" "http://www.netbeans.org/dtds/tc-ref2_0.dtd">
<tc-ref version="2.2">
<tc-id id="IngestMessageTopComponent" />
<state opened="true" />
<previousMode name="floatingLeftBottom" index="0" />
</tc-ref>
@@ -35,7 +35,7 @@ import org.sleuthkit.datamodel.Image;
/**
* Top component explorer for the Ingest module.
*/
public final class IngestTopComponent extends TopComponent implements DataExplorer, IngestUI {
public final class IngestTopComponent extends TopComponent implements DataExplorer {
private static IngestTopComponent instance;
private static final Logger logger = Logger.getLogger(IngestTopComponent.class.getName());
@@ -43,8 +43,8 @@ public final class IngestTopComponent extends TopComponent implements DataExplor
private IngestTopComponent() {
initComponents();
customizeComponents();
registerListeners();
// customizeComponents();
//registerListeners();
setName(NbBundle.getMessage(IngestTopComponent.class, "CTL_IngestTopComponent"));
setToolTipText(NbBundle.getMessage(IngestTopComponent.class, "HINT_IngestTopComponent"));
//putClientProperty(TopComponent.PROP_UNDOCKING_DISABLED, Boolean.TRUE);
@@ -74,36 +74,6 @@ public final class IngestTopComponent extends TopComponent implements DataExplor
return TopComponent.PERSISTENCE_NEVER;
}
private void registerListeners() {
//handle case change
Case.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(Case.CASE_CURRENT_CASE)) {
Case oldCase = (Case) evt.getOldValue();
if (oldCase == null) //nothing to do, new case had been opened
{
return;
}
//stop workers if running
IngestManager.getDefault().stopAll();
//clear inbox
clearMessages();
} else if (evt.getPropertyName().equals(Case.CASE_ADD_IMAGE)) {
final Image image = (Image) evt.getNewValue();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
displayIngestDialog(image);
}
});
}
}
});
}
private void customizeComponents() {
//custom GUI setup not done by builder
@@ -257,7 +227,7 @@ public final class IngestTopComponent extends TopComponent implements DataExplor
@Override
public void componentOpened() {
logger.log(Level.INFO, "IngestTopComponent opened()");
IngestManager.getDefault(); //create initial instance
// IngestManager.getDefault(); //create initial instance
}
@@ -279,46 +249,7 @@ public final class IngestTopComponent extends TopComponent implements DataExplor
}
/**
* Display ingest summary report in some dialog
*/
@Override
public void displayReport(String ingestReport) {
JOptionPane.showMessageDialog(
null,
ingestReport,
"File Ingest Summary",
JOptionPane.INFORMATION_MESSAGE);
}
/**
* Display IngestMessage from service (forwarded by IngestManager)
*/
@Override
public void displayMessage(IngestMessage ingestMessage) {
messagePanel.addMessage(ingestMessage);
}
@Override
public void initProgress(int maximum) {
this.mainProgressBar.setMaximum(maximum);
}
@Override
public void updateProgress(int progress) {
this.mainProgressBar.setValue(progress);
}
@Override
public void clearMessages() {
messagePanel.clearMessages();
}
@Override
public void displayIngestDialog(final Image image) {
final IngestDialog ingestDialog = new IngestDialog();
ingestDialog.setImage(image);
ingestDialog.display();
}
}
@@ -27,11 +27,10 @@ import org.sleuthkit.datamodel.Image;
public interface IngestUI {
void displayMessage(final IngestMessage message);
void clearMessages();
void restoreMessages();
void displayIngestDialog(final Image image);
void initProgress(final int maximum);
void updateProgress(final int progress);
void displayReport(final String report);
}
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mode PUBLIC
"-//NetBeans//DTD Mode Properties 2.0//EN"
"http://www.netbeans.org/dtds/mode-properties2_0.dtd">
<mode version="2.3">
<name unique="dockedBottom" />
<!-- <kind type="view" /> -->
<kind type="sliding" />
<slidingSide side="bottom"/>
<state type="joined" />
<bounds x="8" y="710" width="369" height="421" />
<frame state="0"/>
<active-tc id="IngestMessageTopComponent" />
<empty-behavior permanent="true"/>
</mode>
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mode PUBLIC
"-//NetBeans//DTD Mode Properties 2.0//EN"
"http://www.netbeans.org/dtds/mode-properties2_0.dtd">
<mode version="2.3">
<name unique="floatingLeftBottom" />
<kind type="view" />
<state type="separated" />
<constraints>
<path orientation="horizontal" number="100" weight="0.5"/>
</constraints>
<bounds x="8" y="710" width="369" height="421" />
<frame state="0"/>
<!-- <active-tc id="IngestMessageTopComponent" /> -->
<empty-behavior permanent="true"/>
</mode>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,12 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
<filesystem>
<folder name="Actions">
<folder name="Window">
<file name="org-sleuthkit-autopsy-ingest-IngestMessageTopComponent.instance"/>
</folder>
</folder>
<folder name="Services">
<file name="org-sleuthkit-autopsy-ingest-IngestTopComponent.instance">
<attr name="instanceOf" stringvalue="org.sleuthkit.autopsy.corecomponentinterfaces.DataExplorer"/>
<attr name="instanceCreate" methodvalue="org.sleuthkit.autopsy.ingest.IngestTopComponent.getDefault"/>
<attr name="position" intvalue="300"/>
</file>
<!-- <file name="org-sleuthkit-autopsy-ingest-IngestMessageTopComponent.instance">
<attr name="instanceOf" stringvalue="org.sleuthkit.autopsy.corecomponentinterfaces.FloatingMessageViewer"/>
<attr name="instanceCreate" methodvalue="org.sleuthkit.autopsy.ingest.IngestMessageTopComponent.findInstance"/>
<attr name="position" intvalue="100"/>
</file> -->
<!-- example services -->
<!--
<file name="org-sleuthkit-autopsy-ingest-example-ExampleImageIngestService.instance">
@@ -22,4 +28,16 @@
</file>
-->
</folder>
<folder name="Windows2">
<folder name="Modes">
<folder name="dockedBottom">
<file name="IngestMessageTopComponent.wstcref" url="IngestMessageTopComponentWstcref.xml"/>
</folder>
<file name="dockedBottom.wsmode" url="dockedBottomWsmode.xml" />
<folder name="floatingLeftBottom">
</folder>
<file name="floatingLeftBottom.wsmode" url="floatingLeftBottomWsmode.xml"/>
</folder>
</folder>
</filesystem>
@@ -71,7 +71,7 @@ public final class KeywordSearchIngestService implements IngestServiceFsContent
private Map<Keyword, List<FsContent>> currentResults;
private volatile int messageID = 0;
private volatile boolean finalRun = false;
private final SleuthkitCase caseHandle = Case.getCurrentCase().getSleuthkitCase();
private SleuthkitCase caseHandle = null;
private static final String[] ingestibleExtensions = {"tar", "jar", "zip", "bzip2",
"gz", "tgz", "doc", "xls", "ppt", "rtf", "pdf", "html", "xhtml", "txt",
"bmp", "gif", "png", "jpeg", "tiff", "mp3", "aiff", "au", "midi", "wav",
@@ -167,6 +167,8 @@ public final class KeywordSearchIngestService implements IngestServiceFsContent
@Override
public void init(IngestManagerProxy managerProxy) {
logger.log(Level.INFO, "init()");
caseHandle = Case.getCurrentCase().getSleuthkitCase();
this.managerProxy = managerProxy;