Merge branch 'master' into feature-ebcdic

This commit is contained in:
Toby Lorne 2017-05-07 18:21:30 -04:00 committed by GitHub
commit 6bf06a9629
73 changed files with 1481 additions and 1003 deletions

1
.eslintignore Normal file
View file

@ -0,0 +1 @@
src/core/lib/**

View file

@ -1,6 +1,6 @@
{ {
"parserOptions": { "parserOptions": {
"ecmaVersion": 6, "ecmaVersion": 8,
"ecmaFeatures": { "ecmaFeatures": {
"impliedStrict": true "impliedStrict": true
}, },
@ -84,7 +84,8 @@
}], }],
"no-whitespace-before-property": "error", "no-whitespace-before-property": "error",
"operator-linebreak": ["error", "after"], "operator-linebreak": ["error", "after"],
"space-in-parens": "error" "space-in-parens": "error",
"no-var": "error"
}, },
"globals": { "globals": {
"$": false, "$": false,

View file

@ -1,7 +1,7 @@
var webpack = require("webpack"), const webpack = require("webpack");
ExtractTextPlugin = require("extract-text-webpack-plugin"), const ExtractTextPlugin = require("extract-text-webpack-plugin");
HtmlWebpackPlugin = require("html-webpack-plugin"), const HtmlWebpackPlugin = require("html-webpack-plugin");
Inliner = require("web-resource-inliner"); const Inliner = require("web-resource-inliner");
module.exports = function (grunt) { module.exports = function (grunt) {
grunt.file.defaultEncoding = "utf8"; grunt.file.defaultEncoding = "utf8";
@ -54,7 +54,7 @@ module.exports = function (grunt) {
// Project configuration // Project configuration
var compileTime = grunt.template.today("dd/mm/yyyy HH:MM:ss") + " UTC", const compileTime = grunt.template.today("dd/mm/yyyy HH:MM:ss") + " UTC",
banner = "/**\n" + banner = "/**\n" +
"* CyberChef - The Cyber Swiss Army Knife\n" + "* CyberChef - The Cyber Swiss Army Knife\n" +
"*\n" + "*\n" +
@ -80,7 +80,7 @@ module.exports = function (grunt) {
* Compiles a production build of CyberChef into a single, portable web page. * Compiles a production build of CyberChef into a single, portable web page.
*/ */
function runInliner() { function runInliner() {
var inlinerError = false; const done = this.async();
Inliner.html({ Inliner.html({
relativeTo: "build/prod/", relativeTo: "build/prod/",
fileContent: grunt.file.read("build/prod/cyberchef.htm"), fileContent: grunt.file.read("build/prod/cyberchef.htm"),
@ -91,14 +91,16 @@ module.exports = function (grunt) {
strict: true strict: true
}, function(error, result) { }, function(error, result) {
if (error) { if (error) {
console.log(error); if (error instanceof Error) {
inlinerError = true; done(error);
return false; } else {
done(new Error(error));
}
} else {
grunt.file.write("build/prod/cyberchef.htm", result);
done(true);
} }
grunt.file.write("build/prod/cyberchef.htm", result);
}); });
return !inlinerError;
} }
grunt.initConfig({ grunt.initConfig({
@ -111,7 +113,7 @@ module.exports = function (grunt) {
}, },
eslint: { eslint: {
options: { options: {
configFile: "src/.eslintrc.json" configFile: "./.eslintrc.json"
}, },
configs: ["Gruntfile.js"], configs: ["Gruntfile.js"],
core: ["src/core/**/*.js", "!src/core/lib/**/*"], core: ["src/core/**/*.js", "!src/core/lib/**/*"],
@ -218,7 +220,8 @@ module.exports = function (grunt) {
] ]
}, },
stats: { stats: {
children: false children: false,
warningsFilter: /source-map/
} }
}, },
webDev: { webDev: {
@ -301,7 +304,7 @@ module.exports = function (grunt) {
copy: { copy: {
ghPages: { ghPages: {
options: { options: {
process: function (content, srcpath) { process: function (content) {
// Add Google Analytics code to index.html // Add Google Analytics code to index.html
content = content.replace("</body></html>", content = content.replace("</body></html>",
grunt.file.read("src/web/static/ga.html") + "</body></html>"); grunt.file.read("src/web/static/ga.html") + "</body></html>");
@ -342,5 +345,4 @@ module.exports = function (grunt) {
test: "build/test/index.js" test: "build/test/index.js"
}, },
}); });
}; };

View file

@ -2,7 +2,10 @@
"tags": { "tags": {
"allowUnknownTags": true "allowUnknownTags": true
}, },
"plugins": ["plugins/markdown"], "plugins": [
"plugins/markdown",
"node_modules/jsdoc-babel"
],
"templates": { "templates": {
"systemName": "CyberChef", "systemName": "CyberChef",
"footer": "", "footer": "",

View file

@ -1,6 +1,6 @@
{ {
"name": "cyberchef", "name": "cyberchef",
"version": "5.2.4", "version": "5.3.5",
"description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.", "description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.",
"author": "n1474335 <n1474335@gmail.com>", "author": "n1474335 <n1474335@gmail.com>",
"homepage": "https://gchq.github.io/CyberChef", "homepage": "https://gchq.github.io/CyberChef",
@ -51,6 +51,7 @@
"html-webpack-plugin": "^2.28.0", "html-webpack-plugin": "^2.28.0",
"imports-loader": "^0.7.1", "imports-loader": "^0.7.1",
"ink-docstrap": "^1.1.4", "ink-docstrap": "^1.1.4",
"jsdoc-babel": "^0.3.0",
"less": "^2.7.2", "less": "^2.7.2",
"less-loader": "^4.0.2", "less-loader": "^4.0.2",
"style-loader": "^0.15.0", "style-loader": "^0.15.0",
@ -71,7 +72,8 @@
"google-code-prettify": "^1.0.5", "google-code-prettify": "^1.0.5",
"jquery": "^3.1.1", "jquery": "^3.1.1",
"jsbn": "^1.1.0", "jsbn": "^1.1.0",
"jsrsasign": "^7.1.0", "jsrsasign": "7.1.3",
"lodash": "^4.17.4",
"moment": "^2.17.1", "moment": "^2.17.1",
"moment-timezone": "^0.5.11", "moment-timezone": "^0.5.11",
"sladex-blowfish": "^0.8.1", "sladex-blowfish": "^0.8.1",

View file

@ -11,7 +11,7 @@ import Recipe from "./Recipe.js";
* *
* @class * @class
*/ */
var Chef = function() { const Chef = function() {
this.dish = new Dish(); this.dish = new Dish();
}; };
@ -34,8 +34,8 @@ var Chef = function() {
* @returns {number} response.duration - The number of ms it took to execute the recipe * @returns {number} response.duration - The number of ms it took to execute the recipe
* @returns {number} response.error - The error object thrown by a failed operation (false if no error) * @returns {number} response.error - The error object thrown by a failed operation (false if no error)
*/ */
Chef.prototype.bake = function(inputText, recipeConfig, options, progress, step) { Chef.prototype.bake = async function(inputText, recipeConfig, options, progress, step) {
var startTime = new Date().getTime(), let startTime = new Date().getTime(),
recipe = new Recipe(recipeConfig), recipe = new Recipe(recipeConfig),
containsFc = recipe.containsFlowControl(), containsFc = recipe.containsFlowControl(),
error = false; error = false;
@ -72,7 +72,7 @@ Chef.prototype.bake = function(inputText, recipeConfig, options, progress, step)
} }
try { try {
progress = recipe.execute(this.dish, progress); progress = await recipe.execute(this.dish, progress);
} catch (err) { } catch (err) {
// Return the error in the result so that everything else gets correctly updated // Return the error in the result so that everything else gets correctly updated
// rather than throwing it here and losing state info. // rather than throwing it here and losing state info.
@ -111,7 +111,7 @@ Chef.prototype.bake = function(inputText, recipeConfig, options, progress, step)
* @returns {number} The time it took to run the silent bake in milliseconds. * @returns {number} The time it took to run the silent bake in milliseconds.
*/ */
Chef.prototype.silentBake = function(recipeConfig) { Chef.prototype.silentBake = function(recipeConfig) {
var startTime = new Date().getTime(), let startTime = new Date().getTime(),
recipe = new Recipe(recipeConfig), recipe = new Recipe(recipeConfig),
dish = new Dish("", Dish.STRING); dish = new Dish("", Dish.STRING);

View file

@ -1,6 +1,5 @@
import Utils from "./Utils.js"; import Utils from "./Utils.js";
/** /**
* The data being operated on by each operation. * The data being operated on by each operation.
* *
@ -12,7 +11,7 @@ import Utils from "./Utils.js";
* @param {byteArray|string|number} value - The value of the input data. * @param {byteArray|string|number} value - The value of the input data.
* @param {number} type - The data type of value, see Dish enums. * @param {number} type - The data type of value, see Dish enums.
*/ */
var Dish = function(value, type) { const Dish = function(value, type) {
this.value = value || typeof value == "string" ? value : null; this.value = value || typeof value == "string" ? value : null;
this.type = type || Dish.BYTE_ARRAY; this.type = type || Dish.BYTE_ARRAY;
}; };
@ -105,7 +104,7 @@ Dish.prototype.set = function(value, type) {
this.type = type; this.type = type;
if (!this.valid()) { if (!this.valid()) {
var sample = Utils.truncate(JSON.stringify(this.value), 13); const sample = Utils.truncate(JSON.stringify(this.value), 13);
throw "Data is not a valid " + Dish.enumLookup(type) + ": " + sample; throw "Data is not a valid " + Dish.enumLookup(type) + ": " + sample;
} }
}; };
@ -180,7 +179,7 @@ Dish.prototype.valid = function() {
} }
// Check that every value is a number between 0 - 255 // Check that every value is a number between 0 - 255
for (var i = 0; i < this.value.length; i++) { for (let i = 0; i < this.value.length; i++) {
if (typeof this.value[i] != "number" || if (typeof this.value[i] != "number" ||
this.value[i] < 0 || this.value[i] < 0 ||
this.value[i] > 255) { this.value[i] > 255) {

View file

@ -38,8 +38,8 @@ const FlowControl = {
* @param {Operation[]} state.opList - The list of operations in the recipe. * @param {Operation[]} state.opList - The list of operations in the recipe.
* @returns {Object} The updated state of the recipe. * @returns {Object} The updated state of the recipe.
*/ */
runFork: function(state) { runFork: async function(state) {
var opList = state.opList, let opList = state.opList,
inputType = opList[state.progress].inputType, inputType = opList[state.progress].inputType,
outputType = opList[state.progress].outputType, outputType = opList[state.progress].outputType,
input = state.dish.get(inputType), input = state.dish.get(inputType),
@ -48,14 +48,15 @@ const FlowControl = {
mergeDelim = ings[1], mergeDelim = ings[1],
ignoreErrors = ings[2], ignoreErrors = ings[2],
subOpList = [], subOpList = [],
inputs = []; inputs = [],
i;
if (input) if (input)
inputs = input.split(splitDelim); inputs = input.split(splitDelim);
// Create subOpList for each tranche to operate on // Create subOpList for each tranche to operate on
// (all remaining operations unless we encounter a Merge) // (all remaining operations unless we encounter a Merge)
for (var i = state.progress + 1; i < opList.length; i++) { for (i = state.progress + 1; i < opList.length; i++) {
if (opList[i].name === "Merge" && !opList[i].isDisabled()) { if (opList[i].name === "Merge" && !opList[i].isDisabled()) {
break; break;
} else { } else {
@ -63,7 +64,7 @@ const FlowControl = {
} }
} }
var recipe = new Recipe(), let recipe = new Recipe(),
output = "", output = "",
progress = 0; progress = 0;
@ -71,9 +72,9 @@ const FlowControl = {
// Run recipe over each tranche // Run recipe over each tranche
for (i = 0; i < inputs.length; i++) { for (i = 0; i < inputs.length; i++) {
var dish = new Dish(inputs[i], inputType); const dish = new Dish(inputs[i], inputType);
try { try {
progress = recipe.execute(dish, 0); progress = await recipe.execute(dish, 0);
} catch (err) { } catch (err) {
if (!ignoreErrors) { if (!ignoreErrors) {
throw err; throw err;
@ -127,7 +128,7 @@ const FlowControl = {
* @returns {Object} The updated state of the recipe. * @returns {Object} The updated state of the recipe.
*/ */
runJump: function(state) { runJump: function(state) {
var ings = state.opList[state.progress].getIngValues(), let ings = state.opList[state.progress].getIngValues(),
jumpNum = ings[0], jumpNum = ings[0],
maxJumps = ings[1]; maxJumps = ings[1];
@ -156,7 +157,7 @@ const FlowControl = {
* @returns {Object} The updated state of the recipe. * @returns {Object} The updated state of the recipe.
*/ */
runCondJump: function(state) { runCondJump: function(state) {
var ings = state.opList[state.progress].getIngValues(), let ings = state.opList[state.progress].getIngValues(),
dish = state.dish, dish = state.dish,
regexStr = ings[0], regexStr = ings[0],
jumpNum = ings[1], jumpNum = ings[1],
@ -193,6 +194,20 @@ const FlowControl = {
return state; return state;
}, },
/**
* Comment operation.
*
* @param {Object} state - The current state of the recipe.
* @param {number} state.progress - The current position in the recipe.
* @param {Dish} state.dish - The Dish being operated on.
* @param {Operation[]} state.opList - The list of operations in the recipe.
* @returns {Object} The updated state of the recipe.
*/
runComment: function(state) {
return state;
},
}; };
export default FlowControl; export default FlowControl;

View file

@ -11,7 +11,7 @@ import Utils from "./Utils.js";
* @class * @class
* @param {Object} ingredientConfig * @param {Object} ingredientConfig
*/ */
var Ingredient = function(ingredientConfig) { const Ingredient = function(ingredientConfig) {
this.name = ""; this.name = "";
this.type = ""; this.type = "";
this.value = null; this.value = null;
@ -63,6 +63,8 @@ Ingredient.prototype.setValue = function(value) {
* @param {string} type - The name of the data type. * @param {string} type - The name of the data type.
*/ */
Ingredient.prepare = function(data, type) { Ingredient.prepare = function(data, type) {
let number;
switch (type) { switch (type) {
case "binaryString": case "binaryString":
case "binaryShortString": case "binaryShortString":
@ -76,9 +78,9 @@ Ingredient.prepare = function(data, type) {
return data; return data;
} }
case "number": case "number":
var number = parseFloat(data); number = parseFloat(data);
if (isNaN(number)) { if (isNaN(number)) {
var sample = Utils.truncate(data.toString(), 10); const sample = Utils.truncate(data.toString(), 10);
throw "Invalid ingredient value. Not a number: " + sample; throw "Invalid ingredient value. Not a number: " + sample;
} }
return number; return number;

View file

@ -13,7 +13,7 @@ import Ingredient from "./Ingredient.js";
* @param {string} operationName * @param {string} operationName
* @param {Object} operationConfig * @param {Object} operationConfig
*/ */
var Operation = function(operationName, operationConfig) { const Operation = function(operationName, operationConfig) {
this.name = operationName; this.name = operationName;
this.description = ""; this.description = "";
this.inputType = -1; this.inputType = -1;
@ -46,9 +46,9 @@ Operation.prototype._parseConfig = function(operationConfig) {
this.highlightReverse = operationConfig.highlightReverse; this.highlightReverse = operationConfig.highlightReverse;
this.flowControl = operationConfig.flowControl; this.flowControl = operationConfig.flowControl;
for (var a = 0; a < operationConfig.args.length; a++) { for (let a = 0; a < operationConfig.args.length; a++) {
var ingredientConfig = operationConfig.args[a]; const ingredientConfig = operationConfig.args[a];
var ingredient = new Ingredient(ingredientConfig); const ingredient = new Ingredient(ingredientConfig);
this.addIngredient(ingredient); this.addIngredient(ingredient);
} }
}; };
@ -60,13 +60,13 @@ Operation.prototype._parseConfig = function(operationConfig) {
* @returns {Object} * @returns {Object}
*/ */
Operation.prototype.getConfig = function() { Operation.prototype.getConfig = function() {
var ingredientConfig = []; const ingredientConfig = [];
for (var o = 0; o < this.ingList.length; o++) { for (let o = 0; o < this.ingList.length; o++) {
ingredientConfig.push(this.ingList[o].getConfig()); ingredientConfig.push(this.ingList[o].getConfig());
} }
var operationConfig = { const operationConfig = {
"op": this.name, "op": this.name,
"args": ingredientConfig "args": ingredientConfig
}; };
@ -91,7 +91,7 @@ Operation.prototype.addIngredient = function(ingredient) {
* @param {Object[]} ingValues * @param {Object[]} ingValues
*/ */
Operation.prototype.setIngValues = function(ingValues) { Operation.prototype.setIngValues = function(ingValues) {
for (var i = 0; i < ingValues.length; i++) { for (let i = 0; i < ingValues.length; i++) {
this.ingList[i].setValue(ingValues[i]); this.ingList[i].setValue(ingValues[i]);
} }
}; };
@ -103,8 +103,8 @@ Operation.prototype.setIngValues = function(ingValues) {
* @returns {Object[]} * @returns {Object[]}
*/ */
Operation.prototype.getIngValues = function() { Operation.prototype.getIngValues = function() {
var ingValues = []; const ingValues = [];
for (var i = 0; i < this.ingList.length; i++) { for (let i = 0; i < this.ingList.length; i++) {
ingValues.push(this.ingList[i].value); ingValues.push(this.ingList[i].value);
} }
return ingValues; return ingValues;

View file

@ -12,7 +12,7 @@ import OperationConfig from "./config/OperationConfig.js";
* @class * @class
* @param {Object} recipeConfig * @param {Object} recipeConfig
*/ */
var Recipe = function(recipeConfig) { const Recipe = function(recipeConfig) {
this.opList = []; this.opList = [];
if (recipeConfig) { if (recipeConfig) {
@ -28,10 +28,10 @@ var Recipe = function(recipeConfig) {
* @param {Object} recipeConfig * @param {Object} recipeConfig
*/ */
Recipe.prototype._parseConfig = function(recipeConfig) { Recipe.prototype._parseConfig = function(recipeConfig) {
for (var c = 0; c < recipeConfig.length; c++) { for (let c = 0; c < recipeConfig.length; c++) {
var operationName = recipeConfig[c].op; const operationName = recipeConfig[c].op;
var operationConfig = OperationConfig[operationName]; const operationConfig = OperationConfig[operationName];
var operation = new Operation(operationName, operationConfig); const operation = new Operation(operationName, operationConfig);
operation.setIngValues(recipeConfig[c].args); operation.setIngValues(recipeConfig[c].args);
operation.setBreakpoint(recipeConfig[c].breakpoint); operation.setBreakpoint(recipeConfig[c].breakpoint);
operation.setDisabled(recipeConfig[c].disabled); operation.setDisabled(recipeConfig[c].disabled);
@ -46,9 +46,9 @@ Recipe.prototype._parseConfig = function(recipeConfig) {
* @returns {*} * @returns {*}
*/ */
Recipe.prototype.getConfig = function() { Recipe.prototype.getConfig = function() {
var recipeConfig = []; const recipeConfig = [];
for (var o = 0; o < this.opList.length; o++) { for (let o = 0; o < this.opList.length; o++) {
recipeConfig.push(this.opList[o].getConfig()); recipeConfig.push(this.opList[o].getConfig());
} }
@ -98,7 +98,7 @@ Recipe.prototype.setBreakpoint = function(position, value) {
* @param {number} pos * @param {number} pos
*/ */
Recipe.prototype.removeBreaksUpTo = function(pos) { Recipe.prototype.removeBreaksUpTo = function(pos) {
for (var i = 0; i < pos; i++) { for (let i = 0; i < pos; i++) {
this.opList[i].setBreakpoint(false); this.opList[i].setBreakpoint(false);
} }
}; };
@ -110,7 +110,7 @@ Recipe.prototype.removeBreaksUpTo = function(pos) {
* @returns {boolean} * @returns {boolean}
*/ */
Recipe.prototype.containsFlowControl = function() { Recipe.prototype.containsFlowControl = function() {
for (var i = 0; i < this.opList.length; i++) { for (let i = 0; i < this.opList.length; i++) {
if (this.opList[i].isFlowControl()) return true; if (this.opList[i].isFlowControl()) return true;
} }
return false; return false;
@ -125,7 +125,7 @@ Recipe.prototype.containsFlowControl = function() {
* @returns (number} * @returns (number}
*/ */
Recipe.prototype.lastOpIndex = function(startIndex) { Recipe.prototype.lastOpIndex = function(startIndex) {
var i = startIndex + 1 || 0, let i = startIndex + 1 || 0,
op; op;
for (; i < this.opList.length; i++) { for (; i < this.opList.length; i++) {
@ -145,11 +145,11 @@ Recipe.prototype.lastOpIndex = function(startIndex) {
* @param {number} [startFrom=0] - The index of the Operation to start executing from * @param {number} [startFrom=0] - The index of the Operation to start executing from
* @returns {number} - The final progress through the recipe * @returns {number} - The final progress through the recipe
*/ */
Recipe.prototype.execute = function(dish, startFrom) { Recipe.prototype.execute = async function(dish, startFrom) {
startFrom = startFrom || 0; startFrom = startFrom || 0;
var op, input, output, numJumps = 0; let op, input, output, numJumps = 0;
for (var i = startFrom; i < this.opList.length; i++) { for (let i = startFrom; i < this.opList.length; i++) {
op = this.opList[i]; op = this.opList[i];
if (op.isDisabled()) { if (op.isDisabled()) {
continue; continue;
@ -163,22 +163,22 @@ Recipe.prototype.execute = function(dish, startFrom) {
if (op.isFlowControl()) { if (op.isFlowControl()) {
// Package up the current state // Package up the current state
var state = { let state = {
"progress" : i, "progress" : i,
"dish" : dish, "dish" : dish,
"opList" : this.opList, "opList" : this.opList,
"numJumps" : numJumps "numJumps" : numJumps
}; };
state = op.run(state); state = await op.run(state);
i = state.progress; i = state.progress;
numJumps = state.numJumps; numJumps = state.numJumps;
} else { } else {
output = op.run(input, op.getIngValues()); output = await op.run(input, op.getIngValues());
dish.set(output, op.outputType); dish.set(output, op.outputType);
} }
} catch (err) { } catch (err) {
var e = typeof err == "string" ? { message: err } : err; const e = typeof err == "string" ? { message: err } : err;
e.progress = i; e.progress = i;
if (e.fileName) { if (e.fileName) {
@ -213,7 +213,7 @@ Recipe.prototype.toString = function() {
* @param {string} recipeStr * @param {string} recipeStr
*/ */
Recipe.prototype.fromString = function(recipeStr) { Recipe.prototype.fromString = function(recipeStr) {
var recipeConfig = JSON.parse(recipeStr); const recipeConfig = JSON.parse(recipeStr);
this._parseConfig(recipeConfig); this._parseConfig(recipeConfig);
}; };

View file

@ -65,7 +65,7 @@ const Utils = {
*/ */
padLeft: function(str, max, chr) { padLeft: function(str, max, chr) {
chr = chr || "0"; chr = chr || "0";
var startIndex = chr.length - (max - str.length); let startIndex = chr.length - (max - str.length);
startIndex = startIndex < 0 ? 0 : startIndex; startIndex = startIndex < 0 ? 0 : startIndex;
return str.length < max ? return str.length < max ?
Utils.padLeft(chr.slice(startIndex, chr.length) + str, max, chr) : str; Utils.padLeft(chr.slice(startIndex, chr.length) + str, max, chr) : str;
@ -119,7 +119,7 @@ const Utils = {
*/ */
padBytesRight: function(arr, numBytes, padByte) { padBytesRight: function(arr, numBytes, padByte) {
padByte = padByte || 0; padByte = padByte || 0;
var paddedBytes = new Array(numBytes); const paddedBytes = new Array(numBytes);
paddedBytes.fill(padByte); paddedBytes.fill(padByte);
Array.prototype.map.call(arr, function(b, i) { Array.prototype.map.call(arr, function(b, i) {
@ -216,8 +216,8 @@ const Utils = {
str = Utils.byteArrayToChars(Utils.strToByteArray(str)); str = Utils.byteArrayToChars(Utils.strToByteArray(str));
} }
var re = /[\0-\x08\x0B-\x0C\x0E-\x1F\x7F-\x9F\xAD\u0378\u0379\u037F-\u0383\u038B\u038D\u03A2\u0528-\u0530\u0557\u0558\u0560\u0588\u058B-\u058E\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08A1\u08AD-\u08E3\u08FF\u0978\u0980\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0C00\u0C04\u0C0D\u0C11\u0C29\u0C34\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5A-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C80\u0C81\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D01\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D4F-\u0D56\u0D58-\u0D5F\u0D64\u0D65\u0D76-\u0D78\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F5-\u13FF\u169D-\u169F\u16F1-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191D-\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C80-\u1CBF\u1CC8-\u1CCF\u1CF7-\u1CFF\u1DE7-\u1DFB\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20BB-\u20CF\u20F1-\u20FF\u218A-\u218F\u23F4-\u23FF\u2427-\u243F\u244B-\u245F\u2700\u2B4D-\u2B4F\u2B5A-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E3C-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FCD-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA698-\uA69E\uA6F8-\uA6FF\uA78F\uA794-\uA79F\uA7AB-\uA7F7\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C5-\uA8CD\uA8DA-\uA8DF\uA8FC-\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9E0-\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAA7C-\uAA7F\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F-\uABBF\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE27-\uFE2F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF]/g; const re = /[\0-\x08\x0B-\x0C\x0E-\x1F\x7F-\x9F\xAD\u0378\u0379\u037F-\u0383\u038B\u038D\u03A2\u0528-\u0530\u0557\u0558\u0560\u0588\u058B-\u058E\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08A1\u08AD-\u08E3\u08FF\u0978\u0980\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0C00\u0C04\u0C0D\u0C11\u0C29\u0C34\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5A-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C80\u0C81\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D01\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D4F-\u0D56\u0D58-\u0D5F\u0D64\u0D65\u0D76-\u0D78\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F5-\u13FF\u169D-\u169F\u16F1-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191D-\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C80-\u1CBF\u1CC8-\u1CCF\u1CF7-\u1CFF\u1DE7-\u1DFB\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20BB-\u20CF\u20F1-\u20FF\u218A-\u218F\u23F4-\u23FF\u2427-\u243F\u244B-\u245F\u2700\u2B4D-\u2B4F\u2B5A-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E3C-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FCD-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA698-\uA69E\uA6F8-\uA6FF\uA78F\uA794-\uA79F\uA7AB-\uA7F7\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C5-\uA8CD\uA8DA-\uA8DF\uA8FC-\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9E0-\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAA7C-\uAA7F\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F-\uABBF\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE27-\uFE2F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF]/g;
var wsRe = /[\x09-\x10\x0D\u2028\u2029]/g; const wsRe = /[\x09-\x10\x0D\u2028\u2029]/g;
str = str.replace(re, "."); str = str.replace(re, ".");
if (!preserveWs) str = str.replace(wsRe, "."); if (!preserveWs) str = str.replace(wsRe, ".");
@ -276,16 +276,16 @@ const Utils = {
* Utils.expandAlphRange("a-d0\\-3") * Utils.expandAlphRange("a-d0\\-3")
*/ */
expandAlphRange: function(alphStr) { expandAlphRange: function(alphStr) {
var alphArr = []; const alphArr = [];
for (var i = 0; i < alphStr.length; i++) { for (let i = 0; i < alphStr.length; i++) {
if (i < alphStr.length - 2 && if (i < alphStr.length - 2 &&
alphStr[i+1] === "-" && alphStr[i+1] === "-" &&
alphStr[i] !== "\\") { alphStr[i] !== "\\") {
var start = Utils.ord(alphStr[i]), let start = Utils.ord(alphStr[i]),
end = Utils.ord(alphStr[i+2]); end = Utils.ord(alphStr[i+2]);
for (var j = start; j <= end; j++) { for (let j = start; j <= end; j++) {
alphArr.push(Utils.chr(j)); alphArr.push(Utils.chr(j));
} }
i += 2; i += 2;
@ -316,8 +316,8 @@ const Utils = {
// TODO: Handle errors i.e. input string is not hex // TODO: Handle errors i.e. input string is not hex
if (!hexStr) return []; if (!hexStr) return [];
hexStr = hexStr.replace(/\s+/g, ""); hexStr = hexStr.replace(/\s+/g, "");
var byteArray = []; const byteArray = [];
for (var i = 0; i < hexStr.length; i += 2) { for (let i = 0; i < hexStr.length; i += 2) {
byteArray.push(parseInt(hexStr.substr(i, 2), 16)); byteArray.push(parseInt(hexStr.substr(i, 2), 16));
} }
return byteArray; return byteArray;
@ -336,8 +336,8 @@ const Utils = {
*/ */
byteArrayToHex: function(byteArray) { byteArrayToHex: function(byteArray) {
if (!byteArray) return ""; if (!byteArray) return "";
var hexStr = ""; let hexStr = "";
for (var i = 0; i < byteArray.length; i++) { for (let i = 0; i < byteArray.length; i++) {
hexStr += Utils.hex(byteArray[i]) + " "; hexStr += Utils.hex(byteArray[i]) + " ";
} }
return hexStr.slice(0, hexStr.length-1); return hexStr.slice(0, hexStr.length-1);
@ -359,8 +359,8 @@ const Utils = {
* Utils.strToByteArray("你好"); * Utils.strToByteArray("你好");
*/ */
strToByteArray: function(str) { strToByteArray: function(str) {
var byteArray = new Array(str.length); const byteArray = new Array(str.length);
var i = str.length, b; let i = str.length, b;
while (i--) { while (i--) {
b = str.charCodeAt(i); b = str.charCodeAt(i);
byteArray[i] = b; byteArray[i] = b;
@ -385,7 +385,7 @@ const Utils = {
* Utils.strToUtf8ByteArray("你好"); * Utils.strToUtf8ByteArray("你好");
*/ */
strToUtf8ByteArray: function(str) { strToUtf8ByteArray: function(str) {
var wordArray = CryptoJS.enc.Utf8.parse(str), let wordArray = CryptoJS.enc.Utf8.parse(str),
byteArray = Utils.wordArrayToByteArray(wordArray); byteArray = Utils.wordArrayToByteArray(wordArray);
if (typeof window !== "undefined" && str.length !== wordArray.sigBytes) { if (typeof window !== "undefined" && str.length !== wordArray.sigBytes) {
@ -409,8 +409,8 @@ const Utils = {
* Utils.strToCharcode("你好"); * Utils.strToCharcode("你好");
*/ */
strToCharcode: function(str) { strToCharcode: function(str) {
var byteArray = new Array(str.length); const byteArray = new Array(str.length);
var i = str.length; let i = str.length;
while (i--) { while (i--) {
byteArray[i] = str.charCodeAt(i); byteArray[i] = str.charCodeAt(i);
} }
@ -434,11 +434,11 @@ const Utils = {
byteArrayToUtf8: function(byteArray) { byteArrayToUtf8: function(byteArray) {
try { try {
// Try to output data as UTF-8 string // Try to output data as UTF-8 string
var words = []; const words = [];
for (var i = 0; i < byteArray.length; i++) { for (let i = 0; i < byteArray.length; i++) {
words[i >>> 2] |= byteArray[i] << (24 - (i % 4) * 8); words[i >>> 2] |= byteArray[i] << (24 - (i % 4) * 8);
} }
var wordArray = new CryptoJS.lib.WordArray.init(words, byteArray.length), let wordArray = new CryptoJS.lib.WordArray.init(words, byteArray.length),
str = CryptoJS.enc.Utf8.stringify(wordArray); str = CryptoJS.enc.Utf8.stringify(wordArray);
if (typeof window !== "undefined" && str.length !== wordArray.sigBytes) if (typeof window !== "undefined" && str.length !== wordArray.sigBytes)
@ -466,8 +466,8 @@ const Utils = {
*/ */
byteArrayToChars: function(byteArray) { byteArrayToChars: function(byteArray) {
if (!byteArray) return ""; if (!byteArray) return "";
var str = ""; let str = "";
for (var i = 0; i < byteArray.length;) { for (let i = 0; i < byteArray.length;) {
str += String.fromCharCode(byteArray[i++]); str += String.fromCharCode(byteArray[i++]);
} }
return str; return str;
@ -487,10 +487,10 @@ const Utils = {
wordArrayToByteArray: function(wordArray) { wordArrayToByteArray: function(wordArray) {
if (wordArray.sigBytes <= 0) return []; if (wordArray.sigBytes <= 0) return [];
var words = wordArray.words, let words = wordArray.words,
byteArray = []; byteArray = [];
for (var i = 0; i < wordArray.sigBytes; i++) { for (let i = 0; i < wordArray.sigBytes; i++) {
byteArray.push((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff); byteArray.push((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);
} }
@ -582,10 +582,10 @@ const Utils = {
* Utils.unicodeToWin1251("обновленная техничка по Боингу. оригинал у меня. заберете когда будете в КИ"); * Utils.unicodeToWin1251("обновленная техничка по Боингу. оригинал у меня. заберете когда будете в КИ");
*/ */
unicodeToWin1251: function(unicStr) { unicodeToWin1251: function(unicStr) {
var res = []; const res = [];
for (var i = 0; i < unicStr.length; i++) { for (let i = 0; i < unicStr.length; i++) {
var ord = unicStr.charCodeAt(i); const ord = unicStr.charCodeAt(i);
if (!(ord in Utils.UNIC_WIN1251_MAP)) if (!(ord in Utils.UNIC_WIN1251_MAP))
throw "Character '" + unicStr.charAt(i) + "' isn't supported by Windows-1251"; throw "Character '" + unicStr.charAt(i) + "' isn't supported by Windows-1251";
res.push(String.fromCharCode(Utils.UNIC_WIN1251_MAP[ord])); res.push(String.fromCharCode(Utils.UNIC_WIN1251_MAP[ord]));
@ -606,10 +606,10 @@ const Utils = {
* Utils.unicodeToWin1251("îáíîâëåííàÿ òåõíè÷êà ïî Áîèíãó. îðèãèíàë ó ìåíÿ. çàáåðåòå êîãäà áóäåòå â ÊÈ"); * Utils.unicodeToWin1251("îáíîâëåííàÿ òåõíè÷êà ïî Áîèíãó. îðèãèíàë ó ìåíÿ. çàáåðåòå êîãäà áóäåòå â ÊÈ");
*/ */
win1251ToUnicode: function(win1251Str) { win1251ToUnicode: function(win1251Str) {
var res = []; const res = [];
for (var i = 0; i < win1251Str.length; i++) { for (let i = 0; i < win1251Str.length; i++) {
var ord = win1251Str.charCodeAt(i); const ord = win1251Str.charCodeAt(i);
if (!(ord in Utils.WIN1251_UNIC_MAP)) if (!(ord in Utils.WIN1251_UNIC_MAP))
throw "Character '" + win1251Str.charAt(i) + "' isn't supported by Windows-1251"; throw "Character '" + win1251Str.charAt(i) + "' isn't supported by Windows-1251";
res.push(String.fromCharCode(Utils.WIN1251_UNIC_MAP[ord])); res.push(String.fromCharCode(Utils.WIN1251_UNIC_MAP[ord]));
@ -642,7 +642,7 @@ const Utils = {
alphabet = alphabet ? alphabet = alphabet ?
Utils.expandAlphRange(alphabet).join("") : Utils.expandAlphRange(alphabet).join("") :
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var output = "", let output = "",
chr1, chr2, chr3, chr1, chr2, chr3,
enc1, enc2, enc3, enc4, enc1, enc2, enc3, enc4,
i = 0; i = 0;
@ -700,13 +700,13 @@ const Utils = {
if (removeNonAlphChars === undefined) if (removeNonAlphChars === undefined)
removeNonAlphChars = true; removeNonAlphChars = true;
var output = [], let output = [],
chr1, chr2, chr3, chr1, chr2, chr3,
enc1, enc2, enc3, enc4, enc1, enc2, enc3, enc4,
i = 0; i = 0;
if (removeNonAlphChars) { if (removeNonAlphChars) {
var re = new RegExp("[^" + alphabet.replace(/[\[\]\\\-^$]/g, "\\$&") + "]", "g"); const re = new RegExp("[^" + alphabet.replace(/[\[\]\\\-^$]/g, "\\$&") + "]", "g");
data = data.replace(re, ""); data = data.replace(re, "");
} }
@ -758,9 +758,9 @@ const Utils = {
delim = typeof delim == "string" ? delim : " "; delim = typeof delim == "string" ? delim : " ";
padding = padding || 2; padding = padding || 2;
var output = ""; let output = "";
for (var i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
output += Utils.pad(data[i].toString(16), padding) + delim; output += Utils.pad(data[i].toString(16), padding) + delim;
} }
@ -788,9 +788,9 @@ const Utils = {
toHexFast: function(data) { toHexFast: function(data) {
if (!data) return ""; if (!data) return "";
var output = []; const output = [];
for (var i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
output.push((data[i] >>> 4).toString(16)); output.push((data[i] >>> 4).toString(16));
output.push((data[i] & 0x0f).toString(16)); output.push((data[i] & 0x0f).toString(16));
} }
@ -818,12 +818,12 @@ const Utils = {
delim = delim || (data.indexOf(" ") >= 0 ? "Space" : "None"); delim = delim || (data.indexOf(" ") >= 0 ? "Space" : "None");
byteLen = byteLen || 2; byteLen = byteLen || 2;
if (delim !== "None") { if (delim !== "None") {
var delimRegex = Utils.regexRep[delim]; const delimRegex = Utils.regexRep[delim];
data = data.replace(delimRegex, ""); data = data.replace(delimRegex, "");
} }
var output = []; const output = [];
for (var i = 0; i < data.length; i += byteLen) { for (let i = 0; i < data.length; i += byteLen) {
output.push(parseInt(data.substr(i, byteLen), 16)); output.push(parseInt(data.substr(i, byteLen), 16));
} }
return output; return output;
@ -842,14 +842,14 @@ const Utils = {
*/ */
parseCSV: function(data) { parseCSV: function(data) {
var b, let b,
ignoreNext = false, ignoreNext = false,
inString = false, inString = false,
cell = "", cell = "",
line = [], line = [],
lines = []; lines = [];
for (var i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
b = data[i]; b = data[i];
if (ignoreNext) { if (ignoreNext) {
cell += b; cell += b;
@ -914,7 +914,7 @@ const Utils = {
* Utils.escapeHtml("A <script> tag"); * Utils.escapeHtml("A <script> tag");
*/ */
escapeHtml: function(str) { escapeHtml: function(str) {
var HTML_CHARS = { const HTML_CHARS = {
"&": "&amp;", "&": "&amp;",
"<": "&lt;", "<": "&lt;",
">": "&gt;", ">": "&gt;",
@ -941,7 +941,7 @@ const Utils = {
* Utils.unescapeHtml("A &lt;script&gt; tag"); * Utils.unescapeHtml("A &lt;script&gt; tag");
*/ */
unescapeHtml: function(str) { unescapeHtml: function(str) {
var HTML_CHARS = { const HTML_CHARS = {
"&amp;": "&", "&amp;": "&",
"&lt;": "<", "&lt;": "<",
"&gt;": ">", "&gt;": ">",
@ -997,7 +997,7 @@ const Utils = {
* @returns {Object} * @returns {Object}
*/ */
extend: function(a, b){ extend: function(a, b){
for (var key in b) for (const key in b)
if (b.hasOwnProperty(key)) if (b.hasOwnProperty(key))
a[key] = b[key]; a[key] = b[key];
return a; return a;
@ -1016,8 +1016,8 @@ const Utils = {
* @returns {html} * @returns {html}
*/ */
displayFilesAsHTML: function(files){ displayFilesAsHTML: function(files){
var formatDirectory = function(file) { const formatDirectory = function(file) {
var html = "<div class='panel panel-default'>" + const html = "<div class='panel panel-default'>" +
"<div class='panel-heading' role='tab'>" + "<div class='panel-heading' role='tab'>" +
"<h4 class='panel-title'>" + "<h4 class='panel-title'>" +
file.fileName + file.fileName +
@ -1029,25 +1029,25 @@ const Utils = {
return html; return html;
}; };
var formatFile = function(file, i) { const formatFile = function(file, i) {
var blob = new Blob( const blob = new Blob(
[new Uint8Array(file.bytes)], [new Uint8Array(file.bytes)],
{type: "octet/stream"} {type: "octet/stream"}
); );
var blobUrl = URL.createObjectURL(blob); const blobUrl = URL.createObjectURL(blob);
var downloadAnchorElem = "<a href='" + blobUrl + "' " + const downloadAnchorElem = "<a href='" + blobUrl + "' " +
"title='Download " + Utils.escapeHtml(file.fileName) + "' " + "title='Download " + Utils.escapeHtml(file.fileName) + "' " +
"download='" + Utils.escapeHtml(file.fileName) + "'>\u21B4</a>"; "download='" + Utils.escapeHtml(file.fileName) + "'>\u21B4</a>";
var expandFileContentsElem = "<a href='#collapse" + i + "' " + const expandFileContentsElem = "<a href='#collapse" + i + "' " +
"class='collapsed' " + "class='collapsed' " +
"data-toggle='collapse' " + "data-toggle='collapse' " +
"aria-expanded='true' " + "aria-expanded='true' " +
"aria-controls='collapse" + i + "' " + "aria-controls='collapse" + i + "' " +
"title=\"Show/hide contents of '" + Utils.escapeHtml(file.fileName) + "'\">&#x1F50D</a>"; "title=\"Show/hide contents of '" + Utils.escapeHtml(file.fileName) + "'\">&#x1F50D</a>";
var html = "<div class='panel panel-default'>" + const html = "<div class='panel panel-default'>" +
"<div class='panel-heading' role='tab' id='heading" + i + "'>" + "<div class='panel-heading' role='tab' id='heading" + i + "'>" +
"<h4 class='panel-title'>" + "<h4 class='panel-title'>" +
"<div>" + "<div>" +
@ -1072,7 +1072,7 @@ const Utils = {
return html; return html;
}; };
var html = "<div style='padding: 5px;'>" + let html = "<div style='padding: 5px;'>" +
files.length + files.length +
" file(s) found</div>\n"; " file(s) found</div>\n";
files.forEach(function(file, i) { files.forEach(function(file, i) {
@ -1125,7 +1125,7 @@ const Utils = {
*/ */
modInv: function(x, y) { modInv: function(x, y) {
x %= y; x %= y;
for (var i = 1; i < y; i++) { for (let i = 1; i < y; i++) {
if ((x * i) % 26 === 1) { if ((x * i) % 26 === 1) {
return i; return i;
} }
@ -1203,8 +1203,8 @@ export default Utils;
* ["One", "Two", "Three", "One"].unique(); * ["One", "Two", "Three", "One"].unique();
*/ */
Array.prototype.unique = function() { Array.prototype.unique = function() {
var u = {}, a = []; let u = {}, a = [];
for (var i = 0, l = this.length; i < l; i++) { for (let i = 0, l = this.length; i < l; i++) {
if (u.hasOwnProperty(this[i])) { if (u.hasOwnProperty(this[i])) {
continue; continue;
} }
@ -1274,7 +1274,7 @@ Array.prototype.sum = function() {
*/ */
Array.prototype.equals = function(other) { Array.prototype.equals = function(other) {
if (!other) return false; if (!other) return false;
var i = this.length; let i = this.length;
if (i !== other.length) return false; if (i !== other.length) return false;
while (i--) { while (i--) {
if (this[i] !== other[i]) return false; if (this[i] !== other[i]) return false;
@ -1314,11 +1314,11 @@ CryptoJS.enc.Hex.parse = function (hexStr) {
hexStr = hexStr.replace(/\s/g, ""); hexStr = hexStr.replace(/\s/g, "");
// Shortcut // Shortcut
var hexStrLength = hexStr.length; const hexStrLength = hexStr.length;
// Convert // Convert
var words = []; const words = [];
for (var i = 0; i < hexStrLength; i += 2) { for (let i = 0; i < hexStrLength; i += 2) {
words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
} }

View file

@ -271,6 +271,9 @@ const Categories = [
"CSS selector", "CSS selector",
"Strip HTML tags", "Strip HTML tags",
"Diff", "Diff",
"To Snake case",
"To Camel case",
"To Kebab case",
] ]
}, },
{ {
@ -292,6 +295,7 @@ const Categories = [
"Jump", "Jump",
"Conditional Jump", "Conditional Jump",
"Return", "Return",
"Comment"
] ]
}, },
]; ];

View file

@ -162,6 +162,20 @@ const OperationConfig = {
flowControl: true, flowControl: true,
args: [] args: []
}, },
"Comment": {
description: "Provides a place to write comments within the flow of the recipe. This operation has no computational effect.",
run: FlowControl.runComment,
inputType: "string",
outputType: "string",
flowControl: true,
args: [
{
name: "",
type: "text",
value: ""
}
]
},
"From Base64": { "From Base64": {
description: "Base64 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers.<br><br>This operation decodes data from an ASCII Base64 string back into its raw format.<br><br>e.g. <code>aGVsbG8=</code> becomes <code>hello</code>", description: "Base64 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers.<br><br>This operation decodes data from an ASCII Base64 string back into its raw format.<br><br>e.g. <code>aGVsbG8=</code> becomes <code>hello</code>",
run: Base64.runFrom, run: Base64.runFrom,
@ -1387,6 +1401,11 @@ const OperationConfig = {
type: "number", type: "number",
value: Cipher.KDF_ITERATIONS value: Cipher.KDF_ITERATIONS
}, },
{
name: "Hashing function",
type: "option",
value: Cipher.HASHERS
},
{ {
name: "Salt (hex)", name: "Salt (hex)",
type: "string", type: "string",
@ -1420,6 +1439,11 @@ const OperationConfig = {
type: "number", type: "number",
value: Cipher.KDF_ITERATIONS value: Cipher.KDF_ITERATIONS
}, },
{
name: "Hashing function",
type: "option",
value: Cipher.HASHERS
},
{ {
name: "Salt (hex)", name: "Salt (hex)",
type: "string", type: "string",
@ -3285,6 +3309,69 @@ const OperationConfig = {
type: "option", type: "option",
value: Object.keys(CharEnc.EBCDIC_CODEPAGES_MAPPING), value: Object.keys(CharEnc.EBCDIC_CODEPAGES_MAPPING),
}, },
],
},
"To Snake case": {
description: [
"Converts the input string to snake case.",
"<br><br>",
"Snake case is all lower case with underscores as word boundaries.",
"<br><br>",
"e.g. this_is_snake_case",
"<br><br>",
"'Attempt to be context aware' will make the operation attempt to nicely transform variable and function names.",
].join("\n"),
run: Code.runToSnakeCase,
inputType: "string",
outputType: "string",
args: [
{
name: "Attempt to be context aware",
type: "boolean",
value: false,
},
]
},
"To Camel case": {
description: [
"Converts the input string to camel case.",
"<br><br>",
"Camel case is all lower case except letters after word boundaries which are uppercase.",
"<br><br>",
"e.g. thisIsCamelCase",
"<br><br>",
"'Attempt to be context aware' will make the operation attempt to nicely transform variable and function names.",
].join("\n"),
run: Code.runToCamelCase,
inputType: "string",
outputType: "string",
args: [
{
name: "Attempt to be context aware",
type: "boolean",
value: false,
},
]
},
"To Kebab case": {
description: [
"Converts the input string to kebab case.",
"<br><br>",
"Kebab case is all lower case with dashes as word boundaries.",
"<br><br>",
"e.g. this-is-kebab-case",
"<br><br>",
"'Attempt to be context aware' will make the operation attempt to nicely transform variable and function names.",
].join("\n"),
run: Code.runToKebabCase,
inputType: "string",
outputType: "string",
args: [
{
name: "Attempt to be context aware",
type: "boolean",
value: false,
},
] ]
}, },
}; };

View file

@ -26,7 +26,7 @@ const Base = {
if (!input) { if (!input) {
throw ("Error: Input must be a number"); throw ("Error: Input must be a number");
} }
var radix = args[0] || Base.DEFAULT_RADIX; const radix = args[0] || Base.DEFAULT_RADIX;
if (radix < 2 || radix > 36) { if (radix < 2 || radix > 36) {
throw "Error: Radix argument must be between 2 and 36"; throw "Error: Radix argument must be between 2 and 36";
} }
@ -42,19 +42,19 @@ const Base = {
* @returns {number} * @returns {number}
*/ */
runFrom: function(input, args) { runFrom: function(input, args) {
var radix = args[0] || Base.DEFAULT_RADIX; const radix = args[0] || Base.DEFAULT_RADIX;
if (radix < 2 || radix > 36) { if (radix < 2 || radix > 36) {
throw "Error: Radix argument must be between 2 and 36"; throw "Error: Radix argument must be between 2 and 36";
} }
var number = input.replace(/\s/g, "").split("."), let number = input.replace(/\s/g, "").split("."),
result = parseInt(number[0], radix) || 0; result = parseInt(number[0], radix) || 0;
if (number.length === 1) return result; if (number.length === 1) return result;
// Fractional part // Fractional part
for (var i = 0; i < number[1].length; i++) { for (let i = 0; i < number[1].length; i++) {
var digit = parseInt(number[1][i], radix); const digit = parseInt(number[1][i], radix);
result += digit / Math.pow(radix, i+1); result += digit / Math.pow(radix, i+1);
} }

View file

@ -40,7 +40,7 @@ const Base58 = {
* @returns {string} * @returns {string}
*/ */
runTo: function(input, args) { runTo: function(input, args) {
var alphabet = args[0] || Base58.ALPHABET_OPTIONS[0].value, let alphabet = args[0] || Base58.ALPHABET_OPTIONS[0].value,
result = [0]; result = [0];
alphabet = Utils.expandAlphRange(alphabet).join(""); alphabet = Utils.expandAlphRange(alphabet).join("");
@ -53,11 +53,11 @@ const Base58 = {
if (input.length === 0) return ""; if (input.length === 0) return "";
input.forEach(function(b) { input.forEach(function(b) {
var carry = (result[0] << 8) + b; let carry = (result[0] << 8) + b;
result[0] = carry % 58; result[0] = carry % 58;
carry = (carry / 58) | 0; carry = (carry / 58) | 0;
for (var i = 1; i < result.length; i++) { for (let i = 1; i < result.length; i++) {
carry += result[i] << 8; carry += result[i] << 8;
result[i] = carry % 58; result[i] = carry % 58;
carry = (carry / 58) | 0; carry = (carry / 58) | 0;
@ -89,7 +89,7 @@ const Base58 = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runFrom: function(input, args) { runFrom: function(input, args) {
var alphabet = args[0] || Base58.ALPHABET_OPTIONS[0].value, let alphabet = args[0] || Base58.ALPHABET_OPTIONS[0].value,
removeNonAlphaChars = args[1] === undefined ? true : args[1], removeNonAlphaChars = args[1] === undefined ? true : args[1],
result = [0]; result = [0];
@ -103,7 +103,7 @@ const Base58 = {
if (input.length === 0) return []; if (input.length === 0) return [];
[].forEach.call(input, function(c, charIndex) { [].forEach.call(input, function(c, charIndex) {
var index = alphabet.indexOf(c); const index = alphabet.indexOf(c);
if (index === -1) { if (index === -1) {
if (removeNonAlphaChars) { if (removeNonAlphaChars) {
@ -113,11 +113,11 @@ const Base58 = {
} }
} }
var carry = result[0] * 58 + index; let carry = result[0] * 58 + index;
result[0] = carry & 0xFF; result[0] = carry & 0xFF;
carry = carry >> 8; carry = carry >> 8;
for (var i = 1; i < result.length; i++) { for (let i = 1; i < result.length; i++) {
carry += result[i] * 58; carry += result[i] * 58;
result[i] = carry & 0xFF; result[i] = carry & 0xFF;
carry = carry >> 8; carry = carry >> 8;

View file

@ -45,7 +45,7 @@ const Base64 = {
* @returns {string} * @returns {string}
*/ */
runTo: function(input, args) { runTo: function(input, args) {
var alphabet = args[0] || Base64.ALPHABET; const alphabet = args[0] || Base64.ALPHABET;
return Utils.toBase64(input, alphabet); return Utils.toBase64(input, alphabet);
}, },
@ -64,7 +64,7 @@ const Base64 = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runFrom: function(input, args) { runFrom: function(input, args) {
var alphabet = args[0] || Base64.ALPHABET, let alphabet = args[0] || Base64.ALPHABET,
removeNonAlphChars = args[1]; removeNonAlphChars = args[1];
return Utils.fromBase64(input, alphabet, "byteArray", removeNonAlphChars); return Utils.fromBase64(input, alphabet, "byteArray", removeNonAlphChars);
@ -87,7 +87,7 @@ const Base64 = {
runTo32: function(input, args) { runTo32: function(input, args) {
if (!input) return ""; if (!input) return "";
var alphabet = args[0] ? let alphabet = args[0] ?
Utils.expandAlphRange(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=", Utils.expandAlphRange(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",
output = "", output = "",
chr1, chr2, chr3, chr4, chr5, chr1, chr2, chr3, chr4, chr5,
@ -139,17 +139,17 @@ const Base64 = {
runFrom32: function(input, args) { runFrom32: function(input, args) {
if (!input) return []; if (!input) return [];
var alphabet = args[0] ? let alphabet = args[0] ?
Utils.expandAlphRange(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=", Utils.expandAlphRange(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",
removeNonAlphChars = args[0]; removeNonAlphChars = args[0];
var output = [], let output = [],
chr1, chr2, chr3, chr4, chr5, chr1, chr2, chr3, chr4, chr5,
enc1, enc2, enc3, enc4, enc5, enc6, enc7, enc8, enc1, enc2, enc3, enc4, enc5, enc6, enc7, enc8,
i = 0; i = 0;
if (removeNonAlphChars) { if (removeNonAlphChars) {
var re = new RegExp("[^" + alphabet.replace(/[\]\\\-^]/g, "\\$&") + "]", "g"); const re = new RegExp("[^" + alphabet.replace(/[\]\\\-^]/g, "\\$&") + "]", "g");
input = input.replace(re, ""); input = input.replace(re, "");
} }
@ -199,7 +199,7 @@ const Base64 = {
* @returns {html} * @returns {html}
*/ */
runOffsets: function(input, args) { runOffsets: function(input, args) {
var alphabet = args[0] || Base64.ALPHABET, let alphabet = args[0] || Base64.ALPHABET,
showVariable = args[1], showVariable = args[1],
offset0 = Utils.toBase64(input, alphabet), offset0 = Utils.toBase64(input, alphabet),
offset1 = Utils.toBase64([0].concat(input), alphabet), offset1 = Utils.toBase64([0].concat(input), alphabet),

View file

@ -26,12 +26,12 @@ const BitwiseOp = {
*/ */
_bitOp: function (input, key, func, nullPreserving, scheme) { _bitOp: function (input, key, func, nullPreserving, scheme) {
if (!key || !key.length) key = [0]; if (!key || !key.length) key = [0];
var result = [], let result = [],
x = null, x = null,
k = null, k = null,
o = null; o = null;
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
k = key[i % key.length]; k = key[i % key.length];
o = input[i]; o = input[i];
x = nullPreserving && (o === 0 || o === k) ? o : func(o, k); x = nullPreserving && (o === 0 || o === k) ? o : func(o, k);
@ -76,7 +76,7 @@ const BitwiseOp = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runXor: function (input, args) { runXor: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || ""), let key = Utils.format[args[0].option].parse(args[0].string || ""),
scheme = args[1], scheme = args[1],
nullPreserving = args[2]; nullPreserving = args[2];
@ -120,7 +120,7 @@ const BitwiseOp = {
* @returns {string} * @returns {string}
*/ */
runXorBrute: function (input, args) { runXorBrute: function (input, args) {
var keyLength = parseInt(args[0], 10), let keyLength = parseInt(args[0], 10),
sampleLength = args[1], sampleLength = args[1],
sampleOffset = args[2], sampleOffset = args[2],
nullPreserving = args[3], nullPreserving = args[3],
@ -130,7 +130,7 @@ const BitwiseOp = {
outputHex = args[7], outputHex = args[7],
regex; regex;
var output = "", let output = "",
result, result,
resultUtf8; resultUtf8;
@ -141,7 +141,7 @@ const BitwiseOp = {
} }
for (var key = 1, l = Math.pow(256, keyLength); key < l; key++) { for (let key = 1, l = Math.pow(256, keyLength); key < l; key++) {
result = BitwiseOp._bitOp(input, Utils.hexToByteArray(key.toString(16)), BitwiseOp._xor, nullPreserving, differential); result = BitwiseOp._bitOp(input, Utils.hexToByteArray(key.toString(16)), BitwiseOp._xor, nullPreserving, differential);
resultUtf8 = Utils.byteArrayToUtf8(result); resultUtf8 = Utils.byteArrayToUtf8(result);
if (crib !== "" && resultUtf8.search(regex) === -1) continue; if (crib !== "" && resultUtf8.search(regex) === -1) continue;
@ -176,7 +176,7 @@ const BitwiseOp = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runAnd: function (input, args) { runAnd: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || ""); let key = Utils.format[args[0].option].parse(args[0].string || "");
key = Utils.wordArrayToByteArray(key); key = Utils.wordArrayToByteArray(key);
return BitwiseOp._bitOp(input, key, BitwiseOp._and); return BitwiseOp._bitOp(input, key, BitwiseOp._and);
@ -191,7 +191,7 @@ const BitwiseOp = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runOr: function (input, args) { runOr: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || ""); let key = Utils.format[args[0].option].parse(args[0].string || "");
key = Utils.wordArrayToByteArray(key); key = Utils.wordArrayToByteArray(key);
return BitwiseOp._bitOp(input, key, BitwiseOp._or); return BitwiseOp._bitOp(input, key, BitwiseOp._or);
@ -206,7 +206,7 @@ const BitwiseOp = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runAdd: function (input, args) { runAdd: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || ""); let key = Utils.format[args[0].option].parse(args[0].string || "");
key = Utils.wordArrayToByteArray(key); key = Utils.wordArrayToByteArray(key);
return BitwiseOp._bitOp(input, key, BitwiseOp._add); return BitwiseOp._bitOp(input, key, BitwiseOp._add);
@ -221,7 +221,7 @@ const BitwiseOp = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runSub: function (input, args) { runSub: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || ""); let key = Utils.format[args[0].option].parse(args[0].string || "");
key = Utils.wordArrayToByteArray(key); key = Utils.wordArrayToByteArray(key);
return BitwiseOp._bitOp(input, key, BitwiseOp._sub); return BitwiseOp._bitOp(input, key, BitwiseOp._sub);
@ -301,7 +301,7 @@ const BitwiseOp = {
* @returns {number} * @returns {number}
*/ */
_sub: function (operand, key) { _sub: function (operand, key) {
var result = operand - key; const result = operand - key;
return (result < 0) ? 256 + result : result; return (result < 0) ? 256 + result : result;
}, },

View file

@ -37,7 +37,7 @@ const ByteRepr = {
* @returns {string} * @returns {string}
*/ */
runToHex: function(input, args) { runToHex: function(input, args) {
var delim = Utils.charRep[args[0] || "Space"]; const delim = Utils.charRep[args[0] || "Space"];
return Utils.toHex(input, delim, 2); return Utils.toHex(input, delim, 2);
}, },
@ -50,7 +50,7 @@ const ByteRepr = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runFromHex: function(input, args) { runFromHex: function(input, args) {
var delim = args[0] || "Space"; const delim = args[0] || "Space";
return Utils.fromHex(input, delim, 2); return Utils.fromHex(input, delim, 2);
}, },
@ -64,7 +64,7 @@ const ByteRepr = {
* @returns {string} * @returns {string}
*/ */
runToOct: function(input, args) { runToOct: function(input, args) {
var delim = Utils.charRep[args[0] || "Space"]; const delim = Utils.charRep[args[0] || "Space"];
return input.map(val => val.toString(8)).join(delim); return input.map(val => val.toString(8)).join(delim);
}, },
@ -78,7 +78,7 @@ const ByteRepr = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runFromOct: function(input, args) { runFromOct: function(input, args) {
var delim = Utils.charRep[args[0] || "Space"]; const delim = Utils.charRep[args[0] || "Space"];
if (input.length === 0) return []; if (input.length === 0) return [];
return input.split(delim).map(val => parseInt(val, 8)); return input.split(delim).map(val => parseInt(val, 8));
}, },
@ -98,7 +98,7 @@ const ByteRepr = {
* @returns {string} * @returns {string}
*/ */
runToCharcode: function(input, args) { runToCharcode: function(input, args) {
var delim = Utils.charRep[args[0] || "Space"], let delim = Utils.charRep[args[0] || "Space"],
base = args[1], base = args[1],
output = "", output = "",
padding = 2, padding = 2,
@ -108,7 +108,7 @@ const ByteRepr = {
throw "Error: Base argument must be between 2 and 36"; throw "Error: Base argument must be between 2 and 36";
} }
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
ordinal = Utils.ord(input[i]); ordinal = Utils.ord(input[i]);
if (base === 16) { if (base === 16) {
@ -139,7 +139,7 @@ const ByteRepr = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runFromCharcode: function(input, args) { runFromCharcode: function(input, args) {
var delim = Utils.charRep[args[0] || "Space"], let delim = Utils.charRep[args[0] || "Space"],
base = args[1], base = args[1],
bites = input.split(delim), bites = input.split(delim),
i = 0; i = 0;
@ -161,7 +161,7 @@ const ByteRepr = {
} }
} }
var latin1 = ""; let latin1 = "";
for (i = 0; i < bites.length; i++) { for (i = 0; i < bites.length; i++) {
latin1 += Utils.chr(parseInt(bites[i], base)); latin1 += Utils.chr(parseInt(bites[i], base));
} }
@ -179,7 +179,7 @@ const ByteRepr = {
* @returns {Object[]} pos * @returns {Object[]} pos
*/ */
highlightTo: function(pos, args) { highlightTo: function(pos, args) {
var delim = Utils.charRep[args[0] || "Space"], let delim = Utils.charRep[args[0] || "Space"],
len = delim === "\r\n" ? 1 : delim.length; len = delim === "\r\n" ? 1 : delim.length;
pos[0].start = pos[0].start * (2 + len); pos[0].start = pos[0].start * (2 + len);
@ -204,7 +204,7 @@ const ByteRepr = {
* @returns {Object[]} pos * @returns {Object[]} pos
*/ */
highlightFrom: function(pos, args) { highlightFrom: function(pos, args) {
var delim = Utils.charRep[args[0] || "Space"], let delim = Utils.charRep[args[0] || "Space"],
len = delim === "\r\n" ? 1 : delim.length, len = delim === "\r\n" ? 1 : delim.length,
width = len + 2; width = len + 2;
@ -230,7 +230,7 @@ const ByteRepr = {
* @returns {string} * @returns {string}
*/ */
runToDecimal: function(input, args) { runToDecimal: function(input, args) {
var delim = Utils.charRep[args[0]]; const delim = Utils.charRep[args[0]];
return input.join(delim); return input.join(delim);
}, },
@ -243,12 +243,12 @@ const ByteRepr = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runFromDecimal: function(input, args) { runFromDecimal: function(input, args) {
var delim = Utils.charRep[args[0]]; const delim = Utils.charRep[args[0]];
var byteStr = input.split(delim), output = []; let byteStr = input.split(delim), output = [];
if (byteStr[byteStr.length-1] === "") if (byteStr[byteStr.length-1] === "")
byteStr = byteStr.slice(0, byteStr.length-1); byteStr = byteStr.slice(0, byteStr.length-1);
for (var i = 0; i < byteStr.length; i++) { for (let i = 0; i < byteStr.length; i++) {
output[i] = parseInt(byteStr[i], 10); output[i] = parseInt(byteStr[i], 10);
} }
return output; return output;
@ -263,11 +263,11 @@ const ByteRepr = {
* @returns {string} * @returns {string}
*/ */
runToBinary: function(input, args) { runToBinary: function(input, args) {
var delim = Utils.charRep[args[0] || "Space"], let delim = Utils.charRep[args[0] || "Space"],
output = "", output = "",
padding = 8; padding = 8;
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
output += Utils.pad(input[i].toString(2), padding) + delim; output += Utils.pad(input[i].toString(2), padding) + delim;
} }
@ -288,13 +288,13 @@ const ByteRepr = {
*/ */
runFromBinary: function(input, args) { runFromBinary: function(input, args) {
if (args[0] !== "None") { if (args[0] !== "None") {
var delimRegex = Utils.regexRep[args[0] || "Space"]; const delimRegex = Utils.regexRep[args[0] || "Space"];
input = input.replace(delimRegex, ""); input = input.replace(delimRegex, "");
} }
var output = []; const output = [];
var byteLen = 8; const byteLen = 8;
for (var i = 0; i < input.length; i += byteLen) { for (let i = 0; i < input.length; i += byteLen) {
output.push(parseInt(input.substr(i, byteLen), 2)); output.push(parseInt(input.substr(i, byteLen), 2));
} }
return output; return output;
@ -311,7 +311,7 @@ const ByteRepr = {
* @returns {Object[]} pos * @returns {Object[]} pos
*/ */
highlightToBinary: function(pos, args) { highlightToBinary: function(pos, args) {
var delim = Utils.charRep[args[0] || "Space"]; const delim = Utils.charRep[args[0] || "Space"];
pos[0].start = pos[0].start * (8 + delim.length); pos[0].start = pos[0].start * (8 + delim.length);
pos[0].end = pos[0].end * (8 + delim.length) - delim.length; pos[0].end = pos[0].end * (8 + delim.length) - delim.length;
return pos; return pos;
@ -328,7 +328,7 @@ const ByteRepr = {
* @returns {Object[]} pos * @returns {Object[]} pos
*/ */
highlightFromBinary: function(pos, args) { highlightFromBinary: function(pos, args) {
var delim = Utils.charRep[args[0] || "Space"]; const delim = Utils.charRep[args[0] || "Space"];
pos[0].start = pos[0].start === 0 ? 0 : Math.floor(pos[0].start / (8 + delim.length)); pos[0].start = pos[0].start === 0 ? 0 : Math.floor(pos[0].start / (8 + delim.length));
pos[0].end = pos[0].end === 0 ? 0 : Math.ceil(pos[0].end / (8 + delim.length)); pos[0].end = pos[0].end === 0 ? 0 : Math.ceil(pos[0].end / (8 + delim.length));
return pos; return pos;
@ -354,19 +354,19 @@ const ByteRepr = {
* @returns {string} * @returns {string}
*/ */
runToHexContent: function(input, args) { runToHexContent: function(input, args) {
var convert = args[0]; const convert = args[0];
var spaces = args[1]; const spaces = args[1];
if (convert === "All chars") { if (convert === "All chars") {
var result = "|" + Utils.toHex(input) + "|"; let result = "|" + Utils.toHex(input) + "|";
if (!spaces) result = result.replace(/ /g, ""); if (!spaces) result = result.replace(/ /g, "");
return result; return result;
} }
var output = "", let output = "",
inHex = false, inHex = false,
convertSpaces = convert === "Only special chars including spaces", convertSpaces = convert === "Only special chars including spaces",
b; b;
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
b = input[i]; b = input[i];
if ((b === 32 && convertSpaces) || (b < 48 && b !== 32) || (b > 57 && b < 65) || (b > 90 && b < 97) || b > 122) { if ((b === 32 && convertSpaces) || (b < 48 && b !== 32) || (b > 57 && b < 65) || (b > 90 && b < 97) || b > 122) {
if (!inHex) { if (!inHex) {
@ -395,17 +395,17 @@ const ByteRepr = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runFromHexContent: function(input, args) { runFromHexContent: function(input, args) {
var regex = /\|([a-f\d ]{2,})\|/gi; const regex = /\|([a-f\d ]{2,})\|/gi;
var output = [], m, i = 0; let output = [], m, i = 0;
while ((m = regex.exec(input))) { while ((m = regex.exec(input))) {
// Add up to match // Add up to match
for (; i < m.index;) for (; i < m.index;)
output.push(Utils.ord(input[i++])); output.push(Utils.ord(input[i++]));
// Add match // Add match
var bytes = Utils.fromHex(m[1]); const bytes = Utils.fromHex(m[1]);
if (bytes) { if (bytes) {
for (var a = 0; a < bytes.length;) for (let a = 0; a < bytes.length;)
output.push(bytes[a++]); output.push(bytes[a++]);
} else { } else {
// Not valid hex, print as normal // Not valid hex, print as normal

View file

@ -28,7 +28,7 @@ const CharEnc = {
* @returns {string} * @returns {string}
*/ */
run: function(input, args) { run: function(input, args) {
var inputFormat = args[0], let inputFormat = args[0],
outputFormat = args[1]; outputFormat = args[1];
if (inputFormat === "Windows-1251") { if (inputFormat === "Windows-1251") {

View file

@ -20,10 +20,10 @@ const Checksum = {
* @returns {string} * @returns {string}
*/ */
runFletcher8: function(input, args) { runFletcher8: function(input, args) {
var a = 0, let a = 0,
b = 0; b = 0;
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
a = (a + input[i]) % 0xf; a = (a + input[i]) % 0xf;
b = (b + a) % 0xf; b = (b + a) % 0xf;
} }
@ -40,10 +40,10 @@ const Checksum = {
* @returns {string} * @returns {string}
*/ */
runFletcher16: function(input, args) { runFletcher16: function(input, args) {
var a = 0, let a = 0,
b = 0; b = 0;
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
a = (a + input[i]) % 0xff; a = (a + input[i]) % 0xff;
b = (b + a) % 0xff; b = (b + a) % 0xff;
} }
@ -60,10 +60,10 @@ const Checksum = {
* @returns {string} * @returns {string}
*/ */
runFletcher32: function(input, args) { runFletcher32: function(input, args) {
var a = 0, let a = 0,
b = 0; b = 0;
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
a = (a + input[i]) % 0xffff; a = (a + input[i]) % 0xffff;
b = (b + a) % 0xffff; b = (b + a) % 0xffff;
} }
@ -80,10 +80,10 @@ const Checksum = {
* @returns {string} * @returns {string}
*/ */
runFletcher64: function(input, args) { runFletcher64: function(input, args) {
var a = 0, let a = 0,
b = 0; b = 0;
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
a = (a + input[i]) % 0xffffffff; a = (a + input[i]) % 0xffffffff;
b = (b + a) % 0xffffffff; b = (b + a) % 0xffffffff;
} }
@ -100,11 +100,11 @@ const Checksum = {
* @returns {string} * @returns {string}
*/ */
runAdler32: function(input, args) { runAdler32: function(input, args) {
var MOD_ADLER = 65521, let MOD_ADLER = 65521,
a = 1, a = 1,
b = 0; b = 0;
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
a += input[i]; a += input[i];
b += a; b += a;
} }
@ -124,10 +124,10 @@ const Checksum = {
* @returns {string} * @returns {string}
*/ */
runCRC32: function(input, args) { runCRC32: function(input, args) {
var crcTable = global.crcTable || (global.crcTable = Checksum._genCRCTable()), let crcTable = global.crcTable || (global.crcTable = Checksum._genCRCTable()),
crc = 0 ^ (-1); crc = 0 ^ (-1);
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
crc = (crc >>> 8) ^ crcTable[(crc ^ input[i]) & 0xff]; crc = (crc >>> 8) ^ crcTable[(crc ^ input[i]) & 0xff];
} }
@ -153,9 +153,9 @@ const Checksum = {
* 0x00,0x00,0xac,0x11,0x00,0x03,0xac,0x11,0x00,0x04]) * 0x00,0x00,0xac,0x11,0x00,0x03,0xac,0x11,0x00,0x04])
*/ */
runTCPIP: function(input, args) { runTCPIP: function(input, args) {
var csum = 0; let csum = 0;
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
if (i % 2 === 0) { if (i % 2 === 0) {
csum += (input[i] << 8); csum += (input[i] << 8);
} else { } else {
@ -176,12 +176,12 @@ const Checksum = {
* @returns {array} * @returns {array}
*/ */
_genCRCTable: function() { _genCRCTable: function() {
var c, let c,
crcTable = []; crcTable = [];
for (var n = 0; n < 256; n++) { for (let n = 0; n < 256; n++) {
c = n; c = n;
for (var k = 0; k < 8; k++) { for (let k = 0; k < 8; k++) {
c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
} }
crcTable[n] = c; crcTable[n] = c;

View file

@ -61,7 +61,7 @@ const Cipher = {
* @returns {string} * @returns {string}
*/ */
_enc: function (algo, input, args) { _enc: function (algo, input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || ""), let key = Utils.format[args[0].option].parse(args[0].string || ""),
iv = Utils.format[args[1].option].parse(args[1].string || ""), iv = Utils.format[args[1].option].parse(args[1].string || ""),
salt = Utils.format[args[2].option].parse(args[2].string || ""), salt = Utils.format[args[2].option].parse(args[2].string || ""),
mode = CryptoJS.mode[args[3]], mode = CryptoJS.mode[args[3]],
@ -74,14 +74,14 @@ const Cipher = {
key = key.toString(CryptoJS.enc.Latin1); key = key.toString(CryptoJS.enc.Latin1);
} }
var encrypted = algo.encrypt(input, key, { const encrypted = algo.encrypt(input, key, {
salt: salt.sigBytes > 0 ? salt : false, salt: salt.sigBytes > 0 ? salt : false,
iv: iv.sigBytes > 0 ? iv : null, iv: iv.sigBytes > 0 ? iv : null,
mode: mode, mode: mode,
padding: padding padding: padding
}); });
var result = ""; let result = "";
if (resultOption === "show all") { if (resultOption === "show all") {
result += "Key: " + encrypted.key.toString(Utils.format[outputFormat]); result += "Key: " + encrypted.key.toString(Utils.format[outputFormat]);
result += "\nIV: " + encrypted.iv.toString(Utils.format[outputFormat]); result += "\nIV: " + encrypted.iv.toString(Utils.format[outputFormat]);
@ -105,7 +105,7 @@ const Cipher = {
* @returns {string} * @returns {string}
*/ */
_dec: function (algo, input, args) { _dec: function (algo, input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || ""), let key = Utils.format[args[0].option].parse(args[0].string || ""),
iv = Utils.format[args[1].option].parse(args[1].string || ""), iv = Utils.format[args[1].option].parse(args[1].string || ""),
salt = Utils.format[args[2].option].parse(args[2].string || ""), salt = Utils.format[args[2].option].parse(args[2].string || ""),
mode = CryptoJS.mode[args[3]], mode = CryptoJS.mode[args[3]],
@ -118,14 +118,14 @@ const Cipher = {
return "No input"; return "No input";
} }
var ciphertext = Utils.format[inputFormat].parse(input); const ciphertext = Utils.format[inputFormat].parse(input);
if (iv.sigBytes === 0) { if (iv.sigBytes === 0) {
// Use passphrase rather than key. Need to convert it to a string. // Use passphrase rather than key. Need to convert it to a string.
key = key.toString(CryptoJS.enc.Latin1); key = key.toString(CryptoJS.enc.Latin1);
} }
var decrypted = algo.decrypt({ const decrypted = algo.decrypt({
ciphertext: ciphertext, ciphertext: ciphertext,
salt: salt.sigBytes > 0 ? salt : false salt: salt.sigBytes > 0 ? salt : false
}, key, { }, key, {
@ -134,7 +134,7 @@ const Cipher = {
padding: padding padding: padding
}); });
var result; let result;
try { try {
result = decrypted.toString(Utils.format[outputFormat]); result = decrypted.toString(Utils.format[outputFormat]);
} catch (err) { } catch (err) {
@ -260,13 +260,13 @@ const Cipher = {
* @returns {string} * @returns {string}
*/ */
runBlowfishEnc: function (input, args) { runBlowfishEnc: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string).toString(Utils.format.Latin1), let key = Utils.format[args[0].option].parse(args[0].string).toString(Utils.format.Latin1),
mode = args[1], mode = args[1],
outputFormat = args[2]; outputFormat = args[2];
if (key.length === 0) return "Enter a key"; if (key.length === 0) return "Enter a key";
var encHex = Blowfish.encrypt(input, key, { let encHex = Blowfish.encrypt(input, key, {
outputType: 1, outputType: 1,
cipherMode: Cipher.BLOWFISH_MODES.indexOf(mode) cipherMode: Cipher.BLOWFISH_MODES.indexOf(mode)
}), }),
@ -284,7 +284,7 @@ const Cipher = {
* @returns {string} * @returns {string}
*/ */
runBlowfishDec: function (input, args) { runBlowfishDec: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string).toString(Utils.format.Latin1), let key = Utils.format[args[0].option].parse(args[0].string).toString(Utils.format.Latin1),
mode = args[1], mode = args[1],
inputFormat = args[2]; inputFormat = args[2];
@ -309,6 +309,11 @@ const Cipher = {
* @default * @default
*/ */
KDF_ITERATIONS: 1, KDF_ITERATIONS: 1,
/**
* @constant
* @default
*/
HASHERS: ["MD5", "SHA1", "SHA224", "SHA256", "SHA384", "SHA512", "SHA3", "RIPEMD160"],
/** /**
* Derive PBKDF2 key operation. * Derive PBKDF2 key operation.
@ -318,13 +323,18 @@ const Cipher = {
* @returns {string} * @returns {string}
*/ */
runPbkdf2: function (input, args) { runPbkdf2: function (input, args) {
var keySize = args[0] / 32, let keySize = args[0] / 32,
iterations = args[1], iterations = args[1],
salt = CryptoJS.enc.Hex.parse(args[2] || ""), hasher = args[2],
inputFormat = args[3], salt = CryptoJS.enc.Hex.parse(args[3] || ""),
outputFormat = args[4], inputFormat = args[4],
outputFormat = args[5],
passphrase = Utils.format[inputFormat].parse(input), passphrase = Utils.format[inputFormat].parse(input),
key = CryptoJS.PBKDF2(passphrase, salt, { keySize: keySize, iterations: iterations }); key = CryptoJS.PBKDF2(passphrase, salt, {
keySize: keySize,
hasher: CryptoJS.algo[hasher],
iterations: iterations,
});
return key.toString(Utils.format[outputFormat]); return key.toString(Utils.format[outputFormat]);
}, },
@ -338,13 +348,18 @@ const Cipher = {
* @returns {string} * @returns {string}
*/ */
runEvpkdf: function (input, args) { runEvpkdf: function (input, args) {
var keySize = args[0] / 32, let keySize = args[0] / 32,
iterations = args[1], iterations = args[1],
salt = CryptoJS.enc.Hex.parse(args[2] || ""), hasher = args[2],
inputFormat = args[3], salt = CryptoJS.enc.Hex.parse(args[3] || ""),
outputFormat = args[4], inputFormat = args[4],
outputFormat = args[5],
passphrase = Utils.format[inputFormat].parse(input), passphrase = Utils.format[inputFormat].parse(input),
key = CryptoJS.EvpKDF(passphrase, salt, { keySize: keySize, iterations: iterations }); key = CryptoJS.EvpKDF(passphrase, salt, {
keySize: keySize,
hasher: CryptoJS.algo[hasher],
iterations: iterations,
});
return key.toString(Utils.format[outputFormat]); return key.toString(Utils.format[outputFormat]);
}, },
@ -358,7 +373,7 @@ const Cipher = {
* @returns {string} * @returns {string}
*/ */
runRc4: function (input, args) { runRc4: function (input, args) {
var message = Utils.format[args[1]].parse(input), let message = Utils.format[args[1]].parse(input),
passphrase = Utils.format[args[0].option].parse(args[0].string), passphrase = Utils.format[args[0].option].parse(args[0].string),
encrypted = CryptoJS.RC4.encrypt(message, passphrase); encrypted = CryptoJS.RC4.encrypt(message, passphrase);
@ -380,7 +395,7 @@ const Cipher = {
* @returns {string} * @returns {string}
*/ */
runRc4drop: function (input, args) { runRc4drop: function (input, args) {
var message = Utils.format[args[1]].parse(input), let message = Utils.format[args[1]].parse(input),
passphrase = Utils.format[args[0].option].parse(args[0].string), passphrase = Utils.format[args[0].option].parse(args[0].string),
drop = args[3], drop = args[3],
encrypted = CryptoJS.RC4Drop.encrypt(message, passphrase, { drop: drop }); encrypted = CryptoJS.RC4Drop.encrypt(message, passphrase, { drop: drop });
@ -398,7 +413,7 @@ const Cipher = {
* @returns {string} * @returns {string}
*/ */
runVigenereEnc: function (input, args) { runVigenereEnc: function (input, args) {
var alphabet = "abcdefghijklmnopqrstuvwxyz", let alphabet = "abcdefghijklmnopqrstuvwxyz",
key = args[0].toLowerCase(), key = args[0].toLowerCase(),
output = "", output = "",
fail = 0, fail = 0,
@ -409,7 +424,7 @@ const Cipher = {
if (!key) return "No key entered"; if (!key) return "No key entered";
if (!/^[a-zA-Z]+$/.test(key)) return "The key must consist only of letters"; if (!/^[a-zA-Z]+$/.test(key)) return "The key must consist only of letters";
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
if (alphabet.indexOf(input[i]) >= 0) { if (alphabet.indexOf(input[i]) >= 0) {
// Get the corresponding character of key for the current letter, accounting // Get the corresponding character of key for the current letter, accounting
// for chars not in alphabet // for chars not in alphabet
@ -445,7 +460,7 @@ const Cipher = {
* @returns {string} * @returns {string}
*/ */
runVigenereDec: function (input, args) { runVigenereDec: function (input, args) {
var alphabet = "abcdefghijklmnopqrstuvwxyz", let alphabet = "abcdefghijklmnopqrstuvwxyz",
key = args[0].toLowerCase(), key = args[0].toLowerCase(),
output = "", output = "",
fail = 0, fail = 0,
@ -456,7 +471,7 @@ const Cipher = {
if (!key) return "No key entered"; if (!key) return "No key entered";
if (!/^[a-zA-Z]+$/.test(key)) return "The key must consist only of letters"; if (!/^[a-zA-Z]+$/.test(key)) return "The key must consist only of letters";
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
if (alphabet.indexOf(input[i]) >= 0) { if (alphabet.indexOf(input[i]) >= 0) {
chr = key[(i - fail) % key.length]; chr = key[(i - fail) % key.length];
keyIndex = alphabet.indexOf(chr); keyIndex = alphabet.indexOf(chr);
@ -499,7 +514,7 @@ const Cipher = {
* @returns {string} * @returns {string}
*/ */
runAffineEnc: function (input, args) { runAffineEnc: function (input, args) {
var alphabet = "abcdefghijklmnopqrstuvwxyz", let alphabet = "abcdefghijklmnopqrstuvwxyz",
a = args[0], a = args[0],
b = args[1], b = args[1],
output = ""; output = "";
@ -508,7 +523,7 @@ const Cipher = {
return "The values of a and b can only be integers."; return "The values of a and b can only be integers.";
} }
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
if (alphabet.indexOf(input[i]) >= 0) { if (alphabet.indexOf(input[i]) >= 0) {
// Uses the affine function ax+b % m = y (where m is length of the alphabet) // Uses the affine function ax+b % m = y (where m is length of the alphabet)
output += alphabet[((a * alphabet.indexOf(input[i])) + b) % 26]; output += alphabet[((a * alphabet.indexOf(input[i])) + b) % 26];
@ -533,7 +548,7 @@ const Cipher = {
* @returns {string} * @returns {string}
*/ */
runAffineDec: function (input, args) { runAffineDec: function (input, args) {
var alphabet = "abcdefghijklmnopqrstuvwxyz", let alphabet = "abcdefghijklmnopqrstuvwxyz",
a = args[0], a = args[0],
b = args[1], b = args[1],
output = "", output = "",
@ -550,7 +565,7 @@ const Cipher = {
// Calculates modular inverse of a // Calculates modular inverse of a
aModInv = Utils.modInv(a, 26); aModInv = Utils.modInv(a, 26);
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
if (alphabet.indexOf(input[i]) >= 0) { if (alphabet.indexOf(input[i]) >= 0) {
// Uses the affine decode function (y-b * A') % m = x (where m is length of the alphabet and A' is modular inverse) // Uses the affine decode function (y-b * A') % m = x (where m is length of the alphabet and A' is modular inverse)
output += alphabet[Utils.mod((alphabet.indexOf(input[i]) - b) * aModInv, 26)]; output += alphabet[Utils.mod((alphabet.indexOf(input[i]) - b) * aModInv, 26)];
@ -598,7 +613,7 @@ const Cipher = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runSubstitute: function (input, args) { runSubstitute: function (input, args) {
var plaintext = Utils.strToByteArray(Utils.expandAlphRange(args[0]).join()), let plaintext = Utils.strToByteArray(Utils.expandAlphRange(args[0]).join()),
ciphertext = Utils.strToByteArray(Utils.expandAlphRange(args[1]).join()), ciphertext = Utils.strToByteArray(Utils.expandAlphRange(args[1]).join()),
output = [], output = [],
index = -1; index = -1;
@ -607,7 +622,7 @@ const Cipher = {
output = Utils.strToByteArray("Warning: Plaintext and Ciphertext lengths differ\n\n"); output = Utils.strToByteArray("Warning: Plaintext and Ciphertext lengths differ\n\n");
} }
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
index = plaintext.indexOf(input[i]); index = plaintext.indexOf(input[i]);
output.push(index > -1 && index < ciphertext.length ? ciphertext[index] : input[i]); output.push(index > -1 && index < ciphertext.length ? ciphertext[index] : input[i]);
} }
@ -650,10 +665,10 @@ CryptoJS.kdf.OpenSSL.execute = function (password, keySize, ivSize, salt) {
} }
// Derive key and IV // Derive key and IV
var key = CryptoJS.algo.EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); const key = CryptoJS.algo.EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
// Separate key and IV // Separate key and IV
var iv = CryptoJS.lib.WordArray.create(key.words.slice(keySize), ivSize * 4); const iv = CryptoJS.lib.WordArray.create(key.words.slice(keySize), ivSize * 4);
key.sigBytes = keySize * 4; key.sigBytes = keySize * 4;
// Return params // Return params

View file

@ -1,3 +1,5 @@
import {camelCase, kebabCase, snakeCase} from "lodash";
import Utils from "../Utils.js"; import Utils from "../Utils.js";
import vkbeautify from "vkbeautify"; import vkbeautify from "vkbeautify";
import {DOMParser as dom} from "xmldom"; import {DOMParser as dom} from "xmldom";
@ -35,7 +37,7 @@ const Code = {
* @returns {html} * @returns {html}
*/ */
runSyntaxHighlight: function(input, args) { runSyntaxHighlight: function(input, args) {
var language = args[0], let language = args[0],
lineNums = args[1]; lineNums = args[1];
return "<code class='prettyprint'>" + prettyPrintOne(Utils.escapeHtml(input), language, lineNums) + "</code>"; return "<code class='prettyprint'>" + prettyPrintOne(Utils.escapeHtml(input), language, lineNums) + "</code>";
}, },
@ -55,7 +57,7 @@ const Code = {
* @returns {string} * @returns {string}
*/ */
runXmlBeautify: function(input, args) { runXmlBeautify: function(input, args) {
var indentStr = args[0]; const indentStr = args[0];
return vkbeautify.xml(input, indentStr); return vkbeautify.xml(input, indentStr);
}, },
@ -68,7 +70,7 @@ const Code = {
* @returns {string} * @returns {string}
*/ */
runJsonBeautify: function(input, args) { runJsonBeautify: function(input, args) {
var indentStr = args[0]; const indentStr = args[0];
if (!input) return ""; if (!input) return "";
return vkbeautify.json(input, indentStr); return vkbeautify.json(input, indentStr);
}, },
@ -82,7 +84,7 @@ const Code = {
* @returns {string} * @returns {string}
*/ */
runCssBeautify: function(input, args) { runCssBeautify: function(input, args) {
var indentStr = args[0]; const indentStr = args[0];
return vkbeautify.css(input, indentStr); return vkbeautify.css(input, indentStr);
}, },
@ -95,7 +97,7 @@ const Code = {
* @returns {string} * @returns {string}
*/ */
runSqlBeautify: function(input, args) { runSqlBeautify: function(input, args) {
var indentStr = args[0]; const indentStr = args[0];
return vkbeautify.sql(input, indentStr); return vkbeautify.sql(input, indentStr);
}, },
@ -114,7 +116,7 @@ const Code = {
* @returns {string} * @returns {string}
*/ */
runXmlMinify: function(input, args) { runXmlMinify: function(input, args) {
var preserveComments = args[0]; const preserveComments = args[0];
return vkbeautify.xmlmin(input, preserveComments); return vkbeautify.xmlmin(input, preserveComments);
}, },
@ -140,7 +142,7 @@ const Code = {
* @returns {string} * @returns {string}
*/ */
runCssMinify: function(input, args) { runCssMinify: function(input, args) {
var preserveComments = args[0]; const preserveComments = args[0];
return vkbeautify.cssmin(input, preserveComments); return vkbeautify.cssmin(input, preserveComments);
}, },
@ -181,45 +183,45 @@ const Code = {
* @returns {string} * @returns {string}
*/ */
runGenericBeautify: function(input, args) { runGenericBeautify: function(input, args) {
var code = input, let code = input,
t = 0, t = 0,
preservedTokens = [], preservedTokens = [],
m; m;
// Remove strings // Remove strings
var sstrings = /'([^'\\]|\\.)*'/g; const sstrings = /'([^'\\]|\\.)*'/g;
while ((m = sstrings.exec(code))) { while ((m = sstrings.exec(code))) {
code = preserveToken(code, m, t++); code = preserveToken(code, m, t++);
sstrings.lastIndex = m.index; sstrings.lastIndex = m.index;
} }
var dstrings = /"([^"\\]|\\.)*"/g; const dstrings = /"([^"\\]|\\.)*"/g;
while ((m = dstrings.exec(code))) { while ((m = dstrings.exec(code))) {
code = preserveToken(code, m, t++); code = preserveToken(code, m, t++);
dstrings.lastIndex = m.index; dstrings.lastIndex = m.index;
} }
// Remove comments // Remove comments
var scomments = /\/\/[^\n\r]*/g; const scomments = /\/\/[^\n\r]*/g;
while ((m = scomments.exec(code))) { while ((m = scomments.exec(code))) {
code = preserveToken(code, m, t++); code = preserveToken(code, m, t++);
scomments.lastIndex = m.index; scomments.lastIndex = m.index;
} }
var mcomments = /\/\*[\s\S]*?\*\//gm; const mcomments = /\/\*[\s\S]*?\*\//gm;
while ((m = mcomments.exec(code))) { while ((m = mcomments.exec(code))) {
code = preserveToken(code, m, t++); code = preserveToken(code, m, t++);
mcomments.lastIndex = m.index; mcomments.lastIndex = m.index;
} }
var hcomments = /(^|\n)#[^\n\r#]+/g; const hcomments = /(^|\n)#[^\n\r#]+/g;
while ((m = hcomments.exec(code))) { while ((m = hcomments.exec(code))) {
code = preserveToken(code, m, t++); code = preserveToken(code, m, t++);
hcomments.lastIndex = m.index; hcomments.lastIndex = m.index;
} }
// Remove regexes // Remove regexes
var regexes = /\/.*?[^\\]\/[gim]{0,3}/gi; const regexes = /\/.*?[^\\]\/[gim]{0,3}/gi;
while ((m = regexes.exec(code))) { while ((m = regexes.exec(code))) {
code = preserveToken(code, m, t++); code = preserveToken(code, m, t++);
regexes.lastIndex = m.index; regexes.lastIndex = m.index;
@ -241,8 +243,9 @@ const Code = {
.replace(/\n{/g, "{"); .replace(/\n{/g, "{");
// Indent // Indent
var i = 0, let i = 0,
level = 0; level = 0,
indent;
while (i < code.length) { while (i < code.length) {
switch (code[i]) { switch (code[i]) {
case "{": case "{":
@ -252,7 +255,7 @@ const Code = {
if (i+1 >= code.length) break; if (i+1 >= code.length) break;
if (code[i+1] === "}") level--; if (code[i+1] === "}") level--;
var indent = (level >= 0) ? Array(level*4+1).join(" ") : ""; indent = (level >= 0) ? Array(level*4+1).join(" ") : "";
code = code.substring(0, i+1) + indent + code.substring(i+1); code = code.substring(0, i+1) + indent + code.substring(i+1);
if (level > 0) i += level*4; if (level > 0) i += level*4;
@ -285,9 +288,9 @@ const Code = {
.replace(/}\s*(else|catch|except|finally|elif|elseif|else if)/gi, "} $1"); .replace(/}\s*(else|catch|except|finally|elif|elseif|else if)/gi, "} $1");
// Replace preserved tokens // Replace preserved tokens
var ptokens = /###preservedToken(\d+)###/g; const ptokens = /###preservedToken(\d+)###/g;
while ((m = ptokens.exec(code))) { while ((m = ptokens.exec(code))) {
var ti = parseInt(m[1], 10); const ti = parseInt(m[1], 10);
code = code.substring(0, m.index) + preservedTokens[ti] + code.substring(m.index + m[0].length); code = code.substring(0, m.index) + preservedTokens[ti] + code.substring(m.index + m[0].length);
ptokens.lastIndex = m.index; ptokens.lastIndex = m.index;
} }
@ -327,24 +330,24 @@ const Code = {
* @returns {string} * @returns {string}
*/ */
runXpath:function(input, args) { runXpath:function(input, args) {
var query = args[0], let query = args[0],
delimiter = args[1]; delimiter = args[1];
var doc; let doc;
try { try {
doc = new dom().parseFromString(input); doc = new dom().parseFromString(input);
} catch (err) { } catch (err) {
return "Invalid input XML."; return "Invalid input XML.";
} }
var nodes; let nodes;
try { try {
nodes = xpath.select(query, doc); nodes = xpath.select(query, doc);
} catch (err) { } catch (err) {
return "Invalid XPath. Details:\n" + err.message; return "Invalid XPath. Details:\n" + err.message;
} }
var nodeToString = function(node) { const nodeToString = function(node) {
return node.toString(); return node.toString();
}; };
@ -374,7 +377,7 @@ const Code = {
* @returns {string} * @returns {string}
*/ */
runCSSQuery: function(input, args) { runCSSQuery: function(input, args) {
var query = args[0], let query = args[0],
delimiter = args[1], delimiter = args[1],
parser = new DOMParser(), parser = new DOMParser(),
html, html,
@ -396,7 +399,7 @@ const Code = {
return "Invalid CSS Selector. Details:\n" + err.message; return "Invalid CSS Selector. Details:\n" + err.message;
} }
var nodeToString = function(node) { const nodeToString = function(node) {
switch (node.nodeType) { switch (node.nodeType) {
case Node.ELEMENT_NODE: return node.outerHTML; case Node.ELEMENT_NODE: return node.outerHTML;
case Node.ATTRIBUTE_NODE: return node.value; case Node.ATTRIBUTE_NODE: return node.value;
@ -415,6 +418,84 @@ const Code = {
.join(delimiter); .join(delimiter);
}, },
/**
* This tries to rename variable names in a code snippet according to a function.
*
* @param {string} input
* @param {function} replacer - this function will be fed the token which should be renamed.
* @returns {string}
*/
_replaceVariableNames(input, replacer) {
const tokenRegex = /\\"|"(?:\\"|[^"])*"|(\b[a-z0-9\-_]+\b)/ig;
return input.replace(tokenRegex, (...args) => {
let match = args[0],
quotes = args[1];
if (!quotes) {
return match;
} else {
return replacer(match);
}
});
},
/**
* Converts to snake_case.
*
* @param {string} input
* @param {Object[]} args
* @returns {string}
*
*/
runToSnakeCase(input, args) {
const smart = args[0];
if (smart) {
return Code._replaceVariableNames(input, snakeCase);
} else {
return snakeCase(input);
}
},
/**
* Converts to camelCase.
*
* @param {string} input
* @param {Object[]} args
* @returns {string}
*
*/
runToCamelCase(input, args) {
const smart = args[0];
if (smart) {
return Code._replaceVariableNames(input, camelCase);
} else {
return camelCase(input);
}
},
/**
* Converts to kebab-case.
*
* @param {string} input
* @param {Object[]} args
* @returns {string}
*
*/
runToKebabCase(input, args) {
const smart = args[0];
if (smart) {
return Code._replaceVariableNames(input, kebabCase);
} else {
return kebabCase(input);
}
},
}; };
export default Code; export default Code;

View file

@ -6,7 +6,7 @@ import zip from "zlibjs/bin/zip.min";
import unzip from "zlibjs/bin/unzip.min"; import unzip from "zlibjs/bin/unzip.min";
import bzip2 from "exports-loader?bzip2!../lib/bzip2.js"; import bzip2 from "exports-loader?bzip2!../lib/bzip2.js";
var Zlib = { const Zlib = {
RawDeflate: rawdeflate.Zlib.RawDeflate, RawDeflate: rawdeflate.Zlib.RawDeflate,
RawInflate: rawinflate.Zlib.RawInflate, RawInflate: rawinflate.Zlib.RawInflate,
Deflate: zlibAndGzip.Zlib.Deflate, Deflate: zlibAndGzip.Zlib.Deflate,
@ -67,7 +67,7 @@ const Compress = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runRawDeflate: function(input, args) { runRawDeflate: function(input, args) {
var deflate = new Zlib.RawDeflate(input, { const deflate = new Zlib.RawDeflate(input, {
compressionType: Compress.RAW_COMPRESSION_TYPE_LOOKUP[args[0]] compressionType: Compress.RAW_COMPRESSION_TYPE_LOOKUP[args[0]]
}); });
return Array.prototype.slice.call(deflate.compress()); return Array.prototype.slice.call(deflate.compress());
@ -113,7 +113,7 @@ const Compress = {
runRawInflate: function(input, args) { runRawInflate: function(input, args) {
// Deal with character encoding issues // Deal with character encoding issues
input = Utils.strToByteArray(Utils.byteArrayToUtf8(input)); input = Utils.strToByteArray(Utils.byteArrayToUtf8(input));
var inflate = new Zlib.RawInflate(input, { let inflate = new Zlib.RawInflate(input, {
index: args[0], index: args[0],
bufferSize: args[1], bufferSize: args[1],
bufferType: Compress.RAW_BUFFER_TYPE_LOOKUP[args[2]], bufferType: Compress.RAW_BUFFER_TYPE_LOOKUP[args[2]],
@ -129,8 +129,8 @@ const Compress = {
if (result.length > 158 && result[0] === 93 && result[5] === 93) { if (result.length > 158 && result[0] === 93 && result[5] === 93) {
// If the first two square brackets are there, check that the others // If the first two square brackets are there, check that the others
// are also there. If they are, throw an error. If not, continue. // are also there. If they are, throw an error. If not, continue.
var valid = false; let valid = false;
for (var i = 0; i < 155; i += 5) { for (let i = 0; i < 155; i += 5) {
if (result[i] !== 93) { if (result[i] !== 93) {
valid = true; valid = true;
} }
@ -163,7 +163,7 @@ const Compress = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runZlibDeflate: function(input, args) { runZlibDeflate: function(input, args) {
var deflate = new Zlib.Deflate(input, { const deflate = new Zlib.Deflate(input, {
compressionType: Compress.ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]] compressionType: Compress.ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]]
}); });
return Array.prototype.slice.call(deflate.compress()); return Array.prototype.slice.call(deflate.compress());
@ -189,7 +189,7 @@ const Compress = {
runZlibInflate: function(input, args) { runZlibInflate: function(input, args) {
// Deal with character encoding issues // Deal with character encoding issues
input = Utils.strToByteArray(Utils.byteArrayToUtf8(input)); input = Utils.strToByteArray(Utils.byteArrayToUtf8(input));
var inflate = new Zlib.Inflate(input, { const inflate = new Zlib.Inflate(input, {
index: args[0], index: args[0],
bufferSize: args[1], bufferSize: args[1],
bufferType: Compress.ZLIB_BUFFER_TYPE_LOOKUP[args[2]], bufferType: Compress.ZLIB_BUFFER_TYPE_LOOKUP[args[2]],
@ -214,7 +214,7 @@ const Compress = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runGzip: function(input, args) { runGzip: function(input, args) {
var filename = args[1], let filename = args[1],
comment = args[2], comment = args[2],
options = { options = {
deflateOptions: { deflateOptions: {
@ -234,7 +234,7 @@ const Compress = {
options.comment = comment; options.comment = comment;
} }
var gzip = new Zlib.Gzip(input, options); const gzip = new Zlib.Gzip(input, options);
return Array.prototype.slice.call(gzip.compress()); return Array.prototype.slice.call(gzip.compress());
}, },
@ -249,7 +249,7 @@ const Compress = {
runGunzip: function(input, args) { runGunzip: function(input, args) {
// Deal with character encoding issues // Deal with character encoding issues
input = Utils.strToByteArray(Utils.byteArrayToUtf8(input)); input = Utils.strToByteArray(Utils.byteArrayToUtf8(input));
var gunzip = new Zlib.Gunzip(input); const gunzip = new Zlib.Gunzip(input);
return Array.prototype.slice.call(gunzip.decompress()); return Array.prototype.slice.call(gunzip.decompress());
}, },
@ -285,7 +285,7 @@ const Compress = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runPkzip: function(input, args) { runPkzip: function(input, args) {
var password = Utils.strToByteArray(args[2]), let password = Utils.strToByteArray(args[2]),
options = { options = {
filename: Utils.strToByteArray(args[0]), filename: Utils.strToByteArray(args[0]),
comment: Utils.strToByteArray(args[1]), comment: Utils.strToByteArray(args[1]),
@ -318,7 +318,7 @@ const Compress = {
* @returns {string} * @returns {string}
*/ */
runPkunzip: function(input, args) { runPkunzip: function(input, args) {
var options = { let options = {
password: Utils.strToByteArray(args[0]), password: Utils.strToByteArray(args[0]),
verify: args[1] verify: args[1]
}, },
@ -327,15 +327,15 @@ const Compress = {
files = []; files = [];
filenames.forEach(function(fileName) { filenames.forEach(function(fileName) {
var bytes = unzip.decompress(fileName); const bytes = unzip.decompress(fileName);
var contents = Utils.byteArrayToUtf8(bytes); const contents = Utils.byteArrayToUtf8(bytes);
var file = { const file = {
fileName: fileName, fileName: fileName,
size: contents.length, size: contents.length,
}; };
var isDir = contents.length === 0 && fileName.endsWith("/"); const isDir = contents.length === 0 && fileName.endsWith("/");
if (!isDir) { if (!isDir) {
file.bytes = bytes; file.bytes = bytes;
file.contents = contents; file.contents = contents;
@ -356,7 +356,7 @@ const Compress = {
* @returns {string} * @returns {string}
*/ */
runBzip2Decompress: function(input, args) { runBzip2Decompress: function(input, args) {
var compressed = new Uint8Array(input), let compressed = new Uint8Array(input),
bzip2Reader, bzip2Reader,
plain = ""; plain = "";
@ -383,19 +383,19 @@ const Compress = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runTar: function(input, args) { runTar: function(input, args) {
var Tarball = function() { const Tarball = function() {
this.bytes = new Array(512); this.bytes = new Array(512);
this.position = 0; this.position = 0;
}; };
Tarball.prototype.addEmptyBlock = function() { Tarball.prototype.addEmptyBlock = function() {
var filler = new Array(512); const filler = new Array(512);
filler.fill(0); filler.fill(0);
this.bytes = this.bytes.concat(filler); this.bytes = this.bytes.concat(filler);
}; };
Tarball.prototype.writeBytes = function(bytes) { Tarball.prototype.writeBytes = function(bytes) {
var self = this; const self = this;
if (this.position + bytes.length > this.bytes.length) { if (this.position + bytes.length > this.bytes.length) {
this.addEmptyBlock(); this.addEmptyBlock();
@ -412,17 +412,17 @@ const Compress = {
}; };
Tarball.prototype.writeEndBlocks = function() { Tarball.prototype.writeEndBlocks = function() {
var numEmptyBlocks = 2; const numEmptyBlocks = 2;
for (var i = 0; i < numEmptyBlocks; i++) { for (let i = 0; i < numEmptyBlocks; i++) {
this.addEmptyBlock(); this.addEmptyBlock();
} }
}; };
var fileSize = Utils.padLeft(input.length.toString(8), 11, "0"); const fileSize = Utils.padLeft(input.length.toString(8), 11, "0");
var currentUnixTimestamp = Math.floor(Date.now() / 1000); const currentUnixTimestamp = Math.floor(Date.now() / 1000);
var lastModTime = Utils.padLeft(currentUnixTimestamp.toString(8), 11, "0"); const lastModTime = Utils.padLeft(currentUnixTimestamp.toString(8), 11, "0");
var file = { const file = {
fileName: Utils.padBytesRight(args[0], 100), fileName: Utils.padBytesRight(args[0], 100),
fileMode: Utils.padBytesRight("0000664", 8), fileMode: Utils.padBytesRight("0000664", 8),
ownerUID: Utils.padBytesRight("0", 8), ownerUID: Utils.padBytesRight("0", 8),
@ -441,9 +441,9 @@ const Compress = {
fileNamePrefix: Utils.padBytesRight("", 155), fileNamePrefix: Utils.padBytesRight("", 155),
}; };
var checksum = 0; let checksum = 0;
for (var key in file) { for (const key in file) {
var bytes = file[key]; const bytes = file[key];
Array.prototype.forEach.call(bytes, function(b) { Array.prototype.forEach.call(bytes, function(b) {
if (typeof b.charCodeAt !== "undefined") { if (typeof b.charCodeAt !== "undefined") {
checksum += b.charCodeAt(); checksum += b.charCodeAt();
@ -455,7 +455,7 @@ const Compress = {
checksum = Utils.padBytesRight(Utils.padLeft(checksum.toString(8), 7, "0"), 8); checksum = Utils.padBytesRight(Utils.padLeft(checksum.toString(8), 7, "0"), 8);
file.checksum = checksum; file.checksum = checksum;
var tarball = new Tarball(); const tarball = new Tarball();
tarball.writeBytes(file.fileName); tarball.writeBytes(file.fileName);
tarball.writeBytes(file.fileMode); tarball.writeBytes(file.fileMode);
tarball.writeBytes(file.ownerUID); tarball.writeBytes(file.ownerUID);
@ -490,22 +490,22 @@ const Compress = {
* @returns {html} * @returns {html}
*/ */
runUntar: function(input, args) { runUntar: function(input, args) {
var Stream = function(input) { const Stream = function(input) {
this.bytes = input; this.bytes = input;
this.position = 0; this.position = 0;
}; };
Stream.prototype.getBytes = function(bytesToGet) { Stream.prototype.getBytes = function(bytesToGet) {
var newPosition = this.position + bytesToGet; const newPosition = this.position + bytesToGet;
var bytes = this.bytes.slice(this.position, newPosition); const bytes = this.bytes.slice(this.position, newPosition);
this.position = newPosition; this.position = newPosition;
return bytes; return bytes;
}; };
Stream.prototype.readString = function(numBytes) { Stream.prototype.readString = function(numBytes) {
var result = ""; let result = "";
for (var i = this.position; i < this.position + numBytes; i++) { for (let i = this.position; i < this.position + numBytes; i++) {
var currentByte = this.bytes[i]; const currentByte = this.bytes[i];
if (currentByte === 0) break; if (currentByte === 0) break;
result += String.fromCharCode(currentByte); result += String.fromCharCode(currentByte);
} }
@ -514,7 +514,7 @@ const Compress = {
}; };
Stream.prototype.readInt = function(numBytes, base) { Stream.prototype.readInt = function(numBytes, base) {
var string = this.readString(numBytes); const string = this.readString(numBytes);
return parseInt(string, base); return parseInt(string, base);
}; };
@ -522,13 +522,13 @@ const Compress = {
return this.position < this.bytes.length; return this.position < this.bytes.length;
}; };
var stream = new Stream(input), let stream = new Stream(input),
files = []; files = [];
while (stream.hasMore()) { while (stream.hasMore()) {
var dataPosition = stream.position + 512; const dataPosition = stream.position + 512;
var file = { const file = {
fileName: stream.readString(100), fileName: stream.readString(100),
fileMode: stream.readString(8), fileMode: stream.readString(8),
ownerUID: stream.readString(8), ownerUID: stream.readString(8),
@ -555,7 +555,7 @@ const Compress = {
if (file.type === "0") { if (file.type === "0") {
// File // File
files.push(file); files.push(file);
var endPosition = stream.position + file.size; let endPosition = stream.position + file.size;
if (file.size % 512 !== 0) { if (file.size % 512 !== 0) {
endPosition += 512 - (file.size % 512); endPosition += 512 - (file.size % 512);
} }

View file

@ -65,7 +65,7 @@ const Convert = {
* @returns {number} * @returns {number}
*/ */
runDistance: function (input, args) { runDistance: function (input, args) {
var inputUnits = args[0], let inputUnits = args[0],
outputUnits = args[1]; outputUnits = args[1];
input = input * Convert.DISTANCE_FACTOR[inputUnits]; input = input * Convert.DISTANCE_FACTOR[inputUnits];
@ -146,7 +146,7 @@ const Convert = {
* @returns {number} * @returns {number}
*/ */
runDataSize: function (input, args) { runDataSize: function (input, args) {
var inputUnits = args[0], let inputUnits = args[0],
outputUnits = args[1]; outputUnits = args[1];
input = input * Convert.DATA_FACTOR[inputUnits]; input = input * Convert.DATA_FACTOR[inputUnits];
@ -226,7 +226,7 @@ const Convert = {
* @returns {number} * @returns {number}
*/ */
runArea: function (input, args) { runArea: function (input, args) {
var inputUnits = args[0], let inputUnits = args[0],
outputUnits = args[1]; outputUnits = args[1];
input = input * Convert.AREA_FACTOR[inputUnits]; input = input * Convert.AREA_FACTOR[inputUnits];
@ -337,7 +337,7 @@ const Convert = {
* @returns {number} * @returns {number}
*/ */
runMass: function (input, args) { runMass: function (input, args) {
var inputUnits = args[0], let inputUnits = args[0],
outputUnits = args[1]; outputUnits = args[1];
input = input * Convert.MASS_FACTOR[inputUnits]; input = input * Convert.MASS_FACTOR[inputUnits];
@ -402,7 +402,7 @@ const Convert = {
* @returns {number} * @returns {number}
*/ */
runSpeed: function (input, args) { runSpeed: function (input, args) {
var inputUnits = args[0], let inputUnits = args[0],
outputUnits = args[1]; outputUnits = args[1];
input = input * Convert.SPEED_FACTOR[inputUnits]; input = input * Convert.SPEED_FACTOR[inputUnits];

View file

@ -23,7 +23,7 @@ const DateTime = {
* @returns {string} * @returns {string}
*/ */
runFromUnixTimestamp: function(input, args) { runFromUnixTimestamp: function(input, args) {
var units = args[0], let units = args[0],
d; d;
input = parseFloat(input); input = parseFloat(input);
@ -54,7 +54,7 @@ const DateTime = {
* @returns {number} * @returns {number}
*/ */
runToUnixTimestamp: function(input, args) { runToUnixTimestamp: function(input, args) {
var units = args[0], let units = args[0],
d = moment(input); d = moment(input);
if (units === "Seconds (s)") { if (units === "Seconds (s)") {
@ -129,7 +129,7 @@ const DateTime = {
* @returns {html} * @returns {html}
*/ */
runTranslateFormat: function(input, args) { runTranslateFormat: function(input, args) {
var inputFormat = args[1], let inputFormat = args[1],
inputTimezone = args[2], inputTimezone = args[2],
outputFormat = args[3], outputFormat = args[3],
outputTimezone = args[4], outputTimezone = args[4],
@ -154,7 +154,7 @@ const DateTime = {
* @returns {html} * @returns {html}
*/ */
runParse: function(input, args) { runParse: function(input, args) {
var inputFormat = args[1], let inputFormat = args[1],
inputTimezone = args[2], inputTimezone = args[2],
date, date,
output = ""; output = "";

View file

@ -36,7 +36,7 @@ const Endian = {
* @returns {string} * @returns {string}
*/ */
runSwapEndianness: function(input, args) { runSwapEndianness: function(input, args) {
var dataFormat = args[0], let dataFormat = args[0],
wordLength = args[1], wordLength = args[1],
padIncompleteWords = args[2], padIncompleteWords = args[2],
data = [], data = [],
@ -63,7 +63,7 @@ const Endian = {
// Split up into words // Split up into words
for (i = 0; i < data.length; i += wordLength) { for (i = 0; i < data.length; i += wordLength) {
var word = data.slice(i, i + wordLength); const word = data.slice(i, i + wordLength);
// Pad word if too short // Pad word if too short
if (padIncompleteWords && word.length < wordLength){ if (padIncompleteWords && word.length < wordLength){

View file

@ -26,7 +26,7 @@ const Entropy = {
* @returns {html} * @returns {html}
*/ */
runEntropy: function(input, args) { runEntropy: function(input, args) {
var chunkSize = args[0], let chunkSize = args[0],
output = "", output = "",
entropy = Entropy._calcEntropy(input); entropy = Entropy._calcEntropy(input);
@ -58,9 +58,9 @@ const Entropy = {
]);\ ]);\
</script>"; </script>";
var chunkEntropy = 0; let chunkEntropy = 0;
if (chunkSize !== 0) { if (chunkSize !== 0) {
for (var i = 0; i < input.length; i += chunkSize) { for (let i = 0; i < input.length; i += chunkSize) {
chunkEntropy = Entropy._calcEntropy(input.slice(i, i+chunkSize)); chunkEntropy = Entropy._calcEntropy(input.slice(i, i+chunkSize));
output += "Bytes " + i + " to " + (i+chunkSize) + ": " + chunkEntropy + "\n"; output += "Bytes " + i + " to " + (i+chunkSize) + ": " + chunkEntropy + "\n";
} }
@ -88,15 +88,11 @@ const Entropy = {
runFreqDistrib: function (input, args) { runFreqDistrib: function (input, args) {
if (!input.length) return "No data"; if (!input.length) return "No data";
var distrib = new Array(256), let distrib = new Array(256).fill(0),
percentages = new Array(256), percentages = new Array(256),
len = input.length, len = input.length,
showZeroes = args[0]; showZeroes = args[0],
i;
// Initialise distrib to 0
for (var i = 0; i < 256; i++) {
distrib[i] = 0;
}
// Count bytes // Count bytes
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
@ -104,14 +100,14 @@ const Entropy = {
} }
// Calculate percentages // Calculate percentages
var repr = 0; let repr = 0;
for (i = 0; i < 256; i++) { for (i = 0; i < 256; i++) {
if (distrib[i] > 0) repr++; if (distrib[i] > 0) repr++;
percentages[i] = distrib[i] / len * 100; percentages[i] = distrib[i] / len * 100;
} }
// Print // Print
var output = "<canvas id='chart-area'></canvas><br>" + let output = "<canvas id='chart-area'></canvas><br>" +
"Total data length: " + len + "Total data length: " + len +
"\nNumber of bytes represented: " + repr + "\nNumber of bytes represented: " + repr +
"\nNumber of bytes not represented: " + (256-repr) + "\nNumber of bytes not represented: " + (256-repr) +
@ -147,15 +143,16 @@ const Entropy = {
* @returns {number} * @returns {number}
*/ */
_calcEntropy: function(data) { _calcEntropy: function(data) {
var prob = [], let prob = [],
uniques = data.unique(), uniques = data.unique(),
str = Utils.byteArrayToChars(data); str = Utils.byteArrayToChars(data),
i;
for (var i = 0; i < uniques.length; i++) { for (i = 0; i < uniques.length; i++) {
prob.push(str.count(Utils.chr(uniques[i])) / data.length); prob.push(str.count(Utils.chr(uniques[i])) / data.length);
} }
var entropy = 0, let entropy = 0,
p; p;
for (i = 0; i < prob.length; i++) { for (i = 0; i < prob.length; i++) {

View file

@ -21,7 +21,7 @@ const Extract = {
* @returns {string} * @returns {string}
*/ */
_search: function(input, searchRegex, removeRegex, includeTotal) { _search: function(input, searchRegex, removeRegex, includeTotal) {
var output = "", let output = "",
total = 0, total = 0,
match; match;
@ -58,7 +58,7 @@ const Extract = {
* @returns {string} * @returns {string}
*/ */
runStrings: function(input, args) { runStrings: function(input, args) {
var minLen = args[0] || Extract.MIN_STRING_LEN, let minLen = args[0] || Extract.MIN_STRING_LEN,
displayTotal = args[1], displayTotal = args[1],
strings = "[A-Z\\d/\\-:.,_$%'\"()<>= !\\[\\]{}@]", strings = "[A-Z\\d/\\-:.,_$%'\"()<>= !\\[\\]{}@]",
regex = new RegExp(strings + "{" + minLen + ",}", "ig"); regex = new RegExp(strings + "{" + minLen + ",}", "ig");
@ -91,7 +91,7 @@ const Extract = {
* @returns {string} * @returns {string}
*/ */
runIp: function(input, args) { runIp: function(input, args) {
var includeIpv4 = args[0], let includeIpv4 = args[0],
includeIpv6 = args[1], includeIpv6 = args[1],
removeLocal = args[2], removeLocal = args[2],
displayTotal = args[3], displayTotal = args[3],
@ -108,10 +108,10 @@ const Extract = {
} }
if (ips) { if (ips) {
var regex = new RegExp(ips, "ig"); const regex = new RegExp(ips, "ig");
if (removeLocal) { if (removeLocal) {
var ten = "10\\..+", let ten = "10\\..+",
oneninetwo = "192\\.168\\..+", oneninetwo = "192\\.168\\..+",
oneseventwo = "172\\.(?:1[6-9]|2\\d|3[01])\\..+", oneseventwo = "172\\.(?:1[6-9]|2\\d|3[01])\\..+",
onetwoseven = "127\\..+", onetwoseven = "127\\..+",
@ -136,7 +136,7 @@ const Extract = {
* @returns {string} * @returns {string}
*/ */
runEmail: function(input, args) { runEmail: function(input, args) {
var displayTotal = args[0], let displayTotal = args[0],
regex = /\w[-.\w]*@[-\w]+(?:\.[-\w]+)*\.[A-Z]{2,4}/ig; regex = /\w[-.\w]*@[-\w]+(?:\.[-\w]+)*\.[A-Z]{2,4}/ig;
return Extract._search(input, regex, null, displayTotal); return Extract._search(input, regex, null, displayTotal);
@ -151,7 +151,7 @@ const Extract = {
* @returns {string} * @returns {string}
*/ */
runMac: function(input, args) { runMac: function(input, args) {
var displayTotal = args[0], let displayTotal = args[0],
regex = /[A-F\d]{2}(?:[:-][A-F\d]{2}){5}/ig; regex = /[A-F\d]{2}(?:[:-][A-F\d]{2}){5}/ig;
return Extract._search(input, regex, null, displayTotal); return Extract._search(input, regex, null, displayTotal);
@ -166,14 +166,14 @@ const Extract = {
* @returns {string} * @returns {string}
*/ */
runUrls: function(input, args) { runUrls: function(input, args) {
var displayTotal = args[0], let displayTotal = args[0],
protocol = "[A-Z]+://", protocol = "[A-Z]+://",
hostname = "[-\\w]+(?:\\.\\w[-\\w]*)+", hostname = "[-\\w]+(?:\\.\\w[-\\w]*)+",
port = ":\\d+", port = ":\\d+",
path = "/[^.!,?;\"'<>()\\[\\]{}\\s\\x7F-\\xFF]*"; path = "/[^.!,?;\"'<>()\\[\\]{}\\s\\x7F-\\xFF]*";
path += "(?:[.!,?]+[^.!,?;\"'<>()\\[\\]{}\\s\\x7F-\\xFF]+)*"; path += "(?:[.!,?]+[^.!,?;\"'<>()\\[\\]{}\\s\\x7F-\\xFF]+)*";
var regex = new RegExp(protocol + hostname + "(?:" + port + const regex = new RegExp(protocol + hostname + "(?:" + port +
")?(?:" + path + ")?", "ig"); ")?(?:" + path + ")?", "ig");
return Extract._search(input, regex, null, displayTotal); return Extract._search(input, regex, null, displayTotal);
}, },
@ -187,7 +187,7 @@ const Extract = {
* @returns {string} * @returns {string}
*/ */
runDomains: function(input, args) { runDomains: function(input, args) {
var displayTotal = args[0], let displayTotal = args[0],
protocol = "https?://", protocol = "https?://",
hostname = "[-\\w\\.]+", hostname = "[-\\w\\.]+",
tld = "\\.(?:com|net|org|biz|info|co|uk|onion|int|mobi|name|edu|gov|mil|eu|ac|ae|af|de|ca|ch|cn|cy|es|gb|hk|il|in|io|tv|me|nl|no|nz|ro|ru|tr|us|az|ir|kz|uz|pk)+", tld = "\\.(?:com|net|org|biz|info|co|uk|onion|int|mobi|name|edu|gov|mil|eu|ac|ae|af|de|ca|ch|cn|cy|es|gb|hk|il|in|io|tv|me|nl|no|nz|ro|ru|tr|us|az|ir|kz|uz|pk)+",
@ -216,7 +216,7 @@ const Extract = {
* @returns {string} * @returns {string}
*/ */
runFilePaths: function(input, args) { runFilePaths: function(input, args) {
var includeWinPath = args[0], let includeWinPath = args[0],
includeUnixPath = args[1], includeUnixPath = args[1],
displayTotal = args[2], displayTotal = args[2],
winDrive = "[A-Z]:\\\\", winDrive = "[A-Z]:\\\\",
@ -236,7 +236,7 @@ const Extract = {
} }
if (filePaths) { if (filePaths) {
var regex = new RegExp(filePaths, "ig"); const regex = new RegExp(filePaths, "ig");
return Extract._search(input, regex, null, displayTotal); return Extract._search(input, regex, null, displayTotal);
} else { } else {
return ""; return "";
@ -252,7 +252,7 @@ const Extract = {
* @returns {string} * @returns {string}
*/ */
runDates: function(input, args) { runDates: function(input, args) {
var displayTotal = args[0], let displayTotal = args[0],
date1 = "(?:19|20)\\d\\d[- /.](?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])", // yyyy-mm-dd date1 = "(?:19|20)\\d\\d[- /.](?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])", // yyyy-mm-dd
date2 = "(?:0[1-9]|[12][0-9]|3[01])[- /.](?:0[1-9]|1[012])[- /.](?:19|20)\\d\\d", // dd/mm/yyyy date2 = "(?:0[1-9]|[12][0-9]|3[01])[- /.](?:0[1-9]|1[012])[- /.](?:19|20)\\d\\d", // dd/mm/yyyy
date3 = "(?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])[- /.](?:19|20)\\d\\d", // mm/dd/yyyy date3 = "(?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])[- /.](?:19|20)\\d\\d", // mm/dd/yyyy
@ -270,7 +270,7 @@ const Extract = {
* @returns {string} * @returns {string}
*/ */
runAllIdents: function(input, args) { runAllIdents: function(input, args) {
var output = ""; let output = "";
output += "IP addresses\n"; output += "IP addresses\n";
output += Extract.runIp(input, [true, true, false]); output += Extract.runIp(input, [true, true, false]);

View file

@ -20,12 +20,12 @@ const FileType = {
* @returns {string} * @returns {string}
*/ */
runDetect: function(input, args) { runDetect: function(input, args) {
var type = FileType._magicType(input); const type = FileType._magicType(input);
if (!type) { if (!type) {
return "Unknown file type. Have you tried checking the entropy of this data to determine whether it might be encrypted or compressed?"; return "Unknown file type. Have you tried checking the entropy of this data to determine whether it might be encrypted or compressed?";
} else { } else {
var output = "File extension: " + type.ext + "\n" + let output = "File extension: " + type.ext + "\n" +
"MIME type: " + type.mime; "MIME type: " + type.mime;
if (type.desc && type.desc.length) { if (type.desc && type.desc.length) {
@ -51,14 +51,14 @@ const FileType = {
* @returns {string} * @returns {string}
*/ */
runScanForEmbeddedFiles: function(input, args) { runScanForEmbeddedFiles: function(input, args) {
var output = "Scanning data for 'magic bytes' which may indicate embedded files. The following results may be false positives and should not be treat as reliable. Any suffiently long file is likely to contain these magic bytes coincidentally.\n", let output = "Scanning data for 'magic bytes' which may indicate embedded files. The following results may be false positives and should not be treat as reliable. Any suffiently long file is likely to contain these magic bytes coincidentally.\n",
type, type,
ignoreCommon = args[0], ignoreCommon = args[0],
commonExts = ["ico", "ttf", ""], commonExts = ["ico", "ttf", ""],
numFound = 0, numFound = 0,
numCommonFound = 0; numCommonFound = 0;
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
type = FileType._magicType(input.slice(i)); type = FileType._magicType(input.slice(i));
if (type) { if (type) {
if (ignoreCommon && commonExts.indexOf(type.ext) > -1) { if (ignoreCommon && commonExts.indexOf(type.ext) > -1) {

View file

@ -31,14 +31,14 @@ const HTML = {
* @returns {string} * @returns {string}
*/ */
runToEntity: function(input, args) { runToEntity: function(input, args) {
var convertAll = args[0], let convertAll = args[0],
numeric = args[1] === "Numeric entities", numeric = args[1] === "Numeric entities",
hexa = args[1] === "Hex entities"; hexa = args[1] === "Hex entities";
var charcodes = Utils.strToCharcode(input); const charcodes = Utils.strToCharcode(input);
var output = ""; let output = "";
for (var i = 0; i < charcodes.length; i++) { for (let i = 0; i < charcodes.length; i++) {
if (convertAll && numeric) { if (convertAll && numeric) {
output += "&#" + charcodes[i] + ";"; output += "&#" + charcodes[i] + ";";
} else if (convertAll && hexa) { } else if (convertAll && hexa) {
@ -77,7 +77,7 @@ const HTML = {
* @returns {string} * @returns {string}
*/ */
runFromEntity: function(input, args) { runFromEntity: function(input, args) {
var regex = /&(#?x?[a-zA-Z0-9]{1,8});/g, let regex = /&(#?x?[a-zA-Z0-9]{1,8});/g,
output = "", output = "",
m, m,
i = 0; i = 0;
@ -88,16 +88,16 @@ const HTML = {
output += input[i++]; output += input[i++];
// Add match // Add match
var bite = HTML._entityToByte[m[1]]; const bite = HTML._entityToByte[m[1]];
if (bite) { if (bite) {
output += Utils.chr(bite); output += Utils.chr(bite);
} else if (!bite && m[1][0] === "#" && m[1].length > 1 && /^#\d{1,5}$/.test(m[1])) { } else if (!bite && m[1][0] === "#" && m[1].length > 1 && /^#\d{1,5}$/.test(m[1])) {
// Numeric entity (e.g. &#10;) // Numeric entity (e.g. &#10;)
var num = m[1].slice(1, m[1].length); const num = m[1].slice(1, m[1].length);
output += Utils.chr(parseInt(num, 10)); output += Utils.chr(parseInt(num, 10));
} else if (!bite && m[1][0] === "#" && m[1].length > 3 && /^#x[\dA-F]{2,8}$/i.test(m[1])) { } else if (!bite && m[1][0] === "#" && m[1].length > 3 && /^#x[\dA-F]{2,8}$/i.test(m[1])) {
// Hex entity (e.g. &#x3A;) // Hex entity (e.g. &#x3A;)
var hex = m[1].slice(2, m[1].length); const hex = m[1].slice(2, m[1].length);
output += Utils.chr(parseInt(hex, 16)); output += Utils.chr(parseInt(hex, 16));
} else { } else {
// Not a valid entity, print as normal // Not a valid entity, print as normal
@ -134,7 +134,7 @@ const HTML = {
* @returns {string} * @returns {string}
*/ */
runStripTags: function(input, args) { runStripTags: function(input, args) {
var removeIndentation = args[0], let removeIndentation = args[0],
removeLineBreaks = args[1]; removeLineBreaks = args[1];
input = Utils.stripHtmlTags(input); input = Utils.stripHtmlTags(input);
@ -160,7 +160,7 @@ const HTML = {
* @returns {html} * @returns {html}
*/ */
runParseColourCode: function(input, args) { runParseColourCode: function(input, args) {
var m = null, let m = null,
r = 0, g = 0, b = 0, a = 1; r = 0, g = 0, b = 0, a = 1;
// Read in the input // Read in the input
@ -177,7 +177,7 @@ const HTML = {
a = m[4] ? parseFloat(m[4]) : 1; a = m[4] ? parseFloat(m[4]) : 1;
} else if ((m = input.match(/hsla?\((\d{1,3}(?:\.\d+)?),\s?(\d{1,3}(?:\.\d+)?)%,\s?(\d{1,3}(?:\.\d+)?)%(?:,\s?(\d(?:\.\d+)?))?\)/i))) { } else if ((m = input.match(/hsla?\((\d{1,3}(?:\.\d+)?),\s?(\d{1,3}(?:\.\d+)?)%,\s?(\d{1,3}(?:\.\d+)?)%(?:,\s?(\d(?:\.\d+)?))?\)/i))) {
// HSL or HSLA - hsl(200, 65%, 91%) or hsla(200, 65%, 91%, 1) // HSL or HSLA - hsl(200, 65%, 91%) or hsla(200, 65%, 91%, 1)
var h_ = parseFloat(m[1]) / 360, let h_ = parseFloat(m[1]) / 360,
s_ = parseFloat(m[2]) / 100, s_ = parseFloat(m[2]) / 100,
l_ = parseFloat(m[3]) / 100, l_ = parseFloat(m[3]) / 100,
rgb_ = HTML._hslToRgb(h_, s_, l_); rgb_ = HTML._hslToRgb(h_, s_, l_);
@ -188,7 +188,7 @@ const HTML = {
a = m[4] ? parseFloat(m[4]) : 1; a = m[4] ? parseFloat(m[4]) : 1;
} else if ((m = input.match(/cmyk\((\d(?:\.\d+)?),\s?(\d(?:\.\d+)?),\s?(\d(?:\.\d+)?),\s?(\d(?:\.\d+)?)\)/i))) { } else if ((m = input.match(/cmyk\((\d(?:\.\d+)?),\s?(\d(?:\.\d+)?),\s?(\d(?:\.\d+)?),\s?(\d(?:\.\d+)?)\)/i))) {
// CMYK - cmyk(0.12, 0.04, 0.00, 0.03) // CMYK - cmyk(0.12, 0.04, 0.00, 0.03)
var c_ = parseFloat(m[1]), let c_ = parseFloat(m[1]),
m_ = parseFloat(m[2]), m_ = parseFloat(m[2]),
y_ = parseFloat(m[3]), y_ = parseFloat(m[3]),
k_ = parseFloat(m[4]); k_ = parseFloat(m[4]);
@ -198,21 +198,22 @@ const HTML = {
b = Math.round(255 * (1 - y_) * (1 - k_)); b = Math.round(255 * (1 - y_) * (1 - k_));
} }
var hsl_ = HTML._rgbToHsl(r, g, b), let hsl_ = HTML._rgbToHsl(r, g, b),
h = Math.round(hsl_[0] * 360), h = Math.round(hsl_[0] * 360),
s = Math.round(hsl_[1] * 100), s = Math.round(hsl_[1] * 100),
l = Math.round(hsl_[2] * 100), l = Math.round(hsl_[2] * 100),
k = 1 - Math.max(r/255, g/255, b/255), k = 1 - Math.max(r/255, g/255, b/255),
c = (1 - r/255 - k) / (1 - k), c = (1 - r/255 - k) / (1 - k),
m = (1 - g/255 - k) / (1 - k), // eslint-disable-line no-redeclare
y = (1 - b/255 - k) / (1 - k); y = (1 - b/255 - k) / (1 - k);
m = (1 - g/255 - k) / (1 - k);
c = isNaN(c) ? "0" : c.toFixed(2); c = isNaN(c) ? "0" : c.toFixed(2);
m = isNaN(m) ? "0" : m.toFixed(2); m = isNaN(m) ? "0" : m.toFixed(2);
y = isNaN(y) ? "0" : y.toFixed(2); y = isNaN(y) ? "0" : y.toFixed(2);
k = k.toFixed(2); k = k.toFixed(2);
var hex = "#" + let hex = "#" +
Utils.padLeft(Math.round(r).toString(16), 2) + Utils.padLeft(Math.round(r).toString(16), 2) +
Utils.padLeft(Math.round(g).toString(16), 2) + Utils.padLeft(Math.round(g).toString(16), 2) +
Utils.padLeft(Math.round(b).toString(16), 2), Utils.padLeft(Math.round(b).toString(16), 2),
@ -261,12 +262,12 @@ const HTML = {
* @return {Array} The RGB representation * @return {Array} The RGB representation
*/ */
_hslToRgb: function(h, s, l){ _hslToRgb: function(h, s, l){
var r, g, b; let r, g, b;
if (s === 0){ if (s === 0){
r = g = b = l; // achromatic r = g = b = l; // achromatic
} else { } else {
var hue2rgb = function hue2rgb(p, q, t) { const hue2rgb = function hue2rgb(p, q, t) {
if (t < 0) t += 1; if (t < 0) t += 1;
if (t > 1) t -= 1; if (t > 1) t -= 1;
if (t < 1/6) return p + (q - p) * 6 * t; if (t < 1/6) return p + (q - p) * 6 * t;
@ -275,8 +276,8 @@ const HTML = {
return p; return p;
}; };
var q = l < 0.5 ? l * (1 + s) : l + s - l * s; const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
var p = 2 * l - q; const p = 2 * l - q;
r = hue2rgb(p, q, h + 1/3); r = hue2rgb(p, q, h + 1/3);
g = hue2rgb(p, q, h); g = hue2rgb(p, q, h);
b = hue2rgb(p, q, h - 1/3); b = hue2rgb(p, q, h - 1/3);
@ -302,14 +303,14 @@ const HTML = {
*/ */
_rgbToHsl: function(r, g, b) { _rgbToHsl: function(r, g, b) {
r /= 255; g /= 255; b /= 255; r /= 255; g /= 255; b /= 255;
var max = Math.max(r, g, b), let max = Math.max(r, g, b),
min = Math.min(r, g, b), min = Math.min(r, g, b),
h, s, l = (max + min) / 2; h, s, l = (max + min) / 2;
if (max === min) { if (max === min) {
h = s = 0; // achromatic h = s = 0; // achromatic
} else { } else {
var d = max - min; const d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min); s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch (max) { switch (max) {
case r: h = (g - b) / d + (g < b ? 6 : 0); break; case r: h = (g - b) / d + (g < b ? 6 : 0); break;

View file

@ -20,7 +20,7 @@ const HTTP = {
* @returns {string} * @returns {string}
*/ */
runStripHeaders: function(input, args) { runStripHeaders: function(input, args) {
var headerEnd = input.indexOf("\r\n\r\n"); let headerEnd = input.indexOf("\r\n\r\n");
headerEnd = (headerEnd < 0) ? input.indexOf("\n\n") + 2 : headerEnd + 4; headerEnd = (headerEnd < 0) ? input.indexOf("\n\n") + 2 : headerEnd + 4;
return (headerEnd < 2) ? input : input.slice(headerEnd, input.length); return (headerEnd < 2) ? input : input.slice(headerEnd, input.length);
@ -35,7 +35,7 @@ const HTTP = {
* @returns {string} * @returns {string}
*/ */
runParseUserAgent: function(input, args) { runParseUserAgent: function(input, args) {
var ua = UAParser.parse(input); const ua = UAParser.parse(input);
return "Type: " + ua.type + "\n" + return "Type: " + ua.type + "\n" +
"Family: " + ua.uaFamily + "\n" + "Family: " + ua.uaFamily + "\n" +

View file

@ -144,7 +144,7 @@ const Hash = {
*/ */
runSHA3: function (input, args) { runSHA3: function (input, args) {
input = CryptoJS.enc.Latin1.parse(input); input = CryptoJS.enc.Latin1.parse(input);
var sha3Length = args[0], let sha3Length = args[0],
options = { options = {
outputLength: parseInt(sha3Length, 10) outputLength: parseInt(sha3Length, 10)
}; };
@ -179,9 +179,9 @@ const Hash = {
* @returns {string} * @returns {string}
*/ */
runHMAC: function (input, args) { runHMAC: function (input, args) {
var hashFunc = args[1]; const hashFunc = args[1];
input = CryptoJS.enc.Latin1.parse(input); input = CryptoJS.enc.Latin1.parse(input);
var execute = { const execute = {
"MD5": CryptoJS.HmacMD5(input, args[0]), "MD5": CryptoJS.HmacMD5(input, args[0]),
"SHA1": CryptoJS.HmacSHA1(input, args[0]), "SHA1": CryptoJS.HmacSHA1(input, args[0]),
"SHA224": CryptoJS.HmacSHA224(input, args[0]), "SHA224": CryptoJS.HmacSHA224(input, args[0]),
@ -203,7 +203,7 @@ const Hash = {
* @returns {string} * @returns {string}
*/ */
runAll: function (input, args) { runAll: function (input, args) {
var byteArray = Utils.strToByteArray(input), let byteArray = Utils.strToByteArray(input),
output = "MD2: " + Hash.runMD2(input, []) + output = "MD2: " + Hash.runMD2(input, []) +
"\nMD4: " + Hash.runMD4(input, []) + "\nMD4: " + Hash.runMD4(input, []) +
"\nMD5: " + Hash.runMD5(input, []) + "\nMD5: " + Hash.runMD5(input, []) +
@ -240,7 +240,7 @@ const Hash = {
runAnalyse: function(input, args) { runAnalyse: function(input, args) {
input = input.replace(/\s/g, ""); input = input.replace(/\s/g, "");
var output = "", let output = "",
byteLength = input.length / 2, byteLength = input.length / 2,
bitLength = byteLength * 8, bitLength = byteLength * 8,
possibleHashFunctions = []; possibleHashFunctions = [];

View file

@ -37,19 +37,19 @@ const Hexdump = {
* @returns {string} * @returns {string}
*/ */
runTo: function(input, args) { runTo: function(input, args) {
var length = args[0] || Hexdump.WIDTH; const length = args[0] || Hexdump.WIDTH;
var upperCase = args[1]; const upperCase = args[1];
var includeFinalLength = args[2]; const includeFinalLength = args[2];
var output = "", padding = 2; let output = "", padding = 2;
for (var i = 0; i < input.length; i += length) { for (let i = 0; i < input.length; i += length) {
var buff = input.slice(i, i+length); const buff = input.slice(i, i+length);
var hexa = ""; let hexa = "";
for (var j = 0; j < buff.length; j++) { for (let j = 0; j < buff.length; j++) {
hexa += Utils.hex(buff[j], padding) + " "; hexa += Utils.hex(buff[j], padding) + " ";
} }
var lineNo = Utils.hex(i, 8); let lineNo = Utils.hex(i, 8);
if (upperCase) { if (upperCase) {
hexa = hexa.toUpperCase(); hexa = hexa.toUpperCase();
@ -77,19 +77,19 @@ const Hexdump = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runFrom: function(input, args) { runFrom: function(input, args) {
var output = [], let output = [],
regex = /^\s*(?:[\dA-F]{4,16}:?)?\s*((?:[\dA-F]{2}\s){1,8}(?:\s|[\dA-F]{2}-)(?:[\dA-F]{2}\s){1,8}|(?:[\dA-F]{2}\s|[\dA-F]{4}\s)+)/igm, regex = /^\s*(?:[\dA-F]{4,16}:?)?\s*((?:[\dA-F]{2}\s){1,8}(?:\s|[\dA-F]{2}-)(?:[\dA-F]{2}\s){1,8}|(?:[\dA-F]{2}\s|[\dA-F]{4}\s)+)/igm,
block, line; block, line;
while ((block = regex.exec(input))) { while ((block = regex.exec(input))) {
line = Utils.fromHex(block[1].replace(/-/g, " ")); line = Utils.fromHex(block[1].replace(/-/g, " "));
for (var i = 0; i < line.length; i++) { for (let i = 0; i < line.length; i++) {
output.push(line[i]); output.push(line[i]);
} }
} }
// Is this a CyberChef hexdump or is it from a different tool? // Is this a CyberChef hexdump or is it from a different tool?
var width = input.indexOf("\n"); const width = input.indexOf("\n");
var w = (width - 13) / 4; const w = (width - 13) / 4;
// w should be the specified width of the hexdump and therefore a round number // w should be the specified width of the hexdump and therefore a round number
if (Math.floor(w) !== w || input.indexOf("\r") !== -1 || output.indexOf(13) !== -1) { if (Math.floor(w) !== w || input.indexOf("\r") !== -1 || output.indexOf(13) !== -1) {
if (app) app.options.attemptHighlight = false; if (app) app.options.attemptHighlight = false;
@ -109,7 +109,7 @@ const Hexdump = {
*/ */
highlightTo: function(pos, args) { highlightTo: function(pos, args) {
// Calculate overall selection // Calculate overall selection
var w = args[0] || 16, let w = args[0] || 16,
width = 14 + (w*4), width = 14 + (w*4),
line = Math.floor(pos[0].start / w), line = Math.floor(pos[0].start / w),
offset = pos[0].start % w, offset = pos[0].start % w,
@ -127,8 +127,8 @@ const Hexdump = {
pos[0].end = line*width + 10 + offset*3 - 1; pos[0].end = line*width + 10 + offset*3 - 1;
// Set up multiple selections for bytes // Set up multiple selections for bytes
var startLineNum = Math.floor(pos[0].start / width); let startLineNum = Math.floor(pos[0].start / width);
var endLineNum = Math.floor(pos[0].end / width); const endLineNum = Math.floor(pos[0].end / width);
if (startLineNum === endLineNum) { if (startLineNum === endLineNum) {
pos.push(pos[0]); pos.push(pos[0]);
@ -146,10 +146,10 @@ const Hexdump = {
} }
// Set up multiple selections for ASCII // Set up multiple selections for ASCII
var len = pos.length, lineNum = 0; let len = pos.length, lineNum = 0;
start = 0; start = 0;
end = 0; end = 0;
for (var i = 1; i < len; i++) { for (let i = 1; i < len; i++) {
lineNum = Math.floor(pos[i].start / width); lineNum = Math.floor(pos[i].start / width);
start = (((pos[i].start - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); start = (((pos[i].start - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width);
end = (((pos[i].end + 1 - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); end = (((pos[i].end + 1 - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width);
@ -169,11 +169,11 @@ const Hexdump = {
* @returns {Object[]} pos * @returns {Object[]} pos
*/ */
highlightFrom: function(pos, args) { highlightFrom: function(pos, args) {
var w = args[0] || 16; const w = args[0] || 16;
var width = 14 + (w*4); const width = 14 + (w*4);
var line = Math.floor(pos[0].start / width); let line = Math.floor(pos[0].start / width);
var offset = pos[0].start % width; let offset = pos[0].start % width;
if (offset < 10) { // In line number section if (offset < 10) { // In line number section
pos[0].start = line*w; pos[0].start = line*w;

View file

@ -38,12 +38,12 @@ const IP = {
* @returns {string} * @returns {string}
*/ */
runParseIpRange: function (input, args) { runParseIpRange: function (input, args) {
var includeNetworkInfo = args[0], let includeNetworkInfo = args[0],
enumerateAddresses = args[1], enumerateAddresses = args[1],
allowLargeList = args[2]; allowLargeList = args[2];
// Check what type of input we are looking at // Check what type of input we are looking at
var ipv4CidrRegex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\/(\d\d?)\s*$/, let ipv4CidrRegex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\/(\d\d?)\s*$/,
ipv4RangeRegex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\s*-\s*((?:\d{1,3}\.){3}\d{1,3})\s*$/, ipv4RangeRegex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\s*-\s*((?:\d{1,3}\.){3}\d{1,3})\s*$/,
ipv6CidrRegex = /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\/(\d\d?\d?)\s*$/i, ipv6CidrRegex = /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\/(\d\d?\d?)\s*$/i,
ipv6RangeRegex = /^\s*(((?=.*::)(?!.*::[^-]+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*-\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\17)::|:\b|(?![\dA-F])))|(?!\16\17)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i, ipv6RangeRegex = /^\s*(((?=.*::)(?!.*::[^-]+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*-\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\17)::|:\b|(?![\dA-F])))|(?!\16\17)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i,
@ -82,11 +82,11 @@ const IP = {
* @returns {string} * @returns {string}
*/ */
runParseIPv6: function (input, args) { runParseIPv6: function (input, args) {
var match, let match,
output = ""; output = "";
if ((match = IP.IPV6_REGEX.exec(input))) { if ((match = IP.IPV6_REGEX.exec(input))) {
var ipv6 = IP._strToIpv6(match[1]), let ipv6 = IP._strToIpv6(match[1]),
longhand = IP._ipv6ToStr(ipv6), longhand = IP._ipv6ToStr(ipv6),
shorthand = IP._ipv6ToStr(ipv6, true); shorthand = IP._ipv6ToStr(ipv6, true);
@ -126,7 +126,7 @@ const IP = {
} else if (ipv6[0] === 0x2001 && ipv6[1] === 0) { } else if (ipv6[0] === 0x2001 && ipv6[1] === 0) {
// Teredo tunneling // Teredo tunneling
output += "\nTeredo tunneling IPv6 address detected\n"; output += "\nTeredo tunneling IPv6 address detected\n";
var serverIpv4 = (ipv6[2] << 16) + ipv6[3], let serverIpv4 = (ipv6[2] << 16) + ipv6[3],
udpPort = (~ipv6[5]) & 0xffff, udpPort = (~ipv6[5]) & 0xffff,
clientIpv4 = ~((ipv6[6] << 16) + ipv6[7]), clientIpv4 = ~((ipv6[6] << 16) + ipv6[7]),
flagCone = (ipv6[4] >>> 15) & 1, flagCone = (ipv6[4] >>> 15) & 1,
@ -190,7 +190,7 @@ const IP = {
output += "\n6to4 transition IPv6 address detected. See RFC 3056 for more details." + output += "\n6to4 transition IPv6 address detected. See RFC 3056 for more details." +
"\n6to4 prefix range: 2002::/16"; "\n6to4 prefix range: 2002::/16";
var v4Addr = IP._ipv4ToStr((ipv6[1] << 16) + ipv6[2]), let v4Addr = IP._ipv4ToStr((ipv6[1] << 16) + ipv6[2]),
slaId = ipv6[3], slaId = ipv6[3],
interfaceIdStr = ipv6[4].toString(16) + ipv6[5].toString(16) + ipv6[6].toString(16) + ipv6[7].toString(16), interfaceIdStr = ipv6[4].toString(16) + ipv6[5].toString(16) + ipv6[6].toString(16) + ipv6[7].toString(16),
interfaceId = new BigInteger(interfaceIdStr, 16); interfaceId = new BigInteger(interfaceIdStr, 16);
@ -218,7 +218,7 @@ const IP = {
if ((ipv6[5] & 0xff === 0xff) && (ipv6[6] >>> 8 === 0xfe)) { if ((ipv6[5] & 0xff === 0xff) && (ipv6[6] >>> 8 === 0xfe)) {
output += "\n\nThis IPv6 address contains a modified EUI-64 address, identified by the presence of FF:FE in the 12th and 13th octets."; output += "\n\nThis IPv6 address contains a modified EUI-64 address, identified by the presence of FF:FE in the 12th and 13th octets.";
var intIdent = Utils.hex(ipv6[4] >>> 8) + ":" + Utils.hex(ipv6[4] & 0xff) + ":" + let intIdent = Utils.hex(ipv6[4] >>> 8) + ":" + Utils.hex(ipv6[4] & 0xff) + ":" +
Utils.hex(ipv6[5] >>> 8) + ":" + Utils.hex(ipv6[5] & 0xff) + ":" + Utils.hex(ipv6[5] >>> 8) + ":" + Utils.hex(ipv6[5] & 0xff) + ":" +
Utils.hex(ipv6[6] >>> 8) + ":" + Utils.hex(ipv6[6] & 0xff) + ":" + Utils.hex(ipv6[6] >>> 8) + ":" + Utils.hex(ipv6[6] & 0xff) + ":" +
Utils.hex(ipv6[7] >>> 8) + ":" + Utils.hex(ipv6[7] & 0xff), Utils.hex(ipv6[7] >>> 8) + ":" + Utils.hex(ipv6[7] & 0xff),
@ -249,16 +249,18 @@ const IP = {
* @returns {string} * @returns {string}
*/ */
runChangeIpFormat: function(input, args) { runChangeIpFormat: function(input, args) {
var inFormat = args[0], let inFormat = args[0],
outFormat = args[1], outFormat = args[1],
lines = input.split("\n"), lines = input.split("\n"),
output = "", output = "",
j = 0; j = 0;
for (var i = 0; i < lines.length; i++) { for (let i = 0; i < lines.length; i++) {
if (lines[i] === "") continue; if (lines[i] === "") continue;
var baIp = []; let baIp = [];
let octets;
let decimal;
if (inFormat === outFormat) { if (inFormat === outFormat) {
output += lines[i] + "\n"; output += lines[i] + "\n";
@ -268,13 +270,13 @@ const IP = {
// Convert to byte array IP from input format // Convert to byte array IP from input format
switch (inFormat) { switch (inFormat) {
case "Dotted Decimal": case "Dotted Decimal":
var octets = lines[i].split("."); octets = lines[i].split(".");
for (j = 0; j < octets.length; j++) { for (j = 0; j < octets.length; j++) {
baIp.push(parseInt(octets[j], 10)); baIp.push(parseInt(octets[j], 10));
} }
break; break;
case "Decimal": case "Decimal":
var decimal = lines[i].toString(); decimal = lines[i].toString();
baIp.push(decimal >> 24 & 255); baIp.push(decimal >> 24 & 255);
baIp.push(decimal >> 16 & 255); baIp.push(decimal >> 16 & 255);
baIp.push(decimal >> 8 & 255); baIp.push(decimal >> 8 & 255);
@ -287,21 +289,25 @@ const IP = {
throw "Unsupported input IP format"; throw "Unsupported input IP format";
} }
let ddIp;
let decIp;
let hexIp;
// Convert byte array IP to output format // Convert byte array IP to output format
switch (outFormat) { switch (outFormat) {
case "Dotted Decimal": case "Dotted Decimal":
var ddIp = ""; ddIp = "";
for (j = 0; j < baIp.length; j++) { for (j = 0; j < baIp.length; j++) {
ddIp += baIp[j] + "."; ddIp += baIp[j] + ".";
} }
output += ddIp.slice(0, ddIp.length-1) + "\n"; output += ddIp.slice(0, ddIp.length-1) + "\n";
break; break;
case "Decimal": case "Decimal":
var decIp = ((baIp[0] << 24) | (baIp[1] << 16) | (baIp[2] << 8) | baIp[3]) >>> 0; decIp = ((baIp[0] << 24) | (baIp[1] << 16) | (baIp[2] << 8) | baIp[3]) >>> 0;
output += decIp.toString() + "\n"; output += decIp.toString() + "\n";
break; break;
case "Hex": case "Hex":
var hexIp = ""; hexIp = "";
for (j = 0; j < baIp.length; j++) { for (j = 0; j < baIp.length; j++) {
hexIp += Utils.hex(baIp[j]); hexIp += Utils.hex(baIp[j]);
} }
@ -340,7 +346,7 @@ const IP = {
* @returns {string} * @returns {string}
*/ */
runGroupIps: function(input, args) { runGroupIps: function(input, args) {
var delim = Utils.charRep[args[0]], let delim = Utils.charRep[args[0]],
cidr = args[1], cidr = args[1],
onlySubnets = args[2], onlySubnets = args[2],
ipv4Mask = cidr < 32 ? ~(0xFFFFFFFF >>> cidr) : 0xFFFFFFFF, ipv4Mask = cidr < 32 ? ~(0xFFFFFFFF >>> cidr) : 0xFFFFFFFF,
@ -352,14 +358,15 @@ const IP = {
output = "", output = "",
ip = null, ip = null,
network = null, network = null,
networkStr = ""; networkStr = "",
i;
if (cidr < 0 || cidr > 127) { if (cidr < 0 || cidr > 127) {
return "CIDR must be less than 32 for IPv4 or 128 for IPv6"; return "CIDR must be less than 32 for IPv4 or 128 for IPv6";
} }
// Parse all IPs and add to network dictionary // Parse all IPs and add to network dictionary
for (var i = 0; i < ips.length; i++) { for (i = 0; i < ips.length; i++) {
if ((match = IP.IPV4_REGEX.exec(ips[i]))) { if ((match = IP.IPV4_REGEX.exec(ips[i]))) {
ip = IP._strToIpv4(match[1]) >>> 0; ip = IP._strToIpv4(match[1]) >>> 0;
network = ip & ipv4Mask; network = ip & ipv4Mask;
@ -374,7 +381,7 @@ const IP = {
network = []; network = [];
networkStr = ""; networkStr = "";
for (var j = 0; j < 8; j++) { for (let j = 0; j < 8; j++) {
network.push(ip[j] & ipv6Mask[j]); network.push(ip[j] & ipv6Mask[j]);
} }
@ -434,7 +441,7 @@ const IP = {
* @returns {html} * @returns {html}
*/ */
runParseIPv4Header: function(input, args) { runParseIPv4Header: function(input, args) {
var format = args[0], let format = args[0],
output; output;
if (format === "Hex") { if (format === "Hex") {
@ -445,7 +452,7 @@ const IP = {
return "Unrecognised input format."; return "Unrecognised input format.";
} }
var version = (input[0] >>> 4) & 0x0f, let version = (input[0] >>> 4) & 0x0f,
ihl = input[0] & 0x0f, ihl = input[0] & 0x0f,
dscp = (input[1] >>> 2) & 0x3f, dscp = (input[1] >>> 2) & 0x3f,
ecn = input[1] & 0x03, ecn = input[1] & 0x03,
@ -471,15 +478,15 @@ const IP = {
ihl = ihl + " (Error: this should always be at least 5)"; ihl = ihl + " (Error: this should always be at least 5)";
} else if (ihl > 5) { } else if (ihl > 5) {
// sort out options... // sort out options...
var optionsLen = ihl * 4 - 20; const optionsLen = ihl * 4 - 20;
options = input.slice(20, optionsLen + 20); options = input.slice(20, optionsLen + 20);
} }
// Protocol // Protocol
var protocolInfo = IP._protocolLookup[protocol] || {keyword: "", protocol: ""}; const protocolInfo = IP._protocolLookup[protocol] || {keyword: "", protocol: ""};
// Checksum // Checksum
var correctChecksum = Checksum.runTCPIP(checksumHeader, []), let correctChecksum = Checksum.runTCPIP(checksumHeader, []),
givenChecksum = Utils.hex(checksum), givenChecksum = Utils.hex(checksum),
checksumResult; checksumResult;
if (correctChecksum === givenChecksum) { if (correctChecksum === givenChecksum) {
@ -534,7 +541,7 @@ const IP = {
* @returns {string} * @returns {string}
*/ */
_ipv4CidrRange: function(cidr, includeNetworkInfo, enumerateAddresses, allowLargeList) { _ipv4CidrRange: function(cidr, includeNetworkInfo, enumerateAddresses, allowLargeList) {
var output = "", let output = "",
network = IP._strToIpv4(cidr[1]), network = IP._strToIpv4(cidr[1]),
cidrRange = parseInt(cidr[2], 10); cidrRange = parseInt(cidr[2], 10);
@ -542,7 +549,7 @@ const IP = {
return "IPv4 CIDR must be less than 32"; return "IPv4 CIDR must be less than 32";
} }
var mask = ~(0xFFFFFFFF >>> cidrRange), let mask = ~(0xFFFFFFFF >>> cidrRange),
ip1 = network & mask, ip1 = network & mask,
ip2 = ip1 | ~mask; ip2 = ip1 | ~mask;
@ -574,7 +581,7 @@ const IP = {
* @returns {string} * @returns {string}
*/ */
_ipv6CidrRange: function(cidr, includeNetworkInfo) { _ipv6CidrRange: function(cidr, includeNetworkInfo) {
var output = "", let output = "",
network = IP._strToIpv6(cidr[1]), network = IP._strToIpv6(cidr[1]),
cidrRange = parseInt(cidr[cidr.length-1], 10); cidrRange = parseInt(cidr[cidr.length-1], 10);
@ -582,19 +589,19 @@ const IP = {
return "IPv6 CIDR must be less than 128"; return "IPv6 CIDR must be less than 128";
} }
var mask = IP._genIpv6Mask(cidrRange), let mask = IP._genIpv6Mask(cidrRange),
ip1 = new Array(8), ip1 = new Array(8),
ip2 = new Array(8), ip2 = new Array(8),
totalDiff = "", totalDiff = "",
total = new Array(128); total = new Array(128);
for (var i = 0; i < 8; i++) { for (let i = 0; i < 8; i++) {
ip1[i] = network[i] & mask[i]; ip1[i] = network[i] & mask[i];
ip2[i] = ip1[i] | (~mask[i] & 0x0000FFFF); ip2[i] = ip1[i] | (~mask[i] & 0x0000FFFF);
totalDiff = (ip2[i] - ip1[i]).toString(2); totalDiff = (ip2[i] - ip1[i]).toString(2);
if (totalDiff !== "0") { if (totalDiff !== "0") {
for (var n = 0; n < totalDiff.length; n++) { for (let n = 0; n < totalDiff.length; n++) {
total[i*16 + 16-(totalDiff.length-n)] = totalDiff[n]; total[i*16 + 16-(totalDiff.length-n)] = totalDiff[n];
} }
} }
@ -621,10 +628,10 @@ const IP = {
* @returns {number[]} * @returns {number[]}
*/ */
_genIpv6Mask: function(cidr) { _genIpv6Mask: function(cidr) {
var mask = new Array(8), let mask = new Array(8),
shift; shift;
for (var i = 0; i < 8; i++) { for (let i = 0; i < 8; i++) {
if (cidr > ((i+1)*16)) { if (cidr > ((i+1)*16)) {
mask[i] = 0x0000FFFF; mask[i] = 0x0000FFFF;
} else { } else {
@ -650,12 +657,12 @@ const IP = {
* @returns {string} * @returns {string}
*/ */
_ipv4HyphenatedRange: function(range, includeNetworkInfo, enumerateAddresses, allowLargeList) { _ipv4HyphenatedRange: function(range, includeNetworkInfo, enumerateAddresses, allowLargeList) {
var output = "", let output = "",
ip1 = IP._strToIpv4(range[1]), ip1 = IP._strToIpv4(range[1]),
ip2 = IP._strToIpv4(range[2]); ip2 = IP._strToIpv4(range[2]);
// Calculate mask // Calculate mask
var diff = ip1 ^ ip2, let diff = ip1 ^ ip2,
cidr = 32, cidr = 32,
mask = 0; mask = 0;
@ -666,7 +673,7 @@ const IP = {
} }
mask = ~mask >>> 0; mask = ~mask >>> 0;
var network = ip1 & mask, let network = ip1 & mask,
subIp1 = network & mask, subIp1 = network & mask,
subIp2 = subIp1 | ~mask; subIp2 = subIp1 | ~mask;
@ -701,21 +708,18 @@ const IP = {
* @returns {string} * @returns {string}
*/ */
_ipv6HyphenatedRange: function(range, includeNetworkInfo) { _ipv6HyphenatedRange: function(range, includeNetworkInfo) {
var output = "", let output = "",
ip1 = IP._strToIpv6(range[1]), ip1 = IP._strToIpv6(range[1]),
ip2 = IP._strToIpv6(range[14]); ip2 = IP._strToIpv6(range[14]);
var t = "", let t = "",
total = new Array(128); total = new Array(128).fill(),
i;
// Initialise total array to "0"
for (var i = 0; i < 128; i++)
total[i] = "0";
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
t = (ip2[i] - ip1[i]).toString(2); t = (ip2[i] - ip1[i]).toString(2);
if (t !== "0") { if (t !== "0") {
for (var n = 0; n < t.length; n++) { for (let n = 0; n < t.length; n++) {
total[i*16 + 16-(t.length-n)] = t[n]; total[i*16 + 16-(t.length-n)] = t[n];
} }
} }
@ -743,7 +747,7 @@ const IP = {
* IP._strToIpv4("10.10.0.0"); * IP._strToIpv4("10.10.0.0");
*/ */
_strToIpv4: function (ipStr) { _strToIpv4: function (ipStr) {
var blocks = ipStr.split("."), let blocks = ipStr.split("."),
numBlocks = parseBlocks(blocks), numBlocks = parseBlocks(blocks),
result = 0; result = 0;
@ -761,8 +765,8 @@ const IP = {
if (blocks.length !== 4) if (blocks.length !== 4)
throw "More than 4 blocks."; throw "More than 4 blocks.";
var numBlocks = []; const numBlocks = [];
for (var i = 0; i < 4; i++) { for (let i = 0; i < 4; i++) {
numBlocks[i] = parseInt(blocks[i], 10); numBlocks[i] = parseInt(blocks[i], 10);
if (numBlocks[i] < 0 || numBlocks[i] > 255) if (numBlocks[i] < 0 || numBlocks[i] > 255)
throw "Block out of range."; throw "Block out of range.";
@ -784,7 +788,7 @@ const IP = {
* IP._ipv4ToStr(168427520); * IP._ipv4ToStr(168427520);
*/ */
_ipv4ToStr: function(ipInt) { _ipv4ToStr: function(ipInt) {
var blockA = (ipInt >> 24) & 255, let blockA = (ipInt >> 24) & 255,
blockB = (ipInt >> 16) & 255, blockB = (ipInt >> 16) & 255,
blockC = (ipInt >> 8) & 255, blockC = (ipInt >> 8) & 255,
blockD = ipInt & 255; blockD = ipInt & 255;
@ -805,12 +809,12 @@ const IP = {
* IP._strToIpv6("ff00::1111:2222"); * IP._strToIpv6("ff00::1111:2222");
*/ */
_strToIpv6: function(ipStr) { _strToIpv6: function(ipStr) {
var blocks = ipStr.split(":"), let blocks = ipStr.split(":"),
numBlocks = parseBlocks(blocks), numBlocks = parseBlocks(blocks),
j = 0, j = 0,
ipv6 = new Array(8); ipv6 = new Array(8);
for (var i = 0; i < 8; i++) { for (let i = 0; i < 8; i++) {
if (isNaN(numBlocks[j])) { if (isNaN(numBlocks[j])) {
ipv6[i] = 0; ipv6[i] = 0;
if (i === (8-numBlocks.slice(j).length)) j++; if (i === (8-numBlocks.slice(j).length)) j++;
@ -827,8 +831,8 @@ const IP = {
function parseBlocks(blocks) { function parseBlocks(blocks) {
if (blocks.length < 3 || blocks.length > 8) if (blocks.length < 3 || blocks.length > 8)
throw "Badly formatted IPv6 address."; throw "Badly formatted IPv6 address.";
var numBlocks = []; const numBlocks = [];
for (var i = 0; i < blocks.length; i++) { for (let i = 0; i < blocks.length; i++) {
numBlocks[i] = parseInt(blocks[i], 16); numBlocks[i] = parseInt(blocks[i], 16);
if (numBlocks[i] < 0 || numBlocks[i] > 65535) if (numBlocks[i] < 0 || numBlocks[i] > 65535)
throw "Block out of range."; throw "Block out of range.";
@ -854,11 +858,11 @@ const IP = {
* IP._ipv6ToStr([65280, 0, 0, 0, 0, 0, 4369, 8738], false); * IP._ipv6ToStr([65280, 0, 0, 0, 0, 0, 4369, 8738], false);
*/ */
_ipv6ToStr: function(ipv6, compact) { _ipv6ToStr: function(ipv6, compact) {
var output = "", let output = "",
i = 0; i = 0;
if (compact) { if (compact) {
var start = -1, let start = -1,
end = -1, end = -1,
s = 0, s = 0,
e = -1; e = -1;
@ -908,7 +912,7 @@ const IP = {
* IP._generateIpv4Range(1, 3); * IP._generateIpv4Range(1, 3);
*/ */
_generateIpv4Range: function(ip, endIp) { _generateIpv4Range: function(ip, endIp) {
var range = []; const range = [];
if (endIp >= ip) { if (endIp >= ip) {
for (; ip <= endIp; ip++) { for (; ip <= endIp; ip++) {
range.push(IP._ipv4ToStr(ip)); range.push(IP._ipv4ToStr(ip));

View file

@ -48,7 +48,7 @@ const JS = {
* @returns {string} * @returns {string}
*/ */
runParse: function (input, args) { runParse: function (input, args) {
var parseLoc = args[0], let parseLoc = args[0],
parseRange = args[1], parseRange = args[1],
parseTokens = args[2], parseTokens = args[2],
parseComment = args[3], parseComment = args[3],
@ -96,7 +96,7 @@ const JS = {
* @returns {string} * @returns {string}
*/ */
runBeautify: function(input, args) { runBeautify: function(input, args) {
var beautifyIndent = args[0] || JS.BEAUTIFY_INDENT, let beautifyIndent = args[0] || JS.BEAUTIFY_INDENT,
quotes = args[1].toLowerCase(), quotes = args[1].toLowerCase(),
beautifySemicolons = args[2], beautifySemicolons = args[2],
beautifyComment = args[3], beautifyComment = args[3],
@ -110,7 +110,7 @@ const JS = {
comment: true comment: true
}); });
var options = { const options = {
format: { format: {
indent: { indent: {
style: beautifyIndent style: beautifyIndent
@ -141,7 +141,7 @@ const JS = {
* @returns {string} * @returns {string}
*/ */
runMinify: function(input, args) { runMinify: function(input, args) {
var result = "", let result = "",
AST = esprima.parse(input), AST = esprima.parse(input),
optimisedAST = esmangle.optimize(AST, null), optimisedAST = esmangle.optimize(AST, null),
mangledAST = esmangle.mangle(optimisedAST); mangledAST = esmangle.mangle(optimisedAST);

View file

@ -45,7 +45,7 @@ const MAC = {
runFormat: function(input, args) { runFormat: function(input, args) {
if (!input) return ""; if (!input) return "";
var outputCase = args[0], let outputCase = args[0],
noDelim = args[1], noDelim = args[1],
dashDelim = args[2], dashDelim = args[2],
colonDelim = args[3], colonDelim = args[3],
@ -54,7 +54,7 @@ const MAC = {
macs = input.toLowerCase().split(/[,\s\r\n]+/); macs = input.toLowerCase().split(/[,\s\r\n]+/);
macs.forEach(function(mac) { macs.forEach(function(mac) {
var cleanMac = mac.replace(/[:.-]+/g, ""), let cleanMac = mac.replace(/[:.-]+/g, ""),
macHyphen = cleanMac.replace(/(.{2}(?=.))/g, "$1-"), macHyphen = cleanMac.replace(/(.{2}(?=.))/g, "$1-"),
macColon = cleanMac.replace(/(.{2}(?=.))/g, "$1:"), macColon = cleanMac.replace(/(.{2}(?=.))/g, "$1:"),
macCisco = cleanMac.replace(/(.{4}(?=.))/g, "$1."); macCisco = cleanMac.replace(/(.{4}(?=.))/g, "$1.");

View file

@ -97,19 +97,19 @@ const MorseCode = {
* @returns {string} * @returns {string}
*/ */
runTo: function(input, args) { runTo: function(input, args) {
var format = args[0].split("/"); const format = args[0].split("/");
var dash = format[0]; const dash = format[0];
var dot = format[1]; const dot = format[1];
var letterDelim = Utils.charRep[args[1]]; const letterDelim = Utils.charRep[args[1]];
var wordDelim = Utils.charRep[args[2]]; const wordDelim = Utils.charRep[args[2]];
input = input.split(/\r?\n/); input = input.split(/\r?\n/);
input = Array.prototype.map.call(input, function(line) { input = Array.prototype.map.call(input, function(line) {
var words = line.split(/ +/); let words = line.split(/ +/);
words = Array.prototype.map.call(words, function(word) { words = Array.prototype.map.call(words, function(word) {
var letters = Array.prototype.map.call(word, function(character) { const letters = Array.prototype.map.call(word, function(character) {
var letter = character.toUpperCase(); const letter = character.toUpperCase();
if (typeof MorseCode.MORSE_TABLE[letter] == "undefined") { if (typeof MorseCode.MORSE_TABLE[letter] == "undefined") {
return ""; return "";
} }
@ -148,12 +148,12 @@ const MorseCode = {
* @returns {string} * @returns {string}
*/ */
runFrom: (function() { runFrom: (function() {
var reversedTable = null; let reversedTable = null;
var reverseTable = function() { const reverseTable = function() {
reversedTable = {}; reversedTable = {};
for (var letter in MorseCode.MORSE_TABLE) { for (const letter in MorseCode.MORSE_TABLE) {
var signal = MorseCode.MORSE_TABLE[letter]; const signal = MorseCode.MORSE_TABLE[letter];
reversedTable[signal] = letter; reversedTable[signal] = letter;
} }
}; };
@ -163,17 +163,17 @@ const MorseCode = {
reverseTable(); reverseTable();
} }
var letterDelim = Utils.charRep[args[0]]; const letterDelim = Utils.charRep[args[0]];
var wordDelim = Utils.charRep[args[1]]; const wordDelim = Utils.charRep[args[1]];
input = input.replace(/-|||_||—|dash/ig, "<dash>"); //hyphen-minus|hyphen|minus-sign|undersore|en-dash|em-dash input = input.replace(/-|||_||—|dash/ig, "<dash>"); //hyphen-minus|hyphen|minus-sign|undersore|en-dash|em-dash
input = input.replace(/\.|·|dot/ig, "<dot>"); input = input.replace(/\.|·|dot/ig, "<dot>");
var words = input.split(wordDelim); let words = input.split(wordDelim);
words = Array.prototype.map.call(words, function(word) { words = Array.prototype.map.call(words, function(word) {
var signals = word.split(letterDelim); const signals = word.split(letterDelim);
var letters = signals.map(function(signal) { const letters = signals.map(function(signal) {
return reversedTable[signal]; return reversedTable[signal];
}); });

View file

@ -23,10 +23,10 @@ const NetBIOS = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runEncodeName: function(input, args) { runEncodeName: function(input, args) {
var output = [], let output = [],
offset = args[0]; offset = args[0];
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
output.push((input[i] >> 4) + offset); output.push((input[i] >> 4) + offset);
output.push((input[i] & 0xf) + offset); output.push((input[i] & 0xf) + offset);
} }
@ -43,10 +43,10 @@ const NetBIOS = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runDecodeName: function(input, args) { runDecodeName: function(input, args) {
var output = [], let output = [],
offset = args[0]; offset = args[0];
for (var i = 0; i < input.length; i += 2) { for (let i = 0; i < input.length; i += 2) {
output.push(((input[i] - offset) << 4) | output.push(((input[i] - offset) << 4) |
((input[i + 1] - offset) & 0xf)); ((input[i + 1] - offset) & 0xf));
} }

View file

@ -15,7 +15,7 @@ const Numberwang = {
*/ */
run: function(input, args) { run: function(input, args) {
if (!input) return "Let's play Wangernumb!"; if (!input) return "Let's play Wangernumb!";
var match = input.match(/\d+/); const match = input.match(/\d+/);
if (match) { if (match) {
return match[0] + "! That's Numberwang!"; return match[0] + "! That's Numberwang!";
} else { } else {

View file

@ -17,7 +17,7 @@ const OS = {
* @returns {string} * @returns {string}
*/ */
runParseUnixPerms: function(input, args) { runParseUnixPerms: function(input, args) {
var perms = { let perms = {
d : false, // directory d : false, // directory
sl : false, // symbolic link sl : false, // symbolic link
np : false, // named pipe np : false, // named pipe
@ -202,7 +202,7 @@ const OS = {
* @returns {string} * @returns {string}
*/ */
_permsToStr: function(perms) { _permsToStr: function(perms) {
var str = "", let str = "",
type = "-"; type = "-";
if (perms.d) type = "d"; if (perms.d) type = "d";
@ -263,7 +263,7 @@ const OS = {
* @returns {string} * @returns {string}
*/ */
_permsToOctal: function(perms) { _permsToOctal: function(perms) {
var d = 0, let d = 0,
u = 0, u = 0,
g = 0, g = 0,
o = 0; o = 0;

View file

@ -27,7 +27,7 @@ const PublicKey = {
* @returns {string} * @returns {string}
*/ */
runParseX509: function (input, args) { runParseX509: function (input, args) {
var cert = new r.X509(), let cert = new r.X509(),
inputFormat = args[0]; inputFormat = args[0];
if (!input.length) { if (!input.length) {
@ -56,7 +56,7 @@ const PublicKey = {
throw "Undefined input format"; throw "Undefined input format";
} }
var version = r.ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 0, 0]), let version = r.ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 0, 0]),
sn = cert.getSerialNumberHex(), sn = cert.getSerialNumberHex(),
algorithm = r.KJUR.asn1.x509.OID.oid2name(r.KJUR.asn1.ASN1Util.oidHexToInt(r.ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 2, 0]))), algorithm = r.KJUR.asn1.x509.OID.oid2name(r.KJUR.asn1.ASN1Util.oidHexToInt(r.ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 2, 0]))),
issuer = cert.getIssuerString(), issuer = cert.getIssuerString(),
@ -124,15 +124,22 @@ const PublicKey = {
} }
// Signature fields // Signature fields
if (r.ASN1HEX.dump(certSig).indexOf("SEQUENCE") === 0) { // DSA or ECDSA let breakoutSig = false;
try {
breakoutSig = r.ASN1HEX.dump(certSig).indexOf("SEQUENCE") === 0;
} catch (err) {
// Error processing signature, output without further breakout
}
if (breakoutSig) { // DSA or ECDSA
sigStr = " r: " + PublicKey._formatByteStr(r.ASN1HEX.getDecendantHexVByNthList(certSig, 0, [0]), 16, 18) + "\n" + sigStr = " r: " + PublicKey._formatByteStr(r.ASN1HEX.getDecendantHexVByNthList(certSig, 0, [0]), 16, 18) + "\n" +
" s: " + PublicKey._formatByteStr(r.ASN1HEX.getDecendantHexVByNthList(certSig, 0, [1]), 16, 18) + "\n"; " s: " + PublicKey._formatByteStr(r.ASN1HEX.getDecendantHexVByNthList(certSig, 0, [1]), 16, 18) + "\n";
} else { // RSA } else { // RSA or unknown
sigStr = " Signature: " + PublicKey._formatByteStr(certSig, 16, 18) + "\n"; sigStr = " Signature: " + PublicKey._formatByteStr(certSig, 16, 18) + "\n";
} }
// Format Public Key fields // Format Public Key fields
for (var i = 0; i < pkFields.length; i++) { for (let i = 0; i < pkFields.length; i++) {
pkStr += " " + pkFields[i].key + ":" + pkStr += " " + pkFields[i].key + ":" +
Utils.padLeft( Utils.padLeft(
pkFields[i].value + "\n", pkFields[i].value + "\n",
@ -141,12 +148,12 @@ const PublicKey = {
); );
} }
var issuerStr = PublicKey._formatDnStr(issuer, 2), let issuerStr = PublicKey._formatDnStr(issuer, 2),
nbDate = PublicKey._formatDate(notBefore), nbDate = PublicKey._formatDate(notBefore),
naDate = PublicKey._formatDate(notAfter), naDate = PublicKey._formatDate(notAfter),
subjectStr = PublicKey._formatDnStr(subject, 2); subjectStr = PublicKey._formatDnStr(subject, 2);
var output = "Version: " + (parseInt(version, 16) + 1) + " (0x" + version + ")\n" + const output = "Version: " + (parseInt(version, 16) + 1) + " (0x" + version + ")\n" +
"Serial number: " + new r.BigInteger(sn, 16).toString() + " (0x" + sn + ")\n" + "Serial number: " + new r.BigInteger(sn, 16).toString() + " (0x" + sn + ")\n" +
"Algorithm ID: " + algorithm + "\n" + "Algorithm ID: " + algorithm + "\n" +
"Validity\n" + "Validity\n" +
@ -245,7 +252,7 @@ const PublicKey = {
* @returns {string} * @returns {string}
*/ */
runParseAsn1HexString: function(input, args) { runParseAsn1HexString: function(input, args) {
var truncateLen = args[1], let truncateLen = args[1],
index = args[0]; index = args[0];
return r.ASN1HEX.dump(input.replace(/\s/g, ""), { return r.ASN1HEX.dump(input.replace(/\s/g, ""), {
"ommitLongOctet": truncateLen "ommitLongOctet": truncateLen
@ -262,14 +269,15 @@ const PublicKey = {
* @returns {string} * @returns {string}
*/ */
_formatDnStr: function(dnStr, indent) { _formatDnStr: function(dnStr, indent) {
var output = "", let output = "",
fields = dnStr.split(",/|"), fields = dnStr.split(",/|"),
maxKeyLen = 0, maxKeyLen = 0,
key, key,
value, value,
i,
str; str;
for (var i = 0; i < fields.length; i++) { for (i = 0; i < fields.length; i++) {
if (!fields[i].length) continue; if (!fields[i].length) continue;
key = fields[i].split("=")[0]; key = fields[i].split("=")[0];
@ -303,10 +311,10 @@ const PublicKey = {
_formatByteStr: function(byteStr, length, indent) { _formatByteStr: function(byteStr, length, indent) {
byteStr = Utils.toHex(Utils.fromHex(byteStr), ":"); byteStr = Utils.toHex(Utils.fromHex(byteStr), ":");
length = length * 3; length = length * 3;
var output = ""; let output = "";
for (var i = 0; i < byteStr.length; i += length) { for (let i = 0; i < byteStr.length; i += length) {
var str = byteStr.slice(i, i + length) + "\n"; const str = byteStr.slice(i, i + length) + "\n";
if (i === 0) { if (i === 0) {
output += str; output += str;
} else { } else {
@ -347,10 +355,10 @@ export default PublicKey;
* @returns {string} * @returns {string}
*/ */
r.X509.hex2dn = function(hDN) { r.X509.hex2dn = function(hDN) {
var s = ""; let s = "";
var a = r.ASN1HEX.getPosArrayOfChildren_AtObj(hDN, 0); const a = r.ASN1HEX.getPosArrayOfChildren_AtObj(hDN, 0);
for (var i = 0; i < a.length; i++) { for (let i = 0; i < a.length; i++) {
var hRDN = r.ASN1HEX.getHexOfTLV_AtObj(hDN, a[i]); const hRDN = r.ASN1HEX.getHexOfTLV_AtObj(hDN, a[i]);
s = s + ",/|" + r.X509.hex2rdn(hRDN); s = s + ",/|" + r.X509.hex2rdn(hRDN);
} }
return s; return s;

View file

@ -26,7 +26,7 @@ const Punycode = {
* @returns {string} * @returns {string}
*/ */
runToAscii: function(input, args) { runToAscii: function(input, args) {
var idn = args[0]; const idn = args[0];
if (idn) { if (idn) {
return punycode.toASCII(input); return punycode.toASCII(input);
@ -44,7 +44,7 @@ const Punycode = {
* @returns {string} * @returns {string}
*/ */
runToUnicode: function(input, args) { runToUnicode: function(input, args) {
var idn = args[0]; const idn = args[0];
if (idn) { if (idn) {
return punycode.toUnicode(input); return punycode.toUnicode(input);

View file

@ -40,7 +40,7 @@ const QuotedPrintable = {
* @returns {string} * @returns {string}
*/ */
runTo: function (input, args) { runTo: function (input, args) {
var mimeEncodedStr = QuotedPrintable.mimeEncode(input); let mimeEncodedStr = QuotedPrintable.mimeEncode(input);
// fix line breaks // fix line breaks
mimeEncodedStr = mimeEncodedStr.replace(/\r?\n|\r/g, function() { mimeEncodedStr = mimeEncodedStr.replace(/\r?\n|\r/g, function() {
@ -61,7 +61,7 @@ const QuotedPrintable = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runFrom: function (input, args) { runFrom: function (input, args) {
var str = input.replace(/\=(?:\r?\n|$)/g, ""); const str = input.replace(/\=(?:\r?\n|$)/g, "");
return QuotedPrintable.mimeDecode(str); return QuotedPrintable.mimeDecode(str);
}, },
@ -73,13 +73,13 @@ const QuotedPrintable = {
* @returns {byteArray} * @returns {byteArray}
*/ */
mimeDecode: function(str) { mimeDecode: function(str) {
var encodedBytesCount = (str.match(/\=[\da-fA-F]{2}/g) || []).length, let encodedBytesCount = (str.match(/\=[\da-fA-F]{2}/g) || []).length,
bufferLength = str.length - encodedBytesCount * 2, bufferLength = str.length - encodedBytesCount * 2,
chr, hex, chr, hex,
buffer = new Array(bufferLength), buffer = new Array(bufferLength),
bufferPos = 0; bufferPos = 0;
for (var i = 0, len = str.length; i < len; i++) { for (let i = 0, len = str.length; i < len; i++) {
chr = str.charAt(i); chr = str.charAt(i);
if (chr === "=" && (hex = str.substr(i + 1, 2)) && /[\da-fA-F]{2}/.test(hex)) { if (chr === "=" && (hex = str.substr(i + 1, 2)) && /[\da-fA-F]{2}/.test(hex)) {
buffer[bufferPos++] = parseInt(hex, 16); buffer[bufferPos++] = parseInt(hex, 16);
@ -100,7 +100,7 @@ const QuotedPrintable = {
* @returns {string} * @returns {string}
*/ */
mimeEncode: function(buffer) { mimeEncode: function(buffer) {
var ranges = [ let ranges = [
[0x09], [0x09],
[0x0A], [0x0A],
[0x0D], [0x0D],
@ -113,7 +113,7 @@ const QuotedPrintable = {
], ],
result = ""; result = "";
for (var i = 0, len = buffer.length; i < len; i++) { for (let i = 0, len = buffer.length; i < len; i++) {
if (this._checkRanges(buffer[i], ranges)) { if (this._checkRanges(buffer[i], ranges)) {
result += String.fromCharCode(buffer[i]); result += String.fromCharCode(buffer[i]);
continue; continue;
@ -134,7 +134,7 @@ const QuotedPrintable = {
* @returns {bolean} * @returns {bolean}
*/ */
_checkRanges: function(nr, ranges) { _checkRanges: function(nr, ranges) {
for (var i = ranges.length - 1; i >= 0; i--) { for (let i = ranges.length - 1; i >= 0; i--) {
if (!ranges[i].length) if (!ranges[i].length)
continue; continue;
if (ranges[i].length === 1 && nr === ranges[i][0]) if (ranges[i].length === 1 && nr === ranges[i][0])
@ -157,7 +157,7 @@ const QuotedPrintable = {
* @returns {string} * @returns {string}
*/ */
_addSoftLinebreaks: function(str, encoding) { _addSoftLinebreaks: function(str, encoding) {
var lineLengthMax = 76; const lineLengthMax = 76;
encoding = (encoding || "base64").toString().toLowerCase().trim(); encoding = (encoding || "base64").toString().toLowerCase().trim();
@ -192,7 +192,7 @@ const QuotedPrintable = {
* @returns {string} * @returns {string}
*/ */
_addQPSoftLinebreaks: function(mimeEncodedStr, lineLengthMax) { _addQPSoftLinebreaks: function(mimeEncodedStr, lineLengthMax) {
var pos = 0, let pos = 0,
len = mimeEncodedStr.length, len = mimeEncodedStr.length,
match, code, line, match, code, line,
lineMargin = Math.floor(lineLengthMax / 3), lineMargin = Math.floor(lineLengthMax / 3),

View file

@ -32,10 +32,10 @@ const Rotate = {
* @returns {byteArray} * @returns {byteArray}
*/ */
_rot: function(data, amount, algo) { _rot: function(data, amount, algo) {
var result = []; const result = [];
for (var i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
var b = data[i]; let b = data[i];
for (var j = 0; j < amount; j++) { for (let j = 0; j < amount; j++) {
b = algo(b); b = algo(b);
} }
result.push(b); result.push(b);
@ -100,7 +100,7 @@ const Rotate = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runRot13: function(input, args) { runRot13: function(input, args) {
var amount = args[2], let amount = args[2],
output = input, output = input,
chr, chr,
rot13Lowercase = args[0], rot13Lowercase = args[0],
@ -111,7 +111,7 @@ const Rotate = {
amount = 26 - (Math.abs(amount) % 26); amount = 26 - (Math.abs(amount) % 26);
} }
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
chr = input[i]; chr = input[i];
if (rot13Upperacse && chr >= 65 && chr <= 90) { // Upper case if (rot13Upperacse && chr >= 65 && chr <= 90) { // Upper case
chr = (chr - 65 + amount) % 26; chr = (chr - 65 + amount) % 26;
@ -141,7 +141,7 @@ const Rotate = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runRot47: function(input, args) { runRot47: function(input, args) {
var amount = args[0], let amount = args[0],
output = input, output = input,
chr; chr;
@ -150,7 +150,7 @@ const Rotate = {
amount = 94 - (Math.abs(amount) % 94); amount = 94 - (Math.abs(amount) % 94);
} }
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
chr = input[i]; chr = input[i];
if (chr >= 33 && chr <= 126) { if (chr >= 33 && chr <= 126) {
chr = (chr - 33 + amount) % 94; chr = (chr - 33 + amount) % 94;
@ -170,7 +170,7 @@ const Rotate = {
* @returns {byte} * @returns {byte}
*/ */
_rotr: function(b) { _rotr: function(b) {
var bit = (b & 1) << 7; const bit = (b & 1) << 7;
return (b >> 1) | bit; return (b >> 1) | bit;
}, },
@ -183,7 +183,7 @@ const Rotate = {
* @returns {byte} * @returns {byte}
*/ */
_rotl: function(b) { _rotl: function(b) {
var bit = (b >> 7) & 1; const bit = (b >> 7) & 1;
return ((b << 1) | bit) & 0xFF; return ((b << 1) | bit) & 0xFF;
}, },
@ -198,13 +198,13 @@ const Rotate = {
* @returns {byteArray} * @returns {byteArray}
*/ */
_rotrWhole: function(data, amount) { _rotrWhole: function(data, amount) {
var carryBits = 0, let carryBits = 0,
newByte, newByte,
result = []; result = [];
amount = amount % 8; amount = amount % 8;
for (var i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
var oldByte = data[i] >>> 0; const oldByte = data[i] >>> 0;
newByte = (oldByte >> amount) | carryBits; newByte = (oldByte >> amount) | carryBits;
carryBits = (oldByte & (Math.pow(2, amount)-1)) << (8-amount); carryBits = (oldByte & (Math.pow(2, amount)-1)) << (8-amount);
result.push(newByte); result.push(newByte);
@ -224,13 +224,13 @@ const Rotate = {
* @returns {byteArray} * @returns {byteArray}
*/ */
_rotlWhole: function(data, amount) { _rotlWhole: function(data, amount) {
var carryBits = 0, let carryBits = 0,
newByte, newByte,
result = []; result = [];
amount = amount % 8; amount = amount % 8;
for (var i = data.length-1; i >= 0; i--) { for (let i = data.length-1; i >= 0; i--) {
var oldByte = data[i]; const oldByte = data[i];
newByte = ((oldByte << amount) | carryBits) & 0xFF; newByte = ((oldByte << amount) | carryBits) & 0xFF;
carryBits = (oldByte >> (8-amount)) & (Math.pow(2, amount)-1); carryBits = (oldByte >> (8-amount)) & (Math.pow(2, amount)-1);
result[i] = (newByte); result[i] = (newByte);

View file

@ -36,7 +36,7 @@ const SeqUtils = {
* @returns {string} * @returns {string}
*/ */
runSort: function (input, args) { runSort: function (input, args) {
var delim = Utils.charRep[args[0]], let delim = Utils.charRep[args[0]],
sortReverse = args[1], sortReverse = args[1],
order = args[2], order = args[2],
sorted = input.split(delim); sorted = input.split(delim);
@ -62,7 +62,7 @@ const SeqUtils = {
* @returns {string} * @returns {string}
*/ */
runUnique: function (input, args) { runUnique: function (input, args) {
var delim = Utils.charRep[args[0]]; const delim = Utils.charRep[args[0]];
return input.split(delim).unique().join(delim); return input.split(delim).unique().join(delim);
}, },
@ -81,12 +81,12 @@ const SeqUtils = {
* @returns {number} * @returns {number}
*/ */
runCount: function(input, args) { runCount: function(input, args) {
var search = args[0].string, let search = args[0].string,
type = args[0].option; type = args[0].option;
if (type === "Regex" && search) { if (type === "Regex" && search) {
try { try {
var regex = new RegExp(search, "gi"), let regex = new RegExp(search, "gi"),
matches = input.match(regex); matches = input.match(regex);
return matches.length; return matches.length;
} catch (err) { } catch (err) {
@ -117,11 +117,12 @@ const SeqUtils = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runReverse: function (input, args) { runReverse: function (input, args) {
let i;
if (args[0] === "Line") { if (args[0] === "Line") {
var lines = [], let lines = [],
line = [], line = [],
result = []; result = [];
for (var i = 0; i < input.length; i++) { for (i = 0; i < input.length; i++) {
if (input[i] === 0x0a) { if (input[i] === 0x0a) {
lines.push(line); lines.push(line);
line = []; line = [];
@ -150,11 +151,11 @@ const SeqUtils = {
* @returns {string} * @returns {string}
*/ */
runAddLineNumbers: function(input, args) { runAddLineNumbers: function(input, args) {
var lines = input.split("\n"), let lines = input.split("\n"),
output = "", output = "",
width = lines.length.toString().length; width = lines.length.toString().length;
for (var n = 0; n < lines.length; n++) { for (let n = 0; n < lines.length; n++) {
output += Utils.pad((n+1).toString(), width, " ") + " " + lines[n] + "\n"; output += Utils.pad((n+1).toString(), width, " ") + " " + lines[n] + "\n";
} }
return output.slice(0, output.length-1); return output.slice(0, output.length-1);
@ -207,7 +208,7 @@ const SeqUtils = {
* @returns {number} * @returns {number}
*/ */
_ipSort: function(a, b) { _ipSort: function(a, b) {
var a_ = a.split("."), let a_ = a.split("."),
b_ = b.split("."); b_ = b.split(".");
a_ = a_[0] * 0x1000000 + a_[1] * 0x10000 + a_[2] * 0x100 + a_[3] * 1; a_ = a_[0] * 0x1000000 + a_[1] * 0x10000 + a_[2] * 0x100 + a_[3] * 1;

View file

@ -100,7 +100,7 @@ const StrUtils = {
* @returns {html} * @returns {html}
*/ */
runRegex: function(input, args) { runRegex: function(input, args) {
var userRegex = args[1], let userRegex = args[1],
i = args[2], i = args[2],
m = args[3], m = args[3],
displayTotal = args[4], displayTotal = args[4],
@ -112,7 +112,7 @@ const StrUtils = {
if (userRegex && userRegex !== "^" && userRegex !== "$") { if (userRegex && userRegex !== "^" && userRegex !== "$") {
try { try {
var regex = new RegExp(userRegex, modifiers); const regex = new RegExp(userRegex, modifiers);
switch (outputFormat) { switch (outputFormat) {
case "Highlight matches": case "Highlight matches":
@ -149,7 +149,7 @@ const StrUtils = {
* @returns {string} * @returns {string}
*/ */
runUpper: function (input, args) { runUpper: function (input, args) {
var scope = args[0]; const scope = args[0];
switch (scope) { switch (scope) {
case "Word": case "Word":
@ -213,7 +213,7 @@ const StrUtils = {
* @returns {string} * @returns {string}
*/ */
runFindReplace: function(input, args) { runFindReplace: function(input, args) {
var find = args[0].string, let find = args[0].string,
type = args[0].option, type = args[0].option,
replace = args[1], replace = args[1],
g = args[2], g = args[2],
@ -257,7 +257,7 @@ const StrUtils = {
* @returns {string} * @returns {string}
*/ */
runSplit: function(input, args) { runSplit: function(input, args) {
var splitDelim = args[0] || StrUtils.SPLIT_DELIM, let splitDelim = args[0] || StrUtils.SPLIT_DELIM,
joinDelim = Utils.charRep[args[1]], joinDelim = Utils.charRep[args[1]],
sections = input.split(splitDelim); sections = input.split(splitDelim);
@ -274,16 +274,17 @@ const StrUtils = {
* @returns {string} * @returns {string}
*/ */
runFilter: function(input, args) { runFilter: function(input, args) {
var delim = Utils.charRep[args[0]], let delim = Utils.charRep[args[0]],
regex,
reverse = args[2]; reverse = args[2];
try { try {
var regex = new RegExp(args[1]); regex = new RegExp(args[1]);
} catch (err) { } catch (err) {
return "Invalid regex. Details: " + err.message; return "Invalid regex. Details: " + err.message;
} }
var regexFilter = function(value) { const regexFilter = function(value) {
return reverse ^ regex.test(value); return reverse ^ regex.test(value);
}; };
@ -310,7 +311,7 @@ const StrUtils = {
* @returns {html} * @returns {html}
*/ */
runDiff: function(input, args) { runDiff: function(input, args) {
var sampleDelim = args[0], let sampleDelim = args[0],
diffBy = args[1], diffBy = args[1],
showAdded = args[2], showAdded = args[2],
showRemoved = args[3], showRemoved = args[3],
@ -354,7 +355,7 @@ const StrUtils = {
return "Invalid 'Diff by' option."; return "Invalid 'Diff by' option.";
} }
for (var i = 0; i < diff.length; i++) { for (let i = 0; i < diff.length; i++) {
if (diff[i].added) { if (diff[i].added) {
if (showAdded) output += "<span class='hlgreen'>" + Utils.escapeHtml(diff[i].value) + "</span>"; if (showAdded) output += "<span class='hlgreen'>" + Utils.escapeHtml(diff[i].value) + "</span>";
} else if (diff[i].removed) { } else if (diff[i].removed) {
@ -382,9 +383,9 @@ const StrUtils = {
* @returns {html} * @returns {html}
*/ */
runOffsetChecker: function(input, args) { runOffsetChecker: function(input, args) {
var sampleDelim = args[0], let sampleDelim = args[0],
samples = input.split(sampleDelim), samples = input.split(sampleDelim),
outputs = [], outputs = new Array(samples.length),
i = 0, i = 0,
s = 0, s = 0,
match = false, match = false,
@ -396,9 +397,7 @@ const StrUtils = {
} }
// Initialise output strings // Initialise output strings
for (s = 0; s < samples.length; s++) { outputs.fill("", 0, samples.length);
outputs[s] = "";
}
// Loop through each character in the first sample // Loop through each character in the first sample
for (i = 0; i < samples[0].length; i++) { for (i = 0; i < samples[0].length; i++) {
@ -472,7 +471,7 @@ const StrUtils = {
number = args[1]; number = args[1];
delimiter = Utils.charRep[delimiter]; delimiter = Utils.charRep[delimiter];
let splitInput = input.split(delimiter); const splitInput = input.split(delimiter);
return splitInput return splitInput
.filter((line, lineIndex) => { .filter((line, lineIndex) => {
@ -500,7 +499,7 @@ const StrUtils = {
number = args[1]; number = args[1];
delimiter = Utils.charRep[delimiter]; delimiter = Utils.charRep[delimiter];
let splitInput = input.split(delimiter); const splitInput = input.split(delimiter);
return splitInput return splitInput
.filter((line, lineIndex) => { .filter((line, lineIndex) => {
@ -526,7 +525,7 @@ const StrUtils = {
* @returns {string} * @returns {string}
*/ */
_regexHighlight: function(input, regex, displayTotal) { _regexHighlight: function(input, regex, displayTotal) {
var output = "", let output = "",
m, m,
hl = 1, hl = 1,
i = 0, i = 0,
@ -568,7 +567,7 @@ const StrUtils = {
* @returns {string} * @returns {string}
*/ */
_regexList: function(input, regex, displayTotal, matches, captureGroups) { _regexList: function(input, regex, displayTotal, matches, captureGroups) {
var output = "", let output = "",
total = 0, total = 0,
match; match;
@ -578,7 +577,7 @@ const StrUtils = {
output += match[0] + "\n"; output += match[0] + "\n";
} }
if (captureGroups) { if (captureGroups) {
for (var i = 1; i < match.length; i++) { for (let i = 1; i < match.length; i++) {
if (matches) { if (matches) {
output += " Group " + i + ": "; output += " Group " + i + ": ";
} }
@ -592,7 +591,6 @@ const StrUtils = {
return output; return output;
}, },
}; };
export default StrUtils; export default StrUtils;

View file

@ -51,7 +51,7 @@ const Tidy = {
* @returns {string} * @returns {string}
*/ */
runRemoveWhitespace: function (input, args) { runRemoveWhitespace: function (input, args) {
var removeSpaces = args[0], let removeSpaces = args[0],
removeCariageReturns = args[1], removeCariageReturns = args[1],
removeLineFeeds = args[2], removeLineFeeds = args[2],
removeTabs = args[3], removeTabs = args[3],
@ -77,8 +77,8 @@ const Tidy = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runRemoveNulls: function (input, args) { runRemoveNulls: function (input, args) {
var output = []; const output = [];
for (var i = 0; i < input.length; i++) { for (let i = 0; i < input.length; i++) {
if (input[i] !== 0) output.push(input[i]); if (input[i] !== 0) output.push(input[i]);
} }
return output; return output;
@ -109,7 +109,7 @@ const Tidy = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runDropBytes: function(input, args) { runDropBytes: function(input, args) {
var start = args[0], let start = args[0],
length = args[1], length = args[1],
applyToEachLine = args[2]; applyToEachLine = args[2];
@ -120,10 +120,11 @@ const Tidy = {
return input.slice(0, start).concat(input.slice(start+length, input.length)); return input.slice(0, start).concat(input.slice(start+length, input.length));
// Split input into lines // Split input into lines
var lines = [], let lines = [],
line = []; line = [],
i;
for (var i = 0; i < input.length; i++) { for (i = 0; i < input.length; i++) {
if (input[i] === 0x0a) { if (input[i] === 0x0a) {
lines.push(line); lines.push(line);
line = []; line = [];
@ -133,7 +134,7 @@ const Tidy = {
} }
lines.push(line); lines.push(line);
var output = []; let output = [];
for (i = 0; i < lines.length; i++) { for (i = 0; i < lines.length; i++) {
output = output.concat(lines[i].slice(0, start).concat(lines[i].slice(start+length, lines[i].length))); output = output.concat(lines[i].slice(0, start).concat(lines[i].slice(start+length, lines[i].length)));
output.push(0x0a); output.push(0x0a);
@ -161,7 +162,7 @@ const Tidy = {
* @returns {byteArray} * @returns {byteArray}
*/ */
runTakeBytes: function(input, args) { runTakeBytes: function(input, args) {
var start = args[0], let start = args[0],
length = args[1], length = args[1],
applyToEachLine = args[2]; applyToEachLine = args[2];
@ -172,10 +173,11 @@ const Tidy = {
return input.slice(start, start+length); return input.slice(start, start+length);
// Split input into lines // Split input into lines
var lines = [], let lines = [],
line = []; line = [];
let i;
for (var i = 0; i < input.length; i++) { for (i = 0; i < input.length; i++) {
if (input[i] === 0x0a) { if (input[i] === 0x0a) {
lines.push(line); lines.push(line);
line = []; line = [];
@ -185,7 +187,7 @@ const Tidy = {
} }
lines.push(line); lines.push(line);
var output = []; let output = [];
for (i = 0; i < lines.length; i++) { for (i = 0; i < lines.length; i++) {
output = output.concat(lines[i].slice(start, start+length)); output = output.concat(lines[i].slice(start, start+length));
output.push(0x0a); output.push(0x0a);
@ -218,7 +220,7 @@ const Tidy = {
* @returns {string} * @returns {string}
*/ */
runPad: function(input, args) { runPad: function(input, args) {
var position = args[0], let position = args[0],
len = args[1], len = args[1],
chr = args[2], chr = args[2],
lines = input.split("\n"), lines = input.split("\n"),

View file

@ -28,7 +28,7 @@ const URL_ = {
* @returns {string} * @returns {string}
*/ */
runTo: function(input, args) { runTo: function(input, args) {
var encodeAll = args[0]; const encodeAll = args[0];
return encodeAll ? URL_._encodeAllChars(input) : encodeURI(input); return encodeAll ? URL_._encodeAllChars(input) : encodeURI(input);
}, },
@ -41,7 +41,7 @@ const URL_ = {
* @returns {string} * @returns {string}
*/ */
runFrom: function(input, args) { runFrom: function(input, args) {
var data = input.replace(/\+/g, "%20"); const data = input.replace(/\+/g, "%20");
try { try {
return decodeURIComponent(data); return decodeURIComponent(data);
} catch (err) { } catch (err) {
@ -62,14 +62,14 @@ const URL_ = {
throw "This operation only works in a browser."; throw "This operation only works in a browser.";
} }
var a = document.createElement("a"); const a = document.createElement("a");
// Overwrite base href which will be the current CyberChef URL to reduce confusion. // Overwrite base href which will be the current CyberChef URL to reduce confusion.
a.href = "http://example.com/"; a.href = "http://example.com/";
a.href = input; a.href = input;
if (a.protocol) { if (a.protocol) {
var output = ""; let output = "";
if (a.hostname !== window.location.hostname) { if (a.hostname !== window.location.hostname) {
output = "Protocol:\t" + a.protocol + "\n"; output = "Protocol:\t" + a.protocol + "\n";
if (a.hostname) output += "Hostname:\t" + a.hostname + "\n"; if (a.hostname) output += "Hostname:\t" + a.hostname + "\n";
@ -77,7 +77,7 @@ const URL_ = {
} }
if (a.pathname && a.pathname !== window.location.pathname) { if (a.pathname && a.pathname !== window.location.pathname) {
var pathname = a.pathname; let pathname = a.pathname;
if (pathname.indexOf(window.location.pathname) === 0) if (pathname.indexOf(window.location.pathname) === 0)
pathname = pathname.replace(window.location.pathname, ""); pathname = pathname.replace(window.location.pathname, "");
if (pathname) if (pathname)
@ -90,9 +90,9 @@ const URL_ = {
if (a.search && a.search !== window.location.search) { if (a.search && a.search !== window.location.search) {
output += "Arguments:\n"; output += "Arguments:\n";
var args_ = (a.search.slice(1, a.search.length)).split("&"); const args_ = (a.search.slice(1, a.search.length)).split("&");
var splitArgs = [], padding = 0; let splitArgs = [], padding = 0, i;
for (var i = 0; i < args_.length; i++) { for (i = 0; i < args_.length; i++) {
splitArgs.push(args_[i].split("=")); splitArgs.push(args_[i].split("="));
padding = (splitArgs[i][0].length > padding) ? splitArgs[i][0].length : padding; padding = (splitArgs[i][0].length > padding) ? splitArgs[i][0].length : padding;
} }

View file

@ -18,18 +18,18 @@ const UUID = {
*/ */
runGenerateV4: function(input, args) { runGenerateV4: function(input, args) {
if (window && typeof(window.crypto) !== "undefined" && typeof(window.crypto.getRandomValues) !== "undefined") { if (window && typeof(window.crypto) !== "undefined" && typeof(window.crypto.getRandomValues) !== "undefined") {
var buf = new Uint32Array(4), let buf = new Uint32Array(4),
i = 0; i = 0;
window.crypto.getRandomValues(buf); window.crypto.getRandomValues(buf);
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
var r = (buf[i >> 3] >> ((i % 8) * 4)) & 0xf, let r = (buf[i >> 3] >> ((i % 8) * 4)) & 0xf,
v = c === "x" ? r : (r & 0x3 | 0x8); v = c === "x" ? r : (r & 0x3 | 0x8);
i++; i++;
return v.toString(16); return v.toString(16);
}); });
} else { } else {
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, let r = Math.random() * 16 | 0,
v = c === "x" ? r : (r & 0x3 | 0x8); v = c === "x" ? r : (r & 0x3 | 0x8);
return v.toString(16); return v.toString(16);
}); });

View file

@ -26,7 +26,7 @@ const Unicode = {
* @returns {string} * @returns {string}
*/ */
runUnescape: function(input, args) { runUnescape: function(input, args) {
var prefix = Unicode._prefixToRegex[args[0]], let prefix = Unicode._prefixToRegex[args[0]],
regex = new RegExp(prefix+"([a-f\\d]{4,6})", "ig"), regex = new RegExp(prefix+"([a-f\\d]{4,6})", "ig"),
output = "", output = "",
m, m,

View file

@ -7,7 +7,7 @@
*/ */
require("babel-polyfill"); require("babel-polyfill");
var Chef = require("../core/Chef.js").default; const Chef = require("../core/Chef.js").default;
const CyberChef = module.exports = { const CyberChef = module.exports = {

View file

@ -20,7 +20,7 @@ import Split from "split.js";
* @param {String[]} defaultFavourites - A list of default favourite operations. * @param {String[]} defaultFavourites - A list of default favourite operations.
* @param {Object} options - Default setting for app options. * @param {Object} options - Default setting for app options.
*/ */
var App = function(categories, operations, defaultFavourites, defaultOptions) { const App = function(categories, operations, defaultFavourites, defaultOptions) {
this.categories = categories; this.categories = categories;
this.operations = operations; this.operations = operations;
this.dfavourites = defaultFavourites; this.dfavourites = defaultFavourites;
@ -30,6 +30,7 @@ var App = function(categories, operations, defaultFavourites, defaultOptions) {
this.chef = new Chef(); this.chef = new Chef();
this.manager = new Manager(this); this.manager = new Manager(this);
this.baking = false;
this.autoBake_ = false; this.autoBake_ = false;
this.progress = 0; this.progress = 0;
this.ingId = 0; this.ingId = 0;
@ -62,24 +63,54 @@ App.prototype.setup = function() {
*/ */
App.prototype.handleError = function(err) { App.prototype.handleError = function(err) {
console.error(err); console.error(err);
var msg = err.displayStr || err.toString(); const msg = err.displayStr || err.toString();
this.alert(msg, "danger", this.options.errorTimeout, !this.options.showErrors); this.alert(msg, "danger", this.options.errorTimeout, !this.options.showErrors);
}; };
/**
* Updates the UI to show if baking is in process or not.
*
* @param {bakingStatus}
*/
App.prototype.setBakingStatus = function(bakingStatus) {
this.baking = bakingStatus;
let inputLoadingIcon = document.querySelector("#input .title .loading-icon"),
outputLoadingIcon = document.querySelector("#output .title .loading-icon"),
outputElement = document.querySelector("#output-text");
if (bakingStatus) {
inputLoadingIcon.style.display = "inline-block";
outputLoadingIcon.style.display = "inline-block";
outputElement.classList.add("disabled");
outputElement.disabled = true;
} else {
inputLoadingIcon.style.display = "none";
outputLoadingIcon.style.display = "none";
outputElement.classList.remove("disabled");
outputElement.disabled = false;
}
};
/** /**
* Calls the Chef to bake the current input using the current recipe. * Calls the Chef to bake the current input using the current recipe.
* *
* @param {boolean} [step] - Set to true if we should only execute one operation instead of the * @param {boolean} [step] - Set to true if we should only execute one operation instead of the
* whole recipe. * whole recipe.
*/ */
App.prototype.bake = function(step) { App.prototype.bake = async function(step) {
var response; let response;
if (this.baking) return;
this.setBakingStatus(true);
try { try {
response = this.chef.bake( response = await this.chef.bake(
this.getInput(), // The user's input this.getInput(), // The user's input
this.getRecipeConfig(), // The configuration of the recipe this.getRecipeConfig(), // The configuration of the recipe
this.options, // Options set by the user this.options, // Options set by the user
this.progress, // The current position in the recipe this.progress, // The current position in the recipe
step // Whether or not to take one step or execute the whole recipe step // Whether or not to take one step or execute the whole recipe
@ -88,6 +119,8 @@ App.prototype.bake = function(step) {
this.handleError(err); this.handleError(err);
} }
this.setBakingStatus(false);
if (!response) return; if (!response) return;
if (response.error) { if (response.error) {
@ -129,7 +162,7 @@ App.prototype.autoBake = function() {
* @returns {number} - The number of miliseconds it took to run the silent bake. * @returns {number} - The number of miliseconds it took to run the silent bake.
*/ */
App.prototype.silentBake = function() { App.prototype.silentBake = function() {
var startTime = new Date().getTime(), let startTime = new Date().getTime(),
recipeConfig = this.getRecipeConfig(); recipeConfig = this.getRecipeConfig();
if (this.autoBake_) { if (this.autoBake_) {
@ -146,7 +179,7 @@ App.prototype.silentBake = function() {
* @returns {string} * @returns {string}
*/ */
App.prototype.getInput = function() { App.prototype.getInput = function() {
var input = this.manager.input.get(); const input = this.manager.input.get();
// Save to session storage in case we need to restore it later // Save to session storage in case we need to restore it later
sessionStorage.setItem("inputLength", input.length); sessionStorage.setItem("inputLength", input.length);
@ -178,15 +211,16 @@ App.prototype.populateOperationsList = function() {
// Move edit button away before we overwrite it // Move edit button away before we overwrite it
document.body.appendChild(document.getElementById("edit-favourites")); document.body.appendChild(document.getElementById("edit-favourites"));
var html = ""; let html = "";
let i;
for (var i = 0; i < this.categories.length; i++) { for (i = 0; i < this.categories.length; i++) {
var catConf = this.categories[i], let catConf = this.categories[i],
selected = i === 0, selected = i === 0,
cat = new HTMLCategory(catConf.name, selected); cat = new HTMLCategory(catConf.name, selected);
for (var j = 0; j < catConf.ops.length; j++) { for (let j = 0; j < catConf.ops.length; j++) {
var opName = catConf.ops[j], let opName = catConf.ops[j],
op = new HTMLOperation(opName, this.operations[opName], this, this.manager); op = new HTMLOperation(opName, this.operations[opName], this, this.manager);
cat.addOperation(op); cat.addOperation(op);
} }
@ -196,7 +230,7 @@ App.prototype.populateOperationsList = function() {
document.getElementById("categories").innerHTML = html; document.getElementById("categories").innerHTML = html;
var opLists = document.querySelectorAll("#categories .op-list"); const opLists = document.querySelectorAll("#categories .op-list");
for (i = 0; i < opLists.length; i++) { for (i = 0; i < opLists.length; i++) {
opLists[i].dispatchEvent(this.manager.oplistcreate); opLists[i].dispatchEvent(this.manager.oplistcreate);
@ -236,7 +270,7 @@ App.prototype.initialiseSplitter = function() {
*/ */
App.prototype.loadLocalStorage = function() { App.prototype.loadLocalStorage = function() {
// Load options // Load options
var lOptions; let lOptions;
if (localStorage.options !== undefined) { if (localStorage.options !== undefined) {
lOptions = JSON.parse(localStorage.options); lOptions = JSON.parse(localStorage.options);
} }
@ -253,7 +287,7 @@ App.prototype.loadLocalStorage = function() {
* If the user currently has no saved favourites, the defaults from the view constructor are used. * If the user currently has no saved favourites, the defaults from the view constructor are used.
*/ */
App.prototype.loadFavourites = function() { App.prototype.loadFavourites = function() {
var favourites = localStorage.favourites && let favourites = localStorage.favourites &&
localStorage.favourites.length > 2 ? localStorage.favourites.length > 2 ?
JSON.parse(localStorage.favourites) : JSON.parse(localStorage.favourites) :
this.dfavourites; this.dfavourites;
@ -261,7 +295,7 @@ App.prototype.loadFavourites = function() {
favourites = this.validFavourites(favourites); favourites = this.validFavourites(favourites);
this.saveFavourites(favourites); this.saveFavourites(favourites);
var favCat = this.categories.filter(function(c) { const favCat = this.categories.filter(function(c) {
return c.name === "Favourites"; return c.name === "Favourites";
})[0]; })[0];
@ -284,8 +318,8 @@ App.prototype.loadFavourites = function() {
* @returns {string[]} A list of the valid favourites * @returns {string[]} A list of the valid favourites
*/ */
App.prototype.validFavourites = function(favourites) { App.prototype.validFavourites = function(favourites) {
var validFavs = []; const validFavs = [];
for (var i = 0; i < favourites.length; i++) { for (let i = 0; i < favourites.length; i++) {
if (this.operations.hasOwnProperty(favourites[i])) { if (this.operations.hasOwnProperty(favourites[i])) {
validFavs.push(favourites[i]); validFavs.push(favourites[i]);
} else { } else {
@ -325,7 +359,7 @@ App.prototype.resetFavourites = function() {
* @param {string} name - The name of the operation * @param {string} name - The name of the operation
*/ */
App.prototype.addFavourite = function(name) { App.prototype.addFavourite = function(name) {
var favourites = JSON.parse(localStorage.favourites); const favourites = JSON.parse(localStorage.favourites);
if (favourites.indexOf(name) >= 0) { if (favourites.indexOf(name) >= 0) {
this.alert("'" + name + "' is already in your favourites", "info", 2000); this.alert("'" + name + "' is already in your favourites", "info", 2000);
@ -347,9 +381,9 @@ App.prototype.loadURIParams = function() {
// Load query string from URI // Load query string from URI
this.queryString = (function(a) { this.queryString = (function(a) {
if (a === "") return {}; if (a === "") return {};
var b = {}; const b = {};
for (var i = 0; i < a.length; i++) { for (let i = 0; i < a.length; i++) {
var p = a[i].split("="); const p = a[i].split("=");
if (p.length !== 2) { if (p.length !== 2) {
b[a[i]] = true; b[a[i]] = true;
} else { } else {
@ -360,13 +394,13 @@ App.prototype.loadURIParams = function() {
})(window.location.search.substr(1).split("&")); })(window.location.search.substr(1).split("&"));
// Turn off auto-bake while loading // Turn off auto-bake while loading
var autoBakeVal = this.autoBake_; const autoBakeVal = this.autoBake_;
this.autoBake_ = false; this.autoBake_ = false;
// Read in recipe from query string // Read in recipe from query string
if (this.queryString.recipe) { if (this.queryString.recipe) {
try { try {
var recipeConfig = JSON.parse(this.queryString.recipe); const recipeConfig = JSON.parse(this.queryString.recipe);
this.setRecipeConfig(recipeConfig); this.setRecipeConfig(recipeConfig);
} catch (err) {} } catch (err) {}
} else if (this.queryString.op) { } else if (this.queryString.op) {
@ -376,13 +410,13 @@ App.prototype.loadURIParams = function() {
this.manager.recipe.addOperation(this.queryString.op); this.manager.recipe.addOperation(this.queryString.op);
} catch (err) { } catch (err) {
// If no exact match, search for nearest match and add that // If no exact match, search for nearest match and add that
var matchedOps = this.manager.ops.filterOperations(this.queryString.op, false); const matchedOps = this.manager.ops.filterOperations(this.queryString.op, false);
if (matchedOps.length) { if (matchedOps.length) {
this.manager.recipe.addOperation(matchedOps[0].name); this.manager.recipe.addOperation(matchedOps[0].name);
} }
// Populate search with the string // Populate search with the string
var search = document.getElementById("search"); const search = document.getElementById("search");
search.value = this.queryString.op; search.value = this.queryString.op;
search.dispatchEvent(new Event("search")); search.dispatchEvent(new Event("search"));
@ -392,7 +426,7 @@ App.prototype.loadURIParams = function() {
// Read in input data from query string // Read in input data from query string
if (this.queryString.input) { if (this.queryString.input) {
try { try {
var inputData = Utils.fromBase64(this.queryString.input); const inputData = Utils.fromBase64(this.queryString.input);
this.setInput(inputData); this.setInput(inputData);
} catch (err) {} } catch (err) {}
} }
@ -419,7 +453,7 @@ App.prototype.nextIngId = function() {
* @returns {Object[]} * @returns {Object[]}
*/ */
App.prototype.getRecipeConfig = function() { App.prototype.getRecipeConfig = function() {
var recipeConfig = this.manager.recipe.getConfig(); const recipeConfig = this.manager.recipe.getConfig();
sessionStorage.setItem("recipeConfig", JSON.stringify(recipeConfig)); sessionStorage.setItem("recipeConfig", JSON.stringify(recipeConfig));
return recipeConfig; return recipeConfig;
}; };
@ -434,12 +468,12 @@ App.prototype.setRecipeConfig = function(recipeConfig) {
sessionStorage.setItem("recipeConfig", JSON.stringify(recipeConfig)); sessionStorage.setItem("recipeConfig", JSON.stringify(recipeConfig));
document.getElementById("rec-list").innerHTML = null; document.getElementById("rec-list").innerHTML = null;
for (var i = 0; i < recipeConfig.length; i++) { for (let i = 0; i < recipeConfig.length; i++) {
var item = this.manager.recipe.addOperation(recipeConfig[i].op); const item = this.manager.recipe.addOperation(recipeConfig[i].op);
// Populate arguments // Populate arguments
var args = item.querySelectorAll(".arg"); const args = item.querySelectorAll(".arg");
for (var j = 0; j < args.length; j++) { for (let j = 0; j < args.length; j++) {
if (args[j].getAttribute("type") === "checkbox") { if (args[j].getAttribute("type") === "checkbox") {
// checkbox // checkbox
args[j].checked = recipeConfig[i].args[j]; args[j].checked = recipeConfig[i].args[j];
@ -485,7 +519,7 @@ App.prototype.resetLayout = function() {
*/ */
App.prototype.setCompileMessage = function() { App.prototype.setCompileMessage = function() {
// Display time since last build and compile message // Display time since last build and compile message
var now = new Date(), let now = new Date(),
timeSinceCompile = Utils.fuzzyTime(now.getTime() - window.compileTime), timeSinceCompile = Utils.fuzzyTime(now.getTime() - window.compileTime),
compileInfo = "<span style=\"font-weight: normal\">Last build: " + compileInfo = "<span style=\"font-weight: normal\">Last build: " +
timeSinceCompile.substr(0, 1).toUpperCase() + timeSinceCompile.substr(1) + " ago"; timeSinceCompile.substr(0, 1).toUpperCase() + timeSinceCompile.substr(1) + " ago";
@ -523,7 +557,7 @@ App.prototype.setCompileMessage = function() {
* this.alert("Happy Christmas!", "info", 5000); * this.alert("Happy Christmas!", "info", 5000);
*/ */
App.prototype.alert = function(str, style, timeout, silent) { App.prototype.alert = function(str, style, timeout, silent) {
var time = new Date(); const time = new Date();
console.log("[" + time.toLocaleString() + "] " + str); console.log("[" + time.toLocaleString() + "] " + str);
if (silent) return; if (silent) return;
@ -531,7 +565,7 @@ App.prototype.alert = function(str, style, timeout, silent) {
style = style || "danger"; style = style || "danger";
timeout = timeout || 0; timeout = timeout || 0;
var alertEl = document.getElementById("alert"), let alertEl = document.getElementById("alert"),
alertContent = document.getElementById("alert-content"); alertContent = document.getElementById("alert-content");
alertEl.classList.remove("alert-danger"); alertEl.classList.remove("alert-danger");
@ -649,7 +683,7 @@ App.prototype.callApi = function(url, type, data, dataType, contentType) {
dataType = dataType || undefined; dataType = dataType || undefined;
contentType = contentType || "application/json"; contentType = contentType || "application/json";
var response = null, let response = null,
success = false; success = false;
$.ajax({ $.ajax({

View file

@ -12,7 +12,7 @@ import Utils from "../core/Utils.js";
* @param {App} app - The main view object for CyberChef. * @param {App} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager. * @param {Manager} manager - The CyberChef event manager.
*/ */
var ControlsWaiter = function(app, manager) { const ControlsWaiter = function(app, manager) {
this.app = app; this.app = app;
this.manager = manager; this.manager = manager;
}; };
@ -23,14 +23,14 @@ var ControlsWaiter = function(app, manager) {
* without wrapping or overflowing. * without wrapping or overflowing.
*/ */
ControlsWaiter.prototype.adjustWidth = function() { ControlsWaiter.prototype.adjustWidth = function() {
var controls = document.getElementById("controls"), const controls = document.getElementById("controls");
step = document.getElementById("step"), const step = document.getElementById("step");
clrBreaks = document.getElementById("clr-breaks"), const clrBreaks = document.getElementById("clr-breaks");
saveImg = document.querySelector("#save img"), const saveImg = document.querySelector("#save img");
loadImg = document.querySelector("#load img"), const loadImg = document.querySelector("#load img");
stepImg = document.querySelector("#step img"), const stepImg = document.querySelector("#step img");
clrRecipImg = document.querySelector("#clr-recipe img"), const clrRecipImg = document.querySelector("#clr-recipe img");
clrBreaksImg = document.querySelector("#clr-breaks img"); const clrBreaksImg = document.querySelector("#clr-breaks img");
if (controls.clientWidth < 470) { if (controls.clientWidth < 470) {
step.childNodes[1].nodeValue = " Step"; step.childNodes[1].nodeValue = " Step";
@ -66,7 +66,7 @@ ControlsWaiter.prototype.adjustWidth = function() {
* @param {boolean} value - The new value for Auto Bake. * @param {boolean} value - The new value for Auto Bake.
*/ */
ControlsWaiter.prototype.setAutoBake = function(value) { ControlsWaiter.prototype.setAutoBake = function(value) {
var autoBakeCheckbox = document.getElementById("auto-bake"); const autoBakeCheckbox = document.getElementById("auto-bake");
if (autoBakeCheckbox.checked !== value) { if (autoBakeCheckbox.checked !== value) {
autoBakeCheckbox.click(); autoBakeCheckbox.click();
@ -79,7 +79,7 @@ ControlsWaiter.prototype.setAutoBake = function(value) {
*/ */
ControlsWaiter.prototype.bakeClick = function() { ControlsWaiter.prototype.bakeClick = function() {
this.app.bake(); this.app.bake();
var outputText = document.getElementById("output-text"); const outputText = document.getElementById("output-text");
outputText.focus(); outputText.focus();
outputText.setSelectionRange(0, 0); outputText.setSelectionRange(0, 0);
}; };
@ -90,7 +90,7 @@ ControlsWaiter.prototype.bakeClick = function() {
*/ */
ControlsWaiter.prototype.stepClick = function() { ControlsWaiter.prototype.stepClick = function() {
this.app.bake(true); this.app.bake(true);
var outputText = document.getElementById("output-text"); const outputText = document.getElementById("output-text");
outputText.focus(); outputText.focus();
outputText.setSelectionRange(0, 0); outputText.setSelectionRange(0, 0);
}; };
@ -100,8 +100,8 @@ ControlsWaiter.prototype.stepClick = function() {
* Handler for changes made to the Auto Bake checkbox. * Handler for changes made to the Auto Bake checkbox.
*/ */
ControlsWaiter.prototype.autoBakeChange = function() { ControlsWaiter.prototype.autoBakeChange = function() {
var autoBakeLabel = document.getElementById("auto-bake-label"), const autoBakeLabel = document.getElementById("auto-bake-label");
autoBakeCheckbox = document.getElementById("auto-bake"); const autoBakeCheckbox = document.getElementById("auto-bake");
this.app.autoBake_ = autoBakeCheckbox.checked; this.app.autoBake_ = autoBakeCheckbox.checked;
@ -128,9 +128,9 @@ ControlsWaiter.prototype.clearRecipeClick = function() {
* recipe. * recipe.
*/ */
ControlsWaiter.prototype.clearBreaksClick = function() { ControlsWaiter.prototype.clearBreaksClick = function() {
var bps = document.querySelectorAll("#rec-list li.operation .breakpoint"); const bps = document.querySelectorAll("#rec-list li.operation .breakpoint");
for (var i = 0; i < bps.length; i++) { for (let i = 0; i < bps.length; i++) {
bps[i].setAttribute("break", "false"); bps[i].setAttribute("break", "false");
bps[i].classList.remove("breakpoint-selected"); bps[i].classList.remove("breakpoint-selected");
} }
@ -145,10 +145,10 @@ ControlsWaiter.prototype.clearBreaksClick = function() {
ControlsWaiter.prototype.initialiseSaveLink = function(recipeConfig) { ControlsWaiter.prototype.initialiseSaveLink = function(recipeConfig) {
recipeConfig = recipeConfig || this.app.getRecipeConfig(); recipeConfig = recipeConfig || this.app.getRecipeConfig();
var includeRecipe = document.getElementById("save-link-recipe-checkbox").checked, const includeRecipe = document.getElementById("save-link-recipe-checkbox").checked;
includeInput = document.getElementById("save-link-input-checkbox").checked, const includeInput = document.getElementById("save-link-input-checkbox").checked;
saveLinkEl = document.getElementById("save-link"), const saveLinkEl = document.getElementById("save-link");
saveLink = this.generateStateUrl(includeRecipe, includeInput, recipeConfig); const saveLink = this.generateStateUrl(includeRecipe, includeInput, recipeConfig);
saveLinkEl.innerHTML = Utils.truncate(saveLink, 120); saveLinkEl.innerHTML = Utils.truncate(saveLink, 120);
saveLinkEl.setAttribute("href", saveLink); saveLinkEl.setAttribute("href", saveLink);
@ -167,23 +167,27 @@ ControlsWaiter.prototype.initialiseSaveLink = function(recipeConfig) {
ControlsWaiter.prototype.generateStateUrl = function(includeRecipe, includeInput, recipeConfig, baseURL) { ControlsWaiter.prototype.generateStateUrl = function(includeRecipe, includeInput, recipeConfig, baseURL) {
recipeConfig = recipeConfig || this.app.getRecipeConfig(); recipeConfig = recipeConfig || this.app.getRecipeConfig();
var link = baseURL || window.location.protocol + "//" + const link = baseURL || window.location.protocol + "//" +
window.location.host + window.location.host +
window.location.pathname, window.location.pathname;
recipeStr = JSON.stringify(recipeConfig), const recipeStr = JSON.stringify(recipeConfig);
inputStr = Utils.toBase64(this.app.getInput(), "A-Za-z0-9+/"); // B64 alphabet with no padding const inputStr = Utils.toBase64(this.app.getInput(), "A-Za-z0-9+/"); // B64 alphabet with no padding
includeRecipe = includeRecipe && (recipeConfig.length > 0); includeRecipe = includeRecipe && (recipeConfig.length > 0);
includeInput = includeInput && (inputStr.length > 0) && (inputStr.length < 8000); includeInput = includeInput && (inputStr.length > 0) && (inputStr.length < 8000);
if (includeRecipe) { const params = [
link += "?recipe=" + encodeURIComponent(recipeStr); includeRecipe ? ["recipe", recipeStr] : undefined,
} includeInput ? ["input", inputStr] : undefined,
];
if (includeRecipe && includeInput) { const query = params
link += "&input=" + encodeURIComponent(inputStr); .filter(v => v)
} else if (includeInput) { .map(([key, value]) => `${key}=${encodeURIComponent(value)}`)
link += "?input=" + encodeURIComponent(inputStr); .join("&");
if (query) {
return `${link}?${query}`;
} }
return link; return link;
@ -195,7 +199,7 @@ ControlsWaiter.prototype.generateStateUrl = function(includeRecipe, includeInput
*/ */
ControlsWaiter.prototype.saveTextChange = function() { ControlsWaiter.prototype.saveTextChange = function() {
try { try {
var recipeConfig = JSON.parse(document.getElementById("save-text").value); const recipeConfig = JSON.parse(document.getElementById("save-text").value);
this.initialiseSaveLink(recipeConfig); this.initialiseSaveLink(recipeConfig);
} catch (err) {} } catch (err) {}
}; };
@ -205,8 +209,8 @@ ControlsWaiter.prototype.saveTextChange = function() {
* Handler for the 'Save' command. Pops up the save dialog box. * Handler for the 'Save' command. Pops up the save dialog box.
*/ */
ControlsWaiter.prototype.saveClick = function() { ControlsWaiter.prototype.saveClick = function() {
var recipeConfig = this.app.getRecipeConfig(), const recipeConfig = this.app.getRecipeConfig();
recipeStr = JSON.stringify(recipeConfig).replace(/},{/g, "},\n{"); const recipeStr = JSON.stringify(recipeConfig).replace(/},{/g, "},\n{");
document.getElementById("save-text").value = recipeStr; document.getElementById("save-text").value = recipeStr;
@ -244,15 +248,15 @@ ControlsWaiter.prototype.loadClick = function() {
* Saves the recipe specified in the save textarea to local storage. * Saves the recipe specified in the save textarea to local storage.
*/ */
ControlsWaiter.prototype.saveButtonClick = function() { ControlsWaiter.prototype.saveButtonClick = function() {
var recipeName = Utils.escapeHtml(document.getElementById("save-name").value), const recipeName = Utils.escapeHtml(document.getElementById("save-name").value);
recipeStr = document.getElementById("save-text").value; const recipeStr = document.getElementById("save-text").value;
if (!recipeName) { if (!recipeName) {
this.app.alert("Please enter a recipe name", "danger", 2000); this.app.alert("Please enter a recipe name", "danger", 2000);
return; return;
} }
var savedRecipes = localStorage.savedRecipes ? let savedRecipes = localStorage.savedRecipes ?
JSON.parse(localStorage.savedRecipes) : [], JSON.parse(localStorage.savedRecipes) : [],
recipeId = localStorage.recipeId || 0; recipeId = localStorage.recipeId || 0;
@ -273,20 +277,20 @@ ControlsWaiter.prototype.saveButtonClick = function() {
* Populates the list of saved recipes in the load dialog box from local storage. * Populates the list of saved recipes in the load dialog box from local storage.
*/ */
ControlsWaiter.prototype.populateLoadRecipesList = function() { ControlsWaiter.prototype.populateLoadRecipesList = function() {
var loadNameEl = document.getElementById("load-name"); const loadNameEl = document.getElementById("load-name");
// Remove current recipes from select // Remove current recipes from select
var i = loadNameEl.options.length; let i = loadNameEl.options.length;
while (i--) { while (i--) {
loadNameEl.remove(i); loadNameEl.remove(i);
} }
// Add recipes to select // Add recipes to select
var savedRecipes = localStorage.savedRecipes ? const savedRecipes = localStorage.savedRecipes ?
JSON.parse(localStorage.savedRecipes) : []; JSON.parse(localStorage.savedRecipes) : [];
for (i = 0; i < savedRecipes.length; i++) { for (i = 0; i < savedRecipes.length; i++) {
var opt = document.createElement("option"); const opt = document.createElement("option");
opt.value = savedRecipes[i].id; opt.value = savedRecipes[i].id;
// Unescape then re-escape in case localStorage has been corrupted // Unescape then re-escape in case localStorage has been corrupted
opt.innerHTML = Utils.escapeHtml(Utils.unescapeHtml(savedRecipes[i].name)); opt.innerHTML = Utils.escapeHtml(Utils.unescapeHtml(savedRecipes[i].name));
@ -303,13 +307,11 @@ ControlsWaiter.prototype.populateLoadRecipesList = function() {
* Removes the currently selected recipe from local storage. * Removes the currently selected recipe from local storage.
*/ */
ControlsWaiter.prototype.loadDeleteClick = function() { ControlsWaiter.prototype.loadDeleteClick = function() {
var id = parseInt(document.getElementById("load-name").value, 10), const id = parseInt(document.getElementById("load-name").value, 10);
savedRecipes = localStorage.savedRecipes ? const rawSavedRecipes = localStorage.savedRecipes ?
JSON.parse(localStorage.savedRecipes) : []; JSON.parse(localStorage.savedRecipes) : [];
savedRecipes = savedRecipes.filter(function(r) { const savedRecipes = rawSavedRecipes.filter(r => r.id !== id);
return r.id !== id;
});
localStorage.savedRecipes = JSON.stringify(savedRecipes); localStorage.savedRecipes = JSON.stringify(savedRecipes);
this.populateLoadRecipesList(); this.populateLoadRecipesList();
@ -320,14 +322,12 @@ ControlsWaiter.prototype.loadDeleteClick = function() {
* Displays the selected recipe in the load text box. * Displays the selected recipe in the load text box.
*/ */
ControlsWaiter.prototype.loadNameChange = function(e) { ControlsWaiter.prototype.loadNameChange = function(e) {
var el = e.target, const el = e.target;
savedRecipes = localStorage.savedRecipes ? const savedRecipes = localStorage.savedRecipes ?
JSON.parse(localStorage.savedRecipes) : [], JSON.parse(localStorage.savedRecipes) : [];
id = parseInt(el.value, 10); const id = parseInt(el.value, 10);
var recipe = savedRecipes.filter(function(r) { const recipe = savedRecipes.find(r => r.id === id);
return r.id === id;
})[0];
document.getElementById("load-text").value = recipe.recipe; document.getElementById("load-text").value = recipe.recipe;
}; };
@ -338,7 +338,7 @@ ControlsWaiter.prototype.loadNameChange = function(e) {
*/ */
ControlsWaiter.prototype.loadButtonClick = function() { ControlsWaiter.prototype.loadButtonClick = function() {
try { try {
var recipeConfig = JSON.parse(document.getElementById("load-text").value); const recipeConfig = JSON.parse(document.getElementById("load-text").value);
this.app.setRecipeConfig(recipeConfig); this.app.setRecipeConfig(recipeConfig);
$("#rec-list [data-toggle=popover]").popover(); $("#rec-list [data-toggle=popover]").popover();
@ -352,8 +352,8 @@ ControlsWaiter.prototype.loadButtonClick = function() {
* Populates the bug report information box with useful technical info. * Populates the bug report information box with useful technical info.
*/ */
ControlsWaiter.prototype.supportButtonClick = function() { ControlsWaiter.prototype.supportButtonClick = function() {
var reportBugInfo = document.getElementById("report-bug-info"), const reportBugInfo = document.getElementById("report-bug-info");
saveLink = this.generateStateUrl(true, true, null, "https://gchq.github.io/CyberChef/"); const saveLink = this.generateStateUrl(true, true, null, "https://gchq.github.io/CyberChef/");
reportBugInfo.innerHTML = "* CyberChef compile time: " + COMPILE_TIME + "\n" + reportBugInfo.innerHTML = "* CyberChef compile time: " + COMPILE_TIME + "\n" +
"* User-Agent: \n" + navigator.userAgent + "\n" + "* User-Agent: \n" + navigator.userAgent + "\n" +

View file

@ -9,7 +9,7 @@
* @param {string} name - The name of the category. * @param {string} name - The name of the category.
* @param {boolean} selected - Whether this category is pre-selected or not. * @param {boolean} selected - Whether this category is pre-selected or not.
*/ */
var HTMLCategory = function(name, selected) { const HTMLCategory = function(name, selected) {
this.name = name; this.name = name;
this.selected = selected; this.selected = selected;
this.opList = []; this.opList = [];
@ -32,8 +32,8 @@ HTMLCategory.prototype.addOperation = function(operation) {
* @returns {string} * @returns {string}
*/ */
HTMLCategory.prototype.toHtml = function() { HTMLCategory.prototype.toHtml = function() {
var catName = "cat" + this.name.replace(/[\s/-:_]/g, ""); const catName = "cat" + this.name.replace(/[\s/-:_]/g, "");
var html = "<div class='panel category'>\ let html = "<div class='panel category'>\
<a class='category-title' data-toggle='collapse'\ <a class='category-title' data-toggle='collapse'\
data-parent='#categories' href='#" + catName + "'>\ data-parent='#categories' href='#" + catName + "'>\
" + this.name + "\ " + this.name + "\
@ -41,7 +41,7 @@ HTMLCategory.prototype.toHtml = function() {
<div id='" + catName + "' class='panel-collapse collapse\ <div id='" + catName + "' class='panel-collapse collapse\
" + (this.selected ? " in" : "") + "'><ul class='op-list'>"; " + (this.selected ? " in" : "") + "'><ul class='op-list'>";
for (var i = 0; i < this.opList.length; i++) { for (let i = 0; i < this.opList.length; i++) {
html += this.opList[i].toStubHtml(); html += this.opList[i].toStubHtml();
} }

View file

@ -10,7 +10,7 @@
* @param {App} app - The main view object for CyberChef. * @param {App} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager. * @param {Manager} manager - The CyberChef event manager.
*/ */
var HTMLIngredient = function(config, app, manager) { const HTMLIngredient = function(config, app, manager) {
this.app = app; this.app = app;
this.manager = manager; this.manager = manager;
@ -32,7 +32,7 @@ var HTMLIngredient = function(config, app, manager) {
* @returns {string} * @returns {string}
*/ */
HTMLIngredient.prototype.toHtml = function() { HTMLIngredient.prototype.toHtml = function() {
var inline = (this.type === "boolean" || let inline = (this.type === "boolean" ||
this.type === "number" || this.type === "number" ||
this.type === "option" || this.type === "option" ||
this.type === "shortString" || this.type === "shortString" ||
@ -158,15 +158,14 @@ HTMLIngredient.prototype.toHtml = function() {
* @param {event} e * @param {event} e
*/ */
HTMLIngredient.prototype.toggleDisableArgs = function(e) { HTMLIngredient.prototype.toggleDisableArgs = function(e) {
var el = e.target, const el = e.target;
op = el.parentNode.parentNode, const op = el.parentNode.parentNode;
args = op.querySelectorAll(".arg-group"), const args = op.querySelectorAll(".arg-group");
els;
for (var i = 0; i < this.disableArgs.length; i++) { for (let i = 0; i < this.disableArgs.length; i++) {
els = args[this.disableArgs[i]].querySelectorAll("input, select, button"); const els = args[this.disableArgs[i]].querySelectorAll("input, select, button");
for (var j = 0; j < els.length; j++) { for (let j = 0; j < els.length; j++) {
if (els[j].getAttribute("disabled")) { if (els[j].getAttribute("disabled")) {
els[j].removeAttribute("disabled"); els[j].removeAttribute("disabled");
} else { } else {
@ -186,9 +185,9 @@ HTMLIngredient.prototype.toggleDisableArgs = function(e) {
* @param {event} e * @param {event} e
*/ */
HTMLIngredient.prototype.populateOptionChange = function(e) { HTMLIngredient.prototype.populateOptionChange = function(e) {
var el = e.target, const el = e.target;
op = el.parentNode.parentNode, const op = el.parentNode.parentNode;
target = op.querySelectorAll(".arg-group")[this.target].querySelector("input, select, textarea"); const target = op.querySelectorAll(".arg-group")[this.target].querySelector("input, select, textarea");
target.value = el.childNodes[el.selectedIndex].getAttribute("populate-value"); target.value = el.childNodes[el.selectedIndex].getAttribute("populate-value");
@ -203,7 +202,7 @@ HTMLIngredient.prototype.populateOptionChange = function(e) {
* @param {event} e * @param {event} e
*/ */
HTMLIngredient.prototype.editableOptionChange = function(e) { HTMLIngredient.prototype.editableOptionChange = function(e) {
var select = e.target, let select = e.target,
input = select.nextSibling; input = select.nextSibling;
input.value = select.childNodes[select.selectedIndex].value; input.value = select.childNodes[select.selectedIndex].value;

View file

@ -14,7 +14,7 @@ import HTMLIngredient from "./HTMLIngredient.js";
* @param {App} app - The main view object for CyberChef. * @param {App} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager. * @param {Manager} manager - The CyberChef event manager.
*/ */
var HTMLOperation = function(name, config, app, manager) { const HTMLOperation = function(name, config, app, manager) {
this.app = app; this.app = app;
this.manager = manager; this.manager = manager;
@ -24,8 +24,8 @@ var HTMLOperation = function(name, config, app, manager) {
this.config = config; this.config = config;
this.ingList = []; this.ingList = [];
for (var i = 0; i < config.args.length; i++) { for (let i = 0; i < config.args.length; i++) {
var ing = new HTMLIngredient(config.args[i], this.app, this.manager); const ing = new HTMLIngredient(config.args[i], this.app, this.manager);
this.ingList.push(ing); this.ingList.push(ing);
} }
}; };
@ -47,7 +47,7 @@ HTMLOperation.REMOVE_ICON = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABwkl
* @returns {string} * @returns {string}
*/ */
HTMLOperation.prototype.toStubHtml = function(removeIcon) { HTMLOperation.prototype.toStubHtml = function(removeIcon) {
var html = "<li class='operation'"; let html = "<li class='operation'";
if (this.description) { if (this.description) {
html += " data-container='body' data-toggle='popover' data-placement='auto right'\ html += " data-container='body' data-toggle='popover' data-placement='auto right'\
@ -77,9 +77,9 @@ HTMLOperation.prototype.toStubHtml = function(removeIcon) {
* @returns {string} * @returns {string}
*/ */
HTMLOperation.prototype.toFullHtml = function() { HTMLOperation.prototype.toFullHtml = function() {
var html = "<div class='arg-title'>" + this.name + "</div>"; let html = "<div class='arg-title'>" + this.name + "</div>";
for (var i = 0; i < this.ingList.length; i++) { for (let i = 0; i < this.ingList.length; i++) {
html += this.ingList[i].toHtml(); html += this.ingList[i].toHtml();
} }

View file

@ -11,7 +11,7 @@ import Utils from "../core/Utils.js";
* @constructor * @constructor
* @param {App} app - The main view object for CyberChef. * @param {App} app - The main view object for CyberChef.
*/ */
var HighlighterWaiter = function(app) { const HighlighterWaiter = function(app) {
this.app = app; this.app = app;
this.mouseButtonDown = false; this.mouseButtonDown = false;
@ -41,11 +41,11 @@ HighlighterWaiter.OUTPUT = 1;
* @returns {boolean} * @returns {boolean}
*/ */
HighlighterWaiter.prototype._isSelectionBackwards = function() { HighlighterWaiter.prototype._isSelectionBackwards = function() {
var backwards = false, let backwards = false,
sel = window.getSelection(); sel = window.getSelection();
if (!sel.isCollapsed) { if (!sel.isCollapsed) {
var range = document.createRange(); const range = document.createRange();
range.setStart(sel.anchorNode, sel.anchorOffset); range.setStart(sel.anchorNode, sel.anchorOffset);
range.setEnd(sel.focusNode, sel.focusOffset); range.setEnd(sel.focusNode, sel.focusOffset);
backwards = range.collapsed; backwards = range.collapsed;
@ -64,8 +64,8 @@ HighlighterWaiter.prototype._isSelectionBackwards = function() {
* @returns {number} * @returns {number}
*/ */
HighlighterWaiter.prototype._getOutputHtmlOffset = function(node, offset) { HighlighterWaiter.prototype._getOutputHtmlOffset = function(node, offset) {
var sel = window.getSelection(), const sel = window.getSelection();
range = document.createRange(); const range = document.createRange();
range.selectNodeContents(document.getElementById("output-html")); range.selectNodeContents(document.getElementById("output-html"));
range.setEnd(node, offset); range.setEnd(node, offset);
@ -85,8 +85,8 @@ HighlighterWaiter.prototype._getOutputHtmlOffset = function(node, offset) {
* @returns {number} pos.end * @returns {number} pos.end
*/ */
HighlighterWaiter.prototype._getOutputHtmlSelectionOffsets = function() { HighlighterWaiter.prototype._getOutputHtmlSelectionOffsets = function() {
var sel = window.getSelection(), const sel = window.getSelection();
range, let range,
start = 0, start = 0,
end = 0, end = 0,
backwards = false; backwards = false;
@ -121,7 +121,7 @@ HighlighterWaiter.prototype._getOutputHtmlSelectionOffsets = function() {
* @param {event} e * @param {event} e
*/ */
HighlighterWaiter.prototype.inputScroll = function(e) { HighlighterWaiter.prototype.inputScroll = function(e) {
var el = e.target; const el = e.target;
document.getElementById("input-highlighter").scrollTop = el.scrollTop; document.getElementById("input-highlighter").scrollTop = el.scrollTop;
document.getElementById("input-highlighter").scrollLeft = el.scrollLeft; document.getElementById("input-highlighter").scrollLeft = el.scrollLeft;
}; };
@ -134,7 +134,7 @@ HighlighterWaiter.prototype.inputScroll = function(e) {
* @param {event} e * @param {event} e
*/ */
HighlighterWaiter.prototype.outputScroll = function(e) { HighlighterWaiter.prototype.outputScroll = function(e) {
var el = e.target; const el = e.target;
document.getElementById("output-highlighter").scrollTop = el.scrollTop; document.getElementById("output-highlighter").scrollTop = el.scrollTop;
document.getElementById("output-highlighter").scrollLeft = el.scrollLeft; document.getElementById("output-highlighter").scrollLeft = el.scrollLeft;
}; };
@ -151,9 +151,9 @@ HighlighterWaiter.prototype.inputMousedown = function(e) {
this.mouseTarget = HighlighterWaiter.INPUT; this.mouseTarget = HighlighterWaiter.INPUT;
this.removeHighlights(); this.removeHighlights();
var el = e.target, const el = e.target;
start = el.selectionStart, const start = el.selectionStart;
end = el.selectionEnd; const end = el.selectionEnd;
if (start !== 0 || end !== 0) { if (start !== 0 || end !== 0) {
document.getElementById("input-selection-info").innerHTML = this.selectionInfo(start, end); document.getElementById("input-selection-info").innerHTML = this.selectionInfo(start, end);
@ -173,9 +173,9 @@ HighlighterWaiter.prototype.outputMousedown = function(e) {
this.mouseTarget = HighlighterWaiter.OUTPUT; this.mouseTarget = HighlighterWaiter.OUTPUT;
this.removeHighlights(); this.removeHighlights();
var el = e.target, const el = e.target;
start = el.selectionStart, const start = el.selectionStart;
end = el.selectionEnd; const end = el.selectionEnd;
if (start !== 0 || end !== 0) { if (start !== 0 || end !== 0) {
document.getElementById("output-selection-info").innerHTML = this.selectionInfo(start, end); document.getElementById("output-selection-info").innerHTML = this.selectionInfo(start, end);
@ -194,7 +194,7 @@ HighlighterWaiter.prototype.outputHtmlMousedown = function(e) {
this.mouseButtonDown = true; this.mouseButtonDown = true;
this.mouseTarget = HighlighterWaiter.OUTPUT; this.mouseTarget = HighlighterWaiter.OUTPUT;
var sel = this._getOutputHtmlSelectionOffsets(); const sel = this._getOutputHtmlSelectionOffsets();
if (sel.start !== 0 || sel.end !== 0) { if (sel.start !== 0 || sel.end !== 0) {
document.getElementById("output-selection-info").innerHTML = this.selectionInfo(sel.start, sel.end); document.getElementById("output-selection-info").innerHTML = this.selectionInfo(sel.start, sel.end);
} }
@ -244,9 +244,9 @@ HighlighterWaiter.prototype.inputMousemove = function(e) {
this.mouseTarget !== HighlighterWaiter.INPUT) this.mouseTarget !== HighlighterWaiter.INPUT)
return; return;
var el = e.target, const el = e.target;
start = el.selectionStart, const start = el.selectionStart;
end = el.selectionEnd; const end = el.selectionEnd;
if (start !== 0 || end !== 0) { if (start !== 0 || end !== 0) {
document.getElementById("input-selection-info").innerHTML = this.selectionInfo(start, end); document.getElementById("input-selection-info").innerHTML = this.selectionInfo(start, end);
@ -268,9 +268,9 @@ HighlighterWaiter.prototype.outputMousemove = function(e) {
this.mouseTarget !== HighlighterWaiter.OUTPUT) this.mouseTarget !== HighlighterWaiter.OUTPUT)
return; return;
var el = e.target, const el = e.target;
start = el.selectionStart, const start = el.selectionStart;
end = el.selectionEnd; const end = el.selectionEnd;
if (start !== 0 || end !== 0) { if (start !== 0 || end !== 0) {
document.getElementById("output-selection-info").innerHTML = this.selectionInfo(start, end); document.getElementById("output-selection-info").innerHTML = this.selectionInfo(start, end);
@ -292,7 +292,7 @@ HighlighterWaiter.prototype.outputHtmlMousemove = function(e) {
this.mouseTarget !== HighlighterWaiter.OUTPUT) this.mouseTarget !== HighlighterWaiter.OUTPUT)
return; return;
var sel = this._getOutputHtmlSelectionOffsets(); const sel = this._getOutputHtmlSelectionOffsets();
if (sel.start !== 0 || sel.end !== 0) { if (sel.start !== 0 || sel.end !== 0) {
document.getElementById("output-selection-info").innerHTML = this.selectionInfo(sel.start, sel.end); document.getElementById("output-selection-info").innerHTML = this.selectionInfo(sel.start, sel.end);
} }
@ -308,11 +308,11 @@ HighlighterWaiter.prototype.outputHtmlMousemove = function(e) {
* @returns {string} * @returns {string}
*/ */
HighlighterWaiter.prototype.selectionInfo = function(start, end) { HighlighterWaiter.prototype.selectionInfo = function(start, end) {
var width = end.toString().length; const len = end.toString().length;
width = width < 2 ? 2 : width; const width = len < 2 ? 2 : len;
var startStr = Utils.pad(start.toString(), width, " ").replace(/ /g, "&nbsp;"), const startStr = Utils.pad(start.toString(), width, " ").replace(/ /g, "&nbsp;");
endStr = Utils.pad(end.toString(), width, " ").replace(/ /g, "&nbsp;"), const endStr = Utils.pad(end.toString(), width, " ").replace(/ /g, "&nbsp;");
lenStr = Utils.pad((end-start).toString(), width, " ").replace(/ /g, "&nbsp;"); const lenStr = Utils.pad((end-start).toString(), width, " ").replace(/ /g, "&nbsp;");
return "start: " + startStr + "<br>end: " + endStr + "<br>length: " + lenStr; return "start: " + startStr + "<br>end: " + endStr + "<br>length: " + lenStr;
}; };
@ -339,16 +339,16 @@ HighlighterWaiter.prototype.removeHighlights = function() {
* @returns {Object[]} highlights[].args * @returns {Object[]} highlights[].args
*/ */
HighlighterWaiter.prototype.generateHighlightList = function() { HighlighterWaiter.prototype.generateHighlightList = function() {
var recipeConfig = this.app.getRecipeConfig(), const recipeConfig = this.app.getRecipeConfig();
highlights = []; const highlights = [];
for (var i = 0; i < recipeConfig.length; i++) { for (let i = 0; i < recipeConfig.length; i++) {
if (recipeConfig[i].disabled) continue; if (recipeConfig[i].disabled) continue;
// If any breakpoints are set, do not attempt to highlight // If any breakpoints are set, do not attempt to highlight
if (recipeConfig[i].breakpoint) return false; if (recipeConfig[i].breakpoint) return false;
var op = this.app.operations[recipeConfig[i].op]; const op = this.app.operations[recipeConfig[i].op];
// If any of the operations do not support highlighting, fail immediately. // If any of the operations do not support highlighting, fail immediately.
if (op.highlight === false || op.highlight === undefined) return false; if (op.highlight === false || op.highlight === undefined) return false;
@ -376,13 +376,13 @@ HighlighterWaiter.prototype.generateHighlightList = function() {
* @param {number} pos.end - The end offset. * @param {number} pos.end - The end offset.
*/ */
HighlighterWaiter.prototype.highlightOutput = function(pos) { HighlighterWaiter.prototype.highlightOutput = function(pos) {
var highlights = this.generateHighlightList(); const highlights = this.generateHighlightList();
if (!highlights || !this.app.autoBake_) { if (!highlights || !this.app.autoBake_) {
return false; return false;
} }
for (var i = 0; i < highlights.length; i++) { for (let i = 0; i < highlights.length; i++) {
// Remove multiple highlights before processing again // Remove multiple highlights before processing again
pos = [pos[0]]; pos = [pos[0]];
@ -411,13 +411,13 @@ HighlighterWaiter.prototype.highlightOutput = function(pos) {
* @param {number} pos.end - The end offset. * @param {number} pos.end - The end offset.
*/ */
HighlighterWaiter.prototype.highlightInput = function(pos) { HighlighterWaiter.prototype.highlightInput = function(pos) {
var highlights = this.generateHighlightList(); const highlights = this.generateHighlightList();
if (!highlights || !this.app.autoBake_) { if (!highlights || !this.app.autoBake_) {
return false; return false;
} }
for (var i = 0; i < highlights.length; i++) { for (let i = 0; i < highlights.length; i++) {
// Remove multiple highlights before processing again // Remove multiple highlights before processing again
pos = [pos[0]]; pos = [pos[0]];
@ -452,11 +452,11 @@ HighlighterWaiter.prototype.highlight = function(textarea, highlighter, pos) {
// be displayed by the HTML textarea and will mess up highlighting offsets. // be displayed by the HTML textarea and will mess up highlighting offsets.
if (!this.app.dishStr || this.app.dishStr.indexOf("\r") >= 0) return false; if (!this.app.dishStr || this.app.dishStr.indexOf("\r") >= 0) return false;
var startPlaceholder = "[startHighlight]", const startPlaceholder = "[startHighlight]";
startPlaceholderRegex = /\[startHighlight\]/g, const startPlaceholderRegex = /\[startHighlight\]/g;
endPlaceholder = "[endHighlight]", const endPlaceholder = "[endHighlight]";
endPlaceholderRegex = /\[endHighlight\]/g, const endPlaceholderRegex = /\[endHighlight\]/g;
text = textarea.value; let text = textarea.value;
// Put placeholders in position // Put placeholders in position
// If there's only one value, select that // If there's only one value, select that
@ -468,11 +468,11 @@ HighlighterWaiter.prototype.highlight = function(textarea, highlighter, pos) {
text.slice(pos[0].end, text.length); text.slice(pos[0].end, text.length);
} else { } else {
// O(n^2) - Can anyone improve this without overwriting placeholders? // O(n^2) - Can anyone improve this without overwriting placeholders?
var result = "", let result = "",
endPlaced = true; endPlaced = true;
for (var i = 0; i < text.length; i++) { for (let i = 0; i < text.length; i++) {
for (var j = 1; j < pos.length; j++) { for (let j = 1; j < pos.length; j++) {
if (pos[j].end < pos[j].start) continue; if (pos[j].end < pos[j].start) continue;
if (pos[j].start === i) { if (pos[j].start === i) {
result += startPlaceholder; result += startPlaceholder;
@ -489,7 +489,7 @@ HighlighterWaiter.prototype.highlight = function(textarea, highlighter, pos) {
text = result; text = result;
} }
var cssClass = "hl1"; const cssClass = "hl1";
//if (colour) cssClass += "-"+colour; //if (colour) cssClass += "-"+colour;
// Remove HTML tags // Remove HTML tags

View file

@ -12,7 +12,7 @@ import Utils from "../core/Utils.js";
* @param {App} app - The main view object for CyberChef. * @param {App} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager. * @param {Manager} manager - The CyberChef event manager.
*/ */
var InputWaiter = function(app, manager) { const InputWaiter = function(app, manager) {
this.app = app; this.app = app;
this.manager = manager; this.manager = manager;
@ -66,11 +66,11 @@ InputWaiter.prototype.set = function(input) {
* @param {number} lines - The number of the lines in the current input string * @param {number} lines - The number of the lines in the current input string
*/ */
InputWaiter.prototype.setInputInfo = function(length, lines) { InputWaiter.prototype.setInputInfo = function(length, lines) {
var width = length.toString().length; let width = length.toString().length;
width = width < 2 ? 2 : width; width = width < 2 ? 2 : width;
var lengthStr = Utils.pad(length.toString(), width, " ").replace(/ /g, "&nbsp;"); const lengthStr = Utils.pad(length.toString(), width, " ").replace(/ /g, "&nbsp;");
var linesStr = Utils.pad(lines.toString(), width, " ").replace(/ /g, "&nbsp;"); const linesStr = Utils.pad(lines.toString(), width, " ").replace(/ /g, "&nbsp;");
document.getElementById("input-info").innerHTML = "length: " + lengthStr + "<br>lines: " + linesStr; document.getElementById("input-info").innerHTML = "length: " + lengthStr + "<br>lines: " + linesStr;
}; };
@ -92,8 +92,8 @@ InputWaiter.prototype.inputChange = function(e) {
this.app.progress = 0; this.app.progress = 0;
// Update the input metadata info // Update the input metadata info
var inputText = this.get(), const inputText = this.get();
lines = inputText.count("\n") + 1; const lines = inputText.count("\n") + 1;
this.setInputInfo(inputText.length, lines); this.setInputInfo(inputText.length, lines);
@ -149,22 +149,22 @@ InputWaiter.prototype.inputDrop = function(e) {
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
var el = e.target, const el = e.target;
file = e.dataTransfer.files[0], const file = e.dataTransfer.files[0];
text = e.dataTransfer.getData("Text"), const text = e.dataTransfer.getData("Text");
reader = new FileReader(), const reader = new FileReader();
inputCharcode = "", let inputCharcode = "";
offset = 0, let offset = 0;
CHUNK_SIZE = 20480; // 20KB const CHUNK_SIZE = 20480; // 20KB
var setInput = function() { const setInput = function() {
if (inputCharcode.length > 100000 && this.app.autoBake_) { if (inputCharcode.length > 100000 && this.app.autoBake_) {
this.manager.controls.setAutoBake(false); this.manager.controls.setAutoBake(false);
this.app.alert("Turned off Auto Bake as the input is large", "warning", 5000); this.app.alert("Turned off Auto Bake as the input is large", "warning", 5000);
} }
this.set(inputCharcode); this.set(inputCharcode);
var recipeConfig = this.app.getRecipeConfig(); const recipeConfig = this.app.getRecipeConfig();
if (!recipeConfig[0] || recipeConfig[0].op !== "From Hex") { if (!recipeConfig[0] || recipeConfig[0].op !== "From Hex") {
recipeConfig.unshift({op:"From Hex", args:["Space"]}); recipeConfig.unshift({op:"From Hex", args:["Space"]});
this.app.setRecipeConfig(recipeConfig); this.app.setRecipeConfig(recipeConfig);
@ -173,18 +173,18 @@ InputWaiter.prototype.inputDrop = function(e) {
el.classList.remove("loadingFile"); el.classList.remove("loadingFile");
}.bind(this); }.bind(this);
var seek = function() { const seek = function() {
if (offset >= file.size) { if (offset >= file.size) {
setInput(); setInput();
return; return;
} }
el.value = "Processing... " + Math.round(offset / file.size * 100) + "%"; el.value = "Processing... " + Math.round(offset / file.size * 100) + "%";
var slice = file.slice(offset, offset + CHUNK_SIZE); const slice = file.slice(offset, offset + CHUNK_SIZE);
reader.readAsArrayBuffer(slice); reader.readAsArrayBuffer(slice);
}; };
reader.onload = function(e) { reader.onload = function(e) {
var data = new Uint8Array(reader.result); const data = new Uint8Array(reader.result);
inputCharcode += Utils.toHexFast(data); inputCharcode += Utils.toHexFast(data);
offset += CHUNK_SIZE; offset += CHUNK_SIZE;
seek(); seek();

View file

@ -19,7 +19,7 @@ import SeasonalWaiter from "./SeasonalWaiter.js";
* @constructor * @constructor
* @param {App} app - The main view object for CyberChef. * @param {App} app - The main view object for CyberChef.
*/ */
var Manager = function(app) { const Manager = function(app) {
this.app = app; this.app = app;
// Define custom events // Define custom events
@ -195,8 +195,8 @@ Manager.prototype.addListeners = function(selector, eventType, callback, scope)
* this.addMultiEventListener("search", "keyup paste search", this.search, this); * this.addMultiEventListener("search", "keyup paste search", this.search, this);
*/ */
Manager.prototype.addMultiEventListener = function(selector, eventTypes, callback, scope) { Manager.prototype.addMultiEventListener = function(selector, eventTypes, callback, scope) {
var evs = eventTypes.split(" "); const evs = eventTypes.split(" ");
for (var i = 0; i < evs.length; i++) { for (let i = 0; i < evs.length; i++) {
document.querySelector(selector).addEventListener(evs[i], callback.bind(scope)); document.querySelector(selector).addEventListener(evs[i], callback.bind(scope));
} }
}; };
@ -216,8 +216,8 @@ Manager.prototype.addMultiEventListener = function(selector, eventTypes, callbac
* this.addMultiEventListener(".saveable", "keyup paste", this.save, this); * this.addMultiEventListener(".saveable", "keyup paste", this.save, this);
*/ */
Manager.prototype.addMultiEventListeners = function(selector, eventTypes, callback, scope) { Manager.prototype.addMultiEventListeners = function(selector, eventTypes, callback, scope) {
var evs = eventTypes.split(" "); const evs = eventTypes.split(" ");
for (var i = 0; i < evs.length; i++) { for (let i = 0; i < evs.length; i++) {
this.addListeners(selector, evs[i], callback, scope); this.addListeners(selector, evs[i], callback, scope);
} }
}; };
@ -238,7 +238,7 @@ Manager.prototype.addMultiEventListeners = function(selector, eventTypes, callba
* this.addDynamicListener("button", "click", alert, this); * this.addDynamicListener("button", "click", alert, this);
*/ */
Manager.prototype.addDynamicListener = function(selector, eventType, callback, scope) { Manager.prototype.addDynamicListener = function(selector, eventType, callback, scope) {
var eventConfig = { const eventConfig = {
selector: selector, selector: selector,
callback: callback.bind(scope || this) callback: callback.bind(scope || this)
}; };
@ -261,15 +261,16 @@ Manager.prototype.addDynamicListener = function(selector, eventType, callback, s
* @param {Event} e - The event to be handled * @param {Event} e - The event to be handled
*/ */
Manager.prototype.dynamicListenerHandler = function(e) { Manager.prototype.dynamicListenerHandler = function(e) {
var handlers = this.dynamicHandlers[e.type], const { type, target } = e;
matches = e.target.matches || const handlers = this.dynamicHandlers[type];
e.target.webkitMatchesSelector || const matches = target.matches ||
e.target.mozMatchesSelector || target.webkitMatchesSelector ||
e.target.msMatchesSelector || target.mozMatchesSelector ||
e.target.oMatchesSelector; target.msMatchesSelector ||
target.oMatchesSelector;
for (var i = 0; i < handlers.length; i++) { for (let i = 0; i < handlers.length; i++) {
if (matches && e.target[matches.name](handlers[i].selector)) { if (matches && matches.call(target, handlers[i].selector)) {
handlers[i].callback(e); handlers[i].callback(e);
} }
} }

View file

@ -13,7 +13,7 @@ import Sortable from "sortablejs";
* @param {App} app - The main view object for CyberChef. * @param {App} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager. * @param {Manager} manager - The CyberChef event manager.
*/ */
var OperationsWaiter = function(app, manager) { const OperationsWaiter = function(app, manager) {
this.app = app; this.app = app;
this.manager = manager; this.manager = manager;
@ -29,7 +29,7 @@ var OperationsWaiter = function(app, manager) {
* @param {event} e * @param {event} e
*/ */
OperationsWaiter.prototype.searchOperations = function(e) { OperationsWaiter.prototype.searchOperations = function(e) {
var ops, selected; let ops, selected;
if (e.type === "search") { // Search if (e.type === "search") { // Search
e.preventDefault(); e.preventDefault();
@ -68,9 +68,9 @@ OperationsWaiter.prototype.searchOperations = function(e) {
ops[selected-1].classList.add("selected-op"); ops[selected-1].classList.add("selected-op");
} }
} else { } else {
var searchResultsEl = document.getElementById("search-results"), const searchResultsEl = document.getElementById("search-results");
el = e.target, const el = e.target;
str = el.value; const str = el.value;
while (searchResultsEl.firstChild) { while (searchResultsEl.firstChild) {
try { try {
@ -81,12 +81,10 @@ OperationsWaiter.prototype.searchOperations = function(e) {
$("#categories .in").collapse("hide"); $("#categories .in").collapse("hide");
if (str) { if (str) {
var matchedOps = this.filterOperations(str, true), const matchedOps = this.filterOperations(str, true);
matchedOpsHtml = ""; const matchedOpsHtml = matchedOps
.map(v => v.toStubHtml())
for (var i = 0; i < matchedOps.length; i++) { .join("");
matchedOpsHtml += matchedOps[i].toStubHtml();
}
searchResultsEl.innerHTML = matchedOpsHtml; searchResultsEl.innerHTML = matchedOpsHtml;
searchResultsEl.dispatchEvent(this.manager.oplistcreate); searchResultsEl.dispatchEvent(this.manager.oplistcreate);
@ -103,19 +101,19 @@ OperationsWaiter.prototype.searchOperations = function(e) {
* name and description * name and description
* @returns {string[]} * @returns {string[]}
*/ */
OperationsWaiter.prototype.filterOperations = function(searchStr, highlight) { OperationsWaiter.prototype.filterOperations = function(inStr, highlight) {
var matchedOps = [], const matchedOps = [];
matchedDescs = []; const matchedDescs = [];
searchStr = searchStr.toLowerCase(); const searchStr = inStr.toLowerCase();
for (var opName in this.app.operations) { for (const opName in this.app.operations) {
var op = this.app.operations[opName], const op = this.app.operations[opName];
namePos = opName.toLowerCase().indexOf(searchStr), const namePos = opName.toLowerCase().indexOf(searchStr);
descPos = op.description.toLowerCase().indexOf(searchStr); const descPos = op.description.toLowerCase().indexOf(searchStr);
if (namePos >= 0 || descPos >= 0) { if (namePos >= 0 || descPos >= 0) {
var operation = new HTMLOperation(opName, this.app.operations[opName], this.app, this.manager); const operation = new HTMLOperation(opName, this.app.operations[opName], this.app, this.manager);
if (highlight) { if (highlight) {
operation.highlightSearchString(searchStr, namePos, descPos); operation.highlightSearchString(searchStr, namePos, descPos);
} }
@ -140,7 +138,7 @@ OperationsWaiter.prototype.filterOperations = function(searchStr, highlight) {
* @returns {number} * @returns {number}
*/ */
OperationsWaiter.prototype.getSelectedOp = function(ops) { OperationsWaiter.prototype.getSelectedOp = function(ops) {
for (var i = 0; i < ops.length; i++) { for (let i = 0; i < ops.length; i++) {
if (ops[i].classList.contains("selected-op")) { if (ops[i].classList.contains("selected-op")) {
return i; return i;
} }
@ -168,7 +166,7 @@ OperationsWaiter.prototype.opListCreate = function(e) {
* @param {event} e * @param {event} e
*/ */
OperationsWaiter.prototype.operationDblclick = function(e) { OperationsWaiter.prototype.operationDblclick = function(e) {
var li = e.target; const li = e.target;
this.manager.recipe.addOperation(li.textContent); this.manager.recipe.addOperation(li.textContent);
this.app.autoBake(); this.app.autoBake();
@ -186,25 +184,25 @@ OperationsWaiter.prototype.editFavouritesClick = function(e) {
e.stopPropagation(); e.stopPropagation();
// Add favourites to modal // Add favourites to modal
var favCat = this.app.categories.filter(function(c) { const favCat = this.app.categories.filter(function(c) {
return c.name === "Favourites"; return c.name === "Favourites";
})[0]; })[0];
var html = ""; let html = "";
for (var i = 0; i < favCat.ops.length; i++) { for (let i = 0; i < favCat.ops.length; i++) {
var opName = favCat.ops[i]; const opName = favCat.ops[i];
var operation = new HTMLOperation(opName, this.app.operations[opName], this.app, this.manager); const operation = new HTMLOperation(opName, this.app.operations[opName], this.app, this.manager);
html += operation.toStubHtml(true); html += operation.toStubHtml(true);
} }
var editFavouritesList = document.getElementById("edit-favourites-list"); const editFavouritesList = document.getElementById("edit-favourites-list");
editFavouritesList.innerHTML = html; editFavouritesList.innerHTML = html;
this.removeIntent = false; this.removeIntent = false;
var editableList = Sortable.create(editFavouritesList, { const editableList = Sortable.create(editFavouritesList, {
filter: ".remove-icon", filter: ".remove-icon",
onFilter: function (evt) { onFilter: function (evt) {
var el = editableList.closest(evt.item); const el = editableList.closest(evt.item);
if (el) { if (el) {
$(el).popover("destroy"); $(el).popover("destroy");
el.parentNode.removeChild(el); el.parentNode.removeChild(el);
@ -236,12 +234,8 @@ OperationsWaiter.prototype.editFavouritesClick = function(e) {
* Saves the selected favourites and reloads them. * Saves the selected favourites and reloads them.
*/ */
OperationsWaiter.prototype.saveFavouritesClick = function() { OperationsWaiter.prototype.saveFavouritesClick = function() {
var favouritesList = [], const favs = document.querySelectorAll("#edit-favourites-list li");
favs = document.querySelectorAll("#edit-favourites-list li"); const favouritesList = Array.from(favs, e => e.textContent);
for (var i = 0; i < favs.length; i++) {
favouritesList.push(favs[i].textContent);
}
this.app.saveFavourites(favouritesList); this.app.saveFavourites(favouritesList);
this.app.loadFavourites(); this.app.loadFavourites();
@ -266,7 +260,7 @@ OperationsWaiter.prototype.resetFavouritesClick = function() {
* @param {event} e * @param {event} e
*/ */
OperationsWaiter.prototype.opIconMouseover = function(e) { OperationsWaiter.prototype.opIconMouseover = function(e) {
var opEl = e.target.parentNode; const opEl = e.target.parentNode;
if (e.target.getAttribute("data-toggle") === "popover") { if (e.target.getAttribute("data-toggle") === "popover") {
$(opEl).popover("hide"); $(opEl).popover("hide");
} }
@ -281,8 +275,8 @@ OperationsWaiter.prototype.opIconMouseover = function(e) {
* @param {event} e * @param {event} e
*/ */
OperationsWaiter.prototype.opIconMouseleave = function(e) { OperationsWaiter.prototype.opIconMouseleave = function(e) {
var opEl = e.target.parentNode, const opEl = e.target.parentNode;
toEl = e.toElement || e.relatedElement; const toEl = e.toElement || e.relatedElement;
if (e.target.getAttribute("data-toggle") === "popover" && toEl === opEl) { if (e.target.getAttribute("data-toggle") === "popover" && toEl === opEl) {
$(opEl).popover("show"); $(opEl).popover("show");

View file

@ -8,7 +8,7 @@
* @constructor * @constructor
* @param {App} app - The main view object for CyberChef. * @param {App} app - The main view object for CyberChef.
*/ */
var OptionsWaiter = function(app) { const OptionsWaiter = function(app) {
this.app = app; this.app = app;
}; };
@ -24,23 +24,24 @@ OptionsWaiter.prototype.load = function(options) {
animate: false, animate: false,
}); });
for (var option in options) { for (const option in options) {
this.app.options[option] = options[option]; this.app.options[option] = options[option];
} }
// Set options to match object // Set options to match object
var cboxes = document.querySelectorAll("#options-body input[type=checkbox]"); const cboxes = document.querySelectorAll("#options-body input[type=checkbox]");
for (var i = 0; i < cboxes.length; i++) { let i;
for (i = 0; i < cboxes.length; i++) {
$(cboxes[i]).bootstrapSwitch("state", this.app.options[cboxes[i].getAttribute("option")]); $(cboxes[i]).bootstrapSwitch("state", this.app.options[cboxes[i].getAttribute("option")]);
} }
var nboxes = document.querySelectorAll("#options-body input[type=number]"); const nboxes = document.querySelectorAll("#options-body input[type=number]");
for (i = 0; i < nboxes.length; i++) { for (i = 0; i < nboxes.length; i++) {
nboxes[i].value = this.app.options[nboxes[i].getAttribute("option")]; nboxes[i].value = this.app.options[nboxes[i].getAttribute("option")];
nboxes[i].dispatchEvent(new CustomEvent("change", {bubbles: true})); nboxes[i].dispatchEvent(new CustomEvent("change", {bubbles: true}));
} }
var selects = document.querySelectorAll("#options-body select"); const selects = document.querySelectorAll("#options-body select");
for (i = 0; i < selects.length; i++) { for (i = 0; i < selects.length; i++) {
selects[i].value = this.app.options[selects[i].getAttribute("option")]; selects[i].value = this.app.options[selects[i].getAttribute("option")];
selects[i].dispatchEvent(new CustomEvent("change", {bubbles: true})); selects[i].dispatchEvent(new CustomEvent("change", {bubbles: true}));
@ -74,8 +75,8 @@ OptionsWaiter.prototype.resetOptionsClick = function() {
* @param {boolean} state * @param {boolean} state
*/ */
OptionsWaiter.prototype.switchChange = function(e, state) { OptionsWaiter.prototype.switchChange = function(e, state) {
var el = e.target, const el = e.target;
option = el.getAttribute("option"); const option = el.getAttribute("option");
this.app.options[option] = state; this.app.options[option] = state;
localStorage.setItem("options", JSON.stringify(this.app.options)); localStorage.setItem("options", JSON.stringify(this.app.options));
@ -89,8 +90,8 @@ OptionsWaiter.prototype.switchChange = function(e, state) {
* @param {event} e * @param {event} e
*/ */
OptionsWaiter.prototype.numberChange = function(e) { OptionsWaiter.prototype.numberChange = function(e) {
var el = e.target, const el = e.target;
option = el.getAttribute("option"); const option = el.getAttribute("option");
this.app.options[option] = parseInt(el.value, 10); this.app.options[option] = parseInt(el.value, 10);
localStorage.setItem("options", JSON.stringify(this.app.options)); localStorage.setItem("options", JSON.stringify(this.app.options));
@ -104,8 +105,8 @@ OptionsWaiter.prototype.numberChange = function(e) {
* @param {event} e * @param {event} e
*/ */
OptionsWaiter.prototype.selectChange = function(e) { OptionsWaiter.prototype.selectChange = function(e) {
var el = e.target, const el = e.target;
option = el.getAttribute("option"); const option = el.getAttribute("option");
this.app.options[option] = el.value; this.app.options[option] = el.value;
localStorage.setItem("options", JSON.stringify(this.app.options)); localStorage.setItem("options", JSON.stringify(this.app.options));

View file

@ -12,7 +12,7 @@ import Utils from "../core/Utils.js";
* @param {App} app - The main view object for CyberChef. * @param {App} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager. * @param {Manager} manager - The CyberChef event manager.
*/ */
var OutputWaiter = function(app, manager) { const OutputWaiter = function(app, manager) {
this.app = app; this.app = app;
this.manager = manager; this.manager = manager;
}; };
@ -36,10 +36,10 @@ OutputWaiter.prototype.get = function() {
* @param {number} duration - The length of time (ms) it took to generate the output * @param {number} duration - The length of time (ms) it took to generate the output
*/ */
OutputWaiter.prototype.set = function(dataStr, type, duration) { OutputWaiter.prototype.set = function(dataStr, type, duration) {
var outputText = document.getElementById("output-text"), const outputText = document.getElementById("output-text");
outputHtml = document.getElementById("output-html"), const outputHtml = document.getElementById("output-html");
outputHighlighter = document.getElementById("output-highlighter"), const outputHighlighter = document.getElementById("output-highlighter");
inputHighlighter = document.getElementById("input-highlighter"); const inputHighlighter = document.getElementById("input-highlighter");
if (type === "html") { if (type === "html") {
outputText.style.display = "none"; outputText.style.display = "none";
@ -51,8 +51,8 @@ OutputWaiter.prototype.set = function(dataStr, type, duration) {
outputHtml.innerHTML = dataStr; outputHtml.innerHTML = dataStr;
// Execute script sections // Execute script sections
var scriptElements = outputHtml.querySelectorAll("script"); const scriptElements = outputHtml.querySelectorAll("script");
for (var i = 0; i < scriptElements.length; i++) { for (let i = 0; i < scriptElements.length; i++) {
try { try {
eval(scriptElements[i].innerHTML); // eslint-disable-line no-eval eval(scriptElements[i].innerHTML); // eslint-disable-line no-eval
} catch (err) { } catch (err) {
@ -70,7 +70,7 @@ OutputWaiter.prototype.set = function(dataStr, type, duration) {
} }
this.manager.highlighter.removeHighlights(); this.manager.highlighter.removeHighlights();
var lines = dataStr.count("\n") + 1; const lines = dataStr.count("\n") + 1;
this.setOutputInfo(dataStr.length, lines, duration); this.setOutputInfo(dataStr.length, lines, duration);
}; };
@ -83,12 +83,12 @@ OutputWaiter.prototype.set = function(dataStr, type, duration) {
* @param {number} duration - The length of time (ms) it took to generate the output * @param {number} duration - The length of time (ms) it took to generate the output
*/ */
OutputWaiter.prototype.setOutputInfo = function(length, lines, duration) { OutputWaiter.prototype.setOutputInfo = function(length, lines, duration) {
var width = length.toString().length; let width = length.toString().length;
width = width < 4 ? 4 : width; width = width < 4 ? 4 : width;
var lengthStr = Utils.pad(length.toString(), width, " ").replace(/ /g, "&nbsp;"); const lengthStr = Utils.pad(length.toString(), width, " ").replace(/ /g, "&nbsp;");
var linesStr = Utils.pad(lines.toString(), width, " ").replace(/ /g, "&nbsp;"); const linesStr = Utils.pad(lines.toString(), width, " ").replace(/ /g, "&nbsp;");
var timeStr = Utils.pad(duration.toString() + "ms", width, " ").replace(/ /g, "&nbsp;"); const timeStr = Utils.pad(duration.toString() + "ms", width, " ").replace(/ /g, "&nbsp;");
document.getElementById("output-info").innerHTML = "time: " + timeStr + document.getElementById("output-info").innerHTML = "time: " + timeStr +
"<br>length: " + lengthStr + "<br>length: " + lengthStr +
@ -103,11 +103,11 @@ OutputWaiter.prototype.setOutputInfo = function(length, lines, duration) {
* without wrapping or overflowing. * without wrapping or overflowing.
*/ */
OutputWaiter.prototype.adjustWidth = function() { OutputWaiter.prototype.adjustWidth = function() {
var output = document.getElementById("output"), const output = document.getElementById("output");
saveToFile = document.getElementById("save-to-file"), const saveToFile = document.getElementById("save-to-file");
switchIO = document.getElementById("switch"), const switchIO = document.getElementById("switch");
undoSwitch = document.getElementById("undo-switch"), const undoSwitch = document.getElementById("undo-switch");
maximiseOutput = document.getElementById("maximise-output"); const maximiseOutput = document.getElementById("maximise-output");
if (output.clientWidth < 680) { if (output.clientWidth < 680) {
saveToFile.childNodes[1].nodeValue = ""; saveToFile.childNodes[1].nodeValue = "";
@ -129,11 +129,11 @@ OutputWaiter.prototype.adjustWidth = function() {
* Saves the current output to a file, downloaded as a URL octet stream. * Saves the current output to a file, downloaded as a URL octet stream.
*/ */
OutputWaiter.prototype.saveClick = function() { OutputWaiter.prototype.saveClick = function() {
var data = Utils.toBase64(this.app.dishStr), const data = Utils.toBase64(this.app.dishStr);
filename = window.prompt("Please enter a filename:", "download.dat"); const filename = window.prompt("Please enter a filename:", "download.dat");
if (filename) { if (filename) {
var el = document.createElement("a"); const el = document.createElement("a");
el.setAttribute("href", "data:application/octet-stream;base64;charset=utf-8," + data); el.setAttribute("href", "data:application/octet-stream;base64;charset=utf-8," + data);
el.setAttribute("download", filename); el.setAttribute("download", filename);
@ -173,7 +173,7 @@ OutputWaiter.prototype.undoSwitchClick = function() {
* Resizes the output frame to be as large as possible, or restores it to its original size. * Resizes the output frame to be as large as possible, or restores it to its original size.
*/ */
OutputWaiter.prototype.maximiseOutputClick = function(e) { OutputWaiter.prototype.maximiseOutputClick = function(e) {
var el = e.target.id === "maximise-output" ? e.target : e.target.parentNode; const el = e.target.id === "maximise-output" ? e.target : e.target.parentNode;
if (el.getAttribute("title") === "Maximise") { if (el.getAttribute("title") === "Maximise") {
this.app.columnSplitter.collapse(0); this.app.columnSplitter.collapse(0);

View file

@ -13,7 +13,7 @@ import Sortable from "sortablejs";
* @param {App} app - The main view object for CyberChef. * @param {App} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager. * @param {Manager} manager - The CyberChef event manager.
*/ */
var RecipeWaiter = function(app, manager) { const RecipeWaiter = function(app, manager) {
this.app = app; this.app = app;
this.manager = manager; this.manager = manager;
this.removeIntent = false; this.removeIntent = false;
@ -24,7 +24,7 @@ var RecipeWaiter = function(app, manager) {
* Sets up the drag and drop capability for operations in the operations and recipe areas. * Sets up the drag and drop capability for operations in the operations and recipe areas.
*/ */
RecipeWaiter.prototype.initialiseOperationDragNDrop = function() { RecipeWaiter.prototype.initialiseOperationDragNDrop = function() {
var recList = document.getElementById("rec-list"); const recList = document.getElementById("rec-list");
// Recipe list // Recipe list
Sortable.create(recList, { Sortable.create(recList, {
@ -60,8 +60,8 @@ RecipeWaiter.prototype.initialiseOperationDragNDrop = function() {
}.bind(this)); }.bind(this));
Sortable.utils.on(recList, "touchend", function(e) { Sortable.utils.on(recList, "touchend", function(e) {
var loc = e.changedTouches[0], const loc = e.changedTouches[0];
target = document.elementFromPoint(loc.clientX, loc.clientY); const target = document.elementFromPoint(loc.clientX, loc.clientY);
this.removeIntent = !recList.contains(target); this.removeIntent = !recList.contains(target);
}.bind(this)); }.bind(this));
@ -182,7 +182,7 @@ RecipeWaiter.prototype.favDrop = function(e) {
e.preventDefault(); e.preventDefault();
e.target.classList.remove("favourites-hover"); e.target.classList.remove("favourites-hover");
var opName = e.dataTransfer.getData("Text"); const opName = e.dataTransfer.getData("Text");
this.app.addFavourite(opName); this.app.addFavourite(opName);
}; };
@ -205,7 +205,7 @@ RecipeWaiter.prototype.ingChange = function() {
* @param {event} e * @param {event} e
*/ */
RecipeWaiter.prototype.disableClick = function(e) { RecipeWaiter.prototype.disableClick = function(e) {
var icon = e.target; const icon = e.target;
if (icon.getAttribute("disabled") === "false") { if (icon.getAttribute("disabled") === "false") {
icon.setAttribute("disabled", "true"); icon.setAttribute("disabled", "true");
@ -230,7 +230,7 @@ RecipeWaiter.prototype.disableClick = function(e) {
* @param {event} e * @param {event} e
*/ */
RecipeWaiter.prototype.breakpointClick = function(e) { RecipeWaiter.prototype.breakpointClick = function(e) {
var bp = e.target; const bp = e.target;
if (bp.getAttribute("break") === "false") { if (bp.getAttribute("break") === "false") {
bp.setAttribute("break", "true"); bp.setAttribute("break", "true");
@ -276,16 +276,17 @@ RecipeWaiter.prototype.operationChildDblclick = function(e) {
* @returns {recipeConfig} * @returns {recipeConfig}
*/ */
RecipeWaiter.prototype.getConfig = function() { RecipeWaiter.prototype.getConfig = function() {
var config = [], ingredients, ingList, disabled, bp, item, const config = [];
operations = document.querySelectorAll("#rec-list li.operation"); let ingredients, ingList, disabled, bp, item;
const operations = document.querySelectorAll("#rec-list li.operation");
for (var i = 0; i < operations.length; i++) { for (let i = 0; i < operations.length; i++) {
ingredients = []; ingredients = [];
disabled = operations[i].querySelector(".disable-icon"); disabled = operations[i].querySelector(".disable-icon");
bp = operations[i].querySelector(".breakpoint"); bp = operations[i].querySelector(".breakpoint");
ingList = operations[i].querySelectorAll(".arg"); ingList = operations[i].querySelectorAll(".arg");
for (var j = 0; j < ingList.length; j++) { for (let j = 0; j < ingList.length; j++) {
if (ingList[j].getAttribute("type") === "checkbox") { if (ingList[j].getAttribute("type") === "checkbox") {
// checkbox // checkbox
ingredients[j] = ingList[j].checked; ingredients[j] = ingList[j].checked;
@ -327,8 +328,8 @@ RecipeWaiter.prototype.getConfig = function() {
* @param {number} position * @param {number} position
*/ */
RecipeWaiter.prototype.updateBreakpointIndicator = function(position) { RecipeWaiter.prototype.updateBreakpointIndicator = function(position) {
var operations = document.querySelectorAll("#rec-list li.operation"); const operations = document.querySelectorAll("#rec-list li.operation");
for (var i = 0; i < operations.length; i++) { for (let i = 0; i < operations.length; i++) {
if (i === position) { if (i === position) {
operations[i].classList.add("break"); operations[i].classList.add("break");
} else { } else {
@ -345,8 +346,8 @@ RecipeWaiter.prototype.updateBreakpointIndicator = function(position) {
* @param {element} el - The operation stub element from the operations pane * @param {element} el - The operation stub element from the operations pane
*/ */
RecipeWaiter.prototype.buildRecipeOperation = function(el) { RecipeWaiter.prototype.buildRecipeOperation = function(el) {
var opName = el.textContent; const opName = el.textContent;
var op = new HTMLOperation(opName, this.app.operations[opName], this.app, this.manager); const op = new HTMLOperation(opName, this.app.operations[opName], this.app, this.manager);
el.innerHTML = op.toFullHtml(); el.innerHTML = op.toFullHtml();
if (this.app.operations[opName].flowControl) { if (this.app.operations[opName].flowControl) {
@ -369,7 +370,7 @@ RecipeWaiter.prototype.buildRecipeOperation = function(el) {
* @returns {element} * @returns {element}
*/ */
RecipeWaiter.prototype.addOperation = function(name) { RecipeWaiter.prototype.addOperation = function(name) {
var item = document.createElement("li"); const item = document.createElement("li");
item.classList.add("operation"); item.classList.add("operation");
item.innerHTML = name; item.innerHTML = name;
@ -387,7 +388,7 @@ RecipeWaiter.prototype.addOperation = function(name) {
* @fires Manager#operationremove * @fires Manager#operationremove
*/ */
RecipeWaiter.prototype.clearRecipe = function() { RecipeWaiter.prototype.clearRecipe = function() {
var recList = document.getElementById("rec-list"); const recList = document.getElementById("rec-list");
while (recList.firstChild) { while (recList.firstChild) {
recList.removeChild(recList.firstChild); recList.removeChild(recList.firstChild);
} }
@ -402,8 +403,8 @@ RecipeWaiter.prototype.clearRecipe = function() {
* @param {event} e * @param {event} e
*/ */
RecipeWaiter.prototype.dropdownToggleClick = function(e) { RecipeWaiter.prototype.dropdownToggleClick = function(e) {
var el = e.target, const el = e.target;
button = el.parentNode.parentNode.previousSibling; const button = el.parentNode.parentNode.previousSibling;
button.innerHTML = el.textContent + " <span class='caret'></span>"; button.innerHTML = el.textContent + " <span class='caret'></span>";
this.ingChange(); this.ingChange();

View file

@ -9,7 +9,7 @@
* @param {App} app - The main view object for CyberChef. * @param {App} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager. * @param {Manager} manager - The CyberChef event manager.
*/ */
var SeasonalWaiter = function(app, manager) { const SeasonalWaiter = function(app, manager) {
this.app = app; this.app = app;
this.manager = manager; this.manager = manager;
}; };
@ -19,69 +19,12 @@ var SeasonalWaiter = function(app, manager) {
* Loads all relevant items depending on the current date. * Loads all relevant items depending on the current date.
*/ */
SeasonalWaiter.prototype.load = function() { SeasonalWaiter.prototype.load = function() {
//var now = new Date();
// SpiderChef
// if (now.getMonth() === 3 && now.getDate() === 1) { // Apr 1
// this.insertSpiderIcons();
// this.insertSpiderText();
// }
// Konami code // Konami code
this.kkeys = []; this.kkeys = [];
window.addEventListener("keydown", this.konamiCodeListener.bind(this)); window.addEventListener("keydown", this.konamiCodeListener.bind(this));
}; };
/**
* Replaces chef icons with spider icons.
* #spiderchef
*/
SeasonalWaiter.prototype.insertSpiderIcons = function() {
var spider16 = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3UlEQVQ4y2NgGJaAmYGBgVnf0oKJgYGBobWtXamqqoYTn2I4CI+LTzM2NTulpKbu+vPHz2dV5RWlluZmi3j5+KqFJSSEzpw8uQPdAEYYIzo5Kfjrl28rWFlZzjAzMYuEBQao3Lh+g+HGvbsMzExMDN++fWf4/PXLBzY2tqYNK1f2+4eHM2xcuRLigsT09Igf3384MTExbf767etBI319jU8fPsi+//jx/72HDxh5uLkZ7ty7y/Dz1687Avz8n2UUFR3Z2NjOySoqfmdhYGBg+PbtuwI7O8e5H79+8X379t357PnzYo+ePP7y6cuXc9++f69nYGRsvf/w4XdtLS2R799/bBUWFHr57sP7Jbs3b/ZkzswvUP3165fZ7z9//r988WIVAyPDr8tXr576+u3bpb9//7YwMjKeV1dV41NWVGoVEhDgPH761DJREeHaz1+/lqlpafUx6+jrRfz4+fPy+w8fTu/fsf3uw7t3L39+//4cv7DwGQYGhpdPbt9m4BcRFlNWVJC4fuvWASszs4C379792Ldt2xZBUdEdDP5hYSqQGIjDGa965uYKCalpZQwMDAxhMTG9DAwMDLaurhIkJY7A8IgGBgYGBgd3Dz2yUpeFo6O4rasrA9T24ZRxAAMTwMpgEJwLAAAAAElFTkSuQmCC",
spider32 = "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACYVBMVEUAAAAcJSU2Pz85QkM9RUWEhIWMjI2MkJEcJSU2Pz85QkM9RUWWlpc9RUVXXl4cJSU2Pz85QkM8REU9RUVRWFh6ens9RUVCSkpNVFRdY2McJSU5QkM7REQ9RUVGTk5KUlJQVldcY2Rla2uTk5WampscJSVUWltZX2BrcHF1e3scJSUjLCw9RUVASEhFTU1HTk9bYWJeZGRma2xudHV1eHiZmZocJSUyOjpJUFFQVldSWlpTWVpXXl5YXl5rb3B9fX6RkZIcJSUmLy8tNTU9RUVFTU1IT1BOVldRV1hTWlp0enocJSUfKChJUFBWXV1hZ2hnbGwcJSVETExLUlJLU1NNVVVPVlZYXl9cY2RiaGlobW5rcXFyd3h0eHgcJSUpMTFDS0tQV1dRV1hSWFlWXF1bYWJma2tobW5uc3SsrK0cJSVJUFBMVFROVlZVW1xZX2BdYmNhZ2hjaGhla2tqcHBscHE4Pz9KUlJRWVlSWVlXXF1aYGFbYWFfZWZlampqbW4cJSUgKSkiKysuNjY0PD01PT07QkNES0tHTk5JUFBMUlNMU1NOU1ROVVVPVVZRVlZRV1dSWVlWXFxXXV5aX2BbYWFbYWJcYmJcYmNcY2RdYmNgZmZhZmdkaWpkampkamtlamtla2tma2tma2xnbG1obW5pbG1pb3Bqb3Brb3BtcXJudHVvcHFvcXJvc3NwcXNwdXVxc3RzeXl1eXp2eXl3ent6e3x+gYKAhISBg4SKi4yLi4yWlpeampudnZ6fn6CkpaanqKiur6+vr7C4uLm6urq6u7u8vLy9vb3Av8DR0dL2b74UAAAAgHRSTlMAEBAQEBAQECAgICAgMDBAQEBAQEBAUFBQUGBgYGBgYGBgYGBgcHBwcHCAgICAgICAgICAgICPj4+Pj4+Pj4+Pj5+fn5+fn5+fn5+vr6+vr6+/v7+/v7+/v7+/v7+/z8/Pz8/Pz8/Pz8/P39/f39/f39/f39/f7+/v7+/v7+/v78x6RlYAAAGBSURBVDjLY2AYWUCSgUGAk4GBTdlUhQebvP7yjIgCPQbWzBMnjx5wwJSX37Rwfm1isqj9/iPHTuxYlyeMJi+yunfptBkZOw/uWj9h3vatcycu8eRGlldb3Vsts3ph/cFTh7fN3bCoe2Vf8+TZoQhTvBa6REozVC7cuPvQnmULJm1e2z+308eyJieEBSLPXbKQIUqQIczk+N6eNaumtnZMaWhaHM89m8XVCqJA02Y5w0xmga6yfVsamtrN4xoXNzS0JTHkK3CXy4EVFMumcxUy2LbENTVkZfEzMDAudtJyTmNwS2XQreAFyvOlK9louDNVaXurmjkGgnTMkWDgXswtNouFISEX6Awv+RihQi5OcYY4DtVARpCCFCMGhiJ1hjwFBpagEAaWEpFoC0WQOCOjFMRRwXYMDB4BDLJ+QLYsg7GBGjtasLnEMjCIrWBgyAZ7058FI9x1SoFEnTCDsCyIhynPILYYSFgbYpUDA5bpQBluXzxpI1yYAbd2sCMYRhwAAHB9ZPztbuMUAAAAAElFTkSuQmCC",
spider64 = "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAJZUlEQVR42u1ZaXMU1xXlJ+gHpFITOy5sAcnIYCi2aIL2bTSSZrSP1NpHK41kISQBHgFaQIJBCMwi4TFUGYcPzggwEMcxHVGxQaag5QR/np/QP+Hmnsdr0hpmtEACwulb9aq7p7d3zz333Pt61q2zzTbbbLPNNttss80222yzzTbbVmu7MzKcJRWVkXjntqam6jyURPeGQqeTpqbOqp+evxC5dGlam5m5rE3PzGi8Hzx/4aLzbXDe09HdYxwZHaPc4mLFXVoW9pRXGNv3pDngeHlNLfE2Ljjj4xPOUGjSYKfpq6/+TLdv36bbX39Nt27epGvXvqSLl6bp3LlPtdOnz7jWrPNZ7kLCKCovp5bOTmP/4EHq6vmYMtzuSKbbbQCAHE8Rxd47MjrmuHjxkjF3/z4tLCzQkyc6PX78mB49ekQPHjygub/P0d27f6FrX/6JpqbO0YkT48E1R/sCr9cYHZ+gqrp64mPq+riXcoqKKC0vP9q6VyV/fQOiH+LrsPVY7z82PBKZnb1Bd+7cpfn5eQbgCT1hAADC/MN5uj83R99881eanZ2lL5gN/nrxjihAXwvOJ7l9vuiBQ4dF9LEtLC0V+2rv/ijTX6luaCS3rxT57wADAMTBQ4c9PIIDg4PBwYOHaHhklM5MnSWkwLff/o0+v3qVHv34Iz344QEDc4d8VVXUEAhQXXMzVdQqzKweKq6oABARzOGNOZ+Wl6fD6T25ubQrPT0E5xF93o82tbdjkkZ+iZfAAgbD6fZ6o339A8S0p7HjJ2h4eIQOHf6EujlV9nX3UOj0JDXzfXje+KlTdOPGDeF0T1+fGHg+2JSen08tHZ0CiPySEoPn8vq1IaOgIAzneQK0UzjcQd6qaqrlCVfV1+tpubnRnv5+2p2ZqYMF/oZGPTh0xLhy5Sr9wLn9j++/p5nLn9FxBoLZQJ1dKrkys6iYNeTExEnx3PqWFuF4W9deKq2upkEGCyzyMBC709MFC7r391Fjayv9MSdHZyCU1xJ5FjrNdN6VnU1KS4CjU4Yoh/m8CsezCguFJgAMV05ueP+BfhF5OL+gL9A/f/qJ7t3TaPLMFB09eoy6mTkMGg2PjTELOsS20OcTACgMKqJugqA0NtE7ycn0202b6A+ZmYIVAAKApGZlgRHB/0lqQPAqFEVE9hntM0R0ZblTzeswWdCeU8HAtYW+Uu0AUx+0f/jwoXD+56c/073v7tHU2XMiFbrUfVTNAtfL10FIAQL2QftsBrOEnavld5kg7E7PoF+99x79ev162rJrV9RMi6a2dvKUlQsR5uAgII7/ivMsbEE4g2hggjzC7LQL1OftovoO0WJKUn0gYEAn2hmMXo4QHIXQIfLfsfOXPwuLvB86cpQqamooyEzg1BLMwv04RkoE+B3B4BBBMHEcCwIP0N+ByJdUVhpgBJ7j4WvdANDjeTUglOaWEChfJF7uJzPX2HEPaj1vg7EAbHO5QnAeIPgqKvUB7gtAdbBgcvKMqOnc/NAIVwCcq21qElFnCgvaI9cBBFKhlSPbPzBIbbzduGULpWzfLkDAdZs++sgEwSlZqoIJMg2CzFSNGzODwdBfOi26+w4YTCm9LhDQwQDzdzguFf4FALjciTws8/u1yyx2N2/dovPnL9DRY8PkZ204xtuhoSM0wI7V8DEiirQCCHD+99u2CUdx3Lmvmz7kfemoGDgPEDr4HNKAf1MlAC4wgMGLWFJXQUrklZSEX6rLE2rOyDIQGlhgBUAyYFEZkm2vAGVi4qQ+x83M0389pevXr6OToy07d4qcR+krr/KzqpeJ/IfjGO+npDx3FCKHVPjd1q2LAMBI3ryZ9vL7U56BEzLfD80ACFba876OlGCQV9dAcT0Pyw7PgWij6zPP5Xt9EYgg+n3LosdVzdfz5CI8KY1LH31+5Yro9KanZwjHmPzmHTsoOeVDemfDBuE8dGVnWpqx3unUrE4CDLCAG64XAHB88IFgQV5xMY7DFmc16A6CZvnNBYYVcW+yKj0A/VHTsQ8dwMPNc6X+Gg0VIGbVpzYGWundjRujmGQWi9Eol7+TJ0/R2Nhx2sNlM9YJRPDdDRsM5DGPJB4KHOIhngHhAwixAGAAuDZ2lsuiYnFWBQOYrdEYNochilyiV6YHoH+rRNJkAG+fUw31PzU7Z1EFKPD69CIuQ1Bm6URoh8tFmVym3nc6rZOPyi0cD8HxeHPg3x2InNrbS79JTsYzNXmPuBclsO3ZvKwAOJEGsmI5rT0M+gSf3y9K5LIA1LUEIlL1k0AhCYBH5r9TCqBqib4D+c/1PyInGOThkvuaHCYALhlpbQWBMGR/4IpzTqlpbKQyf0045vdoe0zATHagSYMeWFMkbscnHRYPZjoFJaIiUkz9EJy15j/X3qCsAIqMcFjSWrNE1Iygg0fEmrtLzEUTdT/OhBFht9fHDVCbEUt3LJxi08B8Xj6vTDESriq9lVWqBECgHujqiqAUmufb1X3cfRXoluhjZWiwkOnSUcUS6ZD8LUmmhks6b5j1ezkAkAKZBe5QvPPcNBnoCawMwT66Qxk0R2xwwRAui2iSDGuaPDcubzo3EJq8wcx/9Vmk3QryH42QBQCFF0UagIiJtjX6DskIXTLEucJSHIIIMuO0BOcjn3A3ybU/lu5RCUBc5qA0Ih0Q2EWiCPRk7VfMNhjLW1zETic1tLYZDMKyuSsdfh5l6bwho5+0il4kyA0VohlNcF5FP8DlWo/VB16HYB2hJ0pzgIe2mcXxP2IOumPRY17U0tll8KIkZNb+sppafOxYkQPSaYfchyYoL9GMqWYpTLRIq1QUcT4O3aPQgqVqPwIOIMwDhzX6mQUFIQAgo+9MzcrWrML3mj6+YIKiFCZyhL87RqVQKrEskF+P1BUvfLCAkfRwoPUtq6l5o5+lZb5SolJo6oT8avTCl+c9OTmat6pKW8mLkvBpGzlvsiGuQr4ZEEwA1EQgoR/gNtxIxKBluz+OtMJiF31jHxqXBiAqAUj4WRxpADFM0DCFlv1khvX7Wol4vF4AIldVVxdZqlrIfiCYQPHDy6bAGv7nKYRVY6JewExZVAP+ey5Rv+Ba97aaUHMW5NauLmMZFkegBb/EP14d6NoS9QLWFSzWBmuZza8CQmSpXsAqmGtVy14VALWuuYWWy+W3OteXa4jwceQX6+BKG6J1/8+2VCNkm2222WabbbbZZpttttlmm22rt38DCdA0vq3bcAkAAAAASUVORK5CYII=";
// Favicon
document.querySelector("link[rel=icon]").setAttribute("href", "data:image/png;base64," + spider16);
// Bake button
document.querySelector("#bake img").setAttribute("src", "data:image/png;base64," + spider32);
// About box
document.querySelector(".about-img-left").setAttribute("src", "data:image/png;base64," + spider64);
};
/**
* Replaces all instances of the word "cyber" with "spider".
* #spiderchef
*/
SeasonalWaiter.prototype.insertSpiderText = function() {
// Title
document.title = document.title.replace(/Cyber/g, "Spider");
// Body
SeasonalWaiter.treeWalk(document.body, function(node) {
// process only text nodes
if (node.nodeType === 3) {
node.nodeValue = node.nodeValue.replace(/Cyber/g, "Spider");
}
}, true);
// Bake button
SeasonalWaiter.treeWalk(document.getElementById("bake-group"), function(node) {
// process only text nodes
if (node.nodeType === 3) {
node.nodeValue = node.nodeValue.replace(/Bake/g, "Spin");
}
}, true);
// Recipe title
document.querySelector("#recipe .title").innerHTML = "Web";
};
/** /**
* Listen for the Konami code sequence of keys. Turn the page upside down if they are all heard in * Listen for the Konami code sequence of keys. Turn the page upside down if they are all heard in
* sequence. * sequence.
@ -89,8 +32,8 @@ SeasonalWaiter.prototype.insertSpiderText = function() {
*/ */
SeasonalWaiter.prototype.konamiCodeListener = function(e) { SeasonalWaiter.prototype.konamiCodeListener = function(e) {
this.kkeys.push(e.keyCode); this.kkeys.push(e.keyCode);
var konami = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65]; const konami = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65];
for (var i = 0; i < this.kkeys.length; i++) { for (let i = 0; i < this.kkeys.length; i++) {
if (this.kkeys[i] !== konami[i]) { if (this.kkeys[i] !== konami[i]) {
this.kkeys = []; this.kkeys = [];
break; break;
@ -102,53 +45,4 @@ SeasonalWaiter.prototype.konamiCodeListener = function(e) {
} }
}; };
/**
* Walks through the entire DOM starting at the specified element and operates on each node.
*
* @static
* @param {element} parent - The DOM node to start from
* @param {Function} fn - The callback function to operate on each node
* @param {booleam} allNodes - Whether to operate on every node or not
*/
SeasonalWaiter.treeWalk = (function() {
// Create closure for constants
var skipTags = {
"SCRIPT": true, "IFRAME": true, "OBJECT": true,
"EMBED": true, "STYLE": true, "LINK": true, "META": true
};
return function(parent, fn, allNodes) {
var node = parent.firstChild;
while (node && node !== parent) {
if (allNodes || node.nodeType === 1) {
if (fn(node) === false) {
return false;
}
}
// If it's an element &&
// has children &&
// has a tagname && is not in the skipTags list
// then, we can enumerate children
if (node.nodeType === 1 &&
node.firstChild &&
!(node.tagName && skipTags[node.tagName])) {
node = node.firstChild;
} else if (node.nextSibling) {
node = node.nextSibling;
} else {
// No child and no nextsibling
// Find parent that has a nextSibling
while ((node = node.parentNode) !== parent) {
if (node.nextSibling) {
node = node.nextSibling;
break;
}
}
}
}
};
})();
export default SeasonalWaiter; export default SeasonalWaiter;

View file

@ -8,7 +8,7 @@
* @constructor * @constructor
* @param {App} app - The main view object for CyberChef. * @param {App} app - The main view object for CyberChef.
*/ */
var WindowWaiter = function(app) { const WindowWaiter = function(app) {
this.app = app; this.app = app;
}; };
@ -45,7 +45,7 @@ WindowWaiter.prototype.windowBlur = function() {
* a long time and the browser has swapped out all its memory. * a long time and the browser has swapped out all its memory.
*/ */
WindowWaiter.prototype.windowFocus = function() { WindowWaiter.prototype.windowFocus = function() {
var unfocusedTime = new Date().getTime() - this.windowBlurTime; const unfocusedTime = new Date().getTime() - this.windowBlurTime;
if (unfocusedTime > 60000) { if (unfocusedTime > 60000) {
this.app.silentBake(); this.app.silentBake();
} }

View file

@ -430,3 +430,36 @@ span.btn img {
border-top: none; border-top: none;
margin-top: 0; margin-top: 0;
} }
@-moz-keyframes spinner {
from { -moz-transform: rotate(0deg); }
to { -moz-transform: rotate(359deg); }
}
@-webkit-keyframes spinner {
from { -webkit-transform: rotate(0deg); }
to { -webkit-transform: rotate(359deg); }
}
@keyframes spinner {
from {transform:rotate(0deg);}
to {transform:rotate(359deg);}
}
.loading-icon::before {
content: "\21bb";
}
.loading-icon {
-webkit-animation-name: spinner;
-webkit-animation-duration: 1000ms;
-webkit-animation-iteration-count: infinite;
-webkit-animation-timing-function: linear;
-moz-animation-name: spinner;
-moz-animation-duration: 1000ms;
-moz-animation-iteration-count: infinite;
-moz-animation-timing-function: linear;
-ms-animation-name: spinner;
-ms-animation-duration: 1000ms;
-ms-animation-iteration-count: infinite;
-ms-animation-timing-function: linear;
}

View file

@ -100,6 +100,7 @@
<div id="input" class="split no-select"> <div id="input" class="split no-select">
<div class="title no-select"> <div class="title no-select">
<label for="input-text">Input</label> <label for="input-text">Input</label>
<div class="loading-icon" style="display: none"></div>
<div class="btn-group io-btn-group"> <div class="btn-group io-btn-group">
<button type="button" class="btn btn-default btn-sm" id="clr-io"><img aria-hidden="true" src="<%- require('../static/images/recycle-16x16.png') %>" alt="Recycle Icon"/> Clear I/O</button> <button type="button" class="btn btn-default btn-sm" id="clr-io"><img aria-hidden="true" src="<%- require('../static/images/recycle-16x16.png') %>" alt="Recycle Icon"/> Clear I/O</button>
<button type="button" class="btn btn-default btn-sm" id="reset-layout"><img aria-hidden="true" src="<%- require('../static/images/layout-16x16.png') %>" alt="Grid Icon"/> Reset layout</button> <button type="button" class="btn btn-default btn-sm" id="reset-layout"><img aria-hidden="true" src="<%- require('../static/images/layout-16x16.png') %>" alt="Grid Icon"/> Reset layout</button>
@ -116,6 +117,7 @@
<div id="output" class="split"> <div id="output" class="split">
<div class="title no-select"> <div class="title no-select">
<label for="output-text">Output</label> <label for="output-text">Output</label>
<div class="loading-icon" style="display: none"></div>
<div class="btn-group io-btn-group"> <div class="btn-group io-btn-group">
<button type="button" class="btn btn-default btn-sm" id="save-to-file" title="Save to file"><img aria-hidden="true" src="<%- require('../static/images/save_as-16x16.png') %>" alt="Save Icon"/> Save to file</button> <button type="button" class="btn btn-default btn-sm" id="save-to-file" title="Save to file"><img aria-hidden="true" src="<%- require('../static/images/save_as-16x16.png') %>" alt="Save Icon"/> Save to file</button>
<button type="button" class="btn btn-default btn-sm" id="switch" title="Move output to input"><img aria-hidden="true" src="<%- require('../static/images/switch-16x16.png') %>" alt="Switch Icon"/> Move output to input</button> <button type="button" class="btn btn-default btn-sm" id="switch" title="Move output to input"><img aria-hidden="true" src="<%- require('../static/images/switch-16x16.png') %>" alt="Switch Icon"/> Move output to input</button>

View file

@ -23,8 +23,8 @@ import OperationConfig from "../core/config/OperationConfig.js";
/** /**
* Main function used to build the CyberChef web app. * Main function used to build the CyberChef web app.
*/ */
var main = function() { function main() {
var defaultFavourites = [ const defaultFavourites = [
"To Base64", "To Base64",
"From Base64", "From Base64",
"To Hex", "To Hex",
@ -37,7 +37,7 @@ var main = function() {
"Fork" "Fork"
]; ];
var defaultOptions = { const defaultOptions = {
updateUrl : true, updateUrl : true,
showHighlighter : true, showHighlighter : true,
treatAsUtf8 : true, treatAsUtf8 : true,
@ -51,7 +51,7 @@ var main = function() {
document.removeEventListener("DOMContentLoaded", main, false); document.removeEventListener("DOMContentLoaded", main, false);
window.app = new App(Categories, OperationConfig, defaultFavourites, defaultOptions); window.app = new App(Categories, OperationConfig, defaultFavourites, defaultOptions);
window.app.setup(); window.app.setup();
}; }
// Fix issues with browsers that don't support console.log() // Fix issues with browsers that don't support console.log()
window.console = console || {log: function() {}, error: function() {}}; window.console = console || {log: function() {}, error: function() {}};

View file

@ -38,17 +38,17 @@ import Chef from "../src/core/Chef.js";
TestRegister.prototype.runTests = function() { TestRegister.prototype.runTests = function() {
return Promise.all( return Promise.all(
this.tests.map(function(test, i) { this.tests.map(function(test, i) {
var chef = new Chef(); const chef = new Chef();
return Promise.resolve(chef.bake( return chef.bake(
test.input, test.input,
test.recipeConfig, test.recipeConfig,
{}, {},
0, 0,
false false
)) )
.then(function(result) { .then(function(result) {
var ret = { const ret = {
test: test, test: test,
status: null, status: null,
output: null, output: null,

View file

@ -14,15 +14,16 @@ import TestRegister from "./TestRegister.js";
import "./tests/operations/Base58.js"; import "./tests/operations/Base58.js";
import "./tests/operations/ByteRepr.js"; import "./tests/operations/ByteRepr.js";
import "./tests/operations/CharEnc.js"; import "./tests/operations/CharEnc.js";
import "./tests/operations/Code.js";
import "./tests/operations/Compress.js"; import "./tests/operations/Compress.js";
import "./tests/operations/FlowControl.js"; import "./tests/operations/FlowControl.js";
import "./tests/operations/MorseCode.js"; import "./tests/operations/MorseCode.js";
import "./tests/operations/StrUtils.js"; import "./tests/operations/StrUtils.js";
var allTestsPassing = true, let allTestsPassing = true;
testStatusCounts = { const testStatusCounts = {
total: 0, total: 0,
}; };
/** /**
@ -32,7 +33,7 @@ var allTestsPassing = true,
* @returns {string} * @returns {string}
*/ */
function statusToIcon(status) { function statusToIcon(status) {
var icons = { const icons = {
erroring: "🔥", erroring: "🔥",
failing: "❌", failing: "❌",
passing: "✔️️", passing: "✔️️",
@ -48,7 +49,7 @@ function statusToIcon(status) {
*/ */
function handleTestResult(testResult) { function handleTestResult(testResult) {
allTestsPassing = allTestsPassing && testResult.status === "passing"; allTestsPassing = allTestsPassing && testResult.status === "passing";
var newCount = (testStatusCounts[testResult.status] || 0) + 1; const newCount = (testStatusCounts[testResult.status] || 0) + 1;
testStatusCounts[testResult.status] = newCount; testStatusCounts[testResult.status] = newCount;
testStatusCounts.total += 1; testStatusCounts.total += 1;
@ -83,8 +84,8 @@ TestRegister.runTests()
console.log("\n"); console.log("\n");
for (var testStatus in testStatusCounts) { for (const testStatus in testStatusCounts) {
var count = testStatusCounts[testStatus]; const count = testStatusCounts[testStatus];
if (count > 0) { if (count > 0) {
console.log(testStatus.toUpperCase(), count); console.log(testStatus.toUpperCase(), count);
} }

View file

@ -0,0 +1,132 @@
/**
* Code tests.
*
* @author tlwr [toby@toby.codes]
*
* @copyright Crown Copyright 2017
* @license Apache-2.0
*/
import TestRegister from "../../TestRegister.js";
TestRegister.addTests([
{
name: "To Camel case (dumb)",
input: "hello world",
expectedOutput: "helloWorld",
recipeConfig: [
{
"op": "To Camel case",
"args": [false]
}
],
},
{
name: "To Snake case (dumb)",
input: "hello world",
expectedOutput: "hello_world",
recipeConfig: [
{
"op": "To Snake case",
"args": [false]
}
],
},
{
name: "To Kebab case (dumb)",
input: "hello world",
expectedOutput: "hello-world",
recipeConfig: [
{
"op": "To Kebab case",
"args": [false]
}
],
},
{
name: "To Camel case (smart)",
input: [
"test='hello'",
"echo $test",
"a_camel_case_function",
"$a_camel_case_variable;",
"function function_name() {",
" console.log('things inside quotes do not get broken');",
" console.log(\"things inside quotes do not get broken\");",
"}",
].join("\n"),
expectedOutput: [
"test='hello'",
"echo $test",
"aCamelCaseFunction",
"$aCamelCaseVariable;",
"function functionName() {",
" console.log('things inside quotes do not get broken');",
" console.log(\"things inside quotes do not get broken\");",
"}",
].join("\n"),
recipeConfig: [
{
"op": "To Camel case",
"args": [true]
}
],
},
{
name: "To Snake case (smart)",
input: [
"test='hello'",
"echo $test",
"aSnakeCaseFunction",
"$aSnakeCaseVariable;",
"function functionName() {",
" console.log('things inside quotes do not get broken');",
" console.log(\"things inside quotes do not get broken\");",
"}",
].join("\n"),
expectedOutput: [
"test='hello'",
"echo $test",
"a_snake_case_function",
"$a_snake_case_variable;",
"function function_name() {",
" console.log('things inside quotes do not get broken');",
" console.log(\"things inside quotes do not get broken\");",
"}",
].join("\n"),
recipeConfig: [
{
"op": "To Snake case",
"args": [true]
}
],
},
{
name: "To Kebab case (smart)",
input: [
"test='hello'",
"echo $test",
"aKebabCaseFunction",
"$aKebabCaseVariable;",
"function functionName() {",
" console.log('things inside quotes do not get broken');",
" console.log(\"things inside quotes do not get broken\");",
"}",
].join("\n"),
expectedOutput: [
"test='hello'",
"echo $test",
"a-kebab-case-function",
"$a-kebab-case-variable;",
"function function-name() {",
" console.log('things inside quotes do not get broken');",
" console.log(\"things inside quotes do not get broken\");",
"}",
].join("\n"),
recipeConfig: [
{
"op": "To Kebab case",
"args": [true]
}
],
},
]);

View file

@ -66,6 +66,62 @@ TestRegister.addTests([
{"op":"To Base64", "args":["A-Za-z0-9+/="]} {"op":"To Base64", "args":["A-Za-z0-9+/="]}
] ]
}, },
{
name: "Jump: skips 0",
input: [
"should be changed",
].join("\n"),
expectedOutput: [
"should be changed was changed",
].join("\n"),
recipeConfig: [
{
op: "Jump",
args: [0, 10],
},
{
op: "Find / Replace",
args: [
{
"option": "Regex",
"string": "should be changed"
},
"should be changed was changed",
true,
true,
true,
],
},
],
},
{
name: "Jump: skips 1",
input: [
"shouldnt be changed",
].join("\n"),
expectedOutput: [
"shouldnt be changed",
].join("\n"),
recipeConfig: [
{
op: "Jump",
args: [1, 10],
},
{
op: "Find / Replace",
args: [
{
"option": "Regex",
"string": "shouldnt be changed"
},
"shouldnt be changed was changed",
true,
true,
true,
],
},
],
},
{ {
name: "Conditional Jump: Skips 0", name: "Conditional Jump: Skips 0",
input: [ input: [
@ -111,4 +167,111 @@ TestRegister.addTests([
}, },
], ],
}, },
{
name: "Comment: nothing",
input: "",
expectedOutput: "",
recipeConfig: [
{
"op": "Comment",
"args": [""]
}
]
},
{
name: "Fork, Comment, Base64",
input: "cat\nsat\nmat",
expectedOutput: "Y2F0\nc2F0\nbWF0\n",
recipeConfig: [
{
"op": "Fork",
"args": ["\\n", "\\n", false]
},
{
"op": "Comment",
"args": ["Testing 123"]
},
{
"op": "To Base64",
"args": ["A-Za-z0-9+/="]
}
]
},
{
name: "Conditional Jump: Skips 1",
input: [
"match",
"should not be changed",
"should be changed",
].join("\n"),
expectedOutput: [
"match",
"should not be changed",
"should be changed was changed"
].join("\n"),
recipeConfig: [
{
op: "Conditional Jump",
args: ["match", 1, 10],
},
{
op: "Find / Replace",
args: [
{
"option": "Regex",
"string": "should not be changed"
},
"should not be changed was changed",
true,
true,
true,
],
},
{
op: "Find / Replace",
args: [
{
"option": "Regex",
"string": "should be changed"
},
"should be changed was changed",
true,
true,
true,
],
},
],
},
{
name: "Conditional Jump: Skips negatively",
input: [
"match",
].join("\n"),
expectedOutput: [
"replaced",
].join("\n"),
recipeConfig: [
{
op: "Jump",
args: [1],
},
{
op: "Find / Replace",
args: [
{
"option": "Regex",
"string": "match"
},
"replaced",
true,
true,
true,
],
},
{
op: "Conditional Jump",
args: ["match", -2, 10],
},
],
},
]); ]);