diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json index 4fac84c9..9db13647 100755 --- a/src/core/config/Categories.json +++ b/src/core/config/Categories.json @@ -49,6 +49,7 @@ "Change IP format", "Encode text", "Decode text", + "Text Encoding Brute Force", "Swap endianness", "To MessagePack", "From MessagePack", diff --git a/src/core/operations/TextEncodingBruteForce.mjs b/src/core/operations/TextEncodingBruteForce.mjs new file mode 100644 index 00000000..ef2d6500 --- /dev/null +++ b/src/core/operations/TextEncodingBruteForce.mjs @@ -0,0 +1,52 @@ +/** + * @author Cynser + * @copyright Crown Copyright 2018 + * @license Apache-2.0 + */ + +import Operation from "../Operation"; +import Utils from "../Utils"; +import cptable from "../vendor/js-codepage/cptable.js"; +import {IO_FORMAT} from "../lib/ChrEnc"; + +/** + * Text Encoding Brute Force operation + */ +class TextEncodingBruteForce extends Operation { + + /** + * TextEncodingBruteForce constructor + */ + constructor() { + super(); + + this.name = "Text Encoding Brute Force"; + this.module = "CharEnc"; + this.description = "Enumerate all possible text encodings for input."; + this.infoURL = "https://wikipedia.org/wiki/Character_encoding"; + this.inputType = "string"; + this.outputType = "string"; + this.args = []; + } + + /** + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + run(input, args) { + const output = [], + charSets = Object.keys(IO_FORMAT); + + for (let i = 0; i < charSets.length; i++) { + let currentEncoding = Utils.printable(charSets[i] + ": ", false); + currentEncoding += cptable.utils.encode(IO_FORMAT[charSets[i]], input); + output.push(currentEncoding); + } + + return output.join("\n"); + } + +} + +export default TextEncodingBruteForce; diff --git a/test/index.mjs b/test/index.mjs index 9c11f6ae..89e09ea4 100644 --- a/test/index.mjs +++ b/test/index.mjs @@ -74,6 +74,7 @@ import "./tests/operations/SetIntersection"; import "./tests/operations/SetUnion"; import "./tests/operations/StrUtils"; import "./tests/operations/SymmetricDifference"; +import "./tests/operations/TextEncodingBruteForce"; import "./tests/operations/ToGeohash.mjs"; import "./tests/operations/TranslateDateTimeFormat"; import "./tests/operations/Magic"; diff --git a/test/tests/operations/TextEncodingBruteForce.mjs b/test/tests/operations/TextEncodingBruteForce.mjs new file mode 100644 index 00000000..5316eb16 --- /dev/null +++ b/test/tests/operations/TextEncodingBruteForce.mjs @@ -0,0 +1,24 @@ +/** + * Text Encoding Brute Force tests. + * + * @author Cynser + * + * @copyright Crown Copyright 2018 + * @license Apache-2.0 + */ +import TestRegister from "../../TestRegister"; + +TestRegister.addTests([ + { + name: "Text Encoding Brute Force", + input: "Булкі праз ляніва сабаку.", + expectedMatch: /Windows\-1251 Cyrillic \(1251\): Булкі праз ляніва сабаку\./, + recipeConfig: [ + { + op: "Text Encoding Brute Force", + args: [], + }, + ], + } +]); +