From c221ea08c0e41c76ff29deac3583b5731f2a07a3 Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Fri, 16 Oct 2015 16:25:31 -0400 Subject: [PATCH 01/41] better error messages when unable to create or open remote database --- .../autopsy/casemodule/Bundle.properties | 2 + .../sleuthkit/autopsy/casemodule/Case.java | 44 +++++++++++----- .../autopsy/casemodule/CaseOpenAction.java | 10 ++-- .../casemodule/NewCaseWizardAction.java | 52 ++++++++++++++----- .../casemodule/OpenRecentCasePanel.java | 11 +++- .../autopsy/casemodule/RecentItems.java | 9 +++- 6 files changed, 95 insertions(+), 33 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index cfcb914c4d..b09ffbed54 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -260,3 +260,5 @@ NewCaseVisualPanel1.singleUserCaseRadioButton.text=Single-user NewCaseVisualPanel1.multiUserSettingsWarningLabel.text=Multi-user settings warning label Case.deleteReports.deleteFromDiskException.log.msg=Unable to delete the report from the disk. Case.deleteReports.deleteFromDiskException.msg=Unable to delete the report {0} from the disk.\nYou may manually delete it from {1} +CaseOpenException.DatabaseSettingsIssue=Database settings: +CaseExceptionWarning.CheckMultiUserOptions=Check Multi-user options. \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index a4e477fada..f1cc6fd34a 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -18,6 +18,7 @@ */ package org.sleuthkit.autopsy.casemodule; +import java.awt.Cursor; import java.awt.Frame; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; @@ -321,6 +322,9 @@ public class Case implements SleuthkitCase.ErrorObserver { Case oldCase = Case.currentCase; Case.currentCase = null; if (oldCase != null) { + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + }); doCaseChange(null); //closes windows, etc if (null != oldCase.tskErrorReporter) { oldCase.tskErrorReporter.shutdown(); // stop listening for TSK errors for the old case @@ -344,7 +348,7 @@ public class Case implements SleuthkitCase.ErrorObserver { } // start listening for TSK errors for the new case currentCase.tskErrorReporter = new IntervalErrorReportData(currentCase, MIN_SECONDS_BETWEEN_ERROR_REPORTS, - NbBundle.getMessage(Case.class, "IntervalErrorReport.ErrorText")); + NbBundle.getMessage(Case.class, "IntervalErrorReport.ErrorText")); doCaseChange(currentCase); SwingUtilities.invokeLater(() -> { RecentCases.getInstance().addRecentCase(currentCase.name, currentCase.configFilePath); // update the recent cases @@ -369,8 +373,11 @@ public class Case implements SleuthkitCase.ErrorObserver { } else { Logger.setLogDirectory(PlatformUtil.getLogDirectory()); } + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }); } - + @Override public void receiveError(String context, String errorMessage) { /* NOTE: We are accessing tskErrorReporter from two different threads. @@ -452,9 +459,11 @@ public class Case implements SleuthkitCase.ErrorObserver { db = SleuthkitCase.newCase(dbName, UserPreferences.getDatabaseConnectionInfo(), caseDir); } } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Error creating a case: " + caseName + " in dir " + caseDir, ex); //NON-NLS - throw new CaseActionException( - NbBundle.getMessage(Case.class, "Case.create.exception.msg", caseName, caseDir), ex); + logger.log(Level.SEVERE, "Error creating a case: " + caseName + " in dir " + caseDir + " " + ex.getMessage(), ex); //NON-NLS + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }); + throw new CaseActionException(NbBundle.getMessage(Case.class, "CaseOpenException.DatabaseSettingsIssue") + " " + ex.getMessage()); //NON-NLS } /** @@ -604,19 +613,29 @@ public class Case implements SleuthkitCase.ErrorObserver { Case openedCase = new Case(caseName, caseNumber, examiner, caseMetadataFilePath, xmlcm, db, caseType); changeCase(openedCase); - } catch (CaseMetadataException | TskCoreException ex) { + } catch (CaseMetadataException ex) { /** * Clean-up the case if it was actually opened. TODO: Do this * better. */ + try { + Case badCase = Case.getCurrentCase(); + badCase.closeCase(); + } catch (IllegalStateException unused) { + // Already logged. + } + throw new CaseActionException(NbBundle.getMessage(Case.class, "Case.open.exception.gen.msg") + ". " + ex.getMessage(), ex); //NON-NLS + } catch (TskCoreException ex) { try { Case badCase = Case.getCurrentCase(); badCase.closeCase(); } catch (CaseActionException | IllegalStateException unused) { // Already logged. } - - throw new CaseActionException(NbBundle.getMessage(Case.class, "Case.open.exception.gen.msg") + ". " + ex.getMessage(), ex); + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }); + throw new CaseActionException(NbBundle.getMessage(Case.class, "CaseOpenException.DatabaseSettingsIssue") + " " + ex.getMessage(), ex); //NON-NLS } } @@ -643,8 +662,7 @@ public class Case implements SleuthkitCase.ErrorObserver { for (Map.Entry entry : imgPaths.entrySet()) { long obj_id = entry.getKey(); String path = entry.getValue(); - boolean fileExists = (pathExists(path) - || driveExists(path)); + boolean fileExists = (pathExists(path) || driveExists(path)); if (!fileExists) { int ret = JOptionPane.showConfirmDialog(null, NbBundle.getMessage(Case.class, @@ -675,7 +693,7 @@ public class Case implements SleuthkitCase.ErrorObserver { * * @deprecated As of release 4.0, replaced by {@link #notifyAddingDataSource(java.util.UUID) and * {@link #notifyDataSourceAdded(org.sleuthkit.datamodel.Content, java.util.UUID) and - * {@link #notifyFailedAddingDataSource(java.util.UUID)} + * {@link #notifyFailedAddingDataSource(java.util.UUID)} */ @Deprecated public Image addImage(String imgPath, long imgId, String timeZone) throws CaseActionException { @@ -690,13 +708,13 @@ public class Case implements SleuthkitCase.ErrorObserver { /** * Finishes adding new local data source to the case. Sends out event and - * reopens windows if needed. + * reopens windows if needed. * * @param newDataSource new data source added * * @deprecated As of release 4.0, replaced by {@link #notifyAddingDataSource(java.util.UUID) and * {@link #notifyDataSourceAdded(org.sleuthkit.datamodel.Content, java.util.UUID) and - * {@link #notifyFailedAddingDataSource(java.util.UUID)} + * {@link #notifyFailedAddingDataSource(java.util.UUID)} */ @Deprecated void addLocalDataSource(Content newDataSource) { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java index 7cea2ef29e..5c16b16fd2 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java @@ -18,6 +18,7 @@ */ package org.sleuthkit.autopsy.casemodule; +import java.awt.Cursor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; @@ -80,18 +81,22 @@ public final class CaseOpenAction implements ActionListener { } /** - * Try to open the caswe associated with the case meta data file the + * Try to open the case associated with the case meta data file the * user selected. */ final String path = fileChooser.getSelectedFile().getPath(); String dirPath = fileChooser.getSelectedFile().getParent(); ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, PROP_BASECASE, dirPath.substring(0, dirPath.lastIndexOf(File.separator))); + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); new Thread(() -> { try { Case.open(path); } catch (CaseActionException ex) { SwingUtilities.invokeLater(() -> { - JOptionPane.showMessageDialog(null, ex.getMessage(), NbBundle.getMessage(this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"), JOptionPane.ERROR_MESSAGE); + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), ex.getMessage() + " " + + NbBundle.getMessage(this.getClass(), "CaseExceptionWarning.CheckMultiUserOptions"), + NbBundle.getMessage(this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"), JOptionPane.ERROR_MESSAGE); //NON-NLS if (!Case.isCaseOpen()) { StartupWindowProvider.getInstance().open(); } @@ -100,5 +105,4 @@ public final class CaseOpenAction implements ActionListener { }).start(); } } - } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java index 5e6b5e5ceb..797a074267 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java @@ -41,12 +41,20 @@ import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.datamodel.CaseDbConnectionInfo; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskData.DbType; +import java.awt.HeadlessException; +import java.util.MissingResourceException; +import java.util.concurrent.ExecutionException; +import org.openide.windows.WindowManager; +import org.sleuthkit.datamodel.TskCoreException; +import java.awt.Cursor; /** * Action to open the New Case wizard. */ final class NewCaseWizardAction extends CallableSystemAction { + private static final long serialVersionUID = 1L; + private WizardDescriptor.Panel[] panels; private static final Logger logger = Logger.getLogger(NewCaseWizardAction.class.getName()); @@ -109,29 +117,42 @@ final class NewCaseWizardAction extends CallableSystemAction { @Override protected void done() { + final String caseName = (String) wizardDescriptor.getProperty("caseName"); //NON-NLS try { get(); CaseType currentCaseType = CaseType.values()[(int) wizardDescriptor.getProperty("caseType")]; //NON-NLS CaseDbConnectionInfo info = UserPreferences.getDatabaseConnectionInfo(); - if ((currentCaseType == CaseType.SINGLE_USER_CASE) || ((info.getDbType() != DbType.SQLITE) && SleuthkitCase.tryConnectOld(info.getHost(), info.getPort(), info.getUserName(), info.getPassword(), info.getDbType()))) { + + if (currentCaseType == CaseType.SINGLE_USER_CASE) { AddImageAction addImageAction = SystemAction.get(AddImageAction.class); addImageAction.actionPerformed(null); } else { - JOptionPane.showMessageDialog(null, - NbBundle.getMessage(this.getClass(), "NewCaseWizardAction.databaseProblem1.text"), - NbBundle.getMessage(this.getClass(), "NewCaseWizardAction.databaseProblem2.text"), - JOptionPane.ERROR_MESSAGE); - doFailedCaseCleanup(wizardDescriptor); + if (info.getDbType() != DbType.SQLITE) { + SleuthkitCase.tryConnect(info); + AddImageAction addImageAction = SystemAction.get(AddImageAction.class); + addImageAction.actionPerformed(null); + } else { + JOptionPane.showMessageDialog(null, + NbBundle.getMessage(this.getClass(), "NewCaseWizardAction.databaseProblem1.text"), + NbBundle.getMessage(this.getClass(), "NewCaseWizardAction.databaseProblem2.text"), + JOptionPane.ERROR_MESSAGE); + doFailedCaseCleanup(wizardDescriptor); + } } - - } catch (Exception ex) { - final String caseName = (String) wizardDescriptor.getProperty("caseName"); //NON-NLS + } catch (InterruptedException | ExecutionException | MissingResourceException | TskCoreException | HeadlessException ex) { SwingUtilities.invokeLater(() -> { - JOptionPane.showMessageDialog(null, NbBundle.getMessage(this.getClass(), - "CaseCreateAction.msgDlg.cantCreateCase.msg") + " " + caseName, - NbBundle.getMessage(this.getClass(), - "CaseOpenAction.msgDlg.cantOpenCase.title"), - JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), ex.getCause().getMessage() + " " + + NbBundle.getMessage(this.getClass(), "CaseExceptionWarning.CheckMultiUserOptions"), + NbBundle.getMessage(this.getClass(), "CaseCreateAction.msgDlg.cantCreateCase.msg"), + JOptionPane.ERROR_MESSAGE); //NON-NLS + + try { + StartupWindowProvider.getInstance().close(); + } catch (Exception unused) { + } + if (!Case.isCaseOpen()) { + StartupWindowProvider.getInstance().open(); + } }); doFailedCaseCleanup(wizardDescriptor); } @@ -151,6 +172,9 @@ final class NewCaseWizardAction extends CallableSystemAction { logger.log(Level.INFO, "Deleting a created case directory due to an error, dir: {0}", createdDirectory); //NON-NLS Case.deleteCaseDirectory(new File(createdDirectory)); } + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }); } /** diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java index 9741296bde..00b4b600c3 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java @@ -28,6 +28,8 @@ import javax.swing.SwingUtilities; import javax.swing.table.AbstractTableModel; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.Logger; +import org.openide.windows.WindowManager; +import java.awt.Cursor; /** * Panel show from the splash dialog that shows recent cases and allows them to @@ -196,7 +198,7 @@ class OpenRecentCasePanel extends javax.swing.JPanel { } // Open the recent cases if (caseName.equals("") || casePath.equals("") || (!new File(casePath).exists())) { - JOptionPane.showMessageDialog(null, + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), NbBundle.getMessage(this.getClass(), "OpenRecentCasePanel.openCase.msgDlg.caseDoesntExist.msg", caseName), @@ -211,12 +213,17 @@ class OpenRecentCasePanel extends javax.swing.JPanel { } } else { + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + }); new Thread(() -> { try { Case.open(casePath); } catch (CaseActionException ex) { SwingUtilities.invokeLater(() -> { - JOptionPane.showMessageDialog(null, ex.getMessage(), NbBundle.getMessage(this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"), JOptionPane.ERROR_MESSAGE); + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), ex.getMessage(), + NbBundle.getMessage(this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"), JOptionPane.ERROR_MESSAGE); //NON-NLS if (!Case.isCaseOpen()) { StartupWindowProvider.getInstance().open(); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java index a4859c9846..7782ba6230 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java @@ -26,6 +26,8 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingUtilities; import org.openide.util.NbBundle; +import org.openide.windows.WindowManager; +import java.awt.Cursor; /** * This class is used to add the action to the recent case menu item. When the @@ -70,13 +72,18 @@ class RecentItems implements ActionListener { } } else { + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + }); new Thread(() -> { // Create case. try { Case.open(casePath); } catch (CaseActionException ex) { SwingUtilities.invokeLater(() -> { - JOptionPane.showMessageDialog(null, ex.getMessage(), NbBundle.getMessage(RecentItems.this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"), JOptionPane.ERROR_MESSAGE); + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), ex.getMessage(), + NbBundle.getMessage(RecentItems.this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"), JOptionPane.ERROR_MESSAGE); //NON-NLS if (!Case.isCaseOpen()) { StartupWindowProvider.getInstance().open(); } From 6327732a8b81be6ec8a843d10b4cbda1b1338111 Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Fri, 16 Oct 2015 16:36:43 -0400 Subject: [PATCH 02/41] merge --- .../org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java index 797a074267..6d6efd12da 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java @@ -47,6 +47,7 @@ import java.util.concurrent.ExecutionException; import org.openide.windows.WindowManager; import org.sleuthkit.datamodel.TskCoreException; import java.awt.Cursor; +import org.sleuthkit.autopsy.core.UserPreferencesException; /** * Action to open the New Case wizard. @@ -139,7 +140,7 @@ final class NewCaseWizardAction extends CallableSystemAction { doFailedCaseCleanup(wizardDescriptor); } } - } catch (InterruptedException | ExecutionException | MissingResourceException | TskCoreException | HeadlessException ex) { + } catch (InterruptedException | ExecutionException | MissingResourceException | TskCoreException | HeadlessException | UserPreferencesException ex) { SwingUtilities.invokeLater(() -> { JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), ex.getCause().getMessage() + " " + NbBundle.getMessage(this.getClass(), "CaseExceptionWarning.CheckMultiUserOptions"), From 276d9e1c636b9f996cc53b2a5180df2733888c3e Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Mon, 19 Oct 2015 16:01:30 -0400 Subject: [PATCH 03/41] add scroll pane for multi user options --- .../MultiUserSettingsPanel.form | 860 +++++++++--------- .../MultiUserSettingsPanel.java | 8 +- 2 files changed, 439 insertions(+), 429 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.form index 57f1eca7d5..0ffb633a41 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.form @@ -16,86 +16,36 @@ - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - + - + - - - - - - - - - - - - + - - + + + + + + @@ -104,416 +54,472 @@ - - - - - + + + - - - + - - - - - + + + - + - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - + + + + + + + + + + + + + + + - + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - - + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java index 0a26244edc..88ab83e5e2 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java @@ -143,6 +143,7 @@ public final class MultiUserSettingsPanel extends javax.swing.JPanel { // //GEN-BEGIN:initComponents private void initComponents() { + jScrollPane = new javax.swing.JScrollPane(); pnOverallPanel = new javax.swing.JPanel(); pnDatabaseSettings = new javax.swing.JPanel(); tbDbHostname = new javax.swing.JTextField(); @@ -432,15 +433,17 @@ public final class MultiUserSettingsPanel extends javax.swing.JPanel { .addContainerGap(39, Short.MAX_VALUE)) ); + jScrollPane.setViewportView(pnOverallPanel); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(pnOverallPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 555, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 555, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(pnOverallPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 559, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 559, Short.MAX_VALUE) ); }// //GEN-END:initComponents @@ -800,6 +803,7 @@ public final class MultiUserSettingsPanel extends javax.swing.JPanel { private javax.swing.JButton bnTestMessageService; private javax.swing.JButton bnTestSolr; private javax.swing.JCheckBox cbEnableMultiUser; + private javax.swing.JScrollPane jScrollPane; private javax.swing.JLabel lbDatabaseSettings; private javax.swing.JLabel lbMessageServiceSettings; private javax.swing.JLabel lbSolrSettings; From cc92ac6bc53bac58817b7793477de394b59925f5 Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Mon, 19 Oct 2015 17:19:04 -0400 Subject: [PATCH 04/41] add database info to case properties --- .../autopsy/casemodule/Bundle.properties | 4 + .../casemodule/CasePropertiesForm.form | 132 +++++++++++------ .../casemodule/CasePropertiesForm.java | 136 +++++++++++------- 3 files changed, 177 insertions(+), 95 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index c9a86ea72f..8af4905638 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -261,3 +261,7 @@ NewCaseVisualPanel1.singleUserCaseRadioButton.text=Single-user NewCaseVisualPanel1.multiUserSettingsWarningLabel.text=Multi-user settings warning label Case.deleteReports.deleteFromDiskException.log.msg=Unable to delete the report from the disk. Case.deleteReports.deleteFromDiskException.msg=Unable to delete the report {0} from the disk.\nYou may manually delete it from {1} +CasePropertiesForm.lbDbType.text=Database Type: +CasePropertiesForm.tbDbType.text= +CasePropertiesForm.lbDbName.text=Database Name: +CasePropertiesForm.tbDbName.text= diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.form b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.form index ddbcd7e243..133475120c 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.form @@ -1,4 +1,4 @@ - +
@@ -37,49 +37,44 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + @@ -92,38 +87,51 @@ - + - + - + - + - + - + - + - + + + + + + + + + + + - + + + + @@ -253,11 +261,11 @@ + - @@ -304,5 +312,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.java index 5a60ca75d7..5c6df573da 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.java @@ -24,12 +24,11 @@ */ package org.sleuthkit.autopsy.casemodule; -import java.awt.*; +import java.nio.file.Paths; import java.awt.event.ActionListener; import java.io.File; import java.util.Map; import java.util.logging.Level; - import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.JOptionPane; @@ -47,7 +46,9 @@ import org.openide.util.actions.CallableSystemAction; */ class CasePropertiesForm extends javax.swing.JPanel { - Case current = null; + private static final long serialVersionUID = 1L; + + private Case current = null; private static JPanel caller; // panel for error // Shrink a path to fit in targetLength (if necessary), by replaceing part @@ -85,9 +86,22 @@ class CasePropertiesForm extends javax.swing.JPanel { examinerTextField.setText(currentCase.getExaminer()); crDateTextField.setText(crDate); caseDirTextArea.setText(caseDir); - current = currentCase; + try { + CaseMetadata caseMetadata = new CaseMetadata(Paths.get(currentCase.getConfigFilePath())); + tbDbName.setText(caseMetadata.getCaseDatabaseName()); + Case.CaseType caseType = caseMetadata.getCaseType(); + tbDbType.setText(caseType.toString()); + if (caseType == Case.CaseType.SINGLE_USER_CASE) { + deleteCaseButton.setEnabled(true); + } else { + deleteCaseButton.setEnabled(false); + } + } catch (CaseMetadata.CaseMetadataException ex) { + Logger.getLogger(CasePropertiesForm.class.getName()).log(Level.WARNING, "Could not read case properties.", ex); //NON-NLS + } + int totalImages = imgPaths.size(); // create the headers and add all the rows @@ -186,12 +200,16 @@ class CasePropertiesForm extends javax.swing.JPanel { examinerLabel = new javax.swing.JLabel(); caseNumberTextField = new javax.swing.JTextField(); examinerTextField = new javax.swing.JTextField(); + lbDbType = new javax.swing.JLabel(); + tbDbType = new javax.swing.JTextField(); + lbDbName = new javax.swing.JLabel(); + tbDbName = new javax.swing.JTextField(); jTextArea1.setColumns(20); jTextArea1.setRows(5); jScrollPane1.setViewportView(jTextArea1); - casePropLabel.setFont(casePropLabel.getFont().deriveFont(Font.BOLD, 24)); + casePropLabel.setFont(new java.awt.Font("Tahoma", 1, 24)); // NOI18N casePropLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); casePropLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, "CasePropertiesForm.casePropLabel.text")); // NOI18N @@ -213,11 +231,10 @@ class CasePropertiesForm extends javax.swing.JPanel { } }); - genInfoLabel.setFont(genInfoLabel.getFont().deriveFont(Font.BOLD, 14)); - genInfoLabel.setText( - org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, "CasePropertiesForm.genInfoLabel.text")); // NOI18N + genInfoLabel.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N + genInfoLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, "CasePropertiesForm.genInfoLabel.text")); // NOI18N - imgInfoLabel.setFont(imgInfoLabel.getFont().deriveFont(Font.BOLD, 14)); + imgInfoLabel.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N imgInfoLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, "CasePropertiesForm.imgInfoLabel.text")); // NOI18N OKButton.setText(org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, "CasePropertiesForm.OKButton.text")); // NOI18N @@ -227,7 +244,7 @@ class CasePropertiesForm extends javax.swing.JPanel { }, new String [] { - "Path", "Remove" //NON-NLS + "Path", "Remove" } ) { boolean[] canEdit = new boolean [] { @@ -244,9 +261,9 @@ class CasePropertiesForm extends javax.swing.JPanel { imagesTable.setUpdateSelectionOnSort(false); imagesTableScrollPane.setViewportView(imagesTable); + caseDirTextArea.setEditable(false); caseDirTextArea.setBackground(new java.awt.Color(240, 240, 240)); caseDirTextArea.setColumns(20); - caseDirTextArea.setEditable(false); caseDirTextArea.setRows(1); caseDirTextArea.setRequestFocusEnabled(false); jScrollPane2.setViewportView(caseDirTextArea); @@ -268,6 +285,16 @@ class CasePropertiesForm extends javax.swing.JPanel { examinerTextField.setEditable(false); examinerTextField.setText(org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, "CasePropertiesForm.examinerTextField.text")); // NOI18N + lbDbType.setText(org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, "CasePropertiesForm.lbDbType.text")); // NOI18N + + tbDbType.setEditable(false); + tbDbType.setText(org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, "CasePropertiesForm.tbDbType.text")); // NOI18N + + lbDbName.setText(org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, "CasePropertiesForm.lbDbName.text")); // NOI18N + + tbDbName.setEditable(false); + tbDbName.setText(org.openide.util.NbBundle.getMessage(CasePropertiesForm.class, "CasePropertiesForm.tbDbName.text")); // NOI18N + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -276,38 +303,37 @@ class CasePropertiesForm extends javax.swing.JPanel { .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(casePropLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 440, Short.MAX_VALUE) - .addComponent(genInfoLabel) - .addComponent(imgInfoLabel) .addComponent(imagesTableScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 440, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() - .addGap(181, 181, 181) - .addComponent(OKButton, javax.swing.GroupLayout.PREFERRED_SIZE, 78, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(caseNameLabel) - .addComponent(caseNumberLabel)) - .addGap(25, 25, 25) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(caseNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 246, Short.MAX_VALUE) - .addComponent(caseNumberTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 246, Short.MAX_VALUE))) - .addGroup(layout.createSequentialGroup() - .addComponent(examinerLabel) - .addGap(45, 45, 45) - .addComponent(examinerTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 246, Short.MAX_VALUE)) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(caseDirLabel) - .addComponent(crDateLabel)) - .addGap(18, 18, 18) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 246, Short.MAX_VALUE) - .addComponent(crDateTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 246, Short.MAX_VALUE)))) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(caseNameLabel) + .addComponent(caseNumberLabel) + .addComponent(examinerLabel) + .addComponent(caseDirLabel) + .addComponent(crDateLabel) + .addComponent(lbDbType)) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(caseNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 244, Short.MAX_VALUE) + .addComponent(caseNumberTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 244, Short.MAX_VALUE) + .addComponent(examinerTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 244, Short.MAX_VALUE) + .addComponent(crDateTextField) + .addComponent(jScrollPane2) + .addComponent(tbDbType) + .addComponent(tbDbName)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(updateCaseNameButton) - .addComponent(deleteCaseButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) + .addComponent(deleteCaseButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(updateCaseNameButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(genInfoLabel) + .addComponent(imgInfoLabel) + .addGroup(layout.createSequentialGroup() + .addGap(181, 181, 181) + .addComponent(OKButton, javax.swing.GroupLayout.PREFERRED_SIZE, 78, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(lbDbName)) + .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); layout.setVerticalGroup( @@ -317,32 +343,42 @@ class CasePropertiesForm extends javax.swing.JPanel { .addComponent(casePropLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(genInfoLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(caseNameLabel) .addComponent(caseNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(updateCaseNameButton)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(caseNumberLabel) .addComponent(caseNumberTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(18, 18, 18) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(examinerLabel) .addComponent(examinerTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 19, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(crDateLabel) .addComponent(crDateTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(caseDirLabel) - .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(39, 39, 39) + .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(caseDirLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(tbDbType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbDbType)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lbDbName) + .addComponent(tbDbName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(18, 18, 18) .addComponent(imgInfoLabel)) - .addComponent(deleteCaseButton)) + .addGroup(layout.createSequentialGroup() + .addGap(9, 9, 9) + .addComponent(deleteCaseButton))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(imagesTableScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 170, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) @@ -445,6 +481,10 @@ class CasePropertiesForm extends javax.swing.JPanel { private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JTextArea jTextArea1; + private javax.swing.JLabel lbDbName; + private javax.swing.JLabel lbDbType; + private javax.swing.JTextField tbDbName; + private javax.swing.JTextField tbDbType; private javax.swing.JButton updateCaseNameButton; // End of variables declaration//GEN-END:variables From c8141cafab54d93e769c60a24846b03edba603e3 Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Tue, 20 Oct 2015 09:18:30 -0400 Subject: [PATCH 05/41] no multi-user settings is not an error --- Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties | 5 ++--- .../sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java | 2 -- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index c9a86ea72f..d2b97417e3 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -192,7 +192,6 @@ MissingImageDialog.ErrorSettingImage=Error setting image path. Please try again. NewCaseVisualPanel1.getName.text=Case Info NewCaseVisualPanel1.caseDirBrowse.selectButton.text=Select NewCaseVisualPanel1.badCredentials.text=Bad multi-user settings (see Tools, Options, Multi-user) or services are down. -NewCaseVisualPanel1.MultiUserDisabled.text=Multi-user cases not enabled. See Tools, Options, Multi-user. NewCaseVisualPanel2.getName.text=Additional Information NewCaseWizardAction.closeCurCase.confMsg.msg=Do you want to save and close this case and proceed with the new case creation? NewCaseWizardAction.closeCurCase.confMsg.title=Warning\: Closing the Current Case @@ -255,9 +254,9 @@ SingleUserCaseImporter.WillNotImport=Will not import: SingleUserCaseImporter.None=None SingleUserCaseImporter.ContinueWithImport=Continue with import? SingleUserCaseImporter.Cancelled=Cancelled -NewCaseVisualPanel1.caseParentDirWarningLabel.text=Case directory warning label +NewCaseVisualPanel1.caseParentDirWarningLabel.text= NewCaseVisualPanel1.multiUserCaseRadioButton.text=Multi-user NewCaseVisualPanel1.singleUserCaseRadioButton.text=Single-user -NewCaseVisualPanel1.multiUserSettingsWarningLabel.text=Multi-user settings warning label +NewCaseVisualPanel1.multiUserSettingsWarningLabel.text= Case.deleteReports.deleteFromDiskException.log.msg=Unable to delete the report from the disk. Case.deleteReports.deleteFromDiskException.msg=Unable to delete the report {0} from the disk.\nYou may manually delete it from {1} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java index 6aebc0fe99..c2f41afbde 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java @@ -62,11 +62,9 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { if (UserPreferences.getIsMultiUserModeEnabled()) { multiUserCaseRadioButton.setEnabled(true); multiUserCaseRadioButton.setSelected(true); - multiUserSettingsWarningLabel.setVisible(false); } else { multiUserCaseRadioButton.setEnabled(false); singleUserCaseRadioButton.setSelected(true); - multiUserSettingsWarningLabel.setText(NbBundle.getMessage(this.getClass(), "NewCaseVisualPanel1.MultiUserDisabled.text")); } validateSettings(); } From b6130fe9355486d3274b518c3cc3c42a33e495ac Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Thu, 22 Oct 2015 13:52:02 -0400 Subject: [PATCH 06/41] refactor case importer --- .../autopsy/casemodule/Bundle.properties | 24 +- .../sleuthkit/autopsy/casemodule/Case.java | 4 +- .../casemodule/ImportDoneCallback.java | 6 - ...rter.java => SingleUserCaseConverter.java} | 891 ++++++------------ .../autopsy/coreutils/TimeStampUtils.java | 97 -- 5 files changed, 283 insertions(+), 739 deletions(-) delete mode 100644 Core/src/org/sleuthkit/autopsy/casemodule/ImportDoneCallback.java rename Core/src/org/sleuthkit/autopsy/casemodule/{SingleUserCaseImporter.java => SingleUserCaseConverter.java} (56%) delete mode 100644 Core/src/org/sleuthkit/autopsy/coreutils/TimeStampUtils.java diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index 617d0efa69..d37a1c3935 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -239,22 +239,6 @@ CollaborationMonitor.addingDataSourceStatus.msg={0} adding data source CollaborationMonitor.analyzingDataSourceStatus.msg={0} analyzing {1} MissingImageDialog.lbWarning.text= MissingImageDialog.lbWarning.toolTipText= -SingleUserCaseImporter.AlreadyMultiUser=Case is already multi-user! -SingleUserCaseImporter.BadCaseSourceFolder=Case source folder does not exist! -SingleUserCaseImporter.BadImageSourceFolder=Image source folder does not exist! -SingleUserCaseImporter.BadDatabaseFileName=Database file does not exist! -SingleUserCaseImporter.NonUniqueOutputFolder=Output folder not unique. Skipping -SingleUserCaseImporter.NonUniqueDatabaseName=Database name not unique. Skipping. -SingleUserCaseImporter.PotentiallyNonUniqueDatabaseName=Unclear if database name unique. Moving ahead. -SingleUserCaseImporter.ImportedAsMultiUser=\nThis case was imported as a multi-user collaborative case on -SingleUserCaseImporter.UnableToCopySourceImages=Unable to copy source images -SingleUserCaseImporter.DeletingCase=Deleting original case folder -SingleUserCaseImporter.CanNotOpenDatabase=Unable to open database -SingleUserCaseImporter.WillImport=Will import: -SingleUserCaseImporter.WillNotImport=Will not import: -SingleUserCaseImporter.None=None -SingleUserCaseImporter.ContinueWithImport=Continue with import? -SingleUserCaseImporter.Cancelled=Cancelled NewCaseVisualPanel1.caseParentDirWarningLabel.text=Case directory warning label NewCaseVisualPanel1.multiUserCaseRadioButton.text=Multi-user NewCaseVisualPanel1.singleUserCaseRadioButton.text=Single-user @@ -262,4 +246,10 @@ NewCaseVisualPanel1.multiUserSettingsWarningLabel.text=Multi-user settings warni Case.deleteReports.deleteFromDiskException.log.msg=Unable to delete the report from the disk. Case.deleteReports.deleteFromDiskException.msg=Unable to delete the report {0} from the disk.\nYou may manually delete it from {1} CaseOpenException.DatabaseSettingsIssue=Database settings: -CaseExceptionWarning.CheckMultiUserOptions=Check Multi-user options. \ No newline at end of file +CaseExceptionWarning.CheckMultiUserOptions=Check Multi-user options. +SingleUserCaseConverter.BadDatabaseFileName=Database file does not exist! +SingleUserCaseConverter.AlreadyMultiUser=Case is already multi-user! +SingleUserCaseConverter.ImportedAsMultiUser=\nThis case was imported as a multi-user collaborative case on +SingleUserCaseConverter.NonUniqueDatabaseName=Database name not unique. Skipping. +SingleUserCaseConverter.UnableToCopySourceImages=Unable to copy source images +SingleUserCaseConverter.CanNotOpenDatabase=Unable to open database diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index 7b9172a968..684052dc09 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -507,7 +507,7 @@ public class Case implements SleuthkitCase.ErrorObserver { * * @return the sanitized case name to use for Database, Solr, and ActiveMQ */ - public static String sanitizeCaseName(String caseName) { + static String sanitizeCaseName(String caseName) { String result; @@ -897,7 +897,7 @@ public class Case implements SleuthkitCase.ErrorObserver { RecentCases.getInstance().updateRecentCase(oldCaseName, oldPath, newCaseName, newPath); // update the recent case updateMainWindowTitle(newCaseName); } catch (Exception e) { - Logger.getLogger(CasePropertiesForm.class.getName()).log(Level.WARNING, "Error: problem updating case name.", e); //NON-NLS + Logger.getLogger(Case.class.getName()).log(Level.WARNING, "Error: problem updating case name.", e); //NON-NLS } }); } catch (Exception e) { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/ImportDoneCallback.java b/Core/src/org/sleuthkit/autopsy/casemodule/ImportDoneCallback.java deleted file mode 100644 index bb83712cc3..0000000000 --- a/Core/src/org/sleuthkit/autopsy/casemodule/ImportDoneCallback.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.sleuthkit.autopsy.casemodule; - -public interface ImportDoneCallback { - - void importDoneCallback(boolean result, String resultString); -} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseImporter.java b/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java similarity index 56% rename from Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseImporter.java rename to Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java index b5498cc284..f986755097 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseImporter.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java @@ -18,18 +18,10 @@ */ package org.sleuthkit.autopsy.casemodule; -import java.awt.Dimension; -import java.io.BufferedWriter; import java.io.File; -import java.io.FileWriter; import java.io.IOException; -import java.io.PrintWriter; -import java.nio.file.FileVisitResult; -import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.nio.file.SimpleFileVisitor; -import java.nio.file.attribute.BasicFileAttributes; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; @@ -37,208 +29,193 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleDateFormat; -import java.time.Instant; -import java.util.ArrayList; import java.util.Date; -import java.util.logging.Level; -import javax.swing.JOptionPane; -import static javax.swing.JOptionPane.OK_CANCEL_OPTION; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.SwingUtilities; import org.apache.commons.io.FileUtils; import org.openide.util.NbBundle; -import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.casemodule.Case.CaseType; import static org.sleuthkit.autopsy.casemodule.Case.MODULE_FOLDER; -import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.core.UserPreferences; +import org.sleuthkit.autopsy.core.UserPreferencesException; import org.sleuthkit.datamodel.CaseDbConnectionInfo; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.autopsy.coreutils.NetworkUtils; -import org.sleuthkit.autopsy.coreutils.TimeStampUtils; -import org.sleuthkit.autopsy.coreutils.UNCPathUtilities; /** - * Import case(s) from single-user to multi-user. Recursively scans subfolders. + * Import a case from single-user to multi-user. */ -public class SingleUserCaseImporter implements Runnable { +public class SingleUserCaseConverter { private static final String AUTOPSY_DB_FILE = "autopsy.db"; //NON-NLS private static final String DOTAUT = ".aut"; //NON-NLS - public static final String CASE_IMPORT_LOG_FILE = "case_import_log.txt"; //NON-NLS - private static final String logDateFormat = "yyyy/MM/dd HH:mm:ss"; //NON-NLS - //If TIMELINE_FOLDER changes, also update TIMELINE in EventsRepository private static final String TIMELINE_FOLDER = "Timeline"; //NON-NLS - //If TIMELINE_FILE changes, also update TIMELINE_FILE in EventDB - private final static String TIMELINE_FILE = "events.db"; //NON-NLS - private final static String AIM_LOG_FILE_NAME = "auto_ingest_log.txt"; //NON-NLS - private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(logDateFormat); + private static final String TIMELINE_FILE = "events.db"; //NON-NLS + private static final String POSTGRES_DEFAULT_DB_NAME = "postgres"; private static final int MAX_DB_NAME_LENGTH = 63; - private final String SEP = System.getProperty("line.separator"); - private final Object threadWaitNotifyLock = new Object(); - private final Path caseInputFolder; - private final String caseOutputFolder; - private final String imageInputFolder; - private final String imageOutputFolder; - private final boolean copySourceImages; - private final boolean deleteCase; - private final CaseDbConnectionInfo db; - private final ImportDoneCallback notifyOnComplete; - private final UNCPathUtilities uncPathUtilities = new UNCPathUtilities(); - private PrintWriter writer; - private XMLCaseManagement oldXmlCaseManagement; - private XMLCaseManagement newXmlCaseManagement; - private boolean addTimestamp; - private int userAnswer = 0; + public class ImportCaseData { - /** - * SingleUserCaseImporter constructor - * - * @param caseInput the folder to start our case search from. Will - * find valid cases from this folder down, and - * process them. - * @param caseOutput the folder to place processed cases into - * @param imageInput the folder that holds the images to copy over - * @param imageOutput the destination folder for the images - * @param database the connection information to talk to the - * PostgreSQL db - * @param copySourceImages true if images should be copied - * @param deleteCase true if the old version of the case should be - * deleted after import - * @param addTimestamp true if the output case name should end in a - * timestamp, false otherwise - * @param callback a callback from the calling panel for - * notification when the import has completed. This - * is a Runnable on a different thread. - */ - public SingleUserCaseImporter(String caseInput, String caseOutput, String imageInput, String imageOutput, CaseDbConnectionInfo database, - boolean copySourceImages, boolean deleteCase, ImportDoneCallback callback, boolean addTimestamp) { - this.caseInputFolder = Paths.get(caseInput); - this.caseOutputFolder = caseOutput; - this.imageInputFolder = imageInput; - this.imageOutputFolder = imageOutput; - this.copySourceImages = copySourceImages; - this.deleteCase = deleteCase; - this.db = database; - this.notifyOnComplete = callback; - this.addTimestamp = addTimestamp; - } + private final Path baseImageInputFolder; + private final Path baseCaseInputFolder; + private final Path baseImageOutputFolder; + private final Path baseCaseOutputFolder; + private final Path imageInputFolder; + private final Path caseInputFolder; + private final Path imageOutputFolder; + private final Path caseOutputFolder; + private final String oldCaseName; + private final String newCaseName; + private final boolean copySourceImages; + private final boolean deleteCase; + private String postgreSQLDbName; + private final String autFileName; + private final String rawFolderName; + private final CaseDbConnectionInfo db; - /** - * Tests if the input path has a corresponding image input folder and no - * repeated case names in the path. If both of these conditions are true, we - * can process this case, otherwise we can not. - * - * @param icd the import case data for the current case - * - * @return true if we can process it, false if not - */ - private boolean canProcess(ImportCaseData icd) { - try { - String relativeCaseName = TimeStampUtils.removeTimeStamp(icd.getRelativeCaseName()); - String caseName = TimeStampUtils.removeTimeStamp(icd.getOldCaseName()); + public ImportCaseData( + Path baseImageInputFolder, + Path baseCaseInputFolder, + Path baseImageOutputFolder, + Path baseCaseOutputFolder, + Path imageInput, + Path caseInput, + Path imageOutput, + Path caseOutput, + String oldCaseName, + String newCaseName, + String autFileName, + String rawFolderName, + boolean copySourceImages, + boolean deleteCase) throws UserPreferencesException { - // check for image folder - Path testImageInputsFromOldCase = Paths.get(imageInputFolder, relativeCaseName); - if (copySourceImages) { - if (!testImageInputsFromOldCase.toFile().isDirectory()) { - log(imageInputFolder + " has no corresponding images folder. Not able to process."); - return false; - } else { - icd.setSpecificImageInputFolder(testImageInputsFromOldCase); - } - - Path imagePath = Paths.get(imageInputFolder); - // see if case name is in the image path. This causes bad things to happen with the parsing. - for (int x = 0; x < imagePath.getNameCount(); ++x) { - if (caseName.toLowerCase().equals(imagePath.getName(x).toString().toLowerCase())) { - log(imagePath.toString() + " has case name \"" + caseName + "\" within path. Not able to process."); - return false; - } - } - } else { - icd.setSpecificImageInputFolder(testImageInputsFromOldCase); - } - } catch (Exception ex) { - log("Error processing " + icd.specificCaseInputFolder.toString() + ": " + ex.getMessage()); - return false; // anything goes wrong, bail. + this.baseImageInputFolder = baseImageInputFolder; + this.baseCaseInputFolder = baseCaseInputFolder; + this.baseImageOutputFolder = baseImageOutputFolder; + this.baseCaseOutputFolder = baseCaseOutputFolder; + this.imageInputFolder = imageInput; + this.caseInputFolder = caseInput; + this.imageOutputFolder = imageOutput; + this.caseOutputFolder = caseOutput; + this.oldCaseName = oldCaseName; + this.newCaseName = newCaseName; + this.autFileName = autFileName; + this.rawFolderName = rawFolderName; + this.copySourceImages = copySourceImages; + this.deleteCase = deleteCase; + this.db = UserPreferences.getDatabaseConnectionInfo(); } - return true; + public Path getCaseInputFolder() { + return this.caseInputFolder; + } + + public Path getCaseOutputFolder() { + return this.caseOutputFolder; + } + + Path getImageInputFolder() { + return this.imageInputFolder; + } + + Path getImageOutputFolder() { + return this.imageOutputFolder; + } + + String getOldCaseName() { + return this.oldCaseName; + } + + String getNewCaseName() { + return this.newCaseName; + } + + boolean getCopySourceImages() { + return this.copySourceImages; + } + + boolean getDeleteCase() { + return this.deleteCase; + } + + String getPostgreSQLDbName() { + return this.postgreSQLDbName; + } + + String getAutFileName() { + return this.autFileName; + } + + String getRawFolderName() { + return this.rawFolderName; + } + + CaseDbConnectionInfo getDb() { + return this.db; + } + + void setPostgreSQLDbName(String dbName) { + this.postgreSQLDbName = dbName; + } } /** - * Handles most of the heavy lifting for importing cases from single-user to - * multi-user. Creates new .aut file, moves folders to the right place, - * imports the database, and updates paths within the database. + * Handles most of the heavy lifting for importing a case from single-user + * to multi-user. Creates new .aut file, moves folders to the right place, + * imports the , and updates paths within the database. * * @param icd the Import Case Data for the current case * - * @return true if successful, false if not + * @throws java.lang.Exception */ - private boolean processCase(ImportCaseData icd) { - boolean result = true; - try { - log("Importing case " + icd.getSpecificCaseInputFolder().toString() + " to " + caseOutputFolder + "\\" + icd.getOldCaseName()); //NON-NLS + public static void importCase(ImportCaseData icd) throws Exception { - checkInputDatabase(icd.getSpecificCaseInputFolder()); + Class.forName("org.postgresql.Driver"); //NON-NLS - oldXmlCaseManagement = new XMLCaseManagement(); - - // read old xml config - oldXmlCaseManagement.open(icd.getSpecificCaseInputFolder().resolve(TimeStampUtils.removeTimeStamp(icd.getOldCaseName()) + DOTAUT).toString()); - if (oldXmlCaseManagement.getCaseType() == CaseType.MULTI_USER_CASE) { - throw new Exception(NbBundle.getMessage(SingleUserCaseImporter.class, "SingleUserCaseImporter.AlreadyMultiUser")); - } - - prepareOutput(icd); - - // create sanitized names for database and solr - String caseName = TimeStampUtils.removeTimeStamp(icd.getNewCaseName()); // caseName holds the deconflicted, timestampless name of the case - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss"); //NON-NLS - Date date = new Date(); - String santizedDatabaseName = Case.sanitizeCaseName(caseName); - String dbName = santizedDatabaseName + "_" + dateFormat.format(date); //NON-NLS - String solrName = dbName; - - icd.setSpecificImageOutputFolder(Paths.get(imageOutputFolder, icd.getNewCaseName())); - copyResults(icd); // Copy items to new hostname folder structure - dbName = importDb(dbName, icd.getSpecificCaseInputFolder(), icd.getSpecificCaseOutputFolder().toString()); // Change from SQLite to PostgreSQL - - fixPaths(icd, dbName); // Update paths in DB - - copyImages(icd); // Copy images over - - // create new XML config - newXmlCaseManagement = new XMLCaseManagement(); - newXmlCaseManagement.create(icd.getSpecificCaseOutputFolder().toString(), - caseName, - oldXmlCaseManagement.getCaseExaminer(), - oldXmlCaseManagement.getCaseNumber(), - CaseType.MULTI_USER_CASE, dbName, solrName); - - // Set created date. This calls writefile, no need to call it again - newXmlCaseManagement.setCreatedDate(oldXmlCaseManagement.getCreatedDate()); - - // At this point the import has been finished successfully so we can delete the original case - // (if requested). This *should* be fairly safe - at this point we know there was an autopsy file - // and database in the given directory so the user shouldn't be able to accidently blow away - // their C drive. - if (deleteCase) { - log(NbBundle.getMessage(SingleUserCaseImporter.class, "SingleUserCaseImporter.DeletingCase") + " " + icd.getSpecificCaseInputFolder().toString()); - FileUtils.deleteDirectory(icd.getSpecificCaseInputFolder().toFile()); - } - - result = reportLostImages(db, dbName); - - log("Finished importing case " + icd.getSpecificCaseInputFolder().toString() + " to " + icd.getSpecificCaseOutputFolder().toString()); - } catch (Exception exp) { - /// clean up here - log("Error processing " + icd.specificCaseInputFolder.toString() + ": " + exp.getMessage()); - result = false; + Path oldDatabasePath = icd.getCaseInputFolder().resolve(AUTOPSY_DB_FILE); + if (false == oldDatabasePath.toFile().exists()) { + throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.BadDatabaseFileName")); } - return result; + + // read old xml config + XMLCaseManagement oldXmlCaseManagement = new XMLCaseManagement(); + oldXmlCaseManagement.open(icd.getCaseInputFolder().resolve(icd.getAutFileName()).toString()); + if (oldXmlCaseManagement.getCaseType() == CaseType.MULTI_USER_CASE) { + throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.AlreadyMultiUser")); + } + + // create sanitized names for database and solr + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss"); //NON-NLS + Date date = new Date(); + String dbName = Case.sanitizeCaseName(icd.getNewCaseName()) + "_" + dateFormat.format(date); //NON-NLS + String solrName = dbName; + icd.setPostgreSQLDbName(dbName); + + copyResults(icd); // Copy items to new hostname folder structure + + importDb(icd); // Change from SQLite to PostgreSQL + + fixPaths(icd); // Update paths in DB + + copyImages(icd); // Copy images over + + // create new XML config + XMLCaseManagement newXmlCaseManagement = new XMLCaseManagement(); + newXmlCaseManagement.create(icd.getCaseOutputFolder().toString(), + icd.getNewCaseName(), + oldXmlCaseManagement.getCaseExaminer(), + oldXmlCaseManagement.getCaseNumber(), + CaseType.MULTI_USER_CASE, dbName, solrName); + + // Set created date. This calls writefile, no need to call it again + newXmlCaseManagement.setCreatedDate(oldXmlCaseManagement.getCreatedDate()); + + // At this point the import has been finished successfully so we can delete the original case + // (if requested). This *should* be fairly safe - at this point we know there was an autopsy file + // and database in the given directory so the user shouldn't be able to accidently blow away + // their C drive. + if (icd.getDeleteCase()) { + FileUtils.deleteDirectory(icd.getCaseInputFolder().toFile()); + } + reportLostImages(icd); } /** @@ -250,29 +227,24 @@ public class SingleUserCaseImporter implements Runnable { * * @return true if successfully found all images, false otherwise. */ - private boolean reportLostImages(CaseDbConnectionInfo db, String dbName) { - boolean result = true; - if (copySourceImages) { + private static void reportLostImages(ImportCaseData icd) { + if (icd.getCopySourceImages()) { try { - Class.forName("org.postgresql.Driver"); //NON-NLS - Connection dbConnection = DriverManager.getConnection("jdbc:postgresql://" + db.getHost() + ":" + db.getPort() + "/" + dbName, db.getUserName(), db.getPassword()); //NON-NLS - Statement inputStatement = dbConnection.createStatement(); + Connection postgreSQLConnection = getPostgreSQLConnection(icd); + Statement inputStatement = postgreSQLConnection.createStatement(); ResultSet inputResultSet = inputStatement.executeQuery("SELECT * FROM tsk_image_names"); //NON-NLS while (inputResultSet.next()) { File theFile = new File(inputResultSet.getString(2)); if (false == theFile.exists()) { - log("Unable to find image " + theFile.toString() + " for case " + dbName); - result = false; + // do not throw, this can be fixed when they open the case } } - } catch (Exception ex) { - log("Error. Unable to verify images were copied."); - result = false; + } catch (SQLException ex) { + // do not throw, this can be fixed when they open the case } } - return result; } /** @@ -282,73 +254,17 @@ public class SingleUserCaseImporter implements Runnable { * * @return the name of the proper input folder */ - private File findInputFolder(ImportCaseData icd) { + private static File findInputFolder(ImportCaseData icd) { - File thePath = icd.getSpecificImageInputFolder().resolve(icd.getOldCaseName()).toFile(); + File thePath = icd.getImageInputFolder().resolve(icd.getOldCaseName()).toFile(); if (thePath.isDirectory()) { /// we've found it return thePath; } else { - return icd.getSpecificImageInputFolder().toFile(); + return icd.getImageInputFolder().toFile(); } } - /** - * Ensure the input source has an autopsy.db and exists. - * - * @param caseInput The folder containing a case to import. - * - * @throws Exception - */ - private void checkInputDatabase(Path caseInput) throws Exception { - Path path = caseInput.resolve(AUTOPSY_DB_FILE); - if (false == path.toFile().exists()) { - throw new Exception(NbBundle.getMessage(SingleUserCaseImporter.class, "SingleUserCaseImporter.BadDatabaseFileName")); - } - } - - /** - * Handles case folder, PosgreSql database, and Solr core name deconfliction - * Sets the appropriate portions of the ImportCaseData object. - * - * @param icd the case data folder name - * - * @throws Exception - */ - private void prepareOutput(ImportCaseData icd) throws Exception { - // test for uniqueness - String caseName = icd.getOldCaseName(); - File specificOutputFolder = Paths.get(caseOutputFolder, caseName).toFile(); - String sanitizedCaseName = caseName; - if (specificOutputFolder.exists()) { - // not unique. add numbers before timestamp to specific case name - String timeStamp = TimeStampUtils.getTimeStampOnly(caseName); //NON-NLS - sanitizedCaseName = TimeStampUtils.removeTimeStamp(caseName); - - int number = 1; - String temp = ""; //NON-NLS - while (specificOutputFolder.exists()) { - if (number == Integer.MAX_VALUE) { - // oops. it never became unique. give up. - throw new Exception(NbBundle.getMessage(SingleUserCaseImporter.class, "SingleUserCaseImporter.NonUniqueOutputFolder") + sanitizedCaseName); - } - temp = sanitizedCaseName + "_" + Integer.toString(number) + timeStamp; //NON-NLS - specificOutputFolder = Paths.get(caseOutputFolder, temp).toFile(); - ++number; - } - sanitizedCaseName = temp; - } - - if (addTimestamp && !TimeStampUtils.endsWithTimeStamp(sanitizedCaseName)) { - sanitizedCaseName += "_" + TimeStampUtils.createTimeStamp(); - } - - Path caseOutputPath = Paths.get(caseOutputFolder, sanitizedCaseName); - icd.setNewCaseName(sanitizedCaseName); - icd.setSpecificCaseOutputFolder(caseOutputPath); - caseOutputPath.toFile().mkdirs(); // create output folders just in case - } - /** * Copy all the folders at the base level to the new scheme involving * hostname. Also take care of a few files such as logs, timeline db, etc. @@ -357,56 +273,39 @@ public class SingleUserCaseImporter implements Runnable { * * @throws IOException */ - private void copyResults(ImportCaseData icd) throws IOException { + private static void copyResults(ImportCaseData icd) throws IOException { /// get hostname String hostName = NetworkUtils.getLocalHostName(); Path destination; Path source; - source = icd.getSpecificCaseInputFolder(); + source = icd.getCaseInputFolder(); if (source.toFile().exists()) { - destination = icd.getSpecificCaseOutputFolder().resolve(hostName); + destination = icd.getCaseOutputFolder().resolve(hostName); FileUtils.copyDirectory(source.toFile(), destination.toFile()); } - source = icd.getSpecificCaseInputFolder().resolve(TIMELINE_FILE); + source = icd.getCaseInputFolder().resolve(TIMELINE_FILE); if (source.toFile().exists()) { - destination = Paths.get(icd.getSpecificCaseOutputFolder().toString(), hostName, MODULE_FOLDER, TIMELINE_FOLDER, TIMELINE_FILE); + destination = Paths.get(icd.getCaseOutputFolder().toString(), hostName, MODULE_FOLDER, TIMELINE_FOLDER, TIMELINE_FILE); FileUtils.copyFile(source.toFile(), destination.toFile()); } - source = icd.getSpecificCaseInputFolder().resolve(AIM_LOG_FILE_NAME); - destination = icd.getSpecificCaseOutputFolder().resolve(AIM_LOG_FILE_NAME); - if (source.toFile().exists()) { - FileUtils.copyFile(source.toFile(), destination.toFile()); - - } - try (PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(destination.toString(), true)))) { - out.println(NbBundle.getMessage(SingleUserCaseImporter.class, "SingleUserCaseImporter.ImportedAsMultiUser") + new Date()); - } catch (IOException e) { - // if unable to log it, no problem - } - // Remove the single-user .aut file, database, Timeline database and log - File oldAutopsyFile = Paths.get(icd.getSpecificCaseOutputFolder().toString(), hostName, TimeStampUtils.removeTimeStamp(icd.getOldCaseName()) + DOTAUT).toFile(); + File oldAutopsyFile = Paths.get(icd.getCaseOutputFolder().toString(), hostName, icd.getOldCaseName() + DOTAUT).toFile(); if (oldAutopsyFile.exists()) { oldAutopsyFile.delete(); } - File oldDatabaseFile = Paths.get(icd.getSpecificCaseOutputFolder().toString(), hostName, AUTOPSY_DB_FILE).toFile(); + File oldDatabaseFile = Paths.get(icd.getCaseOutputFolder().toString(), hostName, AUTOPSY_DB_FILE).toFile(); if (oldDatabaseFile.exists()) { oldDatabaseFile.delete(); } - File oldTimelineFile = Paths.get(icd.getSpecificCaseOutputFolder().toString(), hostName, TIMELINE_FILE).toFile(); + File oldTimelineFile = Paths.get(icd.getCaseOutputFolder().toString(), hostName, TIMELINE_FILE).toFile(); if (oldTimelineFile.exists()) { oldTimelineFile.delete(); } - - File oldIngestLog = Paths.get(icd.getSpecificCaseOutputFolder().toString(), hostName, AIM_LOG_FILE_NAME).toFile(); - if (oldIngestLog.exists()) { - oldIngestLog.delete(); - } } /** @@ -414,7 +313,7 @@ public class SingleUserCaseImporter implements Runnable { * data while loading it over. Fixing paths is done once the database is * completely imported. * - * @param dbName the name of the database, could have name collision + * @param newDbName the name of the database, could have name collision * @param inputPath the path to the input case * @param outputCaseName the name of the output case, could have extra * digits to avoid name collisions @@ -424,19 +323,18 @@ public class SingleUserCaseImporter implements Runnable { * @throws SQLException * @throws ClassNotFoundException */ - private String importDb(String dbName, Path inputPath, String outputCaseName) throws SQLException, ClassNotFoundException, Exception { + private static void importDb(ImportCaseData icd) throws SQLException, ClassNotFoundException, Exception { // deconflict the database name - dbName = deconflictDatabaseName(db, dbName); + deconflictDatabaseName(icd); // Create a new database via SleuthkitCase - SleuthkitCase newCase = SleuthkitCase.newCase(dbName, db, outputCaseName); + SleuthkitCase newCase = SleuthkitCase.newCase(icd.getPostgreSQLDbName(), icd.getDb(), icd.getCaseOutputFolder().toString()); newCase.close(); /// Migrate from SQLite to PostgreSQL Class.forName("org.sqlite.JDBC"); //NON-NLS - Connection sqliteConnection = DriverManager.getConnection("jdbc:sqlite:" + inputPath.resolve(AUTOPSY_DB_FILE).toString(), "", ""); //NON-NLS - - Connection postgresqlConnection = DriverManager.getConnection("jdbc:postgresql://" + db.getHost() + ":" + db.getPort() + "/" + dbName, db.getUserName(), db.getPassword()); //NON-NLS + Connection sqliteConnection = getSQLiteConnection(icd); + Connection postgreSQLConnection = getPostgreSQLConnection(icd); // blackboard_artifact_types Statement inputStatement = sqliteConnection.createStatement(); @@ -451,14 +349,14 @@ public class SingleUserCaseImporter implements Runnable { if (value > biggestPK) { biggestPK = value; } - Statement check = postgresqlConnection.createStatement(); + Statement check = postgreSQLConnection.createStatement(); ResultSet checkResult = check.executeQuery("SELECT * FROM blackboard_artifact_types WHERE artifact_type_id=" + value + " AND type_name LIKE '" + inputResultSet.getString(2) + "' AND display_name LIKE '" + inputResultSet.getString(3) + "'"); //NON-NLS if (!checkResult.isBeforeFirst()) { // only insert if it doesn't exist String sql = "INSERT INTO blackboard_artifact_types (artifact_type_id, type_name, display_name) VALUES (" + value + ", '" + SleuthkitCase.escapeSingleQuotes(inputResultSet.getString(2)) + "'," + " ? )"; //NON-NLS - PreparedStatement pst = postgresqlConnection.prepareStatement(sql); + PreparedStatement pst = postgreSQLConnection.prepareStatement(sql); populateNullableString(pst, inputResultSet, 3, 1); pst.executeUpdate(); } @@ -468,7 +366,7 @@ public class SingleUserCaseImporter implements Runnable { } } } - numberingPK = postgresqlConnection.createStatement(); + numberingPK = postgreSQLConnection.createStatement(); numberingPK.execute("ALTER SEQUENCE blackboard_artifact_types_artifact_type_id_seq RESTART WITH " + (biggestPK + 1)); //NON-NLS // blackboard_attribute_types @@ -482,7 +380,7 @@ public class SingleUserCaseImporter implements Runnable { if (value > biggestPK) { biggestPK = value; } - Statement check = postgresqlConnection.createStatement(); + Statement check = postgreSQLConnection.createStatement(); ResultSet checkResult = check.executeQuery("SELECT * FROM blackboard_attribute_types WHERE attribute_type_id=" + value + " AND type_name LIKE '" + inputResultSet.getString(2) + "' AND display_name LIKE '" + inputResultSet.getString(3) + "'"); //NON-NLS if (!checkResult.isBeforeFirst()) { // only insert if it doesn't exist String sql = "INSERT INTO blackboard_attribute_types (attribute_type_id, type_name, display_name) VALUES (" @@ -490,7 +388,7 @@ public class SingleUserCaseImporter implements Runnable { + SleuthkitCase.escapeSingleQuotes(inputResultSet.getString(2)) + "'," + " ? )"; //NON-NLS - PreparedStatement pst = postgresqlConnection.prepareStatement(sql); + PreparedStatement pst = postgreSQLConnection.prepareStatement(sql); populateNullableString(pst, inputResultSet, 3, 1); pst.executeUpdate(); } @@ -500,7 +398,7 @@ public class SingleUserCaseImporter implements Runnable { } } } - numberingPK = postgresqlConnection.createStatement(); + numberingPK = postgreSQLConnection.createStatement(); numberingPK.execute("ALTER SEQUENCE blackboard_attribute_types_attribute_type_id_seq RESTART WITH " + (biggestPK + 1)); //NON-NLS // tsk_objects @@ -509,7 +407,7 @@ public class SingleUserCaseImporter implements Runnable { inputResultSet = inputStatement.executeQuery("SELECT * FROM tsk_objects"); //NON-NLS while (inputResultSet.next()) { - outputStatement = postgresqlConnection.createStatement(); + outputStatement = postgreSQLConnection.createStatement(); try { long value = inputResultSet.getLong(1); if (value > biggestPK) { @@ -525,7 +423,7 @@ public class SingleUserCaseImporter implements Runnable { } } } - numberingPK = postgresqlConnection.createStatement(); + numberingPK = postgreSQLConnection.createStatement(); numberingPK.execute("ALTER SEQUENCE tsk_objects_obj_id_seq RESTART WITH " + (biggestPK + 1)); //NON-NLS // tsk_image_names, no primary key @@ -533,7 +431,7 @@ public class SingleUserCaseImporter implements Runnable { inputResultSet = inputStatement.executeQuery("SELECT * FROM tsk_image_names"); //NON-NLS while (inputResultSet.next()) { - outputStatement = postgresqlConnection.createStatement(); + outputStatement = postgreSQLConnection.createStatement(); try { outputStatement.executeUpdate("INSERT INTO tsk_image_names (obj_id, name, sequence) VALUES (" + inputResultSet.getLong(1) + ",'" @@ -552,7 +450,6 @@ public class SingleUserCaseImporter implements Runnable { inputResultSet = inputStatement.executeQuery("SELECT * FROM tsk_image_info"); //NON-NLS while (inputResultSet.next()) { - outputStatement = postgresqlConnection.createStatement(); try { long value = inputResultSet.getLong(1); if (value > biggestPK) { @@ -567,7 +464,7 @@ public class SingleUserCaseImporter implements Runnable { + " ? ," + " ? )"; //NON-NLS - PreparedStatement pst = postgresqlConnection.prepareStatement(sql); + PreparedStatement pst = postgreSQLConnection.prepareStatement(sql); populateNullableString(pst, inputResultSet, 4, 1); populateNullableString(pst, inputResultSet, 6, 2); populateNullableString(pst, inputResultSet, 7, 3); @@ -579,7 +476,7 @@ public class SingleUserCaseImporter implements Runnable { } } } - numberingPK = postgresqlConnection.createStatement(); + numberingPK = postgreSQLConnection.createStatement(); numberingPK.execute("ALTER SEQUENCE tsk_image_info_obj_id_seq RESTART WITH " + (biggestPK + 1)); //NON-NLS // tsk_fs_info @@ -604,7 +501,7 @@ public class SingleUserCaseImporter implements Runnable { + inputResultSet.getLong(8) + "," + " ? )"; //NON-NLS - PreparedStatement pst = postgresqlConnection.prepareStatement(sql); + PreparedStatement pst = postgreSQLConnection.prepareStatement(sql); populateNullableString(pst, inputResultSet, 9, 1); pst.executeUpdate(); @@ -614,7 +511,7 @@ public class SingleUserCaseImporter implements Runnable { } } } - numberingPK = postgresqlConnection.createStatement(); + numberingPK = postgreSQLConnection.createStatement(); numberingPK.execute("ALTER SEQUENCE tsk_fs_info_obj_id_seq RESTART WITH " + (biggestPK + 1)); //NON-NLS // tsk_files_path @@ -623,7 +520,7 @@ public class SingleUserCaseImporter implements Runnable { inputResultSet = inputStatement.executeQuery("SELECT * FROM tsk_files_path"); //NON-NLS while (inputResultSet.next()) { - outputStatement = postgresqlConnection.createStatement(); + outputStatement = postgreSQLConnection.createStatement(); try { long value = inputResultSet.getLong(1); if (value > biggestPK) { @@ -638,7 +535,7 @@ public class SingleUserCaseImporter implements Runnable { } } } - numberingPK = postgresqlConnection.createStatement(); + numberingPK = postgreSQLConnection.createStatement(); numberingPK.execute("ALTER SEQUENCE tsk_files_path_obj_id_seq RESTART WITH " + (biggestPK + 1)); //NON-NLS // tsk_files @@ -679,7 +576,7 @@ public class SingleUserCaseImporter implements Runnable { + getNullableInt(inputResultSet, 24) + "," + " ? )"; //NON-NLS - PreparedStatement pst = postgresqlConnection.prepareStatement(sql); + PreparedStatement pst = postgreSQLConnection.prepareStatement(sql); populateNullableString(pst, inputResultSet, 23, 1); populateNullableString(pst, inputResultSet, 25, 2); pst.executeUpdate(); @@ -690,7 +587,7 @@ public class SingleUserCaseImporter implements Runnable { } } } - numberingPK = postgresqlConnection.createStatement(); + numberingPK = postgreSQLConnection.createStatement(); numberingPK.execute("ALTER SEQUENCE tsk_files_obj_id_seq RESTART WITH " + (biggestPK + 1)); //NON-NLS // tsk_file_layout, no primary key @@ -698,7 +595,7 @@ public class SingleUserCaseImporter implements Runnable { inputResultSet = inputStatement.executeQuery("SELECT * FROM tsk_file_layout"); //NON-NLS while (inputResultSet.next()) { - outputStatement = postgresqlConnection.createStatement(); + outputStatement = postgreSQLConnection.createStatement(); try { outputStatement.executeUpdate("INSERT INTO tsk_file_layout (obj_id, byte_start, byte_len, sequence) VALUES (" + inputResultSet.getLong(1) + "," @@ -717,9 +614,9 @@ public class SingleUserCaseImporter implements Runnable { inputResultSet = inputStatement.executeQuery("SELECT * FROM tsk_db_info"); //NON-NLS while (inputResultSet.next()) { - outputStatement = postgresqlConnection.createStatement(); + outputStatement = postgreSQLConnection.createStatement(); try { - Statement check = postgresqlConnection.createStatement(); + Statement check = postgreSQLConnection.createStatement(); ResultSet checkResult = check.executeQuery("SELECT * FROM tsk_db_info WHERE schema_ver=" + inputResultSet.getInt(1) + " AND tsk_ver=" + inputResultSet.getInt(2)); //NON-NLS if (!checkResult.isBeforeFirst()) { // only insert if it doesn't exist outputStatement.executeUpdate("INSERT INTO tsk_db_info (schema_ver, tsk_ver) VALUES (" @@ -750,7 +647,7 @@ public class SingleUserCaseImporter implements Runnable { + SleuthkitCase.escapeSingleQuotes(inputResultSet.getString(3)) + "','" + SleuthkitCase.escapeSingleQuotes(inputResultSet.getString(4)) + "')"; //NON-NLS - PreparedStatement pst = postgresqlConnection.prepareStatement(sql); + PreparedStatement pst = postgreSQLConnection.prepareStatement(sql); populateNullableString(pst, inputResultSet, 2, 1); pst.executeUpdate(); @@ -760,7 +657,7 @@ public class SingleUserCaseImporter implements Runnable { } } } - numberingPK = postgresqlConnection.createStatement(); + numberingPK = postgreSQLConnection.createStatement(); numberingPK.execute("ALTER SEQUENCE tag_names_tag_name_id_seq RESTART WITH " + (biggestPK + 1)); //NON-NLS // reports @@ -769,7 +666,7 @@ public class SingleUserCaseImporter implements Runnable { inputResultSet = inputStatement.executeQuery("SELECT * FROM reports"); //NON-NLS while (inputResultSet.next()) { - outputStatement = postgresqlConnection.createStatement(); + outputStatement = postgreSQLConnection.createStatement(); try { long value = inputResultSet.getLong(1); if (value > biggestPK) { @@ -788,7 +685,7 @@ public class SingleUserCaseImporter implements Runnable { } } } - numberingPK = postgresqlConnection.createStatement(); + numberingPK = postgreSQLConnection.createStatement(); numberingPK.execute("ALTER SEQUENCE reports_report_id_seq RESTART WITH " + (biggestPK + 1)); //NON-NLS // blackboard_artifacts @@ -797,7 +694,7 @@ public class SingleUserCaseImporter implements Runnable { inputResultSet = inputStatement.executeQuery("SELECT * FROM blackboard_artifacts"); //NON-NLS while (inputResultSet.next()) { - outputStatement = postgresqlConnection.createStatement(); + outputStatement = postgreSQLConnection.createStatement(); try { long value = inputResultSet.getLong(1); if (value > biggestPK) { @@ -814,7 +711,7 @@ public class SingleUserCaseImporter implements Runnable { } } } - numberingPK = postgresqlConnection.createStatement(); + numberingPK = postgreSQLConnection.createStatement(); numberingPK.execute("ALTER SEQUENCE blackboard_artifacts_artifact_id_seq RESTART WITH " + (biggestPK + 1)); //NON-NLS // blackboard_attributes, no primary key @@ -835,7 +732,7 @@ public class SingleUserCaseImporter implements Runnable { + getNullableInt(inputResultSet, 9) + "," + getNullableLong(inputResultSet, 10) + "," + " ? )"; //NON-NLS - PreparedStatement pst = postgresqlConnection.prepareStatement(sql); + PreparedStatement pst = postgreSQLConnection.prepareStatement(sql); populateNullableString(pst, inputResultSet, 3, 1); populateNullableString(pst, inputResultSet, 4, 2); populateNullableByteArray(pst, inputResultSet, 7, 3); @@ -868,7 +765,7 @@ public class SingleUserCaseImporter implements Runnable { + inputResultSet.getLong(4) + "," + " ? ," + inputResultSet.getInt(6) + ")"; //NON-NLS - PreparedStatement pst = postgresqlConnection.prepareStatement(sql); + PreparedStatement pst = postgreSQLConnection.prepareStatement(sql); populateNullableString(pst, inputResultSet, 5, 1); pst.executeUpdate(); @@ -878,7 +775,7 @@ public class SingleUserCaseImporter implements Runnable { } } } - numberingPK = postgresqlConnection.createStatement(); + numberingPK = postgreSQLConnection.createStatement(); numberingPK.execute("ALTER SEQUENCE tsk_vs_parts_obj_id_seq RESTART WITH " + (biggestPK + 1)); //NON-NLS // tsk_vs_info @@ -887,7 +784,7 @@ public class SingleUserCaseImporter implements Runnable { inputResultSet = inputStatement.executeQuery("SELECT * FROM tsk_vs_info"); //NON-NLS while (inputResultSet.next()) { - outputStatement = postgresqlConnection.createStatement(); + outputStatement = postgreSQLConnection.createStatement(); try { long value = inputResultSet.getLong(1); if (value > biggestPK) { @@ -905,7 +802,7 @@ public class SingleUserCaseImporter implements Runnable { } } } - numberingPK = postgresqlConnection.createStatement(); + numberingPK = postgreSQLConnection.createStatement(); numberingPK.execute("ALTER SEQUENCE tsk_vs_info_obj_id_seq RESTART WITH " + (biggestPK + 1)); //NON-NLS // tsk_files_derived @@ -923,7 +820,7 @@ public class SingleUserCaseImporter implements Runnable { + value + "," + inputResultSet.getLong(2) + "," + " ? )"; //NON-NLS - PreparedStatement pst = postgresqlConnection.prepareStatement(sql); + PreparedStatement pst = postgreSQLConnection.prepareStatement(sql); populateNullableString(pst, inputResultSet, 3, 1); pst.executeUpdate(); @@ -933,7 +830,7 @@ public class SingleUserCaseImporter implements Runnable { } } } - numberingPK = postgresqlConnection.createStatement(); + numberingPK = postgreSQLConnection.createStatement(); numberingPK.execute("ALTER SEQUENCE tsk_files_derived_obj_id_seq RESTART WITH " + (biggestPK + 1)); //NON-NLS // tsk_files_derived_method @@ -952,7 +849,7 @@ public class SingleUserCaseImporter implements Runnable { + inputResultSet.getString(2) + "','" + inputResultSet.getString(3) + "'," + " ? )"; //NON-NLS - PreparedStatement pst = postgresqlConnection.prepareStatement(sql); + PreparedStatement pst = postgreSQLConnection.prepareStatement(sql); populateNullableString(pst, inputResultSet, 4, 1); pst.executeUpdate(); @@ -962,7 +859,7 @@ public class SingleUserCaseImporter implements Runnable { } } } - numberingPK = postgresqlConnection.createStatement(); + numberingPK = postgreSQLConnection.createStatement(); numberingPK.execute("ALTER SEQUENCE tsk_files_derived_method_derived_id_seq RESTART WITH " + (biggestPK + 1)); //NON-NLS // content_tags @@ -971,7 +868,7 @@ public class SingleUserCaseImporter implements Runnable { inputResultSet = inputStatement.executeQuery("SELECT * FROM content_tags"); //NON-NLS while (inputResultSet.next()) { - outputStatement = postgresqlConnection.createStatement(); + outputStatement = postgreSQLConnection.createStatement(); try { long value = inputResultSet.getLong(1); if (value > biggestPK) { @@ -991,7 +888,7 @@ public class SingleUserCaseImporter implements Runnable { } } } - numberingPK = postgresqlConnection.createStatement(); + numberingPK = postgreSQLConnection.createStatement(); numberingPK.execute("ALTER SEQUENCE content_tags_tag_id_seq RESTART WITH " + (biggestPK + 1)); //NON-NLS // blackboard_artifact_tags @@ -1000,7 +897,7 @@ public class SingleUserCaseImporter implements Runnable { inputResultSet = inputStatement.executeQuery("SELECT * FROM blackboard_artifact_tags"); //NON-NLS while (inputResultSet.next()) { - outputStatement = postgresqlConnection.createStatement(); + outputStatement = postgreSQLConnection.createStatement(); try { long value = inputResultSet.getLong(1); if (value > biggestPK) { @@ -1018,13 +915,11 @@ public class SingleUserCaseImporter implements Runnable { } } } - numberingPK = postgresqlConnection.createStatement(); + numberingPK = postgreSQLConnection.createStatement(); numberingPK.execute("ALTER SEQUENCE blackboard_artifact_tags_tag_id_seq RESTART WITH " + (biggestPK + 1)); //NON-NLS sqliteConnection.close(); - postgresqlConnection.close(); - - return dbName; + postgreSQLConnection.close(); } /** @@ -1041,21 +936,20 @@ public class SingleUserCaseImporter implements Runnable { * @throws SQLException * @throws Exception */ - private String deconflictDatabaseName(CaseDbConnectionInfo db, String baseDbName) throws ClassNotFoundException, SQLException, Exception { + private static void deconflictDatabaseName(ImportCaseData icd) throws ClassNotFoundException, SQLException, Exception { - Class.forName("org.postgresql.Driver"); //NON-NLS - Connection dbNameConnection = DriverManager.getConnection("jdbc:postgresql://" + db.getHost() + ":" + db.getPort() + "/postgres", db.getUserName(), db.getPassword()); //NON-NLS + Connection postgreSQLConnection = getPostgreSQLConnection(icd, POSTGRES_DEFAULT_DB_NAME); int number = 1; boolean unique = false; - String sanitizedDbName = baseDbName; + String sanitizedDbName = icd.getPostgreSQLDbName(); if (sanitizedDbName.length() > MAX_DB_NAME_LENGTH) { sanitizedDbName = sanitizedDbName.substring(0, MAX_DB_NAME_LENGTH); } - if (dbNameConnection != null) { + if (postgreSQLConnection != null) { while (unique == false) { - Statement st = dbNameConnection.createStatement(); + Statement st = postgreSQLConnection.createStatement(); ResultSet answer = st.executeQuery("SELECT datname FROM pg_catalog.pg_database WHERE LOWER(datname) LIKE LOWER('" + sanitizedDbName + "%')"); //NON-NLS if (!answer.next()) { @@ -1064,9 +958,9 @@ public class SingleUserCaseImporter implements Runnable { // not unique. add numbers before dbName. if (number == Integer.MAX_VALUE) { // oops. it never became unique. give up. - throw new Exception(NbBundle.getMessage(SingleUserCaseImporter.class, "SingleUserCaseImporter.NonUniqueDatabaseName")); + throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.NonUniqueDatabaseName")); } - sanitizedDbName = "_" + Integer.toString(number) + "_" + baseDbName; //NON-NLS + sanitizedDbName = "_" + Integer.toString(number) + "_" + icd.getPostgreSQLDbName(); //NON-NLS // Chop full db name to 63 characters (max for PostgreSQL) if (sanitizedDbName.length() > MAX_DB_NAME_LENGTH) { @@ -1075,14 +969,13 @@ public class SingleUserCaseImporter implements Runnable { ++number; } } - dbNameConnection.close(); + postgreSQLConnection.close(); } else { // Could be caused by database credentials, using user accounts that // can not check if other databases exist, so allow it to continue - log(NbBundle.getMessage(SingleUserCaseImporter.class, "SingleUserCaseImporter.PotentiallyNonUniqueDatabaseName")); } - return sanitizedDbName; + icd.setPostgreSQLDbName(sanitizedDbName); } /** @@ -1093,17 +986,17 @@ public class SingleUserCaseImporter implements Runnable { * * @throws IOException */ - private void copyImages(ImportCaseData icd) throws IOException { - if (copySourceImages) { + private static void copyImages(ImportCaseData icd) throws Exception { + if (icd.getCopySourceImages()) { File imageSource = findInputFolder(icd); // Find the folder for the input images - File imageDestination = new File(icd.getSpecificImageOutputFolder().toString()); + File imageDestination = new File(icd.getImageOutputFolder().toString()); // If we can find the input images, copy if needed. if (imageSource.exists()) { FileUtils.copyDirectory(imageSource, imageDestination); } else { - log(NbBundle.getMessage(SingleUserCaseImporter.class, "SingleUserCaseImporter.UnableToCopySourceImages")); + throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.UnableToCopySourceImages")); } } } @@ -1115,13 +1008,14 @@ public class SingleUserCaseImporter implements Runnable { * @param icd the import case data for the current case * @param dbName the name of the database */ - private void fixPaths(ImportCaseData icd, String dbName) throws SQLException { + private static void fixPaths(ImportCaseData icd) throws SQLException, Exception { /// Fix paths in reports, tsk_files_path, and tsk_image_names tables - String input = icd.getSpecificImageInputFolder().toString(); - String output = icd.getSpecificImageOutputFolder().toString(); + String input = icd.getImageInputFolder().toString(); + String output = icd.getImageOutputFolder().toString(); + + Connection postgresqlConnection = getPostgreSQLConnection(icd); - Connection postgresqlConnection = DriverManager.getConnection("jdbc:postgresql://" + db.getHost() + ":" + db.getPort() + "/" + dbName, db.getUserName(), db.getPassword()); //NON-NLS if (postgresqlConnection != null) { String hostName = NetworkUtils.getLocalHostName(); @@ -1133,9 +1027,9 @@ public class SingleUserCaseImporter implements Runnable { updateStatement = postgresqlConnection.createStatement(); updateStatement.executeUpdate("UPDATE tsk_files_path SET path=CONCAT('" + hostName + "\\', path) WHERE path IS NOT NULL AND path != ''"); //NON-NLS - String caseName = TimeStampUtils.removeTimeStamp(icd.getOldCaseName()).toLowerCase(); + String caseName = icd.getRawFolderName().toLowerCase(); - if (copySourceImages) { + if (icd.getCopySourceImages()) { // update path for images Statement inputStatement = postgresqlConnection.createStatement(); ResultSet inputResultSet = inputStatement.executeQuery("SELECT * FROM tsk_image_names"); //NON-NLS @@ -1155,7 +1049,7 @@ public class SingleUserCaseImporter implements Runnable { } postgresqlConnection.close(); } else { - log(NbBundle.getMessage(SingleUserCaseImporter.class, "SingleUserCaseImporter.CanNotOpenDatabase")); + throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.CanNotOpenDatabase")); } } @@ -1170,7 +1064,7 @@ public class SingleUserCaseImporter implements Runnable { * * @throws SQLException */ - private String getNullableInt(ResultSet rs, int index) throws SQLException { + private static String getNullableInt(ResultSet rs, int index) throws SQLException { int value = rs.getInt(index); if (rs.wasNull()) { return "NULL"; //NON-NLS @@ -1190,7 +1084,7 @@ public class SingleUserCaseImporter implements Runnable { * * @throws SQLException */ - private String getNullableLong(ResultSet rs, int index) throws SQLException { + private static String getNullableLong(ResultSet rs, int index) throws SQLException { long value = rs.getLong(index); if (rs.wasNull()) { return "NULL"; //NON-NLS @@ -1210,7 +1104,7 @@ public class SingleUserCaseImporter implements Runnable { * * @throws SQLException */ - private void populateNullableString(PreparedStatement pst, ResultSet rs, int rsIndex, int psIndex) throws SQLException { + private static void populateNullableString(PreparedStatement pst, ResultSet rs, int rsIndex, int psIndex) throws SQLException { String nullableString = rs.getString(rsIndex); if (rs.wasNull()) { pst.setNull(psIndex, java.sql.Types.NULL); @@ -1230,7 +1124,7 @@ public class SingleUserCaseImporter implements Runnable { * * @throws SQLException */ - private void populateNullableByteArray(PreparedStatement pst, ResultSet rs, int rsIndex, int psIndex) throws SQLException { + private static void populateNullableByteArray(PreparedStatement pst, ResultSet rs, int rsIndex, int psIndex) throws SQLException { byte[] nullableBytes = rs.getBytes(rsIndex); if (rs.wasNull()) { pst.setNull(psIndex, java.sql.Types.NULL); @@ -1250,7 +1144,7 @@ public class SingleUserCaseImporter implements Runnable { * * @throws SQLException */ - private void populateNullableNumeric(PreparedStatement pst, ResultSet rs, int rsIndex, int psIndex) throws SQLException { + private static void populateNullableNumeric(PreparedStatement pst, ResultSet rs, int rsIndex, int psIndex) throws SQLException { double nullableNumeric = rs.getDouble(rsIndex); if (rs.wasNull()) { pst.setNull(psIndex, java.sql.Types.NULL); @@ -1259,286 +1153,49 @@ public class SingleUserCaseImporter implements Runnable { } } - private class ImportCaseData { - - private Path specificCaseInputFolder; - private Path specificCaseOutputFolder; - private Path specificImageInputFolder; - private Path specificImageOutputFolder; - private String relativeCaseName; - private String newCaseName; - private String oldCaseName; - - public Path getSpecificCaseInputFolder() { - return specificCaseInputFolder; - } - - public Path getSpecificCaseOutputFolder() { - return specificCaseOutputFolder; - } - - public Path getSpecificImageInputFolder() { - return specificImageInputFolder; - } - - public Path getSpecificImageOutputFolder() { - return specificImageOutputFolder; - } - - public String getRelativeCaseName() { - return relativeCaseName; - } - - public String getOldCaseName() { - return oldCaseName; - } - - public String getNewCaseName() { - return newCaseName; - } - - public void setSpecificCaseInputFolder(Path caseInputFolder) { - this.specificCaseInputFolder = caseInputFolder; - } - - public void setSpecificCaseOutputFolder(Path caseOutputFolder) { - this.specificCaseOutputFolder = caseOutputFolder; - } - - public void setSpecificImageInputFolder(Path imageInputFolder) { - this.specificImageInputFolder = imageInputFolder; - } - - public void setSpecificImageOutputFolder(Path imageOutputFolder) { - this.specificImageOutputFolder = imageOutputFolder; - } - - public void setRelativeCaseName(Path input, Path aut) { - this.relativeCaseName = input.relativize(aut).toString(); - } - - public void setOldCaseName(String oldCaseName) { - this.oldCaseName = oldCaseName; - } - - public void setNewCaseName(String newCaseName) { - this.newCaseName = newCaseName; - } - - public ImportCaseData(Path p) { - this.specificCaseInputFolder = p; - this.oldCaseName = p.getFileName().toString(); - this.specificCaseOutputFolder = null; - this.specificImageInputFolder = null; - this.specificImageOutputFolder = null; - this.relativeCaseName = null; - this.newCaseName = null; - } - } - /** - * This is the runnable's run method. It causes the iteration on all .aut - * files in the path, calling processCase for each one. - */ - @Override - public void run() { - openLog(); - boolean result = true; - - // iterate for .aut files - FindDotAutFolders dotAutFolders = new FindDotAutFolders(); - try { - Path walked = Files.walkFileTree(caseInputFolder, dotAutFolders); - } catch (IOException ex) { - log(ex.getMessage()); - result = false; - } - - ArrayList ableToProcess = new ArrayList<>(); - ArrayList unableToProcess = new ArrayList<>(); - - // validate we can convert this .aut file, one by one - for (Path p : dotAutFolders.getTheList()) { - ImportCaseData icd = new ImportCaseData(p); - icd.setRelativeCaseName(caseInputFolder, p); - if (canProcess(icd)) { - ableToProcess.add(icd); - } else { - unableToProcess.add(icd); - } - } - - StringBuilder casesThatWillBeProcessed = new StringBuilder(); - StringBuilder casesThatWillNotBeProcessed = new StringBuilder(); - - casesThatWillBeProcessed.append(NbBundle.getMessage(SingleUserCaseImporter.class, "SingleUserCaseImporter.WillImport")).append(SEP); // NON-NLS - if (ableToProcess.isEmpty()) { - casesThatWillBeProcessed.append(NbBundle.getMessage(SingleUserCaseImporter.class, "SingleUserCaseImporter.None")).append(SEP); // NON-NLS - } else { - for (ImportCaseData icd : ableToProcess) { - casesThatWillBeProcessed.append(icd.getSpecificCaseInputFolder().toString()).append(SEP); - } - } - - if (!unableToProcess.isEmpty()) { - casesThatWillNotBeProcessed.append(NbBundle.getMessage(SingleUserCaseImporter.class, "SingleUserCaseImporter.WillNotImport")).append(SEP); // NON-NLS - for (ImportCaseData icd : unableToProcess) { - casesThatWillNotBeProcessed.append(icd.getSpecificCaseInputFolder().toString()).append(SEP); - } - } - - JTextArea jta = new JTextArea(casesThatWillBeProcessed.toString() + SEP + casesThatWillNotBeProcessed.toString()); - jta.setEditable(false); - JScrollPane jsp = new JScrollPane(jta) { - private static final long serialVersionUID = 1L; - - @Override - public Dimension getPreferredSize() { - return new Dimension(700, 480); - } - }; - - SwingUtilities.invokeLater(() -> { - userAnswer = JOptionPane.showConfirmDialog(WindowManager.getDefault().getMainWindow(), - jsp, - NbBundle.getMessage(SingleUserCaseImporter.class, "SingleUserCaseImporter.ContinueWithImport"), // NON-NLS - OK_CANCEL_OPTION); - synchronized (threadWaitNotifyLock) { - threadWaitNotifyLock.notify(); - } - }); - - synchronized (threadWaitNotifyLock) { - try { - threadWaitNotifyLock.wait(); - } catch (InterruptedException ex) { - log("Unable to wait for user input"); - } - } - - if (userAnswer == JOptionPane.OK_OPTION) { - // feed .aut files in one by one for processing - for (ImportCaseData icd : ableToProcess) { - if (false == processCase(icd)) { - result = false; - } - } - closeLog(result); - if (notifyOnComplete != null) { - notifyOnComplete.importDoneCallback(result, ""); // NON-NLS - } - } else { - closeLog(result); - if (notifyOnComplete != null) { - notifyOnComplete.importDoneCallback(false, NbBundle.getMessage(SingleUserCaseImporter.class, "SingleUserCaseImporter.Cancelled")); // NON-NLS - } - } - } - - /** - * Open the case import log in the base output folder. + * Open the PostgreSQL database * + * @param icd ImportCaseData holding connection credentials + * + * @return returns a Connection + * + * @throws SQLException if unable to open */ - private void openLog() { - File temp = new File(caseOutputFolder); - temp.mkdirs(); - File logFile = Paths.get(caseOutputFolder, CASE_IMPORT_LOG_FILE).toFile(); - try { - writer = new PrintWriter(new BufferedWriter(new FileWriter(logFile, logFile.exists())), true); - } catch (IOException ex) { - writer = null; - Logger.getLogger(SingleUserCaseImporter.class.getName()).log(Level.WARNING, "Error opening log file " + logFile.toString(), ex); - } - log("Starting batch processing of " + caseInputFolder.toString() + " to " + caseOutputFolder); + private static Connection getPostgreSQLConnection(ImportCaseData icd) throws SQLException { + return getPostgreSQLConnection(icd, icd.getPostgreSQLDbName()); } /** - * Log a message to the case import log in the base output folder. + * Open the PostgreSQL database * - * @param message the message to log. + * @param icd ImportCaseData holding connection credentials + * @param dbName the name of the database to open + * + * @return returns a Connection + * + * @throws SQLException if unable to open */ - private void log(String message) { - if (writer != null) { - writer.println(String.format("%s %s", simpleDateFormat.format((Date.from(Instant.now()).getTime())), message)); //NON-NLS - } + private static Connection getPostgreSQLConnection(ImportCaseData icd, String dbName) throws SQLException { + return DriverManager.getConnection("jdbc:postgresql://" + + icd.getDb().getHost() + ":" + + icd.getDb().getPort() + "/" + + dbName, + icd.getDb().getUserName(), + icd.getDb().getPassword()); //NON-NLS } /** + * Open the SQLite database * - * Close the case import log in the base output folder. + * @param icd ImportCaseData holding database path details * - * @param result this informs the log if the end result was successful or - * not. True if all was successful, false otherwise. + * @return returns a Connection + * + * @throws SQLException if unable to open */ - private void closeLog(boolean result) { - log("Completed batch processing of " + caseInputFolder.toString() + " to " + caseOutputFolder + ". Batch processing result: " + ((result == true) ? "Success" : "Failure")); - if (writer != null) { - writer.close(); - } + private static Connection getSQLiteConnection(ImportCaseData icd) throws SQLException { + return DriverManager.getConnection("jdbc:sqlite:" + icd.getCaseInputFolder().resolve(AUTOPSY_DB_FILE).toString(), "", ""); //NON-NLS } - /** - * This class extends SimpleFileVisitor to find all the cases to process - * based upon .aut files. - */ - private class FindDotAutFolders extends SimpleFileVisitor { - - private final ArrayList theList; - - public FindDotAutFolders() { - this.theList = new ArrayList<>(); - } - - /** - * Handle comparing .aut file and containing folder names without - * timestamps on either one. It strips them off if they exist. - * - * @param directory the directory we are currently visiting. - * @param attrs file attributes. - * - * @return Continue if we want to carry one, SKIP_SUBTREE if we've found - * a .aut file, precluding searching any deeper into this - * folder. - * - * @throws IOException - */ - @Override - public FileVisitResult preVisitDirectory(Path directory, BasicFileAttributes attrs) throws IOException { - // find all files that end in .aut - File[] dotAutFiles = directory.toFile().listFiles((File dir, String name) -> name.toLowerCase().endsWith(DOTAUT)); - - for (File specificFile : dotAutFiles) { - // if it ends in a timestamp, strip it off - String sanitizedCaseName = specificFile.getName(); - if (TimeStampUtils.endsWithTimeStamp(sanitizedCaseName)) { - sanitizedCaseName = sanitizedCaseName.substring(0, sanitizedCaseName.length() - TimeStampUtils.getTimeStampLength()); - } - - // if folder ends in a timestamp, strip it off - String sanitizedFolderName = directory.getFileName().toString(); - if (TimeStampUtils.endsWithTimeStamp(sanitizedFolderName)) { - sanitizedFolderName = sanitizedFolderName.substring(0, sanitizedFolderName.length() - TimeStampUtils.getTimeStampLength()); - } - - // If file and folder match, found leaf node case - if (sanitizedCaseName.toLowerCase().startsWith(sanitizedFolderName.toLowerCase())) { - theList.add(directory); - return FileVisitResult.SKIP_SUBTREE; - } - } - - // If no matching .aut files, traverse subfolders - return FileVisitResult.CONTINUE; - } - - /** - * This returns the list of folders we've found that need to be looked - * at for possible import as multi-user cases. - * - * @return the theList - */ - public ArrayList getTheList() { - return theList; - } - } } diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/TimeStampUtils.java b/Core/src/org/sleuthkit/autopsy/coreutils/TimeStampUtils.java deleted file mode 100644 index 05e8cb9a52..0000000000 --- a/Core/src/org/sleuthkit/autopsy/coreutils/TimeStampUtils.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2015 Basis Technology Corp. - * Contact: carrier sleuthkit 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.coreutils; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Class offers utility functions to identify and process time stamped folders. - */ -public final class TimeStampUtils { - - // Pattern to identify whether case name contains a generated time stamp. - // Sample case name with time stamp: Case 1_2015_02_02_12_10_31 for case "Case 1" - 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 a time stamp defined by pattern. - * - * @param inputString Input string - * - * @return true if string ends with a time stamp, false otherwise. - */ - public static boolean endsWithTimeStamp(String inputString) { - Matcher m = timeStampPattern.matcher(inputString); - return m.find(); - } - - /** - * Returns length of time stamp string. - * - * @return length of time stamp string. - */ - public static int getTimeStampLength() { - return LENGTH_OF_DATE_TIME_STAMP; - } - - /** - * Create a timestamp using the current time - * - * @return the timestamp as a String - */ - public static String createTimeStamp() { - return dateFormat.format(Calendar.getInstance().getTime()); - } - - /** - * Remove a timestamp if it exists - * - * @param input the String to remove the trailing timestamp from - * - * @return the String without timestamp - */ - public static String removeTimeStamp(String input) { - String result = input; - if (input != null && endsWithTimeStamp(input)) { - result = input.substring(0, input.length() - getTimeStampLength()); - } - return result; - } - - /** - * Return the timestamp portion of the name passed in - * - * @param input the name to check for a timestamp - * - * @return the timestamp only, or empty String if none - */ - public static String getTimeStampOnly(String input) { - String result = ""; - if (input != null && endsWithTimeStamp(input)) { - result = input.substring(input.length() - getTimeStampLength(), input.length()); - } - return result; - } - -} From 24e661afc7970192709764218dbdcb467fdeeaad Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Thu, 22 Oct 2015 14:45:25 -0400 Subject: [PATCH 07/41] Disable multi-user cases for non-Windows platforms --- .../autopsy/casemodule/Bundle.properties | 2 +- .../autopsy/core/UserPreferences.java | 5 ++++ .../autopsy/corecomponents/Bundle.properties | 1 + .../MultiUserSettingsPanel.form | 4 ++-- .../MultiUserSettingsPanel.java | 24 ++++++++++++++++--- 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index c9a86ea72f..18e8d578a6 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -192,7 +192,7 @@ MissingImageDialog.ErrorSettingImage=Error setting image path. Please try again. NewCaseVisualPanel1.getName.text=Case Info NewCaseVisualPanel1.caseDirBrowse.selectButton.text=Select NewCaseVisualPanel1.badCredentials.text=Bad multi-user settings (see Tools, Options, Multi-user) or services are down. -NewCaseVisualPanel1.MultiUserDisabled.text=Multi-user cases not enabled. See Tools, Options, Multi-user. +NewCaseVisualPanel1.MultiUserDisabled.text=Multi-user cases are not enabled. See Tools, Options, Multi-user. NewCaseVisualPanel2.getName.text=Additional Information NewCaseWizardAction.closeCurCase.confMsg.msg=Do you want to save and close this case and proceed with the new case creation? NewCaseWizardAction.closeCurCase.confMsg.title=Warning\: Closing the Current Case diff --git a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java index a9909593b0..03c97a0479 100755 --- a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java +++ b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java @@ -30,6 +30,7 @@ import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; import org.openide.util.NbBundle; import org.openide.util.NbPreferences; +import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.datamodel.CaseDbConnectionInfo; import org.sleuthkit.datamodel.TskData.DbType; @@ -39,6 +40,7 @@ import org.sleuthkit.datamodel.TskData.DbType; */ public final class UserPreferences { + 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 public static final String HIDE_KNOWN_FILES_IN_DATA_SOURCES_TREE = "HideKnownFilesInDataSourcesTree"; //NON-NLS @@ -177,6 +179,9 @@ public final class UserPreferences { } public static boolean getIsMultiUserModeEnabled() { + if (!isWindowsOS) { + return false; + } return preferences.getBoolean(IS_MULTI_USER_MODE_ENABLED, false); } diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties index 06146d2d8f..c1f259014e 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties @@ -153,6 +153,7 @@ MultiUserSettingsPanel.lbSolrSettings.text=Solr Settings MultiUserSettingsPanel.cbEnableMultiUser.text=Enable Multi-user cases MultiUserSettingsPanel.lbDatabaseSettings.text=Database Settings MultiUserSettingsPanel.validationErrMsg.incomplete=Fill in all values +MultiUserSettingsPanel.nonWindowsOs.msg=Multi-user cases are only available on Windows platforms MultiUserSettingsPanel.validationErrMsg.invalidDatabasePort=Invalid database port number MultiUserSettingsPanel.validationErrMsg.invalidMessageServicePort=Invalid message service port number MultiUserSettingsPanel.validationErrMsg.invalidIndexingServerPort=Invalid Solr server port number diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.form index 57f1eca7d5..e15416659f 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.form @@ -16,12 +16,12 @@ - + - + diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java index 0a26244edc..03c3bdf7c5 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java @@ -23,6 +23,7 @@ import javax.swing.ImageIcon; import org.openide.util.ImageUtilities; import org.openide.util.Lookup; import org.sleuthkit.autopsy.core.UserPreferencesException; +import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.autopsy.events.MessageServiceException; import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchService; import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchServiceException; @@ -39,7 +40,7 @@ public final class MultiUserSettingsPanel extends javax.swing.JPanel { private static final String INVALID_DB_PORT_MSG = NbBundle.getMessage(MultiUserSettingsPanel.class, "MultiUserSettingsPanel.validationErrMsg.invalidDatabasePort"); private static final String INVALID_MESSAGE_SERVICE_PORT_MSG = NbBundle.getMessage(MultiUserSettingsPanel.class, "MultiUserSettingsPanel.validationErrMsg.invalidMessageServicePort"); private static final String INVALID_INDEXING_SERVER_PORT_MSG = NbBundle.getMessage(MultiUserSettingsPanel.class, "MultiUserSettingsPanel.validationErrMsg.invalidIndexingServerPort"); - private static final int DEFAULT_MESSAGE_SERVICE_PORT = 61616; + private static final String NON_WINDOWS_OS_MSG = NbBundle.getMessage(MultiUserSettingsPanel.class, "MultiUserSettingsPanel.nonWindowsOs.msg"); private static final long serialVersionUID = 1L; private final MultiUserSettingsPanelController controller; private final Collection textBoxes = new ArrayList<>(); @@ -47,6 +48,7 @@ public final class MultiUserSettingsPanel extends javax.swing.JPanel { private static final Logger logger = Logger.getLogger(MultiUserSettingsPanel.class.getName()); private final ImageIcon goodIcon; private final ImageIcon badIcon; + private static final boolean isWindowsOS = PlatformUtil.isWindowsOS(); /** * Creates new form AutopsyMultiUserSettingsPanel @@ -105,6 +107,10 @@ public final class MultiUserSettingsPanel extends javax.swing.JPanel { addDocumentListeners(textBoxes, textBoxChangedListener); goodIcon = new ImageIcon(ImageUtilities.loadImage("org/sleuthkit/autopsy/images/good.png", false)); badIcon = new ImageIcon(ImageUtilities.loadImage("org/sleuthkit/autopsy/images/bad.png", false)); + if (!isWindowsOS) { + cbEnableMultiUser.setEnabled(false); + cbEnableMultiUser.setSelected(false); + } enableMultiUserComponents(textBoxes, cbEnableMultiUser.isSelected()); } @@ -457,7 +463,11 @@ public final class MultiUserSettingsPanel extends javax.swing.JPanel { private void cbEnableMultiUserItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbEnableMultiUserItemStateChanged if (!cbEnableMultiUser.isSelected()) { - tbOops.setText(""); + if (!isWindowsOS) { + tbOops.setText(NON_WINDOWS_OS_MSG); + } else { + tbOops.setText(""); + } bnTestDatabase.setEnabled(false); lbTestDatabase.setIcon(null); bnTestSolr.setEnabled(false); @@ -640,6 +650,10 @@ public final class MultiUserSettingsPanel extends javax.swing.JPanel { } void store() { + if (!isWindowsOS) { + return; + } + DbType dbType = DbType.SQLITE; if (cbEnableMultiUser.isSelected()) { @@ -691,7 +705,11 @@ public final class MultiUserSettingsPanel extends javax.swing.JPanel { * @return true if it's okay, false otherwise. */ boolean valid() { - tbOops.setText(""); + if (!isWindowsOS) { + tbOops.setText(NON_WINDOWS_OS_MSG); + } else { + tbOops.setText(""); + } if (cbEnableMultiUser.isSelected()) { return checkFieldsAndEnableButtons() From 5e1a557e9e91e054a75f5831aff5b3417aed80ae Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Thu, 22 Oct 2015 16:05:56 -0400 Subject: [PATCH 08/41] merge --- .../autopsy/casemodule/Bundle.properties | 2 +- .../sleuthkit/autopsy/casemodule/Case.java | 34 ++++++++++++------- .../autopsy/casemodule/CaseOpenAction.java | 4 +++ .../casemodule/NewCaseWizardAction.java | 7 ++-- .../casemodule/OpenRecentCasePanel.java | 4 +++ .../autopsy/casemodule/RecentItems.java | 4 +++ nbproject/platform.properties | 16 +-------- 7 files changed, 40 insertions(+), 31 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index 617d0efa69..10b0487510 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -262,4 +262,4 @@ NewCaseVisualPanel1.multiUserSettingsWarningLabel.text=Multi-user settings warni Case.deleteReports.deleteFromDiskException.log.msg=Unable to delete the report from the disk. Case.deleteReports.deleteFromDiskException.msg=Unable to delete the report {0} from the disk.\nYou may manually delete it from {1} CaseOpenException.DatabaseSettingsIssue=Database settings: -CaseExceptionWarning.CheckMultiUserOptions=Check Multi-user options. \ No newline at end of file +CaseExceptionWarning.CheckMultiUserOptions=Check Multi-user options. diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index 7b9172a968..e580a124bb 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -323,9 +323,10 @@ public class Case implements SleuthkitCase.ErrorObserver { Case oldCase = Case.currentCase; Case.currentCase = null; if (oldCase != null) { - SwingUtilities.invokeLater(() -> { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - }); + /* KDM I think we want this one.... + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + });*/ doCaseChange(null); //closes windows, etc if (null != oldCase.tskErrorReporter) { oldCase.tskErrorReporter.shutdown(); // stop listening for TSK errors for the old case @@ -349,7 +350,7 @@ public class Case implements SleuthkitCase.ErrorObserver { } // start listening for TSK errors for the new case currentCase.tskErrorReporter = new IntervalErrorReportData(currentCase, MIN_SECONDS_BETWEEN_ERROR_REPORTS, - NbBundle.getMessage(Case.class, "IntervalErrorReport.ErrorText")); + NbBundle.getMessage(Case.class, "IntervalErrorReport.ErrorText")); doCaseChange(currentCase); SwingUtilities.invokeLater(() -> { RecentCases.getInstance().addRecentCase(currentCase.name, currentCase.configFilePath); // update the recent cases @@ -374,11 +375,12 @@ public class Case implements SleuthkitCase.ErrorObserver { } else { Logger.setLogDirectory(PlatformUtil.getLogDirectory()); } - SwingUtilities.invokeLater(() -> { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - }); + /* KDM I think we want this one too. + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + });*/ } - + @Override public void receiveError(String context, String errorMessage) { /* NOTE: We are accessing tskErrorReporter from two different threads. @@ -469,6 +471,10 @@ public class Case implements SleuthkitCase.ErrorObserver { logger.log(Level.SEVERE, "Error accessing case database connection info", ex); //NON-NLS throw new CaseActionException( NbBundle.getMessage(Case.class, "Case.databaseConnectionInfo.error.msg"), ex); + } finally { + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }); } /** @@ -581,7 +587,7 @@ public class Case implements SleuthkitCase.ErrorObserver { throw new CaseActionException(NbBundle.getMessage(Case.class, "Case.open.exception.multiUserCaseNotEnabled")); } try { - db = SleuthkitCase.openCase(metadata.getCaseDatabaseName(), UserPreferences.getDatabaseConnectionInfo(), caseDir); + db = SleuthkitCase.openCase(metadata.getCaseDatabaseName(), UserPreferences.getDatabaseConnectionInfo(), caseDir); } catch (UserPreferencesException ex) { logger.log(Level.SEVERE, "Error accessing case database connection info", ex); //NON-NLS throw new CaseActionException( @@ -647,6 +653,10 @@ public class Case implements SleuthkitCase.ErrorObserver { WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); }); throw new CaseActionException(NbBundle.getMessage(Case.class, "CaseOpenException.DatabaseSettingsIssue") + " " + ex.getMessage(), ex); //NON-NLS + } finally { + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }); } } @@ -704,7 +714,7 @@ public class Case implements SleuthkitCase.ErrorObserver { * * @deprecated As of release 4.0, replaced by {@link #notifyAddingDataSource(java.util.UUID) and * {@link #notifyDataSourceAdded(org.sleuthkit.datamodel.Content, java.util.UUID) and - * {@link #notifyFailedAddingDataSource(java.util.UUID)} + * {@link #notifyFailedAddingDataSource(java.util.UUID)} */ @Deprecated public Image addImage(String imgPath, long imgId, String timeZone) throws CaseActionException { @@ -719,13 +729,13 @@ public class Case implements SleuthkitCase.ErrorObserver { /** * Finishes adding new local data source to the case. Sends out event and - * reopens windows if needed. + * reopens windows if needed. * * @param newDataSource new data source added * * @deprecated As of release 4.0, replaced by {@link #notifyAddingDataSource(java.util.UUID) and * {@link #notifyDataSourceAdded(org.sleuthkit.datamodel.Content, java.util.UUID) and - * {@link #notifyFailedAddingDataSource(java.util.UUID)} + * {@link #notifyFailedAddingDataSource(java.util.UUID)} */ @Deprecated void addLocalDataSource(Content newDataSource) { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java index 5c16b16fd2..2ad1cd5a8f 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java @@ -101,6 +101,10 @@ public final class CaseOpenAction implements ActionListener { StartupWindowProvider.getInstance().open(); } }); + } finally { + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }); } }).start(); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java index 58bdf04081..294b0a961b 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java @@ -120,10 +120,10 @@ final class NewCaseWizardAction extends CallableSystemAction { final String caseName = (String) wizardDescriptor.getProperty("caseName"); //NON-NLS try { get(); - AddImageAction addImageAction = SystemAction.get(AddImageAction.class); - addImageAction.actionPerformed(null); + AddImageAction addImageAction = SystemAction.get(AddImageAction.class); + addImageAction.actionPerformed(null); } catch (Exception ex) { - logger.log(Level.SEVERE, "Error creating case", ex); //NON-NLS + logger.log(Level.SEVERE, "Error creating case", ex); //NON-NLS SwingUtilities.invokeLater(() -> { JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), ex.getCause().getMessage() + " " + NbBundle.getMessage(this.getClass(), "CaseExceptionWarning.CheckMultiUserOptions"), @@ -140,6 +140,7 @@ final class NewCaseWizardAction extends CallableSystemAction { }); doFailedCaseCleanup(wizardDescriptor); } + /// KDM here???? } }.execute(); } else { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java index 00b4b600c3..9e4280474a 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java @@ -228,6 +228,10 @@ class OpenRecentCasePanel extends javax.swing.JPanel { StartupWindowProvider.getInstance().open(); } }); + } finally { + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + }); } }).start(); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java index 7782ba6230..0de9887fad 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java @@ -88,6 +88,10 @@ class RecentItems implements ActionListener { StartupWindowProvider.getInstance().open(); } }); + } finally { + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + }); } }).start(); } diff --git a/nbproject/platform.properties b/nbproject/platform.properties index aa34a2c2be..61f719736c 100644 --- a/nbproject/platform.properties +++ b/nbproject/platform.properties @@ -1,4 +1,5 @@ branding.token=autopsy +nbjdk.active=JDK_1.8_66 # Version of platform that is automatically downloaded # Note build.xml has similar definitions that should be kept in sync (manually) netbeans-plat-version=8.0.2 @@ -13,15 +14,12 @@ cluster.path=\ ${nbplatform.active.dir}/java:\ ${nbplatform.active.dir}/platform disabled.modules=\ - org.apache.tools.ant.module,\ org.netbeans.api.debugger.jpda,\ org.netbeans.api.java,\ - org.netbeans.api.maven,\ org.netbeans.lib.nbjavac,\ org.netbeans.libs.cglib,\ org.netbeans.libs.javacapi,\ org.netbeans.libs.javacimpl,\ - org.netbeans.libs.javafx,\ org.netbeans.libs.springframework,\ org.netbeans.modules.ant.browsetask,\ org.netbeans.modules.ant.debugger,\ @@ -33,7 +31,6 @@ disabled.modules=\ org.netbeans.modules.dbschema,\ org.netbeans.modules.debugger.jpda,\ org.netbeans.modules.debugger.jpda.ant,\ - org.netbeans.modules.debugger.jpda.js,\ org.netbeans.modules.debugger.jpda.kit,\ org.netbeans.modules.debugger.jpda.projects,\ org.netbeans.modules.debugger.jpda.ui,\ @@ -46,8 +43,6 @@ disabled.modules=\ org.netbeans.modules.form.nb,\ org.netbeans.modules.form.refactoring,\ org.netbeans.modules.hibernate,\ - org.netbeans.modules.hibernate4lib,\ - org.netbeans.modules.hibernatelib,\ org.netbeans.modules.hudson.ant,\ org.netbeans.modules.hudson.maven,\ org.netbeans.modules.i18n,\ @@ -69,21 +64,16 @@ disabled.modules=\ org.netbeans.modules.java.examples,\ org.netbeans.modules.java.freeform,\ org.netbeans.modules.java.guards,\ - org.netbeans.modules.java.helpset,\ org.netbeans.modules.java.hints,\ org.netbeans.modules.java.hints.declarative,\ org.netbeans.modules.java.hints.declarative.test,\ org.netbeans.modules.java.hints.legacy.spi,\ org.netbeans.modules.java.hints.test,\ org.netbeans.modules.java.hints.ui,\ - org.netbeans.modules.java.j2sedeploy,\ - org.netbeans.modules.java.j2seembedded,\ org.netbeans.modules.java.j2seplatform,\ - org.netbeans.modules.java.j2seprofiles,\ org.netbeans.modules.java.j2seproject,\ org.netbeans.modules.java.kit,\ org.netbeans.modules.java.lexer,\ - org.netbeans.modules.java.metrics,\ org.netbeans.modules.java.navigation,\ org.netbeans.modules.java.platform,\ org.netbeans.modules.java.preprocessorbridge,\ @@ -95,7 +85,6 @@ disabled.modules=\ org.netbeans.modules.java.sourceui,\ org.netbeans.modules.java.testrunner,\ org.netbeans.modules.javadoc,\ - org.netbeans.modules.javaee.injection,\ org.netbeans.modules.javawebstart,\ org.netbeans.modules.jellytools.java,\ org.netbeans.modules.junit,\ @@ -116,8 +105,6 @@ disabled.modules=\ org.netbeans.modules.maven.repository,\ org.netbeans.modules.maven.search,\ org.netbeans.modules.maven.spring,\ - org.netbeans.modules.nashorn.execution,\ - org.netbeans.modules.performance,\ org.netbeans.modules.performance.java,\ org.netbeans.modules.projectimport.eclipse.core,\ org.netbeans.modules.projectimport.eclipse.j2se,\ @@ -130,7 +117,6 @@ disabled.modules=\ org.netbeans.modules.websvc.jaxws21,\ org.netbeans.modules.websvc.jaxws21api,\ org.netbeans.modules.websvc.saas.codegen.java,\ - org.netbeans.modules.whitelist,\ org.netbeans.modules.xml.jaxb,\ org.netbeans.modules.xml.tools.java,\ org.netbeans.spi.java.hints From 4e2659e810517bd0b0fcb92ffcd556b3625d046c Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Thu, 22 Oct 2015 16:18:34 -0400 Subject: [PATCH 09/41] comment out suggested edits --- .../sleuthkit/autopsy/casemodule/Case.java | 33 +++++++++++-------- .../autopsy/casemodule/CaseOpenAction.java | 5 ++- .../casemodule/NewCaseWizardAction.java | 4 ++- .../casemodule/OpenRecentCasePanel.java | 5 ++- .../autopsy/casemodule/RecentItems.java | 5 ++- 5 files changed, 34 insertions(+), 18 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index e580a124bb..9503678f97 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -323,10 +323,10 @@ public class Case implements SleuthkitCase.ErrorObserver { Case oldCase = Case.currentCase; Case.currentCase = null; if (oldCase != null) { - /* KDM I think we want this one.... - SwingUtilities.invokeLater(() -> { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - });*/ + /* KDM I think we want this one....*/ + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + }); doCaseChange(null); //closes windows, etc if (null != oldCase.tskErrorReporter) { oldCase.tskErrorReporter.shutdown(); // stop listening for TSK errors for the old case @@ -375,10 +375,10 @@ public class Case implements SleuthkitCase.ErrorObserver { } else { Logger.setLogDirectory(PlatformUtil.getLogDirectory()); } - /* KDM I think we want this one too. - SwingUtilities.invokeLater(() -> { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - });*/ + /* KDM I think we want this one too. */ + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }); } @Override @@ -471,11 +471,13 @@ public class Case implements SleuthkitCase.ErrorObserver { logger.log(Level.SEVERE, "Error accessing case database connection info", ex); //NON-NLS throw new CaseActionException( NbBundle.getMessage(Case.class, "Case.databaseConnectionInfo.error.msg"), ex); - } finally { - SwingUtilities.invokeLater(() -> { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - }); - } + } /* KDM from RC + finally { + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }); + } + */ /** * Two-stage initialization to avoid leaking reference to "this" in @@ -653,11 +655,14 @@ public class Case implements SleuthkitCase.ErrorObserver { WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); }); throw new CaseActionException(NbBundle.getMessage(Case.class, "CaseOpenException.DatabaseSettingsIssue") + " " + ex.getMessage(), ex); //NON-NLS - } finally { + } + /* KDM from RC + finally { SwingUtilities.invokeLater(() -> { WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); }); } + */ } static Map getImagePaths(SleuthkitCase db) { //TODO: clean this up diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java index 2ad1cd5a8f..e00692ab75 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java @@ -101,11 +101,14 @@ public final class CaseOpenAction implements ActionListener { StartupWindowProvider.getInstance().open(); } }); - } finally { + } + /* KDM from RC + finally { SwingUtilities.invokeLater(() -> { WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); }); } + */ }).start(); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java index 294b0a961b..6c9622b781 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java @@ -140,7 +140,9 @@ final class NewCaseWizardAction extends CallableSystemAction { }); doFailedCaseCleanup(wizardDescriptor); } - /// KDM here???? + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); + }); } }.execute(); } else { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java index 9e4280474a..45336aa704 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java @@ -228,11 +228,14 @@ class OpenRecentCasePanel extends javax.swing.JPanel { StartupWindowProvider.getInstance().open(); } }); - } finally { + } + /* KDM from RC + finally { SwingUtilities.invokeLater(() -> { WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); }); } + */ }).start(); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java index 0de9887fad..76b5469574 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java @@ -88,11 +88,14 @@ class RecentItems implements ActionListener { StartupWindowProvider.getInstance().open(); } }); - } finally { + } + /* KDM from RC + finally { SwingUtilities.invokeLater(() -> { WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); }); } + */ }).start(); } } From f365d5d28f7b262da9404f8c6211ada32912109f Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Thu, 22 Oct 2015 16:37:21 -0400 Subject: [PATCH 10/41] remove finally blocks --- .../org/sleuthkit/autopsy/casemodule/Case.java | 17 +---------------- .../autopsy/casemodule/CaseOpenAction.java | 7 ------- .../autopsy/casemodule/NewCaseWizardAction.java | 3 --- .../autopsy/casemodule/OpenRecentCasePanel.java | 7 ------- .../autopsy/casemodule/RecentItems.java | 7 ------- 5 files changed, 1 insertion(+), 40 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index 9503678f97..2cfabe81d3 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -323,7 +323,6 @@ public class Case implements SleuthkitCase.ErrorObserver { Case oldCase = Case.currentCase; Case.currentCase = null; if (oldCase != null) { - /* KDM I think we want this one....*/ SwingUtilities.invokeLater(() -> { WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); }); @@ -375,7 +374,6 @@ public class Case implements SleuthkitCase.ErrorObserver { } else { Logger.setLogDirectory(PlatformUtil.getLogDirectory()); } - /* KDM I think we want this one too. */ SwingUtilities.invokeLater(() -> { WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); }); @@ -471,13 +469,7 @@ public class Case implements SleuthkitCase.ErrorObserver { logger.log(Level.SEVERE, "Error accessing case database connection info", ex); //NON-NLS throw new CaseActionException( NbBundle.getMessage(Case.class, "Case.databaseConnectionInfo.error.msg"), ex); - } /* KDM from RC - finally { - SwingUtilities.invokeLater(() -> { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - }); - } - */ + } /** * Two-stage initialization to avoid leaking reference to "this" in @@ -656,13 +648,6 @@ public class Case implements SleuthkitCase.ErrorObserver { }); throw new CaseActionException(NbBundle.getMessage(Case.class, "CaseOpenException.DatabaseSettingsIssue") + " " + ex.getMessage(), ex); //NON-NLS } - /* KDM from RC - finally { - SwingUtilities.invokeLater(() -> { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - }); - } - */ } static Map getImagePaths(SleuthkitCase db) { //TODO: clean this up diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java index e00692ab75..2a03307cf5 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java @@ -102,13 +102,6 @@ public final class CaseOpenAction implements ActionListener { } }); } - /* KDM from RC - finally { - SwingUtilities.invokeLater(() -> { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - }); - } - */ }).start(); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java index 6c9622b781..09659fcefa 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java @@ -140,9 +140,6 @@ final class NewCaseWizardAction extends CallableSystemAction { }); doFailedCaseCleanup(wizardDescriptor); } - SwingUtilities.invokeLater(() -> { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); - }); } }.execute(); } else { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java index 45336aa704..00b4b600c3 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OpenRecentCasePanel.java @@ -229,13 +229,6 @@ class OpenRecentCasePanel extends javax.swing.JPanel { } }); } - /* KDM from RC - finally { - SwingUtilities.invokeLater(() -> { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - }); - } - */ }).start(); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java index 76b5469574..7782ba6230 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java @@ -89,13 +89,6 @@ class RecentItems implements ActionListener { } }); } - /* KDM from RC - finally { - SwingUtilities.invokeLater(() -> { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - }); - } - */ }).start(); } } From 1583ec99ba4fbd667a4f1be813eeb12f15b02bc3 Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Thu, 22 Oct 2015 16:41:40 -0400 Subject: [PATCH 11/41] merge --- nbproject/platform.properties | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/nbproject/platform.properties b/nbproject/platform.properties index 61f719736c..2572317eef 100644 --- a/nbproject/platform.properties +++ b/nbproject/platform.properties @@ -1,5 +1,4 @@ branding.token=autopsy -nbjdk.active=JDK_1.8_66 # Version of platform that is automatically downloaded # Note build.xml has similar definitions that should be kept in sync (manually) netbeans-plat-version=8.0.2 @@ -14,12 +13,15 @@ cluster.path=\ ${nbplatform.active.dir}/java:\ ${nbplatform.active.dir}/platform disabled.modules=\ + org.apache.tools.ant.module,\ org.netbeans.api.debugger.jpda,\ org.netbeans.api.java,\ + org.netbeans.api.maven,\ org.netbeans.lib.nbjavac,\ org.netbeans.libs.cglib,\ org.netbeans.libs.javacapi,\ org.netbeans.libs.javacimpl,\ + org.netbeans.libs.javafx,\ org.netbeans.libs.springframework,\ org.netbeans.modules.ant.browsetask,\ org.netbeans.modules.ant.debugger,\ @@ -31,6 +33,7 @@ disabled.modules=\ org.netbeans.modules.dbschema,\ org.netbeans.modules.debugger.jpda,\ org.netbeans.modules.debugger.jpda.ant,\ + org.netbeans.modules.debugger.jpda.js,\ org.netbeans.modules.debugger.jpda.kit,\ org.netbeans.modules.debugger.jpda.projects,\ org.netbeans.modules.debugger.jpda.ui,\ @@ -43,6 +46,8 @@ disabled.modules=\ org.netbeans.modules.form.nb,\ org.netbeans.modules.form.refactoring,\ org.netbeans.modules.hibernate,\ + org.netbeans.modules.hibernate4lib,\ + org.netbeans.modules.hibernatelib,\ org.netbeans.modules.hudson.ant,\ org.netbeans.modules.hudson.maven,\ org.netbeans.modules.i18n,\ @@ -64,16 +69,21 @@ disabled.modules=\ org.netbeans.modules.java.examples,\ org.netbeans.modules.java.freeform,\ org.netbeans.modules.java.guards,\ + org.netbeans.modules.java.helpset,\ org.netbeans.modules.java.hints,\ org.netbeans.modules.java.hints.declarative,\ org.netbeans.modules.java.hints.declarative.test,\ org.netbeans.modules.java.hints.legacy.spi,\ org.netbeans.modules.java.hints.test,\ org.netbeans.modules.java.hints.ui,\ + org.netbeans.modules.java.j2sedeploy,\ + org.netbeans.modules.java.j2seembedded,\ org.netbeans.modules.java.j2seplatform,\ + org.netbeans.modules.java.j2seprofiles,\ org.netbeans.modules.java.j2seproject,\ org.netbeans.modules.java.kit,\ org.netbeans.modules.java.lexer,\ + org.netbeans.modules.java.metrics,\ org.netbeans.modules.java.navigation,\ org.netbeans.modules.java.platform,\ org.netbeans.modules.java.preprocessorbridge,\ @@ -85,6 +95,7 @@ disabled.modules=\ org.netbeans.modules.java.sourceui,\ org.netbeans.modules.java.testrunner,\ org.netbeans.modules.javadoc,\ + org.netbeans.modules.javaee.injection,\ org.netbeans.modules.javawebstart,\ org.netbeans.modules.jellytools.java,\ org.netbeans.modules.junit,\ @@ -105,6 +116,8 @@ disabled.modules=\ org.netbeans.modules.maven.repository,\ org.netbeans.modules.maven.search,\ org.netbeans.modules.maven.spring,\ + org.netbeans.modules.nashorn.execution,\ + org.netbeans.modules.performance,\ org.netbeans.modules.performance.java,\ org.netbeans.modules.projectimport.eclipse.core,\ org.netbeans.modules.projectimport.eclipse.j2se,\ @@ -117,7 +130,7 @@ disabled.modules=\ org.netbeans.modules.websvc.jaxws21,\ org.netbeans.modules.websvc.jaxws21api,\ org.netbeans.modules.websvc.saas.codegen.java,\ + org.netbeans.modules.whitelist,\ org.netbeans.modules.xml.jaxb,\ org.netbeans.modules.xml.tools.java,\ org.netbeans.spi.java.hints - From 283f826282f5988ed285d04c91d1b0c8538aa8be Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Thu, 22 Oct 2015 17:18:08 -0400 Subject: [PATCH 12/41] fix up properties --- nbproject/platform.properties | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/nbproject/platform.properties b/nbproject/platform.properties index 2572317eef..b7dde1d50c 100644 --- a/nbproject/platform.properties +++ b/nbproject/platform.properties @@ -1,4 +1,5 @@ branding.token=autopsy +nbjdk.active=JDK_1.8_66 # Version of platform that is automatically downloaded # Note build.xml has similar definitions that should be kept in sync (manually) netbeans-plat-version=8.0.2 @@ -13,15 +14,12 @@ cluster.path=\ ${nbplatform.active.dir}/java:\ ${nbplatform.active.dir}/platform disabled.modules=\ - org.apache.tools.ant.module,\ org.netbeans.api.debugger.jpda,\ org.netbeans.api.java,\ - org.netbeans.api.maven,\ org.netbeans.lib.nbjavac,\ org.netbeans.libs.cglib,\ org.netbeans.libs.javacapi,\ org.netbeans.libs.javacimpl,\ - org.netbeans.libs.javafx,\ org.netbeans.libs.springframework,\ org.netbeans.modules.ant.browsetask,\ org.netbeans.modules.ant.debugger,\ @@ -33,7 +31,6 @@ disabled.modules=\ org.netbeans.modules.dbschema,\ org.netbeans.modules.debugger.jpda,\ org.netbeans.modules.debugger.jpda.ant,\ - org.netbeans.modules.debugger.jpda.js,\ org.netbeans.modules.debugger.jpda.kit,\ org.netbeans.modules.debugger.jpda.projects,\ org.netbeans.modules.debugger.jpda.ui,\ @@ -46,8 +43,6 @@ disabled.modules=\ org.netbeans.modules.form.nb,\ org.netbeans.modules.form.refactoring,\ org.netbeans.modules.hibernate,\ - org.netbeans.modules.hibernate4lib,\ - org.netbeans.modules.hibernatelib,\ org.netbeans.modules.hudson.ant,\ org.netbeans.modules.hudson.maven,\ org.netbeans.modules.i18n,\ @@ -69,21 +64,16 @@ disabled.modules=\ org.netbeans.modules.java.examples,\ org.netbeans.modules.java.freeform,\ org.netbeans.modules.java.guards,\ - org.netbeans.modules.java.helpset,\ org.netbeans.modules.java.hints,\ org.netbeans.modules.java.hints.declarative,\ org.netbeans.modules.java.hints.declarative.test,\ org.netbeans.modules.java.hints.legacy.spi,\ org.netbeans.modules.java.hints.test,\ org.netbeans.modules.java.hints.ui,\ - org.netbeans.modules.java.j2sedeploy,\ - org.netbeans.modules.java.j2seembedded,\ org.netbeans.modules.java.j2seplatform,\ - org.netbeans.modules.java.j2seprofiles,\ org.netbeans.modules.java.j2seproject,\ org.netbeans.modules.java.kit,\ org.netbeans.modules.java.lexer,\ - org.netbeans.modules.java.metrics,\ org.netbeans.modules.java.navigation,\ org.netbeans.modules.java.platform,\ org.netbeans.modules.java.preprocessorbridge,\ @@ -95,7 +85,6 @@ disabled.modules=\ org.netbeans.modules.java.sourceui,\ org.netbeans.modules.java.testrunner,\ org.netbeans.modules.javadoc,\ - org.netbeans.modules.javaee.injection,\ org.netbeans.modules.javawebstart,\ org.netbeans.modules.jellytools.java,\ org.netbeans.modules.junit,\ @@ -116,8 +105,6 @@ disabled.modules=\ org.netbeans.modules.maven.repository,\ org.netbeans.modules.maven.search,\ org.netbeans.modules.maven.spring,\ - org.netbeans.modules.nashorn.execution,\ - org.netbeans.modules.performance,\ org.netbeans.modules.performance.java,\ org.netbeans.modules.projectimport.eclipse.core,\ org.netbeans.modules.projectimport.eclipse.j2se,\ @@ -130,7 +117,6 @@ disabled.modules=\ org.netbeans.modules.websvc.jaxws21,\ org.netbeans.modules.websvc.jaxws21api,\ org.netbeans.modules.websvc.saas.codegen.java,\ - org.netbeans.modules.whitelist,\ org.netbeans.modules.xml.jaxb,\ org.netbeans.modules.xml.tools.java,\ org.netbeans.spi.java.hints From 476f89d00663333bbff6ab3668bfd48d883356f3 Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Thu, 22 Oct 2015 18:22:55 -0400 Subject: [PATCH 13/41] code review updates --- .../autopsy/casemodule/Bundle.properties | 2 +- .../casemodule/CasePropertiesForm.form | 6 ++-- .../casemodule/CasePropertiesForm.java | 28 ++++++++----------- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index 8af4905638..520c4a7171 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -261,7 +261,7 @@ NewCaseVisualPanel1.singleUserCaseRadioButton.text=Single-user NewCaseVisualPanel1.multiUserSettingsWarningLabel.text=Multi-user settings warning label Case.deleteReports.deleteFromDiskException.log.msg=Unable to delete the report from the disk. Case.deleteReports.deleteFromDiskException.msg=Unable to delete the report {0} from the disk.\nYou may manually delete it from {1} -CasePropertiesForm.lbDbType.text=Database Type: +CasePropertiesForm.lbDbType.text=Case Type: CasePropertiesForm.tbDbType.text= CasePropertiesForm.lbDbName.text=Database Name: CasePropertiesForm.tbDbName.text= diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.form b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.form index 133475120c..94e9161756 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.form @@ -49,9 +49,9 @@ - - - + + + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.java index 5c6df573da..99dcd8bfa2 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesForm.java @@ -79,7 +79,7 @@ class CasePropertiesForm extends javax.swing.JPanel { /** * Creates new form CasePropertiesForm */ - CasePropertiesForm(Case currentCase, String crDate, String caseDir, Map imgPaths) { + CasePropertiesForm(Case currentCase, String crDate, String caseDir, Map imgPaths) throws CaseMetadata.CaseMetadataException { initComponents(); caseNameTextField.setText(currentCase.getName()); caseNumberTextField.setText(currentCase.getNumber()); @@ -88,18 +88,14 @@ class CasePropertiesForm extends javax.swing.JPanel { caseDirTextArea.setText(caseDir); current = currentCase; - try { - CaseMetadata caseMetadata = new CaseMetadata(Paths.get(currentCase.getConfigFilePath())); - tbDbName.setText(caseMetadata.getCaseDatabaseName()); - Case.CaseType caseType = caseMetadata.getCaseType(); - tbDbType.setText(caseType.toString()); - if (caseType == Case.CaseType.SINGLE_USER_CASE) { - deleteCaseButton.setEnabled(true); - } else { - deleteCaseButton.setEnabled(false); - } - } catch (CaseMetadata.CaseMetadataException ex) { - Logger.getLogger(CasePropertiesForm.class.getName()).log(Level.WARNING, "Could not read case properties.", ex); //NON-NLS + CaseMetadata caseMetadata = new CaseMetadata(Paths.get(currentCase.getConfigFilePath())); + tbDbName.setText(caseMetadata.getCaseDatabaseName()); + Case.CaseType caseType = caseMetadata.getCaseType(); + tbDbType.setText(caseType.toString()); + if (caseType == Case.CaseType.SINGLE_USER_CASE) { + deleteCaseButton.setEnabled(true); + } else { + deleteCaseButton.setEnabled(false); } int totalImages = imgPaths.size(); @@ -314,9 +310,9 @@ class CasePropertiesForm extends javax.swing.JPanel { .addComponent(lbDbType)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(caseNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 244, Short.MAX_VALUE) - .addComponent(caseNumberTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 244, Short.MAX_VALUE) - .addComponent(examinerTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 244, Short.MAX_VALUE) + .addComponent(caseNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 245, Short.MAX_VALUE) + .addComponent(caseNumberTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 245, Short.MAX_VALUE) + .addComponent(examinerTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 245, Short.MAX_VALUE) .addComponent(crDateTextField) .addComponent(jScrollPane2) .addComponent(tbDbType) From 0a5575fb3759cf69d552ea8bec8c0df909fe4966 Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Fri, 23 Oct 2015 09:28:44 -0400 Subject: [PATCH 14/41] code review updates --- Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties | 1 - Core/src/org/sleuthkit/autopsy/casemodule/Case.java | 6 +++--- .../core.jar/org/netbeans/core/startup/Bundle.properties | 2 +- .../org/netbeans/core/windows/view/ui/Bundle.properties | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index 10b0487510..0c929caa83 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -261,5 +261,4 @@ NewCaseVisualPanel1.singleUserCaseRadioButton.text=Single-user NewCaseVisualPanel1.multiUserSettingsWarningLabel.text=Multi-user settings warning label Case.deleteReports.deleteFromDiskException.log.msg=Unable to delete the report from the disk. Case.deleteReports.deleteFromDiskException.msg=Unable to delete the report {0} from the disk.\nYou may manually delete it from {1} -CaseOpenException.DatabaseSettingsIssue=Database settings: CaseExceptionWarning.CheckMultiUserOptions=Check Multi-user options. diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index 2cfabe81d3..7f636435ac 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -464,7 +464,7 @@ public class Case implements SleuthkitCase.ErrorObserver { SwingUtilities.invokeLater(() -> { WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); }); - throw new CaseActionException(NbBundle.getMessage(Case.class, "CaseOpenException.DatabaseSettingsIssue") + " " + ex.getMessage()); //NON-NLS + throw new CaseActionException(ex.getMessage(), ex); //NON-NLS } catch (UserPreferencesException ex) { logger.log(Level.SEVERE, "Error accessing case database connection info", ex); //NON-NLS throw new CaseActionException( @@ -635,7 +635,7 @@ public class Case implements SleuthkitCase.ErrorObserver { } catch (IllegalStateException unused) { // Already logged. } - throw new CaseActionException(NbBundle.getMessage(Case.class, "Case.open.exception.gen.msg") + ". " + ex.getMessage(), ex); //NON-NLS + throw new CaseActionException(NbBundle.getMessage(Case.class, "Case.open.exception.gen.msg") + ": " + ex.getMessage(), ex); //NON-NLS } catch (TskCoreException ex) { try { Case badCase = Case.getCurrentCase(); @@ -646,7 +646,7 @@ public class Case implements SleuthkitCase.ErrorObserver { SwingUtilities.invokeLater(() -> { WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); }); - throw new CaseActionException(NbBundle.getMessage(Case.class, "CaseOpenException.DatabaseSettingsIssue") + " " + ex.getMessage(), ex); //NON-NLS + throw new CaseActionException(ex.getMessage(), ex); //NON-NLS } } diff --git a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties index a41dd17420..7e3c904dd2 100644 --- a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties +++ b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties @@ -1,5 +1,5 @@ #Updated by build script -#Tue, 13 Oct 2015 17:00:33 -0400 +#Fri, 23 Oct 2015 09:28:23 -0400 LBL_splash_window_title=Starting Autopsy SPLASH_HEIGHT=314 SPLASH_WIDTH=538 diff --git a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties index 5dd3fa12e1..fd051ed29c 100644 --- a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties +++ b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties @@ -1,4 +1,4 @@ #Updated by build script -#Tue, 13 Oct 2015 17:00:33 -0400 +#Fri, 23 Oct 2015 09:28:23 -0400 CTL_MainWindow_Title=Autopsy 3.1.3 CTL_MainWindow_Title_No_Project=Autopsy 3.1.3 From 2568cb45d887066bbc78e710df273399f8d499e7 Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Fri, 23 Oct 2015 09:43:39 -0400 Subject: [PATCH 15/41] remove extraneous UI element --- .../autopsy/casemodule/Bundle.properties | 1 - .../autopsy/casemodule/NewCaseVisualPanel1.form | 15 +-------------- .../autopsy/casemodule/NewCaseVisualPanel1.java | 12 ++---------- 3 files changed, 3 insertions(+), 25 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index b83bceff1e..c7916b48d0 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -257,7 +257,6 @@ SingleUserCaseImporter.Cancelled=Cancelled NewCaseVisualPanel1.caseParentDirWarningLabel.text= NewCaseVisualPanel1.multiUserCaseRadioButton.text=Multi-user NewCaseVisualPanel1.singleUserCaseRadioButton.text=Single-user -NewCaseVisualPanel1.multiUserSettingsWarningLabel.text= Case.deleteReports.deleteFromDiskException.log.msg=Unable to delete the report from the disk. Case.deleteReports.deleteFromDiskException.msg=Unable to delete the report {0} from the disk.\nYou may manually delete it from {1} CaseExceptionWarning.CheckMultiUserOptions=Check Multi-user options. diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form index c30aa65b0b..697ac53348 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form @@ -43,7 +43,6 @@ - @@ -93,9 +92,7 @@ - - - + @@ -190,16 +187,6 @@ - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java index c2f41afbde..9d09d360fd 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java @@ -212,7 +212,6 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { caseDirTextField = new javax.swing.JTextField(); singleUserCaseRadioButton = new javax.swing.JRadioButton(); multiUserCaseRadioButton = new javax.swing.JRadioButton(); - multiUserSettingsWarningLabel = new javax.swing.JLabel(); caseParentDirWarningLabel = new javax.swing.JLabel(); jLabel1.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N @@ -254,9 +253,6 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { } }); - multiUserSettingsWarningLabel.setForeground(new java.awt.Color(255, 0, 0)); - org.openide.awt.Mnemonics.setLocalizedText(multiUserSettingsWarningLabel, org.openide.util.NbBundle.getMessage(NewCaseVisualPanel1.class, "NewCaseVisualPanel1.multiUserSettingsWarningLabel.text")); // NOI18N - caseParentDirWarningLabel.setForeground(new java.awt.Color(255, 0, 0)); org.openide.awt.Mnemonics.setLocalizedText(caseParentDirWarningLabel, org.openide.util.NbBundle.getMessage(NewCaseVisualPanel1.class, "NewCaseVisualPanel1.caseParentDirWarningLabel.text")); // NOI18N @@ -283,8 +279,7 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { .addGroup(layout.createSequentialGroup() .addComponent(caseNameLabel) .addGap(26, 26, 26) - .addComponent(caseNameTextField)) - .addComponent(multiUserSettingsWarningLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(caseNameTextField))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(caseDirBrowseButton))) .addContainerGap()) @@ -321,9 +316,7 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { .addComponent(multiUserCaseRadioButton)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(caseParentDirWarningLabel) - .addGap(1, 1, 1) - .addComponent(multiUserSettingsWarningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap(35, Short.MAX_VALUE)) ); }// //GEN-END:initComponents @@ -368,7 +361,6 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JRadioButton multiUserCaseRadioButton; - private javax.swing.JLabel multiUserSettingsWarningLabel; private javax.swing.JRadioButton singleUserCaseRadioButton; // End of variables declaration//GEN-END:variables From d45ba54f9a29264409e320397bcd033be0d6132d Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Fri, 23 Oct 2015 09:53:46 -0400 Subject: [PATCH 16/41] bump version --- Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties index 06146d2d8f..d2522a3a81 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties @@ -27,7 +27,7 @@ Format_OperatingSystem_Value={0} version {1} running on {2} LBL_Copyright=
Autopsy™ is a digital forensics platform based on The Sleuth Kit™ and other tools.
Copyright © 2003-2014.
URL_ON_IMG=http://www.sleuthkit.org/ -URL_ON_HELP=http://sleuthkit.org/autopsy/docs/user-docs/3.1/ +URL_ON_HELP=http://sleuthkit.org/autopsy/docs/user-docs/4.0/ FILE_FOR_LOCAL_HELP=file:/// INDEX_FOR_LOCAL_HELP=/docs/index.html From a76821e1236ba50b0581913ac25118dfe0e7776c Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Fri, 23 Oct 2015 10:24:22 -0400 Subject: [PATCH 17/41] Additional linting of keywordsearch.Server --- .../src/org/sleuthkit/autopsy/keywordsearch/Server.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java index 0ec4205d75..be87190bc1 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java @@ -167,6 +167,7 @@ public class Server { static final int DEFAULT_SOLR_STOP_PORT = 34343; private int currentSolrServerPort = 0; private int currentSolrStopPort = 0; + private volatile Core currentCore = null; private static final boolean DEBUG = false;//(Version.getBuildType() == Version.Type.DEVELOPMENT); private final UNCPathUtilities uncPathUtilities = new UNCPathUtilities(); @@ -182,7 +183,7 @@ public class Server { // This could be a local or remote server. private HttpSolrServer currentSolrServer; - private final String instanceDir; +// private final String instanceDir; private final File solrFolder; private final ServerAction serverAction; private InputStreamPrinterThread errorRedirectThread; @@ -197,7 +198,7 @@ public class Server { this.localSolrServer = new HttpSolrServer("http://localhost:" + currentSolrServerPort + "/solr"); //NON-NLS serverAction = new ServerAction(); solrFolder = InstalledFileLocator.getDefault().locate("solr", Server.class.getPackage().getName(), false); //NON-NLS - instanceDir = solrFolder.getAbsolutePath() + File.separator + "solr"; //NON-NLS +// instanceDir = solrFolder.getAbsolutePath() + File.separator + "solr"; //NON-NLS javaPath = PlatformUtil.getJavaPath(); logger.log(Level.INFO, "Created Server instance"); //NON-NLS @@ -586,10 +587,10 @@ public class Server { return true; } - /** + + /* * ** Convenience methods for use while we only open one case at a time *** */ - private volatile Core currentCore = null; synchronized void openCore() throws KeywordSearchModuleException { if (currentCore != null) { From 0ef944344e4f685376ea09dc545c026eeece8e58 Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Fri, 23 Oct 2015 10:56:21 -0400 Subject: [PATCH 18/41] prompt before closing a case, if we are currently ingesting --- .../autopsy/casemodule/Bundle.properties | 4 +- .../autopsy/casemodule/CaseCloseAction.java | 64 ++++++++--- .../autopsy/casemodule/CaseOpenAction.java | 103 ++++++++++++------ .../casemodule/NewCaseWizardAction.java | 36 +++--- .../autopsy/casemodule/RecentItems.java | 95 ++++++++++------ 5 files changed, 196 insertions(+), 106 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index 0c929caa83..a9c5f50e5a 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -194,8 +194,6 @@ NewCaseVisualPanel1.caseDirBrowse.selectButton.text=Select NewCaseVisualPanel1.badCredentials.text=Bad multi-user settings (see Tools, Options, Multi-user) or services are down. NewCaseVisualPanel1.MultiUserDisabled.text=Multi-user cases not enabled. See Tools, Options, Multi-user. NewCaseVisualPanel2.getName.text=Additional Information -NewCaseWizardAction.closeCurCase.confMsg.msg=Do you want to save and close this case and proceed with the new case creation? -NewCaseWizardAction.closeCurCase.confMsg.title=Warning\: Closing the Current Case NewCaseWizardAction.newCase.windowTitle.text=New Case Information NewCaseWizardAction.getName.text=New Case Wizard NewCaseWizardAction.databaseProblem1.text=Cannot open database. Cancelling case creation. @@ -262,3 +260,5 @@ NewCaseVisualPanel1.multiUserSettingsWarningLabel.text=Multi-user settings warni Case.deleteReports.deleteFromDiskException.log.msg=Unable to delete the report from the disk. Case.deleteReports.deleteFromDiskException.msg=Unable to delete the report {0} from the disk.\nYou may manually delete it from {1} CaseExceptionWarning.CheckMultiUserOptions=Check Multi-user options. +CloseCaseWhileIngesting.Warning=Proceeding will close the open case, which is currently ingesting. Proceed? +CloseCaseWhileIngesting.Warning.title=Warning\: This will close the current case diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java index 1fc7c79575..d8ecd82996 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java @@ -28,6 +28,12 @@ import org.openide.util.HelpCtx; import org.openide.util.NbBundle; import org.openide.util.actions.CallableSystemAction; import org.openide.util.actions.Presenter; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.ingest.IngestManager; +import java.util.logging.Level; +import org.openide.DialogDescriptor; +import org.openide.DialogDisplayer; +import org.openide.NotifyDescriptor; /** * The action to close the current Case. This class should be disabled on @@ -57,28 +63,52 @@ public final class CaseCloseAction extends CallableSystemAction implements Prese */ @Override public void actionPerformed(ActionEvent e) { - if (Case.existsCurrentCase() == false) { - return; + boolean proceedWithAction = true; + // if ingest is ongoing, warn and get confirmaion before opening a different case + if (IngestManager.getInstance().isIngestRunning()) { + // show the confirmation first to close the current case and open the "New Case" wizard panel + String closeCurrentCase = NbBundle.getMessage(this.getClass(), "CloseCaseWhileIngesting.Warning"); + NotifyDescriptor descriptor = new NotifyDescriptor.Confirmation(closeCurrentCase, + NbBundle.getMessage(this.getClass(), "CloseCaseWhileIngesting.Warning.title"), + NotifyDescriptor.YES_NO_OPTION, NotifyDescriptor.WARNING_MESSAGE); + descriptor.setValue(NotifyDescriptor.NO_OPTION); + + Object res = DialogDisplayer.getDefault().notify(descriptor); + if (res != null && res == DialogDescriptor.YES_OPTION) { + try { + Case.getCurrentCase().closeCase(); // close the current case + } catch (Exception ex) { + Logger.getLogger(NewCaseWizardAction.class.getName()).log(Level.WARNING, "Error closing case.", ex); //NON-NLS + } + } else { + proceedWithAction = false; + } } - new SwingWorker() { + if (proceedWithAction) { + if (Case.existsCurrentCase() == false) { + return; + } - @Override - protected Void doInBackground() throws Exception { - try { - Case result = Case.getCurrentCase(); - result.closeCase(); - } catch (CaseActionException | IllegalStateException unused) { - // Already logged. + new SwingWorker() { + + @Override + protected Void doInBackground() throws Exception { + try { + Case result = Case.getCurrentCase(); + result.closeCase(); + } catch (CaseActionException | IllegalStateException unused) { + // Already logged. + } + return null; } - return null; - } - @Override - protected void done() { - StartupWindowProvider.getInstance().open(); - } - }.execute(); + @Override + protected void done() { + StartupWindowProvider.getInstance().open(); + } + }.execute(); + } } /** diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java index 2a03307cf5..636ee99a54 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java @@ -32,6 +32,12 @@ import org.openide.util.lookup.ServiceProvider; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.coreutils.ModuleSettings; import org.sleuthkit.autopsy.coreutils.Version; +import org.openide.DialogDescriptor; +import org.openide.DialogDisplayer; +import org.openide.NotifyDescriptor; +import org.sleuthkit.autopsy.coreutils.Logger; +import java.util.logging.Level; +import org.sleuthkit.autopsy.ingest.IngestManager; /** * An action that opens an existing case. @@ -65,44 +71,69 @@ public final class CaseOpenAction implements ActionListener { */ @Override public void actionPerformed(ActionEvent e) { - /** - * Pop up a file chooser to allow the user to select a case meta data - * file (.aut file) - */ - int retval = fileChooser.showOpenDialog(WindowManager.getDefault().getMainWindow()); - if (retval == JFileChooser.APPROVE_OPTION) { - /** - * This is a bit of a hack, but close the startup window, if it was - * the source of the action invocation. - */ - try { - StartupWindowProvider.getInstance().close(); - } catch (Exception unused) { - } - /** - * Try to open the case associated with the case meta data file the - * user selected. - */ - final String path = fileChooser.getSelectedFile().getPath(); - String dirPath = fileChooser.getSelectedFile().getParent(); - ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, PROP_BASECASE, dirPath.substring(0, dirPath.lastIndexOf(File.separator))); - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - new Thread(() -> { + boolean proceedWithAction = true; + // if ingest is ongoing, warn and get confirmaion before opening a different case + if (IngestManager.getInstance().isIngestRunning()) { + // show the confirmation first to close the current case and open the "New Case" wizard panel + String closeCurrentCase = NbBundle.getMessage(this.getClass(), "CloseCaseWhileIngesting.Warning"); + NotifyDescriptor descriptor = new NotifyDescriptor.Confirmation(closeCurrentCase, + NbBundle.getMessage(this.getClass(), "CloseCaseWhileIngesting.Warning.title"), + NotifyDescriptor.YES_NO_OPTION, NotifyDescriptor.WARNING_MESSAGE); + descriptor.setValue(NotifyDescriptor.NO_OPTION); + + Object res = DialogDisplayer.getDefault().notify(descriptor); + if (res != null && res == DialogDescriptor.YES_OPTION) { try { - Case.open(path); - } catch (CaseActionException ex) { - SwingUtilities.invokeLater(() -> { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), ex.getMessage() + " " - + NbBundle.getMessage(this.getClass(), "CaseExceptionWarning.CheckMultiUserOptions"), - NbBundle.getMessage(this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"), JOptionPane.ERROR_MESSAGE); //NON-NLS - if (!Case.isCaseOpen()) { - StartupWindowProvider.getInstance().open(); - } - }); - } - }).start(); + Case.getCurrentCase().closeCase(); // close the current case + } catch (Exception ex) { + Logger.getLogger(NewCaseWizardAction.class.getName()).log(Level.WARNING, "Error closing case.", ex); //NON-NLS + } + } else { + proceedWithAction = false; + } + } + + if (proceedWithAction) { + /** + * Pop up a file chooser to allow the user to select a case meta + * data file (.aut file) + */ + int retval = fileChooser.showOpenDialog(WindowManager.getDefault().getMainWindow()); + if (retval == JFileChooser.APPROVE_OPTION) { + /** + * This is a bit of a hack, but close the startup window, if it + * was the source of the action invocation. + */ + try { + StartupWindowProvider.getInstance().close(); + } catch (Exception unused) { + } + + /** + * Try to open the case associated with the case meta data file + * the user selected. + */ + final String path = fileChooser.getSelectedFile().getPath(); + String dirPath = fileChooser.getSelectedFile().getParent(); + ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, PROP_BASECASE, dirPath.substring(0, dirPath.lastIndexOf(File.separator))); + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + new Thread(() -> { + try { + Case.open(path); + } catch (CaseActionException ex) { + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), ex.getMessage() + " " + + NbBundle.getMessage(this.getClass(), "CaseExceptionWarning.CheckMultiUserOptions"), + NbBundle.getMessage(this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"), JOptionPane.ERROR_MESSAGE); //NON-NLS + if (!Case.isCaseOpen()) { + StartupWindowProvider.getInstance().open(); + } + }); + } + }).start(); + } } } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java index 09659fcefa..348b8cc107 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java @@ -39,15 +39,9 @@ import javax.swing.JOptionPane; import org.sleuthkit.autopsy.casemodule.Case.CaseType; import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.datamodel.CaseDbConnectionInfo; -import org.sleuthkit.datamodel.SleuthkitCase; -import org.sleuthkit.datamodel.TskData.DbType; -import java.awt.HeadlessException; -import java.util.MissingResourceException; -import java.util.concurrent.ExecutionException; import org.openide.windows.WindowManager; -import org.sleuthkit.datamodel.TskCoreException; import java.awt.Cursor; -import org.sleuthkit.autopsy.core.UserPreferencesException; +import org.sleuthkit.autopsy.ingest.IngestManager; /** * Action to open the New Case wizard. @@ -62,28 +56,30 @@ final class NewCaseWizardAction extends CallableSystemAction { @Override public void performAction() { - // there's a case open - if (Case.existsCurrentCase()) { + boolean proceedWithAction = true; + // if ingest is ongoing, warn and get confirmaion before opening a different case + if (IngestManager.getInstance().isIngestRunning()) { // show the confirmation first to close the current case and open the "New Case" wizard panel - String closeCurrentCase = NbBundle - .getMessage(this.getClass(), "NewCaseWizardAction.closeCurCase.confMsg.msg"); - NotifyDescriptor d = new NotifyDescriptor.Confirmation(closeCurrentCase, - NbBundle.getMessage(this.getClass(), - "NewCaseWizardAction.closeCurCase.confMsg.title"), + String closeCurrentCase = NbBundle.getMessage(this.getClass(), "CloseCaseWhileIngesting.Warning"); + NotifyDescriptor descriptor = new NotifyDescriptor.Confirmation(closeCurrentCase, + NbBundle.getMessage(this.getClass(), "CloseCaseWhileIngesting.Warning.title"), NotifyDescriptor.YES_NO_OPTION, NotifyDescriptor.WARNING_MESSAGE); - d.setValue(NotifyDescriptor.NO_OPTION); + descriptor.setValue(NotifyDescriptor.NO_OPTION); - Object res = DialogDisplayer.getDefault().notify(d); + Object res = DialogDisplayer.getDefault().notify(descriptor); if (res != null && res == DialogDescriptor.YES_OPTION) { try { Case.getCurrentCase().closeCase(); // close the current case - newCaseAction(); // start the new case creation process } catch (Exception ex) { Logger.getLogger(NewCaseWizardAction.class.getName()).log(Level.WARNING, "Error closing case.", ex); //NON-NLS } + } else { + proceedWithAction = false; } - } else { - newCaseAction(); + } + + if (proceedWithAction) { + newCaseAction(); // start the new case creation process } } @@ -120,6 +116,8 @@ final class NewCaseWizardAction extends CallableSystemAction { final String caseName = (String) wizardDescriptor.getProperty("caseName"); //NON-NLS try { get(); + CaseType currentCaseType = CaseType.values()[(int) wizardDescriptor.getProperty("caseType")]; //NON-NLS + CaseDbConnectionInfo info = UserPreferences.getDatabaseConnectionInfo(); AddImageAction addImageAction = SystemAction.get(AddImageAction.class); addImageAction.actionPerformed(null); } catch (Exception ex) { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java index 7782ba6230..08fb5fa3aa 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java @@ -28,6 +28,12 @@ import javax.swing.SwingUtilities; import org.openide.util.NbBundle; import org.openide.windows.WindowManager; import java.awt.Cursor; +import java.util.logging.Level; +import org.openide.DialogDescriptor; +import org.openide.DialogDisplayer; +import org.openide.NotifyDescriptor; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.ingest.IngestManager; /** * This class is used to add the action to the recent case menu item. When the @@ -54,42 +60,67 @@ class RecentItems implements ActionListener { */ @Override public void actionPerformed(ActionEvent e) { - // check if the file exists - if (caseName.equals("") || casePath.equals("") || (!new File(casePath).exists())) { - // throw an error here - JOptionPane.showMessageDialog(caller, - NbBundle.getMessage(this.getClass(), "RecentItems.openRecentCase.msgDlg.text", - caseName), - NbBundle.getMessage(this.getClass(), "RecentItems.openRecentCase.msgDlg.err"), - JOptionPane.ERROR_MESSAGE); - RecentCases.getInstance().removeRecentCase(caseName, casePath); // remove the recent case if it doesn't exist anymore - //if case is not opened, open the start window - if (Case.isCaseOpen() == false) { - EventQueue.invokeLater(() -> { - StartupWindowProvider.getInstance().open(); - }); + boolean proceedWithAction = true; + // if ingest is ongoing, warn and get confirmaion before opening a different case + if (IngestManager.getInstance().isIngestRunning()) { + // show the confirmation first to close the current case and open the "New Case" wizard panel + String closeCurrentCase = NbBundle.getMessage(this.getClass(), "CloseCaseWhileIngesting.Warning"); + NotifyDescriptor descriptor = new NotifyDescriptor.Confirmation(closeCurrentCase, + NbBundle.getMessage(this.getClass(), "CloseCaseWhileIngesting.Warning.title"), + NotifyDescriptor.YES_NO_OPTION, NotifyDescriptor.WARNING_MESSAGE); + descriptor.setValue(NotifyDescriptor.NO_OPTION); - } - } else { - SwingUtilities.invokeLater(() -> { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - }); - new Thread(() -> { - // Create case. + Object res = DialogDisplayer.getDefault().notify(descriptor); + if (res != null && res == DialogDescriptor.YES_OPTION) { try { - Case.open(casePath); - } catch (CaseActionException ex) { - SwingUtilities.invokeLater(() -> { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), ex.getMessage(), - NbBundle.getMessage(RecentItems.this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"), JOptionPane.ERROR_MESSAGE); //NON-NLS - if (!Case.isCaseOpen()) { - StartupWindowProvider.getInstance().open(); - } - }); + Case.getCurrentCase().closeCase(); // close the current case + } catch (Exception ex) { + Logger.getLogger(NewCaseWizardAction.class.getName()).log(Level.WARNING, "Error closing case.", ex); //NON-NLS } - }).start(); + } else { + proceedWithAction = false; + } + } + + if (proceedWithAction) { + // check if the file exists + if (caseName.equals("") || casePath.equals("") || (!new File(casePath).exists())) { + // throw an error here + JOptionPane.showMessageDialog(caller, + NbBundle.getMessage(this.getClass(), "RecentItems.openRecentCase.msgDlg.text", + caseName), + NbBundle.getMessage(this.getClass(), "RecentItems.openRecentCase.msgDlg.err"), + JOptionPane.ERROR_MESSAGE); + RecentCases.getInstance().removeRecentCase(caseName, casePath); // remove the recent case if it doesn't exist anymore + + //if case is not opened, open the start window + if (Case.isCaseOpen() == false) { + EventQueue.invokeLater(() -> { + StartupWindowProvider.getInstance().open(); + }); + + } + } else { + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + }); + new Thread(() -> { + // Create case. + try { + Case.open(casePath); + } catch (CaseActionException ex) { + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), ex.getMessage(), + NbBundle.getMessage(RecentItems.this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"), JOptionPane.ERROR_MESSAGE); //NON-NLS + if (!Case.isCaseOpen()) { + StartupWindowProvider.getInstance().open(); + } + }); + } + }).start(); + } } } } From 090ac9cad9c6a09aeba6f48f26e3513a9a1f1742 Mon Sep 17 00:00:00 2001 From: momo Date: Fri, 23 Oct 2015 11:06:42 -0400 Subject: [PATCH 19/41] revert property changes --- nbproject/platform.properties | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/nbproject/platform.properties b/nbproject/platform.properties index b7dde1d50c..6c3e50c82d 100644 --- a/nbproject/platform.properties +++ b/nbproject/platform.properties @@ -1,5 +1,4 @@ branding.token=autopsy -nbjdk.active=JDK_1.8_66 # Version of platform that is automatically downloaded # Note build.xml has similar definitions that should be kept in sync (manually) netbeans-plat-version=8.0.2 @@ -14,12 +13,15 @@ cluster.path=\ ${nbplatform.active.dir}/java:\ ${nbplatform.active.dir}/platform disabled.modules=\ + org.apache.tools.ant.module,\ org.netbeans.api.debugger.jpda,\ org.netbeans.api.java,\ + org.netbeans.api.maven,\ org.netbeans.lib.nbjavac,\ org.netbeans.libs.cglib,\ org.netbeans.libs.javacapi,\ org.netbeans.libs.javacimpl,\ + org.netbeans.libs.javafx,\ org.netbeans.libs.springframework,\ org.netbeans.modules.ant.browsetask,\ org.netbeans.modules.ant.debugger,\ @@ -31,6 +33,7 @@ disabled.modules=\ org.netbeans.modules.dbschema,\ org.netbeans.modules.debugger.jpda,\ org.netbeans.modules.debugger.jpda.ant,\ + org.netbeans.modules.debugger.jpda.js,\ org.netbeans.modules.debugger.jpda.kit,\ org.netbeans.modules.debugger.jpda.projects,\ org.netbeans.modules.debugger.jpda.ui,\ @@ -43,6 +46,8 @@ disabled.modules=\ org.netbeans.modules.form.nb,\ org.netbeans.modules.form.refactoring,\ org.netbeans.modules.hibernate,\ + org.netbeans.modules.hibernate4lib,\ + org.netbeans.modules.hibernatelib,\ org.netbeans.modules.hudson.ant,\ org.netbeans.modules.hudson.maven,\ org.netbeans.modules.i18n,\ @@ -64,16 +69,21 @@ disabled.modules=\ org.netbeans.modules.java.examples,\ org.netbeans.modules.java.freeform,\ org.netbeans.modules.java.guards,\ + org.netbeans.modules.java.helpset,\ org.netbeans.modules.java.hints,\ org.netbeans.modules.java.hints.declarative,\ org.netbeans.modules.java.hints.declarative.test,\ org.netbeans.modules.java.hints.legacy.spi,\ org.netbeans.modules.java.hints.test,\ org.netbeans.modules.java.hints.ui,\ + org.netbeans.modules.java.j2sedeploy,\ + org.netbeans.modules.java.j2seembedded,\ org.netbeans.modules.java.j2seplatform,\ + org.netbeans.modules.java.j2seprofiles,\ org.netbeans.modules.java.j2seproject,\ org.netbeans.modules.java.kit,\ org.netbeans.modules.java.lexer,\ + org.netbeans.modules.java.metrics,\ org.netbeans.modules.java.navigation,\ org.netbeans.modules.java.platform,\ org.netbeans.modules.java.preprocessorbridge,\ @@ -85,6 +95,7 @@ disabled.modules=\ org.netbeans.modules.java.sourceui,\ org.netbeans.modules.java.testrunner,\ org.netbeans.modules.javadoc,\ + org.netbeans.modules.javaee.injection,\ org.netbeans.modules.javawebstart,\ org.netbeans.modules.jellytools.java,\ org.netbeans.modules.junit,\ @@ -105,6 +116,8 @@ disabled.modules=\ org.netbeans.modules.maven.repository,\ org.netbeans.modules.maven.search,\ org.netbeans.modules.maven.spring,\ + org.netbeans.modules.nashorn.execution,\ + org.netbeans.modules.performance,\ org.netbeans.modules.performance.java,\ org.netbeans.modules.projectimport.eclipse.core,\ org.netbeans.modules.projectimport.eclipse.j2se,\ @@ -117,6 +130,7 @@ disabled.modules=\ org.netbeans.modules.websvc.jaxws21,\ org.netbeans.modules.websvc.jaxws21api,\ org.netbeans.modules.websvc.saas.codegen.java,\ + org.netbeans.modules.whitelist,\ org.netbeans.modules.xml.jaxb,\ org.netbeans.modules.xml.tools.java,\ - org.netbeans.spi.java.hints + org.netbeans.spi.java.hints \ No newline at end of file From ac27960e4e67eac5117b7fe7fcc3a2cbd881a948 Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Fri, 23 Oct 2015 11:08:26 -0400 Subject: [PATCH 20/41] cursor update --- .../org/sleuthkit/autopsy/casemodule/CaseCloseAction.java | 5 ++++- .../sleuthkit/autopsy/casemodule/NewCaseWizardAction.java | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java index d8ecd82996..cbc817b533 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java @@ -34,6 +34,8 @@ import java.util.logging.Level; import org.openide.DialogDescriptor; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; +import org.openide.windows.WindowManager; +import java.awt.Cursor; /** * The action to close the current Case. This class should be disabled on @@ -89,7 +91,7 @@ public final class CaseCloseAction extends CallableSystemAction implements Prese if (Case.existsCurrentCase() == false) { return; } - + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); new SwingWorker() { @Override @@ -105,6 +107,7 @@ public final class CaseCloseAction extends CallableSystemAction implements Prese @Override protected void done() { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); StartupWindowProvider.getInstance().open(); } }.execute(); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java index 348b8cc107..9dc704be75 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java @@ -79,6 +79,7 @@ final class NewCaseWizardAction extends CallableSystemAction { } if (proceedWithAction) { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); newCaseAction(); // start the new case creation process } } From 1f4e2112d9b1b46cac2335cbd753f759cdb7ba3b Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Fri, 23 Oct 2015 11:57:18 -0400 Subject: [PATCH 21/41] use early out --- .../autopsy/casemodule/Bundle.properties | 2 +- .../autopsy/casemodule/CaseCloseAction.java | 52 +++++++------ .../autopsy/casemodule/CaseOpenAction.java | 75 +++++++++---------- .../casemodule/NewCaseWizardAction.java | 10 +-- .../autopsy/casemodule/RecentItems.java | 71 +++++++++--------- 5 files changed, 100 insertions(+), 110 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index 7060f9a1e9..ccba954c84 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -262,5 +262,5 @@ CasePropertiesForm.tbDbType.text= CasePropertiesForm.lbDbName.text=Database Name: CasePropertiesForm.tbDbName.text= CaseExceptionWarning.CheckMultiUserOptions=Check Multi-user options. -CloseCaseWhileIngesting.Warning=Proceeding will close the open case, which is currently ingesting. Proceed? +CloseCaseWhileIngesting.Warning=Ingest is running. Are you sure you want to close the case? CloseCaseWhileIngesting.Warning.title=Warning\: This will close the current case diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java index cbc817b533..ce97a09c9d 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseCloseAction.java @@ -65,7 +65,7 @@ public final class CaseCloseAction extends CallableSystemAction implements Prese */ @Override public void actionPerformed(ActionEvent e) { - boolean proceedWithAction = true; + // if ingest is ongoing, warn and get confirmaion before opening a different case if (IngestManager.getInstance().isIngestRunning()) { // show the confirmation first to close the current case and open the "New Case" wizard panel @@ -83,35 +83,33 @@ public final class CaseCloseAction extends CallableSystemAction implements Prese Logger.getLogger(NewCaseWizardAction.class.getName()).log(Level.WARNING, "Error closing case.", ex); //NON-NLS } } else { - proceedWithAction = false; - } - } - - if (proceedWithAction) { - if (Case.existsCurrentCase() == false) { return; } - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - new SwingWorker() { - - @Override - protected Void doInBackground() throws Exception { - try { - Case result = Case.getCurrentCase(); - result.closeCase(); - } catch (CaseActionException | IllegalStateException unused) { - // Already logged. - } - return null; - } - - @Override - protected void done() { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - StartupWindowProvider.getInstance().open(); - } - }.execute(); } + + if (Case.existsCurrentCase() == false) { + return; + } + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + new SwingWorker() { + + @Override + protected Void doInBackground() throws Exception { + try { + Case result = Case.getCurrentCase(); + result.closeCase(); + } catch (CaseActionException | IllegalStateException unused) { + // Already logged. + } + return null; + } + + @Override + protected void done() { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + StartupWindowProvider.getInstance().open(); + } + }.execute(); } /** diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java index 636ee99a54..63ddefebf8 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseOpenAction.java @@ -72,7 +72,6 @@ public final class CaseOpenAction implements ActionListener { @Override public void actionPerformed(ActionEvent e) { - boolean proceedWithAction = true; // if ingest is ongoing, warn and get confirmaion before opening a different case if (IngestManager.getInstance().isIngestRunning()) { // show the confirmation first to close the current case and open the "New Case" wizard panel @@ -90,50 +89,48 @@ public final class CaseOpenAction implements ActionListener { Logger.getLogger(NewCaseWizardAction.class.getName()).log(Level.WARNING, "Error closing case.", ex); //NON-NLS } } else { - proceedWithAction = false; + return; } } - if (proceedWithAction) { + /** + * Pop up a file chooser to allow the user to select a case meta data + * file (.aut file) + */ + int retval = fileChooser.showOpenDialog(WindowManager.getDefault().getMainWindow()); + if (retval == JFileChooser.APPROVE_OPTION) { /** - * Pop up a file chooser to allow the user to select a case meta - * data file (.aut file) + * This is a bit of a hack, but close the startup window, if it was + * the source of the action invocation. */ - int retval = fileChooser.showOpenDialog(WindowManager.getDefault().getMainWindow()); - if (retval == JFileChooser.APPROVE_OPTION) { - /** - * This is a bit of a hack, but close the startup window, if it - * was the source of the action invocation. - */ - try { - StartupWindowProvider.getInstance().close(); - } catch (Exception unused) { - } - - /** - * Try to open the case associated with the case meta data file - * the user selected. - */ - final String path = fileChooser.getSelectedFile().getPath(); - String dirPath = fileChooser.getSelectedFile().getParent(); - ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, PROP_BASECASE, dirPath.substring(0, dirPath.lastIndexOf(File.separator))); - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - new Thread(() -> { - try { - Case.open(path); - } catch (CaseActionException ex) { - SwingUtilities.invokeLater(() -> { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), ex.getMessage() + " " - + NbBundle.getMessage(this.getClass(), "CaseExceptionWarning.CheckMultiUserOptions"), - NbBundle.getMessage(this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"), JOptionPane.ERROR_MESSAGE); //NON-NLS - if (!Case.isCaseOpen()) { - StartupWindowProvider.getInstance().open(); - } - }); - } - }).start(); + try { + StartupWindowProvider.getInstance().close(); + } catch (Exception unused) { } + + /** + * Try to open the case associated with the case meta data file the + * user selected. + */ + final String path = fileChooser.getSelectedFile().getPath(); + String dirPath = fileChooser.getSelectedFile().getParent(); + ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, PROP_BASECASE, dirPath.substring(0, dirPath.lastIndexOf(File.separator))); + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + new Thread(() -> { + try { + Case.open(path); + } catch (CaseActionException ex) { + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), ex.getMessage() + " " + + NbBundle.getMessage(this.getClass(), "CaseExceptionWarning.CheckMultiUserOptions"), + NbBundle.getMessage(this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"), JOptionPane.ERROR_MESSAGE); //NON-NLS + if (!Case.isCaseOpen()) { + StartupWindowProvider.getInstance().open(); + } + }); + } + }).start(); } } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java index 9dc704be75..491f66ba5e 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java @@ -56,7 +56,7 @@ final class NewCaseWizardAction extends CallableSystemAction { @Override public void performAction() { - boolean proceedWithAction = true; + // if ingest is ongoing, warn and get confirmaion before opening a different case if (IngestManager.getInstance().isIngestRunning()) { // show the confirmation first to close the current case and open the "New Case" wizard panel @@ -74,14 +74,12 @@ final class NewCaseWizardAction extends CallableSystemAction { Logger.getLogger(NewCaseWizardAction.class.getName()).log(Level.WARNING, "Error closing case.", ex); //NON-NLS } } else { - proceedWithAction = false; + return; } } - if (proceedWithAction) { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - newCaseAction(); // start the new case creation process - } + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + newCaseAction(); // start the new case creation process } /** diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java index 08fb5fa3aa..8e9c989d5a 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/RecentItems.java @@ -61,7 +61,6 @@ class RecentItems implements ActionListener { @Override public void actionPerformed(ActionEvent e) { - boolean proceedWithAction = true; // if ingest is ongoing, warn and get confirmaion before opening a different case if (IngestManager.getInstance().isIngestRunning()) { // show the confirmation first to close the current case and open the "New Case" wizard panel @@ -79,48 +78,46 @@ class RecentItems implements ActionListener { Logger.getLogger(NewCaseWizardAction.class.getName()).log(Level.WARNING, "Error closing case.", ex); //NON-NLS } } else { - proceedWithAction = false; + return; } } - if (proceedWithAction) { - // check if the file exists - if (caseName.equals("") || casePath.equals("") || (!new File(casePath).exists())) { - // throw an error here - JOptionPane.showMessageDialog(caller, - NbBundle.getMessage(this.getClass(), "RecentItems.openRecentCase.msgDlg.text", - caseName), - NbBundle.getMessage(this.getClass(), "RecentItems.openRecentCase.msgDlg.err"), - JOptionPane.ERROR_MESSAGE); - RecentCases.getInstance().removeRecentCase(caseName, casePath); // remove the recent case if it doesn't exist anymore + // check if the file exists + if (caseName.equals("") || casePath.equals("") || (!new File(casePath).exists())) { + // throw an error here + JOptionPane.showMessageDialog(caller, + NbBundle.getMessage(this.getClass(), "RecentItems.openRecentCase.msgDlg.text", + caseName), + NbBundle.getMessage(this.getClass(), "RecentItems.openRecentCase.msgDlg.err"), + JOptionPane.ERROR_MESSAGE); + RecentCases.getInstance().removeRecentCase(caseName, casePath); // remove the recent case if it doesn't exist anymore - //if case is not opened, open the start window - if (Case.isCaseOpen() == false) { - EventQueue.invokeLater(() -> { - StartupWindowProvider.getInstance().open(); - }); - - } - } else { - SwingUtilities.invokeLater(() -> { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + //if case is not opened, open the start window + if (Case.isCaseOpen() == false) { + EventQueue.invokeLater(() -> { + StartupWindowProvider.getInstance().open(); }); - new Thread(() -> { - // Create case. - try { - Case.open(casePath); - } catch (CaseActionException ex) { - SwingUtilities.invokeLater(() -> { - WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), ex.getMessage(), - NbBundle.getMessage(RecentItems.this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"), JOptionPane.ERROR_MESSAGE); //NON-NLS - if (!Case.isCaseOpen()) { - StartupWindowProvider.getInstance().open(); - } - }); - } - }).start(); + } + } else { + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + }); + new Thread(() -> { + // Create case. + try { + Case.open(casePath); + } catch (CaseActionException ex) { + SwingUtilities.invokeLater(() -> { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), ex.getMessage(), + NbBundle.getMessage(RecentItems.this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"), JOptionPane.ERROR_MESSAGE); //NON-NLS + if (!Case.isCaseOpen()) { + StartupWindowProvider.getInstance().open(); + } + }); + } + }).start(); } } } From a72b9f8adb6e23ce706e574df9306501e1842bd3 Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Fri, 23 Oct 2015 12:01:19 -0400 Subject: [PATCH 22/41] update version information from 3.1 to 4.0 in documentation --- docs/doxygen-user/android.dox | 2 +- docs/doxygen-user/android_analyzer.dox | 2 +- docs/doxygen-user/main.dox | 2 +- docs/doxygen/main.dox | 2 +- docs/doxygen/modIngest.dox | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/doxygen-user/android.dox b/docs/doxygen-user/android.dox index 04733581eb..b8ccf83dc9 100644 --- a/docs/doxygen-user/android.dox +++ b/docs/doxygen-user/android.dox @@ -6,7 +6,7 @@ The Android Analyzer module allows you to analyze SQLite and other files from an Simply add your physical images or file system dumps as data sources and enable the Android Analyzer module. -NOTE: This module is not exhaustive with its support for Android. It was created as a starting point for others to contribute plug-ins for 3rd party apps. See the Developer docs (http://sleuthkit.org/autopsy/docs/api-docs/3.1/mod_mobile_page.html) for information on writing modules. +NOTE: This module is not exhaustive with its support for Android. It was created as a starting point for others to contribute plug-ins for 3rd party apps. See the Developer docs (http://sleuthkit.org/autopsy/docs/api-docs/4.0/mod_mobile_page.html) for information on writing modules. Analysis diff --git a/docs/doxygen-user/android_analyzer.dox b/docs/doxygen-user/android_analyzer.dox index f23df9714c..0943bd05c9 100755 --- a/docs/doxygen-user/android_analyzer.dox +++ b/docs/doxygen-user/android_analyzer.dox @@ -18,7 +18,7 @@ The module should be able to extract the following: NOTE: These database formats vary by version of OS and different vendors can place the databases in different places. Autopsy may not support all versions and vendors. -NOTE: This module is not exhaustive with its support for Android. It was created as a starting point for others to contribute plug-ins for 3rd party apps. See the Developer docs for information on writing modules. +NOTE: This module is not exhaustive with its support for Android. It was created as a starting point for others to contribute plug-ins for 3rd party apps. See the Developer docs for information on writing modules. Configuration diff --git a/docs/doxygen-user/main.dox b/docs/doxygen-user/main.dox index e3ded15e32..aa8724840b 100644 --- a/docs/doxygen-user/main.dox +++ b/docs/doxygen-user/main.dox @@ -4,7 +4,7 @@ Overview ----- -This is the User's Guide for the open source Autopsy platform. Autopsy allows you to examine a hard drive or mobile device and recover evidence from it. This guide should help you with using Autopsy. The developer's guide will help you develop your own Autopsy modules. +This is the User's Guide for the open source Autopsy platform. Autopsy allows you to examine a hard drive or mobile device and recover evidence from it. This guide should help you with using Autopsy. The developer's guide will help you develop your own Autopsy modules. Autopsy 4 (and 3) are a complete rewrite from Autopsy 2, and none of this document is relevant to Autopsy 2. diff --git a/docs/doxygen/main.dox b/docs/doxygen/main.dox index 17ba30d6e7..9b4510f820 100755 --- a/docs/doxygen/main.dox +++ b/docs/doxygen/main.dox @@ -18,7 +18,7 @@ If you want to write modules, then these pages are for you: - \subpage mod_content_page - \subpage mod_result_page - \subpage adv_dev_page -- \subpage query_database_page +- Query the Database - \subpage mod_mobile_page These pages are more detailed if you want to modify Autopsy code instead of writing add-on modules. diff --git a/docs/doxygen/modIngest.dox b/docs/doxygen/modIngest.dox index 0f3d4a1ebb..4a88c317b0 100755 --- a/docs/doxygen/modIngest.dox +++ b/docs/doxygen/modIngest.dox @@ -43,7 +43,7 @@ ingest modules. \section ingest_modules_lifecycle Ingest Module Life Cycle -Before we dive into the details of creating a module, it is important to understand the life cycle of the module. Note that this life cycle is much different for Autopsy 3.1 modules compared to Autopsy 3.0 modules. This section only talks about 3.1 modules. +Before we dive into the details of creating a module, it is important to understand the life cycle of the module. Note that this life cycle is much different for Autopsy 3.1 and newer modules compared to Autopsy 3.0 modules. This section only talks about 3.1 and newer modules. You will need to implement at least two classes to make an ingest module: -# A factory class that will be created when Autopsy starts and will provide configuration panels to Autopsy and will create instances of your ingest module. @@ -319,7 +319,7 @@ databases from the hash databases manager. -\section ingest_modules_api_migration Migrating 3.0 Java Ingest Modules to the 3.1 API +\section ingest_modules_api_migration Migrating 3.0 Java Ingest Modules to the 3.1 and newer API This section is a guide for module developers who wrote modules for the 3.0 API. These API changes occurred so that we could make parallel pipelines of the file-level ingest modules. This section assumes you've read the above description of the new API. From 536ef9dfd61b4a3c09ef4b59b919433c1c1b627d Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Fri, 23 Oct 2015 12:12:15 -0400 Subject: [PATCH 23/41] Additional linting of keywordsearch.Server --- .../sleuthkit/autopsy/keywordsearch/Server.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java index be87190bc1..d9e168b823 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java @@ -167,7 +167,6 @@ public class Server { static final int DEFAULT_SOLR_STOP_PORT = 34343; private int currentSolrServerPort = 0; private int currentSolrStopPort = 0; - private volatile Core currentCore = null; private static final boolean DEBUG = false;//(Version.getBuildType() == Version.Type.DEVELOPMENT); private final UNCPathUtilities uncPathUtilities = new UNCPathUtilities(); @@ -183,7 +182,8 @@ public class Server { // This could be a local or remote server. private HttpSolrServer currentSolrServer; -// private final String instanceDir; + private Core currentCore; + private final File solrFolder; private final ServerAction serverAction; private InputStreamPrinterThread errorRedirectThread; @@ -198,9 +198,8 @@ public class Server { this.localSolrServer = new HttpSolrServer("http://localhost:" + currentSolrServerPort + "/solr"); //NON-NLS serverAction = new ServerAction(); solrFolder = InstalledFileLocator.getDefault().locate("solr", Server.class.getPackage().getName(), false); //NON-NLS -// instanceDir = solrFolder.getAbsolutePath() + File.separator + "solr"; //NON-NLS javaPath = PlatformUtil.getJavaPath(); - + logger.log(Level.INFO, "Created Server instance"); //NON-NLS } @@ -296,7 +295,7 @@ public class Server { BufferedReader br = new BufferedReader(isr); OutputStreamWriter osw = new OutputStreamWriter(out, PlatformUtil.getDefaultPlatformCharset()); BufferedWriter bw = new BufferedWriter(osw);) { - + String line = null; while (doRun && (line = br.readLine()) != null) { bw.write(line); @@ -587,11 +586,10 @@ public class Server { return true; } - + /* * ** Convenience methods for use while we only open one case at a time *** */ - synchronized void openCore() throws KeywordSearchModuleException { if (currentCore != null) { throw new KeywordSearchModuleException( @@ -1252,6 +1250,7 @@ public class Server { } class ServerAction extends AbstractAction { + private static final long serialVersionUID = 1L; @Override @@ -1264,6 +1263,7 @@ public class Server { * Exception thrown if solr port not available */ class SolrServerNoPortException extends SocketException { + private static final long serialVersionUID = 1L; /** From 8c4ab4dd74c376deaec4c5d30709d19652875e42 Mon Sep 17 00:00:00 2001 From: momo Date: Fri, 23 Oct 2015 13:05:14 -0400 Subject: [PATCH 24/41] remove appearance from options --- Core/src/org/sleuthkit/autopsy/core/layer.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/Core/src/org/sleuthkit/autopsy/core/layer.xml b/Core/src/org/sleuthkit/autopsy/core/layer.xml index 42315074d4..8e71419b45 100644 --- a/Core/src/org/sleuthkit/autopsy/core/layer.xml +++ b/Core/src/org/sleuthkit/autopsy/core/layer.xml @@ -14,6 +14,7 @@ + From 65561b3e478917992a3da4a693600584c09ca96c Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Fri, 23 Oct 2015 13:34:10 -0400 Subject: [PATCH 25/41] clean up comments --- .../casemodule/SingleUserCaseConverter.java | 135 +++++++----------- 1 file changed, 49 insertions(+), 86 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java b/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java index f986755097..bf9a3b93c2 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java @@ -54,10 +54,6 @@ public class SingleUserCaseConverter { public class ImportCaseData { - private final Path baseImageInputFolder; - private final Path baseCaseInputFolder; - private final Path baseImageOutputFolder; - private final Path baseCaseOutputFolder; private final Path imageInputFolder; private final Path caseInputFolder; private final Path imageOutputFolder; @@ -72,10 +68,6 @@ public class SingleUserCaseConverter { private final CaseDbConnectionInfo db; public ImportCaseData( - Path baseImageInputFolder, - Path baseCaseInputFolder, - Path baseImageOutputFolder, - Path baseCaseOutputFolder, Path imageInput, Path caseInput, Path imageOutput, @@ -87,10 +79,6 @@ public class SingleUserCaseConverter { boolean copySourceImages, boolean deleteCase) throws UserPreferencesException { - this.baseImageInputFolder = baseImageInputFolder; - this.baseCaseInputFolder = baseCaseInputFolder; - this.baseImageOutputFolder = baseImageOutputFolder; - this.baseCaseOutputFolder = baseCaseOutputFolder; this.imageInputFolder = imageInput; this.caseInputFolder = caseInput; this.imageOutputFolder = imageOutput; @@ -158,9 +146,9 @@ public class SingleUserCaseConverter { } /** - * Handles most of the heavy lifting for importing a case from single-user - * to multi-user. Creates new .aut file, moves folders to the right place, - * imports the , and updates paths within the database. + * Handles the heavy lifting for importing a case from single-user to + * multi-user. Creates new .aut file, moves folders to the right place, + * imports the database, and updates paths within the database. * * @param icd the Import Case Data for the current case * @@ -170,34 +158,39 @@ public class SingleUserCaseConverter { Class.forName("org.postgresql.Driver"); //NON-NLS + // Make sure there is a SQLite databse file Path oldDatabasePath = icd.getCaseInputFolder().resolve(AUTOPSY_DB_FILE); if (false == oldDatabasePath.toFile().exists()) { throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.BadDatabaseFileName")); } - // read old xml config + // Read old xml config XMLCaseManagement oldXmlCaseManagement = new XMLCaseManagement(); oldXmlCaseManagement.open(icd.getCaseInputFolder().resolve(icd.getAutFileName()).toString()); if (oldXmlCaseManagement.getCaseType() == CaseType.MULTI_USER_CASE) { throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.AlreadyMultiUser")); } - // create sanitized names for database and solr + // Create sanitized names for PostgreSQL and Solr SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss"); //NON-NLS Date date = new Date(); String dbName = Case.sanitizeCaseName(icd.getNewCaseName()) + "_" + dateFormat.format(date); //NON-NLS String solrName = dbName; icd.setPostgreSQLDbName(dbName); - copyResults(icd); // Copy items to new hostname folder structure + // Copy items to new hostname folder structure + copyResults(icd); - importDb(icd); // Change from SQLite to PostgreSQL + // Convert from SQLite to PostgreSQL + importDb(icd); - fixPaths(icd); // Update paths in DB + // Update paths inside databse + fixPaths(icd); - copyImages(icd); // Copy images over + // Copy images + copyImages(icd); - // create new XML config + // Create new .aut file XMLCaseManagement newXmlCaseManagement = new XMLCaseManagement(); newXmlCaseManagement.create(icd.getCaseOutputFolder().toString(), icd.getNewCaseName(), @@ -215,44 +208,14 @@ public class SingleUserCaseConverter { if (icd.getDeleteCase()) { FileUtils.deleteDirectory(icd.getCaseInputFolder().toFile()); } - reportLostImages(icd); - } - - /** - * Searches for images in the filesystem. It parses the new PostgreSQL - * database to find images that should exist, and notifies when they do not. - * - * @param db database credentials - * @param dbName the name of the database - * - * @return true if successfully found all images, false otherwise. - */ - private static void reportLostImages(ImportCaseData icd) { - if (icd.getCopySourceImages()) { - try { - Connection postgreSQLConnection = getPostgreSQLConnection(icd); - Statement inputStatement = postgreSQLConnection.createStatement(); - ResultSet inputResultSet = inputStatement.executeQuery("SELECT * FROM tsk_image_names"); //NON-NLS - - while (inputResultSet.next()) { - - File theFile = new File(inputResultSet.getString(2)); - if (false == theFile.exists()) { - // do not throw, this can be fixed when they open the case - } - } - } catch (SQLException ex) { - // do not throw, this can be fixed when they open the case - } - } } /** * Figure out the input folder for images and return it. * - * @param icd the import case data for the current case + * @param icd the Import Case Data for the current case * - * @return the name of the proper input folder + * @return the name of the proper Image input folder */ private static File findInputFolder(ImportCaseData icd) { @@ -260,26 +223,29 @@ public class SingleUserCaseConverter { if (thePath.isDirectory()) { /// we've found it return thePath; - } else { - return icd.getImageInputFolder().toFile(); } + thePath = icd.getImageInputFolder().resolve(icd.getRawFolderName()).toFile(); + if (thePath.isDirectory()) { + /// we've found it + return thePath; + } + return icd.getImageInputFolder().toFile(); } /** - * Copy all the folders at the base level to the new scheme involving - * hostname. Also take care of a few files such as logs, timeline db, etc. + * Copy all folders at the base level to the new scheme involving hostname. + * Also take care of a few files such as logs, timeline database, etc. * - * @param icd the case data + * @param icd the Import Case Data for the current case * * @throws IOException */ private static void copyResults(ImportCaseData icd) throws IOException { /// get hostname String hostName = NetworkUtils.getLocalHostName(); - Path destination; - Path source; - source = icd.getCaseInputFolder(); + Path destination; + Path source = icd.getCaseInputFolder(); if (source.toFile().exists()) { destination = icd.getCaseOutputFolder().resolve(hostName); FileUtils.copyDirectory(source.toFile(), destination.toFile()); @@ -291,17 +257,19 @@ public class SingleUserCaseConverter { FileUtils.copyFile(source.toFile(), destination.toFile()); } - // Remove the single-user .aut file, database, Timeline database and log + // Remove the single-user .aut file from the multi-user folder File oldAutopsyFile = Paths.get(icd.getCaseOutputFolder().toString(), hostName, icd.getOldCaseName() + DOTAUT).toFile(); if (oldAutopsyFile.exists()) { oldAutopsyFile.delete(); } + // Remove the single-user database file from the multi-user folder File oldDatabaseFile = Paths.get(icd.getCaseOutputFolder().toString(), hostName, AUTOPSY_DB_FILE).toFile(); if (oldDatabaseFile.exists()) { oldDatabaseFile.delete(); } + // Remove the single-user Timeline file from the multi-user folder File oldTimelineFile = Paths.get(icd.getCaseOutputFolder().toString(), hostName, TIMELINE_FILE).toFile(); if (oldTimelineFile.exists()) { oldTimelineFile.delete(); @@ -313,13 +281,9 @@ public class SingleUserCaseConverter { * data while loading it over. Fixing paths is done once the database is * completely imported. * - * @param newDbName the name of the database, could have name collision - * @param inputPath the path to the input case - * @param outputCaseName the name of the output case, could have extra - * digits to avoid name collisions - * - * @return the deconflicted name of the PostgreSQL database that was created + * @param icd the Import Case Data for the current case * + * @throws Exception * @throws SQLException * @throws ClassNotFoundException */ @@ -923,18 +887,15 @@ public class SingleUserCaseConverter { } /** - * Checks that our database name is unique. If it is not, attempts to add + * Checks that the database name is unique. If it is not, attempts to add * numbers to it until it is unique. Gives up if it goes through all * positive integers without finding a unique name. * - * @param db Database credentials - * @param baseDbName proposed name of the database to check for collisions + * @param icd the Import Case Data for the current case * - * @return name to use for the new database. Could be the name passed in. - * - * @throws ClassNotFoundException - * @throws SQLException * @throws Exception + * @throws SQLException + * @throws ClassNotFoundException */ private static void deconflictDatabaseName(ImportCaseData icd) throws ClassNotFoundException, SQLException, Exception { @@ -955,12 +916,12 @@ public class SingleUserCaseConverter { if (!answer.next()) { unique = true; } else { - // not unique. add numbers before dbName. + // not unique. add numbers to db name. if (number == Integer.MAX_VALUE) { // oops. it never became unique. give up. throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.NonUniqueDatabaseName")); } - sanitizedDbName = "_" + Integer.toString(number) + "_" + icd.getPostgreSQLDbName(); //NON-NLS + sanitizedDbName = "db_" + Integer.toString(number) + "_" + icd.getPostgreSQLDbName(); //NON-NLS // Chop full db name to 63 characters (max for PostgreSQL) if (sanitizedDbName.length() > MAX_DB_NAME_LENGTH) { @@ -979,10 +940,10 @@ public class SingleUserCaseConverter { } /** - * Get the images from the old case and place them in the central - * repository, if the user chose to. + * Get the images from the old case and stage them for the new case, if the + * user chose to copy images over. * - * @param icd the Import Case Data + * @param icd the Import Case Data for the current case * * @throws IOException */ @@ -1005,8 +966,10 @@ public class SingleUserCaseConverter { * Fix up any paths in the database that refer to items that have moved. * Candidates include events.db, input images, reports, file paths, etc. * - * @param icd the import case data for the current case - * @param dbName the name of the database + * @param icd the Import Case Data for the current case + * + * @throws Exception + * @throws SQLExceptionException */ private static void fixPaths(ImportCaseData icd) throws SQLException, Exception { /// Fix paths in reports, tsk_files_path, and tsk_image_names tables @@ -1156,7 +1119,7 @@ public class SingleUserCaseConverter { /** * Open the PostgreSQL database * - * @param icd ImportCaseData holding connection credentials + * @param icd Import Case Data holding connection credentials * * @return returns a Connection * @@ -1169,7 +1132,7 @@ public class SingleUserCaseConverter { /** * Open the PostgreSQL database * - * @param icd ImportCaseData holding connection credentials + * @param icd Import Case Data holding connection credentials * @param dbName the name of the database to open * * @return returns a Connection @@ -1188,7 +1151,7 @@ public class SingleUserCaseConverter { /** * Open the SQLite database * - * @param icd ImportCaseData holding database path details + * @param icd Import Case Data holding database path details * * @return returns a Connection * From da244c873e41e02782aa39f861be41b46addf181 Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Fri, 23 Oct 2015 14:51:31 -0400 Subject: [PATCH 26/41] remove old file --- docs/doxygen-user/android.dox | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 docs/doxygen-user/android.dox diff --git a/docs/doxygen-user/android.dox b/docs/doxygen-user/android.dox deleted file mode 100644 index 04733581eb..0000000000 --- a/docs/doxygen-user/android.dox +++ /dev/null @@ -1,26 +0,0 @@ -/*! \page android_page Android Analyzer -Overview -======== - -The Android Analyzer module allows you to analyze SQLite and other files from an Android device. It should work on Physical dumps from most Android devices (note that we do not provide an acquisition method). Autopsy will not support older Android devices that do not have a volume system. These devices will often have a single physical image file for them and there is no information in the image that describes the layout of the file systems. Autopsy will therefore not be able to detect what it is. - -Simply add your physical images or file system dumps as data sources and enable the Android Analyzer module. - -NOTE: This module is not exhaustive with its support for Android. It was created as a starting point for others to contribute plug-ins for 3rd party apps. See the Developer docs (http://sleuthkit.org/autopsy/docs/api-docs/3.1/mod_mobile_page.html) for information on writing modules. - - -Analysis -======== -The module should be able to extract the following: - -- Text messages / SMS / MMS -- Call Logs -- Contacts -- Tango Messages -- Words with Friends Messages -- GPS from the browser and Google Maps -- GPS from cache.wifi and cache.cell files - -NOTE: These database formats vary by version of OS and different vendors can place the databaes in different places. Autopsy may not support all versions and vendors. - -*/ From 54b9f02effef657fc878f8d0565964d2bbf7bb91 Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Fri, 23 Oct 2015 14:59:09 -0400 Subject: [PATCH 27/41] NON-NLS --- .../autopsy/casemodule/SingleUserCaseConverter.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java b/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java index bf9a3b93c2..47d27c3ab9 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java @@ -161,14 +161,14 @@ public class SingleUserCaseConverter { // Make sure there is a SQLite databse file Path oldDatabasePath = icd.getCaseInputFolder().resolve(AUTOPSY_DB_FILE); if (false == oldDatabasePath.toFile().exists()) { - throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.BadDatabaseFileName")); + throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.BadDatabaseFileName")); //NON-NLS } // Read old xml config XMLCaseManagement oldXmlCaseManagement = new XMLCaseManagement(); oldXmlCaseManagement.open(icd.getCaseInputFolder().resolve(icd.getAutFileName()).toString()); if (oldXmlCaseManagement.getCaseType() == CaseType.MULTI_USER_CASE) { - throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.AlreadyMultiUser")); + throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.AlreadyMultiUser")); //NON-NLS } // Create sanitized names for PostgreSQL and Solr @@ -919,7 +919,7 @@ public class SingleUserCaseConverter { // not unique. add numbers to db name. if (number == Integer.MAX_VALUE) { // oops. it never became unique. give up. - throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.NonUniqueDatabaseName")); + throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.NonUniqueDatabaseName")); //NON-NLS } sanitizedDbName = "db_" + Integer.toString(number) + "_" + icd.getPostgreSQLDbName(); //NON-NLS @@ -957,7 +957,7 @@ public class SingleUserCaseConverter { FileUtils.copyDirectory(imageSource, imageDestination); } else { - throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.UnableToCopySourceImages")); + throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.UnableToCopySourceImages")); //NON-NLS } } } @@ -1012,7 +1012,7 @@ public class SingleUserCaseConverter { } postgresqlConnection.close(); } else { - throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.CanNotOpenDatabase")); + throw new Exception(NbBundle.getMessage(SingleUserCaseConverter.class, "SingleUserCaseConverter.CanNotOpenDatabase")); //NON-NLS } } From b1bf33f6e1b76ad19e4c1d357cd49629666c7103 Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Fri, 23 Oct 2015 15:34:43 -0400 Subject: [PATCH 28/41] code review update --- Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index 5a81115db2..5575b3e38f 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -248,8 +248,7 @@ CasePropertiesForm.tbDbName.text= CaseExceptionWarning.CheckMultiUserOptions=Check Multi-user options. SingleUserCaseConverter.BadDatabaseFileName=Database file does not exist! SingleUserCaseConverter.AlreadyMultiUser=Case is already multi-user! -SingleUserCaseConverter.ImportedAsMultiUser=\nThis case was imported as a multi-user collaborative case on -SingleUserCaseConverter.NonUniqueDatabaseName=Database name not unique. Skipping. +SingleUserCaseConverter.NonUniqueDatabaseName=Database name not unique. SingleUserCaseConverter.UnableToCopySourceImages=Unable to copy source images SingleUserCaseConverter.CanNotOpenDatabase=Unable to open database CloseCaseWhileIngesting.Warning=Ingest is running. Are you sure you want to close the case? From 8d7ab277e73111ae4e3d82db3ad386bb770866cb Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Fri, 23 Oct 2015 16:24:37 -0400 Subject: [PATCH 29/41] add windows shared drive authentication --- .../doxygen-user/images/credentialManager.PNG | Bin 0 -> 100169 bytes .../images/credentialsWithDomain.PNG | Bin 0 -> 34410 bytes docs/doxygen-user/images/getHostname.PNG | Bin 0 -> 9504 bytes docs/doxygen-user/images/hostname.PNG | Bin 0 -> 38706 bytes docs/doxygen-user/images/toConnect.PNG | Bin 0 -> 58514 bytes docs/doxygen-user/images/urlInAddressbar.PNG | Bin 0 -> 80064 bytes docs/doxygen-user/main.dox | 1 + docs/doxygen-user/windows_authentication.dox | 57 ++++++++++++++++++ 8 files changed, 58 insertions(+) create mode 100755 docs/doxygen-user/images/credentialManager.PNG create mode 100755 docs/doxygen-user/images/credentialsWithDomain.PNG create mode 100755 docs/doxygen-user/images/getHostname.PNG create mode 100755 docs/doxygen-user/images/hostname.PNG create mode 100755 docs/doxygen-user/images/toConnect.PNG create mode 100755 docs/doxygen-user/images/urlInAddressbar.PNG create mode 100755 docs/doxygen-user/windows_authentication.dox diff --git a/docs/doxygen-user/images/credentialManager.PNG b/docs/doxygen-user/images/credentialManager.PNG new file mode 100755 index 0000000000000000000000000000000000000000..21acb8779b41c9b47156b8378db3dd7de434ba26 GIT binary patch literal 100169 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 h)fvpaH*4y6w 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 literal 0 HcmV?d00001 diff --git a/docs/doxygen-user/images/credentialsWithDomain.PNG b/docs/doxygen-user/images/credentialsWithDomain.PNG new file mode 100755 index 0000000000000000000000000000000000000000..4127a9497f452ab0e4aca9a81e6da5f0c2e1a249 GIT binary patch literal 34410 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 literal 0 HcmV?d00001 diff --git a/docs/doxygen-user/images/getHostname.PNG b/docs/doxygen-user/images/getHostname.PNG new file mode 100755 index 0000000000000000000000000000000000000000..9497077beb4f59839db0b47f2d676cfe58b145ad GIT binary patch literal 9504 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 H;`09jRa6ys literal 0 HcmV?d00001 diff --git a/docs/doxygen-user/images/hostname.PNG b/docs/doxygen-user/images/hostname.PNG new file mode 100755 index 0000000000000000000000000000000000000000..d97f78ae427d8f2059d1296d0b994d041c4798b4 GIT binary patch literal 38706 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 H;g#|qF^mwX literal 0 HcmV?d00001 diff --git a/docs/doxygen-user/images/toConnect.PNG b/docs/doxygen-user/images/toConnect.PNG new file mode 100755 index 0000000000000000000000000000000000000000..4bfecbc4b62cdd65babb58f8e80e1f5969940a34 GIT binary patch literal 58514 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 l=(OZ!7g!U@blNxX zxBF?`j%I%tO)yv|F(mE&ssD9y5RDc;gh+%tR|$m!aXLZJuCcvsJa;bo8TXs8CJ30* zw^vU4`y1DOt!(5c3e34_yI)_Pas^m8*Orx4cw$H~2C-J$||>s;7~f%zjiuQ7XBfHnfqnM0;_$5 zs#L0T%4xB6MB=7BS6k(#NmV33F^c1PhtI6#j1kIg%((}VDNv{@fA+wD^c+htn9T&u z9D_)lW}9hPnG`?XO&5HsTPO?ywZGheF85m zEa0IbO(%MiCww4|*3{BMfrX_fY`nyoYJsgt{_PYCFI9RaomU(^Y^C&IA}SeB*9f_h z_kvzWo>ItOYisNBvaX8!rmpzy{=ork7a=DH%cFRAC)UWz5Tik^ieClkguj2|4^E*9 z497OVpjLY*VOV*nA8F#fO}>r{lH=j!B_bn>{$UK`sb1$mX5sywZXNQN#i<(yyh5N6 zXwT9 z7_KQ~lBE*n_xJZ9+=#*h@?bFc8NQB=;lB{VMhlRFa>NeO;T<8(v^#(W6B{uesHZZ_ zG^z3M&}uklPS)YfiOfmN_4I-+uJi%H4D@PcJ&v`XAWewM$Z*%}aOK|=fQHa6DwL0$ zQ!UOF@ULip*iP@ltsbdKVQEzv85xWl@(N(04vjW-qO6xC_kVV*`T$NI9;DU0cr9+zt2@X;rJA%BE&yQ;U>#m> z{e6FLZ|~rZI3ckplV4sj8VPI=?YO1GZh{778UYY6ES+1wd|GBh4U8C&rVCRrFf^p3 zprBaf;N#=s;^N`w&nq_S>*?9r+M33@{0N&y$k1R<06}uHcz6)rM2MKN2~3+B#+rr| z2UckCHbtmZeG-az@SgTUsA4>vklZ3=V`D?~#lIOHvNq)Oqf`;@7Htgs8&)9l`+{xd zM^x9iEd8E6;Lp zn@`2mB^T*&_`r_DQ#kmGp?>jC?YDOJIM8=^2s^*;_1WY5ENiN&IH}WFi7_+NJ~9zT z(yP5q5w-qp|7m0oqev3o%|Y*_HJ9QN_ZbeR+xb8sJWoACD22#0o;)0&)M(RTW{um= zk|*Nlh%ur21hAfZJb`D=Zw}ihebo&vA6tb>!O@r9Do31$XOeYvyx8sw54;|Ve}x(L zplL&5X^}J?26iS7zc5a72r4N&@!S>sCqK+<%$`sdFc2-)j@D1 zvR=zZdgS9+V*T>vN7>)fZYebP3pi#3wShO{R5z+*RFA&~lTqM#6r-c5fIWD$eu% z($B)7I0|_sCHTcVP-tWyfmVe1mQli-3?06!a+xH>ctJ#&p&jF<( z8E5b9ZSxB6_ObB&oJNBlE0i~JIh+>ZO32z~pV0^^E|eW-``e4Vh66t$Hc1)SZDhhz zAtj`yx*tx{z&@XB5)u<52*7Ihm9{^%E-dgRNUJ3O2-p(aA`dd69ulADy`?+mwQWU4 z4)s7e=bDp*pFD&erDMcVgl8EQ>WU1Rp)3+CDCuoP4TYSgYz>94?d>Ql7;ll5-lQ`S zUaIpZ+O02Kz*}sgBkDemV1p*_@O_AUp$rRqWq$#;?D?%pfr5xt0mB}4 vqhyUa6hx)@A|jpQJTM{ktSpGM^vhqo%u9`cCVCq<*zbe161ZB@IOP8Tm(IDj literal 0 HcmV?d00001 diff --git a/docs/doxygen-user/images/urlInAddressbar.PNG b/docs/doxygen-user/images/urlInAddressbar.PNG new file mode 100755 index 0000000000000000000000000000000000000000..2577a554509c8dc80f944967af8fbad78789da8c GIT binary patch literal 80064 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�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 Wiki or join the SleuthKit User List at SourceForge. diff --git a/docs/doxygen-user/windows_authentication.dox b/docs/doxygen-user/windows_authentication.dox new file mode 100755 index 0000000000..d86d0249cd --- /dev/null +++ b/docs/doxygen-user/windows_authentication.dox @@ -0,0 +1,57 @@ +/*! \page windows_authentication Shared Drive Authentication + +

+If your shared drive is a Windows-hosted shared drive, you will likely need to provide authentication for each machine that connects to the shared drive. This guide only covers Windows-hosted shared drives. + +To authenticate with Windows and allow access to a shared drive, you will need: +- A username +- A password +- The domain name (if the machine hosting the shared drive is on a domain) +- The IP address of the machine hosting the shared drive +- The hostname of the machine hosting the shared drive + +Using Windows Explorer, in the address bar enter two slashes "\\" followed by the storage machine's IP address and press _Enter_. An example is shown below with the text "\\10.10.152.211" entered. +

+\image html urlInAddressbar.PNG +

+ +You will see a dialog similar to the following, asking for your credentials. + +

+\image html credentialsWithDomain.PNG +

+ +If you have a domain name, add it in the top box before the "\". Follow the slash with your username. If you have no domain name, just use your username with no slashes. Add your password in the next box down and place a check mark in "Remember my credentials", then click "OK". + +Next, we will do the same steps over again, using the hostname of the machine. This is necessary to authenticate with both IP address access and hostname access. If you do not know the hostname, you may find it by pinging the IP address with the "-a" flag set. It will look something like the screenshot below, where we find the hostname associated with the IP address 10.10.142.56   is   win-kmort-4863.basistech.net. + +

+\image html getHostname.PNG +

+ +In Windows Explorer, use this hostname preceded by two slashes, "\\", in the address bar as shown below and press enter. + +

+\image html hostname.PNG +

+ +You will see a screen similar to the screenshot below. Do the same steps with domain, username, and password as you did above. + +

+\image html toConnect.PNG +

+ +Do these steps for each machine that will be accessing the shared drive. +


+


+- - - - - +Note that if you are familiar with the Windows Credential Manager, you may use this tool to manage credentials. These credentials can also be managed from the command line using the "net use" command. To get to Credential Manager click on to Start, and typing "Credential Manager" and pressing enter. A screenshot of the Windows Credential Manager with some domain names intentionally blanked out is shown below. + +

+\image html credentialManager.PNG +

+ +Also note that authentication and access can be an issue when passwords change. When passwords change, for every computer using a credential that is no longer valid, you will need to redo the above steps. One indicator this is a problem is seeing the text: "The system detected a possible attempt to compromise security. Please ensure that you can contact the server that authenticated you."   Do not forget to re-authenticate with both the IP address and the hostname. +


+ +*/ From 92f997fc6511337ea2a6d64b1b1e83995ea32c1f Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Fri, 23 Oct 2015 17:08:35 -0400 Subject: [PATCH 30/41] Do linting and dead code removal for keywordsearch.Ingester --- .../autopsy/keywordsearch/Ingester.java | 156 ++---------------- 1 file changed, 15 insertions(+), 141 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Ingester.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Ingester.java index e8805b9a5d..6743878b45 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Ingester.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Ingester.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2015 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -28,24 +28,15 @@ import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; import java.util.logging.Level; -import org.apache.solr.client.solrj.SolrRequest.METHOD; import org.apache.solr.client.solrj.SolrServerException; -import org.apache.solr.client.solrj.request.AbstractUpdateRequest; import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest; -import org.apache.solr.common.SolrException; -import org.apache.solr.common.SolrException.ErrorCode; import org.apache.solr.common.util.ContentStream; import org.apache.solr.common.SolrInputDocument; import org.openide.util.Exceptions; import org.openide.util.NbBundle; -import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.ContentUtils; -import org.sleuthkit.autopsy.keywordsearch.Server.SolrServerNoPortException; import org.sleuthkit.datamodel.AbstractContent; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.Content; @@ -56,7 +47,6 @@ import org.sleuthkit.datamodel.File; import org.sleuthkit.datamodel.LayoutFile; import org.sleuthkit.datamodel.LocalFile; import org.sleuthkit.datamodel.ReadContentInputStream; -import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; /** @@ -193,7 +183,7 @@ class Ingester { @Override protected Map defaultVisit(Content cntnt) { - return new HashMap(); + return new HashMap<>(); } @Override @@ -239,14 +229,13 @@ class Ingester { } private Map getCommonFields(AbstractFile af) { - Map params = new HashMap(); + Map params = new HashMap<>(); params.put(Server.Schema.ID.toString(), Long.toString(af.getId())); - long dataSourceId = -1; try { - dataSourceId = af.getDataSource().getId(); + long dataSourceId = af.getDataSource().getId(); params.put(Server.Schema.IMAGE_ID.toString(), Long.toString(dataSourceId)); } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Could not get data source id to properly index the file " + af.getId()); //NON-NLS + logger.log(Level.SEVERE, "Could not get data source id to properly index the file {0}", af.getId()); //NON-NLS params.put(Server.Schema.IMAGE_ID.toString(), Long.toString(-1)); } @@ -291,7 +280,7 @@ class Ingester { //using size here, but we are no longer ingesting entire files //size is normally a chunk size, up to 1MB if (size > 0) { - + // TODO (RC): Use try with resources, adjust exception messages InputStream is = null; int read = 0; try { @@ -302,10 +291,12 @@ class Ingester { NbBundle.getMessage(this.getClass(), "Ingester.ingest.exception.cantReadStream.msg", cs.getName())); } finally { - try { - is.close(); - } catch (IOException ex) { - logger.log(Level.WARNING, "Could not close input stream after reading content, " + cs.getName(), ex); //NON-NLS + if (null != is) { + try { + is.close(); + } catch (IOException ex) { + logger.log(Level.WARNING, "Could not close input stream after reading content, " + cs.getName(), ex); //NON-NLS + } } } @@ -336,78 +327,6 @@ class Ingester { } - /** - * Delegate method actually performing the indexing work for objects - * implementing ContentStream - * - * @param cs ContentStream to ingest - * @param fields content specific fields - * @param size size of the content - used to determine the Solr timeout, - * not used to populate meta-data - * - * @throws IngesterException if there was an error processing a specific - * content, but the Solr server is probably fine. - */ - private void ingestExtract(ContentStream cs, Map fields, final long size) throws IngesterException { - final ContentStreamUpdateRequest up = new ContentStreamUpdateRequest("/update/extract"); //NON-NLS - up.addContentStream(cs); - setFields(up, fields); - up.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true); - - final String contentType = cs.getContentType(); - if (contentType != null && !contentType.trim().equals("")) { - up.setParam("stream.contentType", contentType); //NON-NLS - } - - //logger.log(Level.INFO, "Ingesting " + fields.get("file_name")); - up.setParam("commit", "false"); //NON-NLS - - final Future f = upRequestExecutor.submit(new UpRequestTask(up)); - - try { - f.get(getTimeout(size), TimeUnit.SECONDS); - } catch (TimeoutException te) { - logger.log(Level.WARNING, "Solr timeout encountered, trying to restart Solr"); //NON-NLS - //restart may be needed to recover from some error conditions - hardSolrRestart(); - throw new IngesterException( - NbBundle.getMessage(this.getClass(), "Ingester.ingestExtract.exception.solrTimeout.msg", - fields.get("id"), fields.get("file_name"))); //NON-NLS - } catch (Exception e) { - throw new IngesterException( - NbBundle.getMessage(this.getClass(), "Ingester.ingestExtract.exception.probPostToSolr.msg", - fields.get("id"), fields.get("file_name")), e); //NON-NLS - } - uncommitedIngests = true; - } - - /** - * attempt to restart Solr and recover from its internal error - */ - private void hardSolrRestart() { - try { - solrServer.closeCore(); - } catch (KeywordSearchModuleException ex) { - logger.log(Level.WARNING, "Cannot close core", ex); //NON-NLS - } - - solrServer.stop(); - - try { - solrServer.start(); - } catch (KeywordSearchModuleException ex) { - logger.log(Level.WARNING, "Cannot start", ex); //NON-NLS - } catch (SolrServerNoPortException ex) { - logger.log(Level.WARNING, "Cannot start server with this port", ex); //NON-NLS - } - - try { - solrServer.openCore(); - } catch (KeywordSearchModuleException ex) { - logger.log(Level.WARNING, "Cannot open core", ex); //NON-NLS - } - } - /** * return timeout that should be used to index the content * @@ -431,51 +350,6 @@ class Ingester { } - private class UpRequestTask implements Runnable { - - ContentStreamUpdateRequest up; - - UpRequestTask(ContentStreamUpdateRequest up) { - this.up = up; - } - - @Override - public void run() { - try { - up.setMethod(METHOD.POST); - solrServer.request(up); - } catch (NoOpenCoreException ex) { - throw new RuntimeException( - NbBundle.getMessage(this.getClass(), "Ingester.UpReqestTask.run.exception.sorlNotAvail.msg"), ex); - } catch (IllegalStateException ex) { - // problems with content - throw new RuntimeException( - NbBundle.getMessage(this.getClass(), "Ingester.UpRequestTask.run.exception.probReadFile.msg"), ex); - } catch (SolrServerException ex) { - // If there's a problem talking to Solr, something is fundamentally - // wrong with ingest - throw new RuntimeException( - NbBundle.getMessage(this.getClass(), "Ingester.UpRequestTask.run.exception.solrProb.msg"), ex); - } catch (SolrException ex) { - // Tika problems result in an unchecked SolrException - ErrorCode ec = ErrorCode.getErrorCode(ex.code()); - - // When Tika has problems with a document, it throws a server error - // but it's okay to continue with other documents - if (ec.equals(ErrorCode.SERVER_ERROR)) { - throw new RuntimeException(NbBundle.getMessage(this.getClass(), - "Ingester.UpRequestTask.run.exception.probPostToSolr.msg", - ec), - ex); - } else { - // shouldn't get any other error codes - throw ex; - } - } - - } - } - /** * Tells Solr to commit (necessary before ingested files will appear in * searches) @@ -484,9 +358,7 @@ class Ingester { try { solrServer.commit(); uncommitedIngests = false; - } catch (NoOpenCoreException ex) { - logger.log(Level.WARNING, "Error commiting index", ex); //NON-NLS - } catch (SolrServerException ex) { + } catch (NoOpenCoreException | SolrServerException ex) { logger.log(Level.WARNING, "Error commiting index", ex); //NON-NLS } } @@ -595,6 +467,8 @@ class Ingester { */ static class IngesterException extends Exception { + private static final long serialVersionUID = 1L; + IngesterException(String message, Throwable ex) { super(message, ex); } From 965de0ae1962d2bb6bd62c7add91b13ca3d1e29a Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Fri, 23 Oct 2015 17:39:53 -0400 Subject: [PATCH 31/41] Additional dead code removal for keywordsearch.Ingester --- .../autopsy/keywordsearch/Ingester.java | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Ingester.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Ingester.java index 6743878b45..5ce5869d6b 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Ingester.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Ingester.java @@ -25,12 +25,8 @@ import java.io.Reader; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.logging.Level; import org.apache.solr.client.solrj.SolrServerException; -import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest; import org.apache.solr.common.util.ContentStream; import org.apache.solr.common.SolrInputDocument; import org.openide.util.Exceptions; @@ -56,7 +52,6 @@ class Ingester { private static final Logger logger = Logger.getLogger(Ingester.class.getName()); private volatile boolean uncommitedIngests = false; - private final ExecutorService upRequestExecutor = Executors.newSingleThreadExecutor(); private final Server solrServer = KeywordSearch.getServer(); private final GetContentFieldsV getContentFieldsV = new GetContentFieldsV(); private static Ingester instance; @@ -363,18 +358,6 @@ class Ingester { } } - /** - * Helper to set document fields - * - * @param up request with document - * @param fields map of field-names->values - */ - private static void setFields(ContentStreamUpdateRequest up, Map fields) { - for (Entry field : fields.entrySet()) { - up.setParam("literal." + field.getKey(), field.getValue()); //NON-NLS - } - } - /** * ContentStream to read() the data from a FsContent object */ From b8e5093be2776f22bc6a2535ddf8dbb674313313 Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Sun, 25 Oct 2015 21:01:24 -0400 Subject: [PATCH 32/41] Made username / pw optional in options panel for ActiveMQ --- .../corecomponents/MultiUserSettingsPanel.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java index c484771edf..4358a00e01 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java @@ -640,16 +640,22 @@ public final class MultiUserSettingsPanel extends javax.swing.JPanel { } /** - * Tests whether or not values have been entered in all of the message - * service settings text fields. + * Tests whether or not values have been entered in all of the + * required message service settings text fields. * * @return True or false. */ private boolean messageServiceFieldsArePopulated() { - return !tbMsgHostname.getText().trim().isEmpty() - && !tbMsgPort.getText().trim().isEmpty() - && !tbMsgUsername.getText().trim().isEmpty() - && tbMsgPassword.getPassword().length != 0; + + if ((tbMsgHostname.getText().trim().isEmpty()) || + (tbMsgPort.getText().trim().isEmpty())) { + return false; + } + + // user name and pw are optional, but make sure they are both set or both empty + boolean isUserSet = (tbMsgUsername.getText().trim().isEmpty() == false); + boolean isPwSet = (tbMsgPassword.getPassword().length != 0); + return (isUserSet == isPwSet); } void store() { From bd6d57ab5a88c0ac586ac2ddef3f7161c98ab4df Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Sun, 25 Oct 2015 21:16:23 -0400 Subject: [PATCH 33/41] Made tooltips reflect optional status --- .../org/sleuthkit/autopsy/corecomponents/Bundle.properties | 4 ++-- .../autopsy/corecomponents/MultiUserSettingsPanel.java | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties index 6daf3f2a79..7364d72922 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties @@ -186,9 +186,9 @@ MultiUserSettingsPanel.bnTestMessageService.text=Test MultiUserSettingsPanel.lbMessageServiceSettings.text=ActiveMQ Message Service Settings MultiUserSettingsPanel.tbMsgPort.toolTipText=Port Number MultiUserSettingsPanel.tbMsgPort.text= -MultiUserSettingsPanel.tbMsgUsername.toolTipText=User Name +MultiUserSettingsPanel.tbMsgUsername.toolTipText=User Name (optional) MultiUserSettingsPanel.tbMsgUsername.text= -MultiUserSettingsPanel.tbMsgPassword.toolTipText=Password +MultiUserSettingsPanel.tbMsgPassword.toolTipText=Password (optional) MultiUserSettingsPanel.tbMsgPassword.text= MultiUserSettingsPanel.tbMsgHostname.toolTipText=Hostname or IP Address MultiUserSettingsPanel.tbMsgHostname.text= diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java index 4358a00e01..ad83b4340f 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java @@ -36,6 +36,8 @@ public final class MultiUserSettingsPanel extends javax.swing.JPanel { private static final String PORT_PROMPT = NbBundle.getMessage(MultiUserSettingsPanel.class, "MultiUserSettingsPanel.tbDbPort.toolTipText"); private static final String USER_NAME_PROMPT = NbBundle.getMessage(MultiUserSettingsPanel.class, "MultiUserSettingsPanel.tbDbUsername.toolTipText"); private static final String PASSWORD_PROMPT = NbBundle.getMessage(MultiUserSettingsPanel.class, "MultiUserSettingsPanel.tbDbPassword.toolTipText"); + private static final String USER_NAME_PROMPT_OPT = NbBundle.getMessage(MultiUserSettingsPanel.class, "MultiUserSettingsPanel.tbMsgUsername.toolTipText"); + private static final String PASSWORD_PROMPT_OPT = NbBundle.getMessage(MultiUserSettingsPanel.class, "MultiUserSettingsPanel.tbMsgPassword.toolTipText"); private static final String INCOMPLETE_SETTINGS_MSG = NbBundle.getMessage(MultiUserSettingsPanel.class, "MultiUserSettingsPanel.validationErrMsg.incomplete"); private static final String INVALID_DB_PORT_MSG = NbBundle.getMessage(MultiUserSettingsPanel.class, "MultiUserSettingsPanel.validationErrMsg.invalidDatabasePort"); private static final String INVALID_MESSAGE_SERVICE_PORT_MSG = NbBundle.getMessage(MultiUserSettingsPanel.class, "MultiUserSettingsPanel.validationErrMsg.invalidMessageServicePort"); @@ -70,8 +72,8 @@ public final class MultiUserSettingsPanel extends javax.swing.JPanel { textPrompts.add(new TextPrompt(PASSWORD_PROMPT, tbDbPassword)); textPrompts.add(new TextPrompt(HOST_NAME_OR_IP_PROMPT, tbMsgHostname)); textPrompts.add(new TextPrompt(PORT_PROMPT, tbMsgPort)); - textPrompts.add(new TextPrompt(USER_NAME_PROMPT, tbMsgUsername)); - textPrompts.add(new TextPrompt(PASSWORD_PROMPT, tbMsgPassword)); + textPrompts.add(new TextPrompt(USER_NAME_PROMPT_OPT, tbMsgUsername)); + textPrompts.add(new TextPrompt(PASSWORD_PROMPT_OPT, tbMsgPassword)); textPrompts.add(new TextPrompt(HOST_NAME_OR_IP_PROMPT, tbSolrHostname)); textPrompts.add(new TextPrompt(PORT_PROMPT, tbSolrPort)); configureTextPrompts(textPrompts); From 5a262bdf2b145fe2a4ead30c3a4f65c4c06a76e8 Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Sun, 25 Oct 2015 21:28:41 -0400 Subject: [PATCH 34/41] Moved case type radio buttons above informational label about location. Added label to choice. --- .../autopsy/casemodule/Bundle.properties | 1 + .../autopsy/casemodule/Bundle_ja.properties | 1 + .../casemodule/NewCaseVisualPanel1.form | 48 ++++++++++++------- .../casemodule/NewCaseVisualPanel1.java | 42 +++++++++------- 4 files changed, 57 insertions(+), 35 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index 5575b3e38f..ea26aa612d 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -239,6 +239,7 @@ MissingImageDialog.lbWarning.toolTipText= NewCaseVisualPanel1.caseParentDirWarningLabel.text= NewCaseVisualPanel1.multiUserCaseRadioButton.text=Multi-user NewCaseVisualPanel1.singleUserCaseRadioButton.text=Single-user +NewCaseVisualPanel1.caseTypeLabel.text=Case Type: Case.deleteReports.deleteFromDiskException.log.msg=Unable to delete the report from the disk. Case.deleteReports.deleteFromDiskException.msg=Unable to delete the report {0} from the disk.\nYou may manually delete it from {1} CasePropertiesForm.lbDbType.text=Case Type: diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties index 5dff497d16..4fd28db906 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties @@ -218,3 +218,4 @@ AddImageWizardIngestConfigPanel.CANCEL_BUTTON.text=\u30ad\u30e3\u30f3\u30bb\u30e ImageFilePanel.errorLabel.text=\u30a8\u30e9\u30fc\u30e9\u30d9\u30eb LocalFilesPanel.errorLabel.text=\u30a8\u30e9\u30fc\u30e9\u30d9\u30eb NewCaseVisualPanel1.caseParentDirWarningLabel.text=\u30a8\u30e9\u30fc\u30e9\u30d9\u30eb +NewCaseVisualPanel1.caseTypeLabel.text=\u30d9\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\uff1a diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form index 697ac53348..76bdf8ace0 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form @@ -33,16 +33,27 @@ - - - - - + + + + + + + + + + + + + + + + @@ -51,14 +62,7 @@ - - - - - - - - + @@ -81,18 +85,19 @@ - - - - + + + + + - + @@ -197,5 +202,12 @@ + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java index 9d09d360fd..5694ba5c70 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java @@ -213,6 +213,7 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { singleUserCaseRadioButton = new javax.swing.JRadioButton(); multiUserCaseRadioButton = new javax.swing.JRadioButton(); caseParentDirWarningLabel = new javax.swing.JLabel(); + caseTypeLabel = new javax.swing.JLabel(); jLabel1.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(NewCaseVisualPanel1.class, "NewCaseVisualPanel1.jLabel1.text_1")); // NOI18N @@ -256,6 +257,8 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { caseParentDirWarningLabel.setForeground(new java.awt.Color(255, 0, 0)); org.openide.awt.Mnemonics.setLocalizedText(caseParentDirWarningLabel, org.openide.util.NbBundle.getMessage(NewCaseVisualPanel1.class, "NewCaseVisualPanel1.caseParentDirWarningLabel.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(caseTypeLabel, org.openide.util.NbBundle.getMessage(NewCaseVisualPanel1.class, "NewCaseVisualPanel1.caseTypeLabel.text")); // NOI18N + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -272,24 +275,27 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(jLabel1) .addGap(0, 227, Short.MAX_VALUE)) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() - .addComponent(caseDirLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(caseParentDirTextField)) .addGroup(layout.createSequentialGroup() .addComponent(caseNameLabel) .addGap(26, 26, 26) - .addComponent(caseNameTextField))) + .addComponent(caseNameTextField)) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(caseDirLabel) + .addComponent(caseTypeLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(singleUserCaseRadioButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(multiUserCaseRadioButton) + .addGap(0, 0, Short.MAX_VALUE)) + .addComponent(caseParentDirTextField)))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(caseDirBrowseButton))) .addContainerGap()) .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(singleUserCaseRadioButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(multiUserCaseRadioButton)) - .addComponent(caseParentDirWarningLabel)) + .addComponent(caseParentDirWarningLabel) .addGap(0, 0, Short.MAX_VALUE)))) ); layout.setVerticalGroup( @@ -306,17 +312,18 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { .addComponent(caseDirLabel) .addComponent(caseParentDirTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(caseDirBrowseButton)) - .addGap(18, 18, 18) - .addComponent(jLabel2) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(caseDirTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(singleUserCaseRadioButton) - .addComponent(multiUserCaseRadioButton)) + .addComponent(multiUserCaseRadioButton) + .addComponent(caseTypeLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(caseDirTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(27, 27, 27) .addComponent(caseParentDirWarningLabel) - .addContainerGap(35, Short.MAX_VALUE)) + .addContainerGap(21, Short.MAX_VALUE)) ); }// //GEN-END:initComponents @@ -358,6 +365,7 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { private javax.swing.JTextField caseParentDirTextField; private javax.swing.JLabel caseParentDirWarningLabel; private javax.swing.ButtonGroup caseTypeButtonGroup; + private javax.swing.JLabel caseTypeLabel; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JRadioButton multiUserCaseRadioButton; From baeef2706615cce38aeeacdd9fd4e8aeee9f3228 Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Sun, 25 Oct 2015 21:31:45 -0400 Subject: [PATCH 35/41] Updated version to 4.0.0 --- nbproject/project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nbproject/project.properties b/nbproject/project.properties index f80c2ec8a8..d288f226cc 100644 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -4,7 +4,7 @@ app.title=Autopsy ### lowercase version of above app.name=${branding.token} ### if left unset, version will default to today's date -app.version=3.1.3 +app.version=4.0.0 ### Build type isn't used at this point, but it may be useful ### Must be one of: DEVELOPMENT, RELEASE #build.type=RELEASE From 496166846e4046939dc97a8ce22bbb80ffaa389d Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Mon, 26 Oct 2015 09:24:53 -0400 Subject: [PATCH 36/41] remove image --- docs/doxygen-user/images/case-newcase.png | Bin 30548 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 docs/doxygen-user/images/case-newcase.png diff --git a/docs/doxygen-user/images/case-newcase.png b/docs/doxygen-user/images/case-newcase.png deleted file mode 100755 index 40209b9c845049d025478fca273212c391a9c69d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30548 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 Date: Mon, 26 Oct 2015 09:26:46 -0400 Subject: [PATCH 37/41] add image --- docs/doxygen-user/images/case-newcase.PNG | Bin 0 -> 28801 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 docs/doxygen-user/images/case-newcase.PNG diff --git a/docs/doxygen-user/images/case-newcase.PNG b/docs/doxygen-user/images/case-newcase.PNG new file mode 100755 index 0000000000000000000000000000000000000000..3bb7122c5d10e70603f998ba29e03566abe888a6 GIT binary patch literal 28801 zcmb@u1yqz@`!%ehqEZ6VGDznDk`e<*!w?eEpmc-M3Y&P zhOYNUe4gk3f4?`r^{tP!hH+-yan8A~YhQcs>tOIJB^jJYHk`PzJnl@8T!k3ROT#w`is&b^{>TQx+kN5cVnzUWZ982*g2qnq8`Bu}tFB6*4 zITUuahCjz!E}iKRBuyx(ni&Ty!PEBkc2fFqB@9}!ws7)Czc}eB%h3`6Y+!z^elgPv zBD5)5;~nRs82D^|vvB!D*aNy%@YWUFz~WZylXftz5<143J6&y}x%?UZ>u3|nUFBMm zsw^<-Ahl%F%^PP8ZW4!ux_td~dn+{FWnN>rMF6D#O2L&$EN1x3-Taw*Qq8)IH3MkdWJkj`OIDickF3Q!;rA~&ibw4Mv z6t`q!UIYc&~rLsM4b@bn} z_cFe!mpPi-#ZWlgK5o4f@_P5{r>@6NW7XA9UCf=vgF*coQ1iwZyupq#Ja^YBrZCbO zd1vaSwME5F@eWnv#u?^zqwQ5%4a7e0(;Lx%4`N?hUw^CWNMw!ljPh9VJYS^hoLO4R z#_mvz{>;gZqE^I9cHIM=Jm}}W$CFW+Jm-~9T-UuGh^?*jeNNqau;DFpQxnl}gXZm~ z98=kLW@?N)<@+N9T-&**L_LN3_UYK`%TDJUxpEn?9U(nD(SO$_dpZ=gJ(lFLB)EQ1 z9Pc64U|(4E+g_1f;Aw^wNdGZXHIhBZ1R8>xWQ!1~pXiBKXG|E#!(s#X{O0(;UT}*P zGT=4beGw^wo+;ni)ILmW>TRyDpL9Lsxcd2Nd45gzGVPLRzQf7lM-5)d@!{_f`^cHg zEfwyI4YxU-mHsSTt4xux@AVchlf_dk$hLN_{&7tQUPqU|8ydWhXFqjdUx7Zb9DQAV(IFjf=>zMWox1s>5)``Vu?#seoKU zTy#r4{St$g(vH;+^!96cdm9iLK2&y44t~4JFRVd?GAgvYOJ7p@h>h|bYN^VUo0JJk zmS4|U%S{}E4sE%cq#sN~194;0Bhcv|wLzbt%Hi&Rq$l2BABa-op+2h39?Zj{(a{kV zNEZ(kuKyOJs}-Zy@I;>&ST=*>g_*2STa>{5!9JcaI+Sw0VOKz*W~TNmp5kcEVX;}) zUifVu@O!i6praM|V3SJ`VBcgoqIBhe%rQ@Gdd1LZ4t+&ULPbUTLQvB1ty6F4V}XH;&dbyx)baqe5lS~yrvx}Ap0YNdRa zAsxHE&P4s^(94Ec?B61kCr~+gro2y?T;X&FgBEHE8>T1*NcjNF?MIzVvA-T$Q)*nx zJZ&XrpvrCu9%_zmdAn2@SKdNJ5*i~<{F*UO-2x7PBz~>Zb!Xo1=c`lV?P`X9ro@Z5?hnoKbIf||4}IY0fB>tMQnJx{ zX)C`{&**kvM7v1_wbQn7^GfeDaPy;I2(mDAM`?>ok3H$;r#E?fxE7=@51dAMVh#WN zDyAbuhbMAGB1`dkk){~`Q+U&;aj(Y!{i-&5pdNGGXNRI3QP~@!xx{*)+ivNV3w=zaUXaab)E%k(ZJSH;L>*b(_y zpiuiTnMqDqd?A9?Fh`DyMJ)#1Ou>czICE?@)S$x)quB4dDE12r6(Qs3?e1ES!LRYd z?qlXMONh#7@{|6kNZ#R@ z4bf*8S{$(`;eBqZlW=0>a%usCS>lTr=$DtCeDW%m9xp4WXXa&n0uM#?f)#d!#2(!* zX%X2a8n{3gAG~QkFW`97{7-L!{rTQ>>`%YXotM7XC09db90px}{J^Jm_AL++JzjGqf zJZ5FCR@$geUWnl0;4CVi#~oJ?8eD9j>?8DAKy92>Q-(TgA4MD1>MVl%DBe^L>SYAc zA;tnglu-rx=nlQm%L6cdO-u4pyrz=9F{o}bF6!lTXh0tUS9xyN=M<>)G7Xo5d3UXW z5`ox5#YZ_j8nHv9s(6b0Ih9toXRCA0rZQI{&-9@}MgcAhx4u+zILmka^!56g#rxGp zPT=ZE&J%F7Lx$83Z$~I`TomiXtrm=9PMxL`dXAanS^LWcLMqQ+gjDCtj3URsfftHV zv~)#{%I#cj=gn0O7UFdJ9)(EL+xrdqahf%*HZG#cLw%sK}YyqaG@OO7m-mAqwrVyjblal(%N zNC(O|$x#w~peB3V`_++bPqQiYoRXc|d$e~AQW87Y!L{U-0R01w@iDujjEi<5*xmFd zOG@yUO{o!ARTc*MQu|WO{j>*zA8){swmv~|6%-{x+XO6pw9EW0CyYNCZdAS+5znwz z&QPni6r;v?O}yB^UsCO7oSA9H*$YkJ9HW@G7DueFO0H_R3q!X(duJMy(#{suR*Qw5 zw;_4Wr-`IG@du_6+L6)%5sU< z7FDy=9MnKyXTV@TcmBf(tMb{fsOQS=n=E~GZjADrw&nm(dvKM`peG8>kn>Pz-shL` z6tiWAG(yl-M_H1HVa;>-`Nb<)Zlx7>Jf#LY&|sIb+`?_e=W%QK&`)cSiJ?q7eGLWs zZ#ifV*z>yOxZ!Cn;O)fZ1sfxV`NO7v+)ZWzF)6uIcT|pb!Rpxedv#zJ55ecJxqR`*R+Bd zUYWhBb{F-YE~N6DmcwgW%$AvVAF6jnppS)=b*_HKAiP%PC^FZ2cRV;$BM!d@bwhxE z#b+|C8-u@w5)b0)NL(`;W7Y}c>Yy#7jS0-nU<7mF`UW^Gt;BtH!+XQOwp)u{K3Is=nuZ-ffwl%3;(^eDa7Bwz0|5he_^?2C)0t zlJ2Jwtb~~i_S0uMu#;6oyHEy7_Dw%{xMGJqRTOCDE_i0248uUP*)m7vKWAtYRN3p% zm|OhahPpyVl4o|L^*E92zfnFqPCEeD9#6*#&c)8;9MX}UP7cvPubEI!JdZ@NK0KM| z+YSb4w!zu-)k(1T<(~eIz%t{Gfa$V_Qr&7(-i*g7^HI824~LTIazbAEUe{WlFzl3h zNbOcnw)R`ahUH$9{VL{7u3npu|>+t_t5L0tM z8YPp+Th=n=x@W79zYDR1MB2T`6w;wS`l$B=AQce~KXRZJ<8rvuQ&^BG*S0}hH>XcB zBu|F*kCuo93nW~YY(9D^^{_`1WJtvmOO?~VJ|^jcV~u04-MWJ@)_pZ_Rd?Bu!z%jw zFx~6d){!Uhx_n8&5aS%^MJM_Dzejsg_je zIr-(I{?Mw2MT-RdnX)o~56LyvsZk2H!JqyyRtAXSr)jB>e0&&Z(1Nm_@wxj3xTbjr zhePCIM6=mwJH_BIgwWu3p!aFHX8QTM+T1y!WlBwq9JZYBXLz0t3Wv|`V3uyS~`pA6FtJ;izP zqY@#*Z+|T|WpLjp#Uchxw&9`vtofQ#9-SGG4hn~BaM}UDscR6Rz;Q$R%GYAk{ak|B z0pxdm=OtBec{x1}R6mWa;1x&H`PlLCF@?eJc|`qk%8}PP#*x?g*E12Xu>sNdV;myx zV;rLHV-o3t`$*-qx)n9^;xly8#(*fsaKJ!ngypcg()@YSaLdp>H629~XF3?(Q%<8J zCS-wQn`v4ZS@c$Sf~GpO$e4;Vpyy@x!>;q+>)szWkL*sn zpe1Lhhm1`t99O+qSHA~VeqI$NoKMasT(0#eG!IAoJZ+Sr`D8lm_Ye{-_!ytZGx6R- z2FP2oOJibv$MBS@GMZ@ScM1*oMb!P1Il({Tse)89I`Md2=KK*O9_$y1vOMe=Vg|`& z{_yXEi!~2Uk#v+4?qVzHqlN0ODCGM%!AD1WX}z@k%k?NoZQ^+q2eoUU11u0aq^tj2 zj*s4CQvv=pCUepDHf8*N*B?Pg6Md`4Qj00KEHkzviov3iIrl)g-WGZ^8oe0J{W-4y z?a>b_gF50_xQ1CA;fV3S`fPSDLntjT-v{LQ-sd*>0CmS6?sd3C%*WvTN!7%%3B5Nx zxIdTBWOA|9>*YS_-*P*OIaHnCn&W9Pp38#kub~stK;7* zy&{bV<#_hJDd!G-Sq$sFAr^m&uqk1=fDMT*AW`m)N|c+INTW^?yiXEb^Y%*hun+ z*eMKjXxZPKmJE*|2A+>q-Nt#ZZWGxUwc31%E{Miv3(!oqn24XIcbQ%rO?At;FRsj$ z*}lfW(eDOlBJ+(N-IIvCpT-~&8IeEodI{GcX2u6PL19VO#2-5}ts6bJZUy&@f!_bA zcf&jBB^(}7)?;dhwMIzeDn z&bt}cxpW5op+o)1wBkSzP^W+taQc)ZrBU6^tfQ{pqPI>ipgMP}?vymU+3Dxm)d5t~ zwtj2cx}@$LStxRa64kHWPG|RA=)oF)cC`~NcBeb%Y9dBq1XMNifWLGxvMC#|ai9SmOkDK(7;BZRBXD^yo2iXJ5=F_`RL zlie*x-onR|2^X88-scT1XF?oqtyrR0bpzdxagrZJYsyHRn-1yLFGPIa!R?Wj&)BRl9sG`UXS6bupZq+J6jcF zok`$ErpyNN9zM9LG9S^E$*QjV1DKZTxU8&U+q*ra`P@ZM!u-2Q`VGywvZKp5kDWS< z;Y*M07a!N=gif~`ny$RKapt_wGS2Kp^#=S-wV)a@H_$S9_df;M=K`6vzEiS0@X8Zy zKhSb)9y!nZ&Z+IVEIcq^9$gs_#Qzu!}{=oYYK&*%@hF@hRs*CrMxV<^~ugbI4n=6a-4AsOpSn zP4A-&#!ebBf#vld!^IC5oGQzmY(s2bK7pqx%TXpreSe~FW~oA_tEz@k_++;P9u;l& zYdtH?`=slP1cBajz3L9-Y+5x13gNQ%?`F{t-DD+hYe~RM+xt?+yk#$vKF#YZ3&j#vFS9!GoX&Q+}Rw zt$OW!t7_45JnR%Hb6A#7U6oq(M%5o(UXK6t>>l0uu#0zfn3M44m^!T0IP3iaJ^}vI z1P`-YkngaG&qMMsf3|Spq)uVaZ^Qa%hFK)lN>8+qRLGo^{3LZrR9L7smlZJ_KFUaI zhffyQyLJmfm*w$L@pcXm*OTFQDxdDh2wHyo1H4T^+ZG9{po|pexYg=B`c-Rn<(s7}a4;4eh3^^PAbb8JkJSN80m0C+EtBtunUAcL@zsZ#SLKz^v^jyoYg9rnT`4G;P8<~cj)~# zL3Y>Z?%Ew_=sI132$V!u=Sj3(0eyxH3YC_<=$$a^Tc9u?%bTo6o@vO)vHdY3YNUT@ z`zuwniHbmzTtc*v10WnnGhJivz!sT5V;Bcur%IW;Q-r?AqS680n>>dm1hBY)2umXt6Ldf?DR6L76my{M70$o4h|2+u45-Co{t;` z^t(j#e^wbuwr2GLDgUUt_oRB%xq%PgZAqb}t*4g`V*d+A*sfEL$NS8ttSFSglUlkZg=> z6fn~2Mp%`O8k^Zd85xTw=-tNW@&WHS+8|bJIU@Lk-aA zIggOFZ;5nSX82^<6(%!a8e>O%vKBQU6Y`ipC$9LbCUaOJg|BU;AC(56St~-o829O^ zif5;8k`mHb0Y@Ls0%4xxv>NS{1O%LeMO_HX@oGEc^5=Bx0t2-rK6ZcRdbZ4*gQ&vv zoKP_M5ylqgLr6pbyn0Zv+UI^u4^OZCr=A6r!Q}UUCMEwN2X$( z=d-aFVEcxH5IL*8L&LUf_x3GBgDmD*KF{*sniYEsi>g2voEg1dAAz zVfk&9jMo?K7?hyQ{r_~y7fnUF!uAoo_Pc^$;F@-XZ0N5#Oul}JEhbR)%6D;N&$ucX z$GBe9W_BLZk5-72@Gv5o2>O401`LB-tat)^m6`{Hu)Reb3B2V&gcgguFoUaw%7(@C z4`!=Zi2X_?GhiZlcOOD@E4b!*Vqa(d+(7U18)nC^n6-`)&!ZILbvDpzLh4lS2 z_%$QmZnXZvfs#p>d|s&F@1w#;eAZjv_C|Ux&D0uzg&NlGVuZj=oPrVP3D2z1O#<$n zAN2ew6d4vB*S8O$KZ$g|&l}ht+&(~~N=F}UsVYa$flhq8#JA2%m5^Cp_%?-_CUcEl z0rfn(wNo-p5+w&2eqP#+_d>(E+G0F0L zaB(O2O;S)$Zp*t2MuO$Ue)kMUN~1mTNaiELSUxdszr%J_c4w4%FGuBWTQ)(TH8DPf z)nWYLIr=evKfyl|%BlJU8H_#8yB{q2BTQ_e@m%OWwkbmBvKL%{eNQ!*y^TdRz>Vg> z28J}1^K#i;&C+h3qoGNr_VEK<)nV6m3J~b9rRX&dy!}ECb+F2z!ciF?Mrc8w@Y67a z)e@X6l*!RYE60X2o6SlVFvs&zBT&%4|8d`1trl!_Tuw)Bn$bDiQV)v9`~Nex>{W zM>Lm`XPD3U-UIT$;s1~abZE2;DQu{kEs5jGW#gP)w=zga{w9M81~H1TAkic`kBK$F zu`|@f#X}1#bmZU}Io(iqM!K5?kVBFEuB1b|1!qpSKU4JYrW|sS3yGc?%S@E2yIG7C z(KSm$RGALG=3Y8+ovTv3?z&V_K4)InVjyUC`efU7Y^4u~(28&s$_u z5Q^KC^I8&^;sQ4_4%c=EWB#I%W`a1Apg(wDd&}AaesQH8h_lRvai;9zas`-Cc5T z7dY>#;1x3sJ=^1HEV~01h_aNcrvz}wqJR;?WGRKxuHp>AC?dV==WKarxcw?!@m4`} zyrf^Uu3YO-yy${u_a_DD5I%sr;!uB(#nwg1<9Uneq5-hwnxfyqP1Z783 z2KU;qm+>Y@w&cIc3>i<c`rx4S`kMD`z~VuB!8A?HB%@$~Fu;5&A_m;`~hi zF=jE-JX zsLvI#llxj2cMvRhJ|nyFpv7!^y$%ZHOGrcZdknxDlfGaM;Z)88>3xqOWA)u#`u8XS zuk#o20?q-5F=1OyjQY;XM6y|33YY?A&1!M`D1LGKn^>>{xQG~5E)?~K@r#i>DGb>#*U^`a z`RcO7jwU&hyw|e-w@&`u=WP{%O18Q8>%|6!s$QV`=YMyBPcmeVwbi zjFU?h4MoZh+__P7Ds5U^8d?d>Sw5G6zt9@DauUfJqyhi}@P1+I7rbOCR-JiUSv5kN-fp+F^Ui?^c(!K5H#Ac5 zH>NZ=Bo=pQ4X#R(+o#*e2g8MvyZX;7@$48RCYDu|PJUW;c{o;Kz1EP1AeusGYt|TA zmd!>G)7K3@e$G2=diaEBivU+FnP4|KoH!0K&`zVzZGdDA(s5oLeiIZKtPvA8+bNq# zATn{dFzEOJJ;!DaEW?lLmy+C%jj;E^nkTO_3`iEfRw~jerXg8WHy;6iI``AusbD_p zQt3ua)p^EHx~;d))34A?@tby%;MHyE%E-gP1qc^!mJ}R8MBlI!s{GY{#Xgyv=U!PgMX3Nyn zHT_iNblRmzUQumQHw;+brXF`)Xz_v)6kXRtl2p;@6IpOS*uv~r%paMc7=+nDhi$fu zk)mrgxjvcuYBRjS#rI(Wa+U+m7ekN#5K^oc_)ojcv=**+Uie7;XHjBP;%t`HEfYF{ zZ+YXfzRV)&1yVG~04Nw-rD~=a0005=W4N%gd72F;>A7=+n$=nplZMn#QCHsFDNebeTE0nDGu+qL8 zJpA8^AUPD=+g$v=+#j-r>;e>+?O(Yhvi2`wr4>Ht`Dz65LO8j}S6eI5#hX>DaCFM+obAe`Sh zC;`s9h`1Jf?TJVv()W6E7Z>`~*$od;5LdRhFZtIzN1~Q%t`Z3ul~Os^6hFz=F+#c^ z1RrkFN>$=r-tfMxWCf{&vJ^YIb|&TlB#`!|&{#c?z{9@{eE(Vk?{7Jw#)e4V#fA`_ zWB`-8E_|vI09-sEg|W!{Uss{(A%rZBA&Q#jEvg{skLomXyswGwdk@pFu#~tz4o2{s z|7`rRu@HI8`GScmFXg_(z!!g5@!Nk`z;v0#KL*v{eu%kDD(&$`V?e(GRWaqQn*2Zr zQ^HqN@G8YyH6`UpML}dI84(QN<~xjOud$L~LG_?NgMR@;iUx4TvjRy`NgD!!dLH&N zYH0+jcA%WtqDLD^s~o0>lH;}Lg@^a8B8ciATS7ITr;F)U(+3w-hG0SVS2^^8IE@#= z6nT@a`#hgmX@FC?uL@ICxV*cGnS<8^1K7i%+0QPLf^zW#5Fx;Jr;)+y2X81VW78qL z^ISRJecykX!NsDA2mzOV5EoA0x7;SjcJn9m!k z3P`AatQ?OPG3=2JZiYAtUb_eyeajF7Q^*Z|)I?-!O88!b;Zd-~lp(4hUlrAQ@$@>_ z*NpqcCVo@pC)Q{h>~TVEiPy?Rqv$71kUIOnFgGT63C;(zsF}%3^?X&MaUq9r)i0(M zOg#!kuj$bf3WSW5XUtye#&ZVlas5MpB(T>m=VVX38trGe_`QpZtOTM2|Jt%ZmoX&0 z`e%aUSuZVRRC;@efjyZlRsLIFS-M9&I@{ir^CPXDPQLdtWXvmzt8Jitsg;xBapKB* z7>Oo}6Ku4RPTxGK1ihL}QOTEr!5u;Q`#=~+4-T6z2ZCnG?n&VJKcj?`FN!NCHS+67 z^2BhW)t3-x+3in~C}g8?cw{6u`c_2EU`T%l449qj@56=X^SLPIQ7S_<_QHVd8;OQ&XR=^G%p<3LL(P z%zg*}zlhKc@B_f5eAb`DEwdVw8_trk>Vw6en4CQH6lq(!I^hk8W&oxMSYz1%oajm_ z2|Ps!A_=^JgSOd+9v~X@tsB~I6@+zdFr@>gm5bNugL=&^VUqw*a=@2B(8ZuFDa;~Z z5HaEBPU=qsVZC2fNe%F7b6sx#ec}>|uO-VJV_!7Sv&~1p3t(w3_h|KO7 zQ^NA4W*4Rwtx2`od6{5AUI2pKXC>9D=xQNE)Od=KI4PxwE0_Ejl=#O&*~X`rxPKM9 z<=#UvoVfG*sgYS7=FZ_U%@d2jT)? z?BxE!{rD0&wg^_44QWL%6({cjJle9=Zf-<*Qwtw33<5r+@k<rMG%Dw1L}#XDX0Vh-LW+qW7SbOs!c3<~18(kt#6Ebf+D zlw=BWwM-W7&U4hYr_pe-#*TFooHJtu=SHq)$RLbjH$L>;P3znooNw5i5m;r9i7xyp zb<`PXu#db94-%a^t)7Wb6yPS*3}bCiH+6hn$%zh&jKssnwpap6H{USuT$q%_1es*9 z%gMfH&r2O~lW2QQ+I-jMub_R~?(fWx>mUq_AmURDh zrSNru{sScdg_^iaqPCD~sOHZVe3u!sG0`YNvU0}$rD(2rWDB*vrUhjU4V?=^nNfXt z=&L;{=C56Nkjrmu`wUOBJ2q=07#?!G(lYy1Q*fJit4u1|@>V9VCb%+(cf%JPeAKf$ zF6HmW$OXj-ereV*znj|8A5tYA)-u8)bX8ag-QY$KR;oV-_OH$xv{s)rzgq}?Q)@rX z$M3!KAt6_O;Y0wdxyp9BhBz_P9<22n9Q#@9Qu5PDq18%ej|jNrj>lZYpl@X^9H4FA zue0cdYHb(+ghB2uZp9OaJ0XkXu2dJ}x>M@qf?wiD~#7$&Mez_G}XATa2%`>^Q89ej|d1+404+aMO z^%VqdQ}njCDdBNDeHdU^ci!O;EzTU(ZST!ocORz zDHnPP5Ienm<>y}q8o+kE9)<#UDn*kl1lZ?qM z)xT{xtDc)f`(}a}4Lp?_jhd!NV0znsJ%Cn^VH5HD@(MkrD+lPr#>|o$?1#hzT(JqF z1j{O$QDF;#2q#6|?F89&_$(*Zq7>i#$@_#Ej4VTuxnAdGk}T*%L)}0#A@4(RO62U| zcI0j_o|$^2qVaxdhFixMHsj9+~lAT>U-wz!KT7SmYsRw&RN53dnd>H0k?QqDA4%RgX@4cfjU{^Bii(N2Zbgw_^ST?yP7j3- zT-k2w05AgY0H*05b>SuR?|zlgzx!2xoW?)>svAZ0XL7FpR(CD5|7wAq%~tZ%+U+(1 zBpe5KeKkJ1W4u^<$({y9%xYyuMXu%gPHNz3p}CY%(ab*Kl+%kV$tSpfdSeYMwV#Gj z+8H^DtYmjml<#w;*6^V#P5P90RdWAh+yH(w0x?J0QgF(7EbIyt%cBW3U3p(~>+Q?tH zP)S0l@srvoiY)%jB7mi4*FF2F@- zykZ7-i7R#0AAtbbD(gb+z-5J((N!4M1P2SIF2lLYKSKKn%TQTteUl-vCk@$WmYV#7 zer)$zit0$b_;kSyU_+{XNfW|T>N!JKuSV&GoaNPOH+}-l2L)2)_2aUYQU#AG{adb9 z!6mT0gz4Vwh9?kI`9YO7%_AW21QpKo2}3|c54gX+ts_&foC*P93-{U3gLTq7NV9MDAJqAALmo6s;#=pr zV@d^uid>~iUrOX$E+NGMMKB-9_-=XVyZ#j_sJfBW)OCUP(Vk>y%zX8Cd0VNzJtZ?! z=UJJ2-#Mbd##^aJB85|bqHe9TpgC+>KT>Uy_}+~&pc+AxPwSh0z83j)jwQ)#D+|k3 z$F0E%b9^Rkz@AZMp_eUuWmd*pRE_9c+;QjvkuxjJoGz2z^QoLo?dTkf?3Fsj9qDpO z;O`e+-uF#z zRlCAm_1#A>jV{#J3bU^jqvf=$$KZ+hUYFO$$j%~zxri3^>(a}!6?j*<#%5V`KNy&fy(E1i@ zA2N-`Rt)2G(T>C%ms=a!jkv%chv`)Ec}>ENxc#)r_U&fXtp!Ub!%t~bb*;$DODoM0 z+7a%3KH4^#-4S0^MUlyqKHWSg4I#u$zC-b*C5=^;ebxfgW{3G|4eCO-yId}cxz7ygDkyTh;%YAjKpuxfOKHz1@k=DJtWrGwml-qY@)1h+$T##txJ|RD?%Pe7THtIPMo6?)1w-sTnF_R{VZJ({ArR(TQRM% ziDl}weTzcbllrE;v2xn7S&Qy~av92T1^SOBYT{$@99(%{Ol#;1KhDQ$g69ltW=B-j zTE^ zC}4xg|5Y=tiodU_dtYr1OlQ>Rb&7mj(>4s$Cv)q+Q^fY(967Z-`Dtd1z~vi%5!k>6 zp@C+5Q_;ouOXpoth|`CHwZp;U%vS^@B=<_xp#||3Ls{wlpLmNqX0Svz zl<*UY_vDB0O z)6~Pb2nJ(G?!y)W^;g6Fi7byHi%9az345Q2h~;OY{i;P;St2L{_oQc1(}T;o-$M|H zWsLXF_H`myyA(!VBoB5}C0TsZoqgIYO1S(`dvvL8;gsp_#gigy%`mgcjMD5tbm&gv0N-h1GT%KZ0!uM# zE1mM3s&xsgl1lX+XD}gXEV&ibxI4!lEKAPG?G@I=XQ%lU-)JUG+X~lmE>oyyJ!>#d zQ?#jIlv2$OuRH(UughHm_`h5|AV7d^2jn`ljT9}jpEt~2bw+dwGELu)4I7by|A?EY zE-f}gjHq@omq~ej;q+&!h?H>>(J^st3qwyr@QZz<{S+3fmpL;!y^6hHIi_q;qy7am zgP#bm7x!NwDSKg?@O-R4-Sxv{z73{6_xgIHN15qHmm20c`SHf13f0JN;lzZD`bLq& zCLOzGnnkPAQBG@++gI(8EZbz$!!zl%_=`tc+C8=aWgaG9L5sdWgMn-eM?Pw^bhit) zFc(LPtBkMRJ7czMZEV`(3fI>8=UXrn5NtHXUCS10@pbzKvTA*o*7G%p zX_f<;I+;I`xSlOJ^eh*S~Hvv-1+G&pxR0WNfE&Qp+oCGG+7{+pEj*+c|vo;W&c z_^)*Hufq6yXrdpYxmlze0?^xk@zHitKQceSuX^kZOzQ7;5r&Msnws%zrfJ1`!$j)_ z7aj2a*IiXic*lP~5+nM*m|s8}`r9WA0vq7sf19~ogMFExJ>hvFBMzUB}^f)Rp!b10x_9hjoTdHW8cR-aFp?Xv1IA|QBtzs z5g^7uqZZ?jecnFietEKbbuc~OY<{p_q+5fleSNYKTw^aW<3j|Ogy%Bc>(s=j9#=cE z#@yda#K}S`@~Qi&*vxG+^UC}9Dw^=Y3j6tHU{~mkV+S6ZpO1uJ0=xM)cc|QskY1QZWsI zxQu5-Mmav~6O`m>d)9%ChX+N$|30fSDUjC^+(V;8a8|j#mFQPI030MZrdVzO`_P?z3(0j0hIcu9axc8} z-tBjdO>lkQ|oSg)T2Y=(~2UEi(A1#IzRs7ZB};`)y&n~PV>b$ zfIOZ07b(0hmO5}!s%<@7R@Id4Jz;J4*~IS^kw52f-8^QcGL_|9Z0Z#}G#s4zw46_x zm;QqAvmT~BGsnQ)YSW^Y%sg{v2;&fhqcwLz6jM{)WQpc1r&gc)FHSW zeYz1C5a8u7aIrBaxa*S@?Yzr-q&4AMWAyZDto8)Xr5}K z*7WS>stfJ*+iYop%ZYkhij`1tyskoavS>$wZ+rVo%L;nY1xfV07gbIoAx|go{?aTI z$2|$zu!FVA)pjq0J@rYR+TF7fJeY$=ghO<2ar`@)pr#m=7Qz z>_>oN12&r3zyqng+zy(K4i64W&JGp_wx;|E{19z{cv%=(S;qJ*vWnD;?(MigTx4Aq zn+gbVhE9KrXLG-#<4$ex-=kGSPE%nxt58?fx2&t^zQkTq^?w+~MRctaI*-n=gRs||Z@?g~d8`;{&UOIHjww%s+ z)Y#1m8re=)<4~ytN$C_&&-sErWN<6`37ODjCP|79*zJ1<^Zsl41(%nXzzQ6ni5|B` zTbKNB+9;}7SnTuq^&AT?DJb6n*a-vBK%m=p-75h4vYyAB;{T(uFAs$J`~Gg1ii!D1 z$&zf9ELkE9g~&P;Qiv?sWs8^zl|5x_*^P#x$x_)eW%Dg9kR+6?q1TCZ; z4J5o>r~EHs>i;!heEUK=$bs{{WD;Q1w)|Hbv!eUAP{OEch+-Tj+cFr%3E(*Ye|W3^ zvnm2ACjaq5Ygm5*z*J>%|8F(|Oi=qu2uvBuNHmD@F}SvJtT1KYS*Fk2eh0W^;Gfc% z8I0|f{*RwAf`F+Ake|RXoGUXs@|>~b%+v@2UjL80h)v6IZMgj0&Ho7ff8p=`PsvRD z_XaVjaK)I(CF;;2zLakYG9Mn4M^F9R5Zlps+U?1=U1Fq+%^GSpAPg~g*d>6>L5SX* zXvcR9Xp9p13T@SC$J7w|X)j||>O}{f2o;IG+ZA{9P<~HZpJ$Lqfuc26{u_gPShZ-~;;APBB{1V3BaS>oaxj@G!jk&))bYs0p{uIBFolHkxDn#3_d31B9#tWyp zU-~JHNT}vR4fD^Ug+hi%VOAQkd@3xKzz5lpMcqquU`o~@Ivu3 z;mrV61wpEQW{_i6I&))rAh4tNig99e5pH!z&Q556+2)tLm1>geLKd9Tn|RLW+8;HM zKZ+2|(I;b*kz>}VG4x}qPD06I=|MAbo{eH?7V*&1vLx@Nj^ILy?)IYJgN^H^j&dSo zaAKQ!tyoep>sL`_?trVs$ZUv=K_iMf`qZ)VkD%%`h>rgt)<{P4wHE!PE)-d|V}%^- zHXisvLD|Qaq5t_~H5(s#v<2kO3uQyvyqzc4Piv0E z=H&~3dItk7-z>(6#Ue+NEabgV$UcB-MZ41-r+U+4?cSSmZAwH<2?R7*4UUVVM+u&s z(amx`E&7UDW6h0NTkY8p=)Ih5Lj6xUU*mVD3o|URFb!x!be~+#U`Jzcw)WM&Z$rD7 zdjuXAvhNx3;N?O3dbqBh*x;SxgLSri*I}9mc_?D! zqo5?s&I`_GMdk=bLmsG-pj;>?FqjW|6%r2oax`Rjqh0UnJsnY;W84HuFg z+`JNg9`J!s{&A6$F*+*W_Yun2pV@rtRQrT<++{G8IK6#BL^a^gN%1RQ@Jd{6uiKQV0 zb;*W&Ipmw&q>%AJ%q?2A&&FBcIuroIFnxaIFg>I3y2MQrwB5)#lz)t08SQ&}m%@|w z1^uB0a1BH-m-xn_+uvZRn*)Ssp8u_BMrfq8upZ6Ha}m2{;4rIyJPT5G)!X4JW|{BO z?(!$W&`7*dZ&ZOIl}3o1oEjX?WoK7&5-Yj7V8f)A=l8cm$I*(6GUWR8;zn4%z{Hsb zm?W(sX4VU(-vF0DsVW|E{X#r~gD#4Zsuvz5x~Td)>x_7Moc6p-t4kC`k3~s*z9x)L z=QeM|FX+3Uq~)tgui+mHw#FotePN;Sd|p0#Idzem(PIQ7+J z?Gt2vXY}n}Cyw;m)bDO?BcAW4f^B`O`@F2i8&xM_@e7JM>l)RAYP9Ye4hx%sn{j`w z%DkS{Q!i8qTA$)H9gg$zhJ0b^abAA6cD!w$E3NI#3a@-{WY6H+)efsTsDa9sQD5`NZd5 zb;XksAH*|=HngBSzX0isAh z>*_6ZfQRAryfMQoD#L*{^Y{2lt(u@`qa>32iloX&rv6#@Y=%nn4|xRgs&7iYKrXVuUp~y=;D*Z!cHMDr7WjHc%v1gTUI@FO ziR^=E;}MQ>{XttaP0Fh9myI42wP`aGTPaFasc`s(83?W>!IttSOSe#6j|chOJA0rW z6=P>My-=;NOM%JaX-Krd`K}F)1(Zgq>S|y3$#E;+dexWF#`TNM;-9g_k=j4T6xM9S zsV4k$b%`nymqz?O=sz@&CCnl3Flg@z@rweKd!qC`>(+&uln)r~oXT3Le%3IWPgD|vH5^_w$RFs~a zWD!WIDN$=7`tM|yrr&BSdwfo3-<3l|_UPA%D_t}l6_42^>d#=?7lB%^1sm~Lzc{Hf zAlSaU_DoCxk{@z%ulxybg=kya@E;=)36u`-mw?Uget{(E6}nPtLi|fmyJJV4G2OwL zz?wzu-3Y|b-IeEk6# zn}{3%F$r8dFu8dgD4_JuV=~Yi1k1*b(j(C>dZN^FR?JRo8-ifKFWCW3i0kpAm!Dkf z!OkQ}aRJaA5&Hv2sA3_k-6{7XSw7pL`)8G(!OnstA{0IxC6VTLU8;<~PySJR@Ud;T z!i6|9!SCNFKM8fr;>d5?%@YKOXJNQrv9A_SqEW3HTb%`NpD?m-= zxc2##I>eX_W^@e%@C4XwiYhQZapFy|Wh>{l3H0r7pD$*8L|et#12M7hWdom_PKl8y zJM^rndO0TJy(ypnuXtURr3jahe4$7&YO>g7o=T`%HpS9akh%sUv51IoZ#vp-gWlxo z0;loE{s0Tng(d~>f1>WXi{+%4Ah%)Y!^qr`5Q7G~-!Cy90>OB1iif76dr@S2Q6x*K zV%~nGI;k=_>R4spQ^tYQQ-^GHGmkM8Gg;0GBJ3-FwPC&)c8xMcf_V3nY&mt#&>KQt z_p$Morn9lI+)Oa@5;IQ3kJc`q)>S)&|KMQigdyQ~o6mlHA7$w(Qq{ybCPoZlZv==j zh3$>Wy+Mg>@A9BbEkV2m?HUqVVakvcRs(DI@ltNzK8XSuOn=fP#Pos^(w>5(wA>FBvh%5pd*|dddNJi9f z+<}eDozpl1oIegJ-B_(r<@0hj>1=M!JbqLhu6ByhIZ+Eqy_iFVLfSBr#o#pG_ju(w z(pb@_D~ztNs!B(E2*rD=Z7uy8aB@T#Cn63fMvco;0V1M$!<(zS^KoJaV4jpnbyOx& zm}cAvi%^c(b#&t#?4Ce)!X^}&{8o(Ls+AVJfHj#30cPryu8QLE{YuL0&wr|@NJi%V zs=JZk2Q)GZKU&=v_gB+($o)_(4`PR{M>_It02Vj8tw+xvVsGUX?4B@{(AyP}8=x^m zho~9F1oG&qsOqRGUX**`#yjrwS|D9xwmM2VS^MCpmJRWl{Yr59h%>JSI&Zl-32e=B zBmp+T-~ea&I;+rl6)?FJhAXqh5kQL~CDPKXRDtd~E%4%_ip*;-NRH2H82bH`12Q2n z6|Qnx5viy@`?h3G6wDVt?q2miD@r-e&x7m!tpq>mVVTB?%wM`->&NSk5HGVl)Pa1P(rq`9xxg;jCH``I;3051+A8k%A!eCQOrHry(2SYS?xwNn`Ti4V6hzOXb;8% z7KNtf&+a?qnk6UER#>DIy__V(+`V}(I4?riizv5jUC0;SlH?b&LvD}ewU=6yezg)@ z(EacK_O)r)R%UBYBX*l``!9#S48CpfT7dUN+fhjtL$7H)mHijXJ-%s*QeT!%1TA|_ z*B#*`RyM$tS4+2Y8$I}V^eK8nEjr8_r84WJNH19q$Ca@~tNMFf;k*&2AanEC5I5^h&qP{F84pkWRNb+ECHv22 zK|5I&cTTeD-5phg^jYr_O1J(z?e5FV(_34j{VEbD3Z4N%feo3aTLJTwA6SOkGEkz& z5u##Zd13r9j9^!m5{`@UnMUmMgViHe_)zjb+?5n#Zw9=Oh1u*f>Mq}P%hoYXYl#PF~l&aSC~aA#s=9L4edWb zKlFU`rpHs-Kc->OP#ATTeUZ&Uhud6n^7v|t_gPntTpkBbhuv86)ZmSc`MWwQ6oz;C zx;3}tC3O^W---CgMGW_9Nr}_|$I7It+tmv`6PSE3lBKb>j!)sWI{Y5R|I-7z@OADp za*P;^_FgO=IjaZY&6F&T1*0kY52bA9eg`eM=T2cm*Ka807S1@5$VQU{q#feZgQMe) z$HE^Sp<(sqFahb-u&E<$(&rzq6U>r(uOD>SF)m3hnXXIJQ{hC!_)!L)kK-T2S5h9*jxyEvvC}Y?NlXn;P+6kct6mBcVvD3t{OGDy|{8Nm#J-C zr)YLM`()f}W`yi3=6ML$SdEnD{TP2P1a53L-qThesKa zZ$rT@)mk9K#n4m72M>>jxss`}A!!!L7oB5+US(aU=v0k$l8k^=6Q;?f1Ib>=_k_;3 zj2_R0V4X=xuJP+8PhW$x;GMG#Bd{|QT|0?Z}^CasSc%aV3I@%j&sB&jy-&l zJ7raskMb`gp!{#R*)rVbVu}++Ea{_Ma|CS-_&Scj8FpvSxd2qjz zcoM6_8M%iYAN4#=5U5`IhX+?S?-s`Waf5Hi`PpEB0Eii#+X6BuMrAkV`>U&*@U>*I z7AY&=NNr2kM%urUKew{rI%GzrRDQl?somRdT5;D?JwYD>We7?r<3#HrfeTNke&Mez z+q753PI$rRMUp1a|Ejf!gvw+toq?~ML+LQIVhwLZh>|$|;Ksd~y0+0*%qZH`HuhX=CBL#zM*&+D=us&m zRc66}YMt-qPf+iC_UdFtP9TTg43m|moxt)Qy)a^@y`#*f8zmeq6^kLXnQ9aw8l8iStX31Kjqd|F?(wt~M zZQn~rboTP49KLaV^Xi-6`P&`Uu~lv!uI2Y3+G4rq>1pkw=#?dK;;NdU(+=IH_ht-W z(#-NspFTTG!vA$C(s8Z9nEKH#^#pcriV)X*X^h9*FU@PD6s15?UB>eOq1~hMmY;q{ z^Lt8FJhgJ|#|NKYwh{krg0>G_E)wQXhYu8NH#CFJd;2ToW6DZj*Tf~#RLs)-ngo8n zT?II>fnH9M3I;wbJISZA^NE~oRGBm25Hj6noAd6z=dhG21 znZdnAydXdbDx&u0>yG6fLrONE{!QcgQj9UFMn(7jt;fScM&>Kp2RY#^maf*>pB!|y zNuXFq=R^ z2|eCIlIA#~Q`x60f_7%84tCil@6?~nu)Q()Sc+?nxP*RqMW%#vaz*{O?#xY|gI#5h zJ8Gy!Y_CV!08qF*G*1=02vb(H4-AFVptJpWqa~ZXo~@9&E;4s1Nh%54kjo@n*t9e> zL`?AIiE9u)m~9qm{>Cl~bgL&^dP!Y)t|sW8oGbsD7|Ro-{3uzZx=u`i+SlGSXjN5F zsr4sy9zgNV)FAhRztzw}-#Y{w)oxwQHuiP8<2=t&I%Xv;vC_oe^x=NVjV$$Yr?V9O zzRbN{_%4C<#4o^YyRD5k%m1ktIw%cy>MEcY_~T>^8%7MX(wGx;18>NIbI=83H4sxIING>tD0V6-z2gX;}Ae7G2{ z`(!HDVcW6XkLgA23(LeH%U(b@J~@4c;bAr9#IKP1tAnZ;y_k$|#vZm6W>T@ihq5tS zw*-KJS}$&Yn-S)7bmRkS4EVfwm(8Is&nEby7}z(${>1iVjBH+n%(BpZ*P)W)W{(NTu_XOtqz7!x#+qFGoFY(Elr+ z`-&B$!sX}i19#PLTcby>_X_ExVtZ%wOsy*KPj#-Z(p`R19&hv7KtXJ`y)WQb^%4>8Ye@*4*&!T|A&b#_fJ5J8%9e3E5U>1m>p&`2u zgV~k)(RiEE2TC;2V|^?44S-->~F+v zkD9$V-(JZ2e&_F7%Uh4v(w$Zmg4PI!JQ$Tz)_~L#82w;v?b(ciuwa(c+fjw_;S74f z`V9RiFMkj5_bJ?ISz5_e+1>_IuS#JWIlS$^NkQ^_5Lm&di>F1lmzQ0taMydGa^$JF zP&4{X05>}~VgoTMTwj>lwWA()!Mo+kq-vXag?;-oqo5_vu9lz#vWJ9nzgSziKYxt}dQK3>s*Yxp0bsk1XP@u=pusL8aBaNiD&Y1acl zQr^;Ez(#bL)+&r!duKBqH4!#E;JltDHFEff&Az)GyZ05hoRw*&)zrE{$Y;v*#f^=< zjLI;R`+*dU-tkTHoBN`VX$%mmRAsYK94*p)-#^Y;q{J(EPgpMZ*+%jNrj^O)c0^lQ zdVWENv%{_z)o%C?$y6ShFw>GB%}X>jFvl8gNvPQ5vb$89is8L?fzkNh+H^#L&kG!9 zJ+4`Qeb5r=bT%PbY2~!#-pv>L#GQl4=VTY%W7b~8dLdI1B~}r|NsXs*mQ}`#ZiSPn zIXs_Fr#+10zDlY*TEr#1uaWKhKG>$YU<4~vjs78tFRtg);ue6aHTySWEBs^pZ}Pu zRIYTb>ccqV0{W)CxLDruGWJv4j0h-vL~-#xr0F6BTl|SWR}0bD9Mg^j&^%_!5-8&0 zEMMRt{!-@5oePC-p3OK=Q=j|t7^elIHY?$Rm~!Wpq_z#Kh)+1h5wjRiLX>8y+G&>vjvq@uD!LgyDY^B0qtldR(U#72n8EH8x{%nkuF#q^9 z{rpgrC#CbNd6`Y%@7H4J0PM0KWFkvF=-b1tUC*A2St2q6X+5om_EAfXi zB8BaAq^}zo9qpCV<9^t+=075m=N6FfqRaVJ-@iLr z&U~($+8(Ty)bAoVbOgtpB6q9ReS5`vcdtlIthf%I6{z-K>>rYTJQ4S`41X3z1<_($ ztM3Ndz@GI+vAA1*#jV1kz&%*eJmX$UyKQFeGTeOKB{xY&7A~}*&fiKrRWKy1P-3Tm9by4Y3F;>&yxZgS;Z`hoJU31 z{YLw}XSI!@f1ETdw;PvLK+8L{-BL((&S^_8c7LBodUXA4wO?uey~KMK0UfNLNZkVrt9I-6J^&Qh?{ffR@nyl12-`nULZ(rQwjMpp~wuUz4Ec%ceuC zyKKQ;%fvLq(Yt8x9*6{IgA235^D8|9h&o2P< zmdVl_^FgmRxL$4LkC)V$^B&l}`V2O>BPk;r`=YX}wVtzxB?{&953P zLu*UJl+-`X*WgdREKRKfewX%Ies&=8FW5f3z4y-|TDM2N=QY{%nYuZ7Z?mI``Ab-s z%G}NSghs21nX%^2ZYv|V`@F$>zynK|mF(X=vUgw~7^K&>LDuM9(pF9tz#T^Bg`@Sr zHWoTj|Lpm5r!64>yt5Cq=5t>vVX+sg@caTYd`(T91hMlsee<)ZOt@xlE;PV(0gJ z{FRqXANd~k(I;P+O!xjJV0V&lPlO835i@P5?v787577F~vMKJRy^DGs)OdC|@22{u zI+B)nQB$sK>h`-`%rVYYYA2~TT>Tl!L;5*~j;zZ9t9=AZ zS{66P@&5gPj<;hTozhuQ_m;!#*}8f@ Date: Mon, 26 Oct 2015 10:07:34 -0400 Subject: [PATCH 38/41] 4.0.0 --- .../core.jar/org/netbeans/core/startup/Bundle.properties | 4 ++-- .../org/netbeans/core/windows/view/ui/Bundle.properties | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties index 7e3c904dd2..bbdfa12f42 100644 --- a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties +++ b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties @@ -1,5 +1,5 @@ #Updated by build script -#Fri, 23 Oct 2015 09:28:23 -0400 +#Mon, 26 Oct 2015 09:54:05 -0400 LBL_splash_window_title=Starting Autopsy SPLASH_HEIGHT=314 SPLASH_WIDTH=538 @@ -8,4 +8,4 @@ SplashRunningTextBounds=0,289,538,18 SplashRunningTextColor=0x0 SplashRunningTextFontSize=19 -currentVersion=Autopsy 3.1.3 +currentVersion=Autopsy 4.0.0 diff --git a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties index fd051ed29c..a375cb839f 100644 --- a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties +++ b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties @@ -1,4 +1,4 @@ #Updated by build script -#Fri, 23 Oct 2015 09:28:23 -0400 -CTL_MainWindow_Title=Autopsy 3.1.3 -CTL_MainWindow_Title_No_Project=Autopsy 3.1.3 +#Mon, 26 Oct 2015 09:54:05 -0400 +CTL_MainWindow_Title=Autopsy 4.0.0 +CTL_MainWindow_Title_No_Project=Autopsy 4.0.0 From 139b9a9a5a3093b7417e1130349c12d97e268677 Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Mon, 26 Oct 2015 10:45:30 -0400 Subject: [PATCH 39/41] image gallery help points to main index --- .../sleuthkit/autopsy/imagegallery/actions/OpenHelpAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenHelpAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenHelpAction.java index e86c20b28c..080858b84f 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenHelpAction.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenHelpAction.java @@ -43,7 +43,7 @@ public final class OpenHelpAction implements ActionListener { @Override public void actionPerformed(ActionEvent e) { try { - Desktop.getDesktop().browse(URI.create("http://sleuthkit.org/autopsy/docs/user-docs/")); + Desktop.getDesktop().browse(URI.create("http://sleuthkit.org/autopsy/docs/user-docs/4.0/")); } catch (IOException ex) { Exceptions.printStackTrace(ex); } From 3745f0da6a3663256c606ec0717f91d6ff2ffff5 Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Mon, 26 Oct 2015 10:50:51 -0400 Subject: [PATCH 40/41] full path --- .../sleuthkit/autopsy/imagegallery/actions/OpenHelpAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenHelpAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenHelpAction.java index 080858b84f..c2a9fe783f 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenHelpAction.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenHelpAction.java @@ -43,7 +43,7 @@ public final class OpenHelpAction implements ActionListener { @Override public void actionPerformed(ActionEvent e) { try { - Desktop.getDesktop().browse(URI.create("http://sleuthkit.org/autopsy/docs/user-docs/4.0/")); + Desktop.getDesktop().browse(URI.create("http://sleuthkit.org/autopsy/docs/user-docs/4.0/image_gallery_page.html")); } catch (IOException ex) { Exceptions.printStackTrace(ex); } From 39466eb3a85dfe2b8ddad170c0af7b8adb91544a Mon Sep 17 00:00:00 2001 From: jmillman Date: Mon, 26 Oct 2015 11:01:01 -0400 Subject: [PATCH 41/41] correct capitalization in UI messages --- .../org/sleuthkit/autopsy/timeline/db/EventsRepository.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/timeline/db/EventsRepository.java b/Core/src/org/sleuthkit/autopsy/timeline/db/EventsRepository.java index 73800b9b89..f04abb8e14 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/db/EventsRepository.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/db/EventsRepository.java @@ -454,7 +454,7 @@ public class EventsRepository { } @Override - @NbBundle.Messages({"progressWindow.msg.populateMacEventsFiles=populating mac events for files:", + @NbBundle.Messages({"progressWindow.msg.populateMacEventsFiles==Populating MAC time events for files:", "progressWindow.msg.reinit_db=(re)initializing events database", "progressWindow.msg.commitingDb=committing events db"}) protected Void doInBackground() throws Exception { @@ -587,7 +587,7 @@ public class EventsRepository { * @param trans the db transaction to use * @param skCase a reference to the sleuthkit case */ - @NbBundle.Messages({"# {0} - event type ", "progressWindow.populatingXevents=populating {0} events"}) + @NbBundle.Messages({"# {0} - event type ", "progressWindow.populatingXevents=Populating {0} events"}) private void populateEventType(final ArtifactEventType type, EventDB.EventTransaction trans) { try { //get all the blackboard artifacts corresponding to the given event sub_type