From 6742bef289755796f5d38247092f01b28d1ec8ff Mon Sep 17 00:00:00 2001 From: n1474335 Date: Sun, 30 Jul 2017 12:36:50 +0100 Subject: [PATCH] Separated out Diff and Windows Filetime operations into their own namespaces as they rely on libraries not used by the rest of the operations in their group --- src/core/config/OperationConfig.js | 20 +++--- src/core/operations/BitwiseOp.js | 1 - src/core/operations/DateTime.js | 81 ------------------------ src/core/operations/Diff.js | 94 ++++++++++++++++++++++++++++ src/core/operations/Extract.js | 33 ---------- src/core/operations/Filetime.js | 99 ++++++++++++++++++++++++++++++ src/core/operations/StrUtils.js | 78 ----------------------- 7 files changed, 204 insertions(+), 202 deletions(-) create mode 100644 src/core/operations/Diff.js create mode 100644 src/core/operations/Filetime.js diff --git a/src/core/config/OperationConfig.js b/src/core/config/OperationConfig.js index b0c005b3..ebcb28b7 100755 --- a/src/core/config/OperationConfig.js +++ b/src/core/config/OperationConfig.js @@ -12,9 +12,11 @@ import Code from "../operations/Code.js"; import Compress from "../operations/Compress.js"; import Convert from "../operations/Convert.js"; import DateTime from "../operations/DateTime.js"; +import Diff from "../operations/Diff.js"; import Endian from "../operations/Endian.js"; import Entropy from "../operations/Entropy.js"; import Extract from "../operations/Extract.js"; +import Filetime from "../operations/Filetime.js"; import FileType from "../operations/FileType.js"; import Image from "../operations/Image.js"; import Hash from "../operations/Hash.js"; @@ -2294,37 +2296,37 @@ const OperationConfig = { }, "Windows Filetime to UNIX Timestamp": { description: "Converts a Windows Filetime value to a UNIX timestamp.

A Windows Filetime is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 UTC.

A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch).

This operation also supports UNIX timestamps in milliseconds, microseconds and nanoseconds.", - run: DateTime.runFromFiletimeToUnix, + run: Filetime.runFromFiletimeToUnix, inputType: "string", outputType: "string", args: [ { name: "Output units", type: "option", - value: DateTime.UNITS + value: Filetime.UNITS }, { name: "Input format", type: "option", - value: DateTime.FILETIME_FORMATS + value: Filetime.FILETIME_FORMATS } ] }, "UNIX Timestamp to Windows Filetime": { description: "Converts a UNIX timestamp to a Windows Filetime value.

A Windows Filetime is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 UTC.

A UNIX timestamp is a 32-bit value representing the number of seconds since January 1, 1970 UTC (the UNIX epoch).

This operation also supports UNIX timestamps in milliseconds, microseconds and nanoseconds.", - run: DateTime.runToFiletimeFromUnix, + run: Filetime.runToFiletimeFromUnix, inputType: "string", outputType: "string", args: [ { name: "Input units", type: "option", - value: DateTime.UNITS + value: Filetime.UNITS }, { name: "Output format", type: "option", - value: DateTime.FILETIME_FORMATS + value: Filetime.FILETIME_FORMATS } ] }, @@ -3123,19 +3125,19 @@ const OperationConfig = { }, "Diff": { description: "Compares two inputs (separated by the specified delimiter) and highlights the differences between them.", - run: StrUtils.runDiff, + run: Diff.runDiff, inputType: "string", outputType: "html", args: [ { name: "Sample delimiter", type: "binaryString", - value: StrUtils.DIFF_SAMPLE_DELIMITER + value: Diff.DIFF_SAMPLE_DELIMITER }, { name: "Diff by", type: "option", - value: StrUtils.DIFF_BY + value: Diff.DIFF_BY }, { name: "Show added", diff --git a/src/core/operations/BitwiseOp.js b/src/core/operations/BitwiseOp.js index 15d778c7..4961b886 100755 --- a/src/core/operations/BitwiseOp.js +++ b/src/core/operations/BitwiseOp.js @@ -1,5 +1,4 @@ import Utils from "../Utils.js"; -import CryptoJS from "crypto-js"; /** diff --git a/src/core/operations/DateTime.js b/src/core/operations/DateTime.js index b665a2b5..523206b2 100755 --- a/src/core/operations/DateTime.js +++ b/src/core/operations/DateTime.js @@ -1,5 +1,3 @@ -import {BigInteger} from "jsbn"; - /** * Date and time operations. * @@ -80,85 +78,6 @@ const DateTime = { }, - /** - * Windows Filetime to Unix Timestamp operation. - * - * @author bwhitn [brian.m.whitney@outlook.com] - * @param {string} input - * @param {Object[]} args - * @returns {string} - */ - runFromFiletimeToUnix: function(input, args) { - let units = args[0], - format = args[1]; - - if (format === "Hex") { - input = new BigInteger(input, 16); - } else { - input = new BigInteger(input); - } - - input = input.subtract(new BigInteger("116444736000000000")); - - if (units === "Seconds (s)"){ - input = input.divide(new BigInteger("10000000")); - } else if (units === "Milliseconds (ms)") { - input = input.divide(new BigInteger("10000")); - } else if (units === "Microseconds (μs)") { - input = input.divide(new BigInteger("10")); - } else if (units === "Nanoseconds (ns)") { - input = input.multiply(new BigInteger("100")); - } else { - throw "Unrecognised unit"; - } - - return input.toString(); - }, - - - /** - * Unix Timestamp to Windows Filetime operation. - * - * @author bwhitn [brian.m.whitney@outlook.com] - * @param {string} input - * @param {Object[]} args - * @returns {string} - */ - runToFiletimeFromUnix: function(input, args) { - let units = args[0], - format = args[1]; - - input = new BigInteger(input); - - if (units === "Seconds (s)"){ - input = input.multiply(new BigInteger("10000000")); - } else if (units === "Milliseconds (ms)") { - input = input.multiply(new BigInteger("10000")); - } else if (units === "Microseconds (μs)") { - input = input.multiply(new BigInteger("10")); - } else if (units === "Nanoseconds (ns)") { - input = input.divide(new BigInteger("100")); - } else { - throw "Unrecognised unit"; - } - - input = input.add(new BigInteger("116444736000000000")); - - if (format === "Hex"){ - return input.toString(16); - } else { - return input.toString(); - } - }, - - - /** - * @constant - * @default - */ - FILETIME_FORMATS: ["Decimal", "Hex"], - - /** * @constant * @default diff --git a/src/core/operations/Diff.js b/src/core/operations/Diff.js new file mode 100644 index 00000000..25048dee --- /dev/null +++ b/src/core/operations/Diff.js @@ -0,0 +1,94 @@ +import Utils from "../Utils.js"; +import * as JsDiff from "diff"; + + +/** + * Diff operations. + * + * @author n1474335 [n1474335@gmail.com] + * @copyright Crown Copyright 2016 + * @license Apache-2.0 + * + * @namespace + */ +const Diff = { + + /** + * @constant + * @default + */ + DIFF_SAMPLE_DELIMITER: "\\n\\n", + /** + * @constant + * @default + */ + DIFF_BY: ["Character", "Word", "Line", "Sentence", "CSS", "JSON"], + + /** + * Diff operation. + * + * @param {string} input + * @param {Object[]} args + * @returns {html} + */ + runDiff: function(input, args) { + let sampleDelim = args[0], + diffBy = args[1], + showAdded = args[2], + showRemoved = args[3], + ignoreWhitespace = args[4], + samples = input.split(sampleDelim), + output = "", + diff; + + if (!samples || samples.length !== 2) { + return "Incorrect number of samples, perhaps you need to modify the sample delimiter or add more samples?"; + } + + switch (diffBy) { + case "Character": + diff = JsDiff.diffChars(samples[0], samples[1]); + break; + case "Word": + if (ignoreWhitespace) { + diff = JsDiff.diffWords(samples[0], samples[1]); + } else { + diff = JsDiff.diffWordsWithSpace(samples[0], samples[1]); + } + break; + case "Line": + if (ignoreWhitespace) { + diff = JsDiff.diffTrimmedLines(samples[0], samples[1]); + } else { + diff = JsDiff.diffLines(samples[0], samples[1]); + } + break; + case "Sentence": + diff = JsDiff.diffSentences(samples[0], samples[1]); + break; + case "CSS": + diff = JsDiff.diffCss(samples[0], samples[1]); + break; + case "JSON": + diff = JsDiff.diffJson(samples[0], samples[1]); + break; + default: + return "Invalid 'Diff by' option."; + } + + for (let i = 0; i < diff.length; i++) { + if (diff[i].added) { + if (showAdded) output += "" + Utils.escapeHtml(diff[i].value) + ""; + } else if (diff[i].removed) { + if (showRemoved) output += "" + Utils.escapeHtml(diff[i].value) + ""; + } else { + output += Utils.escapeHtml(diff[i].value); + } + } + + return output; + }, + +}; + +export default Diff; \ No newline at end of file diff --git a/src/core/operations/Extract.js b/src/core/operations/Extract.js index 080da27f..7e44d1ce 100755 --- a/src/core/operations/Extract.js +++ b/src/core/operations/Extract.js @@ -261,39 +261,6 @@ const Extract = { return Extract._search(input, regex, null, displayTotal); }, - - /** - * Extract all identifiers operation. - * - * @param {string} input - * @param {Object[]} args - * @returns {string} - */ - runAllIdents: function(input, args) { - let output = ""; - output += "IP addresses\n"; - output += Extract.runIp(input, [true, true, false]); - - output += "\nEmail addresses\n"; - output += Extract.runEmail(input, []); - - output += "\nMAC addresses\n"; - output += Extract.runMac(input, []); - - output += "\nURLs\n"; - output += Extract.runUrls(input, []); - - output += "\nDomain names\n"; - output += Extract.runDomains(input, []); - - output += "\nFile paths\n"; - output += Extract.runFilePaths(input, [true, true]); - - output += "\nDates\n"; - output += Extract.runDates(input, []); - return output; - }, - }; export default Extract; diff --git a/src/core/operations/Filetime.js b/src/core/operations/Filetime.js new file mode 100644 index 00000000..5b419d28 --- /dev/null +++ b/src/core/operations/Filetime.js @@ -0,0 +1,99 @@ +import {BigInteger} from "jsbn"; + +/** + * Windows Filetime operations. + * + * @author n1474335 [n1474335@gmail.com] + * @copyright Crown Copyright 2017 + * @license Apache-2.0 + * + * @namespace + */ +const Filetime = { + + /** + * @constant + * @default + */ + UNITS: ["Seconds (s)", "Milliseconds (ms)", "Microseconds (μs)", "Nanoseconds (ns)"], + + /** + * @constant + * @default + */ + FILETIME_FORMATS: ["Decimal", "Hex"], + + /** + * Windows Filetime to Unix Timestamp operation. + * + * @author bwhitn [brian.m.whitney@outlook.com] + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + runFromFiletimeToUnix: function(input, args) { + let units = args[0], + format = args[1]; + + if (format === "Hex") { + input = new BigInteger(input, 16); + } else { + input = new BigInteger(input); + } + + input = input.subtract(new BigInteger("116444736000000000")); + + if (units === "Seconds (s)"){ + input = input.divide(new BigInteger("10000000")); + } else if (units === "Milliseconds (ms)") { + input = input.divide(new BigInteger("10000")); + } else if (units === "Microseconds (μs)") { + input = input.divide(new BigInteger("10")); + } else if (units === "Nanoseconds (ns)") { + input = input.multiply(new BigInteger("100")); + } else { + throw "Unrecognised unit"; + } + + return input.toString(); + }, + + + /** + * Unix Timestamp to Windows Filetime operation. + * + * @author bwhitn [brian.m.whitney@outlook.com] + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + runToFiletimeFromUnix: function(input, args) { + let units = args[0], + format = args[1]; + + input = new BigInteger(input); + + if (units === "Seconds (s)"){ + input = input.multiply(new BigInteger("10000000")); + } else if (units === "Milliseconds (ms)") { + input = input.multiply(new BigInteger("10000")); + } else if (units === "Microseconds (μs)") { + input = input.multiply(new BigInteger("10")); + } else if (units === "Nanoseconds (ns)") { + input = input.divide(new BigInteger("100")); + } else { + throw "Unrecognised unit"; + } + + input = input.add(new BigInteger("116444736000000000")); + + if (format === "Hex"){ + return input.toString(16); + } else { + return input.toString(); + } + }, + +}; + +export default Filetime; diff --git a/src/core/operations/StrUtils.js b/src/core/operations/StrUtils.js index 698e7eef..849e04f8 100755 --- a/src/core/operations/StrUtils.js +++ b/src/core/operations/StrUtils.js @@ -1,5 +1,4 @@ import Utils from "../Utils.js"; -import * as JsDiff from "diff"; /** @@ -294,83 +293,6 @@ const StrUtils = { }, - /** - * @constant - * @default - */ - DIFF_SAMPLE_DELIMITER: "\\n\\n", - /** - * @constant - * @default - */ - DIFF_BY: ["Character", "Word", "Line", "Sentence", "CSS", "JSON"], - - /** - * Diff operation. - * - * @param {string} input - * @param {Object[]} args - * @returns {html} - */ - runDiff: function(input, args) { - let sampleDelim = args[0], - diffBy = args[1], - showAdded = args[2], - showRemoved = args[3], - ignoreWhitespace = args[4], - samples = input.split(sampleDelim), - output = "", - diff; - - if (!samples || samples.length !== 2) { - return "Incorrect number of samples, perhaps you need to modify the sample delimiter or add more samples?"; - } - - switch (diffBy) { - case "Character": - diff = JsDiff.diffChars(samples[0], samples[1]); - break; - case "Word": - if (ignoreWhitespace) { - diff = JsDiff.diffWords(samples[0], samples[1]); - } else { - diff = JsDiff.diffWordsWithSpace(samples[0], samples[1]); - } - break; - case "Line": - if (ignoreWhitespace) { - diff = JsDiff.diffTrimmedLines(samples[0], samples[1]); - } else { - diff = JsDiff.diffLines(samples[0], samples[1]); - } - break; - case "Sentence": - diff = JsDiff.diffSentences(samples[0], samples[1]); - break; - case "CSS": - diff = JsDiff.diffCss(samples[0], samples[1]); - break; - case "JSON": - diff = JsDiff.diffJson(samples[0], samples[1]); - break; - default: - return "Invalid 'Diff by' option."; - } - - for (let i = 0; i < diff.length; i++) { - if (diff[i].added) { - if (showAdded) output += "" + Utils.escapeHtml(diff[i].value) + ""; - } else if (diff[i].removed) { - if (showRemoved) output += "" + Utils.escapeHtml(diff[i].value) + ""; - } else { - output += Utils.escapeHtml(diff[i].value); - } - } - - return output; - }, - - /** * @constant * @default