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");
 
   99         this.
setsList.setModel(setsListModel);
 
  109             this.
jLabel7.setVisible(
false);
 
  112             this.ruleDialogTitle = 
"FilesSetPanel.ingest.title";
 
  113             this.
jLabel8.setVisible(
false);
 
  116             this.
jLabel2.setVisible(
false);
 
  125             org.openide.awt.Mnemonics.setLocalizedText(
jLabel6, 
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class, 
"FilesSetDefsPanel.ingest.jLabel6.text")); 
 
  127             this.ruleDialogTitle = 
"FilesSetPanel.interesting.title";
 
  132     @NbBundle.Messages({
"FilesSetDefsPanel.Interesting.Title=Global Interesting Items Settings",
 
  133         "FilesSetDefsPanel.Ingest.Title=File Ingest Filter Settings"})
 
  136             setName(Bundle.FilesSetDefsPanel_Ingest_Title());
 
  138             setName(Bundle.FilesSetDefsPanel_Interesting_Title());
 
  143             detectableMimeTypes.forEach((type) -> {
 
  147             logger.log(Level.SEVERE, 
"Unable to get detectable file types", ex);
 
  165             logger.log(Level.WARNING, Bundle.FilesSetDefsPanel_saveError(), ex);
 
  172         canBeEnabled = isEnabled;
 
  205             logger.log(Level.WARNING, Bundle.FilesSetDefsPanel_loadError(), ex);
 
  206             this.filesSets = 
new TreeMap<>();
 
  211         this.filesSets.values().forEach((set) -> {
 
  212             this.setsListModel.addElement(set);
 
  215         if (!this.filesSets.isEmpty()) {
 
  218             EventQueue.invokeLater(() -> {
 
  229         this.setsListModel.clear();
 
  268             if (e.getValueIsAdjusting()) {
 
  280             if (selectedSet != null) {
 
  292                 TreeMap<String, 
FilesSet.
Rule> rules = 
new TreeMap<>(selectedSet.getRules());
 
  293                 rules.values().forEach((rule) -> {
 
  313             if (e.getValueIsAdjusting()) {
 
  329                 if (nameCondition != null) {
 
  340                 switch (typeCondition.getMetaType()) {
 
  347                     case FILES_AND_DIRECTORIES:
 
  351                 if (pathCondition != null) {
 
  358                 if (mimeTypeCondition != null) {
 
  363                 if (fileSizeCondition != null) {
 
  398         if (selectedSet != null) {
 
  409         int option = JOptionPane.OK_OPTION;
 
  411             option = JOptionPane.showConfirmDialog(null, panel, NbBundle.getMessage(
FilesSetPanel.class, ruleDialogTitle), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
 
  412         } 
while (option == JOptionPane.OK_OPTION && !panel.isValidDefinition());
 
  416         if (this.filesSets.containsKey(panel.getFilesSetName()) && shouldCreateNew) {
 
  418                     "FilesSetDefsPanel.doFileSetsDialog.duplicateRuleSet.text",
 
  419                     panel.getFilesSetName()));
 
  423         if (option == JOptionPane.OK_OPTION) {
 
  425             if (selectedSet != null) {
 
  429                 rules.putAll(selectedSet.getRules());
 
  431             if (shouldCreateNew) {
 
  432                 this.replaceFilesSet(null, panel.getFilesSetName(), panel.getFilesSetDescription(), panel.getFileSetIgnoresKnownFiles(), panel.getFileSetIgnoresUnallocatedSpace(), rules);
 
  434                 this.replaceFilesSet(selectedSet, panel.getFilesSetName(), panel.getFilesSetDescription(), panel.getFileSetIgnoresKnownFiles(), panel.getFileSetIgnoresUnallocatedSpace(), rules);
 
  448         FilesSetRulePanel panel;
 
  449         if (selectedRule != null) {
 
  451             panel = 
new FilesSetRulePanel(selectedRule, okButton, cancelButton, panelType);
 
  454             panel = 
new FilesSetRulePanel(okButton, cancelButton, panelType);
 
  459         int option = JOptionPane.OK_OPTION;
 
  461             option = JOptionPane.showOptionDialog(null, panel, NbBundle.getMessage(
FilesSetPanel.class, ruleDialogTitle), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, 
new Object[]{
okButton, cancelButton}, 
okButton);
 
  463         } 
while (option == JOptionPane.OK_OPTION && !panel.isValidRuleDefinition());
 
  465         if (option == JOptionPane.OK_OPTION) {
 
  470             Map<String, 
FilesSet.
Rule> rules = 
new HashMap<>(selectedSet.getRules());
 
  474             if (selectedRule != null) {
 
  475                 rules.remove(selectedRule.getUuid());
 
  477             FilesSet.
Rule newRule = 
new FilesSet.
Rule(panel.getRuleName(), panel.getFileNameCondition(), panel.getMetaTypeCondition(), panel.getPathCondition(), panel.getMimeTypeCondition(), panel.getFileSizeCondition());
 
  478             rules.put(newRule.getUuid(), newRule);
 
  487             EventQueue.invokeLater(() -> {
 
  488                 this.
rulesList.setSelectedValue(newRule, 
true);
 
  508     void replaceFilesSet(
FilesSet oldSet, String name, String description, 
boolean ignoresKnownFiles, 
boolean ignoresUnallocatedSpace, Map<String, FilesSet.Rule> rules) {
 
  509         if (oldSet != null) {
 
  512             this.filesSets.remove(oldSet.
getName());
 
  517         FilesSet newSet = 
new FilesSet(name, description, ignoresKnownFiles, ignoresUnallocatedSpace, rules);
 
  518         this.filesSets.put(newSet.getName(), newSet);
 
  523         this.filesSets.values().forEach((set) -> {
 
  524             this.setsListModel.addElement(set);
 
  530         this.
setsList.setSelectedValue(newSet, 
true);
 
  538     @SuppressWarnings(
"unchecked")
 
  545         jPanel1 = 
new javax.swing.JPanel();
 
  546         jLabel6 = 
new javax.swing.JLabel();
 
  557         setsList = 
new javax.swing.JList<>();
 
  559         jLabel3 = 
new javax.swing.JLabel();
 
  561         jLabel5 = 
new javax.swing.JLabel();
 
  566         separator = 
new javax.swing.JSeparator();
 
  572         jLabel2 = 
new javax.swing.JLabel();
 
  574         jLabel1 = 
new javax.swing.JLabel();
 
  575         jLabel4 = 
new javax.swing.JLabel();
 
  579         jLabel7 = 
new javax.swing.JLabel();
 
  581         jLabel8 = 
new javax.swing.JLabel();
 
  591         setFont(getFont().deriveFont(getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  595         jPanel1.setFont(
jPanel1.getFont().deriveFont(
jPanel1.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  597         jLabel6.setFont(
jLabel6.getFont().deriveFont(
jLabel6.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  598         org.openide.awt.Mnemonics.setLocalizedText(
jLabel6, 
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class, 
"FilesSetDefsPanel.interesting.jLabel6.text")); 
 
  601         newRuleButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/add16.png"))); 
 
  603         newRuleButton.addActionListener(
new java.awt.event.ActionListener() {
 
  604             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  616         editRuleButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/edit16.png"))); 
 
  619         editRuleButton.addActionListener(
new java.awt.event.ActionListener() {
 
  620             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  631         rulesList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
 
  648         editSetButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/edit16.png"))); 
 
  652         editSetButton.setMaximumSize(
new java.awt.Dimension(111, 25));
 
  653         editSetButton.setMinimumSize(
new java.awt.Dimension(111, 25));
 
  654         editSetButton.setPreferredSize(
new java.awt.Dimension(111, 25));
 
  655         editSetButton.addActionListener(
new java.awt.event.ActionListener() {
 
  656             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  664         setsList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
 
  672         jLabel3.setFont(
jLabel3.getFont().deriveFont(
jLabel3.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  673         org.openide.awt.Mnemonics.setLocalizedText(
jLabel3, 
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class, 
"FilesSetDefsPanel.jLabel3.text")); 
 
  679         jLabel5.setFont(
jLabel5.getFont().deriveFont(
jLabel5.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  680         org.openide.awt.Mnemonics.setLocalizedText(
jLabel5, 
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class, 
"FilesSetDefsPanel.jLabel5.text")); 
 
  699         separator.setOrientation(javax.swing.SwingConstants.VERTICAL);
 
  710         deleteSetButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/delete16.png"))); 
 
  717         deleteSetButton.addActionListener(
new java.awt.event.ActionListener() {
 
  718             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  724         deleteRuleButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/delete16.png"))); 
 
  728             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  734         newSetButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/add16.png"))); 
 
  735         org.openide.awt.Mnemonics.setLocalizedText(
newSetButton, 
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class, 
"FilesSetDefsPanel.interesting.newSetButton.text")); 
 
  736         newSetButton.setMargin(
new java.awt.Insets(2, 6, 2, 6));
 
  737         newSetButton.setMaximumSize(
new java.awt.Dimension(111, 25));
 
  738         newSetButton.setMinimumSize(
new java.awt.Dimension(111, 25));
 
  739         newSetButton.setPreferredSize(
new java.awt.Dimension(111, 25));
 
  740         newSetButton.addActionListener(
new java.awt.event.ActionListener() {
 
  741             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  746         jLabel2.setFont(
jLabel2.getFont().deriveFont(
jLabel2.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  747         org.openide.awt.Mnemonics.setLocalizedText(
jLabel2, 
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class, 
"FilesSetDefsPanel.jLabel2.text")); 
 
  754         jLabel1.setFont(
jLabel1.getFont().deriveFont(
jLabel1.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  755         org.openide.awt.Mnemonics.setLocalizedText(
jLabel1, 
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class, 
"FilesSetDefsPanel.jLabel1.text")); 
 
  757         jLabel4.setFont(
jLabel4.getFont().deriveFont(
jLabel4.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
 
  758         org.openide.awt.Mnemonics.setLocalizedText(
jLabel4, 
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class, 
"FilesSetDefsPanel.jLabel4.text")); 
 
  767         jTextArea1.setBackground(
new java.awt.Color(240, 240, 240));
 
  776         org.openide.awt.Mnemonics.setLocalizedText(
jLabel7, 
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class, 
"FilesSetDefsPanel.jLabel7.text")); 
 
  779         mimeTypeComboBox.setModel(
new javax.swing.DefaultComboBoxModel<String>(
new String[] {
""}));
 
  784         org.openide.awt.Mnemonics.setLocalizedText(
jLabel8, 
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class, 
"FilesSetDefsPanel.jLabel8.text")); 
 
  786         equalitySignComboBox.setModel(
new javax.swing.DefaultComboBoxModel<String>(
new String[] { 
"=", 
">", 
"≥", 
"<", 
"≤" }));
 
  789         fileSizeSpinner.setEnabled(
false);
 
  790         fileSizeSpinner.setMinimumSize(
new java.awt.Dimension(2, 20));
 
  792         fileSizeUnitComboBox.setModel(
new javax.swing.DefaultComboBoxModel<String>(
new String[] { Bundle.FilesSetDefsPanel_bytes(), Bundle.FilesSetDefsPanel_kiloBytes(), Bundle.FilesSetDefsPanel_megaBytes(), Bundle.FilesSetDefsPanel_gigaBytes() }));
 
  795         org.openide.awt.Mnemonics.setLocalizedText(ingoreUnallocCheckbox, 
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class, 
"FilesSetDefsPanel.ingoreUnallocCheckbox.text")); 
 
  796         ingoreUnallocCheckbox.setToolTipText(
org.openide.util.NbBundle.getMessage(
FilesSetDefsPanel.class, 
"FilesSetDefsPanel.ingoreUnallocCheckbox.toolTipText")); 
 
  797         ingoreUnallocCheckbox.setEnabled(
false);
 
  800         ingestWarningLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/modules/hashdatabase/warning16.png"))); 
 
  803         copySetButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/new16.png"))); 
 
  807         copySetButton.setMaximumSize(
new java.awt.Dimension(111, 25));
 
  808         copySetButton.setMinimumSize(
new java.awt.Dimension(111, 25));
 
  809         copySetButton.setPreferredSize(
new java.awt.Dimension(111, 25));
 
  810         copySetButton.addActionListener(
new java.awt.event.ActionListener() {
 
  811             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  816         importSetButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/import16.png"))); 
 
  822         importSetButton.addActionListener(
new java.awt.event.ActionListener() {
 
  823             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  828         exportSetButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/export16.png"))); 
 
  835         exportSetButton.addActionListener(
new java.awt.event.ActionListener() {
 
  836             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  841         javax.swing.GroupLayout jPanel1Layout = 
new javax.swing.GroupLayout(
jPanel1);
 
  842         jPanel1.setLayout(jPanel1Layout);
 
  843         jPanel1Layout.setHorizontalGroup(
 
  844             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  845             .addGroup(jPanel1Layout.createSequentialGroup()
 
  847                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  848                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  849                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, 
false)
 
  850                             .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
 
  851                                 .addComponent(
copySetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  852                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  853                                 .addComponent(
importSetButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
 
  854                             .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
 
  855                                 .addComponent(
newSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  856                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  857                                 .addComponent(
editSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
 
  858                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  859                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  860                             .addComponent(
exportSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  861                             .addComponent(
deleteSetButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
 
  862                     .addComponent(
setsListScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 346, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  863                     .addComponent(
jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 346, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  865                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  866                 .addComponent(
separator, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  867                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  868                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  869                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  870                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  871                                 .addGap(101, 101, 101)
 
  872                                 .addComponent(
filesRadioButton, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  873                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  875                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  877                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  878                                 .addGap(105, 105, 105)
 
  879                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  880                                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  884                                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  887                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  888                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  889                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  892                                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  898                                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  900                                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  901                                         .addComponent(ingoreUnallocCheckbox, javax.swing.GroupLayout.PREFERRED_SIZE, 158, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  902                                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  903                                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  906                                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  908                         .addGap(24, 28, Short.MAX_VALUE))
 
  909                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  910                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  911                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  913                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  914                                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  915                                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  919                                     .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  920                                         .addGroup(jPanel1Layout.createSequentialGroup()
 
  921                                             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  925                                         .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
 
  927                                             .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED))))
 
  928                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  929                                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  930                                         .addComponent(
equalitySignComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 44, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  931                                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  932                                         .addComponent(fileSizeSpinner, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  933                                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  934                                         .addComponent(
fileSizeUnitComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  937                                     .addComponent(
mimeTypeComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
 
  938                             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
 
  939                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  940                                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  942                                     .addComponent(
setDescScrollPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
 
  946         jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, 
new java.awt.Component[] {copySetButton, deleteSetButton, editSetButton, exportSetButton, importSetButton, newSetButton});
 
  948         jPanel1Layout.setVerticalGroup(
 
  949             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  950             .addGroup(jPanel1Layout.createSequentialGroup()
 
  952                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  954                     .addGroup(jPanel1Layout.createSequentialGroup()
 
  955                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  956                             .addGroup(jPanel1Layout.createSequentialGroup()
 
  958                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  962                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  963                         .addComponent(
setDescScrollPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  965                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  967                             .addComponent(ingoreUnallocCheckbox, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  968                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  970                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  971                         .addComponent(
rulesListScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 82, Short.MAX_VALUE)
 
  972                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  973                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  977                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  980                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  986                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  988                             .addComponent(
fileNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  989                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  990                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  995                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  997                             .addComponent(
rulePathConditionTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
 
 1000                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
 1001                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
 1003                             .addComponent(
mimeTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 
 1004                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
 1005                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
 1007                             .addComponent(
equalitySignComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
 1008                             .addComponent(fileSizeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
 1009                             .addComponent(
fileSizeUnitComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 
 1011                     .addGroup(jPanel1Layout.createSequentialGroup()
 
 1012                         .addComponent(
jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
 1013                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
 1015                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
 1017                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
 1018                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
 1019                             .addComponent(
newSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
 1020                             .addComponent(
editSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
 1021                             .addComponent(
deleteSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 
 1022                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
 1023                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
 1024                             .addComponent(
copySetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
 1025                             .addComponent(
importSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 
 1026                             .addComponent(
exportSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 
 1030         jPanel1Layout.linkSize(javax.swing.SwingConstants.VERTICAL, 
new java.awt.Component[] {copySetButton, deleteRuleButton, deleteSetButton, editRuleButton, editSetButton, exportSetButton, importSetButton, newRuleButton, newSetButton});
 
 1034         javax.swing.GroupLayout layout = 
new javax.swing.GroupLayout(
this);
 
 1035         this.setLayout(layout);
 
 1036         layout.setHorizontalGroup(
 
 1037             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
 1040         layout.setVerticalGroup(
 
 1041             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
 1048         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
 1057         Map<String, 
FilesSet.
Rule> rules = 
new HashMap<>(oldSet.getRules());
 
 1059         rules.remove(selectedRule.getUuid());
 
 1066         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
 1073                 if (profile.getFileIngestFilter().equals(selectedSet.
getName())) {
 
 1075                             "FilesSetDefsPanel.ingest.fileFilterInUseError",
 
 1076                             selectedSet.
getName(), profile.toString()));
 
 1082         this.filesSets.remove(selectedSet.
getName());
 
 1083         this.setsListModel.removeElement(selectedSet);
 
 1086         if (!this.filesSets.isEmpty()) {
 
 1091         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
 1096         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
 1101         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
 1106         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
 1111         firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
 1113     @NbBundle.Messages({
 
 1114         "FilesSetDefsPanel.yesOwMsg=Yes, overwrite",
 
 1115         "FilesSetDefsPanel.noSkipMsg=No, skip",
 
 1116         "FilesSetDefsPanel.cancelImportMsg=Cancel import",
 
 1117         "# {0} - FilesSet name",
 
 1118         "FilesSetDefsPanel.interesting.overwriteSetPrompt=Interesting files set <{0}> already exists locally, overwrite?",
 
 1119         "FilesSetDefsPanel.interesting.importOwConflict=Import Interesting files set conflict",
 
 1120         "FilesSetDefsPanel.interesting.failImportMsg=Interesting files set not imported",
 
 1121         "FilesSetDefsPanel.interesting.fileExtensionFilterLbl=Autopsy Interesting File Set File (xml)",
 
 1122         "FilesSetDefsPanel.interesting.importButtonAction.featureName=Interesting Files Set Import" 
 1127         JFileChooser chooser = 
new JFileChooser();
 
 1128         final String EXTENSION = 
"xml"; 
 
 1129         FileNameExtensionFilter autopsyFilter = 
new FileNameExtensionFilter(
 
 1130                 NbBundle.getMessage(
this.getClass(), 
"FilesSetDefsPanel.interesting.fileExtensionFilterLbl"), EXTENSION);
 
 1131         chooser.addChoosableFileFilter(autopsyFilter);
 
 1132         chooser.setAcceptAllFileFilterUsed(
false);
 
 1133         chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
 
 1134         int returnVal = chooser.showOpenDialog(
this);
 
 1135         if (returnVal == JFileChooser.APPROVE_OPTION) {
 
 1136             File selFile = chooser.getSelectedFile();
 
 1137             if (selFile == null) {
 
 1138                 JOptionPane.showMessageDialog(
this,
 
 1139                         NbBundle.getMessage(
this.getClass(), 
"FilesSetDefsPanel.interesting.failImportMsg"),
 
 1140                         NbBundle.getMessage(
this.getClass(), 
"FilesSetDefsPanel.interesting.importButtonAction.featureName"),
 
 1141                         JOptionPane.WARNING_MESSAGE);
 
 1142                 logger.warning(
"Selected file was null, when trying to import interesting files set definitions");
 
 1145             Collection<FilesSet> importedSets;
 
 1147                 importedSets = InterestingItemsFilesSetSettings.readDefinitionsXML(selFile).values(); 
 
 1148                 if (importedSets.isEmpty()) {
 
 1152                 JOptionPane.showMessageDialog(
this,
 
 1153                         NbBundle.getMessage(
this.getClass(), 
"FilesSetDefsPanel.interesting.failImportMsg"),
 
 1154                         NbBundle.getMessage(
this.getClass(), 
"FilesSetDefsPanel.interesting.importButtonAction.featureName"),
 
 1155                         JOptionPane.WARNING_MESSAGE);
 
 1156                 logger.log(Level.WARNING, 
"No Interesting files set definitions were read from the selected file, exception", ex);
 
 1159             for (
FilesSet set : importedSets) {
 
 1160                 int choice = JOptionPane.OK_OPTION; 
 
 1161                 if (filesSets.containsKey(set.getName())) {
 
 1162                     Object[] options = {NbBundle.getMessage(this.getClass(), 
"FilesSetDefsPanel.yesOwMsg"),
 
 1163                         NbBundle.getMessage(this.getClass(), 
"FilesSetDefsPanel.noSkipMsg"),
 
 1164                         NbBundle.getMessage(this.getClass(), 
"FilesSetDefsPanel.cancelImportMsg")};
 
 1165                     choice = JOptionPane.showOptionDialog(
this,
 
 1166                             NbBundle.getMessage(
this.getClass(), 
"FilesSetDefsPanel.interesting.overwriteSetPrompt", set.getName()),
 
 1167                             NbBundle.getMessage(
this.getClass(), 
"FilesSetDefsPanel.interesting.importOwConflict"),
 
 1168                             JOptionPane.YES_NO_CANCEL_OPTION,
 
 1169                             JOptionPane.QUESTION_MESSAGE,
 
 1174                 if (choice == JOptionPane.OK_OPTION) {
 
 1176                     this.filesSets.put(set.getName(), set);
 
 1177                 } 
else if (choice == JOptionPane.CANCEL_OPTION) {
 
 1183             this.filesSets.values().forEach((set) -> {
 
 1184                 this.setsListModel.addElement(set);
 
 1189             this.
setsList.setSelectedValue(selectedSet, 
true);
 
 1190             firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
 
 1195     @NbBundle.Messages({
"FilesSetDefsPanel.interesting.exportButtonAction.featureName=Interesting Files Set Export",
 
 1196         "# {0} - file name",
 
 1197         "FilesSetDefsPanel.exportButtonActionPerformed.fileExistPrompt=File {0} exists, overwrite?",
 
 1198         "FilesSetDefsPanel.interesting.ExportedMsg=Interesting files set exported",
 
 1199         "FilesSetDefsPanel.interesting.failExportMsg=Export of interesting files set failed"})
 
 1203         JFileChooser chooser = 
new JFileChooser();
 
 1204         final String EXTENSION = 
"xml"; 
 
 1205         FileNameExtensionFilter autopsyFilter = 
new FileNameExtensionFilter(
 
 1206                 NbBundle.getMessage(
this.getClass(), 
"FilesSetDefsPanel.interesting.fileExtensionFilterLbl"), EXTENSION);
 
 1207         chooser.addChoosableFileFilter(autopsyFilter);
 
 1208         chooser.setSelectedFile(
new File(this.
setsList.getSelectedValue().getName()));
 
 1209         chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
 
 1210         int returnVal = chooser.showSaveDialog(
this);
 
 1211         if (returnVal == JFileChooser.APPROVE_OPTION) {
 
 1212             final String FEATURE_NAME = NbBundle.getMessage(this.getClass(),
 
 1213                     "FilesSetDefsPanel.interesting.exportButtonAction.featureName");
 
 1214             File selFile = chooser.getSelectedFile();
 
 1215             if (selFile == null) {
 
 1216                 JOptionPane.showMessageDialog(
this,
 
 1217                         NbBundle.getMessage(
this.getClass(), 
"FilesSetDefsPanel.interesting.failExportMsg"),
 
 1219                         JOptionPane.WARNING_MESSAGE);
 
 1220                 logger.warning(
"Selected file was null, when trying to export interesting files set definitions");
 
 1224             String fileAbs = selFile.getAbsolutePath();
 
 1225             if (!fileAbs.endsWith(
"." + EXTENSION)) {
 
 1226                 fileAbs = fileAbs + 
"." + EXTENSION;
 
 1227                 selFile = 
new File(fileAbs);
 
 1229             if (selFile.exists()) {
 
 1231                 final String FILE_EXISTS_MESSAGE = NbBundle.getMessage(this.getClass(),
 
 1232                         "FilesSetDefsPanel.exportButtonActionPerformed.fileExistPrompt", selFile.getName());
 
 1233                 boolean shouldWrite = JOptionPane.showConfirmDialog(null, FILE_EXISTS_MESSAGE, FEATURE_NAME, JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION;
 
 1238             List<FilesSet> exportSets;
 
 1239             exportSets = 
new ArrayList<>();
 
 1241             exportSets.add(this.
setsList.getSelectedValue());
 
 1242             boolean written = InterestingItemsFilesSetSettings.exportXmlDefinitionsFile(selFile, exportSets);
 
 1244                 JOptionPane.showMessageDialog(
 
 1245                         WindowManager.getDefault().getMainWindow(),
 
 1246                         NbBundle.getMessage(this.getClass(), 
"FilesSetDefsPanel.interesting.ExportedMsg"),
 
 1248                         JOptionPane.INFORMATION_MESSAGE);
 
 1250                 JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
 
 1251                         NbBundle.getMessage(this.getClass(), 
"FilesSetDefsPanel.interesting.failExportMsg"),
 
 1253                         JOptionPane.WARNING_MESSAGE);
 
 1254                 logger.warning(
"Export of interesting files set failed unable to write definitions xml file");
 
void deleteRuleButtonActionPerformed(java.awt.event.ActionEvent evt)
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 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.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
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