mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-17 18:17:43 +00:00
Refactored the database import workers
This commit is contained in:
parent
3605ba147e
commit
4b6a9cb4a0
@ -111,7 +111,7 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P
|
||||
return null;
|
||||
}
|
||||
|
||||
@NbBundle.Messages({"ImportCentralRepoDbProgressDialog.linesProcessed= lines processed"})
|
||||
@NbBundle.Messages({"ImportCentralRepoDbProgressDialog.linesProcessed= hashes processed"})
|
||||
@Override
|
||||
public void propertyChange(PropertyChangeEvent evt) {
|
||||
|
||||
@ -139,23 +139,23 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P
|
||||
return worker.getLinesProcessed() + Bundle.ImportCentralRepoDbProgressDialog_linesProcessed();
|
||||
}
|
||||
|
||||
abstract class CentralRepoImportWorker2 extends SwingWorker<Void, Void>{
|
||||
private final int HASH_IMPORT_THRESHOLD = 10000;
|
||||
private final String hashSetName;
|
||||
private final String version;
|
||||
private final int orgId;
|
||||
private final boolean searchDuringIngest;
|
||||
private final boolean sendIngestMessages;
|
||||
private final HashDbManager.HashDb.KnownFilesType knownFilesType;
|
||||
private final boolean readOnly;
|
||||
private final File importFile;
|
||||
private long totalLines;
|
||||
private int crIndex = -1;
|
||||
private HashDbManager.CentralRepoHashDb newHashDb = null;
|
||||
private final AtomicLong numLines = new AtomicLong();
|
||||
private String errorString = "";
|
||||
abstract class CentralRepoImportWorker extends SwingWorker<Void, Void>{
|
||||
final int HASH_IMPORT_THRESHOLD = 10000;
|
||||
final String hashSetName;
|
||||
final String version;
|
||||
final int orgId;
|
||||
final boolean searchDuringIngest;
|
||||
final boolean sendIngestMessages;
|
||||
final HashDbManager.HashDb.KnownFilesType knownFilesType;
|
||||
final boolean readOnly;
|
||||
final File importFile;
|
||||
long totalHashes = 1;
|
||||
int referenceSetID = -1;
|
||||
HashDbManager.CentralRepoHashDb newHashDb = null;
|
||||
final AtomicLong numLines = new AtomicLong();
|
||||
String errorString = "";
|
||||
|
||||
CentralRepoImportWorker2(String hashSetName, String version, int orgId,
|
||||
CentralRepoImportWorker(String hashSetName, String version, int orgId,
|
||||
boolean searchDuringIngest, boolean sendIngestMessages, HashDbManager.HashDb.KnownFilesType knownFilesType,
|
||||
boolean readOnly, File importFile){
|
||||
|
||||
@ -186,88 +186,88 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P
|
||||
return errorString;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private interface CentralRepoImportWorker{
|
||||
/**
|
||||
* Should be called in the constructor to set the max number of hashes.
|
||||
* The value can be updated later after parsing the import file.
|
||||
*/
|
||||
abstract void setEstimatedTotalHashes();
|
||||
|
||||
void execute();
|
||||
boolean cancel(boolean mayInterruptIfRunning);
|
||||
void addPropertyChangeListener(PropertyChangeListener dialog);
|
||||
int getProgressPercentage();
|
||||
long getLinesProcessed();
|
||||
HashDbManager.HashDatabase getDatabase();
|
||||
String getError();
|
||||
void deleteIncompleteSet(){
|
||||
if(referenceSetID >= 0){
|
||||
|
||||
// This can be slow on large reference sets
|
||||
Executors.newSingleThreadExecutor().execute(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try{
|
||||
EamDb.getInstance().deleteReferenceSet(referenceSetID);
|
||||
} catch (EamDbException ex2){
|
||||
Logger.getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE, "Error deleting incomplete hash set from central repository", ex2);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@NbBundle.Messages({"ImportCentralRepoDbProgressDialog.importHashsetError=Error importing hash set",
|
||||
"ImportCentralRepoDbProgressDialog.addDbError.message=Error adding new hash set"})
|
||||
@Override
|
||||
protected void done() {
|
||||
|
||||
if(isCancelled()){
|
||||
// If the user hit cancel, delete this incomplete hash set from the central repo
|
||||
deleteIncompleteSet();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
get();
|
||||
try{
|
||||
newHashDb = HashDbManager.getInstance().addExistingCentralRepoHashSet(hashSetName, version,
|
||||
referenceSetID,
|
||||
searchDuringIngest, sendIngestMessages, knownFilesType, readOnly);
|
||||
} catch (TskCoreException ex){
|
||||
JOptionPane.showMessageDialog(null, Bundle.ImportCentralRepoDbProgressDialog_addDbError_message());
|
||||
Logger.getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE, "Error adding imported hash set", ex);
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
// Delete this incomplete hash set from the central repo
|
||||
deleteIncompleteSet();
|
||||
errorString = Bundle.ImportCentralRepoDbProgressDialog_importHashsetError();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class ImportEncaseWorker extends SwingWorker<Void,Void> implements CentralRepoImportWorker{
|
||||
private final int HASH_IMPORT_THRESHOLD = 10000;
|
||||
private final String hashSetName;
|
||||
private final String version;
|
||||
private final int orgId;
|
||||
private final boolean searchDuringIngest;
|
||||
private final boolean sendIngestMessages;
|
||||
private final HashDbManager.HashDb.KnownFilesType knownFilesType;
|
||||
private final boolean readOnly;
|
||||
private final File importFile;
|
||||
private final long totalLines;
|
||||
private int crIndex = -1;
|
||||
private HashDbManager.CentralRepoHashDb newHashDb = null;
|
||||
private final AtomicLong numLines = new AtomicLong();
|
||||
private String errorString = "";
|
||||
class ImportEncaseWorker extends CentralRepoImportWorker{
|
||||
|
||||
ImportEncaseWorker(String hashSetName, String version, int orgId,
|
||||
boolean searchDuringIngest, boolean sendIngestMessages, HashDbManager.HashDb.KnownFilesType knownFilesType,
|
||||
boolean readOnly, File importFile){
|
||||
boolean searchDuringIngest, boolean sendIngestMessages, HashDbManager.HashDb.KnownFilesType knownFilesType,
|
||||
boolean readOnly, File importFile){
|
||||
super(hashSetName, version, orgId, searchDuringIngest, sendIngestMessages, knownFilesType, readOnly, importFile);
|
||||
|
||||
this.hashSetName = hashSetName;
|
||||
this.version = version;
|
||||
this.orgId = orgId;
|
||||
this.searchDuringIngest = searchDuringIngest;
|
||||
this.sendIngestMessages = sendIngestMessages;
|
||||
this.knownFilesType = knownFilesType;
|
||||
this.readOnly = readOnly;
|
||||
this.importFile = importFile;
|
||||
this.numLines.set(0);
|
||||
|
||||
this.totalLines = getEstimatedTotalHashes();
|
||||
setEstimatedTotalHashes();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Encase files have a 0x480 byte header, then each hash takes 18 bytes
|
||||
* @return Approximate number of hashes in the file
|
||||
*/
|
||||
final long getEstimatedTotalHashes(){
|
||||
@Override
|
||||
final void setEstimatedTotalHashes(){
|
||||
long fileSize = importFile.length();
|
||||
if(fileSize < 0x492){
|
||||
return 1; // There's room for at most one hash
|
||||
totalHashes = 1; // There's room for at most one hash
|
||||
}
|
||||
return ((fileSize - 0x492) / 18);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HashDbManager.HashDatabase getDatabase(){
|
||||
return newHashDb;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLinesProcessed(){
|
||||
return numLines.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getProgressPercentage(){
|
||||
return this.getProgress();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getError(){
|
||||
return errorString;
|
||||
totalHashes = (fileSize - 0x492) / 18;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Void doInBackground() throws Exception {
|
||||
|
||||
EncaseHashSetParser encaseParser = new EncaseHashSetParser(this.importFile.getAbsolutePath());
|
||||
EncaseHashSetParser encaseParser = new EncaseHashSetParser(importFile.getAbsolutePath());
|
||||
totalHashes = encaseParser.getExpectedHashes();
|
||||
|
||||
TskData.FileKnown knownStatus;
|
||||
if (knownFilesType.equals(HashDbManager.HashDb.KnownFilesType.KNOWN)) {
|
||||
@ -277,7 +277,7 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P
|
||||
}
|
||||
|
||||
// Create an empty hashset in the central repository
|
||||
crIndex = EamDb.getInstance().newReferenceSet(orgId, hashSetName, version, knownStatus, readOnly);
|
||||
referenceSetID = EamDb.getInstance().newReferenceSet(orgId, hashSetName, version, knownStatus, readOnly);
|
||||
|
||||
EamDb dbManager = EamDb.getInstance();
|
||||
CorrelationAttribute.Type contentType = dbManager.getCorrelationTypeById(CorrelationAttribute.FILES_TYPE_ID); // get "FILES" type
|
||||
@ -293,7 +293,7 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P
|
||||
|
||||
if(newHash != null){
|
||||
EamGlobalFileInstance eamGlobalFileInstance = new EamGlobalFileInstance(
|
||||
crIndex,
|
||||
referenceSetID,
|
||||
newHash,
|
||||
knownStatus,
|
||||
"");
|
||||
@ -305,7 +305,7 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P
|
||||
dbManager.bulkInsertReferenceTypeEntries(globalInstances, contentType);
|
||||
globalInstances.clear();
|
||||
|
||||
int progress = (int)(numLines.get() * 100 / totalLines);
|
||||
int progress = (int)(numLines.get() * 100 / totalHashes);
|
||||
if(progress < 100){
|
||||
this.setProgress(progress);
|
||||
} else {
|
||||
@ -319,90 +319,17 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P
|
||||
this.setProgress(100);
|
||||
return null;
|
||||
}
|
||||
|
||||
private void deleteIncompleteSet(int crIndex){
|
||||
if(crIndex >= 0){
|
||||
|
||||
// This can be slow on large reference sets
|
||||
Executors.newSingleThreadExecutor().execute(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try{
|
||||
EamDb.getInstance().deleteReferenceSet(crIndex);
|
||||
} catch (EamDbException ex2){
|
||||
Logger.getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE, "Error deleting incomplete hash set from central repository", ex2);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@NbBundle.Messages({"ImportCentralRepoDbProgressDialog.importError=Error importing hash set"})
|
||||
@Override
|
||||
protected void done() {
|
||||
|
||||
if(isCancelled()){
|
||||
// If the user hit cancel, delete this incomplete hash set from the central repo
|
||||
deleteIncompleteSet(crIndex);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
get();
|
||||
try{
|
||||
newHashDb = HashDbManager.getInstance().addExistingCentralRepoHashSet(hashSetName, version,
|
||||
crIndex,
|
||||
searchDuringIngest, sendIngestMessages, knownFilesType, readOnly);
|
||||
} catch (TskCoreException ex){
|
||||
JOptionPane.showMessageDialog(null, Bundle.ImportCentralRepoDbProgressDialog_addDbError_message());
|
||||
Logger.getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE, "Error adding imported hash set", ex);
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
// Delete this incomplete hash set from the central repo
|
||||
if(crIndex >= 0){
|
||||
try{
|
||||
EamDb.getInstance().deleteReferenceSet(crIndex);
|
||||
} catch (EamDbException ex2){
|
||||
Logger.getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE, "Error deleting incomplete hash set from central repository", ex);
|
||||
}
|
||||
}
|
||||
errorString = Bundle.ImportCentralRepoDbProgressDialog_importError();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ImportIDXWorker extends SwingWorker<Void,Void> implements CentralRepoImportWorker{
|
||||
|
||||
private final int HASH_IMPORT_THRESHOLD = 10000;
|
||||
private final String hashSetName;
|
||||
private final String version;
|
||||
private final int orgId;
|
||||
private final boolean searchDuringIngest;
|
||||
private final boolean sendIngestMessages;
|
||||
private final HashDbManager.HashDb.KnownFilesType knownFilesType;
|
||||
private final boolean readOnly;
|
||||
private final File importFile;
|
||||
private final long totalLines;
|
||||
private int referenceSetID = -1;
|
||||
private HashDbManager.CentralRepoHashDb newHashDb = null;
|
||||
private final AtomicLong numLines = new AtomicLong();
|
||||
private String errorString = "";
|
||||
|
||||
class ImportIDXWorker extends CentralRepoImportWorker{
|
||||
|
||||
ImportIDXWorker(String hashSetName, String version, int orgId,
|
||||
boolean searchDuringIngest, boolean sendIngestMessages, HashDbManager.HashDb.KnownFilesType knownFilesType,
|
||||
boolean readOnly, File importFile){
|
||||
boolean searchDuringIngest, boolean sendIngestMessages, HashDbManager.HashDb.KnownFilesType knownFilesType,
|
||||
boolean readOnly, File importFile){
|
||||
super(hashSetName, version, orgId, searchDuringIngest, sendIngestMessages, knownFilesType, readOnly, importFile);
|
||||
|
||||
this.hashSetName = hashSetName;
|
||||
this.version = version;
|
||||
this.orgId = orgId;
|
||||
this.searchDuringIngest = searchDuringIngest;
|
||||
this.sendIngestMessages = sendIngestMessages;
|
||||
this.knownFilesType = knownFilesType;
|
||||
this.readOnly = readOnly;
|
||||
this.importFile = importFile;
|
||||
this.numLines.set(0);
|
||||
|
||||
this.totalLines = getEstimatedTotalHashes();
|
||||
setEstimatedTotalHashes();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -411,29 +338,10 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P
|
||||
* progress bar.
|
||||
* @return Approximate number of hashes in the file
|
||||
*/
|
||||
final long getEstimatedTotalHashes(){
|
||||
@Override
|
||||
final void setEstimatedTotalHashes(){
|
||||
long fileSize = importFile.length();
|
||||
return (fileSize / 0x33 + 1); // IDX file lines are generally 0x33 bytes long, and we don't want this to be zero
|
||||
}
|
||||
|
||||
@Override
|
||||
public HashDbManager.HashDatabase getDatabase(){
|
||||
return newHashDb;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLinesProcessed(){
|
||||
return numLines.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getProgressPercentage(){
|
||||
return this.getProgress();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getError(){
|
||||
return errorString;
|
||||
totalHashes = fileSize / 0x33 + 1; // IDX file lines are generally 0x33 bytes long, and we don't want this to be zero
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -480,7 +388,7 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P
|
||||
dbManager.bulkInsertReferenceTypeEntries(globalInstances, contentType);
|
||||
globalInstances.clear();
|
||||
|
||||
int progress = (int)(numLines.get() * 100 / totalLines);
|
||||
int progress = (int)(numLines.get() * 100 / totalHashes);
|
||||
if(progress < 100){
|
||||
this.setProgress(progress);
|
||||
} else {
|
||||
@ -494,54 +402,6 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private void deleteIncompleteSet(int idToDelete){
|
||||
if(idToDelete >= 0){
|
||||
|
||||
// This can be slow on large reference sets
|
||||
Executors.newSingleThreadExecutor().execute(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try{
|
||||
EamDb.getInstance().deleteReferenceSet(idToDelete);
|
||||
} catch (EamDbException ex2){
|
||||
Logger.getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE, "Error deleting incomplete hash set from central repository", ex2);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@NbBundle.Messages({"ImportCentralRepoDbProgressDialog.addDbError.message=Error adding new hash set"})
|
||||
@Override
|
||||
protected void done() {
|
||||
if(isCancelled()){
|
||||
// If the user hit cancel, delete this incomplete hash set from the central repo
|
||||
deleteIncompleteSet(referenceSetID);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
get();
|
||||
try{
|
||||
newHashDb = HashDbManager.getInstance().addExistingCentralRepoHashSet(hashSetName, version,
|
||||
referenceSetID,
|
||||
searchDuringIngest, sendIngestMessages, knownFilesType, readOnly);
|
||||
} catch (TskCoreException ex){
|
||||
JOptionPane.showMessageDialog(null, Bundle.ImportCentralRepoDbProgressDialog_addDbError_message());
|
||||
Logger.getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE, "Error adding imported hash set", ex);
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
// Delete this incomplete hash set from the central repo
|
||||
if(referenceSetID >= 0){
|
||||
try{
|
||||
EamDb.getInstance().deleteReferenceSet(referenceSetID);
|
||||
} catch (EamDbException ex2){
|
||||
Logger.getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE, "Error deleting incomplete hash set from central repository", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user