Merge branch 'develop' of github.com:sleuthkit/autopsy into 7369-dssCharts

This commit is contained in:
Greg DiCristofaro 2021-03-23 14:04:46 -04:00
commit 1dfb257e0d
15 changed files with 432 additions and 88 deletions

View File

@ -124,6 +124,7 @@ import org.sleuthkit.autopsy.ingest.IngestServices;
import org.sleuthkit.autopsy.ingest.ModuleDataEvent; import org.sleuthkit.autopsy.ingest.ModuleDataEvent;
import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchService; import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchService;
import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchServiceException; import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchServiceException;
import org.sleuthkit.autopsy.machinesettings.UserMachinePreferences;
import org.sleuthkit.autopsy.progress.LoggingProgressIndicator; import org.sleuthkit.autopsy.progress.LoggingProgressIndicator;
import org.sleuthkit.autopsy.progress.ModalDialogProgressIndicator; import org.sleuthkit.autopsy.progress.ModalDialogProgressIndicator;
import org.sleuthkit.autopsy.progress.ProgressIndicator; import org.sleuthkit.autopsy.progress.ProgressIndicator;
@ -1477,16 +1478,7 @@ public class Case {
* @return The temp subdirectory path. * @return The temp subdirectory path.
*/ */
public String getTempDirectory() { public String getTempDirectory() {
// get temp folder scoped to the combination of case name and timestamp return UserMachinePreferences.getTempDirectory();
// provided by getName()
Path path = Paths.get(UserPreferences.getAppTempDirectory(), CASE_TEMP_DIR, getName());
File f = path.toFile();
// verify that the folder exists
if (!f.exists()) {
f.mkdirs();
}
return path.toAbsolutePath().toString();
} }
/** /**

View File

@ -674,8 +674,7 @@ public final class UserPreferences {
* @return The absolute path to the application temp directory. * @return The absolute path to the application temp directory.
*/ */
public static String getAppTempDirectory() { public static String getAppTempDirectory() {
return Paths.get(UserMachinePreferences.getBaseTempDirectory(), getAppName()) return UserMachinePreferences.getTempDirectory();
.toAbsolutePath().toString();
} }
/** /**

View File

@ -8,6 +8,8 @@
</Component> </Component>
<Component class="javax.swing.ButtonGroup" name="logoSourceButtonGroup"> <Component class="javax.swing.ButtonGroup" name="logoSourceButtonGroup">
</Component> </Component>
<Component class="javax.swing.ButtonGroup" name="tempDirChoiceGroup">
</Component>
</NonVisualComponents> </NonVisualComponents>
<AuxValues> <AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/> <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
@ -24,12 +26,12 @@
<Layout> <Layout>
<DimensionLayout dim="0"> <DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Component id="jScrollPane1" alignment="0" pref="648" max="32767" attributes="0"/> <Component id="jScrollPane1" alignment="0" pref="860" max="32767" attributes="0"/>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
<DimensionLayout dim="1"> <DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Component id="jScrollPane1" alignment="0" pref="382" max="32767" attributes="0"/> <Component id="jScrollPane1" alignment="0" pref="620" max="32767" attributes="0"/>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
</Layout> </Layout>
@ -418,7 +420,7 @@
<Properties> <Properties>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor"> <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo"> <Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
<TitledBorder title="Temp Directory"> <TitledBorder title="Root Temp Directory">
<ResourceString PropertyName="titleX" bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="AutopsyOptionsPanel.tempDirectoryPanel.border.title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/> <ResourceString PropertyName="titleX" bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="AutopsyOptionsPanel.tempDirectoryPanel.border.title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</TitledBorder> </TitledBorder>
</Border> </Border>
@ -444,37 +446,53 @@
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Component id="tempDirectoryWarningLabel" min="-2" pref="615" max="-2" attributes="0"/> <Component id="tempLocalRadio" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="tempCaseRadio" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="tempDirectoryWarningLabel" alignment="0" min="-2" pref="615" max="-2" attributes="0"/>
<Group type="102" alignment="0" attributes="0">
<Component id="tempCustomRadio" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="tempOnCustomNoPath" min="-2" max="-2" attributes="0"/>
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<Component id="tempDirectoryField" min="-2" pref="367" max="-2" attributes="0"/> <Component id="tempCustomField" min="-2" pref="459" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="tempDirectoryBrowseButton" min="-2" max="-2" attributes="0"/> <Component id="tempDirectoryBrowseButton" min="-2" max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
<EmptySpace min="0" pref="0" max="32767" attributes="0"/> </Group>
</Group>
<EmptySpace pref="158" max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
<DimensionLayout dim="1"> <DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="tempLocalRadio" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="tempCaseRadio" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0"> <Group type="103" groupAlignment="3" attributes="0">
<Component id="tempDirectoryField" alignment="3" max="32767" attributes="0"/> <Component id="tempCustomRadio" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="tempCustomField" alignment="3" max="32767" attributes="0"/>
<Component id="tempDirectoryBrowseButton" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="tempDirectoryBrowseButton" alignment="3" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace type="separate" max="-2" attributes="0"/> <EmptySpace type="unrelated" max="-2" attributes="0"/>
<Component id="tempOnCustomNoPath" min="-2" max="-2" attributes="0"/>
<EmptySpace type="unrelated" max="32767" attributes="0"/>
<Component id="tempDirectoryWarningLabel" min="-2" max="-2" attributes="0"/> <Component id="tempDirectoryWarningLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" max="-2" attributes="0"/> <EmptySpace min="-2" pref="14" max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
</Layout> </Layout>
<SubComponents> <SubComponents>
<Component class="javax.swing.JTextField" name="tempDirectoryField"> <Component class="javax.swing.JTextField" name="tempCustomField">
<Properties> <Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="AutopsyOptionsPanel.tempDirectoryField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/> <ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="AutopsyOptionsPanel.tempCustomField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property> </Property>
</Properties> </Properties>
</Component> </Component>
@ -498,6 +516,55 @@
</Property> </Property>
</Properties> </Properties>
</Component> </Component>
<Component class="javax.swing.JRadioButton" name="tempLocalRadio">
<Properties>
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
<ComponentRef name="tempDirChoiceGroup"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="AutopsyOptionsPanel.tempLocalRadio.text" 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="tempLocalRadioActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JRadioButton" name="tempCaseRadio">
<Properties>
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
<ComponentRef name="tempDirChoiceGroup"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="AutopsyOptionsPanel.tempCaseRadio.text" 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="tempCaseRadioActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JRadioButton" name="tempCustomRadio">
<Properties>
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
<ComponentRef name="tempDirChoiceGroup"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="AutopsyOptionsPanel.tempCustomRadio.text" 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="tempCustomRadioActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JLabel" name="tempOnCustomNoPath">
<Properties>
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="java.awt.Color.RED" type="code"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="AutopsyOptionsPanel.tempOnCustomNoPath.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
</SubComponents> </SubComponents>
</Container> </Container>
<Container class="javax.swing.JPanel" name="rdpPanel"> <Container class="javax.swing.JPanel" name="rdpPanel">

View File

@ -38,6 +38,7 @@ import javax.swing.JOptionPane;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener; import javax.swing.event.DocumentListener;
import org.apache.commons.lang3.StringUtils;
import org.netbeans.spi.options.OptionsPanelController; import org.netbeans.spi.options.OptionsPanelController;
import org.openide.util.NbBundle; import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
@ -47,9 +48,9 @@ import org.sleuthkit.autopsy.casemodule.GeneralFilter;
import org.sleuthkit.autopsy.machinesettings.UserMachinePreferences; import org.sleuthkit.autopsy.machinesettings.UserMachinePreferences;
import org.sleuthkit.autopsy.machinesettings.UserMachinePreferencesException; import org.sleuthkit.autopsy.machinesettings.UserMachinePreferencesException;
import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.autopsy.coreutils.ModuleSettings;
import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.autopsy.coreutils.PlatformUtil;
import org.sleuthkit.autopsy.coreutils.Version; import org.sleuthkit.autopsy.coreutils.Version;
import org.sleuthkit.autopsy.machinesettings.UserMachinePreferences.TempDirChoice;
import org.sleuthkit.autopsy.report.ReportBranding; import org.sleuthkit.autopsy.report.ReportBranding;
/** /**
@ -77,7 +78,6 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final JFileChooser logoFileChooser; private final JFileChooser logoFileChooser;
private final JFileChooser tempDirChooser; private final JFileChooser tempDirChooser;
private final TextFieldListener textFieldListener;
private static final String ETC_FOLDER_NAME = "etc"; private static final String ETC_FOLDER_NAME = "etc";
private static final String CONFIG_FILE_EXTENSION = ".conf"; private static final String CONFIG_FILE_EXTENSION = ".conf";
private static final long ONE_BILLION = 1000000000L; //used to roughly convert system memory from bytes to gigabytes private static final long ONE_BILLION = 1000000000L; //used to roughly convert system memory from bytes to gigabytes
@ -118,9 +118,9 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
solrMaxHeapSpinner.setModel(new javax.swing.SpinnerNumberModel(UserPreferences.getMaxSolrVMSize(), solrMaxHeapSpinner.setModel(new javax.swing.SpinnerNumberModel(UserPreferences.getMaxSolrVMSize(),
JVM_MEMORY_STEP_SIZE_MB, ((int) getSystemMemoryInGB()) * MEGA_IN_GIGA, JVM_MEMORY_STEP_SIZE_MB)); JVM_MEMORY_STEP_SIZE_MB, ((int) getSystemMemoryInGB()) * MEGA_IN_GIGA, JVM_MEMORY_STEP_SIZE_MB));
textFieldListener = new TextFieldListener(); TextFieldListener textFieldListener = new TextFieldListener();
agencyLogoPathField.getDocument().addDocumentListener(textFieldListener); agencyLogoPathField.getDocument().addDocumentListener(textFieldListener);
tempDirectoryField.getDocument().addDocumentListener(textFieldListener); tempCustomField.getDocument().addDocumentListener(new TempCustomTextListener());
logFileCount.setText(String.valueOf(UserPreferences.getLogFileCount())); logFileCount.setText(String.valueOf(UserPreferences.getLogFileCount()));
reportBranding = new ReportBranding(); reportBranding = new ReportBranding();
@ -303,6 +303,16 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
return new String[]{}; return new String[]{};
} }
private void evaluateTempDirState() {
boolean caseOpen = Case.isCaseOpen();
boolean customSelected = tempCustomRadio.isSelected();
tempDirectoryBrowseButton.setEnabled(!caseOpen && customSelected);
tempCustomField.setEnabled(!caseOpen && customSelected);
tempOnCustomNoPath.setVisible(customSelected && StringUtils.isBlank(tempCustomField.getText()));
}
/** /**
* Load the saved user preferences. * Load the saved user preferences.
*/ */
@ -313,10 +323,25 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
specifyLogoRB.setSelected(!useDefault); specifyLogoRB.setSelected(!useDefault);
agencyLogoPathField.setEnabled(!useDefault); agencyLogoPathField.setEnabled(!useDefault);
browseLogosButton.setEnabled(!useDefault); browseLogosButton.setEnabled(!useDefault);
tempDirectoryField.setText(UserMachinePreferences.getBaseTempDirectory());
tempCustomField.setText(UserMachinePreferences.getCustomTempDirectory());
switch (UserMachinePreferences.getTempDirChoice()) {
case CASE:
tempCaseRadio.setSelected(true);
break;
case CUSTOM:
tempCustomRadio.setSelected(true);
break;
default:
case SYSTEM:
tempLocalRadio.setSelected(true);
break;
}
evaluateTempDirState();
logFileCount.setText(String.valueOf(UserPreferences.getLogFileCount())); logFileCount.setText(String.valueOf(UserPreferences.getLogFileCount()));
solrMaxHeapSpinner.setValue(UserPreferences.getMaxSolrVMSize()); solrMaxHeapSpinner.setValue(UserPreferences.getMaxSolrVMSize());
tempDirectoryField.setText(UserMachinePreferences.getBaseTempDirectory());
try { try {
updateAgencyLogo(path); updateAgencyLogo(path);
} catch (IOException ex) { } catch (IOException ex) {
@ -337,9 +362,13 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
private void setTempDirEnabled() { private void setTempDirEnabled() {
boolean enabled = !Case.isCaseOpen(); boolean enabled = !Case.isCaseOpen();
this.tempDirectoryBrowseButton.setEnabled(enabled);
this.tempDirectoryField.setEnabled(enabled); this.tempCaseRadio.setEnabled(enabled);
this.tempCustomRadio.setEnabled(enabled);
this.tempLocalRadio.setEnabled(enabled);
this.tempDirectoryWarningLabel.setVisible(!enabled); this.tempDirectoryWarningLabel.setVisible(!enabled);
evaluateTempDirState();
} }
/** /**
@ -371,12 +400,14 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
@Messages({ @Messages({
"AutopsyOptionsPanel_storeTempDir_onError_title=Error Saving Temporary Directory", "AutopsyOptionsPanel_storeTempDir_onError_title=Error Saving Temporary Directory",
"# {0} - path", "# {0} - path",
"AutopsyOptionsPanel_storeTempDir_onError_description=There was an error creating the temporary directory on the filesystem at: {0}.",}) "AutopsyOptionsPanel_storeTempDir_onError_description=There was an error creating the temporary directory on the filesystem at: {0}.",
"AutopsyOptionsPanel_storeTempDir_onChoiceError_title=Error Saving Temporary Directory Choice",
"AutopsyOptionsPanel_storeTempDir_onChoiceError_description=There was an error updating temporary directory choice selection.",})
private void storeTempDir() { private void storeTempDir() {
String tempDirectoryPath = tempDirectoryField.getText(); String tempDirectoryPath = tempCustomField.getText();
if (!UserMachinePreferences.getBaseTempDirectory().equals(tempDirectoryPath)) { if (!UserMachinePreferences.getCustomTempDirectory().equals(tempDirectoryPath)) {
try { try {
UserMachinePreferences.setBaseTempDirectory(tempDirectoryPath); UserMachinePreferences.setCustomTempDirectory(tempDirectoryPath);
} catch (UserMachinePreferencesException ex) { } catch (UserMachinePreferencesException ex) {
logger.log(Level.WARNING, "There was an error creating the temporary directory defined by the user: " + tempDirectoryPath, ex); logger.log(Level.WARNING, "There was an error creating the temporary directory defined by the user: " + tempDirectoryPath, ex);
SwingUtilities.invokeLater(() -> { SwingUtilities.invokeLater(() -> {
@ -387,6 +418,29 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
}); });
} }
} }
TempDirChoice choice;
if (tempCaseRadio.isSelected()) {
choice = TempDirChoice.CASE;
} else if (tempCustomRadio.isSelected()) {
choice = TempDirChoice.CUSTOM;
} else {
choice = TempDirChoice.SYSTEM;
}
if (!choice.equals(UserMachinePreferences.getTempDirChoice())) {
try {
UserMachinePreferences.setTempDirChoice(choice);
} catch (UserMachinePreferencesException ex) {
logger.log(Level.WARNING, "There was an error updating choice to: " + choice.name(), ex);
SwingUtilities.invokeLater(() -> {
JOptionPane.showMessageDialog(this,
String.format("<html>%s</html>", Bundle.AutopsyOptionsPanel_storeTempDir_onChoiceError_description()),
Bundle.AutopsyOptionsPanel_storeTempDir_onChoiceError_title(),
JOptionPane.ERROR_MESSAGE);
});
}
}
} }
/** /**
@ -555,6 +609,32 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
} }
} }
/**
* Listens for changes in the temp directory custom directory text field.
*/
private class TempCustomTextListener extends TextFieldListener {
@Override
public void changedUpdate(DocumentEvent e) {
evaluateTempDirState();
super.changedUpdate(e);
}
@Override
public void removeUpdate(DocumentEvent e) {
evaluateTempDirState();
super.changedUpdate(e);
}
@Override
public void insertUpdate(DocumentEvent e) {
evaluateTempDirState();
super.changedUpdate(e);
}
}
/** /**
* This method is called from within the constructor to initialize the form. * This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always * WARNING: Do NOT modify this code. The content of this method is always
@ -567,6 +647,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
fileSelectionButtonGroup = new javax.swing.ButtonGroup(); fileSelectionButtonGroup = new javax.swing.ButtonGroup();
displayTimesButtonGroup = new javax.swing.ButtonGroup(); displayTimesButtonGroup = new javax.swing.ButtonGroup();
logoSourceButtonGroup = new javax.swing.ButtonGroup(); logoSourceButtonGroup = new javax.swing.ButtonGroup();
tempDirChoiceGroup = new javax.swing.ButtonGroup();
jScrollPane1 = new javax.swing.JScrollPane(); jScrollPane1 = new javax.swing.JScrollPane();
javax.swing.JPanel mainPanel = new javax.swing.JPanel(); javax.swing.JPanel mainPanel = new javax.swing.JPanel();
logoPanel = new javax.swing.JPanel(); logoPanel = new javax.swing.JPanel();
@ -593,9 +674,13 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
solrMaxHeapSpinner = new javax.swing.JSpinner(); solrMaxHeapSpinner = new javax.swing.JSpinner();
solrJVMHeapWarning = new javax.swing.JLabel(); solrJVMHeapWarning = new javax.swing.JLabel();
tempDirectoryPanel = new javax.swing.JPanel(); tempDirectoryPanel = new javax.swing.JPanel();
tempDirectoryField = new javax.swing.JTextField(); tempCustomField = new javax.swing.JTextField();
tempDirectoryBrowseButton = new javax.swing.JButton(); tempDirectoryBrowseButton = new javax.swing.JButton();
tempDirectoryWarningLabel = new javax.swing.JLabel(); tempDirectoryWarningLabel = new javax.swing.JLabel();
tempLocalRadio = new javax.swing.JRadioButton();
tempCaseRadio = new javax.swing.JRadioButton();
tempCustomRadio = new javax.swing.JRadioButton();
tempOnCustomNoPath = new javax.swing.JLabel();
rdpPanel = new javax.swing.JPanel(); rdpPanel = new javax.swing.JPanel();
javax.swing.JScrollPane sizingScrollPane = new javax.swing.JScrollPane(); javax.swing.JScrollPane sizingScrollPane = new javax.swing.JScrollPane();
javax.swing.JTextPane sizingTextPane = new javax.swing.JTextPane(); javax.swing.JTextPane sizingTextPane = new javax.swing.JTextPane();
@ -822,7 +907,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
tempDirectoryPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempDirectoryPanel.border.title"))); // NOI18N tempDirectoryPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempDirectoryPanel.border.title"))); // NOI18N
tempDirectoryPanel.setName(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempDirectoryPanel.name")); // NOI18N tempDirectoryPanel.setName(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempDirectoryPanel.name")); // NOI18N
tempDirectoryField.setText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempDirectoryField.text")); // NOI18N tempCustomField.setText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempCustomField.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(tempDirectoryBrowseButton, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempDirectoryBrowseButton.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(tempDirectoryBrowseButton, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempDirectoryBrowseButton.text")); // NOI18N
tempDirectoryBrowseButton.addActionListener(new java.awt.event.ActionListener() { tempDirectoryBrowseButton.addActionListener(new java.awt.event.ActionListener() {
@ -834,6 +919,33 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
tempDirectoryWarningLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/warning16.png"))); // NOI18N tempDirectoryWarningLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/warning16.png"))); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(tempDirectoryWarningLabel, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempDirectoryWarningLabel.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(tempDirectoryWarningLabel, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempDirectoryWarningLabel.text")); // NOI18N
tempDirChoiceGroup.add(tempLocalRadio);
org.openide.awt.Mnemonics.setLocalizedText(tempLocalRadio, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempLocalRadio.text")); // NOI18N
tempLocalRadio.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
tempLocalRadioActionPerformed(evt);
}
});
tempDirChoiceGroup.add(tempCaseRadio);
org.openide.awt.Mnemonics.setLocalizedText(tempCaseRadio, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempCaseRadio.text")); // NOI18N
tempCaseRadio.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
tempCaseRadioActionPerformed(evt);
}
});
tempDirChoiceGroup.add(tempCustomRadio);
org.openide.awt.Mnemonics.setLocalizedText(tempCustomRadio, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempCustomRadio.text")); // NOI18N
tempCustomRadio.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
tempCustomRadioActionPerformed(evt);
}
});
tempOnCustomNoPath.setForeground(java.awt.Color.RED);
org.openide.awt.Mnemonics.setLocalizedText(tempOnCustomNoPath, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tempOnCustomNoPath.text")); // NOI18N
javax.swing.GroupLayout tempDirectoryPanelLayout = new javax.swing.GroupLayout(tempDirectoryPanel); javax.swing.GroupLayout tempDirectoryPanelLayout = new javax.swing.GroupLayout(tempDirectoryPanel);
tempDirectoryPanel.setLayout(tempDirectoryPanelLayout); tempDirectoryPanel.setLayout(tempDirectoryPanelLayout);
tempDirectoryPanelLayout.setHorizontalGroup( tempDirectoryPanelLayout.setHorizontalGroup(
@ -841,23 +953,37 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
.addGroup(tempDirectoryPanelLayout.createSequentialGroup() .addGroup(tempDirectoryPanelLayout.createSequentialGroup()
.addContainerGap() .addContainerGap()
.addGroup(tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(tempLocalRadio)
.addComponent(tempCaseRadio)
.addComponent(tempDirectoryWarningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 615, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(tempDirectoryWarningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 615, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(tempDirectoryPanelLayout.createSequentialGroup() .addGroup(tempDirectoryPanelLayout.createSequentialGroup()
.addComponent(tempDirectoryField, javax.swing.GroupLayout.PREFERRED_SIZE, 367, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(tempCustomRadio)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tempDirectoryBrowseButton))) .addGroup(tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 0, Short.MAX_VALUE)) .addComponent(tempOnCustomNoPath)
.addGroup(tempDirectoryPanelLayout.createSequentialGroup()
.addComponent(tempCustomField, javax.swing.GroupLayout.PREFERRED_SIZE, 459, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tempDirectoryBrowseButton)))))
.addContainerGap(158, Short.MAX_VALUE))
); );
tempDirectoryPanelLayout.setVerticalGroup( tempDirectoryPanelLayout.setVerticalGroup(
tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(tempDirectoryPanelLayout.createSequentialGroup() .addGroup(tempDirectoryPanelLayout.createSequentialGroup()
.addContainerGap() .addContainerGap()
.addComponent(tempLocalRadio)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tempCaseRadio)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addGroup(tempDirectoryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(tempDirectoryField) .addComponent(tempCustomRadio)
.addComponent(tempCustomField)
.addComponent(tempDirectoryBrowseButton)) .addComponent(tempDirectoryBrowseButton))
.addGap(18, 18, 18) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(tempOnCustomNoPath)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(tempDirectoryWarningLabel) .addComponent(tempDirectoryWarningLabel)
.addContainerGap()) .addGap(14, 14, 14))
); );
gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints = new java.awt.GridBagConstraints();
@ -910,11 +1036,11 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
this.setLayout(layout); this.setLayout(layout);
layout.setHorizontalGroup( layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 648, Short.MAX_VALUE) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 860, Short.MAX_VALUE)
); );
layout.setVerticalGroup( layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 620, Short.MAX_VALUE)
); );
}// </editor-fold>//GEN-END:initComponents }// </editor-fold>//GEN-END:initComponents
@ -931,7 +1057,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
if (!f.exists() && !f.mkdirs()) { if (!f.exists() && !f.mkdirs()) {
throw new InvalidPathException(specifiedPath, "Unable to create parent directories leading to " + specifiedPath); throw new InvalidPathException(specifiedPath, "Unable to create parent directories leading to " + specifiedPath);
} }
tempDirectoryField.setText(specifiedPath); tempCustomField.setText(specifiedPath);
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
} catch (InvalidPathException ex) { } catch (InvalidPathException ex) {
logger.log(Level.WARNING, "Unable to create temporary directory in " + specifiedPath, ex); logger.log(Level.WARNING, "Unable to create temporary directory in " + specifiedPath, ex);
@ -1021,6 +1147,21 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
} }
}//GEN-LAST:event_browseLogosButtonActionPerformed }//GEN-LAST:event_browseLogosButtonActionPerformed
private void tempLocalRadioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tempLocalRadioActionPerformed
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
evaluateTempDirState();
}//GEN-LAST:event_tempLocalRadioActionPerformed
private void tempCaseRadioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tempCaseRadioActionPerformed
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
evaluateTempDirState();
}//GEN-LAST:event_tempCaseRadioActionPerformed
private void tempCustomRadioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tempCustomRadioActionPerformed
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
evaluateTempDirState();
}//GEN-LAST:event_tempCustomRadioActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JTextField agencyLogoPathField; private javax.swing.JTextField agencyLogoPathField;
private javax.swing.JLabel agencyLogoPathFieldValidationLabel; private javax.swing.JLabel agencyLogoPathFieldValidationLabel;
@ -1049,10 +1190,15 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
private javax.swing.JSpinner solrMaxHeapSpinner; private javax.swing.JSpinner solrMaxHeapSpinner;
private javax.swing.JRadioButton specifyLogoRB; private javax.swing.JRadioButton specifyLogoRB;
private javax.swing.JLabel systemMemoryTotal; private javax.swing.JLabel systemMemoryTotal;
private javax.swing.JRadioButton tempCaseRadio;
private javax.swing.JTextField tempCustomField;
private javax.swing.JRadioButton tempCustomRadio;
private javax.swing.ButtonGroup tempDirChoiceGroup;
private javax.swing.JButton tempDirectoryBrowseButton; private javax.swing.JButton tempDirectoryBrowseButton;
private javax.swing.JTextField tempDirectoryField;
private javax.swing.JPanel tempDirectoryPanel; private javax.swing.JPanel tempDirectoryPanel;
private javax.swing.JLabel tempDirectoryWarningLabel; private javax.swing.JLabel tempDirectoryWarningLabel;
private javax.swing.JRadioButton tempLocalRadio;
private javax.swing.JLabel tempOnCustomNoPath;
private javax.swing.JLabel totalMemoryLabel; private javax.swing.JLabel totalMemoryLabel;
// End of variables declaration//GEN-END:variables // End of variables declaration//GEN-END:variables

View File

@ -188,12 +188,11 @@ MultiUserSettingsPanel.restartRequiredLabel.text=Application restart required to
MultiUserSettingsPanel.MustRestart=Autopsy must be restarted for new configuration to take effect MultiUserSettingsPanel.MustRestart=Autopsy must be restarted for new configuration to take effect
MultiUserSettingsPanel.lbSolrNote1.text=Enter Solr 8 and/or Solr 4 server settings. MultiUserSettingsPanel.lbSolrNote1.text=Enter Solr 8 and/or Solr 4 server settings.
MultiUserSettingsPanel.lbSolrNote2.text=New text indexing can only be done with Solr 8. MultiUserSettingsPanel.lbSolrNote2.text=New text indexing can only be done with Solr 8.
AutopsyOptionsPanel.tempDirectoryField.text=
AutopsyOptionsPanel.tempDirectoryBrowseButton.text=Browse AutopsyOptionsPanel.tempDirectoryBrowseButton.text=Browse
AutopsyOptionsPanel.a.AccessibleContext.accessibleName=Temp Directory AutopsyOptionsPanel.a.AccessibleContext.accessibleName=Temp Directory
AutopsyOptionsPanel.tempDirectoryPanel.AccessibleContext.accessibleName=Temp Directory AutopsyOptionsPanel.tempDirectoryPanel.AccessibleContext.accessibleName=Temp Directory
AutopsyOptionsPanel.tempDirectoryPanel.name=Temp Directory AutopsyOptionsPanel.tempDirectoryPanel.name=Temp Directory
AutopsyOptionsPanel.tempDirectoryPanel.border.title=Temp Directory AutopsyOptionsPanel.tempDirectoryPanel.border.title=Root Temp Directory
AutopsyOptionsPanel.tempDirectoryWarningLabel.text=Close the current case to change the temporary directory. AutopsyOptionsPanel.tempDirectoryWarningLabel.text=Close the current case to change the temporary directory.
AutopsyOptionsPanel.solrJVMHeapWarning.text=NOTE: Setting this too large may impact overall performance. AutopsyOptionsPanel.solrJVMHeapWarning.text=NOTE: Setting this too large may impact overall performance.
AutopsyOptionsPanel.maxMemoryUnitsLabel2.text=MB AutopsyOptionsPanel.maxMemoryUnitsLabel2.text=MB
@ -247,3 +246,8 @@ AutopsyOptionsPanel.agencyLogoPathField.text=
AutopsyOptionsPanel.logoPanel.border.title=Logo AutopsyOptionsPanel.logoPanel.border.title=Logo
ViewPreferencesPanel.radioGroupByPersonHost.text=Group by Person/Host ViewPreferencesPanel.radioGroupByPersonHost.text=Group by Person/Host
ViewPreferencesPanel.radioGroupByDataType.text=Group by Data Type ViewPreferencesPanel.radioGroupByDataType.text=Group by Data Type
AutopsyOptionsPanel.tempLocalRadio.text=Local temp directory
AutopsyOptionsPanel.tempCaseRadio.text=Temp folder in case directory
AutopsyOptionsPanel.tempCustomRadio.text=Custom
AutopsyOptionsPanel.tempCustomField.text=
AutopsyOptionsPanel.tempOnCustomNoPath.text=Please select a path for the custom root temp directory.

View File

@ -12,6 +12,8 @@ AutopsyOptionsPanel.memFieldValidationLabel.noValueEntered.text=No value entered
AutopsyOptionsPanel.memFieldValidationLabel.overMaxMemory.text=Value must be less than the total system memory of {0}GB AutopsyOptionsPanel.memFieldValidationLabel.overMaxMemory.text=Value must be less than the total system memory of {0}GB
# {0} - minimumMemory # {0} - minimumMemory
AutopsyOptionsPanel.memFieldValidationLabel.underMinMemory.text=Value must be at least {0}GB AutopsyOptionsPanel.memFieldValidationLabel.underMinMemory.text=Value must be at least {0}GB
AutopsyOptionsPanel_storeTempDir_onChoiceError_description=There was an error updating temporary directory choice selection.
AutopsyOptionsPanel_storeTempDir_onChoiceError_title=Error Saving Temporary Directory Choice
# {0} - path # {0} - path
AutopsyOptionsPanel_storeTempDir_onError_description=There was an error creating the temporary directory on the filesystem at: {0}. AutopsyOptionsPanel_storeTempDir_onError_description=There was an error creating the temporary directory on the filesystem at: {0}.
AutopsyOptionsPanel_storeTempDir_onError_title=Error Saving Temporary Directory AutopsyOptionsPanel_storeTempDir_onError_title=Error Saving Temporary Directory
@ -246,12 +248,11 @@ MultiUserSettingsPanel.restartRequiredLabel.text=Application restart required to
MultiUserSettingsPanel.MustRestart=Autopsy must be restarted for new configuration to take effect MultiUserSettingsPanel.MustRestart=Autopsy must be restarted for new configuration to take effect
MultiUserSettingsPanel.lbSolrNote1.text=Enter Solr 8 and/or Solr 4 server settings. MultiUserSettingsPanel.lbSolrNote1.text=Enter Solr 8 and/or Solr 4 server settings.
MultiUserSettingsPanel.lbSolrNote2.text=New text indexing can only be done with Solr 8. MultiUserSettingsPanel.lbSolrNote2.text=New text indexing can only be done with Solr 8.
AutopsyOptionsPanel.tempDirectoryField.text=
AutopsyOptionsPanel.tempDirectoryBrowseButton.text=Browse AutopsyOptionsPanel.tempDirectoryBrowseButton.text=Browse
AutopsyOptionsPanel.a.AccessibleContext.accessibleName=Temp Directory AutopsyOptionsPanel.a.AccessibleContext.accessibleName=Temp Directory
AutopsyOptionsPanel.tempDirectoryPanel.AccessibleContext.accessibleName=Temp Directory AutopsyOptionsPanel.tempDirectoryPanel.AccessibleContext.accessibleName=Temp Directory
AutopsyOptionsPanel.tempDirectoryPanel.name=Temp Directory AutopsyOptionsPanel.tempDirectoryPanel.name=Temp Directory
AutopsyOptionsPanel.tempDirectoryPanel.border.title=Temp Directory AutopsyOptionsPanel.tempDirectoryPanel.border.title=Root Temp Directory
AutopsyOptionsPanel.tempDirectoryWarningLabel.text=Close the current case to change the temporary directory. AutopsyOptionsPanel.tempDirectoryWarningLabel.text=Close the current case to change the temporary directory.
AutopsyOptionsPanel.solrJVMHeapWarning.text=NOTE: Setting this too large may impact overall performance. AutopsyOptionsPanel.solrJVMHeapWarning.text=NOTE: Setting this too large may impact overall performance.
AutopsyOptionsPanel.maxMemoryUnitsLabel2.text=MB AutopsyOptionsPanel.maxMemoryUnitsLabel2.text=MB
@ -305,3 +306,8 @@ AutopsyOptionsPanel.agencyLogoPathField.text=
AutopsyOptionsPanel.logoPanel.border.title=Logo AutopsyOptionsPanel.logoPanel.border.title=Logo
ViewPreferencesPanel.radioGroupByPersonHost.text=Group by Person/Host ViewPreferencesPanel.radioGroupByPersonHost.text=Group by Person/Host
ViewPreferencesPanel.radioGroupByDataType.text=Group by Data Type ViewPreferencesPanel.radioGroupByDataType.text=Group by Data Type
AutopsyOptionsPanel.tempLocalRadio.text=Local temp directory
AutopsyOptionsPanel.tempCaseRadio.text=Temp folder in case directory
AutopsyOptionsPanel.tempCustomRadio.text=Custom
AutopsyOptionsPanel.tempCustomField.text=
AutopsyOptionsPanel.tempOnCustomNoPath.text=Please select a path for the custom root temp directory.

View File

@ -95,9 +95,9 @@ final class DataSourceIngestPipeline extends IngestTaskPipeline<DataSourceIngest
if (!ingestJobPipeline.isCancelled() && ingestJobPipeline.currentDataSourceIngestModuleIsCancelled()) { if (!ingestJobPipeline.isCancelled() && ingestJobPipeline.currentDataSourceIngestModuleIsCancelled()) {
ingestJobPipeline.currentDataSourceIngestModuleCancellationCompleted(getDisplayName()); ingestJobPipeline.currentDataSourceIngestModuleCancellationCompleted(getDisplayName());
} }
if (result == ProcessResult.ERROR) { // if (result == ProcessResult.ERROR) {
throw new IngestModuleException(String.format("%s experienced an error analyzing %s (data source objId = %d)", getDisplayName(), dataSource.getName(), dataSource.getId())); //NON-NLS // throw new IngestModuleException(String.format("%s experienced an error analyzing %s (data source objId = %d)", getDisplayName(), dataSource.getName(), dataSource.getId())); //NON-NLS
} // }
} }
} }

View File

@ -118,9 +118,9 @@ final class FileIngestPipeline extends IngestTaskPipeline<FileIngestTask> {
ingestManager.setIngestTaskProgress(task, getDisplayName()); ingestManager.setIngestTaskProgress(task, getDisplayName());
ingestJobPipeline.setCurrentFileIngestModule(getDisplayName(), file.getName()); ingestJobPipeline.setCurrentFileIngestModule(getDisplayName(), file.getName());
ProcessResult result = module.process(file); ProcessResult result = module.process(file);
if (result == ProcessResult.ERROR) { // if (result == ProcessResult.ERROR) {
throw new IngestModuleException(String.format("%s experienced an error analyzing %s (file objId = %d)", getDisplayName(), file.getName(), file.getId())); //NON-NLS // throw new IngestModuleException(String.format("%s experienced an error analyzing %s (file objId = %d)", getDisplayName(), file.getName(), file.getId())); //NON-NLS
} // }
} }
} }

View File

@ -20,10 +20,15 @@ package org.sleuthkit.autopsy.machinesettings;
import java.io.File; import java.io.File;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.Optional;
import java.util.prefs.Preferences; import java.util.prefs.Preferences;
import java.util.stream.Stream;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.openide.util.NbBundle; import org.openide.util.NbBundle;
import org.openide.util.NbPreferences; import org.openide.util.NbPreferences;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.autopsy.coreutils.FileUtil; import org.sleuthkit.autopsy.coreutils.FileUtil;
/** /**
@ -33,26 +38,122 @@ public final class UserMachinePreferences {
private static final Preferences preferences = NbPreferences.forModule(UserMachinePreferences.class); private static final Preferences preferences = NbPreferences.forModule(UserMachinePreferences.class);
private static final String TEMP_DIR_KEY = "TempDirectory"; /**
* The user specified choice for where the temp directory should be located.
*/
public enum TempDirChoice {
/**
* A custom location specified with an absolute path by the user.
*/
CUSTOM,
/**
* Equivalent to java.io.tmpdir.
*/
SYSTEM,
/**
* If a case is open, a sub directory of the case.
*/
CASE;
/** /**
* Retrieves a default temporary directory that is a subdirectory of * Returns the temp directory choice that matches the string provided
* java.io.tmpdir. * (whitespace and case insensitive).
* *
* @return The absolute path to the temp directory. * @param val The string value.
* @return The choice or empty if not found.
*/ */
private static String getDefaultTempDirectory() { static Optional<TempDirChoice> getValue(String val) {
return Paths.get(System.getProperty("java.io.tmpdir")).toAbsolutePath().toString(); if (val == null) {
return Optional.empty();
}
return Stream.of(TempDirChoice.values())
.filter(tempChoice -> tempChoice.name().equalsIgnoreCase(val.trim()))
.findFirst();
}
}
private static final String CUSTOM_TEMP_DIR_KEY = "TempDirectory";
private static final String TEMP_DIR_CHOICE_KEY = "TempDirChoice";
private static final String AUTOPSY_SUBDIR = UserPreferences.getAppName();
private static final String CASE_SUBDIR = "Temp";
private static final TempDirChoice DEFAULT_CHOICE = TempDirChoice.SYSTEM;
/**
* @return A subdirectory of java.io.tmpdir.
*/
private static File getSystemTempDirFile() {
return Paths.get(System.getProperty("java.io.tmpdir"), AUTOPSY_SUBDIR).toFile();
} }
/** /**
* Retrieves the base user-specified temporary directory. * @return A subdirectory of the open case or getSystemTempDirFile if no
* open case.
*/
private static File getCaseTempDirFile() {
try {
String caseDirStr = Case.getCurrentCaseThrows().getCaseDirectory();
return Paths.get(caseDirStr, CASE_SUBDIR).toFile();
} catch (NoCurrentCaseException ex) {
return getSystemTempDirFile();
}
}
/**
* Returns the custom directory subdirectory to be used for temp files
* (otherwise java.io.tmpdir subdir).
*
* @return A subdirectory of the custom user-specified path. If no path is
* specified, getSystemTempDirFile() is returned instead.
*/
private static File getCustomTempDirFile() {
String customDirectory = getCustomTempDirectory();
return (StringUtils.isBlank(customDirectory))
? getSystemTempDirFile() : Paths.get(customDirectory, AUTOPSY_SUBDIR).toFile();
}
/**
* Returns the temp directory file to use based on user choice.
*
* @return The directory.
*/
private static File getTempDirFile() {
TempDirChoice choice = getTempDirChoice();
switch (choice) {
case CASE:
return getCaseTempDirFile();
case CUSTOM:
return getCustomTempDirFile();
case SYSTEM:
default:
return getSystemTempDirFile();
}
}
/**
* Returns the temp directory to use based on settings. This method also
* ensures the temp directory has been created.
* *
* @return The base user-specified temporary directory. * @return The base user-specified temporary directory.
*/ */
public static String getBaseTempDirectory() { public static String getTempDirectory() {
String tempDir = preferences.get(TEMP_DIR_KEY, null); File dir = getTempDirFile();
return StringUtils.isBlank(tempDir) ? getDefaultTempDirectory() : tempDir; dir = dir == null ? getSystemTempDirFile() : dir;
if (!dir.exists()) {
dir.mkdirs();
}
return dir.getAbsolutePath();
}
/**
* @return The user-specified custom temp directory path or empty string.
*/
public static String getCustomTempDirectory() {
return preferences.get(CUSTOM_TEMP_DIR_KEY, "");
} }
/** /**
@ -64,8 +165,7 @@ public final class UserMachinePreferences {
* @return True if this is a valid location for a temp directory. * @return True if this is a valid location for a temp directory.
* *
* @throws UserMachinePreferencesException If path could not be validated * @throws UserMachinePreferencesException If path could not be validated
* due to mkdirs failure or the * due to mkdirs failure or the directory is not read/write.
* directory is not read/write.
*/ */
@NbBundle.Messages({ @NbBundle.Messages({
"# {0} - path", "# {0} - path",
@ -98,9 +198,31 @@ public final class UserMachinePreferences {
* @throws UserMachinePreferencesException If the directory cannot be * @throws UserMachinePreferencesException If the directory cannot be
* accessed or created. * accessed or created.
*/ */
public static void setBaseTempDirectory(String path) throws UserMachinePreferencesException { public static void setCustomTempDirectory(String path) throws UserMachinePreferencesException {
validateTempDirectory(path); validateTempDirectory(path);
preferences.put(TEMP_DIR_KEY, path); preferences.put(CUSTOM_TEMP_DIR_KEY, path);
}
/**
* @return The user selection for how the temp directory should be handled
* (temp directory in case folder, in java.io.tmpdir, custom path).
*/
public static TempDirChoice getTempDirChoice() {
return TempDirChoice.getValue(preferences.get(TEMP_DIR_CHOICE_KEY, null))
.orElse(DEFAULT_CHOICE);
}
/**
* Sets the temp directory choice (i.e. system, case, custom).
* @param tempDirChoice The choice (must be non-null).
* @throws UserMachinePreferencesException
*/
public static void setTempDirChoice(TempDirChoice tempDirChoice) throws UserMachinePreferencesException {
if (tempDirChoice == null) {
throw new UserMachinePreferencesException("Expected non-null temp dir choice");
}
preferences.put(TEMP_DIR_CHOICE_KEY, tempDirChoice.name());
} }
private UserMachinePreferences() { private UserMachinePreferences() {

View File

@ -14,7 +14,7 @@
<!-- for viewers --> <!-- for viewers -->
<dependency conf="autopsy_core->*" org="org.freedesktop.gstreamer" name="gst1-java-core" rev="1.0.0"/> <dependency conf="autopsy_core->*" org="org.freedesktop.gstreamer" name="gst1-java-core" rev="1.0.0"/>
<dependency conf="autopsy_core->*" org="net.java.dev.jna" name="jna-platform" rev="5.7.0"/> <dependency conf="autopsy_core->*" org="net.java.dev.jna" name="jna-platform" rev="5.8.0"/>
<!-- for file search --> <!-- for file search -->
<dependency conf="autopsy_core->*" org="com.github.lgooddatepicker" name="LGoodDatePicker" rev="10.3.1"/> <dependency conf="autopsy_core->*" org="com.github.lgooddatepicker" name="LGoodDatePicker" rev="10.3.1"/>

View File

@ -42,8 +42,8 @@ file.reference.javassist-3.12.1.GA.jar=release/modules/ext/javassist-3.12.1.GA.j
file.reference.jfxtras-common-8.0-r4.jar=release/modules/ext/jfxtras-common-8.0-r4.jar file.reference.jfxtras-common-8.0-r4.jar=release/modules/ext/jfxtras-common-8.0-r4.jar
file.reference.jfxtras-controls-8.0-r4.jar=release/modules/ext/jfxtras-controls-8.0-r4.jar file.reference.jfxtras-controls-8.0-r4.jar=release/modules/ext/jfxtras-controls-8.0-r4.jar
file.reference.jfxtras-fxml-8.0-r4.jar=release/modules/ext/jfxtras-fxml-8.0-r4.jar file.reference.jfxtras-fxml-8.0-r4.jar=release/modules/ext/jfxtras-fxml-8.0-r4.jar
file.reference.jna-5.7.0.jar=release/modules/ext/jna-5.7.0.jar file.reference.jna-5.8.0.jar=release/modules/ext/jna-5.8.0.jar
file.reference.jna-platform-5.7.0.jar=release/modules/ext/jna-platform-5.7.0.jar file.reference.jna-platform-5.8.0.jar=release/modules/ext/jna-platform-5.8.0.jar
file.reference.joda-time-2.4.jar=release/modules/ext/joda-time-2.4.jar file.reference.joda-time-2.4.jar=release/modules/ext/joda-time-2.4.jar
file.reference.jsr305-1.3.9.jar=release/modules/ext/jsr305-1.3.9.jar file.reference.jsr305-1.3.9.jar=release/modules/ext/jsr305-1.3.9.jar
file.reference.LGoodDatePicker-10.3.1.jar=release/modules/ext/LGoodDatePicker-10.3.1.jar file.reference.LGoodDatePicker-10.3.1.jar=release/modules/ext/LGoodDatePicker-10.3.1.jar

View File

@ -923,8 +923,8 @@
<binary-origin>release/modules/ext/commons-compress-1.18.jar</binary-origin> <binary-origin>release/modules/ext/commons-compress-1.18.jar</binary-origin>
</class-path-extension> </class-path-extension>
<class-path-extension> <class-path-extension>
<runtime-relative-path>ext/jna-platform-5.7.0.jar</runtime-relative-path> <runtime-relative-path>ext/jna-platform-5.8.0.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jna-platform-5.7.0.jar</binary-origin> <binary-origin>release\modules\ext\jna-platform-5.8.0.jar</binary-origin>
</class-path-extension> </class-path-extension>
<class-path-extension> <class-path-extension>
<runtime-relative-path>ext/opencv-248.jar</runtime-relative-path> <runtime-relative-path>ext/opencv-248.jar</runtime-relative-path>
@ -951,8 +951,8 @@
<binary-origin>release/modules/ext/imageio-bmp-3.2.jar</binary-origin> <binary-origin>release/modules/ext/imageio-bmp-3.2.jar</binary-origin>
</class-path-extension> </class-path-extension>
<class-path-extension> <class-path-extension>
<runtime-relative-path>ext/jna-5.7.0.jar</runtime-relative-path> <runtime-relative-path>ext/jna-5.8.0.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jna-5.7.0.jar</binary-origin> <binary-origin>release\modules\ext\jna-5.8.0.jar</binary-origin>
</class-path-extension> </class-path-extension>
<class-path-extension> <class-path-extension>
<runtime-relative-path>ext/commons-lang-2.6.jar</runtime-relative-path> <runtime-relative-path>ext/commons-lang-2.6.jar</runtime-relative-path>

View File

@ -33,6 +33,7 @@ Reporting:
Misc: Misc:
- Added support for Ext4 inline data and sparse blocks (via TSK fix). - Added support for Ext4 inline data and sparse blocks (via TSK fix).
- Fixed timeline controller deadlock issue
- Updated PostgreSQL JDBC driver to support any recent version of PostgreSQL for multi-user cases and PostgreSQL Central Repository. - Updated PostgreSQL JDBC driver to support any recent version of PostgreSQL for multi-user cases and PostgreSQL Central Repository.
- Added personas to the summary viewer in CVT. - Added personas to the summary viewer in CVT.
- Handling of bad characters in auto ingest manifest files. - Handling of bad characters in auto ingest manifest files.

View File

@ -876,7 +876,10 @@ class ExtractRegistry extends Extract {
try{ try{
createOrUpdateOsAccount(regFile, sid, username, homeDir); createOrUpdateOsAccount(regFile, sid, username, homeDir);
} catch(TskCoreException | TskDataException ex) { } catch (OsAccountManager.NotUserSIDException ex) {
logger.log(Level.WARNING, String.format("Cannot create OsAccount for file: %s, sid: %s is not a user SID.", regFile.getId(), sid));
}
catch(TskCoreException | TskDataException ex ) {
logger.log(Level.SEVERE, String.format("Failed to create OsAccount for file: %s, sid: %s", regFile.getId(), sid)); logger.log(Level.SEVERE, String.format("Failed to create OsAccount for file: %s, sid: %s", regFile.getId(), sid));
} }
@ -1216,7 +1219,10 @@ class ExtractRegistry extends Extract {
logger.log(Level.WARNING, "Error parsing the the date from the registry file", ex); //NON-NLS logger.log(Level.WARNING, "Error parsing the the date from the registry file", ex); //NON-NLS
} catch (TskDataException | TskCoreException ex) { } catch (TskDataException | TskCoreException ex) {
logger.log(Level.WARNING, "Error updating TSK_OS_ACCOUNT artifacts to include newly parsed data.", ex); //NON-NLS logger.log(Level.WARNING, "Error updating TSK_OS_ACCOUNT artifacts to include newly parsed data.", ex); //NON-NLS
} finally { } catch (OsAccountManager.NotUserSIDException ex) {
logger.log(Level.WARNING, "Error creating OS Account, input SID is not a user SID.", ex); //NON-NLS
}
finally {
if (!context.dataSourceIngestIsCancelled()) { if (!context.dataSourceIngestIsCancelled()) {
postArtifacts(newArtifacts); postArtifacts(newArtifacts);
} }
@ -2206,8 +2212,9 @@ class ExtractRegistry extends Extract {
* *
* @throws TskCoreException * @throws TskCoreException
* @throws TskDataException * @throws TskDataException
* @throws OsAccountManager.NotUserSIDException
*/ */
private void createOrUpdateOsAccount(AbstractFile file, String sid, String userName, String homeDir) throws TskCoreException, TskDataException { private void createOrUpdateOsAccount(AbstractFile file, String sid, String userName, String homeDir) throws TskCoreException, TskDataException, OsAccountManager.NotUserSIDException {
OsAccountManager accountMgr = tskCase.getOsAccountManager(); OsAccountManager accountMgr = tskCase.getOsAccountManager();
HostManager hostMrg = tskCase.getHostManager(); HostManager hostMrg = tskCase.getHostManager();
Host host = hostMrg.getHost((DataSource)dataSource); Host host = hostMrg.getHost((DataSource)dataSource);

View File

@ -7,9 +7,9 @@ suite.dir=${basedir}
nbplatform.active=download nbplatform.active=download
nbplatform.active.dir=${suite.dir}/netbeans-plat/${netbeans-plat-version} nbplatform.active.dir=${suite.dir}/netbeans-plat/${netbeans-plat-version}
harness.dir=${nbplatform.active.dir}/harness harness.dir=${nbplatform.active.dir}/harness
bootstrap.url=https://netbeans-vm.apache.org/uc/${netbeans-plat-version}/tasks.jar bootstrap.url=https://netbeans-vm1.apache.org/uc/${netbeans-plat-version}/tasks.jar
# Where we get the platform from. To see what versions are available, open URL in browser up to the .../updates part of the URL # Where we get the platform from. To see what versions are available, open URL in browser up to the .../updates part of the URL
autoupdate.catalog.url=https://netbeans-vm.apache.org/uc/${netbeans-plat-version}/updates.xml.gz autoupdate.catalog.url=https://netbeans-vm1.apache.org/uc/${netbeans-plat-version}/updates.xml.gz
cluster.path=\ cluster.path=\
${nbplatform.active.dir}/harness:\ ${nbplatform.active.dir}/harness:\
${nbplatform.active.dir}/java:\ ${nbplatform.active.dir}/java:\