From 09c0f5dfc236be3ae1e88e67833073943fae1991 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Wed, 14 Oct 2015 15:47:27 -0400 Subject: [PATCH] Exception handling --- .../autopsy/casemodule/Bundle.properties | 1 + .../sleuthkit/autopsy/casemodule/Case.java | 13 +++++- .../sleuthkit/autopsy/core/Bundle.properties | 4 +- .../autopsy/core/ServicesMonitor.java | 4 ++ .../sleuthkit/autopsy/core/TextConverter.java | 43 +++++++++++------- .../autopsy/core/UserPreferences.java | 25 +++++------ .../MultiUserSettingsPanel.java | 44 ++++++++++++++----- .../autopsy/events/AutopsyEventPublisher.java | 6 +++ 8 files changed, 96 insertions(+), 44 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index cfcb914c4d..c9a86ea72f 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -108,6 +108,7 @@ AddImageWizardIterator.stepXofN=Step {0} of {1} AddLocalFilesTask.localFileAdd.progress.text=Adding\: {0}/{1} Case.getCurCase.exception.noneOpen=Cannot get the current case; there is no case open\! Case.create.exception.msg=Error creating a case\: {0} in dir {1} +Case.databaseConnectionInfo.error.msg=Error accessing case database connection info Case.open.exception.blankCase.msg=Case name is blank. Case.open.msgDlg.updated.msg=Updated case database schema.\nA backup copy of the database with the following path has been made\:\n {0} Case.open.msgDlg.updated.title=Case Database Schema Update diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index a4e477fada..c136022021 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -28,6 +28,7 @@ import java.io.IOException; import java.nio.file.InvalidPathException; import java.nio.file.Path; import java.nio.file.Paths; +import java.security.GeneralSecurityException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -455,6 +456,10 @@ public class Case implements SleuthkitCase.ErrorObserver { 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); + } catch (IllegalArgumentException ex) { + 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); } /** @@ -566,7 +571,13 @@ public class Case implements SleuthkitCase.ErrorObserver { if (!UserPreferences.getIsMultiUserModeEnabled()) { throw new CaseActionException(NbBundle.getMessage(Case.class, "Case.open.exception.multiUserCaseNotEnabled")); } - db = SleuthkitCase.openCase(metadata.getCaseDatabaseName(), UserPreferences.getDatabaseConnectionInfo(), caseDir); + try { + db = SleuthkitCase.openCase(metadata.getCaseDatabaseName(), UserPreferences.getDatabaseConnectionInfo(), caseDir); + } catch (IllegalArgumentException ex) { + 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); + } } /** diff --git a/Core/src/org/sleuthkit/autopsy/core/Bundle.properties b/Core/src/org/sleuthkit/autopsy/core/Bundle.properties index 4fa84d55dc..65793ee266 100644 --- a/Core/src/org/sleuthkit/autopsy/core/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/core/Bundle.properties @@ -20,4 +20,6 @@ ServicesMonitor.statusChange.notify.title=Service Status Update ServicesMonitor.statusChange.notify.msg=Status for {0} is {1} ServicesMonitor.nullServiceName.excepton.txt=Requested service name is null ServicesMonitor.nullStatusOrDetails.excepton.txt=Status or details string is null -ServicesMonitor.unknownServiceName.excepton.txt=Requested service name {0} is unknown \ No newline at end of file +ServicesMonitor.unknownServiceName.excepton.txt=Requested service name {0} is unknown +TextConverter.convert.exception.txt=Unable to convert text {0} to hex text +TextConverter.convertFromHex.exception.txt=Unable to convert hex text to text \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/core/ServicesMonitor.java b/Core/src/org/sleuthkit/autopsy/core/ServicesMonitor.java index b7144c98fc..ddad30e08b 100644 --- a/Core/src/org/sleuthkit/autopsy/core/ServicesMonitor.java +++ b/Core/src/org/sleuthkit/autopsy/core/ServicesMonitor.java @@ -266,6 +266,8 @@ public class ServicesMonitor { } else { setServiceStatus(Service.REMOTE_CASE_DATABASE.toString(), ServiceStatus.DOWN.toString(), ""); } + } catch (IllegalArgumentException ex) { + logger.log(Level.SEVERE, "Error accessing case database connection info", ex); //NON-NLS } catch (Exception ex) { logger.log(Level.SEVERE, "Exception while checking database connection status", ex); //NON-NLS } @@ -297,6 +299,8 @@ public class ServicesMonitor { } else { setServiceStatus(Service.MESSAGING.toString(), ServiceStatus.DOWN.toString(), ""); } + } catch (IllegalArgumentException ex) { + logger.log(Level.SEVERE, "Error accessing messaging service connection info", ex); //NON-NLS } catch (Exception ex) { logger.log(Level.SEVERE, "Exception while checking messaging server connection status", ex); //NON-NLS } diff --git a/Core/src/org/sleuthkit/autopsy/core/TextConverter.java b/Core/src/org/sleuthkit/autopsy/core/TextConverter.java index 93b4288b06..bb9030851e 100644 --- a/Core/src/org/sleuthkit/autopsy/core/TextConverter.java +++ b/Core/src/org/sleuthkit/autopsy/core/TextConverter.java @@ -28,13 +28,14 @@ import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; +import org.openide.util.NbBundle; /** * Provides ability to convert text to hex text. */ class TextConverter { - private static final char[] LOOK_AWAY = "dontlookhere".toCharArray(); + private static final char[] TMP = "dontlookhere".toCharArray(); private static final byte[] SALT = { (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12, (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12, @@ -44,15 +45,19 @@ class TextConverter { * Convert text to hex text. * @param property Input text string. * @return Converted hex string. - * @throws GeneralSecurityException - * @throws UnsupportedEncodingException + * @throws IllegalArgumentException */ - static String convertTextToHexText(String property) throws GeneralSecurityException, UnsupportedEncodingException { - SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); - SecretKey key = keyFactory.generateSecret(new PBEKeySpec(LOOK_AWAY)); - Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); - pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); - return base64Encode(pbeCipher.doFinal(property.getBytes("UTF-8"))); + static String convertTextToHexText(String property) throws IllegalArgumentException { + try { + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); + SecretKey key = keyFactory.generateSecret(new PBEKeySpec(TMP)); + Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); + pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); + return base64Encode(pbeCipher.doFinal(property.getBytes("UTF-8"))); + } catch (Exception ex) { + throw new IllegalArgumentException( + NbBundle.getMessage(TextConverter.class, "TextConverter.convert.exception.txt")); + } } private static String base64Encode(byte[] bytes) { @@ -63,15 +68,19 @@ class TextConverter { * Convert hex text back to text. * @param property Input hex text string. * @return Converted text string. - * @throws GeneralSecurityException - * @throws IOException + * @throws IllegalArgumentException */ - static String convertHexTextToText(String property) throws GeneralSecurityException, IOException { - SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); - SecretKey key = keyFactory.generateSecret(new PBEKeySpec(LOOK_AWAY)); - Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); - pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); - return new String(pbeCipher.doFinal(base64Decode(property)), "UTF-8"); + static String convertHexTextToText(String property) throws IllegalArgumentException { + try { + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); + SecretKey key = keyFactory.generateSecret(new PBEKeySpec(TMP)); + Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); + pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); + return new String(pbeCipher.doFinal(base64Decode(property)), "UTF-8"); + } catch (Exception ex) { + throw new IllegalArgumentException( + NbBundle.getMessage(TextConverter.class, "TextConverter.convertFromHex.exception.txt")); + } } private static byte[] base64Decode(String property) { diff --git a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java index 7acbfd03f3..8f8eb9a9d2 100755 --- a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java +++ b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java @@ -134,10 +134,9 @@ public final class UserPreferences { /** * Reads persisted case database connection info. * @return An object encapsulating the database connection info. - * @throws GeneralSecurityException - * @throws IOException + * @throws IllegalArgumentException */ - public static CaseDbConnectionInfo getDatabaseConnectionInfo() throws GeneralSecurityException, IOException { + public static CaseDbConnectionInfo getDatabaseConnectionInfo() throws IllegalArgumentException { DbType dbType; try { dbType = DbType.valueOf(preferences.get(EXTERNAL_DATABASE_TYPE, "SQLITE")); @@ -155,11 +154,13 @@ public final class UserPreferences { /** * Persists case database connection info. - * @param connectionInfo An object encapsulating the database connection info. - * @throws GeneralSecurityException - * @throws UnsupportedEncodingException + * + * @param connectionInfo An object encapsulating the database connection + * info. + * + * @throws IllegalArgumentException */ - public static void setDatabaseConnectionInfo(CaseDbConnectionInfo connectionInfo) throws GeneralSecurityException, UnsupportedEncodingException { + public static void setDatabaseConnectionInfo(CaseDbConnectionInfo connectionInfo) throws IllegalArgumentException { preferences.put(EXTERNAL_DATABASE_HOSTNAME_OR_IP, connectionInfo.getHost()); preferences.put(EXTERNAL_DATABASE_PORTNUMBER, connectionInfo.getPort()); preferences.put(EXTERNAL_DATABASE_USER, connectionInfo.getUserName()); @@ -196,10 +197,9 @@ public final class UserPreferences { * Persists message service connection info. * * @param info An object encapsulating the message service info. - * @throws java.security.GeneralSecurityException - * @throws java.io.UnsupportedEncodingException + * @throws IllegalArgumentException */ - public static void setMessageServiceConnectionInfo(MessageServiceConnectionInfo info) throws GeneralSecurityException, UnsupportedEncodingException { + public static void setMessageServiceConnectionInfo(MessageServiceConnectionInfo info) throws IllegalArgumentException { preferences.put(MESSAGE_SERVICE_USER, info.getUserName()); preferences.put(MESSAGE_SERVICE_PASSWORD, TextConverter.convertTextToHexText(info.getPassword())); preferences.put(MESSAGE_SERVICE_HOST, info.getHost()); @@ -210,10 +210,9 @@ public final class UserPreferences { * Reads persisted message service connection info. * * @return An object encapsulating the message service info. - * @throws java.security.GeneralSecurityException - * @throws java.io.IOException + * @throws IllegalArgumentException */ - public static MessageServiceConnectionInfo getMessageServiceConnectionInfo() throws GeneralSecurityException, IOException { + public static MessageServiceConnectionInfo getMessageServiceConnectionInfo() throws IllegalArgumentException { return new MessageServiceConnectionInfo(preferences.get(MESSAGE_SERVICE_USER, ""), TextConverter.convertHexTextToText(preferences.get(MESSAGE_SERVICE_PASSWORD, "")), preferences.get(MESSAGE_SERVICE_HOST, ""), diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java index 807390cd25..0c115b83e6 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/MultiUserSettingsPanel.java @@ -18,8 +18,12 @@ import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.events.MessageServiceConnectionInfo; import org.sleuthkit.autopsy.coreutils.Logger; import java.awt.Cursor; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.GeneralSecurityException; import java.util.logging.Level; import javax.swing.ImageIcon; +import org.openide.util.Exceptions; import org.openide.util.ImageUtilities; import org.openide.util.Lookup; import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchService; @@ -484,17 +488,25 @@ public final class MultiUserSettingsPanel extends javax.swing.JPanel { }//GEN-LAST:event_bnTestSolrActionPerformed void load() { - CaseDbConnectionInfo dbInfo = UserPreferences.getDatabaseConnectionInfo(); - tbDbHostname.setText(dbInfo.getHost().trim()); - tbDbPort.setText(dbInfo.getPort().trim()); - tbDbUsername.setText(dbInfo.getUserName().trim()); - tbDbPassword.setText(dbInfo.getPassword()); + try { + CaseDbConnectionInfo dbInfo = UserPreferences.getDatabaseConnectionInfo(); + tbDbHostname.setText(dbInfo.getHost().trim()); + tbDbPort.setText(dbInfo.getPort().trim()); + tbDbUsername.setText(dbInfo.getUserName().trim()); + tbDbPassword.setText(dbInfo.getPassword()); + } catch (IllegalArgumentException ex) { + logger.log(Level.SEVERE, "Error accessing case database connection info", ex); //NON-NLS + } - MessageServiceConnectionInfo msgServiceInfo = UserPreferences.getMessageServiceConnectionInfo(); - tbMsgHostname.setText(msgServiceInfo.getHost().trim()); - tbMsgPort.setText(msgServiceInfo.getPort().trim()); - tbMsgUsername.setText(msgServiceInfo.getUserName().trim()); - tbMsgPassword.setText(msgServiceInfo.getPassword()); + try { + MessageServiceConnectionInfo msgServiceInfo = UserPreferences.getMessageServiceConnectionInfo(); + tbMsgHostname.setText(msgServiceInfo.getHost().trim()); + tbMsgPort.setText(msgServiceInfo.getPort().trim()); + tbMsgUsername.setText(msgServiceInfo.getUserName().trim()); + tbMsgPassword.setText(msgServiceInfo.getPassword()); + } catch (IllegalArgumentException ex) { + logger.log(Level.SEVERE, "Error accessing case database connection info", ex); //NON-NLS + } String indexingServerHost = UserPreferences.getIndexingServerHost().trim(); if (!indexingServerHost.isEmpty()) { @@ -570,14 +582,22 @@ public final class MultiUserSettingsPanel extends javax.swing.JPanel { new String(tbDbPassword.getPassword()), dbType); - UserPreferences.setDatabaseConnectionInfo(info); + try { + UserPreferences.setDatabaseConnectionInfo(info); + } catch (IllegalArgumentException ex) { + logger.log(Level.SEVERE, "Error accessing case database connection info", ex); //NON-NLS + } MessageServiceConnectionInfo msgServiceInfo = new MessageServiceConnectionInfo( tbMsgUsername.getText().trim(), new String(tbMsgPassword.getPassword()), tbMsgHostname.getText().trim(), tbMsgPort.getText().trim()); - UserPreferences.setMessageServiceConnectionInfo(msgServiceInfo); + try { + UserPreferences.setMessageServiceConnectionInfo(msgServiceInfo); + } catch (IllegalArgumentException ex) { + logger.log(Level.SEVERE, "Error accessing messaging service connection info", ex); //NON-NLS + } UserPreferences.setIndexingServerHost(tbSolrHostname.getText().trim()); UserPreferences.setIndexingServerPort(Integer.parseInt(tbSolrPort.getText().trim())); diff --git a/Core/src/org/sleuthkit/autopsy/events/AutopsyEventPublisher.java b/Core/src/org/sleuthkit/autopsy/events/AutopsyEventPublisher.java index a23a203ee6..ad22cc8b2f 100644 --- a/Core/src/org/sleuthkit/autopsy/events/AutopsyEventPublisher.java +++ b/Core/src/org/sleuthkit/autopsy/events/AutopsyEventPublisher.java @@ -19,7 +19,9 @@ package org.sleuthkit.autopsy.events; import java.beans.PropertyChangeListener; +import java.io.IOException; import java.net.URISyntaxException; +import java.security.GeneralSecurityException; import java.util.Set; import java.util.logging.Level; import javax.jms.JMSException; @@ -70,6 +72,10 @@ public final class AutopsyEventPublisher { String message = "Failed to open remote event channel"; //NON-NLS logger.log(Level.SEVERE, message, ex); throw new AutopsyEventException(message, ex); + } catch (IllegalArgumentException ex) { + String message = "Error accessing messaging service connection info"; //NON-NLS + logger.log(Level.SEVERE, message, ex); + throw new AutopsyEventException(message, ex); } }