Autopsy 4.22.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
FilesSetDefsPanel.java
Go to the documentation of this file.
1/*
2 * Autopsy Forensic Browser
3 *
4 * Copyright 2011-2021 Basis Technology Corp.
5 * Contact: carrier <at> sleuthkit <dot> org
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19package org.sleuthkit.autopsy.modules.interestingitems;
20
21import java.awt.EventQueue;
22import java.io.File;
23import java.util.ArrayList;
24import java.util.Collection;
25import java.util.Collections;
26import java.util.Comparator;
27import java.util.HashMap;
28import java.util.List;
29import java.util.Map;
30import java.util.SortedSet;
31import java.util.TreeMap;
32import java.util.logging.Level;
33import java.util.stream.Collectors;
34import javax.swing.DefaultListModel;
35import javax.swing.JButton;
36import javax.swing.JFileChooser;
37import javax.swing.JOptionPane;
38import javax.swing.event.ListSelectionEvent;
39import javax.swing.event.ListSelectionListener;
40import javax.swing.filechooser.FileNameExtensionFilter;
41import org.apache.commons.lang3.tuple.Pair;
42import org.netbeans.spi.options.OptionsPanelController;
43import org.openide.util.NbBundle;
44import org.openide.util.NbBundle.Messages;
45import org.openide.windows.WindowManager;
46import org.sleuthkit.autopsy.corecomponents.OptionsPanel;
47import org.sleuthkit.autopsy.coreutils.Logger;
48import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
49import org.sleuthkit.autopsy.coreutils.ModuleSettings;
50import org.sleuthkit.autopsy.guiutils.SimpleListCellRenderer;
51import org.sleuthkit.autopsy.ingest.IngestManager;
52import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSettingsPanel;
53import org.sleuthkit.autopsy.ingest.IngestProfiles;
54import org.sleuthkit.autopsy.ingest.IngestProfiles.IngestProfile;
55import org.sleuthkit.autopsy.modules.filetypeid.FileTypeDetector;
56
60@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
61public final class FilesSetDefsPanel extends IngestModuleGlobalSettingsPanel implements OptionsPanel {
62
63 private static final long serialVersionUID = 1L;
64
65 @NbBundle.Messages({"# {0} - filter name",
66 "# {1} - profile name",
67 "FilesSetDefsPanel.ingest.fileFilterInUseError=The selected file filter, {0}, is being used by a profile, {1}, and cannot be deleted while any profile uses it.",
68 "FilesSetDefsPanel.bytes=Bytes",
69 "FilesSetDefsPanel.kiloBytes=Kilobytes",
70 "FilesSetDefsPanel.megaBytes=Megabytes",
71 "FilesSetDefsPanel.gigaBytes=Gigabytes",
72 "FilesSetDefsPanel.loadError=Error loading interesting files sets from file.",
73 "FilesSetDefsPanel.saveError=Error saving interesting files sets to file.",
74 "FilesSetDefsPanel.interesting.copySetButton.text=Copy Set",
75 "FilesSetDefsPanel.interesting.importSetButton.text=Import Set",
76 "FilesSetDefsPanel.interesting.exportSetButton.text=Export Set"
77 })
83 private final DefaultListModel<FilesSet> setsListModel = new DefaultListModel<>();
84 private final DefaultListModel<FilesSet.Rule> rulesListModel = new DefaultListModel<>();
85 private final Logger logger = Logger.getLogger(FilesSetDefsPanel.class.getName());
86 private final JButton okButton = new JButton("OK");
87 private final JButton cancelButton = new JButton("Cancel");
88 private final PANEL_TYPE panelType;
89 private final String filterDialogTitle;
90 private final String ruleDialogTitle;
91 private boolean canBeEnabled = true;
92
93 private static final String XML_EXTENSION = "xml";
94
95 private final JFileChooser importFileChooser;
96 private static final String LAST_IMPORT_PATH_KEY = "InterestingFilesRuleSetLastImport";
97
98 private final JFileChooser exportFileChooser;
99 private static final String LAST_EXPORT_PATH_KEY = "InterestingFilesRuleSetLastExport";
100
101 // The following is a map of interesting files set names to interesting
102 // files set definitions. It is a snapshot of the files set definitions
103 // obtained from the interesting item definitions manager at the time the
104 // the panel is loaded. When the panel saves or stores its settings, these
105 // definitions, possibly changed, are submitted back to the interesting item
106 // definitions manager. Note that it is a tree map to aid in displaying
107 // files sets in sorted order by name.
108 private TreeMap<String, FilesSet> filesSets;
109
114 this.panelType = panelType;
115 this.initComponents();
116 this.customInit();
117
118 this.setsList.setModel(setsListModel);
119 this.setsList.addListSelectionListener(new FilesSetDefsPanel.SetsListSelectionListener());
120 this.rulesList.setModel(rulesListModel);
121 this.rulesList.addListSelectionListener(new FilesSetDefsPanel.RulesListSelectionListener());
122 this.ingestWarningLabel.setVisible(false);
123 if (panelType == PANEL_TYPE.FILE_INGEST_FILTERS) { //Hide the mimetype settings when this is displaying FileSet rules instead of interesting item rules
124 this.copySetButton.setVisible(false);
125 this.importSetButton.setVisible(false);
126 this.exportSetButton.setVisible(false);
127 this.mimeTypeComboBox.setVisible(false);
128 this.mimeTypeLabel.setVisible(false);
129 this.filterDialogTitle = "FilesSetPanel.filter.title";
130 this.ruleDialogTitle = "FilesSetPanel.rule.title";
131 this.ignoreKnownFilesCheckbox.setVisible(false);
132 this.fileTypeLabel.setVisible(false);
133 this.filesRadioButton.setVisible(false);
134 this.dirsRadioButton.setVisible(false);
135 this.allRadioButton.setVisible(false);
136 this.descriptionTextArea.setText(org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.ingest.jTextArea1.text")); // NOI18N
137 org.openide.awt.Mnemonics.setLocalizedText(setsListLabel, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.ingest.setsListLabel.text")); // NOI18N
138 org.openide.awt.Mnemonics.setLocalizedText(editSetButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.ingest.editSetButton.text")); // NOI18N
139 org.openide.awt.Mnemonics.setLocalizedText(newSetButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.ingest.newSetButton.text")); // NOI18N
140 org.openide.awt.Mnemonics.setLocalizedText(deleteSetButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.ingest.deleteSetButton.text")); // NOI18N
141 org.openide.awt.Mnemonics.setLocalizedText(setDetailsLabel, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.ingest.jLabel6.text")); // NOI18N
142 } else {
143 this.filterDialogTitle = "FilesSetPanel.interesting.title";
144 this.ruleDialogTitle = "FilesSetPanel.interesting.title";
145 this.ingoreUnallocCheckbox.setVisible(false);
146 }
147
152 });
154
155 this.importFileChooser = new JFileChooser();
156 this.exportFileChooser = new JFileChooser();
159 }
160
164 private void configureFileChooser(JFileChooser fileChooser) {
165 FileNameExtensionFilter autopsyFilter = new FileNameExtensionFilter(
166 NbBundle.getMessage(this.getClass(), "FilesSetDefsPanel.interesting.fileExtensionFilterLbl"), XML_EXTENSION);
167 fileChooser.addChoosableFileFilter(autopsyFilter);
168 fileChooser.setAcceptAllFileFilterUsed(false);
169 fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
170 }
171
172 @NbBundle.Messages({"FilesSetDefsPanel.Interesting.Title=Global Interesting Items Settings",
173 "FilesSetDefsPanel.Ingest.Title=File Filter Settings"})
174 private void customInit() {
176 setName(Bundle.FilesSetDefsPanel_Ingest_Title());
177 } else {
178 setName(Bundle.FilesSetDefsPanel_Interesting_Title());
179 }
180
181 try {
182 SortedSet<String> detectableMimeTypes = FileTypeDetector.getDetectedTypes();
183 detectableMimeTypes.forEach((type) -> {
184 mimeTypeComboBox.addItem(type);
185 });
187 logger.log(Level.SEVERE, "Unable to get detectable file types", ex);
188 }
189
190 this.fileSizeUnitComboBox.setSelectedIndex(1);
191 this.equalitySignComboBox.setSelectedIndex(0);
192 }
193
194 @Override
195 public void saveSettings() {
196 try {
198 FilesSetsManager.getInstance().setCustomFileIngestFilters(this.filesSets);
199 } else {
200 FilesSetsManager.getInstance().setInterestingFilesSets(this.filesSets);
201 }
202
204 MessageNotifyUtil.Message.error(Bundle.FilesSetDefsPanel_saveError());
205 logger.log(Level.WARNING, Bundle.FilesSetDefsPanel_saveError(), ex);
206 }
207 }
208
209 public void enableButtons() {
210 FilesSet selectedFilesSet = this.setsList.getSelectedValue();
211 boolean setSelected = (selectedFilesSet != null);
212 boolean isStandardSet = (selectedFilesSet != null && selectedFilesSet.isStandardSet());
213
214 boolean ruleSelected = (FilesSetDefsPanel.this.rulesList.getSelectedValue() != null);
215
216 newRuleButton.setEnabled(canBeEnabled && setSelected && !isStandardSet);
217 copySetButton.setEnabled(canBeEnabled && setSelected);
218 newSetButton.setEnabled(canBeEnabled);
219 editRuleButton.setEnabled(canBeEnabled && ruleSelected && !isStandardSet);
220 editSetButton.setEnabled(canBeEnabled && setSelected && !isStandardSet);
221 exportSetButton.setEnabled(setSelected);
222 importSetButton.setEnabled(canBeEnabled);
223 deleteRuleButton.setEnabled(canBeEnabled && ruleSelected && !isStandardSet);
224 deleteSetButton.setEnabled(canBeEnabled && setSelected && !isStandardSet);
225 ingestWarningLabel.setVisible(!canBeEnabled);
226 }
227
228 @Override
229 public void store() {
230 this.saveSettings();
231 }
232
233 @Override
234 public void load() {
235 this.resetComponents();
236
237 try {
238 // Get a working copy of the interesting files set definitions and sort
239 // by set name.
241 this.filesSets = new TreeMap<>(FilesSetsManager.getInstance().getCustomFileIngestFilters());
242 } else {
243 this.filesSets = new TreeMap<>(FilesSetsManager.getInstance().getInterestingFilesSets());
244 }
245
247 MessageNotifyUtil.Message.error(Bundle.FilesSetDefsPanel_loadError());
248 logger.log(Level.WARNING, Bundle.FilesSetDefsPanel_loadError(), ex);
249 this.filesSets = new TreeMap<>();
250 }
251
252 // Populate the list model for the interesting files sets list
253 // component.
254 this.filesSets.values().forEach((set) -> {
255 this.setsListModel.addElement(set);
256 });
257
258 if (!this.filesSets.isEmpty()) {
259 // Select the first files set by default. The list selections
260 // listeners will then populate the other components.
261 EventQueue.invokeLater(() -> {
262 FilesSetDefsPanel.this.setsList.setSelectedIndex(0);
263 });
264 }
265 }
266
270 private void resetComponents() {
271 this.setsListModel.clear();
272 this.setDescriptionTextArea.setText("");
273 this.ignoreKnownFilesCheckbox.setSelected(true);
274 this.ingoreUnallocCheckbox.setSelected(true);
275 this.resetRuleComponents();
276 }
277
282 private void resetRuleComponents() {
283 this.fileNameTextField.setText("");
284 this.fileNameRadioButton.setSelected(true);
285 this.fileNameRegexCheckbox.setSelected(false);
286 this.filesRadioButton.setSelected(true);
287 this.rulePathConditionTextField.setText("");
288 this.daysIncludedTextField.setText("");
289 this.rulePathConditionRegexCheckBox.setSelected(false);
290 this.mimeTypeComboBox.setSelectedIndex(0);
291 this.equalitySignComboBox.setSelectedIndex(0);
292 this.fileSizeUnitComboBox.setSelectedIndex(1);
293 this.fileSizeSpinner.setValue(0);
295 }
296
300 private final class SetsListSelectionListener implements ListSelectionListener {
301
302 @Override
303 public void valueChanged(ListSelectionEvent e) {
304 if (e.getValueIsAdjusting()) {
305 return;
306 }
307
308 FilesSetDefsPanel.this.rulesListModel.clear();
309 FilesSetDefsPanel.this.resetRuleComponents();
310
311 // Get the selected interesting files set and populate the set
312 // components.
313 FilesSet selectedSet = FilesSetDefsPanel.this.setsList.getSelectedValue();
314
315 if (selectedSet != null) {
316 // Populate the components that display the properties of the
317 // selected files set.
318 FilesSetDefsPanel.this.setDescriptionTextArea.setText(selectedSet.getDescription());
319 FilesSetDefsPanel.this.ignoreKnownFilesCheckbox.setSelected(selectedSet.ignoresKnownFiles());
320 FilesSetDefsPanel.this.ingoreUnallocCheckbox.setSelected(selectedSet.ingoresUnallocatedSpace());
321 // Populate the rule definitions list, sorted by name.
322 List<FilesSet.Rule> rules = new ArrayList<>(selectedSet.getRules().values());
323 Collections.sort(rules, new Comparator<FilesSet.Rule>() {
324 @Override
325 public int compare(FilesSet.Rule rule1, FilesSet.Rule rule2) {
326 return rule1.toString().compareTo(rule2.toString());
327 }
328 });
329 rules.forEach((rule) -> {
330 FilesSetDefsPanel.this.rulesListModel.addElement(rule);
331 });
332 // Select the first rule by default.
333 if (!FilesSetDefsPanel.this.rulesListModel.isEmpty()) {
334 FilesSetDefsPanel.this.rulesList.setSelectedIndex(0);
335 }
336 }
337 }
338 }
339
344 private final class RulesListSelectionListener implements ListSelectionListener {
345
346 @Override
347 public void valueChanged(ListSelectionEvent e) {
348 if (e.getValueIsAdjusting()) {
349 return;
350 }
351
352 // Get the selected rule and populate the rule components.
353 FilesSet.Rule rule = FilesSetDefsPanel.this.rulesList.getSelectedValue();
354 if (rule != null) {
355 // Get the conditions that make up the rule.
356 FilesSet.Rule.FileNameCondition nameCondition = rule.getFileNameCondition();
357 FilesSet.Rule.MetaTypeCondition typeCondition = rule.getMetaTypeCondition();
358 FilesSet.Rule.ParentPathCondition pathCondition = rule.getPathCondition();
359 FilesSet.Rule.MimeTypeCondition mimeTypeCondition = rule.getMimeTypeCondition();
360 FilesSet.Rule.FileSizeCondition fileSizeCondition = rule.getFileSizeCondition();
361 FilesSet.Rule.DateCondition dateCondition = rule.getDateCondition();
362 // Populate the components that display the properties of the
363 // selected rule.
364 if (nameCondition != null) {
365 FilesSetDefsPanel.this.fileNameTextField.setText(nameCondition.getTextToMatch());
366 FilesSetDefsPanel.this.fileNameRadioButton.setSelected(nameCondition instanceof FilesSet.Rule.FullNameCondition);
367 FilesSetDefsPanel.this.fileNameExtensionRadioButton.setSelected(nameCondition instanceof FilesSet.Rule.ExtensionCondition);
368 FilesSetDefsPanel.this.fileNameRegexCheckbox.setSelected(nameCondition.isRegex());
369 } else {
370 FilesSetDefsPanel.this.fileNameTextField.setText("");
371 FilesSetDefsPanel.this.fileNameRadioButton.setSelected(true);
372 FilesSetDefsPanel.this.fileNameExtensionRadioButton.setSelected(false);
373 FilesSetDefsPanel.this.fileNameRegexCheckbox.setSelected(false);
374 }
375 switch (typeCondition.getMetaType()) {
376 case FILES:
377 FilesSetDefsPanel.this.filesRadioButton.setSelected(true);
378 break;
379 case DIRECTORIES:
380 FilesSetDefsPanel.this.dirsRadioButton.setSelected(true);
381 break;
382 case FILES_AND_DIRECTORIES:
383 FilesSetDefsPanel.this.allRadioButton.setSelected(true);
384 break;
385 }
386 if (pathCondition != null) {
387 FilesSetDefsPanel.this.rulePathConditionTextField.setText(pathCondition.getTextToMatch());
388 FilesSetDefsPanel.this.rulePathConditionRegexCheckBox.setSelected(pathCondition.isRegex());
389 } else {
390 FilesSetDefsPanel.this.rulePathConditionTextField.setText("");
391 FilesSetDefsPanel.this.rulePathConditionRegexCheckBox.setSelected(false);
392 }
393 if (mimeTypeCondition != null) {
394 FilesSetDefsPanel.this.mimeTypeComboBox.setSelectedItem(mimeTypeCondition.getMimeType());
395 } else {
396 FilesSetDefsPanel.this.mimeTypeComboBox.setSelectedIndex(0);
397 }
398 if (fileSizeCondition != null) {
399 FilesSetDefsPanel.this.fileSizeUnitComboBox.setSelectedItem(fileSizeCondition.getUnit().getName());
400 FilesSetDefsPanel.this.equalitySignComboBox.setSelectedItem(fileSizeCondition.getComparator().getSymbol());
401 FilesSetDefsPanel.this.fileSizeSpinner.setValue(fileSizeCondition.getSizeValue());
402 } else {
403 FilesSetDefsPanel.this.fileSizeUnitComboBox.setSelectedIndex(1);
404 FilesSetDefsPanel.this.equalitySignComboBox.setSelectedIndex(0);
405 FilesSetDefsPanel.this.fileSizeSpinner.setValue(0);
406 }
407 if (dateCondition != null) {
408 FilesSetDefsPanel.this.daysIncludedTextField.setText(Integer.toString(dateCondition.getDaysIncluded()));
409 } else {
410 FilesSetDefsPanel.this.daysIncludedTextField.setText("");
411 }
413 } else {
415 }
416 }
417
418 }
419
431 private void doFileSetsDialog(FilesSet selectedSet, boolean shouldCreateNew) {
432 // Create a files set defintion panle.
433 FilesSetPanel panel;
434 if (selectedSet != null) {
435 // Editing an existing set definition.
436 panel = new FilesSetPanel(selectedSet, panelType);
437 } else {
438 // Creating a new set definition.
439 panel = new FilesSetPanel(panelType);
440 }
441
442 // Do a dialog box with the files set panel until the user either enters
443 // a valid definition or cancels. Note that the panel gives the user
444 // feedback when isValidDefinition() is called.
445 int option = JOptionPane.OK_OPTION;
446 do {
447 option = JOptionPane.showConfirmDialog(this, panel, NbBundle.getMessage(FilesSetPanel.class, filterDialogTitle), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
448 } while (option == JOptionPane.OK_OPTION && !panel.isValidDefinition());
449
450 if (option == JOptionPane.OK_OPTION) {
451 Map<String, FilesSet.Rule> rules = new HashMap<>();
452 if (selectedSet != null) {
453 // Interesting file sets are immutable for thread safety,
454 // so editing a files set definition is a replacement operation.
455 // Preserve the existing rules from the set being edited.
456 rules.putAll(selectedSet.getRules());
457 }
458
459 FilesSet filesSet = new FilesSet(
460 panel.getFilesSetName(),
461 panel.getFilesSetDescription(),
462 panel.getFileSetIgnoresKnownFiles(),
463 panel.getFileSetIgnoresUnallocatedSpace(),
464 rules
465 );
466
467 Pair<FilesSet, Integer> result = handleConflict(filesSet, false);
468 option = result.getRight();
469 FilesSet toAddOrUpdate = result.getLeft();
470
471 if (result.getRight() == JOptionPane.OK_OPTION) {
472 if (shouldCreateNew) {
473 this.replaceFilesSet(null, toAddOrUpdate, null);
474 } else {
475 this.replaceFilesSet(selectedSet, toAddOrUpdate, null);
476 }
477 }
478 }
479 }
480
488 private void doFilesSetRuleDialog(FilesSet.Rule selectedRule) {
489 // Create a files set rule panel.
490 FilesSetRulePanel panel;
491 if (selectedRule != null) {
492 // Editing an existing rule definition.
493 panel = new FilesSetRulePanel(selectedRule, okButton, cancelButton, panelType);
494 } else {
495 // Creating a new rule definition.
496 panel = new FilesSetRulePanel(okButton, cancelButton, panelType);
497 }
498 // Do a dialog box with the files set panel until the user either enters
499 // a valid definition or cancels. Note that the panel gives the user
500 // feedback when isValidDefinition() is called.
501 int option = JOptionPane.OK_OPTION;
502 do {
503 option = JOptionPane.showOptionDialog(this, panel, NbBundle.getMessage(FilesSetPanel.class, ruleDialogTitle), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, new Object[]{okButton, cancelButton}, okButton);
504
505 } while (option == JOptionPane.OK_OPTION && !panel.isValidRuleDefinition());
506
507 if (option == JOptionPane.OK_OPTION) {
508 // Interesting file sets are immutable for thread safety,
509 // so editing a files set rule definition is a replacement
510 // operation. Preserve the existing rules from the set being edited.
511 FilesSet selectedSet = this.setsList.getSelectedValue();
512 Map<String, FilesSet.Rule> rules = new HashMap<>(selectedSet.getRules());
513
514 // Remove the "old" rule definition and add the new/edited
515 // definition.
516 if (selectedRule != null) {
517 rules.remove(selectedRule.getUuid());
518 }
519 FilesSet.Rule newRule = new FilesSet.Rule(panel.getRuleName(),
520 panel.getFileNameCondition(), panel.getMetaTypeCondition(),
521 panel.getPathCondition(), panel.getMimeTypeCondition(),
522 panel.getFileSizeCondition(), panel.getDateCondition(),
523 panel.isExclusive());
524 rules.put(newRule.getUuid(), newRule);
525
526 // Add the new/edited files set definition, replacing any previous
527 // definition with the same name and refreshing the display.
528 this.replaceFilesSet(selectedSet, selectedSet, rules);
529
530 // Select the new/edited rule. Queue it up so it happens after the
531 // selection listeners react to the selection of the "new" files
532 // set.
533 EventQueue.invokeLater(() -> {
534 this.rulesList.setSelectedValue(newRule, true);
535 });
536 }
537 }
538
550 private void replaceFilesSet(FilesSet oldSet, FilesSet newSet, Map<String, FilesSet.Rule> rules) {
551 if (oldSet != null) {
552 // Remove the set to be replaced from the working copy if the files
553 // set definitions.
554 this.filesSets.remove(oldSet.getName());
555 }
556
557 FilesSet setToAdd = newSet;
558
559 // Make the new/edited set definition and add it to the working copy of
560 // the files set definitions.
561 if (rules != null) {
562 setToAdd = new FilesSet(
563 newSet.getName(),
564 newSet.getDescription(),
565 newSet.ignoresKnownFiles(),
567 rules,
568 newSet.isStandardSet(),
569 newSet.getVersionNumber()
570 );
571 }
572
573 this.filesSets.put(setToAdd.getName(), setToAdd);
574
575 // Redo the list model for the files set list component, which will make
576 // everything stays sorted as in the working copy tree set.
577 FilesSetDefsPanel.this.setsListModel.clear();
578 this.filesSets.values().forEach((set) -> {
579 this.setsListModel.addElement(set);
580 });
581
582 // Select the new/edited files set definition in the set definitions
583 // list. This will cause the selection listeners to repopulate the
584 // subordinate components.
585 this.setsList.setSelectedValue(setToAdd, true);
586 }
587
593 @SuppressWarnings("unchecked")
594 // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
595 private void initComponents() {
596
597 fileNameButtonGroup = new javax.swing.ButtonGroup();
598 typeButtonGroup = new javax.swing.ButtonGroup();
599 jScrollPane1 = new javax.swing.JScrollPane();
600 jPanel1 = new javax.swing.JPanel();
601 setDetailsLabel = new javax.swing.JLabel();
602 newRuleButton = new javax.swing.JButton();
603 filesRadioButton = new javax.swing.JRadioButton();
604 editRuleButton = new javax.swing.JButton();
605 rulesListLabel = new javax.swing.JLabel();
606 rulesListScrollPane = new javax.swing.JScrollPane();
607 rulesList = new javax.swing.JList<>();
608 setDescScrollPanel = new javax.swing.JScrollPane();
609 setDescriptionTextArea = new javax.swing.JTextArea();
610 editSetButton = new javax.swing.JButton();
611 setsListScrollPane = new javax.swing.JScrollPane();
612 setsList = new javax.swing.JList<>();
613 fileNameExtensionRadioButton = new javax.swing.JRadioButton();
614 nameLabel = new javax.swing.JLabel();
615 fileNameTextField = new javax.swing.JTextField();
616 descriptionLabel = new javax.swing.JLabel();
617 fileNameRadioButton = new javax.swing.JRadioButton();
618 rulePathConditionTextField = new javax.swing.JTextField();
619 ignoreKnownFilesCheckbox = new javax.swing.JCheckBox();
620 fileNameRegexCheckbox = new javax.swing.JCheckBox();
621 separator = new javax.swing.JSeparator();
622 setsListLabel = new javax.swing.JLabel();
623 allRadioButton = new javax.swing.JRadioButton();
624 deleteSetButton = new javax.swing.JButton();
625 deleteRuleButton = new javax.swing.JButton();
626 newSetButton = new javax.swing.JButton();
627 fileTypeLabel = new javax.swing.JLabel();
628 dirsRadioButton = new javax.swing.JRadioButton();
629 ruleLabel = new javax.swing.JLabel();
630 pathLabel = new javax.swing.JLabel();
631 rulePathConditionRegexCheckBox = new javax.swing.JCheckBox();
632 descriptionScrollPane = new javax.swing.JScrollPane();
633 descriptionTextArea = new javax.swing.JTextArea();
634 mimeTypeLabel = new javax.swing.JLabel();
635 mimeTypeComboBox = new javax.swing.JComboBox<>();
636 fileSizeLabel = new javax.swing.JLabel();
637 equalitySignComboBox = new javax.swing.JComboBox<String>();
638 fileSizeSpinner = new javax.swing.JSpinner();
639 fileSizeUnitComboBox = new javax.swing.JComboBox<String>();
640 ingoreUnallocCheckbox = new javax.swing.JCheckBox();
641 ingestWarningLabel = new javax.swing.JLabel();
642 copySetButton = new javax.swing.JButton();
643 importSetButton = new javax.swing.JButton();
644 exportSetButton = new javax.swing.JButton();
645 modifiedDateLabel = new javax.swing.JLabel();
646 daysIncludedTextField = new javax.swing.JTextField();
647 daysIncludedLabel = new javax.swing.JLabel();
648
649 org.openide.awt.Mnemonics.setLocalizedText(setDetailsLabel, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.interesting.jLabel6.text")); // NOI18N
650
651 newRuleButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/add16.png"))); // NOI18N
652 org.openide.awt.Mnemonics.setLocalizedText(newRuleButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.newRuleButton.text")); // NOI18N
653 newRuleButton.addActionListener(new java.awt.event.ActionListener() {
654 public void actionPerformed(java.awt.event.ActionEvent evt) {
655 newRuleButtonActionPerformed(evt);
656 }
657 });
658
659 typeButtonGroup.add(filesRadioButton);
660 filesRadioButton.setSelected(true);
661 org.openide.awt.Mnemonics.setLocalizedText(filesRadioButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.filesRadioButton.text")); // NOI18N
662 filesRadioButton.setEnabled(false);
663
664 editRuleButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/edit16.png"))); // NOI18N
665 org.openide.awt.Mnemonics.setLocalizedText(editRuleButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.editRuleButton.text")); // NOI18N
666 editRuleButton.setEnabled(false);
667 editRuleButton.addActionListener(new java.awt.event.ActionListener() {
668 public void actionPerformed(java.awt.event.ActionEvent evt) {
669 editRuleButtonActionPerformed(evt);
670 }
671 });
672
673 org.openide.awt.Mnemonics.setLocalizedText(rulesListLabel, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.rulesListLabel.text")); // NOI18N
674
675 rulesList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
676 rulesListScrollPane.setViewportView(rulesList);
677 rulesList.setCellRenderer(new SimpleListCellRenderer());
678
679 setDescScrollPanel.setMinimumSize(new java.awt.Dimension(10, 22));
680 setDescScrollPanel.setPreferredSize(new java.awt.Dimension(14, 40));
681
682 setDescriptionTextArea.setEditable(false);
683 setDescriptionTextArea.setBackground(new java.awt.Color(240, 240, 240));
684 setDescriptionTextArea.setColumns(20);
685 setDescriptionTextArea.setLineWrap(true);
686 setDescriptionTextArea.setRows(6);
687 setDescriptionTextArea.setMinimumSize(new java.awt.Dimension(10, 22));
688 setDescriptionTextArea.setOpaque(false);
689 setDescScrollPanel.setViewportView(setDescriptionTextArea);
690
691 editSetButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/edit16.png"))); // NOI18N
692 org.openide.awt.Mnemonics.setLocalizedText(editSetButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.interesting.editSetButton.text")); // NOI18N
693 editSetButton.setEnabled(false);
694 editSetButton.setMargin(new java.awt.Insets(2, 6, 2, 6));
695 editSetButton.setMaximumSize(new java.awt.Dimension(111, 25));
696 editSetButton.setMinimumSize(new java.awt.Dimension(111, 25));
697 editSetButton.setPreferredSize(new java.awt.Dimension(111, 25));
698 editSetButton.addActionListener(new java.awt.event.ActionListener() {
699 public void actionPerformed(java.awt.event.ActionEvent evt) {
700 editSetButtonActionPerformed(evt);
701 }
702 });
703
704 setsList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
705 setsListScrollPane.setViewportView(setsList);
706 setsList.setCellRenderer(new SimpleListCellRenderer());
707
708 fileNameButtonGroup.add(fileNameExtensionRadioButton);
709 org.openide.awt.Mnemonics.setLocalizedText(fileNameExtensionRadioButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.fileNameExtensionRadioButton.text")); // NOI18N
710 fileNameExtensionRadioButton.setEnabled(false);
711
712 org.openide.awt.Mnemonics.setLocalizedText(nameLabel, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.nameLabel.text")); // NOI18N
713
714 fileNameTextField.setEditable(false);
715 fileNameTextField.setText(org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.fileNameTextField.text")); // NOI18N
716
717 org.openide.awt.Mnemonics.setLocalizedText(descriptionLabel, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.descriptionLabel.text")); // NOI18N
718
719 fileNameButtonGroup.add(fileNameRadioButton);
720 org.openide.awt.Mnemonics.setLocalizedText(fileNameRadioButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.fileNameRadioButton.text")); // NOI18N
721 fileNameRadioButton.setEnabled(false);
722
723 rulePathConditionTextField.setEditable(false);
724 rulePathConditionTextField.setText(org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.rulePathConditionTextField.text")); // NOI18N
725
726 org.openide.awt.Mnemonics.setLocalizedText(ignoreKnownFilesCheckbox, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.ignoreKnownFilesCheckbox.text")); // NOI18N
727 ignoreKnownFilesCheckbox.setEnabled(false);
728
729 org.openide.awt.Mnemonics.setLocalizedText(fileNameRegexCheckbox, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.fileNameRegexCheckbox.text")); // NOI18N
730 fileNameRegexCheckbox.setEnabled(false);
731 fileNameRegexCheckbox.addActionListener(new java.awt.event.ActionListener() {
732 public void actionPerformed(java.awt.event.ActionEvent evt) {
733 fileNameRegexCheckboxActionPerformed(evt);
734 }
735 });
736
737 separator.setOrientation(javax.swing.SwingConstants.VERTICAL);
738
739 org.openide.awt.Mnemonics.setLocalizedText(setsListLabel, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.interesting.setsListLabel.text")); // NOI18N
740
741 typeButtonGroup.add(allRadioButton);
742 org.openide.awt.Mnemonics.setLocalizedText(allRadioButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.allRadioButton.text")); // NOI18N
743 allRadioButton.setEnabled(false);
744
745 deleteSetButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/delete16.png"))); // NOI18N
746 org.openide.awt.Mnemonics.setLocalizedText(deleteSetButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.interesting.deleteSetButton.text")); // NOI18N
747 deleteSetButton.setEnabled(false);
748 deleteSetButton.setMargin(new java.awt.Insets(2, 6, 2, 6));
749 deleteSetButton.setMaximumSize(new java.awt.Dimension(111, 25));
750 deleteSetButton.setMinimumSize(new java.awt.Dimension(111, 25));
751 deleteSetButton.setPreferredSize(new java.awt.Dimension(111, 25));
752 deleteSetButton.addActionListener(new java.awt.event.ActionListener() {
753 public void actionPerformed(java.awt.event.ActionEvent evt) {
754 deleteSetButtonActionPerformed(evt);
755 }
756 });
757
758 deleteRuleButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/delete16.png"))); // NOI18N
759 org.openide.awt.Mnemonics.setLocalizedText(deleteRuleButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.deleteRuleButton.text")); // NOI18N
760 deleteRuleButton.setEnabled(false);
761 deleteRuleButton.addActionListener(new java.awt.event.ActionListener() {
762 public void actionPerformed(java.awt.event.ActionEvent evt) {
763 deleteRuleButtonActionPerformed(evt);
764 }
765 });
766
767 newSetButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/add16.png"))); // NOI18N
768 org.openide.awt.Mnemonics.setLocalizedText(newSetButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.interesting.newSetButton.text")); // NOI18N
769 newSetButton.setMargin(new java.awt.Insets(2, 6, 2, 6));
770 newSetButton.setMaximumSize(new java.awt.Dimension(111, 25));
771 newSetButton.setMinimumSize(new java.awt.Dimension(111, 25));
772 newSetButton.setPreferredSize(new java.awt.Dimension(111, 25));
773 newSetButton.addActionListener(new java.awt.event.ActionListener() {
774 public void actionPerformed(java.awt.event.ActionEvent evt) {
775 newSetButtonActionPerformed(evt);
776 }
777 });
778
779 org.openide.awt.Mnemonics.setLocalizedText(fileTypeLabel, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.fileTypeLabel.text")); // NOI18N
780
781 typeButtonGroup.add(dirsRadioButton);
782 org.openide.awt.Mnemonics.setLocalizedText(dirsRadioButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.dirsRadioButton.text")); // NOI18N
783 dirsRadioButton.setEnabled(false);
784
785 org.openide.awt.Mnemonics.setLocalizedText(ruleLabel, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.ruleLabel.text")); // NOI18N
786
787 org.openide.awt.Mnemonics.setLocalizedText(pathLabel, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.pathLabel.text")); // NOI18N
788
789 org.openide.awt.Mnemonics.setLocalizedText(rulePathConditionRegexCheckBox, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.rulePathConditionRegexCheckBox.text")); // NOI18N
790 rulePathConditionRegexCheckBox.setEnabled(false);
791
792 descriptionTextArea.setEditable(false);
793 descriptionTextArea.setBackground(new java.awt.Color(240, 240, 240));
794 descriptionTextArea.setColumns(20);
795 descriptionTextArea.setLineWrap(true);
796 descriptionTextArea.setRows(3);
797 descriptionTextArea.setText(org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.interesting.jTextArea1.text")); // NOI18N
798 descriptionTextArea.setWrapStyleWord(true);
799 descriptionTextArea.setOpaque(false);
800 descriptionScrollPane.setViewportView(descriptionTextArea);
801
802 org.openide.awt.Mnemonics.setLocalizedText(mimeTypeLabel, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.mimeTypeLabel.text")); // NOI18N
803
804 mimeTypeComboBox.setBackground(new java.awt.Color(240, 240, 240));
805 mimeTypeComboBox.setEditable(true);
806 mimeTypeComboBox.setModel(new javax.swing.DefaultComboBoxModel<String>(new String[] {""}));
807 mimeTypeComboBox.setEnabled(false);
808 mimeTypeComboBox.setMinimumSize(new java.awt.Dimension(0, 20));
809 mimeTypeComboBox.setPreferredSize(new java.awt.Dimension(12, 20));
810
811 org.openide.awt.Mnemonics.setLocalizedText(fileSizeLabel, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.fileSizeLabel.text")); // NOI18N
812
813 equalitySignComboBox.setModel(new javax.swing.DefaultComboBoxModel<String>(new String[] { ">", "<" }));
814 equalitySignComboBox.setEnabled(false);
815
816 fileSizeSpinner.setEnabled(false);
817 fileSizeSpinner.setMinimumSize(new java.awt.Dimension(2, 20));
818
819 fileSizeUnitComboBox.setModel(new javax.swing.DefaultComboBoxModel<String>(new String[] { Bundle.FilesSetDefsPanel_bytes(), Bundle.FilesSetDefsPanel_kiloBytes(), Bundle.FilesSetDefsPanel_megaBytes(), Bundle.FilesSetDefsPanel_gigaBytes() }));
820 fileSizeUnitComboBox.setEnabled(false);
821
822 org.openide.awt.Mnemonics.setLocalizedText(ingoreUnallocCheckbox, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.ingoreUnallocCheckbox.text")); // NOI18N
823 ingoreUnallocCheckbox.setToolTipText(org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.ingoreUnallocCheckbox.toolTipText")); // NOI18N
824 ingoreUnallocCheckbox.setEnabled(false);
825
826 ingestWarningLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/modules/hashdatabase/warning16.png"))); // NOI18N
827 org.openide.awt.Mnemonics.setLocalizedText(ingestWarningLabel, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.ingestWarningLabel.text")); // NOI18N
828
829 copySetButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/new16.png"))); // NOI18N
830 org.openide.awt.Mnemonics.setLocalizedText(copySetButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.interesting.copySetButton.text")); // NOI18N
831 copySetButton.setEnabled(false);
832 copySetButton.setMargin(new java.awt.Insets(2, 6, 2, 6));
833 copySetButton.setMaximumSize(new java.awt.Dimension(111, 25));
834 copySetButton.setMinimumSize(new java.awt.Dimension(111, 25));
835 copySetButton.setPreferredSize(new java.awt.Dimension(111, 25));
836 copySetButton.addActionListener(new java.awt.event.ActionListener() {
837 public void actionPerformed(java.awt.event.ActionEvent evt) {
838 copySetButtonActionPerformed(evt);
839 }
840 });
841
842 importSetButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/import16.png"))); // NOI18N
843 org.openide.awt.Mnemonics.setLocalizedText(importSetButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.interesting.importSetButton.text")); // NOI18N
844 importSetButton.setMargin(new java.awt.Insets(2, 6, 2, 6));
845 importSetButton.setMaximumSize(new java.awt.Dimension(111, 25));
846 importSetButton.setMinimumSize(new java.awt.Dimension(111, 25));
847 importSetButton.setPreferredSize(new java.awt.Dimension(111, 25));
848 importSetButton.addActionListener(new java.awt.event.ActionListener() {
849 public void actionPerformed(java.awt.event.ActionEvent evt) {
850 importSetButtonActionPerformed(evt);
851 }
852 });
853
854 exportSetButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/export16.png"))); // NOI18N
855 org.openide.awt.Mnemonics.setLocalizedText(exportSetButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.interesting.exportSetButton.text")); // NOI18N
856 exportSetButton.setEnabled(false);
857 exportSetButton.setMargin(new java.awt.Insets(2, 6, 2, 6));
858 exportSetButton.setMaximumSize(new java.awt.Dimension(111, 25));
859 exportSetButton.setMinimumSize(new java.awt.Dimension(111, 25));
860 exportSetButton.setPreferredSize(new java.awt.Dimension(111, 25));
861 exportSetButton.addActionListener(new java.awt.event.ActionListener() {
862 public void actionPerformed(java.awt.event.ActionEvent evt) {
863 exportSetButtonActionPerformed(evt);
864 }
865 });
866
867 org.openide.awt.Mnemonics.setLocalizedText(modifiedDateLabel, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.modifiedDateLabel.text")); // NOI18N
868
869 daysIncludedTextField.setEditable(false);
870 daysIncludedTextField.setHorizontalAlignment(javax.swing.JTextField.TRAILING);
871 daysIncludedTextField.setText(org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.daysIncludedTextField.text")); // NOI18N
872 daysIncludedTextField.setMinimumSize(new java.awt.Dimension(60, 20));
873 daysIncludedTextField.setPreferredSize(new java.awt.Dimension(60, 20));
874
875 org.openide.awt.Mnemonics.setLocalizedText(daysIncludedLabel, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.daysIncludedLabel.text")); // NOI18N
876 daysIncludedLabel.setEnabled(false);
877
878 javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
879 jPanel1.setLayout(jPanel1Layout);
880 jPanel1Layout.setHorizontalGroup(
881 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
882 .addGroup(jPanel1Layout.createSequentialGroup()
883 .addContainerGap()
884 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
885 .addGroup(jPanel1Layout.createSequentialGroup()
886 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
887 .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
888 .addComponent(copySetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
889 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
890 .addComponent(importSetButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
891 .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
892 .addComponent(newSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
893 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
894 .addComponent(editSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
895 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
896 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
897 .addComponent(exportSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
898 .addComponent(deleteSetButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
899 .addComponent(setsListScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 346, javax.swing.GroupLayout.PREFERRED_SIZE)
900 .addComponent(descriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 346, javax.swing.GroupLayout.PREFERRED_SIZE)
901 .addComponent(setsListLabel))
902 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
903 .addComponent(separator, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
904 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
905 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
906 .addGroup(jPanel1Layout.createSequentialGroup()
907 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
908 .addComponent(rulesListScrollPane, javax.swing.GroupLayout.Alignment.TRAILING)
909 .addComponent(setDescScrollPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
910 .addGroup(jPanel1Layout.createSequentialGroup()
911 .addGap(16, 16, 16)
912 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
913 .addComponent(mimeTypeLabel)
914 .addComponent(fileSizeLabel)
915 .addComponent(fileTypeLabel)
916 .addComponent(pathLabel)
917 .addComponent(modifiedDateLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
918 .addComponent(nameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
919 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
920 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
921 .addComponent(rulePathConditionTextField)
922 .addComponent(fileNameTextField, javax.swing.GroupLayout.Alignment.TRAILING)
923 .addComponent(mimeTypeComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
924 .addGroup(jPanel1Layout.createSequentialGroup()
925 .addComponent(equalitySignComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)
926 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
927 .addComponent(fileSizeSpinner, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
928 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
929 .addComponent(fileSizeUnitComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE))
930 .addGroup(jPanel1Layout.createSequentialGroup()
931 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
932 .addComponent(rulePathConditionRegexCheckBox)
933 .addGroup(jPanel1Layout.createSequentialGroup()
934 .addComponent(daysIncludedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
935 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
936 .addComponent(daysIncludedLabel))
937 .addGroup(jPanel1Layout.createSequentialGroup()
938 .addComponent(filesRadioButton)
939 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
940 .addComponent(dirsRadioButton)
941 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
942 .addComponent(allRadioButton))
943 .addGroup(jPanel1Layout.createSequentialGroup()
944 .addComponent(fileNameRadioButton)
945 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
946 .addComponent(fileNameExtensionRadioButton)
947 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
948 .addComponent(fileNameRegexCheckbox)))
949 .addGap(0, 0, Short.MAX_VALUE)))))
950 .addGap(8, 8, 8))
951 .addGroup(jPanel1Layout.createSequentialGroup()
952 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
953 .addComponent(rulesListLabel)
954 .addGroup(jPanel1Layout.createSequentialGroup()
955 .addComponent(ignoreKnownFilesCheckbox)
956 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
957 .addComponent(ingoreUnallocCheckbox, javax.swing.GroupLayout.PREFERRED_SIZE, 158, javax.swing.GroupLayout.PREFERRED_SIZE))
958 .addGroup(jPanel1Layout.createSequentialGroup()
959 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
960 .addComponent(descriptionLabel)
961 .addComponent(setDetailsLabel))
962 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
963 .addComponent(ingestWarningLabel))
964 .addComponent(ruleLabel)
965 .addGroup(jPanel1Layout.createSequentialGroup()
966 .addComponent(newRuleButton)
967 .addGap(18, 18, 18)
968 .addComponent(editRuleButton)
969 .addGap(18, 18, 18)
970 .addComponent(deleteRuleButton)))
971 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
972 );
973
974 jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {copySetButton, deleteSetButton, editSetButton, exportSetButton, importSetButton, newSetButton});
975
976 jPanel1Layout.setVerticalGroup(
977 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
978 .addGroup(jPanel1Layout.createSequentialGroup()
979 .addContainerGap()
980 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
981 .addComponent(separator)
982 .addGroup(jPanel1Layout.createSequentialGroup()
983 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
984 .addGroup(jPanel1Layout.createSequentialGroup()
985 .addComponent(setDetailsLabel)
986 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
987 .addComponent(descriptionLabel)
988 .addGap(1, 1, 1))
989 .addComponent(ingestWarningLabel, javax.swing.GroupLayout.Alignment.TRAILING))
990 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
991 .addComponent(setDescScrollPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE)
992 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
993 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
994 .addComponent(ignoreKnownFilesCheckbox)
995 .addComponent(ingoreUnallocCheckbox, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
996 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
997 .addComponent(rulesListLabel)
998 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
999 .addComponent(rulesListScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 61, Short.MAX_VALUE)
1000 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1001 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1002 .addComponent(newRuleButton)
1003 .addComponent(editRuleButton)
1004 .addComponent(deleteRuleButton))
1005 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1006 .addComponent(ruleLabel)
1007 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1008 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1009 .addComponent(fileTypeLabel)
1010 .addComponent(filesRadioButton)
1011 .addComponent(dirsRadioButton)
1012 .addComponent(allRadioButton))
1013 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1014 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1015 .addComponent(nameLabel)
1016 .addComponent(fileNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
1017 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1018 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1019 .addComponent(fileNameRadioButton)
1020 .addComponent(fileNameExtensionRadioButton)
1021 .addComponent(fileNameRegexCheckbox))
1022 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1023 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1024 .addComponent(pathLabel)
1025 .addComponent(rulePathConditionTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
1026 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1027 .addComponent(rulePathConditionRegexCheckBox)
1028 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1029 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1030 .addComponent(mimeTypeLabel)
1031 .addComponent(mimeTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1032 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1033 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1034 .addComponent(fileSizeLabel)
1035 .addComponent(equalitySignComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1036 .addComponent(fileSizeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1037 .addComponent(fileSizeUnitComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1038 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1039 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1040 .addComponent(modifiedDateLabel)
1041 .addComponent(daysIncludedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1042 .addComponent(daysIncludedLabel))
1043 .addContainerGap())
1044 .addGroup(jPanel1Layout.createSequentialGroup()
1045 .addComponent(descriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1046 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1047 .addComponent(setsListLabel)
1048 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1049 .addComponent(setsListScrollPane)
1050 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1051 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1052 .addComponent(newSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1053 .addComponent(editSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1054 .addComponent(deleteSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1055 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1056 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1057 .addComponent(copySetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1058 .addComponent(importSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1059 .addComponent(exportSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1060 .addGap(6, 6, 6))))
1061 );
1062
1063 jPanel1Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {copySetButton, deleteRuleButton, deleteSetButton, editRuleButton, editSetButton, exportSetButton, importSetButton, newRuleButton, newSetButton});
1064
1065 jScrollPane1.setViewportView(jPanel1);
1066
1067 javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
1068 this.setLayout(layout);
1069 layout.setHorizontalGroup(
1070 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1071 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 800, Short.MAX_VALUE)
1072 );
1073 layout.setVerticalGroup(
1074 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1075 .addComponent(jScrollPane1)
1076 );
1077 }// </editor-fold>//GEN-END:initComponents
1078
1079 private void newSetButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newSetButtonActionPerformed
1080 this.doFileSetsDialog(null, true);
1081 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
1082 }//GEN-LAST:event_newSetButtonActionPerformed
1083
1084 private void deleteRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteRuleButtonActionPerformed
1085 // Interesting file sets are immutable for thread safety,
1086 // so editing a files set rule definition is a replacement
1087 // operation. Preserve the existing rules from the set being
1088 // edited, except for the deleted rule.
1089 FilesSet oldSet = this.setsList.getSelectedValue();
1090 Map<String, FilesSet.Rule> rules = new HashMap<>(oldSet.getRules());
1091 FilesSet.Rule selectedRule = this.rulesList.getSelectedValue();
1092 rules.remove(selectedRule.getUuid());
1093 this.replaceFilesSet(oldSet, oldSet, rules);
1094 if (!this.rulesListModel.isEmpty()) {
1095 this.rulesList.setSelectedIndex(0);
1096 } else {
1097 this.resetRuleComponents();
1098 }
1099 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
1100 }//GEN-LAST:event_deleteRuleButtonActionPerformed
1101
1102 private void deleteSetButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteSetButtonActionPerformed
1103 FilesSet selectedSet = this.setsList.getSelectedValue();
1106 if (profile.getFileIngestFilter().equals(selectedSet.getName())) {
1107 MessageNotifyUtil.Message.error(NbBundle.getMessage(this.getClass(),
1108 "FilesSetDefsPanel.ingest.fileFilterInUseError",
1109 selectedSet.getName(), profile.toString()));
1110 return;
1111 }
1112 }
1113
1114 }
1115 this.filesSets.remove(selectedSet.getName());
1116 this.setsListModel.removeElement(selectedSet);
1117 // Select the first of the remaining set definitions. This will cause
1118 // the selection listeners to repopulate the subordinate components.
1119 if (!this.filesSets.isEmpty()) {
1120 this.setsList.setSelectedIndex(0);
1121 } else {
1122 this.resetComponents();
1123 }
1124 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
1125 }//GEN-LAST:event_deleteSetButtonActionPerformed
1126
1127 private void editSetButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editSetButtonActionPerformed
1128 this.doFileSetsDialog(this.setsList.getSelectedValue(), false);
1129 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
1130 }//GEN-LAST:event_editSetButtonActionPerformed
1131
1132 private void editRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editRuleButtonActionPerformed
1133 this.doFilesSetRuleDialog(this.rulesList.getSelectedValue());
1134 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
1135 }//GEN-LAST:event_editRuleButtonActionPerformed
1136
1137 private void newRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newRuleButtonActionPerformed
1138 this.doFilesSetRuleDialog(null);
1139 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
1140 }//GEN-LAST:event_newRuleButtonActionPerformed
1141
1142 private void copySetButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_copySetButtonActionPerformed
1143 this.doFileSetsDialog(this.setsList.getSelectedValue(), true);
1144 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
1145 }//GEN-LAST:event_copySetButtonActionPerformed
1146
1147 @NbBundle.Messages({
1148 "FilesSetDefsPanel.interesting.failImportMsg=Interesting files set not imported",
1149 "FilesSetDefsPanel.interesting.fileExtensionFilterLbl=Autopsy Interesting File Set File (xml)",
1150 "FilesSetDefsPanel.interesting.importButtonAction.featureName=Interesting Files Set Import",
1151 "FilesSetDefsPanel.importSetButtonActionPerformed.noFilesSelected=No files sets were selected.",
1152 "FilesSetDefsPanel.importSetButtonActionPerformed.noFiles=No files sets were found in the selected files.",
1153 "# {0} - fileName",
1154 "# {1} - errorMessage",
1155 "FilesSetDefsPanel.importSetButtonActionPerformed.importError=The rules file \"{0}\" could not be read:\n{1}.",})
1156 private void importSetButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_importSetButtonActionPerformed
1157 //save currently selected value as default value to select
1158 FilesSet selectedSet = this.setsList.getSelectedValue();
1159
1160 File lastFolder = getLastUsedDirectory(LAST_IMPORT_PATH_KEY);
1161 importFileChooser.setCurrentDirectory(lastFolder);
1162
1163 int returnVal = importFileChooser.showOpenDialog(this);
1164 if (returnVal == JFileChooser.APPROVE_OPTION) {
1165 File selFile = importFileChooser.getSelectedFile();
1166 if (selFile == null) {
1167 JOptionPane.showMessageDialog(this,
1168 Bundle.FilesSetDefsPanel_importSetButtonActionPerformed_noFilesSelected(),
1169 Bundle.FilesSetDefsPanel_interesting_importButtonAction_featureName(),
1170 JOptionPane.WARNING_MESSAGE);
1171 logger.warning("Selected file was null, when trying to import interesting files set definitions");
1172 return;
1173 }
1174
1176
1177 Collection<FilesSet> importedSets;
1178 try {
1179 importedSets = InterestingItemsFilesSetSettings.readDefinitionsXML(selFile).values(); //read the xml from that path
1180 if (importedSets.isEmpty()) {
1181 JOptionPane.showMessageDialog(this,
1182 Bundle.FilesSetDefsPanel_importSetButtonActionPerformed_noFiles(),
1183 Bundle.FilesSetDefsPanel_interesting_importButtonAction_featureName(),
1184 JOptionPane.WARNING_MESSAGE);
1185 logger.log(Level.WARNING, "No Interesting files set definitions were read from the selected file");
1186 return;
1187 }
1189 JOptionPane.showMessageDialog(this,
1190 Bundle.FilesSetDefsPanel_importSetButtonActionPerformed_importError(selFile.getName(), ex.getMessage()),
1191 Bundle.FilesSetDefsPanel_interesting_importButtonAction_featureName(),
1192 JOptionPane.WARNING_MESSAGE);
1193 logger.log(Level.WARNING, "No Interesting files set definitions were read from the selected file, exception", ex);
1194 return;
1195 }
1196
1197 importedSets = importedSets
1198 .stream()
1199 .map((filesSet) -> StandardInterestingFilesSetsLoader.getAsStandardFilesSet(filesSet, false))
1200 .collect(Collectors.toList());
1201
1202 FilesSet newSelected = determineFilesToImport(importedSets);
1203
1204 // Redo the list model for the files set list component
1205 FilesSetDefsPanel.this.setsListModel.clear();
1206 this.filesSets.values().forEach((set) -> {
1207 this.setsListModel.addElement(set);
1208 });
1209 // Select the new/edited files set definition in the set definitions
1210 // list. This will cause the selection listeners to repopulate the
1211 // subordinate components.
1212 this.setsList.setSelectedValue(newSelected == null ? selectedSet : newSelected, true);
1213
1214 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
1215 }
1216
1217 }//GEN-LAST:event_importSetButtonActionPerformed
1218
1227 private File getLastUsedDirectory(String key) {
1228 File lastFolder = null;
1230 final String lastDirectory = ModuleSettings.getConfigSetting(ModuleSettings.MAIN_SETTINGS, key);
1231 File lastDirectoryFile = new File(lastDirectory);
1232 // Only select it if it exists.
1233 if (lastDirectoryFile.exists()) {
1234 lastFolder = lastDirectoryFile;
1235 }
1236 }
1237 return lastFolder;
1238 }
1239
1248 private FilesSet determineFilesToImport(Collection<FilesSet> importedSets) {
1249 FilesSet selectedSet = null;
1250
1251 for (FilesSet set : importedSets) {
1252 Pair<FilesSet, Integer> conflictResult = handleConflict(set, true);
1253 int choice = conflictResult.getRight();
1254 FilesSet resultingFilesSet = conflictResult.getLeft();
1255
1256 if (choice == JOptionPane.OK_OPTION) {
1257 selectedSet = resultingFilesSet;
1258 this.filesSets.put(resultingFilesSet.getName(), resultingFilesSet);
1259 } else if (choice == JOptionPane.CANCEL_OPTION) {
1260 break;
1261 }
1262 }
1263
1264 return selectedSet;
1265 }
1266
1279 private Pair<FilesSet, Integer> handleConflict(FilesSet set, boolean isImport) {
1280 FilesSet conflict = this.filesSets.get(set.getName());
1281 // if no conflict, return the files set as is with the option to proceed
1282 if (conflict == null) {
1283 return Pair.of(set, JOptionPane.OK_OPTION);
1284 }
1285
1286 if (isImport) {
1287 if (conflict.isStandardSet()) {
1288 return onImportStandardSetConflict(set);
1289 } else {
1290 return onImportConflict(set);
1291 }
1292 } else {
1293 if (conflict.isStandardSet()) {
1295 } else {
1296 return onNewEditSetConflict(set);
1297 }
1298 }
1299
1300 }
1301
1312 @Messages({
1313 "FilesSetDefsPanel.yesOwMsg=Yes, overwrite",
1314 "FilesSetDefsPanel.noSkipMsg=No, skip",
1315 "FilesSetDefsPanel.cancelImportMsg=Cancel import",
1316 "# {0} - FilesSet name",
1317 "FilesSetDefsPanel.interesting.overwriteSetPrompt=Interesting files set \"{0}\" already exists locally, overwrite?",
1318 "FilesSetDefsPanel.interesting.importOwConflict=Import Interesting files set conflict",})
1319 private Pair<FilesSet, Integer> onImportConflict(FilesSet set) {
1320 // if there is a conflict, see if it is okay to overwrite.
1321 Object[] options = {
1322 Bundle.FilesSetDefsPanel_yesOwMsg(),
1323 Bundle.FilesSetDefsPanel_noSkipMsg(),
1324 Bundle.FilesSetDefsPanel_cancelImportMsg()
1325 };
1326 int conflictChoice = JOptionPane.showOptionDialog(this,
1327 Bundle.FilesSetDefsPanel_interesting_overwriteSetPrompt(set.getName()),
1328 Bundle.FilesSetDefsPanel_interesting_importOwConflict(),
1329 JOptionPane.YES_NO_CANCEL_OPTION,
1330 JOptionPane.QUESTION_MESSAGE,
1331 null,
1332 options,
1333 options[0]);
1334
1335 if (conflictChoice == JOptionPane.OK_OPTION) {
1336 // if so, just return the files set to be placed in the map overwriting what is currently present.
1337 return Pair.of(set, conflictChoice);
1338 }
1339
1340 return Pair.of(null, conflictChoice);
1341 }
1342
1353 @Messages({
1354 "FilesSetDefsPanel.yesStandardFileConflictCreate=Yes, create",
1355 "# {0} - FilesSet name",
1356 "# {1} - New FilesSet name",
1357 "FilesSetDefsPanel.interesting.standardFileConflict=A standard interesting file set already exists with the name \"{0}.\" Would you like to rename your set to \"{1}?\"",})
1358 private Pair<FilesSet, Integer> onImportStandardSetConflict(FilesSet set) {
1359 // if there is a conflict and the conflicting files set is a standard files set,
1360 // see if allowing a custom files set is okay.
1361 Object[] options = {
1362 Bundle.FilesSetDefsPanel_yesStandardFileConflictCreate(),
1363 Bundle.FilesSetDefsPanel_noSkipMsg(),
1364 Bundle.FilesSetDefsPanel_cancelImportMsg()
1365 };
1366
1367 String setName = set.getName();
1368 String customSetName = Bundle.StandardInterestingFileSetsLoader_customSuffixed(set.getName());
1369
1370 int conflictChoice = JOptionPane.showOptionDialog(this,
1371 Bundle.FilesSetDefsPanel_interesting_standardFileConflict(setName, customSetName),
1372 Bundle.FilesSetDefsPanel_interesting_importOwConflict(),
1373 JOptionPane.YES_NO_CANCEL_OPTION,
1374 JOptionPane.QUESTION_MESSAGE,
1375 null,
1376 options,
1377 options[0]);
1378
1379 // if it is okay to create with custom prefix, try again to see if there is a conflict.
1380 if (conflictChoice == JOptionPane.OK_OPTION) {
1381 return handleConflict(StandardInterestingFilesSetsLoader.getAsCustomFileSet(set), true);
1382 }
1383
1384 return Pair.of(null, conflictChoice);
1385 }
1386
1397 @Messages({
1398 "FilesSetDefsPanel.cancelNewSetMsg=Cancel",
1399 "FilesSetDefsPanel.interesting.newOwConflict=Interesting files set conflict",})
1400 private Pair<FilesSet, Integer> onNewEditSetConflict(FilesSet set) {
1401 // if there is a conflict, see if it is okay to overwrite.
1402 Object[] options = {
1403 Bundle.FilesSetDefsPanel_yesOwMsg(),
1404 Bundle.FilesSetDefsPanel_cancelNewSetMsg()
1405 };
1406 int conflictChoice = JOptionPane.showOptionDialog(this,
1407 Bundle.FilesSetDefsPanel_interesting_overwriteSetPrompt(set.getName()),
1408 Bundle.FilesSetDefsPanel_interesting_newOwConflict(),
1409 JOptionPane.OK_CANCEL_OPTION,
1410 JOptionPane.QUESTION_MESSAGE,
1411 null,
1412 options,
1413 options[0]);
1414
1415 if (conflictChoice == JOptionPane.OK_OPTION) {
1416 // if so, just return the files set to be placed in the map overwriting what is currently present.
1417 return Pair.of(set, conflictChoice);
1418 }
1419
1420 return Pair.of(null, conflictChoice);
1421 }
1422
1433 private Pair<FilesSet, Integer> onNewEditSetStandardSetConflict(FilesSet set) {
1434 // if there is a conflict and the conflicting files set is a standard files set,
1435 // see if allowing a custom files set is okay.
1436 Object[] options = {
1437 Bundle.FilesSetDefsPanel_yesStandardFileConflictCreate(),
1438 Bundle.FilesSetDefsPanel_cancelNewSetMsg()
1439 };
1440
1441 String setName = set.getName();
1442 String customSetName = Bundle.StandardInterestingFileSetsLoader_customSuffixed(set.getName());
1443
1444 int conflictChoice = JOptionPane.showOptionDialog(this,
1445 Bundle.FilesSetDefsPanel_interesting_standardFileConflict(setName, customSetName),
1446 Bundle.FilesSetDefsPanel_interesting_newOwConflict(),
1447 JOptionPane.OK_CANCEL_OPTION,
1448 JOptionPane.QUESTION_MESSAGE,
1449 null,
1450 options,
1451 options[0]);
1452
1453 // if it is okay to create with custom prefix, try again to see if there is a conflict.
1454 if (conflictChoice == JOptionPane.OK_OPTION) {
1455 return handleConflict(StandardInterestingFilesSetsLoader.getAsCustomFileSet(set), false);
1456 }
1457
1458 return Pair.of(null, conflictChoice);
1459 }
1460
1461 @NbBundle.Messages({"FilesSetDefsPanel.interesting.exportButtonAction.featureName=Interesting Files Set Export",
1462 "# {0} - file name",
1463 "FilesSetDefsPanel.exportButtonActionPerformed.fileExistPrompt=File {0} exists, overwrite?",
1464 "FilesSetDefsPanel.interesting.ExportedMsg=Interesting files set exported",
1465 "FilesSetDefsPanel.interesting.failExportMsg=Export of interesting files set failed"})
1466 private void exportSetButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exportSetButtonActionPerformed
1467 //display warning that existing filessets with duplicate names will be overwritten
1468 //create file chooser to get xml filefinal String FEATURE_NAME = NbBundle.getMessage(this.getClass(),
1469 exportFileChooser.setSelectedFile(new File(this.setsList.getSelectedValue().getName()));
1470
1471 final File lastDirectory = getLastUsedDirectory(LAST_EXPORT_PATH_KEY);
1472 exportFileChooser.setCurrentDirectory(lastDirectory);
1473
1474 int returnVal = exportFileChooser.showSaveDialog(this);
1475 if (returnVal == JFileChooser.APPROVE_OPTION) {
1476 final String FEATURE_NAME = NbBundle.getMessage(this.getClass(),
1477 "FilesSetDefsPanel.interesting.exportButtonAction.featureName");
1478 File selFile = exportFileChooser.getSelectedFile();
1479 if (selFile == null) {
1480 JOptionPane.showMessageDialog(this,
1481 NbBundle.getMessage(this.getClass(), "FilesSetDefsPanel.interesting.failExportMsg"),
1482 FEATURE_NAME,
1483 JOptionPane.WARNING_MESSAGE);
1484 logger.warning("Selected file was null, when trying to export interesting files set definitions");
1485 return;
1486 }
1487
1489
1490 //force append extension if not given
1491 String fileAbs = selFile.getAbsolutePath();
1492 if (!fileAbs.endsWith("." + XML_EXTENSION)) {
1493 fileAbs = fileAbs + "." + XML_EXTENSION;
1494 selFile = new File(fileAbs);
1495 }
1496 if (selFile.exists()) {
1497 //if the file already exists ask the user how to proceed
1498 final String FILE_EXISTS_MESSAGE = NbBundle.getMessage(this.getClass(),
1499 "FilesSetDefsPanel.exportButtonActionPerformed.fileExistPrompt", selFile.getName());
1500 boolean shouldWrite = JOptionPane.showConfirmDialog(this, FILE_EXISTS_MESSAGE, FEATURE_NAME, JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION;
1501 if (!shouldWrite) {
1502 return;
1503 }
1504 }
1505 List<FilesSet> exportSets;
1506 exportSets = new ArrayList<>();
1507 //currently only exports selectedValue
1508 exportSets.add(this.setsList.getSelectedValue());
1509 boolean written = InterestingItemsFilesSetSettings.exportXmlDefinitionsFile(selFile, exportSets);
1510 if (written) {
1511 JOptionPane.showMessageDialog(
1512 WindowManager.getDefault().getMainWindow(),
1513 NbBundle.getMessage(this.getClass(), "FilesSetDefsPanel.interesting.ExportedMsg"),
1514 FEATURE_NAME,
1515 JOptionPane.INFORMATION_MESSAGE);
1516 } else {
1517 JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
1518 NbBundle.getMessage(this.getClass(), "FilesSetDefsPanel.interesting.failExportMsg"),
1519 FEATURE_NAME,
1520 JOptionPane.WARNING_MESSAGE);
1521 logger.warning("Export of interesting files set failed unable to write definitions xml file");
1522 }
1523 }
1524 }//GEN-LAST:event_exportSetButtonActionPerformed
1525
1526 private void fileNameRegexCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileNameRegexCheckboxActionPerformed
1527 // TODO add your handling code here:
1528 }//GEN-LAST:event_fileNameRegexCheckboxActionPerformed
1529
1530 // Variables declaration - do not modify//GEN-BEGIN:variables
1531 private javax.swing.JRadioButton allRadioButton;
1532 private javax.swing.JButton copySetButton;
1533 private javax.swing.JLabel daysIncludedLabel;
1534 private javax.swing.JTextField daysIncludedTextField;
1535 private javax.swing.JButton deleteRuleButton;
1536 private javax.swing.JButton deleteSetButton;
1537 private javax.swing.JLabel descriptionLabel;
1538 private javax.swing.JScrollPane descriptionScrollPane;
1539 private javax.swing.JTextArea descriptionTextArea;
1540 private javax.swing.JRadioButton dirsRadioButton;
1541 private javax.swing.JButton editRuleButton;
1542 private javax.swing.JButton editSetButton;
1543 private javax.swing.JComboBox<String> equalitySignComboBox;
1544 private javax.swing.JButton exportSetButton;
1545 private javax.swing.ButtonGroup fileNameButtonGroup;
1546 private javax.swing.JRadioButton fileNameExtensionRadioButton;
1547 private javax.swing.JRadioButton fileNameRadioButton;
1548 private javax.swing.JCheckBox fileNameRegexCheckbox;
1549 private javax.swing.JTextField fileNameTextField;
1550 private javax.swing.JLabel fileSizeLabel;
1551 private javax.swing.JSpinner fileSizeSpinner;
1552 private javax.swing.JComboBox<String> fileSizeUnitComboBox;
1553 private javax.swing.JLabel fileTypeLabel;
1554 private javax.swing.JRadioButton filesRadioButton;
1555 private javax.swing.JCheckBox ignoreKnownFilesCheckbox;
1556 private javax.swing.JButton importSetButton;
1557 private javax.swing.JLabel ingestWarningLabel;
1558 private javax.swing.JCheckBox ingoreUnallocCheckbox;
1559 private javax.swing.JPanel jPanel1;
1560 private javax.swing.JScrollPane jScrollPane1;
1561 private javax.swing.JComboBox<String> mimeTypeComboBox;
1562 private javax.swing.JLabel mimeTypeLabel;
1563 private javax.swing.JLabel modifiedDateLabel;
1564 private javax.swing.JLabel nameLabel;
1565 private javax.swing.JButton newRuleButton;
1566 private javax.swing.JButton newSetButton;
1567 private javax.swing.JLabel pathLabel;
1568 private javax.swing.JLabel ruleLabel;
1569 private javax.swing.JCheckBox rulePathConditionRegexCheckBox;
1570 private javax.swing.JTextField rulePathConditionTextField;
1571 private javax.swing.JList<FilesSet.Rule> rulesList;
1572 private javax.swing.JLabel rulesListLabel;
1573 private javax.swing.JScrollPane rulesListScrollPane;
1574 private javax.swing.JSeparator separator;
1575 private javax.swing.JScrollPane setDescScrollPanel;
1576 private javax.swing.JTextArea setDescriptionTextArea;
1577 private javax.swing.JLabel setDetailsLabel;
1578 private javax.swing.JList<FilesSet> setsList;
1579 private javax.swing.JLabel setsListLabel;
1580 private javax.swing.JScrollPane setsListScrollPane;
1581 private javax.swing.ButtonGroup typeButtonGroup;
1582 // End of variables declaration//GEN-END:variables
1583
1584}
synchronized static Logger getLogger(String name)
Definition Logger.java:124
static synchronized void setConfigSetting(String moduleName, String settingName, String settingVal)
static synchronized String getConfigSetting(String moduleName, String settingName)
static synchronized boolean settingExists(String moduleName, String settingName)
static synchronized IngestManager getInstance()
void addIngestJobEventListener(final PropertyChangeListener listener)
static synchronized List< IngestProfile > getIngestProfiles()
static synchronized SortedSet< String > getDetectedTypes()
void replaceFilesSet(FilesSet oldSet, FilesSet newSet, Map< String, FilesSet.Rule > rules)
FilesSet determineFilesToImport(Collection< FilesSet > importedSets)
Pair< FilesSet, Integer > handleConflict(FilesSet set, boolean isImport)
void doFileSetsDialog(FilesSet selectedSet, boolean shouldCreateNew)
Pair< FilesSet, Integer > onNewEditSetStandardSetConflict(FilesSet set)

Copyright © 2012-2024 Sleuth Kit Labs. Generated on:
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.