19 package org.sleuthkit.autopsy.corecomponents;
21 import java.awt.Color;
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import javax.swing.JTextField;
25 import javax.swing.event.DocumentEvent;
26 import javax.swing.event.DocumentListener;
27 import org.openide.util.NbBundle;
33 import java.awt.Cursor;
34 import java.util.logging.Level;
35 import javax.swing.ImageIcon;
36 import org.openide.util.ImageUtilities;
37 import org.openide.util.Lookup;
60 private final Collection<JTextField>
textBoxes =
new ArrayList<>();
74 controller = theController;
80 Collection<TextPrompt> textPrompts =
new ArrayList<>();
111 textBoxChangedListener =
new TextBoxChangedListener();
124 goodIcon =
new ImageIcon(ImageUtilities.loadImage(
"org/sleuthkit/autopsy/images/good.png",
false));
125 badIcon =
new ImageIcon(ImageUtilities.loadImage(
"org/sleuthkit/autopsy/images/bad.png",
false));
138 textPrompt.setForeground(Color.LIGHT_GRAY);
139 textPrompt.changeAlpha(alpha);
150 for (JTextField textField : textFields) {
151 textField.getDocument().addDocumentListener(listener);
160 @SuppressWarnings(
"unchecked")
168 tbDbPort =
new javax.swing.JTextField();
186 tbMsgPort =
new javax.swing.JTextField();
192 tbOops =
new javax.swing.JTextField();
218 bnTestDatabase.addActionListener(
new java.awt.event.ActionListener() {
219 public void actionPerformed(java.awt.event.ActionEvent evt) {
230 javax.swing.GroupLayout pnDatabaseSettingsLayout =
new javax.swing.GroupLayout(
pnDatabaseSettings);
232 pnDatabaseSettingsLayout.setHorizontalGroup(
233 pnDatabaseSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
234 .addGroup(pnDatabaseSettingsLayout.createSequentialGroup()
236 .addGroup(pnDatabaseSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
238 .addGroup(pnDatabaseSettingsLayout.createSequentialGroup()
240 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
243 .addComponent(
lbTestDatabase, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE))
247 .addGroup(pnDatabaseSettingsLayout.createSequentialGroup()
249 .addGap(0, 0, Short.MAX_VALUE)))
252 pnDatabaseSettingsLayout.setVerticalGroup(
253 pnDatabaseSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
254 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnDatabaseSettingsLayout.createSequentialGroup()
256 .addGroup(pnDatabaseSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
258 .addComponent(
lbTestDatabase, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
260 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
261 .addComponent(
tbDbHostname, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
262 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
263 .addComponent(
tbDbPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
264 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
265 .addComponent(
tbDbUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
266 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
267 .addComponent(
tbDbPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
268 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
269 .addComponent(
lbTestDbWarning, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
273 pnSolrSettings.setBorder(javax.swing.BorderFactory.createEtchedBorder());
286 bnTestSolr.addActionListener(
new java.awt.event.ActionListener() {
287 public void actionPerformed(java.awt.event.ActionEvent evt) {
297 javax.swing.GroupLayout pnSolrSettingsLayout =
new javax.swing.GroupLayout(
pnSolrSettings);
299 pnSolrSettingsLayout.setHorizontalGroup(
300 pnSolrSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
301 .addGroup(pnSolrSettingsLayout.createSequentialGroup()
303 .addGroup(pnSolrSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
305 .addGroup(pnSolrSettingsLayout.createSequentialGroup()
307 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
310 .addComponent(
lbTestSolr, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE))
312 .addGroup(pnSolrSettingsLayout.createSequentialGroup()
314 .addGap(0, 0, Short.MAX_VALUE)))
317 pnSolrSettingsLayout.setVerticalGroup(
318 pnSolrSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
319 .addGroup(pnSolrSettingsLayout.createSequentialGroup()
321 .addGroup(pnSolrSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
322 .addGroup(pnSolrSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
323 .addComponent(
bnTestSolr, javax.swing.GroupLayout.Alignment.TRAILING)
325 .addComponent(
lbTestSolr, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
326 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
327 .addComponent(
tbSolrHostname, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
328 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
329 .addComponent(
tbSolrPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
330 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
331 .addComponent(
lbTestSolrWarning, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
359 public void actionPerformed(java.awt.event.ActionEvent evt) {
369 javax.swing.GroupLayout pnMessagingSettingsLayout =
new javax.swing.GroupLayout(
pnMessagingSettings);
371 pnMessagingSettingsLayout.setHorizontalGroup(
372 pnMessagingSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
373 .addGroup(pnMessagingSettingsLayout.createSequentialGroup()
375 .addGroup(pnMessagingSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
377 .addGroup(pnMessagingSettingsLayout.createSequentialGroup()
379 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 229, Short.MAX_VALUE)
382 .addComponent(
lbTestMessageService, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE))
386 .addGroup(pnMessagingSettingsLayout.createSequentialGroup()
388 .addGap(0, 0, Short.MAX_VALUE)))
391 pnMessagingSettingsLayout.setVerticalGroup(
392 pnMessagingSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
393 .addGroup(pnMessagingSettingsLayout.createSequentialGroup()
395 .addGroup(pnMessagingSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
396 .addGroup(pnMessagingSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
399 .addComponent(
lbTestMessageService, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
400 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
401 .addComponent(
tbMsgHostname, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
402 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
403 .addComponent(
tbMsgPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
404 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
405 .addComponent(
tbMsgUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
406 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
407 .addComponent(
tbMsgPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
408 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
409 .addComponent(
lbTestMessageWarning, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
410 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
416 public void itemStateChanged(java.awt.event.ItemEvent evt) {
421 tbOops.setEditable(
false);
422 tbOops.setFont(
tbOops.getFont().deriveFont(
tbOops.getFont().getStyle() | java.awt.Font.BOLD, 12));
423 tbOops.setForeground(
new java.awt.Color(255, 0, 0));
427 javax.swing.GroupLayout pnOverallPanelLayout =
new javax.swing.GroupLayout(
pnOverallPanel);
429 pnOverallPanelLayout.setHorizontalGroup(
430 pnOverallPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
431 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnOverallPanelLayout.createSequentialGroup()
433 .addGroup(pnOverallPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING,
false)
434 .addGroup(pnOverallPanelLayout.createSequentialGroup()
436 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
438 .addComponent(
pnSolrSettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
439 .addComponent(
pnDatabaseSettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
440 .addComponent(
pnMessagingSettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
443 pnOverallPanelLayout.setVerticalGroup(
444 pnOverallPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
445 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnOverallPanelLayout.createSequentialGroup()
446 .addGroup(pnOverallPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
447 .addComponent(
tbOops, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
449 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
450 .addComponent(
pnDatabaseSettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
451 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
452 .addComponent(
pnSolrSettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
453 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
454 .addComponent(
pnMessagingSettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
455 .addContainerGap(39, Short.MAX_VALUE))
460 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
461 this.setLayout(layout);
462 layout.setHorizontalGroup(
463 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
464 .addComponent(
jScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 555, Short.MAX_VALUE)
466 layout.setVerticalGroup(
467 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
468 .addGroup(layout.createSequentialGroup()
470 .addComponent(
jScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 537, Short.MAX_VALUE)
482 for (JTextField textField : textFields) {
483 textField.setEnabled(enabled);
507 setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
509 CaseDbConnectionInfo info =
new CaseDbConnectionInfo(
516 SleuthkitCase.tryConnect(info);
519 }
catch (TskCoreException ex) {
523 setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
530 setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
534 port = Integer.parseInt(this.
tbMsgPort.getText().trim());
535 }
catch (NumberFormatException ex) {
554 setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
561 setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
565 if (kwsService != null) {
566 int port = Integer.parseInt(
tbSolrPort.getText().trim());
574 }
catch (NumberFormatException ex) {
581 setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
596 tbDbPort.setText(dbInfo.getPort().trim());
599 }
catch (UserPreferencesException ex) {
600 logger.log(Level.SEVERE,
"Error accessing case database connection info", ex);
604 MessageServiceConnectionInfo msgServiceInfo = UserPreferences.getMessageServiceConnectionInfo();
606 tbMsgPort.setText(Integer.toString(msgServiceInfo.getPort()));
609 }
catch (UserPreferencesException ex) {
610 logger.log(Level.SEVERE,
"Error accessing case database connection info", ex);
613 String indexingServerHost = UserPreferences.getIndexingServerHost().trim();
614 if (!indexingServerHost.isEmpty()) {
617 String indexingServerPort = UserPreferences.getIndexingServerPort().trim();
642 && !
tbDbPort.getText().trim().isEmpty()
667 || (
tbMsgPort.getText().trim().isEmpty())) {
672 boolean isUserSet = (
tbMsgUsername.getText().trim().isEmpty() ==
false);
674 return (isUserSet == isPwSet);
681 if (multiUserCasesEnabled ==
false) {
689 DbType dbType = DbType.POSTGRESQL;
690 CaseDbConnectionInfo info =
new CaseDbConnectionInfo(
697 UserPreferences.setDatabaseConnectionInfo(info);
698 }
catch (UserPreferencesException ex) {
699 logger.log(Level.SEVERE,
"Error saving case database connection info", ex);
702 int msgServicePort = 0;
704 msgServicePort = Integer.parseInt(this.
tbMsgPort.getText().trim());
705 }
catch (NumberFormatException ex) {
706 logger.log(Level.SEVERE,
"Could not parse messaging service port setting", ex);
709 MessageServiceConnectionInfo msgServiceInfo =
new MessageServiceConnectionInfo(
716 UserPreferences.setMessageServiceConnectionInfo(msgServiceInfo);
717 }
catch (UserPreferencesException ex) {
718 logger.log(Level.SEVERE,
"Error saving messaging service connection info", ex);
721 UserPreferences.setIndexingServerHost(
tbSolrHostname.getText().trim());
722 UserPreferences.setIndexingServerPort(Integer.parseInt(
tbSolrPort.getText().trim()));
735 return checkFieldsAndEnableButtons()
736 && databaseSettingsAreValid()
737 && indexingServerSettingsAreValid()
738 && messageServiceSettingsAreValid();
750 boolean checkFieldsAndEnableButtons() {
751 boolean result =
true;
766 if (!dbPopulated || !solrPopulated || !messageServicePopulated) {
769 tbOops.setText(INCOMPLETE_SETTINGS_MSG);
779 boolean databaseSettingsAreValid() {
783 tbOops.setText(INVALID_DB_PORT_MSG);
793 boolean messageServiceSettingsAreValid() {
795 tbOops.setText(INVALID_MESSAGE_SERVICE_PORT_MSG);
807 boolean indexingServerSettingsAreValid() {
809 tbOops.setText(INVALID_INDEXING_SERVER_PORT_MSG);
826 int value = Integer.parseInt(portNumber);
827 if (value < 0 || value > 65535) {
830 }
catch (NumberFormatException detailsNotImportant) {
872 class TextBoxChangedListener
implements DocumentListener {
875 public void changedUpdate(DocumentEvent e) {
876 Object statusIcon = e.getDocument().getProperty(
"statusIcon");
877 if (statusIcon != null) {
878 ((javax.swing.JLabel) statusIcon).setIcon(null);
884 public void insertUpdate(DocumentEvent e) {
885 Object statusIcon = e.getDocument().getProperty(
"statusIcon");
886 if (statusIcon != null) {
887 ((javax.swing.JLabel) statusIcon).setIcon(null);
893 public void removeUpdate(DocumentEvent e) {
894 Object statusIcon = e.getDocument().getProperty(
"statusIcon");
895 if (statusIcon != null) {
896 ((javax.swing.JLabel) statusIcon).setIcon(null);
void cbEnableMultiUserItemStateChanged(java.awt.event.ItemEvent evt)
static void configureTextPrompts(Collection< TextPrompt > textPrompts)
static final String INCOMPLETE_SETTINGS_MSG
javax.swing.JPanel pnSolrSettings
javax.swing.JLabel lbTestDatabase
javax.swing.JTextField tbSolrHostname
static final long serialVersionUID
javax.swing.JPanel pnMessagingSettings
javax.swing.JPanel pnDatabaseSettings
static final String PASSWORD_PROMPT_OPT
javax.swing.JTextField tbDbUsername
void tryConnect(String host, int port)
javax.swing.JLabel lbTestDbWarning
javax.swing.JLabel lbDatabaseSettings
javax.swing.JLabel lbTestSolrWarning
static final String HOST_NAME_OR_IP_PROMPT
final TextBoxChangedListener textBoxChangedListener
javax.swing.JPanel pnOverallPanel
javax.swing.JTextField tbMsgHostname
static final String PORT_PROMPT
static final String INVALID_MESSAGE_SERVICE_PORT_MSG
javax.swing.JCheckBox cbEnableMultiUser
void bnTestDatabaseActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JTextField tbSolrPort
static CaseDbConnectionInfo getDatabaseConnectionInfo()
javax.swing.JTextField tbOops
static final String USER_NAME_PROMPT
MultiUserSettingsPanel(MultiUserSettingsPanelController theController)
static void setIsMultiUserModeEnabled(boolean enabled)
javax.swing.JTextField tbDbPort
javax.swing.JButton bnTestSolr
javax.swing.JLabel lbTestMessageWarning
javax.swing.JTextField tbMsgPort
static boolean portNumberIsValid(String portNumber)
javax.swing.JLabel lbTestMessageService
boolean messageServiceFieldsArePopulated()
javax.swing.JTextField tbDbHostname
boolean databaseFieldsArePopulated()
void bnTestSolrActionPerformed(java.awt.event.ActionEvent evt)
final MultiUserSettingsPanelController controller
static final boolean isWindowsOS
static final String PASSWORD_PROMPT
javax.swing.JTextField tbMsgUsername
synchronized static Logger getLogger(String name)
boolean solrFieldsArePopulated()
static void enableMultiUserComponents(Collection< JTextField > textFields, boolean enabled)
javax.swing.JButton bnTestMessageService
static final String USER_NAME_PROMPT_OPT
void bnTestMessageServiceActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JPasswordField tbDbPassword
javax.swing.JLabel lbSolrSettings
final Collection< JTextField > textBoxes
javax.swing.JPasswordField tbMsgPassword
javax.swing.JLabel lbMessageServiceSettings
static final String INVALID_DB_PORT_MSG
static final Logger logger
javax.swing.JScrollPane jScrollPane
javax.swing.JButton bnTestDatabase
static final String INVALID_INDEXING_SERVER_PORT_MSG
static void addDocumentListeners(Collection< JTextField > textFields, TextBoxChangedListener listener)
javax.swing.JLabel lbTestSolr