mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-12 16:06:15 +00:00
755 lines
38 KiB
Java
755 lines
38 KiB
Java
/*
|
|
* Autopsy Forensic Browser
|
|
*
|
|
* Copyright 2011 Basis Technology Corp.
|
|
* Contact: carrier <at> sleuthkit <dot> org
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package org.sleuthkit.autopsy.hashdatabase;
|
|
|
|
import java.awt.Color;
|
|
import java.awt.Component;
|
|
import java.awt.Frame;
|
|
import java.awt.event.KeyEvent;
|
|
import java.beans.PropertyChangeEvent;
|
|
import java.beans.PropertyChangeListener;
|
|
import java.io.File;
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import javax.swing.JButton;
|
|
import javax.swing.JComponent;
|
|
import javax.swing.JLabel;
|
|
import javax.swing.JOptionPane;
|
|
import javax.swing.JTable;
|
|
import javax.swing.ListSelectionModel;
|
|
import javax.swing.event.ListSelectionEvent;
|
|
import javax.swing.event.ListSelectionListener;
|
|
import javax.swing.table.AbstractTableModel;
|
|
import javax.swing.table.TableCellRenderer;
|
|
import org.sleuthkit.autopsy.corecomponents.OptionsPanel;
|
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
|
|
|
final class HashDbManagementPanel extends javax.swing.JPanel implements OptionsPanel {
|
|
|
|
private HashSetTableModel hashSetTableModel;
|
|
private static final Logger logger = Logger.getLogger(HashDbManagementPanel.class.getName());
|
|
private static boolean ingestRunning = false;
|
|
|
|
|
|
//keep track of dbs being indexed, since HashDb objects are reloaded,
|
|
//we cannot rely on their status
|
|
private final Map<String,Boolean>indexingState = new HashMap<String,Boolean>();
|
|
|
|
HashDbManagementPanel() {
|
|
this.hashSetTableModel = new HashSetTableModel();
|
|
initComponents();
|
|
customizeComponents();
|
|
|
|
}
|
|
|
|
private void customizeComponents() {
|
|
setName("Hash Database Configuration");
|
|
this.ingestWarningLabel.setVisible(false);
|
|
this.hashSetTable.setModel(hashSetTableModel);
|
|
this.hashSetTable.setTableHeader(null);
|
|
hashSetTable.getParent().setBackground(hashSetTable.getBackground());
|
|
hashSetTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
|
hashSetTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
|
|
|
|
@Override
|
|
public void valueChanged(ListSelectionEvent e) {
|
|
ListSelectionModel listSelectionModel = (ListSelectionModel) e.getSource();
|
|
if (!listSelectionModel.isSelectionEmpty()) {
|
|
int index = listSelectionModel.getMinSelectionIndex();
|
|
listSelectionModel.setSelectionInterval(index, index);
|
|
HashDbXML loader = HashDbXML.getCurrent();
|
|
HashDb current = loader.getAllSets().get(index);
|
|
initUI(current);
|
|
} else {
|
|
initUI(null);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
private void initUI(HashDb db) {
|
|
boolean useForIngestEnabled = db != null && !ingestRunning;
|
|
boolean useForIngestSelected = db != null && db.getUseForIngest();
|
|
boolean showInboxMessagesEnabled = db != null && !ingestRunning && useForIngestSelected && db.getDbType().equals(HashDb.DBType.KNOWN_BAD);
|
|
boolean showInboxMessagesSelected = db != null && db.getShowInboxMessages();
|
|
boolean deleteButtonEnabled = db != null && !ingestRunning;
|
|
boolean importButtonEnabled = !ingestRunning;
|
|
if (db == null) {
|
|
setButtonFromIndexStatus(this.indexButton, this.hashDbIndexStatusLabel, IndexStatus.NONE);
|
|
this.hashDbLocationLabel.setText("No database selected");
|
|
this.hashDbNameLabel.setText("No database selected");
|
|
this.hashDbIndexStatusLabel.setText("No database selected");
|
|
this.hashDbTypeLabel.setText("No database selected");
|
|
} else {
|
|
//check if dn in indexing state
|
|
String dbName = db.getName();
|
|
IndexStatus status = db.status();
|
|
Boolean state = indexingState.get(dbName);
|
|
if (state != null && state.equals(Boolean.TRUE) ) {
|
|
status = IndexStatus.INDEXING;
|
|
}
|
|
|
|
setButtonFromIndexStatus(this.indexButton, this.hashDbIndexStatusLabel, status);
|
|
String shortenPath = db.getDatabasePaths().get(0);
|
|
this.hashDbLocationLabel.setToolTipText(shortenPath);
|
|
if(shortenPath.length() > 50){
|
|
shortenPath = shortenPath.substring(0, 10 + shortenPath.substring(10).indexOf(File.separator) + 1) + "..." +
|
|
shortenPath.substring((shortenPath.length() - 20) + shortenPath.substring(shortenPath.length() - 20).indexOf(File.separator));
|
|
}
|
|
this.hashDbLocationLabel.setText(shortenPath);
|
|
this.hashDbNameLabel.setText(db.getName());
|
|
this.hashDbTypeLabel.setText(db.getDbType().getDisplayName());
|
|
}
|
|
this.useForIngestCheckbox.setSelected(useForIngestSelected);
|
|
this.useForIngestCheckbox.setEnabled(useForIngestEnabled);
|
|
this.showInboxMessagesCheckBox.setSelected(showInboxMessagesSelected);
|
|
this.showInboxMessagesCheckBox.setEnabled(showInboxMessagesEnabled);
|
|
this.deleteButton.setEnabled(deleteButtonEnabled);
|
|
this.importButton.setEnabled(importButtonEnabled);
|
|
this.optionsLabel.setEnabled(useForIngestEnabled || showInboxMessagesEnabled);
|
|
this.optionsSeparator.setEnabled(useForIngestEnabled || showInboxMessagesEnabled);
|
|
}
|
|
|
|
/**
|
|
* Sets the current state of ingest.
|
|
* Don't allow any changes if ingest is running.
|
|
* @param running Whether ingest is running or not.
|
|
*/
|
|
void setIngestRunning(boolean running) {
|
|
ingestRunning = running;
|
|
ingestWarningLabel.setVisible(running);
|
|
|
|
int selection = getSelection();
|
|
if(selection != -1) {
|
|
initUI(HashDbXML.getCurrent().getAllSets().get(selection));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This method is called from within the constructor to initialize the form.
|
|
* WARNING: Do NOT modify this code. The content of this method is always
|
|
* regenerated by the Form Editor.
|
|
*/
|
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
|
private void initComponents() {
|
|
|
|
jLabel2 = new javax.swing.JLabel();
|
|
jLabel4 = new javax.swing.JLabel();
|
|
jLabel6 = new javax.swing.JLabel();
|
|
jButton3 = new javax.swing.JButton();
|
|
ingestWarningLabel = new javax.swing.JLabel();
|
|
jScrollPane1 = new javax.swing.JScrollPane();
|
|
hashSetTable = new HashSetTable();
|
|
deleteButton = new javax.swing.JButton();
|
|
importButton = new javax.swing.JButton();
|
|
hashDatabasesLabel = new javax.swing.JLabel();
|
|
nameLabel = new javax.swing.JLabel();
|
|
hashDbNameLabel = new javax.swing.JLabel();
|
|
hashDbLocationLabel = new javax.swing.JLabel();
|
|
locationLabel = new javax.swing.JLabel();
|
|
typeLabel = new javax.swing.JLabel();
|
|
hashDbTypeLabel = new javax.swing.JLabel();
|
|
hashDbIndexStatusLabel = new javax.swing.JLabel();
|
|
indexLabel = new javax.swing.JLabel();
|
|
indexButton = new javax.swing.JButton();
|
|
useForIngestCheckbox = new javax.swing.JCheckBox();
|
|
showInboxMessagesCheckBox = new javax.swing.JCheckBox();
|
|
informationLabel = new javax.swing.JLabel();
|
|
optionsLabel = new javax.swing.JLabel();
|
|
informationSeparator = new javax.swing.JSeparator();
|
|
optionsSeparator = new javax.swing.JSeparator();
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.jLabel2.text")); // NOI18N
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.jLabel4.text")); // NOI18N
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(jLabel6, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.jLabel6.text")); // NOI18N
|
|
|
|
jButton3.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
|
|
org.openide.awt.Mnemonics.setLocalizedText(jButton3, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.jButton3.text")); // NOI18N
|
|
|
|
setMinimumSize(new java.awt.Dimension(700, 500));
|
|
setPreferredSize(new java.awt.Dimension(700, 500));
|
|
|
|
ingestWarningLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/hashdatabase/warning16.png"))); // NOI18N
|
|
org.openide.awt.Mnemonics.setLocalizedText(ingestWarningLabel, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.ingestWarningLabel.text")); // NOI18N
|
|
|
|
hashSetTable.setModel(new javax.swing.table.DefaultTableModel(
|
|
new Object [][] {
|
|
|
|
},
|
|
new String [] {
|
|
|
|
}
|
|
));
|
|
hashSetTable.setShowHorizontalLines(false);
|
|
hashSetTable.setShowVerticalLines(false);
|
|
hashSetTable.addKeyListener(new java.awt.event.KeyAdapter() {
|
|
public void keyPressed(java.awt.event.KeyEvent evt) {
|
|
hashSetTableKeyPressed(evt);
|
|
}
|
|
});
|
|
jScrollPane1.setViewportView(hashSetTable);
|
|
|
|
deleteButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/hashdatabase/delete16.png"))); // NOI18N
|
|
org.openide.awt.Mnemonics.setLocalizedText(deleteButton, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.deleteButton.text")); // NOI18N
|
|
deleteButton.setMaximumSize(new java.awt.Dimension(140, 25));
|
|
deleteButton.setMinimumSize(new java.awt.Dimension(140, 25));
|
|
deleteButton.setPreferredSize(new java.awt.Dimension(140, 25));
|
|
deleteButton.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
deleteButtonActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
importButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/hashdatabase/import16.png"))); // NOI18N
|
|
org.openide.awt.Mnemonics.setLocalizedText(importButton, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.importButton.text")); // NOI18N
|
|
importButton.setMaximumSize(new java.awt.Dimension(140, 25));
|
|
importButton.setMinimumSize(new java.awt.Dimension(140, 25));
|
|
importButton.setPreferredSize(new java.awt.Dimension(140, 25));
|
|
importButton.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
importButtonActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(hashDatabasesLabel, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.hashDatabasesLabel.text")); // NOI18N
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(nameLabel, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.nameLabel.text")); // NOI18N
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(hashDbNameLabel, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.hashDbNameLabel.text")); // NOI18N
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(hashDbLocationLabel, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.hashDbLocationLabel.text")); // NOI18N
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(locationLabel, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.locationLabel.text")); // NOI18N
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(typeLabel, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.typeLabel.text")); // NOI18N
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(hashDbTypeLabel, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.hashDbTypeLabel.text")); // NOI18N
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(hashDbIndexStatusLabel, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.hashDbIndexStatusLabel.text")); // NOI18N
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(indexLabel, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.indexLabel.text")); // NOI18N
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(indexButton, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.indexButton.text")); // NOI18N
|
|
indexButton.setEnabled(false);
|
|
indexButton.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
indexButtonActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(useForIngestCheckbox, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.useForIngestCheckbox.text")); // NOI18N
|
|
useForIngestCheckbox.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
useForIngestCheckboxActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(showInboxMessagesCheckBox, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.showInboxMessagesCheckBox.text")); // NOI18N
|
|
showInboxMessagesCheckBox.addActionListener(new java.awt.event.ActionListener() {
|
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
showInboxMessagesCheckBoxActionPerformed(evt);
|
|
}
|
|
});
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(informationLabel, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.informationLabel.text")); // NOI18N
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(optionsLabel, org.openide.util.NbBundle.getMessage(HashDbManagementPanel.class, "HashDbManagementPanel.optionsLabel.text")); // NOI18N
|
|
|
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
|
this.setLayout(layout);
|
|
layout.setHorizontalGroup(
|
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(layout.createSequentialGroup()
|
|
.addContainerGap()
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addComponent(hashDatabasesLabel)
|
|
.addGroup(layout.createSequentialGroup()
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
|
|
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
|
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
|
|
.addComponent(importButton, javax.swing.GroupLayout.PREFERRED_SIZE, 133, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
.addComponent(deleteButton, javax.swing.GroupLayout.PREFERRED_SIZE, 132, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
|
.addGroup(layout.createSequentialGroup()
|
|
.addComponent(informationLabel)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(informationSeparator))
|
|
.addGroup(layout.createSequentialGroup()
|
|
.addComponent(optionsLabel)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
.addComponent(optionsSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 324, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addComponent(ingestWarningLabel)
|
|
.addGroup(layout.createSequentialGroup()
|
|
.addGap(10, 10, 10)
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(layout.createSequentialGroup()
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(layout.createSequentialGroup()
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addComponent(nameLabel)
|
|
.addComponent(locationLabel)
|
|
.addComponent(typeLabel))
|
|
.addGap(40, 40, 40))
|
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
|
.addComponent(indexLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addGap(18, 18, 18)))
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
|
.addComponent(hashDbTypeLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addComponent(hashDbLocationLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addComponent(hashDbIndexStatusLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
.addComponent(hashDbNameLabel)))
|
|
.addComponent(useForIngestCheckbox)
|
|
.addComponent(showInboxMessagesCheckBox)
|
|
.addComponent(indexButton, javax.swing.GroupLayout.PREFERRED_SIZE, 75, javax.swing.GroupLayout.PREFERRED_SIZE))))))
|
|
.addContainerGap(40, Short.MAX_VALUE))
|
|
);
|
|
layout.setVerticalGroup(
|
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(layout.createSequentialGroup()
|
|
.addContainerGap()
|
|
.addComponent(hashDatabasesLabel)
|
|
.addGap(6, 6, 6)
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addGroup(layout.createSequentialGroup()
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
.addComponent(informationLabel)
|
|
.addGroup(layout.createSequentialGroup()
|
|
.addGap(7, 7, 7)
|
|
.addComponent(informationSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 3, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
|
.addGap(7, 7, 7)
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(nameLabel)
|
|
.addComponent(hashDbNameLabel))
|
|
.addGap(5, 5, 5)
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(locationLabel)
|
|
.addComponent(hashDbLocationLabel))
|
|
.addGap(5, 5, 5)
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(typeLabel)
|
|
.addComponent(hashDbTypeLabel))
|
|
.addGap(5, 5, 5)
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(hashDbIndexStatusLabel)
|
|
.addComponent(indexLabel))
|
|
.addGap(5, 5, 5)
|
|
.addComponent(indexButton)
|
|
.addGap(18, 18, 18)
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
|
.addComponent(optionsLabel)
|
|
.addComponent(optionsSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 6, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
.addComponent(useForIngestCheckbox)
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
.addComponent(showInboxMessagesCheckBox)
|
|
.addGap(18, 18, 18)
|
|
.addComponent(ingestWarningLabel)
|
|
.addGap(0, 0, Short.MAX_VALUE))
|
|
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 422, Short.MAX_VALUE))
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
.addComponent(importButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
.addComponent(deleteButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
.addContainerGap())
|
|
);
|
|
}// </editor-fold>//GEN-END:initComponents
|
|
|
|
private void indexButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_indexButtonActionPerformed
|
|
int selected = getSelection();
|
|
final HashDb current = HashDbXML.getCurrent().getAllSets().get(selected);
|
|
current.addPropertyChangeListener(new PropertyChangeListener() {
|
|
|
|
@Override
|
|
public void propertyChange(PropertyChangeEvent evt) {
|
|
if (evt.getPropertyName().equals(HashDb.EVENT.INDEXING_DONE.toString())) {
|
|
//update tracking of indexing status
|
|
indexingState.put((String)evt.getNewValue(), Boolean.FALSE);
|
|
|
|
setButtonFromIndexStatus(indexButton, hashDbIndexStatusLabel, current.status());
|
|
resync();
|
|
}
|
|
}
|
|
|
|
});
|
|
indexingState.put(current.getName(), Boolean.TRUE);
|
|
ModalNoButtons singleMNB = new ModalNoButtons(this, new Frame(), current); //Modal reference, to be removed later
|
|
singleMNB.setLocationRelativeTo(null);
|
|
singleMNB.setVisible(true);
|
|
singleMNB.setModal(true); //End Modal reference
|
|
indexingState.put(current.getName(), Boolean.FALSE);
|
|
setButtonFromIndexStatus(indexButton, this.hashDbIndexStatusLabel, current.status());
|
|
}//GEN-LAST:event_indexButtonActionPerformed
|
|
|
|
private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteButtonActionPerformed
|
|
if (JOptionPane.showConfirmDialog(null, "This will remove the hash database entry globally (for all Cases). Do you want to proceed? ",
|
|
"Deleting a Hash Database Entry",
|
|
JOptionPane.YES_NO_OPTION,
|
|
JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) {
|
|
|
|
int selected = getSelection();
|
|
HashDbXML xmlHandle = HashDbXML.getCurrent();
|
|
if (xmlHandle.getNSRLSet() != null) {
|
|
if (selected == 0) {
|
|
HashDbXML.getCurrent().removeNSRLSet();
|
|
} else {
|
|
HashDbXML.getCurrent().removeKnownBadSetAt(selected - 1);
|
|
}
|
|
} else {
|
|
HashDbXML.getCurrent().removeKnownBadSetAt(selected);
|
|
}
|
|
hashSetTableModel.resync();
|
|
}
|
|
}//GEN-LAST:event_deleteButtonActionPerformed
|
|
|
|
private void hashSetTableKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_hashSetTableKeyPressed
|
|
if (evt.getKeyCode() == KeyEvent.VK_DELETE) {
|
|
int selected = getSelection();
|
|
HashDbXML xmlHandle = HashDbXML.getCurrent();
|
|
if (xmlHandle.getNSRLSet() != null) {
|
|
if (selected == 0) {
|
|
HashDbXML.getCurrent().removeNSRLSet();
|
|
} else {
|
|
HashDbXML.getCurrent().removeKnownBadSetAt(selected - 1);
|
|
}
|
|
} else {
|
|
HashDbXML.getCurrent().removeKnownBadSetAt(selected);
|
|
}
|
|
}
|
|
hashSetTableModel.resync();
|
|
}//GEN-LAST:event_hashSetTableKeyPressed
|
|
|
|
private void useForIngestCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_useForIngestCheckboxActionPerformed
|
|
int selected = getSelection();
|
|
HashDbXML xmlHandle = HashDbXML.getCurrent();
|
|
if (xmlHandle.getNSRLSet() != null) {
|
|
if (selected == 0) {
|
|
HashDb current = HashDbXML.getCurrent().getNSRLSet();
|
|
current.setUseForIngest(useForIngestCheckbox.isSelected());
|
|
HashDbXML.getCurrent().setNSRLSet(current);
|
|
} else {
|
|
HashDb current = HashDbXML.getCurrent().getKnownBadSets().remove(selected - 1);
|
|
current.setUseForIngest(useForIngestCheckbox.isSelected());
|
|
HashDbXML.getCurrent().addKnownBadSet(selected - 1, current);
|
|
this.showInboxMessagesCheckBox.setEnabled(useForIngestCheckbox.isSelected());
|
|
}
|
|
} else {
|
|
HashDb current = HashDbXML.getCurrent().getKnownBadSets().remove(selected);
|
|
current.setUseForIngest(useForIngestCheckbox.isSelected());
|
|
HashDbXML.getCurrent().addKnownBadSet(selected, current);
|
|
this.showInboxMessagesCheckBox.setEnabled(useForIngestCheckbox.isSelected());
|
|
}
|
|
}//GEN-LAST:event_useForIngestCheckboxActionPerformed
|
|
|
|
private void showInboxMessagesCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showInboxMessagesCheckBoxActionPerformed
|
|
int selected = getSelection();
|
|
HashDbXML xmlHandle = HashDbXML.getCurrent();
|
|
if (xmlHandle.getNSRLSet() != null) {
|
|
if (selected == 0) {
|
|
HashDb current = HashDbXML.getCurrent().getNSRLSet();
|
|
current.setShowInboxMessages(showInboxMessagesCheckBox.isSelected());
|
|
HashDbXML.getCurrent().setNSRLSet(current);
|
|
} else {
|
|
HashDb current = HashDbXML.getCurrent().getKnownBadSets().remove(selected - 1);
|
|
current.setShowInboxMessages(showInboxMessagesCheckBox.isSelected());
|
|
HashDbXML.getCurrent().addKnownBadSet(selected - 1, current);
|
|
}
|
|
} else {
|
|
HashDb current = HashDbXML.getCurrent().getKnownBadSets().remove(selected);
|
|
current.setShowInboxMessages(showInboxMessagesCheckBox.isSelected());
|
|
HashDbXML.getCurrent().addKnownBadSet(selected, current);
|
|
}
|
|
}//GEN-LAST:event_showInboxMessagesCheckBoxActionPerformed
|
|
|
|
private void importButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_importButtonActionPerformed
|
|
importHashSet(evt);
|
|
}//GEN-LAST:event_importButtonActionPerformed
|
|
|
|
@Override
|
|
public void load() {
|
|
hashSetTable.clearSelection(); // Deselect all rows
|
|
HashDbXML.getCurrent().reload(); // Reload XML
|
|
initUI(null); // Update the UI
|
|
hashSetTableModel.resync(); // resync the table
|
|
}
|
|
|
|
@Override
|
|
/**
|
|
* Saves the HashDb's current state.
|
|
* This version of store is modified heavily to make use of the ModalNoButtons class.
|
|
* The only call that matters is the final HashDbXML.getCurrent().save()
|
|
*/
|
|
public void store() {
|
|
//Checking for for any unindexed databases
|
|
List<HashDb> unindexed = new ArrayList<HashDb>();
|
|
for(int i = 0; i < hashSetTableModel.getRowCount(); i++){
|
|
if(! hashSetTableModel.indexExists(i)){
|
|
unindexed.add(hashSetTableModel.getDBAt(i));
|
|
}
|
|
}
|
|
//If unindexed ones are found, show a popup box that will either index them, or remove them.
|
|
if (unindexed.size() == 1){
|
|
showInvalidIndex(false, unindexed);
|
|
}
|
|
else if (unindexed.size() > 1){
|
|
showInvalidIndex(true, unindexed);
|
|
}
|
|
HashDbXML.getCurrent().save();
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* Removes a list of HashDbs from the dialog panel that do not have a companion -md5.idx file.
|
|
* Occurs when user clicks "No" to the dialog popup box.
|
|
* @param toRemove a list of HashDbs that are unindexed
|
|
*/
|
|
void removeThese(List<HashDb> toRemove) {
|
|
HashDbXML xmlHandle = HashDbXML.getCurrent();
|
|
for (HashDb hdb : toRemove) {
|
|
for (int i = 0; i < hashSetTableModel.getRowCount(); i++) {
|
|
if (hashSetTableModel.getDBAt(i).equals(hdb)) {
|
|
if (xmlHandle.getNSRLSet() != null) {
|
|
if (i == 0) {
|
|
HashDbXML.getCurrent().removeNSRLSet();
|
|
} else {
|
|
HashDbXML.getCurrent().removeKnownBadSetAt(i - 1);
|
|
}
|
|
} else {
|
|
HashDbXML.getCurrent().removeKnownBadSetAt(i);
|
|
}
|
|
hashSetTableModel.resync();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Displays the popup box that tells user that some of his databases are unindexed, along with solutions.
|
|
* This method is related to ModalNoButtons, to be removed at a later date.
|
|
* @param plural Whether or not there are multiple unindexed databases
|
|
* @param unindexed The list of unindexed databases. Can be of size 1.
|
|
*/
|
|
private void showInvalidIndex(boolean plural, List<HashDb> unindexed){
|
|
String total = "";
|
|
String message;
|
|
for(HashDb hdb : unindexed){
|
|
total+= "\n" + hdb.getName();
|
|
}
|
|
if(plural){
|
|
message = "The following databases are not indexed, would you like to index them now? \n " + total;
|
|
}
|
|
else{
|
|
message = "The following database is not indexed, would you like to index it now? \n" + total;
|
|
}
|
|
int res = JOptionPane.showConfirmDialog(this, message, "Unindexed databases", JOptionPane.YES_NO_OPTION);
|
|
if(res == JOptionPane.YES_OPTION){
|
|
ModalNoButtons indexingDialog = new ModalNoButtons(this, new Frame(),unindexed);
|
|
indexingDialog.setLocationRelativeTo(null);
|
|
indexingDialog.setVisible(true);
|
|
indexingDialog.setModal(true);
|
|
hashSetTableModel.resync();
|
|
}
|
|
if(res == JOptionPane.NO_OPTION){
|
|
JOptionPane.showMessageDialog(this, "All unindexed databases will be removed the list");
|
|
removeThese(unindexed);
|
|
}
|
|
}
|
|
|
|
boolean valid() {
|
|
// TODO check whether form is consistent and complete
|
|
return true;
|
|
}
|
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
|
private javax.swing.JButton deleteButton;
|
|
private javax.swing.JLabel hashDatabasesLabel;
|
|
private javax.swing.JLabel hashDbIndexStatusLabel;
|
|
private javax.swing.JLabel hashDbLocationLabel;
|
|
private javax.swing.JLabel hashDbNameLabel;
|
|
private javax.swing.JLabel hashDbTypeLabel;
|
|
private javax.swing.JTable hashSetTable;
|
|
private javax.swing.JButton importButton;
|
|
private javax.swing.JButton indexButton;
|
|
private javax.swing.JLabel indexLabel;
|
|
private javax.swing.JLabel informationLabel;
|
|
private javax.swing.JSeparator informationSeparator;
|
|
private javax.swing.JLabel ingestWarningLabel;
|
|
private javax.swing.JButton jButton3;
|
|
private javax.swing.JLabel jLabel2;
|
|
private javax.swing.JLabel jLabel4;
|
|
private javax.swing.JLabel jLabel6;
|
|
private javax.swing.JScrollPane jScrollPane1;
|
|
private javax.swing.JLabel locationLabel;
|
|
private javax.swing.JLabel nameLabel;
|
|
private javax.swing.JLabel optionsLabel;
|
|
private javax.swing.JSeparator optionsSeparator;
|
|
private javax.swing.JCheckBox showInboxMessagesCheckBox;
|
|
private javax.swing.JLabel typeLabel;
|
|
private javax.swing.JCheckBox useForIngestCheckbox;
|
|
// End of variables declaration//GEN-END:variables
|
|
private void importHashSet(java.awt.event.ActionEvent evt) {
|
|
new HashDbAddDatabaseDialog().display();
|
|
hashSetTableModel.resync();
|
|
}
|
|
|
|
/**
|
|
* The visual display of hash databases loaded.
|
|
*/
|
|
private class HashSetTable extends JTable {
|
|
@Override
|
|
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
|
|
Component c = super.prepareRenderer(renderer, row, column);
|
|
JComponent jc = (JComponent) c;
|
|
String valueText = (String) getValueAt(row, column);
|
|
jc.setToolTipText(valueText);
|
|
|
|
//Letting the user know which DBs need to be indexed
|
|
if(hashSetTableModel.indexExists(row)){
|
|
c.setForeground(Color.black);
|
|
}
|
|
else{
|
|
c.setForeground(Color.red);
|
|
}
|
|
return c;
|
|
}
|
|
}
|
|
|
|
|
|
private class HashSetTableModel extends AbstractTableModel {
|
|
|
|
private HashDbXML xmlHandle = HashDbXML.getCurrent();
|
|
|
|
@Override
|
|
public int getColumnCount() {
|
|
return 1;
|
|
}
|
|
|
|
@Override
|
|
public int getRowCount() {
|
|
return xmlHandle.getAllSets().size();
|
|
}
|
|
|
|
@Override
|
|
public String getColumnName(int column) {
|
|
return "Name";
|
|
}
|
|
|
|
@Override
|
|
public Object getValueAt(int rowIndex, int columnIndex) {
|
|
if(xmlHandle.getNSRLSet() == null) {
|
|
return getDBAt(rowIndex).getName();
|
|
} else {
|
|
return rowIndex == 0 ? getDBAt(rowIndex).getName() + " (NSRL)" : getDBAt(rowIndex).getName();
|
|
}
|
|
}
|
|
|
|
//Internal function for determining whether a companion -md5.idx file exists
|
|
private boolean indexExists(int rowIndex){
|
|
return getDBAt(rowIndex).indexExists();
|
|
}
|
|
|
|
|
|
//Internal function for getting the DB at a certain index. Used as-is, as well as by dispatch from getValueAt() and indexExists()
|
|
private HashDb getDBAt(int rowIndex){
|
|
if (xmlHandle.getNSRLSet() != null) {
|
|
if(rowIndex == 0) {
|
|
return xmlHandle.getNSRLSet();
|
|
} else {
|
|
return xmlHandle.getKnownBadSets().get(rowIndex-1);
|
|
}
|
|
} else {
|
|
return xmlHandle.getKnownBadSets().get(rowIndex);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean isCellEditable(int rowIndex, int columnIndex) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
|
|
throw new UnsupportedOperationException("Editing of cells is not supported");
|
|
}
|
|
|
|
@Override
|
|
public Class<?> getColumnClass(int c) {
|
|
return getValueAt(0, c).getClass();
|
|
}
|
|
|
|
void resync() {
|
|
fireTableDataChanged();
|
|
}
|
|
}
|
|
|
|
static void setButtonFromIndexStatus(JButton theButton, JLabel theLabel, IndexStatus status) {
|
|
theLabel.setText(status.message());
|
|
switch (status) {
|
|
case INDEX_OUTDATED:
|
|
theButton.setText("Re-index");
|
|
theLabel.setForeground(Color.black);
|
|
theButton.setEnabled(true);
|
|
break;
|
|
case INDEX_CURRENT:
|
|
theButton.setText("Re-index");
|
|
theLabel.setForeground(Color.black);
|
|
theButton.setEnabled(true);
|
|
break;
|
|
case NO_INDEX:
|
|
theButton.setText("Index");
|
|
theLabel.setForeground(Color.red);
|
|
theButton.setEnabled(true);
|
|
break;
|
|
case INDEXING:
|
|
theButton.setText("Indexing");
|
|
theLabel.setForeground(Color.black);
|
|
theButton.setEnabled(false);
|
|
break;
|
|
default:
|
|
theButton.setText("Index");
|
|
theLabel.setForeground(Color.black);
|
|
theButton.setEnabled(false);
|
|
}
|
|
if (ingestRunning) {
|
|
theButton.setEnabled(false);
|
|
}
|
|
}
|
|
|
|
private int getSelection() {
|
|
return hashSetTable.getSelectionModel().getMinSelectionIndex();
|
|
}
|
|
|
|
private void setSelection(int index) {
|
|
if(index >= 0 && index < hashSetTable.getRowCount()) {
|
|
hashSetTable.getSelectionModel().setSelectionInterval(index, index);
|
|
}
|
|
}
|
|
void resync() {
|
|
int index = getSelection();
|
|
this.hashSetTableModel.resync();
|
|
setSelection(index);
|
|
}
|
|
|
|
} |