Further iteration on multiple hash databases.

Not 100% tested (is that possible?), but stable enough and we need it
to line up Autopsy with new Sleuthkit API.
This commit is contained in:
Dick Fickling 2012-05-10 17:31:20 -04:00
parent e18ab444cd
commit 473a3a9925
14 changed files with 901 additions and 469 deletions

View File

@ -73,7 +73,7 @@ class ButtonColumn extends AbstractCellEditor
*/
ButtonColumn(JTable table, Action action, int column, String buttonName)
{
this.table = table;
this.table = table;
this.action = action;
this.buttonName = buttonName;
@ -88,7 +88,7 @@ class ButtonColumn extends AbstractCellEditor
columnModel.getColumn(column).setCellRenderer( this );
columnModel.getColumn(column).setCellEditor( this );
table.addMouseListener( this );
}
}
/**
@ -172,7 +172,7 @@ class ButtonColumn extends AbstractCellEditor
}
//renderButton.setText( (value == null) ? "" : value.toString() );
renderButton.setText(buttonName);
renderButton.setText(buttonName);
return renderButton;
}

View File

@ -39,8 +39,16 @@ public class AdvancedConfigurationDialog extends javax.swing.JDialog {
/** Creates new form AdvancedConfigurationDialog */
public AdvancedConfigurationDialog() {
this(false);
}
/** Creates new form AdvancedConfigurationDialog */
public AdvancedConfigurationDialog(boolean resizable) {
super(new JFrame(), true);
setResizable(false);
setResizable(resizable);
if(resizable) {
this.setIconImage(null);
}
initComponents();
}

View File

@ -6,6 +6,15 @@
<code-name-base>org.sleuthkit.autopsy.hashdatabase</code-name-base>
<suite-component/>
<module-dependencies>
<dependency>
<code-name-base>org.netbeans.api.progress</code-name-base>
<build-prerequisite/>
<compile-dependency/>
<run-dependency>
<release-version>1</release-version>
<specification-version>1.24.1</specification-version>
</run-dependency>
</dependency>
<dependency>
<code-name-base>org.openide.awt</code-name-base>
<build-prerequisite/>

View File

@ -5,9 +5,15 @@ HashDbSimplePanel.knownLabel.text=Known files database:
HashDbSimplePanel.notableLabel.text=Notable files database:
HashDbSimplePanel.knownValLabel.text=-
HashDbSimplePanel.notableValLabel.text=-
HashDbMgmtPanel.addNotableButton.text=Add Notable Hashset
HashDbMgmtPanel.addNSRLButton.text=Add NSRL Hashset
HashDbMgmtPanel.addNotableButton.text=Add Notable Database
HashDbMgmtPanel.removeNotableButton.text=Remove Selected
HashDbMgmtPanel.removeNSRLButton.text=Remove Selected
HashDbSimplePanel.jLabel1.text=Notable Hash Databases:
HashDbSimplePanel.jLabel2.text=NSRL Hash Databases:
HashDbSimplePanel.jLabel2.text=NSRL Hash Database:
HashDbMgmtPanel.nsrlNameLabel.text=No NSRL Hashset
HashDbMgmtPanel.setNSRLButton.text=Change
HashDbSimplePanel.nsrlNameLabel.text=No NSRL database set.
HashDbMgmtPanel.jLabel1.text=Notable Hash Databases:
HashDbMgmtPanel.jLabel2.text=NSRL Database:
HashDbMgmtPanel.indexNSRLButton.text=Index
HashDbMgmtPanel.removeNSRLButton.text=Remove
HashDbMgmtPanel.ingestRunningLabel.text=\

View File

@ -0,0 +1,227 @@
/*
* 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;
/**
* @author jantonius
*
* Taken from: http://tips4java.wordpress.com/2009/07/12/table-button-column/
* Note: everything is the same, except I edited the buttonName
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
/**
* The ButtonColumn class provides a renderer and an editor that looks like a
* JButton. The renderer and editor will then be used for a specified column
* in the table. The TableModel will contain the String to be displayed on
* the button.
*
* The button can be invoked by a mouse click or by pressing the space bar
* when the cell has focus. Optionally a mnemonic can be set to invoke the
* button. When the button is invoked the provided Action is invoked. The
* source of the Action will be the table. The action command will contain
* the model row number of the button that was clicked.
*
*/
public class ButtonColumn extends AbstractCellEditor
implements TableCellRenderer, TableCellEditor, ActionListener, MouseListener
{
private JTable table;
private Action action;
private int mnemonic;
private Border originalBorder;
private Border focusBorder;
private JButton renderButton;
private JButton editButton;
private String text;
private boolean isButtonColumnEditor;
/**
* Create the ButtonColumn to be used as a renderer and editor. The
* renderer and editor will automatically be installed on the TableColumn
* of the specified column.
*
* @param table the table containing the button renderer/editor
* @param action the Action to be invoked when the button is invoked
* @param column the column to which the button renderer/editor is added
* @param buttonName text displayed on the button
*/
public ButtonColumn(JTable table, Action action, int column)
{
this.table = table;
this.action = action;
renderButton = new JButton();
editButton = new JButton();
editButton.setFocusPainted( false );
editButton.addActionListener( this );
originalBorder = editButton.getBorder();
setFocusBorder( new LineBorder(Color.BLUE) );
TableColumnModel columnModel = table.getColumnModel();
columnModel.getColumn(column).setCellRenderer( this );
columnModel.getColumn(column).setCellEditor( this );
table.addMouseListener( this );
}
/**
* Get foreground color of the button when the cell has focus
*
* @return the foreground color
*/
public Border getFocusBorder()
{
return focusBorder;
}
/**
* The foreground color of the button when the cell has focus
*
* @param focusBorder the foreground color
*/
public void setFocusBorder(Border focusBorder)
{
this.focusBorder = focusBorder;
editButton.setBorder( focusBorder );
}
public int getMnemonic()
{
return mnemonic;
}
/**
* The mnemonic to activate the button when the cell has focus
*
* @param mnemonic the mnemonic
*/
public void setMnemonic(int mnemonic)
{
this.mnemonic = mnemonic;
renderButton.setMnemonic(mnemonic);
editButton.setMnemonic(mnemonic);
}
@Override
public Component getTableCellEditorComponent(
JTable table, Object value, boolean isSelected, int row, int column)
{
HashDbMgmtPanel.setButtonFromIndexStatus(editButton, (IndexStatus) value);
return editButton;
}
@Override
public Object getCellEditorValue()
{
return text;
}
//
// Implement TableCellRenderer interface
//
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
if (isSelected)
{
renderButton.setForeground(table.getSelectionForeground());
renderButton.setBackground(table.getSelectionBackground());
}
else
{
renderButton.setForeground(table.getForeground());
renderButton.setBackground(UIManager.getColor("Button.background"));
}
if (hasFocus)
{
renderButton.setBorder( focusBorder );
}
else
{
renderButton.setBorder( originalBorder );
}
HashDbMgmtPanel.setButtonFromIndexStatus(renderButton, (IndexStatus) value);
return renderButton;
}
//
// Implement ActionListener interface
//
/*
* The button has been pressed. Stop editing and invoke the custom Action
*/
@Override
public void actionPerformed(ActionEvent e)
{
int row = table.convertRowIndexToModel( table.getEditingRow() );
fireEditingStopped();
// Invoke the Action
ActionEvent event = new ActionEvent(
table,
ActionEvent.ACTION_PERFORMED,
"" + row);
action.actionPerformed(event);
}
//
// Implement MouseListener interface
//
/*
* When the mouse is pressed the editor is invoked. If you then then drag
* the mouse to another cell before releasing it, the editor is still
* active. Make sure editing is stopped when the mouse is released.
*/
@Override
public void mousePressed(MouseEvent e)
{
if (table.isEditing()
&& table.getCellEditor() == this)
isButtonColumnEditor = true;
}
@Override
public void mouseReleased(MouseEvent e)
{
if (isButtonColumnEditor
&& table.isEditing())
table.getCellEditor().stopCellEditing();
isButtonColumnEditor = false;
}
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
}

View File

@ -20,7 +20,15 @@ package org.sleuthkit.autopsy.hashdatabase;
import java.io.File;
import java.util.List;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import org.netbeans.api.progress.ProgressHandle;
import org.netbeans.api.progress.ProgressHandleFactory;
import org.openide.util.Cancellable;
import org.sleuthkit.autopsy.coreutils.Log;
import org.sleuthkit.datamodel.SleuthkitJNI;
import org.sleuthkit.datamodel.TskException;
@ -32,7 +40,7 @@ import org.sleuthkit.datamodel.TskException;
public class HashDb implements Comparable<HashDb> {
public enum DBType{
NSRL, NOTABLE;
NSRL, KNOWN_BAD;
}
// Suffix added to the end of a database name to get its index file
@ -41,13 +49,13 @@ public class HashDb implements Comparable<HashDb> {
private String name;
private List<String> databasePaths; // TODO: Length limited to one for now...
private boolean useForIngest;
private DBType type;
private boolean indexing;
public HashDb(String name, DBType type, List<String> databasePaths, boolean useForIngest) {
public HashDb(String name, List<String> databasePaths, boolean useForIngest) {
this.name = name;
this.type = type;
this.databasePaths = databasePaths;
this.useForIngest = useForIngest;
this.indexing = false;
}
boolean getUseForIngest() {
@ -62,10 +70,6 @@ public class HashDb implements Comparable<HashDb> {
return databasePaths;
}
DBType getType() {
return type;
}
void setUseForIngest(boolean useForIngest) {
this.useForIngest = useForIngest;
}
@ -78,10 +82,6 @@ public class HashDb implements Comparable<HashDb> {
this.databasePaths = databasePaths;
}
void setType(DBType type) {
this.type = type;
}
/**
* Checks if the database exists.
* @return true if a file exists at the database path, else false
@ -133,6 +133,13 @@ public class HashDb implements Comparable<HashDb> {
return i.exists() && db.exists() && isOlderThan(i, db);
}
/**
* Checks if the database is being indexed
*/
boolean isIndexing() {
return indexing;
}
/**
* Returns the status of the HashDb as determined from indexExists(),
* databaseExists(), and isOutdated()
@ -142,6 +149,8 @@ public class HashDb implements Comparable<HashDb> {
boolean i = this.indexExists();
boolean db = this.databaseExists();
if(indexing)
return IndexStatus.INDEXING;
if (i) {
if (db) {
return this.isOutdated() ? IndexStatus.INDEX_OUTDATED : IndexStatus.INDEX_CURRENT;
@ -158,7 +167,9 @@ public class HashDb implements Comparable<HashDb> {
* @throws TskException if an error occurs in the SleuthKit bindings
*/
void createIndex() throws TskException {
SleuthkitJNI.createLookupIndex(databasePaths.get(0), name); //TODO: fix for multiple paths
indexing = true;
CreateIndex creator = new CreateIndex();
creator.execute();
//TODO: error checking
}
@ -216,4 +227,52 @@ public class HashDb implements Comparable<HashDb> {
public int compareTo(HashDb o) {
return this.name.compareTo(o.name);
}
/* Thread that adds image/file and service pairs to queues */
private class CreateIndex extends SwingWorker<Object,Void> {
private ProgressHandle progress;
CreateIndex(){};
@Override
protected Object doInBackground() throws Exception {
progress = ProgressHandleFactory.createHandle("Indexing " + name, new Cancellable() {
@Override
public boolean cancel() {
return CreateIndex.this.cancel(true);
}
});
progress.start();
progress.switchToIndeterminate();
SleuthkitJNI.createLookupIndex(databasePaths.get(0));
return null;
}
/* clean up or start the worker threads */
@Override
protected void done() {
try {
super.get(); //block and get all exceptions thrown while doInBackground()
} catch (CancellationException e) {
//task was cancelled
handleInterruption(e);
} catch (InterruptedException ex) {
handleInterruption(ex);
} catch (ExecutionException ex) {
handleInterruption(ex);
} catch (Exception ex) {
handleInterruption(ex);
} finally {
indexing = false;
progress.finish();
HashDbMgmtPanel.getDefault().resync();
}
}
private void handleInterruption(Exception ex) {
//TODO: something
Logger.getLogger(CreateIndex.class.getName()).log(Level.WARNING, "interrupted!", ex);
}
}
}

View File

@ -19,14 +19,12 @@
package org.sleuthkit.autopsy.hashdatabase;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.hashdatabase.HashDb.DBType;
import org.sleuthkit.autopsy.ingest.IngestManager;
import org.sleuthkit.autopsy.ingest.IngestManagerProxy;
import org.sleuthkit.autopsy.ingest.IngestMessage;
@ -54,8 +52,9 @@ public class HashDbIngestService implements IngestServiceFsContent {
private int count;
// Whether or not to do hash lookups (only set to true if there are dbs set)
private boolean process;
private List<HashDb> NSRLDbs = new ArrayList<HashDb>();
private List<HashDb> notableDbs = new ArrayList<HashDb>();
private HashDb nsrlSet;
private int nsrlPointer;
private Map<Integer, HashDb> knownBadSets = new HashMap<Integer, HashDb>();
private HashDbIngestService() {
@ -77,33 +76,41 @@ public class HashDbIngestService implements IngestServiceFsContent {
*/
@Override
public void init(IngestManagerProxy managerProxy) {
HashDbMgmtPanel.getDefault().setIngestRunning(true);
this.process = false;
this.managerProxy = managerProxy;
this.managerProxy.postMessage(IngestMessage.createMessage(++messageId, IngestMessage.MessageType.INFO, this, "Started"));
this.skCase = Case.getCurrentCase().getSleuthkitCase();
try {
HashDbXML hdbxml = HashDbXML.getCurrent();
NSRLDbs.clear();
notableDbs.clear();
nsrlSet = null;
knownBadSets.clear();
skCase.clearLookupDatabases();
boolean nsrlSet = false;
boolean notablesSet = false;
boolean nsrlIsSet = false;
boolean knownBadIsSet = false;
for(HashDb db : hdbxml.getSets()) {
HashDb nsrl = hdbxml.getNSRLSet();
if(nsrl != null && IndexStatus.isIngestible(nsrl.status())) {
nsrlIsSet = true;
this.process = true;
if(db.getType().equals(DBType.NOTABLE) && db.getUseForIngest()) {
notablesSet = true;
skCase.addKnownBadDatabase(db.getDatabasePaths().get(0), db.getName()); // TODO: support multiple paths
} else if(db.getType().equals(DBType.NSRL) && db.getUseForIngest()) {
nsrlSet = true;
skCase.setNSRLDatabase(db.getDatabasePaths().get(0)); // TODO: support multiple paths
this.nsrlSet = nsrl;
nsrlPointer = skCase.setNSRLDatabase(nsrl.getDatabasePaths().get(0));
}
for(HashDb db : hdbxml.getKnownBadSets()) {
IndexStatus status = db.status();
if (db.getUseForIngest() && IndexStatus.isIngestible(status)) { // TODO: should inform user that we won't use the db if it's not indexed
this.process = true;
knownBadIsSet = true;
int ret = skCase.addKnownBadDatabase(db.getDatabasePaths().get(0)); // TODO: support multiple paths
knownBadSets.put(ret, db);
}
}
if (!nsrlSet) {
if (!nsrlIsSet) {
this.managerProxy.postMessage(IngestMessage.createWarningMessage(++messageId, this, "No NSRL database set", "Known file search will not be executed."));
}
if (!notablesSet) {
if (!knownBadIsSet) {
this.managerProxy.postMessage(IngestMessage.createWarningMessage(++messageId, this, "No known bad database set", "Known bad file search will not be executed."));
}
@ -131,7 +138,7 @@ public class HashDbIngestService implements IngestServiceFsContent {
detailsSb.append("<th>Notable databases used:</th>");
detailsSb.append("</tr>");
for(HashDb db : notableDbs) {
for(HashDb db : knownBadSets.values()) {
detailsSb.append("<tr><th>");
detailsSb.append(db.getName());
detailsSb.append("</th><td>");
@ -141,6 +148,8 @@ public class HashDbIngestService implements IngestServiceFsContent {
detailsSb.append("</table>");
managerProxy.postMessage(IngestMessage.createMessage(++messageId, IngestMessage.MessageType.INFO, this, "Hash Ingest Complete", detailsSb.toString()));
HashDbMgmtPanel.getDefault().setIngestRunning(false);
}
/**
@ -149,6 +158,7 @@ public class HashDbIngestService implements IngestServiceFsContent {
@Override
public void stop() {
//manager.postMessage(IngestMessage.createMessage(++messageId, IngestMessage.MessageType.INFO, this, "STOP"));
HashDbMgmtPanel.getDefault().setIngestRunning(false);
}
/**
@ -184,46 +194,24 @@ public class HashDbIngestService implements IngestServiceFsContent {
String name = fsContent.getName();
try {
String md5Hash = Hash.calculateMd5(fsContent);
Map<String, TskData.FileKnown> results = skCase.lookupMd5(md5Hash);
for (Map.Entry<String, TskData.FileKnown> entry : results.entrySet()) {
String hashSetName = entry.getKey();
TskData.FileKnown status = entry.getValue();
boolean changed = skCase.setKnown(fsContent, status);
TskData.FileKnown status = TskData.FileKnown.UKNOWN;
boolean foundBad = false;
for (Map.Entry<Integer, HashDb> entry : knownBadSets.entrySet()) {
status = skCase.knownBadLookupMd5(md5Hash, entry.getKey());
if (status.equals(TskData.FileKnown.BAD)) {
foundBad = true;
count += 1;
BlackboardArtifact badFile = fsContent.newArtifact(ARTIFACT_TYPE.TSK_HASHSET_HIT);
BlackboardAttribute att2 = new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_HASHSET_NAME.getTypeID(), MODULE_NAME, "Known Bad", hashSetName);
badFile.addAttribute(att2);
BlackboardAttribute att3 = new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_HASH_MD5.getTypeID(), MODULE_NAME, "", md5Hash);
badFile.addAttribute(att3);
StringBuilder detailsSb = new StringBuilder();
//details
detailsSb.append("<table border='0' cellpadding='4' width='280'>");
//hit
detailsSb.append("<tr>");
detailsSb.append("<th>File Name</th>");
detailsSb.append("<td>").append(name).append("</td>");
detailsSb.append("</tr>");
detailsSb.append("<tr>");
detailsSb.append("<th>MD5 Hash</th>");
detailsSb.append("<td>").append(md5Hash).append("</td>");
detailsSb.append("</tr>");
detailsSb.append("<tr>");
detailsSb.append("<th>Hashset Name</th>");
detailsSb.append("<td>").append(hashSetName).append("</td>");
detailsSb.append("</tr>");
detailsSb.append("</table>");
managerProxy.postMessage(IngestMessage.createDataMessage(++messageId, this, "Notable: " + name, detailsSb.toString(), name + md5Hash, badFile));
IngestManager.fireServiceDataEvent(new ServiceDataEvent(MODULE_NAME, ARTIFACT_TYPE.TSK_HASHSET_HIT, Collections.singletonList(badFile)));
ret = ProcessResult.OK;
} else if (status.equals(TskData.FileKnown.KNOWN)) {
skCase.setKnown(fsContent, status);
String hashSetName = entry.getValue().getName();
processBadFile(fsContent, md5Hash, hashSetName);
}
ret = ProcessResult.OK;
}
if(!foundBad) {
status = skCase.nsrlLookupMd5(md5Hash);
if (status.equals(TskData.FileKnown.KNOWN)) {
skCase.setKnown(fsContent, status);
ret = ProcessResult.COND_STOP;
} else {
ret = ProcessResult.OK;
}
}
} catch (TskException ex) {
@ -283,4 +271,44 @@ public class HashDbIngestService implements IngestServiceFsContent {
public void saveSimpleConfiguration() {
}
private void processBadFile(FsContent fsContent, String md5Hash, String hashSetName) {
try {
BlackboardArtifact badFile = fsContent.newArtifact(ARTIFACT_TYPE.TSK_HASHSET_HIT);
BlackboardAttribute att2 = new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_HASHSET_NAME.getTypeID(), MODULE_NAME, "Known Bad", hashSetName);
badFile.addAttribute(att2);
BlackboardAttribute att3 = new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_HASH_MD5.getTypeID(), MODULE_NAME, "", md5Hash);
badFile.addAttribute(att3);
StringBuilder detailsSb = new StringBuilder();
//details
detailsSb.append("<table border='0' cellpadding='4' width='280'>");
//hit
detailsSb.append("<tr>");
detailsSb.append("<th>File Name</th>");
detailsSb.append("<td>").append(fsContent.getName()).append("</td>");
detailsSb.append("</tr>");
detailsSb.append("<tr>");
detailsSb.append("<th>MD5 Hash</th>");
detailsSb.append("<td>").append(md5Hash).append("</td>");
detailsSb.append("</tr>");
detailsSb.append("<tr>");
detailsSb.append("<th>Hashset Name</th>");
detailsSb.append("<td>").append(hashSetName).append("</td>");
detailsSb.append("</tr>");
detailsSb.append("</table>");
managerProxy.postMessage(IngestMessage.createDataMessage(++messageId, this,
"Notable: " + fsContent.getName(),
detailsSb.toString(),
fsContent.getName() + md5Hash,
badFile));
IngestManager.fireServiceDataEvent(new ServiceDataEvent(MODULE_NAME, ARTIFACT_TYPE.TSK_HASHSET_HIT, Collections.singletonList(badFile)));
} catch (TskException ex) {
logger.log(Level.WARNING, "Error creating blackboard artifact", ex);
}
}
}

View File

@ -20,10 +20,6 @@ package org.sleuthkit.autopsy.hashdatabase;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.logging.Level;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.util.HelpCtx;
import org.openide.util.actions.CallableSystemAction;
import org.sleuthkit.autopsy.corecomponents.AdvancedConfigurationDialog;
@ -44,17 +40,13 @@ class HashDbMgmtAction extends CallableSystemAction {
// initialize panel with loaded settings
final HashDbMgmtPanel panel = HashDbMgmtPanel.getDefault();
final AdvancedConfigurationDialog dialog = new AdvancedConfigurationDialog();
final AdvancedConfigurationDialog dialog = new AdvancedConfigurationDialog(true);
dialog.addApplyButtonListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(panel.save()) {
dialog.close();
} else {
NotifyDescriptor d = new NotifyDescriptor.Message("Error saving settings", NotifyDescriptor.INFORMATION_MESSAGE);
DialogDisplayer.getDefault().notify(d);
}
panel.save();
dialog.close();
}
});
dialog.display(panel);

View File

@ -18,39 +18,65 @@
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="addNSRLButton" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="235" max="32767" attributes="0"/>
<Component id="removeNSRLButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="257" max="32767" attributes="0"/>
</Group>
<Component id="jScrollPane1" alignment="0" min="0" pref="0" max="32767" attributes="1"/>
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="10" max="-2" attributes="0"/>
<Component id="nsrlNameLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="63" max="32767" attributes="0"/>
<Component id="indexNSRLButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="setNSRLButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="removeNSRLButton" min="-2" max="-2" attributes="0"/>
</Group>
<Component id="jLabel2" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
</Group>
<Component id="jScrollPane1" alignment="0" pref="389" max="32767" attributes="1"/>
<Group type="102" alignment="1" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="addNotableButton" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="223" max="32767" attributes="0"/>
<EmptySpace pref="113" max="32767" attributes="0"/>
<Component id="removeNotableButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
</Group>
<Component id="jScrollPane2" alignment="0" min="0" pref="0" max="32767" attributes="1"/>
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="ingestRunningLabel" pref="369" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="1" attributes="0">
<Component id="jScrollPane1" min="-2" pref="203" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="jLabel2" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="addNotableButton" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="removeNotableButton" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Component id="jScrollPane2" pref="186" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="addNSRLButton" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="nsrlNameLabel" alignment="3" max="32767" attributes="1"/>
<Component id="removeNSRLButton" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="setNSRLButton" alignment="3" max="32767" attributes="1"/>
<Component id="indexNSRLButton" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
<Component id="jScrollPane1" pref="163" max="32767" attributes="0"/>
<EmptySpace min="-2" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="removeNotableButton" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="addNotableButton" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="ingestRunningLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
@ -67,48 +93,6 @@
</Component>
</SubComponents>
</Container>
<Component class="javax.swing.JButton" name="addNSRLButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/hashdatabase/Bundle.properties" key="HashDbMgmtPanel.addNSRLButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="addNSRLButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="removeNSRLButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/hashdatabase/Bundle.properties" key="HashDbMgmtPanel.removeNSRLButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="removeNSRLButtonActionPerformed"/>
</Events>
</Component>
<Container class="javax.swing.JScrollPane" name="jScrollPane2">
<AuxValues>
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>
<Component class="javax.swing.JTable" name="nsrlHashSetTable">
<Properties>
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor">
<Table columnCount="0" rowCount="0"/>
</Property>
<Property name="columnModel" type="javax.swing.table.TableColumnModel" editor="org.netbeans.modules.form.editors2.TableColumnModelEditor">
<TableColumnModel selectionModel="0"/>
</Property>
<Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor">
<TableHeader reorderingAllowed="true" resizingAllowed="true"/>
</Property>
</Properties>
</Component>
</SubComponents>
</Container>
<Component class="javax.swing.JButton" name="addNotableButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
@ -129,5 +113,63 @@
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="removeNotableButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="setNSRLButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/hashdatabase/Bundle.properties" key="HashDbMgmtPanel.setNSRLButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="setNSRLButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JLabel" name="nsrlNameLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/hashdatabase/Bundle.properties" key="HashDbMgmtPanel.nsrlNameLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="jLabel1">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/hashdatabase/Bundle.properties" key="HashDbMgmtPanel.jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="jLabel2">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/hashdatabase/Bundle.properties" key="HashDbMgmtPanel.jLabel2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="indexNSRLButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/hashdatabase/Bundle.properties" key="HashDbMgmtPanel.indexNSRLButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="indexNSRLButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="removeNSRLButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/hashdatabase/Bundle.properties" key="HashDbMgmtPanel.removeNSRLButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="removeNSRLButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JLabel" name="ingestRunningLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/hashdatabase/Bundle.properties" key="HashDbMgmtPanel.ingestRunningLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
</SubComponents>
</Form>

View File

@ -26,7 +26,6 @@ package org.sleuthkit.autopsy.hashdatabase;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
@ -34,7 +33,8 @@ import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractCellEditor;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
@ -43,10 +43,8 @@ import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import org.sleuthkit.autopsy.hashdatabase.HashDb.DBType;
import org.sleuthkit.datamodel.SleuthkitJNI;
import org.sleuthkit.datamodel.TskException;
@ -58,14 +56,14 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
private static final Logger logger = Logger.getLogger(HashDbMgmtPanel.class.getName());
private HashSetTableModel notableTableModel;
private HashSetTableModel nsrlTableModel;
private JFileChooser fc = new JFileChooser();
private static HashDbMgmtPanel instance;
private HashDb nsrlSet;
private static boolean ingestRunning = false;
/** Creates new form HashDbMgmtPanel */
private HashDbMgmtPanel() {
notableTableModel = new HashSetTableModel();
nsrlTableModel = new HashSetTableModel();
initComponents();
customizeComponents();
}
@ -74,18 +72,19 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
if(instance == null) {
instance = new HashDbMgmtPanel();
}
instance.notableTableModel.resync();
return instance;
}
void resync() {
notableTableModel.resync();
}
private void customizeComponents() {
notableHashSetTable.setModel(notableTableModel);
notableHashSetTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
notableHashSetTable.setRowHeight(25);
notableTableModel.resync(DBType.NOTABLE);
nsrlHashSetTable.setModel(nsrlTableModel);
nsrlHashSetTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
nsrlHashSetTable.setRowHeight(25);
nsrlTableModel.resync(DBType.NSRL);
notableHashSetTable.setRowHeight(20);
notableTableModel.resync();
fc.setDragEnabled(false);
fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
String[] EXTENSION = new String[] { "txt", "idx", "hash", "Hash" };
@ -94,76 +93,60 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
fc.setFileFilter(filter);
fc.setMultiSelectionEnabled(false);
final int width1 = jScrollPane1.getPreferredSize().width;
TableColumn column1 = null;
for (int i = 0; i < notableHashSetTable.getColumnCount(); i++) {
column1 = notableHashSetTable.getColumnModel().getColumn(i);
if (i == 2) {
ButtonRenderer br = new ButtonRenderer();
br.getTheButton().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int row = notableHashSetTable.getSelectedRow();
try {
notableTableModel.getHashSetAt(row).createIndex();
} catch (TskException ex) {
logger.log(Level.WARNING, "Error creating index", ex);
}
notableTableModel.resync(DBType.NOTABLE);
}
});
column1.setCellRenderer(br);
column1.setCellEditor(br);
}
if (i == 3) {
column1.setCellRenderer(new CheckBoxRenderer());
}
}
final int width2 = jScrollPane2.getPreferredSize().width;
TableColumn column2 = null;
for (int i = 0; i < nsrlHashSetTable.getColumnCount(); i++) {
column2 = nsrlHashSetTable.getColumnModel().getColumn(i);
if (i == 2) {
ButtonRenderer br = new ButtonRenderer();
br.getTheButton().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int row = nsrlHashSetTable.getSelectedRow();
try {
nsrlTableModel.getHashSetAt(row).createIndex();
} catch (TskException ex) {
logger.log(Level.WARNING, "Error creating index", ex);
}
nsrlTableModel.resync(DBType.NSRL);
}
});
column2.setCellRenderer(br);
column2.setCellEditor(br);
}
if (i == 3) {
column2.setCellRenderer(new CheckBoxRenderer());
Action indexSet = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
int row = notableHashSetTable.getSelectedRow();
try {
notableTableModel.getHashSetAt(row).createIndex();
} catch (TskException ex) {
logger.log(Level.WARNING, "Error creating index", ex);
}
notableTableModel.resync();
}
};
new ButtonColumn(notableHashSetTable, indexSet, 2);
nsrlSet = HashDbXML.getCurrent().getNSRLSet();
if(nsrlSet != null) {
nsrlNameLabel.setText(nsrlSet.getName());
setButtonFromIndexStatus(indexNSRLButton, nsrlSet.status());
} else {
setButtonFromIndexStatus(indexNSRLButton, IndexStatus.NO_DB);
removeNSRLButton.setEnabled(false);
}
}
/**
* Checks if indexes exist for all defined databases
* @return true if Sleuth Kit can open the indexes of all databases
* than have been selected
* Save the modified settings
*/
boolean indexesExist() {
return notableTableModel.indexesExist() && nsrlTableModel.indexesExist();
void save() {
HashDbXML.getCurrent().setNSRLSet(nsrlSet);
}
/**
* Save the table settings
* @return whether save was successful
* Don't allow any changes if ingest is running
*/
boolean save() {
notableTableModel.saveAll();
nsrlTableModel.saveAll();
return true;
void setIngestRunning(boolean running) {
addNotableButton.setEnabled(!running);
removeNotableButton.setEnabled(!running);
setNSRLButton.setEnabled(!running);
indexNSRLButton.setEnabled(!running);
removeNSRLButton.setEnabled(!running);
ingestRunning = running;
if(running)
ingestRunningLabel.setText("Ingest is ongoing; some settings will be unavailable until it finishes.");
else
ingestRunningLabel.setText("");
}
/** This method is called from within the constructor to
@ -177,39 +160,18 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
jScrollPane1 = new javax.swing.JScrollPane();
notableHashSetTable = new javax.swing.JTable();
addNSRLButton = new javax.swing.JButton();
removeNSRLButton = new javax.swing.JButton();
jScrollPane2 = new javax.swing.JScrollPane();
nsrlHashSetTable = new javax.swing.JTable();
addNotableButton = new javax.swing.JButton();
removeNotableButton = new javax.swing.JButton();
setNSRLButton = new javax.swing.JButton();
nsrlNameLabel = new javax.swing.JLabel();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
indexNSRLButton = new javax.swing.JButton();
removeNSRLButton = new javax.swing.JButton();
ingestRunningLabel = new javax.swing.JLabel();
jScrollPane1.setViewportView(notableHashSetTable);
addNSRLButton.setText(org.openide.util.NbBundle.getMessage(HashDbMgmtPanel.class, "HashDbMgmtPanel.addNSRLButton.text")); // NOI18N
addNSRLButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addNSRLButtonActionPerformed(evt);
}
});
removeNSRLButton.setText(org.openide.util.NbBundle.getMessage(HashDbMgmtPanel.class, "HashDbMgmtPanel.removeNSRLButton.text")); // NOI18N
removeNSRLButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
removeNSRLButtonActionPerformed(evt);
}
});
nsrlHashSetTable.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
}
));
jScrollPane2.setViewportView(nsrlHashSetTable);
addNotableButton.setText(org.openide.util.NbBundle.getMessage(HashDbMgmtPanel.class, "HashDbMgmtPanel.addNotableButton.text")); // NOI18N
addNotableButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
@ -224,75 +186,94 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
}
});
setNSRLButton.setText(org.openide.util.NbBundle.getMessage(HashDbMgmtPanel.class, "HashDbMgmtPanel.setNSRLButton.text")); // NOI18N
setNSRLButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
setNSRLButtonActionPerformed(evt);
}
});
nsrlNameLabel.setText(org.openide.util.NbBundle.getMessage(HashDbMgmtPanel.class, "HashDbMgmtPanel.nsrlNameLabel.text")); // NOI18N
jLabel1.setText(org.openide.util.NbBundle.getMessage(HashDbMgmtPanel.class, "HashDbMgmtPanel.jLabel1.text")); // NOI18N
jLabel2.setText(org.openide.util.NbBundle.getMessage(HashDbMgmtPanel.class, "HashDbMgmtPanel.jLabel2.text")); // NOI18N
indexNSRLButton.setText(org.openide.util.NbBundle.getMessage(HashDbMgmtPanel.class, "HashDbMgmtPanel.indexNSRLButton.text")); // NOI18N
indexNSRLButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
indexNSRLButtonActionPerformed(evt);
}
});
removeNSRLButton.setText(org.openide.util.NbBundle.getMessage(HashDbMgmtPanel.class, "HashDbMgmtPanel.removeNSRLButton.text")); // NOI18N
removeNSRLButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
removeNSRLButtonActionPerformed(evt);
}
});
ingestRunningLabel.setText(org.openide.util.NbBundle.getMessage(HashDbMgmtPanel.class, "HashDbMgmtPanel.ingestRunningLabel.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()
.addComponent(addNSRLButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 235, Short.MAX_VALUE)
.addComponent(removeNSRLButton)
.addContainerGap())
.addComponent(jScrollPane1, 0, 0, Short.MAX_VALUE)
.addComponent(jLabel1)
.addContainerGap(257, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(10, 10, 10)
.addComponent(nsrlNameLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 63, Short.MAX_VALUE)
.addComponent(indexNSRLButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(setNSRLButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(removeNSRLButton))
.addComponent(jLabel2))
.addContainerGap())
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 389, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.addComponent(addNotableButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 223, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 113, Short.MAX_VALUE)
.addComponent(removeNotableButton)
.addContainerGap())
.addComponent(jScrollPane2, 0, 0, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(ingestRunningLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 369, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 203, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(addNotableButton)
.addComponent(removeNotableButton))
.addComponent(nsrlNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(removeNSRLButton)
.addComponent(setNSRLButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(indexNSRLButton))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 186, Short.MAX_VALUE)
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 163, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(addNSRLButton)
.addComponent(removeNSRLButton))
.addComponent(removeNotableButton)
.addComponent(addNotableButton))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(ingestRunningLabel)
.addContainerGap())
);
}// </editor-fold>//GEN-END:initComponents
private void addNSRLButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addNSRLButtonActionPerformed
save();
int retval = fc.showOpenDialog(this);
if(retval == JFileChooser.APPROVE_OPTION) {
File f = fc.getSelectedFile();
try {
String filePath = f.getCanonicalPath();
if (HashDb.isIndexPath(filePath)) {
filePath = HashDb.toDatabasePath(filePath);
}
String derivedName;
try {
derivedName = SleuthkitJNI.getDatabaseName(filePath);
} catch (TskException ex) {
derivedName = "";
}
String setName = (String) JOptionPane.showInputDialog(this, "New Hash Set name:", "New Hash Set",
JOptionPane.PLAIN_MESSAGE, null, null, derivedName);
nsrlTableModel.newSet(setName, Arrays.asList(new String[] {filePath}), true, HashDb.DBType.NSRL); // TODO: support multiple file paths
} catch (IOException ex) {
logger.log(Level.WARNING, "Couldn't get selected file path.", ex);
}
}
}//GEN-LAST:event_addNSRLButtonActionPerformed
private void addNotableButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addNotableButtonActionPerformed
save();
@ -316,40 +297,110 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
String setName = (String) JOptionPane.showInputDialog(this, "New Hash Set name:", "New Hash Set",
JOptionPane.PLAIN_MESSAGE, null, null, derivedName);
if(setName != null && !setName.equals(""))
notableTableModel.newSet(setName, Arrays.asList(new String[] {filePath}), true, HashDb.DBType.NOTABLE); // TODO: support multiple file paths
if(setName != null && !setName.equals("")) {
HashDb newDb = new HashDb(setName, Arrays.asList(new String[] {filePath}), false);
if(IndexStatus.isIngestible(newDb.status()))
newDb.setUseForIngest(true);
notableTableModel.newSet(newDb); // TODO: support multiple file paths
}
} catch (IOException ex) {
logger.log(Level.WARNING, "Couldn't get selected file path.", ex);
}
}
save();
}//GEN-LAST:event_addNotableButtonActionPerformed
private void removeNotableButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeNotableButtonActionPerformed
notableTableModel.removeSetAt(notableHashSetTable.getSelectedRow());
int selected = notableHashSetTable.getSelectedRow();
if(selected >= 0)
notableTableModel.removeSetAt(notableHashSetTable.getSelectedRow());
}//GEN-LAST:event_removeNotableButtonActionPerformed
private void setNSRLButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_setNSRLButtonActionPerformed
save();
int retval = fc.showOpenDialog(this);
if(retval == JFileChooser.APPROVE_OPTION) {
File f = fc.getSelectedFile();
try {
String filePath = f.getCanonicalPath();
if (HashDb.isIndexPath(filePath)) {
filePath = HashDb.toDatabasePath(filePath);
}
String derivedName;
try {
derivedName = SleuthkitJNI.getDatabaseName(filePath);
} catch (TskException ex) {
derivedName = "";
}
this.nsrlSet = new HashDb(derivedName, Arrays.asList(new String[]{filePath}), false); // TODO: support multiple file paths
int toIndex = JOptionPane.NO_OPTION;
if(IndexStatus.isIngestible(this.nsrlSet.status())) {
this.nsrlSet.setUseForIngest(true);
} else {
toIndex = JOptionPane.showConfirmDialog(this,
"The NSRL database you added has no index.\n" +
"It will not be used for ingest until you create one.\n" +
"Would you like to do so now?", "No Index Exists", JOptionPane.YES_NO_OPTION);
}
nsrlNameLabel.setText(nsrlSet.getName());
setButtonFromIndexStatus(indexNSRLButton, nsrlSet.status());
removeNSRLButton.setEnabled(true);
save();
if(toIndex == JOptionPane.YES_OPTION) {
indexNSRLButtonActionPerformed(null);
}
} catch (IOException ex) {
logger.log(Level.WARNING, "Couldn't get selected file path.", ex);
}
}
}//GEN-LAST:event_setNSRLButtonActionPerformed
private void indexNSRLButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_indexNSRLButtonActionPerformed
try {
nsrlSet.createIndex();
} catch (TskException ex) {
logger.log(Level.WARNING, "Error creating index", ex);
}
setButtonFromIndexStatus(indexNSRLButton, nsrlSet.status());
}//GEN-LAST:event_indexNSRLButtonActionPerformed
private void removeNSRLButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeNSRLButtonActionPerformed
nsrlTableModel.removeSetAt(nsrlHashSetTable.getSelectedRow());
this.nsrlSet = null;
save();
setButtonFromIndexStatus(indexNSRLButton, IndexStatus.NO_DB);
nsrlNameLabel.setText(org.openide.util.NbBundle.getMessage(HashDbMgmtPanel.class, "HashDbMgmtPanel.nsrlNameLabel.text"));
removeNSRLButton.setEnabled(false);
}//GEN-LAST:event_removeNSRLButtonActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addNSRLButton;
private javax.swing.JButton addNotableButton;
private javax.swing.JButton indexNSRLButton;
private javax.swing.JLabel ingestRunningLabel;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTable notableHashSetTable;
private javax.swing.JTable nsrlHashSetTable;
private javax.swing.JLabel nsrlNameLabel;
private javax.swing.JButton removeNSRLButton;
private javax.swing.JButton removeNotableButton;
private javax.swing.JButton setNSRLButton;
// End of variables declaration//GEN-END:variables
private class HashSetTableModel extends AbstractTableModel {
//data
private HashDbXML xmlHandle = HashDbXML.getCurrent();
private List<HashDb> data = new ArrayList<HashDb>();
@Override
public int getColumnCount() {
@ -358,7 +409,7 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
@Override
public int getRowCount() {
return data.size();
return xmlHandle.getKnownBadSets().size();
}
@Override
@ -377,7 +428,7 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
HashDb entry = data.get(rowIndex);
HashDb entry = xmlHandle.getKnownBadSets().get(rowIndex);
switch(columnIndex) {
case 0:
return entry.getName();
@ -392,12 +443,18 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == 2 || columnIndex == 3; //(status or ingest)
if(ingestRunning)
return false;
if(columnIndex == 2)
return true;
if(columnIndex == 3)
return true;
return false;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
HashDb entry = data.get(rowIndex);
HashDb entry = xmlHandle.getKnownBadSets().get(rowIndex);
switch(columnIndex) {
case 0:
entry.setName((String) aValue);
@ -408,7 +465,10 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
case 2:
break;
case 3:
entry.setUseForIngest((Boolean) aValue);
if(((Boolean) getValueAt(rowIndex, columnIndex)) || IndexStatus.isIngestible(entry.status()))
entry.setUseForIngest((Boolean) aValue);
else
JOptionPane.showMessageDialog(HashDbMgmtPanel.this, "Databases must be indexed before they can be used for ingest.");
}
}
@ -417,37 +477,22 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
return getValueAt(0, c).getClass();
}
void resync(DBType type) {
data.clear();
data.addAll(xmlHandle.getSets(type));
void resync() {
fireTableDataChanged();
}
void newSet(String name, List<String> paths, boolean useForIngest, DBType type) {
xmlHandle.addSet(new HashDb(name, type, paths, useForIngest));
resync(type);
void newSet(HashDb db) {
xmlHandle.addKnownBadSet(db);
resync();
}
void removeSetAt(int index) {
HashDb db = data.get(index);
xmlHandle.removeSet(db);
resync(db.getType());
}
void saveAll() {
xmlHandle.putAll(data);
}
boolean indexesExist() {
boolean ret = true;
for(HashDb db : xmlHandle.getSets()) {
ret = ret && db.databaseExists();
}
return ret;
xmlHandle.removeKnownBadSetAt(index);
resync();
}
HashDb getHashSetAt(int row) {
return data.get(row);
return xmlHandle.getKnownBadSets().get(row);
}
}
@ -461,6 +506,7 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
this.setHorizontalAlignment(JCheckBox.CENTER);
this.setVerticalAlignment(JCheckBox.CENTER);
setEnabled(!ingestRunning);
Boolean selected = (Boolean) table.getModel().getValueAt(row, column);
setSelected(selected);
@ -473,27 +519,13 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
}
}
private class ButtonRenderer extends AbstractCellEditor implements TableCellRenderer, TableCellEditor {
private JButton theButton;
private ButtonRenderer() {
theButton = new JButton();
static void setButtonFromIndexStatus(JButton theButton, IndexStatus status) {
if(ingestRunning) {
theButton.setText("Not Available");
theButton.setEnabled(false);
return;
}
JButton getTheButton() {
return theButton;
}
void updateData(
JTable table, boolean isSelected, int row, int column) {
theButton.setHorizontalAlignment(JButton.CENTER);
theButton.setVerticalAlignment(JButton.CENTER);
IndexStatus selected = (IndexStatus) table.getModel().getValueAt(row, column);
switch (selected) {
switch (status) {
case INDEX_OUTDATED:
theButton.setText("Re-index");
theButton.setEnabled(true);
@ -506,38 +538,14 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
theButton.setText("Index");
theButton.setEnabled(true);
break;
case INDEXING:
theButton.setText("Indexing");
theButton.setEnabled(false);
break;
default:
theButton.setText("No DB");
theButton.setEnabled(false);
}
if (isSelected) {
theButton.setBackground(notableHashSetTable.getSelectionBackground());
} else {
theButton.setBackground(notableHashSetTable.getBackground());
}
}
@Override
public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
updateData(table, isSelected, row, column);
return theButton;
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
updateData(table, isSelected, row, column);
return theButton;
}
@Override
public Object getCellEditorValue() {
return null;
}
}
}

View File

@ -16,18 +16,23 @@
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="jLabel2" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="154" max="32767" attributes="0"/>
</Group>
<Component id="jScrollPane2" alignment="0" pref="274" max="32767" attributes="1"/>
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="142" max="32767" attributes="0"/>
</Group>
<Component id="jScrollPane1" alignment="1" pref="274" max="32767" attributes="1"/>
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="10" pref="10" max="10" attributes="0"/>
<Component id="nsrlNameLabel" min="-2" max="-2" attributes="0"/>
</Group>
<Component id="jLabel2" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace pref="143" max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
@ -35,17 +40,24 @@
<Group type="102" alignment="0" attributes="0">
<Component id="jLabel2" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="jScrollPane2" min="-2" pref="35" max="-2" attributes="0"/>
<Component id="nsrlNameLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="jScrollPane1" pref="91" max="32767" attributes="0"/>
<Component id="jScrollPane1" pref="106" max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Container class="javax.swing.JScrollPane" name="jScrollPane1">
<Properties>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
<EmptyBorder/>
</Border>
</Property>
</Properties>
<AuxValues>
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
</AuxValues>
@ -53,17 +65,13 @@
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>
<Component class="javax.swing.JTable" name="notableHashTable">
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JScrollPane" name="jScrollPane2">
<AuxValues>
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>
<Component class="javax.swing.JTable" name="nsrlHashTable">
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="f0" green="f0" red="f0" type="rgb"/>
</Property>
<Property name="showHorizontalLines" type="boolean" value="false"/>
<Property name="showVerticalLines" type="boolean" value="false"/>
</Properties>
</Component>
</SubComponents>
</Container>
@ -81,5 +89,12 @@
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="nsrlNameLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/hashdatabase/Bundle.properties" key="HashDbSimplePanel.nsrlNameLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
</SubComponents>
</Form>

View File

@ -27,10 +27,8 @@ package org.sleuthkit.autopsy.hashdatabase;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import javax.swing.ListSelectionModel;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import org.sleuthkit.autopsy.hashdatabase.HashDb.DBType;
/**
*
@ -39,22 +37,21 @@ import org.sleuthkit.autopsy.hashdatabase.HashDb.DBType;
public class HashDbSimplePanel extends javax.swing.JPanel {
private static final Logger logger = Logger.getLogger(HashDbSimplePanel.class.getName());
private HashTableModel notableTableModel;
private HashTableModel nsrlTableModel;
private HashTableModel knownBadTableModel;
private HashDb nsrl;
/** Creates new form HashDbSimplePanel */
public HashDbSimplePanel() {
notableTableModel = new HashTableModel();
nsrlTableModel = new HashTableModel();
knownBadTableModel = new HashTableModel();
initComponents();
customizeComponents();
}
private void customizeComponents() {
notableHashTable.setModel(notableTableModel);
notableHashTable.setModel(knownBadTableModel);
notableHashTable.setTableHeader(null);
notableHashTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
notableHashTable.setRowSelectionAllowed(false);
//customize column witdhs
final int width1 = jScrollPane1.getPreferredSize().width;
TableColumn column1 = null;
@ -67,22 +64,7 @@ public class HashDbSimplePanel extends javax.swing.JPanel {
}
}
nsrlHashTable.setModel(nsrlTableModel);
nsrlHashTable.setTableHeader(null);
nsrlHashTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//customize column witdhs
final int width2 = jScrollPane1.getPreferredSize().width;
TableColumn column2 = null;
for (int i = 0; i < nsrlHashTable.getColumnCount(); i++) {
column2 = nsrlHashTable.getColumnModel().getColumn(i);
if (i == 0) {
column2.setPreferredWidth(((int) (width2 * 0.15)));
} else {
column2.setPreferredWidth(((int) (width2 * 0.84)));
}
}
reloadLists();
reloadSets();
}
/** This method is called from within the constructor to
@ -96,67 +78,79 @@ public class HashDbSimplePanel extends javax.swing.JPanel {
jScrollPane1 = new javax.swing.JScrollPane();
notableHashTable = new javax.swing.JTable();
jScrollPane2 = new javax.swing.JScrollPane();
nsrlHashTable = new javax.swing.JTable();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
nsrlNameLabel = new javax.swing.JLabel();
jScrollPane1.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
notableHashTable.setBackground(new java.awt.Color(240, 240, 240));
notableHashTable.setShowHorizontalLines(false);
notableHashTable.setShowVerticalLines(false);
jScrollPane1.setViewportView(notableHashTable);
jScrollPane2.setViewportView(nsrlHashTable);
jLabel1.setText(org.openide.util.NbBundle.getMessage(HashDbSimplePanel.class, "HashDbSimplePanel.jLabel1.text")); // NOI18N
jLabel2.setText(org.openide.util.NbBundle.getMessage(HashDbSimplePanel.class, "HashDbSimplePanel.jLabel2.text")); // NOI18N
nsrlNameLabel.setText(org.openide.util.NbBundle.getMessage(HashDbSimplePanel.class, "HashDbSimplePanel.nsrlNameLabel.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()
.addComponent(jLabel2)
.addContainerGap(154, Short.MAX_VALUE))
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 274, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)
.addContainerGap(142, Short.MAX_VALUE))
.addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 274, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(10, 10, 10)
.addComponent(nsrlNameLabel))
.addComponent(jLabel2))
.addContainerGap(143, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(nsrlNameLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 91, Short.MAX_VALUE))
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 106, Short.MAX_VALUE))
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTable notableHashTable;
private javax.swing.JTable nsrlHashTable;
private javax.swing.JLabel nsrlNameLabel;
// End of variables declaration//GEN-END:variables
private void reloadLists() {
nsrlTableModel.resync(DBType.NSRL);
notableTableModel.resync(DBType.NOTABLE);
private void reloadSets() {
nsrl = HashDbXML.getCurrent().getNSRLSet();
if(nsrl == null) {
nsrlNameLabel.setText("No NSRL database set.");
} else {
nsrlNameLabel.setText(nsrl.getName());
}
knownBadTableModel.resync();
}
private class HashTableModel extends AbstractTableModel {
private List<HashDb> data = new ArrayList<HashDb>();
private void resync(DBType type) {
private void resync() {
data.clear();
data.addAll(HashDbXML.getCurrent().getSets(type));
data.addAll(HashDbXML.getCurrent().getKnownBadSets());
}
@Override
@ -188,8 +182,8 @@ public class HashDbSimplePanel extends javax.swing.JPanel {
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if(columnIndex == 0){
HashDb db = data.get(rowIndex);
HashDbXML.getCurrent().addSet(new HashDb(db.getName(), db.getType(), db.getDatabasePaths(), (Boolean) aValue));
reloadLists();
HashDbXML.getCurrent().addKnownBadSet(new HashDb(db.getName(), db.getDatabasePaths(), (Boolean) aValue));
reloadSets();
}
}

View File

@ -26,6 +26,7 @@ import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@ -67,11 +68,12 @@ public class HashDbXML {
private static final Logger logger = Logger.getLogger(HashDbXML.class.getName());
private static HashDbXML currentInstance;
private Map<String, HashDb> theSets;
private List<HashDb> knownBadSets;
private HashDb nsrlSet;
private String xmlFile;
private HashDbXML(String xmlFile) {
theSets = new LinkedHashMap<String, HashDb>();
knownBadSets = new ArrayList<HashDb>();
this.xmlFile = xmlFile;
}
@ -89,47 +91,56 @@ public class HashDbXML {
/**
* Get the hash sets
*/
public List<HashDb> getSets() {
public List<HashDb> getAllSets() {
List<HashDb> ret = new ArrayList<HashDb>();
ret.addAll(theSets.values());
ret.addAll(knownBadSets);
ret.add(nsrlSet);
return ret;
}
/**
* Get the NSRL sets
* Get the Known Bad sets
*/
public List<HashDb> getSets(DBType type) {
List<HashDb> ret = new ArrayList<HashDb>();
for(HashDb db : theSets.values()) {
if(db.getType().equals(type))
ret.add(db);
}
return ret;
public List<HashDb> getKnownBadSets() {
return knownBadSets;
}
/**
* Add a hash set (override old set)
* Get the NSRL set
*/
public void addSet(HashDb set) {
theSets.put(set.getName(), set);
public HashDb getNSRLSet() {
return nsrlSet;
}
/**
* Add a known bad hash set
*/
public void addKnownBadSet(HashDb set) {
knownBadSets.add(set);
save();
}
/**
* Remove a hash set
* Set the NSRL hash set (override old set)
*/
public void removeSet(HashDb set) {
theSets.remove(set.getName());
public void setNSRLSet(HashDb set) {
this.nsrlSet = set;
save();
}
/**
* Put all the given DBs into this XML (overwrite old ones)
* Remove a hash known bad set
*/
public void putAll(List<HashDb> sets) {
for(HashDb set : sets) {
theSets.put(set.getName(), set);
}
public void removeKnownBadSetAt(int index) {
knownBadSets.remove(index);
save();
}
/**
* Remove the NSRL database
*/
public void removeNSRLSet() {
this.nsrlSet = null;
save();
}
@ -139,7 +150,8 @@ public class HashDbXML {
public void reload() {
boolean created = false;
theSets.clear();
knownBadSets.clear();
nsrlSet = null;
if (!this.setsFileExists()) {
//create new if it doesn't exist
@ -169,14 +181,33 @@ public class HashDbXML {
Element rootEl = doc.createElement(ROOT_EL);
doc.appendChild(rootEl);
for (String setName : theSets.keySet()) {
HashDb set = theSets.get(setName);
for (HashDb set : knownBadSets) {
String useForIngest = Boolean.toString(set.getUseForIngest());
List<String> paths = set.getDatabasePaths();
String type = set.getType().toString();
String type = DBType.KNOWN_BAD.toString();
Element setEl = doc.createElement(SET_EL);
setEl.setAttribute(SET_NAME_ATTR, setName);
setEl.setAttribute(SET_NAME_ATTR, set.getName());
setEl.setAttribute(SET_TYPE_ATTR, type);
setEl.setAttribute(SET_USE_FOR_INGEST_ATTR, useForIngest);
for (int i = 0; i < paths.size(); i++) {
String path = paths.get(i);
Element pathEl = doc.createElement(PATH_EL);
pathEl.setAttribute(PATH_NUMBER_ATTR, Integer.toString(i));
pathEl.setTextContent(path);
setEl.appendChild(pathEl);
}
rootEl.appendChild(setEl);
}
if(nsrlSet != null) {
String useForIngest = Boolean.toString(nsrlSet.getUseForIngest());
List<String> paths = nsrlSet.getDatabasePaths();
String type = DBType.NSRL.toString();
Element setEl = doc.createElement(SET_EL);
setEl.setAttribute(SET_NAME_ATTR, nsrlSet.getName());
setEl.setAttribute(SET_TYPE_ATTR, type);
setEl.setAttribute(SET_USE_FOR_INGEST_ATTR, useForIngest);
@ -232,8 +263,13 @@ public class HashDbXML {
paths.add(path);
}
HashDb set = new HashDb(name, typeDBType, paths, useForIngestBool);
theSets.put(name, set);
HashDb set = new HashDb(name, paths, useForIngestBool);
if(typeDBType == DBType.KNOWN_BAD) {
knownBadSets.add(set);
} else if(typeDBType == DBType.NSRL) {
this.nsrlSet = set;
}
}
return true;
}

View File

@ -44,7 +44,11 @@ enum IndexStatus {
/**
* Neither the index nor the database exists.
*/
NONE("No index or database.");
NONE("No index or database."),
/**
* The index is currently being generated
*/
INDEXING("The index is currently being generated");
private String message;
@ -62,4 +66,8 @@ enum IndexStatus {
String message() {
return this.message;
}
public static boolean isIngestible(IndexStatus status) {
return status == NO_DB || status == INDEX_CURRENT || status == INDEX_OUTDATED;
}
}