19 package org.sleuthkit.autopsy.modules.interestingitems;
21 import java.awt.EventQueue;
23 import java.util.ArrayList;
24 import java.util.Collection;
25 import java.util.HashMap;
26 import java.util.List;
28 import java.util.SortedSet;
29 import java.util.TreeMap;
30 import java.util.logging.Level;
31 import javax.swing.DefaultListModel;
32 import javax.swing.JButton;
33 import javax.swing.JFileChooser;
34 import javax.swing.JOptionPane;
35 import javax.swing.event.ListSelectionEvent;
36 import javax.swing.event.ListSelectionListener;
37 import javax.swing.filechooser.FileNameExtensionFilter;
38 import org.netbeans.spi.options.OptionsPanelController;
39 import org.openide.util.NbBundle;
40 import org.openide.windows.WindowManager;
56 @NbBundle.Messages({
"# {0} - filter name",
57 "# {1} - profile name",
58 "FilesSetDefsPanel.ingest.fileFilterInUseError=The selected file filter, {0}, is being used by a profile, {1}, and cannot be deleted while any profile uses it.",
59 "FilesSetDefsPanel.bytes=Bytes",
60 "FilesSetDefsPanel.kiloBytes=Kilobytes",
61 "FilesSetDefsPanel.megaBytes=Megabytes",
62 "FilesSetDefsPanel.gigaBytes=Gigabytes",
63 "FilesSetDefsPanel.loadError=Error loading interesting files sets from file.",
64 "FilesSetDefsPanel.saveError=Error saving interesting files sets to file.",
65 "FilesSetDefsPanel.interesting.copySetButton.text=Copy Set",
66 "FilesSetDefsPanel.interesting.importSetButton.text=Import Set",
67 "FilesSetDefsPanel.interesting.exportSetButton.text=Export Set"
74 private final DefaultListModel<FilesSet>
setsListModel =
new DefaultListModel<>();
77 private final JButton
okButton =
new JButton(
"OK");
100 this.
setsList.setModel(setsListModel);
110 this.
jLabel7.setVisible(
false);
113 this.filterDialogTitle =
"FilesSetPanel.filter.title";
114 this.ruleDialogTitle =
"FilesSetPanel.rule.title";
115 this.
jLabel8.setVisible(
false);
118 this.
jLabel2.setVisible(
false);
127 org.openide.awt.Mnemonics.setLocalizedText(
jLabel6,
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class,
"FilesSetDefsPanel.ingest.jLabel6.text"));
129 this.filterDialogTitle =
"FilesSetPanel.interesting.title";
130 this.ruleDialogTitle =
"FilesSetPanel.interesting.title";
135 @NbBundle.Messages({
"FilesSetDefsPanel.Interesting.Title=Global Interesting Items Settings",
136 "FilesSetDefsPanel.Ingest.Title=File Filter Settings"})
139 setName(Bundle.FilesSetDefsPanel_Ingest_Title());
141 setName(Bundle.FilesSetDefsPanel_Interesting_Title());
146 detectableMimeTypes.forEach((type) -> {
150 logger.log(Level.SEVERE,
"Unable to get detectable file types", ex);
168 logger.log(Level.WARNING, Bundle.FilesSetDefsPanel_saveError(), ex);
175 canBeEnabled = isEnabled;
208 logger.log(Level.WARNING, Bundle.FilesSetDefsPanel_loadError(), ex);
209 this.filesSets =
new TreeMap<>();
214 this.filesSets.values().forEach((set) -> {
215 this.setsListModel.addElement(set);
218 if (!this.filesSets.isEmpty()) {
221 EventQueue.invokeLater(() -> {
232 this.setsListModel.clear();
272 if (e.getValueIsAdjusting()) {
284 if (selectedSet != null) {
296 TreeMap<String,
FilesSet.
Rule> rules =
new TreeMap<>(selectedSet.getRules());
297 rules.values().forEach((rule) -> {
317 if (e.getValueIsAdjusting()) {
333 if (nameCondition != null) {
344 switch (typeCondition.getMetaType()) {
351 case FILES_AND_DIRECTORIES:
355 if (pathCondition != null) {
362 if (mimeTypeCondition != null) {
367 if (fileSizeCondition != null) {
376 if (dateCondition != null){
407 if (selectedSet != null) {
418 int option = JOptionPane.OK_OPTION;
420 option = JOptionPane.showConfirmDialog(null, panel, NbBundle.getMessage(
FilesSetPanel.class, filterDialogTitle), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
421 }
while (option == JOptionPane.OK_OPTION && !panel.isValidDefinition());
425 if (this.filesSets.containsKey(panel.getFilesSetName()) && shouldCreateNew) {
427 "FilesSetDefsPanel.doFileSetsDialog.duplicateRuleSet.text",
428 panel.getFilesSetName()));
432 if (option == JOptionPane.OK_OPTION) {
434 if (selectedSet != null) {
438 rules.putAll(selectedSet.getRules());
440 if (shouldCreateNew) {
441 this.replaceFilesSet(null, panel.getFilesSetName(), panel.getFilesSetDescription(), panel.getFileSetIgnoresKnownFiles(), panel.getFileSetIgnoresUnallocatedSpace(), rules);
443 this.replaceFilesSet(selectedSet, panel.getFilesSetName(), panel.getFilesSetDescription(), panel.getFileSetIgnoresKnownFiles(), panel.getFileSetIgnoresUnallocatedSpace(), rules);
457 FilesSetRulePanel panel;
458 if (selectedRule != null) {
460 panel =
new FilesSetRulePanel(selectedRule, okButton, cancelButton, panelType);
463 panel =
new FilesSetRulePanel(okButton, cancelButton, panelType);
468 int option = JOptionPane.OK_OPTION;
470 option = JOptionPane.showOptionDialog(null, panel, NbBundle.getMessage(
FilesSetPanel.class, ruleDialogTitle), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null,
new Object[]{
okButton, cancelButton},
okButton);
472 }
while (option == JOptionPane.OK_OPTION && !panel.isValidRuleDefinition());
474 if (option == JOptionPane.OK_OPTION) {
479 Map<String,
FilesSet.
Rule> rules =
new HashMap<>(selectedSet.getRules());
483 if (selectedRule != null) {
484 rules.remove(selectedRule.getUuid());
486 FilesSet.
Rule newRule =
new FilesSet.
Rule(panel.getRuleName(), panel.getFileNameCondition(), panel.getMetaTypeCondition(), panel.getPathCondition(), panel.getMimeTypeCondition(), panel.getFileSizeCondition(), panel.getDateCondition());
487 rules.put(newRule.getUuid(), newRule);
496 EventQueue.invokeLater(() -> {
497 this.
rulesList.setSelectedValue(newRule,
true);
517 void replaceFilesSet(
FilesSet oldSet, String name, String description,
boolean ignoresKnownFiles,
boolean ignoresUnallocatedSpace, Map<String, FilesSet.Rule> rules) {
518 if (oldSet != null) {
521 this.filesSets.remove(oldSet.
getName());
526 FilesSet newSet =
new FilesSet(name, description, ignoresKnownFiles, ignoresUnallocatedSpace, rules);
527 this.filesSets.put(newSet.getName(), newSet);
532 this.filesSets.values().forEach((set) -> {
533 this.setsListModel.addElement(set);
539 this.
setsList.setSelectedValue(newSet,
true);
547 @SuppressWarnings(
"unchecked")
554 jPanel1 =
new javax.swing.JPanel();
555 jLabel6 =
new javax.swing.JLabel();
566 setsList =
new javax.swing.JList<>();
568 jLabel3 =
new javax.swing.JLabel();
570 jLabel5 =
new javax.swing.JLabel();
575 separator =
new javax.swing.JSeparator();
581 jLabel2 =
new javax.swing.JLabel();
583 jLabel1 =
new javax.swing.JLabel();
584 jLabel4 =
new javax.swing.JLabel();
588 jLabel7 =
new javax.swing.JLabel();
590 jLabel8 =
new javax.swing.JLabel();
603 setFont(getFont().deriveFont(getFont().getStyle() & ~java.awt.Font.BOLD, 11));
607 jPanel1.setFont(
jPanel1.getFont().deriveFont(
jPanel1.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
609 jLabel6.setFont(
jLabel6.getFont().deriveFont(
jLabel6.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
610 org.openide.awt.Mnemonics.setLocalizedText(
jLabel6,
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class,
"FilesSetDefsPanel.interesting.jLabel6.text"));
613 newRuleButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/add16.png")));
615 newRuleButton.addActionListener(
new java.awt.event.ActionListener() {
616 public void actionPerformed(java.awt.event.ActionEvent evt) {
628 editRuleButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/edit16.png")));
631 editRuleButton.addActionListener(
new java.awt.event.ActionListener() {
632 public void actionPerformed(java.awt.event.ActionEvent evt) {
643 rulesList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
660 editSetButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/edit16.png")));
664 editSetButton.setMaximumSize(
new java.awt.Dimension(111, 25));
665 editSetButton.setMinimumSize(
new java.awt.Dimension(111, 25));
666 editSetButton.setPreferredSize(
new java.awt.Dimension(111, 25));
667 editSetButton.addActionListener(
new java.awt.event.ActionListener() {
668 public void actionPerformed(java.awt.event.ActionEvent evt) {
676 setsList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
684 jLabel3.setFont(
jLabel3.getFont().deriveFont(
jLabel3.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
685 org.openide.awt.Mnemonics.setLocalizedText(
jLabel3,
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class,
"FilesSetDefsPanel.jLabel3.text"));
691 jLabel5.setFont(
jLabel5.getFont().deriveFont(
jLabel5.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
692 org.openide.awt.Mnemonics.setLocalizedText(
jLabel5,
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class,
"FilesSetDefsPanel.jLabel5.text"));
711 separator.setOrientation(javax.swing.SwingConstants.VERTICAL);
722 deleteSetButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/delete16.png")));
729 deleteSetButton.addActionListener(
new java.awt.event.ActionListener() {
730 public void actionPerformed(java.awt.event.ActionEvent evt) {
736 deleteRuleButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/delete16.png")));
740 public void actionPerformed(java.awt.event.ActionEvent evt) {
746 newSetButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/add16.png")));
747 org.openide.awt.Mnemonics.setLocalizedText(
newSetButton,
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class,
"FilesSetDefsPanel.interesting.newSetButton.text"));
748 newSetButton.setMargin(
new java.awt.Insets(2, 6, 2, 6));
749 newSetButton.setMaximumSize(
new java.awt.Dimension(111, 25));
750 newSetButton.setMinimumSize(
new java.awt.Dimension(111, 25));
751 newSetButton.setPreferredSize(
new java.awt.Dimension(111, 25));
752 newSetButton.addActionListener(
new java.awt.event.ActionListener() {
753 public void actionPerformed(java.awt.event.ActionEvent evt) {
758 jLabel2.setFont(
jLabel2.getFont().deriveFont(
jLabel2.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
759 org.openide.awt.Mnemonics.setLocalizedText(
jLabel2,
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class,
"FilesSetDefsPanel.jLabel2.text"));
766 jLabel1.setFont(
jLabel1.getFont().deriveFont(
jLabel1.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
767 org.openide.awt.Mnemonics.setLocalizedText(
jLabel1,
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class,
"FilesSetDefsPanel.jLabel1.text"));
769 jLabel4.setFont(
jLabel4.getFont().deriveFont(
jLabel4.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
770 org.openide.awt.Mnemonics.setLocalizedText(
jLabel4,
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class,
"FilesSetDefsPanel.jLabel4.text"));
779 jTextArea1.setBackground(
new java.awt.Color(240, 240, 240));
788 org.openide.awt.Mnemonics.setLocalizedText(
jLabel7,
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class,
"FilesSetDefsPanel.jLabel7.text"));
791 mimeTypeComboBox.setModel(
new javax.swing.DefaultComboBoxModel<String>(
new String[] {
""}));
796 org.openide.awt.Mnemonics.setLocalizedText(
jLabel8,
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class,
"FilesSetDefsPanel.jLabel8.text"));
798 equalitySignComboBox.setModel(
new javax.swing.DefaultComboBoxModel<String>(
new String[] {
"=",
">",
"≥",
"<",
"≤" }));
801 fileSizeSpinner.setEnabled(
false);
802 fileSizeSpinner.setMinimumSize(
new java.awt.Dimension(2, 20));
804 fileSizeUnitComboBox.setModel(
new javax.swing.DefaultComboBoxModel<String>(
new String[] { Bundle.FilesSetDefsPanel_bytes(), Bundle.FilesSetDefsPanel_kiloBytes(), Bundle.FilesSetDefsPanel_megaBytes(), Bundle.FilesSetDefsPanel_gigaBytes() }));
807 org.openide.awt.Mnemonics.setLocalizedText(ingoreUnallocCheckbox,
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class,
"FilesSetDefsPanel.ingoreUnallocCheckbox.text"));
808 ingoreUnallocCheckbox.setToolTipText(
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class,
"FilesSetDefsPanel.ingoreUnallocCheckbox.toolTipText"));
809 ingoreUnallocCheckbox.setEnabled(
false);
812 ingestWarningLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/modules/hashdatabase/warning16.png")));
815 copySetButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/new16.png")));
819 copySetButton.setMaximumSize(
new java.awt.Dimension(111, 25));
820 copySetButton.setMinimumSize(
new java.awt.Dimension(111, 25));
821 copySetButton.setPreferredSize(
new java.awt.Dimension(111, 25));
822 copySetButton.addActionListener(
new java.awt.event.ActionListener() {
823 public void actionPerformed(java.awt.event.ActionEvent evt) {
828 importSetButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/import16.png")));
834 importSetButton.addActionListener(
new java.awt.event.ActionListener() {
835 public void actionPerformed(java.awt.event.ActionEvent evt) {
840 exportSetButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/export16.png")));
847 exportSetButton.addActionListener(
new java.awt.event.ActionListener() {
848 public void actionPerformed(java.awt.event.ActionEvent evt) {
864 javax.swing.GroupLayout jPanel1Layout =
new javax.swing.GroupLayout(
jPanel1);
865 jPanel1.setLayout(jPanel1Layout);
866 jPanel1Layout.setHorizontalGroup(
867 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
868 .addGroup(jPanel1Layout.createSequentialGroup()
870 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
871 .addGroup(jPanel1Layout.createSequentialGroup()
872 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING,
false)
873 .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
874 .addComponent(
copySetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
875 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
876 .addComponent(
importSetButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
877 .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
878 .addComponent(
newSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
879 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
880 .addComponent(
editSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
881 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
882 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
883 .addComponent(
exportSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
884 .addComponent(
deleteSetButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
885 .addComponent(
setsListScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 346, javax.swing.GroupLayout.PREFERRED_SIZE)
886 .addComponent(
jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 346, javax.swing.GroupLayout.PREFERRED_SIZE)
888 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
889 .addComponent(
separator, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
890 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
891 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
892 .addGroup(jPanel1Layout.createSequentialGroup()
893 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
895 .addComponent(
setDescScrollPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
896 .addGroup(jPanel1Layout.createSequentialGroup()
898 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING,
false)
903 .addComponent(
modifiedDateLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
904 .addComponent(
jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
905 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
906 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
909 .addComponent(
mimeTypeComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
910 .addGroup(jPanel1Layout.createSequentialGroup()
911 .addComponent(
equalitySignComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)
912 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
913 .addComponent(fileSizeSpinner, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
914 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
915 .addComponent(
fileSizeUnitComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE))
916 .addGroup(jPanel1Layout.createSequentialGroup()
917 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
920 .addGroup(jPanel1Layout.createSequentialGroup()
921 .addComponent(
daysIncludedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
922 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
924 .addGroup(jPanel1Layout.createSequentialGroup()
925 .addComponent(
filesRadioButton, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE)
926 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
928 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
930 .addGap(0, 0, Short.MAX_VALUE)))))
932 .addGroup(jPanel1Layout.createSequentialGroup()
933 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
935 .addGroup(jPanel1Layout.createSequentialGroup()
937 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
938 .addComponent(ingoreUnallocCheckbox, javax.swing.GroupLayout.PREFERRED_SIZE, 158, javax.swing.GroupLayout.PREFERRED_SIZE))
939 .addGroup(jPanel1Layout.createSequentialGroup()
940 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
943 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
945 .addGroup(jPanel1Layout.createSequentialGroup()
946 .addGap(174, 174, 174)
948 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
951 .addGroup(jPanel1Layout.createSequentialGroup()
957 .addGap(24, 28, Short.MAX_VALUE))))
960 jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL,
new java.awt.Component[] {copySetButton, deleteSetButton, editSetButton, exportSetButton, importSetButton, newSetButton});
962 jPanel1Layout.setVerticalGroup(
963 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
964 .addGroup(jPanel1Layout.createSequentialGroup()
966 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
968 .addGroup(jPanel1Layout.createSequentialGroup()
969 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
970 .addGroup(jPanel1Layout.createSequentialGroup()
972 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
976 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
977 .addComponent(
setDescScrollPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE)
978 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
979 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
981 .addComponent(ingoreUnallocCheckbox, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
982 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
984 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
985 .addComponent(
rulesListScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 61, Short.MAX_VALUE)
986 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
987 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
991 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
993 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
994 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
999 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1000 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1002 .addComponent(
fileNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
1003 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1004 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1008 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1009 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1011 .addComponent(
rulePathConditionTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
1012 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1014 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1015 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1017 .addComponent(
mimeTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1018 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1019 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1021 .addComponent(
equalitySignComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1022 .addComponent(fileSizeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1023 .addComponent(
fileSizeUnitComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1024 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1025 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1027 .addComponent(
daysIncludedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1030 .addGroup(jPanel1Layout.createSequentialGroup()
1031 .addComponent(
jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1032 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1034 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1036 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1037 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1038 .addComponent(
newSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1039 .addComponent(
editSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1040 .addComponent(
deleteSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1041 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1042 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
1043 .addComponent(
copySetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1044 .addComponent(
importSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1045 .addComponent(
exportSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
1049 jPanel1Layout.linkSize(javax.swing.SwingConstants.VERTICAL,
new java.awt.Component[] {copySetButton, deleteRuleButton, deleteSetButton, editRuleButton, editSetButton, exportSetButton, importSetButton, newRuleButton, newSetButton});
1053 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
1054 this.setLayout(layout);
1055 layout.setHorizontalGroup(
1056 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1059 layout.setVerticalGroup(
1060 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1067 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
1076 Map<String,
FilesSet.
Rule> rules =
new HashMap<>(oldSet.getRules());
1078 rules.remove(selectedRule.getUuid());
1085 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
1092 if (profile.getFileIngestFilter().equals(selectedSet.
getName())) {
1094 "FilesSetDefsPanel.ingest.fileFilterInUseError",
1095 selectedSet.
getName(), profile.toString()));
1101 this.filesSets.remove(selectedSet.
getName());
1102 this.setsListModel.removeElement(selectedSet);
1105 if (!this.filesSets.isEmpty()) {
1110 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
1115 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
1120 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
1125 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
1130 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
1132 @NbBundle.Messages({
1133 "FilesSetDefsPanel.yesOwMsg=Yes, overwrite",
1134 "FilesSetDefsPanel.noSkipMsg=No, skip",
1135 "FilesSetDefsPanel.cancelImportMsg=Cancel import",
1136 "# {0} - FilesSet name",
1137 "FilesSetDefsPanel.interesting.overwriteSetPrompt=Interesting files set <{0}> already exists locally, overwrite?",
1138 "FilesSetDefsPanel.interesting.importOwConflict=Import Interesting files set conflict",
1139 "FilesSetDefsPanel.interesting.failImportMsg=Interesting files set not imported",
1140 "FilesSetDefsPanel.interesting.fileExtensionFilterLbl=Autopsy Interesting File Set File (xml)",
1141 "FilesSetDefsPanel.interesting.importButtonAction.featureName=Interesting Files Set Import"
1146 JFileChooser chooser =
new JFileChooser();
1147 final String EXTENSION =
"xml";
1148 FileNameExtensionFilter autopsyFilter =
new FileNameExtensionFilter(
1149 NbBundle.getMessage(
this.getClass(),
"FilesSetDefsPanel.interesting.fileExtensionFilterLbl"), EXTENSION);
1150 chooser.addChoosableFileFilter(autopsyFilter);
1151 chooser.setAcceptAllFileFilterUsed(
false);
1152 chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
1153 int returnVal = chooser.showOpenDialog(
this);
1154 if (returnVal == JFileChooser.APPROVE_OPTION) {
1155 File selFile = chooser.getSelectedFile();
1156 if (selFile == null) {
1157 JOptionPane.showMessageDialog(
this,
1158 NbBundle.getMessage(
this.getClass(),
"FilesSetDefsPanel.interesting.failImportMsg"),
1159 NbBundle.getMessage(
this.getClass(),
"FilesSetDefsPanel.interesting.importButtonAction.featureName"),
1160 JOptionPane.WARNING_MESSAGE);
1161 logger.warning(
"Selected file was null, when trying to import interesting files set definitions");
1164 Collection<FilesSet> importedSets;
1166 importedSets = InterestingItemsFilesSetSettings.readDefinitionsXML(selFile).values();
1167 if (importedSets.isEmpty()) {
1171 JOptionPane.showMessageDialog(
this,
1172 NbBundle.getMessage(
this.getClass(),
"FilesSetDefsPanel.interesting.failImportMsg"),
1173 NbBundle.getMessage(
this.getClass(),
"FilesSetDefsPanel.interesting.importButtonAction.featureName"),
1174 JOptionPane.WARNING_MESSAGE);
1175 logger.log(Level.WARNING,
"No Interesting files set definitions were read from the selected file, exception", ex);
1178 for (
FilesSet set : importedSets) {
1179 int choice = JOptionPane.OK_OPTION;
1180 if (filesSets.containsKey(set.getName())) {
1181 Object[] options = {NbBundle.getMessage(this.getClass(),
"FilesSetDefsPanel.yesOwMsg"),
1182 NbBundle.getMessage(this.getClass(),
"FilesSetDefsPanel.noSkipMsg"),
1183 NbBundle.getMessage(this.getClass(),
"FilesSetDefsPanel.cancelImportMsg")};
1184 choice = JOptionPane.showOptionDialog(
this,
1185 NbBundle.getMessage(
this.getClass(),
"FilesSetDefsPanel.interesting.overwriteSetPrompt", set.getName()),
1186 NbBundle.getMessage(
this.getClass(),
"FilesSetDefsPanel.interesting.importOwConflict"),
1187 JOptionPane.YES_NO_CANCEL_OPTION,
1188 JOptionPane.QUESTION_MESSAGE,
1193 if (choice == JOptionPane.OK_OPTION) {
1195 this.filesSets.put(set.getName(), set);
1196 }
else if (choice == JOptionPane.CANCEL_OPTION) {
1202 this.filesSets.values().forEach((set) -> {
1203 this.setsListModel.addElement(set);
1208 this.
setsList.setSelectedValue(selectedSet,
true);
1209 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
1214 @NbBundle.Messages({
"FilesSetDefsPanel.interesting.exportButtonAction.featureName=Interesting Files Set Export",
1215 "# {0} - file name",
1216 "FilesSetDefsPanel.exportButtonActionPerformed.fileExistPrompt=File {0} exists, overwrite?",
1217 "FilesSetDefsPanel.interesting.ExportedMsg=Interesting files set exported",
1218 "FilesSetDefsPanel.interesting.failExportMsg=Export of interesting files set failed"})
1222 JFileChooser chooser =
new JFileChooser();
1223 final String EXTENSION =
"xml";
1224 FileNameExtensionFilter autopsyFilter =
new FileNameExtensionFilter(
1225 NbBundle.getMessage(
this.getClass(),
"FilesSetDefsPanel.interesting.fileExtensionFilterLbl"), EXTENSION);
1226 chooser.addChoosableFileFilter(autopsyFilter);
1227 chooser.setSelectedFile(
new File(this.
setsList.getSelectedValue().getName()));
1228 chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
1229 int returnVal = chooser.showSaveDialog(
this);
1230 if (returnVal == JFileChooser.APPROVE_OPTION) {
1231 final String FEATURE_NAME = NbBundle.getMessage(this.getClass(),
1232 "FilesSetDefsPanel.interesting.exportButtonAction.featureName");
1233 File selFile = chooser.getSelectedFile();
1234 if (selFile == null) {
1235 JOptionPane.showMessageDialog(
this,
1236 NbBundle.getMessage(
this.getClass(),
"FilesSetDefsPanel.interesting.failExportMsg"),
1238 JOptionPane.WARNING_MESSAGE);
1239 logger.warning(
"Selected file was null, when trying to export interesting files set definitions");
1243 String fileAbs = selFile.getAbsolutePath();
1244 if (!fileAbs.endsWith(
"." + EXTENSION)) {
1245 fileAbs = fileAbs +
"." + EXTENSION;
1246 selFile =
new File(fileAbs);
1248 if (selFile.exists()) {
1250 final String FILE_EXISTS_MESSAGE = NbBundle.getMessage(this.getClass(),
1251 "FilesSetDefsPanel.exportButtonActionPerformed.fileExistPrompt", selFile.getName());
1252 boolean shouldWrite = JOptionPane.showConfirmDialog(null, FILE_EXISTS_MESSAGE, FEATURE_NAME, JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION;
1257 List<FilesSet> exportSets;
1258 exportSets =
new ArrayList<>();
1260 exportSets.add(this.
setsList.getSelectedValue());
1261 boolean written = InterestingItemsFilesSetSettings.exportXmlDefinitionsFile(selFile, exportSets);
1263 JOptionPane.showMessageDialog(
1264 WindowManager.getDefault().getMainWindow(),
1265 NbBundle.getMessage(this.getClass(),
"FilesSetDefsPanel.interesting.ExportedMsg"),
1267 JOptionPane.INFORMATION_MESSAGE);
1269 JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
1270 NbBundle.getMessage(this.getClass(),
"FilesSetDefsPanel.interesting.failExportMsg"),
1272 JOptionPane.WARNING_MESSAGE);
1273 logger.warning(
"Export of interesting files set failed unable to write definitions xml file");
void deleteRuleButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JLabel daysIncludedLabel
javax.swing.JPanel jPanel1
javax.swing.JLabel jLabel4
javax.swing.JRadioButton fileNameExtensionRadioButton
javax.swing.JComboBox< String > fileSizeUnitComboBox
void valueChanged(ListSelectionEvent e)
javax.swing.JLabel jLabel6
javax.swing.JButton importSetButton
void editSetButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JTextField fileNameTextField
javax.swing.JButton copySetButton
javax.swing.JLabel modifiedDateLabel
javax.swing.JLabel jLabel1
javax.swing.JButton exportSetButton
void deleteSetButtonActionPerformed(java.awt.event.ActionEvent evt)
final DefaultListModel< FilesSet > setsListModel
void editRuleButtonActionPerformed(java.awt.event.ActionEvent evt)
void exportSetButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JScrollPane rulesListScrollPane
javax.swing.JScrollPane setDescScrollPanel
javax.swing.JButton newSetButton
javax.swing.JLabel rulesListLabel
static synchronized FilesSetsManager getInstance()
javax.swing.JScrollPane setsListScrollPane
void copySetButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JLabel jLabel7
javax.swing.JList< FilesSet > setsList
Map< String, FilesSet > getCustomFileIngestFilters()
javax.swing.JSpinner fileSizeSpinner
javax.swing.JTextArea jTextArea1
javax.swing.ButtonGroup fileNameButtonGroup
void doFilesSetRuleDialog(FilesSet.Rule selectedRule)
javax.swing.JCheckBox ignoreKnownFilesCheckbox
javax.swing.JLabel setsListLabel
javax.swing.JCheckBox ingoreUnallocCheckbox
void newRuleButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JLabel jLabel8
FilesSetDefsPanel(PANEL_TYPE panelType)
static synchronized List< IngestProfile > getIngestProfiles()
static final long serialVersionUID
javax.swing.JLabel jLabel3
javax.swing.JTextField daysIncludedTextField
javax.swing.JButton newRuleButton
void doFileSetsDialog(FilesSet selectedSet, boolean shouldCreateNew)
javax.swing.JLabel jLabel2
void valueChanged(ListSelectionEvent e)
void importSetButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JButton deleteSetButton
javax.swing.JRadioButton filesRadioButton
javax.swing.JTextArea setDescriptionTextArea
javax.swing.JButton editSetButton
final String ruleDialogTitle
javax.swing.JCheckBox rulePathConditionRegexCheckBox
javax.swing.JSeparator separator
javax.swing.JCheckBox fileNameRegexCheckbox
void resetRuleComponents()
TreeMap< String, FilesSet > filesSets
javax.swing.JRadioButton dirsRadioButton
javax.swing.JRadioButton allRadioButton
javax.swing.JComboBox< String > equalitySignComboBox
synchronized static Logger getLogger(String name)
void enableButtons(boolean isEnabled)
final PANEL_TYPE panelType
javax.swing.JButton deleteRuleButton
javax.swing.JButton editRuleButton
javax.swing.JScrollPane jScrollPane2
javax.swing.JLabel ingestWarningLabel
final String filterDialogTitle
void newSetButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JTextField rulePathConditionTextField
javax.swing.JComboBox< String > mimeTypeComboBox
final JButton cancelButton
boolean ingoresUnallocatedSpace()
static synchronized SortedSet< String > getDetectedTypes()
javax.swing.JRadioButton fileNameRadioButton
javax.swing.JScrollPane jScrollPane1
javax.swing.JLabel jLabel5
final DefaultListModel< FilesSet.Rule > rulesListModel
javax.swing.JList< FilesSet.Rule > rulesList
static void error(String message)
javax.swing.ButtonGroup typeButtonGroup