19 package org.sleuthkit.autopsy.centralrepository.optionspanel;
21 import java.awt.Dimension;
22 import java.awt.Toolkit;
23 import java.io.BufferedReader;
25 import java.io.FileReader;
26 import java.io.IOException;
27 import java.net.UnknownHostException;
28 import java.nio.file.Files;
29 import java.time.LocalDate;
30 import java.util.ArrayList;
31 import java.util.Collection;
32 import java.util.HashSet;
33 import java.util.List;
35 import java.util.concurrent.ExecutionException;
36 import java.util.logging.Level;
37 import javax.swing.JComboBox;
38 import javax.swing.JFileChooser;
39 import javax.swing.JFrame;
40 import javax.swing.JOptionPane;
41 import javax.swing.JTextField;
42 import javax.swing.SwingUtilities;
43 import javax.swing.SwingWorker;
44 import javax.swing.event.DocumentEvent;
45 import javax.swing.event.DocumentListener;
46 import javax.swing.filechooser.FileNameExtensionFilter;
47 import org.netbeans.api.progress.ProgressHandle;
48 import org.netbeans.spi.options.OptionsPanelController;
49 import org.openide.util.Exceptions;
50 import org.openide.util.NbBundle;
51 import org.openide.util.NbBundle.Messages;
52 import org.openide.windows.WindowManager;
70 final class ImportHashDatabaseDialog
extends javax.swing.JDialog {
71 private static final Logger LOGGER = Logger.getLogger(ImportHashDatabaseDialog.class.getName());
73 private final JFileChooser fileChooser =
new JFileChooser();
74 private final static String LAST_FILE_PATH_KEY =
"CentralRepositoryImport_Path";
75 private final int HASH_IMPORT_THRESHOLD = 10000;
76 private EamOrganization selectedOrg = null;
77 private List<EamOrganization> orgs = null;
78 private final Collection<JTextField> textBoxes;
79 private final TextBoxChangedListener textBoxChangedListener;
87 @Messages({
"ImportHashDatabaseDialog.importHashDbMsg=Import Hash Database"})
88 ImportHashDatabaseDialog() {
89 super((JFrame) WindowManager.getDefault().getMainWindow(),
90 Bundle.ImportHashDatabaseDialog_importHashDbMsg(),
92 textBoxes =
new ArrayList<>();
93 textBoxChangedListener =
new TextBoxChangedListener();
96 customizeComponents();
100 @Messages({
"ImportHashDatabaseDialog.fileNameExtFilter.text=Hash Database File",})
101 private void initFileChooser() {
102 fileChooser.setDragEnabled(
false);
103 fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
104 String[] EXTENSION =
new String[]{
"idx"};
105 FileNameExtensionFilter filter =
new FileNameExtensionFilter(
106 Bundle.ImportHashDatabaseDialog_fileNameExtFilter_text(),
108 fileChooser.setFileFilter(filter);
109 fileChooser.setMultiSelectionEnabled(
false);
111 if (ModuleSettings.settingExists(ModuleSettings.MAIN_SETTINGS, LAST_FILE_PATH_KEY)) {
112 String lastBaseDirectory = ModuleSettings.getConfigSetting(ModuleSettings.MAIN_SETTINGS, LAST_FILE_PATH_KEY);
113 File hashDbFolder =
new File(lastBaseDirectory);
114 if(hashDbFolder.exists()){
115 fileChooser.setCurrentDirectory(hashDbFolder);
120 private void customizeComponents() {
122 setTextBoxListeners();
123 enableOkButton(
false);
129 private void setTextBoxListeners() {
130 textBoxes.add(tfFilePath);
131 textBoxes.add(tfDatabaseName);
132 textBoxes.add(tfDatabaseVersion);
133 addDocumentListeners(textBoxes, textBoxChangedListener);
136 private void populateCombobox() {
137 comboboxSourceOrganization.removeAllItems();
139 EamDb dbManager = EamDb.getInstance();
140 orgs = dbManager.getOrganizations();
141 orgs.forEach((
org) -> {
142 comboboxSourceOrganization.addItem(
org.getName());
144 if (!orgs.isEmpty()) {
145 selectedOrg = orgs.get(0);
148 }
catch (EamDbException ex) {
149 LOGGER.log(Level.SEVERE,
"Failure populating combobox with organizations.", ex);
159 private static void addDocumentListeners(Collection<JTextField> textFields, TextBoxChangedListener listener) {
160 textFields.forEach((textField) -> {
161 textField.getDocument().addDocumentListener(listener);
171 private boolean textFieldsArePopulated() {
172 return !tfDatabaseName.getText().trim().isEmpty()
173 && !tfDatabaseVersion.getText().trim().isEmpty()
174 && !tfFilePath.getText().trim().isEmpty();
182 @Messages({
"ImportHashDatabaseDialog.validation.incompleteFields=Fill in all values"})
183 private boolean checkFields() {
184 boolean result =
true;
186 boolean allPopulated = textFieldsArePopulated();
191 lbWarningMsg.setText(Bundle.ImportHashDatabaseDialog_validation_incompleteFields());
201 @Messages({
"ImportHashDatabaseDialog.validation.notEnabled=Central Repository is not enabled."})
202 public boolean valid() {
203 lbWarningMsg.setText(
"");
204 if (!EamDb.isEnabled()) {
205 lbWarningMsg.setText(Bundle.ImportHashDatabaseDialog_validation_notEnabled());
209 return enableOkButton(checkFields() && null != selectedOrg);
219 private boolean enableOkButton(Boolean enable) {
220 okButton.setEnabled(enable);
232 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
238 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
244 firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
249 private void display() {
250 Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
251 setLocation((screenDimension.width - getSize().width) / 2, (screenDimension.height - getSize().height) / 2);
260 @SuppressWarnings(
"unchecked")
262 private
void initComponents() {
264 buttonGroup1 =
new javax.swing.ButtonGroup();
265 okButton =
new javax.swing.JButton();
266 cancelButton =
new javax.swing.JButton();
267 tfFilePath =
new javax.swing.JTextField();
268 openButton =
new javax.swing.JButton();
269 knownRadioButton =
new javax.swing.JRadioButton();
270 knownBadRadioButton =
new javax.swing.JRadioButton();
271 lbDatabaseType =
new javax.swing.JLabel();
272 lbDatabasePath =
new javax.swing.JLabel();
273 lbDatabaseAttribution =
new javax.swing.JLabel();
274 lbSourceOrganization =
new javax.swing.JLabel();
275 lbDatabaseName =
new javax.swing.JLabel();
276 lbDatabaseVersion =
new javax.swing.JLabel();
277 comboboxSourceOrganization =
new javax.swing.JComboBox<>();
278 tfDatabaseName =
new javax.swing.JTextField();
279 tfDatabaseVersion =
new javax.swing.JTextField();
280 bnNewOrganization =
new javax.swing.JButton();
281 lbWarningMsg =
new javax.swing.JLabel();
282 lbInstructions =
new javax.swing.JLabel();
284 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
286 org.openide.awt.Mnemonics.setLocalizedText(okButton,
org.openide.util.NbBundle.getMessage(ImportHashDatabaseDialog.class,
"ImportHashDatabaseDialog.okButton.text"));
287 okButton.addActionListener(
new java.awt.event.ActionListener() {
288 public void actionPerformed(java.awt.event.ActionEvent evt) {
289 okButtonActionPerformed(evt);
293 org.openide.awt.Mnemonics.setLocalizedText(cancelButton,
org.openide.util.NbBundle.getMessage(ImportHashDatabaseDialog.class,
"ImportHashDatabaseDialog.cancelButton.text"));
294 cancelButton.addActionListener(
new java.awt.event.ActionListener() {
295 public void actionPerformed(java.awt.event.ActionEvent evt) {
296 cancelButtonActionPerformed(evt);
300 tfFilePath.setText(
org.openide.util.NbBundle.getMessage(ImportHashDatabaseDialog.class,
"ImportHashDatabaseDialog.tfFilePath.text"));
302 org.openide.awt.Mnemonics.setLocalizedText(openButton,
org.openide.util.NbBundle.getMessage(ImportHashDatabaseDialog.class,
"ImportHashDatabaseDialog.openButton.text"));
303 openButton.addActionListener(
new java.awt.event.ActionListener() {
304 public void actionPerformed(java.awt.event.ActionEvent evt) {
305 openButtonActionPerformed(evt);
309 buttonGroup1.add(knownRadioButton);
310 org.openide.awt.Mnemonics.setLocalizedText(knownRadioButton,
org.openide.util.NbBundle.getMessage(ImportHashDatabaseDialog.class,
"ImportHashDatabaseDialog.knownRadioButton.text"));
312 buttonGroup1.add(knownBadRadioButton);
313 knownBadRadioButton.setSelected(
true);
314 org.openide.awt.Mnemonics.setLocalizedText(knownBadRadioButton,
org.openide.util.NbBundle.getMessage(ImportHashDatabaseDialog.class,
"ImportHashDatabaseDialog.knownBadRadioButton.text"));
316 org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseType,
org.openide.util.NbBundle.getMessage(ImportHashDatabaseDialog.class,
"ImportHashDatabaseDialog.lbDatabaseType.text"));
318 org.openide.awt.Mnemonics.setLocalizedText(lbDatabasePath,
org.openide.util.NbBundle.getMessage(ImportHashDatabaseDialog.class,
"ImportHashDatabaseDialog.lbFilePath.text"));
320 org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseAttribution,
org.openide.util.NbBundle.getMessage(ImportHashDatabaseDialog.class,
"ImportHashDatabaseDialog.lbDatabaseAttribution.text"));
322 org.openide.awt.Mnemonics.setLocalizedText(lbSourceOrganization,
org.openide.util.NbBundle.getMessage(ImportHashDatabaseDialog.class,
"ImportHashDatabaseDialog.lbSourceOrganization.text"));
324 org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseName,
org.openide.util.NbBundle.getMessage(ImportHashDatabaseDialog.class,
"ImportHashDatabaseDialog.lbDatabaseName.text"));
326 org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseVersion,
org.openide.util.NbBundle.getMessage(ImportHashDatabaseDialog.class,
"ImportHashDatabaseDialog.lbDatabaseVersion.text"));
328 comboboxSourceOrganization.setModel(
new javax.swing.DefaultComboBoxModel<>(
new String[] {
"Item 1",
"Item 2",
"Item 3",
"Item 4" }));
329 comboboxSourceOrganization.addActionListener(
new java.awt.event.ActionListener() {
330 public void actionPerformed(java.awt.event.ActionEvent evt) {
331 comboboxSourceOrganizationActionPerformed(evt);
335 tfDatabaseName.setToolTipText(
org.openide.util.NbBundle.getMessage(ImportHashDatabaseDialog.class,
"ImportHashDatabaseDialog.tfDatabaseName.tooltip"));
337 tfDatabaseVersion.setToolTipText(
org.openide.util.NbBundle.getMessage(ImportHashDatabaseDialog.class,
"ImportHashDatabaseDialog.tfDatabaseVersion.tooltip.text"));
339 org.openide.awt.Mnemonics.setLocalizedText(bnNewOrganization,
org.openide.util.NbBundle.getMessage(ImportHashDatabaseDialog.class,
"ImportHashDatabaseDialog.bnNewOrganization.text"));
340 bnNewOrganization.addActionListener(
new java.awt.event.ActionListener() {
341 public void actionPerformed(java.awt.event.ActionEvent evt) {
342 bnNewOrganizationActionPerformed(evt);
346 lbWarningMsg.setFont(
new java.awt.Font(
"Tahoma", 1, 12));
347 lbWarningMsg.setForeground(
new java.awt.Color(255, 0, 0));
349 lbInstructions.setFont(
new java.awt.Font(
"Tahoma", 0, 12));
350 org.openide.awt.Mnemonics.setLocalizedText(lbInstructions,
org.openide.util.NbBundle.getMessage(ImportHashDatabaseDialog.class,
"ImportHashDatabaseDialog.lbInstructions.text"));
352 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(getContentPane());
353 getContentPane().setLayout(layout);
354 layout.setHorizontalGroup(
355 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
356 .addGroup(layout.createSequentialGroup()
358 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
359 .addComponent(lbInstructions, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
360 .addGroup(layout.createSequentialGroup()
361 .addGap(0, 0, Short.MAX_VALUE)
362 .addComponent(okButton)
363 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
364 .addComponent(cancelButton))
365 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
366 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
367 .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
368 .addComponent(lbDatabasePath)
369 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
370 .addComponent(tfFilePath))
371 .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
373 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
374 .addGroup(layout.createSequentialGroup()
375 .addComponent(lbDatabaseVersion)
376 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
377 .addComponent(tfDatabaseVersion, javax.swing.GroupLayout.PREFERRED_SIZE, 154, javax.swing.GroupLayout.PREFERRED_SIZE)
378 .addGap(0, 0, Short.MAX_VALUE))
379 .addGroup(layout.createSequentialGroup()
380 .addComponent(lbSourceOrganization)
381 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
382 .addComponent(bnNewOrganization))
383 .addGroup(layout.createSequentialGroup()
384 .addComponent(lbDatabaseName)
386 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
387 .addComponent(comboboxSourceOrganization, javax.swing.GroupLayout.Alignment.TRAILING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
388 .addComponent(tfDatabaseName))))))
389 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
390 .addComponent(openButton))
391 .addGroup(layout.createSequentialGroup()
392 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
393 .addComponent(lbDatabaseType)
394 .addGroup(layout.createSequentialGroup()
396 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
397 .addComponent(knownRadioButton)
398 .addComponent(knownBadRadioButton)))
399 .addComponent(lbDatabaseAttribution))
400 .addGap(0, 0, Short.MAX_VALUE))
401 .addComponent(lbWarningMsg, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
405 layout.linkSize(javax.swing.SwingConstants.HORIZONTAL,
new java.awt.Component[] {cancelButton, okButton});
407 layout.setVerticalGroup(
408 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
409 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
411 .addComponent(lbInstructions, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)
412 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
413 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
414 .addComponent(openButton)
415 .addComponent(tfFilePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
416 .addComponent(lbDatabasePath))
417 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
418 .addGroup(layout.createSequentialGroup()
419 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
420 .addComponent(lbDatabaseType)
421 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
422 .addComponent(knownRadioButton)
423 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
424 .addComponent(knownBadRadioButton)
425 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
426 .addComponent(lbDatabaseAttribution)
427 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING,
false)
428 .addComponent(bnNewOrganization)
429 .addGroup(layout.createSequentialGroup()
431 .addComponent(lbSourceOrganization, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)))
432 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
433 .addComponent(comboboxSourceOrganization, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
435 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING,
false)
436 .addComponent(tfDatabaseName)
437 .addComponent(lbDatabaseName, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
438 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
439 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
440 .addComponent(lbDatabaseVersion, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
441 .addComponent(tfDatabaseVersion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
442 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
443 .addComponent(lbWarningMsg, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
444 .addContainerGap(44, Short.MAX_VALUE))
445 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
446 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
447 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
448 .addComponent(okButton)
449 .addComponent(cancelButton))
450 .addContainerGap())))
456 @Messages({
"ImportHashDatabaseDialog.failedToGetDbPathMsg=Failed to get the path of the selected database.",})
457 private void openButtonActionPerformed(java.awt.event.ActionEvent evt) {
458 if (fileChooser.showOpenDialog(
this) == JFileChooser.APPROVE_OPTION) {
459 File databaseFile = fileChooser.getSelectedFile();
461 tfFilePath.setText(databaseFile.getCanonicalPath());
462 if (databaseFile.getName().toLowerCase().contains(
"nsrl")) {
463 knownRadioButton.setSelected(
true);
465 ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, LAST_FILE_PATH_KEY, databaseFile.getParent());
466 }
catch (IOException ex) {
467 Logger.getLogger(ImportHashDatabaseDialog.class.getName()).log(Level.SEVERE,
"Failed to get path of selected database", ex);
468 lbWarningMsg.setText(Bundle.ImportHashDatabaseDialog_failedToGetDbPathMsg());
474 private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {
484 private int createGlobalSet() throws EamDbException {
485 EamDb dbManager = EamDb.getInstance();
486 EamGlobalSet eamGlobalSet =
new EamGlobalSet(
487 selectedOrg.getOrgID(),
488 tfDatabaseName.getText().trim(),
489 tfDatabaseVersion.getText().trim(),
491 return dbManager.newReferencelSet(eamGlobalSet);
494 @Messages({
"ImportHashDatabaseDialog.createGlobalSet.failedMsg.text=Failed to store attribution details.",
495 "ImportHashDatabaseDialog.mustSelectHashDbFilePathMsg=Missing hash database file path.",
496 "ImportHashDatabaseDialog.hashDbDoesNotExistMsg=The selected hash database does not exist.",
497 "# {0} - selected file path",
498 "ImportHashDatabaseDialog.errorMessage.failedToOpenHashDbMsg=Failed to open hash database at {0}.",
500 private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {
503 String selectedFilePath = tfFilePath.getText();
506 if (selectedFilePath.isEmpty()) {
507 lbWarningMsg.setText(Bundle.ImportHashDatabaseDialog_mustSelectHashDbFilePathMsg());
510 File file =
new File(selectedFilePath);
511 if (!file.exists()) {
512 lbWarningMsg.setText(Bundle.ImportHashDatabaseDialog_hashDbDoesNotExistMsg());
519 globalSetID = createGlobalSet();
520 }
catch (EamDbException ex) {
521 LOGGER.log(Level.SEVERE,
"Failed to create global set.", ex);
522 lbWarningMsg.setText(Bundle.ImportHashDatabaseDialog_createGlobalSet_failedMsg_text());
527 TskData.FileKnown knownStatus = TskData.FileKnown.UNKNOWN;
528 if (knownRadioButton.isSelected()) {
529 knownStatus = TskData.FileKnown.KNOWN;
530 }
else if (knownBadRadioButton.isSelected()) {
531 knownStatus = TskData.FileKnown.BAD;
534 String errorMessage = Bundle.ImportHashDatabaseDialog_errorMessage_failedToOpenHashDbMsg(selectedFilePath);
537 EamDb dbManager = EamDb.getInstance();
538 CorrelationAttribute.Type contentType = dbManager.getCorrelationTypeById(CorrelationAttribute.FILES_TYPE_ID);
540 SwingUtilities.invokeLater(
new ImportHashDatabaseWorker(selectedFilePath, knownStatus, globalSetID, contentType)::execute);
542 }
catch (EamDbException | UnknownHostException ex) {
543 Logger.getLogger(ImportHashDatabaseDialog.class.getName()).log(Level.SEVERE, errorMessage, ex);
544 lbWarningMsg.setText(ex.getMessage());
549 @SuppressWarnings({
"unchecked"})
550 private void bnNewOrganizationActionPerformed(java.awt.event.ActionEvent evt) {
551 AddNewOrganizationDialog dialogO =
new AddNewOrganizationDialog();
553 if (dialogO.isChanged()) {
558 @SuppressWarnings({
"unchecked"})
559 private void comboboxSourceOrganizationActionPerformed(java.awt.event.ActionEvent evt) {
560 JComboBox<String> cb = (JComboBox<String>)evt.getSource();
561 String orgName = (String)cb.getSelectedItem();
562 if (null == orgName)
return;
564 for (EamOrganization
org : orgs) {
565 if (
org.getName().equals(orgName)) {
573 @NbBundle.Messages({
"ImportHashDatabaseDialog.ImportHashDatabaseWorker.displayName=Importing Hash Database"})
583 this.file =
new File(filename);
584 this.knownStatus = knownStatus;
585 this.globalSetID = globalSetID;
586 this.contentType = contentType;
587 this.progress = ProgressHandle.createHandle(Bundle.ImportHashDatabaseDialog_ImportHashDatabaseWorker_displayName());
590 throw new EamDbException(
"Central repository database is not enabled.");
596 importHashDatabase();
601 @Messages({
"ImportHashDatabaseDialog.ImportHashDatabaseWorker.error=Failed to import hash database."})
606 }
catch (InterruptedException | ExecutionException ex) {
607 Logger.
getLogger(ImportHashDatabaseDialog.class.getName()).log(Level.SEVERE, Bundle.ImportHashDatabaseDialog_ImportHashDatabaseWorker_error(), ex);
615 return Files.lines(f.toPath()).count();
618 @Messages({
"# {0} - value content",
619 "ImportHashDatabaseDialog.ImportHashDatabaseWorker.duplicate=Duplicate value {0} found in import file."})
621 BufferedReader reader =
new BufferedReader(
new FileReader(file));
624 Set<EamGlobalFileInstance> globalInstances =
new HashSet<>();
626 long totalLines = numberOfLinesInFile(file);
627 if (totalLines <= Integer.MAX_VALUE) {
628 progress.start((
int) totalLines);
634 LOGGER.log(Level.INFO,
"Importing hash database {0}", file.getName());
635 while ((line = reader.readLine()) != null) {
636 progress.progress(++numLines);
638 String[] parts = line.split(
"\\|");
641 if (parts.length != 2 || parts[0].length() == 41) {
647 parts[0].toLowerCase(),
651 globalInstances.add(eamGlobalFileInstance);
653 if(numLines % HASH_IMPORT_THRESHOLD == 0){
655 globalInstances.clear();
660 LOGGER.log(Level.INFO,
"Finished importing hash database. Total entries: {0}", numLines);
666 private javax.swing.JButton bnNewOrganization;
667 private javax.swing.ButtonGroup buttonGroup1;
668 private javax.swing.JButton cancelButton;
669 private javax.swing.JComboBox<String> comboboxSourceOrganization;
670 private javax.swing.JRadioButton knownBadRadioButton;
671 private javax.swing.JRadioButton knownRadioButton;
672 private javax.swing.JLabel lbDatabaseAttribution;
673 private javax.swing.JLabel lbDatabaseName;
674 private javax.swing.JLabel lbDatabasePath;
675 private javax.swing.JLabel lbDatabaseType;
676 private javax.swing.JLabel lbDatabaseVersion;
677 private javax.swing.JLabel lbInstructions;
678 private javax.swing.JLabel lbSourceOrganization;
679 private javax.swing.JLabel lbWarningMsg;
680 private javax.swing.JButton okButton;
681 private javax.swing.JButton openButton;
682 private javax.swing.JTextField tfDatabaseName;
683 private javax.swing.JTextField tfDatabaseVersion;
684 private javax.swing.JTextField tfFilePath;
final CorrelationAttribute.Type contentType
void changedUpdate(DocumentEvent e)
void importHashDatabase()
void insertUpdate(DocumentEvent e)
static EamDb getInstance()
ImportHashDatabaseWorker(String filename, TskData.FileKnown knownStatus, int globalSetID, CorrelationAttribute.Type contentType)
final ProgressHandle progress
static boolean isEnabled()
long numberOfLinesInFile(File f)
final TskData.FileKnown knownStatus
synchronized static Logger getLogger(String name)
static void show(String title, String message, MessageType type, ActionListener actionListener)
void bulkInsertReferenceTypeEntries(Set< EamGlobalFileInstance > globalInstances, CorrelationAttribute.Type contentType)
void removeUpdate(DocumentEvent e)