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()