From e13f36442c93b7708c137f504f742dc5146743be Mon Sep 17 00:00:00 2001 From: Mark McKinnon Date: Mon, 19 Aug 2019 09:53:52 -0400 Subject: [PATCH 01/41] Create Registry_Example.py Example Python plugin that will parse registry keys --- pythonExamples/Registry_Example.py | 284 +++++++++++++++++++++++++++++ 1 file changed, 284 insertions(+) create mode 100644 pythonExamples/Registry_Example.py diff --git a/pythonExamples/Registry_Example.py b/pythonExamples/Registry_Example.py new file mode 100644 index 0000000000..885d682ab5 --- /dev/null +++ b/pythonExamples/Registry_Example.py @@ -0,0 +1,284 @@ +# Sample module in the public domain. Feel free to use this as a template +# for your modules (and you can remove this header and take complete credit +# and liability) +# +# Contact: Brian Carrier [carrier sleuthkit [dot] org] +# +# This is free and unencumbered software released into the public domain. +# +# Anyone is free to copy, modify, publish, use, compile, sell, or +# distribute this software, either in source code form or as a compiled +# binary, for any purpose, commercial or non-commercial, and by any +# means. +# +# In jurisdictions that recognize copyright laws, the author or authors +# of this software dedicate any and all copyright interest in the +# software to the public domain. We make this dedication for the benefit +# of the public at large and to the detriment of our heirs and +# successors. We intend this dedication to be an overt act of +# relinquishment in perpetuity of all present and future rights to this +# software under copyright law. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. + +# Simple data source-level ingest module for Autopsy. +# Search for TODO for the things that you need to change +# See http://sleuthkit.org/autopsy/docs/api-docs/4.6.0/index.html for documentation + +import inspect +import os +import shutil +import ntpath + +from com.williballenthin.rejistry import RegistryHiveFile +from com.williballenthin.rejistry import RegistryKey +from com.williballenthin.rejistry import RegistryParseException +from com.williballenthin.rejistry import RegistryValue +from java.io import File +from java.lang import Class +from java.lang import System +from java.sql import DriverManager, SQLException +from java.util.logging import Level +from java.util import ArrayList +from org.sleuthkit.datamodel import SleuthkitCase +from org.sleuthkit.datamodel import AbstractFile +from org.sleuthkit.datamodel import ReadContentInputStream +from org.sleuthkit.datamodel import BlackboardArtifact +from org.sleuthkit.datamodel import BlackboardAttribute +from org.sleuthkit.datamodel import TskData +from org.sleuthkit.autopsy.ingest import IngestModule +from org.sleuthkit.autopsy.ingest.IngestModule import IngestModuleException +from org.sleuthkit.autopsy.ingest import DataSourceIngestModule +from org.sleuthkit.autopsy.ingest import IngestModuleFactoryAdapter +from org.sleuthkit.autopsy.ingest import IngestModuleIngestJobSettings +from org.sleuthkit.autopsy.ingest import IngestModuleIngestJobSettingsPanel +from org.sleuthkit.autopsy.ingest import IngestMessage +from org.sleuthkit.autopsy.ingest import IngestServices +from org.sleuthkit.autopsy.ingest import ModuleDataEvent +from org.sleuthkit.autopsy.coreutils import Logger +from org.sleuthkit.autopsy.coreutils import PlatformUtil +from org.sleuthkit.autopsy.casemodule import Case +from org.sleuthkit.autopsy.casemodule.services import Services +from org.sleuthkit.autopsy.casemodule.services import FileManager +from org.sleuthkit.autopsy.datamodel import ContentUtils +from org.sleuthkit.autopsy.modules.interestingitems import FilesSetsManager + + + +# Factory that defines the name and details of the module and allows Autopsy +# to create instances of the modules that will do the analysis. +class RegistryExampleIngestModuleFactory(IngestModuleFactoryAdapter): + + def __init__(self): + self.settings = None + + moduleName = "Registy Example Module" + + def getModuleDisplayName(self): + return self.moduleName + + def getModuleDescription(self): + return "Extract Run Keys To Look For Interesting Items" + + def getModuleVersionNumber(self): + return "1.0" + + def hasIngestJobSettingsPanel(self): + return False + + def isDataSourceIngestModuleFactory(self): + return True + + def createDataSourceIngestModule(self, ingestOptions): + return RegistryExampleIngestModule(self.settings) + +# Data Source-level ingest module. One gets created per data source. +class RegistryExampleIngestModule(DataSourceIngestModule): + + _logger = Logger.getLogger(RegistryExampleIngestModuleFactory.moduleName) + + def log(self, level, msg): + self._logger.logp(level, self.__class__.__name__, inspect.stack()[1][3], msg) + + def __init__(self, settings): + self.context = None + + # Where any setup and configuration is done + def startUp(self, context): + self.context = context + # Hive Keys to parse, use / as it is easier to parse out then \\ + self.registryNTUserRunKeys = ('Software/Microsoft/Windows/CurrentVersion/Run', 'Software/Microsoft/Windows/CurrentVersion/RunOnce') + self.registrySoftwareRunKeys = ('Microsoft/Windows/CurrentVersion/Run', 'Microsoft/Windows/CurrentVersion/RunOnce') + self.registryKeysFound = [] + + # Where the analysis is done. + def process(self, dataSource, progressBar): + + # we don't know how much work there is yet + progressBar.switchToIndeterminate() + + # Hive files to extract + filesToExtract = ("NTUSER.DAT", "SOFTWARE") + + # Create ExampleRegistry directory in temp directory, if it exists then continue on processing + tempDir = os.path.join(Case.getCurrentCase().getTempDirectory(), "RegistryExample") + self.log(Level.INFO, "create Directory " + tempDir) + try: + os.mkdir(tempDir) + except: + self.log(Level.INFO, "ExampleRegistry Directory already exists " + tempDir) + + # Set the database to be read to the once created by the prefetch parser program + skCase = Case.getCurrentCase().getSleuthkitCase(); + fileManager = Case.getCurrentCase().getServices().getFileManager() + + # Look for files to process + for fileName in filesToExtract: + files = fileManager.findFiles(dataSource, fileName) + numFiles = len(files) + + for file in files: + + # Check if the user pressed cancel while we were busy + if self.context.isJobCancelled(): + return IngestModule.ProcessResult.OK + + # Check path to only get the hive files in the config directory and no others + if ((file.getName() == 'SOFTWARE') and (file.getParentPath().upper() == '/WINDOWS/SYSTEM32/CONFIG/') and (file.getSize() > 0)): + # Save the file locally in the temp folder. + self.writeHiveFile(file, file.getName(), tempDir) + + # Process this file looking thru the run keys + self.processSoftwareHive(os.path.join(tempDir, file.getName()), file) + + elif ((file.getName() == 'NTUSER.DAT') and ('/USERS' in file.getParentPath().upper()) and (file.getSize() > 0)): + # Found a NTUSER.DAT file to process only want files in User directories + # Filename may not be unique so add file id to the name + fileName = str(file.getId()) + "-" + file.getName() + + # Save the file locally in the temp folder. + self.writeHiveFile(file, fileName, tempDir) + + # Process this file looking thru the run keys + self.processNTUserHive(os.path.join(tempDir, fileName), file) + + + # Setup Artifact and Attributes + try: + artID = skCase.addArtifactType( "TSK_REGISTRY_RUN_KEYS", "Registry Run Keys") + except: + self.log(Level.INFO, "Artifacts Creation Error, some artifacts may not exist now. ==> ") + + artId = skCase.getArtifactTypeID("TSK_REGISTRY_RUN_KEYS") + + try: + attributeIdRunKeyName = skCase.addArtifactAttributeType("TSK_REG_RUN_KEY_NAME", BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.STRING, "Run Key Name") + except: + self.log(Level.INFO, "Attributes Creation Error, TSK_REG_RUN_KEY_NAME, May already exist. ") + try: + attributeIdRunKeyValue = skCase.addArtifactAttributeType("TSK_REG_RUN_KEY_VALUE", BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.STRING, "Run Key Value") + except: + self.log(Level.INFO, "Attributes Creation Error, TSK_REG_RUN_KEY_VALUE, May already exist. ") + try: + attributeIdRegKeyLoc = skCase.addArtifactAttributeType("TSK_REG_KEY_LOCATION", BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.STRING, "Registry Key Location") + except: + self.log(Level.INFO, "Attributes Creation Error, TSK_REG_KEY_LOCATION, May already exist. ") + + attributeIdRunKeyName = skCase.getAttributeType("TSK_REG_RUN_KEY_NAME") + attributeIdRunKeyValue = skCase.getAttributeType("TSK_REG_RUN_KEY_VALUE") + attributeIdRegKeyLoc = skCase.getAttributeType("TSK_REG_KEY_LOCATION") + + moduleName = RegistryExampleIngestModuleFactory.moduleName + + # RefistryKeysFound is a list that contains a list with the following records abstractFile, Registry Key Location, Key Name, Key value + for registryKey in self.registryKeysFound: + attributes = ArrayList() + art = registryKey[0].newArtifact(artId) + + attributes.add(BlackboardAttribute(attributeIdRegKeyLoc, moduleName, registryKey[1])) + attributes.add(BlackboardAttribute(attributeIdRunKeyName, moduleName, registryKey[2])) + attributes.add(BlackboardAttribute(attributeIdRunKeyValue, moduleName, registryKey[3])) + art.addAttributes(attributes) + + # index the artifact for keyword search + try: + blackboard.indexArtifact(art) + except: + self._logger.log(Level.WARNING, "Error indexing artifact " + art.getDisplayName()) + + #Clean up registryExample directory and files + try: + shutil.rmtree(tempDir) + except: + self.log(Level.INFO, "removal of directory tree failed " + tempDir) + + # After all databases, post a message to the ingest messages in box. + message = IngestMessage.createMessage(IngestMessage.MessageType.DATA, + "RegistryExample", " RegistryExample Files Have Been Analyzed " ) + IngestServices.getInstance().postMessage(message) + + return IngestModule.ProcessResult.OK + + def writeHiveFile(self, file, fileName, tempDir): + # Write the file to the temp directory. + filePath = os.path.join(tempDir, fileName) + ContentUtils.writeToFile(file, File(filePath)) + + + def processSoftwareHive(self, softwareHive, abstractFile): + # Open the registry hive file + softwareRegFile = RegistryHiveFile(File(softwareHive)) + for runKey in self.registrySoftwareRunKeys: + currentKey = self.findRegistryKey(softwareRegFile, runKey) + if len(currentKey.getValueList()) > 0: + skValues = currentKey.getValueList() + for skValue in skValues: + regKey = [] + regKey.append(abstractFile) + regKey.append(runKey) + skName = skValue.getName() + skVal = skValue.getValue() + regKey.append(str(skName)) + regKey.append(skVal.getAsString()) + self.registryKeysFound.append(regKey) + + + def processNTUserHive(self, ntuserHive, abstractFile): + + # Open the registry hive file + ntuserRegFile = RegistryHiveFile(File(ntuserHive)) + for runKey in self.registryNTUserRunKeys: + currentKey = self.findRegistryKey(ntuserRegFile, runKey) + if len(currentKey.getValueList()) > 0: + skValues = currentKey.getValueList() + for skValue in skValues: + regKey = [] + regKey.append(abstractFile) + regKey.append(runKey) + skName = skValue.getName() + skVal = skValue.getValue() + regKey.append(str(skName)) + regKey.append(skVal.getAsString()) + self.registryKeysFound.append(regKey) + + def findRegistryKey(self, registryHiveFile, registryKey): + # Search for the registry key + rootKey = registryHiveFile.getRoot() + regKeyList = registryKey.split('/') + currentKey = rootKey + try: + for key in regKeyList: + currentKey = currentKey.getSubkey(key) + return currentKey + except: + # Key not found + return null + + + From 715f531dcc85fe4ced01385e4c8c7996baf36dfa Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dsmyda" Date: Tue, 15 Oct 2019 09:03:10 -0400 Subject: [PATCH 02/41] Updated and tested the new template code --- .../FindContactsDb.py | 160 ++++++++---------- 1 file changed, 69 insertions(+), 91 deletions(-) diff --git a/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb.py b/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb.py index 69a103dcdf..483a1b8e09 100644 --- a/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb.py +++ b/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb.py @@ -35,18 +35,13 @@ import jarray import inspect -import os from java.lang import Class from java.lang import System -from java.sql import DriverManager, SQLException from java.util.logging import Level from java.util import ArrayList from java.io import File from org.sleuthkit.datamodel import SleuthkitCase from org.sleuthkit.datamodel import AbstractFile -from org.sleuthkit.datamodel import ReadContentInputStream -from org.sleuthkit.datamodel import BlackboardArtifact -from org.sleuthkit.datamodel import BlackboardAttribute from org.sleuthkit.autopsy.ingest import IngestModule from org.sleuthkit.autopsy.ingest.IngestModule import IngestModuleException from org.sleuthkit.autopsy.ingest import DataSourceIngestModule @@ -56,17 +51,20 @@ from org.sleuthkit.autopsy.ingest import IngestServices from org.sleuthkit.autopsy.ingest import ModuleDataEvent from org.sleuthkit.autopsy.coreutils import Logger from org.sleuthkit.autopsy.casemodule import Case -from org.sleuthkit.autopsy.datamodel import ContentUtils -from org.sleuthkit.autopsy.casemodule.services import Services -from org.sleuthkit.autopsy.casemodule.services import FileManager -from org.sleuthkit.autopsy.casemodule.services import Blackboard - - +from org.sleuthkit.datamodel import TskCoreException +from org.sleuthkit.datamodel.Blackboard import BlackboardException +from org.sleuthkit.autopsy.casemodule import NoCurrentCaseException +from org.sleuthkit.datamodel import Account +from org.sleuthkit.datamodel.blackboardutils import CommunicationArtifactsHelper +from java.sql import ResultSet +from java.sql import SQLException +from org.sleuthkit.autopsy.coreutils import AppSQLiteDB # Factory that defines the name and details of the module and allows Autopsy # to create instances of the modules that will do the analysis. class ContactsDbIngestModuleFactory(IngestModuleFactoryAdapter): + # TODO - Replace with your modules name moduleName = "Contacts Db Analyzer" def getModuleDisplayName(self): @@ -103,98 +101,78 @@ class ContactsDbIngestModule(DataSourceIngestModule): self.context = context # Where the analysis is done. - # The 'dataSource' object being passed in is of type org.sleuthkit.datamodel.Content. + # The 'data_source' object being passed in is of type org.sleuthkit.datamodel.Content. # See: http://www.sleuthkit.org/sleuthkit/docs/jni-docs/4.6.0/interfaceorg_1_1sleuthkit_1_1datamodel_1_1_content.html - # 'progressBar' is of type org.sleuthkit.autopsy.ingest.DataSourceIngestModuleProgress + # 'progress_bar' is of type org.sleuthkit.autopsy.ingest.DataSourceIngestModuleProgress # See: http://sleuthkit.org/autopsy/docs/api-docs/4.6.0/classorg_1_1sleuthkit_1_1autopsy_1_1ingest_1_1_data_source_ingest_module_progress.html - def process(self, dataSource, progressBar): + def process(self, data_source, progress_bar): # we don't know how much work there is yet - progressBar.switchToIndeterminate() + progress_bar.switchToIndeterminate() - # Use blackboard class to index blackboard artifacts for keyword search - blackboard = Case.getCurrentCase().getServices().getBlackboard() - - # Find files named contacts.db, regardless of parent path - fileManager = Case.getCurrentCase().getServices().getFileManager() - files = fileManager.findFiles(dataSource, "contacts.db") - - numFiles = len(files) - progressBar.switchToDeterminate(numFiles) - fileCount = 0 - for file in files: - - # Check if the user pressed cancel while we were busy - if self.context.isJobCancelled(): - return IngestModule.ProcessResult.OK - - self.log(Level.INFO, "Processing file: " + file.getName()) - fileCount += 1 - - # Save the DB locally in the temp folder. use file id as name to reduce collisions - lclDbPath = os.path.join(Case.getCurrentCase().getTempDirectory(), str(file.getId()) + ".db") - ContentUtils.writeToFile(file, File(lclDbPath)) - - # Open the DB using JDBC - try: - Class.forName("org.sqlite.JDBC").newInstance() - dbConn = DriverManager.getConnection("jdbc:sqlite:%s" % lclDbPath) - except SQLException as e: - self.log(Level.INFO, "Could not open database file (not SQLite) " + file.getName() + " (" + e.getMessage() + ")") - return IngestModule.ProcessResult.OK - - # Query the contacts table in the database and get all columns. - try: - stmt = dbConn.createStatement() - resultSet = stmt.executeQuery("SELECT * FROM contacts") - except SQLException as e: - self.log(Level.INFO, "Error querying database for contacts table (" + e.getMessage() + ")") - return IngestModule.ProcessResult.OK - - # Cycle through each row and create artifacts - while resultSet.next(): - try: - name = resultSet.getString("name") - email = resultSet.getString("email") - phone = resultSet.getString("phone") - except SQLException as e: - self.log(Level.INFO, "Error getting values from contacts table (" + e.getMessage() + ")") + # Find files named contacts.db anywhere in the data source. + # TODO - replace with your database name and parent path. + app_databases = AppSQLiteDB.findAppDatabases(data_source, "contacts.db", True, "") - - # Make an artifact on the blackboard, TSK_CONTACT and give it attributes for each of the fields - art = file.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT) - attributes = ArrayList() + num_databases = len(app_databases) + progress_bar.switchToDeterminate(num_databases) + databases_processed = 0 - attributes.add(BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME_PERSON.getTypeID(), - ContactsDbIngestModuleFactory.moduleName, name)) - - attributes.add(BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL.getTypeID(), - ContactsDbIngestModuleFactory.moduleName, email)) + try: + # Iterate through all the database files returned + for app_database in app_databases: - attributes.add(BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER.getTypeID(), - ContactsDbIngestModuleFactory.moduleName, phone)) + # Check if the user pressed cancel while we were busy + if self.context.isJobCancelled(): + return IngestModule.ProcessResult.OK + + self.log(Level.INFO, "Processing file: " + app_database.getDBFile().getName()) - art.addAttributes(attributes) + # Query the contacts table in the database and get all columns. try: - # index the artifact for keyword search - blackboard.indexArtifact(art) - except Blackboard.BlackboardException as e: - self.log(Level.SEVERE, "Error indexing artifact " + art.getDisplayName()) - - # Fire an event to notify the UI and others that there are new artifacts - IngestServices.getInstance().fireModuleDataEvent( - ModuleDataEvent(ContactsDbIngestModuleFactory.moduleName, - BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT, None)) - - # Clean up - stmt.close() - dbConn.close() - os.remove(lclDbPath) + # TODO - replace with your query + result_set = app_database.runQuery("SELECT * FROM contacts") + except SQLException as e: + self.log(Level.INFO, "Error querying database for contacts table (" + e.getMessage() + ")") + return IngestModule.ProcessResult.OK + + try: + #Get the current case for the CommunicationArtifactsHelper. + current_case = Case.getCurrentCaseThrows() + except NoCurrentCaseException as ex: + self.log(Level.INFO, "Case is closed (" + ex.getMessage() + ")") + return IngestModule.ProcessResult.OK + + # Create an instance of the helper class + # TODO - Replace with your parser name and Account.Type + helper = CommunicationArtifactsHelper(current_case.getSleuthkitCase(), + ContactsDbIngestModuleFactory.moduleName, app_database.getDBFile(), Account.Type.DEVICE) + + # Iterate through each row and create artifacts + while result_set.next(): + try: + # TODO - Replace these calls with your column names and types + # Ex of other types: result_set.getInt("contact_type") or result_set.getLong("datetime") + name = result_set.getString("name") + email = result_set.getString("email") + phone = result_set.getString("phone") + except SQLException as e: + self.log(Level.INFO, "Error getting values from contacts table (" + e.getMessage() + ")") + + helper.addContact(name, phone, "", "", email) + + app_database.close() + databases_processed += 1 + progress_bar.progress(databases_processed) + except TskCoreException as e: + self.log(Level.INFO, "Error inserting or reading from the Sleuthkit case (" + e.getMessage() + ")") + except BlackboardException as e: + self.log(Level.INFO, "Error posting artifact to the Blackboard (" + e.getMessage() + ")") - # After all databases, post a message to the ingest messages in box. + # TODO - update your module name here message = IngestMessage.createMessage(IngestMessage.MessageType.DATA, - "ContactsDb Analyzer", "Found %d files" % fileCount) + ContactsDbIngestModuleFactory.moduleName, "Found %d files" % num_databases) IngestServices.getInstance().postMessage(message) - + return IngestModule.ProcessResult.OK From 345ce14a40118dec10448cd0199d3e639a727117 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dsmyda" Date: Mon, 25 Jan 2021 16:11:40 -0500 Subject: [PATCH 03/41] Renamed the new file to _v2 and kept the original file as is --- .../FindContactsDb.py | 158 ++++++++------- .../FindContactsDb_v2.py | 186 ++++++++++++++++++ 2 files changed, 272 insertions(+), 72 deletions(-) mode change 100644 => 100755 pythonExamples/Aug2015DataSourceTutorial/FindContactsDb.py create mode 100644 pythonExamples/Aug2015DataSourceTutorial/FindContactsDb_v2.py diff --git a/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb.py b/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb.py old mode 100644 new mode 100755 index ff18d74d19..7217584315 --- a/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb.py +++ b/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb.py @@ -35,13 +35,18 @@ import jarray import inspect +import os from java.lang import Class from java.lang import System +from java.sql import DriverManager, SQLException from java.util.logging import Level from java.util import ArrayList from java.io import File from org.sleuthkit.datamodel import SleuthkitCase from org.sleuthkit.datamodel import AbstractFile +from org.sleuthkit.datamodel import ReadContentInputStream +from org.sleuthkit.datamodel import BlackboardArtifact +from org.sleuthkit.datamodel import BlackboardAttribute from org.sleuthkit.autopsy.ingest import IngestModule from org.sleuthkit.autopsy.ingest.IngestModule import IngestModuleException from org.sleuthkit.autopsy.ingest import DataSourceIngestModule @@ -51,20 +56,17 @@ from org.sleuthkit.autopsy.ingest import IngestServices from org.sleuthkit.autopsy.ingest import ModuleDataEvent from org.sleuthkit.autopsy.coreutils import Logger from org.sleuthkit.autopsy.casemodule import Case -from org.sleuthkit.datamodel import TskCoreException -from org.sleuthkit.datamodel.Blackboard import BlackboardException -from org.sleuthkit.autopsy.casemodule import NoCurrentCaseException -from org.sleuthkit.datamodel import Account -from org.sleuthkit.datamodel.blackboardutils import CommunicationArtifactsHelper -from java.sql import ResultSet -from java.sql import SQLException -from org.sleuthkit.autopsy.coreutils import AppSQLiteDB +from org.sleuthkit.autopsy.datamodel import ContentUtils +from org.sleuthkit.autopsy.casemodule.services import Services +from org.sleuthkit.autopsy.casemodule.services import FileManager +from org.sleuthkit.autopsy.casemodule.services import Blackboard + + # Factory that defines the name and details of the module and allows Autopsy # to create instances of the modules that will do the analysis. class ContactsDbIngestModuleFactory(IngestModuleFactoryAdapter): - # TODO - Replace with your modules name moduleName = "Contacts Db Analyzer" def getModuleDisplayName(self): @@ -101,86 +103,98 @@ class ContactsDbIngestModule(DataSourceIngestModule): self.context = context # Where the analysis is done. -<<<<<<< HEAD - # The 'data_source' object being passed in is of type org.sleuthkit.datamodel.Content. - # See: http://www.sleuthkit.org/sleuthkit/docs/jni-docs/4.6.0/interfaceorg_1_1sleuthkit_1_1datamodel_1_1_content.html - # 'progress_bar' is of type org.sleuthkit.autopsy.ingest.DataSourceIngestModuleProgress - # See: http://sleuthkit.org/autopsy/docs/api-docs/4.6.0/classorg_1_1sleuthkit_1_1autopsy_1_1ingest_1_1_data_source_ingest_module_progress.html - def process(self, data_source, progress_bar): -======= # The 'dataSource' object being passed in is of type org.sleuthkit.datamodel.Content. # See: http://www.sleuthkit.org/sleuthkit/docs/jni-docs/latest/interfaceorg_1_1sleuthkit_1_1datamodel_1_1_content.html # 'progressBar' is of type org.sleuthkit.autopsy.ingest.DataSourceIngestModuleProgress # See: http://sleuthkit.org/autopsy/docs/api-docs/latest/classorg_1_1sleuthkit_1_1autopsy_1_1ingest_1_1_data_source_ingest_module_progress.html def process(self, dataSource, progressBar): ->>>>>>> db1553ba4e186f1fe50e706a18113f6539779cee # we don't know how much work there is yet - progress_bar.switchToIndeterminate() + progressBar.switchToIndeterminate() - # Find files named contacts.db anywhere in the data source. - # TODO - replace with your database name and parent path. - app_databases = AppSQLiteDB.findAppDatabases(data_source, "contacts.db", True, "") - - num_databases = len(app_databases) - progress_bar.switchToDeterminate(num_databases) - databases_processed = 0 + # Use blackboard class to index blackboard artifacts for keyword search + blackboard = Case.getCurrentCase().getServices().getBlackboard() - try: - # Iterate through all the database files returned - for app_database in app_databases: + # Find files named contacts.db, regardless of parent path + fileManager = Case.getCurrentCase().getServices().getFileManager() + files = fileManager.findFiles(dataSource, "contacts.db") - # Check if the user pressed cancel while we were busy - if self.context.isJobCancelled(): - return IngestModule.ProcessResult.OK + numFiles = len(files) + progressBar.switchToDeterminate(numFiles) + fileCount = 0 + for file in files: - self.log(Level.INFO, "Processing file: " + app_database.getDBFile().getName()) - - # Query the contacts table in the database and get all columns. - try: - # TODO - replace with your query - result_set = app_database.runQuery("SELECT * FROM contacts") - except SQLException as e: - self.log(Level.INFO, "Error querying database for contacts table (" + e.getMessage() + ")") - return IngestModule.ProcessResult.OK + # Check if the user pressed cancel while we were busy + if self.context.isJobCancelled(): + return IngestModule.ProcessResult.OK - try: - #Get the current case for the CommunicationArtifactsHelper. - current_case = Case.getCurrentCaseThrows() - except NoCurrentCaseException as ex: - self.log(Level.INFO, "Case is closed (" + ex.getMessage() + ")") - return IngestModule.ProcessResult.OK + self.log(Level.INFO, "Processing file: " + file.getName()) + fileCount += 1 + + # Save the DB locally in the temp folder. use file id as name to reduce collisions + lclDbPath = os.path.join(Case.getCurrentCase().getTempDirectory(), str(file.getId()) + ".db") + ContentUtils.writeToFile(file, File(lclDbPath)) - # Create an instance of the helper class - # TODO - Replace with your parser name and Account.Type - helper = CommunicationArtifactsHelper(current_case.getSleuthkitCase(), - ContactsDbIngestModuleFactory.moduleName, app_database.getDBFile(), Account.Type.DEVICE) + # Open the DB using JDBC + try: + Class.forName("org.sqlite.JDBC").newInstance() + dbConn = DriverManager.getConnection("jdbc:sqlite:%s" % lclDbPath) + except SQLException as e: + self.log(Level.INFO, "Could not open database file (not SQLite) " + file.getName() + " (" + e.getMessage() + ")") + return IngestModule.ProcessResult.OK + + # Query the contacts table in the database and get all columns. + try: + stmt = dbConn.createStatement() + resultSet = stmt.executeQuery("SELECT * FROM contacts") + except SQLException as e: + self.log(Level.INFO, "Error querying database for contacts table (" + e.getMessage() + ")") + return IngestModule.ProcessResult.OK - # Iterate through each row and create artifacts - while result_set.next(): - try: - # TODO - Replace these calls with your column names and types - # Ex of other types: result_set.getInt("contact_type") or result_set.getLong("datetime") - name = result_set.getString("name") - email = result_set.getString("email") - phone = result_set.getString("phone") - except SQLException as e: - self.log(Level.INFO, "Error getting values from contacts table (" + e.getMessage() + ")") - - helper.addContact(name, phone, "", "", email) + # Cycle through each row and create artifacts + while resultSet.next(): + try: + name = resultSet.getString("name") + email = resultSet.getString("email") + phone = resultSet.getString("phone") + except SQLException as e: + self.log(Level.INFO, "Error getting values from contacts table (" + e.getMessage() + ")") - app_database.close() - databases_processed += 1 - progress_bar.progress(databases_processed) - except TskCoreException as e: - self.log(Level.INFO, "Error inserting or reading from the Sleuthkit case (" + e.getMessage() + ")") - except BlackboardException as e: - self.log(Level.INFO, "Error posting artifact to the Blackboard (" + e.getMessage() + ")") + + # Make an artifact on the blackboard, TSK_CONTACT and give it attributes for each of the fields + art = file.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT) + attributes = ArrayList() + attributes.add(BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME_PERSON.getTypeID(), + ContactsDbIngestModuleFactory.moduleName, name)) + + attributes.add(BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL.getTypeID(), + ContactsDbIngestModuleFactory.moduleName, email)) + + attributes.add(BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER.getTypeID(), + ContactsDbIngestModuleFactory.moduleName, phone)) + + art.addAttributes(attributes) + try: + # index the artifact for keyword search + blackboard.indexArtifact(art) + except Blackboard.BlackboardException as e: + self.log(Level.SEVERE, "Error indexing artifact " + art.getDisplayName()) + + # Fire an event to notify the UI and others that there are new artifacts + IngestServices.getInstance().fireModuleDataEvent( + ModuleDataEvent(ContactsDbIngestModuleFactory.moduleName, + BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT, None)) + + # Clean up + stmt.close() + dbConn.close() + os.remove(lclDbPath) + + # After all databases, post a message to the ingest messages in box. - # TODO - update your module name here message = IngestMessage.createMessage(IngestMessage.MessageType.DATA, - ContactsDbIngestModuleFactory.moduleName, "Found %d files" % num_databases) + "ContactsDb Analyzer", "Found %d files" % fileCount) IngestServices.getInstance().postMessage(message) - + return IngestModule.ProcessResult.OK diff --git a/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb_v2.py b/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb_v2.py new file mode 100644 index 0000000000..ff18d74d19 --- /dev/null +++ b/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb_v2.py @@ -0,0 +1,186 @@ +# Sample module in the public domain. Feel free to use this as a template +# for your modules (and you can remove this header and take complete credit +# and liability) +# +# Contact: Brian Carrier [carrier sleuthkit [dot] org] +# +# This is free and unencumbered software released into the public domain. +# +# Anyone is free to copy, modify, publish, use, compile, sell, or +# distribute this software, either in source code form or as a compiled +# binary, for any purpose, commercial or non-commercial, and by any +# means. +# +# In jurisdictions that recognize copyright laws, the author or authors +# of this software dedicate any and all copyright interest in the +# software to the public domain. We make this dedication for the benefit +# of the public at large and to the detriment of our heirs and +# successors. We intend this dedication to be an overt act of +# relinquishment in perpetuity of all present and future rights to this +# software under copyright law. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. + +# Simple data source-level ingest module for Autopsy. +# Used as part of Python tutorials from Basis Technology - August 2015 +# +# Looks for files of a given name, opens then in SQLite, queries the DB, +# and makes artifacts + +import jarray +import inspect +from java.lang import Class +from java.lang import System +from java.util.logging import Level +from java.util import ArrayList +from java.io import File +from org.sleuthkit.datamodel import SleuthkitCase +from org.sleuthkit.datamodel import AbstractFile +from org.sleuthkit.autopsy.ingest import IngestModule +from org.sleuthkit.autopsy.ingest.IngestModule import IngestModuleException +from org.sleuthkit.autopsy.ingest import DataSourceIngestModule +from org.sleuthkit.autopsy.ingest import IngestModuleFactoryAdapter +from org.sleuthkit.autopsy.ingest import IngestMessage +from org.sleuthkit.autopsy.ingest import IngestServices +from org.sleuthkit.autopsy.ingest import ModuleDataEvent +from org.sleuthkit.autopsy.coreutils import Logger +from org.sleuthkit.autopsy.casemodule import Case +from org.sleuthkit.datamodel import TskCoreException +from org.sleuthkit.datamodel.Blackboard import BlackboardException +from org.sleuthkit.autopsy.casemodule import NoCurrentCaseException +from org.sleuthkit.datamodel import Account +from org.sleuthkit.datamodel.blackboardutils import CommunicationArtifactsHelper +from java.sql import ResultSet +from java.sql import SQLException +from org.sleuthkit.autopsy.coreutils import AppSQLiteDB + +# Factory that defines the name and details of the module and allows Autopsy +# to create instances of the modules that will do the analysis. +class ContactsDbIngestModuleFactory(IngestModuleFactoryAdapter): + + # TODO - Replace with your modules name + moduleName = "Contacts Db Analyzer" + + def getModuleDisplayName(self): + return self.moduleName + + def getModuleDescription(self): + return "Sample module that parses contacts.db" + + def getModuleVersionNumber(self): + return "1.0" + + def isDataSourceIngestModuleFactory(self): + return True + + def createDataSourceIngestModule(self, ingestOptions): + return ContactsDbIngestModule() + + +# Data Source-level ingest module. One gets created per data source. +class ContactsDbIngestModule(DataSourceIngestModule): + + _logger = Logger.getLogger(ContactsDbIngestModuleFactory.moduleName) + + def log(self, level, msg): + self._logger.logp(level, self.__class__.__name__, inspect.stack()[1][3], msg) + + def __init__(self): + self.context = None + + # Where any setup and configuration is done + # 'context' is an instance of org.sleuthkit.autopsy.ingest.IngestJobContext. + # See: http://sleuthkit.org/autopsy/docs/api-docs/latest/classorg_1_1sleuthkit_1_1autopsy_1_1ingest_1_1_ingest_job_context.html + def startUp(self, context): + self.context = context + + # Where the analysis is done. +<<<<<<< HEAD + # The 'data_source' object being passed in is of type org.sleuthkit.datamodel.Content. + # See: http://www.sleuthkit.org/sleuthkit/docs/jni-docs/4.6.0/interfaceorg_1_1sleuthkit_1_1datamodel_1_1_content.html + # 'progress_bar' is of type org.sleuthkit.autopsy.ingest.DataSourceIngestModuleProgress + # See: http://sleuthkit.org/autopsy/docs/api-docs/4.6.0/classorg_1_1sleuthkit_1_1autopsy_1_1ingest_1_1_data_source_ingest_module_progress.html + def process(self, data_source, progress_bar): +======= + # The 'dataSource' object being passed in is of type org.sleuthkit.datamodel.Content. + # See: http://www.sleuthkit.org/sleuthkit/docs/jni-docs/latest/interfaceorg_1_1sleuthkit_1_1datamodel_1_1_content.html + # 'progressBar' is of type org.sleuthkit.autopsy.ingest.DataSourceIngestModuleProgress + # See: http://sleuthkit.org/autopsy/docs/api-docs/latest/classorg_1_1sleuthkit_1_1autopsy_1_1ingest_1_1_data_source_ingest_module_progress.html + def process(self, dataSource, progressBar): +>>>>>>> db1553ba4e186f1fe50e706a18113f6539779cee + + # we don't know how much work there is yet + progress_bar.switchToIndeterminate() + + # Find files named contacts.db anywhere in the data source. + # TODO - replace with your database name and parent path. + app_databases = AppSQLiteDB.findAppDatabases(data_source, "contacts.db", True, "") + + num_databases = len(app_databases) + progress_bar.switchToDeterminate(num_databases) + databases_processed = 0 + + try: + # Iterate through all the database files returned + for app_database in app_databases: + + # Check if the user pressed cancel while we were busy + if self.context.isJobCancelled(): + return IngestModule.ProcessResult.OK + + self.log(Level.INFO, "Processing file: " + app_database.getDBFile().getName()) + + # Query the contacts table in the database and get all columns. + try: + # TODO - replace with your query + result_set = app_database.runQuery("SELECT * FROM contacts") + except SQLException as e: + self.log(Level.INFO, "Error querying database for contacts table (" + e.getMessage() + ")") + return IngestModule.ProcessResult.OK + + try: + #Get the current case for the CommunicationArtifactsHelper. + current_case = Case.getCurrentCaseThrows() + except NoCurrentCaseException as ex: + self.log(Level.INFO, "Case is closed (" + ex.getMessage() + ")") + return IngestModule.ProcessResult.OK + + # Create an instance of the helper class + # TODO - Replace with your parser name and Account.Type + helper = CommunicationArtifactsHelper(current_case.getSleuthkitCase(), + ContactsDbIngestModuleFactory.moduleName, app_database.getDBFile(), Account.Type.DEVICE) + + # Iterate through each row and create artifacts + while result_set.next(): + try: + # TODO - Replace these calls with your column names and types + # Ex of other types: result_set.getInt("contact_type") or result_set.getLong("datetime") + name = result_set.getString("name") + email = result_set.getString("email") + phone = result_set.getString("phone") + except SQLException as e: + self.log(Level.INFO, "Error getting values from contacts table (" + e.getMessage() + ")") + + helper.addContact(name, phone, "", "", email) + + app_database.close() + databases_processed += 1 + progress_bar.progress(databases_processed) + except TskCoreException as e: + self.log(Level.INFO, "Error inserting or reading from the Sleuthkit case (" + e.getMessage() + ")") + except BlackboardException as e: + self.log(Level.INFO, "Error posting artifact to the Blackboard (" + e.getMessage() + ")") + + # After all databases, post a message to the ingest messages in box. + # TODO - update your module name here + message = IngestMessage.createMessage(IngestMessage.MessageType.DATA, + ContactsDbIngestModuleFactory.moduleName, "Found %d files" % num_databases) + IngestServices.getInstance().postMessage(message) + + return IngestModule.ProcessResult.OK From ca3e9857145ec73cd31a59494e16ecaf366b67d2 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dsmyda" Date: Mon, 25 Jan 2021 16:14:48 -0500 Subject: [PATCH 04/41] Completed the merge --- .../Aug2015DataSourceTutorial/FindContactsDb_v2.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb_v2.py b/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb_v2.py index ff18d74d19..dc5fce60d3 100644 --- a/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb_v2.py +++ b/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb_v2.py @@ -101,19 +101,11 @@ class ContactsDbIngestModule(DataSourceIngestModule): self.context = context # Where the analysis is done. -<<<<<<< HEAD - # The 'data_source' object being passed in is of type org.sleuthkit.datamodel.Content. - # See: http://www.sleuthkit.org/sleuthkit/docs/jni-docs/4.6.0/interfaceorg_1_1sleuthkit_1_1datamodel_1_1_content.html - # 'progress_bar' is of type org.sleuthkit.autopsy.ingest.DataSourceIngestModuleProgress - # See: http://sleuthkit.org/autopsy/docs/api-docs/4.6.0/classorg_1_1sleuthkit_1_1autopsy_1_1ingest_1_1_data_source_ingest_module_progress.html - def process(self, data_source, progress_bar): -======= # The 'dataSource' object being passed in is of type org.sleuthkit.datamodel.Content. # See: http://www.sleuthkit.org/sleuthkit/docs/jni-docs/latest/interfaceorg_1_1sleuthkit_1_1datamodel_1_1_content.html # 'progressBar' is of type org.sleuthkit.autopsy.ingest.DataSourceIngestModuleProgress # See: http://sleuthkit.org/autopsy/docs/api-docs/latest/classorg_1_1sleuthkit_1_1autopsy_1_1ingest_1_1_data_source_ingest_module_progress.html def process(self, dataSource, progressBar): ->>>>>>> db1553ba4e186f1fe50e706a18113f6539779cee # we don't know how much work there is yet progress_bar.switchToIndeterminate() From acf517be9984b1b8522c4606d262fa2edaca1d0a Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dsmyda" Date: Mon, 25 Jan 2021 16:16:51 -0500 Subject: [PATCH 05/41] Changed mode back to 644 --- pythonExamples/Aug2015DataSourceTutorial/FindContactsDb.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 pythonExamples/Aug2015DataSourceTutorial/FindContactsDb.py diff --git a/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb.py b/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb.py old mode 100755 new mode 100644 From 55f2f48d3abeee4356cbd3c6a001c1d1f06a29c6 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dsmyda" Date: Mon, 25 Jan 2021 17:02:17 -0500 Subject: [PATCH 06/41] Retested the template and fixed a bug with variable naming --- .../Aug2015DataSourceTutorial/FindContactsDb_v2.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb_v2.py b/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb_v2.py index dc5fce60d3..f58a156170 100644 --- a/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb_v2.py +++ b/pythonExamples/Aug2015DataSourceTutorial/FindContactsDb_v2.py @@ -101,11 +101,11 @@ class ContactsDbIngestModule(DataSourceIngestModule): self.context = context # Where the analysis is done. - # The 'dataSource' object being passed in is of type org.sleuthkit.datamodel.Content. + # The 'data_source' object being passed in is of type org.sleuthkit.datamodel.Content. # See: http://www.sleuthkit.org/sleuthkit/docs/jni-docs/latest/interfaceorg_1_1sleuthkit_1_1datamodel_1_1_content.html - # 'progressBar' is of type org.sleuthkit.autopsy.ingest.DataSourceIngestModuleProgress + # 'progress_bar' is of type org.sleuthkit.autopsy.ingest.DataSourceIngestModuleProgress # See: http://sleuthkit.org/autopsy/docs/api-docs/latest/classorg_1_1sleuthkit_1_1autopsy_1_1ingest_1_1_data_source_ingest_module_progress.html - def process(self, dataSource, progressBar): + def process(self, data_source, progress_bar): # we don't know how much work there is yet progress_bar.switchToIndeterminate() From b2e452b9b67298a8c33fd5fb05b41c36ee0815e5 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 26 Jan 2021 13:08:06 -0500 Subject: [PATCH 07/41] Inital commit of changes --- .../thunderbirdparser/EmailMessage.java | 14 +++++++- .../MimeJ4MessageParser.java | 33 ++++++++++++------- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/EmailMessage.java b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/EmailMessage.java index 09a6637e6e..5e70a5eae2 100644 --- a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/EmailMessage.java +++ b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/EmailMessage.java @@ -43,7 +43,7 @@ class EmailMessage { private String localPath = ""; private boolean hasAttachment = false; private long sentDate = 0L; - private List attachments = new ArrayList<>(); + private final List attachments = new ArrayList<>(); private long id = -1L; private String messageID = ""; private String inReplyToID = ""; @@ -410,4 +410,16 @@ class EmailMessage { } } + + static class AttachedEmailMessage extends Attachment { + private final EmailMessage emailMessage; + + AttachedEmailMessage(EmailMessage emailMessage) { + this.emailMessage = emailMessage; + } + + EmailMessage getEmailMessage() { + return emailMessage; + } + } } diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/MimeJ4MessageParser.java b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/MimeJ4MessageParser.java index ecefe871f1..036cdaaf8b 100755 --- a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/MimeJ4MessageParser.java +++ b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/MimeJ4MessageParser.java @@ -26,10 +26,10 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; import java.util.logging.Level; -import org.apache.james.mime4j.dom.BinaryBody; import org.apache.james.mime4j.dom.Body; import org.apache.james.mime4j.dom.Entity; import org.apache.james.mime4j.dom.Message; +import org.apache.james.mime4j.dom.MessageWriter; import org.apache.james.mime4j.dom.Multipart; import org.apache.james.mime4j.dom.SingleBody; import org.apache.james.mime4j.dom.TextBody; @@ -39,6 +39,7 @@ import org.apache.james.mime4j.dom.address.MailboxList; import org.apache.james.mime4j.dom.field.ContentDispositionField; import org.apache.james.mime4j.dom.field.ContentTypeField; import org.apache.james.mime4j.message.DefaultMessageBuilder; +import org.apache.james.mime4j.message.DefaultMessageWriter; import org.apache.james.mime4j.stream.Field; import org.apache.james.mime4j.stream.MimeConfig; import org.openide.util.NbBundle; @@ -293,7 +294,7 @@ class MimeJ4MessageParser implements AutoCloseable{ * @param e */ @NbBundle.Messages({"MimeJ4MessageParser.handleAttch.noOpenCase.errMsg=Exception while getting open case."}) - private static void handleAttachment(EmailMessage email, Entity e, long fileID, int index) { + private void handleAttachment(EmailMessage email, Entity e, long fileID, int index) { String outputDirPath; String relModuleOutputPath; try { @@ -322,22 +323,30 @@ class MimeJ4MessageParser implements AutoCloseable{ String outPath = outputDirPath + uniqueFilename; Body body = e.getBody(); - if (body instanceof SingleBody) { + if (body != null) { long fileLength; try (EncodedFileOutputStream fos = new EncodedFileOutputStream(new FileOutputStream(outPath), TskData.EncodingType.XOR1)) { - ((SingleBody) body).writeTo(fos); + + EmailMessage.Attachment attach; + MessageWriter msgWriter = new DefaultMessageWriter(); + + if(body instanceof Message) { + msgWriter.writeMessage((Message)body, fos); + attach = new EmailMessage.AttachedEmailMessage(extractEmail((Message)body, email.getLocalPath(), fileID)); + } else { + msgWriter.writeBody(body, fos); + attach = new EmailMessage.Attachment(); + } fileLength = fos.getBytesWritten(); + attach.setName(filename); + attach.setLocalPath(relModuleOutputPath + uniqueFilename); + attach.setSize(fileLength); + attach.setEncodingType(TskData.EncodingType.XOR1); + email.addAttachment(attach); + } catch (IOException ex) { logger.log(Level.WARNING, "Failed to create file output stream for: " + outPath, ex); //NON-NLS - return; } - - EmailMessage.Attachment attach = new EmailMessage.Attachment(); - attach.setName(filename); - attach.setLocalPath(relModuleOutputPath + uniqueFilename); - attach.setSize(fileLength); - attach.setEncodingType(TskData.EncodingType.XOR1); - email.addAttachment(attach); } From 47d58bfb19236b5697799b1286378e624186d6a7 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Tue, 26 Jan 2021 13:56:33 -0500 Subject: [PATCH 08/41] Using different defaults depending on the platform --- .../sleuthkit/autopsy/core/UserPreferences.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java index 0d3fd0198a..537c25c827 100644 --- a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java +++ b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java @@ -28,6 +28,7 @@ import org.openide.util.NbPreferences; import org.python.icu.util.TimeZone; import org.sleuthkit.autopsy.machinesettings.UserMachinePreferences; import org.sleuthkit.autopsy.coreutils.ModuleSettings; +import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.autopsy.coreutils.TextConverterException; import org.sleuthkit.autopsy.coreutils.Version; import org.sleuthkit.datamodel.CaseDbConnectionInfo; @@ -84,7 +85,8 @@ public final class UserPreferences { private static final boolean DISPLAY_TRANSLATED_NAMES_DEFAULT = true; public static final String EXTERNAL_HEX_EDITOR_PATH = "ExternalHexEditorPath"; public static final String SOLR_MAX_JVM_SIZE = "SolrMaxJVMSize"; - private static final int DEFAULT_SOLR_HEAP_SIZE_MB = 2048; + private static final int DEFAULT_SOLR_HEAP_SIZE_MB_64BIT_PLATFORM = 2048; + private static final int DEFAULT_SOLR_HEAP_SIZE_MB_32BIT_PLATFORM = 512; public static final String RESULTS_TABLE_PAGE_SIZE = "ResultsTablePageSize"; private static final String GEO_TILE_OPTION = "GeolocationTileOption"; private static final String GEO_OSM_TILE_ZIP_PATH = "GeolocationOsmZipPath"; @@ -534,12 +536,17 @@ public final class UserPreferences { } /** - * Get the maximum JVM heap size (in MB) for the embedded Solr server. + * Get the maximum JVM heap size (in MB) for the embedded Solr server. The returned value + * depends on the platform (64bit vs 32bit). * - * @return Saved value or default (2 GB) + * @return Saved value or default (2 GB for 64bit platforms, 512MB for 32bit) */ public static int getMaxSolrVMSize() { - return preferences.getInt(SOLR_MAX_JVM_SIZE, DEFAULT_SOLR_HEAP_SIZE_MB); + if (PlatformUtil.is64BitJVM()) { + return preferences.getInt(SOLR_MAX_JVM_SIZE, DEFAULT_SOLR_HEAP_SIZE_MB_64BIT_PLATFORM); + } else { + return preferences.getInt(SOLR_MAX_JVM_SIZE, DEFAULT_SOLR_HEAP_SIZE_MB_32BIT_PLATFORM); + } } /** From 149fd3a9321dc8ce1c170b94ccb030b571eee0dc Mon Sep 17 00:00:00 2001 From: rcordovano Date: Tue, 26 Jan 2021 16:08:33 -0500 Subject: [PATCH 09/41] Revert to older versions of a couple of files in release-4.18.0 --- .../autopsy/datamodel/FileTypes.java | 23 ------------------- .../hashdatabase/HashDbIngestModule.java | 17 +++----------- 2 files changed, 3 insertions(+), 37 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypes.java b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypes.java index 563f9c8cee..aa1d0a04ec 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypes.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypes.java @@ -20,7 +20,6 @@ package org.sleuthkit.autopsy.datamodel; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.List; import java.util.Observable; import java.util.Observer; @@ -35,8 +34,6 @@ import org.openide.util.Lookup; import org.openide.util.NbBundle; import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.datamodel.AnalysisResult; -import org.sleuthkit.datamodel.AnalysisResultAdded; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.Content; @@ -46,7 +43,6 @@ import org.sleuthkit.datamodel.Directory; import org.sleuthkit.datamodel.File; import org.sleuthkit.datamodel.LayoutFile; import org.sleuthkit.datamodel.LocalFile; -import org.sleuthkit.datamodel.Score; import org.sleuthkit.datamodel.SlackFile; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.SleuthkitItemVisitor; @@ -389,11 +385,6 @@ public final class FileTypes implements AutopsyVisitableItem { return content.newArtifact(artifactTypeID); } - @Override - public AnalysisResultAdded newAnalysisResult(BlackboardArtifact.Type artifactType, Score score, String conclusion, String configuration, String justification, Collection attributesList) throws TskCoreException { - return content.newAnalysisResult(artifactType, score, conclusion, configuration, justification, attributesList); - } - @Override public BlackboardArtifact newArtifact(BlackboardArtifact.ARTIFACT_TYPE type) throws TskCoreException { return content.newArtifact(type); @@ -434,15 +425,6 @@ public final class FileTypes implements AutopsyVisitableItem { return content.getAllArtifacts(); } - @Override - public List getAllAnalysisResults() throws TskCoreException { - return content.getAllAnalysisResults(); - } - - public List getAnalysisResults(BlackboardArtifact.Type artifactType) throws TskCoreException { - return content.getAnalysisResults(artifactType); - } - @Override public Set getHashSetNames() throws TskCoreException { return content.getHashSetNames(); @@ -467,10 +449,5 @@ public final class FileTypes implements AutopsyVisitableItem { public long getAllArtifactsCount() throws TskCoreException { return content.getAllArtifactsCount(); } - - @Override - public Score getAggregateScore() throws TskCoreException { - return content.getAggregateScore(); - } } } diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbIngestModule.java index 74e019d8cb..19b9ff28b7 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbIngestModule.java @@ -41,8 +41,6 @@ import org.sleuthkit.autopsy.ingest.IngestModuleReferenceCounter; import org.sleuthkit.autopsy.ingest.IngestServices; import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDb; import org.sleuthkit.datamodel.AbstractFile; -import org.sleuthkit.datamodel.AnalysisResult; -import org.sleuthkit.datamodel.AnalysisResultAdded; import org.sleuthkit.datamodel.Blackboard; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; @@ -50,7 +48,6 @@ import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE; import org.sleuthkit.datamodel.HashHitInfo; import org.sleuthkit.datamodel.HashUtility; -import org.sleuthkit.datamodel.Score; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; @@ -519,7 +516,7 @@ public class HashDbIngestModule implements FileIngestModule { private void postHashSetHitToBlackboard(AbstractFile abstractFile, String md5Hash, String hashSetName, String comment, boolean showInboxMessage) { try { String moduleName = HashLookupModuleFactory.getModuleName(); - //BlackboardArtifact badFile = abstractFile.newArtifact(ARTIFACT_TYPE.TSK_HASHSET_HIT); + BlackboardArtifact badFile = abstractFile.newArtifact(ARTIFACT_TYPE.TSK_HASHSET_HIT); Collection attributes = new ArrayList<>(); //TODO Revisit usage of deprecated constructor as per TSK-583 //BlackboardAttribute att2 = new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID(), MODULE_NAME, "Known Bad", hashSetName); @@ -527,22 +524,14 @@ public class HashDbIngestModule implements FileIngestModule { attributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_HASH_MD5, moduleName, md5Hash)); attributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_COMMENT, moduleName, comment)); - SleuthkitCase.CaseDbTransaction trans = this.skCase.beginTransaction(); - - AnalysisResultAdded resultAdded = blackboard.newAnalysisResult(new BlackboardArtifact.Type(ARTIFACT_TYPE.TSK_HASHSET_HIT), abstractFile.getId(), abstractFile.getDataSourceObjectId(), new Score(Score.Significance.MEDIUM, Score.Confidence.HIGH), moduleName, comment, hashSetName, attributes, trans); - AnalysisResult badFile = resultAdded.getAnalysisResult(); - trans.commit(); + badFile.addAttributes(attributes); try { /* * post the artifact which will index the artifact for keyword * search, and fire an event to notify UI of this new artifact */ - - - blackboard.postArtifact(badFile, moduleName); - } catch (Blackboard.BlackboardException ex) { logger.log(Level.SEVERE, "Unable to index blackboard artifact " + badFile.getArtifactID(), ex); //NON-NLS MessageNotifyUtil.Notify.error( @@ -585,7 +574,7 @@ public class HashDbIngestModule implements FileIngestModule { abstractFile.getName() + md5Hash, badFile)); } - } catch (TskException | Blackboard.BlackboardException ex) { + } catch (TskException ex) { logger.log(Level.WARNING, "Error creating blackboard artifact", ex); //NON-NLS } } From 4974955ffa37f3a4d53587cd6cdb6960d32ee7ed Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Tue, 26 Jan 2021 16:08:33 -0500 Subject: [PATCH 10/41] Modified code to support nested email messages --- .../ThunderbirdMboxFileIngestModule.java | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java index f97bde95fb..bec7347055 100644 --- a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java +++ b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java @@ -48,6 +48,7 @@ import org.sleuthkit.autopsy.ingest.IngestModule.ProcessResult; import org.sleuthkit.autopsy.ingest.IngestMonitor; import org.sleuthkit.autopsy.ingest.IngestServices; import org.sleuthkit.autopsy.ingest.ModuleContentEvent; +import org.sleuthkit.autopsy.thunderbirdparser.EmailMessage.AttachedEmailMessage; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.Account; import org.sleuthkit.datamodel.AccountFileInstance; @@ -450,12 +451,15 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { List derivedFiles = new ArrayList<>(); AccountFileInstanceCache accountFileInstanceCache = new AccountFileInstanceCache(abstractFile, currentCase); - BlackboardArtifact msgArtifact = addEmailArtifact(message, abstractFile, accountFileInstanceCache); +// BlackboardArtifact msgArtifact = addEmailArtifact(message, abstractFile, accountFileInstanceCache); + + createEmailArtifact(message, abstractFile, accountFileInstanceCache, derivedFiles); + accountFileInstanceCache.clear(); - if ((msgArtifact != null) && (message.hasAttachment())) { - derivedFiles.addAll(handleAttachments(message.getAttachments(), abstractFile, msgArtifact)); - } +// if ((msgArtifact != null) && (message.hasAttachment())) { +// derivedFiles.addAll(handleAttachments(message.getAttachments(), abstractFile, msgArtifact)); +// } if (derivedFiles.isEmpty() == false) { for (AbstractFile derived : derivedFiles) { @@ -564,11 +568,13 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { } } - BlackboardArtifact msgArtifact = addEmailArtifact(current, abstractFile, accountFileInstanceCache); - - if ((msgArtifact != null) && (current.hasAttachment())) { - derivedFiles.addAll(handleAttachments(current.getAttachments(), abstractFile, msgArtifact )); - } +// BlackboardArtifact msgArtifact = addEmailArtifact(current, abstractFile, accountFileInstanceCache); +// +// if ((msgArtifact != null) && (current.hasAttachment())) { +// derivedFiles.addAll(handleAttachments(current.getAttachments(), abstractFile, msgArtifact )); +// } + + createEmailArtifact(current, abstractFile, accountFileInstanceCache, derivedFiles); } if (derivedFiles.isEmpty() == false) { @@ -581,6 +587,21 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { } context.addFilesToJob(derivedFiles); } + + void createEmailArtifact(EmailMessage email, AbstractFile abstractFile, AccountFileInstanceCache accountFileInstanceCache, List derivedFiles) { + BlackboardArtifact msgArtifact = addEmailArtifact(email, abstractFile, accountFileInstanceCache); + + if ((msgArtifact != null) && (email.hasAttachment())) { + derivedFiles.addAll(handleAttachments(email.getAttachments(), abstractFile, msgArtifact )); + + for (EmailMessage.Attachment attach : email.getAttachments()) { + if(attach instanceof AttachedEmailMessage) { + createEmailArtifact(((AttachedEmailMessage) attach).getEmailMessage(), abstractFile, accountFileInstanceCache, derivedFiles); + } + } + } + } + /** * Add the given attachments as derived files and reschedule them for * ingest. From 2103ce95f3a2f925024f9ddb10f1ccf1d248a749 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Wed, 27 Jan 2021 17:13:28 -0500 Subject: [PATCH 11/41] Cleaned up EmailParser code --- .../MimeJ4MessageParser.java | 5 +- .../ThunderbirdMboxFileIngestModule.java | 338 +++++++++--------- 2 files changed, 162 insertions(+), 181 deletions(-) diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/MimeJ4MessageParser.java b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/MimeJ4MessageParser.java index 036cdaaf8b..ba5b24842f 100755 --- a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/MimeJ4MessageParser.java +++ b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/MimeJ4MessageParser.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2019 Basis Technology Corp. + * Copyright 2019-2020 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -31,7 +31,6 @@ import org.apache.james.mime4j.dom.Entity; import org.apache.james.mime4j.dom.Message; import org.apache.james.mime4j.dom.MessageWriter; import org.apache.james.mime4j.dom.Multipart; -import org.apache.james.mime4j.dom.SingleBody; import org.apache.james.mime4j.dom.TextBody; import org.apache.james.mime4j.dom.address.AddressList; import org.apache.james.mime4j.dom.address.Mailbox; @@ -348,8 +347,6 @@ class MimeJ4MessageParser implements AutoCloseable{ logger.log(Level.WARNING, "Failed to create file output stream for: " + outPath, ex); //NON-NLS } } - - } /** diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java index bec7347055..1c165ef535 100644 --- a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java +++ b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java @@ -73,13 +73,14 @@ import org.sleuthkit.datamodel.blackboardutils.attributes.MessageAttachments.Fil * structure and metadata. */ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { + private static final Logger logger = Logger.getLogger(ThunderbirdMboxFileIngestModule.class.getName()); private final IngestServices services = IngestServices.getInstance(); private FileManager fileManager; private IngestJobContext context; private Blackboard blackboard; private CommunicationArtifactsHelper communicationArtifactsHelper; - + private static final int MBOX_SIZE_TO_SPLIT = 1048576000; private Case currentCase; @@ -90,7 +91,7 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { } @Override - @Messages ({"ThunderbirdMboxFileIngestModule.noOpenCase.errMsg=Exception while getting open case."}) + @Messages({"ThunderbirdMboxFileIngestModule.noOpenCase.errMsg=Exception while getting open case."}) public void startUp(IngestJobContext context) throws IngestModuleException { this.context = context; try { @@ -113,8 +114,8 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { } //skip unalloc - if ((abstractFile.getType().equals(TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS)) || - (abstractFile.getType().equals(TskData.TSK_DB_FILES_TYPE_ENUM.SLACK))) { + if ((abstractFile.getType().equals(TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS)) + || (abstractFile.getType().equals(TskData.TSK_DB_FILES_TYPE_ENUM.SLACK))) { return ProcessResult.OK; } @@ -125,7 +126,7 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { // check its signature boolean isMbox = false; boolean isEMLFile = false; - + try { byte[] t = new byte[64]; if (abstractFile.getSize() > 64) { @@ -138,15 +139,15 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { } catch (TskException ex) { logger.log(Level.WARNING, null, ex); } - + boolean isPstFile = PstParser.isPstFile(abstractFile); boolean isVcardFile = VcardParser.isVcardFile(abstractFile); - + if (context.fileIngestIsCancelled()) { return ProcessResult.OK; } - - if (isMbox || isEMLFile || isPstFile || isVcardFile ) { + + if (isMbox || isEMLFile || isPstFile || isVcardFile) { try { communicationArtifactsHelper = new CommunicationArtifactsHelper(currentCase.getSleuthkitCase(), EmailParserModuleFactory.getModuleName(), abstractFile, Account.Type.EMAIL); @@ -159,7 +160,7 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { if (isMbox) { return processMBox(abstractFile); } - + if (isEMLFile) { return processEMLFile(abstractFile); } @@ -167,11 +168,11 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { if (isPstFile) { return processPst(abstractFile); } - + if (isVcardFile) { return processVcard(abstractFile); } - + return ProcessResult.OK; } @@ -187,7 +188,7 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { String fileName; try { fileName = getTempPath() + File.separator + abstractFile.getName() - + "-" + String.valueOf(abstractFile.getId()); + + "-" + String.valueOf(abstractFile.getId()); } catch (NoCurrentCaseException ex) { logger.log(Level.SEVERE, "Exception while getting open case.", ex); //NON-NLS return ProcessResult.ERROR; @@ -204,8 +205,8 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { services.postMessage(msg); return ProcessResult.OK; } - - try (PstParser parser = new PstParser(services)){ + + try (PstParser parser = new PstParser(services)) { try { ContentUtils.writeToFile(abstractFile, file, context::fileIngestIsCancelled); } catch (IOException ex) { @@ -215,7 +216,7 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { PstParser.ParseResult result = parser.open(file, abstractFile.getId()); - switch( result) { + switch (result) { case OK: Iterator pstMsgIterator = parser.getEmailMessageIterator(); if (pstMsgIterator != null) { @@ -239,20 +240,20 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { // encrypted pst: Add encrypted file artifact try { - BlackboardArtifact artifact = abstractFile.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_DETECTED); - artifact.addAttribute(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_NAME, EmailParserModuleFactory.getModuleName(), NbBundle.getMessage(this.getClass(), "ThunderbirdMboxFileIngestModule.encryptionFileLevel"))); + BlackboardArtifact artifact = abstractFile.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_DETECTED); + artifact.addAttribute(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_NAME, EmailParserModuleFactory.getModuleName(), NbBundle.getMessage(this.getClass(), "ThunderbirdMboxFileIngestModule.encryptionFileLevel"))); - try { - // index the artifact for keyword search - blackboard.postArtifact(artifact, EmailParserModuleFactory.getModuleName()); - } catch (Blackboard.BlackboardException ex) { - MessageNotifyUtil.Notify.error(Bundle.ThunderbirdMboxFileIngestModule_processPst_indexError_message(), artifact.getDisplayName()); - logger.log(Level.SEVERE, "Unable to index blackboard artifact " + artifact.getArtifactID(), ex); //NON-NLS - } - } catch (TskCoreException ex) { - logger.log(Level.INFO, "Failed to add encryption attribute to file: {0}", abstractFile.getName()); //NON-NLS + try { + // index the artifact for keyword search + blackboard.postArtifact(artifact, EmailParserModuleFactory.getModuleName()); + } catch (Blackboard.BlackboardException ex) { + MessageNotifyUtil.Notify.error(Bundle.ThunderbirdMboxFileIngestModule_processPst_indexError_message(), artifact.getDisplayName()); + logger.log(Level.SEVERE, "Unable to index blackboard artifact " + artifact.getArtifactID(), ex); //NON-NLS } - break; + } catch (TskCoreException ex) { + logger.log(Level.INFO, "Failed to add encryption attribute to file: {0}", abstractFile.getName()); //NON-NLS + } + break; default: // parsing error: log message postErrorMessage( @@ -263,8 +264,8 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { logger.log(Level.INFO, "PSTParser failed to parse {0}", abstractFile.getName()); //NON-NLS return ProcessResult.ERROR; } - } catch(Exception ex) { - logger.log(Level.WARNING, String.format("Failed to close temp pst file %s", file.getAbsolutePath())); + } catch (Exception ex) { + logger.log(Level.WARNING, String.format("Failed to close temp pst file %s", file.getAbsolutePath())); } finally { file.delete(); } @@ -295,7 +296,7 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { String fileName; try { fileName = getTempPath() + File.separator + abstractFile.getName() - + "-" + String.valueOf(abstractFile.getId()); + + "-" + String.valueOf(abstractFile.getId()); } catch (NoCurrentCaseException ex) { logger.log(Level.SEVERE, "Exception while getting open case.", ex); //NON-NLS return ProcessResult.ERROR; @@ -314,7 +315,7 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { } if (abstractFile.getSize() < MBOX_SIZE_TO_SPLIT) { - + try { ContentUtils.writeToFile(abstractFile, file, context::fileIngestIsCancelled); } catch (IOException ex) { @@ -322,25 +323,25 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { return ProcessResult.OK; } - try{ + try { processMboxFile(file, abstractFile, emailFolder); if (context.fileIngestIsCancelled()) { return ProcessResult.OK; } - }finally { + } finally { file.delete(); } } else { - List mboxSplitOffsets = new ArrayList<>(); - try{ + List mboxSplitOffsets = new ArrayList<>(); + try { mboxSplitOffsets = findMboxSplitOffset(abstractFile, file); } catch (IOException ex) { logger.log(Level.WARNING, String.format("Failed finding split offsets for mbox file {0}.", fileName), ex); //NON-NLS return ProcessResult.OK; } - long startingOffset = 0; + long startingOffset = 0; for (Long mboxSplitOffset : mboxSplitOffsets) { File splitFile = new File(fileName + "-" + mboxSplitOffset); try { @@ -349,55 +350,54 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { logger.log(Level.WARNING, "Failed writing split mbox file to disk.", ex); //NON-NLS return ProcessResult.OK; } - try{ + try { processMboxFile(splitFile, abstractFile, emailFolder); - startingOffset = mboxSplitOffset; + startingOffset = mboxSplitOffset; } finally { splitFile.delete(); } - + if (context.fileIngestIsCancelled()) { return ProcessResult.OK; } } - } - + } + return ProcessResult.OK; } - + private List findMboxSplitOffset(AbstractFile abstractFile, File file) throws IOException { - + List mboxSplitOffset = new ArrayList<>(); - + byte[] buffer = new byte[7]; ReadContentInputStream in = new ReadContentInputStream(abstractFile); - in.skip(MBOX_SIZE_TO_SPLIT); + in.skip(MBOX_SIZE_TO_SPLIT); int len = in.read(buffer); while (len != -1) { len = in.read(buffer); - if (buffer[0] == 13 && buffer[1] == 10 && buffer[2] == 70 && buffer[3] == 114 && - buffer[4] == 111 && buffer[5] == 109 && buffer[6] == 32) { - mboxSplitOffset.add(in.getCurPosition() - 5 ); - in.skip(MBOX_SIZE_TO_SPLIT); + if (buffer[0] == 13 && buffer[1] == 10 && buffer[2] == 70 && buffer[3] == 114 + && buffer[4] == 111 && buffer[5] == 109 && buffer[6] == 32) { + mboxSplitOffset.add(in.getCurPosition() - 5); + in.skip(MBOX_SIZE_TO_SPLIT); } } - + return mboxSplitOffset; - + } - - + private void processMboxFile(File file, AbstractFile abstractFile, String emailFolder) { - - try(MboxParser emailIterator = MboxParser.getEmailIterator( emailFolder, file, abstractFile.getId())) { + + try (MboxParser emailIterator = MboxParser.getEmailIterator(emailFolder, file, abstractFile.getId())) { List emails = new ArrayList<>(); - if(emailIterator != null) { - while(emailIterator.hasNext()) { + if (emailIterator != null) { + while (emailIterator.hasNext()) { if (context.fileIngestIsCancelled()) { return; } EmailMessage emailMessage = emailIterator.next(); - if(emailMessage != null) { + if (emailMessage != null) { emails.add(emailMessage); } } @@ -409,13 +409,13 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { abstractFile.getName()), errors); } } - processEmails(emails, MboxParser.getEmailIterator( emailFolder, file, abstractFile.getId()), abstractFile); - } catch(Exception ex) { + processEmails(emails, MboxParser.getEmailIterator(emailFolder, file, abstractFile.getId()), abstractFile); + } catch (Exception ex) { logger.log(Level.WARNING, String.format("Failed to close mbox temp file %s", file.getAbsolutePath())); } } - + /** * Parse and extract data from a vCard file. * @@ -439,8 +439,8 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { } return ProcessResult.OK; } - - private ProcessResult processEMLFile(AbstractFile abstractFile) { + + private ProcessResult processEMLFile(AbstractFile abstractFile) { try { EmailMessage message = EMLParser.parse(abstractFile); @@ -451,16 +451,9 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { List derivedFiles = new ArrayList<>(); AccountFileInstanceCache accountFileInstanceCache = new AccountFileInstanceCache(abstractFile, currentCase); -// BlackboardArtifact msgArtifact = addEmailArtifact(message, abstractFile, accountFileInstanceCache); - createEmailArtifact(message, abstractFile, accountFileInstanceCache, derivedFiles); - accountFileInstanceCache.clear(); -// if ((msgArtifact != null) && (message.hasAttachment())) { -// derivedFiles.addAll(handleAttachments(message.getAttachments(), abstractFile, msgArtifact)); -// } - if (derivedFiles.isEmpty() == false) { for (AbstractFile derived : derivedFiles) { services.fireModuleContentEvent(new ModuleContentEvent(derived)); @@ -497,7 +490,7 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { /** * Get a module output folder. - * + * * @throws NoCurrentCaseException if there is no open case. * * @return the module output folder @@ -531,49 +524,42 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { * @param fullMessageIterator * @param abstractFile */ - private void processEmails(List partialEmailsForThreading, Iterator fullMessageIterator, + private void processEmails(List partialEmailsForThreading, Iterator fullMessageIterator, AbstractFile abstractFile) { - + // Create cache for accounts AccountFileInstanceCache accountFileInstanceCache = new AccountFileInstanceCache(abstractFile, currentCase); - + // Putting try/catch around this to catch any exception and still allow // the creation of the artifacts to continue. - try{ + try { EmailMessageThreader.threadMessages(partialEmailsForThreading); - } catch(Exception ex) { + } catch (Exception ex) { logger.log(Level.WARNING, String.format("Exception thrown parsing emails from %s", abstractFile.getName()), ex); } - + List derivedFiles = new ArrayList<>(); int msgCnt = 0; - while(fullMessageIterator.hasNext()) { + while (fullMessageIterator.hasNext()) { if (context.fileIngestIsCancelled()) { return; } - + EmailMessage current = fullMessageIterator.next(); - - if(current == null) { + + if (current == null) { continue; } - if(partialEmailsForThreading.size() > msgCnt) { + if (partialEmailsForThreading.size() > msgCnt) { EmailMessage threaded = partialEmailsForThreading.get(msgCnt++); - - if(threaded.getMessageID().equals(current.getMessageID()) && - threaded.getSubject().equals(current.getSubject())) { + + if (threaded.getMessageID().equals(current.getMessageID()) + && threaded.getSubject().equals(current.getSubject())) { current.setMessageThreadID(threaded.getMessageThreadID()); } } - -// BlackboardArtifact msgArtifact = addEmailArtifact(current, abstractFile, accountFileInstanceCache); -// -// if ((msgArtifact != null) && (current.hasAttachment())) { -// derivedFiles.addAll(handleAttachments(current.getAttachments(), abstractFile, msgArtifact )); -// } - createEmailArtifact(current, abstractFile, accountFileInstanceCache, derivedFiles); } @@ -587,21 +573,21 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { } context.addFilesToJob(derivedFiles); } - + void createEmailArtifact(EmailMessage email, AbstractFile abstractFile, AccountFileInstanceCache accountFileInstanceCache, List derivedFiles) { BlackboardArtifact msgArtifact = addEmailArtifact(email, abstractFile, accountFileInstanceCache); - - if ((msgArtifact != null) && (email.hasAttachment())) { - derivedFiles.addAll(handleAttachments(email.getAttachments(), abstractFile, msgArtifact )); - + + if ((msgArtifact != null) && (email.hasAttachment())) { + derivedFiles.addAll(handleAttachments(email.getAttachments(), abstractFile, msgArtifact)); + for (EmailMessage.Attachment attach : email.getAttachments()) { - if(attach instanceof AttachedEmailMessage) { + if (attach instanceof AttachedEmailMessage) { createEmailArtifact(((AttachedEmailMessage) attach).getEmailMessage(), abstractFile, accountFileInstanceCache, derivedFiles); } } } } - + /** * Add the given attachments as derived files and reschedule them for * ingest. @@ -613,8 +599,8 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { * @return List of attachments */ @NbBundle.Messages({ - "ThunderbirdMboxFileIngestModule.handleAttch.addAttachmentsErrorMsg=Failed to add attachments to email message." -}) + "ThunderbirdMboxFileIngestModule.handleAttch.addAttachmentsErrorMsg=Failed to add attachments to email message." + }) private List handleAttachments(List attachments, AbstractFile abstractFile, BlackboardArtifact messageArtifact) { List files = new ArrayList<>(); List fileAttachments = new ArrayList<>(); @@ -632,11 +618,11 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { DerivedFile df = fileManager.addDerivedFile(filename, relPath, size, cTime, crTime, aTime, mTime, true, abstractFile, "", EmailParserModuleFactory.getModuleName(), EmailParserModuleFactory.getModuleVersion(), "", encodingType); - + associateAttachmentWithMesssge(messageArtifact, df); - + files.add(df); - + fileAttachments.add(new FileAttachment(df)); } catch (TskCoreException ex) { postErrorMessage( @@ -647,17 +633,16 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { logger.log(Level.INFO, "", ex); } } - - + try { communicationArtifactsHelper.addAttachments(messageArtifact, new MessageAttachments(fileAttachments, Collections.emptyList())); } catch (TskCoreException ex) { - postErrorMessage( - NbBundle.getMessage(this.getClass(), "ThunderbirdMboxFileIngestModule.handleAttch.addAttachmentsErrorMsg"), - ""); - logger.log(Level.INFO, "Failed to add attachments to email message.", ex); + postErrorMessage( + NbBundle.getMessage(this.getClass(), "ThunderbirdMboxFileIngestModule.handleAttch.addAttachmentsErrorMsg"), + ""); + logger.log(Level.INFO, "Failed to add attachments to email message.", ex); } - + return files; } @@ -673,32 +658,33 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { bba.addAttributes(attributes); //write out to bb return bba; } - + /** - * Finds and returns a set of unique email addresses found in the input string + * Finds and returns a set of unique email addresses found in the input + * string * * @param input - input string, like the To/CC line from an email header - * + * * @return Set: set of email addresses found in the input string */ private Set findEmailAddresess(String input) { Pattern p = Pattern.compile("\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b", - Pattern.CASE_INSENSITIVE); + Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(input); Set emailAddresses = new HashSet<>(); while (m.find()) { - emailAddresses.add( m.group()); + emailAddresses.add(m.group()); } return emailAddresses; } - + /** * Add a blackboard artifact for the given e-mail message. * - * @param email The e-mail message. - * @param abstractFile The associated file. - * @param accountFileInstanceCache The current cache of account instances. - * + * @param email The e-mail message. + * @param abstractFile The associated file. + * @param accountFileInstanceCache The current cache of account instances. + * * @return The generated e-mail message artifact. */ @Messages({"ThunderbirdMboxFileIngestModule.addArtifact.indexError.message=Failed to index email message detected artifact for keyword search."}) @@ -722,35 +708,33 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { List senderAddressList = new ArrayList<>(); String senderAddress; senderAddressList.addAll(findEmailAddresess(from)); - + if (context.fileIngestIsCancelled()) { return null; } - + AccountFileInstance senderAccountInstance = null; if (senderAddressList.size() == 1) { senderAddress = senderAddressList.get(0); try { senderAccountInstance = accountFileInstanceCache.getAccountInstance(senderAddress); + } catch (TskCoreException ex) { + logger.log(Level.WARNING, "Failed to create account for email address " + senderAddress, ex); //NON-NLS } - catch(TskCoreException ex) { - logger.log(Level.WARNING, "Failed to create account for email address " + senderAddress, ex); //NON-NLS - } + } else { + logger.log(Level.WARNING, "Failed to find sender address, from = {0}", from); //NON-NLS } - else { - logger.log(Level.WARNING, "Failed to find sender address, from = {0}", from); //NON-NLS - } - + if (context.fileIngestIsCancelled()) { return null; } - + List recipientAddresses = new ArrayList<>(); recipientAddresses.addAll(findEmailAddresess(to)); recipientAddresses.addAll(findEmailAddresess(cc)); recipientAddresses.addAll(findEmailAddresess(bcc)); - + List recipientAccountInstances = new ArrayList<>(); for (String addr : recipientAddresses) { if (context.fileIngestIsCancelled()) { @@ -759,56 +743,54 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { try { AccountFileInstance recipientAccountInstance = accountFileInstanceCache.getAccountInstance(addr); recipientAccountInstances.add(recipientAccountInstance); - } - catch(TskCoreException ex) { + } catch (TskCoreException ex) { logger.log(Level.WARNING, "Failed to create account for email address " + addr, ex); //NON-NLS } } - + addArtifactAttribute(headers, ATTRIBUTE_TYPE.TSK_HEADERS, bbattributes); addArtifactAttribute(from, ATTRIBUTE_TYPE.TSK_EMAIL_FROM, bbattributes); addArtifactAttribute(to, ATTRIBUTE_TYPE.TSK_EMAIL_TO, bbattributes); addArtifactAttribute(subject, ATTRIBUTE_TYPE.TSK_SUBJECT, bbattributes); - + addArtifactAttribute(dateL, ATTRIBUTE_TYPE.TSK_DATETIME_RCVD, bbattributes); addArtifactAttribute(dateL, ATTRIBUTE_TYPE.TSK_DATETIME_SENT, bbattributes); - + addArtifactAttribute(body, ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_PLAIN, bbattributes); - - addArtifactAttribute(((id < 0L) ? NbBundle.getMessage(this.getClass(), "ThunderbirdMboxFileIngestModule.notAvail") : String.valueOf(id)), + + addArtifactAttribute(((id < 0L) ? NbBundle.getMessage(this.getClass(), "ThunderbirdMboxFileIngestModule.notAvail") : String.valueOf(id)), ATTRIBUTE_TYPE.TSK_MSG_ID, bbattributes); - - addArtifactAttribute(((localPath.isEmpty() == false) ? localPath : ""), + + addArtifactAttribute(((localPath.isEmpty() == false) ? localPath : ""), ATTRIBUTE_TYPE.TSK_PATH, bbattributes); - + addArtifactAttribute(cc, ATTRIBUTE_TYPE.TSK_EMAIL_CC, bbattributes); addArtifactAttribute(bodyHTML, ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_HTML, bbattributes); addArtifactAttribute(rtf, ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_RTF, bbattributes); addArtifactAttribute(threadID, ATTRIBUTE_TYPE.TSK_THREAD_ID, bbattributes); - - + try { if (context.fileIngestIsCancelled()) { return null; } - + bbart = abstractFile.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG); bbart.addAttributes(bbattributes); if (context.fileIngestIsCancelled()) { return null; } - + // Add account relationships - currentCase.getSleuthkitCase().getCommunicationsManager().addRelationships(senderAccountInstance, recipientAccountInstances, bbart,Relationship.Type.MESSAGE, dateL); + currentCase.getSleuthkitCase().getCommunicationsManager().addRelationships(senderAccountInstance, recipientAccountInstances, bbart, Relationship.Type.MESSAGE, dateL); if (context.fileIngestIsCancelled()) { return null; } - + try { // index the artifact for keyword search - blackboard.postArtifact(bbart, EmailParserModuleFactory.getModuleName()); + blackboard.postArtifact(bbart, EmailParserModuleFactory.getModuleName()); } catch (Blackboard.BlackboardException ex) { logger.log(Level.SEVERE, "Unable to index blackboard artifact " + bbart.getArtifactID(), ex); //NON-NLS MessageNotifyUtil.Notify.error(Bundle.ThunderbirdMboxFileIngestModule_addArtifact_indexError_message(), bbart.getDisplayName()); @@ -819,11 +801,11 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { return bbart; } - + /** * Add an attribute of a specified type to a supplied Collection. - * - * @param stringVal The attribute value. + * + * @param stringVal The attribute value. * @param attrType The type of attribute to be added. * @param bbattributes The Collection to which the attribute will be added. */ @@ -835,7 +817,7 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { /** * Add an attribute of a specified type to a supplied Collection. - * + * * @param stringVal The attribute value. * @param attrType The type of attribute to be added. * @param bbattributes The Collection to which the attribute will be added. @@ -845,10 +827,10 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { bbattributes.add(new BlackboardAttribute(attrType, EmailParserModuleFactory.getModuleName(), stringVal)); } } - + /** * Add an attribute of a specified type to a supplied Collection. - * + * * @param longVal The attribute value. * @param attrType The type of attribute to be added. * @param bbattributes The Collection to which the attribute will be added. @@ -858,49 +840,51 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { bbattributes.add(new BlackboardAttribute(attrType, EmailParserModuleFactory.getModuleName(), longVal)); } } - + /** - * Cache for storing AccountFileInstance. - * The idea is that emails will be used multiple times in a file and - * we shouldn't do a database lookup each time. + * Cache for storing AccountFileInstance. The idea is that emails will be + * used multiple times in a file and we shouldn't do a database lookup each + * time. */ static private class AccountFileInstanceCache { + private final Map cacheMap; private final AbstractFile file; private final Case currentCase; - + /** * Create a new cache. Caches are linked to a specific file. + * * @param file - * @param currentCase + * @param currentCase */ AccountFileInstanceCache(AbstractFile file, Case currentCase) { - cacheMap= new HashMap<>(); + cacheMap = new HashMap<>(); this.file = file; this.currentCase = currentCase; } - + /** * Get the account file instance from the cache or the database. - * + * * @param email The email for this account. - * + * * @return The corresponding AccountFileInstance - * - * @throws TskCoreException + * + * @throws TskCoreException */ AccountFileInstance getAccountInstance(String email) throws TskCoreException { if (cacheMap.containsKey(email)) { return cacheMap.get(email); } - - AccountFileInstance accountInstance = - currentCase.getSleuthkitCase().getCommunicationsManager().createAccountFileInstance(Account.Type.EMAIL, email, - EmailParserModuleFactory.getModuleName(), file); + + AccountFileInstance accountInstance + = currentCase.getSleuthkitCase().getCommunicationsManager().createAccountFileInstance(Account.Type.EMAIL, email, + EmailParserModuleFactory.getModuleName(), file); cacheMap.put(email, accountInstance); return accountInstance; } - + /** * Clears the cache. */ @@ -908,10 +892,10 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { cacheMap.clear(); } } - + /** * Post an error message for the user. - * + * * @param subj The error subject. * @param details The error details. */ @@ -922,7 +906,7 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { /** * Get the IngestServices object. - * + * * @return The IngestServices object. */ IngestServices getServices() { @@ -933,5 +917,5 @@ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { public void shutDown() { // nothing to shut down } - + } From 5d6e1605123370a9aa764f62f8f649d4404c8cc4 Mon Sep 17 00:00:00 2001 From: apriestman Date: Fri, 29 Jan 2021 09:26:24 -0500 Subject: [PATCH 12/41] Add section on adjusting font size. --- docs/doxygen-user/troubleshooting.dox | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/docs/doxygen-user/troubleshooting.dox b/docs/doxygen-user/troubleshooting.dox index d44f25efba..b5506456cb 100644 --- a/docs/doxygen-user/troubleshooting.dox +++ b/docs/doxygen-user/troubleshooting.dox @@ -16,7 +16,25 @@ If you are experiencing an error, we encourage you to post on the forum (https:/
  • If there were any errors in the \ref troubleshooting_logs "logs" -\section troubleshooting_user_folder Deleting the Autopsy User Folder +\section troubleshooting_specific_issues Specific Issues + +\subsection troubleshooting_fond_size Font Size Too Small in Windows + +Make the following changes if the application is hard to navigate in High DPI systems: + +
      +
    1. Right click on the application icon on your Desktop, Start Menu, etc. +
    2. Choose Properties +
    3. Go to Compatibility tab +
    4. Click "Change high DPI settings" button +
    5. Select "Override high DPI scaling behavior" +
    6. Change the "Scaling performed by:" drop down box to "System" +
    7. Restart Autopsy +
    + +\section troubleshooting_general General Troubleshooting + +\subsection troubleshooting_user_folder Deleting the Autopsy User Folder If Autopsy starts behaving strangely, stops loading entirely, or menu items go missing, you probably need to delete your user folder. Doing so essenitally gives you a fresh installation. On Windows the user folder is located in "C:\Users\(user name)\AppData\Roaming\autopsy". @@ -30,7 +48,7 @@ Note that if you delete this folder you will lose all your Autopsy settings incl Alternately, you could copy the fresh user folder somewhere, move your old version back, and replace folders until it works again. -\section troubleshooting_logs Viewing the Logs +\subsection troubleshooting_logs Viewing the Logs The logs are generally the most helpful in figuring out why an error is occurring. There are two sets of logs - the system logs and the case logs. There is an option in the UI to open the log folder: @@ -70,7 +88,7 @@ Caused by: java.sql.SQLException: ResultSet closed If the error message doesn't help you solve the problem yourself, please post to the forum including the full stack trace (if available). -\section troubleshooting_stack Creating a Thread Dump +\subsection troubleshooting_stack Creating a Thread Dump You can also generate a thread dump of the current state. This is useful if an ingest module or other process seems to be stuck. To generate a thread dump, go to "Help" then "Thread Dump" in the UI. From 25ebca78b713483fb2c8bb8a515f0b01bebe78a3 Mon Sep 17 00:00:00 2001 From: apriestman Date: Fri, 29 Jan 2021 09:30:50 -0500 Subject: [PATCH 13/41] Formatting --- docs/doxygen-user/troubleshooting.dox | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/doxygen-user/troubleshooting.dox b/docs/doxygen-user/troubleshooting.dox index b5506456cb..666b86f10b 100644 --- a/docs/doxygen-user/troubleshooting.dox +++ b/docs/doxygen-user/troubleshooting.dox @@ -23,13 +23,13 @@ If you are experiencing an error, we encourage you to post on the forum (https:/ Make the following changes if the application is hard to navigate in High DPI systems:
      -
    1. Right click on the application icon on your Desktop, Start Menu, etc. -
    2. Choose Properties -
    3. Go to Compatibility tab -
    4. Click "Change high DPI settings" button -
    5. Select "Override high DPI scaling behavior" -
    6. Change the "Scaling performed by:" drop down box to "System" -
    7. Restart Autopsy +
    8. Right-click on the application icon on your Desktop, Start Menu, etc. +
    9. Choose Properties. +
    10. Go to Compatibility tab. +
    11. Click "Change high DPI settings" button. +
    12. Select "Override high DPI scaling behavior". +
    13. Change the "Scaling performed by:" drop down box to "System". +
    14. Restart Autopsy.
    \section troubleshooting_general General Troubleshooting From eb25cba6f39455ff7fe30d0b1cdb4368263e2f66 Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Mon, 1 Feb 2021 09:41:00 -0500 Subject: [PATCH 14/41] Update Project Vic tag names to latest - fixes bug with latest LE Bundle Module --- .../imagegallery/ImageGalleryController.java | 13 +---- .../imagegallery/ImageGalleryService.java | 54 +++++++++++-------- .../imagegallery/actions/OpenAction.java | 4 ++ .../datamodel/CategoryManager.java | 14 +++-- .../imagegallery/datamodel/DrawableDB.java | 6 +-- 5 files changed, 47 insertions(+), 44 deletions(-) diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java index 95509c4c16..694e7b1c08 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java @@ -95,8 +95,7 @@ public final class ImageGalleryController { private static final Logger logger = Logger.getLogger(ImageGalleryController.class.getName()); private static final Set INGEST_JOB_EVENTS_OF_INTEREST = EnumSet.of(IngestManager.IngestJobEvent.DATA_SOURCE_ANALYSIS_STARTED, IngestManager.IngestJobEvent.DATA_SOURCE_ANALYSIS_COMPLETED); private static final Set INGEST_MODULE_EVENTS_OF_INTEREST = EnumSet.of(IngestManager.IngestModuleEvent.DATA_ADDED, IngestManager.IngestModuleEvent.FILE_DONE); - - private static String DEFAULT_TAG_SET_NAME = "Project VIC"; + /* * The file limit for image gallery. If the selected data source (or all * data sources, if that option is selected) has more than this many files @@ -738,7 +737,7 @@ public final class ImageGalleryController { List tagSetList = getCaseDatabase().getTaggingManager().getTagSets(); if (tagSetList != null && !tagSetList.isEmpty()) { for (TagSet set : tagSetList) { - if (set.getName().equals(getCategoryTagSetName())) { + if (set.getName().equals(ImageGalleryService.PROJECT_VIC_TAG_SET_NAME)) { return set; } } @@ -749,14 +748,6 @@ public final class ImageGalleryController { } } - /** - * Returns the name of the category tag set. - * - * @return Tagset name - */ - static String getCategoryTagSetName() { - return DEFAULT_TAG_SET_NAME; - } /** * A listener for ingest module application events. diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryService.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryService.java index 176b6e1a44..4a8664eb6f 100755 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryService.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryService.java @@ -44,20 +44,32 @@ import org.sleuthkit.datamodel.TskData; }) public class ImageGalleryService implements AutopsyService { - private static final String CATEGORY_ONE_NAME = "Child Exploitation (Illegal)"; - private static final String CATEGORY_TWO_NAME = "Child Exploitation (Non-Illegal/Age Difficult)"; - private static final String CATEGORY_THREE_NAME = "CGI/Animation (Child Exploitive)"; - private static final String CATEGORY_FOUR_NAME = "Exemplar/Comparison (Internal Use Only)"; - private static final String CATEGORY_FIVE_NAME = "Non-pertinent"; - - private static final List DEFAULT_CATEGORY_DEFINITION = new ArrayList<>(); + /* Image Gallery has its own definition of Project VIC tag names because + * these will be used if the Project Vic module is not installed. These will + * get added when a case is opened if the tag set is not already defined. + * + * The following list of names must be kept in sync with the CountryManager + * code in the ProjectVic module. + * + * Autopsy Core Tag code and TSK DataModel upgrade code also have a + * references to the "Projet VIC" set name. Be careful changing any of these names. + */ + static String PROJECT_VIC_TAG_SET_NAME = "Project VIC"; + private static final String PV_US_CAT0 = "Non-Pertinent"; + private static final String PV_US_CAT1 = "Child Abuse Material - (CAM)"; + private static final String PV_US_CAT2 = "Child Exploitive (Non-CAM) Age Difficult"; + private static final String PV_US_CAT3 = "CGI/Animation - Child Exploitive"; + private static final String PV_US_CAT4 = "Comparison Images"; + + private static final List PROJECT_VIC_US_CATEGORIES = new ArrayList<>(); static { - DEFAULT_CATEGORY_DEFINITION.add(new TagNameDefinition(CATEGORY_ONE_NAME, "", TagName.HTML_COLOR.RED, TskData.FileKnown.BAD)); - DEFAULT_CATEGORY_DEFINITION.add(new TagNameDefinition(CATEGORY_TWO_NAME, "", TagName.HTML_COLOR.LIME, TskData.FileKnown.BAD)); - DEFAULT_CATEGORY_DEFINITION.add(new TagNameDefinition(CATEGORY_THREE_NAME, "", TagName.HTML_COLOR.YELLOW, TskData.FileKnown.BAD)); - DEFAULT_CATEGORY_DEFINITION.add(new TagNameDefinition(CATEGORY_FOUR_NAME, "", TagName.HTML_COLOR.PURPLE, TskData.FileKnown.UNKNOWN)); - DEFAULT_CATEGORY_DEFINITION.add(new TagNameDefinition(CATEGORY_FIVE_NAME, "", TagName.HTML_COLOR.FUCHSIA, TskData.FileKnown.UNKNOWN)); + // NOTE: The colors here are what will be shown in the border + PROJECT_VIC_US_CATEGORIES.add(new TagNameDefinition(PV_US_CAT0, "", TagName.HTML_COLOR.GREEN, TskData.FileKnown.UNKNOWN)); + PROJECT_VIC_US_CATEGORIES.add(new TagNameDefinition(PV_US_CAT1, "", TagName.HTML_COLOR.RED, TskData.FileKnown.BAD)); + PROJECT_VIC_US_CATEGORIES.add(new TagNameDefinition(PV_US_CAT2, "", TagName.HTML_COLOR.YELLOW, TskData.FileKnown.BAD)); + PROJECT_VIC_US_CATEGORIES.add(new TagNameDefinition(PV_US_CAT3, "", TagName.HTML_COLOR.FUCHSIA, TskData.FileKnown.BAD)); + PROJECT_VIC_US_CATEGORIES.add(new TagNameDefinition(PV_US_CAT4, "", TagName.HTML_COLOR.BLUE, TskData.FileKnown.UNKNOWN)); } @Override @@ -91,17 +103,17 @@ public class ImageGalleryService implements AutopsyService { // Check to see if the Project VIC tag set exists, if not create a // tag set using the default tags. - boolean addDefaultTagSet = true; + boolean addProjVicTagSet = true; List tagSets = context.getCase().getServices().getTagsManager().getAllTagSets(); for (TagSet set : tagSets) { - if (set.getName().equals(ImageGalleryController.getCategoryTagSetName())) { - addDefaultTagSet = false; + if (set.getName().equals(PROJECT_VIC_TAG_SET_NAME)) { + addProjVicTagSet = false; break; } } - if (addDefaultTagSet) { - addDefaultTagSet(context.getCase()); + if (addProjVicTagSet) { + addProjetVicTagSet(context.getCase()); } ImageGalleryController.createController(context.getCase()); @@ -134,13 +146,11 @@ public class ImageGalleryService implements AutopsyService { * * @throws TskCoreException */ - private void addDefaultTagSet(Case currentCase) throws TskCoreException { + private void addProjetVicTagSet(Case currentCase) throws TskCoreException { List tagNames = new ArrayList<>(); - for (TagNameDefinition def : DEFAULT_CATEGORY_DEFINITION) { + for (TagNameDefinition def : PROJECT_VIC_US_CATEGORIES) { tagNames.add(currentCase.getSleuthkitCase().addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus())); } - - currentCase.getServices().getTagsManager().addTagSet(ImageGalleryController.getCategoryTagSetName(), tagNames); + currentCase.getServices().getTagsManager().addTagSet(PROJECT_VIC_TAG_SET_NAME, tagNames); } - } diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenAction.java index 2df0ee2ed1..92ea324105 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenAction.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/OpenAction.java @@ -157,7 +157,10 @@ public final class OpenAction extends CallableSystemAction { } Platform.runLater(() -> { ImageGalleryController controller; + // @@@ This call gets a lock. We shouldn't do this in the UI.... controller = ImageGalleryController.getController(currentCase); + + // Display an error if we could not get the controller and return if (controller == null) { Alert errorDIalog = new Alert(Alert.AlertType.ERROR); errorDIalog.initModality(Modality.APPLICATION_MODAL); @@ -174,6 +177,7 @@ public final class OpenAction extends CallableSystemAction { return; } + // Make sure the user is aware of Single vs Multi-user behaviors if (currentCase.getCaseType() == Case.CaseType.MULTI_USER_CASE && ImageGalleryPreferences.isMultiUserCaseInfoDialogDisabled() == false) { Alert dialog = new Alert(Alert.AlertType.INFORMATION); diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/CategoryManager.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/CategoryManager.java index 8419fb40fe..4464a60fc7 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/CategoryManager.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/CategoryManager.java @@ -99,9 +99,9 @@ public class CategoryManager { } /** - * get the number of file with the given {@link DhsImageCategory} + * get the number of file with the given tag * - * @param cat get the number of files with Category = cat + * @param tagName get the number of files with Category = tagName * * @return the number of files with the given Category */ @@ -110,20 +110,18 @@ public class CategoryManager { } /** - * increment the cached value for the number of files with the given - * {@link DhsImageCategory} + * increment the cached value for the number of files with the given tag * - * @param cat the Category to increment + * @param tagName the Category to increment */ synchronized public void incrementCategoryCount(TagName tagName) { categoryCounts.getUnchecked(tagName).increment(); } /** - * decrement the cached value for the number of files with the given - * DhsImageCategory + * decrement the cached value for the number of files with the given tag * - * @param cat the Category to decrement + * @param tagName the Category to decrement */ synchronized public void decrementCategoryCount(TagName tagName) { categoryCounts.getUnchecked(tagName).decrement(); diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableDB.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableDB.java index 3aa39bd2fd..ab4a2cbe6a 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableDB.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableDB.java @@ -207,19 +207,19 @@ public final class DrawableDB { */ UNKNOWN, /** - * Analyis (an ingest job or image gallery database rebuild) for the + * Analysis (an ingest job or image gallery database rebuild) for the * data source is in progress. */ IN_PROGRESS, /** - * Analyis (an ingest job or image gallery database rebuild) for the + * Analysis (an ingest job or image gallery database rebuild) for the * data source has been completed and at least one file in the data * source has a MIME type (ingest filters may have been applied, so some * files may not have been typed). */ COMPLETE, /** - * Analyis (an ingest job or image gallery database rebuild) for the + * Analysis (an ingest job or image gallery database rebuild) for the * data source has been completed, but the files for the data source * were not assigned a MIME type (file typing was not enabled). */ From 89a2a46c54ea12db0bc8fc09e97cee7f2a2477fd Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Mon, 1 Feb 2021 10:19:33 -0500 Subject: [PATCH 15/41] refactoring while debugging TagSet issue. No logic/public API changes --- .../services/TagNameDefinition.java | 26 +++++++++--------- .../casemodule/services/TagSetDefinition.java | 2 +- .../casemodule/services/TagsManager.java | 27 +++++++++++-------- .../autopsy/datamodel/DhsImageCategory.java | 1 + 4 files changed, 31 insertions(+), 25 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java index 17cff6d900..ff07662e64 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java @@ -61,19 +61,19 @@ final public class TagNameDefinition implements Comparable { private final TskData.FileKnown knownStatus; private static final List STANDARD_TAGS_DEFINITIONS = new ArrayList<>(); - private static final List OLD_CATEGORY_TAG_NAMES = new ArrayList<>(); + private static final List PROJECT_VIC_NAMES_NO_LONGER_USED = new ArrayList<>(); static { STANDARD_TAGS_DEFINITIONS.add(new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_bookmark_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN)); STANDARD_TAGS_DEFINITIONS.add(new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_followUp_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN)); STANDARD_TAGS_DEFINITIONS.add(new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.BAD)); - OLD_CATEGORY_TAG_NAMES.add("CAT-1: Child Exploitation (Illegal)"); - OLD_CATEGORY_TAG_NAMES.add("CAT-2: Child Exploitation (Non-Illegal/Age Difficult)"); - OLD_CATEGORY_TAG_NAMES.add("CAT-3: CGI/Animation (Child Exploitive)"); - OLD_CATEGORY_TAG_NAMES.add("CAT-4: Exemplar/Comparison (Internal Use Only)"); - OLD_CATEGORY_TAG_NAMES.add("CAT-5: Non-pertinent"); - OLD_CATEGORY_TAG_NAMES.add("CAT-0: Uncategorized"); + PROJECT_VIC_NAMES_NO_LONGER_USED.add("CAT-1: Child Exploitation (Illegal)"); + PROJECT_VIC_NAMES_NO_LONGER_USED.add("CAT-2: Child Exploitation (Non-Illegal/Age Difficult)"); + PROJECT_VIC_NAMES_NO_LONGER_USED.add("CAT-3: CGI/Animation (Child Exploitive)"); + PROJECT_VIC_NAMES_NO_LONGER_USED.add("CAT-4: Exemplar/Comparison (Internal Use Only)"); + PROJECT_VIC_NAMES_NO_LONGER_USED.add("CAT-5: Non-pertinent"); + PROJECT_VIC_NAMES_NO_LONGER_USED.add("CAT-0: Uncategorized"); } /** @@ -259,7 +259,7 @@ final public class TagNameDefinition implements Comparable { */ static synchronized Set getTagNameDefinitions() { if (needsVersionUpdate()) { - updateTagDefinitions(); + updatePropertyFile(); } String tagsProperty = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY); @@ -311,7 +311,7 @@ final public class TagNameDefinition implements Comparable { /** * Updates the Tag Definition file to the current format. */ - private static void updateTagDefinitions() { + private static void updatePropertyFile() { Integer version = getPropertyFileVersion(); List definitions = new ArrayList<>(); @@ -355,18 +355,18 @@ final public class TagNameDefinition implements Comparable { } // Remove the standard and Project VIC tags from the list - List tagStrings = new ArrayList<>(); + List tagStringsToKeep = new ArrayList<>(); List standardTags = getStandardTagNames(); for (TagNameDefinition def : definitions) { if (!standardTags.contains(def.getDisplayName()) - && !OLD_CATEGORY_TAG_NAMES.contains(def.getDisplayName())) { - tagStrings.add(def.toSettingsFormat()); + && !PROJECT_VIC_NAMES_NO_LONGER_USED.contains(def.getDisplayName())) { + tagStringsToKeep.add(def.toSettingsFormat()); } } // Write out the version and the new tag list. ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTING_VERSION_KEY, Integer.toString(TAG_SETTINGS_VERSION)); - ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY, String.join(";", tagStrings)); + ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY, String.join(";", tagStringsToKeep)); } /** diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagSetDefinition.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagSetDefinition.java index ad11becdff..6303e2736e 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagSetDefinition.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagSetDefinition.java @@ -88,7 +88,7 @@ final public class TagSetDefinition { } /** - * Returns a list of the defined TagSet objects. + * Returns a list of configured TagSets (from the user's config folder) * * @return A list of TagSetDefinition objects or empty list if none were * found. diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java index 1a9b2e792d..4bb813a779 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java @@ -55,7 +55,9 @@ public class TagsManager implements Closeable { private static final Logger LOGGER = Logger.getLogger(TagsManager.class.getName()); private final SleuthkitCase caseDb; - private static String DEFAULT_TAG_SET_NAME = "Project VIC"; + // NOTE: This name is also hard coded in Image Gallery and Projet Vic module. + // They need to stay in sync + private static String PROJECT_VIC_TAG_SET_NAME = "Project VIC"; private static final Object lock = new Object(); @@ -196,7 +198,7 @@ public class TagsManager implements Closeable { try { List tagSetList = Case.getCurrentCaseThrows().getSleuthkitCase().getTaggingManager().getTagSets(); for (TagSet tagSet : tagSetList) { - if (tagSet.getName().equals(DEFAULT_TAG_SET_NAME)) { + if (tagSet.getName().equals(PROJECT_VIC_TAG_SET_NAME)) { for (TagName tagName : tagSet.getTagNames()) { tagList.add(tagName.getDisplayName()); } @@ -237,7 +239,7 @@ public class TagsManager implements Closeable { } /** - * Creates a new TagSetDefinition file. + * Creates a new TagSetDefinition file that will be used for future cases * * @param tagSetDef The tag set definition. * @@ -258,23 +260,26 @@ public class TagsManager implements Closeable { TagsManager(SleuthkitCase caseDb) { this.caseDb = caseDb; - // Add standard tags and the Project VIC default tag set and tags. + // Add standard tags and any configured tag sets. TaggingManager taggingMgr = caseDb.getTaggingManager(); try { - List setList = taggingMgr.getTagSets(); - if (setList.isEmpty()) { + List tagSetsInCase = taggingMgr.getTagSets(); + if (tagSetsInCase.isEmpty()) { + + // add the standard tag names for (TagNameDefinition def : TagNameDefinition.getStandardTagNameDefinitions()) { caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus()); } - //Assume new case and add tag sets + + //Assume new case and add all tag sets for (TagSetDefinition setDef : TagSetDefinition.readTagSetDefinitions()) { - List tagNameList = new ArrayList<>(); + List tagNamesInSet = new ArrayList<>(); for (TagNameDefinition tagNameDef : setDef.getTagNameDefinitions()) { - tagNameList.add(caseDb.addOrUpdateTagName(tagNameDef.getDisplayName(), tagNameDef.getDescription(), tagNameDef.getColor(), tagNameDef.getKnownStatus())); + tagNamesInSet.add(caseDb.addOrUpdateTagName(tagNameDef.getDisplayName(), tagNameDef.getDescription(), tagNameDef.getColor(), tagNameDef.getKnownStatus())); } - if (!tagNameList.isEmpty()) { - taggingMgr.addTagSet(setDef.getName(), tagNameList); + if (!tagNamesInSet.isEmpty()) { + taggingMgr.addTagSet(setDef.getName(), tagNamesInSet); } } } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java b/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java index 50974519c7..4d7f87389b 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java @@ -30,6 +30,7 @@ import org.openide.util.NbBundle; /** * Enum to represent the six categories in the DHS image categorization scheme. + * NOTE: This appears to not be used anywhere anymore after the ImageGallery refactoring */ @NbBundle.Messages({ "Category.one=CAT-1: Child Exploitation (Illegal)", From c9681e7257cf423bc02eefae83522eea9d4cbe0c Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 1 Feb 2021 15:36:36 -0500 Subject: [PATCH 16/41] no html reports in regression.py --- test/script/regression.py | 114 ++++++++++++++++++++------------------ 1 file changed, 59 insertions(+), 55 deletions(-) diff --git a/test/script/regression.py b/test/script/regression.py index e1616cc550..bc54e0ae39 100644 --- a/test/script/regression.py +++ b/test/script/regression.py @@ -273,19 +273,23 @@ class TestRunner(object): # Compare output with gold and display results TestResultsDiffer.run_diff(test_data) - print("Html report passed: ", test_data.html_report_passed) + # print("Html report passed: ", test_data.html_report_passed) print("Errors diff passed: ", test_data.errors_diff_passed) print("DB diff passed: ", test_data.db_diff_passed) # run time test only for the specific jenkins test if test_data.main_config.timing: print("Run time test passed: ", test_data.run_time_passed) - test_data.overall_passed = (test_data.html_report_passed and - test_data.errors_diff_passed and test_data.db_diff_passed) + # NOTE: commented out html version items + #test_data.overall_passed = (test_data.html_report_passed and + #test_data.errors_diff_passed and test_data.db_diff_passed) + test_data.overall_passed = (test_data.errors_diff_passed and test_data.db_diff_passed) # otherwise, do the usual else: - test_data.overall_passed = (test_data.html_report_passed and - test_data.errors_diff_passed and test_data.db_diff_passed) + # NOTE: commented out html version items + #test_data.overall_passed = (test_data.html_report_passed and + #test_data.errors_diff_passed and test_data.db_diff_passed) + test_data.overall_passed = (test_data.errors_diff_passed and test_data.db_diff_passed) Reports.generate_reports(test_data) if(not test_data.overall_passed): @@ -1009,10 +1013,10 @@ class TestResultsDiffer(object): test_data.errors_diff_passed = passed # Compare html output - gold_report_path = test_data.get_html_report_path(DBType.GOLD) - output_report_path = test_data.get_html_report_path(DBType.OUTPUT) - passed = TestResultsDiffer._html_report_diff(test_data) - test_data.html_report_passed = passed + # gold_report_path = test_data.get_html_report_path(DBType.GOLD) + # output_report_path = test_data.get_html_report_path(DBType.OUTPUT) + # passed = TestResultsDiffer._html_report_diff(test_data) + # test_data.html_report_passed = passed # Compare time outputs if test_data.main_config.timing: @@ -1070,51 +1074,51 @@ class TestResultsDiffer(object): else: return True - def _html_report_diff(test_data): - """Compare the output and gold html reports. Diff util is used for this purpose. - Diff -r -N -x --ignore-matching-lines - is executed. - Diff is recursively used to scan through the HTML report directories. Modify the to suit the needs. - Currently, the regex is set to match certain lines found on index.html and summary.html, and skip (read ignore) - them. - Diff returns 0 when there is no difference, 1 when there is difference, and 2 when there is trouble (trouble not - defined in the official documentation). - - Args: - test_data TestData object which contains initialized report_paths. - - Returns: - true, if the reports match, false otherwise. - """ - gold_report_path = test_data.get_html_report_path(DBType.GOLD) - output_report_path = test_data.get_html_report_path(DBType.OUTPUT) - try: - # Ensure gold is passed before output - (subprocess.check_output(["diff", '-r', '-N', '-x', '*.png', '-x', '*.ico', '--ignore-matching-lines', - 'HTML Report Generated on \|Autopsy Report for case \|Case:\|Case Number:' - '\|Examiner:\|Unalloc_', gold_report_path, output_report_path])) - print_report("", "REPORT COMPARISON", "The test html reports matched the gold reports") - return True - except subprocess.CalledProcessError as e: - if e.returncode == 1: - Errors.print_error("Error Code: 1\nThe HTML reports did not match.") - diff_file = codecs.open(test_data.output_path + "\HTML-Report-Diff.txt", "wb", "utf_8") - diff_file.write(str(e.output.decode("utf-8"))) - return False - if e.returncode == 2: - Errors.print_error("Error Code: 2\nTrouble executing the Diff Utility.") - diff_file = codecs.open(test_data.output_path + "\HTML-Report-Diff.txt", "wb", "utf_8") - diff_file.write(str(e.output.decode("utf-8"))) - return False - except OSError as e: - Errors.print_error("Error: OSError while performing html report diff") - Errors.print_error(str(e) + "\n") - return False - except Exception as e: - Errors.print_error("Error: Unknown fatal error comparing reports.") - Errors.print_error(str(e) + "\n") - logging.critical(traceback.format_exc()) - return False + # def _html_report_diff(test_data): + # """Compare the output and gold html reports. Diff util is used for this purpose. + # Diff -r -N -x --ignore-matching-lines + # is executed. + # Diff is recursively used to scan through the HTML report directories. Modify the to suit the needs. + # Currently, the regex is set to match certain lines found on index.html and summary.html, and skip (read ignore) + # them. + # Diff returns 0 when there is no difference, 1 when there is difference, and 2 when there is trouble (trouble not + # defined in the official documentation). + # + # Args: + # test_data TestData object which contains initialized report_paths. + # + # Returns: + # true, if the reports match, false otherwise. + # """ + # gold_report_path = test_data.get_html_report_path(DBType.GOLD) + # output_report_path = test_data.get_html_report_path(DBType.OUTPUT) + # try: + # # Ensure gold is passed before output + # (subprocess.check_output(["diff", '-r', '-N', '-x', '*.png', '-x', '*.ico', '--ignore-matching-lines', + # 'HTML Report Generated on \|Autopsy Report for case \|Case:\|Case Number:' + # '\|Examiner:\|Unalloc_', gold_report_path, output_report_path])) + # print_report("", "REPORT COMPARISON", "The test html reports matched the gold reports") + # return True + # except subprocess.CalledProcessError as e: + # if e.returncode == 1: + # Errors.print_error("Error Code: 1\nThe HTML reports did not match.") + # diff_file = codecs.open(test_data.output_path + "\HTML-Report-Diff.txt", "wb", "utf_8") + # diff_file.write(str(e.output.decode("utf-8"))) + # return False + # if e.returncode == 2: + # Errors.print_error("Error Code: 2\nTrouble executing the Diff Utility.") + # diff_file = codecs.open(test_data.output_path + "\HTML-Report-Diff.txt", "wb", "utf_8") + # diff_file.write(str(e.output.decode("utf-8"))) + # return False + # except OSError as e: + # Errors.print_error("Error: OSError while performing html report diff") + # Errors.print_error(str(e) + "\n") + # return False + # except Exception as e: + # Errors.print_error("Error: Unknown fatal error comparing reports.") + # Errors.print_error(str(e) + "\n") + # logging.critical(traceback.format_exc()) + # return False def _run_time_diff(test_data, old_time_path): """ Compare run times for this run, and the run previous. @@ -1371,7 +1375,7 @@ class Reports(object): vars.append( str(len(search_log_set("autopsy", "Stopping ingest due to low disk space on disk", test_data))) ) vars.append( make_local_path("gold", test_data.image_name, DB_FILENAME) ) vars.append( make_local_path("gold", test_data.image_name, "standard.html") ) - vars.append( str(test_data.html_report_passed) ) + # vars.append( str(test_data.html_report_passed) ) vars.append( test_data.ant_to_string() ) # Join it together with a ", " output = "|".join(vars) From 46531495f1e12e41b50bbe65b8b33033d663f5ea Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 1 Feb 2021 15:38:51 -0500 Subject: [PATCH 17/41] commenting --- test/script/regression.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/script/regression.py b/test/script/regression.py index bc54e0ae39..097e4a099d 100644 --- a/test/script/regression.py +++ b/test/script/regression.py @@ -273,6 +273,7 @@ class TestRunner(object): # Compare output with gold and display results TestResultsDiffer.run_diff(test_data) + # NOTE: commented out html version items # print("Html report passed: ", test_data.html_report_passed) print("Errors diff passed: ", test_data.errors_diff_passed) print("DB diff passed: ", test_data.db_diff_passed) @@ -1013,6 +1014,7 @@ class TestResultsDiffer(object): test_data.errors_diff_passed = passed # Compare html output + # NOTE: commented out html version items # gold_report_path = test_data.get_html_report_path(DBType.GOLD) # output_report_path = test_data.get_html_report_path(DBType.OUTPUT) # passed = TestResultsDiffer._html_report_diff(test_data) @@ -1074,6 +1076,7 @@ class TestResultsDiffer(object): else: return True + # NOTE: commented out html version items # def _html_report_diff(test_data): # """Compare the output and gold html reports. Diff util is used for this purpose. # Diff -r -N -x --ignore-matching-lines @@ -1375,6 +1378,7 @@ class Reports(object): vars.append( str(len(search_log_set("autopsy", "Stopping ingest due to low disk space on disk", test_data))) ) vars.append( make_local_path("gold", test_data.image_name, DB_FILENAME) ) vars.append( make_local_path("gold", test_data.image_name, "standard.html") ) + # NOTE: commented out html version items # vars.append( str(test_data.html_report_passed) ) vars.append( test_data.ant_to_string() ) # Join it together with a ", " From 4ea715e2350e2927196c78d10a1780df42429254 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Mon, 1 Feb 2021 17:07:56 -0500 Subject: [PATCH 18/41] Fixed WEB_COOKIE time attributes --- .../autopsy/recentactivity/Chromium.java | 4 ++-- .../autopsy/recentactivity/Extract.java | 18 ++++++++++++++---- .../autopsy/recentactivity/ExtractEdge.java | 4 ++-- .../autopsy/recentactivity/ExtractSafari.java | 4 ++-- .../autopsy/recentactivity/Firefox.java | 4 ++-- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Chromium.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Chromium.java index ef91cee067..17f09c81b1 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Chromium.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Chromium.java @@ -2,7 +2,7 @@ * * Autopsy Forensic Browser * - * Copyright 2012-2020 Basis Technology Corp. + * Copyright 2012-2021 Basis Technology Corp. * * Copyright 2012 42six Solutions. * @@ -480,7 +480,7 @@ class Chromium extends Extract { bbattributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_URL, RecentActivityExtracterModuleFactory.getModuleName(), ((result.get("host_key").toString() != null) ? result.get("host_key").toString() : ""))); //NON-NLS - bbattributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_DATETIME, + bbattributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED, RecentActivityExtracterModuleFactory.getModuleName(), (Long.valueOf(result.get("last_access_utc").toString()) / 1000000) - Long.valueOf("11644473600"))); //NON-NLS diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Extract.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Extract.java index ebf483b5d0..fa23d8564f 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Extract.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Extract.java @@ -2,7 +2,7 @@ * * Autopsy Forensic Browser * - * Copyright 2012-2019 Basis Technology Corp. + * Copyright 2012-2021 Basis Technology Corp. * * Copyright 2012 42six Solutions. * Contact: aebadirad 42six com @@ -325,17 +325,27 @@ abstract class Extract { * @return List of BlackboarAttributes for the passed in attributes */ protected Collection createCookieAttributes(String url, - Long creationTime, String name, String value, String programName, String domain) { + Long creationTime, Long accessTime, Long endTime, String name, String value, String programName, String domain) { Collection bbattributes = new ArrayList<>(); bbattributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL, RecentActivityExtracterModuleFactory.getModuleName(), (url != null) ? url : "")); //NON-NLS - if (creationTime != null) { - bbattributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME, + if (creationTime != null && creationTime != 0) { + bbattributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_CREATED, RecentActivityExtracterModuleFactory.getModuleName(), creationTime)); } + + if (accessTime != null && accessTime != 0) { + bbattributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED, + RecentActivityExtracterModuleFactory.getModuleName(), accessTime)); + } + + if(endTime != null && endTime != 0) { + bbattributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_END, + RecentActivityExtracterModuleFactory.getModuleName(), endTime)); + } bbattributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME, RecentActivityExtracterModuleFactory.getModuleName(), diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractEdge.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractEdge.java index 133764f427..7ed9cce966 100755 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractEdge.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractEdge.java @@ -2,7 +2,7 @@ * * Autopsy Forensic Browser * - * Copyright 2019-2020 Basis Technology Corp. + * Copyright 2019-2021 Basis Technology Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -649,7 +649,7 @@ final class ExtractEdge extends Extract { String url = flipDomain(domain); BlackboardArtifact bbart = origFile.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_COOKIE); - bbart.addAttributes(createCookieAttributes(url, ftime, name, value, this.getName(), NetworkUtils.extractDomain(url))); + bbart.addAttributes(createCookieAttributes(url, null, ftime, null, name, value, this.getName(), NetworkUtils.extractDomain(url))); return bbart; } diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractSafari.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractSafari.java index c11e4fde22..d0e6f7fe85 100755 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractSafari.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractSafari.java @@ -2,7 +2,7 @@ * * Autopsy Forensic Browser * - * Copyright 2019 Basis Technology Corp. + * Copyright 2019-2021 Basis Technology Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -548,7 +548,7 @@ final class ExtractSafari extends Extract { Cookie cookie = iter.next(); BlackboardArtifact bbart = origFile.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_COOKIE); - bbart.addAttributes(createCookieAttributes(cookie.getURL(), cookie.getCreationDate(), cookie.getName(), cookie.getValue(), this.getName(), NetworkUtils.extractDomain(cookie.getURL()))); + bbart.addAttributes(createCookieAttributes(cookie.getURL(), cookie.getCreationDate(), null, cookie.getExpirationDate(), cookie.getName(), cookie.getValue(), this.getName(), NetworkUtils.extractDomain(cookie.getURL()))); bbartifacts.add(bbart); } } diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Firefox.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Firefox.java index e0bf5c10b8..79800ff5e2 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Firefox.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Firefox.java @@ -2,7 +2,7 @@ * * Autopsy Forensic Browser * - * Copyright 2012-2020 Basis Technology Corp. + * Copyright 2012-2021 Basis Technology Corp. * * Copyright 2012 42six Solutions. * Contact: aebadirad 42six com @@ -395,7 +395,7 @@ class Firefox extends Extract { bbattributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_URL, RecentActivityExtracterModuleFactory.getModuleName(), ((host != null) ? host : ""))); //NON-NLS - bbattributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_DATETIME, + bbattributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED, RecentActivityExtracterModuleFactory.getModuleName(), (Long.valueOf(result.get("lastAccessed").toString())))); //NON-NLS bbattributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_NAME, From b3f6dc0e1df6670fae17137f4c5768a5c966b630 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Mon, 1 Feb 2021 17:21:31 -0500 Subject: [PATCH 19/41] Bug fixes, improved logging, added synchronization --- .../autopsy/keywordsearch/Bundle.properties | 2 +- .../keywordsearch/Bundle.properties-MERGED | 6 +- .../autopsy/keywordsearch/Server.java | 72 ++++++------------- .../keywordsearch/SolrSearchService.java | 16 ++++- 4 files changed, 41 insertions(+), 55 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties index b4e2850586..d2ab5f76c7 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties @@ -187,7 +187,7 @@ Server.query.exception.msg=Error running query: {0} Server.query2.exception.msg=Error running query: {0} Server.queryTerms.exception.msg=Error running terms query: {0} Server.connect.exception.msg=Failed to connect to Solr server: {0} -Server.openCore.exception.msg=Keyword search service not yet running +Server.openCore.exception.msg=Local keyword search service not yet running Server.openCore.exception.cantOpen.msg=Could not create or open index Server.openCore.exception.noIndexDir.msg=Index directory could not be created or is missing Server.request.exception.exception.msg=Could not issue Solr request diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED index 88f0d4628a..02244f9477 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED @@ -37,7 +37,7 @@ KeywordSearchResultFactory.createNodeForKey.noResultsFound.text=No results found KeywordSearchResultFactory.query.exception.msg=Could not perform the query OpenIDE-Module-Display-Category=Ingest Module -OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\n\The module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found. +OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\nThe module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found. OpenIDE-Module-Name=KeywordSearch OptionsCategory_Name_KeywordSearchOptions=Keyword Search OptionsCategory_Keywords_KeywordSearchOptions=Keyword Search @@ -340,10 +340,14 @@ SolrSearch.checkingForLatestIndex.msg=Looking for text index with latest Solr an SolrSearch.complete.msg=Text index successfully opened SolrSearch.creatingNewIndex.msg=Creating new text index SolrSearch.findingIndexes.msg=Looking for existing text index directories +# {0} - futureVersion +# {1} - currentVersion +SolrSearch.futureIndexVersion.msg=The text index for the case is for Solr {0}. This version of Autopsy is compatible with Solr {1}. SolrSearch.indentifyingIndex.msg=Identifying text index to use SolrSearch.lookingForMetadata.msg=Looking for text index metadata file SolrSearch.openCore.msg=Opening text index. For large cases this may take several minutes. SolrSearch.readingIndexes.msg=Reading text index metadata file +SolrSearch.unableToFindIndex.msg=Unable to find index that can be used for this case # {0} - index folder path SolrSearchService.exceptionMessage.failedToDeleteIndexFiles=Failed to delete text index files at {0} SolrSearchService.exceptionMessage.noCurrentSolrCore=IndexMetadata did not contain a current Solr core so could not delete the case diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java index a27eb4db78..56f3a5bfc1 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java @@ -239,6 +239,8 @@ public class Server { private static final String CORE_PROPERTIES = "core.properties"; private static final boolean DEBUG = false;//(Version.getBuildType() == Version.Type.DEVELOPMENT); private static final int NUM_COLLECTION_CREATION_RETRIES = 5; + private static final int NUM_EMBEDDED_SERVER_RETRIES = 12; // attempt to connect to embedded Solr server for 1 minute + private static final int EMBEDDED_SERVER_RETRY_WAIT_SEC = 5; public enum CORE_EVT_STATES { @@ -269,6 +271,8 @@ public class Server { */ Server() { initSettings(); + + localSolrServer = getSolrClient("http://localhost:" + localSolrServerPort + "/solr"); serverAction = new ServerAction(); File solr8Folder = InstalledFileLocator.getDefault().locate("solr", Server.class.getPackage().getName(), false); //NON-NLS @@ -664,7 +668,7 @@ public class Server { */ @NbBundle.Messages({ "Server.status.failed.msg=Local Solr server did not respond to status request. This may be because the server failed to start or is taking too long to initialize.",}) - void startLocalSolr(SOLR_VERSION version) throws KeywordSearchModuleException, SolrServerNoPortException, SolrServerException { + synchronized void startLocalSolr(SOLR_VERSION version) throws KeywordSearchModuleException, SolrServerNoPortException, SolrServerException { if (isLocalSolrRunning()) { if (localServerVersion.equals(version)) { @@ -712,7 +716,7 @@ public class Server { logger.log(Level.INFO, "Starting Solr 8 server"); //NON-NLS localSolrFolder = InstalledFileLocator.getDefault().locate("solr", Server.class.getPackage().getName(), false); //NON-NLS curSolrProcess = runLocalSolr8ControlCommand(new ArrayList<>(Arrays.asList("start", "-p", //NON-NLS - Integer.toString(localSolrServerPort)))); //NON-NLS + Integer.toString(localSolrServerPort)))); //NON-NLS } else { // solr4 localSolrFolder = InstalledFileLocator.getDefault().locate("solr4", Server.class.getPackage().getName(), false); //NON-NLS @@ -721,11 +725,10 @@ public class Server { Arrays.asList("-Dbootstrap_confdir=../solr/configsets/AutopsyConfig/conf", //NON-NLS "-Dcollection.configName=AutopsyConfig"))); //NON-NLS } - + // Wait for the Solr server to start and respond to a statusRequest request. - for (int numRetries = 0; numRetries < 6; numRetries++) { + for (int numRetries = 0; numRetries < NUM_EMBEDDED_SERVER_RETRIES; numRetries++) { if (isLocalSolrRunning()) { - localSolrServer = getSolrClient("http://localhost:" + localSolrServerPort + "/solr"); final List pids = this.getSolrPIDs(); logger.log(Level.INFO, "New Solr process PID: {0}", pids); //NON-NLS return; @@ -734,7 +737,7 @@ public class Server { // Local Solr server did not respond so we sleep for // 5 seconds before trying again. try { - TimeUnit.SECONDS.sleep(5); + TimeUnit.SECONDS.sleep(EMBEDDED_SERVER_RETRY_WAIT_SEC); } catch (InterruptedException ex) { logger.log(Level.WARNING, "Timer interrupted"); //NON-NLS } @@ -1875,13 +1878,22 @@ public class Server { * @throws IOException */ private void connectToEmbeddedSolrServer() throws SolrServerException, IOException { - HttpSolrClient solrServer = getSolrClient("http://localhost:" + localSolrServerPort + "/solr"); TimingMetric metric = HealthMonitor.getTimingMetric("Solr: Connectivity check"); - CoreAdminRequest.getStatus(null, solrServer); + CoreAdminRequest.getStatus(null, localSolrServer); HealthMonitor.submitTimingMetric(metric); } - + /** + * Attempts to connect to the given Solr server, which is running in + * SoulrCloud mode. This API does not work for the local Solr which is NOT + * running in SolrCloud mode. + * + * @param host Host name of the remote Solr server + * @param port Port of the remote Solr server + * + * @throws SolrServerException + * @throws IOException + */ void connectToSolrServer(String host, String port) throws SolrServerException, IOException { try (HttpSolrClient solrServer = getSolrClient("http://" + host + ":" + port + "/solr")) { connectToSolrServer(solrServer); @@ -1945,47 +1957,7 @@ public class Server { throw new KeywordSearchModuleException( NbBundle.getMessage(this.getClass(), "Server.serverList.exception.msg", solrServer.getBaseURL())); } - } - - /* ELTODO leaving this for reference, will delete later - private boolean clusterStatusWithCollection(String collectionName) throws IOException, SolrServerException { - ModifiableSolrParams params = new ModifiableSolrParams(); - params.set("action", CollectionParams.CollectionAction.CLUSTERSTATUS.toString()); - params.set("collection", collectionName); - SolrRequest request = new QueryRequest(params); - request.setPath("/admin/collections"); - - NamedList statusResponse; - try { - statusResponse = currentSolrServer.request(request); - } catch (RemoteSolrException ex) { - // collection doesn't exist - return false; - } - - if (statusResponse == null) { - logger.log(Level.SEVERE, "Collections response should not be null"); //NON-NLS - return false; - } - - NamedList cluster = (NamedList) statusResponse.get("cluster"); - if (cluster == null) { - logger.log(Level.SEVERE, "Cluster should not be null"); //NON-NLS - return false; - } - NamedList collections = (NamedList) cluster.get("collections"); - if (cluster == null) { - logger.log(Level.SEVERE, "Collections should not be null in cluster state"); //NON-NLS - return false; - } - if (collections.size() == 0) { - logger.log(Level.SEVERE, "Collections should not be empty in cluster state"); //NON-NLS - return false; - } - - Object collection = collections.get(collectionName); - return (collection != null); - }*/ + } class Collection { diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java index 920ac1aaba..be3794c60e 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java @@ -269,6 +269,9 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService { "SolrSearch.checkingForLatestIndex.msg=Looking for text index with latest Solr and schema version", "SolrSearch.indentifyingIndex.msg=Identifying text index to use", "SolrSearch.openCore.msg=Opening text index. For large cases this may take several minutes.", + "# {0} - futureVersion", "# {1} - currentVersion", + "SolrSearch.futureIndexVersion.msg=The text index for the case is for Solr {0}. This version of Autopsy is compatible with Solr {1}.", + "SolrSearch.unableToFindIndex.msg=Unable to find index that can be used for this case", "SolrSearch.complete.msg=Text index successfully opened"}) public void openCaseResources(CaseContext context) throws AutopsyServiceException { if (context.cancelRequested()) { @@ -320,8 +323,13 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService { progress.progress(Bundle.SolrSearch_indentifyingIndex_msg(), progressUnitsCompleted); Index indexToUse = IndexFinder.identifyIndexToUse(indexes); if (indexToUse == null) { - // unable to find index that can be used - throw new AutopsyServiceException("Unable to find index that can be used for this case"); + // unable to find index that can be used. check if the available index is for a "future" version of Solr, + // i.e. the user is using an "old/legacy" version of Autopsy to open cases created by later versions of Autopsy. + String futureIndexVersion = IndexFinder.isFutureIndexPresent(indexes); + if (!futureIndexVersion.isEmpty()) { + throw new AutopsyServiceException(Bundle.SolrSearch_futureIndexVersion_msg(futureIndexVersion, IndexFinder.getCurrentSolrVersion())); + } + throw new AutopsyServiceException(Bundle.SolrSearch_unableToFindIndex_msg()); } if (context.cancelRequested()) { @@ -393,7 +401,9 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService { throw new AutopsyServiceException(String.format("Failed to close core for %s", context.getCase().getCaseDirectory()), ex); } - context.getCase().getSleuthkitCase().unregisterForEvents(this); + if (context.getCase().getSleuthkitCase() != null) { + context.getCase().getSleuthkitCase().unregisterForEvents(this); + } } /** From bd20d16953f7c4b0a13745315d139cf40861f2b7 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Mon, 1 Feb 2021 17:29:36 -0500 Subject: [PATCH 20/41] Minor --- .../autopsy/keywordsearch/SolrSearchService.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java index be3794c60e..a031a160f1 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java @@ -269,9 +269,6 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService { "SolrSearch.checkingForLatestIndex.msg=Looking for text index with latest Solr and schema version", "SolrSearch.indentifyingIndex.msg=Identifying text index to use", "SolrSearch.openCore.msg=Opening text index. For large cases this may take several minutes.", - "# {0} - futureVersion", "# {1} - currentVersion", - "SolrSearch.futureIndexVersion.msg=The text index for the case is for Solr {0}. This version of Autopsy is compatible with Solr {1}.", - "SolrSearch.unableToFindIndex.msg=Unable to find index that can be used for this case", "SolrSearch.complete.msg=Text index successfully opened"}) public void openCaseResources(CaseContext context) throws AutopsyServiceException { if (context.cancelRequested()) { @@ -323,13 +320,8 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService { progress.progress(Bundle.SolrSearch_indentifyingIndex_msg(), progressUnitsCompleted); Index indexToUse = IndexFinder.identifyIndexToUse(indexes); if (indexToUse == null) { - // unable to find index that can be used. check if the available index is for a "future" version of Solr, - // i.e. the user is using an "old/legacy" version of Autopsy to open cases created by later versions of Autopsy. - String futureIndexVersion = IndexFinder.isFutureIndexPresent(indexes); - if (!futureIndexVersion.isEmpty()) { - throw new AutopsyServiceException(Bundle.SolrSearch_futureIndexVersion_msg(futureIndexVersion, IndexFinder.getCurrentSolrVersion())); - } - throw new AutopsyServiceException(Bundle.SolrSearch_unableToFindIndex_msg()); + // unable to find index that can be used + throw new AutopsyServiceException("Unable to find index that can be used for this case"); } if (context.cancelRequested()) { From 65050b20fba7500ab3c13a55e45d32bc4d657353 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Mon, 1 Feb 2021 17:32:05 -0500 Subject: [PATCH 21/41] Minor --- .../autopsy/keywordsearch/Bundle.properties-MERGED | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED index 02244f9477..88f0d4628a 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED @@ -37,7 +37,7 @@ KeywordSearchResultFactory.createNodeForKey.noResultsFound.text=No results found KeywordSearchResultFactory.query.exception.msg=Could not perform the query OpenIDE-Module-Display-Category=Ingest Module -OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\nThe module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found. +OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\n\The module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found. OpenIDE-Module-Name=KeywordSearch OptionsCategory_Name_KeywordSearchOptions=Keyword Search OptionsCategory_Keywords_KeywordSearchOptions=Keyword Search @@ -340,14 +340,10 @@ SolrSearch.checkingForLatestIndex.msg=Looking for text index with latest Solr an SolrSearch.complete.msg=Text index successfully opened SolrSearch.creatingNewIndex.msg=Creating new text index SolrSearch.findingIndexes.msg=Looking for existing text index directories -# {0} - futureVersion -# {1} - currentVersion -SolrSearch.futureIndexVersion.msg=The text index for the case is for Solr {0}. This version of Autopsy is compatible with Solr {1}. SolrSearch.indentifyingIndex.msg=Identifying text index to use SolrSearch.lookingForMetadata.msg=Looking for text index metadata file SolrSearch.openCore.msg=Opening text index. For large cases this may take several minutes. SolrSearch.readingIndexes.msg=Reading text index metadata file -SolrSearch.unableToFindIndex.msg=Unable to find index that can be used for this case # {0} - index folder path SolrSearchService.exceptionMessage.failedToDeleteIndexFiles=Failed to delete text index files at {0} SolrSearchService.exceptionMessage.noCurrentSolrCore=IndexMetadata did not contain a current Solr core so could not delete the case From ac5b8cbb44c114ab8ff4dd7450ed2811526ff120 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Tue, 2 Feb 2021 13:52:40 -0500 Subject: [PATCH 22/41] updates for embedded solr on os x --- .gitattributes | 6 ++ .../autopsy/keywordsearch/Server.java | 60 +++++++++++++++++++ unix_setup.sh | 3 + 3 files changed, 69 insertions(+) diff --git a/.gitattributes b/.gitattributes index cd5271c982..8749e5dadb 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13,3 +13,9 @@ Doxyfile text *.py text diff=python *.pl text + +# ensure solr scripts that are bash scripts not ending with.sh are lf instead of crlf +/KeywordSearch/solr/bin/autopsy-solr eol=lf +/KeywordSearch/solr/bin/init.d/solr eol=lf +/KeywordSearch/solr/bin/post eol=lf +/KeywordSearch/solr/bin/solr eol=lf \ No newline at end of file diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java index a27eb4db78..8f4abc8d90 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java @@ -31,6 +31,7 @@ import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ConnectException; +import java.net.DatagramSocket; import java.net.ServerSocket; import java.net.SocketException; import java.nio.charset.Charset; @@ -767,6 +768,23 @@ public class Server { * @param port the port to check for availability */ static boolean isPortAvailable(int port) { + final String osName = PlatformUtil.getOSName().toLowerCase(); + if (osName != null && osName.toLowerCase().startsWith("mac")) { + return isPortAvailableOSX(port); + } else { + return isPortAvailableDefault(port); + } + } + + /** + * Checks to see if a specific port is available. + * + * NOTE: This is used on non-OS X systems as of right now but could be + * replaced with the OS X version. + * + * @param port the port to check for availability + */ + static boolean isPortAvailableDefault(int port) { ServerSocket ss = null; try { @@ -792,6 +810,48 @@ public class Server { return false; } + /** + * Checks to see if a specific port is available. + * + * NOTE: This is only used on OSX for now, but could replace default + * implementation in the future. + * + * @param port The port to check for availability. + * @throws IllegalArgumentException If port is outside range of possible ports. + */ + static boolean isPortAvailableOSX(int port) { + // implementation taken from https://stackoverflow.com/a/435579 + if (port < 1 || port > 65535) { + throw new IllegalArgumentException("Invalid start port: " + port); + } + + ServerSocket ss = null; + DatagramSocket ds = null; + try { + ss = new ServerSocket(port); + ss.setReuseAddress(true); + ds = new DatagramSocket(port); + ds.setReuseAddress(true); + return true; + } catch (IOException e) { + } finally { + if (ds != null) { + ds.close(); + } + + if (ss != null) { + try { + ss.close(); + } catch (IOException e) { + /* should not be thrown */ + } + } + } + + return false; + } + + /** * Changes the current solr server port. Only call this after available. * diff --git a/unix_setup.sh b/unix_setup.sh index 93a5eb4bea..40b1d858b4 100644 --- a/unix_setup.sh +++ b/unix_setup.sh @@ -76,6 +76,9 @@ fi chmod u+x autopsy/markmckinnon/Export* chmod u+x autopsy/markmckinnon/parse* +# allow solr dependencies to execute +chmod -R u+x autopsy/solr/bin + # make sure it is executable chmod u+x bin/autopsy From 81c65a8c014d20a65d5253d6deb0eea47f96be74 Mon Sep 17 00:00:00 2001 From: Mark McKinnon Date: Tue, 2 Feb 2021 17:25:05 -0500 Subject: [PATCH 23/41] Update LeappFileProcessor.java Normalize Domain name to TSK/CR standards --- .../leappanalyzers/LeappFileProcessor.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/LeappFileProcessor.java b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/LeappFileProcessor.java index c6fdb6ae1e..5318ddf85b 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/LeappFileProcessor.java +++ b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/LeappFileProcessor.java @@ -59,6 +59,7 @@ import org.sleuthkit.autopsy.casemodule.Case; import static org.sleuthkit.autopsy.casemodule.Case.getCurrentCase; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.casemodule.services.FileManager; +import org.sleuthkit.autopsy.coreutils.NetworkUtils; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.autopsy.ingest.IngestModule.IngestModuleException; @@ -379,7 +380,9 @@ public final class LeappFileProcessor { return Collections.emptyList(); } - BlackboardAttribute attr = (value == null) ? null : getAttribute(colAttr.getAttributeType(), value, fileName); + String formattedValue = formatValueBasedOnAttrType(colAttr, value); + + BlackboardAttribute attr = (value == null) ? null : getAttribute(colAttr.getAttributeType(), formattedValue, fileName); if (attr == null) { logger.log(Level.WARNING, String.format("Blackboard attribute could not be parsed column %s at line %d in file %s. Omitting row.", colAttr.getColumnName(), lineNum, fileName)); return Collections.emptyList(); @@ -394,6 +397,21 @@ public final class LeappFileProcessor { return attrsToRet; } + /** + * Check type of attribute and possibly format string based on it. + * + * @param colAttr Column Attribute information + * @param value string to be formatted + * @return formatted string based on attribute type if no attribute type found then return original string + */ + private String formatValueBasedOnAttrType(TsvColumn colAttr, String value) { + if (colAttr.getAttributeType().getTypeName().equals("TSK_DOMAIN")) { + return NetworkUtils.extractDomain(value); + } + + return value; + } + /** * The format of time stamps in tsv. */ From e86e5fc58ec8369ff3d7e39a9052a9b0801fa7f6 Mon Sep 17 00:00:00 2001 From: Mark McKinnon Date: Tue, 2 Feb 2021 18:23:31 -0500 Subject: [PATCH 24/41] Check if aLeapp/iLeapp is on 32bit system and fail if it is Check is aLeapp/iLeapp is on a 32bit system and fail quietly if it is. --- .../leappanalyzers/ALeappAnalyzerIngestModule.java | 10 ++++++++++ .../autopsy/modules/leappanalyzers/Bundle.properties | 4 +++- .../modules/leappanalyzers/Bundle.properties-MERGED | 2 ++ .../leappanalyzers/ILeappAnalyzerIngestModule.java | 10 ++++++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ALeappAnalyzerIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ALeappAnalyzerIngestModule.java index acb0acbc7d..6dad1ceda6 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ALeappAnalyzerIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ALeappAnalyzerIngestModule.java @@ -65,6 +65,7 @@ public class ALeappAnalyzerIngestModule implements DataSourceIngestModule { private static final Logger logger = Logger.getLogger(ALeappAnalyzerIngestModule.class.getName()); private static final String MODULE_NAME = ALeappAnalyzerModuleFactory.getModuleName(); + private final IngestServices services = IngestServices.getInstance(); private static final String ALEAPP = "aLeapp"; //NON-NLS private static final String ALEAPP_FS = "fs_"; //NON-NLS @@ -123,6 +124,15 @@ public class ALeappAnalyzerIngestModule implements DataSourceIngestModule { @Override public ProcessResult process(Content dataSource, DataSourceIngestModuleProgress statusHelper) { + if (false == PlatformUtil.is64BitOS()) { + IngestMessage ingestMessage = IngestMessage.createErrorMessage(ALeappAnalyzerModuleFactory.getModuleName(), + NbBundle.getMessage(this.getClass(), "AleappAnalyzerIngestModule.not.64.bit.os"), + NbBundle.getMessage(this.getClass(), "AleappAnalyzerIngestModule.not.64.bit.os")); + services.postMessage(ingestMessage); + logger.log(Level.INFO, "aLeapp will not run on 32bit operating system"); + return ProcessResult.OK; + } + Case currentCase = Case.getCurrentCase(); Path tempOutputPath = Paths.get(currentCase.getTempDirectory(), ALEAPP, ALEAPP_FS + dataSource.getId()); try { diff --git a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/Bundle.properties index 4236fad631..06d30c03a5 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/Bundle.properties @@ -2,7 +2,9 @@ ILeappAnalyzerIngestModule.init.exception.msg=Unable to find {0}. ILeappAnalyzerIngestModule.processing.file=Processing file {0} ILeappAnalyzerIngestModule.parsing.file=Parsing file {0} ILeappAnalyzerIngestModule.processing.filesystem=Processing filesystem +IleappAnalyzerIngestModule.not.64.bit.os=iLeapp will not run on 32bit operating system ALeappAnalyzerIngestModule.init.exception.msg=Unable to find {0}. ALeappAnalyzerIngestModule.processing.file=Processing file {0} ALeappAnalyzerIngestModule.parsing.file=Parsing file {0} -ALeappAnalyzerIngestModule.processing.filesystem=Processing filesystem \ No newline at end of file +ALeappAnalyzerIngestModule.processing.filesystem=Processing filesystem +AleappAnalyzerIngestModule.not.64.bit.os=aLeapp will not run on 32bit operating system \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/Bundle.properties-MERGED index b23a428107..123986b7d6 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/Bundle.properties-MERGED @@ -22,10 +22,12 @@ ILeappAnalyzerIngestModule.init.exception.msg=Unable to find {0}. ILeappAnalyzerIngestModule.processing.file=Processing file {0} ILeappAnalyzerIngestModule.parsing.file=Parsing file {0} ILeappAnalyzerIngestModule.processing.filesystem=Processing filesystem +IleappAnalyzerIngestModule.not.64.bit.os=iLeapp will not run on 32bit operating system ALeappAnalyzerIngestModule.init.exception.msg=Unable to find {0}. ALeappAnalyzerIngestModule.processing.file=Processing file {0} ALeappAnalyzerIngestModule.parsing.file=Parsing file {0} ALeappAnalyzerIngestModule.processing.filesystem=Processing filesystem +AleappAnalyzerIngestModule.not.64.bit.os=aLeapp will not run on 32bit operating system ILeappAnalyzerIngestModule.report.name=iLeapp Html Report ILeappAnalyzerIngestModule.requires.windows=iLeapp module requires windows. ILeappAnalyzerIngestModule.running.iLeapp=Running iLeapp diff --git a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ILeappAnalyzerIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ILeappAnalyzerIngestModule.java index 70e811905c..35b02dad64 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ILeappAnalyzerIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ILeappAnalyzerIngestModule.java @@ -65,6 +65,7 @@ public class ILeappAnalyzerIngestModule implements DataSourceIngestModule { private static final Logger logger = Logger.getLogger(ILeappAnalyzerIngestModule.class.getName()); private static final String MODULE_NAME = ILeappAnalyzerModuleFactory.getModuleName(); + private final IngestServices services = IngestServices.getInstance(); private static final String ILEAPP = "iLeapp"; //NON-NLS private static final String ILEAPP_FS = "fs_"; //NON-NLS @@ -123,6 +124,15 @@ public class ILeappAnalyzerIngestModule implements DataSourceIngestModule { @Override public ProcessResult process(Content dataSource, DataSourceIngestModuleProgress statusHelper) { + if (false == PlatformUtil.is64BitOS()) { + IngestMessage ingestMessage = IngestMessage.createErrorMessage(ILeappAnalyzerModuleFactory.getModuleName(), + NbBundle.getMessage(this.getClass(), "IleappAnalyzerIngestModule.not.64.bit.os"), + NbBundle.getMessage(this.getClass(), "IleappAnalyzerIngestModule.not.64.bit.os")); + services.postMessage(ingestMessage); + logger.log(Level.INFO, "iLeapp will not run on 32bit operating system"); + return ProcessResult.OK; + } + Case currentCase = Case.getCurrentCase(); Path tempOutputPath = Paths.get(currentCase.getTempDirectory(), ILEAPP, ILEAPP_FS + dataSource.getId()); try { From 287f01f0c2ea1541f891dbac09c5d3b980a6ec77 Mon Sep 17 00:00:00 2001 From: Mark McKinnon Date: Wed, 3 Feb 2021 10:20:42 -0500 Subject: [PATCH 25/41] Update CorrelationAttributeNormalizer.java Add sanization check in CR --- .../datamodel/CorrelationAttributeNormalizer.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationAttributeNormalizer.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationAttributeNormalizer.java index 51b9b80f84..f7d423c85d 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationAttributeNormalizer.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/CorrelationAttributeNormalizer.java @@ -27,6 +27,7 @@ import java.util.Set; import org.apache.commons.lang.StringUtils; import org.apache.commons.validator.routines.DomainValidator; import org.apache.commons.validator.routines.EmailValidator; +import org.sleuthkit.autopsy.coreutils.NetworkUtils; /** * Provides functions for normalizing data by attribute type before insertion or @@ -144,11 +145,11 @@ final public class CorrelationAttributeNormalizer { private static String normalizeDomain(String data) throws CorrelationAttributeNormalizationException { DomainValidator validator = DomainValidator.getInstance(true); if (validator.isValid(data)) { - return data.toLowerCase(); + return NetworkUtils.extractDomain(data.toLowerCase()); } else { final String validIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"; if (data.matches(validIpAddressRegex)) { - return data; + return NetworkUtils.extractDomain(data); } else { throw new CorrelationAttributeNormalizationException(String.format("Data was expected to be a valid domain: %s", data)); } From 60fa44c5a6995e6095f7e6b4c9cdb286ebcfe7b0 Mon Sep 17 00:00:00 2001 From: Eugene Livis Date: Wed, 3 Feb 2021 11:32:49 -0500 Subject: [PATCH 26/41] Starting SU Solr server on background thread --- .../autopsy/keywordsearch/Installer.java | 38 +++++++++++++------ .../autopsy/keywordsearch/Server.java | 4 +- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Installer.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Installer.java index 04bcbf6940..126d7fa4ba 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Installer.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Installer.java @@ -18,6 +18,9 @@ */ package org.sleuthkit.autopsy.keywordsearch; +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.logging.Level; import org.apache.solr.client.solrj.SolrServerException; import org.openide.modules.ModuleInstall; @@ -39,6 +42,7 @@ class Installer extends ModuleInstall { private static final Logger logger = Logger.getLogger(Installer.class.getName()); private static final long serialVersionUID = 1L; + private static final String KWS_START_THREAD_NAME = "KWS-server-start-%d"; @Override public void restored() { @@ -46,19 +50,29 @@ class Installer extends ModuleInstall { KeywordSearchSettings.setDefaults(); final Server server = KeywordSearch.getServer(); - try { - server.start(); - } catch (SolrServerNoPortException ex) { - logger.log(Level.SEVERE, "Failed to start Keyword Search server: ", ex); //NON-NLS - if (ex.getPortNumber() == server.getLocalSolrServerPort()) { - reportPortError(ex.getPortNumber()); - } else { - reportStopPortError(ex.getPortNumber()); + + ExecutorService jobProcessingExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(KWS_START_THREAD_NAME).build()); + Runnable kwsStartTask = new Runnable() { + public void run() { + try { + server.start(); + } catch (SolrServerNoPortException ex) { + logger.log(Level.SEVERE, "Failed to start Keyword Search server: ", ex); //NON-NLS + if (ex.getPortNumber() == server.getLocalSolrServerPort()) { + reportPortError(ex.getPortNumber()); + } else { + reportStopPortError(ex.getPortNumber()); + } + } catch (KeywordSearchModuleException | SolrServerException ex) { + logger.log(Level.SEVERE, "Failed to start Keyword Search server: ", ex); //NON-NLS + reportInitError(ex.getMessage()); + } } - } catch (KeywordSearchModuleException | SolrServerException ex) { - logger.log(Level.SEVERE, "Failed to start Keyword Search server: ", ex); //NON-NLS - reportInitError(ex.getMessage()); - } + }; + + // start KWS service on the background thread. Currently all it does is start the embedded Solr server. + jobProcessingExecutor.submit(kwsStartTask); + jobProcessingExecutor.shutdown(); // tell executor no more work is coming } @Override diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java index a27eb4db78..732d5ed53e 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java @@ -664,11 +664,13 @@ public class Server { */ @NbBundle.Messages({ "Server.status.failed.msg=Local Solr server did not respond to status request. This may be because the server failed to start or is taking too long to initialize.",}) - void startLocalSolr(SOLR_VERSION version) throws KeywordSearchModuleException, SolrServerNoPortException, SolrServerException { + synchronized void startLocalSolr(SOLR_VERSION version) throws KeywordSearchModuleException, SolrServerNoPortException, SolrServerException { + logger.log(Level.INFO, "Starting local Solr " + version + " server"); //NON-NLS if (isLocalSolrRunning()) { if (localServerVersion.equals(version)) { // this version of local server is already running + logger.log(Level.INFO, "Local Solr " + version + " server is already running"); //NON-NLS return; } else { // wrong version of local server is running, stop it From 0b17dd877e6bbdc21f2f4af7ed63984464ac8ad8 Mon Sep 17 00:00:00 2001 From: apriestman Date: Wed, 3 Feb 2021 13:13:57 -0500 Subject: [PATCH 27/41] Copy host into portable case. --- .../portablecase/PortableCaseReportModule.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/portablecase/PortableCaseReportModule.java b/Core/src/org/sleuthkit/autopsy/report/modules/portablecase/PortableCaseReportModule.java index 164c2e0faf..cc2adf377a 100644 --- a/Core/src/org/sleuthkit/autopsy/report/modules/portablecase/PortableCaseReportModule.java +++ b/Core/src/org/sleuthkit/autopsy/report/modules/portablecase/PortableCaseReportModule.java @@ -71,6 +71,7 @@ import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.ContentTag; import org.sleuthkit.datamodel.DataSource; import org.sleuthkit.datamodel.FileSystem; +import org.sleuthkit.datamodel.Host; import org.sleuthkit.datamodel.Image; import org.sleuthkit.datamodel.LocalFilesDataSource; import org.sleuthkit.datamodel.Pool; @@ -1079,12 +1080,20 @@ public class PortableCaseReportModule implements ReportModule { BlackboardArtifact artifactToCopy = (BlackboardArtifact) content; newContent = copyArtifact(parentId, artifactToCopy); } else { + + // Get or create the host (if needed) before beginning transaction. + Host newHost = null; + if (content instanceof DataSource) { + Host oldHost = ((DataSource)content).getHost(); + newHost = portableSkCase.getHostManager().getOrCreateHost(oldHost.getName()); + } + CaseDbTransaction trans = portableSkCase.beginTransaction(); try { if (content instanceof Image) { Image image = (Image) content; newContent = portableSkCase.addImage(image.getType(), image.getSsize(), image.getSize(), image.getName(), - new ArrayList<>(), image.getTimeZone(), image.getMd5(), image.getSha1(), image.getSha256(), image.getDeviceId(), trans); + new ArrayList<>(), image.getTimeZone(), image.getMd5(), image.getSha1(), image.getSha256(), image.getDeviceId(), newHost, trans); } else if (content instanceof VolumeSystem) { VolumeSystem vs = (VolumeSystem) content; newContent = portableSkCase.addVolumeSystem(parentId, vs.getType(), vs.getOffset(), vs.getBlockSize(), trans); @@ -1108,7 +1117,7 @@ public class PortableCaseReportModule implements ReportModule { if (abstractFile instanceof LocalFilesDataSource) { LocalFilesDataSource localFilesDS = (LocalFilesDataSource) abstractFile; - newContent = portableSkCase.addLocalFilesDataSource(localFilesDS.getDeviceId(), localFilesDS.getName(), localFilesDS.getTimeZone(), trans); + newContent = portableSkCase.addLocalFilesDataSource(localFilesDS.getDeviceId(), localFilesDS.getName(), localFilesDS.getTimeZone(), newHost, trans); } else { if (abstractFile.isDir()) { newContent = portableSkCase.addLocalDirectory(parentId, abstractFile.getName(), trans); From 16bc57487f734301cda362c637bdbd1da1309b02 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Wed, 3 Feb 2021 13:19:39 -0500 Subject: [PATCH 28/41] Added drone module name change to ingestjobsettings list --- Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettings.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettings.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettings.java index 0dbbaebb57..918c30760f 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettings.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobSettings.java @@ -477,6 +477,9 @@ public final class IngestJobSettings { case "Exif Parser": //NON-NLS moduleNames.add("Picture Analyzer"); //NON-NLS break; + case "Drone Analyzer": + moduleNames.add("DJI Drone Analyzer"); + break; default: moduleNames.add(name); } From 138a5f57d08c348e48bf7bfb01d3caf5c4b56148 Mon Sep 17 00:00:00 2001 From: Mark McKinnon Date: Wed, 3 Feb 2021 15:09:42 -0500 Subject: [PATCH 29/41] Put check code in start of Ingest instead of Process Put check for 32bit in start of ingest instead of process. --- .../leappanalyzers/ALeappAnalyzerIngestModule.java | 14 ++++---------- .../leappanalyzers/ILeappAnalyzerIngestModule.java | 14 ++++---------- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ALeappAnalyzerIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ALeappAnalyzerIngestModule.java index 6dad1ceda6..3409098d95 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ALeappAnalyzerIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ALeappAnalyzerIngestModule.java @@ -65,7 +65,6 @@ public class ALeappAnalyzerIngestModule implements DataSourceIngestModule { private static final Logger logger = Logger.getLogger(ALeappAnalyzerIngestModule.class.getName()); private static final String MODULE_NAME = ALeappAnalyzerModuleFactory.getModuleName(); - private final IngestServices services = IngestServices.getInstance(); private static final String ALEAPP = "aLeapp"; //NON-NLS private static final String ALEAPP_FS = "fs_"; //NON-NLS @@ -93,6 +92,10 @@ public class ALeappAnalyzerIngestModule implements DataSourceIngestModule { public void startUp(IngestJobContext context) throws IngestModuleException { this.context = context; + if (false == PlatformUtil.is64BitOS()) { + throw new IngestModuleException(NbBundle.getMessage(this.getClass(), "AleappAnalyzerIngestModule.not.64.bit.os")); + } + if (false == PlatformUtil.isWindowsOS()) { throw new IngestModuleException(Bundle.ALeappAnalyzerIngestModule_requires_windows()); } @@ -124,15 +127,6 @@ public class ALeappAnalyzerIngestModule implements DataSourceIngestModule { @Override public ProcessResult process(Content dataSource, DataSourceIngestModuleProgress statusHelper) { - if (false == PlatformUtil.is64BitOS()) { - IngestMessage ingestMessage = IngestMessage.createErrorMessage(ALeappAnalyzerModuleFactory.getModuleName(), - NbBundle.getMessage(this.getClass(), "AleappAnalyzerIngestModule.not.64.bit.os"), - NbBundle.getMessage(this.getClass(), "AleappAnalyzerIngestModule.not.64.bit.os")); - services.postMessage(ingestMessage); - logger.log(Level.INFO, "aLeapp will not run on 32bit operating system"); - return ProcessResult.OK; - } - Case currentCase = Case.getCurrentCase(); Path tempOutputPath = Paths.get(currentCase.getTempDirectory(), ALEAPP, ALEAPP_FS + dataSource.getId()); try { diff --git a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ILeappAnalyzerIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ILeappAnalyzerIngestModule.java index 35b02dad64..339be316a9 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ILeappAnalyzerIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/ILeappAnalyzerIngestModule.java @@ -65,7 +65,6 @@ public class ILeappAnalyzerIngestModule implements DataSourceIngestModule { private static final Logger logger = Logger.getLogger(ILeappAnalyzerIngestModule.class.getName()); private static final String MODULE_NAME = ILeappAnalyzerModuleFactory.getModuleName(); - private final IngestServices services = IngestServices.getInstance(); private static final String ILEAPP = "iLeapp"; //NON-NLS private static final String ILEAPP_FS = "fs_"; //NON-NLS @@ -93,6 +92,10 @@ public class ILeappAnalyzerIngestModule implements DataSourceIngestModule { public void startUp(IngestJobContext context) throws IngestModuleException { this.context = context; + if (false == PlatformUtil.is64BitOS()) { + throw new IngestModuleException(NbBundle.getMessage(this.getClass(), "IleappAnalyzerIngestModule.not.64.bit.os")); + } + if (false == PlatformUtil.isWindowsOS()) { throw new IngestModuleException(Bundle.ILeappAnalyzerIngestModule_requires_windows()); } @@ -124,15 +127,6 @@ public class ILeappAnalyzerIngestModule implements DataSourceIngestModule { @Override public ProcessResult process(Content dataSource, DataSourceIngestModuleProgress statusHelper) { - if (false == PlatformUtil.is64BitOS()) { - IngestMessage ingestMessage = IngestMessage.createErrorMessage(ILeappAnalyzerModuleFactory.getModuleName(), - NbBundle.getMessage(this.getClass(), "IleappAnalyzerIngestModule.not.64.bit.os"), - NbBundle.getMessage(this.getClass(), "IleappAnalyzerIngestModule.not.64.bit.os")); - services.postMessage(ingestMessage); - logger.log(Level.INFO, "iLeapp will not run on 32bit operating system"); - return ProcessResult.OK; - } - Case currentCase = Case.getCurrentCase(); Path tempOutputPath = Paths.get(currentCase.getTempDirectory(), ILEAPP, ILEAPP_FS + dataSource.getId()); try { From c5e00cc8d46f69b1f96176951a91775715c39b11 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Wed, 3 Feb 2021 15:11:54 -0500 Subject: [PATCH 30/41] Fixed confusing message issue --- .../autopsy/imagegallery/ImageGalleryController.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java index 95509c4c16..d9746bda88 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java @@ -839,8 +839,11 @@ public final class ImageGalleryController { Content newDataSource = (Content) event.getNewValue(); if (isListeningEnabled()) { try { - drawableDB.insertOrUpdateDataSource(newDataSource.getId(), DrawableDB.DrawableDbBuildStatusEnum.UNKNOWN); - } catch (SQLException ex) { + // status of UNKNOWN from getDataSourceDbBuildStatus means that the data source is not known + if(drawableDB.getDataSourceDbBuildStatus(newDataSource.getId()) == DrawableDB.DrawableDbBuildStatusEnum.UNKNOWN) { + drawableDB.insertOrUpdateDataSource(newDataSource.getId(), DrawableDB.DrawableDbBuildStatusEnum.UNKNOWN); + } + } catch (SQLException | TskCoreException ex) { logger.log(Level.SEVERE, String.format("Error updating datasources table (data source object ID = %d, status = %s)", newDataSource.getId(), DrawableDB.DrawableDbBuildStatusEnum.UNKNOWN.toString()), ex); //NON-NLS } } From 5aed1e565ca7ffaa6d9b0a9cea2c84a3099e7ae8 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Wed, 3 Feb 2021 16:09:35 -0500 Subject: [PATCH 31/41] Fixed comment --- .../sleuthkit/autopsy/imagegallery/ImageGalleryController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java index d9746bda88..0ddded910b 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java @@ -839,7 +839,7 @@ public final class ImageGalleryController { Content newDataSource = (Content) event.getNewValue(); if (isListeningEnabled()) { try { - // status of UNKNOWN from getDataSourceDbBuildStatus means that the data source is not known + // Only add the data source if is not in the database if(drawableDB.getDataSourceDbBuildStatus(newDataSource.getId()) == DrawableDB.DrawableDbBuildStatusEnum.UNKNOWN) { drawableDB.insertOrUpdateDataSource(newDataSource.getId(), DrawableDB.DrawableDbBuildStatusEnum.UNKNOWN); } From ae7e6137a2f1a2be82ecb10dc5b85275e694ed13 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Wed, 3 Feb 2021 17:48:16 -0500 Subject: [PATCH 32/41] Modified change comment for clarification --- .../sleuthkit/autopsy/imagegallery/ImageGalleryController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java index 0ddded910b..d365df4e8c 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java @@ -839,7 +839,7 @@ public final class ImageGalleryController { Content newDataSource = (Content) event.getNewValue(); if (isListeningEnabled()) { try { - // Only add the data source if is not in the database + // If the data source already exists and has a status other than UNKNOWN, don’t overwrite it. if(drawableDB.getDataSourceDbBuildStatus(newDataSource.getId()) == DrawableDB.DrawableDbBuildStatusEnum.UNKNOWN) { drawableDB.insertOrUpdateDataSource(newDataSource.getId(), DrawableDB.DrawableDbBuildStatusEnum.UNKNOWN); } From bde399ffd8e284ec0ded7df4c2aab43b86863bf7 Mon Sep 17 00:00:00 2001 From: Mark McKinnon Date: Thu, 4 Feb 2021 14:49:51 -0500 Subject: [PATCH 33/41] Update Bundle.properties fix message to user. --- .../autopsy/modules/leappanalyzers/Bundle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/Bundle.properties index 06d30c03a5..5dfed94624 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/Bundle.properties @@ -2,9 +2,9 @@ ILeappAnalyzerIngestModule.init.exception.msg=Unable to find {0}. ILeappAnalyzerIngestModule.processing.file=Processing file {0} ILeappAnalyzerIngestModule.parsing.file=Parsing file {0} ILeappAnalyzerIngestModule.processing.filesystem=Processing filesystem -IleappAnalyzerIngestModule.not.64.bit.os=iLeapp will not run on 32bit operating system +IleappAnalyzerIngestModule.not.64.bit.os=iLeapp will not run on a 32bit operating system ALeappAnalyzerIngestModule.init.exception.msg=Unable to find {0}. ALeappAnalyzerIngestModule.processing.file=Processing file {0} ALeappAnalyzerIngestModule.parsing.file=Parsing file {0} ALeappAnalyzerIngestModule.processing.filesystem=Processing filesystem -AleappAnalyzerIngestModule.not.64.bit.os=aLeapp will not run on 32bit operating system \ No newline at end of file +AleappAnalyzerIngestModule.not.64.bit.os=aLeapp will not run on a 32bit operating system \ No newline at end of file From bb4f15093b162175dbe6ca14c3cb12e314dc20e0 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Fri, 5 Feb 2021 11:05:54 -0500 Subject: [PATCH 34/41] file types implementation --- .../autopsy/datamodel/FileTypes.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypes.java b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypes.java index aa1d0a04ec..1a7abab0f9 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/FileTypes.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/FileTypes.java @@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.datamodel; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.Observable; import java.util.Observer; @@ -34,6 +35,8 @@ import org.openide.util.Lookup; import org.openide.util.NbBundle; import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.datamodel.AnalysisResult; +import org.sleuthkit.datamodel.AnalysisResultAdded; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.Content; @@ -43,6 +46,7 @@ import org.sleuthkit.datamodel.Directory; import org.sleuthkit.datamodel.File; import org.sleuthkit.datamodel.LayoutFile; import org.sleuthkit.datamodel.LocalFile; +import org.sleuthkit.datamodel.Score; import org.sleuthkit.datamodel.SlackFile; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.SleuthkitItemVisitor; @@ -449,5 +453,25 @@ public final class FileTypes implements AutopsyVisitableItem { public long getAllArtifactsCount() throws TskCoreException { return content.getAllArtifactsCount(); } + + @Override + public AnalysisResultAdded newAnalysisResult(BlackboardArtifact.Type type, Score score, String string, String string1, String string2, Collection clctn) throws TskCoreException { + return content.newAnalysisResult(type, score, string, string1, string2, clctn); + } + + @Override + public Score getAggregateScore() throws TskCoreException { + return content.getAggregateScore(); + } + + @Override + public List getAnalysisResults(BlackboardArtifact.Type type) throws TskCoreException { + return content.getAnalysisResults(type); + } + + @Override + public List getAllAnalysisResults() throws TskCoreException { + return content.getAllAnalysisResults(); + } } } From 72c95fb491a1f55ef7b2b45a0c027c0b21ad07b8 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Mon, 8 Feb 2021 10:33:49 -0500 Subject: [PATCH 35/41] Missing RA change for PR 6688 --- .../src/org/sleuthkit/autopsy/recentactivity/ExtractIE.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractIE.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractIE.java index 50568a2b2e..93f901d1a2 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractIE.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractIE.java @@ -267,7 +267,7 @@ class ExtractIE extends Extract { Collection bbattributes = new ArrayList<>(); bbattributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_URL, RecentActivityExtracterModuleFactory.getModuleName(), url)); - bbattributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_DATETIME, + bbattributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_DATETIME_CREATED, RecentActivityExtracterModuleFactory.getModuleName(), datetime)); bbattributes.add(new BlackboardAttribute(ATTRIBUTE_TYPE.TSK_NAME, RecentActivityExtracterModuleFactory.getModuleName(), (name != null) ? name : "")); From 3812a2532d25650232c8fb7853e3a10a6a3c5af0 Mon Sep 17 00:00:00 2001 From: apriestman Date: Mon, 8 Feb 2021 15:51:17 -0500 Subject: [PATCH 36/41] Upgrade to JNA 5.6.0 --- CoreLibs/ivy.xml | 2 +- CoreLibs/nbproject/project.properties | 4 ++-- CoreLibs/nbproject/project.xml | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CoreLibs/ivy.xml b/CoreLibs/ivy.xml index 1c83e48a09..7457154839 100644 --- a/CoreLibs/ivy.xml +++ b/CoreLibs/ivy.xml @@ -14,7 +14,7 @@ - + diff --git a/CoreLibs/nbproject/project.properties b/CoreLibs/nbproject/project.properties index fb53508bb4..3d8ebb951a 100644 --- a/CoreLibs/nbproject/project.properties +++ b/CoreLibs/nbproject/project.properties @@ -42,8 +42,8 @@ file.reference.javassist-3.12.1.GA.jar=release/modules/ext/javassist-3.12.1.GA.j file.reference.jfxtras-common-8.0-r4.jar=release/modules/ext/jfxtras-common-8.0-r4.jar file.reference.jfxtras-controls-8.0-r4.jar=release/modules/ext/jfxtras-controls-8.0-r4.jar file.reference.jfxtras-fxml-8.0-r4.jar=release/modules/ext/jfxtras-fxml-8.0-r4.jar -file.reference.jna-5.6.0.jar=release/modules/ext/jna-5.6.0.jar -file.reference.jna-platform-5.6.0.jar=release/modules/ext/jna-platform-5.6.0.jar +file.reference.jna-5.7.0.jar=release/modules/ext/jna-5.7.0.jar +file.reference.jna-platform-5.7.0.jar=release/modules/ext/jna-platform-5.7.0.jar file.reference.joda-time-2.4.jar=release/modules/ext/joda-time-2.4.jar file.reference.jsr305-1.3.9.jar=release/modules/ext/jsr305-1.3.9.jar file.reference.LGoodDatePicker-10.3.1.jar=release/modules/ext/LGoodDatePicker-10.3.1.jar diff --git a/CoreLibs/nbproject/project.xml b/CoreLibs/nbproject/project.xml index f697a317ee..24219c333d 100644 --- a/CoreLibs/nbproject/project.xml +++ b/CoreLibs/nbproject/project.xml @@ -923,8 +923,8 @@ release/modules/ext/commons-compress-1.18.jar - ext/jna-platform-5.6.0.jar - release\modules\ext\jna-platform-5.6.0.jar + ext/jna-platform-5.7.0.jar + release\modules\ext\jna-platform-5.7.0.jar ext/opencv-248.jar @@ -951,8 +951,8 @@ release/modules/ext/imageio-bmp-3.2.jar - ext/jna-5.6.0.jar - release\modules\ext\jna-5.6.0.jar + ext/jna-5.7.0.jar + release\modules\ext\jna-5.7.0.jar ext/commons-lang-2.6.jar From cdb03863e4475c74eb209db346f681424898b476 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 8 Feb 2021 22:08:36 -0500 Subject: [PATCH 37/41] 7184 resizing and min size changes --- .../discovery/ui/ArtifactsListPanel.java | 2 + .../discovery/ui/DomainArtifactsTabPanel.form | 5 +- .../discovery/ui/DomainArtifactsTabPanel.java | 33 +++++++++++- .../ui/MiniTimelineArtifactListPanel.java | 4 +- .../ui/MiniTimelineDateListPanel.java | 4 +- .../discovery/ui/MiniTimelinePanel.form | 8 ++- .../discovery/ui/MiniTimelinePanel.java | 52 ++++++++++++++++++- 7 files changed, 100 insertions(+), 8 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsListPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsListPanel.java index ae416d0e7f..d1328ef68c 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsListPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/ArtifactsListPanel.java @@ -18,6 +18,7 @@ */ package org.sleuthkit.autopsy.discovery.ui; +import java.awt.Dimension; import java.awt.Point; import java.util.ArrayList; import java.util.List; @@ -63,6 +64,7 @@ final class ArtifactsListPanel extends AbstractArtifactListPanel { for (int i = 0; i < tableModel.getColumnCount(); ++i) { artifactsTable.getColumnModel().getColumn(i).setCellRenderer(renderer); } + setMinimumSize(new Dimension(125, 20)); artifactsTable.getRowSorter().toggleSortOrder(0); artifactsTable.getRowSorter().toggleSortOrder(0); } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.form b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.form index bdef0da96f..0745e113c8 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.form +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.form @@ -4,8 +4,11 @@ - + + + + diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.java index e4ce23b865..550b2252e8 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.java @@ -20,8 +20,12 @@ package org.sleuthkit.autopsy.discovery.ui; import org.sleuthkit.autopsy.contentviewers.artifactviewers.GeneralPurposeArtifactViewer; import com.google.common.eventbus.Subscribe; +import java.awt.Dimension; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.util.logging.Level; import javax.swing.JPanel; +import javax.swing.JSplitPane; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; @@ -41,13 +45,18 @@ final class DomainArtifactsTabPanel extends JPanel { private final ArtifactsListPanel listPanel; private final BlackboardArtifact.ARTIFACT_TYPE artifactType; private AbstractArtifactDetailsPanel rightPanel = null; + private int dividerLocation = 300; + private final PropertyChangeListener dividerListener; private ArtifactRetrievalStatus status = ArtifactRetrievalStatus.UNPOPULATED; private final ListSelectionListener listener = new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent event) { if (!event.getValueIsAdjusting()) { + mainSplitPane.removePropertyChangeListener(dividerListener); rightPanel.setArtifact(listPanel.getSelectedArtifact()); + mainSplitPane.setDividerLocation(dividerLocation); + mainSplitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, dividerListener); } } }; @@ -60,12 +69,27 @@ final class DomainArtifactsTabPanel extends JPanel { @ThreadConfined(type = ThreadConfined.ThreadType.AWT) DomainArtifactsTabPanel(BlackboardArtifact.ARTIFACT_TYPE type) { initComponents(); + dividerListener = new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (evt.getPropertyName().equalsIgnoreCase(JSplitPane.DIVIDER_LOCATION_PROPERTY) + && evt.getNewValue() instanceof Integer + && evt.getOldValue() instanceof Integer + && (JSplitPane.UNDEFINED_CONDITION != (int) evt.getNewValue())) { + dividerLocation = (int) evt.getNewValue(); + } + } + }; this.artifactType = type; listPanel = new ArtifactsListPanel(artifactType); + listPanel.setPreferredSize(new Dimension(100, 20)); listPanel.addMouseListener(new ArtifactMenuMouseAdapter(listPanel)); + mainSplitPane.setLeftComponent(listPanel); add(mainSplitPane); setRightComponent(); + mainSplitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, dividerListener); + dividerLocation = mainSplitPane.getDividerLocation(); listPanel.addSelectionListener(listener); } @@ -121,6 +145,7 @@ final class DomainArtifactsTabPanel extends JPanel { @ThreadConfined(type = ThreadConfined.ThreadType.AWT) void setStatus(ArtifactRetrievalStatus status) { this.status = status; + mainSplitPane.removePropertyChangeListener(dividerListener); if (status == ArtifactRetrievalStatus.UNPOPULATED) { listPanel.clearList(); removeAll(); @@ -132,6 +157,8 @@ final class DomainArtifactsTabPanel extends JPanel { removeAll(); add(new LoadingPanel(artifactType.getDisplayName())); } + mainSplitPane.setDividerLocation(dividerLocation); + mainSplitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, dividerListener); } /** @@ -144,6 +171,7 @@ final class DomainArtifactsTabPanel extends JPanel { void handleArtifactSearchResultEvent(DiscoveryEventUtils.ArtifactSearchResultEvent artifactresultEvent) { if (artifactType == artifactresultEvent.getArtifactType() && status == ArtifactRetrievalStatus.POPULATING) { SwingUtilities.invokeLater(() -> { + mainSplitPane.removePropertyChangeListener(dividerListener); listPanel.removeSelectionListener(listener); listPanel.addArtifacts(artifactresultEvent.getListOfArtifacts()); status = ArtifactRetrievalStatus.POPULATED; @@ -152,6 +180,8 @@ final class DomainArtifactsTabPanel extends JPanel { listPanel.selectFirst(); removeAll(); add(mainSplitPane); + mainSplitPane.setDividerLocation(dividerLocation); + mainSplitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, dividerListener); if (artifactresultEvent.shouldGrabFocus()) { focusList(); } @@ -188,8 +218,9 @@ final class DomainArtifactsTabPanel extends JPanel { mainSplitPane = new javax.swing.JSplitPane(); - mainSplitPane.setDividerLocation(350); + mainSplitPane.setDividerLocation(dividerLocation); mainSplitPane.setResizeWeight(0.1); + mainSplitPane.setLastDividerLocation(250); setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); setMinimumSize(new java.awt.Dimension(0, 0)); diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelineArtifactListPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelineArtifactListPanel.java index 87a59edcf4..65362f72ff 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelineArtifactListPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelineArtifactListPanel.java @@ -18,6 +18,7 @@ */ package org.sleuthkit.autopsy.discovery.ui; +import java.awt.Dimension; import java.awt.Point; import java.util.ArrayList; import java.util.List; @@ -39,7 +40,7 @@ import org.sleuthkit.datamodel.TskCoreException; /** * Panel to display list of artifacts types and descriptions. */ -class MiniTimelineArtifactListPanel extends AbstractArtifactListPanel { +final class MiniTimelineArtifactListPanel extends AbstractArtifactListPanel { private static final long serialVersionUID = 1L; private final TypeDescriptionTableModel tableModel; @@ -61,6 +62,7 @@ class MiniTimelineArtifactListPanel extends AbstractArtifactListPanel { for (int i = 0; i < tableModel.getColumnCount(); ++i) { artifactsTable.getColumnModel().getColumn(i).setCellRenderer(renderer); } + setMinimumSize(new Dimension(125, 20)); artifactsTable.getRowSorter().toggleSortOrder(0); artifactsTable.getRowSorter().toggleSortOrder(0); } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelineDateListPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelineDateListPanel.java index 28c68c6ce6..8ede83b6d5 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelineDateListPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelineDateListPanel.java @@ -18,6 +18,7 @@ */ package org.sleuthkit.autopsy.discovery.ui; +import java.awt.Dimension; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; @@ -33,7 +34,7 @@ import org.sleuthkit.datamodel.BlackboardArtifact; /** * Panel to display list of dates and counts. */ -class MiniTimelineDateListPanel extends JPanel { +final class MiniTimelineDateListPanel extends JPanel { private static final long serialVersionUID = 1L; private final DateCountTableModel tableModel = new DateCountTableModel(); @@ -49,6 +50,7 @@ class MiniTimelineDateListPanel extends JPanel { for (int i = 0; i < tableModel.getColumnCount(); ++i) { jTable1.getColumnModel().getColumn(i).setCellRenderer(renderer); } + setMinimumSize(new Dimension(125, 20)); jTable1.getRowSorter().toggleSortOrder(0); jTable1.getRowSorter().toggleSortOrder(0); } diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.form b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.form index 0f0598a148..772dbd54b3 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.form +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.form @@ -4,7 +4,9 @@ - + + + @@ -16,7 +18,9 @@ - + + + diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.java index 87c99ad724..7365a860b2 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.java @@ -19,6 +19,10 @@ package org.sleuthkit.autopsy.discovery.ui; import com.google.common.eventbus.Subscribe; +import java.awt.Dimension; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import javax.swing.JSplitPane; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; @@ -42,6 +46,9 @@ final class MiniTimelinePanel extends javax.swing.JPanel { private String selectedDomain = null; private final ListSelectionListener artifactListener; private final ListSelectionListener dateListener; + private int leftSplitPaneDividerLocation = 125; + private int mainSplitPaneDividerLocation = 300; + private final PropertyChangeListener dividerListener; @NbBundle.Messages({"MiniTimelinePanel.loadingPanel.details=the Timeline view"}) /** @@ -62,22 +69,51 @@ final class MiniTimelinePanel extends javax.swing.JPanel { } else { rightPanel = new GeneralPurposeArtifactViewer(); } + leftSplitPane.removePropertyChangeListener(dividerListener); + mainSplitPane.removePropertyChangeListener(dividerListener); mainSplitPane.setRightComponent(rightPanel.getComponent()); rightPanel.setArtifact(artifact); + mainSplitPane.setDividerLocation(mainSplitPaneDividerLocation); + leftSplitPane.setDividerLocation(leftSplitPaneDividerLocation); + mainSplitPane.setDividerLocation(mainSplitPaneDividerLocation); + leftSplitPane.setDividerLocation(leftSplitPaneDividerLocation); + leftSplitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, dividerListener); + mainSplitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, dividerListener); validate(); repaint(); } } }; + dividerListener = new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (evt.getPropertyName().equalsIgnoreCase(JSplitPane.DIVIDER_LOCATION_PROPERTY) + && evt.getNewValue() instanceof Integer + && evt.getOldValue() instanceof Integer + && (JSplitPane.UNDEFINED_CONDITION != (int) evt.getNewValue())) { + if (evt.getSource().equals(leftSplitPane)) { + leftSplitPaneDividerLocation = (int) evt.getNewValue(); + } else if (evt.getSource().equals(mainSplitPane)) { + mainSplitPaneDividerLocation = (int) evt.getNewValue(); + } + } + } + }; dateListener = new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent event) { if (!event.getValueIsAdjusting()) { artifactListPanel.removeSelectionListener(artifactListener); + leftSplitPane.removePropertyChangeListener(dividerListener); + mainSplitPane.removePropertyChangeListener(dividerListener); artifactListPanel.clearList(); artifactListPanel.addArtifacts(dateListPanel.getArtifactsForSelectedDate()); artifactListPanel.addSelectionListener(artifactListener); artifactListPanel.selectFirst(); + mainSplitPane.setDividerLocation(mainSplitPaneDividerLocation); + leftSplitPane.setDividerLocation(leftSplitPaneDividerLocation); + leftSplitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, dividerListener); + mainSplitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, dividerListener); validate(); repaint(); } @@ -85,10 +121,16 @@ final class MiniTimelinePanel extends javax.swing.JPanel { }; dateListPanel.addSelectionListener(dateListener); artifactListPanel.addSelectionListener(artifactListener); + dateListPanel.setPreferredSize(new Dimension(100, 20)); leftSplitPane.setLeftComponent(dateListPanel); + artifactListPanel.setPreferredSize(new Dimension(100, 20)); leftSplitPane.setRightComponent(artifactListPanel); mainSplitPane.setRightComponent(rightPanel.getComponent()); add(mainSplitPane); + leftSplitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, dividerListener); + mainSplitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, dividerListener); + leftSplitPaneDividerLocation = leftSplitPane.getDividerLocation(); + mainSplitPaneDividerLocation = mainSplitPane.getDividerLocation(); } /** @@ -145,6 +187,8 @@ final class MiniTimelinePanel extends javax.swing.JPanel { if (miniTimelineResultEvent.getDomain().equals(selectedDomain)) { dateListPanel.removeListSelectionListener(dateListener); artifactListPanel.removeSelectionListener(artifactListener); + leftSplitPane.removePropertyChangeListener(dividerListener); + mainSplitPane.removePropertyChangeListener(dividerListener); dateListPanel.addArtifacts(miniTimelineResultEvent.getResultList()); status = DomainArtifactsTabPanel.ArtifactRetrievalStatus.POPULATED; setEnabled(!dateListPanel.isEmpty()); @@ -156,6 +200,10 @@ final class MiniTimelinePanel extends javax.swing.JPanel { } removeAll(); add(mainSplitPane); + mainSplitPane.setDividerLocation(mainSplitPaneDividerLocation); + leftSplitPane.setDividerLocation(leftSplitPaneDividerLocation); + leftSplitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, dividerListener); + mainSplitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, dividerListener); revalidate(); repaint(); } @@ -174,12 +222,12 @@ final class MiniTimelinePanel extends javax.swing.JPanel { mainSplitPane = new javax.swing.JSplitPane(); leftSplitPane = new javax.swing.JSplitPane(); - mainSplitPane.setDividerLocation(400); + mainSplitPane.setDividerLocation(mainSplitPaneDividerLocation); mainSplitPane.setResizeWeight(0.1); mainSplitPane.setToolTipText(""); mainSplitPane.setMinimumSize(new java.awt.Dimension(0, 0)); - leftSplitPane.setDividerLocation(198); + leftSplitPane.setDividerLocation(leftSplitPaneDividerLocation); leftSplitPane.setResizeWeight(0.5); leftSplitPane.setMinimumSize(new java.awt.Dimension(0, 0)); mainSplitPane.setLeftComponent(leftSplitPane); From ea238c8582c202eb68df842a1307a5bc7281cb7d Mon Sep 17 00:00:00 2001 From: Mark McKinnon Date: Tue, 9 Feb 2021 10:08:51 -0500 Subject: [PATCH 38/41] Add new java-libpst library and get smtp address Add a new java-libpst library and get the smt address from it to use instead of the exchange address --- .../java-libpst-0.9.5-SNAPSHOT.jar | Bin 0 -> 259506 bytes .../java-libpst/java-libpst-1.0-SNAPSHOT.jar | Bin 92374 -> 0 bytes thunderbirdparser/build.xml | 2 +- .../nbproject/project.properties | 4 ++- thunderbirdparser/nbproject/project.xml | 8 +++--- .../autopsy/thunderbirdparser/PstParser.java | 24 ++++++++++++++---- 6 files changed, 27 insertions(+), 11 deletions(-) create mode 100644 thirdparty/java-libpst/java-libpst-0.9.5-SNAPSHOT.jar delete mode 100755 thirdparty/java-libpst/java-libpst-1.0-SNAPSHOT.jar diff --git a/thirdparty/java-libpst/java-libpst-0.9.5-SNAPSHOT.jar b/thirdparty/java-libpst/java-libpst-0.9.5-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..93ff797a6a322d3521da1138a5245d7f2e71da24 GIT binary patch literal 259506 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%0An-k5lD-y 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%0D(LTj5dU4ow`^5zGyXx)I{XOv|6|gJ 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 z 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 z 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 diff --git a/thunderbirdparser/build.xml b/thunderbirdparser/build.xml index caabb5f0de..8926bca7a9 100644 --- a/thunderbirdparser/build.xml +++ b/thunderbirdparser/build.xml @@ -19,7 +19,7 @@ - + diff --git a/thunderbirdparser/nbproject/project.properties b/thunderbirdparser/nbproject/project.properties index d85c634cf8..5ed2afa7b7 100644 --- a/thunderbirdparser/nbproject/project.properties +++ b/thunderbirdparser/nbproject/project.properties @@ -7,14 +7,16 @@ file.reference.apache-mime4j-dom-0.8.0.jar=release/modules/ext/apache-mime4j-dom file.reference.apache-mime4j-mbox-iterator-0.8.0.jar=release/modules/ext/apache-mime4j-mbox-iterator-0.8.0-SNAPSHOT.jar file.reference.commons-validator-1.6.jar=release/modules/ext/commons-validator-1.6.jar file.reference.guava-19.0.jar=release/modules/ext/guava-19.0.jar -file.reference.java-libpst-1.0-SNAPSHOT.jar=release/modules/ext/java-libpst-1.0-SNAPSHOT.jar file.reference.ez-vcard-0.10.5.jar=release/modules/ext/ez-vcard-0.10.5.jar +file.reference.java-libpst-0.9.5-SNAPSHOT.jar=release/modules/ext/java-libpst-0.9.5-SNAPSHOT.jar file.reference.vinnie-2.0.2.jar=release/modules/ext/vinnie-2.0.2.jar javac.source=1.8 javac.compilerargs=-Xlint -Xlint:-serial javadoc.reference.guava-19.0.jar=release/modules/ext/guava-19.0-javadoc.jar +javadoc.reference.java-libpst-0.9.5-SNAPSHOT.jar=release/modules/ext/java-libpst-0.9.5-SNAPSHOT.jar license.file=../LICENSE-2.0.txt nbm.homepage=http://www.sleuthkit.org/autopsy/ nbm.needs.restart=true source.reference.guava-19.0.jar=release/modules/ext/guava-19.0-sources.jar +source.reference.java-libpst-0.9.5-SNAPSHOT.jar=release/modules/ext/java-libpst-0.9.5-SNAPSHOT.jar spec.version.base=4.0 diff --git a/thunderbirdparser/nbproject/project.xml b/thunderbirdparser/nbproject/project.xml index 9a1249b697..318b4e36ee 100644 --- a/thunderbirdparser/nbproject/project.xml +++ b/thunderbirdparser/nbproject/project.xml @@ -84,14 +84,14 @@ ext/apache-mime4j-core-0.8.0-SNAPSHOT.jar release/modules/ext/apache-mime4j-core-0.8.0-SNAPSHOT.jar - - ext/java-libpst-1.0-SNAPSHOT.jar - release/modules/ext/java-libpst-1.0-SNAPSHOT.jar - ext/guava-19.0.jar release/modules/ext/guava-19.0.jar + + ext/java-libpst-0.9.5-SNAPSHOT.jar + release/modules/ext/java-libpst-0.9.5-SNAPSHOT.jar + ext/apache-mime4j-dom-0.8.0-SNAPSHOT.jar release/modules/ext/apache-mime4j-dom-0.8.0-SNAPSHOT.jar diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/PstParser.java b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/PstParser.java index e3292de3a8..24247e5914 100644 --- a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/PstParser.java +++ b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/PstParser.java @@ -277,16 +277,30 @@ class PstParser implements AutoCloseable{ */ private EmailMessage extractEmailMessage(PSTMessage msg, String localPath, long fileID) { EmailMessage email = new EmailMessage(); - email.setRecipients(msg.getDisplayTo()); - email.setCc(msg.getDisplayCC()); - email.setBcc(msg.getDisplayBCC()); - email.setSender(getSender(msg.getSenderName(), msg.getSenderEmailAddress())); + String toAddress = msg.getDisplayTo(); + String ccAddress = msg.getDisplayCC(); + String bccAddress = msg.getDisplayBCC(); + String receivedByName = msg.getReceivedByName(); + String receivedBySMTPAddress = msg.getReceivedBySMTPAddress(); + + if (toAddress.contains(receivedByName)) { + toAddress = toAddress.replace(receivedByName, receivedBySMTPAddress); + } + if (ccAddress.contains(receivedByName)) { + ccAddress = ccAddress.replace(receivedByName, receivedBySMTPAddress); + } + if (bccAddress.contains(receivedByName)) { + bccAddress = bccAddress.replace(receivedByName, receivedBySMTPAddress); + } + email.setRecipients(toAddress); + email.setCc(ccAddress); + email.setBcc(bccAddress); + email.setSender(getSender(msg.getSenderName(), msg.getSentRepresentingSMTPAddress())); email.setSentDate(msg.getMessageDeliveryTime()); email.setTextBody(msg.getBody()); if (false == msg.getTransportMessageHeaders().isEmpty()) { email.setHeaders("\n-----HEADERS-----\n\n" + msg.getTransportMessageHeaders() + "\n\n---END HEADERS--\n\n"); } - email.setHtmlBody(msg.getBodyHTML()); String rtf = ""; try { From 748a5cb6fb1b3548de2a1f82feeafab774c356c9 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 9 Feb 2021 10:19:55 -0500 Subject: [PATCH 39/41] 7184 tweak weights --- .../sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.form | 2 +- .../sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.java | 2 +- .../org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.form | 2 +- .../org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.form b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.form index 0745e113c8..870763813c 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.form +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.form @@ -7,7 +7,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.java index 550b2252e8..bbb1a8a634 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/DomainArtifactsTabPanel.java @@ -219,7 +219,7 @@ final class DomainArtifactsTabPanel extends JPanel { mainSplitPane = new javax.swing.JSplitPane(); mainSplitPane.setDividerLocation(dividerLocation); - mainSplitPane.setResizeWeight(0.1); + mainSplitPane.setResizeWeight(0.2); mainSplitPane.setLastDividerLocation(250); setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.form b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.form index 772dbd54b3..0c3b13bbad 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.form +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.form @@ -7,7 +7,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.java index 7365a860b2..df8523fcfa 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/MiniTimelinePanel.java @@ -223,7 +223,7 @@ final class MiniTimelinePanel extends javax.swing.JPanel { leftSplitPane = new javax.swing.JSplitPane(); mainSplitPane.setDividerLocation(mainSplitPaneDividerLocation); - mainSplitPane.setResizeWeight(0.1); + mainSplitPane.setResizeWeight(0.2); mainSplitPane.setToolTipText(""); mainSplitPane.setMinimumSize(new java.awt.Dimension(0, 0)); From 35007b7890aff1654022309ad4913fa46eb526d7 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 9 Feb 2021 17:34:10 -0500 Subject: [PATCH 40/41] 2021-02-09 Change negative indexes to account for new columns --- test/script/tskdbdiff.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/script/tskdbdiff.py b/test/script/tskdbdiff.py index 1c8f83e481..762735c8e3 100644 --- a/test/script/tskdbdiff.py +++ b/test/script/tskdbdiff.py @@ -469,9 +469,9 @@ def normalize_db_entry(line, files_table, vs_parts_table, vs_info_table, fs_info # Ignore TIFF size and hash if extracted from PDFs. # See JIRA-6951 for more details. - # index -1 = last element in the list, which is extension - # index -3 = 3rd from the end, which is the parent path. - if fields_list[-1] == "'tif'" and fields_list[-3].endswith(".pdf/'"): + # index -3 = 3rd from the end, which is extension + # index -5 = 5th from the end, which is the parent path. + if fields_list[-3] == "'tif'" and fields_list[-5].endswith(".pdf/'"): fields_list[15] = "'SIZE_IGNORED'" fields_list[23] = "'MD5_IGNORED'" fields_list[24] = "'SHA256_IGNORED'" From 95ee20b345e593200c0ad140c6057af77bacb058 Mon Sep 17 00:00:00 2001 From: apriestman Date: Wed, 10 Feb 2021 11:08:22 -0500 Subject: [PATCH 41/41] Add host to run() method --- .../autopsy/casemodule/ImageDSProcessor.java | 66 ++++++++++++++++--- .../casemodule/LocalDiskDSProcessor.java | 41 +++++++++--- .../casemodule/LocalFilesDSProcessor.java | 25 ++++++- .../DataSourceProcessor.java | 44 +++++++++++++ .../datasourceprocessors/RawDSProcessor.java | 23 ++++++- .../xry/XRYDataSourceProcessor.java | 25 ++++++- .../dsp/LogicalImagerDSProcessor.java | 23 ++++++- .../volatilityDSP/MemoryDSProcessor.java | 21 +++++- 8 files changed, 237 insertions(+), 31 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/ImageDSProcessor.java b/Core/src/org/sleuthkit/autopsy/casemodule/ImageDSProcessor.java index 409846cccb..2bb2cebbbd 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/ImageDSProcessor.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/ImageDSProcessor.java @@ -183,11 +183,32 @@ public class ImageDSProcessor implements DataSourceProcessor, AutoIngestDataSour */ @Override public void run(DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) { + run(null, progressMonitor, callback); + } + + /** + * Adds a data source to the case database using a background task in a + * separate thread and the settings provided by the selection and + * configuration panel. Returns as soon as the background task is started. + * The background task uses a callback object to signal task completion and + * return results. + * + * This method should not be called unless isPanelValid returns true. + * + * @param host Host for this data source. + * @param progressMonitor Progress monitor that will be used by the + * background task to report progress. + * @param callback Callback that will be used by the background task + * to return results. + */ + @Override + public void run(Host host, DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) { ingestStream = new DefaultIngestStream(); readConfigSettings(); + this.host = host; try { image = SleuthkitJNI.addImageToDatabase(Case.getCurrentCase().getSleuthkitCase(), - new String[]{imagePath}, sectorSize, timeZone, md5, sha1, sha256, deviceId); + new String[]{imagePath}, sectorSize, timeZone, md5, sha1, sha256, deviceId, this.host); } catch (TskCoreException ex) { logger.log(Level.SEVERE, "Error adding data source with path " + imagePath + " to database", ex); final List errors = new ArrayList<>(); @@ -219,14 +240,47 @@ public class ImageDSProcessor implements DataSourceProcessor, AutoIngestDataSour @Override public void runWithIngestStream(IngestJobSettings settings, DataSourceProcessorProgressMonitor progress, DataSourceProcessorCallback callBack) { + runWithIngestStream(null, settings, progress, callBack); + } + + /** + * Adds a data source to the case database using a background task in a + * separate thread and the settings provided by the selection and + * configuration panel. Files found during ingest will be sent directly to the + * IngestStream provided. Returns as soon as the background task is started. + * The background task uses a callback object to signal task completion and + * return results. + * + * This method should not be called unless isPanelValid returns true, and + * should only be called for DSPs that support ingest streams. + * + * @param host The host for this data source. + * @param settings The ingest job settings. + * @param progress Progress monitor that will be used by the + * background task to report progress. + * @param callBack Callback that will be used by the background task + * to return results. + */ + @Override + public void runWithIngestStream(Host host, IngestJobSettings settings, DataSourceProcessorProgressMonitor progress, + DataSourceProcessorCallback callBack) { // Read the settings from the wizard readConfigSettings(); + this.host = host; + + // HOSTTODO - remove once passing in a host + try { + this.host = Case.getCurrentCase().getSleuthkitCase().getHostManager().getOrCreateHost("ImageDSProcessor Host"); + } catch (TskCoreException ex) { + logger.log(Level.SEVERE, "Error creating/loading host", ex); + this.host = null; + } // Set up the data source before creating the ingest stream try { image = SleuthkitJNI.addImageToDatabase(Case.getCurrentCase().getSleuthkitCase(), - new String[]{imagePath}, sectorSize, timeZone, md5, sha1, sha256, deviceId, host); + new String[]{imagePath}, sectorSize, timeZone, md5, sha1, sha256, deviceId, this.host); } catch (TskCoreException ex) { logger.log(Level.SEVERE, "Error adding data source with path " + imagePath + " to database", ex); final List errors = new ArrayList<>(); @@ -273,14 +327,6 @@ public class ImageDSProcessor implements DataSourceProcessor, AutoIngestDataSour if (sha256.isEmpty()) { sha256 = null; } - - // HOSTTODO - this will come from the config panel - try { - host = Case.getCurrentCase().getSleuthkitCase().getHostManager().getOrCreateHost("ImageDSProcessor Host"); - } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Error creating/loading host", ex); - host = null; - } } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskDSProcessor.java b/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskDSProcessor.java index f197029cf7..209cdf56b7 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskDSProcessor.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/LocalDiskDSProcessor.java @@ -137,6 +137,26 @@ public class LocalDiskDSProcessor implements DataSourceProcessor { */ @Override public void run(DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) { + run(null, progressMonitor, callback); + } + + /** + * Adds a data source to the case database using a background task in a + * separate thread and the settings provided by the selection and + * configuration panel. Returns as soon as the background task is started. + * The background task uses a callback object to signal task completion and + * return results. + * + * This method should not be called unless isPanelValid returns true. + * + * @param host Host for this data source. + * @param progressMonitor Progress monitor that will be used by the + * background task to report progress. + * @param callback Callback that will be used by the background task + * to return results. + */ + @Override + public void run(Host host, DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) { if (!setDataSourceOptionsCalled) { deviceId = UUID.randomUUID().toString(); drivePath = configPanel.getContentPath(); @@ -148,21 +168,22 @@ public class LocalDiskDSProcessor implements DataSourceProcessor { } else { imageWriterSettings = null; } - - // HOSTTODO - set to value from config panel - try { - host = Case.getCurrentCase().getSleuthkitCase().getHostManager().getOrCreateHost("LocalDiskDSProcessor Host"); - } catch (TskCoreException ex) { - logger.log(Level.SEVERE, "Error creating/loading host", ex); - host = null; - } + } + + this.host = host; + // HOSTTODO - set to value from config panel + try { + this.host = Case.getCurrentCase().getSleuthkitCase().getHostManager().getOrCreateHost("LocalDiskDSProcessor Host"); + } catch (TskCoreException ex) { + logger.log(Level.SEVERE, "Error creating/loading host", ex); + this.host = null; } Image image; try { image = SleuthkitJNI.addImageToDatabase(Case.getCurrentCase().getSleuthkitCase(), new String[]{drivePath}, sectorSize, - timeZone, null, null, null, deviceId, host); + timeZone, null, null, null, deviceId, this.host); } catch (TskCoreException ex) { logger.log(Level.SEVERE, "Error adding local disk with path " + drivePath + " to database", ex); final List errors = new ArrayList<>(); @@ -172,7 +193,7 @@ public class LocalDiskDSProcessor implements DataSourceProcessor { } addDiskTask = new AddImageTask( - new AddImageTask.ImageDetails(deviceId, image, sectorSize, timeZone, ignoreFatOrphanFiles, null, null, null, host, imageWriterSettings), + new AddImageTask.ImageDetails(deviceId, image, sectorSize, timeZone, ignoreFatOrphanFiles, null, null, null, this.host, imageWriterSettings), progressMonitor, new StreamingAddDataSourceCallbacks(new DefaultIngestStream()), new StreamingAddImageTaskCallback(new DefaultIngestStream(), callback)); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/LocalFilesDSProcessor.java b/Core/src/org/sleuthkit/autopsy/casemodule/LocalFilesDSProcessor.java index 53959c57d5..5a633d0191 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/LocalFilesDSProcessor.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/LocalFilesDSProcessor.java @@ -139,7 +139,7 @@ public class LocalFilesDSProcessor implements DataSourceProcessor, AutoIngestDat return configPanel.validatePanel(); } - /** + /** * Adds a data source to the case database using a background task in a * separate thread and the settings provided by the selection and * configuration panel. Returns as soon as the background task is started. @@ -155,10 +155,29 @@ public class LocalFilesDSProcessor implements DataSourceProcessor, AutoIngestDat */ @Override public void run(DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) { - Host host = null; + run(null, progressMonitor, callback); + } + + /** + * Adds a data source to the case database using a background task in a + * separate thread and the settings provided by the selection and + * configuration panel. Returns as soon as the background task is started. + * The background task uses a callback object to signal task completion and + * return results. + * + * This method should not be called unless isPanelValid returns true. + * + * @param host Host for this data source. + * @param progressMonitor Progress monitor that will be used by the + * background task to report progress. + * @param callback Callback that will be used by the background task + * to return results. + */ + @Override + public void run(Host host, DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) { if (!setDataSourceOptionsCalled) { - // HOSTTODO - set to value from config panel + // HOSTTODO - use passed in value try { host = Case.getCurrentCase().getSleuthkitCase().getHostManager().getOrCreateHost("LocalFilesDSProcessor Host"); } catch (TskCoreException ex) { diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataSourceProcessor.java b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataSourceProcessor.java index de51cf8add..a0e7db335c 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataSourceProcessor.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataSourceProcessor.java @@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.corecomponentinterfaces; import javax.swing.JPanel; import org.sleuthkit.autopsy.ingest.IngestJobSettings; +import org.sleuthkit.datamodel.Host; /** * Interface implemented by classes that add data sources of a particular type @@ -109,6 +110,25 @@ public interface DataSourceProcessor { */ void run(DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback); + /** + * Adds a data source to the case database using a background task in a + * separate thread and the settings provided by the selection and + * configuration panel. Returns as soon as the background task is started. + * The background task uses a callback object to signal task completion and + * return results. + * + * This method should not be called unless isPanelValid returns true. + * + * @param host Host for the data source. + * @param progressMonitor Progress monitor that will be used by the + * background task to report progress. + * @param callback Callback that will be used by the background task + * to return results. + */ + default void run(Host host, DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) { + run(progressMonitor, callback); + } + /** * Adds a data source to the case database using a background task in a * separate thread and the settings provided by the selection and @@ -131,6 +151,30 @@ public interface DataSourceProcessor { DataSourceProcessorCallback callBack) { throw new UnsupportedOperationException("Streaming ingest not supported for this data source processor"); } + + /** + * Adds a data source to the case database using a background task in a + * separate thread and the settings provided by the selection and + * configuration panel. Files found during ingest will be sent directly to + * the IngestStream provided. Returns as soon as the background task is + * started. The background task uses a callback object to signal task + * completion and return results. + * + * This method should not be called unless isPanelValid returns true, and + * should only be called for DSPs that support ingest streams. The ingest + * settings must be complete before calling this method. + * + * @param host Host for this data source. + * @param settings The ingest job settings. + * @param progress Progress monitor that will be used by the background task + * to report progress. + * @param callBack Callback that will be used by the background task to + * return results. + */ + default void runWithIngestStream(Host host, IngestJobSettings settings, DataSourceProcessorProgressMonitor progress, + DataSourceProcessorCallback callBack) { + runWithIngestStream(settings, progress, callBack); + } /** * Check if this DSP supports ingest streams. diff --git a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/RawDSProcessor.java b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/RawDSProcessor.java index ea5411eb5c..8760ac8da5 100644 --- a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/RawDSProcessor.java +++ b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/RawDSProcessor.java @@ -138,10 +138,29 @@ public class RawDSProcessor implements DataSourceProcessor, AutoIngestDataSource */ @Override public void run(DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) { + run(null, progressMonitor, callback); + } + + /** + * Adds a data source to the case database using a background task in a + * separate thread and the settings provided by the selection and + * configuration panel. Returns as soon as the background task is started. + * The background task uses a callback object to signal task completion and + * return results. + * + * This method should not be called unless isPanelValid returns true. + * + * @param host Host for the data source. + * @param progressMonitor Progress monitor that will be used by the + * background task to report progress. + * @param callback Callback that will be used by the background task + * to return results. + */ + @Override + public void run(Host host, DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) { configPanel.storeSettings(); - // HOSTTODO - replace with a call to configPanel().getHost() - Host host; + // HOSTTODO - use passed in value try { host = Case.getCurrentCase().getSleuthkitCase().getHostManager().getOrCreateHost("RawDSProcessor Host"); } catch (TskCoreException ex) { diff --git a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/XRYDataSourceProcessor.java b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/XRYDataSourceProcessor.java index fe5e939fc6..a764e9f5f6 100755 --- a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/XRYDataSourceProcessor.java +++ b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/XRYDataSourceProcessor.java @@ -194,14 +194,33 @@ public class XRYDataSourceProcessor implements DataSourceProcessor, AutoIngestDa * in isPanelValid(). */ @Override + public void run(DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) { + run(null, progressMonitor, callback); + } + + /** + * Processes the XRY folder that the examiner selected. The heavy lifting is + * done off of the EDT, so this function will return while the + * path is still being processed. + * + * This function assumes the calling thread has sufficient privileges to + * read the folder and its child content, which should have been validated + * in isPanelValid(). + * + * @param host Host for the data source. + * @param progressMonitor Progress monitor that will be used by the + * background task to report progress. + * @param callback Callback that will be used by the background task + * to return results. + */ + @Override @NbBundle.Messages({ "XRYDataSourceProcessor.noCurrentCase=No case is open." }) - public void run(DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) { + public void run(Host host, DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) { progressMonitor.setIndeterminate(true); - // HOSTTODO - replace with a call to configPanel().getHost() - Host host; + // HOSTTODO - use passed in value try { host = Case.getCurrentCase().getSleuthkitCase().getHostManager().getOrCreateHost("XRYDSProcessor Host"); } catch (TskCoreException ex) { diff --git a/Core/src/org/sleuthkit/autopsy/logicalimager/dsp/LogicalImagerDSProcessor.java b/Core/src/org/sleuthkit/autopsy/logicalimager/dsp/LogicalImagerDSProcessor.java index 163a988af5..67498064f0 100644 --- a/Core/src/org/sleuthkit/autopsy/logicalimager/dsp/LogicalImagerDSProcessor.java +++ b/Core/src/org/sleuthkit/autopsy/logicalimager/dsp/LogicalImagerDSProcessor.java @@ -130,6 +130,26 @@ public final class LogicalImagerDSProcessor implements DataSourceProcessor { * @param callback Callback that will be used by the background task * to return results. */ + @Override + public void run(DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) { + run(null, progressMonitor, callback); + } + + /** + * Adds a data source to the case database using a background task in a + * separate thread and the settings provided by the selection and + * configuration panel. Returns as soon as the background task is started. + * The background task uses a callback object to signal task completion and + * return results. + * + * This method should not be called unless isPanelValid returns true. + * + * @param host Host for the data source. + * @param progressMonitor Progress monitor that will be used by the + * background task to report progress. + * @param callback Callback that will be used by the background task + * to return results. + */ @Messages({ "# {0} - imageDirPath", "LogicalImagerDSProcessor.imageDirPathNotFound={0} not found.\nUSB drive has been ejected.", "# {0} - directory", "LogicalImagerDSProcessor.failToCreateDirectory=Failed to create directory {0}", @@ -139,11 +159,10 @@ public final class LogicalImagerDSProcessor implements DataSourceProcessor { "LogicalImagerDSProcessor.noCurrentCase=No current case", }) @Override - public void run(DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) { + public void run(Host host, DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) { configPanel.storeSettings(); // HOSTTODO - set to value from config panel - Host host; try { host = Case.getCurrentCase().getSleuthkitCase().getHostManager().getOrCreateHost("LogicalImagerDSProcessor Host"); } catch (TskCoreException ex) { diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/MemoryDSProcessor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/MemoryDSProcessor.java index d043080ba8..a0ca322fac 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/MemoryDSProcessor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/MemoryDSProcessor.java @@ -119,10 +119,29 @@ public class MemoryDSProcessor implements DataSourceProcessor { */ @Override public void run(DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) { + run(null, progressMonitor, callback); + } + + /** + * Adds a data source to the case database using a background task in a + * separate thread and the settings provided by the selection and + * configuration panel. Returns as soon as the background task is started. + * The background task uses a callback object to signal task completion and + * return results. + * + * This method should not be called unless isPanelValid returns true. + * + * @param host Host for the data source. + * @param progressMonitor Progress monitor that will be used by the + * background task to report progress. + * @param callback Callback that will be used by the background task + * to return results. + */ + @Override + public void run(Host host, DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) { configPanel.storeSettings(); // HOSTTODO - replace with a call to configPanel().getHost() - Host host; try { host = Case.getCurrentCase().getSleuthkitCase().getHostManager().getOrCreateHost("MemoryDSProcessor Host"); } catch (TskCoreException ex) {