From 289a05c32de806ef097a082903f1baa0b4a9cc56 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Thu, 31 Aug 2017 11:44:10 -0400 Subject: [PATCH 1/3] Delete the central repo database if initialization fails --- .../datamodel/PostgresEamDbSettings.java | 24 +++++++++- .../datamodel/SqliteEamDbSettings.java | 24 +++++++++- .../optionspanel/EamDbSettingsDialog.java | 48 ++++++++++++++----- 3 files changed, 82 insertions(+), 14 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java index 32ed226a5f..96a2feb4cf 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java @@ -281,6 +281,27 @@ public final class PostgresEamDbSettings { return true; } + + public boolean deleteDatabase() { + Connection conn = getEphemeralConnection(true); + if (null == conn) { + return false; + } + + String sql = "DROP DATABASE %s"; // NON-NLS + try { + Statement stmt; + stmt = conn.createStatement(); + stmt.execute(String.format(sql, getDbName())); + } catch (SQLException ex) { + LOGGER.log(Level.SEVERE, "Failed to execute drop database statement.", ex); // NON-NLS + return false; + } finally { + EamDbUtil.closeConnection(conn); + } + return true; + + } /** * Initialize the database schema. @@ -463,7 +484,8 @@ public final class PostgresEamDbSettings { } finally { EamDbUtil.closeConnection(conn); } - return true; + return false; // testing temp temp + //return true; } public boolean insertDefaultDatabaseContent() { diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java index 5c02d17ea0..a5221f130a 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java @@ -109,6 +109,18 @@ public final class SqliteEamDbSettings { ModuleSettings.setConfigSetting("CentralRepository", "db.sqlite.bulkThreshold", Integer.toString(getBulkThreshold())); // NON-NLS ModuleSettings.setConfigSetting("CentralRepository", "db.badTags", String.join(",", badTags)); // NON-NLS } + + public boolean dbFileExists() { + //if(dbDirectoryExists()){ + File dbFile = new File(getFileNameWithPath()); + if(! dbFile.exists()){ + return false; + } + // It's unlikely, but make sure the file isn't actually a directory + return ( ! dbFile.isDirectory()); + //} + //return false; + } /** * Verify that the db directory path exists. @@ -148,6 +160,15 @@ public final class SqliteEamDbSettings { return true; } + + /** + * Delete the database + * @return + */ + public boolean deleteDatabase() { + File dbFile = new File(this.getFileNameWithPath()); + return dbFile.delete(); + } /** * Get the full connection URL as a String @@ -408,7 +429,8 @@ public final class SqliteEamDbSettings { } finally { EamDbUtil.closeConnection(conn); } - return true; + //return true; + return false; // temp testing } public boolean insertDefaultDatabaseContent() { diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java index 6ef345ac4f..548053bd84 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java @@ -318,26 +318,32 @@ public class EamDbSettingsDialog extends JDialog { switch (selectedPlatform) { case POSTGRESQL: if (dbSettingsPostgres.verifyConnection()) { - if (dbSettingsPostgres.verifyDatabaseExists() - && dbSettingsPostgres.verifyDatabaseSchema()) { - testingStatus = DatabaseTestResult.TESTEDOK; + if (dbSettingsPostgres.verifyDatabaseExists()) { + if( dbSettingsPostgres.verifyDatabaseSchema()) { + testingStatus = DatabaseTestResult.TESTEDOK; + } else { + testingStatus = DatabaseTestResult.SCHEMA_INVALID; + } } else { - testingStatus = DatabaseTestResult.SCHEMA_INVALID; + testingStatus = DatabaseTestResult.DB_DOES_NOT_EXIST; } } else { testingStatus = DatabaseTestResult.CONNECTION_FAILED; } break; case SQLITE: - if (dbSettingsSqlite.dbDirectoryExists() - && dbSettingsSqlite.verifyConnection()) { - if (dbSettingsSqlite.verifyDatabaseSchema()) { - testingStatus = DatabaseTestResult.TESTEDOK; + if (dbSettingsSqlite.dbFileExists()){ + if(dbSettingsSqlite.verifyConnection()) { + if (dbSettingsSqlite.verifyDatabaseSchema()) { + testingStatus = DatabaseTestResult.TESTEDOK; + } else { + testingStatus = DatabaseTestResult.SCHEMA_INVALID; + } } else { testingStatus = DatabaseTestResult.SCHEMA_INVALID; } } else { - testingStatus = DatabaseTestResult.SCHEMA_INVALID; + testingStatus = DatabaseTestResult.DB_DOES_NOT_EXIST; } break; } @@ -348,7 +354,7 @@ public class EamDbSettingsDialog extends JDialog { @Messages({"EamDbSettingsDialog.okButton.createDbError.title=Unable to Create Database", "EamDbSettingsDialog.okButton.createSQLiteDbError.message=Unable to create SQLite Database, please ensure location exists and you have write permissions and try again.", "EamDbSettingsDialog.okButton.createPostgresDbError.message=Unable to create Postgres Database, please ensure address, port, and login credentials are correct for Postgres server and try again."}) - private void createDb() { + private void createDb(boolean removeIncompleteDatabase) { boolean result = false; boolean dbCreated = true; switch (selectedPlatform) { @@ -361,6 +367,11 @@ public class EamDbSettingsDialog extends JDialog { && dbSettingsPostgres.insertDefaultDatabaseContent(); } if (!result) { + // Remove the incomplete database + if(dbCreated && removeIncompleteDatabase){ + dbSettingsPostgres.deleteDatabase(); + } + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), Bundle.EamDbSettingsDialog_okButton_createPostgresDbError_message(), Bundle.EamDbSettingsDialog_okButton_createDbError_title(), @@ -378,6 +389,10 @@ public class EamDbSettingsDialog extends JDialog { && dbSettingsSqlite.insertDefaultDatabaseContent(); } if (!result) { + if(dbCreated && removeIncompleteDatabase){ + dbSettingsSqlite.deleteDatabase(); + } + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), Bundle.EamDbSettingsDialog_okButton_createSQLiteDbError_message(), Bundle.EamDbSettingsDialog_okButton_createDbError_title(), @@ -394,6 +409,8 @@ public class EamDbSettingsDialog extends JDialog { @Messages({"EamDbSettingsDialog.okButton.errorTitle.text=Restart Required.", "EamDbSettingsDialog.okButton.errorMsg.text=Please restart Autopsy to begin using the new database platform.", "EamDbSettingsDialog.okButton.connectionErrorMsg.text=Failed to connect to Central Repository database.", + "EamDbSettingsDialog.okButton.corruptDatabaseExists.title=Error Loading Database", + "EamDbSettingsDialog.okButton.corruptDatabaseExists.message=Database exists but is not the right format. Manually delete it or choose a different path.", "EamDbSettingsDialog.okButton.createDbDialog.title=Database Does Not Exist", "EamDbSettingsDialog.okButton.createDbDialog.message=Database does not exist, would you like to create it?", "EamDbSettingsDialog.okButton.databaseConnectionFailed.title=Database Connection Failed", @@ -406,13 +423,19 @@ public class EamDbSettingsDialog extends JDialog { Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_message(), Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_title(), JOptionPane.WARNING_MESSAGE); - } else if (testingStatus == DatabaseTestResult.SCHEMA_INVALID) { + } else if (testingStatus == DatabaseTestResult.SCHEMA_INVALID){ + // There's an existing database or file, but it's not in our format. + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), + Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_message(), + Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_title(), + JOptionPane.WARNING_MESSAGE); + } else if (testingStatus == DatabaseTestResult.DB_DOES_NOT_EXIST) { //database doesn't exist do you want to create if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(WindowManager.getDefault().getMainWindow(), Bundle.EamDbSettingsDialog_okButton_createDbDialog_message(), Bundle.EamDbSettingsDialog_okButton_createDbDialog_title(), JOptionPane.YES_NO_OPTION)) { - createDb(); + createDb(testingStatus == DatabaseTestResult.DB_DOES_NOT_EXIST); } } @@ -750,6 +773,7 @@ public class EamDbSettingsDialog extends JDialog { UNTESTED, CONNECTION_FAILED, SCHEMA_INVALID, + DB_DOES_NOT_EXIST, TESTEDOK; } From 2c744bad486b6fa74b2573ef053a2055d5185ad1 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Thu, 31 Aug 2017 13:29:17 -0400 Subject: [PATCH 2/3] Cleanup --- .../centralrepository/datamodel/PostgresEamDbSettings.java | 3 +-- .../centralrepository/datamodel/SqliteEamDbSettings.java | 3 +-- .../centralrepository/optionspanel/EamDbSettingsDialog.java | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java index 96a2feb4cf..7220e1dd56 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDbSettings.java @@ -484,8 +484,7 @@ public final class PostgresEamDbSettings { } finally { EamDbUtil.closeConnection(conn); } - return false; // testing temp temp - //return true; + return true; } public boolean insertDefaultDatabaseContent() { diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java index a5221f130a..642ee8dc2e 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java @@ -429,8 +429,7 @@ public final class SqliteEamDbSettings { } finally { EamDbUtil.closeConnection(conn); } - //return true; - return false; // temp testing + return true; } public boolean insertDefaultDatabaseContent() { diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java index 548053bd84..799ca884e7 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java @@ -410,7 +410,7 @@ public class EamDbSettingsDialog extends JDialog { "EamDbSettingsDialog.okButton.errorMsg.text=Please restart Autopsy to begin using the new database platform.", "EamDbSettingsDialog.okButton.connectionErrorMsg.text=Failed to connect to Central Repository database.", "EamDbSettingsDialog.okButton.corruptDatabaseExists.title=Error Loading Database", - "EamDbSettingsDialog.okButton.corruptDatabaseExists.message=Database exists but is not the right format. Manually delete it or choose a different path.", + "EamDbSettingsDialog.okButton.corruptDatabaseExists.message=Database exists but is not the right format. Manually delete it or choose a different path (if applicable).", "EamDbSettingsDialog.okButton.createDbDialog.title=Database Does Not Exist", "EamDbSettingsDialog.okButton.createDbDialog.message=Database does not exist, would you like to create it?", "EamDbSettingsDialog.okButton.databaseConnectionFailed.title=Database Connection Failed", From 2f4a40d95f4e730bc5694de17c02413817f158cd Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Thu, 31 Aug 2017 14:00:21 -0400 Subject: [PATCH 3/3] Cleanup --- .../datamodel/SqliteEamDbSettings.java | 20 ++++++++++--------- .../optionspanel/EamDbSettingsDialog.java | 8 ++++---- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java index 642ee8dc2e..3910c00ab1 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDbSettings.java @@ -110,16 +110,18 @@ public final class SqliteEamDbSettings { ModuleSettings.setConfigSetting("CentralRepository", "db.badTags", String.join(",", badTags)); // NON-NLS } + /** + * Verify that the db file exists. + * + * @return true if exists, else false + */ public boolean dbFileExists() { - //if(dbDirectoryExists()){ - File dbFile = new File(getFileNameWithPath()); - if(! dbFile.exists()){ - return false; - } - // It's unlikely, but make sure the file isn't actually a directory - return ( ! dbFile.isDirectory()); - //} - //return false; + File dbFile = new File(getFileNameWithPath()); + if(! dbFile.exists()){ + return false; + } + // It's unlikely, but make sure the file isn't actually a directory + return ( ! dbFile.isDirectory()); } /** diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java index 799ca884e7..d34efbb9c9 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java @@ -354,7 +354,7 @@ public class EamDbSettingsDialog extends JDialog { @Messages({"EamDbSettingsDialog.okButton.createDbError.title=Unable to Create Database", "EamDbSettingsDialog.okButton.createSQLiteDbError.message=Unable to create SQLite Database, please ensure location exists and you have write permissions and try again.", "EamDbSettingsDialog.okButton.createPostgresDbError.message=Unable to create Postgres Database, please ensure address, port, and login credentials are correct for Postgres server and try again."}) - private void createDb(boolean removeIncompleteDatabase) { + private void createDb() { boolean result = false; boolean dbCreated = true; switch (selectedPlatform) { @@ -368,7 +368,7 @@ public class EamDbSettingsDialog extends JDialog { } if (!result) { // Remove the incomplete database - if(dbCreated && removeIncompleteDatabase){ + if(dbCreated){ dbSettingsPostgres.deleteDatabase(); } @@ -389,7 +389,7 @@ public class EamDbSettingsDialog extends JDialog { && dbSettingsSqlite.insertDefaultDatabaseContent(); } if (!result) { - if(dbCreated && removeIncompleteDatabase){ + if(dbCreated){ dbSettingsSqlite.deleteDatabase(); } @@ -435,7 +435,7 @@ public class EamDbSettingsDialog extends JDialog { Bundle.EamDbSettingsDialog_okButton_createDbDialog_message(), Bundle.EamDbSettingsDialog_okButton_createDbDialog_title(), JOptionPane.YES_NO_OPTION)) { - createDb(testingStatus == DatabaseTestResult.DB_DOES_NOT_EXIST); + createDb(); } }