19 package com.basistech.df.cybertriage.autopsy.incidentoptions;
 
   22 import java.awt.Desktop;
 
   24 import java.io.IOException;
 
   26 import java.net.URISyntaxException;
 
   27 import java.util.Collection;
 
   28 import java.util.Collections;
 
   29 import java.util.logging.Level;
 
   30 import java.util.stream.Stream;
 
   32 import javax.swing.JFileChooser;
 
   33 import javax.swing.event.DocumentEvent;
 
   34 import javax.swing.event.DocumentListener;
 
   35 import org.apache.commons.lang3.StringUtils;
 
   36 import org.netbeans.spi.options.OptionsPanelController;
 
   37 import org.openide.util.Lookup;
 
   38 import org.openide.util.NbBundle.Messages;
 
   39 import org.openide.util.lookup.ServiceProvider;
 
   52     private static final String CT_IMPORTER_DOC_LINK = 
"https://docs.cybertriage.com/en/latest/chapters/integrations/autopsy.html";
 
   54     private static final String CT_STANDARD_CONTENT_PROVIDER_NAME = 
"CTStandardContentProvider";
 
   60         return "<html><span style=\"color: blue; text-decoration: underline\">" + url + 
"</span></html>";
 
   68         this.fileRepoPathField.getDocument().addDocumentListener(
new DocumentListener() {
 
   70             public void changedUpdate(DocumentEvent e) {
 
   71                 fireSettingsChanged();
 
   75             public void insertUpdate(DocumentEvent e) {
 
   76                 fireSettingsChanged();
 
   80             public void removeUpdate(DocumentEvent e) {
 
   81                 fireSettingsChanged();
 
  102         setCTSettingsDisplay(ctSettings);
 
  108         "CTIncidentImportOptionsPanel_setModuleDetected_detected=Detected",
 
  109         "CTIncidentImportOptionsPanel_setModuleDetected_notDetected=Not Detected" 
  112         Collection<? extends AutopsyContentProvider> contentProviders = Lookup.getDefault().lookupAll(
AutopsyContentProvider.class);
 
  113         boolean detected = ((Collection<? extends AutopsyContentProvider>) (contentProviders != null ? contentProviders : Collections.emptyList())).stream()
 
  114                 .anyMatch(p -> p != null && StringUtils.defaultString(p.getName()).toUpperCase().startsWith(CT_STANDARD_CONTENT_PROVIDER_NAME.toUpperCase()));
 
  116         this.importModuleDetected.setText(detected 
 
  117                 ? Bundle.CTIncidentImportOptionsPanel_setModuleDetected_detected() 
 
  118                 : Bundle.CTIncidentImportOptionsPanel_setModuleDetected_notDetected());
 
  122         this.caseOpenWarningLabel.setVisible(caseOpen);
 
  123         this.fileRepoBrowseButton.setEnabled(!caseOpen);
 
  124         this.fileRepoPathField.setEnabled(!caseOpen);
 
  128         this.firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
  137         return new File(this.fileRepoPathField.getText()).isDirectory();
 
  145     @SuppressWarnings(
"unchecked")
 
  147     private 
void initComponents() {
 
  148         java.awt.GridBagConstraints gridBagConstraints;
 
  150         incidentTextPanel = 
new javax.swing.JPanel();
 
  151         incidentTextLabel = 
new javax.swing.JLabel();
 
  152         javax.swing.JLabel importModule = 
new javax.swing.JLabel();
 
  153         importModuleDetected = 
new javax.swing.JLabel();
 
  154         instructionsPanel = 
new javax.swing.JPanel();
 
  155         instructionsTextLabel = 
new javax.swing.JLabel();
 
  156         instructionsLinkLabel = 
new javax.swing.JLabel();
 
  157         repoPanel = 
new javax.swing.JPanel();
 
  158         javax.swing.JLabel fileRepoPathLabel = 
new javax.swing.JLabel();
 
  159         fileRepoPathField = 
new javax.swing.JTextField();
 
  160         fileRepoBrowseButton = 
new javax.swing.JButton();
 
  161         caseOpenWarningLabel = 
new javax.swing.JLabel();
 
  163         setBorder(javax.swing.BorderFactory.createTitledBorder(
org.openide.util.NbBundle.getMessage(
CTIncidentImportOptionsPanel.class, 
"CTIncidentImportOptionsPanel.border.title_1"))); 
 
  164         setMaximumSize(
new java.awt.Dimension(650, 2147483647));
 
  165         setMinimumSize(
new java.awt.Dimension(650, 206));
 
  166         setPreferredSize(
new java.awt.Dimension(650, 206));
 
  167         setLayout(
new java.awt.GridBagLayout());
 
  169         incidentTextPanel.setLayout(
new java.awt.GridBagLayout());
 
  171         org.openide.awt.Mnemonics.setLocalizedText(incidentTextLabel, 
org.openide.util.NbBundle.getMessage(
CTIncidentImportOptionsPanel.class, 
"CTIncidentImportOptionsPanel.incidentTextLabel.text")); 
 
  172         incidentTextLabel.setMaximumSize(
new java.awt.Dimension(600, 32));
 
  173         incidentTextLabel.setPreferredSize(null);
 
  174         gridBagConstraints = 
new java.awt.GridBagConstraints();
 
  175         gridBagConstraints.gridx = 0;
 
  176         gridBagConstraints.gridy = 0;
 
  177         gridBagConstraints.gridwidth = 2;
 
  178         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
 
  179         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
  180         gridBagConstraints.insets = 
new java.awt.Insets(5, 5, 5, 5);
 
  181         incidentTextPanel.add(incidentTextLabel, gridBagConstraints);
 
  183         org.openide.awt.Mnemonics.setLocalizedText(importModule, 
org.openide.util.NbBundle.getMessage(
CTIncidentImportOptionsPanel.class, 
"CTIncidentImportOptionsPanel.importModule.text")); 
 
  184         importModule.setPreferredSize(null);
 
  185         gridBagConstraints = 
new java.awt.GridBagConstraints();
 
  186         gridBagConstraints.gridx = 0;
 
  187         gridBagConstraints.gridy = 1;
 
  188         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
  189         gridBagConstraints.insets = 
new java.awt.Insets(5, 5, 5, 3);
 
  190         incidentTextPanel.add(importModule, gridBagConstraints);
 
  192         org.openide.awt.Mnemonics.setLocalizedText(importModuleDetected, 
org.openide.util.NbBundle.getMessage(
CTIncidentImportOptionsPanel.class, 
"CTIncidentImportOptionsPanel.importModuleDetected.text")); 
 
  193         gridBagConstraints = 
new java.awt.GridBagConstraints();
 
  194         gridBagConstraints.gridx = 1;
 
  195         gridBagConstraints.gridy = 1;
 
  196         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
  197         gridBagConstraints.weightx = 1.0;
 
  198         gridBagConstraints.insets = 
new java.awt.Insets(5, 0, 5, 5);
 
  199         incidentTextPanel.add(importModuleDetected, gridBagConstraints);
 
  201         gridBagConstraints = 
new java.awt.GridBagConstraints();
 
  202         gridBagConstraints.gridx = 0;
 
  203         gridBagConstraints.gridy = 0;
 
  204         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
 
  205         gridBagConstraints.weightx = 1.0;
 
  206         add(incidentTextPanel, gridBagConstraints);
 
  208         instructionsPanel.setLayout(
new java.awt.GridBagLayout());
 
  210         org.openide.awt.Mnemonics.setLocalizedText(instructionsTextLabel, 
org.openide.util.NbBundle.getMessage(
CTIncidentImportOptionsPanel.class, 
"CTIncidentImportOptionsPanel.instructionsTextLabel.text")); 
 
  211         instructionsTextLabel.setPreferredSize(null);
 
  212         gridBagConstraints = 
new java.awt.GridBagConstraints();
 
  213         gridBagConstraints.gridx = 0;
 
  214         gridBagConstraints.gridy = 0;
 
  215         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
  216         gridBagConstraints.insets = 
new java.awt.Insets(5, 5, 5, 0);
 
  217         instructionsPanel.add(instructionsTextLabel, gridBagConstraints);
 
  218         instructionsTextLabel.getAccessibleContext().setAccessibleName(
"For instructions on obtaining the module refer to:");
 
  220         org.openide.awt.Mnemonics.setLocalizedText(instructionsLinkLabel, getHtmlLink(CT_IMPORTER_DOC_LINK));
 
  221         instructionsLinkLabel.setCursor(
new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
 
  222         instructionsLinkLabel.setPreferredSize(null);
 
  223         instructionsLinkLabel.addMouseListener(
new java.awt.event.MouseAdapter() {
 
  224             public void mouseClicked(java.awt.event.MouseEvent evt) {
 
  225                 instructionsLinkLabelMouseClicked(evt);
 
  228         gridBagConstraints = 
new java.awt.GridBagConstraints();
 
  229         gridBagConstraints.gridx = 1;
 
  230         gridBagConstraints.gridy = 0;
 
  231         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
  232         gridBagConstraints.weightx = 1.0;
 
  233         gridBagConstraints.insets = 
new java.awt.Insets(5, 2, 5, 5);
 
  234         instructionsPanel.add(instructionsLinkLabel, gridBagConstraints);
 
  236         gridBagConstraints = 
new java.awt.GridBagConstraints();
 
  237         gridBagConstraints.gridx = 0;
 
  238         gridBagConstraints.gridy = 1;
 
  239         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
 
  240         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
  241         gridBagConstraints.weightx = 1.0;
 
  242         add(instructionsPanel, gridBagConstraints);
 
  244         repoPanel.setMaximumSize(
new java.awt.Dimension(650, 2147483647));
 
  245         repoPanel.setPreferredSize(
new java.awt.Dimension(650, 75));
 
  246         repoPanel.setLayout(
new java.awt.GridBagLayout());
 
  248         org.openide.awt.Mnemonics.setLocalizedText(fileRepoPathLabel, 
org.openide.util.NbBundle.getMessage(
CTIncidentImportOptionsPanel.class, 
"CTIncidentImportOptionsPanel.fileRepoPathLabel.text")); 
 
  249         fileRepoPathLabel.setMaximumSize(
new java.awt.Dimension(600, 16));
 
  250         fileRepoPathLabel.setPreferredSize(null);
 
  251         gridBagConstraints = 
new java.awt.GridBagConstraints();
 
  252         gridBagConstraints.gridx = 0;
 
  253         gridBagConstraints.gridy = 0;
 
  254         gridBagConstraints.gridwidth = 2;
 
  255         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
  256         gridBagConstraints.insets = 
new java.awt.Insets(5, 5, 5, 5);
 
  257         repoPanel.add(fileRepoPathLabel, gridBagConstraints);
 
  259         fileRepoPathField.setText(
org.openide.util.NbBundle.getMessage(
CTIncidentImportOptionsPanel.class, 
"CTIncidentImportOptionsPanel.fileRepoPathField.text")); 
 
  260         fileRepoPathField.setPreferredSize(null);
 
  261         fileRepoPathField.addActionListener(
new java.awt.event.ActionListener() {
 
  262             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  263                 fileRepoPathFieldActionPerformed(evt);
 
  266         gridBagConstraints = 
new java.awt.GridBagConstraints();
 
  267         gridBagConstraints.gridx = 0;
 
  268         gridBagConstraints.gridy = 1;
 
  269         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
 
  270         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
  271         gridBagConstraints.weightx = 1.0;
 
  272         gridBagConstraints.insets = 
new java.awt.Insets(0, 5, 5, 5);
 
  273         repoPanel.add(fileRepoPathField, gridBagConstraints);
 
  274         fileRepoPathField.getAccessibleContext().setAccessibleName(
"");
 
  276         org.openide.awt.Mnemonics.setLocalizedText(fileRepoBrowseButton, 
org.openide.util.NbBundle.getMessage(
CTIncidentImportOptionsPanel.class, 
"CTIncidentImportOptionsPanel.fileRepoBrowseButton.text")); 
 
  277         fileRepoBrowseButton.addActionListener(
new java.awt.event.ActionListener() {
 
  278             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  279                 fileRepoBrowseButtonActionPerformed(evt);
 
  282         gridBagConstraints = 
new java.awt.GridBagConstraints();
 
  283         gridBagConstraints.gridx = 1;
 
  284         gridBagConstraints.gridy = 1;
 
  285         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
  286         gridBagConstraints.insets = 
new java.awt.Insets(0, 5, 5, 5);
 
  287         repoPanel.add(fileRepoBrowseButton, gridBagConstraints);
 
  289         caseOpenWarningLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/modules/hashdatabase/warning16.png"))); 
 
  290         org.openide.awt.Mnemonics.setLocalizedText(caseOpenWarningLabel, 
org.openide.util.NbBundle.getMessage(
CTIncidentImportOptionsPanel.class, 
"CTIncidentImportOptionsPanel.caseOpenWarningLabel.text")); 
 
  291         gridBagConstraints = 
new java.awt.GridBagConstraints();
 
  292         gridBagConstraints.gridx = 0;
 
  293         gridBagConstraints.gridy = 2;
 
  294         gridBagConstraints.gridwidth = 2;
 
  295         gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
 
  296         gridBagConstraints.weightx = 1.0;
 
  297         gridBagConstraints.insets = 
new java.awt.Insets(0, 5, 5, 5);
 
  298         repoPanel.add(caseOpenWarningLabel, gridBagConstraints);
 
  300         gridBagConstraints = 
new java.awt.GridBagConstraints();
 
  301         gridBagConstraints.gridx = 0;
 
  302         gridBagConstraints.gridy = 2;
 
  303         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
 
  304         gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
  305         gridBagConstraints.weightx = 1.0;
 
  306         add(repoPanel, gridBagConstraints);
 
  309         JFileChooser fileChooser = fileRepoChooserFactory.
getChooser();
 
  310         fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
 
  311         fileChooser.setMultiSelectionEnabled(
false);
 
  313         File curSelectedDir = StringUtils.isBlank(this.fileRepoPathField.getText()) ? null : 
new File(this.fileRepoPathField.getText());
 
  314         if (curSelectedDir == null || !curSelectedDir.isDirectory()) {
 
  318         fileChooser.setCurrentDirectory(curSelectedDir);
 
  319         fileChooser.setDialogTitle(
org.openide.util.NbBundle.getMessage(
CTIncidentImportOptionsPanel.class, 
"CTIncidentImportOptionsPanel.fileRepoFileChooser.title"));
 
  320         int retVal = fileChooser.showOpenDialog(
this);
 
  321         if (retVal == JFileChooser.APPROVE_OPTION) {
 
  322             this.fileRepoPathField.setText(fileChooser.getSelectedFile().getAbsolutePath());
 
  331         gotoLink(CT_IMPORTER_DOC_LINK);
 
  335         if (Desktop.isDesktopSupported()) {
 
  337                 Desktop.getDesktop().browse(
new URI(url));
 
  338             } 
catch (IOException | URISyntaxException e) {
 
  339                 logger.log(Level.SEVERE, 
"Error opening link to: " + url, e);
 
  342             logger.log(Level.WARNING, 
"Desktop API is not supported.  Link cannot be opened.");
 
void setEnabledItems(boolean caseOpen)
javax.swing.JLabel incidentTextLabel
static String getDefaultFileRepoPath()
javax.swing.JLabel importModuleDetected
void setCTSettingsDisplay(CTSettings ctSettings)
javax.swing.JPanel instructionsPanel
javax.swing.JButton fileRepoBrowseButton
synchronized void loadSettings()
void instructionsLinkLabelMouseClicked(java.awt.event.MouseEvent evt)
static String getHtmlLink(String url)
javax.swing.JLabel instructionsLinkLabel
javax.swing.JLabel caseOpenWarningLabel
void gotoLink(String url)
CTSettings setFileRepoPath(String fileRepoPath)
javax.swing.JPanel repoPanel
void fileRepoPathFieldActionPerformed(java.awt.event.ActionEvent evt)
JFileChooser getChooser()
synchronized void saveSettings()
void fileRepoBrowseButtonActionPerformed(java.awt.event.ActionEvent evt)
synchronized boolean saveCTSettings(CTSettings ctSettings)
javax.swing.JTextField fileRepoPathField
javax.swing.JLabel instructionsTextLabel
void fireSettingsChanged()
javax.swing.JPanel incidentTextPanel
static CTSettingsPersistence getInstance()
synchronized static Logger getLogger(String name)
CTIncidentImportOptionsPanel()
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
static boolean isCaseOpen()
synchronized CTSettings loadCTSettings()