Merge pull request #2293 from eugene7646/aim_move

1924 Moved AID into Autopsy
This commit is contained in:
Richard Cordovano 2016-08-09 15:37:47 -04:00 committed by GitHub
commit 9d03de24fd
37 changed files with 4119 additions and 101 deletions

View File

@ -0,0 +1,450 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.6" maxVersion="1.9" 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">
<Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Group type="103" groupAlignment="1" attributes="0">
<Component id="lbPending" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="pendingScrollPane" min="-2" pref="920" max="-2" attributes="0"/>
</Group>
<EmptySpace max="32767" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="bnPrioritizeCase" min="-2" pref="117" max="-2" attributes="0"/>
<Component id="bnPrioritizeFolder" min="-2" pref="117" max="-2" attributes="0"/>
</Group>
</Group>
<Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="75" max="-2" attributes="0"/>
<Component id="bnPause" linkSize="1" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="100" max="-2" attributes="0"/>
<Component id="bnRefresh" linkSize="1" min="-2" pref="100" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="100" max="-2" attributes="0"/>
<Component id="bnOptions" linkSize="1" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="100" max="-2" attributes="0"/>
<Component id="bnExit" linkSize="1" min="-2" pref="94" max="-2" attributes="0"/>
</Group>
<Group type="102" alignment="0" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="runningScrollPane" min="-2" pref="920" max="-2" attributes="0"/>
<Component id="completedScrollPane" min="-2" pref="920" max="-2" attributes="0"/>
</Group>
<EmptySpace type="unrelated" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" max="-2" attributes="0">
<Component id="bnCancelJob" linkSize="1" pref="117" max="32767" attributes="0"/>
<Component id="bnShowProgress" linkSize="1" pref="116" max="32767" attributes="0"/>
<Component id="bnCancelModule" linkSize="1" alignment="0" pref="117" max="32767" attributes="0"/>
<Component id="bnDeleteCase" linkSize="1" alignment="0" pref="117" max="32767" attributes="0"/>
<Component id="bnShowCaseLog" max="32767" attributes="0"/>
</Group>
</Group>
<Group type="102" alignment="0" attributes="0">
<Component id="lbStatus" min="-2" max="-2" attributes="0"/>
<EmptySpace type="unrelated" max="-2" attributes="0"/>
<Component id="tbStatusMessage" min="-2" pref="861" max="-2" attributes="0"/>
</Group>
<Component id="lbCompleted" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="lbRunning" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group>
</Group>
<EmptySpace max="32767" attributes="0"/>
</Group>
<Group type="102" alignment="0" attributes="0">
<Component id="lbServicesStatus" min="-2" max="-2" attributes="0"/>
<EmptySpace type="unrelated" max="-2" attributes="0"/>
<Component id="tbServicesStatusMessage" min="-2" pref="861" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
</Group>
</Group>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="1" attributes="0">
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lbStatus" alignment="3" min="-2" pref="23" max="-2" attributes="0"/>
<Component id="tbStatusMessage" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="lbServicesStatus" alignment="3" min="-2" pref="23" max="-2" attributes="0"/>
<Component id="tbServicesStatusMessage" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Component id="lbPending" min="-2" pref="23" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="pendingScrollPane" min="-2" pref="215" max="-2" attributes="0"/>
</Group>
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="82" max="-2" attributes="0"/>
<Component id="bnPrioritizeCase" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="bnPrioritizeFolder" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Component id="lbRunning" min="-2" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<EmptySpace min="-2" pref="34" max="-2" attributes="0"/>
<Component id="bnShowProgress" linkSize="2" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="bnCancelJob" linkSize="2" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="bnCancelModule" linkSize="2" min="-2" max="-2" attributes="0"/>
</Group>
<Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="runningScrollPane" min="-2" pref="133" max="-2" attributes="0"/>
</Group>
</Group>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="102" max="-2" attributes="0"/>
<Component id="bnDeleteCase" linkSize="2" min="-2" max="-2" attributes="0"/>
<EmptySpace type="unrelated" max="-2" attributes="0"/>
<Component id="bnShowCaseLog" min="-2" max="-2" attributes="0"/>
</Group>
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="lbCompleted" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="completedScrollPane" min="-2" pref="179" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="bnExit" linkSize="2" alignment="0" min="-2" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="bnPause" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="bnRefresh" linkSize="2" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="bnOptions" linkSize="2" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
</Group>
</Group>
<EmptySpace max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Container class="javax.swing.JScrollPane" name="pendingScrollPane">
<AuxValues>
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>
<Component class="javax.swing.JTable" name="pendingTable">
<Properties>
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="pendingTableModel" type="code"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.pendingTable.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="autoResizeMode" type="int" value="4"/>
<Property name="rowHeight" type="int" value="20" postCode="pendingTable.setSelectionModel(new DefaultListSelectionModel() {&#xa; private static final long serialVersionUID = 1L;&#xa; @Override&#xa; public void setSelectionInterval(int index0, int index1) {&#xa; if (index0 == pendingTable.getSelectedRow()) {&#xa; pendingTable.clearSelection();&#xa; } else {&#xa; super.setSelectionInterval(index0, index1);&#xa; }&#xa; }&#xa;});"/>
<Property name="selectionModel" type="javax.swing.ListSelectionModel" editor="org.netbeans.modules.form.editors2.JTableSelectionModelEditor">
<JTableSelectionModel selectionMode="0"/>
</Property>
</Properties>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JScrollPane" name="runningScrollPane">
<AuxValues>
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>
<Component class="javax.swing.JTable" name="runningTable">
<Properties>
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="runningTableModel" type="code"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.runningTable.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="autoResizeMode" type="int" value="4"/>
<Property name="rowHeight" type="int" value="20" postCode="runningTable.setSelectionModel(new DefaultListSelectionModel() {&#xa; private static final long serialVersionUID = 1L;&#xa; @Override&#xa; public void setSelectionInterval(int index0, int index1) {&#xa; if (index0 == runningTable.getSelectedRow()) {&#xa; runningTable.clearSelection();&#xa; } else {&#xa; super.setSelectionInterval(index0, index1);&#xa; }&#xa; }&#xa;});"/>
<Property name="selectionModel" type="javax.swing.ListSelectionModel" editor="org.netbeans.modules.form.editors2.JTableSelectionModelEditor">
<JTableSelectionModel selectionMode="0"/>
</Property>
</Properties>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JScrollPane" name="completedScrollPane">
<AuxValues>
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>
<Component class="javax.swing.JTable" name="completedTable">
<Properties>
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="completedTableModel" type="code"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.completedTable.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="autoResizeMode" type="int" value="4"/>
<Property name="rowHeight" type="int" value="20" postCode="completedTable.setSelectionModel(new DefaultListSelectionModel() {&#xa; private static final long serialVersionUID = 1L;&#xa; @Override&#xa; public void setSelectionInterval(int index0, int index1) {&#xa; if (index0 == completedTable.getSelectedRow()) {&#xa; completedTable.clearSelection();&#xa; } else {&#xa; super.setSelectionInterval(index0, index1);&#xa; }&#xa; }&#xa;});"/>
<Property name="selectionModel" type="javax.swing.ListSelectionModel" editor="org.netbeans.modules.form.editors2.JTableSelectionModelEditor">
<JTableSelectionModel selectionMode="0"/>
</Property>
</Properties>
</Component>
</SubComponents>
</Container>
<Component class="javax.swing.JButton" name="bnCancelJob">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnCancelJob.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnCancelJob.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnCancelJobActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="bnDeleteCase">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnDeleteCase.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnDeleteCase.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnDeleteCaseActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JLabel" name="lbPending">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Tahoma" size="14" style="0"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.lbPending.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lbRunning">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Tahoma" size="14" style="0"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.lbRunning.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lbCompleted">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Tahoma" size="14" style="0"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.lbCompleted.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="bnRefresh">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnRefresh.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnRefresh.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnRefreshActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="bnCancelModule">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnCancelModule.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnCancelModule.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnCancelModuleActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="bnExit">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnExit.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnExit.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnExitActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="bnOptions">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnOptions.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnOptions.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnOptionsActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="bnShowProgress">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnShowProgress.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnShowProgress.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnShowProgressActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="bnPause">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPause.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPause.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnPauseActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="bnPrioritizeCase">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPrioritizeCase.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPrioritizeCase.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnPrioritizeCaseActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="bnShowCaseLog">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnShowCaseLog.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnShowCaseLog.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnShowCaseLogActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JTextField" name="tbStatusMessage">
<Properties>
<Property name="editable" type="boolean" value="false"/>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Tahoma" size="12" style="1"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.tbStatusMessage.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="null"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lbStatus">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Tahoma" size="14" style="0"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.lbStatus.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="bnPrioritizeFolder">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPrioritizeFolder.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPrioritizeFolder.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnPrioritizeFolderActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JLabel" name="lbServicesStatus">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Tahoma" size="14" style="0"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.lbServicesStatus.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="tbServicesStatusMessage">
<Properties>
<Property name="editable" type="boolean" value="false"/>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Tahoma" size="12" style="1"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.tbServicesStatusMessage.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="null"/>
</Property>
</Properties>
</Component>
</SubComponents>
</Form>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,595 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2015 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.autoingest;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.Instant;
import java.util.Comparator;
import java.util.Date;
import java.util.Objects;
import java.util.logging.Level;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.NetworkUtils;
import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.autopsy.ingest.IngestJob;
import org.joda.time.DateTime;
/**
* An automated ingest job completed by, or to be completed by, the automated
* ingest manager.
*/
class AutoIngestJob implements Comparable<AutoIngestJob> {
// ELTODO: move JobIngestStatus back into AIM
/**
* Represents the state of an auto ingest job at any given moment during its
* lifecycle as it moves from waiting to be processed, through the various
* stages of processing, to its final completed state.
*/
static final class JobIngestStatus {
private enum IngestStatus {
PENDING("Pending"),
STARTING("Starting"),
UPDATING_SHARED_CONFIG("Updating shared configuration"),
CHECKING_SERVICES("Checking services"),
OPENING_CASE("Opening case"),
IDENTIFYING_IMAGES("Identifying images"),
ADDING_IMAGES("Adding images"),
ANALYZING_IMAGES("Analyzing images"),
ANALYZING_FILES("Analyzing files"),
EXPORTING_FILES("Exporting files"),
CANCELLING_MODULE("Cancelling module"),
CANCELLING("Cancelling"),
COMPLETED("Completed");
private final String displayText;
private IngestStatus(String displayText) {
this.displayText = displayText;
}
String getDisplayText() {
return displayText;
}
}
private IngestStatus ingestStatus;
private String statusDisplayName;
private Date startDate;
private IngestJob ingestJob;
private boolean cancelled;
private Date dateCompleted;
private JobIngestStatus(Date dateCompleted) {
ingestStatus = IngestStatus.PENDING;
statusDisplayName = ingestStatus.getDisplayText();
startDate = DateTime.now().toDate();
this.dateCompleted = dateCompleted;
}
/**
* Updates displayed status and start fileTime of auto ingest job. Used
* primarily to display status of remote running jobs.
*
* @param newDisplayName Displayed status of the auto ingest job.
* @param startTime Start fileTime of the current activity.
*/
synchronized private void setStatus(String newDisplayName, Date startTime) {
statusDisplayName = newDisplayName;
startDate = startTime;
}
/**
* Updates status of auto ingest job. Sets current fileTime as activity
* start fileTime. Used to update status of local running job.
*
* @param newStatus Status of the auto ingest job.
*/
synchronized private void setStatus(IngestStatus newStatus) {
if (ingestStatus == IngestStatus.CANCELLING && newStatus != IngestStatus.COMPLETED) {
/**
* Do not overwrite canceling status with anything other than
* completed status.
*/
return;
}
ingestStatus = newStatus;
statusDisplayName = ingestStatus.getDisplayText();
startDate = Date.from(Instant.now());
if (ingestStatus == IngestStatus.COMPLETED) {
/**
* Release the reference for garbage collection since this
* object may live for a long time within a completed job.
*/
ingestJob = null;
}
if (ingestStatus == IngestStatus.COMPLETED) {
dateCompleted = startDate;
}
}
synchronized private void setIngestJob(IngestJob ingestJob) {
/**
* Once this field is set, the ingest job should be used to
* determine the current activity up until the the job is completed.
*/
this.ingestJob = ingestJob;
}
synchronized AutoIngestJob.Status getStatus() {
if (null != ingestJob && ingestStatus != IngestStatus.CANCELLING && ingestStatus != IngestStatus.EXPORTING_FILES) {
String activityDisplayText;
IngestJob.ProgressSnapshot progress = ingestJob.getSnapshot();
IngestJob.DataSourceIngestModuleHandle ingestModuleHandle = progress.runningDataSourceIngestModule();
if (null != ingestModuleHandle) {
/**
* A first or second stage data source level ingest module
* is running. Reporting this takes precedence over
* reporting generic file analysis.
*/
startDate = ingestModuleHandle.startTime();
if (!ingestModuleHandle.isCancelled()) {
activityDisplayText = ingestModuleHandle.displayName();
} else {
activityDisplayText = String.format(IngestStatus.CANCELLING_MODULE.getDisplayText(), ingestModuleHandle.displayName());
}
} else {
/**
* If no data source level ingest module is running, then
* either it is still the first stage of analysis and file
* level ingest modules are running or another ingest job is
* still running. Note that there can be multiple ingest
* jobs running in parallel. For example, there is an ingest
* job created to ingest each extracted virtual machine.
*/
activityDisplayText = IngestStatus.ANALYZING_FILES.getDisplayText();
startDate = progress.fileIngestStartTime();
}
return new AutoIngestJob.Status(activityDisplayText, startDate);
} else {
return new AutoIngestJob.Status(statusDisplayName, startDate);
}
}
synchronized private IngestJob setStatusCancelled() {
cancelled = true;
setStatus(JobIngestStatus.IngestStatus.CANCELLING);
return ingestJob;
}
synchronized private IngestJob cancelModule() {
setStatus(JobIngestStatus.IngestStatus.CANCELLING_MODULE);
return ingestJob;
}
synchronized private boolean isCancelled() {
return cancelled;
}
synchronized Date getDateCompleted() {
return dateCompleted;
}
synchronized Date getDateStarted() {
return startDate;
}
}
private static final Logger logger = Logger.getLogger(AutoIngestJob.class.getName());
private final String caseName;
private final Path imageFolderPath;
private final Date imageFolderCreateDate;
private Path caseFolderName;
private final String jobDisplayName;
private String nodeName;
//ELTODO private final AutoIngestManager.JobIngestStatus ingestStatus;
private final JobIngestStatus ingestStatus;
private static final String localHostName = NetworkUtils.getLocalHostName();
/**
* This variable is being accessed by AID as well as JMS thread
*/
private volatile boolean isLocalJob;
private Date readyFileTimeStamp;
private Date prioritizedFileTimeStamp;
/**
* Constructs an automated ingest job completed by, or to be completed by,
* the automated ingest manager.
*
* @param imageFolderPath The fully qualified path to the case input folder
* for the job.
* @param caseName The case to which this job belongs. Note that this
* is the original case name (and not the timestamped
* case name).
* @param caseFolderName The fully qualified path to the case output folder
* for the job, if known.
* @param ingestStatus Ingest status details provided by the automated
* ingest manager.
* @param nodeName Name of the node that is processing the job
*/
AutoIngestJob(Path imageFolderPath, String caseName, Path caseFolderName, /* //ELTODO AutoIngestManager.*/JobIngestStatus ingestStatus, String nodeName) {
this.caseName = caseName;
this.imageFolderPath = imageFolderPath;
this.caseFolderName = caseFolderName;
this.ingestStatus = ingestStatus;
this.jobDisplayName = resolveJobDisplayName(imageFolderPath);
this.isLocalJob = true; // jobs are set to "local" by default
this.nodeName = nodeName;
/**
* Either initialize to the folder creation date or the current date.
* Note that the way this is coded allows the folder creation date field
* to be final.
*/
BasicFileAttributes attrs = null;
try {
attrs = Files.readAttributes(imageFolderPath, BasicFileAttributes.class);
} catch (IOException ex) {
logger.log(Level.SEVERE, String.format("Failed to read attributes of input folder %s", imageFolderPath), ex);
}
this.imageFolderCreateDate = attrs == null ? new Date() : new Date(attrs.creationTime().toMillis());
try {
attrs = Files.readAttributes(Paths.get(imageFolderPath.toString(), StateFile.Type.READY.fileName()), BasicFileAttributes.class);
this.readyFileTimeStamp = new Date(attrs.creationTime().toMillis());
} catch (IOException ex) {
// Auto ingest job may be created for a remotely running job so no need to log exception if we don't find READY file
this.readyFileTimeStamp = new Date();
}
try {
attrs = Files.readAttributes(Paths.get(imageFolderPath.toString(), StateFile.Type.PRIORITIZED.fileName()), BasicFileAttributes.class);
this.prioritizedFileTimeStamp = new Date(attrs.creationTime().toMillis());
} catch (IOException ex) {
this.prioritizedFileTimeStamp = null;
}
}
static final class Status {
private final String activity;
private final Date activityStartDate;
Status(String activity, Date activityStartTime) {
this.activity = activity;
this.activityStartDate = activityStartTime;
}
String getActivity() {
return this.activity;
}
Date getActivityStartDate() {
return this.activityStartDate;
}
}
Status getStatus() {
return ingestStatus.getStatus();
}
// ELTODO AutoIngestManager.JobIngestStatus getIngestStatus() {
JobIngestStatus getIngestStatus() {
return ingestStatus;
}
/**
* Determine auto ingest job's display name. Display name is a relative path
* from case folder down to auto ingest job's folder.
*
* @param jobFolderPath Full path to auto ingest job's directory
*
* @return Auto ingest job's display name
*/
private String resolveJobDisplayName(Path jobFolderPath) {
Path pathRelative;
try {
Path rootInputFolderPath = Paths.get(UserPreferences.getAutoModeImageFolder());
Path casePath = PathUtils.caseImagesPathFromImageFolderPath(rootInputFolderPath, jobFolderPath);
pathRelative = casePath.relativize(jobFolderPath);
} catch (Exception ignore) {
// job folder is not a subpath of case folder, return entire job folder path
return jobFolderPath.toString();
}
return pathRelative.toString();
}
/**
* Returns the fully qualified path to the input folder.
*/
Path getImageFolderPath() {
return imageFolderPath;
}
/**
* Returns the name of the case to which the ingest job belongs. Note that
* this is the original case name (not the timestamped Autopsy case name).
*/
String getCaseName() {
return this.caseName;
}
/**
* Returns the display name for current auto ingest job.
*/
String getJobDisplayName() {
return this.jobDisplayName;
}
/**
* Returns the fully qualified path to the case results folder.
*/
Path getCaseFolderPath() {
return this.caseFolderName;
}
/**
* Set the fully qualifies path to the case results folder.
*
* @param resultsPath
*/
void setCaseFolderPath(Path resultsPath) {
this.caseFolderName = resultsPath;
}
/**
* Get the date processing completed on the job.
*/
Date getDateCompleted() {
return ingestStatus.getDateCompleted();
}
/**
* Get the ready file created date
*/
Date getReadyFileTimeStamp() {
return this.readyFileTimeStamp;
}
/**
* Get the prioritized file created date.
*/
Date getPrioritizedFileTimeStamp() {
return this.prioritizedFileTimeStamp;
}
/**
* Sets the created date of the prirotized state file for this job.
*/
void setPrioritizedFileTimeStamp(Date timeStamp) {
/*
* RJC: This method is a bit of a hack to support a quick and dirty way
* of giving user feedback when an input folder or a case is
* prioritized. It can be removed when a better solution is found, or
* replaced with a method that looks up the state file time stamp.
*/
this.prioritizedFileTimeStamp = timeStamp;
}
/**
* Gets case status based on the state files that exist in the job folder.
*
* @return See CaseStatus enum definition.
*/
CaseStatus getCaseStatus() {
try {
if (StateFile.exists(imageFolderPath, StateFile.Type.CANCELLED)) {
return CaseStatus.CANCELLATIONS;
} else if (StateFile.exists(imageFolderPath, StateFile.Type.ERROR)) {
return CaseStatus.ERRORS;
} else if (StateFile.exists(imageFolderPath, StateFile.Type.INTERRUPTED)) {
return CaseStatus.INTERRUPTS;
} else {
return CaseStatus.OK;
}
} catch (IOException | SecurityException ex) {
logger.log(Level.SEVERE, String.format("Failed to determine status of case at %s", imageFolderPath), ex);
return CaseStatus.ERRORS;
}
}
/**
* Returns the date the input folder was created.
*
* @return
*/
Date getDateCreated() {
return this.imageFolderCreateDate;
}
/**
* Updates flag whether the auto ingest job is running on local AIM node or
* remote one.
*
* @param isLocal true if job is local, false otherwise.
*/
void setIsLocalJob(boolean isLocal) {
this.isLocalJob = isLocal;
}
/**
* Gets flag whether the auto ingest job is running on local AIM node or
* remote one.
*
* @return True if job is local, false otherwise.
*/
boolean getIsLocalJob() {
return this.isLocalJob;
}
/**
* Gets name of AIN that is processing the job.
*
* @return Name of the node that is processing the job.
*/
public String getNodeName() {
return nodeName;
}
/**
* Sets name of AIN that is processing the job.
*
* @param nodeName Name of the node that is processing the job.
*/
public void setNodeName(String nodeName) {
this.nodeName = nodeName;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof AutoIngestJob)) {
return false;
}
if (obj == this) {
return true;
}
AutoIngestJob rhs = (AutoIngestJob) obj;
return this.imageFolderPath.toString().equals(rhs.imageFolderPath.toString());
}
@Override
public int hashCode() {
int hash = 7;
hash = 71 * hash + Objects.hashCode(this.imageFolderPath);
hash = 71 * hash + Objects.hashCode(this.imageFolderCreateDate);
hash = 71 * hash + Objects.hashCode(this.caseName);
return hash;
}
/**
* Default sorting is by ready file creation date, descending
*/
@Override
public int compareTo(AutoIngestJob o) {
return -this.imageFolderCreateDate.compareTo(o.getDateCreated());
}
/**
* Determine if this job object is a higher priority than the otherJob.
*
* @param otherJob The job to compare against.
*
* @return true if this job is a higher priority, otherwise false.
*/
boolean isHigherPriorityThan(AutoIngestJob otherJob) {
if (this.prioritizedFileTimeStamp == null) {
return false;
}
if (otherJob.prioritizedFileTimeStamp == null) {
return true;
}
return (this.prioritizedFileTimeStamp.compareTo(otherJob.prioritizedFileTimeStamp) > 0);
}
/**
* Custom comparator that allows us to sort List<AutoIngestJob> on reverse
* chronological date modified (descending)
*/
static class ReverseDateCompletedComparator implements Comparator<AutoIngestJob> {
@Override
public int compare(AutoIngestJob o1, AutoIngestJob o2) {
return -o1.getDateCompleted().compareTo(o2.getDateCompleted());
}
}
/**
* Custom comparator that allows us to sort List<AutoIngestJob> on reverse
* chronological date created (descending)
*/
static class ReverseDateCreatedComparator implements Comparator<AutoIngestJob> {
@Override
public int compare(AutoIngestJob o1, AutoIngestJob o2) {
return -o1.getDateCreated().compareTo(o2.getDateCreated());
}
}
/**
* Custom comparator that allows us to sort List<AutoIngestJob> on reverse
* chronological date started (descending)
*/
static class ReverseDateStartedComparator implements Comparator<AutoIngestJob> {
@Override
public int compare(AutoIngestJob o1, AutoIngestJob o2) {
return -o1.getStatus().getActivityStartDate().compareTo(o2.getStatus().getActivityStartDate());
}
}
/**
* Custom comparator that sorts the pending list with prioritized cases
* first, then nonprioritized cases. Prioritized cases are last in, first
* out. Nonprioritized cases are first in, first out. Prioritized times are
* from the creation time of the ".prioritized" state file. Non prioritized
* are from the folder creation time.
*/
public static class PrioritizedPendingListComparator implements Comparator<AutoIngestJob> {
@Override
public int compare(AutoIngestJob o1, AutoIngestJob o2) {
Date dateCreated1 = o1.getDateCreated();
Date dateCreated2 = o2.getDateCreated();
Date datePrioritized1 = o1.getPrioritizedFileTimeStamp();
Date datePrioritized2 = o2.getPrioritizedFileTimeStamp();
if (datePrioritized1 != null && datePrioritized2 != null) {
// both are prioritized, sort on prioritized file date, last in first out
return datePrioritized2.compareTo(datePrioritized1);
} else if (datePrioritized1 == null && datePrioritized2 == null) {
// both are not prioritized, sort on folder creation date, first in first out
return dateCreated1.compareTo(dateCreated2);
} else if (datePrioritized1 != null) {
// left hand side is prioritized
return -1;
} else {
// datePrioritized2 != null, so right hand side is prioritized
return 1;
}
}
}
/**
* Custom comparator that allows us to sort List<AutoIngestJob> on case name
* alphabetically except for jobs for the current host, which are placed at
* the top of the list.
*/
static class AlphabeticalComparator implements Comparator<AutoIngestJob> {
@Override
public int compare(AutoIngestJob o1, AutoIngestJob o2) {
if (o1.getNodeName().equalsIgnoreCase(localHostName)) {
return -1; // o1 is for current case, float to top
} else if (o2.getNodeName().equalsIgnoreCase(localHostName)) {
return 1; // o2 is for current case, float to top
} else {
return o1.getCaseName().compareToIgnoreCase(o2.getCaseName());
}
}
}
}

View File

@ -0,0 +1,283 @@
AutoIngestDashboard.bnRefresh.text=&Refresh
AutoIngestDashboard.lbCompleted.text=Completed
AutoIngestDashboard.lbRunning.text=Running
AutoIngestDashboard.lbPending.text=Pending
AutoIngestDashboard.bnCancelModule.text=Cancel &Module
AutoIngestDashboard.bnExit.text=&Exit
AutoIngestDashboard.bnOptions.text=&Options
AutoIngestDashboard.JobsTableModel.ColumnHeader.Case=Case
AutoIngestDashboard.JobsTableModel.ColumnHeader.ImageFolder=Image Folder
AutoIngestDashboard.JobsTableModel.ColumnHeader.HostName=Host Name
AutoIngestDashboard.JobsTableModel.ColumnHeader.CreatedTime=Created Time
AutoIngestDashboard.JobsTableModel.ColumnHeader.StartedTime=Started Time
AutoIngestDashboard.JobsTableModel.ColumnHeader.CompletedTime=Completed Time
AutoIngestDashboard.JobsTableModel.ColumnHeader.Activity=Activity
AutoIngestDashboard.JobsTableModel.ColumnHeader.Status=Status
AutoIngestDashboard.bnShowProgress.text=&Show Progress
AutoIngestDashboard.bnResume.text=Resume
AutoIngestDashboard.bnPause.text=Pause
AutoIngestDashboard.bnPause.confirmHeader=Are you sure you want to pause?
AutoIngestDashboard.bnPause.warningText=Pause will occur after the current job completes processing. This could take a long time. Continue?
AutoIngestDashboard.bnPause.toolTipText=Suspend processing of Pending Jobs
AutoIngestDashboard.bnPause.toolTipTextResume=Resume processing of Pending Jobs
AutoIngestDashboard.bnPause.pausing=Pausing after current job completes...
AutoIngestDashboard.bnRefresh.toolTipText=Refresh displayed tables
AutoIngestDashboard.bnShowProgress.toolTipText=Show the progress of the currently running Job. This functionality is only available for jobs running on current AIM node.
AutoIngestDashboard.bnCancelModule.toolTipText=Cancel processing of the current module within the Job and move on to the next module within the Job. This functionality is only available for jobs running on current AIM node.
AutoIngestDashboard.bnExit.toolTipText=Exit Application
AutoIngestDashboard.Cancelling=Cancelling...
AutoIngestDashboard.bnOptions.toolTipText=Display options panel. All processing must be paused to open the options panel.
AutoIngestDashboard.pendingTable.toolTipText=The Pending table displays the order upcoming Jobs will be processed with the top of the list first
AutoIngestDashboard.runningTable.toolTipText=The Running table displays the currently running Job and information about it
AutoIngestDashboard.completedTable.toolTipText=The Completed table shows all Jobs that have been processed already
AutoIngestDashboard.JobsTableModel.ColumnHeader.ActvitiyTime=Run Time
AutoIngestDashboard.JobsTableModel.ColumnHeader.CaseFolder=Case Folder
AutoIngestDashboard.JobsTableModel.ColumnHeader.LocalJob= Local Job?
AutoIngestDashboard.DeletionFailed=Deletion failed for job
AutoIngestDashboard.ShowLogFailed.Title=Unable to display case log
AutoIngestDashboard.ShowLogFailed.Message=Case log file does not exist
AutoIngestDashboard.bnPrioritizeCase.toolTipText=Move all images associated with a case to top of Pending queue.
AutoIngestDashboard.bnPrioritizeCase.text=Prioritize Case
AutoIngestDashboard.ExitConsequences=This will cancel any currently running job on this host. Exiting while a job is running potentially leaves the case in an inconsistent or corrupted state.
AutoIngestDashboard.ExitingStatus=Exiting...
AutoIngestDashboard.OK=OK
AutoIngestDashboard.Cancel=Cancel
AutoIngestDashboard.AutoIngestStartupFailed.Message=Failed to start automated ingest.\nPlease see application log for details.
AutoIngestDashboard.AutoIngestStartupFailed.Title=Automated Ingest Error
AutoIngestDashboard.AutoIngestStartupError=Failed to start automated ingest. Verify Multi-user Settings.
AutoIngestDashboard.AutoIngestStartupWarning.Title=Automated Ingest Warning
AutoIngestDashboard.AutoIngestStartupWarning.Message=Failed to establish remote communications with other automated ingest nodes.\nAuto ingest dashboard will only be able to display local ingest job events.\nPlease verify Multi-User settings (Options->Multi-User). See application log for details.
AutoIngestDashboard.UpdatingSharedConfig=Updating shared configuration
AutoIngestDashboard.SharedConfigurationDisabled=Shared configuration disabled
AutoIngestDashboard.EnableConfigurationSettings=Enable shared configuration from the options panel before uploading
AutoIngestDashboard.ErrorUploadingConfiguration=Error uploading configuration
AutoIngestDashboard.UploadSuccessTitle=Success
AutoIngestDashboard.UploadSuccess=Shared configuration successfully uploaded
AutoIngestDashboard.UploadFailedTitle=Failed
AutoIngestDashboard.ConfigLocked=The shared configuration directory is locked because upload from another node is in progress. \nIf this is an error, you can unlock the directory and then retry the upload.
AutoIngestDashboard.ConfigLockedTitle=Configuration directory locked
AutoIngestDashboard.tbServicesStatusMessage.Message=Case databases {0}, keyword search {1}, coordination {2}, messaging {3}
AutoIngestDashboard.tbServicesStatusMessage.Message.Up=up
AutoIngestDashboard.tbServicesStatusMessage.Message.Down=down
AutoIngestDashboard.tbServicesStatusMessage.Message.Unknown=unknown
ConfirmationDialog.DoNotDelete=Do not delete
ConfirmationDialog.Delete=Permanently delete
ConfirmationDialog.DeleteAreYouSure=The entire case will be removed. Are you sure you want to delete case
ConfirmationDialog.ConfirmDeletion=Do you really want to cancel copy job
ConfirmationDialog.ConfirmDeletionHeader=Confirm Deletion
ConfirmationDialog.QuestionMark=?
ConfirmationDialog.DoNotCancelModule=Do Not Cancel Module
ConfirmationDialog.DoNotCancelJob=Do Not Cancel Job
ConfirmationDialog.DoNotCancel=Do not cancel
ConfirmationDialog.Cancel=Proceed with cancellation
ConfirmationDialog.CancelJob=Cancel Job
ConfirmationDialog.CancelModule=Cancel Module
ConfirmationDialog.CancelModuleAreYouSure=The analysis of the ingest module processing the current job will be canceled. Are you sure?
ConfirmationDialog.CancelJobAreYouSure=The currently running job will be canceled. Are you sure?
ConfirmationDialog.ConfirmCancellationHeader=Confirm Cancellation
ConfirmationDialog.Exit=Exit
ConfirmationDialog.DoNotExit=Do Not Exit
ConfirmationDialog.ConfirmExit=All incomplete copy jobs will be cancelled. Are you sure?
ConfirmationDialog.ConfirmExitHeader=Confirm Exit
ReviewModeCasePanel.bnRefresh.text=&Refresh
ReviewModeCasePanel.bnOpen.text=&Open
ReviewModeCasePanel.rbGroupLabel.text=Show Last 10:
ReviewModeCasePanel.rbDays.text=Days
ReviewModeCasePanel.rbWeeks.text=Weeks
ReviewModeCasePanel.rbMonths.text=Months
ReviewModeCasePanel.rbAllCases.text=Everything
ReviewModeCasePanel.cannotOpenCase=Cannot Open Case
ReviewModeCasePanel.casePathNotFound=Case path not found
ReviewModeCasePanel.caseIsLocked=Single-user case is locked.
DisplayLogDialog.cannotOpenLog=Unable to open the selected case log file
DisplayLogDialog.cannotFindLog=Unable to find the selected case log file
DisplayLogDialog.unableToShowLogFile=Unable to show log file
DisplayLogDialog.okay=Okay
ReviewModeCasePanel.bnShowLog.text=&Show Log
CopyFilesPanel.lbFrom.text=From Source
CopyFilesPanel.lbTo.text=Destination Case
CopyFilesPanel.bnCopy.text=&Copy
CopyFilesPanel.bnCancel.text=C&ancel
CopyFilesPanel.lbStatus.text=Status
CopyFilesPanel.tbCaseName.text=
CopyFilesPanel.tbSourceName.text=
CopyFilesPanel.bnCaseName.text=B&rowse
CopyFilesPanel.bnSourceName.text=&Browse
CopyFilesPanel.spRetryCount.toolTipText=Skip this copy job and move on to the next after failing this number of times.
CopyFilesPanel.rbExistingCase.text=
CopyFilesPanel.rbNewCase.text=
CopyFilesPanel.lbFailureText.text=failures
CopyFilesPanel.lpSkipAfterText.text=Skip after
CopyFilesPanel.lbExistingCase.text=Use Existing Case
CopyFilesPanel.lbNewCase.text=Create New Case
CopyFilesPanel.lbTitle.text=Schedule New Copy Job
CopyFilesPanel.confirmCancellation=Do you really want to cancel the copy operation?
CopyFilesPanel.confirmCopyHeader=Confirm Copy to Existing Case
CopyFilesPanel.confirmCopyAdd=exists. Do you really want to copy more files to this Case?
CopyFilesPanel.confirmCopyYes=Copy
CopyFilesPanel.confirmCopyNo=Do not copy
CopyFilesPanel.lbScheduledJobs.text=Scheduled Copy Jobs
CopyFilesPanel.lbRunningJob.text=Running Copy Job
CopyFilesPanel.lbCompletedJobs.text=Completed Copy Jobs
CopyFilesPanel.Source=Source
CopyFilesPanel.Destination=Destination
CopyFilesPanel.Initiated=Initiated
CopyFilesPanel.Started=Started
CopyFilesPanel.RunTime=Run Time
CopyFilesPanel.Status=State
CopyFilesPanel.tableCompletedJobs.toolTipText=Shows completed copy jobs and status
CopyFilesPanel.toolTipText=Shows the currently running copy job.
CopyFilesPanel.lbWait.text=Wait
CopyFilesPanel.lbWaitMinutesText.text=minutes before retrying
CopyFilesPanel.bnUp.text=
CopyFilesPanel.bnDown.text=
CopyFilesPanel.bnShowLog.text=&Show Log
CopyFilesPanel.tablePendingJobs.toolTipText=Scheduled copy jobs in the order they will complete, starting from the top.
CopyFilesPanel.lbPendingJobs.text=Scheduled Copy Jobs
CopyFilesPanel.chooseOrCreate=Please choose or create a Case
CopyFilesPanel.invalidCasePath=Invalid case path
CopyFilesPanel.empty=
CopyFilesPanel.failedToDeleteSome=Failed to delete some files in cancelled job
CopyFilesPanel.noRunningJob=No running copy job to cancel
CopyFilesPanel.destinationEmpty=Destination cannot be within Source
CopyFilesPanel.copyAborted=Copy aborted. No copying occurred.
CopyFilesPanel.copying=Copying...
CopyFilesPanel.copySuccess=Files successfully copied.
CopyFilesPanel.errorCopying=Error copying.
CopyFilesPanel.permissionDenied=Permission denied. Check permissions on source and destination directories.
CopyFilesPanel.retriesLeft=retries left. Waiting to retry.
CopyFilesPanel.noRetriesLeft=Error copying. All retries used. Skipping.
CopyFilesPanel.cancelled=Cancelled running copy job
CopyFilesPanel.deleteConfirmed=Copy job cancelled
CopyFilesPanel.deleteNotConfirmed=Copy job not cancelled
CopyFilesPanel.deleteUnable=Unable to cancel copy job
CopyFilesPanel.unableToOpenLogfile=Unable to open logfile
CopyFilesPanel.invalidSourcePath=Invalid source path
CopyFilesPanel.lbScheduledJobs.text=Scheduled Copy Jobs (Placeholder)
CopyFilesPanel.ConfirmCancellation=Do you really want to cancel the copy operation?
CopyFilesPanel.ConfirmCopyHeader=Confirm Copy to Existing Case
CopyFilesPanel.ConfirmCopyAdd=exists. Do you really want to copy more files to this Case?
CopyFilesPanel.ConfirmCopyYes=Copy
CopyFilesPanel.ConfirmCopyNo=Do not copy
ConfirmationDialog.ConfirmUnlockHeader=Confirm Case Unlock
ReviewModeCasePanel.bnShowLog.text=&Show Log
AutoIngestDashboard.bnPrioritizeCase.toolTipText=Move all images associated with a case to top of Pending queue.
AutoIngestDashboard.bnPrioritizeCase.text=Prioriti&ze Case
AutoIngestDashboard.bnShowCaseLog.toolTipText=Display case log file for selected case
AutoIngestDashboard.bnShowCaseLog.text=Show &Log
ReviewModeCasePanel.bnShowLog.toolTipText=Display case log file for selected case
CopyFilesPanel.bnCancelPendingJob.text=Ca&ncel
CopyFilesPanel.tbDestinationCase.text=
CopyFilesPanel.cbThrottleNetwork.text=&Throttle Network
CopyFilesPanel.cbThrottleNetwork.toolTipText=<html>Select this box if a low-bandwidth network connection is involved in this copy job.<br>\nSelecting this box will artificially limit the transfer speed by inserting strategic delays.<br>\nThis helps copy files across low-bandwidth networks where the transfer would<br>\notherwise fail. Only select this if you are having problems copying across the network.</html>
CopyFilesPanel.bnShowCurrentLog.text=Show &Log
CopyFilesPanel.bnShowCurrentLog.text=Show &Log
AutoIngestDashboard.bnCancelJob.toolTipText=Cancel processing of the current Job and move on to the next Job. This functionality is only available for jobs running on current AIM node.
AutoIngestDashboard.bnCancelJob.text=&Cancel Job
AutoIngestDashboard.bnDeleteCase.toolTipText=Delete the selected Case in its entirety
AutoIngestDashboard.bnDeleteCase.text=&Delete Case
CopyFilesPanel.lbCaseName.text=Case Name
CaseStatusIconCellRenderer.tooltiptext.ok=Images processed successfully
CaseStatusIconCellRenderer.tooltiptext.warning=An error occurred or processing was canceled for at least one image - please check the log
CaseImportPanel.ChooseCase=Choose a case to import
CaseImportPanel.ChooseSource=Choose source images
CaseImportPanel.DatabaseConnected=Database connected
CaseImportPanel.DatabaseNotConnected=Verify Multi-user database settings.
CaseImportPanel.ImportingCases=Importing case(s)...
CaseImportPanel.Cancelling=Cancelling
CaseImportPanel.CannotOpenLog=Unable to open log file
CaseImportPanel.BadCaseSourceFolder=Bad case source folder name
CaseImportPanel.BadCaseDestinationFolder=Bad case destination folder name
CaseImportPanel.BadImageSourceFolder=Bad image source folder name
CaseImportPanel.BadImageDestinationFolder=Bad image destination folder name
CaseImportPanel.Error=Error
CaseImportPanel.Complete=Complete
CaseImportPanel.Blank=
CaseImportPanel.DeleteWarning=Make sure no important files are in the case source directory
AutoIngestDashboard.lbStatus.text=Status:
AutoIngestDashboard.bnPrioritizeFolder.text=Prioritize &Folder
AutoIngestDashboard.bnPrioritizeFolder.toolTipText=Move this folder to the top of the Pending queue.
SingleUserCaseImporter.NonUniqueOutputFolder=Output folder not unique. Skipping
SingleUserCaseImporter.WillImport=Will import:
SingleUserCaseImporter.None=None
SingleUserCaseImporter.WillNotImport=Will not import:
SingleUserCaseImporter.ContinueWithImport=Continue with import?
SingleUserCaseImporter.Cancelled=Cancelled
SingleUserCaseImporter.ImportedAsMultiUser=\nThis case was imported as a multi-user collaborative case on
SingleUserCaseImporter.StartingBatch=Starting batch processing of
SingleUserCaseImporter.to=to
SingleUserCaseImporter.ErrorFindingAutFiles=Error trying to find .aut files to import
SingleUserCaseImporter.StartedProcessing=Started processing
SingleUserCaseImporter.FinishedProcessing=Finished processing
SingleUserCaseImporter.FailedToComplete=Failed to complete processing of
SingleUserCaseImporter.CompletedBatch=Completed batch processing of
SingleUserCaseImporter.AbortingBatch=Aborting batch processing of
SingleUserCaseImporter.SourceImageMissing=. Source image missing for
ReviewModeCasePanel.bnOptions.text=Op&tions
ReviewModeCasePanel.CaseHeaderText=Case
ReviewModeCasePanel.CreatedTimeHeaderText=Created Time
ReviewModeCasePanel.StatusIconHeaderText=Status
ReviewModeCasePanel.OutputFolderHeaderText=Output Folder
ReviewModeCasePanel.LastAccessedTimeHeaderText=Last Accessed Time
CopyFilesPanel.bnOptions.text=&Options
AutoIngestDashboard.lbServicesStatus.text=Services Status:
AutoIngestDashboard.tbServicesStatusMessage.text=
AutoIngestDashboard.tbStatusMessage.text=
FileExporterSettingsPanel.ChooseRootDirectory=Choose a root directory for file output
FileExporterSettingsPanel.ChooseReportDirectory=Choose a report directory
FileExporterSettingsPanel.RuleName=Rule Name
FileExporterSettingsPanel.RootDirectory=Root Directory
FileExporterSettingsPanel.ReportDirectory=Report Directory
FileExporterSettingsPanel.AttributeValue=Value to compare against
FileExporterSettingsPanel.RuleListTooltip=Shows a list of rules.
FileExporterSettingsPanel.RuleOutputTooltip=This is the root output folder for saved output. You must have read and write access for this folder.
FileExporterSettingsPanel.MimetypeTooltip=Select the MIME Type to compare against.
FileExporterSettingsPanel.MimetypeText=MIME Type
FileExporterSettingsPanel.MimetypeCheckboxTooltip=Check this to filter based on MIME Type.
FileExporterSettingsPanel.FileSizeValueToolTip=Select the value to compare against.
FileExporterSettingsPanel.FileSizeUnitToolTip=Select the units of the file size value.
FileExporterSettingsPanel.FileSize=File Size
FileExporterSettingsPanel.FileSizeComparisonTooltip=Select the file size comparison operator.
FileExporterSettingsPanel.MimeTypeComparisonTooltip=Select the MIME Type comparison operator.
FileExporterSettingsPanel.CurrentlySelectedRuleNameTooltip=Shows the currently selected rule's name.
FileExporterSettingsPanel.SaveText=Save Rule
FileExporterSettingsPanel.SaveTooltip=Click to save the rule. There must be a rule name and at least one conditional (checkbox) enabled.
FileExporterSettingsPanel.BrowseText=Browse
FileExporterSettingsPanel.BrowseRootOutputFolder=Browse to set the root output folder.
FileExporterSettingsPanel.NewText=New Rule
FileExporterSettingsPanel.NewRuleTooltip=Clears the rule editor, allowing the user to enter a new rule.
FileExporterSettingsPanel.BrowseReportTooltip=Browse to set the report output folder.
FileExporterSettingsPanel.ReportOutputFolderTooltip=This is the report output folder. You must have read and write access for this folder.
FileExporterSettingsPanel.DeleteText=Delete Rule
FileExporterSettingsPanel.DeleteTooltip=Deletes the selected rule.
FileExporterSettingsPanel.UnsavedChangesLost=Unsaved rule changes will be lost. Continue?
FileExporterSettingsPanel.ChangesWillBeLost=Unsaved changes will be lost.
FileExporterSettingsPanel.DoYouWantToSave=Do you want to save?
FileExporterSettingsPanel.BadRootFolder=Bad root folder chosen.
FileExporterSettingsPanel.BadFolderForInterestingFileExport=Bad folder for file export
FileExporterSettingsPanel.BadReportFolder=Bad report folder chosen.
FileExporterSettingsPanel.ReallyDeleteRule=Really delete rule
FileExporterSettingsPanel.ReallyDeleteCondition=Really delete condition
FileExporterSettingsPanel.QuestionMark=?
FileExporterSettingsPanel.ConfirmRuleDeletion=Confirm rule deletion
FileExporterSettingsPanel.ConfirmClauseDeletion=Confirm clause deletion
FileExporterSettingsPanel.Title=File Export Rule Generator
FileExporterSettingsPanel.UnableToFindDirectory=Unable to find directory.
FileExporterSettingsPanel.PermissionsInvalid=Invalid folder permissions. Can not read or write.
FileExporterSettingsPanel.RuleNotSaved=Malformed rule. Rule not saved.
FileExporterSettingsPanel.MalformedRule=Malformed rule.
FileExporterSettingsPanel.FileSize_1=Select to include file size in the rule
FileExporterSettingsPanel.MimetypeCheckboxTooltip_1=Select to include MIME type in the rule
FileExporterSettingsPanel.MimeTypeComparisonTooltip_1=Select the conditional operator
FileExporterSettingsPanel.FileSizeComparisonTooltip_1=Select the conditional operator
FileExporterSettingsPanel.FileSizeValueToolTip_1=Select the desired file size
FileExporterSettingsPanel.FileSizeUnitToolTip_1=Select the desired file size units
FileExporterSettingsPanel.MimetypeTooltip_1=Select the desired MIME type
FileExporterSettingsPanel.CurrentlySelectedRuleNameTooltip_1=The name of the rule
FileExporterSettingsPanel.ReportOutputFolderTooltip_1=The Reports folder where a JSON report is written out for each exported file.
FileExporterSettingsPanel.RuleOutputTooltip_1=The Files folder where each matching file is written out
FileExporterSettingsPanel.BrowseRootOutputFolder_1=Browse for the Files Folder
FileExporterSettingsPanel.BrowseReportTooltip_1=Browse for the Reports Folder
FileExporterSettingsPanel.NewRuleTooltip_1=Clear the rule editor to begin a new rule
FileExporterSettingsPanel.DeleteTooltip_1=Delete the selected rule
FileExporterSettingsPanel.SaveTooltip_1=Save the current rule

View File

@ -0,0 +1,27 @@
/*
* 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.autoingest;
public enum CaseStatus {
OK,
CANCELLATIONS,
INTERRUPTS,
ERRORS
}

View File

@ -0,0 +1,62 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2015 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.autoingest;
import java.awt.Component;
import javax.swing.ImageIcon;
import javax.swing.JTable;
import static javax.swing.SwingConstants.CENTER;
import org.openide.util.ImageUtilities;
/**
* A JTable cell renderer that represents a CaseStatus object as a
* center-aligned icon, and grays out the cell if the table is disabled.
*/
class CaseStatusIconCellRenderer extends GrayableCellRenderer {
private static final long serialVersionUID = 1L;
static final ImageIcon checkedIcon = new ImageIcon(ImageUtilities.loadImage("org/sleuthkit/autopsy/images/tick.png", false));
static final ImageIcon warningIcon = new ImageIcon(ImageUtilities.loadImage("org/sleuthkit/autopsy/images/warning16.png", false));
CaseStatusIconCellRenderer() {
setHorizontalAlignment(CENTER);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if ((value instanceof CaseStatus)) {
switch ((CaseStatus) value) {
case CANCELLATIONS:
case ERRORS:
case INTERRUPTS:
setIcon(warningIcon);
setToolTipText(org.openide.util.NbBundle.getMessage(CaseStatusIconCellRenderer.class, "CaseStatusIconCellRenderer.tooltiptext.warning"));
break;
case OK:
default:
setIcon(checkedIcon);
setToolTipText(org.openide.util.NbBundle.getMessage(CaseStatusIconCellRenderer.class, "CaseStatusIconCellRenderer.tooltiptext.ok"));
break;
}
}
grayCellIfTableNotEnabled(table, isSelected);
return this;
}
}

View File

@ -0,0 +1,34 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2015 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.autoingest;
import static javax.swing.SwingConstants.CENTER;
/**
* A JTable cell renderer that center-aligns cell content and grays out the cell
* if the table is disabled.
*/
class CenteredGrayableCellRenderer extends GrayableCellRenderer {
private static final long serialVersionUID = 1L;
public CenteredGrayableCellRenderer() {
setHorizontalAlignment(CENTER);
}
}

View File

@ -0,0 +1,74 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2015 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.autoingest;
import java.awt.Component;
import java.time.Duration;
import javax.swing.JTable;
import static javax.swing.SwingConstants.CENTER;
/**
* A JTable cell renderer that renders a duration represented as a long as a
* string with days, hours, minutes, and seconds components. It center-aligns
* cell content and grays out the cell if the table is disabled.
*/
class DurationCellRenderer extends GrayableCellRenderer {
private static final long serialVersionUID = 1L;
DurationCellRenderer() {
setHorizontalAlignment(CENTER);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value instanceof Long) {
{
Duration d = Duration.ofMillis((long) value);
if (d.isNegative()) {
d = Duration.ofMillis(-(long) value);
}
String result;
long days = d.toDays();
long hours = d.minusDays(days).toHours();
long minutes = d.minusDays(days).minusHours(hours).toMinutes();
long seconds = d.minusDays(days).minusHours(hours).minusMinutes(minutes).getSeconds();
if (minutes > 0) {
if (hours > 0) {
if (days > 0) {
result = days + " d " + hours + " h " + minutes + " m " + seconds + " s";
} else {
result = hours + " h " + minutes + " m " + seconds + " s";
}
} else {
result = minutes + " m " + seconds + " s";
}
} else {
result = seconds + " s";
}
setText(result);
}
}
grayCellIfTableNotEnabled(table, isSelected);
return this;
}
}

View File

@ -0,0 +1,70 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2015 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.autoingest;
import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import static javax.swing.SwingConstants.LEFT;
import javax.swing.table.DefaultTableCellRenderer;
/**
* A JTable cell renderer that left-aligns cell content and grays out the cell
* if the table is disabled.
*/
class GrayableCellRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
GrayableCellRenderer() {
setHorizontalAlignment(LEFT);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (null != value) {
setText(value.toString());
}
grayCellIfTableNotEnabled(table, isSelected);
return this;
}
void grayCellIfTableNotEnabled(JTable table, boolean isSelected) {
if (table.isEnabled()) {
/*
* The table is enabled, make the foreground and background the
* normal selected or unselected color.
*/
if (isSelected) {
setBackground(table.getSelectionBackground());
setForeground(table.getSelectionForeground());
} else {
setBackground(table.getBackground());
setForeground(table.getForeground());
}
} else {
/*
* The table is disabled, make the foreground and background gray.
*/
setBackground(Color.lightGray);
setForeground(Color.darkGray);
}
}
}

View File

@ -0,0 +1,49 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2015 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.autoingest;
import java.awt.Component;
import java.text.SimpleDateFormat;
import javax.swing.JTable;
import static javax.swing.SwingConstants.CENTER;
/**
* A JTable cell renderer that renders a date represented as a long as a
* center-aligned, long-format date string. It also grays out the cell if the
* table is disabled.
*/
class LongDateCellRenderer extends GrayableCellRenderer {
private static final long serialVersionUID = 1L;
private static final String FORMAT_STRING = "yyyy/MM/dd HH:mm:ss"; //NON-NLS
private static final SimpleDateFormat dateFormat = new SimpleDateFormat(FORMAT_STRING);
public LongDateCellRenderer() {
setHorizontalAlignment(CENTER);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value != null) {
setText(dateFormat.format(value));
}
grayCellIfTableNotEnabled(table, isSelected);
return this;
}
}

View File

@ -0,0 +1,214 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2015 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.autoingest;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import org.sleuthkit.autopsy.casemodule.CaseMetadata;
import org.sleuthkit.autopsy.casemodule.GeneralFilter;
import org.sleuthkit.autopsy.coreutils.Logger;
final class PathUtils {
private static final Logger logger = Logger.getLogger(PathUtils.class.getName());
private static final List<String> CASE_METADATA_FILE_EXTS = Arrays.asList(new String[]{CaseMetadata.getFileExtension()});
private static final GeneralFilter caseMetadataFileFilter = new GeneralFilter(CASE_METADATA_FILE_EXTS, "Autopsy Case File");
/**
* Searches a given folder for the most recently modified case folder for a
* case.
*
* @param folderToSearch The folder to be searched.
* @param caseName The name of the case for which a case folder is to
* be found.
*
* @return The path of the case folder, or null if it is not found.
*/
static Path findCaseFolder(Path folderToSearch, String caseName) {
File searchFolder = new File(folderToSearch.toString());
if (!searchFolder.isDirectory()) {
return null;
}
Path caseFolderPath = null;
String[] candidateFolders = searchFolder.list(new CaseFolderFilter(caseName));
long mostRecentModified = 0;
for (String candidateFolder : candidateFolders) {
File file = new File(candidateFolder);
if (file.lastModified() >= mostRecentModified) {
mostRecentModified = file.lastModified();
caseFolderPath = Paths.get(folderToSearch.toString(), file.getPath());
}
}
return caseFolderPath;
}
/**
* Gets a listing of case folders in a given folder.
*
* @param folderToSearch The path of the folder to search.
*
* @return A list of the output case folder paths.
*/
static List<Path> findCaseFolders(Path folderToSearch) {
File searchFolder = new File(folderToSearch.toString());
if (!searchFolder.isDirectory()) {
return Collections.emptyList();
}
String[] caseFolders = searchFolder.list(new CaseFolderFilter(null));
List<Path> caseFolderPaths = new ArrayList<>();
for (String path : caseFolders) {
caseFolderPaths.add(Paths.get(folderToSearch.toString(), path));
}
return caseFolderPaths;
}
/**
* Determines whether or not there is a case metadata file in a given
* folder.
*
* @param folderPath Path to the folder to search.
*
* @return True or false.
*/
static boolean hasCaseMetadataFile(Path folderPath) {
/**
* TODO: If need be, this can be rewritten without the FilenameFilter so
* that it does not necessarily visit every file in the folder.
*/
File folder = folderPath.toFile();
if (!folder.isDirectory()) {
return false;
}
String[] caseDataFiles = folder.list((File folder1, String fileName) -> {
File file = new File(folder1, fileName);
if (file.isFile()) {
return caseMetadataFileFilter.accept(file);
}
return false;
});
return caseDataFiles.length != 0;
}
/**
* Extracts the path to the case images folder path from an image folder
* path.
*
* @param rootImageFoldersPath The root image folders path.
* @param imageFolderPath The image folder path.
*
* @return The root input folder path for a case.
*/
static Path caseImagesPathFromImageFolderPath(Path rootImageFoldersPath, Path imageFolderPath) {
return rootImageFoldersPath.resolve(imageFolderPath.subpath(0, rootImageFoldersPath.getNameCount() + 1).getFileName());
}
/**
* Extracts the case name from an image folder path.
*
* @param rootImageFoldersPath The root image folders path.
* @param imageFolderPath The image folder path.
*
* @return The case name.
*/
static String caseNameFromImageFolderPath(Path rootImageFoldersPath, Path imageFolderPath) {
Path caseImagesPath = PathUtils.caseImagesPathFromImageFolderPath(rootImageFoldersPath, imageFolderPath);
return caseImagesPath.getFileName().toString();
}
/**
* Extracts the case name from a case folder path.
*
* @param caseFolderPath A case folder path.
*
* @return A case name, with the time stamp suffix removed.
*/
static String caseNameFromCaseFolderPath(Path caseFolderPath) {
String caseName = caseFolderPath.getFileName().toString();
if (caseName.length() > TimeStampUtils.getTimeStampLength()) {
return caseName.substring(0, caseName.length() - TimeStampUtils.getTimeStampLength());
} else {
return caseName;
}
}
/**
* Creates a case folder path. Does not create the folder described by the
* path.
*
* @param caseFoldersPath The root case folders path.
* @param caseName The name of the case.
*
* @return A case folder path with a time stamp suffix.
*/
static Path createCaseFolderPath(Path caseFoldersPath, String caseName) {
String folderName = caseName + "_" + TimeStampUtils.createTimeStamp();
return Paths.get(caseFoldersPath.toString(), folderName);
}
private static class CaseFolderFilter implements FilenameFilter {
private final String caseName;
CaseFolderFilter(String caseName) {
this.caseName = caseName;
}
@Override
public boolean accept(File folder, String fileName) {
File file = new File(folder, fileName);
if (file.isDirectory() && fileName.length() > TimeStampUtils.getTimeStampLength()) {
Path filePath = Paths.get(file.getPath());
try {
if (!StateFile.exists(filePath, StateFile.Type.DELETED)) {
if (TimeStampUtils.endsWithTimeStamp(fileName)) {
if (null != caseName) {
String fileNamePrefix = fileName.substring(0, fileName.length() - TimeStampUtils.getTimeStampLength());
if (fileNamePrefix.equals(caseName)) {
return hasCaseMetadataFile(filePath);
}
} else {
return hasCaseMetadataFile(filePath);
}
}
}
} catch (IOException ex) {
logger.log(Level.SEVERE, String.format("Failed to access %s", file.getPath()), ex);
}
}
return false;
}
}
/**
* Supress creation of instances of this class.
*/
private PathUtils() {
}
}

View File

@ -0,0 +1,49 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2015 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.autoingest;
import java.awt.Component;
import java.text.SimpleDateFormat;
import javax.swing.JTable;
import static javax.swing.SwingConstants.CENTER;
/**
* A JTable cell renderer that renders a date represented as a long as a
* center-aligned, short-format date string. It also grays out the cell if the
* table is disabled.
*/
class ShortDateCellRenderer extends GrayableCellRenderer {
private static final long serialVersionUID = 1L;
private static final String FORMAT_STRING = "MM/dd HH:mm"; //NON-NLS
private static final SimpleDateFormat dateFormat = new SimpleDateFormat(FORMAT_STRING);
public ShortDateCellRenderer() {
setHorizontalAlignment(CENTER);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value != null) {
setText(dateFormat.format(value));
}
grayCellIfTableNotEnabled(table, isSelected);
return this;
}
}

View File

@ -0,0 +1,84 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2015 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.autoingest;
import java.io.IOException;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.Path;
final class StateFile {
enum Type {
READY("state.ready"),
PROCESSING("state.processing"),
CANCELLED("state.cancelled"),
DONE("state.done"),
ERROR("state.error"),
COPY_ERROR("state.copyerror"),
DELETED("state.deleted"),
INTERRUPTED("state.interrupted"),
PRIORITIZED("state.prioritized");
private final String fileName;
private Type(String fileName) {
this.fileName = fileName;
}
String fileName() {
return fileName;
}
}
static boolean exists(Path folderPath, Type stateFileType) throws IOException {
return folderPath.resolve(stateFileType.fileName()).toFile().exists();
}
static void create(Path folderPath, Type stateFileType) throws IOException {
Files.createFile(folderPath.resolve(stateFileType.fileName()));
}
static void createIfDoesNotExist(Path folderPath, Type stateFileType) throws IOException {
try {
Files.createFile(folderPath.resolve(stateFileType.fileName()));
} catch (FileAlreadyExistsException ignored) {
/**
* The file already exists, the exception is not exceptional.
*/
}
}
static void delete(Path folderPath, Type stateFileType) throws IOException {
Files.delete(folderPath.resolve(stateFileType.fileName()));
}
static void deleteIfExists(Path folderPath, Type stateFileType) throws IOException {
Files.deleteIfExists(folderPath.resolve(stateFileType.fileName()));
}
/**
* Private, do-nothing constructor to suppress creation of instances of this
* class.
*/
private StateFile() {
}
}

View File

@ -0,0 +1,104 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2015 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.autoingest;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Utility methods for working with strings with the time-stamp suffixes used by
* auto ingest.
*/
public final class TimeStampUtils {
/*
* Sample time stamp suffix: 2015_02_02_12_10_31
*/
private static final Pattern timeStampPattern = Pattern.compile("\\d{4}_\\d{2}_\\d{2}_\\d{2}_\\d{2}_\\d{2}$");
private static final int LENGTH_OF_DATE_TIME_STAMP = 20; // length of the above time stamp
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
/**
* Checks whether a string ends with an auto ingest time stamp.
*
* @param inputString The string to check.
*
* @return True or false.
*/
public static boolean endsWithTimeStamp(String inputString) {
Matcher m = timeStampPattern.matcher(inputString);
return m.find();
}
/**
* Gets the fixed length of the auto-ingest time stamp suffix.
*
* @return The length.
*/
public static int getTimeStampLength() {
return LENGTH_OF_DATE_TIME_STAMP;
}
/**
* Creates an auto ingest time stamp suffix using the current time.
*
* @return The suffix.
*/
public static String createTimeStamp() {
return dateFormat.format(Calendar.getInstance().getTime());
}
/**
* Removes an auto ingest timestamp suffix, if it present.
*
* @param inputString The string to trim.
*
* @return The trimmed string.
*/
public static String removeTimeStamp(String inputString) {
String trimmedString = inputString;
if (inputString != null && endsWithTimeStamp(inputString)) {
trimmedString = inputString.substring(0, inputString.length() - getTimeStampLength());
}
return trimmedString;
}
/**
* Gets the auto ingest time stamp suffix from a string, if it is present.
*
* @param inputString the name to check for a timestamp
*
* @return The time stamp, may be the empty.
*/
public static String getTimeStampOnly(String inputString) {
String timeStamp = "";
if (inputString != null && endsWithTimeStamp(inputString)) {
timeStamp = inputString.substring(inputString.length() - getTimeStampLength(), inputString.length());
}
return timeStamp;
}
/*
* Private contructor to prevent instantiation.
*/
private TimeStampUtils() {
}
}

View File

@ -208,6 +208,10 @@ RecentCases.exception.caseIdxOutOfRange.msg=Recent case index {0} is out of rang
RecentCases.getName.text=Clear Recent Cases
RecentItems.openRecentCase.msgDlg.text=Case {0} no longer exists.
StartupWindow.title.text=Welcome
StartupWindow.AutoIngestMode=Automated Ingest Node
StartupWindow.ReviewMode=Cases
StartupWindow.CopyAndImportMode=Utilities
StartupWindow.CaseImportMode=Single User Case Import
UpdateRecentCases.menuItem.clearRecentCases.text=Clear Recent Cases
UpdateRecentCases.menuItem.empty=-Empty-
AddImageWizardIngestConfigPanel.CANCEL_BUTTON.text=Cancel

View File

@ -18,16 +18,24 @@
*/
package org.sleuthkit.autopsy.casemodule;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JTabbedPane;
import javax.swing.WindowConstants;
import org.openide.LifecycleManager;
import org.openide.util.NbBundle;
import org.openide.util.lookup.ServiceProvider;
import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.autopsy.coreutils.NetworkUtils;
import org.sleuthkit.autopsy.autoingest.AutoIngestDashboard;
/**
* The default implementation of the Autopsy startup window
@ -39,9 +47,14 @@ public final class StartupWindow extends JDialog implements StartupWindowInterfa
private static final String TITLE = NbBundle.getMessage(StartupWindow.class, "StartupWindow.title.text");
private static Dimension DIMENSIONS = new Dimension(750, 400);
private static CueBannerPanel welcomeWindow;
//ELTODO private ReviewModeCasePanel caseManagementPanel = null;
//ELTODO private CaseImportPanel caseImportPanel = null;
private JTabbedPane copyPane = new JTabbedPane();
private static final String localHostName = NetworkUtils.getLocalHostName();
public StartupWindow() {
super(WindowManager.getDefault().getMainWindow(), TITLE, true);
//ELTODO super(WindowManager.getDefault().getMainWindow(), TITLE, true); // ELTODO do we need this??
super(new JFrame(TITLE), TITLE, true); // ELTODO last parameter - modal - used to be set to "false"
init();
}
@ -50,38 +63,36 @@ public final class StartupWindow extends JDialog implements StartupWindowInterfa
*/
private void init() {
setModalityType(ModalityType.APPLICATION_MODAL); // ELTODO this was moved over, do we need this?
Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
// set the popUp window / JFrame
setSize(DIMENSIONS);
int w = this.getSize().width;
int h = this.getSize().height;
int w = getSize().width;
int h = getSize().height;
// set the location of the popUp Window on the center of the screen
setLocation((screenDimension.width - w) / 2, (screenDimension.height - h) / 2);
setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
welcomeWindow = new CueBannerPanel();
// add the command to close the window to the button on the Volume Detail Panel
welcomeWindow.setCloseButtonActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
close();
}
});
add(welcomeWindow);
//ELTODO setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
addPanelForMode();
pack();
setResizable(false);
}
@Override
public void open() {
welcomeWindow.refresh();
setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
//ELTODO if (caseManagementPanel != null) {
//ELTODO caseManagementPanel.updateView();
//ELTODO caseManagementPanel.setCursor(Cursor.getDefaultCursor());
//ELTODO }
if (welcomeWindow != null) {
welcomeWindow.refresh();
}
this.setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
setVisible(true);
}
@ -92,4 +103,55 @@ public final class StartupWindow extends JDialog implements StartupWindowInterfa
public void close() {
this.setVisible(false);
}
/**
* Adds a panel to the dialog based on operational mode selected by the
* user.
*/
private void addPanelForMode() {
UserPreferences.SelectedMode mode = UserPreferences.getMode();
switch (mode) {
case AUTOMATED:
this.setTitle(NbBundle.getMessage(StartupWindow.class, "StartupWindow.AutoIngestMode") + " (" + localHostName + ")");
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
AutoIngestDashboard.getInstance().shutdown();
}
});
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
add(AutoIngestDashboard.getInstance());
break;
case REVIEW:
this.setTitle(NbBundle.getMessage(StartupWindow.class, "StartupWindow.ReviewMode") + " (" + localHostName + ")");
//ELTODO caseManagementPanel = new ReviewModeCasePanel(this);
//ELTODO add(caseManagementPanel);
break;
case COPYFILES:
this.setTitle(NbBundle.getMessage(StartupWindow.class, "StartupWindow.CopyAndImportMode") + " (" + localHostName + ")");
//ELTODO caseImportPanel = new CaseImportPanel();
//ELTODO copyPane.add(NbBundle.getMessage(StartupWindow.class, "StartupWindow.CaseImportMode"), caseImportPanel);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
LifecycleManager.getDefault().exit();
}
});
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
//ELTODO add(copyPane);
break;
default:
welcomeWindow = new CueBannerPanel();
// add the command to close the window to the button on the Volume Detail Panel
welcomeWindow.setCloseButtonActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
close();
}
});
add(welcomeWindow);
break;
}
}
}

View File

@ -40,6 +40,26 @@ import org.sleuthkit.datamodel.TskData.DbType;
*/
public final class UserPreferences {
public enum SelectedMode {
STANDALONE,
AUTOMATED,
REVIEW,
COPYFILES
};
private static final String MODE = "Mode"; // NON-NLS
private static final String AUTO_MODE_IMAGES_FOLDER = "AutoModeImageFolder"; // NON-NLS
private static final String AUTO_MODE_RESULTS_FOLDER = "AutoModeResultsFolder"; // NON-NLS
private static final String SHARED_CONFIG_FOLDER = "SharedSettingsFolder"; // NON-NLS
private static final String SHARED_CONFIG_ENABLED = "SharedSettingsEnabled"; // NON-NLS
private static final String SHARED_CONFIG_MASTER = "SharedSettingsMaster"; // NON-NLS
private static final String AUTO_MODE_CONTEXT_STRING = "AutoModeContext"; // NON-NLS
private static final String COPY_MODE_SOURCE_FOLDER = "CopyModeSourceFolder"; // NON-NLS
private static final String SLEEP_BETWEEN_CASES_TIME = "SleepBetweenCasesTime"; // NON-NLS
private static final String MAX_NUM_TIMES_TO_PROCESS_IMAGE = "MaxNumTimesToAttemptToProcessImage"; // NON-NLS
private static final String MAX_CONCURRENT_NODES_FOR_ONE_CASE = "MaxConcurrentNodesForOneCase"; // NON-NLS
private static final boolean isWindowsOS = PlatformUtil.isWindowsOS();
private static final Preferences preferences = NbPreferences.forModule(UserPreferences.class);
public static final String KEEP_PREFERRED_VIEWER = "KeepPreferredViewer"; // NON-NLS
@ -98,6 +118,214 @@ public final class UserPreferences {
public static void removeChangeListener(PreferenceChangeListener listener) {
preferences.removePreferenceChangeListener(listener);
}
/**
* Get mode from persistent storage.
*
* @return SelectedMode Selected mode.
*/
public static SelectedMode getMode() {
int ordinal = preferences.getInt(MODE, SelectedMode.STANDALONE.ordinal());
return SelectedMode.values()[ordinal];
}
/**
* Set mode to persistent storage.
*
* @param mode Selected mode.
*/
public static void setMode(SelectedMode mode) {
preferences.putInt(MODE, mode.ordinal());
}
/**
* Get input folder for automated mode from persistent storage.
*
* @return String Selected input folder.
*/
public static String getAutoModeImageFolder() {
return preferences.get(AUTO_MODE_IMAGES_FOLDER, "");
}
/**
* Set input image folder for automated mode from persistent storage.
*
* @param folder Selected input folder.
*/
public static void setAutoModeImageFolder(String folder) {
preferences.put(AUTO_MODE_IMAGES_FOLDER, folder);
}
/**
* Get results folder for automated mode from persistent storage.
*
* @return String Selected output folder.
*/
public static String getAutoModeResultsFolder() {
return preferences.get(AUTO_MODE_RESULTS_FOLDER, "");
}
/**
* Set results folder for automated mode from persistent storage.
*
* @param folder Selected output folder.
*/
public static void setAutoModeResultsFolder(String folder) {
preferences.put(AUTO_MODE_RESULTS_FOLDER, folder);
}
/**
* Get shared config folder for automated mode from persistent
* storage.
*
* @return String Selected settings folder.
*/
public static String getSharedConfigFolder() {
return preferences.get(SHARED_CONFIG_FOLDER, "");
}
/**
* Set shared config folder for automated mode from persistent
* storage.
*/
public static void setSharedConfigFolder(String folder) {
preferences.put(SHARED_CONFIG_FOLDER, folder);
}
/**
* Get shared config checkbox state for automated mode from
* persistent storage.
*
* @return Boolean true if shared settings are enabled.
*/
public static Boolean getSharedConfigEnabled() {
return preferences.getBoolean(SHARED_CONFIG_ENABLED, false);
}
/**
* Save shared config checkbox state for automated mode to persistent
* storage.
*
* @param sharedSettingsEnabled true = use shared settings in auto-ingest
* mode
*/
public static void setSharedConfigEnabled(boolean sharedSettingsEnabled) {
preferences.putBoolean(SHARED_CONFIG_ENABLED, sharedSettingsEnabled);
}
/**
* Get shared config master checkbox state for automated mode from
* persistent storage.
*
* @return true if this node is set as a shared configuration master
*/
public static Boolean getSharedConfigMaster() {
return preferences.getBoolean(SHARED_CONFIG_MASTER, false);
}
/**
* Save shared config master checkbox state to persistent storage.
*
* @param sharedSettingsMaster true = this node can upload configuration
*/
public static void setSharedConfigMaster(boolean sharedSettingsMaster) {
preferences.putBoolean(SHARED_CONFIG_MASTER, sharedSettingsMaster);
}
/**
* Get context string for automated mode ingest module settings.
*
* @return String Context string for automated mode ingest module
* settings.
*/
public static String getAutoModeIngestModuleContextString() {
return AUTO_MODE_CONTEXT_STRING;
}
/**
* Get source folder for Copy Mode from persistent storage.
*
* @return String Most recent source folder.
*/
public static String getCopyModeSourceFolder() {
return preferences.get(COPY_MODE_SOURCE_FOLDER, "C:\\");
}
/**
* Set source folder for Copy Mode into persistent storage.
*
* @param folder Selected source folder.
*/
public static void setCopyModeSourceFolder(String folder) {
preferences.put(COPY_MODE_SOURCE_FOLDER, folder);
}
/**
* Get the configured time to sleep between cases to prevent
* database locks
*
* @return int the value in seconds, default is 30 seconds.
*/
public static int getSecondsToSleepBetweenCases() {
int answer = Integer.parseInt(preferences.get(SLEEP_BETWEEN_CASES_TIME, "30"));
return answer;
}
/**
* Set the configured time to sleep between cases to prevent
* database locks
*
* @param int value the number of seconds to sleep between cases
*/
public static void setSecondsToSleepBetweenCases(int value) {
preferences.put(SLEEP_BETWEEN_CASES_TIME, Integer.toString(value));
}
/**
* Get maximum number of times to attempt processing an image folder. This
* is used to avoid endless attempts to process an image folder with corrupt
* data that causes a crash.
*
* @return int maximum number of attempts, default is 2.
*/
public static int getMaxNumTimesToProcessImage() {
int answer = Integer.parseInt(preferences.get(MAX_NUM_TIMES_TO_PROCESS_IMAGE, "2"));
return answer;
}
/**
* Set the maximum number of times to attempt to reprocess an image. This is
* used to avoid endless attempts to process an image folder with corrupt
* data that causes a crash.
*
* @param retries the number of retries to allow
*/
public static void setMaxNumTimesToProcessImage(int retries) {
preferences.putInt(MAX_NUM_TIMES_TO_PROCESS_IMAGE, retries);
}
/**
* Get maximum number of concurrent ingest nodes allowable for one case at a
* time.
*
* @return maximum number of concurrent nodes for one case. Default is 3.
*/
public static int getMaxConcurrentJobsForOneCase() {
return Integer.parseInt(preferences.get(MAX_CONCURRENT_NODES_FOR_ONE_CASE, "3"));
}
/**
* Get maximum number of concurrent ingest nodes allowable for one case at a
* time.
*
* @param numberOfNodes the number of concurrent nodes to allow for one case
*/
public static void setMaxConcurrentIngestNodesForOneCase(int numberOfNodes) {
preferences.putInt(MAX_CONCURRENT_NODES_FOR_ONE_CASE, numberOfNodes);
}
public static boolean keepPreferredContentViewer() {
return preferences.getBoolean(KEEP_PREFERRED_VIEWER, false);

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 617 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 419 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 582 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 B

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
<!-- for some information on what you could do (e.g. targets to override). -->
<!-- If you delete this file and reopen the project it will be recreated. -->
<project name="org.sleuthkit.autopsy.experimental" default="netbeans" basedir=".">
<description>Builds, tests, and runs the project org.sleuthkit.autopsy.experimental.</description>
<import file="nbproject/build-impl.xml"/>
</project>

View File

@ -1,6 +0,0 @@
Manifest-Version: 1.0
AutoUpdate-Show-In-Client: true
OpenIDE-Module: org.sleuthkit.autopsy.experimental
OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/experimental/Bundle.properties
OpenIDE-Module-Specification-Version: 1.0

View File

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
*** GENERATED FROM project.xml - DO NOT EDIT ***
*** EDIT ../build.xml INSTEAD ***
-->
<project name="org.sleuthkit.autopsy.experimental-impl" basedir="..">
<fail message="Please build using Ant 1.7.1 or higher.">
<condition>
<not>
<antversion atleast="1.7.1"/>
</not>
</condition>
</fail>
<property file="nbproject/private/suite-private.properties"/>
<property file="nbproject/suite.properties"/>
<fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
<property file="${suite.dir}/nbproject/private/platform-private.properties"/>
<property file="${suite.dir}/nbproject/platform.properties"/>
<macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
<attribute name="name"/>
<attribute name="value"/>
<sequential>
<property name="@{name}" value="${@{value}}"/>
</sequential>
</macrodef>
<macrodef name="evalprops" uri="http://www.netbeans.org/ns/nb-module-project/2">
<attribute name="property"/>
<attribute name="value"/>
<sequential>
<property name="@{property}" value="@{value}"/>
</sequential>
</macrodef>
<property file="${user.properties.file}"/>
<nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
<nbmproject2:property name="nbplatform.active.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
<nbmproject2:evalprops property="cluster.path.evaluated" value="${cluster.path}" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
<fail message="Path to 'platform' cluster missing in $${cluster.path} property or using corrupt Netbeans Platform (missing harness).">
<condition>
<not>
<contains string="${cluster.path.evaluated}" substring="platform"/>
</not>
</condition>
</fail>
<import file="${harness.dir}/build.xml"/>
</project>

View File

@ -1,2 +0,0 @@
javac.source=1.7
javac.compilerargs=-Xlint -Xlint:-serial

View File

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.apisupport.project</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
<code-name-base>org.sleuthkit.autopsy.experimental</code-name-base>
<suite-component/>
<module-dependencies/>
<public-packages/>
</data>
</configuration>
</project>

View File

@ -1 +0,0 @@
suite.dir=${basedir}/..

View File

@ -1 +0,0 @@
OpenIDE-Module-Name=Experimental

View File

@ -1,5 +1,5 @@
#Updated by build script
#Mon, 18 Jul 2016 17:58:06 -0400
#Fri, 05 Aug 2016 15:20:55 -0400
LBL_splash_window_title=Starting Autopsy
SPLASH_HEIGHT=314
SPLASH_WIDTH=538

View File

@ -1,4 +1,4 @@
#Updated by build script
#Mon, 18 Jul 2016 17:58:06 -0400
#Tue, 09 Aug 2016 15:02:14 -0400
CTL_MainWindow_Title=Autopsy 4.1.0
CTL_MainWindow_Title_No_Project=Autopsy 4.1.0

View File

@ -9,7 +9,6 @@ app.version=4.1.0
#build.type=RELEASE
build.type=DEVELOPMENT
project.org.sleuthkit.autopsy.experimental=Experimental
project.org.sleuthkit.autopsy.imagegallery=ImageGallery
update_versions=false
#custom JVM options
@ -29,8 +28,7 @@ modules=\
${project.org.sleuthkit.autopsy.thunderbirdparser}:\
${project.org.sleuthkit.autopsy.core}:\
${project.org.sleuthkit.autopsy.corelibs}:\
${project.org.sleuthkit.autopsy.imagegallery}:\
${project.org.sleuthkit.autopsy.experimental}
${project.org.sleuthkit.autopsy.imagegallery}
project.org.sleuthkit.autopsy.core=Core
project.org.sleuthkit.autopsy.corelibs=CoreLibs
project.org.sleuthkit.autopsy.keywordsearch=KeywordSearch