diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java
index 3e64fcd058..289ed544cc 100644
--- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java
@@ -38,7 +38,6 @@ import java.util.TimeZone;
import java.util.logging.Level;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
-import org.openide.util.Exceptions;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;
@@ -46,6 +45,7 @@ import org.openide.util.actions.CallableSystemAction;
import org.openide.util.actions.SystemAction;
import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.casemodule.services.Services;
+import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.autopsy.corecomponentinterfaces.CoreComponentControl;
import org.sleuthkit.autopsy.coreutils.FileUtil;
import org.sleuthkit.autopsy.coreutils.Logger;
@@ -73,7 +73,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
public static final String propStartup = "LBL_StartupDialog"; //NON-NLS
// pcs is initialized in CaseListener constructor
private static final PropertyChangeSupport pcs = new PropertyChangeSupport(Case.class);
-
+
/**
* Events that the case module will fire. Event listeners can get the event
* name by using String returned by toString() method on a specific event.
@@ -150,6 +150,17 @@ public class Case implements SleuthkitCase.ErrorObserver {
return (otherName == null) ? false : caseName.equals(otherName);
}
+ public static CaseType fromString(String text) {
+ if (text != null) {
+ for (CaseType c : CaseType.values()) {
+ if (text.equalsIgnoreCase(c.caseName)) {
+ return c;
+ }
+ }
+ }
+ return null;
+ }
+
@Override
public String toString() {
return caseName;
@@ -169,6 +180,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
static final String CASE_EXTENSION = "aut"; //NON-NLS
static final String CASE_DOT_EXTENSION = "." + CASE_EXTENSION;
private CaseType caseType;
+ private boolean isRemote=false;
// we cache if the case has data in it yet since a few places ask for it and we dont' need to keep going to DB
private boolean hasData = false;
@@ -176,7 +188,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
/**
* Constructor for the Case class
*/
- private Case(String name, String number, String examiner, String configFilePath, XMLCaseManagement xmlcm, SleuthkitCase db) {
+ private Case(String name, String number, String examiner, String configFilePath, XMLCaseManagement xmlcm, SleuthkitCase db, boolean isRemote) {
this.name = name;
this.number = number;
this.examiner = examiner;
@@ -184,6 +196,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
this.xmlcm = xmlcm;
this.db = db;
this.services = new Services(db);
+ this.isRemote = isRemote;
db.addErrorObserver(this);
}
@@ -305,6 +318,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
public static void create(String caseDir, String caseName, String caseNumber, String examiner, CaseType caseType) throws CaseActionException {
logger.log(Level.INFO, "Creating new case.\ncaseDir: {0}\ncaseName: {1}", new Object[]{caseDir, caseName}); //NON-NLS
+ boolean isRemote=false;
// create case directory if it doesn't already exist.
if (new File(caseDir).exists() == false) {
Case.createCaseDirectory(caseDir);
@@ -318,9 +332,11 @@ public class Case implements SleuthkitCase.ErrorObserver {
// figure out the database name
if (caseType == CaseType.LOCAL) {
dbName = caseDir + File.separator + "autopsy.db"; //NON-NLS
+ isRemote=false;
} else if (caseType == CaseType.SHARED) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");
dbName = caseName + "_" + dateFormat.format(new Date());
+ isRemote=true;
}
xmlcm.create(caseDir, caseName, examiner, caseNumber, caseType, dbName); // create a new XML config file
@@ -329,15 +345,14 @@ public class Case implements SleuthkitCase.ErrorObserver {
SleuthkitCase db = null;
try {
- db = SleuthkitCase.newCase(dbName); /// KDM
+ db = SleuthkitCase.newCase(dbName); /// KDM this is where newcasewizardpanel2 calls.
} 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);
}
- Case newCase = new Case(caseName, caseNumber, examiner, configFilePath, xmlcm, db);
-
+ Case newCase = new Case(caseName, caseNumber, examiner, configFilePath, xmlcm, db, isRemote);
changeCase(newCase);
}
@@ -350,7 +365,7 @@ public class Case implements SleuthkitCase.ErrorObserver {
*/
public static void open(String configFilePath) throws CaseActionException {
logger.log(Level.INFO, "Opening case.\nconfigFilePath: {0}", configFilePath); //NON-NLS
-
+ boolean isRemote=false;
try {
XMLCaseManagement xmlcm = new XMLCaseManagement();
@@ -360,25 +375,43 @@ public class Case implements SleuthkitCase.ErrorObserver {
String caseName = xmlcm.getCaseName();
String caseNumber = xmlcm.getCaseNumber();
String examiner = xmlcm.getCaseExaminer();
- // if the caseName is "", case / config file can't be opened
- if (caseName.equals("")) {
- throw new CaseActionException(NbBundle.getMessage(Case.class, "Case.open.exception.blankCase.msg"));
- }
-
+ CaseType caseType = xmlcm.getCaseType();
String caseDir = xmlcm.getCaseDirectory();
- String dbPath = caseDir + File.separator + "autopsy.db"; //NON-NLS
- SleuthkitCase db = SleuthkitCase.openCase(dbPath); // KDM
- if (null != db.getBackupDatabasePath()) {
- JOptionPane.showMessageDialog(null,
- NbBundle.getMessage(Case.class, "Case.open.msgDlg.updated.msg",
- db.getBackupDatabasePath()),
- NbBundle.getMessage(Case.class, "Case.open.msgDlg.updated.title"),
- JOptionPane.INFORMATION_MESSAGE);
+ SleuthkitCase db;
+
+ if (caseType == CaseType.LOCAL) {
+ // if the caseName is "", case / config file can't be opened
+ isRemote=false;
+ if (caseName.equals("")) {
+ throw new CaseActionException(NbBundle.getMessage(Case.class, "Case.open.exception.blankCase.msg"));
+ }
+
+ String dbPath = caseDir + File.separator + "autopsy.db"; //NON-NLS
+ db = SleuthkitCase.openCase(dbPath); // KDM
+ if (null != db.getBackupDatabasePath()) {
+ JOptionPane.showMessageDialog(null,
+ NbBundle.getMessage(Case.class, "Case.open.msgDlg.updated.msg",
+ db.getBackupDatabasePath()),
+ NbBundle.getMessage(Case.class, "Case.open.msgDlg.updated.title"),
+ JOptionPane.INFORMATION_MESSAGE);
+ }
+ }
+ else {
+ isRemote=true;
+ CaseDbConnectionInfo info = UserPreferences.getDatabaseConnectionInfo();
+ db = SleuthkitCase.openCase(xmlcm.getDatabaseName(), info); // KDM
+ if (null != db.getBackupDatabasePath()) {
+ JOptionPane.showMessageDialog(null,
+ NbBundle.getMessage(Case.class, "Case.open.msgDlg.updated.msg",
+ db.getBackupDatabasePath()),
+ NbBundle.getMessage(Case.class, "Case.open.msgDlg.updated.title"),
+ JOptionPane.INFORMATION_MESSAGE);
+ }
}
checkImagesExist(db);
- Case openedCase = new Case(caseName, caseNumber, examiner, configFilePath, xmlcm, db);
+ Case openedCase = new Case(caseName, caseNumber, examiner, configFilePath, xmlcm, db, isRemote);
changeCase(openedCase);
@@ -1227,4 +1260,12 @@ public class Case implements SleuthkitCase.ErrorObserver {
}
return hasData;
}
+
+ /**
+ * Returns true if the case is a remote case, false otherwise
+ * @return
+ */
+ public boolean isRemote() {
+ return isRemote;
+ }
}
\ No newline at end of file
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java
index ec850af83a..0c38e03c7f 100644
--- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java
@@ -29,6 +29,7 @@ import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.sleuthkit.autopsy.casemodule.Case.CaseType;
import org.sleuthkit.autopsy.core.UserPreferences;
+import org.sleuthkit.datamodel.CaseDbConnectionInfo;
/**
* The wizard panel for the new case creation.
@@ -45,19 +46,34 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener {
this.wizPanel = wizPanel;
caseNameTextField.getDocument().addDocumentListener(this);
caseParentDirTextField.getDocument().addDocumentListener(this);
- boolean databaseConnectionSettingsOkay = true; /// KDM this becomes a static call in the TSK code.
- // if we cannot connect to the shared database, don't present the option
- // but do not change the setting stored in the preferences file
- if (true == databaseConnectionSettingsOkay) {
- if (UserPreferences.newCaseType() == CaseType.LOCAL.ordinal()) {
- rbLocalCase.setSelected(true);
- } else {
- rbSharedCase.setSelected(true);
- }
- } else {
+ CaseDbConnectionInfo info = UserPreferences.getDatabaseConnectionInfo();
+ /// KDM TODO: When we have a way to validate that we can actually talk to the remote DB (settings are correct), use it.
+ /// The following will be set true or false depending upon if we can talk to it.
+ boolean remoteDatabaseConnectionSettingsOkay = true;
+ if (info.getDbType() == CaseDbConnectionInfo.DbType.UNKNOWN) {
rbLocalCase.setSelected(true);
rbLocalCase.setEnabled(false);
+ rbLocalCase.setVisible(false);
rbSharedCase.setEnabled(false);
+ rbSharedCase.setVisible(false);
+ } else {
+ // if we cannot connect to the shared database, don't present the option
+ // but do not change the setting stored in the preferences file
+ rbLocalCase.setEnabled(true);
+ rbSharedCase.setEnabled(true);
+ rbLocalCase.setVisible(true);
+ rbSharedCase.setVisible(true);
+ if (true == remoteDatabaseConnectionSettingsOkay) {
+ if (UserPreferences.newCaseType() == CaseType.LOCAL.ordinal()) {
+ rbLocalCase.setSelected(true);
+ } else {
+ rbSharedCase.setSelected(true);
+ }
+ } else {
+ rbLocalCase.setSelected(true);
+ rbLocalCase.setEnabled(false);
+ rbSharedCase.setEnabled(false);
+ }
}
}
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel1.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel1.java
index 969a8a0433..cda7baa037 100644
--- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel1.java
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel1.java
@@ -33,7 +33,6 @@ import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.WizardDescriptor;
import org.openide.WizardValidationException;
-import org.openide.util.Exceptions;
import org.openide.util.HelpCtx;
import org.sleuthkit.autopsy.casemodule.Case.CaseType;
import org.sleuthkit.autopsy.core.UserPreferences;
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/XMLCaseManagement.java b/Core/src/org/sleuthkit/autopsy/casemodule/XMLCaseManagement.java
index 96bc930b1e..e751be33c9 100644
--- a/Core/src/org/sleuthkit/autopsy/casemodule/XMLCaseManagement.java
+++ b/Core/src/org/sleuthkit/autopsy/casemodule/XMLCaseManagement.java
@@ -29,7 +29,6 @@ import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
-import org.openide.util.Exceptions;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.casemodule.Case.CaseType;
import org.sleuthkit.autopsy.coreutils.Logger;
@@ -202,14 +201,46 @@ import org.xml.sax.SAXException;
caseType = givenCaseType; // change this to change the xml file if needed
}
+ /**
+ * Gets the case Type from the document handler.
+ * Defaults to local if it can't figure it out.
+ * @return caseType from the document handler
+ */
+ public CaseType getCaseType() {
+ try {
+ if (doc == null) {
+ return CaseType.LOCAL;
+ } else {
+ Element nameElement = (Element) getCaseElement().getElementsByTagName(CASE_TYPE).item(0);
+ return CaseType.fromString(nameElement.getTextContent());
+ }
+ } catch (Exception ex) {
+ return CaseType.LOCAL;
+ }
+ }
+
/**
* Sets the database name internally (on local variable in this class)
*
* @param givenDbName the new db name
*/
- private void setDbName(String givenDbName) {
+ private void setDatabaseName(String givenDbName) {
dbName= givenDbName; // change this to change the xml file if needed
}
+
+ /**
+ * Gets the database name from the document handler
+ *
+ * @return the database name
+ */
+ public String getDatabaseName() {
+ if (doc == null) {
+ return "";
+ } else {
+ Element nameElement = (Element) getCaseElement().getElementsByTagName(DATABASE_NAME).item(0);
+ return nameElement.getTextContent();
+ }
+ }
/**
* Sets the examiner name internally (on local variable in this class)
@@ -478,7 +509,7 @@ import org.xml.sax.SAXException;
setExaminer(examiner);
setNumber(caseNumber);
setCaseType(caseType);
- setDbName(dbName);
+ setDatabaseName(dbName);
DocumentBuilder docBuilder;
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
diff --git a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java
index cab099709f..2d92ac6814 100755
--- a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java
+++ b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java
@@ -21,6 +21,8 @@ package org.sleuthkit.autopsy.core;
import java.util.prefs.PreferenceChangeListener;
import java.util.prefs.Preferences;
import org.openide.util.NbPreferences;
+import org.sleuthkit.datamodel.CaseDbConnectionInfo;
+import org.sleuthkit.datamodel.CaseDbConnectionInfo.DbType;
/**
* Provides convenient access to a Preferences node for user preferences with
@@ -39,6 +41,7 @@ public final class UserPreferences {
public static final String EXTERNAL_DATABASE_NAME = "ExternalDatabaseName"; //NON-NLS
public static final String EXTERNAL_DATABASE_USER = "ExternalDatabaseUsername"; //NON-NLS
public static final String EXTERNAL_DATABASE_PASSWORD = "ExternalDatabasePassword"; //NON-NLS
+ public static final String EXTERNAL_DATABASE_TYPE = "ExternalDatabaseType"; //NON-NLS
public static final String NEW_CASE_TYPE = "NewCaseType"; //NON-NLS
// Prevent instantiation.
@@ -93,46 +96,29 @@ public final class UserPreferences {
preferences.putInt(NUMBER_OF_FILE_INGEST_THREADS, value);
}
- public static String hostNameOrIp() {
- return preferences.get(EXTERNAL_DATABASE_HOSTNAME_OR_IP, "");
+ public static CaseDbConnectionInfo getDatabaseConnectionInfo() {
+ DbType dbType;
+ try {
+ dbType = DbType.valueOf(preferences.get(EXTERNAL_DATABASE_TYPE, "UNKOWN"));
+ } catch (Exception ex) {
+ dbType = DbType.UNKNOWN;
+ }
+ return new CaseDbConnectionInfo(
+ preferences.get(EXTERNAL_DATABASE_HOSTNAME_OR_IP, ""),
+ preferences.get(EXTERNAL_DATABASE_PORTNUMBER, ""),
+ preferences.get(EXTERNAL_DATABASE_USER, ""),
+ preferences.get(EXTERNAL_DATABASE_PASSWORD, ""),
+ dbType);
}
- public static void setHostNameOrIp(String value) {
- preferences.put(EXTERNAL_DATABASE_HOSTNAME_OR_IP, value);
+ public static void setDatabaseConnectionInfo(CaseDbConnectionInfo connectionInfo) {
+ preferences.put(EXTERNAL_DATABASE_HOSTNAME_OR_IP, connectionInfo.getHost());
+ preferences.put(EXTERNAL_DATABASE_PORTNUMBER, connectionInfo.getPort());
+ preferences.put(EXTERNAL_DATABASE_USER, connectionInfo.getUserName());
+ preferences.put(EXTERNAL_DATABASE_PASSWORD, connectionInfo.getPassword());
+ preferences.put(EXTERNAL_DATABASE_TYPE, connectionInfo.getDbType().toString());
}
- public static String portNumber() {
- return preferences.get(EXTERNAL_DATABASE_PORTNUMBER, "");
- }
-
- public static void setPortNumber(String value) {
- preferences.put(EXTERNAL_DATABASE_PORTNUMBER, value);
- }
-
- public static String databaseName() {
- return preferences.get(EXTERNAL_DATABASE_NAME, "");
- }
-
- public static void setDatabaseName(String value) {
- preferences.put(EXTERNAL_DATABASE_NAME, value);
- }
-
- public static String userName() {
- return preferences.get(EXTERNAL_DATABASE_USER, "");
- }
-
- public static void setUserName(String value) {
- preferences.put(EXTERNAL_DATABASE_USER, value);
- }
-
- public static String password() {
- return preferences.get(EXTERNAL_DATABASE_PASSWORD, "");
- }
-
- public static void setPassword(String value) {
- preferences.put(EXTERNAL_DATABASE_PASSWORD, value);
- }
-
public static int newCaseType() {
return preferences.getInt(NEW_CASE_TYPE, 0);
}
diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyDatabasePanel.form b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyDatabasePanel.form
new file mode 100644
index 0000000000..b6477b52b3
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyDatabasePanel.form
@@ -0,0 +1,166 @@
+
+
+
diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyDatabasePanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyDatabasePanel.java
new file mode 100644
index 0000000000..7c8bc72db5
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyDatabasePanel.java
@@ -0,0 +1,269 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.sleuthkit.autopsy.corecomponents;
+
+import java.awt.Color;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import org.sleuthkit.datamodel.CaseDbConnectionInfo;
+import org.sleuthkit.datamodel.CaseDbConnectionInfo.DbType;
+import org.sleuthkit.autopsy.core.UserPreferences;
+
+public class AutopsyDatabasePanel extends javax.swing.JPanel {
+
+ private AutopsyDatabasePanelController controller;
+ private TextBoxChangedListener textBoxChangedListener;
+
+ /**
+ * Creates new form AutopsyDatabasePanel
+ */
+ public AutopsyDatabasePanel(AutopsyDatabasePanelController theController) {
+ initComponents();
+ controller = theController;
+
+ TextPrompt tpHostnameOrIp = new TextPrompt("Hostname or IP Address", tbHostnameOrIp);
+ TextPrompt tpPortNumber = new TextPrompt("Port Number", tbPortNumber);
+ TextPrompt tpUsername = new TextPrompt("User Name", tbUsername);
+ TextPrompt tpPassword = new TextPrompt("Password", tbPassword);
+
+ tpHostnameOrIp.setForeground(Color.LIGHT_GRAY);
+ tpPortNumber.setForeground(Color.LIGHT_GRAY);
+ tpUsername.setForeground(Color.LIGHT_GRAY);
+ tpPassword.setForeground(Color.LIGHT_GRAY);
+
+ float alpha = 0.9f; // Mostly opaque
+ tpHostnameOrIp.changeAlpha(alpha);
+ tpPortNumber.changeAlpha(alpha);
+ tpUsername.changeAlpha(alpha);
+ tpPassword.changeAlpha(alpha);
+
+ setNetworkDbEnabled(cbExternalDbEnabled.isSelected());
+
+ /// Register for notifications when the text boxes get updated
+ textBoxChangedListener = new TextBoxChangedListener();
+ tbHostnameOrIp.getDocument().addDocumentListener(textBoxChangedListener);
+ tbPortNumber.getDocument().addDocumentListener(textBoxChangedListener);
+ tbUsername.getDocument().addDocumentListener(textBoxChangedListener);
+ tbPassword.getDocument().addDocumentListener(textBoxChangedListener);
+ }
+
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
+ */
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ jPanel1 = new javax.swing.JPanel();
+ tbHostnameOrIp = new javax.swing.JTextField();
+ tbPortNumber = new javax.swing.JTextField();
+ tbUsername = new javax.swing.JTextField();
+ tbPassword = new javax.swing.JPasswordField();
+ cbExternalDbEnabled = new javax.swing.JCheckBox();
+ lbOops = new javax.swing.JLabel();
+
+ jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
+
+ tbHostnameOrIp.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
+ tbHostnameOrIp.setText(org.openide.util.NbBundle.getMessage(AutopsyDatabasePanel.class, "AutopsyDatabasePanel.tbHostnameOrIp.text")); // NOI18N
+ tbHostnameOrIp.setToolTipText(org.openide.util.NbBundle.getMessage(AutopsyDatabasePanel.class, "AutopsyDatabasePanel.tbHostnameOrIp.toolTipText")); // NOI18N
+
+ tbPortNumber.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
+ tbPortNumber.setText(org.openide.util.NbBundle.getMessage(AutopsyDatabasePanel.class, "AutopsyDatabasePanel.tbPortNumber.text")); // NOI18N
+ tbPortNumber.setToolTipText(org.openide.util.NbBundle.getMessage(AutopsyDatabasePanel.class, "AutopsyDatabasePanel.tbPortNumber.toolTipText")); // NOI18N
+
+ tbUsername.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
+ tbUsername.setText(org.openide.util.NbBundle.getMessage(AutopsyDatabasePanel.class, "AutopsyDatabasePanel.tbUsername.text")); // NOI18N
+ tbUsername.setToolTipText(org.openide.util.NbBundle.getMessage(AutopsyDatabasePanel.class, "AutopsyDatabasePanel.tbUsername.toolTipText")); // NOI18N
+
+ tbPassword.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
+ tbPassword.setText(org.openide.util.NbBundle.getMessage(AutopsyDatabasePanel.class, "AutopsyDatabasePanel.tbPassword.text")); // NOI18N
+ tbPassword.setToolTipText(org.openide.util.NbBundle.getMessage(AutopsyDatabasePanel.class, "AutopsyDatabasePanel.tbPassword.toolTipText")); // NOI18N
+
+ org.openide.awt.Mnemonics.setLocalizedText(cbExternalDbEnabled, org.openide.util.NbBundle.getMessage(AutopsyDatabasePanel.class, "AutopsyDatabasePanel.cbExternalDbEnabled.text")); // NOI18N
+ cbExternalDbEnabled.addItemListener(new java.awt.event.ItemListener() {
+ public void itemStateChanged(java.awt.event.ItemEvent evt) {
+ cbExternalDbEnabledItemStateChanged(evt);
+ }
+ });
+
+ lbOops.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
+ lbOops.setForeground(new java.awt.Color(255, 0, 0));
+ org.openide.awt.Mnemonics.setLocalizedText(lbOops, org.openide.util.NbBundle.getMessage(AutopsyDatabasePanel.class, "AutopsyDatabasePanel.lbOops.text")); // NOI18N
+
+ javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
+ jPanel1.setLayout(jPanel1Layout);
+ jPanel1Layout.setHorizontalGroup(
+ jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanel1Layout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(jPanel1Layout.createSequentialGroup()
+ .addComponent(cbExternalDbEnabled)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 50, Short.MAX_VALUE)
+ .addComponent(lbOops, javax.swing.GroupLayout.PREFERRED_SIZE, 232, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addComponent(tbHostnameOrIp)
+ .addComponent(tbPortNumber)
+ .addComponent(tbUsername)
+ .addComponent(tbPassword))
+ .addContainerGap())
+ );
+ jPanel1Layout.setVerticalGroup(
+ jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
+ .addGap(6, 6, 6)
+ .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(cbExternalDbEnabled)
+ .addComponent(lbOops, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(tbHostnameOrIp, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(tbPortNumber, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(tbUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(tbPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addContainerGap())
+ );
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addContainerGap(67, Short.MAX_VALUE))
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addContainerGap(133, Short.MAX_VALUE))
+ );
+ }// //GEN-END:initComponents
+
+ /**
+ * Enables/disables the network database settings, based upon input provided
+ *
+ * @param enabled true means enable, false means disable
+ */
+ private void setNetworkDbEnabled(boolean enabled) {
+ tbHostnameOrIp.setEnabled(enabled);
+ tbPortNumber.setEnabled(enabled);
+ tbUsername.setEnabled(enabled);
+ tbPassword.setEnabled(enabled);
+ }
+
+ private void cbExternalDbEnabledItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbExternalDbEnabledItemStateChanged
+ setNetworkDbEnabled(cbExternalDbEnabled.isSelected());
+ controller.changed();
+ }//GEN-LAST:event_cbExternalDbEnabledItemStateChanged
+
+ void load() {
+ CaseDbConnectionInfo info = UserPreferences.getDatabaseConnectionInfo();
+ tbHostnameOrIp.setText(info.getHost());
+ tbPortNumber.setText(info.getPort());
+ tbUsername.setText(info.getUserName());
+ tbPassword.setText(info.getPassword());
+ if (info.getDbType() == DbType.UNKNOWN) {
+ cbExternalDbEnabled.setSelected(false);
+ } else {
+ cbExternalDbEnabled.setSelected(true);
+ }
+
+ }
+
+ void store() {
+
+ DbType dbType = DbType.UNKNOWN;
+
+ if (cbExternalDbEnabled.isSelected()) {
+ dbType = DbType.POSTGRESQL;
+ }
+
+ CaseDbConnectionInfo info = new CaseDbConnectionInfo(
+ tbHostnameOrIp.getText(),
+ tbPortNumber.getText(),
+ tbUsername.getText(),
+ new String(tbPassword.getPassword()),
+ dbType);
+
+ UserPreferences.setDatabaseConnectionInfo(info);
+ }
+
+ /**
+ * Validates that the form is filled out correctly for our usage.
+ *
+ * @return true if it's okay, false otherwise.
+ */
+ boolean valid() {
+ boolean result = false;
+ String text = "";
+ if (cbExternalDbEnabled.isSelected()) {
+ try {
+ if (tbHostnameOrIp.getText().isEmpty()
+ || tbPortNumber.getText().isEmpty()
+ || tbUsername.getText().isEmpty()
+ || tbPassword.getPassword().length == 0) {
+ // We don't even have everything filled out
+ result = false;
+ text = "Fill in all values";
+ } else {
+ int value = Integer.parseInt(tbPortNumber.getText());
+ if (value < 0 || value > 65535) { // valid port numbers
+ result = false; /// port number is invalid
+ text = "Invalid port number";
+ } else {
+ result = true;
+ }
+ }
+ } catch (Exception ex) {
+ result = false;
+ text = "Invalid port number";
+ }
+ } else {
+ result = true;
+ }
+ lbOops.setText(text);
+ return result;
+ }
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JCheckBox cbExternalDbEnabled;
+ private javax.swing.JPanel jPanel1;
+ private javax.swing.JLabel lbOops;
+ private javax.swing.JTextField tbHostnameOrIp;
+ private javax.swing.JPasswordField tbPassword;
+ private javax.swing.JTextField tbPortNumber;
+ private javax.swing.JTextField tbUsername;
+ // End of variables declaration//GEN-END:variables
+
+ /**
+ * Used to listen for changes in text boxes. It lets the panel know things
+ * have been updated and that validation needs to happen.
+ */
+ class TextBoxChangedListener implements DocumentListener {
+
+ @Override
+ public void changedUpdate(DocumentEvent e) {
+ controller.changed();
+ }
+
+ @Override
+ public void insertUpdate(DocumentEvent e) {
+ controller.changed();
+ }
+
+ @Override
+
+ public void removeUpdate(DocumentEvent e) {
+ controller.changed();
+ }
+ }
+}
diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyDatabasePanelController.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyDatabasePanelController.java
new file mode 100644
index 0000000000..767a222b7e
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyDatabasePanelController.java
@@ -0,0 +1,130 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2013-2014 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.corecomponents;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import javax.swing.JComponent;
+import org.netbeans.spi.options.OptionsPanelController;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
+import java.util.logging.Level;
+import org.sleuthkit.autopsy.coreutils.Logger;
+
+@OptionsPanelController.TopLevelRegistration(categoryName = "#OptionsCategory_Name_Database_Settings",
+ iconBase = "org/sleuthkit/autopsy/modules/hashdatabase/options_icon.png",
+ position = 2,
+ keywords = "#OptionsCategory_Keywords_Database_Options",
+ keywordsCategory = "Database")
+public final class AutopsyDatabasePanelController extends OptionsPanelController {
+
+ private AutopsyDatabasePanel panel;
+ private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
+ private boolean changed;
+ private static final Logger logger = Logger.getLogger(AutopsyDatabasePanelController.class.getName());
+
+ @Override
+ public void update() {
+ getPanel().load();
+ changed = false;
+ }
+
+ @Override
+ public void applyChanges() {
+ getPanel().store();
+ changed = false;
+ }
+
+ @Override
+ public void cancel() {
+ }
+
+ @Override
+ public boolean isValid() {
+ return getPanel().valid();
+ }
+
+ @Override
+ public boolean isChanged() {
+ return changed;
+ }
+
+ @Override
+ public HelpCtx getHelpCtx() {
+ return null;
+ }
+
+ @Override
+ public JComponent getComponent(Lookup masterLookup) {
+ return getPanel();
+ }
+
+ @Override
+ public void addPropertyChangeListener(PropertyChangeListener l) {
+ if (pcs.getPropertyChangeListeners().length == 0) {
+ pcs.addPropertyChangeListener(l);
+ }
+ }
+
+ @Override
+ public void removePropertyChangeListener(PropertyChangeListener l) {
+ /**
+ * Note the NetBeans Framework does not appear to call this at all We
+ * are using NetBeans 7.3.1 Build 201306052037. Perhaps in a future
+ * version of the Framework this will be resolved, but for now, simply
+ * don't unregister anything and add one time only in the
+ * addPropertyChangeListener() method above.
+ */
+ }
+
+ private AutopsyDatabasePanel getPanel() {
+ if (panel == null) {
+ panel = new AutopsyDatabasePanel(this);
+ }
+ return panel;
+ }
+
+ void changed() {
+ if (!changed) {
+ changed = true;
+
+ try {
+ pcs.firePropertyChange(OptionsPanelController.PROP_CHANGED, false, true);
+ } catch (Exception e) {
+ logger.log(Level.SEVERE, "GeneralOptionsPanelController listener threw exception", e); //NON-NLS
+ MessageNotifyUtil.Notify.show(
+ NbBundle.getMessage(this.getClass(), "GeneralOptionsPanelController.moduleErr"),
+ NbBundle.getMessage(this.getClass(), "GeneralOptionsPanelController.moduleErr.msg"),
+ MessageNotifyUtil.MessageType.ERROR);
+ }
+ }
+
+ try {
+ pcs.firePropertyChange(OptionsPanelController.PROP_VALID, null, null);
+ } catch (Exception e) {
+ logger.log(Level.SEVERE, "GeneralOptionsPanelController listener threw exception", e); //NON-NLS
+ MessageNotifyUtil.Notify.show(
+ NbBundle.getMessage(this.getClass(), "GeneralOptionsPanelController.moduleErr"),
+ NbBundle.getMessage(this.getClass(), "GeneralOptionsPanelController.moduleErr.msg"),
+ MessageNotifyUtil.MessageType.ERROR);
+ }
+ }
+}
diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form
index 82e3c9383b..153a137748 100644
--- a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form
+++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.form
@@ -27,6 +27,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -40,31 +55,9 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -96,11 +89,7 @@
-
-
-
-
-
+
@@ -216,105 +205,5 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java
index 5409d94c32..5dc357fbc7 100644
--- a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java
@@ -18,7 +18,6 @@
*/
package org.sleuthkit.autopsy.corecomponents;
-import java.awt.Color;
import javax.swing.DefaultComboBoxModel;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.core.UserPreferences;
@@ -68,28 +67,8 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
recommendedFileIngestThreadCount = 1;
}
numberOfFileIngestThreadsComboBox.setModel(new DefaultComboBoxModel<>(fileIngestThreadCountChoices));
- restartRequiredLabel.setText(NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.restartRequiredLabel.text", recommendedFileIngestThreadCount));
-
- TextPrompt tpHostnameOrIp = new TextPrompt("Hostname or IP Address", tbHostnameOrIp);
- TextPrompt tpPortNumber = new TextPrompt("Port Number", tbPortNumber);
- TextPrompt tpDatabaseName = new TextPrompt("Database Name", tbDatabaseName);
- TextPrompt tpUsername = new TextPrompt("User Name", tbUsername);
- TextPrompt tpPassword = new TextPrompt("Password", tbPassword);
-
- tpHostnameOrIp.setForeground(Color.LIGHT_GRAY);
- tpPortNumber.setForeground(Color.LIGHT_GRAY);
- tpDatabaseName.setForeground(Color.LIGHT_GRAY);
- tpUsername.setForeground(Color.LIGHT_GRAY);
- tpPassword.setForeground(Color.LIGHT_GRAY);
-
- float alpha=0.9f; // Mostly opaque
- tpHostnameOrIp.changeAlpha(alpha);
- tpPortNumber.changeAlpha(alpha);
- tpDatabaseName.changeAlpha(alpha);
- tpUsername.changeAlpha(alpha);
- tpPassword.changeAlpha(alpha);
-
-// TODO listen to changes in form fields and call controller.changed()
+ restartRequiredLabel.setText(NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.restartRequiredLabel.text", recommendedFileIngestThreadCount));
+ // TODO listen to changes in form fields and call controller.changed()
}
void load() {
@@ -101,12 +80,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
boolean useLocalTime = UserPreferences.displayTimesInLocalTime();
useLocalTimeRB.setSelected(useLocalTime);
useGMTTimeRB.setSelected(!useLocalTime);
- numberOfFileIngestThreadsComboBox.setSelectedItem(UserPreferences.numberOfFileIngestThreads());
- tbHostnameOrIp.setText(UserPreferences.hostNameOrIp());
- tbPortNumber.setText(UserPreferences.portNumber());
- tbDatabaseName.setText(UserPreferences.databaseName());
- tbUsername.setText(UserPreferences.userName());
- tbPassword.setText(UserPreferences.password());
+ numberOfFileIngestThreadsComboBox.setSelectedItem(UserPreferences.numberOfFileIngestThreads());
}
void store() {
@@ -115,11 +89,6 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
UserPreferences.setHideKnownFilesInViewsTree(viewsHideKnownCB.isSelected());
UserPreferences.setDisplayTimesInLocalTime(useLocalTimeRB.isSelected());
UserPreferences.setNumberOfFileIngestThreads((Integer) numberOfFileIngestThreadsComboBox.getSelectedItem());
- UserPreferences.setHostNameOrIp(tbHostnameOrIp.getText());
- UserPreferences.setPortNumber(tbPortNumber.getText());
- UserPreferences.setDatabaseName(tbDatabaseName.getText());
- UserPreferences.setUserName(tbUsername.getText());
- UserPreferences.setPassword(new String(tbPassword.getPassword()));
}
boolean valid() {
@@ -149,13 +118,6 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
jLabelNumThreads = new javax.swing.JLabel();
numberOfFileIngestThreadsComboBox = new javax.swing.JComboBox();
restartRequiredLabel = new javax.swing.JLabel();
- jPanel1 = new javax.swing.JPanel();
- tbHostnameOrIp = new javax.swing.JTextField();
- tbPortNumber = new javax.swing.JTextField();
- tbDatabaseName = new javax.swing.JTextField();
- tbUsername = new javax.swing.JTextField();
- tbPassword = new javax.swing.JPasswordField();
- jLabel1 = new javax.swing.JLabel();
buttonGroup1.add(useBestViewerRB);
useBestViewerRB.setSelected(true);
@@ -188,54 +150,6 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
restartRequiredLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/warning16.png"))); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(restartRequiredLabel, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.restartRequiredLabel.text")); // NOI18N
- jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
-
- tbHostnameOrIp.setText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tbHostnameOrIp.text")); // NOI18N
- tbHostnameOrIp.setToolTipText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tbHostnameOrIp.toolTipText")); // NOI18N
-
- tbPortNumber.setText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tbPortNumber.text")); // NOI18N
- tbPortNumber.setToolTipText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tbPortNumber.toolTipText")); // NOI18N
-
- tbDatabaseName.setText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tbDatabaseName.text")); // NOI18N
- tbDatabaseName.setToolTipText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tbDatabaseName.toolTipText")); // NOI18N
-
- tbUsername.setText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tbUsername.text")); // NOI18N
- tbUsername.setToolTipText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tbUsername.toolTipText")); // NOI18N
-
- tbPassword.setText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.tbPassword.text")); // NOI18N
-
- javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
- jPanel1.setLayout(jPanel1Layout);
- jPanel1Layout.setHorizontalGroup(
- jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(jPanel1Layout.createSequentialGroup()
- .addContainerGap()
- .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(tbHostnameOrIp)
- .addComponent(tbPortNumber)
- .addComponent(tbDatabaseName)
- .addComponent(tbUsername)
- .addComponent(tbPassword, javax.swing.GroupLayout.DEFAULT_SIZE, 316, Short.MAX_VALUE))
- .addContainerGap())
- );
- jPanel1Layout.setVerticalGroup(
- jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
- .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addComponent(tbHostnameOrIp, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(tbPortNumber, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(tbDatabaseName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(tbUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(tbPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addContainerGap())
- );
-
- org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.jLabel1.text")); // NOI18N
-
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
@@ -243,6 +157,18 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addGap(10, 10, 10)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(keepCurrentViewerRB)
+ .addComponent(useBestViewerRB)
+ .addComponent(dataSourcesHideKnownCB)
+ .addComponent(viewsHideKnownCB)
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(numberOfFileIngestThreadsComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGap(18, 18, 18)
+ .addComponent(restartRequiredLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addContainerGap())))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabelHideKnownFiles)
@@ -253,25 +179,8 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
.addComponent(useLocalTimeRB)
.addComponent(useGMTTimeRB)))
.addComponent(jLabelSelectFile)
- .addComponent(jLabelNumThreads)
- .addComponent(jLabel1))
- .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
- .addGroup(layout.createSequentialGroup()
- .addGap(10, 10, 10)
- .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(layout.createSequentialGroup()
- .addComponent(numberOfFileIngestThreadsComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addGap(18, 18, 18)
- .addComponent(restartRequiredLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 529, Short.MAX_VALUE)
- .addContainerGap())
- .addGroup(layout.createSequentialGroup()
- .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(keepCurrentViewerRB)
- .addComponent(useBestViewerRB)
- .addComponent(dataSourcesHideKnownCB)
- .addComponent(viewsHideKnownCB)
- .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addGap(0, 0, Short.MAX_VALUE))))))
+ .addComponent(jLabelNumThreads))
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -299,11 +208,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(numberOfFileIngestThreadsComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(restartRequiredLabel))
- .addGap(18, 18, 18)
- .addComponent(jLabel1)
- .addGap(4, 4, 4)
- .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addContainerGap(47, Short.MAX_VALUE))
+ .addContainerGap(155, Short.MAX_VALUE))
);
}// //GEN-END:initComponents
@@ -312,20 +217,13 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
private javax.swing.ButtonGroup buttonGroup3;
private javax.swing.ButtonGroup buttonGroupProcTimeOut;
private javax.swing.JCheckBox dataSourcesHideKnownCB;
- private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabelHideKnownFiles;
private javax.swing.JLabel jLabelNumThreads;
private javax.swing.JLabel jLabelSelectFile;
private javax.swing.JLabel jLabelTimeDisplay;
- private javax.swing.JPanel jPanel1;
private javax.swing.JRadioButton keepCurrentViewerRB;
private javax.swing.JComboBox numberOfFileIngestThreadsComboBox;
private javax.swing.JLabel restartRequiredLabel;
- private javax.swing.JTextField tbDatabaseName;
- private javax.swing.JTextField tbHostnameOrIp;
- private javax.swing.JPasswordField tbPassword;
- private javax.swing.JTextField tbPortNumber;
- private javax.swing.JTextField tbUsername;
private javax.swing.JRadioButton useBestViewerRB;
private javax.swing.JRadioButton useGMTTimeRB;
private javax.swing.JRadioButton useLocalTimeRB;
diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties
index 69b7e7acff..f5e47cb1f8 100644
--- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties
+++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties
@@ -137,7 +137,7 @@ AutopsyOptionsPanel.useGMTTimeRB.text=Use GMT
AutopsyOptionsPanel.useLocalTimeRB.text=Use local time zone
AutopsyOptionsPanel.keepCurrentViewerRB.toolTipText=For example, stay in Hex view when a JPEG is selected.
AutopsyOptionsPanel.keepCurrentViewerRB.text=Stay on the same file viewer
-AutopsyOptionsPanel.restartRequiredLabel.text=For this computer, a maximum of {0} file ingest threads should be used. Restart required to take effect.
+AutopsyOptionsPanel.restartRequiredLabel.text=For this computer, a maximum of {0} file ingest threads should be used. Application restart required to take effect.
AutopsyOptionsPanel.jLabelSelectFile.text=When selecting a file:
AutopsyOptionsPanel.jLabelHideKnownFiles.text=Hide known files (i.e. those in the NIST NSRL) in the:
AutopsyOptionsPanel.jLabelTimeDisplay.text=When displaying times:
@@ -145,13 +145,15 @@ AutopsyOptionsPanel.jLabelNumThreads.text=Number of threads to use for file inge
FXVideoPanel.progress.bufferingCancelled=media buffering was canceled
FXVideoPanel.progress.bufferingInterrupted=media buffering was interrupted
FXVideoPanel.progress.errorWritingVideoToDisk=Error writing video to disk
-AutopsyOptionsPanel.tbDatabaseName.text=
-AutopsyOptionsPanel.tbPortNumber.text=
-AutopsyOptionsPanel.tbHostnameOrIp.text=
-AutopsyOptionsPanel.tbUsername.text=
-AutopsyOptionsPanel.jLabel1.text=External Database Settings
-AutopsyOptionsPanel.tbUsername.toolTipText=User Name
-AutopsyOptionsPanel.tbDatabaseName.toolTipText=Database Name
-AutopsyOptionsPanel.tbPortNumber.toolTipText=Port Number
-AutopsyOptionsPanel.tbHostnameOrIp.toolTipText=Hostname or IP Address
-AutopsyOptionsPanel.tbPassword.text=
+OptionsCategory_Name_Database_Settings=External Database
+OptionsCategory_Keywords_Database_Options=Database Options
+AutopsyDatabasePanel.tbPassword.toolTipText=Enter the password here
+AutopsyDatabasePanel.tbPassword.text=
+AutopsyDatabasePanel.tbUsername.toolTipText=User Name
+AutopsyDatabasePanel.tbUsername.text=
+AutopsyDatabasePanel.tbPortNumber.toolTipText=Port Number
+AutopsyDatabasePanel.tbPortNumber.text=
+AutopsyDatabasePanel.tbHostnameOrIp.toolTipText=Hostname or IP Address
+AutopsyDatabasePanel.tbHostnameOrIp.text=
+AutopsyDatabasePanel.cbExternalDbEnabled.text=Use External Database
+AutopsyDatabasePanel.lbOops.text=