19 package org.sleuthkit.autopsy.ingest;
22 import java.io.FileInputStream;
23 import java.io.FileOutputStream;
24 import java.io.IOException;
25 import java.nio.file.Files;
26 import java.nio.file.Path;
27 import java.nio.file.Paths;
28 import java.util.ArrayList;
29 import java.util.Collections;
30 import java.util.HashSet;
31 import java.util.List;
32 import java.util.logging.Level;
33 import org.openide.util.NbBundle;
34 import org.openide.util.io.NbObjectInputStream;
35 import org.openide.util.io.NbObjectOutputStream;
39 import org.python.util.PythonObjectInputStream;
95 this.moduleTemplates =
new ArrayList<>();
97 this.warnings =
new ArrayList<>();
115 this.executionContext = context;
117 this.executionContext = context +
"." + this.ingestType.name();
120 this.moduleTemplates =
new ArrayList<>();
122 this.warnings =
new ArrayList<>();
142 String getExecutionContext() {
153 List<String> warningMessages =
new ArrayList<>(this.
warnings);
154 this.warnings.clear();
155 return warningMessages;
163 List<IngestModuleTemplate> getIngestModuleTemplates() {
164 return Collections.unmodifiableList(this.moduleTemplates);
173 List<IngestModuleTemplate> getEnabledIngestModuleTemplates() {
174 List<IngestModuleTemplate> enabledModuleTemplates =
new ArrayList<>();
175 for (IngestModuleTemplate moduleTemplate : this.moduleTemplates) {
176 if (moduleTemplate.isEnabled()) {
177 enabledModuleTemplates.add(moduleTemplate);
180 return enabledModuleTemplates;
188 void setIngestModuleTemplates(List<IngestModuleTemplate> moduleTemplates) {
189 this.moduleTemplates.clear();
190 this.moduleTemplates.addAll(moduleTemplates);
199 boolean getProcessUnallocatedSpace() {
208 void setProcessUnallocatedSpace(
boolean processUnallocatedSpace) {
228 Files.createDirectories(folder);
229 this.moduleSettingsFolderPath = folder.toAbsolutePath().toString();
230 }
catch (IOException | SecurityException ex) {
231 logger.log(Level.SEVERE,
"Failed to create ingest module settings directory " +
this.moduleSettingsFolderPath, ex);
232 this.warnings.add(NbBundle.getMessage(
IngestJobSettings.class,
"IngestJobSettings.createModuleSettingsFolder.warning"));
244 List<IngestModuleFactory> moduleFactories =
new ArrayList<>();
245 List<IngestModuleFactory> allModuleFactories = IngestModuleFactoryLoader.getIngestModuleFactories();
246 HashSet<String> loadedModuleNames =
new HashSet<>();
251 moduleFactories.add(moduleFactory);
253 moduleFactories.add(moduleFactory);
254 }
else if (this.ingestType.equals(
IngestType.
FILES_ONLY) && moduleFactory.isFileIngestModuleFactory()) {
255 moduleFactories.add(moduleFactory);
260 loadedModuleNames.add(moduleFactory.getModuleDisplayName());
273 List<String> missingModuleNames =
new ArrayList<>();
274 for (String moduleName : enabledModuleNames) {
275 if (!loadedModuleNames.contains(moduleName)) {
276 missingModuleNames.add(moduleName);
279 for (String moduleName : disabledModuleNames) {
280 if (!loadedModuleNames.contains(moduleName)) {
281 missingModuleNames.add(moduleName);
284 for (String moduleName : missingModuleNames) {
285 enabledModuleNames.remove(moduleName);
286 disabledModuleNames.remove(moduleName);
287 String warning = NbBundle.getMessage(
IngestJobSettings.class,
"IngestJobSettings.missingModule.warning", moduleName);
288 logger.log(Level.WARNING, warning);
289 this.warnings.add(warning);
297 IngestModuleTemplate moduleTemplate =
new IngestModuleTemplate(moduleFactory,
loadModuleSettings(moduleFactory));
298 String moduleName = moduleTemplate.getModuleName();
299 if (enabledModuleNames.contains(moduleName)) {
300 moduleTemplate.setEnabled(
true);
301 }
else if (disabledModuleNames.contains(moduleName)) {
302 moduleTemplate.setEnabled(
false);
307 moduleTemplate.setEnabled(
true);
308 enabledModuleNames.add(moduleName);
310 this.moduleTemplates.add(moduleTemplate);
340 HashSet<String> moduleNames =
new HashSet<>();
342 if (!modulesSetting.isEmpty()) {
343 String[] settingNames = modulesSetting.split(
", ");
344 for (String name : settingNames) {
347 case "Thunderbird Parser":
349 moduleNames.add(
"Email Parser");
351 case "File Extension Mismatch Detection":
352 moduleNames.add(
"Extension Mismatch Detector");
356 moduleNames.add(
"E01 Verifier");
358 case "Archive Extractor":
359 moduleNames.add(
"Embedded File Extractor");
362 moduleNames.add(name);
380 return moduleSettingsFilePath.contains(pythonModuleSettingsPrefixCS);
394 File settingsFile =
new File(moduleSettingsFilePath);
395 if (settingsFile.exists()) {
397 try (NbObjectInputStream in =
new NbObjectInputStream(
new FileInputStream(settingsFile.getAbsolutePath()))) {
399 }
catch (IOException | ClassNotFoundException ex) {
401 logger.log(Level.WARNING, warning, ex);
402 this.warnings.add(warning);
405 try (PythonObjectInputStream in =
new PythonObjectInputStream(
new FileInputStream(settingsFile.getAbsolutePath()))) {
407 }
catch (IOException | ClassNotFoundException exception) {
409 logger.log(Level.WARNING, warning, exception);
410 this.warnings.add(warning);
414 if (settings == null) {
430 Path path = Paths.get(this.moduleSettingsFolderPath, fileName);
431 return path.toAbsolutePath().toString();
441 HashSet<String> enabledModuleNames =
new HashSet<>();
442 HashSet<String> disabledModuleNames =
new HashSet<>();
443 for (IngestModuleTemplate moduleTemplate : moduleTemplates) {
444 saveModuleSettings(moduleTemplate.getModuleFactory(), moduleTemplate.getModuleSettings());
445 String moduleName = moduleTemplate.getModuleName();
446 if (moduleTemplate.isEnabled()) {
447 enabledModuleNames.add(moduleName);
449 disabledModuleNames.add(moduleName);
458 String processUnalloc = Boolean.toString(this.processUnallocatedSpace);
476 moduleSettingsFilePath = moduleSettingsFilePath.replaceAll(
"[$][\\d]+.settings$",
"\\$.settings");
478 try (NbObjectOutputStream out =
new NbObjectOutputStream(
new FileOutputStream(moduleSettingsFilePath))) {
479 out.writeObject(settings);
481 }
catch (IOException ex) {
483 logger.log(Level.SEVERE, warning, ex);
484 this.warnings.add(warning);
497 if (input == null || input.isEmpty()) {
501 ArrayList<String> list =
new ArrayList<>();
503 StringBuilder csvList =
new StringBuilder();
504 for (
int i = 0; i < list.size() - 1; ++i) {
505 csvList.append(list.get(i)).append(
", ");
507 csvList.append(list.get(list.size() - 1));
508 return csvList.toString();
static final String DISABLED_MODULES_KEY
void saveModuleSettings(IngestModuleFactory factory, IngestModuleIngestJobSettings settings)
boolean processUnallocatedSpace
final String executionContext
final IngestType ingestType
String moduleSettingsFolderPath
static String makeCommaSeparatedValuesList(HashSet< String > input)
IngestModuleIngestJobSettings getDefaultIngestJobSettings()
static final String MODULE_SETTINGS_FILE_EXT
static final String PARSE_UNALLOC_SPACE_KEY
HashSet< String > getModulesNamesFromSetting(String key, String defaultSetting)
static final String MODULE_SETTINGS_FOLDER
static final String MODULE_SETTINGS_FOLDER_PATH
final List< IngestModuleTemplate > moduleTemplates
static final String PROCESS_UNALLOC_SPACE_DEFAULT
static synchronized void setConfigSetting(String moduleName, String settingName, String settingVal)
IngestModuleIngestJobSettings loadModuleSettings(IngestModuleFactory factory)
Path getSavedModuleSettingsFolder()
void createSavedModuleSettingsFolder()
final List< String > warnings
IngestJobSettings(String executionContext)
String getModuleSettingsFilePath(IngestModuleFactory factory)
static String getConfigSetting(String moduleName, String settingName)
List< String > getWarnings()
static final String ENABLED_MODULES_KEY
static final Logger logger
synchronized static Logger getLogger(String name)
String getModuleDisplayName()
static final CharSequence pythonModuleSettingsPrefixCS
boolean isPythonModuleSettingsFile(String moduleSettingsFilePath)
static boolean settingExists(String moduleName, String settingName)
IngestJobSettings(String context, IngestType ingestType)