19 package org.sleuthkit.autopsy.modules.hashdatabase;
21 import java.awt.Color;
22 import java.beans.PropertyChangeListener;
23 import java.beans.PropertyChangeEvent;
24 import java.util.HashSet;
26 import java.util.logging.Level;
27 import javax.swing.JFrame;
28 import javax.swing.SwingWorker;
29 import javax.swing.WindowConstants;
30 import java.util.concurrent.atomic.AtomicLong;
31 import java.util.concurrent.atomic.AtomicBoolean;
32 import java.util.concurrent.atomic.AtomicInteger;
33 import java.util.concurrent.Executors;
34 import org.openide.util.NbBundle;
35 import org.openide.windows.WindowManager;
48 class ImportCentralRepoDbProgressDialog
extends javax.swing.JDialog implements PropertyChangeListener {
50 private CentralRepoImportWorker worker;
52 @NbBundle.Messages({
"ImportCentralRepoDbProgressDialog.title.text=Central Repository Import Progress",})
53 ImportCentralRepoDbProgressDialog() {
54 super((JFrame) WindowManager.getDefault().getMainWindow(),
55 Bundle.ImportCentralRepoDbProgressDialog_title_text(),
59 customizeComponents();
62 private void customizeComponents() {
64 setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
66 bnOk.setEnabled(
false);
82 void importFile(String hashSetName, String version,
int orgId,
83 boolean searchDuringIngest,
boolean sendIngestMessages, HashDbManager.HashDb.KnownFilesType knownFilesType,
84 boolean readOnly, String importFileName) {
86 worker =
new CentralRepoImportWorker(hashSetName, version, orgId, searchDuringIngest, sendIngestMessages,
87 knownFilesType, readOnly, importFileName);
88 worker.addPropertyChangeListener(
this);
91 setLocationRelativeTo((JFrame) WindowManager.getDefault().getMainWindow());
92 this.setVisible(
true);
101 HashDbManager.HashDb getDatabase() {
102 if (worker != null) {
103 return worker.getDatabase();
114 @NbBundle.Messages({
"ImportCentralRepoDbProgressDialog.errorParsingFile.message=Error parsing hash set file"})
116 public void propertyChange(PropertyChangeEvent evt) {
118 if (
"progress".equals(evt.getPropertyName())) {
120 progressBar.setValue(worker.getProgress());
121 lbProgress.setText(getProgressString());
122 }
else if (
"state".equals(evt.getPropertyName())
123 && (SwingWorker.StateValue.DONE.equals(evt.getNewValue()))) {
127 bnCancel.setEnabled(
false);
128 bnOk.setEnabled(
true);
130 if (worker.getImportSuccess()) {
133 progressBar.setValue(progressBar.getMaximum());
134 lbProgress.setText(getProgressString());
137 progressBar.setValue(0);
138 lbProgress.setForeground(Color.red);
139 lbProgress.setText(Bundle.ImportCentralRepoDbProgressDialog_errorParsingFile_message());
144 @NbBundle.Messages({
"ImportCentralRepoDbProgressDialog.linesProcessed.message= hashes processed"})
145 private String getProgressString() {
146 return worker.getNumHashesProcessed() + Bundle.ImportCentralRepoDbProgressDialog_linesProcessed_message();
167 boolean readOnly, String importFileName) {
177 this.hashCount.set(0);
178 this.importSuccess.set(
false);
179 this.referenceSetID.set(-1);
197 long getNumHashesProcessed() {
198 return hashCount.get();
207 boolean getImportSuccess() {
208 return importSuccess.get();
215 HashSetParser hashSetParser;
216 if (importFileName.toLowerCase().endsWith(
".idx") || importFileName.toLowerCase().endsWith(
".txt")) {
217 hashSetParser =
new IdxHashSetParser(importFileName);
218 }
else if (importFileName.toLowerCase().endsWith(
".hash")) {
219 hashSetParser =
new EncaseHashSetParser(importFileName);
220 }
else if (importFileName.toLowerCase().endsWith(
".kdb")) {
222 }
else if (importFileName.toLowerCase().endsWith(
".hsh")) {
226 throw new TskCoreException(
"Hash set to import is an unknown format : " + importFileName);
231 TskData.FileKnown knownStatus;
233 knownStatus = TskData.FileKnown.KNOWN;
235 knownStatus = TskData.FileKnown.BAD;
248 Set<EamGlobalFileInstance> globalInstances =
new HashSet<>();
250 while (!hashSetParser.doneReading()) {
255 String newHash = hashSetParser.getNextHash();
257 if (newHash != null) {
259 referenceSetID.get(),
264 globalInstances.add(eamGlobalFileInstance);
268 if (hashCount.incrementAndGet() % HASH_IMPORT_THRESHOLD == 0) {
270 globalInstances.clear();
272 int progress = (int) (hashCount.get() * 100 / hashSetParser.getExpectedHashCount());
273 if (progress < 100) {
274 this.setProgress(progress);
276 this.setProgress(99);
284 this.setProgress(100);
287 hashSetParser.close();
292 if (referenceSetID.get() >= 0) {
295 Executors.newSingleThreadExecutor().execute(
new Runnable() {
301 Logger.
getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE,
"Error deleting incomplete hash set from central repository", ex2);
309 synchronized protected void done() {
321 referenceSetID.get(),
323 importSuccess.set(
true);
324 }
catch (TskCoreException ex) {
325 Logger.
getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE,
"Error adding imported hash set", ex);
327 }
catch (Exception ex) {
330 Logger.
getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE,
"Error importing hash set", ex);
341 @SuppressWarnings(
"unchecked")
343 private
void initComponents() {
345 progressBar =
new javax.swing.JProgressBar();
346 lbProgress =
new javax.swing.JLabel();
347 bnOk =
new javax.swing.JButton();
348 bnCancel =
new javax.swing.JButton();
349 jLabel1 =
new javax.swing.JLabel();
351 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
353 org.openide.awt.Mnemonics.setLocalizedText(lbProgress,
org.openide.util.NbBundle.getMessage(ImportCentralRepoDbProgressDialog.class,
"ImportCentralRepoDbProgressDialog.lbProgress.text"));
355 org.openide.awt.Mnemonics.setLocalizedText(bnOk,
org.openide.util.NbBundle.getMessage(ImportCentralRepoDbProgressDialog.class,
"ImportCentralRepoDbProgressDialog.bnOk.text"));
356 bnOk.addActionListener(
new java.awt.event.ActionListener() {
357 public void actionPerformed(java.awt.event.ActionEvent evt) {
358 bnOkActionPerformed(evt);
362 org.openide.awt.Mnemonics.setLocalizedText(bnCancel,
org.openide.util.NbBundle.getMessage(ImportCentralRepoDbProgressDialog.class,
"ImportCentralRepoDbProgressDialog.bnCancel.text"));
363 bnCancel.addActionListener(
new java.awt.event.ActionListener() {
364 public void actionPerformed(java.awt.event.ActionEvent evt) {
365 bnCancelActionPerformed(evt);
369 org.openide.awt.Mnemonics.setLocalizedText(jLabel1,
org.openide.util.NbBundle.getMessage(ImportCentralRepoDbProgressDialog.class,
"ImportCentralRepoDbProgressDialog.jLabel1.text"));
371 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(getContentPane());
372 getContentPane().setLayout(layout);
373 layout.setHorizontalGroup(
374 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
375 .addGroup(layout.createSequentialGroup()
377 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
378 .addGroup(layout.createSequentialGroup()
379 .addComponent(progressBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
381 .addGroup(layout.createSequentialGroup()
382 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
383 .addComponent(jLabel1)
384 .addComponent(lbProgress))
385 .addGap(0, 172, Short.MAX_VALUE))))
386 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
387 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
388 .addComponent(bnOk, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
389 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
390 .addComponent(bnCancel)
393 layout.setVerticalGroup(
394 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
395 .addGroup(layout.createSequentialGroup()
397 .addComponent(jLabel1)
398 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
399 .addComponent(lbProgress)
400 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
401 .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)
402 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
403 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
404 .addComponent(bnCancel)
406 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
412 private void bnCancelActionPerformed(java.awt.event.ActionEvent evt) {
413 this.worker.cancel(
true);
417 private void bnOkActionPerformed(java.awt.event.ActionEvent evt) {
423 private javax.swing.JButton bnCancel;
424 private javax.swing.JButton bnOk;
425 private javax.swing.JLabel jLabel1;
426 private javax.swing.JLabel lbProgress;
427 private javax.swing.JProgressBar progressBar;
CorrelationAttribute.Type getCorrelationTypeById(int typeId)
final AtomicLong hashCount
void deleteReferenceSet(int referenceSetID)
int newReferenceSet(EamGlobalSet eamGlobalSet)
HashDbManager.CentralRepoHashSet newHashDb
static final int FILES_TYPE_ID
final int HASH_IMPORT_THRESHOLD
final boolean sendIngestMessages
final HashDbManager.HashDb.KnownFilesType knownFilesType
static EamDb getInstance()
static synchronized HashDbManager getInstance()
void deleteIncompleteSet()
final AtomicInteger referenceSetID
final String importFileName
synchronized static Logger getLogger(String name)
void bulkInsertReferenceTypeEntries(Set< EamGlobalFileInstance > globalInstances, CorrelationAttribute.Type contentType)
final AtomicBoolean importSuccess
final boolean searchDuringIngest