ExtractFiles.mjs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /**
  2. * @author n1474335 [n1474335@gmail.com]
  3. * @copyright Crown Copyright 2018
  4. * @license Apache-2.0
  5. */
  6. import Operation from "../Operation";
  7. // import OperationError from "../errors/OperationError";
  8. import Magic from "../lib/Magic";
  9. import Utils from "../Utils";
  10. import {extractFile} from "../lib/FileExtraction";
  11. /**
  12. * Extract Files operation
  13. */
  14. class ExtractFiles extends Operation {
  15. /**
  16. * ExtractFiles constructor
  17. */
  18. constructor() {
  19. super();
  20. this.name = "Extract Files";
  21. this.module = "Default";
  22. this.description = "TODO";
  23. this.infoURL = "https://forensicswiki.org/wiki/File_Carving";
  24. this.inputType = "ArrayBuffer";
  25. this.outputType = "List<File>";
  26. this.presentType = "html";
  27. this.args = [];
  28. }
  29. /**
  30. * @param {ArrayBuffer} input
  31. * @param {Object[]} args
  32. * @returns {List<File>}
  33. */
  34. run(input, args) {
  35. const bytes = new Uint8Array(input);
  36. // Scan for embedded files
  37. const fileDetails = scanForEmbeddedFiles(bytes);
  38. // Extract each file that we support
  39. const files = [];
  40. fileDetails.forEach(fileDetail => {
  41. try {
  42. files.push(extractFile(bytes, fileDetail));
  43. } catch (err) {}
  44. });
  45. return files;
  46. }
  47. /**
  48. * Displays the files in HTML for web apps.
  49. *
  50. * @param {File[]} files
  51. * @returns {html}
  52. */
  53. async present(files) {
  54. return await Utils.displayFilesAsHTML(files);
  55. }
  56. }
  57. /**
  58. * TODO refactor
  59. * @param data
  60. */
  61. function scanForEmbeddedFiles(data) {
  62. let type;
  63. const types = [];
  64. for (let i = 0; i < data.length; i++) {
  65. type = Magic.magicFileType(data.slice(i));
  66. if (type) {
  67. types.push({
  68. offset: i,
  69. ext: type.ext,
  70. mime: type.mime,
  71. desc: type.desc
  72. });
  73. }
  74. }
  75. return types;
  76. }
  77. export default ExtractFiles;