Autopsy  4.11.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
IngestJobSettings.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2014-2018 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.ingest;
20 
21 import java.io.File;
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.Collection;
30 import java.util.Collections;
31 import java.util.HashSet;
32 import java.util.List;
33 import java.util.Map;
34 import java.util.Objects;
35 import java.util.logging.Level;
36 import org.openide.util.NbBundle;
37 import org.openide.util.io.NbObjectInputStream;
38 import org.openide.util.io.NbObjectOutputStream;
44 
48 public final class IngestJobSettings {
49 
50  private static final String ENABLED_MODULES_PROPERTY = "Enabled_Ingest_Modules"; //NON-NLS
51  private static final String DISABLED_MODULES_PROPERTY = "Disabled_Ingest_Modules"; //NON-NLS
52  private static final String LAST_FILE_INGEST_FILTER_PROPERTY = "Last_File_Ingest_Filter"; //NON-NLS
53  private static final String MODULE_SETTINGS_FOLDER = "IngestModuleSettings"; //NON-NLS
54  private static final String MODULE_SETTINGS_FOLDER_PATH = Paths.get(PlatformUtil.getUserConfigDirectory(), IngestJobSettings.MODULE_SETTINGS_FOLDER).toAbsolutePath().toString();
55  private static final String MODULE_SETTINGS_FILE_EXT = ".settings"; //NON-NLS
56  private static final CharSequence PYTHON_CLASS_PROXY_PREFIX = "org.python.proxies.".subSequence(0, "org.python.proxies.".length() - 1); //NON-NLS
57  private static final Logger logger = Logger.getLogger(IngestJobSettings.class.getName());
58  private final IngestType ingestType;
59  private final List<IngestModuleTemplate> moduleTemplates = new ArrayList<>();
60  private final List<String> warnings = new ArrayList<>();
61  private String executionContext;
63  private String moduleSettingsFolderPath;
64 
77  static Path getSavedModuleSettingsFolder(String executionContext) {
78  return Paths.get(IngestJobSettings.MODULE_SETTINGS_FOLDER_PATH, executionContext);
79  }
80 
92  public IngestJobSettings(final String executionContext) {
94  }
95 
110  public IngestJobSettings(String executionContext, IngestType ingestType) {
111  this.ingestType = ingestType;
112  if (this.ingestType.equals(IngestType.ALL_MODULES)) {
113  this.executionContext = executionContext;
114  } else {
115  this.executionContext = executionContext + "." + this.ingestType.name();
116  }
118  this.load();
119  }
120 
134  public IngestJobSettings(String executionContext, IngestType ingestType, Collection<IngestModuleTemplate> moduleTemplates) {
135  this.ingestType = ingestType;
136  if (this.ingestType.equals(IngestType.ALL_MODULES)) {
137  this.executionContext = executionContext;
138  } else {
139  this.executionContext = executionContext + "." + this.ingestType.name();
140  }
141  this.moduleTemplates.addAll(moduleTemplates);
142  }
143 
158  public IngestJobSettings(String executionContext, IngestType ingestType, Collection<IngestModuleTemplate> moduleTemplates, FilesSet fileFilter) {
160  this.setFileFilter(fileFilter);
161  }
162 
170  return Paths.get(IngestJobSettings.MODULE_SETTINGS_FOLDER_PATH, executionContext);
171  }
172 
176  public void save() {
178  this.store();
179  }
180 
190  public void saveAs(String executionContext) {
191  this.executionContext = executionContext;
193  this.store();
194  }
195 
202  public List<String> getWarnings() {
203  List<String> warningMessages = new ArrayList<>(this.warnings);
204  this.warnings.clear();
205  return warningMessages;
206  }
207 
217  public String getExecutionContext() {
218  return this.executionContext;
219  }
220 
227  if (fileFilter == null) {
228  fileFilter = FilesSetsManager.getDefaultFilter();
229  }
230  return fileFilter;
231  }
232 
238  public void setFileFilter(FilesSet fileIngestFilter) {
239  this.fileFilter = fileIngestFilter;
240  }
241 
247  public List<IngestModuleTemplate> getIngestModuleTemplates() {
248  return Collections.unmodifiableList(this.moduleTemplates);
249  }
250 
256  public void setIngestModuleTemplates(List<IngestModuleTemplate> moduleTemplates) {
257  this.moduleTemplates.clear();
258  this.moduleTemplates.addAll(moduleTemplates);
259  }
260 
266  public List<IngestModuleTemplate> getEnabledIngestModuleTemplates() {
267  List<IngestModuleTemplate> enabledModuleTemplates = new ArrayList<>();
268  for (IngestModuleTemplate moduleTemplate : this.moduleTemplates) {
269  if (moduleTemplate.isEnabled()) {
270  enabledModuleTemplates.add(moduleTemplate);
271  }
272  }
273  return enabledModuleTemplates;
274  }
275 
282  public boolean getProcessUnallocatedSpace() {
283  boolean processUnallocated = true;
284  if (!Objects.isNull(this.fileFilter)) {
285  processUnallocated = (this.fileFilter.ingoresUnallocatedSpace() == false);
286  }
287  return processUnallocated;
288  }
289 
295  try {
296  Path folder = getSavedModuleSettingsFolder();
297  Files.createDirectories(folder);
298  this.moduleSettingsFolderPath = folder.toAbsolutePath().toString();
299  } catch (IOException | SecurityException ex) {
300  logger.log(Level.SEVERE, "Failed to create ingest module settings directory " + this.moduleSettingsFolderPath, ex); //NON-NLS
301  this.warnings.add(NbBundle.getMessage(IngestJobSettings.class, "IngestJobSettings.createModuleSettingsFolder.warning")); //NON-NLS
302  }
303  }
304 
309  private void load() {
314  List<IngestModuleFactory> moduleFactories = new ArrayList<>();
315  List<IngestModuleFactory> allModuleFactories = IngestModuleFactoryLoader.getIngestModuleFactories();
316  HashSet<String> loadedModuleNames = new HashSet<>();
317 
318  // Add modules that are going to be used for this ingest depending on type.
319  for (IngestModuleFactory moduleFactory : allModuleFactories) {
320  if (this.ingestType.equals(IngestType.ALL_MODULES)) {
321  moduleFactories.add(moduleFactory);
322  } else if (this.ingestType.equals(IngestType.DATA_SOURCE_ONLY) && moduleFactory.isDataSourceIngestModuleFactory()) {
323  moduleFactories.add(moduleFactory);
324  } else if (this.ingestType.equals(IngestType.FILES_ONLY) && moduleFactory.isFileIngestModuleFactory()) {
325  moduleFactories.add(moduleFactory);
326  }
327  }
328 
329  for (IngestModuleFactory moduleFactory : moduleFactories) {
330  loadedModuleNames.add(moduleFactory.getModuleDisplayName());
331  }
332 
337  HashSet<String> enabledModuleNames = getModulesNames(executionContext, IngestJobSettings.ENABLED_MODULES_PROPERTY, makeCsvList(loadedModuleNames));
338  HashSet<String> disabledModuleNames = getModulesNames(executionContext, IngestJobSettings.DISABLED_MODULES_PROPERTY, ""); //NON-NLS
339 
343  List<String> missingModuleNames = new ArrayList<>();
344  for (String moduleName : enabledModuleNames) {
345  if (!loadedModuleNames.contains(moduleName)) {
346  missingModuleNames.add(moduleName);
347  }
348  }
349  for (String moduleName : disabledModuleNames) {
350  if (!loadedModuleNames.contains(moduleName)) {
351  missingModuleNames.add(moduleName);
352  }
353  }
354  for (String moduleName : missingModuleNames) {
355  enabledModuleNames.remove(moduleName);
356  disabledModuleNames.remove(moduleName);
357  String warning = NbBundle.getMessage(IngestJobSettings.class, "IngestJobSettings.missingModule.warning", moduleName); //NON-NLS
358  logger.log(Level.WARNING, warning);
359  this.warnings.add(warning);
360  }
361 
366  for (IngestModuleFactory moduleFactory : moduleFactories) {
367  IngestModuleTemplate moduleTemplate = new IngestModuleTemplate(moduleFactory, loadModuleSettings(moduleFactory));
368  String moduleName = moduleTemplate.getModuleName();
369  if (enabledModuleNames.contains(moduleName)) {
370  moduleTemplate.setEnabled(true);
371  } else if (disabledModuleNames.contains(moduleName)) {
372  moduleTemplate.setEnabled(false);
373  } else {
374  // The module factory was loaded, but the module name does not
375  // appear in the enabled/disabled module settings. Treat the
376  // module as a new module and enable it by default.
377  moduleTemplate.setEnabled(true);
378  enabledModuleNames.add(moduleName);
379  }
380  this.moduleTemplates.add(moduleTemplate);
381  }
382 
387  ModuleSettings.setConfigSetting(this.executionContext, IngestJobSettings.ENABLED_MODULES_PROPERTY, makeCsvList(enabledModuleNames));
388  ModuleSettings.setConfigSetting(this.executionContext, IngestJobSettings.DISABLED_MODULES_PROPERTY, makeCsvList(disabledModuleNames));
389 
395  }
396  try {
397  Map<String, FilesSet> fileIngestFilters = FilesSetsManager.getInstance()
400  fileIngestFilters.put(fSet.getName(), fSet);
401  }
402  this.fileFilter = fileIngestFilters.get(ModuleSettings.getConfigSetting(this.executionContext, IngestJobSettings.LAST_FILE_INGEST_FILTER_PROPERTY));
404  this.fileFilter = FilesSetsManager.getDefaultFilter();
405  logger.log(Level.SEVERE, "Failed to get file filter from .properties file, default filter being used", ex); //NON-NLS
406  }
407  }
408 
420  private static HashSet<String> getModulesNames(String executionContext, String propertyName, String defaultSetting) {
421  if (ModuleSettings.settingExists(executionContext, propertyName) == false) {
422  ModuleSettings.setConfigSetting(executionContext, propertyName, defaultSetting);
423  }
424  HashSet<String> moduleNames = new HashSet<>();
425  String modulesSetting = ModuleSettings.getConfigSetting(executionContext, propertyName);
426  if (!modulesSetting.isEmpty()) {
427  String[] settingNames = modulesSetting.split(", ");
428  for (String name : settingNames) {
429  /*
430  * Map some obsolete core ingest module names to the current
431  * core ingest module names.
432  */
433  switch (name) {
434  case "Thunderbird Parser": //NON-NLS
435  case "MBox Parser": //NON-NLS
436  moduleNames.add("Email Parser"); //NON-NLS
437  break;
438  case "File Extension Mismatch Detection": //NON-NLS
439  moduleNames.add("Extension Mismatch Detector"); //NON-NLS
440  break;
441  case "EWF Verify": //NON-NLS
442  case "E01 Verify": //NON-NLS
443  case "E01 Verifier": // NON-NLS
444  moduleNames.add("Data Source Integrity"); //NON-NLS
445  break;
446  case "Archive Extractor": //NON-NLS
447  moduleNames.add("Embedded File Extractor"); //NON-NLS
448  break;
449  default:
450  moduleNames.add(name);
451  }
452  }
453  }
454  return moduleNames;
455  }
456 
465  static List<String> getEnabledModules(String context) {
466  return new ArrayList<>(getModulesNames(context, ENABLED_MODULES_PROPERTY, ""));
467  }
468 
479  private boolean isPythonModuleSettingsFile(String moduleSettingsFilePath) {
480  return moduleSettingsFilePath.contains(PYTHON_CLASS_PROXY_PREFIX);
481  }
482 
491  IngestModuleIngestJobSettings settings = null;
492  String moduleSettingsFilePath = getModuleSettingsFilePath(factory);
493  File settingsFile = new File(moduleSettingsFilePath);
494  if (settingsFile.exists()) {
495  try (NbObjectInputStream in = new NbObjectInputStream(new FileInputStream(settingsFile.getAbsolutePath()))) {
496  settings = (IngestModuleIngestJobSettings) in.readObject();
497  } catch (IOException | ClassNotFoundException ex) {
498  String warning = NbBundle.getMessage(IngestJobSettings.class, "IngestJobSettings.moduleSettingsLoad.warning", factory.getModuleDisplayName(), this.executionContext); //NON-NLS
499  logger.log(Level.WARNING, warning, ex);
500  this.warnings.add(warning);
501  }
502  }
503  if (settings == null) {
504  settings = factory.getDefaultIngestJobSettings();
505  }
506  return settings;
507  }
508 
518  String fileName = FactoryClassNameNormalizer.normalize(factory.getClass().getCanonicalName()) + IngestJobSettings.MODULE_SETTINGS_FILE_EXT;
519  Path path = Paths.get(this.moduleSettingsFolderPath, fileName);
520  return path.toAbsolutePath().toString();
521  }
522 
526  private void store() {
530  HashSet<String> enabledModuleNames = new HashSet<>();
531  HashSet<String> disabledModuleNames = new HashSet<>();
532  for (IngestModuleTemplate moduleTemplate : moduleTemplates) {
533  saveModuleSettings(moduleTemplate.getModuleFactory(), moduleTemplate.getModuleSettings());
534  String moduleName = moduleTemplate.getModuleName();
535  if (moduleTemplate.isEnabled()) {
536  enabledModuleNames.add(moduleName);
537  } else {
538  disabledModuleNames.add(moduleName);
539  }
540  }
541  ModuleSettings.setConfigSetting(this.executionContext, IngestJobSettings.ENABLED_MODULES_PROPERTY, makeCsvList(enabledModuleNames));
542  ModuleSettings.setConfigSetting(this.executionContext, IngestJobSettings.DISABLED_MODULES_PROPERTY, makeCsvList(disabledModuleNames));
543 
547  ModuleSettings.setConfigSetting(this.executionContext, LAST_FILE_INGEST_FILTER_PROPERTY, fileFilter.getName());
548  }
549 
557  String moduleSettingsFilePath = getModuleSettingsFilePath(factory);
558  try (NbObjectOutputStream out = new NbObjectOutputStream(new FileOutputStream(moduleSettingsFilePath))) {
559  out.writeObject(settings);
560  } catch (IOException ex) {
561  String warning = NbBundle.getMessage(IngestJobSettings.class, "IngestJobSettings.moduleSettingsSave.warning", factory.getModuleDisplayName(), this.executionContext); //NON-NLS
562  logger.log(Level.SEVERE, warning, ex);
563  this.warnings.add(warning);
564  }
565  }
566 
575  private static String makeCsvList(Collection<String> collection) {
576  if (collection == null || collection.isEmpty()) {
577  return "";
578  }
579 
580  ArrayList<String> list = new ArrayList<>();
581  list.addAll(collection);
582  StringBuilder csvList = new StringBuilder();
583  for (int i = 0; i < list.size() - 1; ++i) {
584  csvList.append(list.get(i)).append(", ");
585  }
586  csvList.append(list.get(list.size() - 1));
587  return csvList.toString();
588  }
589 
593  public enum IngestType {
594 
606  FILES_ONLY
607  }
608 
609 }
IngestJobSettings(final String executionContext)
void saveModuleSettings(IngestModuleFactory factory, IngestModuleIngestJobSettings settings)
List< IngestModuleTemplate > getEnabledIngestModuleTemplates()
static HashSet< String > getModulesNames(String executionContext, String propertyName, String defaultSetting)
IngestModuleIngestJobSettings getDefaultIngestJobSettings()
static String makeCsvList(Collection< String > collection)
void setIngestModuleTemplates(List< IngestModuleTemplate > moduleTemplates)
final List< IngestModuleTemplate > moduleTemplates
IngestJobSettings(String executionContext, IngestType ingestType, Collection< IngestModuleTemplate > moduleTemplates, FilesSet fileFilter)
static synchronized void setConfigSetting(String moduleName, String settingName, String settingVal)
IngestModuleIngestJobSettings loadModuleSettings(IngestModuleFactory factory)
String getModuleSettingsFilePath(IngestModuleFactory factory)
static String getConfigSetting(String moduleName, String settingName)
List< IngestModuleTemplate > getIngestModuleTemplates()
synchronized static Logger getLogger(String name)
Definition: Logger.java:124
IngestJobSettings(String executionContext, IngestType ingestType, Collection< IngestModuleTemplate > moduleTemplates)
boolean isPythonModuleSettingsFile(String moduleSettingsFilePath)
static boolean settingExists(String moduleName, String settingName)
IngestJobSettings(String executionContext, IngestType ingestType)

Copyright © 2012-2018 Basis Technology. Generated on: Fri Jun 21 2019
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.