eslint autofix

This commit is contained in:
Thomas Grainger 2016-11-29 00:22:34 +00:00
parent 0d42541860
commit ad730d806b
No known key found for this signature in database
GPG key ID: 995EA0A029283160
60 changed files with 13067 additions and 13014 deletions

View file

@ -1,152 +1,152 @@
module.exports = function (grunt) {
grunt.file.defaultEncoding = "utf8";
grunt.file.defaultEncoding = 'utf8';
grunt.file.preserveBOM = false;
// Tasks
grunt.registerTask("dev",
"A persistent task which creates a development build whenever source files are modified.",
["clean:dev", "concat:css", "concat:js", "copy:html_dev", "copy:static_dev", "chmod:build", "watch"]);
grunt.registerTask('dev',
'A persistent task which creates a development build whenever source files are modified.',
['clean:dev', 'concat:css', 'concat:js', 'copy:html_dev', 'copy:static_dev', 'chmod:build', 'watch']);
grunt.registerTask("prod",
"Creates a production-ready build. Use the --msg flag to add a compile message.",
["jshint", "exec:stats", "clean", "jsdoc", "concat", "copy", "cssmin", "uglify:prod", "inline", "htmlmin", "chmod"]);
grunt.registerTask('prod',
'Creates a production-ready build. Use the --msg flag to add a compile message.',
['jshint', 'exec:stats', 'clean', 'jsdoc', 'concat', 'copy', 'cssmin', 'uglify:prod', 'inline', 'htmlmin', 'chmod']);
grunt.registerTask("docs",
"Compiles documentation in the /docs directory.",
["clean:docs", "jsdoc", "chmod:docs"]);
grunt.registerTask('docs',
'Compiles documentation in the /docs directory.',
['clean:docs', 'jsdoc', 'chmod:docs']);
grunt.registerTask("stats",
"Provides statistics about the code base such as how many lines there are as well as details of file sizes before and after compression.",
["concat:js", "uglify:prod", "exec:stats", "exec:repo_size", "exec:display_stats"]);
grunt.registerTask('stats',
'Provides statistics about the code base such as how many lines there are as well as details of file sizes before and after compression.',
['concat:js', 'uglify:prod', 'exec:stats', 'exec:repo_size', 'exec:display_stats']);
grunt.registerTask("default",
"Lints the code base and shows stats",
["jshint", "exec:stats", "exec:display_stats"]);
grunt.registerTask('default',
'Lints the code base and shows stats',
['jshint', 'exec:stats', 'exec:display_stats']);
grunt.registerTask("doc", "docs");
grunt.registerTask("lint", "jshint");
grunt.registerTask('doc', 'docs');
grunt.registerTask('lint', 'jshint');
// Load tasks provided by each plugin
grunt.loadNpmTasks("grunt-contrib-jshint");
grunt.loadNpmTasks("grunt-jsdoc");
grunt.loadNpmTasks("grunt-contrib-clean");
grunt.loadNpmTasks("grunt-contrib-concat");
grunt.loadNpmTasks("grunt-contrib-copy");
grunt.loadNpmTasks("grunt-contrib-uglify");
grunt.loadNpmTasks("grunt-contrib-cssmin");
grunt.loadNpmTasks("grunt-contrib-htmlmin");
grunt.loadNpmTasks("grunt-inline-alt");
grunt.loadNpmTasks("grunt-chmod");
grunt.loadNpmTasks("grunt-exec");
grunt.loadNpmTasks("grunt-contrib-watch");
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-jsdoc');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-contrib-htmlmin');
grunt.loadNpmTasks('grunt-inline-alt');
grunt.loadNpmTasks('grunt-chmod');
grunt.loadNpmTasks('grunt-exec');
grunt.loadNpmTasks('grunt-contrib-watch');
// JS includes
var js_files = [
const js_files = [
// Third party framework libraries
"src/js/lib/jquery-2.1.1.js",
"src/js/lib/bootstrap-3.3.6.js",
"src/js/lib/split.js",
"src/js/lib/bootstrap-switch.js",
"src/js/lib/yahoo.js",
"src/js/lib/snowfall.jquery.js",
'src/js/lib/jquery-2.1.1.js',
'src/js/lib/bootstrap-3.3.6.js',
'src/js/lib/split.js',
'src/js/lib/bootstrap-switch.js',
'src/js/lib/yahoo.js',
'src/js/lib/snowfall.jquery.js',
// Third party operation libraries
"src/js/lib/cryptojs/core.js",
"src/js/lib/cryptojs/x64-core.js",
"src/js/lib/cryptojs/enc-base64.js",
"src/js/lib/cryptojs/enc-utf16.js",
"src/js/lib/cryptojs/md5.js",
"src/js/lib/cryptojs/evpkdf.js",
"src/js/lib/cryptojs/cipher-core.js",
"src/js/lib/cryptojs/mode-cfb.js",
"src/js/lib/cryptojs/mode-ctr-gladman.js",
"src/js/lib/cryptojs/mode-ctr.js",
"src/js/lib/cryptojs/mode-ecb.js",
"src/js/lib/cryptojs/mode-ofb.js",
"src/js/lib/cryptojs/format-hex.js",
"src/js/lib/cryptojs/lib-typedarrays.js",
"src/js/lib/cryptojs/pad-ansix923.js",
"src/js/lib/cryptojs/pad-iso10126.js",
"src/js/lib/cryptojs/pad-iso97971.js",
"src/js/lib/cryptojs/pad-nopadding.js",
"src/js/lib/cryptojs/pad-zeropadding.js",
"src/js/lib/cryptojs/aes.js",
"src/js/lib/cryptojs/hmac.js",
"src/js/lib/cryptojs/rabbit-legacy.js",
"src/js/lib/cryptojs/rabbit.js",
"src/js/lib/cryptojs/ripemd160.js",
"src/js/lib/cryptojs/sha1.js",
"src/js/lib/cryptojs/sha256.js",
"src/js/lib/cryptojs/sha224.js",
"src/js/lib/cryptojs/sha512.js",
"src/js/lib/cryptojs/sha384.js",
"src/js/lib/cryptojs/sha3.js",
"src/js/lib/cryptojs/tripledes.js",
"src/js/lib/cryptojs/rc4.js",
"src/js/lib/cryptojs/pbkdf2.js",
"src/js/lib/jsbn/jsbn.js",
"src/js/lib/jsbn/jsbn2.js",
"src/js/lib/jsbn/base64.js",
"src/js/lib/jsbn/ec.js",
"src/js/lib/jsbn/prng4.js",
"src/js/lib/jsbn/rng.js",
"src/js/lib/jsbn/rsa.js",
"src/js/lib/jsbn/sec.js",
"src/js/lib/jsrasign/asn1-1.0.js",
"src/js/lib/jsrasign/asn1hex-1.1.js",
"src/js/lib/jsrasign/asn1x509-1.0.js",
"src/js/lib/jsrasign/base64x-1.1.js",
"src/js/lib/jsrasign/crypto-1.1.js",
"src/js/lib/jsrasign/dsa-modified-1.0.js",
"src/js/lib/jsrasign/ecdsa-modified-1.0.js",
"src/js/lib/jsrasign/ecparam-1.0.js",
"src/js/lib/jsrasign/keyutil-1.0.js",
"src/js/lib/jsrasign/x509-1.1.js",
"src/js/lib/blowfish.dojo.js",
"src/js/lib/rawdeflate.js",
"src/js/lib/rawinflate.js",
"src/js/lib/zip.js",
"src/js/lib/unzip.js",
"src/js/lib/zlib_and_gzip.js",
"src/js/lib/bzip2.js",
"src/js/lib/punycode.js",
"src/js/lib/uas_parser.js",
"src/js/lib/esprima.js",
"src/js/lib/escodegen.browser.js",
"src/js/lib/esmangle.min.js",
"src/js/lib/diff.js",
"src/js/lib/moment.js",
"src/js/lib/moment-timezone.js",
"src/js/lib/prettify.js",
"src/js/lib/vkbeautify.js",
"src/js/lib/Sortable.js",
"src/js/lib/bootstrap-colorpicker.js",
'src/js/lib/cryptojs/core.js',
'src/js/lib/cryptojs/x64-core.js',
'src/js/lib/cryptojs/enc-base64.js',
'src/js/lib/cryptojs/enc-utf16.js',
'src/js/lib/cryptojs/md5.js',
'src/js/lib/cryptojs/evpkdf.js',
'src/js/lib/cryptojs/cipher-core.js',
'src/js/lib/cryptojs/mode-cfb.js',
'src/js/lib/cryptojs/mode-ctr-gladman.js',
'src/js/lib/cryptojs/mode-ctr.js',
'src/js/lib/cryptojs/mode-ecb.js',
'src/js/lib/cryptojs/mode-ofb.js',
'src/js/lib/cryptojs/format-hex.js',
'src/js/lib/cryptojs/lib-typedarrays.js',
'src/js/lib/cryptojs/pad-ansix923.js',
'src/js/lib/cryptojs/pad-iso10126.js',
'src/js/lib/cryptojs/pad-iso97971.js',
'src/js/lib/cryptojs/pad-nopadding.js',
'src/js/lib/cryptojs/pad-zeropadding.js',
'src/js/lib/cryptojs/aes.js',
'src/js/lib/cryptojs/hmac.js',
'src/js/lib/cryptojs/rabbit-legacy.js',
'src/js/lib/cryptojs/rabbit.js',
'src/js/lib/cryptojs/ripemd160.js',
'src/js/lib/cryptojs/sha1.js',
'src/js/lib/cryptojs/sha256.js',
'src/js/lib/cryptojs/sha224.js',
'src/js/lib/cryptojs/sha512.js',
'src/js/lib/cryptojs/sha384.js',
'src/js/lib/cryptojs/sha3.js',
'src/js/lib/cryptojs/tripledes.js',
'src/js/lib/cryptojs/rc4.js',
'src/js/lib/cryptojs/pbkdf2.js',
'src/js/lib/jsbn/jsbn.js',
'src/js/lib/jsbn/jsbn2.js',
'src/js/lib/jsbn/base64.js',
'src/js/lib/jsbn/ec.js',
'src/js/lib/jsbn/prng4.js',
'src/js/lib/jsbn/rng.js',
'src/js/lib/jsbn/rsa.js',
'src/js/lib/jsbn/sec.js',
'src/js/lib/jsrasign/asn1-1.0.js',
'src/js/lib/jsrasign/asn1hex-1.1.js',
'src/js/lib/jsrasign/asn1x509-1.0.js',
'src/js/lib/jsrasign/base64x-1.1.js',
'src/js/lib/jsrasign/crypto-1.1.js',
'src/js/lib/jsrasign/dsa-modified-1.0.js',
'src/js/lib/jsrasign/ecdsa-modified-1.0.js',
'src/js/lib/jsrasign/ecparam-1.0.js',
'src/js/lib/jsrasign/keyutil-1.0.js',
'src/js/lib/jsrasign/x509-1.1.js',
'src/js/lib/blowfish.dojo.js',
'src/js/lib/rawdeflate.js',
'src/js/lib/rawinflate.js',
'src/js/lib/zip.js',
'src/js/lib/unzip.js',
'src/js/lib/zlib_and_gzip.js',
'src/js/lib/bzip2.js',
'src/js/lib/punycode.js',
'src/js/lib/uas_parser.js',
'src/js/lib/esprima.js',
'src/js/lib/escodegen.browser.js',
'src/js/lib/esmangle.min.js',
'src/js/lib/diff.js',
'src/js/lib/moment.js',
'src/js/lib/moment-timezone.js',
'src/js/lib/prettify.js',
'src/js/lib/vkbeautify.js',
'src/js/lib/Sortable.js',
'src/js/lib/bootstrap-colorpicker.js',
// Custom libraries
"src/js/lib/canvas_components.js",
'src/js/lib/canvas_components.js',
// Utility functions
"src/js/core/Utils.js",
'src/js/core/Utils.js',
// Operation objects
"src/js/operations/*.js",
'src/js/operations/*.js',
// Core framework objects
"src/js/core/*.js",
"src/js/config/Categories.js",
"src/js/config/OperationConfig.js",
'src/js/core/*.js',
'src/js/config/Categories.js',
'src/js/config/OperationConfig.js',
// HTML view objects
"src/js/views/html/*.js",
"!src/js/views/html/main.js",
'src/js/views/html/*.js',
'!src/js/views/html/main.js',
// Start the app!
"src/js/views/html/main.js",
'src/js/views/html/main.js',
];
var banner = '/**\n\
const banner = '/**\n\
* CyberChef - The Cyber Swiss Army Knife\n\
*\n\
* @copyright Crown Copyright 2016\n\
@ -167,138 +167,138 @@ module.exports = function(grunt) {
* limitations under the License.\n\
*/\n';
var template_options = {
const template_options = {
data: {
compile_msg: grunt.option("compile-msg") || grunt.option("msg") || "",
codebase_stats: grunt.file.read("src/static/stats.txt").split("\n").join("<br>")
}
compile_msg: grunt.option('compile-msg') || grunt.option('msg') || '',
codebase_stats: grunt.file.read('src/static/stats.txt').split('\n').join('<br>'),
},
};
// Project configuration
grunt.initConfig({
jshint: {
options: {
jshintrc: "src/js/.jshintrc"
jshintrc: 'src/js/.jshintrc',
},
gruntfile: ["Gruntfile.js"],
core: ["src/js/core/**/*.js"],
config: ["src/js/config/**/*.js"],
views: ["src/js/views/**/*.js"],
operations: ["src/js/operations/**/*.js"],
gruntfile: ['Gruntfile.js'],
core: ['src/js/core/**/*.js'],
config: ['src/js/config/**/*.js'],
views: ['src/js/views/**/*.js'],
operations: ['src/js/operations/**/*.js'],
},
jsdoc: {
options: {
destination: "docs",
template: "node_modules/ink-docstrap/template",
destination: 'docs',
template: 'node_modules/ink-docstrap/template',
recurse: true,
readme: "./README.md",
configure: "docs/jsdoc.conf.json"
readme: './README.md',
configure: 'docs/jsdoc.conf.json',
},
all: {
src: [
"src/js/**/*.js",
"!src/js/lib/**/*",
'src/js/**/*.js',
'!src/js/lib/**/*',
],
}
},
},
clean: {
dev: ["build/dev/*"],
prod: ["build/prod/*"],
docs: ["docs/*", "!docs/*.conf.json", "!docs/*.ico"],
dev: ['build/dev/*'],
prod: ['build/prod/*'],
docs: ['docs/*', '!docs/*.conf.json', '!docs/*.ico'],
},
concat: {
options: {
process: template_options
process: template_options,
},
css: {
options: {
banner: banner.replace(/\/\*\*/g, "/*!"),
process: function(content, srcpath) {
banner: banner.replace(/\/\*\*/g, '/*!'),
process(content, srcpath) {
// Change special comments from /** to /*! to comply with cssmin
content = content.replace(/^\/\*\* /g, "/*! ");
content = content.replace(/^\/\*\* /g, '/*! ');
return grunt.template.process(content);
}
},
},
src: [
"src/css/lib/**/*.css",
"src/css/structure/**/*.css",
"src/css/themes/classic.css"
'src/css/lib/**/*.css',
'src/css/structure/**/*.css',
'src/css/themes/classic.css',
],
dest: "build/dev/styles.css"
dest: 'build/dev/styles.css',
},
js: {
options: {
banner: '"use strict";\n'
banner: '"use strict";\n',
},
src: js_files,
dest: "build/dev/scripts.js"
}
dest: 'build/dev/scripts.js',
},
},
copy: {
html_dev: {
options: {
process: function(content, srcpath) {
process(content, srcpath) {
return grunt.template.process(content, template_options);
}
},
src: "src/html/index.html",
dest: "build/dev/index.html"
},
src: 'src/html/index.html',
dest: 'build/dev/index.html',
},
html_prod: {
options: {
process: function(content, srcpath) {
process(content, srcpath) {
return grunt.template.process(content, template_options);
}
},
src: "src/html/index.html",
dest: "build/prod/index.html"
},
src: 'src/html/index.html',
dest: 'build/prod/index.html',
},
html_inline: {
options: {
process: function(content, srcpath) {
process(content, srcpath) {
// TODO: Do all this in Jade
content = content.replace(
'<a href="cyberchef.htm" style="float: left; margin-left: 10px; margin-right: 80px;" download>Download CyberChef<img src="images/cloud_computing_download-plain-24x24.png" /></a>',
'<span style="float: left; margin-left: 10px;">Compile time: ' + grunt.template.today("dd/mm/yyyy HH:MM:ss") + ' UTC</span>');
'<a href="cyberchef.htm" style="float: left; margin-left: 10px; margin-right: 80px;">Download CyberChef<img src="images/cloud_computing_download-plain-24x24.png" /></a>',
`<span style="float: left; margin-left: 10px;">Compile time: ${grunt.template.today('dd/mm/yyyy HH:MM:ss')} UTC</span>`);
return grunt.template.process(content, template_options);
}
},
src: "src/html/index.html",
dest: "build/prod/cyberchef.htm"
},
src: 'src/html/index.html',
dest: 'build/prod/cyberchef.htm',
},
static_dev: {
files: [
{
expand: true,
cwd: "src/static/",
cwd: 'src/static/',
src: [
"**/*",
"**/.*",
"!stats.txt"
'**/*',
'**/.*',
'!stats.txt',
],
dest: 'build/dev/',
},
],
dest: "build/dev/"
}
]
},
static_prod: {
files: [
{
expand: true,
cwd: "src/static/",
cwd: 'src/static/',
src: [
"**/*",
"**/.*",
"!stats.txt"
'**/*',
'**/.*',
'!stats.txt',
],
dest: "build/prod/"
}
]
}
dest: 'build/prod/',
},
],
},
},
uglify: {
options: {
preserveComments: function(node, comment) {
if (comment.value.indexOf("* @license") === 0) return true;
preserveComments(node, comment) {
if (comment.value.indexOf('* @license') === 0) return true;
return false;
},
screwIE8: true,
@ -307,23 +307,23 @@ module.exports = function(grunt) {
beautify: false,
inline_script: true,
ascii_only: true,
screw_ie8: true
screw_ie8: true,
},
compress: {
screw_ie8: true
screw_ie8: true,
},
banner: banner
banner,
},
prod: {
src: "build/dev/scripts.js",
dest: "build/prod/scripts.js"
}
src: 'build/dev/scripts.js',
dest: 'build/prod/scripts.js',
},
},
cssmin: {
prod: {
src: "build/dev/styles.css",
dest: "build/prod/styles.css"
}
src: 'build/dev/styles.css',
dest: 'build/prod/styles.css',
},
},
htmlmin: {
prod: {
@ -331,59 +331,59 @@ module.exports = function(grunt) {
removeComments: true,
collapseWhitespace: true,
minifyJS: true,
minifyCSS: true
minifyCSS: true,
},
src: "build/prod/index.html",
dest: "build/prod/index.html"
src: 'build/prod/index.html',
dest: 'build/prod/index.html',
},
inline: {
options: {
removeComments: true,
collapseWhitespace: true,
minifyJS: false,
minifyCSS: false
minifyCSS: false,
},
src: 'build/prod/cyberchef.htm',
dest: 'build/prod/cyberchef.htm',
},
src: "build/prod/cyberchef.htm",
dest: "build/prod/cyberchef.htm"
}
},
inline: {
options: {
tag: "",
tag: '',
inlineTagAttributes: {
js: "type='application/javascript'",
css: "type='text/css'"
}
css: "type='text/css'",
},
},
prod: {
src: "build/prod/cyberchef.htm",
dest: "build/prod/cyberchef.htm"
}
src: 'build/prod/cyberchef.htm',
dest: 'build/prod/cyberchef.htm',
},
},
chmod: {
build: {
options: {
mode: "755",
mode: '755',
},
src: ["build/**/*", "build/**/.htaccess", "build/"]
src: ['build/**/*', 'build/**/.htaccess', 'build/'],
},
docs: {
options: {
mode: "755",
mode: '755',
},
src: ['docs/**/*', 'docs/'],
},
src: ["docs/**/*", "docs/"]
}
},
exec: {
repo_size: {
command: [
"git ls-files | wc -l | xargs printf '\n%b\ttracked files\n'",
"du -hs | egrep -o '^[^\t]*' | xargs printf '%b\trepository size\n'"
].join(";"),
stderr: false
"du -hs | egrep -o '^[^\t]*' | xargs printf '%b\trepository size\n'",
].join(';'),
stderr: false,
},
stats: {
command: "rm src/static/stats.txt;" +
command: `rm src/static/stats.txt;${
[
"ls src/ -R1 | grep '^$' -v | grep ':$' -v | wc -l | xargs printf '%b\tsource files\n'",
"find src/ -regex '.*\..*' -print | xargs cat | wc -l | xargs printf '%b\tlines\n'",
@ -407,38 +407,37 @@ module.exports = function(grunt) {
"grep -E '^\\s+name: ' src/js/config/Categories.js | wc -l | xargs printf '\n%b\tcategories\n'",
"grep -E '^\\s+\"[A-Za-z0-9 \\-]+\": {' src/js/config/OperationConfig.js | wc -l | xargs printf '%b\toperations\n'",
].join(" >> src/static/stats.txt;") + " >> src/static/stats.txt;",
stderr: false
].join(' >> src/static/stats.txt;')} >> src/static/stats.txt;`,
stderr: false,
},
display_stats: {
command: "cat src/static/stats.txt"
command: 'cat src/static/stats.txt',
},
clean_git: {
command: "git gc --prune=now --aggressive"
command: 'git gc --prune=now --aggressive',
},
},
watch: {
css: {
files: "src/css/**/*.css",
tasks: ["concat:css", "chmod:build"]
files: 'src/css/**/*.css',
tasks: ['concat:css', 'chmod:build'],
},
js: {
files: "src/js/**/*.js",
tasks: ["concat:js_all", "chmod:build"]
files: 'src/js/**/*.js',
tasks: ['concat:js_all', 'chmod:build'],
},
html: {
files: "src/html/**/*.html",
tasks: ["copy:html_dev", "chmod:build"]
files: 'src/html/**/*.html',
tasks: ['copy:html_dev', 'chmod:build'],
},
static: {
files: ["src/static/**/*", "src/static/**/.*"],
tasks: ["copy:static_dev", "chmod:build"]
files: ['src/static/**/*', 'src/static/**/.*'],
tasks: ['copy:static_dev', 'chmod:build'],
},
grunt: {
files: "Gruntfile.js",
tasks: ["clean:dev", "concat:css", "concat:js_all", "copy:html_dev", "copy:static_dev", "chmod:build"]
}
files: 'Gruntfile.js',
tasks: ['clean:dev', 'concat:css', 'concat:js_all', 'copy:html_dev', 'copy:static_dev', 'chmod:build'],
},
},
});
};

View file

@ -17,250 +17,250 @@
* @constant
* @type {CatConf[]}
*/
var Categories = [
const Categories = [
{
name: "Favourites",
ops: []
name: 'Favourites',
ops: [],
},
{
name: "Data format",
name: 'Data format',
ops: [
"To Hexdump",
"From Hexdump",
"To Hex",
"From Hex",
"To Charcode",
"From Charcode",
"To Decimal",
"From Decimal",
"To Binary",
"From Binary",
"To Base64",
"From Base64",
"Show Base64 offsets",
"To Base32",
"From Base32",
"To Base",
"From Base",
"To HTML Entity",
"From HTML Entity",
"URL Encode",
"URL Decode",
"Unescape Unicode Characters",
"To Quoted Printable",
"From Quoted Printable",
"To Punycode",
"From Punycode",
"To Hex Content",
"From Hex Content",
"PEM to Hex",
"Hex to PEM",
"Parse ASN.1 hex string",
"Change IP format",
"Text encoding",
"Swap endianness",
]
'To Hexdump',
'From Hexdump',
'To Hex',
'From Hex',
'To Charcode',
'From Charcode',
'To Decimal',
'From Decimal',
'To Binary',
'From Binary',
'To Base64',
'From Base64',
'Show Base64 offsets',
'To Base32',
'From Base32',
'To Base',
'From Base',
'To HTML Entity',
'From HTML Entity',
'URL Encode',
'URL Decode',
'Unescape Unicode Characters',
'To Quoted Printable',
'From Quoted Printable',
'To Punycode',
'From Punycode',
'To Hex Content',
'From Hex Content',
'PEM to Hex',
'Hex to PEM',
'Parse ASN.1 hex string',
'Change IP format',
'Text encoding',
'Swap endianness',
],
},
{
name: "Encryption / Encoding",
name: 'Encryption / Encoding',
ops: [
"AES Encrypt",
"AES Decrypt",
"Blowfish Encrypt",
"Blowfish Decrypt",
"DES Encrypt",
"DES Decrypt",
"Triple DES Encrypt",
"Triple DES Decrypt",
"Rabbit Encrypt",
"Rabbit Decrypt",
"RC4",
"RC4 Drop",
"ROT13",
"XOR",
"XOR Brute Force",
"Derive PBKDF2 key",
"Derive EVP key",
]
'AES Encrypt',
'AES Decrypt',
'Blowfish Encrypt',
'Blowfish Decrypt',
'DES Encrypt',
'DES Decrypt',
'Triple DES Encrypt',
'Triple DES Decrypt',
'Rabbit Encrypt',
'Rabbit Decrypt',
'RC4',
'RC4 Drop',
'ROT13',
'XOR',
'XOR Brute Force',
'Derive PBKDF2 key',
'Derive EVP key',
],
},
{
name: "Public Key",
name: 'Public Key',
ops: [
"Parse X.509 certificate",
"Parse ASN.1 hex string",
"PEM to Hex",
"Hex to PEM",
"Hex to Object Identifier",
"Object Identifier to Hex",
]
'Parse X.509 certificate',
'Parse ASN.1 hex string',
'PEM to Hex',
'Hex to PEM',
'Hex to Object Identifier',
'Object Identifier to Hex',
],
},
{
name: "Logical operations",
name: 'Logical operations',
ops: [
"XOR",
"XOR Brute Force",
"OR",
"NOT",
"AND",
"ADD",
"SUB",
"Rotate left",
"Rotate right",
"ROT13",
]
'XOR',
'XOR Brute Force',
'OR',
'NOT',
'AND',
'ADD',
'SUB',
'Rotate left',
'Rotate right',
'ROT13',
],
},
{
name: "Networking",
name: 'Networking',
ops: [
"Strip HTTP headers",
"Parse User Agent",
"Parse IP range",
"Parse IPv6 address",
"Parse URI",
"URL Encode",
"URL Decode",
"Format MAC addresses",
"Change IP format",
"Group IP addresses",
]
'Strip HTTP headers',
'Parse User Agent',
'Parse IP range',
'Parse IPv6 address',
'Parse URI',
'URL Encode',
'URL Decode',
'Format MAC addresses',
'Change IP format',
'Group IP addresses',
],
},
{
name: "Language",
name: 'Language',
ops: [
"Text encoding",
"Unescape Unicode Characters",
]
'Text encoding',
'Unescape Unicode Characters',
],
},
{
name: "Utils",
name: 'Utils',
ops: [
"Diff",
"Remove whitespace",
"Remove null bytes",
"To Upper case",
"To Lower case",
"Add line numbers",
"Remove line numbers",
"Reverse",
"Sort",
"Unique",
"Split",
"Count occurrences",
"Expand alphabet range",
"Parse escaped string",
"Drop bytes",
"Take bytes",
"Pad lines",
"Find / Replace",
"Regular expression",
"Offset checker",
"Convert distance",
"Convert area",
"Convert mass",
"Convert speed",
"Convert data units",
"Parse UNIX file permissions",
"Swap endianness",
"Parse colour code",
]
'Diff',
'Remove whitespace',
'Remove null bytes',
'To Upper case',
'To Lower case',
'Add line numbers',
'Remove line numbers',
'Reverse',
'Sort',
'Unique',
'Split',
'Count occurrences',
'Expand alphabet range',
'Parse escaped string',
'Drop bytes',
'Take bytes',
'Pad lines',
'Find / Replace',
'Regular expression',
'Offset checker',
'Convert distance',
'Convert area',
'Convert mass',
'Convert speed',
'Convert data units',
'Parse UNIX file permissions',
'Swap endianness',
'Parse colour code',
],
},
{
name: "Date / Time",
name: 'Date / Time',
ops: [
"Parse DateTime",
"Translate DateTime Format",
"From UNIX Timestamp",
"To UNIX Timestamp",
"Extract dates",
]
'Parse DateTime',
'Translate DateTime Format',
'From UNIX Timestamp',
'To UNIX Timestamp',
'Extract dates',
],
},
{
name: "Extractors",
name: 'Extractors',
ops: [
"Strings",
"Extract IP addresses",
"Extract email addresses",
"Extract MAC addresses",
"Extract URLs",
"Extract domains",
"Extract file paths",
"Extract dates",
"Regular expression",
]
'Strings',
'Extract IP addresses',
'Extract email addresses',
'Extract MAC addresses',
'Extract URLs',
'Extract domains',
'Extract file paths',
'Extract dates',
'Regular expression',
],
},
{
name: "Compression",
name: 'Compression',
ops: [
"Raw Deflate",
"Raw Inflate",
"Zlib Deflate",
"Zlib Inflate",
"Gzip",
"Gunzip",
"Zip",
"Unzip",
"Bzip2 Decompress",
]
'Raw Deflate',
'Raw Inflate',
'Zlib Deflate',
'Zlib Inflate',
'Gzip',
'Gunzip',
'Zip',
'Unzip',
'Bzip2 Decompress',
],
},
{
name: "Hashing",
name: 'Hashing',
ops: [
"Analyse hash",
"Generate all hashes",
"MD5",
"SHA1",
"SHA224",
"SHA256",
"SHA384",
"SHA512",
"SHA3",
"RIPEMD-160",
"HMAC",
"Fletcher-16 Checksum",
"Adler-32 Checksum",
"CRC-32 Checksum",
"TCP/IP Checksum",
]
'Analyse hash',
'Generate all hashes',
'MD5',
'SHA1',
'SHA224',
'SHA256',
'SHA384',
'SHA512',
'SHA3',
'RIPEMD-160',
'HMAC',
'Fletcher-16 Checksum',
'Adler-32 Checksum',
'CRC-32 Checksum',
'TCP/IP Checksum',
],
},
{
name: "Code tidy",
name: 'Code tidy',
ops: [
"Syntax highlighter",
"Generic Code Beautify",
"JavaScript Parser",
"JavaScript Beautify",
"JavaScript Minify",
"JSON Beautify",
"JSON Minify",
"XML Beautify",
"XML Minify",
"SQL Beautify",
"SQL Minify",
"CSS Beautify",
"CSS Minify",
"Strip HTML tags",
"Diff",
]
'Syntax highlighter',
'Generic Code Beautify',
'JavaScript Parser',
'JavaScript Beautify',
'JavaScript Minify',
'JSON Beautify',
'JSON Minify',
'XML Beautify',
'XML Minify',
'SQL Beautify',
'SQL Minify',
'CSS Beautify',
'CSS Minify',
'Strip HTML tags',
'Diff',
],
},
{
name: "Other",
name: 'Other',
ops: [
"Entropy",
"Frequency distribution",
"Detect File Type",
"Scan for Embedded Files",
"Generate UUID",
"Numberwang",
]
'Entropy',
'Frequency distribution',
'Detect File Type',
'Scan for Embedded Files',
'Generate UUID',
'Numberwang',
],
},
{
name: "Flow control",
name: 'Flow control',
ops: [
"Fork",
"Merge",
"Jump",
"Conditional Jump",
"Return",
]
'Fork',
'Merge',
'Jump',
'Conditional Jump',
'Return',
],
},
];

File diff suppressed because it is too large Load diff

View file

@ -7,7 +7,7 @@
*
* @class
*/
var Chef = function() {
const Chef = function () {
this.dish = new Dish();
};
@ -31,13 +31,13 @@ var Chef = function() {
* @returns {number} response.error - The error object thrown by a failed operation (false if no error)
*/
Chef.prototype.bake = function (input_text, recipe_config, options, progress, step) {
var start_time = new Date().getTime(),
let start_time = new Date().getTime(),
recipe = new Recipe(recipe_config),
contains_fc = recipe.contains_flow_control(),
error = false;
// Reset attempt_highlight flag
if (options.hasOwnProperty("attempt_highlight")) {
if (options.hasOwnProperty('attempt_highlight')) {
options.attempt_highlight = true;
}
@ -80,10 +80,10 @@ Chef.prototype.bake = function(input_text, recipe_config, options, progress, ste
this.dish.get(Dish.HTML) :
this.dish.get(Dish.STRING),
type: Dish.enum_lookup(this.dish.type),
progress: progress,
options: options,
progress,
options,
duration: new Date().getTime() - start_time,
error: error
error,
};
}
};
@ -107,9 +107,9 @@ Chef.prototype.bake = function(input_text, recipe_config, options, progress, ste
* @returns {number} The time it took to run the silent bake in milliseconds.
*/
Chef.prototype.silent_bake = function (recipe_config) {
var start_time = new Date().getTime(),
let start_time = new Date().getTime(),
recipe = new Recipe(recipe_config),
dish = new Dish("", Dish.STRING);
dish = new Dish('', Dish.STRING);
try {
recipe.execute(dish);

View file

@ -9,8 +9,8 @@
* @param {byte_array|string|number} value - The value of the input data.
* @param {number} type - The data type of value, see Dish enums.
*/
var Dish = function(value, type) {
this.value = value || typeof value == "string" ? value : null;
const Dish = function (value, type) {
this.value = value || typeof value === 'string' ? value : null;
this.type = type || Dish.BYTE_ARRAY;
};
@ -50,20 +50,20 @@ Dish.HTML = 3;
*/
Dish.type_enum = function (type_str) {
switch (type_str) {
case "byte_array":
case "Byte array":
case 'byte_array':
case 'Byte array':
return Dish.BYTE_ARRAY;
case "string":
case "String":
case 'string':
case 'String':
return Dish.STRING;
case "number":
case "Number":
case 'number':
case 'Number':
return Dish.NUMBER;
case "html":
case "HTML":
case 'html':
case 'HTML':
return Dish.HTML;
default:
throw "Invalid data type string. No matching enum.";
throw 'Invalid data type string. No matching enum.';
}
};
@ -78,15 +78,15 @@ Dish.type_enum = function(type_str) {
Dish.enum_lookup = function (type_enum) {
switch (type_enum) {
case Dish.BYTE_ARRAY:
return "byte_array";
return 'byte_array';
case Dish.STRING:
return "string";
return 'string';
case Dish.NUMBER:
return "number";
return 'number';
case Dish.HTML:
return "html";
return 'html';
default:
throw "Invalid data type enum. No matching type.";
throw 'Invalid data type enum. No matching type.';
}
};
@ -102,8 +102,8 @@ Dish.prototype.set = function(value, type) {
this.type = type;
if (!this.valid()) {
var sample = Utils.truncate(JSON.stringify(this.value), 13);
throw "Data is not a valid " + Dish.enum_lookup(type) + ": " + sample;
const sample = Utils.truncate(JSON.stringify(this.value), 13);
throw `Data is not a valid ${Dish.enum_lookup(type)}: ${sample}`;
}
};
@ -135,7 +135,7 @@ Dish.prototype.translate = function(to_type) {
this.type = Dish.BYTE_ARRAY;
break;
case Dish.NUMBER:
this.value = typeof this.value == "number" ? Utils.str_to_byte_array(this.value.toString()) : [];
this.value = typeof this.value === 'number' ? Utils.str_to_byte_array(this.value.toString()) : [];
this.type = Dish.BYTE_ARRAY;
break;
case Dish.HTML:
@ -150,7 +150,7 @@ Dish.prototype.translate = function(to_type) {
switch (to_type) {
case Dish.STRING:
case Dish.HTML:
this.value = this.value ? Utils.byte_array_to_utf8(this.value) : "";
this.value = this.value ? Utils.byte_array_to_utf8(this.value) : '';
this.type = Dish.STRING;
break;
case Dish.NUMBER:
@ -177,8 +177,8 @@ Dish.prototype.valid = function() {
}
// Check that every value is a number between 0 - 255
for (var i = 0; i < this.value.length; i++) {
if (typeof this.value[i] != "number" ||
for (let i = 0; i < this.value.length; i++) {
if (typeof this.value[i] !== 'number' ||
this.value[i] < 0 ||
this.value[i] > 255) {
return false;
@ -187,12 +187,12 @@ Dish.prototype.valid = function() {
return true;
case Dish.STRING:
case Dish.HTML:
if (typeof this.value == "string") {
if (typeof this.value === 'string') {
return true;
}
return false;
case Dish.NUMBER:
if (typeof this.value == "number") {
if (typeof this.value === 'number') {
return true;
}
return false;

View file

@ -7,18 +7,18 @@
*
* @namespace
*/
var FlowControl = {
const FlowControl = {
/**
* @constant
* @default
*/
FORK_DELIM: "\\n",
FORK_DELIM: '\\n',
/**
* @constant
* @default
*/
MERGE_DELIM: "\\n",
MERGE_DELIM: '\\n',
/**
* Fork operation.
@ -29,8 +29,8 @@ var FlowControl = {
* @param {Operation[]} state.op_list - The list of operations in the recipe.
* @returns {Object} The updated state of the recipe.
*/
run_fork: function(state) {
var op_list = state.op_list,
run_fork(state) {
let op_list = state.op_list,
input_type = op_list[state.progress].input_type,
output_type = op_list[state.progress].output_type,
input = state.dish.get(input_type),
@ -40,28 +40,29 @@ var FlowControl = {
sub_op_list = [],
inputs = [];
if (input)
if (input) {
inputs = input.split(split_delim);
}
// Create sub_op_list for each tranche to operate on
// (all remaining operations unless we encounter a Merge)
for (var i = state.progress + 1; i < op_list.length; i++) {
if (op_list[i].name == "Merge" && !op_list[i].is_disabled()) {
if (op_list[i].name == 'Merge' && !op_list[i].is_disabled()) {
break;
} else {
sub_op_list.push(op_list[i]);
}
}
var recipe = new Recipe(),
output = "",
let recipe = new Recipe(),
output = '',
progress;
recipe.add_operations(sub_op_list);
// Run recipe over each tranche
for (i = 0; i < inputs.length; i++) {
var dish = new Dish(inputs[i], input_type);
const dish = new Dish(inputs[i], input_type);
progress = recipe.execute(dish, 0);
output += dish.get(output_type) + merge_delim;
}
@ -81,7 +82,7 @@ var FlowControl = {
* @param {Operation[]} state.op_list - The list of operations in the recipe.
* @returns {Object} The updated state of the recipe.
*/
run_merge: function(state) {
run_merge(state) {
// No need to actually do anything here. The fork operation will
// merge when it sees this operation.
return state;
@ -109,13 +110,13 @@ var FlowControl = {
* @param {number} state.num_jumps - The number of jumps taken so far.
* @returns {Object} The updated state of the recipe.
*/
run_jump: function(state) {
var ings = state.op_list[state.progress].get_ing_values(),
run_jump(state) {
let ings = state.op_list[state.progress].get_ing_values(),
jump_num = ings[0],
max_jumps = ings[1];
if (state.num_jumps >= max_jumps) {
throw "Reached maximum jumps, sorry!";
throw 'Reached maximum jumps, sorry!';
}
state.progress += jump_num;
@ -134,18 +135,18 @@ var FlowControl = {
* @param {number} state.num_jumps - The number of jumps taken so far.
* @returns {Object} The updated state of the recipe.
*/
run_cond_jump: function(state) {
var ings = state.op_list[state.progress].get_ing_values(),
run_cond_jump(state) {
let ings = state.op_list[state.progress].get_ing_values(),
dish = state.dish,
regex_str = ings[0],
jump_num = ings[1],
max_jumps = ings[2];
if (state.num_jumps >= max_jumps) {
throw "Reached maximum jumps, sorry!";
throw 'Reached maximum jumps, sorry!';
}
if (regex_str !== "" && dish.get(Dish.STRING).search(regex_str) > -1) {
if (regex_str !== '' && dish.get(Dish.STRING).search(regex_str) > -1) {
state.progress += jump_num;
state.num_jumps++;
}
@ -163,7 +164,7 @@ var FlowControl = {
* @param {Operation[]} state.op_list - The list of operations in the recipe.
* @returns {Object} The updated state of the recipe.
*/
run_return: function(state) {
run_return(state) {
state.progress = state.op_list.length;
return state;
},

View file

@ -8,9 +8,9 @@
* @class
* @param {Object} ingredient_config
*/
var Ingredient = function(ingredient_config) {
this.name = "";
this.type = "";
const Ingredient = function (ingredient_config) {
this.name = '';
this.type = '';
this.value = null;
if (ingredient_config) {
@ -61,23 +61,23 @@ Ingredient.prototype.set_value = function(value) {
*/
Ingredient.prepare = function (data, type) {
switch (type) {
case "binary_string":
case "binary_short_string":
case "editable_option":
case 'binary_string':
case 'binary_short_string':
case 'editable_option':
return Utils.parse_escaped_chars(data);
case "byte_array":
if (typeof data == "string") {
case 'byte_array':
if (typeof data === 'string') {
data = data.replace(/\s+/g, '');
return Utils.hex_to_byte_array(data);
} else {
return data;
}
break;
case "number":
case 'number':
var number = parseFloat(data);
if (isNaN(number)) {
var sample = Utils.truncate(data.toString(), 10);
throw "Invalid ingredient value. Not a number: " + sample;
const sample = Utils.truncate(data.toString(), 10);
throw `Invalid ingredient value. Not a number: ${sample}`;
}
return number;
default:

View file

@ -9,9 +9,9 @@
* @param {string} operation_name
* @param {Object} operation_config
*/
var Operation = function(operation_name, operation_config) {
const Operation = function (operation_name, operation_config) {
this.name = operation_name;
this.description = "";
this.description = '';
this.input_type = -1;
this.output_type = -1;
this.run = null;
@ -42,9 +42,9 @@ Operation.prototype._parse_config = function(operation_config) {
this.highlight_reverse = operation_config.highlight_reverse;
this.flow_control = operation_config.flow_control;
for (var a = 0; a < operation_config.args.length; a++) {
var ingredient_config = operation_config.args[a];
var ingredient = new Ingredient(ingredient_config);
for (let a = 0; a < operation_config.args.length; a++) {
const ingredient_config = operation_config.args[a];
const ingredient = new Ingredient(ingredient_config);
this.add_ingredient(ingredient);
}
};
@ -56,15 +56,15 @@ Operation.prototype._parse_config = function(operation_config) {
* @returns {Object}
*/
Operation.prototype.get_config = function () {
var ingredient_config = [];
const ingredient_config = [];
for (var o = 0; o < this.ing_list.length; o++) {
for (let o = 0; o < this.ing_list.length; o++) {
ingredient_config.push(this.ing_list[o].get_config());
}
var operation_config = {
"op": this.name,
"args": ingredient_config
const operation_config = {
op: this.name,
args: ingredient_config,
};
return operation_config;
@ -87,7 +87,7 @@ Operation.prototype.add_ingredient = function(ingredient) {
* @param {Object[]} ing_values
*/
Operation.prototype.set_ing_values = function (ing_values) {
for (var i = 0; i < ing_values.length; i++) {
for (let i = 0; i < ing_values.length; i++) {
this.ing_list[i].set_value(ing_values[i]);
}
};
@ -99,8 +99,8 @@ Operation.prototype.set_ing_values = function(ing_values) {
* @returns {Object[]}
*/
Operation.prototype.get_ing_values = function () {
var ing_values = [];
for (var i = 0; i < this.ing_list.length; i++) {
const ing_values = [];
for (let i = 0; i < this.ing_list.length; i++) {
ing_values.push(this.ing_list[i].value);
}
return ing_values;

View file

@ -8,7 +8,7 @@
* @class
* @param {Object} recipe_config
*/
var Recipe = function(recipe_config) {
const Recipe = function (recipe_config) {
this.op_list = [];
if (recipe_config) {
@ -24,10 +24,10 @@ var Recipe = function(recipe_config) {
* @param {Object} recipe_config
*/
Recipe.prototype._parse_config = function (recipe_config) {
for (var c = 0; c < recipe_config.length; c++) {
var operation_name = recipe_config[c].op;
var operation_config = OperationConfig[operation_name];
var operation = new Operation(operation_name, operation_config);
for (let c = 0; c < recipe_config.length; c++) {
const operation_name = recipe_config[c].op;
const operation_config = OperationConfig[operation_name];
const operation = new Operation(operation_name, operation_config);
operation.set_ing_values(recipe_config[c].args);
operation.set_breakpoint(recipe_config[c].breakpoint);
operation.set_disabled(recipe_config[c].disabled);
@ -42,9 +42,9 @@ Recipe.prototype._parse_config = function(recipe_config) {
* @returns {*}
*/
Recipe.prototype.get_config = function () {
var recipe_config = [];
const recipe_config = [];
for (var o = 0; o < this.op_list.length; o++) {
for (let o = 0; o < this.op_list.length; o++) {
recipe_config.push(this.op_list[o].get_config());
}
@ -94,7 +94,7 @@ Recipe.prototype.set_breakpoint = function(position, value) {
* @param {number} pos
*/
Recipe.prototype.remove_breaks_up_to = function (pos) {
for (var i = 0; i < pos; i++) {
for (let i = 0; i < pos; i++) {
this.op_list[i].set_breakpoint(false);
}
};
@ -106,7 +106,7 @@ Recipe.prototype.remove_breaks_up_to = function(pos) {
* @returns {boolean}
*/
Recipe.prototype.contains_flow_control = function () {
for (var i = 0; i < this.op_list.length; i++) {
for (let i = 0; i < this.op_list.length; i++) {
if (this.op_list[i].is_flow_control()) return true;
}
return false;
@ -121,7 +121,7 @@ Recipe.prototype.contains_flow_control = function() {
* @returns (number}
*/
Recipe.prototype.last_op_index = function (start_index) {
var i = start_index + 1 || 0,
let i = start_index + 1 || 0,
op;
for (; i < this.op_list.length; i++) {
@ -143,9 +143,12 @@ Recipe.prototype.last_op_index = function(start_index) {
*/
Recipe.prototype.execute = function (dish, start_from) {
start_from = start_from || 0;
var op, input, output, num_jumps = 0;
let op,
input,
output,
num_jumps = 0;
for (var i = start_from; i < this.op_list.length; i++) {
for (let i = start_from; i < this.op_list.length; i++) {
op = this.op_list[i];
if (op.is_disabled()) {
continue;
@ -159,11 +162,11 @@ Recipe.prototype.execute = function(dish, start_from) {
if (op.is_flow_control()) {
// Package up the current state
var state = {
"progress" : i,
"dish" : dish,
"op_list" : this.op_list,
"num_jumps" : num_jumps
let state = {
progress: i,
dish,
op_list: this.op_list,
num_jumps,
};
state = op.run(state);
@ -174,14 +177,14 @@ Recipe.prototype.execute = function(dish, start_from) {
dish.set(output, op.output_type);
}
} catch (err) {
var e = typeof err == "string" ? { message: err } : err;
const e = typeof err === 'string' ? { message: err } : err;
e.progress = i;
e.display_str = op.name + " - ";
e.display_str = `${op.name} - `;
if (e.fileName) {
e.display_str += e.name + " in " + e.fileName +
" on line " + e.lineNumber +
".<br><br>Message: " + e.message;
e.display_str += `${e.name} in ${e.fileName
} on line ${e.lineNumber
}.<br><br>Message: ${e.message}`;
} else {
e.display_str += e.message;
}
@ -210,6 +213,6 @@ Recipe.prototype.to_string = function() {
* @param {string} recipe_str
*/
Recipe.prototype.from_string = function (recipe_str) {
var recipe_config = JSON.parse(recipe_str);
const recipe_config = JSON.parse(recipe_str);
this._parse_config(recipe_config);
};

View file

@ -9,7 +9,7 @@
*
* @namespace
*/
var Utils = {
const Utils = {
/**
* Translates an ordinal into a character.
@ -21,7 +21,7 @@ var Utils = {
* // returns 'a'
* Utils.chr(97);
*/
chr: function(o) {
chr(o) {
return String.fromCharCode(o);
},
@ -36,7 +36,7 @@ var Utils = {
* // returns 97
* Utils.ord('a');
*/
ord: function(c) {
ord(c) {
return c.charCodeAt(0);
},
@ -62,9 +62,9 @@ var Utils = {
* // returns "bcabchello"
* Utils.pad_left("hello", 10, "abc");
*/
pad_left: function(str, max, chr) {
chr = chr || "0";
var start_index = chr.length - (max - str.length);
pad_left(str, max, chr) {
chr = chr || '0';
let start_index = chr.length - (max - str.length);
start_index = start_index < 0 ? 0 : start_index;
return str.length < max ?
Utils.pad_left(chr.slice(start_index, chr.length) + str, max, chr) : str;
@ -86,8 +86,8 @@ var Utils = {
* // returns "axxx"
* Utils.pad_right("a", 4, "x");
*/
pad_right: function(str, max, chr) {
chr = chr || " ";
pad_right(str, max, chr) {
chr = chr || ' ';
return str.length < max ?
Utils.pad_right(str + chr.slice(0, max - str.length), max, chr) : str;
},
@ -96,7 +96,7 @@ var Utils = {
/**
* @alias Utils.pad_left
*/
pad: function(str, max, chr) {
pad(str, max, chr) {
return Utils.pad_left(str, max, chr);
},
@ -116,8 +116,8 @@ var Utils = {
* // returns "A long s-"
* Utils.truncate("A long string", 9, "-");
*/
truncate: function(str, max, suffix) {
suffix = suffix || "...";
truncate(str, max, suffix) {
suffix = suffix || '...';
if (str.length > max) {
str = str.slice(0, max - suffix.length) + suffix;
}
@ -139,8 +139,8 @@ var Utils = {
* // returns "6e"
* Utils.hex(110);
*/
hex: function(c, length) {
c = typeof c == "string" ? Utils.ord(c) : c;
hex(c, length) {
c = typeof c === 'string' ? Utils.ord(c) : c;
length = length || 2;
return Utils.pad(c.toString(16), length);
},
@ -160,8 +160,8 @@ var Utils = {
* // returns "01101110"
* Utils.bin(110);
*/
bin: function(c, length) {
c = typeof c == "string" ? Utils.ord(c) : c;
bin(c, length) {
c = typeof c === 'string' ? Utils.ord(c) : c;
length = length || 8;
return Utils.pad(c.toString(2), length);
},
@ -174,16 +174,16 @@ var Utils = {
* @param {boolean} [preserve_ws=false] - Whether or not to print whitespace.
* @returns {string}
*/
printable: function(str, preserve_ws) {
printable(str, preserve_ws) {
if (window && window.app && !window.app.options.treat_as_utf8) {
str = Utils.byte_array_to_chars(Utils.str_to_byte_array(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;
var ws_re = /[\x09-\x10\x0D\u2028\u2029]/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;
const ws_re = /[\x09-\x10\x0D\u2028\u2029]/g;
str = str.replace(re, ".");
if (!preserve_ws) str = str.replace(ws_re, ".");
str = str.replace(re, '.');
if (!preserve_ws) str = str.replace(ws_re, '.');
return str;
},
@ -201,21 +201,21 @@ var Utils = {
* // returns "\n"
* Utils.parse_escaped_chars("\\n");
*/
parse_escaped_chars: function(str) {
return str.replace(/(\\)?\\([nrtbf]|x[\da-f]{2})/g, function(m, a, b) {
if (a == "\\") return "\\"+b;
parse_escaped_chars(str) {
return str.replace(/(\\)?\\([nrtbf]|x[\da-f]{2})/g, (m, a, b) => {
if (a == '\\') return `\\${b}`;
switch (b[0]) {
case "n":
return "\n";
case "r":
return "\r";
case "t":
return "\t";
case "b":
return "\b";
case "f":
return "\f";
case "x":
case 'n':
return '\n';
case 'r':
return '\r';
case 't':
return '\t';
case 'b':
return '\b';
case 'f':
return '\f';
case 'x':
return Utils.chr(parseInt(b.substr(1), 16));
}
});
@ -238,24 +238,24 @@ var Utils = {
* // returns ["a", "b", "c", "d", "0", "-", "3"]
* Utils.expand_alph_range("a-d0\\-3")
*/
expand_alph_range: function(alph_str) {
var alph_arr = [];
expand_alph_range(alph_str) {
const alph_arr = [];
for (var i = 0; i < alph_str.length; i++) {
for (let i = 0; i < alph_str.length; i++) {
if (i < alph_str.length - 2 &&
alph_str[i+1] == "-" &&
alph_str[i] != "\\") {
var start = Utils.ord(alph_str[i]),
alph_str[i + 1] == '-' &&
alph_str[i] != '\\') {
let start = Utils.ord(alph_str[i]),
end = Utils.ord(alph_str[i + 2]);
for (var j = start; j <= end; j++) {
for (let j = start; j <= end; j++) {
alph_arr.push(Utils.chr(j));
}
i += 2;
} else if (i < alph_str.length - 2 &&
alph_str[i] == "\\" &&
alph_str[i+1] == "-") {
alph_arr.push("-");
alph_str[i] == '\\' &&
alph_str[i + 1] == '-') {
alph_arr.push('-');
i++;
} else {
alph_arr.push(alph_str[i]);
@ -275,12 +275,12 @@ var Utils = {
* // returns [0xfe, 0x09, 0xa7]
* Utils.hex_to_byte_array("fe09a7");
*/
hex_to_byte_array: function(hex_str) {
hex_to_byte_array(hex_str) {
// TODO: Handle errors i.e. input string is not hex
if (!hex_str) return [];
hex_str = hex_str.replace(/\s+/g, '');
var byte_array = [];
for (var i = 0; i < hex_str.length; i += 2) {
const byte_array = [];
for (let i = 0; i < hex_str.length; i += 2) {
byte_array.push(parseInt(hex_str.substr(i, 2), 16));
}
return byte_array;
@ -297,11 +297,11 @@ var Utils = {
* // returns "fe09a7"
* Utils.byte_array_to_hex([0xfe, 0x09, 0xa7]);
*/
byte_array_to_hex: function(byte_array) {
if (!byte_array) return "";
var hex_str = "";
for (var i = 0; i < byte_array.length; i++) {
hex_str += Utils.hex(byte_array[i]) + " ";
byte_array_to_hex(byte_array) {
if (!byte_array) return '';
let hex_str = '';
for (let i = 0; i < byte_array.length; i++) {
hex_str += `${Utils.hex(byte_array[i])} `;
}
return hex_str.slice(0, hex_str.length - 1);
},
@ -321,9 +321,10 @@ var Utils = {
* // returns [228,189,160,229,165,189]
* Utils.str_to_byte_array("你好");
*/
str_to_byte_array: function(str) {
var byte_array = new Array(str.length);
var i = str.length, b;
str_to_byte_array(str) {
const byte_array = new Array(str.length);
let i = str.length,
b;
while (i--) {
b = str.charCodeAt(i);
byte_array[i] = b;
@ -347,12 +348,13 @@ var Utils = {
* // returns [228,189,160,229,165,189]
* Utils.str_to_utf8_byte_array("你好");
*/
str_to_utf8_byte_array: function(str) {
var word_array = CryptoJS.enc.Utf8.parse(str),
str_to_utf8_byte_array(str) {
let word_array = CryptoJS.enc.Utf8.parse(str),
byte_array = Utils.word_array_to_byte_array(word_array);
if (str.length != word_array.sigBytes)
if (str.length != word_array.sigBytes) {
window.app.options.attempt_highlight = false;
}
return byte_array;
},
@ -370,9 +372,9 @@ var Utils = {
* // returns [20320,22909]
* Utils.str_to_charcode("你好");
*/
str_to_charcode: function(str) {
var byte_array = new Array(str.length);
var i = str.length;
str_to_charcode(str) {
const byte_array = new Array(str.length);
let i = str.length;
while (i--) {
byte_array[i] = str.charCodeAt(i);
}
@ -393,18 +395,19 @@ var Utils = {
* // returns "你好"
* Utils.byte_array_to_utf8([228,189,160,229,165,189]);
*/
byte_array_to_utf8: function(byte_array) {
byte_array_to_utf8(byte_array) {
try {
// Try to output data as UTF-8 string
var words = [];
for (var i = 0; i < byte_array.length; i++) {
const words = [];
for (let i = 0; i < byte_array.length; i++) {
words[i >>> 2] |= byte_array[i] << (24 - (i % 4) * 8);
}
var word_array = new CryptoJS.lib.WordArray.init(words, byte_array.length),
let word_array = new CryptoJS.lib.WordArray.init(words, byte_array.length),
str = CryptoJS.enc.Utf8.stringify(word_array);
if (str.length != word_array.sigBytes)
if (str.length != word_array.sigBytes) {
window.app.options.attempt_highlight = false;
}
return str;
} catch (err) {
// If it fails, treat it as ANSI
@ -426,10 +429,10 @@ var Utils = {
* // returns "你好"
* Utils.byte_array_to_chars([20320,22909]);
*/
byte_array_to_chars: function(byte_array) {
if (!byte_array) return "";
var str = "";
for (var i = 0; i < byte_array.length;) {
byte_array_to_chars(byte_array) {
if (!byte_array) return '';
let str = '';
for (let i = 0; i < byte_array.length;) {
str += String.fromCharCode(byte_array[i++]);
}
return str;
@ -446,13 +449,13 @@ var Utils = {
* // returns [84, 101, 115, 116]
* Utils.word_array_to_byte_array(CryptoJS.enc.Hex.parse("54657374"));
*/
word_array_to_byte_array: function(word_array) {
word_array_to_byte_array(word_array) {
if (word_array.sigBytes <= 0) return [];
var words = word_array.words,
let words = word_array.words,
byte_array = [];
for (var i = 0; i < word_array.sigBytes; i++) {
for (let i = 0; i < word_array.sigBytes; i++) {
byte_array.push((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);
}
@ -493,7 +496,7 @@ var Utils = {
1094: 246, 1054: 206, 1095: 247, 1096: 248, 8249: 139, 1097: 249, 1098: 250, 1044: 196,
1099: 251, 1111: 191, 1055: 207, 1100: 252, 1038: 161, 8220: 147, 1101: 253, 8250: 155,
1102: 254, 8216: 145, 1103: 255, 1043: 195, 1105: 184, 1039: 143, 1026: 128, 1106: 144,
8218: 130, 1107: 131, 8217: 146, 1108: 186, 1109: 190
8218: 130, 1107: 131, 8217: 146, 1108: 186, 1109: 190,
},
/**
@ -529,7 +532,7 @@ var Utils = {
179: 1110, 191: 1111, 188: 1112, 154: 1113, 156: 1114, 158: 1115, 157: 1116, 162: 1118,
159: 1119, 165: 1168, 180: 1169, 150: 8211, 151: 8212, 145: 8216, 146: 8217, 130: 8218,
147: 8220, 148: 8221, 132: 8222, 134: 8224, 135: 8225, 149: 8226, 133: 8230, 137: 8240,
139: 8249, 155: 8250, 136: 8364, 185: 8470, 153: 8482
139: 8249, 155: 8250, 136: 8364, 185: 8470, 153: 8482,
},
@ -543,13 +546,14 @@ var Utils = {
* // returns "îáíîâëåííàÿ òåõíè÷êà ïî Áîèíãó. îðèãèíàë ó ìåíÿ. çàáåðåòå êîãäà áóäåòå â ÊÈ"
* Utils.unicode_to_win1251("обновленная техничка по Боингу. оригинал у меня. заберете когда будете в КИ");
*/
unicode_to_win1251: function(unic_str) {
var res = [];
unicode_to_win1251(unic_str) {
const res = [];
for (var i = 0; i < unic_str.length; i++) {
var ord = unic_str.charCodeAt(i);
if (!(ord in Utils.UNIC_WIN1251_MAP))
throw "Character '" + unic_str.charAt(i) + "' isn't supported by Windows-1251";
for (let i = 0; i < unic_str.length; i++) {
const ord = unic_str.charCodeAt(i);
if (!(ord in Utils.UNIC_WIN1251_MAP)) {
throw `Character '${unic_str.charAt(i)}' isn't supported by Windows-1251`;
}
res.push(String.fromCharCode(Utils.UNIC_WIN1251_MAP[ord]));
}
@ -567,13 +571,14 @@ var Utils = {
* // returns "обновленная техничка по Боингу. оригинал у меня. заберете когда будете в КИ"
* Utils.unicode_to_win1251("îáíîâëåííàÿ òåõíè÷êà ïî Áîèíãó. îðèãèíàë ó ìåíÿ. çàáåðåòå êîãäà áóäåòå â ÊÈ");
*/
win1251_to_unicode: function(win1251_str) {
var res = [];
win1251_to_unicode(win1251_str) {
const res = [];
for (var i = 0; i < win1251_str.length; i++) {
var ord = win1251_str.charCodeAt(i);
if (!(ord in Utils.WIN1251_UNIC_MAP))
throw "Character '" + win1251_str.charAt(i) + "' isn't supported by Windows-1251";
for (let i = 0; i < win1251_str.length; i++) {
const ord = win1251_str.charCodeAt(i);
if (!(ord in Utils.WIN1251_UNIC_MAP)) {
throw `Character '${win1251_str.charAt(i)}' isn't supported by Windows-1251`;
}
res.push(String.fromCharCode(Utils.WIN1251_UNIC_MAP[ord]));
}
@ -595,18 +600,23 @@ var Utils = {
* // returns "SGVsbG8="
* Utils.to_base64("Hello");
*/
to_base64: function(data, alphabet) {
if (!data) return "";
if (typeof data == "string") {
to_base64(data, alphabet) {
if (!data) return '';
if (typeof data === 'string') {
data = Utils.str_to_byte_array(data);
}
alphabet = alphabet ?
Utils.expand_alph_range(alphabet).join("") :
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var output = "",
chr1, chr2, chr3,
enc1, enc2, enc3, enc4,
Utils.expand_alph_range(alphabet).join('') :
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
let output = '',
chr1,
chr2,
chr3,
enc1,
enc2,
enc3,
enc4,
i = 0;
while (i < data.length) {
@ -649,34 +659,40 @@ var Utils = {
* // returns [72, 101, 108, 108, 111]
* Utils.from_base64("SGVsbG8=", null, "byte_array");
*/
from_base64: function(data, alphabet, return_type, remove_non_alph_chars) {
return_type = return_type || "string";
from_base64(data, alphabet, return_type, remove_non_alph_chars) {
return_type = return_type || 'string';
if (!data) {
return return_type == "string" ? "" : [];
return return_type == 'string' ? '' : [];
}
alphabet = alphabet ?
Utils.expand_alph_range(alphabet).join("") :
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
if (remove_non_alph_chars === undefined)
Utils.expand_alph_range(alphabet).join('') :
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
if (remove_non_alph_chars === undefined) {
remove_non_alph_chars = true;
}
var output = [],
chr1, chr2, chr3,
enc1, enc2, enc3, enc4,
let output = [],
chr1,
chr2,
chr3,
enc1,
enc2,
enc3,
enc4,
i = 0;
if (remove_non_alph_chars) {
var re = new RegExp("[^" + alphabet.replace(/[\[\]\\\-^$]/g, "\\$&") + "]", "g");
data = data.replace(re, "");
const re = new RegExp(`[^${alphabet.replace(/[\[\]\\\-^$]/g, '\\$&')}]`, 'g');
data = data.replace(re, '');
}
while (i < data.length) {
enc1 = alphabet.indexOf(data.charAt(i++));
enc2 = alphabet.indexOf(data.charAt(i++) || "=");
enc3 = alphabet.indexOf(data.charAt(i++) || "=");
enc4 = alphabet.indexOf(data.charAt(i++) || "=");
enc2 = alphabet.indexOf(data.charAt(i++) || '=');
enc3 = alphabet.indexOf(data.charAt(i++) || '=');
enc4 = alphabet.indexOf(data.charAt(i++) || '=');
enc2 = enc2 == -1 ? 64 : enc2;
enc3 = enc3 == -1 ? 64 : enc3;
@ -696,7 +712,7 @@ var Utils = {
}
}
return return_type == "string" ? Utils.byte_array_to_utf8(output) : output;
return return_type == 'string' ? Utils.byte_array_to_utf8(output) : output;
},
@ -715,25 +731,24 @@ var Utils = {
* // returns "0a:14:1e"
* Utils.to_hex([10,20,30], ":");
*/
to_hex: function(data, delim, padding) {
if (!data) return "";
to_hex(data, delim, padding) {
if (!data) return '';
delim = typeof delim == "string" ? delim : " ";
delim = typeof delim === 'string' ? delim : ' ';
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;
}
// Add \x or 0x to beginning
if (delim == "0x") output = "0x" + output;
if (delim == "\\x") output = "\\x" + output;
if (delim == '0x') output = `0x${output}`;
if (delim == '\\x') output = `\\x${output}`;
if (delim.length)
if (delim.length) {
return output.slice(0, -delim.length);
else
return output;
} else { return output; }
},
@ -747,17 +762,17 @@ var Utils = {
* // returns "0a141e"
* Utils.to_hex([10,20,30]);
*/
to_hex_fast: function(data) {
if (!data) return "";
to_hex_fast(data) {
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] & 0x0f).toString(16));
}
return output.join("");
return output.join('');
},
@ -776,16 +791,16 @@ var Utils = {
* // returns [10,20,30]
* Utils.from_hex("0a:14:1e", "Colon");
*/
from_hex: function(data, delim, byte_len) {
delim = delim || (data.indexOf(" ") >= 0 ? "Space" : "None");
from_hex(data, delim, byte_len) {
delim = delim || (data.indexOf(' ') >= 0 ? 'Space' : 'None');
byte_len = byte_len || 2;
if (delim != "None") {
var delim_regex = Utils.regex_rep[delim];
if (delim != 'None') {
const delim_regex = Utils.regex_rep[delim];
data = data.replace(delim_regex, '');
}
var output = [];
for (var i = 0; i < data.length; i += byte_len) {
const output = [];
for (let i = 0; i < data.length; i += byte_len) {
output.push(parseInt(data.substr(i, byte_len), 16));
}
return output;
@ -802,33 +817,32 @@ var Utils = {
* // returns [["head1", "head2"], ["data1", "data2"]]
* Utils.parse_csv("head1,head2\ndata1,data2");
*/
parse_csv: function(data) {
var b,
parse_csv(data) {
let b,
ignore_next = false,
in_string = false,
cell = "",
cell = '',
line = [],
lines = [];
for (var i = 0; i < data.length; i++) {
for (let i = 0; i < data.length; i++) {
b = data[i];
if (ignore_next) {
cell += b;
ignore_next = false;
} else if (b == "\\") {
} else if (b == '\\') {
cell += b;
ignore_next = true;
} else if (b == "\"" && !in_string) {
} else if (b == '"' && !in_string) {
in_string = true;
} else if (b == "\"" && in_string) {
} else if (b == '"' && in_string) {
in_string = false;
} else if (b == "," && !in_string) {
} else if (b == ',' && !in_string) {
line.push(cell);
cell = "";
} else if ((b == "\n" || b == "\r") && !in_string) {
cell = '';
} else if ((b == '\n' || b == '\r') && !in_string) {
line.push(cell);
cell = "";
cell = '';
lines.push(line);
line = [];
} else {
@ -856,11 +870,11 @@ var Utils = {
* // returns "Test"
* Utils.strip_html_tags("<div>Test</div>");
*/
strip_html_tags: function(html_str, remove_script_and_style) {
strip_html_tags(html_str, remove_script_and_style) {
if (remove_script_and_style) {
html_str = html_str.replace(/<(script|style)[^>]*>.*<\/(script|style)>/gmi, "");
html_str = html_str.replace(/<(script|style)[^>]*>.*<\/(script|style)>/gmi, '');
}
return html_str.replace(/<[^>\n]+>/g, "");
return html_str.replace(/<[^>\n]+>/g, '');
},
@ -874,8 +888,8 @@ var Utils = {
* // return "A &lt;script> tag"
* Utils.escape_html("A <script> tag");
*/
escape_html: function(str) {
return str.replace(/</g, "&lt;");
escape_html(str) {
return str.replace(/</g, '&lt;');
},
@ -906,8 +920,8 @@ var Utils = {
* // returns "5 days"
* Utils.fuzzy_time(456851321);
*/
fuzzy_time: function(ms) {
return moment.duration(ms, "milliseconds").humanize();
fuzzy_time(ms) {
return moment.duration(ms, 'milliseconds').humanize();
},
@ -918,10 +932,12 @@ var Utils = {
* @param {Object} b
* @returns {Object}
*/
extend: function(a, b){
for(var key in b)
if(b.hasOwnProperty(key))
extend(a, b) {
for (const key in b) {
if (b.hasOwnProperty(key)) {
a[key] = b[key];
}
}
return a;
},
@ -931,16 +947,16 @@ var Utils = {
* @constant
*/
char_rep: {
"Space": " ",
"Comma": ",",
"Semi-colon": ";",
"Colon": ":",
"Line feed": "\n",
"CRLF": "\r\n",
"0x": "0x",
"\\x": "\\x",
"Nothing (separate chars)": "",
"None": "",
Space: ' ',
Comma: ',',
'Semi-colon': ';',
Colon: ':',
'Line feed': '\n',
CRLF: '\r\n',
'0x': '0x',
'\\x': '\\x',
'Nothing (separate chars)': '',
None: '',
},
@ -949,14 +965,14 @@ var Utils = {
* @constant
*/
regex_rep: {
"Space": /\s+/g,
"Comma": /,/g,
"Semi-colon": /;/g,
"Colon": /:/g,
"Line feed": /\n/g,
"CRLF": /\r\n/g,
"0x": /0x/g,
"\\x": /\\x/g
Space: /\s+/g,
Comma: /,/g,
'Semi-colon': /;/g,
Colon: /:/g,
'Line feed': /\n/g,
CRLF: /\r\n/g,
'0x': /0x/g,
'\\x': /\\x/g,
},
@ -965,13 +981,13 @@ var Utils = {
* @constant
*/
format: {
"Hex": CryptoJS.enc.Hex,
"Base64": CryptoJS.enc.Base64,
"UTF8": CryptoJS.enc.Utf8,
"UTF16": CryptoJS.enc.Utf16,
"UTF16LE": CryptoJS.enc.Utf16LE,
"UTF16BE": CryptoJS.enc.Utf16BE,
"Latin1": CryptoJS.enc.Latin1,
Hex: CryptoJS.enc.Hex,
Base64: CryptoJS.enc.Base64,
UTF8: CryptoJS.enc.Utf8,
UTF16: CryptoJS.enc.Utf16,
UTF16LE: CryptoJS.enc.Utf16LE,
UTF16BE: CryptoJS.enc.Utf16BE,
Latin1: CryptoJS.enc.Latin1,
},
};
@ -997,7 +1013,7 @@ $.fn.selectRange = function(start, end) {
this.focus();
this.setSelectionRange(start, end);
} else if (this.createTextRange) {
var range = this.createTextRange();
const range = this.createTextRange();
range.collapse(true);
range.moveEnd('character', end);
range.moveStart('character', start);
@ -1020,8 +1036,9 @@ $.fn.selectRange = function(start, end) {
* ["One", "Two", "Three", "One"].unique();
*/
Array.prototype.unique = function () {
var u = {}, a = [];
for (var i = 0, l = this.length; i < l; i++) {
let u = {},
a = [];
for (let i = 0, l = this.length; i < l; i++) {
if (u.hasOwnProperty(this[i])) {
continue;
}
@ -1070,9 +1087,7 @@ Array.prototype.min = function() {
* [4,2,5,3,7].sum();
*/
Array.prototype.sum = function () {
return this.reduce(function (a, b) {
return a + b;
}, 0);
return this.reduce((a, b) => a + b, 0);
};
@ -1091,7 +1106,7 @@ Array.prototype.sum = function() {
*/
Array.prototype.equals = function (other) {
if (!other) return false;
var i = this.length;
let i = this.length;
if (i != other.length) return false;
while (i--) {
if (this[i] !== other[i]) return false;
@ -1115,7 +1130,6 @@ String.prototype.count = function(chr) {
};
// //////////////////////////////////////////////////////////////////////////////////////////////////
// Library overrides ///////////////////////////////////////////////////////////////////////////////
// //////////////////////////////////////////////////////////////////////////////////////////////////
@ -1129,14 +1143,14 @@ String.prototype.count = function(chr) {
*/
CryptoJS.enc.Hex.parse = function (hexStr) {
// Remove whitespace
hexStr = hexStr.replace(/\s/g, "");
hexStr = hexStr.replace(/\s/g, '');
// Shortcut
var hexStrLength = hexStr.length;
const hexStrLength = hexStr.length;
// Convert
var words = [];
for (var i = 0; i < hexStrLength; i += 2) {
const words = [];
for (let i = 0; i < hexStrLength; i += 2) {
words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
}

View file

@ -7,7 +7,7 @@
*
* @namespace
*/
var Base = {
const Base = {
/**
* @constant
@ -22,13 +22,13 @@ var Base = {
* @param {Object[]} args
* @returns {string}
*/
run_to: function(input, args) {
run_to(input, args) {
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) {
throw "Error: Radix argument must be between 2 and 36";
throw 'Error: Radix argument must be between 2 and 36';
}
return input.toString(radix);
},
@ -41,12 +41,12 @@ var Base = {
* @param {Object[]} args
* @returns {number}
*/
run_from: function(input, args) {
var radix = args[0] || Base.DEFAULT_RADIX;
run_from(input, args) {
const radix = args[0] || Base.DEFAULT_RADIX;
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';
}
return parseInt(input.replace(/\s/g, ""), radix);
return parseInt(input.replace(/\s/g, ''), radix);
},
};

View file

@ -7,30 +7,30 @@
*
* @namespace
*/
var Base64 = {
const Base64 = {
/**
* @constant
* @default
*/
ALPHABET: "A-Za-z0-9+/=",
ALPHABET: 'A-Za-z0-9+/=',
/**
* @constant
* @default
*/
ALPHABET_OPTIONS: [
{name: "Standard: A-Za-z0-9+/=", value: "A-Za-z0-9+/="},
{name: "URL safe: A-Za-z0-9-_", value: "A-Za-z0-9-_"},
{name: "Filename safe: A-Za-z0-9+-=", value: "A-Za-z0-9+\\-="},
{name: "itoa64: ./0-9A-Za-z=", value: "./0-9A-Za-z="},
{name: "XML: A-Za-z0-9_.", value: "A-Za-z0-9_."},
{name: "y64: A-Za-z0-9._-", value: "A-Za-z0-9._-"},
{name: "z64: 0-9a-zA-Z+/=", value: "0-9a-zA-Z+/="},
{name: "Radix-64: 0-9A-Za-z+/=", value: "0-9A-Za-z+/="},
{name: "Uuencoding: [space]-_", value: " -_"},
{name: "Xxencoding: +-0-9A-Za-z", value: "+\\-0-9A-Za-z"},
{name: "BinHex: !-,-0-689@A-NP-VX-Z[`a-fh-mp-r", value: "!-,-0-689@A-NP-VX-Z[`a-fh-mp-r"},
{name: "ROT13: N-ZA-Mn-za-m0-9+/=", value: "N-ZA-Mn-za-m0-9+/="},
{ name: 'Standard: A-Za-z0-9+/=', value: 'A-Za-z0-9+/=' },
{ name: 'URL safe: A-Za-z0-9-_', value: 'A-Za-z0-9-_' },
{ name: 'Filename safe: A-Za-z0-9+-=', value: 'A-Za-z0-9+\\-=' },
{ name: 'itoa64: ./0-9A-Za-z=', value: './0-9A-Za-z=' },
{ name: 'XML: A-Za-z0-9_.', value: 'A-Za-z0-9_.' },
{ name: 'y64: A-Za-z0-9._-', value: 'A-Za-z0-9._-' },
{ name: 'z64: 0-9a-zA-Z+/=', value: '0-9a-zA-Z+/=' },
{ name: 'Radix-64: 0-9A-Za-z+/=', value: '0-9A-Za-z+/=' },
{ name: 'Uuencoding: [space]-_', value: ' -_' },
{ name: 'Xxencoding: +-0-9A-Za-z', value: '+\\-0-9A-Za-z' },
{ name: 'BinHex: !-,-0-689@A-NP-VX-Z[`a-fh-mp-r', value: '!-,-0-689@A-NP-VX-Z[`a-fh-mp-r' },
{ name: 'ROT13: N-ZA-Mn-za-m0-9+/=', value: 'N-ZA-Mn-za-m0-9+/=' },
],
/**
@ -40,8 +40,8 @@ var Base64 = {
* @param {Object[]} args
* @returns {string}
*/
run_to: function(input, args) {
var alphabet = args[0] || Base64.ALPHABET;
run_to(input, args) {
const alphabet = args[0] || Base64.ALPHABET;
return Utils.to_base64(input, alphabet);
},
@ -59,11 +59,11 @@ var Base64 = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_from: function(input, args) {
var alphabet = args[0] || Base64.ALPHABET,
run_from(input, args) {
let alphabet = args[0] || Base64.ALPHABET,
remove_non_alph_chars = args[1];
return Utils.from_base64(input, alphabet, "byte_array", remove_non_alph_chars);
return Utils.from_base64(input, alphabet, 'byte_array', remove_non_alph_chars);
},
@ -71,7 +71,7 @@ var Base64 = {
* @constant
* @default
*/
BASE32_ALPHABET: "A-Z2-7=",
BASE32_ALPHABET: 'A-Z2-7=',
/**
* To Base32 operation.
@ -80,14 +80,25 @@ var Base64 = {
* @param {Object[]} args
* @returns {string}
*/
run_to_32: function(input, args) {
if (!input) return "";
run_to_32(input, args) {
if (!input) return '';
var alphabet = args[0] ?
Utils.expand_alph_range(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",
output = "",
chr1, chr2, chr3, chr4, chr5,
enc1, enc2, enc3, enc4, enc5, enc6, enc7, enc8,
let alphabet = args[0] ?
Utils.expand_alph_range(args[0]).join('') : 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=',
output = '',
chr1,
chr2,
chr3,
chr4,
chr5,
enc1,
enc2,
enc3,
enc4,
enc5,
enc6,
enc7,
enc8,
i = 0;
while (i < input.length) {
@ -132,32 +143,43 @@ var Base64 = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_from_32: function(input, args) {
run_from_32(input, args) {
if (!input) return [];
var alphabet = args[0] ?
Utils.expand_alph_range(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",
let alphabet = args[0] ?
Utils.expand_alph_range(args[0]).join('') : 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=',
remove_non_alph_chars = args[0];
var output = [],
chr1, chr2, chr3, chr4, chr5,
enc1, enc2, enc3, enc4, enc5, enc6, enc7, enc8,
let output = [],
chr1,
chr2,
chr3,
chr4,
chr5,
enc1,
enc2,
enc3,
enc4,
enc5,
enc6,
enc7,
enc8,
i = 0;
if (remove_non_alph_chars) {
var re = new RegExp("[^" + alphabet.replace(/[\]\\\-^]/g, "\\$&") + "]", "g");
input = input.replace(re, "");
const re = new RegExp(`[^${alphabet.replace(/[\]\\\-^]/g, '\\$&')}]`, 'g');
input = input.replace(re, '');
}
while (i < input.length) {
enc1 = alphabet.indexOf(input.charAt(i++));
enc2 = alphabet.indexOf(input.charAt(i++) || "=");
enc3 = alphabet.indexOf(input.charAt(i++) || "=");
enc4 = alphabet.indexOf(input.charAt(i++) || "=");
enc5 = alphabet.indexOf(input.charAt(i++) || "=");
enc6 = alphabet.indexOf(input.charAt(i++) || "=");
enc7 = alphabet.indexOf(input.charAt(i++) || "=");
enc8 = alphabet.indexOf(input.charAt(i++) || "=");
enc2 = alphabet.indexOf(input.charAt(i++) || '=');
enc3 = alphabet.indexOf(input.charAt(i++) || '=');
enc4 = alphabet.indexOf(input.charAt(i++) || '=');
enc5 = alphabet.indexOf(input.charAt(i++) || '=');
enc6 = alphabet.indexOf(input.charAt(i++) || '=');
enc7 = alphabet.indexOf(input.charAt(i++) || '=');
enc8 = alphabet.indexOf(input.charAt(i++) || '=');
chr1 = (enc1 << 3) | (enc2 >> 2);
chr2 = ((enc2 & 3) << 6) | (enc3 << 1) | (enc4 >> 4);
@ -194,43 +216,43 @@ var Base64 = {
* @param {Object[]} args
* @returns {html}
*/
run_offsets: function(input, args) {
var alphabet = args[0] || Base64.ALPHABET,
run_offsets(input, args) {
let alphabet = args[0] || Base64.ALPHABET,
show_variable = args[1],
offset0 = Utils.to_base64(input, alphabet),
offset1 = Utils.to_base64([0].concat(input), alphabet),
offset2 = Utils.to_base64([0, 0].concat(input), alphabet),
len0 = offset0.indexOf("="),
len1 = offset1.indexOf("="),
len2 = offset2.indexOf("="),
len0 = offset0.indexOf('='),
len1 = offset1.indexOf('='),
len2 = offset2.indexOf('='),
script = "<script type='application/javascript'>$('[data-toggle=\"tooltip\"]').tooltip()</script>",
static_section = "",
padding = "";
static_section = '',
padding = '';
if (input.length < 1) {
return "Please enter a string.";
return 'Please enter a string.';
}
// Highlight offset 0
if (len0 % 4 == 2) {
static_section = offset0.slice(0, -3);
offset0 = "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.from_base64(static_section, alphabet).slice(0, -2) + "'>" +
static_section + "</span>" +
"<span class='hlgreen'>" + offset0.substr(offset0.length - 3, 1) + "</span>" +
"<span class='hlred'>" + offset0.substr(offset0.length - 2) + "</span>";
offset0 = `<span data-toggle='tooltip' data-placement='top' title='${
Utils.from_base64(static_section, alphabet).slice(0, -2)}'>${
static_section}</span>` +
`<span class='hlgreen'>${offset0.substr(offset0.length - 3, 1)}</span>` +
`<span class='hlred'>${offset0.substr(offset0.length - 2)}</span>`;
} else if (len0 % 4 == 3) {
static_section = offset0.slice(0, -2);
offset0 = "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.from_base64(static_section, alphabet).slice(0, -1) + "'>" +
static_section + "</span>" +
"<span class='hlgreen'>" + offset0.substr(offset0.length - 2, 1) + "</span>" +
"<span class='hlred'>" + offset0.substr(offset0.length - 1) + "</span>";
offset0 = `<span data-toggle='tooltip' data-placement='top' title='${
Utils.from_base64(static_section, alphabet).slice(0, -1)}'>${
static_section}</span>` +
`<span class='hlgreen'>${offset0.substr(offset0.length - 2, 1)}</span>` +
`<span class='hlred'>${offset0.substr(offset0.length - 1)}</span>`;
} else {
static_section = offset0;
offset0 = "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.from_base64(static_section, alphabet) + "'>" +
static_section + "</span>";
offset0 = `<span data-toggle='tooltip' data-placement='top' title='${
Utils.from_base64(static_section, alphabet)}'>${
static_section}</span>`;
}
if (!show_variable) {
@ -239,28 +261,28 @@ var Base64 = {
// Highlight offset 1
padding = "<span class='hlred'>" + offset1.substr(0, 1) + "</span>" +
"<span class='hlgreen'>" + offset1.substr(1, 1) + "</span>";
padding = `<span class='hlred'>${offset1.substr(0, 1)}</span>` +
`<span class='hlgreen'>${offset1.substr(1, 1)}</span>`;
offset1 = offset1.substr(2);
if (len1 % 4 == 2) {
static_section = offset1.slice(0, -3);
offset1 = padding + "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.from_base64("AA" + static_section, alphabet).slice(1, -2) + "'>" +
static_section + "</span>" +
"<span class='hlgreen'>" + offset1.substr(offset1.length - 3, 1) + "</span>" +
"<span class='hlred'>" + offset1.substr(offset1.length - 2) + "</span>";
offset1 = `${padding}<span data-toggle='tooltip' data-placement='top' title='${
Utils.from_base64(`AA${static_section}`, alphabet).slice(1, -2)}'>${
static_section}</span>` +
`<span class='hlgreen'>${offset1.substr(offset1.length - 3, 1)}</span>` +
`<span class='hlred'>${offset1.substr(offset1.length - 2)}</span>`;
} else if (len1 % 4 == 3) {
static_section = offset1.slice(0, -2);
offset1 = padding + "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.from_base64("AA" + static_section, alphabet).slice(1, -1) + "'>" +
static_section + "</span>" +
"<span class='hlgreen'>" + offset1.substr(offset1.length - 2, 1) + "</span>" +
"<span class='hlred'>" + offset1.substr(offset1.length - 1) + "</span>";
offset1 = `${padding}<span data-toggle='tooltip' data-placement='top' title='${
Utils.from_base64(`AA${static_section}`, alphabet).slice(1, -1)}'>${
static_section}</span>` +
`<span class='hlgreen'>${offset1.substr(offset1.length - 2, 1)}</span>` +
`<span class='hlred'>${offset1.substr(offset1.length - 1)}</span>`;
} else {
static_section = offset1;
offset1 = padding + "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.from_base64("AA" + static_section, alphabet).slice(1) + "'>" +
static_section + "</span>";
offset1 = `${padding}<span data-toggle='tooltip' data-placement='top' title='${
Utils.from_base64(`AA${static_section}`, alphabet).slice(1)}'>${
static_section}</span>`;
}
if (!show_variable) {
@ -268,43 +290,43 @@ var Base64 = {
}
// Highlight offset 2
padding = "<span class='hlred'>" + offset2.substr(0, 2) + "</span>" +
"<span class='hlgreen'>" + offset2.substr(2, 1) + "</span>";
padding = `<span class='hlred'>${offset2.substr(0, 2)}</span>` +
`<span class='hlgreen'>${offset2.substr(2, 1)}</span>`;
offset2 = offset2.substr(3);
if (len2 % 4 == 2) {
static_section = offset2.slice(0, -3);
offset2 = padding + "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.from_base64("AAA" + static_section, alphabet).slice(2, -2) + "'>" +
static_section + "</span>" +
"<span class='hlgreen'>" + offset2.substr(offset2.length - 3, 1) + "</span>" +
"<span class='hlred'>" + offset2.substr(offset2.length - 2) + "</span>";
offset2 = `${padding}<span data-toggle='tooltip' data-placement='top' title='${
Utils.from_base64(`AAA${static_section}`, alphabet).slice(2, -2)}'>${
static_section}</span>` +
`<span class='hlgreen'>${offset2.substr(offset2.length - 3, 1)}</span>` +
`<span class='hlred'>${offset2.substr(offset2.length - 2)}</span>`;
} else if (len2 % 4 == 3) {
static_section = offset2.slice(0, -2);
offset2 = padding + "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.from_base64("AAA" + static_section, alphabet).slice(2, -2) + "'>" +
static_section + "</span>" +
"<span class='hlgreen'>" + offset2.substr(offset2.length - 2, 1) + "</span>" +
"<span class='hlred'>" + offset2.substr(offset2.length - 1) + "</span>";
offset2 = `${padding}<span data-toggle='tooltip' data-placement='top' title='${
Utils.from_base64(`AAA${static_section}`, alphabet).slice(2, -2)}'>${
static_section}</span>` +
`<span class='hlgreen'>${offset2.substr(offset2.length - 2, 1)}</span>` +
`<span class='hlred'>${offset2.substr(offset2.length - 1)}</span>`;
} else {
static_section = offset2;
offset2 = padding + "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.from_base64("AAA" + static_section, alphabet).slice(2) + "'>" +
static_section + "</span>";
offset2 = `${padding}<span data-toggle='tooltip' data-placement='top' title='${
Utils.from_base64(`AAA${static_section}`, alphabet).slice(2)}'>${
static_section}</span>`;
}
if (!show_variable) {
offset2 = static_section;
}
return (show_variable ? "Characters highlighted in <span class='hlgreen'>green</span> could change if the input is surrounded by more data." +
return (show_variable ? `${"Characters highlighted in <span class='hlgreen'>green</span> could change if the input is surrounded by more data." +
"\nCharacters highlighted in <span class='hlred'>red</span> are for padding purposes only." +
"\nUnhighlighted characters are <span data-toggle='tooltip' data-placement='top' title='Tooltip on left'>static</span>." +
"\nHover over the static sections to see what they decode to on their own.\n" +
"\nOffset 0: " + offset0 +
"\nOffset 1: " + offset1 +
"\nOffset 2: " + offset2 +
script :
offset0 + "\n" + offset1 + "\n" + offset2);
'\nHover over the static sections to see what they decode to on their own.\n' +
'\nOffset 0: '}${offset0
}\nOffset 1: ${offset1
}\nOffset 2: ${offset2
}${script}` :
`${offset0}\n${offset1}\n${offset2}`);
},
@ -317,7 +339,7 @@ var Base64 = {
* @param {Object[]} args
* @returns {Object[]} pos
*/
highlight_to: function(pos, args) {
highlight_to(pos, args) {
pos[0].start = Math.floor(pos[0].start / 3 * 4);
pos[0].end = Math.ceil(pos[0].end / 3 * 4);
return pos;
@ -332,7 +354,7 @@ var Base64 = {
* @param {Object[]} args
* @returns {Object[]} pos
*/
highlight_from: function(pos, args) {
highlight_from(pos, args) {
pos[0].start = Math.ceil(pos[0].start / 4 * 3);
pos[0].end = Math.floor(pos[0].end / 4 * 3);
return pos;

View file

@ -9,7 +9,7 @@
*
* @namespace
*/
var BitwiseOp = {
const BitwiseOp = {
/**
* Runs bitwise operations across the input data.
@ -22,14 +22,14 @@ var BitwiseOp = {
* @param {boolean} differential
* @returns {byte_array}
*/
_bit_op: function (input, key, func, null_preserving, differential) {
_bit_op(input, key, func, null_preserving, differential) {
if (!key || !key.length) key = [0];
var result = [],
let result = [],
x = null,
k = null,
o = null;
for (var i = 0; i < input.length; i++) {
for (let i = 0; i < input.length; i++) {
k = key[i % key.length];
o = input[i];
x = null_preserving && (o === 0 || o == k) ? o : func(o, k);
@ -57,7 +57,7 @@ var BitwiseOp = {
* @constant
* @default
*/
KEY_FORMAT: ["Hex", "Base64", "UTF8", "UTF16", "UTF16LE", "UTF16BE", "Latin1"],
KEY_FORMAT: ['Hex', 'Base64', 'UTF8', 'UTF16', 'UTF16LE', 'UTF16BE', 'Latin1'],
/**
* XOR operation.
@ -66,8 +66,8 @@ var BitwiseOp = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_xor: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || ""),
run_xor(input, args) {
let key = Utils.format[args[0].option].parse(args[0].string || ''),
null_preserving = args[1],
differential = args[2];
@ -81,7 +81,7 @@ var BitwiseOp = {
* @constant
* @default
*/
XOR_BRUTE_KEY_LENGTH: ["1", "2"],
XOR_BRUTE_KEY_LENGTH: ['1', '2'],
/**
* @constant
* @default
@ -110,8 +110,8 @@ var BitwiseOp = {
* @param {Object[]} args
* @returns {string}
*/
run_xor_brute: function (input, args) {
var key_length = parseInt(args[0], 10),
run_xor_brute(input, args) {
let key_length = parseInt(args[0], 10),
sample_length = args[1],
sample_offset = args[2],
null_preserving = args[3],
@ -121,27 +121,28 @@ var BitwiseOp = {
output_hex = args[7],
regex;
var output = "",
let output = '',
result,
result_utf8;
input = input.slice(sample_offset, sample_offset + sample_length);
if (crib !== "") {
regex = new RegExp(crib, "im");
if (crib !== '') {
regex = new RegExp(crib, 'im');
}
for (var key = 1, l = Math.pow(256, key_length); key < l; key++) {
for (let key = 1, l = Math.pow(256, key_length); key < l; key++) {
result = BitwiseOp._bit_op(input, Utils.hex_to_byte_array(key.toString(16)), BitwiseOp._xor, null_preserving, differential);
result_utf8 = Utils.byte_array_to_utf8(result);
if (crib !== "" && result_utf8.search(regex) === -1) continue;
if (print_key) output += "Key = " + Utils.hex(key, (2*key_length)) + ": ";
if (output_hex)
output += Utils.byte_array_to_hex(result) + "\n";
else
output += Utils.printable(result_utf8, false) + "\n";
if (print_key) output += "\n";
if (crib !== '' && result_utf8.search(regex) === -1) continue;
if (print_key) output += `Key = ${Utils.hex(key, (2 * key_length))}: `;
if (output_hex) {
output += `${Utils.byte_array_to_hex(result)}\n`;
} else {
output += `${Utils.printable(result_utf8, false)}\n`;
}
if (print_key) output += '\n';
}
return output;
},
@ -154,7 +155,7 @@ var BitwiseOp = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_not: function (input, args) {
run_not(input, args) {
return BitwiseOp._bit_op(input, null, BitwiseOp._not);
},
@ -166,8 +167,8 @@ var BitwiseOp = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_and: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || "");
run_and(input, args) {
let key = Utils.format[args[0].option].parse(args[0].string || '');
key = Utils.word_array_to_byte_array(key);
return BitwiseOp._bit_op(input, key, BitwiseOp._and);
@ -181,8 +182,8 @@ var BitwiseOp = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_or: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || "");
run_or(input, args) {
let key = Utils.format[args[0].option].parse(args[0].string || '');
key = Utils.word_array_to_byte_array(key);
return BitwiseOp._bit_op(input, key, BitwiseOp._or);
@ -196,8 +197,8 @@ var BitwiseOp = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_add: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || "");
run_add(input, args) {
let key = Utils.format[args[0].option].parse(args[0].string || '');
key = Utils.word_array_to_byte_array(key);
return BitwiseOp._bit_op(input, key, BitwiseOp._add);
@ -211,8 +212,8 @@ var BitwiseOp = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_sub: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || "");
run_sub(input, args) {
let key = Utils.format[args[0].option].parse(args[0].string || '');
key = Utils.word_array_to_byte_array(key);
return BitwiseOp._bit_op(input, key, BitwiseOp._sub);
@ -227,7 +228,7 @@ var BitwiseOp = {
* @param {number} key
* @returns {number}
*/
_xor: function (operand, key) {
_xor(operand, key) {
return operand ^ key;
},
@ -239,7 +240,7 @@ var BitwiseOp = {
* @param {number} operand
* @returns {number}
*/
_not: function (operand, _) {
_not(operand, _) {
return ~operand & 0xff;
},
@ -252,7 +253,7 @@ var BitwiseOp = {
* @param {number} key
* @returns {number}
*/
_and: function (operand, key) {
_and(operand, key) {
return operand & key;
},
@ -265,7 +266,7 @@ var BitwiseOp = {
* @param {number} key
* @returns {number}
*/
_or: function (operand, key) {
_or(operand, key) {
return operand | key;
},
@ -278,7 +279,7 @@ var BitwiseOp = {
* @param {number} key
* @returns {number}
*/
_add: function (operand, key) {
_add(operand, key) {
return (operand + key) % 256;
},
@ -291,8 +292,8 @@ var BitwiseOp = {
* @param {number} key
* @returns {number}
*/
_sub: function (operand, key) {
var result = operand - key;
_sub(operand, key) {
const result = operand - key;
return (result < 0) ? 256 + result : result;
},

View file

@ -9,23 +9,23 @@
*
* @namespace
*/
var ByteRepr = {
const ByteRepr = {
/**
* @constant
* @default
*/
DELIM_OPTIONS: ["Space", "Comma", "Semi-colon", "Colon", "Line feed", "CRLF"],
DELIM_OPTIONS: ['Space', 'Comma', 'Semi-colon', 'Colon', 'Line feed', 'CRLF'],
/**
* @constant
* @default
*/
HEX_DELIM_OPTIONS: ["Space", "Comma", "Semi-colon", "Colon", "Line feed", "CRLF", "0x", "\\x", "None"],
HEX_DELIM_OPTIONS: ['Space', 'Comma', 'Semi-colon', 'Colon', 'Line feed', 'CRLF', '0x', '\\x', 'None'],
/**
* @constant
* @default
*/
BIN_DELIM_OPTIONS: ["Space", "Comma", "Semi-colon", "Colon", "Line feed", "CRLF", "None"],
BIN_DELIM_OPTIONS: ['Space', 'Comma', 'Semi-colon', 'Colon', 'Line feed', 'CRLF', 'None'],
/**
* To Hex operation.
@ -34,8 +34,8 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {string}
*/
run_to_hex: function(input, args) {
var delim = Utils.char_rep[args[0] || "Space"];
run_to_hex(input, args) {
const delim = Utils.char_rep[args[0] || 'Space'];
return Utils.to_hex(input, delim, 2);
},
@ -47,8 +47,8 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_from_hex: function(input, args) {
var delim = args[0] || "Space";
run_from_hex(input, args) {
const delim = args[0] || 'Space';
return Utils.from_hex(input, delim, 2);
},
@ -66,18 +66,18 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {string}
*/
run_to_charcode: function(input, args) {
var delim = Utils.char_rep[args[0] || "Space"],
run_to_charcode(input, args) {
let delim = Utils.char_rep[args[0] || 'Space'],
base = args[1],
output = "",
output = '',
padding = 2,
ordinal;
if (base < 2 || base > 36) {
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]);
if (base == 16) {
@ -107,14 +107,14 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_from_charcode: function(input, args) {
var delim = Utils.char_rep[args[0] || "Space"],
run_from_charcode(input, args) {
let delim = Utils.char_rep[args[0] || 'Space'],
base = args[1],
bites = input.split(delim),
i = 0;
if (base < 2 || base > 36) {
throw "Error: Base argument must be between 2 and 36";
throw 'Error: Base argument must be between 2 and 36';
}
if (base != 16) {
@ -130,7 +130,7 @@ var ByteRepr = {
}
}
var latin1 = "";
let latin1 = '';
for (i = 0; i < bites.length; i++) {
latin1 += Utils.chr(parseInt(bites[i], base));
}
@ -147,15 +147,15 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {Object[]} pos
*/
highlight_to: function(pos, args) {
var delim = Utils.char_rep[args[0] || "Space"],
len = delim == "\r\n" ? 1 : delim.length;
highlight_to(pos, args) {
let delim = Utils.char_rep[args[0] || 'Space'],
len = delim == '\r\n' ? 1 : delim.length;
pos[0].start = pos[0].start * (2 + len);
pos[0].end = pos[0].end * (2 + len) - len;
// 0x and \x are added to the beginning if they are selected, so increment the positions accordingly
if (delim == "0x" || delim == "\\x") {
if (delim == '0x' || delim == '\\x') {
pos[0].start += 2;
pos[0].end += 2;
}
@ -172,13 +172,13 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {Object[]} pos
*/
highlight_from: function(pos, args) {
var delim = Utils.char_rep[args[0] || "Space"],
len = delim == "\r\n" ? 1 : delim.length,
highlight_from(pos, args) {
let delim = Utils.char_rep[args[0] || 'Space'],
len = delim == '\r\n' ? 1 : delim.length,
width = len + 2;
// 0x and \x are added to the beginning if they are selected, so increment the positions accordingly
if (delim == "0x" || delim == "\\x") {
if (delim == '0x' || delim == '\\x') {
if (pos[0].start > 1) pos[0].start -= 2;
else pos[0].start = 0;
if (pos[0].end > 1) pos[0].end -= 2;
@ -198,8 +198,8 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {string}
*/
run_to_decimal: function(input, args) {
var delim = Utils.char_rep[args[0]];
run_to_decimal(input, args) {
const delim = Utils.char_rep[args[0]];
return input.join(delim);
},
@ -211,13 +211,13 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_from_decimal: function(input, args) {
var delim = Utils.char_rep[args[0]];
var byte_str = input.split(delim), output = [];
if (byte_str[byte_str.length-1] === "")
byte_str = byte_str.slice(0, byte_str.length-1);
run_from_decimal(input, args) {
const delim = Utils.char_rep[args[0]];
let byte_str = input.split(delim),
output = [];
if (byte_str[byte_str.length - 1] === '') { byte_str = byte_str.slice(0, byte_str.length - 1); }
for (var i = 0; i < byte_str.length; i++) {
for (let i = 0; i < byte_str.length; i++) {
output[i] = parseInt(byte_str[i]);
}
return output;
@ -231,12 +231,12 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {string}
*/
run_to_binary: function(input, args) {
var delim = Utils.char_rep[args[0] || "Space"],
output = "",
run_to_binary(input, args) {
let delim = Utils.char_rep[args[0] || 'Space'],
output = '',
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;
}
@ -255,15 +255,15 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_from_binary: function(input, args) {
if (args[0] != "None") {
var delim_regex = Utils.regex_rep[args[0] || "Space"];
run_from_binary(input, args) {
if (args[0] != 'None') {
const delim_regex = Utils.regex_rep[args[0] || 'Space'];
input = input.replace(delim_regex, '');
}
var output = [];
var byte_len = 8;
for (var i = 0; i < input.length; i += byte_len) {
const output = [];
const byte_len = 8;
for (let i = 0; i < input.length; i += byte_len) {
output.push(parseInt(input.substr(i, byte_len), 2));
}
return output;
@ -279,8 +279,8 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {Object[]} pos
*/
highlight_to_binary: function(pos, args) {
var delim = Utils.char_rep[args[0] || "Space"];
highlight_to_binary(pos, args) {
const delim = Utils.char_rep[args[0] || 'Space'];
pos[0].start = pos[0].start * (8 + delim.length);
pos[0].end = pos[0].end * (8 + delim.length) - delim.length;
return pos;
@ -296,8 +296,8 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {Object[]} pos
*/
highlight_from_binary: function(pos, args) {
var delim = Utils.char_rep[args[0] || "Space"];
highlight_from_binary(pos, args) {
const delim = Utils.char_rep[args[0] || 'Space'];
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));
return pos;
@ -308,7 +308,7 @@ var ByteRepr = {
* @constant
* @default
*/
HEX_CONTENT_CONVERT_WHICH: ["Only special chars", "Only special chars including spaces", "All chars"],
HEX_CONTENT_CONVERT_WHICH: ['Only special chars', 'Only special chars including spaces', 'All chars'],
/**
* @constant
* @default
@ -322,36 +322,36 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {string}
*/
run_to_hex_content: function(input, args) {
var convert = args[0];
var spaces = args[1];
if (convert == "All chars") {
var result = "|" + Utils.to_hex(input) + "|";
if (!spaces) result = result.replace(/ /g, "");
run_to_hex_content(input, args) {
const convert = args[0];
const spaces = args[1];
if (convert == 'All chars') {
let result = `|${Utils.to_hex(input)}|`;
if (!spaces) result = result.replace(/ /g, '');
return result;
}
var output = "",
let output = '',
in_hex = false,
convert_spaces = convert == "Only special chars including spaces",
convert_spaces = convert == 'Only special chars including spaces',
b;
for (var i = 0; i < input.length; i++) {
for (let i = 0; i < input.length; i++) {
b = input[i];
if ((b == 32 && convert_spaces) || (b < 48 && b != 32) || (b > 57 && b < 65) || (b > 90 && b < 97) || b > 122) {
if (!in_hex) {
output += "|";
output += '|';
in_hex = true;
} else if (spaces) output += " ";
} else if (spaces) output += ' ';
output += Utils.to_hex([b]);
} else {
if (in_hex) {
output += "|";
output += '|';
in_hex = false;
}
output += Utils.chr(input[i]);
}
}
if (in_hex) output += "|";
if (in_hex) output += '|';
return output;
},
@ -363,30 +363,34 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_from_hex_content: function(input, args) {
var regex = /\|([a-f\d ]{2,})\|/gi;
var output = [], m, i = 0;
while (!!(m = regex.exec(input))) {
run_from_hex_content(input, args) {
const regex = /\|([a-f\d ]{2,})\|/gi;
let output = [],
m,
i = 0;
while (m = regex.exec(input)) {
// Add up to match
for (; i < m.index;)
for (; i < m.index;) {
output.push(Utils.ord(input[i++]));
}
// Add match
var bytes = Utils.from_hex(m[1]);
const bytes = Utils.from_hex(m[1]);
if (bytes) {
for (var a = 0; a < bytes.length;)
output.push(bytes[a++]);
for (let a = 0; a < bytes.length;) { output.push(bytes[a++]); }
} else {
// Not valid hex, print as normal
for (; i < regex.lastIndex;)
for (; i < regex.lastIndex;) {
output.push(Utils.ord(input[i++]));
}
}
i = regex.lastIndex;
}
// Add all after final match
for (; i < input.length;)
for (; i < input.length;) {
output.push(Utils.ord(input[i++]));
}
return output;
},

View file

@ -9,13 +9,13 @@
*
* @namespace
*/
var CharEnc = {
const CharEnc = {
/**
* @constant
* @default
*/
IO_FORMAT: ["UTF8", "UTF16", "UTF16LE", "UTF16BE", "Latin1", "Windows-1251", "Hex", "Base64"],
IO_FORMAT: ['UTF8', 'UTF16', 'UTF16LE', 'UTF16BE', 'Latin1', 'Windows-1251', 'Hex', 'Base64'],
/**
* Text encoding operation.
@ -24,18 +24,18 @@ var CharEnc = {
* @param {Object[]} args
* @returns {string}
*/
run: function(input, args) {
var input_format = args[0],
run(input, args) {
let input_format = args[0],
output_format = args[1];
if (input_format == "Windows-1251") {
if (input_format == 'Windows-1251') {
input = Utils.win1251_to_unicode(input);
input = CryptoJS.enc.Utf8.parse(input);
} else {
input = Utils.format[input_format].parse(input);
}
if (output_format == "Windows-1251") {
if (output_format == 'Windows-1251') {
input = CryptoJS.enc.Utf8.stringify(input);
return Utils.unicode_to_win1251(input);
} else {

View file

@ -7,7 +7,7 @@
*
* @namespace
*/
var Checksum = {
const Checksum = {
/**
* Fletcher-16 Checksum operation.
@ -16,11 +16,11 @@ var Checksum = {
* @param {Object[]} args
* @returns {string}
*/
run_fletcher16: function(input, args) {
var a = 0,
run_fletcher16(input, args) {
let a = 0,
b = 0;
for (var i = 0; i < input.length; i++) {
for (let i = 0; i < input.length; i++) {
a = (a + input[i]) % 0xff;
b = (b + a) % 0xff;
}
@ -36,12 +36,12 @@ var Checksum = {
* @param {Object[]} args
* @returns {string}
*/
run_adler32: function(input, args) {
var MOD_ADLER = 65521,
run_adler32(input, args) {
let MOD_ADLER = 65521,
a = 1,
b = 0;
for (var i = 0; i < input.length; i++) {
for (let i = 0; i < input.length; i++) {
a += input[i];
b += a;
}
@ -60,11 +60,11 @@ var Checksum = {
* @param {Object[]} args
* @returns {string}
*/
run_crc32: function(input, args) {
var crc_table = window.crc_table || (window.crc_table = Checksum._gen_crc_table()),
run_crc32(input, args) {
let crc_table = window.crc_table || (window.crc_table = Checksum._gen_crc_table()),
crc = 0 ^ (-1);
for (var i = 0; i < input.length; i++) {
for (let i = 0; i < input.length; i++) {
crc = (crc >>> 8) ^ crc_table[(crc ^ input[i]) & 0xff];
}
@ -89,10 +89,10 @@ var Checksum = {
* Checksum.run_tcp_ip([0x45,0x00,0x01,0x11,0x3f,0x74,0x40,0x00,0x40,0x06,
* 0x00,0x00,0xac,0x11,0x00,0x03,0xac,0x11,0x00,0x04])
*/
run_tcp_ip: function(input, args) {
var csum = 0;
run_tcp_ip(input, args) {
let csum = 0;
for (var i = 0; i < input.length; i++) {
for (let i = 0; i < input.length; i++) {
if (i % 2 === 0) {
csum += (input[i] << 8);
} else {
@ -112,13 +112,13 @@ var Checksum = {
* @private
* @returns {array}
*/
_gen_crc_table: function() {
var c,
_gen_crc_table() {
let c,
crc_table = [];
for (var n = 0; n < 256; n++) {
for (let n = 0; n < 256; 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));
}
crc_table[n] = c;

View file

@ -9,43 +9,43 @@
*
* @namespace
*/
var Cipher = {
const Cipher = {
/**
* @constant
* @default
*/
IO_FORMAT1: ["Hex", "Base64", "UTF8", "UTF16", "UTF16LE", "UTF16BE", "Latin1"],
IO_FORMAT1: ['Hex', 'Base64', 'UTF8', 'UTF16', 'UTF16LE', 'UTF16BE', 'Latin1'],
/**
* @constant
* @default
*/
IO_FORMAT2: ["UTF8", "UTF16", "UTF16LE", "UTF16BE", "Latin1", "Hex", "Base64"],
IO_FORMAT2: ['UTF8', 'UTF16', 'UTF16LE', 'UTF16BE', 'Latin1', 'Hex', 'Base64'],
/**
* @constant
* @default
*/
IO_FORMAT3: ["Hex", "Base64", "UTF16", "UTF16LE", "UTF16BE", "Latin1"],
IO_FORMAT3: ['Hex', 'Base64', 'UTF16', 'UTF16LE', 'UTF16BE', 'Latin1'],
/**
* @constant
* @default
*/
IO_FORMAT4: ["Latin1", "UTF8", "UTF16", "UTF16LE", "UTF16BE", "Hex", "Base64"],
IO_FORMAT4: ['Latin1', 'UTF8', 'UTF16', 'UTF16LE', 'UTF16BE', 'Hex', 'Base64'],
/**
* @constant
* @default
*/
MODES: ["CBC", "CFB", "CTR", "OFB", "ECB"],
MODES: ['CBC', 'CFB', 'CTR', 'OFB', 'ECB'],
/**
* @constant
* @default
*/
PADDING: ["Pkcs7", "Iso97971", "AnsiX923", "Iso10126", "ZeroPadding", "NoPadding"],
PADDING: ['Pkcs7', 'Iso97971', 'AnsiX923', 'Iso10126', 'ZeroPadding', 'NoPadding'],
/**
* @constant
* @default
*/
RESULT_TYPE: ["Show all", "Ciphertext", "Key", "IV", "Salt"],
RESULT_TYPE: ['Show all', 'Ciphertext', 'Key', 'IV', 'Salt'],
/**
@ -57,10 +57,10 @@ var Cipher = {
* @param {function} args
* @returns {string}
*/
_enc: function (algo, input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || ""),
iv = Utils.format[args[1].option].parse(args[1].string || ""),
salt = Utils.format[args[2].option].parse(args[2].string || ""),
_enc(algo, input, args) {
let key = Utils.format[args[0].option].parse(args[0].string || ''),
iv = Utils.format[args[1].option].parse(args[1].string || ''),
salt = Utils.format[args[2].option].parse(args[2].string || ''),
mode = CryptoJS.mode[args[3]],
padding = CryptoJS.pad[args[4]],
result_option = args[5].toLowerCase(),
@ -71,19 +71,19 @@ var Cipher = {
key = key.toString(CryptoJS.enc.Latin1);
}
var encrypted = algo.encrypt(input, key, {
const encrypted = algo.encrypt(input, key, {
salt: salt.sigBytes > 0 ? salt : false,
iv: iv.sigBytes > 0 ? iv : null,
mode: mode,
padding: padding
mode,
padding,
});
var result = "";
if (result_option == "show all") {
result += "Key: " + encrypted.key.toString(Utils.format[output_format]);
result += "\nIV: " + encrypted.iv.toString(Utils.format[output_format]);
if (encrypted.salt) result += "\nSalt: " + encrypted.salt.toString(Utils.format[output_format]);
result += "\n\nCiphertext: " + encrypted.ciphertext.toString(Utils.format[output_format]);
let result = '';
if (result_option == 'show all') {
result += `Key: ${encrypted.key.toString(Utils.format[output_format])}`;
result += `\nIV: ${encrypted.iv.toString(Utils.format[output_format])}`;
if (encrypted.salt) result += `\nSalt: ${encrypted.salt.toString(Utils.format[output_format])}`;
result += `\n\nCiphertext: ${encrypted.ciphertext.toString(Utils.format[output_format])}`;
} else {
result = encrypted[result_option].toString(Utils.format[output_format]);
}
@ -101,10 +101,10 @@ var Cipher = {
* @param {function} args
* @returns {string}
*/
_dec: function (algo, input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || ""),
iv = Utils.format[args[1].option].parse(args[1].string || ""),
salt = Utils.format[args[2].option].parse(args[2].string || ""),
_dec(algo, input, args) {
let key = Utils.format[args[0].option].parse(args[0].string || ''),
iv = Utils.format[args[1].option].parse(args[1].string || ''),
salt = Utils.format[args[2].option].parse(args[2].string || ''),
mode = CryptoJS.mode[args[3]],
padding = CryptoJS.pad[args[4]],
input_format = args[5],
@ -112,30 +112,30 @@ var Cipher = {
// The ZeroPadding option causes a crash when the input length is 0
if (!input.length) {
return "No input";
return 'No input';
}
var ciphertext = Utils.format[input_format].parse(input);
const ciphertext = Utils.format[input_format].parse(input);
if (iv.sigBytes === 0) {
// Use passphrase rather than key. Need to convert it to a string.
key = key.toString(CryptoJS.enc.Latin1);
}
var decrypted = algo.decrypt({
ciphertext: ciphertext,
salt: salt.sigBytes > 0 ? salt : false
const decrypted = algo.decrypt({
ciphertext,
salt: salt.sigBytes > 0 ? salt : false,
}, key, {
iv: iv.sigBytes > 0 ? iv : null,
mode: mode,
padding: padding
mode,
padding,
});
var result;
let result;
try {
result = decrypted.toString(Utils.format[output_format]);
} catch (err) {
result = "Decrypt error: " + err.message;
result = `Decrypt error: ${err.message}`;
}
return result;
@ -149,7 +149,7 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_aes_enc: function (input, args) {
run_aes_enc(input, args) {
return Cipher._enc(CryptoJS.AES, input, args);
},
@ -161,7 +161,7 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_aes_dec: function (input, args) {
run_aes_dec(input, args) {
return Cipher._dec(CryptoJS.AES, input, args);
},
@ -173,7 +173,7 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_des_enc: function (input, args) {
run_des_enc(input, args) {
return Cipher._enc(CryptoJS.DES, input, args);
},
@ -185,7 +185,7 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_des_dec: function (input, args) {
run_des_dec(input, args) {
return Cipher._dec(CryptoJS.DES, input, args);
},
@ -197,7 +197,7 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_triple_des_enc: function (input, args) {
run_triple_des_enc(input, args) {
return Cipher._enc(CryptoJS.TripleDES, input, args);
},
@ -209,7 +209,7 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_triple_des_dec: function (input, args) {
run_triple_des_dec(input, args) {
return Cipher._dec(CryptoJS.TripleDES, input, args);
},
@ -221,7 +221,7 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_rabbit_enc: function (input, args) {
run_rabbit_enc(input, args) {
return Cipher._enc(CryptoJS.Rabbit, input, args);
},
@ -233,7 +233,7 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_rabbit_dec: function (input, args) {
run_rabbit_dec(input, args) {
return Cipher._dec(CryptoJS.Rabbit, input, args);
},
@ -242,12 +242,12 @@ var Cipher = {
* @constant
* @default
*/
BLOWFISH_MODES: ["ECB", "CBC", "PCBC", "CFB", "OFB", "CTR"],
BLOWFISH_MODES: ['ECB', 'CBC', 'PCBC', 'CFB', 'OFB', 'CTR'],
/**
* @constant
* @default
*/
BLOWFISH_OUTPUT_TYPES: ["Base64", "Hex", "String", "Raw"],
BLOWFISH_OUTPUT_TYPES: ['Base64', 'Hex', 'String', 'Raw'],
/**
* Blowfish Encrypt operation.
@ -256,16 +256,16 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_blowfish_enc: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string).toString(Utils.format.Latin1),
run_blowfish_enc(input, args) {
let key = Utils.format[args[0].option].parse(args[0].string).toString(Utils.format.Latin1),
mode = args[1],
output_format = args[2];
if (key.length === 0) return "Enter a key";
if (key.length === 0) return 'Enter a key';
var enc_hex = blowfish.encrypt(input, key, {
let enc_hex = blowfish.encrypt(input, key, {
outputType: 1,
cipherMode: Cipher.BLOWFISH_MODES.indexOf(mode)
cipherMode: Cipher.BLOWFISH_MODES.indexOf(mode),
}),
enc = CryptoJS.enc.Hex.parse(enc_hex);
@ -280,18 +280,18 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_blowfish_dec: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string).toString(Utils.format.Latin1),
run_blowfish_dec(input, args) {
let key = Utils.format[args[0].option].parse(args[0].string).toString(Utils.format.Latin1),
mode = args[1],
input_format = args[2];
if (key.length === 0) return "Enter a key";
if (key.length === 0) return 'Enter a key';
input = Utils.format[input_format].parse(input);
return blowfish.decrypt(input.toString(CryptoJS.enc.Base64), key, {
outputType: 0, // This actually means inputType. The library is weird.
cipherMode: Cipher.BLOWFISH_MODES.indexOf(mode)
cipherMode: Cipher.BLOWFISH_MODES.indexOf(mode),
});
},
@ -314,14 +314,14 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_pbkdf2: function (input, args) {
var key_size = args[0] / 32,
run_pbkdf2(input, args) {
let key_size = args[0] / 32,
iterations = args[1],
salt = CryptoJS.enc.Hex.parse(args[2] || ""),
salt = CryptoJS.enc.Hex.parse(args[2] || ''),
input_format = args[3],
output_format = args[4],
passphrase = Utils.format[input_format].parse(input),
key = CryptoJS.PBKDF2(passphrase, salt, { keySize: key_size, iterations: iterations });
key = CryptoJS.PBKDF2(passphrase, salt, { keySize: key_size, iterations });
return key.toString(Utils.format[output_format]);
},
@ -334,14 +334,14 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_evpkdf: function (input, args) {
var key_size = args[0] / 32,
run_evpkdf(input, args) {
let key_size = args[0] / 32,
iterations = args[1],
salt = CryptoJS.enc.Hex.parse(args[2] || ""),
salt = CryptoJS.enc.Hex.parse(args[2] || ''),
input_format = args[3],
output_format = args[4],
passphrase = Utils.format[input_format].parse(input),
key = CryptoJS.EvpKDF(passphrase, salt, { keySize: key_size, iterations: iterations });
key = CryptoJS.EvpKDF(passphrase, salt, { keySize: key_size, iterations });
return key.toString(Utils.format[output_format]);
},
@ -354,8 +354,8 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_rc4: function (input, args) {
var message = Utils.format[args[1]].parse(input),
run_rc4(input, args) {
let message = Utils.format[args[1]].parse(input),
passphrase = Utils.format[args[0].option].parse(args[0].string),
encrypted = CryptoJS.RC4.encrypt(message, passphrase);
@ -376,11 +376,11 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_rc4drop: function (input, args) {
var message = Utils.format[args[1]].parse(input),
run_rc4drop(input, args) {
let message = Utils.format[args[1]].parse(input),
passphrase = Utils.format[args[0].option].parse(args[0].string),
drop = args[3],
encrypted = CryptoJS.RC4Drop.encrypt(message, passphrase, { drop: drop });
encrypted = CryptoJS.RC4Drop.encrypt(message, passphrase, { drop });
return encrypted.ciphertext.toString(Utils.format[args[2]]);
},
@ -418,12 +418,12 @@ CryptoJS.kdf.OpenSSL.execute = function (password, keySize, ivSize, salt) {
}
// 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
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;
// Return params
return CryptoJS.lib.CipherParams.create({ key: key, iv: iv, salt: salt });
return CryptoJS.lib.CipherParams.create({ key, iv, salt });
};

View file

@ -9,13 +9,13 @@
*
* @namespace
*/
var Code = {
const Code = {
/**
* @constant
* @default
*/
LANGUAGES: ["default-code", "default-markup", "bash", "bsh", "c", "cc", "coffee", "cpp", "cs", "csh", "cv", "cxx", "cyc", "htm", "html", "in.tag", "java", "javascript", "js", "json", "m", "mxml", "perl", "pl", "pm", "py", "python", "rb", "rc", "rs", "ruby", "rust", "sh", "uq.val", "xhtml", "xml", "xsl"],
LANGUAGES: ['default-code', 'default-markup', 'bash', 'bsh', 'c', 'cc', 'coffee', 'cpp', 'cs', 'csh', 'cv', 'cxx', 'cyc', 'htm', 'html', 'in.tag', 'java', 'javascript', 'js', 'json', 'm', 'mxml', 'perl', 'pl', 'pm', 'py', 'python', 'rb', 'rc', 'rs', 'ruby', 'rust', 'sh', 'uq.val', 'xhtml', 'xml', 'xsl'],
/**
* @constant
* @default
@ -29,10 +29,10 @@ var Code = {
* @param {Object[]} args
* @returns {html}
*/
run_syntax_highlight: function(input, args) {
var language = args[0],
run_syntax_highlight(input, args) {
let language = args[0],
line_nums = args[1];
return "<code class='prettyprint'>" + prettyPrintOne(Utils.escape_html(input), language, line_nums) + "</code>";
return `<code class='prettyprint'>${prettyPrintOne(Utils.escape_html(input), language, line_nums)}</code>`;
},
@ -40,7 +40,7 @@ var Code = {
* @constant
* @default
*/
BEAUTIFY_INDENT: "\\t",
BEAUTIFY_INDENT: '\\t',
/**
* XML Beautify operation.
@ -49,8 +49,8 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_xml_beautify: function(input, args) {
var indent_str = args[0];
run_xml_beautify(input, args) {
const indent_str = args[0];
return vkbeautify.xml(input, indent_str);
},
@ -62,8 +62,8 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_json_beautify: function(input, args) {
var indent_str = args[0];
run_json_beautify(input, args) {
const indent_str = args[0];
return vkbeautify.json(input, indent_str);
},
@ -75,8 +75,8 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_css_beautify: function(input, args) {
var indent_str = args[0];
run_css_beautify(input, args) {
const indent_str = args[0];
return vkbeautify.css(input, indent_str);
},
@ -88,8 +88,8 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_sql_beautify: function(input, args) {
var indent_str = args[0];
run_sql_beautify(input, args) {
const indent_str = args[0];
return vkbeautify.sql(input, indent_str);
},
@ -107,8 +107,8 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_xml_minify: function(input, args) {
var preserve_comments = args[0];
run_xml_minify(input, args) {
const preserve_comments = args[0];
return vkbeautify.xmlmin(input, preserve_comments);
},
@ -120,7 +120,7 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_json_minify: function(input, args) {
run_json_minify(input, args) {
return vkbeautify.jsonmin(input);
},
@ -132,8 +132,8 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_css_minify: function(input, args) {
var preserve_comments = args[0];
run_css_minify(input, args) {
const preserve_comments = args[0];
return vkbeautify.cssmin(input, preserve_comments);
},
@ -145,7 +145,7 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_sql_minify: function(input, args) {
run_sql_minify(input, args) {
return vkbeautify.sqlmin(input);
},
@ -173,84 +173,84 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_generic_beautify: function(input, args) {
var code = input,
run_generic_beautify(input, args) {
let code = input,
t = 0,
preserved_tokens = [],
m;
// Remove strings
var sstrings = /'([^'\\]|\\.)*'/g;
while (!!(m = sstrings.exec(code))) {
const sstrings = /'([^'\\]|\\.)*'/g;
while (m = sstrings.exec(code)) {
code = preserve_token(code, m, t++);
sstrings.lastIndex = m.index;
}
var dstrings = /"([^"\\]|\\.)*"/g;
while (!!(m = dstrings.exec(code))) {
const dstrings = /"([^"\\]|\\.)*"/g;
while (m = dstrings.exec(code)) {
code = preserve_token(code, m, t++);
dstrings.lastIndex = m.index;
}
// Remove comments
var scomments = /\/\/[^\n\r]*/g;
while (!!(m = scomments.exec(code))) {
const scomments = /\/\/[^\n\r]*/g;
while (m = scomments.exec(code)) {
code = preserve_token(code, m, t++);
scomments.lastIndex = m.index;
}
var mcomments = /\/\*[\s\S]*?\*\//gm;
while (!!(m = mcomments.exec(code))) {
const mcomments = /\/\*[\s\S]*?\*\//gm;
while (m = mcomments.exec(code)) {
code = preserve_token(code, m, t++);
mcomments.lastIndex = m.index;
}
var hcomments = /(^|\n)#[^\n\r#]+/g;
while (!!(m = hcomments.exec(code))) {
const hcomments = /(^|\n)#[^\n\r#]+/g;
while (m = hcomments.exec(code)) {
code = preserve_token(code, m, t++);
hcomments.lastIndex = m.index;
}
// Remove regexes
var regexes = /\/.*?[^\\]\/[gim]{0,3}/gi;
while (!!(m = regexes.exec(code))) {
const regexes = /\/.*?[^\\]\/[gim]{0,3}/gi;
while (m = regexes.exec(code)) {
code = preserve_token(code, m, t++);
regexes.lastIndex = m.index;
}
// Create newlines after ;
code = code.replace(/;/g, ";\n");
code = code.replace(/;/g, ';\n');
// Create newlines after { and around }
code = code.replace(/{/g, "{\n");
code = code.replace(/}/g, "\n}\n");
code = code.replace(/{/g, '{\n');
code = code.replace(/}/g, '\n}\n');
// Remove carriage returns
code = code.replace(/\r/g, "");
code = code.replace(/\r/g, '');
// Remove all indentation
code = code.replace(/^\s+/g, "");
code = code.replace(/\n\s+/g, "\n");
code = code.replace(/^\s+/g, '');
code = code.replace(/\n\s+/g, '\n');
// Remove trailing spaces
code = code.replace(/\s*$/g, "");
code = code.replace(/\s*$/g, '');
// Remove newlines before {
code = code.replace(/\n{/g, "{");
code = code.replace(/\n{/g, '{');
// Indent
var i = 0,
let i = 0,
level = 0;
while (i < code.length) {
switch (code[i]) {
case "{":
case '{':
level++;
break;
case "\n":
case '\n':
if (i + 1 >= code.length) break;
if (code[i+1] == "}") level--;
var indent = (level >= 0) ? Array(level*4+1).join(" ") : "";
if (code[i + 1] == '}') level--;
var indent = (level >= 0) ? Array(level * 4 + 1).join(' ') : '';
code = code.substring(0, i + 1) + indent + code.substring(i + 1);
if (level > 0) i += level * 4;
@ -260,34 +260,34 @@ var Code = {
}
// Add strategic spaces
code = code.replace(/\s*([!<>=+-/*]?)=\s*/g, " $1= ");
code = code.replace(/\s*<([=]?)\s*/g, " <$1 ");
code = code.replace(/\s*>([=]?)\s*/g, " >$1 ");
code = code.replace(/([^+])\+([^+=])/g, "$1 + $2");
code = code.replace(/([^-])-([^-=])/g, "$1 - $2");
code = code.replace(/([^*])\*([^*=])/g, "$1 * $2");
code = code.replace(/([^/])\/([^/=])/g, "$1 / $2");
code = code.replace(/\s*,\s*/g, ", ");
code = code.replace(/\s*{/g, " {");
code = code.replace(/}\n/g, "}\n\n");
code = code.replace(/\s*([!<>=+-/*]?)=\s*/g, ' $1= ');
code = code.replace(/\s*<([=]?)\s*/g, ' <$1 ');
code = code.replace(/\s*>([=]?)\s*/g, ' >$1 ');
code = code.replace(/([^+])\+([^+=])/g, '$1 + $2');
code = code.replace(/([^-])-([^-=])/g, '$1 - $2');
code = code.replace(/([^*])\*([^*=])/g, '$1 * $2');
code = code.replace(/([^/])\/([^/=])/g, '$1 / $2');
code = code.replace(/\s*,\s*/g, ', ');
code = code.replace(/\s*{/g, ' {');
code = code.replace(/}\n/g, '}\n\n');
// Just... don't look at this
code = code.replace(/(if|for|while|with|elif|elseif)\s*\(([^\n]*)\)\s*\n([^{])/gim, "$1 ($2)\n $3");
code = code.replace(/(if|for|while|with|elif|elseif)\s*\(([^\n]*)\)([^{])/gim, "$1 ($2) $3");
code = code.replace(/else\s*\n([^{])/gim, "else\n $1");
code = code.replace(/else\s+([^{])/gim, "else $1");
code = code.replace(/(if|for|while|with|elif|elseif)\s*\(([^\n]*)\)\s*\n([^{])/gim, '$1 ($2)\n $3');
code = code.replace(/(if|for|while|with|elif|elseif)\s*\(([^\n]*)\)([^{])/gim, '$1 ($2) $3');
code = code.replace(/else\s*\n([^{])/gim, 'else\n $1');
code = code.replace(/else\s+([^{])/gim, 'else $1');
// Remove strategic spaces
code = code.replace(/\s+;/g, ";");
code = code.replace(/\{\s+\}/g, "{}");
code = code.replace(/\[\s+\]/g, "[]");
code = code.replace(/}\s*(else|catch|except|finally|elif|elseif|else if)/gi, "} $1");
code = code.replace(/\s+;/g, ';');
code = code.replace(/\{\s+\}/g, '{}');
code = code.replace(/\[\s+\]/g, '[]');
code = code.replace(/}\s*(else|catch|except|finally|elif|elseif|else if)/gi, '} $1');
// Replace preserved tokens
var ptokens = /###preserved_token(\d+)###/g;
while (!!(m = ptokens.exec(code))) {
var ti = parseInt(m[1]);
const ptokens = /###preserved_token(\d+)###/g;
while (m = ptokens.exec(code)) {
const ti = parseInt(m[1]);
code = code.substring(0, m.index) + preserved_tokens[ti] + code.substring(m.index + m[0].length);
ptokens.lastIndex = m.index;
}
@ -296,9 +296,9 @@ var Code = {
function preserve_token(str, match, t) {
preserved_tokens[t] = match[0];
return str.substring(0, match.index) +
"###preserved_token" + t + "###" +
str.substring(match.index + match[0].length);
return `${str.substring(0, match.index)
}###preserved_token${t}###${
str.substring(match.index + match[0].length)}`;
}
},

View file

@ -9,36 +9,36 @@
*
* @namespace
*/
var Compress = {
const Compress = {
/**
* @constant
* @default
*/
COMPRESSION_TYPE: ["Dynamic Huffman Coding", "Fixed Huffman Coding", "None (Store)"],
COMPRESSION_TYPE: ['Dynamic Huffman Coding', 'Fixed Huffman Coding', 'None (Store)'],
/**
* @constant
* @default
*/
INFLATE_BUFFER_TYPE: ["Adaptive", "Block"],
INFLATE_BUFFER_TYPE: ['Adaptive', 'Block'],
/**
* @constant
* @default
*/
COMPRESSION_METHOD: ["Deflate", "None (Store)"],
COMPRESSION_METHOD: ['Deflate', 'None (Store)'],
/**
* @constant
* @default
*/
OS: ["MSDOS", "Unix", "Macintosh"],
OS: ['MSDOS', 'Unix', 'Macintosh'],
/**
* @constant
* @default
*/
RAW_COMPRESSION_TYPE_LOOKUP: {
"Fixed Huffman Coding" : Zlib.RawDeflate.CompressionType.FIXED,
"Dynamic Huffman Coding" : Zlib.RawDeflate.CompressionType.DYNAMIC,
"None (Store)" : Zlib.RawDeflate.CompressionType.NONE,
'Fixed Huffman Coding': Zlib.RawDeflate.CompressionType.FIXED,
'Dynamic Huffman Coding': Zlib.RawDeflate.CompressionType.DYNAMIC,
'None (Store)': Zlib.RawDeflate.CompressionType.NONE,
},
/**
@ -48,9 +48,9 @@ var Compress = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_raw_deflate: function(input, args) {
var deflate = new Zlib.RawDeflate(input, {
compressionType: Compress.RAW_COMPRESSION_TYPE_LOOKUP[args[0]]
run_raw_deflate(input, args) {
const deflate = new Zlib.RawDeflate(input, {
compressionType: Compress.RAW_COMPRESSION_TYPE_LOOKUP[args[0]],
});
return Array.prototype.slice.call(deflate.compress());
},
@ -81,8 +81,8 @@ var Compress = {
* @default
*/
RAW_BUFFER_TYPE_LOOKUP: {
"Adaptive" : Zlib.RawInflate.BufferType.ADAPTIVE,
"Block" : Zlib.RawInflate.BufferType.BLOCK,
Adaptive: Zlib.RawInflate.BufferType.ADAPTIVE,
Block: Zlib.RawInflate.BufferType.BLOCK,
},
/**
@ -92,15 +92,15 @@ var Compress = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_raw_inflate: function(input, args) {
run_raw_inflate(input, args) {
// Deal with character encoding issues
input = Utils.str_to_byte_array(Utils.byte_array_to_utf8(input));
var inflate = new Zlib.RawInflate(input, {
let inflate = new Zlib.RawInflate(input, {
index: args[0],
bufferSize: args[1],
bufferType: Compress.RAW_BUFFER_TYPE_LOOKUP[args[2]],
resize: args[3],
verify: args[4]
verify: args[4],
}),
result = Array.prototype.slice.call(inflate.decompress());
@ -111,15 +111,15 @@ var Compress = {
if (result.length > 158 && result[0] == 93 && result[5] == 93) {
// If the first two square brackets are there, check that the others
// are also there. If they are, throw an error. If not, continue.
var valid = false;
for (var i = 0; i < 155; i += 5) {
let valid = false;
for (let i = 0; i < 155; i += 5) {
if (result[i] != 93) {
valid = true;
}
}
if (!valid) {
throw "Error: Unable to inflate data";
throw 'Error: Unable to inflate data';
}
}
// Trust me, this is the easiest way...
@ -132,9 +132,9 @@ var Compress = {
* @default
*/
ZLIB_COMPRESSION_TYPE_LOOKUP: {
"Fixed Huffman Coding" : Zlib.Deflate.CompressionType.FIXED,
"Dynamic Huffman Coding" : Zlib.Deflate.CompressionType.DYNAMIC,
"None (Store)" : Zlib.Deflate.CompressionType.NONE,
'Fixed Huffman Coding': Zlib.Deflate.CompressionType.FIXED,
'Dynamic Huffman Coding': Zlib.Deflate.CompressionType.DYNAMIC,
'None (Store)': Zlib.Deflate.CompressionType.NONE,
},
/**
@ -144,9 +144,9 @@ var Compress = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_zlib_deflate: function(input, args) {
var deflate = new Zlib.Deflate(input, {
compressionType: Compress.ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]]
run_zlib_deflate(input, args) {
const deflate = new Zlib.Deflate(input, {
compressionType: Compress.ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]],
});
return Array.prototype.slice.call(deflate.compress());
},
@ -157,8 +157,8 @@ var Compress = {
* @default
*/
ZLIB_BUFFER_TYPE_LOOKUP: {
"Adaptive" : Zlib.Inflate.BufferType.ADAPTIVE,
"Block" : Zlib.Inflate.BufferType.BLOCK,
Adaptive: Zlib.Inflate.BufferType.ADAPTIVE,
Block: Zlib.Inflate.BufferType.BLOCK,
},
/**
@ -168,15 +168,15 @@ var Compress = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_zlib_inflate: function(input, args) {
run_zlib_inflate(input, args) {
// Deal with character encoding issues
input = Utils.str_to_byte_array(Utils.byte_array_to_utf8(input));
var inflate = new Zlib.Inflate(input, {
const inflate = new Zlib.Inflate(input, {
index: args[0],
bufferSize: args[1],
bufferType: Compress.ZLIB_BUFFER_TYPE_LOOKUP[args[2]],
resize: args[3],
verify: args[4]
verify: args[4],
});
return Array.prototype.slice.call(inflate.decompress());
},
@ -195,16 +195,16 @@ var Compress = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_gzip: function(input, args) {
var filename = args[1],
run_gzip(input, args) {
let filename = args[1],
comment = args[2],
options = {
deflateOptions: {
compressionType: Compress.ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]]
compressionType: Compress.ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]],
},
flags: {
fhcrc: args[3]
}
fhcrc: args[3],
},
};
if (filename.length) {
@ -216,7 +216,7 @@ var Compress = {
options.comment = comment;
}
var gzip = new Zlib.Gzip(input, options);
const gzip = new Zlib.Gzip(input, options);
return Array.prototype.slice.call(gzip.compress());
},
@ -228,10 +228,10 @@ var Compress = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_gunzip: function(input, args) {
run_gunzip(input, args) {
// Deal with character encoding issues
input = Utils.str_to_byte_array(Utils.byte_array_to_utf8(input));
var gunzip = new Zlib.Gunzip(input);
const gunzip = new Zlib.Gunzip(input);
return Array.prototype.slice.call(gunzip.decompress());
},
@ -240,23 +240,23 @@ var Compress = {
* @constant
* @default
*/
PKZIP_FILENAME: "file.txt",
PKZIP_FILENAME: 'file.txt',
/**
* @constant
* @default
*/
ZIP_COMPRESSION_METHOD_LOOKUP: {
"Deflate" : Zlib.Zip.CompressionMethod.DEFLATE,
"None (Store)" : Zlib.Zip.CompressionMethod.STORE
Deflate: Zlib.Zip.CompressionMethod.DEFLATE,
'None (Store)': Zlib.Zip.CompressionMethod.STORE,
},
/**
* @constant
* @default
*/
ZIP_OS_LOOKUP: {
"MSDOS" : Zlib.Zip.OperatingSystem.MSDOS,
"Unix" : Zlib.Zip.OperatingSystem.UNIX,
"Macintosh" : Zlib.Zip.OperatingSystem.MACINTOSH
MSDOS: Zlib.Zip.OperatingSystem.MSDOS,
Unix: Zlib.Zip.OperatingSystem.UNIX,
Macintosh: Zlib.Zip.OperatingSystem.MACINTOSH,
},
/**
@ -266,21 +266,20 @@ var Compress = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_pkzip: function(input, args) {
var password = Utils.str_to_byte_array(args[2]),
run_pkzip(input, args) {
let password = Utils.str_to_byte_array(args[2]),
options = {
filename: Utils.str_to_byte_array(args[0]),
comment: Utils.str_to_byte_array(args[1]),
compressionMethod: Compress.ZIP_COMPRESSION_METHOD_LOOKUP[args[3]],
os: Compress.ZIP_OS_LOOKUP[args[4]],
deflateOption: {
compressionType: Compress.ZLIB_COMPRESSION_TYPE_LOOKUP[args[5]]
compressionType: Compress.ZLIB_COMPRESSION_TYPE_LOOKUP[args[5]],
},
},
zip = new Zlib.Zip();
if (password.length)
zip.setPassword(password);
if (password.length) { zip.setPassword(password); }
zip.addFile(input, options);
return Array.prototype.slice.call(zip.compress());
},
@ -299,33 +298,33 @@ var Compress = {
* @param {Object[]} args
* @returns {string}
*/
run_pkunzip: function(input, args) {
var options = {
run_pkunzip(input, args) {
let options = {
password: Utils.str_to_byte_array(args[0]),
verify: args[1]
verify: args[1],
},
file = "",
file = '',
unzip = new Zlib.Unzip(input, options),
filenames = unzip.getFilenames(),
output = "<div style='padding: 5px;'>" + filenames.length + " file(s) found</div>\n";
output = `<div style='padding: 5px;'>${filenames.length} file(s) found</div>\n`;
output += "<div class='panel-group' id='zip-accordion' role='tablist' aria-multiselectable='true'>";
window.uzip = unzip;
for (var i = 0; i < filenames.length; i++) {
for (let i = 0; i < filenames.length; i++) {
file = Utils.byte_array_to_utf8(unzip.decompress(filenames[i]));
output += "<div class='panel panel-default'>" +
"<div class='panel-heading' role='tab' id='heading" + i + "'>" +
"<h4 class='panel-title'>" +
"<a class='collapsed' role='button' data-toggle='collapse' data-parent='#zip-accordion' href='#collapse" + i +
"' aria-expanded='true' aria-controls='collapse" + i + "'>" +
filenames[i] + "<span class='pull-right'>" + file.length.toLocaleString() + " bytes</span></a></h4></div>" +
"<div id='collapse" + i + "' class='panel-collapse collapse' role='tabpanel' aria-labelledby='heading" + i + "'>" +
"<div class='panel-body'>" +
Utils.escape_html(file) + "</div></div></div>";
output += `${"<div class='panel panel-default'>" +
"<div class='panel-heading' role='tab' id='heading"}${i}'>` +
'<h4 class=\'panel-title\'>' +
`<a class='collapsed' role='button' data-toggle='collapse' data-parent='#zip-accordion' href='#collapse${i
}' aria-expanded='true' aria-controls='collapse${i}'>${
filenames[i]}<span class='pull-right'>${file.length.toLocaleString()} bytes</span></a></h4></div>` +
`<div id='collapse${i}' class='panel-collapse collapse' role='tabpanel' aria-labelledby='heading${i}'>` +
`<div class='panel-body'>${
Utils.escape_html(file)}</div></div></div>`;
}
return output + "</div>";
return `${output}</div>`;
},
@ -336,10 +335,10 @@ var Compress = {
* @param {Object[]} args
* @returns {string}
*/
run_bzip2_decompress: function(input, args) {
var compressed = new Uint8Array(input),
run_bzip2_decompress(input, args) {
let compressed = new Uint8Array(input),
bzip2_reader,
plain = "";
plain = '';
bzip2_reader = bzip2.array(compressed);
plain = bzip2.simple(bzip2_reader);

View file

@ -7,54 +7,54 @@
*
* @namespace
*/
var Convert = {
const Convert = {
/**
* @constant
* @default
*/
DISTANCE_UNITS: [
"[Metric]", "Nanometres (nm)", "Micrometres (µm)", "Millimetres (mm)", "Centimetres (cm)", "Metres (m)", "Kilometers (km)", "[/Metric]",
"[Imperial]", "Thou (th)", "Inches (in)", "Feet (ft)", "Yards (yd)", "Chains (ch)", "Furlongs (fur)", "Miles (mi)", "Leagues (lea)", "[/Imperial]",
"[Maritime]", "Fathoms (ftm)", "Cables", "Nautical miles", "[/Maritime]",
"[Comparisons]", "Cars (4m)", "Buses (8.4m)", "American football fields (91m)", "Football pitches (105m)", "[/Comparisons]",
"[Astronomical]", "Earth-to-Moons", "Earth's equators", "Astronomical units (au)", "Light-years (ly)", "Parsecs (pc)", "[/Astronomical]",
'[Metric]', 'Nanometres (nm)', 'Micrometres (µm)', 'Millimetres (mm)', 'Centimetres (cm)', 'Metres (m)', 'Kilometers (km)', '[/Metric]',
'[Imperial]', 'Thou (th)', 'Inches (in)', 'Feet (ft)', 'Yards (yd)', 'Chains (ch)', 'Furlongs (fur)', 'Miles (mi)', 'Leagues (lea)', '[/Imperial]',
'[Maritime]', 'Fathoms (ftm)', 'Cables', 'Nautical miles', '[/Maritime]',
'[Comparisons]', 'Cars (4m)', 'Buses (8.4m)', 'American football fields (91m)', 'Football pitches (105m)', '[/Comparisons]',
'[Astronomical]', 'Earth-to-Moons', "Earth's equators", 'Astronomical units (au)', 'Light-years (ly)', 'Parsecs (pc)', '[/Astronomical]',
],
/**
* @constant
* @default
*/
DISTANCE_FACTOR: { // Multiples of a metre
"Nanometres (nm)" : 1e-9,
"Micrometres (µm)" : 1e-6,
"Millimetres (mm)" : 1e-3,
"Centimetres (cm)" : 1e-2,
"Metres (m)" : 1,
"Kilometers (km)" : 1e3,
'Nanometres (nm)': 1e-9,
'Micrometres (µm)': 1e-6,
'Millimetres (mm)': 1e-3,
'Centimetres (cm)': 1e-2,
'Metres (m)': 1,
'Kilometers (km)': 1e3,
"Thou (th)" : 0.0000254,
"Inches (in)" : 0.0254,
"Feet (ft)" : 0.3048,
"Yards (yd)" : 0.9144,
"Chains (ch)" : 20.1168,
"Furlongs (fur)" : 201.168,
"Miles (mi)" : 1609.344,
"Leagues (lea)" : 4828.032,
'Thou (th)': 0.0000254,
'Inches (in)': 0.0254,
'Feet (ft)': 0.3048,
'Yards (yd)': 0.9144,
'Chains (ch)': 20.1168,
'Furlongs (fur)': 201.168,
'Miles (mi)': 1609.344,
'Leagues (lea)': 4828.032,
"Fathoms (ftm)" : 1.853184,
"Cables" : 185.3184,
"Nautical miles" : 1853.184,
'Fathoms (ftm)': 1.853184,
Cables: 185.3184,
'Nautical miles': 1853.184,
"Cars (4m)" : 4,
"Buses (8.4m)" : 8.4,
"American football fields (91m)": 91,
"Football pitches (105m)": 105,
'Cars (4m)': 4,
'Buses (8.4m)': 8.4,
'American football fields (91m)': 91,
'Football pitches (105m)': 105,
"Earth-to-Moons" : 380000000,
'Earth-to-Moons': 380000000,
"Earth's equators": 40075016.686,
"Astronomical units (au)": 149597870700,
"Light-years (ly)" : 9460730472580800,
"Parsecs (pc)" : 3.0856776e16
'Astronomical units (au)': 149597870700,
'Light-years (ly)': 9460730472580800,
'Parsecs (pc)': 3.0856776e16,
},
/**
@ -64,11 +64,11 @@ var Convert = {
* @param {Object[]} args
* @returns {number}
*/
run_distance: function (input, args) {
var input_units = args[0],
run_distance(input, args) {
let input_units = args[0],
output_units = args[1];
input = input * Convert.DISTANCE_FACTOR[input_units];
input *= Convert.DISTANCE_FACTOR[input_units];
return input / Convert.DISTANCE_FACTOR[output_units];
// TODO Remove rounding errors (e.g. 1.000000000001)
},
@ -79,63 +79,63 @@ var Convert = {
* @default
*/
DATA_UNITS: [
"Bits (b)", "Nibbles", "Octets", "Bytes (B)",
"[Binary bits (2^n)]", "Kibibits (Kib)", "Mebibits (Mib)", "Gibibits (Gib)", "Tebibits (Tib)", "Pebibits (Pib)", "Exbibits (Eib)", "Zebibits (Zib)", "Yobibits (Yib)", "[/Binary bits (2^n)]",
"[Decimal bits (10^n)]", "Decabits", "Hectobits", "Kilobits (kb)", "Megabits (Mb)", "Gigabits (Gb)", "Terabits (Tb)", "Petabits (Pb)", "Exabits (Eb)", "Zettabits (Zb)", "Yottabits (Yb)", "[/Decimal bits (10^n)]",
"[Binary bytes (8 x 2^n)]", "Kibibytes (KiB)", "Mebibytes (MiB)", "Gibibytes (GiB)", "Tebibytes (TiB)", "Pebibytes (PiB)", "Exbibytes (EiB)", "Zebibytes (ZiB)", "Yobibytes (YiB)", "[/Binary bytes (8 x 2^n)]",
"[Decimal bytes (8 x 10^n)]", "Kilobytes (KB)", "Megabytes (MB)", "Gigabytes (GB)", "Terabytes (TB)", "Petabytes (PB)", "Exabytes (EB)", "Zettabytes (ZB)", "Yottabytes (YB)", "[/Decimal bytes (8 x 10^n)]"
'Bits (b)', 'Nibbles', 'Octets', 'Bytes (B)',
'[Binary bits (2^n)]', 'Kibibits (Kib)', 'Mebibits (Mib)', 'Gibibits (Gib)', 'Tebibits (Tib)', 'Pebibits (Pib)', 'Exbibits (Eib)', 'Zebibits (Zib)', 'Yobibits (Yib)', '[/Binary bits (2^n)]',
'[Decimal bits (10^n)]', 'Decabits', 'Hectobits', 'Kilobits (kb)', 'Megabits (Mb)', 'Gigabits (Gb)', 'Terabits (Tb)', 'Petabits (Pb)', 'Exabits (Eb)', 'Zettabits (Zb)', 'Yottabits (Yb)', '[/Decimal bits (10^n)]',
'[Binary bytes (8 x 2^n)]', 'Kibibytes (KiB)', 'Mebibytes (MiB)', 'Gibibytes (GiB)', 'Tebibytes (TiB)', 'Pebibytes (PiB)', 'Exbibytes (EiB)', 'Zebibytes (ZiB)', 'Yobibytes (YiB)', '[/Binary bytes (8 x 2^n)]',
'[Decimal bytes (8 x 10^n)]', 'Kilobytes (KB)', 'Megabytes (MB)', 'Gigabytes (GB)', 'Terabytes (TB)', 'Petabytes (PB)', 'Exabytes (EB)', 'Zettabytes (ZB)', 'Yottabytes (YB)', '[/Decimal bytes (8 x 10^n)]',
],
/**
* @constant
* @default
*/
DATA_FACTOR: { // Multiples of a bit
"Bits (b)" : 1,
"Nibbles" : 4,
"Octets" : 8,
"Bytes (B)" : 8,
'Bits (b)': 1,
Nibbles: 4,
Octets: 8,
'Bytes (B)': 8,
// Binary bits (2^n)
"Kibibits (Kib)" : 1024,
"Mebibits (Mib)" : 1048576,
"Gibibits (Gib)" : 1073741824,
"Tebibits (Tib)" : 1099511627776,
"Pebibits (Pib)" : 1125899906842624,
"Exbibits (Eib)" : 1152921504606846976,
"Zebibits (Zib)" : 1180591620717411303424,
"Yobibits (Yib)" : 1208925819614629174706176,
'Kibibits (Kib)': 1024,
'Mebibits (Mib)': 1048576,
'Gibibits (Gib)': 1073741824,
'Tebibits (Tib)': 1099511627776,
'Pebibits (Pib)': 1125899906842624,
'Exbibits (Eib)': 1152921504606846976,
'Zebibits (Zib)': 1180591620717411303424,
'Yobibits (Yib)': 1208925819614629174706176,
// Decimal bits (10^n)
"Decabits" : 10,
"Hectobits" : 100,
"Kilobits (Kb)" : 1e3,
"Megabits (Mb)" : 1e6,
"Gigabits (Gb)" : 1e9,
"Terabits (Tb)" : 1e12,
"Petabits (Pb)" : 1e15,
"Exabits (Eb)" : 1e18,
"Zettabits (Zb)" : 1e21,
"Yottabits (Yb)" : 1e24,
Decabits: 10,
Hectobits: 100,
'Kilobits (Kb)': 1e3,
'Megabits (Mb)': 1e6,
'Gigabits (Gb)': 1e9,
'Terabits (Tb)': 1e12,
'Petabits (Pb)': 1e15,
'Exabits (Eb)': 1e18,
'Zettabits (Zb)': 1e21,
'Yottabits (Yb)': 1e24,
// Binary bytes (8 x 2^n)
"Kibibytes (KiB)" : 8192,
"Mebibytes (MiB)" : 8388608,
"Gibibytes (GiB)" : 8589934592,
"Tebibytes (TiB)" : 8796093022208,
"Pebibytes (PiB)" : 9007199254740992,
"Exbibytes (EiB)" : 9223372036854775808,
"Zebibytes (ZiB)" : 9444732965739290427392,
"Yobibytes (YiB)" : 9671406556917033397649408,
'Kibibytes (KiB)': 8192,
'Mebibytes (MiB)': 8388608,
'Gibibytes (GiB)': 8589934592,
'Tebibytes (TiB)': 8796093022208,
'Pebibytes (PiB)': 9007199254740992,
'Exbibytes (EiB)': 9223372036854775808,
'Zebibytes (ZiB)': 9444732965739290427392,
'Yobibytes (YiB)': 9671406556917033397649408,
// Decimal bytes (8 x 10^n)
"Kilobytes (KB)" : 8e3,
"Megabytes (MB)" : 8e6,
"Gigabytes (GB)" : 8e9,
"Terabytes (TB)" : 8e12,
"Petabytes (PB)" : 8e15,
"Exabytes (EB)" : 8e18,
"Zettabytes (ZB)" : 8e21,
"Yottabytes (YB)" : 8e24,
'Kilobytes (KB)': 8e3,
'Megabytes (MB)': 8e6,
'Gigabytes (GB)': 8e9,
'Terabytes (TB)': 8e12,
'Petabytes (PB)': 8e15,
'Exabytes (EB)': 8e18,
'Zettabytes (ZB)': 8e21,
'Yottabytes (YB)': 8e24,
},
/**
@ -145,11 +145,11 @@ var Convert = {
* @param {Object[]} args
* @returns {number}
*/
run_data_size: function (input, args) {
var input_units = args[0],
run_data_size(input, args) {
let input_units = args[0],
output_units = args[1];
input = input * Convert.DATA_FACTOR[input_units];
input *= Convert.DATA_FACTOR[input_units];
return input / Convert.DATA_FACTOR[output_units];
},
@ -159,11 +159,11 @@ var Convert = {
* @default
*/
AREA_UNITS: [
"[Metric]", "Square metre (sq m)", "Square kilometre (sq km)", "Centiare (ca)", "Deciare (da)", "Are (a)", "Decare (daa)", "Hectare (ha)", "[/Metric]",
"[Imperial]", "Square inch (sq in)", "Square foot (sq ft)", "Square yard (sq yd)", "Square mile (sq mi)", "Perch (sq per)", "Rood (ro)", "International acre (ac)", "[/Imperial]",
"[US customary units]", "US survey acre (ac)", "US survey square mile (sq mi)", "US survey township", "[/US customary units]",
"[Nuclear physics]", "Yoctobarn (yb)", "Zeptobarn (zb)", "Attobarn (ab)", "Femtobarn (fb)", "Picobarn (pb)", "Nanobarn (nb)", "Microbarn (μb)", "Millibarn (mb)", "Barn (b)", "Kilobarn (kb)", "Megabarn (Mb)", "Outhouse", "Shed", "Planck area", "[/Nuclear physics]",
"[Comparisons]", "Washington D.C.", "Isle of Wight", "Wales", "Texas", "[/Comparisons]",
'[Metric]', 'Square metre (sq m)', 'Square kilometre (sq km)', 'Centiare (ca)', 'Deciare (da)', 'Are (a)', 'Decare (daa)', 'Hectare (ha)', '[/Metric]',
'[Imperial]', 'Square inch (sq in)', 'Square foot (sq ft)', 'Square yard (sq yd)', 'Square mile (sq mi)', 'Perch (sq per)', 'Rood (ro)', 'International acre (ac)', '[/Imperial]',
'[US customary units]', 'US survey acre (ac)', 'US survey square mile (sq mi)', 'US survey township', '[/US customary units]',
'[Nuclear physics]', 'Yoctobarn (yb)', 'Zeptobarn (zb)', 'Attobarn (ab)', 'Femtobarn (fb)', 'Picobarn (pb)', 'Nanobarn (nb)', 'Microbarn (μb)', 'Millibarn (mb)', 'Barn (b)', 'Kilobarn (kb)', 'Megabarn (Mb)', 'Outhouse', 'Shed', 'Planck area', '[/Nuclear physics]',
'[Comparisons]', 'Washington D.C.', 'Isle of Wight', 'Wales', 'Texas', '[/Comparisons]',
],
/**
* @constant
@ -171,51 +171,51 @@ var Convert = {
*/
AREA_FACTOR: { // Multiples of a square metre
// Metric
"Square metre (sq m)" : 1,
"Square kilometre (sq km)" : 1e6,
'Square metre (sq m)': 1,
'Square kilometre (sq km)': 1e6,
"Centiare (ca)" : 1,
"Deciare (da)" : 10,
"Are (a)" : 100,
"Decare (daa)" : 1e3,
"Hectare (ha)" : 1e4,
'Centiare (ca)': 1,
'Deciare (da)': 10,
'Are (a)': 100,
'Decare (daa)': 1e3,
'Hectare (ha)': 1e4,
// Imperial
"Square inch (sq in)" : 0.00064516,
"Square foot (sq ft)" : 0.09290304,
"Square yard (sq yd)" : 0.83612736,
"Square mile (sq mi)" : 2589988.110336,
"Perch (sq per)" : 42.21,
"Rood (ro)" : 1011,
"International acre (ac)" : 4046.8564224,
'Square inch (sq in)': 0.00064516,
'Square foot (sq ft)': 0.09290304,
'Square yard (sq yd)': 0.83612736,
'Square mile (sq mi)': 2589988.110336,
'Perch (sq per)': 42.21,
'Rood (ro)': 1011,
'International acre (ac)': 4046.8564224,
// US customary units
"US survey acre (ac)" : 4046.87261,
"US survey square mile (sq mi)" : 2589998.470305239,
"US survey township" : 93239944.9309886,
'US survey acre (ac)': 4046.87261,
'US survey square mile (sq mi)': 2589998.470305239,
'US survey township': 93239944.9309886,
// Nuclear physics
"Yoctobarn (yb)" : 1e-52,
"Zeptobarn (zb)" : 1e-49,
"Attobarn (ab)" : 1e-46,
"Femtobarn (fb)" : 1e-43,
"Picobarn (pb)" : 1e-40,
"Nanobarn (nb)" : 1e-37,
"Microbarn (μb)" : 1e-34,
"Millibarn (mb)" : 1e-31,
"Barn (b)" : 1e-28,
"Kilobarn (kb)" : 1e-25,
"Megabarn (Mb)" : 1e-22,
'Yoctobarn (yb)': 1e-52,
'Zeptobarn (zb)': 1e-49,
'Attobarn (ab)': 1e-46,
'Femtobarn (fb)': 1e-43,
'Picobarn (pb)': 1e-40,
'Nanobarn (nb)': 1e-37,
'Microbarn (μb)': 1e-34,
'Millibarn (mb)': 1e-31,
'Barn (b)': 1e-28,
'Kilobarn (kb)': 1e-25,
'Megabarn (Mb)': 1e-22,
"Planck area" : 2.6e-70,
"Shed" : 1e-52,
"Outhouse" : 1e-34,
'Planck area': 2.6e-70,
Shed: 1e-52,
Outhouse: 1e-34,
// Comparisons
"Washington D.C." : 176119191.502848,
"Isle of Wight" : 380000000,
"Wales" : 20779000000,
"Texas" : 696241000000,
'Washington D.C.': 176119191.502848,
'Isle of Wight': 380000000,
Wales: 20779000000,
Texas: 696241000000,
},
/**
@ -225,11 +225,11 @@ var Convert = {
* @param {Object[]} args
* @returns {number}
*/
run_area: function (input, args) {
var input_units = args[0],
run_area(input, args) {
let input_units = args[0],
output_units = args[1];
input = input * Convert.AREA_FACTOR[input_units];
input *= Convert.AREA_FACTOR[input_units];
return input / Convert.AREA_FACTOR[output_units];
},
@ -239,12 +239,12 @@ var Convert = {
* @default
*/
MASS_UNITS: [
"[Metric]", "Yoctogram (yg)", "Zeptogram (zg)", "Attogram (ag)", "Femtogram (fg)", "Picogram (pg)", "Nanogram (ng)", "Microgram (μg)", "Milligram (mg)", "Centigram (cg)", "Decigram (dg)", "Gram (g)", "Decagram (dag)", "Hectogram (hg)", "Kilogram (kg)", "Megagram (Mg)", "Tonne (t)", "Gigagram (Gg)", "Teragram (Tg)", "Petagram (Pg)", "Exagram (Eg)", "Zettagram (Zg)", "Yottagram (Yg)", "[/Metric]",
"[Imperial Avoirdupois]", "Grain (gr)", "Dram (dr)", "Ounce (oz)", "Pound (lb)", "Nail", "Stone (st)", "Quarter (gr)", "Tod", "US hundredweight (cwt)", "Imperial hundredweight (cwt)", "US ton (t)", "Imperial ton (t)", "[/Imperial Avoirdupois]",
"[Imperial Troy]", "Grain (gr)", "Pennyweight (dwt)", "Troy dram (dr t)", "Troy ounce (oz t)", "Troy pound (lb t)", "Mark", "[/Imperial Troy]",
"[Archaic]", "Wey", "Wool wey", "Suffolk wey", "Wool sack", "Coal sack", "Load", "Last", "Flax or feather last", "Gunpowder last", "Picul", "Rice last", "[/Archaic]",
"[Comparisons]", "Big Ben (14 tonnes)", "Blue whale (180 tonnes)", "International Space Station (417 tonnes)", "Space Shuttle (2,041 tonnes)", "RMS Titanic (52,000 tonnes)", "Great Pyramid of Giza (6,000,000 tonnes)", "Earth's oceans (1.4 yottagrams)", "[/Comparisons]",
"[Astronomical]", "A teaspoon of neutron star (5,500 million tonnes)", "Lunar mass (ML)", "Earth mass (M⊕)", "Jupiter mass (MJ)", "Solar mass (M☉)", "Sagittarius A* (7.5 x 10^36 kgs-ish)", "Milky Way galaxy (1.2 x 10^42 kgs)", "The observable universe (1.45 x 10^53 kgs)", "[/Astronomical]",
'[Metric]', 'Yoctogram (yg)', 'Zeptogram (zg)', 'Attogram (ag)', 'Femtogram (fg)', 'Picogram (pg)', 'Nanogram (ng)', 'Microgram (μg)', 'Milligram (mg)', 'Centigram (cg)', 'Decigram (dg)', 'Gram (g)', 'Decagram (dag)', 'Hectogram (hg)', 'Kilogram (kg)', 'Megagram (Mg)', 'Tonne (t)', 'Gigagram (Gg)', 'Teragram (Tg)', 'Petagram (Pg)', 'Exagram (Eg)', 'Zettagram (Zg)', 'Yottagram (Yg)', '[/Metric]',
'[Imperial Avoirdupois]', 'Grain (gr)', 'Dram (dr)', 'Ounce (oz)', 'Pound (lb)', 'Nail', 'Stone (st)', 'Quarter (gr)', 'Tod', 'US hundredweight (cwt)', 'Imperial hundredweight (cwt)', 'US ton (t)', 'Imperial ton (t)', '[/Imperial Avoirdupois]',
'[Imperial Troy]', 'Grain (gr)', 'Pennyweight (dwt)', 'Troy dram (dr t)', 'Troy ounce (oz t)', 'Troy pound (lb t)', 'Mark', '[/Imperial Troy]',
'[Archaic]', 'Wey', 'Wool wey', 'Suffolk wey', 'Wool sack', 'Coal sack', 'Load', 'Last', 'Flax or feather last', 'Gunpowder last', 'Picul', 'Rice last', '[/Archaic]',
'[Comparisons]', 'Big Ben (14 tonnes)', 'Blue whale (180 tonnes)', 'International Space Station (417 tonnes)', 'Space Shuttle (2,041 tonnes)', 'RMS Titanic (52,000 tonnes)', 'Great Pyramid of Giza (6,000,000 tonnes)', "Earth's oceans (1.4 yottagrams)", '[/Comparisons]',
'[Astronomical]', 'A teaspoon of neutron star (5,500 million tonnes)', 'Lunar mass (ML)', 'Earth mass (M⊕)', 'Jupiter mass (MJ)', 'Solar mass (M☉)', 'Sagittarius A* (7.5 x 10^36 kgs-ish)', 'Milky Way galaxy (1.2 x 10^42 kgs)', 'The observable universe (1.45 x 10^53 kgs)', '[/Astronomical]',
],
/**
* @constant
@ -252,81 +252,81 @@ var Convert = {
*/
MASS_FACTOR: { // Multiples of a gram
// Metric
"Yoctogram (yg)" : 1e-24,
"Zeptogram (zg)" : 1e-21,
"Attogram (ag)" : 1e-18,
"Femtogram (fg)" : 1e-15,
"Picogram (pg)" : 1e-12,
"Nanogram (ng)" : 1e-9,
"Microgram (μg)" : 1e-6,
"Milligram (mg)" : 1e-3,
"Centigram (cg)" : 1e-2,
"Decigram (dg)" : 1e-1,
"Gram (g)" : 1,
"Decagram (dag)" : 10,
"Hectogram (hg)" : 100,
"Kilogram (kg)" : 1000,
"Megagram (Mg)" : 1e6,
"Tonne (t)" : 1e6,
"Gigagram (Gg)" : 1e9,
"Teragram (Tg)" : 1e12,
"Petagram (Pg)" : 1e15,
"Exagram (Eg)" : 1e18,
"Zettagram (Zg)" : 1e21,
"Yottagram (Yg)" : 1e24,
'Yoctogram (yg)': 1e-24,
'Zeptogram (zg)': 1e-21,
'Attogram (ag)': 1e-18,
'Femtogram (fg)': 1e-15,
'Picogram (pg)': 1e-12,
'Nanogram (ng)': 1e-9,
'Microgram (μg)': 1e-6,
'Milligram (mg)': 1e-3,
'Centigram (cg)': 1e-2,
'Decigram (dg)': 1e-1,
'Gram (g)': 1,
'Decagram (dag)': 10,
'Hectogram (hg)': 100,
'Kilogram (kg)': 1000,
'Megagram (Mg)': 1e6,
'Tonne (t)': 1e6,
'Gigagram (Gg)': 1e9,
'Teragram (Tg)': 1e12,
'Petagram (Pg)': 1e15,
'Exagram (Eg)': 1e18,
'Zettagram (Zg)': 1e21,
'Yottagram (Yg)': 1e24,
// Imperial Avoirdupois
"Grain (gr)" : 64.79891e-3,
"Dram (dr)" : 1.7718451953125,
"Ounce (oz)" : 28.349523125,
"Pound (lb)" : 453.59237,
"Nail" : 3175.14659,
"Stone (st)" : 6.35029318e3,
"Quarter (gr)" : 12700.58636,
"Tod" : 12700.58636,
"US hundredweight (cwt)" : 45.359237e3,
"Imperial hundredweight (cwt)" : 50.80234544e3,
"US ton (t)" : 907.18474e3,
"Imperial ton (t)" : 1016.0469088e3,
'Grain (gr)': 64.79891e-3,
'Dram (dr)': 1.7718451953125,
'Ounce (oz)': 28.349523125,
'Pound (lb)': 453.59237,
Nail: 3175.14659,
'Stone (st)': 6.35029318e3,
'Quarter (gr)': 12700.58636,
Tod: 12700.58636,
'US hundredweight (cwt)': 45.359237e3,
'Imperial hundredweight (cwt)': 50.80234544e3,
'US ton (t)': 907.18474e3,
'Imperial ton (t)': 1016.0469088e3,
// Imperial Troy
"Pennyweight (dwt)" : 1.55517384,
"Troy dram (dr t)" : 3.8879346,
"Troy ounce (oz t)" : 31.1034768,
"Troy pound (lb t)" : 373.2417216,
"Mark" : 248.8278144,
'Pennyweight (dwt)': 1.55517384,
'Troy dram (dr t)': 3.8879346,
'Troy ounce (oz t)': 31.1034768,
'Troy pound (lb t)': 373.2417216,
Mark: 248.8278144,
// Archaic
"Wey" : 76.5e3,
"Wool wey" : 101.7e3,
"Suffolk wey" : 161.5e3,
"Wool sack" : 153000,
"Coal sack" : 50.80234544e3,
"Load" : 918000,
"Last" : 1836000,
"Flax or feather last" : 770e3,
"Gunpowder last" : 1090e3,
"Picul" : 60.478982e3,
"Rice last" : 1200e3,
Wey: 76.5e3,
'Wool wey': 101.7e3,
'Suffolk wey': 161.5e3,
'Wool sack': 153000,
'Coal sack': 50.80234544e3,
Load: 918000,
Last: 1836000,
'Flax or feather last': 770e3,
'Gunpowder last': 1090e3,
Picul: 60.478982e3,
'Rice last': 1200e3,
// Comparisons
"Big Ben (14 tonnes)" : 14e6,
"Blue whale (180 tonnes)" : 180e6,
"International Space Station (417 tonnes)" : 417e6,
"Space Shuttle (2,041 tonnes)" : 2041e6,
"RMS Titanic (52,000 tonnes)" : 52000e6,
"Great Pyramid of Giza (6,000,000 tonnes)" : 6e12,
'Big Ben (14 tonnes)': 14e6,
'Blue whale (180 tonnes)': 180e6,
'International Space Station (417 tonnes)': 417e6,
'Space Shuttle (2,041 tonnes)': 2041e6,
'RMS Titanic (52,000 tonnes)': 52000e6,
'Great Pyramid of Giza (6,000,000 tonnes)': 6e12,
"Earth's oceans (1.4 yottagrams)": 1.4e24,
// Astronomical
"A teaspoon of neutron star (5,500 million tonnes)" : 5.5e15,
"Lunar mass (ML)" : 7.342e25,
"Earth mass (M⊕)" : 5.97219e27,
"Jupiter mass (MJ)" : 1.8981411476999997e30,
"Solar mass (M☉)" : 1.98855e33,
"Sagittarius A* (7.5 x 10^36 kgs-ish)" : 7.5e39,
"Milky Way galaxy (1.2 x 10^42 kgs)" : 1.2e45,
"The observable universe (1.45 x 10^53 kgs)" : 1.45e56,
'A teaspoon of neutron star (5,500 million tonnes)': 5.5e15,
'Lunar mass (ML)': 7.342e25,
'Earth mass (M⊕)': 5.97219e27,
'Jupiter mass (MJ)': 1.8981411476999997e30,
'Solar mass (M☉)': 1.98855e33,
'Sagittarius A* (7.5 x 10^36 kgs-ish)': 7.5e39,
'Milky Way galaxy (1.2 x 10^42 kgs)': 1.2e45,
'The observable universe (1.45 x 10^53 kgs)': 1.45e56,
},
/**
@ -336,11 +336,11 @@ var Convert = {
* @param {Object[]} args
* @returns {number}
*/
run_mass: function (input, args) {
var input_units = args[0],
run_mass(input, args) {
let input_units = args[0],
output_units = args[1];
input = input * Convert.MASS_FACTOR[input_units];
input *= Convert.MASS_FACTOR[input_units];
return input / Convert.MASS_FACTOR[output_units];
},
@ -350,10 +350,10 @@ var Convert = {
* @default
*/
SPEED_UNITS: [
"[Metric]", "Metres per second (m/s)", "Kilometres per hour (km/h)", "[/Metric]",
"[Imperial]", "Miles per hour (mph)", "Knots (kn)", "[/Imperial]",
"[Comparisons]", "Human hair growth rate", "Bamboo growth rate", "World's fastest snail", "Usain Bolt's top speed", "Jet airliner cruising speed", "Concorde", "SR-71 Blackbird", "Space Shuttle", "International Space Station", "[/Comparisons]",
"[Scientific]", "Sound in standard atmosphere", "Sound in water", "Lunar escape velocity", "Earth escape velocity", "Earth's solar orbit", "Solar system's Milky Way orbit", "Milky Way relative to the cosmic microwave background", "Solar escape velocity", "Neutron star escape velocity (0.3c)", "Light in a diamond (0.4136c)", "Signal in an optical fibre (0.667c)", "Light (c)", "[/Scientific]",
'[Metric]', 'Metres per second (m/s)', 'Kilometres per hour (km/h)', '[/Metric]',
'[Imperial]', 'Miles per hour (mph)', 'Knots (kn)', '[/Imperial]',
'[Comparisons]', 'Human hair growth rate', 'Bamboo growth rate', "World's fastest snail", "Usain Bolt's top speed", 'Jet airliner cruising speed', 'Concorde', 'SR-71 Blackbird', 'Space Shuttle', 'International Space Station', '[/Comparisons]',
'[Scientific]', 'Sound in standard atmosphere', 'Sound in water', 'Lunar escape velocity', 'Earth escape velocity', "Earth's solar orbit", "Solar system's Milky Way orbit", 'Milky Way relative to the cosmic microwave background', 'Solar escape velocity', 'Neutron star escape velocity (0.3c)', 'Light in a diamond (0.4136c)', 'Signal in an optical fibre (0.667c)', 'Light (c)', '[/Scientific]',
],
/**
* @constant
@ -361,37 +361,37 @@ var Convert = {
*/
SPEED_FACTOR: { // Multiples of m/s
// Metric
"Metres per second (m/s)" : 1,
"Kilometres per hour (km/h)" : 0.2778,
'Metres per second (m/s)': 1,
'Kilometres per hour (km/h)': 0.2778,
// Imperial
"Miles per hour (mph)" : 0.44704,
"Knots (kn)" : 0.5144,
'Miles per hour (mph)': 0.44704,
'Knots (kn)': 0.5144,
// Comparisons
"Human hair growth rate" : 4.8e-9,
"Bamboo growth rate" : 1.4e-5,
'Human hair growth rate': 4.8e-9,
'Bamboo growth rate': 1.4e-5,
"World's fastest snail": 0.00275,
"Usain Bolt's top speed": 12.42,
"Jet airliner cruising speed" : 250,
"Concorde" : 603,
"SR-71 Blackbird" : 981,
"Space Shuttle" : 1400,
"International Space Station" : 7700,
'Jet airliner cruising speed': 250,
Concorde: 603,
'SR-71 Blackbird': 981,
'Space Shuttle': 1400,
'International Space Station': 7700,
// Scientific
"Sound in standard atmosphere" : 340.3,
"Sound in water" : 1500,
"Lunar escape velocity" : 2375,
"Earth escape velocity" : 11200,
'Sound in standard atmosphere': 340.3,
'Sound in water': 1500,
'Lunar escape velocity': 2375,
'Earth escape velocity': 11200,
"Earth's solar orbit": 29800,
"Solar system's Milky Way orbit": 200000,
"Milky Way relative to the cosmic microwave background" : 552000,
"Solar escape velocity" : 617700,
"Neutron star escape velocity (0.3c)" : 100000000,
"Light in a diamond (0.4136c)" : 124000000,
"Signal in an optical fibre (0.667c)" : 200000000,
"Light (c)" : 299792458,
'Milky Way relative to the cosmic microwave background': 552000,
'Solar escape velocity': 617700,
'Neutron star escape velocity (0.3c)': 100000000,
'Light in a diamond (0.4136c)': 124000000,
'Signal in an optical fibre (0.667c)': 200000000,
'Light (c)': 299792458,
},
/**
@ -401,11 +401,11 @@ var Convert = {
* @param {Object[]} args
* @returns {number}
*/
run_speed: function (input, args) {
var input_units = args[0],
run_speed(input, args) {
let input_units = args[0],
output_units = args[1];
input = input * Convert.SPEED_FACTOR[input_units];
input *= Convert.SPEED_FACTOR[input_units];
return input / Convert.SPEED_FACTOR[output_units];
},

View file

@ -9,13 +9,13 @@
*
* @namespace
*/
var DateTime = {
const DateTime = {
/**
* @constant
* @default
*/
UNITS: ["Seconds (s)", "Milliseconds (ms)", "Microseconds (μs)", "Nanoseconds (ns)"],
UNITS: ['Seconds (s)', 'Milliseconds (ms)', 'Microseconds (μs)', 'Nanoseconds (ns)'],
/**
* From UNIX Timestamp operation.
@ -24,26 +24,26 @@ var DateTime = {
* @param {Object[]} args
* @returns {string}
*/
run_from_unix_timestamp: function(input, args) {
var units = args[0],
run_from_unix_timestamp(input, args) {
let units = args[0],
d;
input = parseFloat(input);
if (units == "Seconds (s)") {
if (units == 'Seconds (s)') {
d = moment.unix(input);
return d.tz("UTC").format("ddd D MMMM YYYY HH:mm:ss") + " UTC";
} else if (units == "Milliseconds (ms)") {
return `${d.tz('UTC').format('ddd D MMMM YYYY HH:mm:ss')} UTC`;
} else if (units == 'Milliseconds (ms)') {
d = moment(input);
return d.tz("UTC").format("ddd D MMMM YYYY HH:mm:ss.SSS") + " UTC";
} else if (units == "Microseconds (μs)") {
return `${d.tz('UTC').format('ddd D MMMM YYYY HH:mm:ss.SSS')} UTC`;
} else if (units == 'Microseconds (μs)') {
d = moment(input / 1000);
return d.tz("UTC").format("ddd D MMMM YYYY HH:mm:ss.SSS") + " UTC";
} else if (units == "Nanoseconds (ns)") {
return `${d.tz('UTC').format('ddd D MMMM YYYY HH:mm:ss.SSS')} UTC`;
} else if (units == 'Nanoseconds (ns)') {
d = moment(input / 1000000);
return d.tz("UTC").format("ddd D MMMM YYYY HH:mm:ss.SSS") + " UTC";
return `${d.tz('UTC').format('ddd D MMMM YYYY HH:mm:ss.SSS')} UTC`;
} else {
throw "Unrecognised unit";
throw 'Unrecognised unit';
}
},
@ -55,20 +55,20 @@ var DateTime = {
* @param {Object[]} args
* @returns {number}
*/
run_to_unix_timestamp: function(input, args) {
var units = args[0],
run_to_unix_timestamp(input, args) {
let units = args[0],
d = moment(input);
if (units == "Seconds (s)") {
if (units == 'Seconds (s)') {
return d.unix();
} else if (units == "Milliseconds (ms)") {
} else if (units == 'Milliseconds (ms)') {
return d.valueOf();
} else if (units == "Microseconds (μs)") {
} else if (units == 'Microseconds (μs)') {
return d.valueOf() * 1000;
} else if (units == "Nanoseconds (ns)") {
} else if (units == 'Nanoseconds (ns)') {
return d.valueOf() * 1000000;
} else {
throw "Unrecognised unit";
throw 'Unrecognised unit';
}
},
@ -79,49 +79,49 @@ var DateTime = {
*/
DATETIME_FORMATS: [
{
name: "Standard date and time",
value: "DD/MM/YYYY HH:mm:ss"
name: 'Standard date and time',
value: 'DD/MM/YYYY HH:mm:ss',
},
{
name: "American-style date and time",
value: "MM/DD/YYYY HH:mm:ss"
name: 'American-style date and time',
value: 'MM/DD/YYYY HH:mm:ss',
},
{
name: "International date and time",
value: "YYYY-MM-DD HH:mm:ss"
name: 'International date and time',
value: 'YYYY-MM-DD HH:mm:ss',
},
{
name: "Verbose date and time",
value: "dddd Do MMMM YYYY HH:mm:ss Z z"
name: 'Verbose date and time',
value: 'dddd Do MMMM YYYY HH:mm:ss Z z',
},
{
name: "UNIX timestamp (seconds)",
value: "X"
name: 'UNIX timestamp (seconds)',
value: 'X',
},
{
name: "UNIX timestamp offset (milliseconds)",
value: "x"
name: 'UNIX timestamp offset (milliseconds)',
value: 'x',
},
{
name: "Automatic",
value: ""
name: 'Automatic',
value: '',
},
],
/**
* @constant
* @default
*/
INPUT_FORMAT_STRING: "DD/MM/YYYY HH:mm:ss",
INPUT_FORMAT_STRING: 'DD/MM/YYYY HH:mm:ss',
/**
* @constant
* @default
*/
OUTPUT_FORMAT_STRING: "dddd Do MMMM YYYY HH:mm:ss Z z",
OUTPUT_FORMAT_STRING: 'dddd Do MMMM YYYY HH:mm:ss Z z',
/**
* @constant
* @default
*/
TIMEZONES: ["UTC"].concat(moment.tz.names()),
TIMEZONES: ['UTC'].concat(moment.tz.names()),
/**
* Translate DateTime Format operation.
@ -130,8 +130,8 @@ var DateTime = {
* @param {Object[]} args
* @returns {html}
*/
run_translate_format: function(input, args) {
var input_format = args[1],
run_translate_format(input, args) {
let input_format = args[1],
input_timezone = args[2],
output_format = args[3],
output_timezone = args[4],
@ -139,9 +139,9 @@ var DateTime = {
try {
date = moment.tz(input, input_format, input_timezone);
if (!date || date.format() == "Invalid date") throw Error;
if (!date || date.format() == 'Invalid date') throw Error;
} catch (err) {
return "Invalid format.\n\n" + DateTime.FORMAT_EXAMPLES;
return `Invalid format.\n\n${DateTime.FORMAT_EXAMPLES}`;
}
return date.tz(output_timezone).format(output_format);
@ -155,30 +155,30 @@ var DateTime = {
* @param {Object[]} args
* @returns {html}
*/
run_parse: function(input, args) {
var input_format = args[1],
run_parse(input, args) {
let input_format = args[1],
input_timezone = args[2],
date,
output = "";
output = '';
try {
date = moment.tz(input, input_format, input_timezone);
if (!date || date.format() == "Invalid date") throw Error;
if (!date || date.format() == 'Invalid date') throw Error;
} catch (err) {
return "Invalid format.\n\n" + DateTime.FORMAT_EXAMPLES;
return `Invalid format.\n\n${DateTime.FORMAT_EXAMPLES}`;
}
output += "Date: " + date.format("dddd Do MMMM YYYY") +
"\nTime: " + date.format("HH:mm:ss") +
"\nPeriod: " + date.format("A") +
"\nTimezone: " + date.format("z") +
"\nUTC offset: " + date.format("ZZ") +
"\n\nDaylight Saving Time: " + date.isDST() +
"\nLeap year: " + date.isLeapYear() +
"\nDays in this month: " + date.daysInMonth() +
"\n\nDay of year: " + date.dayOfYear() +
"\nWeek number: " + date.weekYear() +
"\nQuarter: " + date.quarter();
output += `Date: ${date.format('dddd Do MMMM YYYY')
}\nTime: ${date.format('HH:mm:ss')
}\nPeriod: ${date.format('A')
}\nTimezone: ${date.format('z')
}\nUTC offset: ${date.format('ZZ')
}\n\nDaylight Saving Time: ${date.isDST()
}\nLeap year: ${date.isLeapYear()
}\nDays in this month: ${date.daysInMonth()
}\n\nDay of year: ${date.dayOfYear()
}\nWeek number: ${date.weekYear()
}\nQuarter: ${date.quarter()}`;
return output;
},

View file

@ -7,13 +7,13 @@
*
* @namespace
*/
var Endian = {
const Endian = {
/**
* @constant
* @default
*/
DATA_FORMAT: ["Hex", "Raw"],
DATA_FORMAT: ['Hex', 'Raw'],
/**
* @constant
* @default
@ -32,8 +32,8 @@ var Endian = {
* @param {Object[]} args
* @returns {string}
*/
run_swap_endianness: function(input, args) {
var data_format = args[0],
run_swap_endianness(input, args) {
let data_format = args[0],
word_length = args[1],
pad_incomplete_words = args[2],
data = [],
@ -43,15 +43,15 @@ var Endian = {
j = 0;
if (word_length <= 0) {
return "Word length must be greater than 0";
return 'Word length must be greater than 0';
}
// Convert input to raw data based on specified data format
switch (data_format) {
case "Hex":
case 'Hex':
data = Utils.from_hex(input);
break;
case "Raw":
case 'Raw':
data = Utils.str_to_byte_array(input);
break;
default:
@ -60,7 +60,7 @@ var Endian = {
// Split up into words
for (i = 0; i < data.length; i += word_length) {
var word = data.slice(i, i + word_length);
const word = data.slice(i, i + word_length);
// Pad word if too short
if (pad_incomplete_words && word.length < word_length) {
@ -82,9 +82,9 @@ var Endian = {
// Convert data back to specified data format
switch (data_format) {
case "Hex":
case 'Hex':
return Utils.to_hex(result);
case "Raw":
case 'Raw':
return Utils.byte_array_to_utf8(result);
default:
return result;

View file

@ -7,7 +7,7 @@
*
* @namespace
*/
var Entropy = {
const Entropy = {
/**
* @constant
@ -22,21 +22,21 @@ var Entropy = {
* @param {Object[]} args
* @returns {html}
*/
run_entropy: function(input, args) {
var chunk_size = args[0],
output = "",
run_entropy(input, args) {
let chunk_size = args[0],
output = '',
entropy = Entropy._calc_entropy(input);
output += "Shannon entropy: " + entropy + "\n" +
"<br><canvas id='chart-area'></canvas><br>\n" +
"- 0 represents no randomness (i.e. all the bytes in the data have the same value) whereas 8, the maximum, represents a completely random string.\n" +
"- Standard English text usually falls somewhere between 3.5 and 5.\n" +
"- Properly encrypted or compressed data of a reasonable length should have an entropy of over 7.5.\n\n" +
"The following results show the entropy of chunks of the input data. Chunks with particularly high entropy could suggest encrypted or compressed sections.\n\n" +
"<br><script>\
output += `Shannon entropy: ${entropy}\n` +
'<br><canvas id=\'chart-area\'></canvas><br>\n' +
'- 0 represents no randomness (i.e. all the bytes in the data have the same value) whereas 8, the maximum, represents a completely random string.\n' +
'- Standard English text usually falls somewhere between 3.5 and 5.\n' +
'- Properly encrypted or compressed data of a reasonable length should have an entropy of over 7.5.\n\n' +
'The following results show the entropy of chunks of the input data. Chunks with particularly high entropy could suggest encrypted or compressed sections.\n\n' +
`<br><script>\
var canvas = document.getElementById('chart-area'),\
parent_rect = canvas.parentNode.getBoundingClientRect(),\
entropy = " + entropy + ",\
entropy = ${entropy},\
height = parent_rect.height * 0.25;\
\
canvas.width = parent_rect.width * 0.95;\
@ -53,16 +53,16 @@ var Entropy = {
max: 8\
}\
]);\
</script>";
</script>`;
var chunk_entropy = 0;
let chunk_entropy = 0;
if (chunk_size !== 0) {
for (var i = 0; i < input.length; i += chunk_size) {
for (let i = 0; i < input.length; i += chunk_size) {
chunk_entropy = Entropy._calc_entropy(input.slice(i, i + chunk_size));
output += "Bytes " + i + " to " + (i+chunk_size) + ": " + chunk_entropy + "\n";
output += `Bytes ${i} to ${i + chunk_size}: ${chunk_entropy}\n`;
}
} else {
output += "Chunk size cannot be 0.";
output += 'Chunk size cannot be 0.';
}
return output;
@ -82,10 +82,10 @@ var Entropy = {
* @param {Object[]} args
* @returns {html}
*/
run_freq_distrib: function (input, args) {
if (!input.length) return "No data";
run_freq_distrib(input, args) {
if (!input.length) return 'No data';
var distrib = new Array(256),
let distrib = new Array(256),
percentages = new Array(256),
len = input.length,
show_zeroes = args[0];
@ -101,34 +101,34 @@ var Entropy = {
}
// Calculate percentages
var repr = 0;
let repr = 0;
for (i = 0; i < 256; i++) {
if (distrib[i] > 0) repr++;
percentages[i] = distrib[i] / len * 100;
}
// Print
var output = "<canvas id='chart-area'></canvas><br>" +
"Total data length: " + len +
"\nNumber of bytes represented: " + repr +
"\nNumber of bytes not represented: " + (256-repr) +
"\n\nByte Percentage\n" +
"<script>\
let output = `${"<canvas id='chart-area'></canvas><br>" +
'Total data length: '}${len
}\nNumber of bytes represented: ${repr
}\nNumber of bytes not represented: ${256 - repr
}\n\nByte Percentage\n` +
`<script>\
var canvas = document.getElementById('chart-area'),\
parent_rect = canvas.parentNode.getBoundingClientRect(),\
scores = " + JSON.stringify(percentages) + ";\
scores = ${JSON.stringify(percentages)};\
\
canvas.width = parent_rect.width * 0.95;\
canvas.height = parent_rect.height * 0.9;\
\
CanvasComponents.draw_bar_chart(canvas, scores, 'Byte', 'Frequency %', 16, 6);\
</script>";
</script>`;
for (i = 0; i < 256; i++) {
if (distrib[i] || show_zeroes) {
output += " " + Utils.hex(i, 2) + " (" +
Utils.pad_right(percentages[i].toFixed(2).replace(".00", "") + "%)", 8) +
Array(Math.ceil(percentages[i])+1).join("|") + "\n";
output += ` ${Utils.hex(i, 2)} (${
Utils.pad_right(`${percentages[i].toFixed(2).replace('.00', '')}%)`, 8)
}${Array(Math.ceil(percentages[i]) + 1).join('|')}\n`;
}
}
@ -143,8 +143,8 @@ var Entropy = {
* @param {byte_array} data
* @returns {number}
*/
_calc_entropy: function(data) {
var prob = [],
_calc_entropy(data) {
let prob = [],
uniques = data.unique(),
str = Utils.byte_array_to_chars(data);
@ -152,7 +152,7 @@ var Entropy = {
prob.push(str.count(Utils.chr(uniques[i])) / data.length);
}
var entropy = 0,
let entropy = 0,
p;
for (i = 0; i < prob.length; i++) {

View file

@ -7,7 +7,7 @@
*
* @namespace
*/
var Extract = {
const Extract = {
/**
* Runs search operations across the input data using refular expressions.
@ -20,20 +20,22 @@ var Extract = {
* @param {boolean} include_total - Whether or not to include the total number of results
* @returns {string}
*/
_search: function(input, search_regex, remove_regex, include_total) {
var output = "",
_search(input, search_regex, remove_regex, include_total) {
let output = '',
total = 0,
match;
while (!!(match = search_regex.exec(input))) {
if (remove_regex && remove_regex.test(match[0]))
while (match = search_regex.exec(input)) {
if (remove_regex && remove_regex.test(match[0])) {
continue;
}
total++;
output += match[0] + "\n";
output += `${match[0]}\n`;
}
if (include_total)
output = "Total found: " + total + "\n\n" + output;
if (include_total) {
output = `Total found: ${total}\n\n${output}`;
}
return output;
},
@ -57,11 +59,11 @@ var Extract = {
* @param {Object[]} args
* @returns {string}
*/
run_strings: function(input, args) {
var min_len = args[0] || Extract.MIN_STRING_LEN,
run_strings(input, args) {
let min_len = args[0] || Extract.MIN_STRING_LEN,
display_total = args[1],
strings = "[A-Z\\d/\\-:.,_$%'\"()<>= !\\[\\]{}@]",
regex = new RegExp(strings + "{" + min_len + ",}", "ig");
regex = new RegExp(`${strings}{${min_len},}`, 'ig');
return Extract._search(input, regex, null, display_total);
},
@ -90,17 +92,17 @@ var Extract = {
* @param {Object[]} args
* @returns {string}
*/
run_ip: function(input, args) {
var include_ipv4 = args[0],
run_ip(input, args) {
let include_ipv4 = args[0],
include_ipv6 = args[1],
remove_local = args[2],
display_total = args[3],
ipv4 = "(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?",
ipv6 = "((?=.*::)(?!.*::.+::)(::)?([\\dA-F]{1,4}:(:|\\b)|){5}|([\\dA-F]{1,4}:){6})((([\\dA-F]{1,4}((?!\\3)::|:\\b|(?![\\dA-F])))|(?!\\2\\3)){2}|(((2[0-4]|1\\d|[1-9])?\\d|25[0-5])\\.?\\b){4})",
ips = "";
ipv4 = '(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?',
ipv6 = '((?=.*::)(?!.*::.+::)(::)?([\\dA-F]{1,4}:(:|\\b)|){5}|([\\dA-F]{1,4}:){6})((([\\dA-F]{1,4}((?!\\3)::|:\\b|(?![\\dA-F])))|(?!\\2\\3)){2}|(((2[0-4]|1\\d|[1-9])?\\d|25[0-5])\\.?\\b){4})',
ips = '';
if (include_ipv4 && include_ipv6) {
ips = ipv4 + "|" + ipv6;
ips = `${ipv4}|${ipv6}`;
} else if (include_ipv4) {
ips = ipv4;
} else if (include_ipv6) {
@ -108,22 +110,22 @@ var Extract = {
}
if (ips) {
var regex = new RegExp(ips, "ig");
const regex = new RegExp(ips, 'ig');
if (remove_local) {
var ten = "10\\..+",
oneninetwo = "192\\.168\\..+",
oneseventwo = "172\\.(?:1[6-9]|2\\d|3[01])\\..+",
onetwoseven = "127\\..+",
remove_regex = new RegExp("^(?:" + ten + "|" + oneninetwo +
"|" + oneseventwo + "|" + onetwoseven + ")");
let ten = '10\\..+',
oneninetwo = '192\\.168\\..+',
oneseventwo = '172\\.(?:1[6-9]|2\\d|3[01])\\..+',
onetwoseven = '127\\..+',
remove_regex = new RegExp(`^(?:${ten}|${oneninetwo
}|${oneseventwo}|${onetwoseven})`);
return Extract._search(input, regex, remove_regex, display_total);
} else {
return Extract._search(input, regex, null, display_total);
}
} else {
return "";
return '';
}
},
@ -135,8 +137,8 @@ var Extract = {
* @param {Object[]} args
* @returns {string}
*/
run_email: function(input, args) {
var display_total = args[0],
run_email(input, args) {
let display_total = args[0],
regex = /\w[-.\w]*@[-\w]+(?:\.[-\w]+)*\.[A-Z]{2,4}/ig;
return Extract._search(input, regex, null, display_total);
@ -150,8 +152,8 @@ var Extract = {
* @param {Object[]} args
* @returns {string}
*/
run_mac: function(input, args) {
var display_total = args[0],
run_mac(input, args) {
let display_total = args[0],
regex = /[A-F\d]{2}(?:[:-][A-F\d]{2}){5}/ig;
return Extract._search(input, regex, null, display_total);
@ -165,16 +167,16 @@ var Extract = {
* @param {Object[]} args
* @returns {string}
*/
run_urls: function(input, args) {
var display_total = args[0],
protocol = "[A-Z]+://",
hostname = "[-\\w]+(?:\\.\\w[-\\w]*)+",
port = ":\\d+",
run_urls(input, args) {
let display_total = args[0],
protocol = '[A-Z]+://',
hostname = '[-\\w]+(?:\\.\\w[-\\w]*)+',
port = ':\\d+',
path = "/[^.!,?;\"'<>()\\[\\]{}\\s\\x7F-\\xFF]*";
path += "(?:[.!,?]+[^.!,?;\"'<>()\\[\\]{}\\s\\x7F-\\xFF]+)*";
var regex = new RegExp(protocol + hostname + "(?:" + port +
")?(?:" + path + ")?", "ig");
const regex = new RegExp(`${protocol + hostname}(?:${port
})?(?:${path})?`, 'ig');
return Extract._search(input, regex, null, display_total);
},
@ -186,12 +188,12 @@ var Extract = {
* @param {Object[]} args
* @returns {string}
*/
run_domains: function(input, args) {
var display_total = args[0],
protocol = "https?://",
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)+",
regex = new RegExp("(?:" + protocol + ")?" + hostname + tld, "ig");
run_domains(input, args) {
let display_total = args[0],
protocol = 'https?://',
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)+',
regex = new RegExp(`(?:${protocol})?${hostname}${tld}`, 'ig');
return Extract._search(input, regex, null, display_total);
},
@ -215,20 +217,20 @@ var Extract = {
* @param {Object[]} args
* @returns {string}
*/
run_file_paths: function(input, args) {
var include_win_path = args[0],
run_file_paths(input, args) {
let include_win_path = args[0],
include_unix_path = args[1],
display_total = args[2],
win_drive = "[A-Z]:\\\\",
win_drive = '[A-Z]:\\\\',
win_name = "[A-Z\\d][A-Z\\d\\- '_\\(\\)]{0,61}",
win_ext = "[A-Z\\d]{1,6}",
win_path = win_drive + "(?:" + win_name + "\\\\?)*" + win_name +
"(?:\\." + win_ext + ")?",
unix_path = "(?:/[A-Z\\d.][A-Z\\d\\-.]{0,61})+",
file_paths = "";
win_ext = '[A-Z\\d]{1,6}',
win_path = `${win_drive}(?:${win_name}\\\\?)*${win_name
}(?:\\.${win_ext})?`,
unix_path = '(?:/[A-Z\\d.][A-Z\\d\\-.]{0,61})+',
file_paths = '';
if (include_win_path && include_unix_path) {
file_paths = win_path + "|" + unix_path;
file_paths = `${win_path}|${unix_path}`;
} else if (include_win_path) {
file_paths = win_path;
} else if (include_unix_path) {
@ -236,10 +238,10 @@ var Extract = {
}
if (file_paths) {
var regex = new RegExp(file_paths, "ig");
const regex = new RegExp(file_paths, 'ig');
return Extract._search(input, regex, null, display_total);
} else {
return "";
return '';
}
},
@ -251,12 +253,12 @@ var Extract = {
* @param {Object[]} args
* @returns {string}
*/
run_dates: function(input, args) {
var display_total = args[0],
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
date3 = "(?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])[- /.](?:19|20)\\d\\d", // mm/dd/yyyy
regex = new RegExp(date1 + "|" + date2 + "|" + date3, "ig");
run_dates(input, args) {
let display_total = args[0],
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
date3 = '(?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])[- /.](?:19|20)\\d\\d', // mm/dd/yyyy
regex = new RegExp(`${date1}|${date2}|${date3}`, 'ig');
return Extract._search(input, regex, null, display_total);
},
@ -269,27 +271,27 @@ var Extract = {
* @param {Object[]} args
* @returns {string}
*/
run_all_idents: function(input, args) {
var output = "";
output += "IP addresses\n";
run_all_idents(input, args) {
let output = '';
output += 'IP addresses\n';
output += Extract.run_ip(input, [true, true, false]);
output += "\nEmail addresses\n";
output += '\nEmail addresses\n';
output += Extract.run_email(input, []);
output += "\nMAC addresses\n";
output += '\nMAC addresses\n';
output += Extract.run_mac(input, []);
output += "\nURLs\n";
output += '\nURLs\n';
output += Extract.run_urls(input, []);
output += "\nDomain names\n";
output += '\nDomain names\n';
output += Extract.run_domains(input, []);
output += "\nFile paths\n";
output += '\nFile paths\n';
output += Extract.run_file_paths(input, [true, true]);
output += "\nDates\n";
output += '\nDates\n';
output += Extract.run_dates(input, []);
return output;
},

View file

@ -7,7 +7,7 @@
*
* @namespace
*/
var FileType = {
const FileType = {
/**
* Detect File Type operation.
@ -16,17 +16,17 @@ var FileType = {
* @param {Object[]} args
* @returns {string}
*/
run_detect: function(input, args) {
var type = FileType._magic_type(input);
run_detect(input, args) {
const type = FileType._magic_type(input);
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 {
var output = "File extension: " + type.ext + "\n" +
"MIME type: " + type.mime;
let output = `File extension: ${type.ext}\n` +
`MIME type: ${type.mime}`;
if (type.desc && type.desc.length) {
output += "\nDescription: " + type.desc;
output += `\nDescription: ${type.desc}`;
}
return output;
@ -47,15 +47,15 @@ var FileType = {
* @param {Object[]} args
* @returns {string}
*/
run_scan_for_embedded_files: 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",
run_scan_for_embedded_files(input, args) {
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,
ignore_common = args[0],
common_exts = ["ico", "ttf", ""],
common_exts = ['ico', 'ttf', ''],
num_found = 0,
num_common_found = 0;
for (var i = 0; i < input.length; i++) {
for (let i = 0; i < input.length; i++) {
type = FileType._magic_type(input.slice(i));
if (type) {
if (ignore_common && common_exts.indexOf(type.ext) > -1) {
@ -63,25 +63,25 @@ var FileType = {
continue;
}
num_found++;
output += "\nOffset " + i + " (0x" + Utils.hex(i) + "):\n" +
" File extension: " + type.ext + "\n" +
" MIME type: " + type.mime + "\n";
output += `\nOffset ${i} (0x${Utils.hex(i)}):\n` +
` File extension: ${type.ext}\n` +
` MIME type: ${type.mime}\n`;
if (type.desc && type.desc.length) {
output += " Description: " + type.desc + "\n";
output += ` Description: ${type.desc}\n`;
}
}
}
if (num_found === 0) {
output += "\nNo embedded files were found.";
output += '\nNo embedded files were found.';
}
if (num_common_found > 0) {
output += "\n\n" + num_common_found;
output += `\n\n${num_common_found}`;
output += num_common_found == 1 ?
" file type was detected that has a common byte sequence. This is likely to be a false positive." :
" file types were detected that have common byte sequences. These are likely to be false positives.";
' file type was detected that has a common byte sequence. This is likely to be a false positive.' :
' file types were detected that have common byte sequences. These are likely to be false positives.';
output += " Run this operation with the 'Ignore common byte sequences' option unchecked to see details.";
}
@ -100,7 +100,7 @@ var FileType = {
* @returns {string} type.mime - Mime type
* @returns {string} [type.desc] - Description
*/
_magic_type: function (buf) {
_magic_type(buf) {
if (!(buf && buf.length > 1)) {
return null;
}
@ -108,28 +108,28 @@ var FileType = {
if (buf[0] === 0xFF && buf[1] === 0xD8 && buf[2] === 0xFF) {
return {
ext: 'jpg',
mime: 'image/jpeg'
mime: 'image/jpeg',
};
}
if (buf[0] === 0x89 && buf[1] === 0x50 && buf[2] === 0x4E && buf[3] === 0x47) {
return {
ext: 'png',
mime: 'image/png'
mime: 'image/png',
};
}
if (buf[0] === 0x47 && buf[1] === 0x49 && buf[2] === 0x46) {
return {
ext: 'gif',
mime: 'image/gif'
mime: 'image/gif',
};
}
if (buf[8] === 0x57 && buf[9] === 0x45 && buf[10] === 0x42 && buf[11] === 0x50) {
return {
ext: 'webp',
mime: 'image/webp'
mime: 'image/webp',
};
}
@ -137,35 +137,35 @@ var FileType = {
if (((buf[0] === 0x49 && buf[1] === 0x49 && buf[2] === 0x2A && buf[3] === 0x0) || (buf[0] === 0x4D && buf[1] === 0x4D && buf[2] === 0x0 && buf[3] === 0x2A)) && buf[8] === 0x43 && buf[9] === 0x52) {
return {
ext: 'cr2',
mime: 'image/x-canon-cr2'
mime: 'image/x-canon-cr2',
};
}
if ((buf[0] === 0x49 && buf[1] === 0x49 && buf[2] === 0x2A && buf[3] === 0x0) || (buf[0] === 0x4D && buf[1] === 0x4D && buf[2] === 0x0 && buf[3] === 0x2A)) {
return {
ext: 'tif',
mime: 'image/tiff'
mime: 'image/tiff',
};
}
if (buf[0] === 0x42 && buf[1] === 0x4D) {
return {
ext: 'bmp',
mime: 'image/bmp'
mime: 'image/bmp',
};
}
if (buf[0] === 0x49 && buf[1] === 0x49 && buf[2] === 0xBC) {
return {
ext: 'jxr',
mime: 'image/vnd.ms-photo'
mime: 'image/vnd.ms-photo',
};
}
if (buf[0] === 0x38 && buf[1] === 0x42 && buf[2] === 0x50 && buf[3] === 0x53) {
return {
ext: 'psd',
mime: 'image/vnd.adobe.photoshop'
mime: 'image/vnd.adobe.photoshop',
};
}
@ -173,77 +173,77 @@ var FileType = {
if (buf[0] === 0x50 && buf[1] === 0x4B && buf[2] === 0x3 && buf[3] === 0x4 && buf[30] === 0x6D && buf[31] === 0x69 && buf[32] === 0x6D && buf[33] === 0x65 && buf[34] === 0x74 && buf[35] === 0x79 && buf[36] === 0x70 && buf[37] === 0x65 && buf[38] === 0x61 && buf[39] === 0x70 && buf[40] === 0x70 && buf[41] === 0x6C && buf[42] === 0x69 && buf[43] === 0x63 && buf[44] === 0x61 && buf[45] === 0x74 && buf[46] === 0x69 && buf[47] === 0x6F && buf[48] === 0x6E && buf[49] === 0x2F && buf[50] === 0x65 && buf[51] === 0x70 && buf[52] === 0x75 && buf[53] === 0x62 && buf[54] === 0x2B && buf[55] === 0x7A && buf[56] === 0x69 && buf[57] === 0x70) {
return {
ext: 'epub',
mime: 'application/epub+zip'
mime: 'application/epub+zip',
};
}
if (buf[0] === 0x50 && buf[1] === 0x4B && (buf[2] === 0x3 || buf[2] === 0x5 || buf[2] === 0x7) && (buf[3] === 0x4 || buf[3] === 0x6 || buf[3] === 0x8)) {
return {
ext: 'zip',
mime: 'application/zip'
mime: 'application/zip',
};
}
if (buf[257] === 0x75 && buf[258] === 0x73 && buf[259] === 0x74 && buf[260] === 0x61 && buf[261] === 0x72) {
return {
ext: 'tar',
mime: 'application/x-tar'
mime: 'application/x-tar',
};
}
if (buf[0] === 0x52 && buf[1] === 0x61 && buf[2] === 0x72 && buf[3] === 0x21 && buf[4] === 0x1A && buf[5] === 0x7 && (buf[6] === 0x0 || buf[6] === 0x1)) {
return {
ext: 'rar',
mime: 'application/x-rar-compressed'
mime: 'application/x-rar-compressed',
};
}
if (buf[0] === 0x1F && buf[1] === 0x8B && buf[2] === 0x8) {
return {
ext: 'gz',
mime: 'application/gzip'
mime: 'application/gzip',
};
}
if (buf[0] === 0x42 && buf[1] === 0x5A && buf[2] === 0x68) {
return {
ext: 'bz2',
mime: 'application/x-bzip2'
mime: 'application/x-bzip2',
};
}
if (buf[0] === 0x37 && buf[1] === 0x7A && buf[2] === 0xBC && buf[3] === 0xAF && buf[4] === 0x27 && buf[5] === 0x1C) {
return {
ext: '7z',
mime: 'application/x-7z-compressed'
mime: 'application/x-7z-compressed',
};
}
if (buf[0] === 0x78 && buf[1] === 0x01) {
return {
ext: 'dmg',
mime: 'application/x-apple-diskimage'
mime: 'application/x-apple-diskimage',
};
}
if ((buf[0] === 0x0 && buf[1] === 0x0 && buf[2] === 0x0 && (buf[3] === 0x18 || buf[3] === 0x20) && buf[4] === 0x66 && buf[5] === 0x74 && buf[6] === 0x79 && buf[7] === 0x70) || (buf[0] === 0x33 && buf[1] === 0x67 && buf[2] === 0x70 && buf[3] === 0x35) || (buf[0] === 0x0 && buf[1] === 0x0 && buf[2] === 0x0 && buf[3] === 0x1C && buf[4] === 0x66 && buf[5] === 0x74 && buf[6] === 0x79 && buf[7] === 0x70 && buf[8] === 0x6D && buf[9] === 0x70 && buf[10] === 0x34 && buf[11] === 0x32 && buf[16] === 0x6D && buf[17] === 0x70 && buf[18] === 0x34 && buf[19] === 0x31 && buf[20] === 0x6D && buf[21] === 0x70 && buf[22] === 0x34 && buf[23] === 0x32 && buf[24] === 0x69 && buf[25] === 0x73 && buf[26] === 0x6F && buf[27] === 0x6D)) {
return {
ext: 'mp4',
mime: 'video/mp4'
mime: 'video/mp4',
};
}
if ((buf[0] === 0x0 && buf[1] === 0x0 && buf[2] === 0x0 && buf[3] === 0x1C && buf[4] === 0x66 && buf[5] === 0x74 && buf[6] === 0x79 && buf[7] === 0x70 && buf[8] === 0x4D && buf[9] === 0x34 && buf[10] === 0x56)) {
return {
ext: 'm4v',
mime: 'video/x-m4v'
mime: 'video/x-m4v',
};
}
if (buf[0] === 0x4D && buf[1] === 0x54 && buf[2] === 0x68 && buf[3] === 0x64) {
return {
ext: 'mid',
mime: 'audio/midi'
mime: 'audio/midi',
};
}
@ -251,182 +251,182 @@ var FileType = {
if (buf[31] === 0x6D && buf[32] === 0x61 && buf[33] === 0x74 && buf[34] === 0x72 && buf[35] === 0x6f && buf[36] === 0x73 && buf[37] === 0x6B && buf[38] === 0x61) {
return {
ext: 'mkv',
mime: 'video/x-matroska'
mime: 'video/x-matroska',
};
}
if (buf[0] === 0x1A && buf[1] === 0x45 && buf[2] === 0xDF && buf[3] === 0xA3) {
return {
ext: 'webm',
mime: 'video/webm'
mime: 'video/webm',
};
}
if (buf[0] === 0x0 && buf[1] === 0x0 && buf[2] === 0x0 && buf[3] === 0x14 && buf[4] === 0x66 && buf[5] === 0x74 && buf[6] === 0x79 && buf[7] === 0x70) {
return {
ext: 'mov',
mime: 'video/quicktime'
mime: 'video/quicktime',
};
}
if (buf[0] === 0x52 && buf[1] === 0x49 && buf[2] === 0x46 && buf[3] === 0x46 && buf[8] === 0x41 && buf[9] === 0x56 && buf[10] === 0x49) {
return {
ext: 'avi',
mime: 'video/x-msvideo'
mime: 'video/x-msvideo',
};
}
if (buf[0] === 0x30 && buf[1] === 0x26 && buf[2] === 0xB2 && buf[3] === 0x75 && buf[4] === 0x8E && buf[5] === 0x66 && buf[6] === 0xCF && buf[7] === 0x11 && buf[8] === 0xA6 && buf[9] === 0xD9) {
return {
ext: 'wmv',
mime: 'video/x-ms-wmv'
mime: 'video/x-ms-wmv',
};
}
if (buf[0] === 0x0 && buf[1] === 0x0 && buf[2] === 0x1 && buf[3].toString(16)[0] === 'b') {
return {
ext: 'mpg',
mime: 'video/mpeg'
mime: 'video/mpeg',
};
}
if ((buf[0] === 0x49 && buf[1] === 0x44 && buf[2] === 0x33) || (buf[0] === 0xFF && buf[1] === 0xfb)) {
return {
ext: 'mp3',
mime: 'audio/mpeg'
mime: 'audio/mpeg',
};
}
if ((buf[4] === 0x66 && buf[5] === 0x74 && buf[6] === 0x79 && buf[7] === 0x70 && buf[8] === 0x4D && buf[9] === 0x34 && buf[10] === 0x41) || (buf[0] === 0x4D && buf[1] === 0x34 && buf[2] === 0x41 && buf[3] === 0x20)) {
return {
ext: 'm4a',
mime: 'audio/m4a'
mime: 'audio/m4a',
};
}
if (buf[0] === 0x4F && buf[1] === 0x67 && buf[2] === 0x67 && buf[3] === 0x53) {
return {
ext: 'ogg',
mime: 'audio/ogg'
mime: 'audio/ogg',
};
}
if (buf[0] === 0x66 && buf[1] === 0x4C && buf[2] === 0x61 && buf[3] === 0x43) {
return {
ext: 'flac',
mime: 'audio/x-flac'
mime: 'audio/x-flac',
};
}
if (buf[0] === 0x52 && buf[1] === 0x49 && buf[2] === 0x46 && buf[3] === 0x46 && buf[8] === 0x57 && buf[9] === 0x41 && buf[10] === 0x56 && buf[11] === 0x45) {
return {
ext: 'wav',
mime: 'audio/x-wav'
mime: 'audio/x-wav',
};
}
if (buf[0] === 0x23 && buf[1] === 0x21 && buf[2] === 0x41 && buf[3] === 0x4D && buf[4] === 0x52 && buf[5] === 0x0A) {
return {
ext: 'amr',
mime: 'audio/amr'
mime: 'audio/amr',
};
}
if (buf[0] === 0x25 && buf[1] === 0x50 && buf[2] === 0x44 && buf[3] === 0x46) {
return {
ext: 'pdf',
mime: 'application/pdf'
mime: 'application/pdf',
};
}
if (buf[0] === 0x4D && buf[1] === 0x5A) {
return {
ext: 'exe',
mime: 'application/x-msdownload'
mime: 'application/x-msdownload',
};
}
if ((buf[0] === 0x43 || buf[0] === 0x46) && buf[1] === 0x57 && buf[2] === 0x53) {
return {
ext: 'swf',
mime: 'application/x-shockwave-flash'
mime: 'application/x-shockwave-flash',
};
}
if (buf[0] === 0x7B && buf[1] === 0x5C && buf[2] === 0x72 && buf[3] === 0x74 && buf[4] === 0x66) {
return {
ext: 'rtf',
mime: 'application/rtf'
mime: 'application/rtf',
};
}
if (buf[0] === 0x77 && buf[1] === 0x4F && buf[2] === 0x46 && buf[3] === 0x46 && buf[4] === 0x00 && buf[5] === 0x01 && buf[6] === 0x00 && buf[7] === 0x00) {
return {
ext: 'woff',
mime: 'application/font-woff'
mime: 'application/font-woff',
};
}
if (buf[0] === 0x77 && buf[1] === 0x4F && buf[2] === 0x46 && buf[3] === 0x32 && buf[4] === 0x00 && buf[5] === 0x01 && buf[6] === 0x00 && buf[7] === 0x00) {
return {
ext: 'woff2',
mime: 'application/font-woff'
mime: 'application/font-woff',
};
}
if (buf[34] === 0x4C && buf[35] === 0x50 && ((buf[8] === 0x02 && buf[9] === 0x00 && buf[10] === 0x01) || (buf[8] === 0x01 && buf[9] === 0x00 && buf[10] === 0x00) || (buf[8] === 0x02 && buf[9] === 0x00 && buf[10] === 0x02))) {
return {
ext: 'eot',
mime: 'application/octet-stream'
mime: 'application/octet-stream',
};
}
if (buf[0] === 0x00 && buf[1] === 0x01 && buf[2] === 0x00 && buf[3] === 0x00 && buf[4] === 0x00) {
return {
ext: 'ttf',
mime: 'application/font-sfnt'
mime: 'application/font-sfnt',
};
}
if (buf[0] === 0x4F && buf[1] === 0x54 && buf[2] === 0x54 && buf[3] === 0x4F && buf[4] === 0x00) {
return {
ext: 'otf',
mime: 'application/font-sfnt'
mime: 'application/font-sfnt',
};
}
if (buf[0] === 0x00 && buf[1] === 0x00 && buf[2] === 0x01 && buf[3] === 0x00) {
return {
ext: 'ico',
mime: 'image/x-icon'
mime: 'image/x-icon',
};
}
if (buf[0] === 0x46 && buf[1] === 0x4C && buf[2] === 0x56 && buf[3] === 0x01) {
return {
ext: 'flv',
mime: 'video/x-flv'
mime: 'video/x-flv',
};
}
if (buf[0] === 0x25 && buf[1] === 0x21) {
return {
ext: 'ps',
mime: 'application/postscript'
mime: 'application/postscript',
};
}
if (buf[0] === 0xFD && buf[1] === 0x37 && buf[2] === 0x7A && buf[3] === 0x58 && buf[4] === 0x5A && buf[5] === 0x00) {
return {
ext: 'xz',
mime: 'application/x-xz'
mime: 'application/x-xz',
};
}
if (buf[0] === 0x53 && buf[1] === 0x51 && buf[2] === 0x4C && buf[3] === 0x69) {
return {
ext: 'sqlite',
mime: 'application/x-sqlite3'
mime: 'application/x-sqlite3',
};
}
@ -435,7 +435,7 @@ var FileType = {
if ((buf[0] === 0x1F && buf[1] === 0x9D) || (buf[0] === 0x1F && buf[1] === 0xA0)) {
return {
ext: 'z, tar.z',
mime: 'application/x-gtar'
mime: 'application/x-gtar',
};
}
@ -443,14 +443,14 @@ var FileType = {
return {
ext: 'none, axf, bin, elf, o, prx, puff, so',
mime: 'application/x-executable',
desc: 'Executable and Linkable Format file. No standard file extension.'
desc: 'Executable and Linkable Format file. No standard file extension.',
};
}
if (buf[0] === 0xCA && buf[1] === 0xFE && buf[2] === 0xBA && buf[3] === 0xBE) {
return {
ext: 'class',
mime: 'application/java-vm'
mime: 'application/java-vm',
};
}
@ -458,7 +458,7 @@ var FileType = {
return {
ext: 'txt',
mime: 'text/plain',
desc: 'UTF-8 encoded Unicode byte order mark detected, commonly but not exclusively seen in text files.'
desc: 'UTF-8 encoded Unicode byte order mark detected, commonly but not exclusively seen in text files.',
};
}
@ -467,7 +467,7 @@ var FileType = {
return {
ext: '',
mime: '',
desc: 'Little-endian UTF-32 encoded Unicode byte order mark detected.'
desc: 'Little-endian UTF-32 encoded Unicode byte order mark detected.',
};
}
@ -475,7 +475,7 @@ var FileType = {
return {
ext: '',
mime: '',
desc: 'Little-endian UTF-16 encoded Unicode byte order mark detected.'
desc: 'Little-endian UTF-16 encoded Unicode byte order mark detected.',
};
}
@ -485,7 +485,7 @@ var FileType = {
return {
ext: 'iso',
mime: 'application/octet-stream',
desc: 'ISO 9660 CD/DVD image file'
desc: 'ISO 9660 CD/DVD image file',
};
}
@ -493,7 +493,7 @@ var FileType = {
return {
ext: 'doc, xls, ppt',
mime: 'application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint',
desc: 'Microsoft Office documents'
desc: 'Microsoft Office documents',
};
}
@ -501,14 +501,14 @@ var FileType = {
return {
ext: 'dex',
mime: 'application/octet-stream',
desc: 'Dalvik Executable (Android)'
desc: 'Dalvik Executable (Android)',
};
}
if (buf[0] === 0x4B && buf[1] === 0x44 && buf[2] === 0x4D) {
return {
ext: 'vmdk',
mime: 'application/vmdk, application/x-virtualbox-vmdk'
mime: 'application/vmdk, application/x-virtualbox-vmdk',
};
}
@ -516,7 +516,7 @@ var FileType = {
return {
ext: 'crx',
mime: 'application/crx',
desc: 'Google Chrome extension or packaged app'
desc: 'Google Chrome extension or packaged app',
};
}

File diff suppressed because it is too large Load diff

View file

@ -9,7 +9,7 @@
*
* @namespace
*/
var HTTP = {
const HTTP = {
/**
* Strip HTTP headers operation.
@ -18,9 +18,9 @@ var HTTP = {
* @param {Object[]} args
* @returns {string}
*/
run_strip_headers: function(input, args) {
var header_end = input.indexOf("\r\n\r\n") +
(header_end < 0) ? input.indexOf("\n\n") + 2 : header_end + 4;
run_strip_headers(input, args) {
const header_end = input.indexOf('\r\n\r\n') +
(header_end < 0) ? input.indexOf('\n\n') + 2 : header_end + 4;
return (header_end < 2) ? input : input.slice(header_end, input.length);
},
@ -33,21 +33,21 @@ var HTTP = {
* @param {Object[]} args
* @returns {string}
*/
run_parse_user_agent: function(input, args) {
var ua = UAS_parser.parse(input);
run_parse_user_agent(input, args) {
const ua = UAS_parser.parse(input);
return "Type: " + ua.type + "\n" +
"Family: " + ua.uaFamily + "\n" +
"Name: " + ua.uaName + "\n" +
"URL: " + ua.uaUrl + "\n" +
"Company: " + ua.uaCompany + "\n" +
"Company URL: " + ua.uaCompanyUrl + "\n\n" +
"OS Family: " + ua.osFamily + "\n" +
"OS Name: " + ua.osName + "\n" +
"OS URL: " + ua.osUrl + "\n" +
"OS Company: " + ua.osCompany + "\n" +
"OS Company URL: " + ua.osCompanyUrl + "\n" +
"Device Type: " + ua.deviceType + "\n";
return `Type: ${ua.type}\n` +
`Family: ${ua.uaFamily}\n` +
`Name: ${ua.uaName}\n` +
`URL: ${ua.uaUrl}\n` +
`Company: ${ua.uaCompany}\n` +
`Company URL: ${ua.uaCompanyUrl}\n\n` +
`OS Family: ${ua.osFamily}\n` +
`OS Name: ${ua.osName}\n` +
`OS URL: ${ua.osUrl}\n` +
`OS Company: ${ua.osCompany}\n` +
`OS Company URL: ${ua.osCompanyUrl}\n` +
`Device Type: ${ua.deviceType}\n`;
},
};

View file

@ -9,7 +9,7 @@
*
* @namespace
*/
var Hash = {
const Hash = {
/**
* MD5 operation.
@ -18,7 +18,7 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_md5: function (input, args) {
run_md5(input, args) {
input = CryptoJS.enc.Latin1.parse(input); // Cast to WordArray
return CryptoJS.MD5(input).toString(CryptoJS.enc.Hex);
},
@ -31,7 +31,7 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_sha1: function (input, args) {
run_sha1(input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA1(input).toString(CryptoJS.enc.Hex);
},
@ -44,7 +44,7 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_sha224: function (input, args) {
run_sha224(input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA224(input).toString(CryptoJS.enc.Hex);
},
@ -57,7 +57,7 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_sha256: function (input, args) {
run_sha256(input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA256(input).toString(CryptoJS.enc.Hex);
},
@ -70,7 +70,7 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_sha384: function (input, args) {
run_sha384(input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA384(input).toString(CryptoJS.enc.Hex);
},
@ -83,7 +83,7 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_sha512: function (input, args) {
run_sha512(input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA512(input).toString(CryptoJS.enc.Hex);
},
@ -93,7 +93,7 @@ var Hash = {
* @constant
* @default
*/
SHA3_LENGTH: ["512", "384", "256", "224"],
SHA3_LENGTH: ['512', '384', '256', '224'],
/**
* SHA3 operation.
@ -102,11 +102,11 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_sha3: function (input, args) {
run_sha3(input, args) {
input = CryptoJS.enc.Latin1.parse(input);
var sha3_length = args[0],
let sha3_length = args[0],
options = {
outputLength: parseInt(sha3_length, 10)
outputLength: parseInt(sha3_length, 10),
};
return CryptoJS.SHA3(input, options).toString(CryptoJS.enc.Hex);
},
@ -119,7 +119,7 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_ripemd160: function (input, args) {
run_ripemd160(input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.RIPEMD160(input).toString(CryptoJS.enc.Hex);
},
@ -129,7 +129,7 @@ var Hash = {
* @constant
* @default
*/
HMAC_FUNCTIONS: ["MD5", "SHA1", "SHA224", "SHA256", "SHA384", "SHA512", "SHA3", "RIPEMD-160"],
HMAC_FUNCTIONS: ['MD5', 'SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512', 'SHA3', 'RIPEMD-160'],
/**
* HMAC operation.
@ -138,18 +138,18 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_hmac: function (input, args) {
var hash_func = args[1];
run_hmac(input, args) {
const hash_func = args[1];
input = CryptoJS.enc.Latin1.parse(input);
var execute = {
"MD5": CryptoJS.HmacMD5(input, args[0]),
"SHA1": CryptoJS.HmacSHA1(input, args[0]),
"SHA224": CryptoJS.HmacSHA224(input, args[0]),
"SHA256": CryptoJS.HmacSHA256(input, args[0]),
"SHA384": CryptoJS.HmacSHA384(input, args[0]),
"SHA512": CryptoJS.HmacSHA512(input, args[0]),
"SHA3": CryptoJS.HmacSHA3(input, args[0]),
"RIPEMD-160": CryptoJS.HmacRIPEMD160(input, args[0]),
const execute = {
MD5: CryptoJS.HmacMD5(input, args[0]),
SHA1: CryptoJS.HmacSHA1(input, args[0]),
SHA224: CryptoJS.HmacSHA224(input, args[0]),
SHA256: CryptoJS.HmacSHA256(input, args[0]),
SHA384: CryptoJS.HmacSHA384(input, args[0]),
SHA512: CryptoJS.HmacSHA512(input, args[0]),
SHA3: CryptoJS.HmacSHA3(input, args[0]),
'RIPEMD-160': CryptoJS.HmacRIPEMD160(input, args[0]),
};
return execute[hash_func].toString(CryptoJS.enc.Hex);
},
@ -162,23 +162,23 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_all: function (input, args) {
var byte_array = Utils.str_to_byte_array(input),
output = "MD5: " + Hash.run_md5(input, []) +
"\nSHA1: " + Hash.run_sha1(input, []) +
"\nSHA2 224: " + Hash.run_sha224(input, []) +
"\nSHA2 256: " + Hash.run_sha256(input, []) +
"\nSHA2 384: " + Hash.run_sha384(input, []) +
"\nSHA2 512: " + Hash.run_sha512(input, []) +
"\nSHA3 224: " + Hash.run_sha3(input, ["224"]) +
"\nSHA3 256: " + Hash.run_sha3(input, ["256"]) +
"\nSHA3 384: " + Hash.run_sha3(input, ["384"]) +
"\nSHA3 512: " + Hash.run_sha3(input, ["512"]) +
"\nRIPEMD-160: " + Hash.run_ripemd160(input, []) +
"\n\nChecksums:" +
"\nFletcher-16: " + Checksum.run_fletcher16(byte_array, []) +
"\nAdler-32: " + Checksum.run_adler32(byte_array, []) +
"\nCRC-32: " + Checksum.run_crc32(byte_array, []);
run_all(input, args) {
let byte_array = Utils.str_to_byte_array(input),
output = `MD5: ${Hash.run_md5(input, [])
}\nSHA1: ${Hash.run_sha1(input, [])
}\nSHA2 224: ${Hash.run_sha224(input, [])
}\nSHA2 256: ${Hash.run_sha256(input, [])
}\nSHA2 384: ${Hash.run_sha384(input, [])
}\nSHA2 512: ${Hash.run_sha512(input, [])
}\nSHA3 224: ${Hash.run_sha3(input, ['224'])
}\nSHA3 256: ${Hash.run_sha3(input, ['256'])
}\nSHA3 384: ${Hash.run_sha3(input, ['384'])
}\nSHA3 512: ${Hash.run_sha3(input, ['512'])
}\nRIPEMD-160: ${Hash.run_ripemd160(input, [])
}\n\nChecksums:` +
`\nFletcher-16: ${Checksum.run_fletcher16(byte_array, [])
}\nAdler-32: ${Checksum.run_adler32(byte_array, [])
}\nCRC-32: ${Checksum.run_crc32(byte_array, [])}`;
return output;
},
@ -191,151 +191,151 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_analyse: function(input, args) {
input = input.replace(/\s/g, "");
run_analyse(input, args) {
input = input.replace(/\s/g, '');
var output = "",
let output = '',
byte_length = input.length / 2,
bit_length = byte_length * 8,
possible_hash_functions = [];
if (!/^[a-f0-9]+$/i.test(input)) {
return "Invalid hash";
return 'Invalid hash';
}
output += "Hash length: " + input.length + "\n" +
"Byte length: " + byte_length + "\n" +
"Bit length: " + bit_length + "\n\n" +
"Based on the length, this hash could have been generated by one of the following hashing functions:\n";
output += `Hash length: ${input.length}\n` +
`Byte length: ${byte_length}\n` +
`Bit length: ${bit_length}\n\n` +
'Based on the length, this hash could have been generated by one of the following hashing functions:\n';
switch (bit_length) {
case 4:
possible_hash_functions = [
"Fletcher-4",
"Luhn algorithm",
"Verhoeff algorithm",
'Fletcher-4',
'Luhn algorithm',
'Verhoeff algorithm',
];
break;
case 8:
possible_hash_functions = [
"Fletcher-8",
'Fletcher-8',
];
break;
case 16:
possible_hash_functions = [
"BSD checksum",
"CRC-16",
"SYSV checksum",
"Fletcher-16"
'BSD checksum',
'CRC-16',
'SYSV checksum',
'Fletcher-16',
];
break;
case 32:
possible_hash_functions = [
"CRC-32",
"Fletcher-32",
"Adler-32",
'CRC-32',
'Fletcher-32',
'Adler-32',
];
break;
case 64:
possible_hash_functions = [
"CRC-64",
"RIPEMD-64",
"SipHash",
'CRC-64',
'RIPEMD-64',
'SipHash',
];
break;
case 128:
possible_hash_functions = [
"MD5",
"MD4",
"MD2",
"HAVAL-128",
"RIPEMD-128",
"Snefru",
"Tiger-128",
'MD5',
'MD4',
'MD2',
'HAVAL-128',
'RIPEMD-128',
'Snefru',
'Tiger-128',
];
break;
case 160:
possible_hash_functions = [
"SHA-1",
"SHA-0",
"FSB-160",
"HAS-160",
"HAVAL-160",
"RIPEMD-160",
"Tiger-160",
'SHA-1',
'SHA-0',
'FSB-160',
'HAS-160',
'HAVAL-160',
'RIPEMD-160',
'Tiger-160',
];
break;
case 192:
possible_hash_functions = [
"Tiger",
"HAVAL-192",
'Tiger',
'HAVAL-192',
];
break;
case 224:
possible_hash_functions = [
"SHA-224",
"SHA3-224",
"ECOH-224",
"FSB-224",
"HAVAL-224",
'SHA-224',
'SHA3-224',
'ECOH-224',
'FSB-224',
'HAVAL-224',
];
break;
case 256:
possible_hash_functions = [
"SHA-256",
"SHA3-256",
"BLAKE-256",
"ECOH-256",
"FSB-256",
"GOST",
"Grøstl-256",
"HAVAL-256",
"PANAMA",
"RIPEMD-256",
"Snefru",
'SHA-256',
'SHA3-256',
'BLAKE-256',
'ECOH-256',
'FSB-256',
'GOST',
'Grøstl-256',
'HAVAL-256',
'PANAMA',
'RIPEMD-256',
'Snefru',
];
break;
case 320:
possible_hash_functions = [
"RIPEMD-320",
'RIPEMD-320',
];
break;
case 384:
possible_hash_functions = [
"SHA-384",
"SHA3-384",
"ECOH-384",
"FSB-384",
'SHA-384',
'SHA3-384',
'ECOH-384',
'FSB-384',
];
break;
case 512:
possible_hash_functions = [
"SHA-512",
"SHA3-512",
"BLAKE-512",
"ECOH-512",
"FSB-512",
"Grøstl-512",
"JH",
"MD6",
"Spectral Hash",
"SWIFFT",
"Whirlpool",
'SHA-512',
'SHA3-512',
'BLAKE-512',
'ECOH-512',
'FSB-512',
'Grøstl-512',
'JH',
'MD6',
'Spectral Hash',
'SWIFFT',
'Whirlpool',
];
break;
case 1024:
possible_hash_functions = [
"Fowler-Noll-Vo",
'Fowler-Noll-Vo',
];
break;
default:
possible_hash_functions = [
"Unknown"
'Unknown',
];
break;
}
return output + possible_hash_functions.join("\n");
return output + possible_hash_functions.join('\n');
},
};

View file

@ -9,7 +9,7 @@
*
* @namespace
*/
var Hexdump = {
const Hexdump = {
/**
* @constant
@ -34,32 +34,33 @@ var Hexdump = {
* @param {Object[]} args
* @returns {string}
*/
run_to: function(input, args) {
var length = args[0] || Hexdump.WIDTH;
var upper_case = args[1];
var include_final_length = args[2];
run_to(input, args) {
const length = args[0] || Hexdump.WIDTH;
const upper_case = args[1];
const include_final_length = args[2];
var output = "", padding = 2;
for (var i = 0; i < input.length; i += length) {
var buff = input.slice(i, i+length);
var hexa = "";
for (var j = 0; j < buff.length; j++) {
hexa += Utils.hex(buff[j], padding) + " ";
let output = '',
padding = 2;
for (let i = 0; i < input.length; i += length) {
const buff = input.slice(i, i + length);
let hexa = '';
for (let j = 0; j < buff.length; j++) {
hexa += `${Utils.hex(buff[j], padding)} `;
}
var line_no = Utils.hex(i, 8);
let line_no = Utils.hex(i, 8);
if (upper_case) {
hexa = hexa.toUpperCase();
line_no = line_no.toUpperCase();
}
output += line_no + " " +
Utils.pad_right(hexa, (length*(padding+1))) +
" |" + Utils.pad_right(Utils.printable(Utils.byte_array_to_chars(buff)), buff.length) + "|\n";
output += `${line_no} ${
Utils.pad_right(hexa, (length * (padding + 1)))
} |${Utils.pad_right(Utils.printable(Utils.byte_array_to_chars(buff)), buff.length)}|\n`;
if (include_final_length && i + buff.length == input.length) {
output += Utils.hex(i+buff.length, 8) + "\n";
output += `${Utils.hex(i + buff.length, 8)}\n`;
}
}
@ -74,22 +75,23 @@ var Hexdump = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_from: function(input, args) {
var output = [],
run_from(input, args) {
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,
block, line;
block,
line;
while (!!(block = regex.exec(input))) {
line = Utils.from_hex(block[1].replace(/-/g, " "));
for (var i = 0; i < line.length; i++) {
while (block = regex.exec(input)) {
line = Utils.from_hex(block[1].replace(/-/g, ' '));
for (let i = 0; i < line.length; i++) {
output.push(line[i]);
}
}
// Is this a CyberChef hexdump or is it from a different tool?
var width = input.indexOf("\n");
var w = (width - 13) / 4;
const width = input.indexOf('\n');
const w = (width - 13) / 4;
// 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) {
app.options.attempt_highlight = false;
}
return output;
@ -105,9 +107,9 @@ var Hexdump = {
* @param {Object[]} args
* @returns {Object[]} pos
*/
highlight_to: function(pos, args) {
highlight_to(pos, args) {
// Calculate overall selection
var w = args[0] || 16,
let w = args[0] || 16,
width = 14 + (w * 4),
line = Math.floor(pos[0].start / w),
offset = pos[0].start % w,
@ -122,33 +124,34 @@ var Hexdump = {
pos[0].end = line * width + 10 + offset * 3 - 1;
// Set up multiple selections for bytes
var start_line_num = Math.floor(pos[0].start / width);
var end_line_num = Math.floor(pos[0].end / width);
let start_line_num = Math.floor(pos[0].start / width);
const end_line_num = Math.floor(pos[0].end / width);
if (start_line_num == end_line_num) {
pos.push(pos[0]);
} else {
start = pos[0].start;
end = (start_line_num + 1) * width - w - 5;
pos.push({ start: start, end: end });
pos.push({ start, end });
while (end < pos[0].end) {
start_line_num++;
start = start_line_num * width + 10;
end = (start_line_num + 1) * width - w - 5;
if (end > pos[0].end) end = pos[0].end;
pos.push({ start: start, end: end });
pos.push({ start, end });
}
}
// Set up multiple selections for ASCII
var len = pos.length, line_num = 0;
let len = pos.length,
line_num = 0;
start = 0;
end = 0;
for (var i = 1; i < len; i++) {
for (let i = 1; i < len; i++) {
line_num = Math.floor(pos[i].start / width);
start = (((pos[i].start - (line_num * width)) - 10) / 3) + (width - w - 2) + (line_num * width);
end = (((pos[i].end + 1 - (line_num * width)) - 10) / 3) + (width - w - 2) + (line_num * width);
pos.push({ start: start, end: end });
pos.push({ start, end });
}
return pos;
},
@ -163,12 +166,12 @@ var Hexdump = {
* @param {Object[]} args
* @returns {Object[]} pos
*/
highlight_from: function(pos, args) {
var w = args[0] || 16;
var width = 14 + (w*4);
highlight_from(pos, args) {
const w = args[0] || 16;
const width = 14 + (w * 4);
var line = Math.floor(pos[0].start / width);
var offset = pos[0].start % width;
let line = Math.floor(pos[0].start / width);
let offset = pos[0].start % width;
if (offset < 10) { // In line number section
pos[0].start = line * w;

View file

@ -9,7 +9,7 @@
*
* @namespace
*/
var IP = {
const IP = {
/**
* @constant
@ -34,28 +34,28 @@ var IP = {
* @param {Object[]} args
* @returns {string}
*/
run_parse_ip_range: function (input, args) {
var include_network_info = args[0],
run_parse_ip_range(input, args) {
let include_network_info = args[0],
enumerate_addresses = args[1],
allow_large_list = args[2];
// Check what type of input we are looking at
var ipv4_cidr_regex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\/(\d\d?)\s*$/,
let ipv4_cidr_regex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\/(\d\d?)\s*$/,
ipv4_range_regex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\s*-\s*((?:\d{1,3}\.){3}\d{1,3})\s*$/,
ipv6_cidr_regex = /^\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,
ipv6_range_regex = /^\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,
match;
if (!!(match = ipv4_cidr_regex.exec(input))) {
if (match = ipv4_cidr_regex.exec(input)) {
return IP._ipv4_cidr_range(match, include_network_info, enumerate_addresses, allow_large_list);
} else if (!!(match = ipv4_range_regex.exec(input))) {
} else if (match = ipv4_range_regex.exec(input)) {
return IP._ipv4_hyphenated_range(match, include_network_info, enumerate_addresses, allow_large_list);
} else if (!!(match = ipv6_cidr_regex.exec(input))) {
} else if (match = ipv6_cidr_regex.exec(input)) {
return IP._ipv6_cidr_range(match, include_network_info);
} else if (!!(match = ipv6_range_regex.exec(input))) {
} else if (match = ipv6_range_regex.exec(input)) {
return IP._ipv6_hyphenated_range(match, include_network_info);
} else {
return "Invalid input.\n\nEnter either a CIDR range (e.g. 10.0.0.0/24) or a hyphenated range (e.g. 10.0.0.0 - 10.0.1.0). IPv6 also supported.";
return 'Invalid input.\n\nEnter either a CIDR range (e.g. 10.0.0.0/24) or a hyphenated range (e.g. 10.0.0.0 - 10.0.1.0). IPv6 also supported.';
}
},
@ -78,52 +78,52 @@ var IP = {
* @param {Object[]} args
* @returns {string}
*/
run_parse_ipv6: function (input, args) {
var match,
output = "";
run_parse_ipv6(input, args) {
let match,
output = '';
if (!!(match = IP.IPv6_REGEX.exec(input))) {
var ipv6 = IP._str_to_ipv6(match[1]),
if (match = IP.IPv6_REGEX.exec(input)) {
let ipv6 = IP._str_to_ipv6(match[1]),
longhand = IP._ipv6_to_str(ipv6),
shorthand = IP._ipv6_to_str(ipv6, true);
output += "Longhand: " + longhand + "\nShorthand: " + shorthand + "\n";
output += `Longhand: ${longhand}\nShorthand: ${shorthand}\n`;
// Detect reserved addresses
if (shorthand == "::") {
if (shorthand == '::') {
// Unspecified address
output += "\nUnspecified address corresponding to 0.0.0.0/32 in IPv4.";
output += "\nUnspecified address range: ::/128";
} else if (shorthand == "::1") {
output += '\nUnspecified address corresponding to 0.0.0.0/32 in IPv4.';
output += '\nUnspecified address range: ::/128';
} else if (shorthand == '::1') {
// Loopback address
output += "\nLoopback address to the local host corresponding to 127.0.0.1/8 in IPv4.";
output += "\nLoopback addresses range: ::1/128";
output += '\nLoopback address to the local host corresponding to 127.0.0.1/8 in IPv4.';
output += '\nLoopback addresses range: ::1/128';
} else if (ipv6[0] === 0 && ipv6[1] === 0 && ipv6[2] === 0 &&
ipv6[3] === 0 && ipv6[4] === 0 && ipv6[5] === 0xffff) {
// IPv4-mapped IPv6 address
output += "\nIPv4-mapped IPv6 address detected. IPv6 clients will be handled natively by default, and IPv4 clients appear as IPv6 clients at their IPv4-mapped IPv6 address.";
output += "\nMapped IPv4 address: " + IP._ipv4_to_str((ipv6[6] << 16) + ipv6[7]);
output += "\nIPv4-mapped IPv6 addresses range: ::ffff:0:0/96";
output += '\nIPv4-mapped IPv6 address detected. IPv6 clients will be handled natively by default, and IPv4 clients appear as IPv6 clients at their IPv4-mapped IPv6 address.';
output += `\nMapped IPv4 address: ${IP._ipv4_to_str((ipv6[6] << 16) + ipv6[7])}`;
output += '\nIPv4-mapped IPv6 addresses range: ::ffff:0:0/96';
} else if (ipv6[0] === 0 && ipv6[1] === 0 && ipv6[2] === 0 &&
ipv6[3] === 0 && ipv6[4] === 0xffff && ipv6[5] === 0) {
// IPv4-translated address
output += "\nIPv4-translated address detected. Used by Stateless IP/ICMP Translation (SIIT). See RFCs 6145 and 6052 for more details.";
output += "\nTranslated IPv4 address: " + IP._ipv4_to_str((ipv6[6] << 16) + ipv6[7]);
output += "\nIPv4-translated addresses range: ::ffff:0:0:0/96";
output += '\nIPv4-translated address detected. Used by Stateless IP/ICMP Translation (SIIT). See RFCs 6145 and 6052 for more details.';
output += `\nTranslated IPv4 address: ${IP._ipv4_to_str((ipv6[6] << 16) + ipv6[7])}`;
output += '\nIPv4-translated addresses range: ::ffff:0:0:0/96';
} else if (ipv6[0] === 0x100) {
// Discard prefix per RFC 6666
output += "\nDiscard prefix detected. This is used when forwarding traffic to a sinkhole router to mitigate the effects of a denial-of-service attack. See RFC 6666 for more details.";
output += "\nDiscard range: 100::/64";
output += '\nDiscard prefix detected. This is used when forwarding traffic to a sinkhole router to mitigate the effects of a denial-of-service attack. See RFC 6666 for more details.';
output += '\nDiscard range: 100::/64';
} else if (ipv6[0] === 0x64 && ipv6[1] === 0xff9b && ipv6[2] === 0 &&
ipv6[3] === 0 && ipv6[4] === 0 && ipv6[5] === 0) {
// IPv4/IPv6 translation per RFC 6052
output += "\n'Well-Known' prefix for IPv4/IPv6 translation detected. See RFC 6052 for more details.";
output += "\nTranslated IPv4 address: " + IP._ipv4_to_str((ipv6[6] << 16) + ipv6[7]);
output += `\nTranslated IPv4 address: ${IP._ipv4_to_str((ipv6[6] << 16) + ipv6[7])}`;
output += "\n'Well-Known prefix range: 64:ff9b::/96";
} else if (ipv6[0] === 0x2001 && ipv6[1] === 0) {
// Teredo tunneling
output += "\nTeredo tunneling IPv6 address detected\n";
var server_ipv4 = (ipv6[2] << 16) + ipv6[3],
output += '\nTeredo tunneling IPv6 address detected\n';
let server_ipv4 = (ipv6[2] << 16) + ipv6[3],
udp_port = (~ipv6[5]) & 0xffff,
client_ipv4 = ~((ipv6[6] << 16) + ipv6[7]),
flag_cone = (ipv6[4] >>> 15) & 1,
@ -132,85 +132,85 @@ var IP = {
flag_ug = (ipv6[4] >>> 8) & 3,
flag_random2 = ipv6[4] & 255;
output += "\nServer IPv4 address: " + IP._ipv4_to_str(server_ipv4) +
"\nClient IPv4 address: " + IP._ipv4_to_str(client_ipv4) +
"\nClient UDP port: " + udp_port +
"\nFlags:" +
"\n\tCone: " + flag_cone;
output += `\nServer IPv4 address: ${IP._ipv4_to_str(server_ipv4)
}\nClient IPv4 address: ${IP._ipv4_to_str(client_ipv4)
}\nClient UDP port: ${udp_port
}\nFlags:` +
`\n\tCone: ${flag_cone}`;
if (flag_cone) {
output += " (Client is behind a cone NAT)";
output += ' (Client is behind a cone NAT)';
} else {
output += " (Client is not behind a cone NAT)";
output += ' (Client is not behind a cone NAT)';
}
output += "\n\tR: " + flag_r;
output += `\n\tR: ${flag_r}`;
if (flag_r) {
output += " Error: This flag should be set to 0. See RFC 5991 and RFC 4380.";
output += ' Error: This flag should be set to 0. See RFC 5991 and RFC 4380.';
}
output += "\n\tRandom1: " + Utils.bin(flag_random1, 4) +
"\n\tUG: " + Utils.bin(flag_ug, 2);
output += `\n\tRandom1: ${Utils.bin(flag_random1, 4)
}\n\tUG: ${Utils.bin(flag_ug, 2)}`;
if (flag_ug) {
output += " Error: This flag should be set to 00. See RFC 4380.";
output += ' Error: This flag should be set to 00. See RFC 4380.';
}
output += "\n\tRandom2: " + Utils.bin(flag_random2, 8);
output += `\n\tRandom2: ${Utils.bin(flag_random2, 8)}`;
if (!flag_r && !flag_ug && flag_random1 && flag_random2) {
output += "\n\nThis is a valid Teredo address which complies with RFC 4380 and RFC 5991.";
output += '\n\nThis is a valid Teredo address which complies with RFC 4380 and RFC 5991.';
} else if (!flag_r && !flag_ug) {
output += "\n\nThis is a valid Teredo address which complies with RFC 4380, however it does not comply with RFC 5991 (Teredo Security Updates) as there are no randomised bits in the flag field.";
output += '\n\nThis is a valid Teredo address which complies with RFC 4380, however it does not comply with RFC 5991 (Teredo Security Updates) as there are no randomised bits in the flag field.';
} else {
output += "\n\nThis is an invalid Teredo address.";
output += '\n\nThis is an invalid Teredo address.';
}
output += "\n\nTeredo prefix range: 2001::/32";
output += '\n\nTeredo prefix range: 2001::/32';
} else if (ipv6[0] === 0x2001 && ipv6[1] === 0x2 && ipv6[2] === 0) {
// Benchmarking
output += "\nAssigned to the Benchmarking Methodology Working Group (BMWG) for benchmarking IPv6. Corresponds to 198.18.0.0/15 for benchmarking IPv4. See RFC 5180 for more details.";
output += "\nBMWG range: 2001:2::/48";
output += '\nAssigned to the Benchmarking Methodology Working Group (BMWG) for benchmarking IPv6. Corresponds to 198.18.0.0/15 for benchmarking IPv4. See RFC 5180 for more details.';
output += '\nBMWG range: 2001:2::/48';
} else if (ipv6[0] == 0x2001 && ipv6[1] >= 0x10 && ipv6[1] <= 0x1f) {
// ORCHIDv1
output += "\nDeprecated, previously ORCHIDv1 (Overlay Routable Cryptographic Hash Identifiers).\nORCHIDv1 range: 2001:10::/28\nORCHIDv2 now uses 2001:20::/28.";
output += '\nDeprecated, previously ORCHIDv1 (Overlay Routable Cryptographic Hash Identifiers).\nORCHIDv1 range: 2001:10::/28\nORCHIDv2 now uses 2001:20::/28.';
} else if (ipv6[0] == 0x2001 && ipv6[1] >= 0x20 && ipv6[1] <= 0x2f) {
// ORCHIDv2
output += "\nORCHIDv2 (Overlay Routable Cryptographic Hash Identifiers).\nThese are non-routed IPv6 addresses used for Cryptographic Hash Identifiers.";
output += "\nORCHIDv2 range: 2001:20::/28";
output += '\nORCHIDv2 (Overlay Routable Cryptographic Hash Identifiers).\nThese are non-routed IPv6 addresses used for Cryptographic Hash Identifiers.';
output += '\nORCHIDv2 range: 2001:20::/28';
} else if (ipv6[0] == 0x2001 && ipv6[1] == 0xdb8) {
// Documentation
output += "\nThis is a documentation IPv6 address. This range should be used whenever an example IPv6 address is given or to model networking scenarios. Corresponds to 192.0.2.0/24, 198.51.100.0/24, and 203.0.113.0/24 in IPv4.";
output += "\nDocumentation range: 2001:db8::/32";
output += '\nThis is a documentation IPv6 address. This range should be used whenever an example IPv6 address is given or to model networking scenarios. Corresponds to 192.0.2.0/24, 198.51.100.0/24, and 203.0.113.0/24 in IPv4.';
output += '\nDocumentation range: 2001:db8::/32';
} else if (ipv6[0] == 0x2002) {
// 6to4
output += "\n6to4 transition IPv6 address detected. See RFC 3056 for more details." +
"\n6to4 prefix range: 2002::/16";
output += '\n6to4 transition IPv6 address detected. See RFC 3056 for more details.' +
'\n6to4 prefix range: 2002::/16';
var v4_addr = IP._ipv4_to_str((ipv6[1] << 16) + ipv6[2]),
let v4_addr = IP._ipv4_to_str((ipv6[1] << 16) + ipv6[2]),
sla_id = ipv6[3],
interface_id_str = ipv6[4].toString(16) + ipv6[5].toString(16) + ipv6[6].toString(16) + ipv6[7].toString(16),
interface_id = new BigInteger(interface_id_str, 16);
output += "\n\nEncapsulated IPv4 address: " + v4_addr +
"\nSLA ID: " + sla_id +
"\nInterface ID (base 16): " + interface_id_str +
"\nInterface ID (base 10): " + interface_id.toString();
output += `\n\nEncapsulated IPv4 address: ${v4_addr
}\nSLA ID: ${sla_id
}\nInterface ID (base 16): ${interface_id_str
}\nInterface ID (base 10): ${interface_id.toString()}`;
} else if (ipv6[0] >= 0xfc00 && ipv6[0] <= 0xfdff) {
// Unique local address
output += "\nThis is a unique local address comparable to the IPv4 private addresses 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16. See RFC 4193 for more details.";
output += "\nUnique local addresses range: fc00::/7";
output += '\nThis is a unique local address comparable to the IPv4 private addresses 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16. See RFC 4193 for more details.';
output += '\nUnique local addresses range: fc00::/7';
} else if (ipv6[0] >= 0xfe80 && ipv6[0] <= 0xfebf) {
// Link-local address
output += "\nThis is a link-local address comparable to the auto-configuration addresses 169.254.0.0/16 in IPv4.";
output += "\nLink-local addresses range: fe80::/10";
output += '\nThis is a link-local address comparable to the auto-configuration addresses 169.254.0.0/16 in IPv4.';
output += '\nLink-local addresses range: fe80::/10';
} else if (ipv6[0] >= 0xff00) {
// Multicast
output += "\nThis is a reserved multicast address.";
output += "\nMulticast addresses range: ff00::/8";
output += '\nThis is a reserved multicast address.';
output += '\nMulticast addresses range: ff00::/8';
}
} else {
return "Invalid IPv6 address";
return 'Invalid IPv6 address';
}
return output;
},
@ -220,7 +220,7 @@ var IP = {
* @constant
* @default
*/
IP_FORMAT_LIST: ["Dotted Decimal", "Decimal", "Hex"],
IP_FORMAT_LIST: ['Dotted Decimal', 'Decimal', 'Hex'],
/**
* Change IP format operation.
@ -229,67 +229,67 @@ var IP = {
* @param {Object[]} args
* @returns {string}
*/
run_change_ip_format: function(input, args) {
var in_format = args[0],
run_change_ip_format(input, args) {
let in_format = args[0],
out_format = args[1],
lines = input.split("\n"),
output = "",
lines = input.split('\n'),
output = '',
j = 0;
for (var i = 0; i < lines.length; i++) {
if (lines[i] === "") continue;
var ba_ip = [];
for (let i = 0; i < lines.length; i++) {
if (lines[i] === '') continue;
let ba_ip = [];
if (in_format == out_format) {
output += lines[i] + "\n";
output += `${lines[i]}\n`;
continue;
}
// Convert to byte array IP from input format
switch (in_format) {
case "Dotted Decimal":
var octets = lines[i].split(".");
case 'Dotted Decimal':
var octets = lines[i].split('.');
for (j = 0; j < octets.length; j++) {
ba_ip.push(parseInt(octets[j], 10));
}
break;
case "Decimal":
case 'Decimal':
var decimal = lines[i].toString();
ba_ip.push(decimal >> 24 & 255);
ba_ip.push(decimal >> 16 & 255);
ba_ip.push(decimal >> 8 & 255);
ba_ip.push(decimal & 255);
break;
case "Hex":
case 'Hex':
ba_ip = Utils.hex_to_byte_array(lines[i]);
break;
default:
throw "Unsupported input IP format";
throw 'Unsupported input IP format';
}
// Convert byte array IP to output format
switch (out_format) {
case "Dotted Decimal":
var dd_ip = "";
case 'Dotted Decimal':
var dd_ip = '';
for (j = 0; j < ba_ip.length; j++) {
dd_ip += ba_ip[j] + ".";
dd_ip += `${ba_ip[j]}.`;
}
output += dd_ip.slice(0, dd_ip.length-1) + "\n";
output += `${dd_ip.slice(0, dd_ip.length - 1)}\n`;
break;
case "Decimal":
case 'Decimal':
var dec_ip = ((ba_ip[0] << 24) | (ba_ip[1] << 16) | (ba_ip[2] << 8) | ba_ip[3]) >>> 0;
output += dec_ip.toString() + "\n";
output += `${dec_ip.toString()}\n`;
break;
case "Hex":
var hex_ip = "";
case 'Hex':
var hex_ip = '';
for (j = 0; j < ba_ip.length; j++) {
hex_ip += Utils.hex(ba_ip[j]);
}
output += hex_ip + "\n";
output += `${hex_ip}\n`;
break;
default:
throw "Unsupported output IP format";
throw 'Unsupported output IP format';
}
}
@ -301,7 +301,7 @@ var IP = {
* @constant
* @default
*/
DELIM_OPTIONS: ["Line feed", "CRLF", "Space", "Comma", "Semi-colon"],
DELIM_OPTIONS: ['Line feed', 'CRLF', 'Space', 'Comma', 'Semi-colon'],
/**
* @constant
* @default
@ -320,8 +320,8 @@ var IP = {
* @param {Object[]} args
* @returns {string}
*/
run_group_ips: function(input, args) {
var delim = Utils.char_rep[args[0]],
run_group_ips(input, args) {
let delim = Utils.char_rep[args[0]],
cidr = args[1],
only_subnets = args[2],
ipv4_mask = cidr < 32 ? ~(0xFFFFFFFF >>> cidr) : 0xFFFFFFFF,
@ -330,18 +330,18 @@ var IP = {
ipv4_networks = {},
ipv6_networks = {},
match = null,
output = "",
output = '',
ip = null,
network = null,
network_str = "";
network_str = '';
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
for (var i = 0; i < ips.length; i++) {
if (!!(match = IP.IPv4_REGEX.exec(ips[i]))) {
if (match = IP.IPv4_REGEX.exec(ips[i])) {
ip = IP._str_to_ipv4(match[1]) >>> 0;
network = ip & ipv4_mask;
@ -350,12 +350,12 @@ var IP = {
} else {
ipv4_networks[network] = [ip];
}
} else if (!!(match = IP.IPv6_REGEX.exec(ips[i]))) {
} else if (match = IP.IPv6_REGEX.exec(ips[i])) {
ip = IP._str_to_ipv6(match[1]);
network = [];
network_str = "";
network_str = '';
for (var j = 0; j < 8; j++) {
for (let j = 0; j < 8; j++) {
network.push(ip[j] & ipv6_mask[j]);
}
@ -373,13 +373,13 @@ var IP = {
for (network in ipv4_networks) {
ipv4_networks[network] = ipv4_networks[network].sort();
output += IP._ipv4_to_str(network) + "/" + cidr + "\n";
output += `${IP._ipv4_to_str(network)}/${cidr}\n`;
if (!only_subnets) {
for (i = 0; i < ipv4_networks[network].length; i++) {
output += " " + IP._ipv4_to_str(ipv4_networks[network][i]) + "\n";
output += ` ${IP._ipv4_to_str(ipv4_networks[network][i])}\n`;
}
output += "\n";
output += '\n';
}
}
@ -387,13 +387,13 @@ var IP = {
for (network_str in ipv6_networks) {
// ipv6_networks[network_str] = ipv6_networks[network_str].sort(); TODO
output += network_str + "/" + cidr + "\n";
output += `${network_str}/${cidr}\n`;
if (!only_subnets) {
for (i = 0; i < ipv6_networks[network_str].length; i++) {
output += " " + IP._ipv6_to_str(ipv6_networks[network_str][i], true) + "\n";
output += ` ${IP._ipv6_to_str(ipv6_networks[network_str][i], true)}\n`;
}
output += "\n";
output += '\n';
}
}
@ -406,7 +406,7 @@ var IP = {
* @default
* @private
*/
_LARGE_RANGE_ERROR: "The specified range contains more than 65,536 addresses. Running this query could crash your browser. If you want to run it, select the \"Allow large queries\" option. You are advised to turn off \"Auto Bake\" whilst editing large ranges.",
_LARGE_RANGE_ERROR: 'The specified range contains more than 65,536 addresses. Running this query could crash your browser. If you want to run it, select the "Allow large queries" option. You are advised to turn off "Auto Bake" whilst editing large ranges.',
/**
* Parses an IPv4 CIDR range (e.g. 192.168.0.0/24) and displays information about it.
@ -418,30 +418,30 @@ var IP = {
* @param {boolean} allow_large_list
* @returns {string}
*/
_ipv4_cidr_range: function(cidr, include_network_info, enumerate_addresses, allow_large_list) {
var output = "",
_ipv4_cidr_range(cidr, include_network_info, enumerate_addresses, allow_large_list) {
let output = '',
network = IP._str_to_ipv4(cidr[1]),
cidr_range = parseInt(cidr[2], 10);
if (cidr_range < 0 || cidr_range > 31) {
return "IPv4 CIDR must be less than 32";
return 'IPv4 CIDR must be less than 32';
}
var mask = ~(0xFFFFFFFF >>> cidr_range),
let mask = ~(0xFFFFFFFF >>> cidr_range),
ip1 = network & mask,
ip2 = ip1 | ~mask;
if (include_network_info) {
output += "Network: " + IP._ipv4_to_str(network) + "\n";
output += "CIDR: " + cidr_range + "\n";
output += "Mask: " + IP._ipv4_to_str(mask) + "\n";
output += "Range: " + IP._ipv4_to_str(ip1) + " - " + IP._ipv4_to_str(ip2) + "\n";
output += "Total addresses in range: " + (((ip2 - ip1) >>> 0) + 1) + "\n\n";
output += `Network: ${IP._ipv4_to_str(network)}\n`;
output += `CIDR: ${cidr_range}\n`;
output += `Mask: ${IP._ipv4_to_str(mask)}\n`;
output += `Range: ${IP._ipv4_to_str(ip1)} - ${IP._ipv4_to_str(ip2)}\n`;
output += `Total addresses in range: ${((ip2 - ip1) >>> 0) + 1}\n\n`;
}
if (enumerate_addresses) {
if (cidr_range >= 16 || allow_large_list) {
output += IP._generate_ipv4_range(ip1, ip2).join("\n");
output += IP._generate_ipv4_range(ip1, ip2).join('\n');
} else {
output += IP._LARGE_RANGE_ERROR;
}
@ -458,40 +458,40 @@ var IP = {
* @param {boolean} include_network_info
* @returns {string}
*/
_ipv6_cidr_range: function(cidr, include_network_info) {
var output = "",
_ipv6_cidr_range(cidr, include_network_info) {
let output = '',
network = IP._str_to_ipv6(cidr[1]),
cidr_range = parseInt(cidr[cidr.length - 1], 10);
if (cidr_range < 0 || cidr_range > 127) {
return "IPv6 CIDR must be less than 128";
return 'IPv6 CIDR must be less than 128';
}
var mask = IP._gen_ipv6_mask(cidr_range),
let mask = IP._gen_ipv6_mask(cidr_range),
ip1 = new Array(8),
ip2 = new Array(8),
total_diff = "",
total_diff = '',
total = new Array(128);
for (var i = 0; i < 8; i++) {
for (let i = 0; i < 8; i++) {
ip1[i] = network[i] & mask[i];
ip2[i] = ip1[i] | (~mask[i] & 0x0000FFFF);
total_diff = (ip2[i] - ip1[i]).toString(2);
if (total_diff != "0") {
for (var n = 0; n < total_diff.length; n++) {
if (total_diff != '0') {
for (let n = 0; n < total_diff.length; n++) {
total[i * 16 + 16 - (total_diff.length - n)] = total_diff[n];
}
}
}
if (include_network_info) {
output += "Network: " + IP._ipv6_to_str(network) + "\n";
output += "Shorthand: " + IP._ipv6_to_str(network, true) + "\n";
output += "CIDR: " + cidr_range + "\n";
output += "Mask: " + IP._ipv6_to_str(mask) + "\n";
output += "Range: " + IP._ipv6_to_str(ip1) + " - " + IP._ipv6_to_str(ip2) + "\n";
output += "Total addresses in range: " + (parseInt(total.join(""), 2) + 1) + "\n\n";
output += `Network: ${IP._ipv6_to_str(network)}\n`;
output += `Shorthand: ${IP._ipv6_to_str(network, true)}\n`;
output += `CIDR: ${cidr_range}\n`;
output += `Mask: ${IP._ipv6_to_str(mask)}\n`;
output += `Range: ${IP._ipv6_to_str(ip1)} - ${IP._ipv6_to_str(ip2)}\n`;
output += `Total addresses in range: ${parseInt(total.join(''), 2) + 1}\n\n`;
}
return output;
@ -505,11 +505,11 @@ var IP = {
* @param {number} cidr
* @returns {number[]}
*/
_gen_ipv6_mask: function(cidr) {
var mask = new Array(8),
_gen_ipv6_mask(cidr) {
let mask = new Array(8),
shift;
for (var i = 0; i < 8; i++) {
for (let i = 0; i < 8; i++) {
if (cidr > ((i + 1) * 16)) {
mask[i] = 0x0000FFFF;
} else {
@ -534,13 +534,13 @@ var IP = {
* @param {boolean} allow_large_list
* @returns {string}
*/
_ipv4_hyphenated_range: function(range, include_network_info, enumerate_addresses, allow_large_list) {
var output = "",
_ipv4_hyphenated_range(range, include_network_info, enumerate_addresses, allow_large_list) {
let output = '',
ip1 = IP._str_to_ipv4(range[1]),
ip2 = IP._str_to_ipv4(range[2]);
// Calculate mask
var diff = ip1 ^ ip2,
let diff = ip1 ^ ip2,
cidr = 32,
mask = 0;
@ -551,24 +551,24 @@ var IP = {
}
mask = ~mask >>> 0;
var network = ip1 & mask,
let network = ip1 & mask,
sub_ip1 = network & mask,
sub_ip2 = sub_ip1 | ~mask;
if (include_network_info) {
output += "Minimum subnet required to hold this range:\n";
output += "\tNetwork: " + IP._ipv4_to_str(network) + "\n";
output += "\tCIDR: " + cidr + "\n";
output += "\tMask: " + IP._ipv4_to_str(mask) + "\n";
output += "\tSubnet range: " + IP._ipv4_to_str(sub_ip1) + " - " + IP._ipv4_to_str(sub_ip2) + "\n";
output += "\tTotal addresses in subnet: " + (((sub_ip2 - sub_ip1) >>> 0) + 1) + "\n\n";
output += "Range: " + IP._ipv4_to_str(ip1) + " - " + IP._ipv4_to_str(ip2) + "\n";
output += "Total addresses in range: " + (((ip2 - ip1) >>> 0) + 1) + "\n\n";
output += 'Minimum subnet required to hold this range:\n';
output += `\tNetwork: ${IP._ipv4_to_str(network)}\n`;
output += `\tCIDR: ${cidr}\n`;
output += `\tMask: ${IP._ipv4_to_str(mask)}\n`;
output += `\tSubnet range: ${IP._ipv4_to_str(sub_ip1)} - ${IP._ipv4_to_str(sub_ip2)}\n`;
output += `\tTotal addresses in subnet: ${((sub_ip2 - sub_ip1) >>> 0) + 1}\n\n`;
output += `Range: ${IP._ipv4_to_str(ip1)} - ${IP._ipv4_to_str(ip2)}\n`;
output += `Total addresses in range: ${((ip2 - ip1) >>> 0) + 1}\n\n`;
}
if (enumerate_addresses) {
if (((ip2 - ip1) >>> 0) <= 65536 || allow_large_list) {
output += IP._generate_ipv4_range(ip1, ip2).join("\n");
output += IP._generate_ipv4_range(ip1, ip2).join('\n');
} else {
output += IP._LARGE_RANGE_ERROR;
}
@ -585,31 +585,32 @@ var IP = {
* @param {boolean} include_network_info
* @returns {string}
*/
_ipv6_hyphenated_range: function(range, include_network_info) {
var output = "",
_ipv6_hyphenated_range(range, include_network_info) {
let output = '',
ip1 = IP._str_to_ipv6(range[1]),
ip2 = IP._str_to_ipv6(range[14]);
var t = "",
let t = '',
total = new Array(128);
// Initialise total array to "0"
for (var i = 0; i < 128; i++)
total[i] = "0";
for (var i = 0; i < 128; i++) {
total[i] = '0';
}
for (i = 0; i < 8; i++) {
t = (ip2[i] - ip1[i]).toString(2);
if (t != "0") {
for (var n = 0; n < t.length; n++) {
if (t != '0') {
for (let n = 0; n < t.length; n++) {
total[i * 16 + 16 - (t.length - n)] = t[n];
}
}
}
if (include_network_info) {
output += "Range: " + IP._ipv6_to_str(ip1) + " - " + IP._ipv6_to_str(ip2) + "\n";
output += "Shorthand range: " + IP._ipv6_to_str(ip1, true) + " - " + IP._ipv6_to_str(ip2, true) + "\n";
output += "Total addresses in range: " + (parseInt(total.join(""), 2) + 1) + "\n\n";
output += `Range: ${IP._ipv6_to_str(ip1)} - ${IP._ipv6_to_str(ip2)}\n`;
output += `Shorthand range: ${IP._ipv6_to_str(ip1, true)} - ${IP._ipv6_to_str(ip2, true)}\n`;
output += `Total addresses in range: ${parseInt(total.join(''), 2) + 1}\n\n`;
}
return output;
@ -627,8 +628,8 @@ var IP = {
* // returns 168427520
* IP._str_to_ipv4("10.10.0.0");
*/
_str_to_ipv4: function (ip_str) {
var blocks = ip_str.split("."),
_str_to_ipv4(ip_str) {
let blocks = ip_str.split('.'),
num_blocks = parse_blocks(blocks),
result = 0;
@ -640,14 +641,12 @@ var IP = {
return result;
function parse_blocks(blocks) {
if (blocks.length != 4)
throw "More than 4 blocks.";
if (blocks.length != 4) { throw 'More than 4 blocks.'; }
var num_blocks = [];
for (var i = 0; i < 4; i++) {
const num_blocks = [];
for (let i = 0; i < 4; i++) {
num_blocks[i] = parseInt(blocks[i], 10);
if (num_blocks[i] < 0 || num_blocks[i] > 255)
throw "Block out of range.";
if (num_blocks[i] < 0 || num_blocks[i] > 255) { throw 'Block out of range.'; }
}
return num_blocks;
}
@ -665,13 +664,13 @@ var IP = {
* // returns "10.10.0.0"
* IP._ipv4_to_str(168427520);
*/
_ipv4_to_str: function(ip_int) {
var blockA = (ip_int >> 24) & 255,
_ipv4_to_str(ip_int) {
let blockA = (ip_int >> 24) & 255,
blockB = (ip_int >> 16) & 255,
blockC = (ip_int >> 8) & 255,
blockD = ip_int & 255;
return blockA + "." + blockB + "." + blockC + "." + blockD;
return `${blockA}.${blockB}.${blockC}.${blockD}`;
},
@ -686,13 +685,13 @@ var IP = {
* // returns [65280, 0, 0, 0, 0, 0, 4369, 8738]
* IP._str_to_ipv6("ff00::1111:2222");
*/
_str_to_ipv6: function(ip_str) {
var blocks = ip_str.split(":"),
_str_to_ipv6(ip_str) {
let blocks = ip_str.split(':'),
num_blocks = parse_blocks(blocks),
j = 0,
ipv6 = new Array(8);
for (var i = 0; i < 8; i++) {
for (let i = 0; i < 8; i++) {
if (isNaN(num_blocks[j])) {
ipv6[i] = 0;
if (i == (8 - num_blocks.slice(j).length)) j++;
@ -704,13 +703,15 @@ var IP = {
return ipv6;
function parse_blocks(blocks) {
if (blocks.length < 3 || blocks.length > 8)
throw "Badly formatted IPv6 address.";
var num_blocks = [];
for (var i = 0; i < blocks.length; i++) {
if (blocks.length < 3 || blocks.length > 8) {
throw 'Badly formatted IPv6 address.';
}
const num_blocks = [];
for (let i = 0; i < blocks.length; i++) {
num_blocks[i] = parseInt(blocks[i], 16);
if (num_blocks[i] < 0 || num_blocks[i] > 65535)
throw "Block out of range.";
if (num_blocks[i] < 0 || num_blocks[i] > 65535) {
throw 'Block out of range.';
}
}
return num_blocks;
}
@ -732,13 +733,13 @@ var IP = {
* // returns "ff00:0000:0000:0000:0000:0000:1111:2222"
* IP._ipv6_to_str([65280, 0, 0, 0, 0, 0, 4369, 8738], false);
*/
_ipv6_to_str: function(ipv6, compact) {
var output = "",
_ipv6_to_str(ipv6, compact) {
let output = '',
skips = 0,
i = 0;
if (compact) {
var start = -1,
let start = -1,
end = -1,
s = 0,
e = -1;
@ -757,18 +758,19 @@ var IP = {
for (i = 0; i < 8; i++) {
if (i != start) {
output += Utils.hex(ipv6[i],1) + ":";
output += `${Utils.hex(ipv6[i], 1)}:`;
} else {
output += ":";
output += ':';
i = end;
if (end === 7) output += ":";
if (end === 7) output += ':';
}
}
if (output[0] === ":")
output = ":" + output;
if (output[0] === ':') {
output = `:${output}`;
}
} else {
for (i = 0; i < 8; i++) {
output += Utils.hex(ipv6[i],4) + ":";
output += `${Utils.hex(ipv6[i], 4)}:`;
}
}
return output.slice(0, output.length - 1);
@ -787,14 +789,14 @@ var IP = {
* // returns ["0.0.0.1", "0.0.0.2", "0.0.0.3"]
* IP._generate_ipv4_range(1, 3);
*/
_generate_ipv4_range: function(ip, end_ip) {
var range = [];
_generate_ipv4_range(ip, end_ip) {
const range = [];
if (end_ip >= ip) {
for (; ip <= end_ip; ip++) {
range.push(IP._ipv4_to_str(ip));
}
} else {
range[0] = "Second IP address smaller than first.";
range[0] = 'Second IP address smaller than first.';
}
return range;
},

View file

@ -9,7 +9,7 @@
*
* @namespace
*/
var JS = {
const JS = {
/**
* @constant
@ -44,8 +44,8 @@ var JS = {
* @param {Object[]} args
* @returns {string}
*/
run_parse: function (input, args) {
var parse_loc = args[0],
run_parse(input, args) {
let parse_loc = args[0],
parse_range = args[1],
parse_tokens = args[2],
parse_comment = args[3],
@ -56,7 +56,7 @@ var JS = {
range: parse_range,
tokens: parse_tokens,
comment: parse_comment,
tolerant: parse_tolerant
tolerant: parse_tolerant,
};
result = esprima.parse(input, options);
@ -68,12 +68,12 @@ var JS = {
* @constant
* @default
*/
BEAUTIFY_INDENT: "\\t",
BEAUTIFY_INDENT: '\\t',
/**
* @constant
* @default
*/
BEAUTIFY_QUOTES: ["Auto", "Single", "Double"],
BEAUTIFY_QUOTES: ['Auto', 'Single', 'Double'],
/**
* @constant
* @default
@ -92,39 +92,40 @@ var JS = {
* @param {Object[]} args
* @returns {string}
*/
run_beautify: function(input, args) {
var beautify_indent = args[0] || JS.BEAUTIFY_INDENT,
run_beautify(input, args) {
let beautify_indent = args[0] || JS.BEAUTIFY_INDENT,
quotes = args[1].toLowerCase(),
beautify_semicolons = args[2],
beautify_comment = args[3],
result = "",
result = '',
AST;
try {
AST = esprima.parse(input, {
range: true,
tokens: true,
comment: true
comment: true,
});
var options = {
const options = {
format: {
indent: {
style: beautify_indent
style: beautify_indent,
},
quotes: quotes,
quotes,
semicolons: beautify_semicolons,
},
comment: beautify_comment
comment: beautify_comment,
};
if (options.comment)
if (options.comment) {
AST = escodegen.attachComments(AST, AST.comments, AST.tokens);
}
result = escodegen.generate(AST, options);
} catch (e) {
// Leave original error so the user can see the detail
throw "Unable to parse JavaScript.<br>" + e.message;
throw `Unable to parse JavaScript.<br>${e.message}`;
}
return result;
},
@ -137,8 +138,8 @@ var JS = {
* @param {Object[]} args
* @returns {string}
*/
run_minify: function(input, args) {
var result = "",
run_minify(input, args) {
let result = '',
AST = esprima.parse(input),
optimised_AST = esmangle.optimize(AST, null),
mangled_AST = esmangle.mangle(optimised_AST);
@ -150,8 +151,8 @@ var JS = {
escapeless: true,
compact: true,
semicolons: false,
parentheses: false
}
parentheses: false,
},
});
return result;
},

View file

@ -7,13 +7,13 @@
*
* @namespace
*/
var MAC = {
const MAC = {
/**
* @constant
* @default
*/
OUTPUT_CASE: ["Both", "Upper only", "Lower only"],
OUTPUT_CASE: ['Both', 'Upper only', 'Lower only'],
/**
* @constant
* @default
@ -42,10 +42,10 @@ var MAC = {
* @param {Object[]} args
* @returns {string}
*/
run_format: function(input, args) {
if (!input) return "";
run_format(input, args) {
if (!input) return '';
var output_case = args[0],
let output_case = args[0],
no_delim = args[1],
dash_delim = args[2],
colon_delim = args[3],
@ -53,18 +53,18 @@ var MAC = {
output_list = [],
macs = input.toLowerCase().split(/[,\s\r\n]+/);
macs.forEach(function(mac) {
var cleanMac = mac.replace(/[:.-]+/g, ''),
macs.forEach((mac) => {
let cleanMac = mac.replace(/[:.-]+/g, ''),
macHyphen = cleanMac.replace(/(.{2}(?=.))/g, '$1-'),
macColon = cleanMac.replace(/(.{2}(?=.))/g, '$1:'),
macCisco = cleanMac.replace(/(.{4}(?=.))/g, '$1.');
if (output_case == "Lower only") {
if (output_case == 'Lower only') {
if (no_delim) output_list.push(cleanMac);
if (dash_delim) output_list.push(macHyphen);
if (colon_delim) output_list.push(macColon);
if (cisco_style) output_list.push(macCisco);
} else if (output_case == "Upper only") {
} else if (output_case == 'Upper only') {
if (no_delim) output_list.push(cleanMac.toUpperCase());
if (dash_delim) output_list.push(macHyphen.toUpperCase());
if (colon_delim) output_list.push(macColon.toUpperCase());
@ -77,7 +77,7 @@ var MAC = {
}
output_list.push(
"" // Empty line to delimit groups
'', // Empty line to delimit groups
);
});

View file

@ -4,7 +4,7 @@
* @author Unknown Male 282
* @namespace
*/
var Numberwang = {
const Numberwang = {
/**
* Numberwang operation. Remain indoors.
@ -13,11 +13,11 @@ var Numberwang = {
* @param {Object[]} args
* @returns {string}
*/
run: function(input, args) {
run(input, args) {
if (!input) return "Let's play Wangernumb!";
var match = input.match(/\d+/);
const match = input.match(/\d+/);
if (match) {
return match[0] + "! That's Numberwang!";
return `${match[0]}! That's Numberwang!`;
} else {
// That's a bad miss!
return "Sorry, that's not Numberwang. Let's rotate the board!";

View file

@ -7,7 +7,7 @@
*
* @namespace
*/
var OS = {
const OS = {
/**
* Parse UNIX file permissions operation.
@ -16,8 +16,8 @@ var OS = {
* @param {Object[]} args
* @returns {string}
*/
run_parse_unix_perms: function(input, args) {
var perms = {
run_parse_unix_perms(input, args) {
let perms = {
d: false, // directory
sl: false, // symbolic link
np: false, // named pipe
@ -36,13 +36,13 @@ var OS = {
eg: false, // execute group
ro: false, // read other
wo: false, // write other
eo : false // execute other
eo: false, // execute other
},
d = 0,
u = 0,
g = 0,
o = 0,
output = "",
output = '',
octal = null,
textual = null;
@ -81,114 +81,114 @@ var OS = {
textual = input.match(/\s*([dlpcbDrwxsStT-]{1,10})\s*/)[1];
switch (textual[0]) {
case "d":
case 'd':
perms.d = true;
break;
case "l":
case 'l':
perms.sl = true;
break;
case "p":
case 'p':
perms.np = true;
break;
case "s":
case 's':
perms.s = true;
break;
case "c":
case 'c':
perms.cd = true;
break;
case "b":
case 'b':
perms.bd = true;
break;
case "D":
case 'D':
perms.dr = true;
break;
}
if (textual.length > 1) perms.ru = textual[1] == "r";
if (textual.length > 2) perms.wu = textual[2] == "w";
if (textual.length > 1) perms.ru = textual[1] == 'r';
if (textual.length > 2) perms.wu = textual[2] == 'w';
if (textual.length > 3) {
switch (textual[3]) {
case "x":
case 'x':
perms.eu = true;
break;
case "s":
case 's':
perms.eu = true;
perms.su = true;
break;
case "S":
case 'S':
perms.su = true;
break;
}
}
if (textual.length > 4) perms.rg = textual[4] == "r";
if (textual.length > 5) perms.wg = textual[5] == "w";
if (textual.length > 4) perms.rg = textual[4] == 'r';
if (textual.length > 5) perms.wg = textual[5] == 'w';
if (textual.length > 6) {
switch (textual[6]) {
case "x":
case 'x':
perms.eg = true;
break;
case "s":
case 's':
perms.eg = true;
perms.sg = true;
break;
case "S":
case 'S':
perms.sg = true;
break;
}
}
if (textual.length > 7) perms.ro = textual[7] == "r";
if (textual.length > 8) perms.wo = textual[8] == "w";
if (textual.length > 7) perms.ro = textual[7] == 'r';
if (textual.length > 8) perms.wo = textual[8] == 'w';
if (textual.length > 9) {
switch (textual[9]) {
case "x":
case 'x':
perms.eo = true;
break;
case "t":
case 't':
perms.eo = true;
perms.sb = true;
break;
case "T":
case 'T':
perms.sb = true;
break;
}
}
} else {
return "Invalid input format.\nPlease enter the permissions in either octal (e.g. 755) or textual (e.g. drwxr-xr-x) format.";
return 'Invalid input format.\nPlease enter the permissions in either octal (e.g. 755) or textual (e.g. drwxr-xr-x) format.';
}
output += "Textual representation: " + OS._perms_to_str(perms);
output += "\nOctal representation: " + OS._perms_to_octal(perms);
output += `Textual representation: ${OS._perms_to_str(perms)}`;
output += `\nOctal representation: ${OS._perms_to_octal(perms)}`;
// File type
if (textual) {
output += "\nFile type: " + OS._ft_from_perms(perms);
output += `\nFile type: ${OS._ft_from_perms(perms)}`;
}
// setuid, setgid
if (perms.su) {
output += "\nThe setuid flag is set";
output += '\nThe setuid flag is set';
}
if (perms.sg) {
output += "\nThe setgid flag is set";
output += '\nThe setgid flag is set';
}
// sticky bit
if (perms.sb) {
output += "\nThe sticky bit is set";
output += '\nThe sticky bit is set';
}
// Permission matrix
output += "\n\n +---------+-------+-------+-------+\n" +
" | | User | Group | Other |\n" +
" +---------+-------+-------+-------+\n" +
" | Read | " + (perms.ru ? "X" : " ") + " | " + (perms.rg ? "X" : " ") + " | " + (perms.ro ? "X" : " ") + " |\n" +
" +---------+-------+-------+-------+\n" +
" | Write | " + (perms.wu ? "X" : " ") + " | " + (perms.wg ? "X" : " ") + " | " + (perms.wo ? "X" : " ") + " |\n" +
" +---------+-------+-------+-------+\n" +
" | Execute | " + (perms.eu ? "X" : " ") + " | " + (perms.eg ? "X" : " ") + " | " + (perms.eo ? "X" : " ") + " |\n" +
" +---------+-------+-------+-------+\n";
output += `${'\n\n +---------+-------+-------+-------+\n' +
' | | User | Group | Other |\n' +
' +---------+-------+-------+-------+\n' +
' | Read | '}${perms.ru ? 'X' : ' '} | ${perms.rg ? 'X' : ' '} | ${perms.ro ? 'X' : ' '} |\n` +
' +---------+-------+-------+-------+\n' +
` | Write | ${perms.wu ? 'X' : ' '} | ${perms.wg ? 'X' : ' '} | ${perms.wo ? 'X' : ' '} |\n` +
' +---------+-------+-------+-------+\n' +
` | Execute | ${perms.eu ? 'X' : ' '} | ${perms.eg ? 'X' : ' '} | ${perms.eo ? 'X' : ' '} |\n` +
' +---------+-------+-------+-------+\n';
return output;
},
@ -201,54 +201,54 @@ var OS = {
* @param {Object} perms
* @returns {string}
*/
_perms_to_str: function(perms) {
var str = "",
type = "-";
_perms_to_str(perms) {
let str = '',
type = '-';
if (perms.d) type = "d";
if (perms.sl) type = "l";
if (perms.np) type = "p";
if (perms.s) type = "s";
if (perms.cd) type = "c";
if (perms.bd) type = "b";
if (perms.dr) type = "D";
if (perms.d) type = 'd';
if (perms.sl) type = 'l';
if (perms.np) type = 'p';
if (perms.s) type = 's';
if (perms.cd) type = 'c';
if (perms.bd) type = 'b';
if (perms.dr) type = 'D';
str = type;
str += perms.ru ? "r" : "-";
str += perms.wu ? "w" : "-";
str += perms.ru ? 'r' : '-';
str += perms.wu ? 'w' : '-';
if (perms.eu && perms.su) {
str += "s";
str += 's';
} else if (perms.su) {
str += "S";
str += 'S';
} else if (perms.eu) {
str += "x";
str += 'x';
} else {
str += "-";
str += '-';
}
str += perms.rg ? "r" : "-";
str += perms.wg ? "w" : "-";
str += perms.rg ? 'r' : '-';
str += perms.wg ? 'w' : '-';
if (perms.eg && perms.sg) {
str += "s";
str += 's';
} else if (perms.sg) {
str += "S";
str += 'S';
} else if (perms.eg) {
str += "x";
str += 'x';
} else {
str += "-";
str += '-';
}
str += perms.ro ? "r" : "-";
str += perms.wo ? "w" : "-";
str += perms.ro ? 'r' : '-';
str += perms.wo ? 'w' : '-';
if (perms.eo && perms.sb) {
str += "t";
str += 't';
} else if (perms.sb) {
str += "T";
str += 'T';
} else if (perms.eo) {
str += "x";
str += 'x';
} else {
str += "-";
str += '-';
}
return str;
@ -262,8 +262,8 @@ var OS = {
* @param {Object} perms
* @returns {string}
*/
_perms_to_octal: function(perms) {
var d = 0,
_perms_to_octal(perms) {
let d = 0,
u = 0,
g = 0,
o = 0;
@ -295,15 +295,15 @@ var OS = {
* @param {Object} perms
* @returns {string}
*/
_ft_from_perms: function(perms) {
if (perms.d) return "Directory";
if (perms.sl) return "Symbolic link";
if (perms.np) return "Named pipe";
if (perms.s) return "Socket";
if (perms.cd) return "Character device";
if (perms.bd) return "Block device";
if (perms.dr) return "Door";
return "Regular file";
_ft_from_perms(perms) {
if (perms.d) return 'Directory';
if (perms.sl) return 'Symbolic link';
if (perms.np) return 'Named pipe';
if (perms.s) return 'Socket';
if (perms.cd) return 'Character device';
if (perms.bd) return 'Block device';
if (perms.dr) return 'Door';
return 'Regular file';
},
};

View file

@ -9,13 +9,13 @@
*
* @namespace
*/
var PublicKey = {
const PublicKey = {
/**
* @constant
* @default
*/
X509_INPUT_FORMAT: ["PEM", "DER Hex", "Base64", "Raw"],
X509_INPUT_FORMAT: ['PEM', 'DER Hex', 'Base64', 'Raw'],
/**
* Parse X.509 certificate operation.
@ -24,37 +24,37 @@ var PublicKey = {
* @param {Object[]} args
* @returns {string}
*/
run_parse_x509: function (input, args) {
var cert = new X509(),
run_parse_x509(input, args) {
let cert = new X509(),
input_format = args[0];
if (!input.length) {
return "No input";
return 'No input';
}
switch (input_format) {
case "DER Hex":
input = input.replace(/\s/g, "");
case 'DER Hex':
input = input.replace(/\s/g, '');
cert.hex = input;
cert.pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(input, "CERTIFICATE");
cert.pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(input, 'CERTIFICATE');
break;
case "PEM":
case 'PEM':
cert.hex = X509.pemToHex(input);
cert.pem = input;
break;
case "Base64":
cert.hex = Utils.to_hex(Utils.from_base64(input, null, "byte_array"), "");
cert.pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(cert.hex, "CERTIFICATE");
case 'Base64':
cert.hex = Utils.to_hex(Utils.from_base64(input, null, 'byte_array'), '');
cert.pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(cert.hex, 'CERTIFICATE');
break;
case "Raw":
cert.hex = Utils.to_hex(Utils.str_to_byte_array(input), "");
cert.pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(cert.hex, "CERTIFICATE");
case 'Raw':
cert.hex = Utils.to_hex(Utils.str_to_byte_array(input), '');
cert.pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(cert.hex, 'CERTIFICATE');
break;
default:
throw "Undefined input format";
throw 'Undefined input format';
}
var version = ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 0, 0]),
let version = ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 0, 0]),
sn = cert.getSerialNumberHex(),
algorithm = KJUR.asn1.x509.OID.oid2name(KJUR.asn1.ASN1Util.oidHexToInt(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 2, 0]))),
issuer = cert.getIssuerString(),
@ -64,105 +64,105 @@ var PublicKey = {
pk_algorithm = KJUR.asn1.x509.OID.oid2name(KJUR.asn1.ASN1Util.oidHexToInt(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 6, 0, 0]))),
pk = X509.getPublicKeyFromCertPEM(cert.pem),
pk_fields = [],
pk_str = "",
pk_str = '',
cert_sig_alg = KJUR.asn1.x509.OID.oid2name(KJUR.asn1.ASN1Util.oidHexToInt(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [1, 0]))),
cert_sig = ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [2]).substr(2),
sig_str = "",
sig_str = '',
extensions = ASN1HEX.dump(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 7]));
// Public Key fields
if (pk.type == "EC") { // ECDSA
if (pk.type == 'EC') { // ECDSA
pk_fields.push({
key: "Curve Name",
value: pk.curveName
key: 'Curve Name',
value: pk.curveName,
});
pk_fields.push({
key: "Length",
value: (((new BigInteger(pk.pubKeyHex, 16)).bitLength()-3) /2) + " bits"
key: 'Length',
value: `${((new BigInteger(pk.pubKeyHex, 16)).bitLength() - 3) / 2} bits`,
});
pk_fields.push({
key: "pub",
value: PublicKey._format_byte_str(pk.pubKeyHex, 16, 18)
key: 'pub',
value: PublicKey._format_byte_str(pk.pubKeyHex, 16, 18),
});
} else if (pk.type == "DSA") { // DSA
} else if (pk.type == 'DSA') { // DSA
pk_fields.push({
key: "pub",
value: PublicKey._format_byte_str(pk.y.toString(16), 16, 18)
key: 'pub',
value: PublicKey._format_byte_str(pk.y.toString(16), 16, 18),
});
pk_fields.push({
key: "P",
value: PublicKey._format_byte_str(pk.p.toString(16), 16, 18)
key: 'P',
value: PublicKey._format_byte_str(pk.p.toString(16), 16, 18),
});
pk_fields.push({
key: "Q",
value: PublicKey._format_byte_str(pk.q.toString(16), 16, 18)
key: 'Q',
value: PublicKey._format_byte_str(pk.q.toString(16), 16, 18),
});
pk_fields.push({
key: "G",
value: PublicKey._format_byte_str(pk.g.toString(16), 16, 18)
key: 'G',
value: PublicKey._format_byte_str(pk.g.toString(16), 16, 18),
});
} else if (pk.e) { // RSA
pk_fields.push({
key: "Length",
value: pk.n.bitLength() + " bits"
key: 'Length',
value: `${pk.n.bitLength()} bits`,
});
pk_fields.push({
key: "Modulus",
value: PublicKey._format_byte_str(pk.n.toString(16), 16, 18)
key: 'Modulus',
value: PublicKey._format_byte_str(pk.n.toString(16), 16, 18),
});
pk_fields.push({
key: "Exponent",
value: pk.e + " (0x" + pk.e.toString(16) + ")"
key: 'Exponent',
value: `${pk.e} (0x${pk.e.toString(16)})`,
});
} else {
pk_fields.push({
key: "Error",
value: "Unknown Public Key type"
key: 'Error',
value: 'Unknown Public Key type',
});
}
// Signature fields
if (ASN1HEX.dump(cert_sig).indexOf("SEQUENCE") === 0) { // DSA or ECDSA
sig_str = " r: " + PublicKey._format_byte_str(ASN1HEX.getDecendantHexVByNthList(cert_sig, 0, [0]), 16, 18) + "\n" +
" s: " + PublicKey._format_byte_str(ASN1HEX.getDecendantHexVByNthList(cert_sig, 0, [1]), 16, 18) + "\n";
if (ASN1HEX.dump(cert_sig).indexOf('SEQUENCE') === 0) { // DSA or ECDSA
sig_str = ` r: ${PublicKey._format_byte_str(ASN1HEX.getDecendantHexVByNthList(cert_sig, 0, [0]), 16, 18)}\n` +
` s: ${PublicKey._format_byte_str(ASN1HEX.getDecendantHexVByNthList(cert_sig, 0, [1]), 16, 18)}\n`;
} else { // RSA
sig_str = " Signature: " + PublicKey._format_byte_str(cert_sig, 16, 18) + "\n";
sig_str = ` Signature: ${PublicKey._format_byte_str(cert_sig, 16, 18)}\n`;
}
// Format Public Key fields
for (var i = 0; i < pk_fields.length; i++) {
pk_str += " " + pk_fields[i].key + ":" +
for (let i = 0; i < pk_fields.length; i++) {
pk_str += ` ${pk_fields[i].key}:${
Utils.pad_left(
pk_fields[i].value + "\n",
`${pk_fields[i].value}\n`,
18 - (pk_fields[i].key.length + 3) + pk_fields[i].value.length + 1,
" "
);
' ',
)}`;
}
var issuer_str = PublicKey._format_dn_str(issuer, 2),
let issuer_str = PublicKey._format_dn_str(issuer, 2),
nb_date = PublicKey._format_date(not_before),
na_date = PublicKey._format_date(not_after),
subject_str = PublicKey._format_dn_str(subject, 2),
cert_sig_str = PublicKey._format_byte_str(cert_sig, 16, 18);
var output = "Version: " + (parseInt(version, 16) + 1) + " (0x" + version + ")\n" +
"Serial number: " + new BigInteger(sn, 16).toString() + " (0x" + sn + ")\n" +
"Algorithm ID: " + algorithm + "\n" +
"Validity\n" +
" Not Before: " + nb_date + " (dd-mm-yy hh:mm:ss) (" + not_before + ")\n" +
" Not After: " + na_date + " (dd-mm-yy hh:mm:ss) (" + not_after + ")\n" +
"Issuer\n" +
issuer_str +
"Subject\n" +
subject_str +
"Public Key\n" +
" Algorithm: " + pk_algorithm + "\n" +
pk_str +
"Certificate Signature\n" +
" Algorithm: " + cert_sig_alg + "\n" +
sig_str +
"\nExtensions (parsed ASN.1)\n" +
extensions;
const output = `Version: ${parseInt(version, 16) + 1} (0x${version})\n` +
`Serial number: ${new BigInteger(sn, 16).toString()} (0x${sn})\n` +
`Algorithm ID: ${algorithm}\n` +
'Validity\n' +
` Not Before: ${nb_date} (dd-mm-yy hh:mm:ss) (${not_before})\n` +
` Not After: ${na_date} (dd-mm-yy hh:mm:ss) (${not_after})\n` +
`Issuer\n${
issuer_str
}Subject\n${
subject_str
}Public Key\n` +
` Algorithm: ${pk_algorithm}\n${
pk_str
}Certificate Signature\n` +
` Algorithm: ${cert_sig_alg}\n${
sig_str
}\nExtensions (parsed ASN.1)\n${
extensions}`;
return output;
},
@ -175,14 +175,14 @@ var PublicKey = {
* @param {Object[]} args
* @returns {string}
*/
run_pem_to_hex: function(input, args) {
if (input.indexOf("-----BEGIN") < 0) {
run_pem_to_hex(input, args) {
if (input.indexOf('-----BEGIN') < 0) {
// Add header so that the KEYUTIL function works
input = "-----BEGIN CERTIFICATE-----" + input;
input = `-----BEGIN CERTIFICATE-----${input}`;
}
if (input.indexOf("-----END") < 0) {
if (input.indexOf('-----END') < 0) {
// Add footer so that the KEYUTIL function works
input = input + "-----END CERTIFICATE-----";
input = `${input}-----END CERTIFICATE-----`;
}
return KEYUTIL.getHexFromPEM(input);
},
@ -192,7 +192,7 @@ var PublicKey = {
* @constant
* @default
*/
PEM_HEADER_STRING: "CERTIFICATE",
PEM_HEADER_STRING: 'CERTIFICATE',
/**
* Hex to PEM operation.
@ -201,8 +201,8 @@ var PublicKey = {
* @param {Object[]} args
* @returns {string}
*/
run_hex_to_pem: function(input, args) {
return KJUR.asn1.ASN1Util.getPEMStringFromHex(input.replace(/\s/g, ""), args[0]);
run_hex_to_pem(input, args) {
return KJUR.asn1.ASN1Util.getPEMStringFromHex(input.replace(/\s/g, ''), args[0]);
},
@ -213,8 +213,8 @@ var PublicKey = {
* @param {Object[]} args
* @returns {string}
*/
run_hex_to_object_identifier: function(input, args) {
return KJUR.asn1.ASN1Util.oidHexToInt(input.replace(/\s/g, ""));
run_hex_to_object_identifier(input, args) {
return KJUR.asn1.ASN1Util.oidHexToInt(input.replace(/\s/g, ''));
},
@ -225,7 +225,7 @@ var PublicKey = {
* @param {Object[]} args
* @returns {string}
*/
run_object_identifier_to_hex: function(input, args) {
run_object_identifier_to_hex(input, args) {
return KJUR.asn1.ASN1Util.oidIntToHex(input);
},
@ -243,11 +243,11 @@ var PublicKey = {
* @param {Object[]} args
* @returns {string}
*/
run_parse_asn1_hex_string: function(input, args) {
var truncate_len = args[1],
run_parse_asn1_hex_string(input, args) {
let truncate_len = args[1],
index = args[0];
return ASN1HEX.dump(input.replace(/\s/g, ""), {
"ommit_long_octet": truncate_len
return ASN1HEX.dump(input.replace(/\s/g, ''), {
ommit_long_octet: truncate_len,
}, index);
},
@ -260,9 +260,9 @@ var PublicKey = {
* @param {number} indent
* @returns {string}
*/
_format_dn_str: function(dn_str, indent) {
var output = "",
fields = dn_str.split(",/|"),
_format_dn_str(dn_str, indent) {
let output = '',
fields = dn_str.split(',/|'),
max_key_len = 0,
key,
value,
@ -271,7 +271,7 @@ var PublicKey = {
for (var i = 0; i < fields.length; i++) {
if (!fields[i].length) continue;
key = fields[i].split("=")[0];
key = fields[i].split('=')[0];
max_key_len = key.length > max_key_len ? key.length : max_key_len;
}
@ -279,11 +279,11 @@ var PublicKey = {
for (i = 0; i < fields.length; i++) {
if (!fields[i].length) continue;
key = fields[i].split("=")[0];
value = fields[i].split("=")[1];
str = Utils.pad_right(key, max_key_len) + " = " + value + "\n";
key = fields[i].split('=')[0];
value = fields[i].split('=')[1];
str = `${Utils.pad_right(key, max_key_len)} = ${value}\n`;
output += Utils.pad_left(str, indent + str.length, " ");
output += Utils.pad_left(str, indent + str.length, ' ');
}
return output;
@ -299,17 +299,17 @@ var PublicKey = {
* @param {number} indent
* @returns {string}
*/
_format_byte_str: function(byte_str, length, indent) {
byte_str = Utils.to_hex(Utils.from_hex(byte_str), ":");
length = length * 3;
var output = "";
_format_byte_str(byte_str, length, indent) {
byte_str = Utils.to_hex(Utils.from_hex(byte_str), ':');
length *= 3;
let output = '';
for (var i = 0; i < byte_str.length; i += length) {
var str = byte_str.slice(i, i + length) + "\n";
for (let i = 0; i < byte_str.length; i += length) {
const str = `${byte_str.slice(i, i + length)}\n`;
if (i === 0) {
output += str;
} else {
output += Utils.pad_left(str, indent + str.length, " ");
output += Utils.pad_left(str, indent + str.length, ' ');
}
}
@ -324,13 +324,13 @@ var PublicKey = {
* @param {string} date_str
* @returns {string}
*/
_format_date: function(date_str) {
return date_str[4] + date_str[5] + "/" +
date_str[2] + date_str[3] + "/" +
date_str[0] + date_str[1] + " " +
date_str[6] + date_str[7] + ":" +
date_str[8] + date_str[9] + ":" +
date_str[10] + date_str[11];
_format_date(date_str) {
return `${date_str[4] + date_str[5]}/${
date_str[2]}${date_str[3]}/${
date_str[0]}${date_str[1]} ${
date_str[6]}${date_str[7]}:${
date_str[8]}${date_str[9]}:${
date_str[10]}${date_str[11]}`;
},
};
@ -344,11 +344,11 @@ var PublicKey = {
* @returns {string}
*/
X509.hex2dn = function (hDN) {
var s = "";
var a = ASN1HEX.getPosArrayOfChildren_AtObj(hDN, 0);
for (var i = 0; i < a.length; i++) {
var hRDN = ASN1HEX.getHexOfTLV_AtObj(hDN, a[i]);
s = s + ",/|" + X509.hex2rdn(hRDN);
let s = '';
const a = ASN1HEX.getPosArrayOfChildren_AtObj(hDN, 0);
for (let i = 0; i < a.length; i++) {
const hRDN = ASN1HEX.getHexOfTLV_AtObj(hDN, a[i]);
s = `${s},/|${X509.hex2rdn(hRDN)}`;
}
return s;
};
@ -1049,5 +1049,5 @@ X509.DN_ATTRHEX = {
'06035508': 'X.500-Algorithms',
'0603550801': 'X.500-Alg-Encryption',
'060355080101': 'rsa',
'0603604c0101' : 'DPC'
'0603604c0101': 'DPC',
};

View file

@ -9,7 +9,7 @@
*
* @namespace
*/
var Punycode = {
const Punycode = {
/**
* @constant
@ -24,8 +24,8 @@ var Punycode = {
* @param {Object[]} args
* @returns {string}
*/
run_to_ascii: function(input, args) {
var idn = args[0];
run_to_ascii(input, args) {
const idn = args[0];
if (idn) {
return punycode.ToASCII(input);
@ -42,8 +42,8 @@ var Punycode = {
* @param {Object[]} args
* @returns {string}
*/
run_to_unicode: function(input, args) {
var idn = args[0];
run_to_unicode(input, args) {
const idn = args[0];
if (idn) {
return punycode.ToUnicode(input);

View file

@ -30,7 +30,7 @@
*
* @namespace
*/
var QuotedPrintable = {
const QuotedPrintable = {
/**
* To Quoted Printable operation.
@ -39,17 +39,13 @@ var QuotedPrintable = {
* @param {Object[]} args
* @returns {string}
*/
run_to: function (input, args) {
var mimeEncodedStr = QuotedPrintable.mimeEncode(input);
run_to(input, args) {
let mimeEncodedStr = QuotedPrintable.mimeEncode(input);
// fix line breaks
mimeEncodedStr = mimeEncodedStr.replace(/\r?\n|\r/g, function() {
return "\r\n";
}).replace(/[\t ]+$/gm, function(spaces) {
return spaces.replace(/ /g, "=20").replace(/\t/g, "=09");
});
mimeEncodedStr = mimeEncodedStr.replace(/\r?\n|\r/g, () => '\r\n').replace(/[\t ]+$/gm, spaces => spaces.replace(/ /g, '=20').replace(/\t/g, '=09'));
return QuotedPrintable._addSoftLinebreaks(mimeEncodedStr, "qp");
return QuotedPrintable._addSoftLinebreaks(mimeEncodedStr, 'qp');
},
@ -60,8 +56,8 @@ var QuotedPrintable = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_from: function (input, args) {
var str = input.replace(/\=(?:\r?\n|$)/g, "");
run_from(input, args) {
const str = input.replace(/\=(?:\r?\n|$)/g, '');
return QuotedPrintable.mimeDecode(str);
},
@ -72,16 +68,17 @@ var QuotedPrintable = {
* @param {string} str
* @returns {byte_array}
*/
mimeDecode: function(str) {
var encodedBytesCount = (str.match(/\=[\da-fA-F]{2}/g) || []).length,
mimeDecode(str) {
let encodedBytesCount = (str.match(/\=[\da-fA-F]{2}/g) || []).length,
bufferLength = str.length - encodedBytesCount * 2,
chr, hex,
chr,
hex,
buffer = new Array(bufferLength),
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);
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);
i += 2;
continue;
@ -99,8 +96,8 @@ var QuotedPrintable = {
* @param {byte_array} buffer
* @returns {string}
*/
mimeEncode: function(buffer) {
var ranges = [
mimeEncode(buffer) {
let ranges = [
[0x09],
[0x0A],
[0x0D],
@ -109,16 +106,16 @@ var QuotedPrintable = {
[0x23, 0x3C],
[0x3E],
[0x40, 0x5E],
[0x60, 0x7E]
[0x60, 0x7E],
],
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)) {
result += String.fromCharCode(buffer[i]);
continue;
}
result += "=" + (buffer[i] < 0x10 ? "0" : "") + buffer[i].toString(16).toUpperCase();
result += `=${buffer[i] < 0x10 ? '0' : ''}${buffer[i].toString(16).toUpperCase()}`;
}
return result;
@ -133,15 +130,18 @@ var QuotedPrintable = {
* @param {byte_array[]} ranges
* @returns {bolean}
*/
_checkRanges: function(nr, ranges) {
for (var i = ranges.length - 1; i >= 0; i--) {
if (!ranges[i].length)
_checkRanges(nr, ranges) {
for (let i = ranges.length - 1; i >= 0; i--) {
if (!ranges[i].length) {
continue;
if (ranges[i].length == 1 && nr == ranges[i][0])
}
if (ranges[i].length == 1 && nr == ranges[i][0]) {
return true;
if (ranges[i].length == 2 && nr >= ranges[i][0] && nr <= ranges[i][1])
}
if (ranges[i].length == 2 && nr >= ranges[i][0] && nr <= ranges[i][1]) {
return true;
}
}
return false;
},
@ -156,12 +156,12 @@ var QuotedPrintable = {
* @param {string} encoding
* @returns {string}
*/
_addSoftLinebreaks: function(str, encoding) {
var lineLengthMax = 76;
_addSoftLinebreaks(str, encoding) {
const lineLengthMax = 76;
encoding = (encoding || "base64").toString().toLowerCase().trim();
encoding = (encoding || 'base64').toString().toLowerCase().trim();
if (encoding == "qp") {
if (encoding == 'qp') {
return this._addQPSoftLinebreaks(str, lineLengthMax);
} else {
return this._addBase64SoftLinebreaks(str, lineLengthMax);
@ -177,9 +177,9 @@ var QuotedPrintable = {
* @param {number} lineLengthMax
* @returns {string}
*/
_addBase64SoftLinebreaks: function(base64EncodedStr, lineLengthMax) {
base64EncodedStr = (base64EncodedStr || "").toString().trim();
return base64EncodedStr.replace(new RegExp(".{" + lineLengthMax + "}", "g"), "$&\r\n").trim();
_addBase64SoftLinebreaks(base64EncodedStr, lineLengthMax) {
base64EncodedStr = (base64EncodedStr || '').toString().trim();
return base64EncodedStr.replace(new RegExp(`.{${lineLengthMax}}`, 'g'), '$&\r\n').trim();
},
@ -191,12 +191,14 @@ var QuotedPrintable = {
* @param {number} lineLengthMax
* @returns {string}
*/
_addQPSoftLinebreaks: function(mimeEncodedStr, lineLengthMax) {
var pos = 0,
_addQPSoftLinebreaks(mimeEncodedStr, lineLengthMax) {
let pos = 0,
len = mimeEncodedStr.length,
match, code, line,
match,
code,
line,
lineMargin = Math.floor(lineLengthMax / 3),
result = "";
result = '';
// insert soft linebreaks where needed
while (pos < len) {
@ -208,7 +210,7 @@ var QuotedPrintable = {
continue;
}
if (line.substr(-1) == "\n") {
if (line.substr(-1) == '\n') {
// nothing to change here
result += line;
pos += line.length;
@ -222,11 +224,9 @@ var QuotedPrintable = {
} else if (line.length > lineLengthMax - lineMargin && (match = line.substr(-lineMargin).match(/[ \t\.,!\?][^ \t\.,!\?]*$/))) {
// truncate to nearest space
line = line.substr(0, line.length - (match[0].length - 1));
} else if (line.substr(-1) == "\r") {
} else if (line.substr(-1) == '\r') {
line = line.substr(0, line.length - 1);
} else {
if (line.match(/\=[\da-f]{0,2}$/i)) {
} else if (line.match(/\=[\da-f]{0,2}$/i)) {
// push incomplete encoding sequences to the next line
if ((match = line.match(/\=[\da-f]{0,1}$/i))) {
line = line.substr(0, line.length - match[0].length);
@ -245,18 +245,16 @@ var QuotedPrintable = {
break;
}
}
}
}
if (pos + line.length < len && line.substr(-1) != "\n") {
if (pos + line.length < len && line.substr(-1) != '\n') {
if (line.length == 76 && line.match(/\=[\da-f]{2}$/i)) {
line = line.substr(0, line.length - 3);
} else if (line.length == 76) {
line = line.substr(0, line.length - 1);
}
pos += line.length;
line += "=\r\n";
line += '=\r\n';
} else {
pos += line.length;
}

View file

@ -9,7 +9,7 @@
*
* @todo Support for UTF16
*/
var Rotate = {
const Rotate = {
/**
* @constant
@ -31,11 +31,11 @@ var Rotate = {
* @param {function} algo - The rotation operation to carry out
* @returns {byte_array}
*/
_rot: function(data, amount, algo) {
var result = [];
for (var i = 0; i < data.length; i++) {
var b = data[i];
for (var j = 0; j < amount; j++) {
_rot(data, amount, algo) {
const result = [];
for (let i = 0; i < data.length; i++) {
let b = data[i];
for (let j = 0; j < amount; j++) {
b = algo(b);
}
result.push(b);
@ -51,7 +51,7 @@ var Rotate = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_rotr: function(input, args) {
run_rotr(input, args) {
if (args[1]) {
return Rotate._rotr_whole(input, args[0]);
} else {
@ -67,7 +67,7 @@ var Rotate = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_rotl: function(input, args) {
run_rotl(input, args) {
if (args[1]) {
return Rotate._rotl_whole(input, args[0]);
} else {
@ -99,8 +99,8 @@ var Rotate = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_rot13: function(input, args) {
var amount = args[2],
run_rot13(input, args) {
let amount = args[2],
output = input,
chr,
rot13_lowercase = args[0],
@ -111,7 +111,7 @@ var Rotate = {
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];
if (rot13_upperacse && chr >= 65 && chr <= 90) { // Upper case
chr = (chr - 65 + amount) % 26;
@ -133,8 +133,8 @@ var Rotate = {
* @param {byte} b
* @returns {byte}
*/
_rotr: function(b) {
var bit = (b & 1) << 7;
_rotr(b) {
const bit = (b & 1) << 7;
return (b >> 1) | bit;
},
@ -146,8 +146,8 @@ var Rotate = {
* @param {byte} b
* @returns {byte}
*/
_rotl: function(b) {
var bit = (b >> 7) & 1;
_rotl(b) {
const bit = (b >> 7) & 1;
return ((b << 1) | bit) & 0xFF;
},
@ -161,14 +161,14 @@ var Rotate = {
* @param {number} amount
* @returns {byte_array}
*/
_rotr_whole: function(data, amount) {
var carry_bits = 0,
_rotr_whole(data, amount) {
let carry_bits = 0,
new_byte,
result = [];
amount = amount % 8;
for (var i = 0; i < data.length; i++) {
var old_byte = data[i] >>> 0;
amount %= 8;
for (let i = 0; i < data.length; i++) {
const old_byte = data[i] >>> 0;
new_byte = (old_byte >> amount) | carry_bits;
carry_bits = (old_byte & (Math.pow(2, amount) - 1)) << (8 - amount);
result.push(new_byte);
@ -187,14 +187,14 @@ var Rotate = {
* @param {number} amount
* @returns {byte_array}
*/
_rotl_whole: function(data, amount) {
var carry_bits = 0,
_rotl_whole(data, amount) {
let carry_bits = 0,
new_byte,
result = [];
amount = amount % 8;
for (var i = data.length-1; i >= 0; i--) {
var old_byte = data[i];
amount %= 8;
for (let i = data.length - 1; i >= 0; i--) {
const old_byte = data[i];
new_byte = ((old_byte << amount) | carry_bits) & 0xFF;
carry_bits = (old_byte >> (8 - amount)) & (Math.pow(2, amount) - 1);
result[i] = (new_byte);

View file

@ -7,13 +7,13 @@
*
* @namespace
*/
var SeqUtils = {
const SeqUtils = {
/**
* @constant
* @default
*/
DELIMITER_OPTIONS: ["Line feed", "CRLF", "Space", "Comma", "Semi-colon", "Colon", "Nothing (separate chars)"],
DELIMITER_OPTIONS: ['Line feed', 'CRLF', 'Space', 'Comma', 'Semi-colon', 'Colon', 'Nothing (separate chars)'],
/**
* @constant
* @default
@ -23,7 +23,7 @@ var SeqUtils = {
* @constant
* @default
*/
SORT_ORDER: ["Alphabetical (case sensitive)", "Alphabetical (case insensitive)", "IP address"],
SORT_ORDER: ['Alphabetical (case sensitive)', 'Alphabetical (case insensitive)', 'IP address'],
/**
* Sort operation.
@ -32,17 +32,17 @@ var SeqUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_sort: function (input, args) {
var delim = Utils.char_rep[args[0]],
run_sort(input, args) {
let delim = Utils.char_rep[args[0]],
sort_reverse = args[1],
order = args[2],
sorted = input.split(delim);
if (order == "Alphabetical (case sensitive)") {
if (order == 'Alphabetical (case sensitive)') {
sorted = sorted.sort();
} else if (order == "Alphabetical (case insensitive)") {
} else if (order == 'Alphabetical (case insensitive)') {
sorted = sorted.sort(SeqUtils._case_insensitive_sort);
} else if (order == "IP address") {
} else if (order == 'IP address') {
sorted = sorted.sort(SeqUtils._ip_sort);
}
@ -58,8 +58,8 @@ var SeqUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_unique: function (input, args) {
var delim = Utils.char_rep[args[0]];
run_unique(input, args) {
const delim = Utils.char_rep[args[0]];
return input.split(delim).unique().join(delim);
},
@ -68,7 +68,7 @@ var SeqUtils = {
* @constant
* @default
*/
SEARCH_TYPE: ["Regex", "Extended (\\n, \\t, \\x...)", "Simple string"],
SEARCH_TYPE: ['Regex', 'Extended (\\n, \\t, \\x...)', 'Simple string'],
/**
* Count occurrences operation.
@ -77,20 +77,20 @@ var SeqUtils = {
* @param {Object[]} args
* @returns {number}
*/
run_count: function(input, args) {
var search = args[0].string,
run_count(input, args) {
let search = args[0].string,
type = args[0].option;
if (type == "Regex" && search) {
if (type == 'Regex' && search) {
try {
var regex = new RegExp(search, "gi"),
let regex = new RegExp(search, 'gi'),
matches = input.match(regex);
return matches.length;
} catch (err) {
return 0;
}
} else if (search) {
if (type.indexOf("Extended") === 0) {
if (type.indexOf('Extended') === 0) {
search = Utils.parse_escaped_chars(search);
}
return input.count(search);
@ -104,7 +104,7 @@ var SeqUtils = {
* @constant
* @default
*/
REVERSE_BY: ["Character", "Line"],
REVERSE_BY: ['Character', 'Line'],
/**
* Reverse operation.
@ -113,9 +113,9 @@ var SeqUtils = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_reverse: function (input, args) {
if (args[0] == "Line") {
var lines = [],
run_reverse(input, args) {
if (args[0] == 'Line') {
let lines = [],
line = [],
result = [];
for (var i = 0; i < input.length; i++) {
@ -146,13 +146,13 @@ var SeqUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_add_line_numbers: function(input, args) {
var lines = input.split("\n"),
output = "",
run_add_line_numbers(input, args) {
let lines = input.split('\n'),
output = '',
width = lines.length.toString().length;
for (var n = 0; n < lines.length; n++) {
output += Utils.pad((n+1).toString(), width, " ") + " " + lines[n] + "\n";
for (let n = 0; n < lines.length; n++) {
output += `${Utils.pad((n + 1).toString(), width, ' ')} ${lines[n]}\n`;
}
return output.slice(0, output.length - 1);
},
@ -165,8 +165,8 @@ var SeqUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_remove_line_numbers: function(input, args) {
return input.replace(/^[ \t]{0,5}\d+[\s:|\-,.)\]]/gm, "");
run_remove_line_numbers(input, args) {
return input.replace(/^[ \t]{0,5}\d+[\s:|\-,.)\]]/gm, '');
},
@ -177,7 +177,7 @@ var SeqUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_expand_alph_range: function(input, args) {
run_expand_alph_range(input, args) {
return Utils.expand_alph_range(input).join(args[0]);
},
@ -190,7 +190,7 @@ var SeqUtils = {
* @param {string} b
* @returns {number}
*/
_case_insensitive_sort: function(a, b) {
_case_insensitive_sort(a, b) {
return a.toLowerCase().localeCompare(b.toLowerCase());
},
@ -203,9 +203,9 @@ var SeqUtils = {
* @param {string} b
* @returns {number}
*/
_ip_sort: function(a, b) {
var a_ = a.split("."),
b_ = b.split(".");
_ip_sort(a, b) {
let a_ = a.split('.'),
b_ = b.split('.');
a_ = a_[0] * 0x1000000 + a_[1] * 0x10000 + a_[2] * 0x100 + a_[3] * 1;
b_ = b_[0] * 0x1000000 + b_[1] * 0x10000 + b_[2] * 0x100 + b_[3] * 1;

View file

@ -9,7 +9,7 @@
*
* @namespace
*/
var StrUtils = {
const StrUtils = {
/**
* @constant
@ -17,56 +17,56 @@ var StrUtils = {
*/
REGEX_PRE_POPULATE: [
{
name: "User defined",
value: ""
name: 'User defined',
value: '',
},
{
name: "IPv4 address",
value: "(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?"
name: 'IPv4 address',
value: '(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?',
},
{
name: "IPv6 address",
value: "((?=.*::)(?!.*::.+::)(::)?([\\dA-Fa-f]{1,4}:(:|\\b)|){5}|([\\dA-Fa-f]{1,4}:){6})((([\\dA-Fa-f]{1,4}((?!\\3)::|:\\b|(?![\\dA-Fa-f])))|(?!\\2\\3)){2}|(((2[0-4]|1\\d|[1-9])?\\d|25[0-5])\\.?\\b){4})"
name: 'IPv6 address',
value: '((?=.*::)(?!.*::.+::)(::)?([\\dA-Fa-f]{1,4}:(:|\\b)|){5}|([\\dA-Fa-f]{1,4}:){6})((([\\dA-Fa-f]{1,4}((?!\\3)::|:\\b|(?![\\dA-Fa-f])))|(?!\\2\\3)){2}|(((2[0-4]|1\\d|[1-9])?\\d|25[0-5])\\.?\\b){4})',
},
{
name: "Email address",
value: "(\\w[-.\\w]*)@([-\\w]+(?:\\.[-\\w]+)*)\\.([A-Za-z]{2,4})"
name: 'Email address',
value: '(\\w[-.\\w]*)@([-\\w]+(?:\\.[-\\w]+)*)\\.([A-Za-z]{2,4})',
},
{
name: "URL",
value: "([A-Za-z]+://)([-\\w]+(?:\\.\\w[-\\w]*)+)(:\\d+)?(/[^.!,?;\"\\x27<>()\\[\\]{}\\s\\x7F-\\xFF]*(?:[.!,?]+[^.!,?;\"\\x27<>()\\[\\]{}\\s\\x7F-\\xFF]+)*)?"
name: 'URL',
value: '([A-Za-z]+://)([-\\w]+(?:\\.\\w[-\\w]*)+)(:\\d+)?(/[^.!,?;"\\x27<>()\\[\\]{}\\s\\x7F-\\xFF]*(?:[.!,?]+[^.!,?;"\\x27<>()\\[\\]{}\\s\\x7F-\\xFF]+)*)?',
},
{
name: "Domain",
value: "(?:(https?):\\/\\/)?([-\\w.]+)\\.(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)+"
name: 'Domain',
value: '(?:(https?):\\/\\/)?([-\\w.]+)\\.(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)+',
},
{
name: "Windows file path",
value: "([A-Za-z]):\\\\((?:[A-Za-z\\d][A-Za-z\\d\\- \\x27_\\(\\)]{0,61}\\\\?)*[A-Za-z\\d][A-Za-z\\d\\- \\x27_\\(\\)]{0,61})(\\.[A-Za-z\\d]{1,6})?"
name: 'Windows file path',
value: '([A-Za-z]):\\\\((?:[A-Za-z\\d][A-Za-z\\d\\- \\x27_\\(\\)]{0,61}\\\\?)*[A-Za-z\\d][A-Za-z\\d\\- \\x27_\\(\\)]{0,61})(\\.[A-Za-z\\d]{1,6})?',
},
{
name: "UNIX file path",
value: "(?:/[A-Za-z\\d.][A-Za-z\\d\\-.]{0,61})+"
name: 'UNIX file path',
value: '(?:/[A-Za-z\\d.][A-Za-z\\d\\-.]{0,61})+',
},
{
name: "MAC address",
value: "[A-Fa-f\\d]{2}(?:[:-][A-Fa-f\\d]{2}){5}"
name: 'MAC address',
value: '[A-Fa-f\\d]{2}(?:[:-][A-Fa-f\\d]{2}){5}',
},
{
name: "Date (yyyy-mm-dd)",
value: "((?:19|20)\\d\\d)[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])"
name: 'Date (yyyy-mm-dd)',
value: '((?:19|20)\\d\\d)[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])',
},
{
name: "Date (dd/mm/yyyy)",
value: "(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((?:19|20)\\d\\d)"
name: 'Date (dd/mm/yyyy)',
value: '(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((?:19|20)\\d\\d)',
},
{
name: "Date (mm/dd/yyyy)",
value: "(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.]((?:19|20)\\d\\d)"
name: 'Date (mm/dd/yyyy)',
value: '(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.]((?:19|20)\\d\\d)',
},
{
name: "Strings",
value: "[A-Za-z\\d/\\-:.,_$%\\x27\"()<>= !\\[\\]{}@]{4,}"
name: 'Strings',
value: '[A-Za-z\\d/\\-:.,_$%\\x27"()<>= !\\[\\]{}@]{4,}',
},
],
/**
@ -83,7 +83,7 @@ var StrUtils = {
* @constant
* @default
*/
OUTPUT_FORMAT: ["Highlight matches", "List matches", "List capture groups", "List matches with capture groups"],
OUTPUT_FORMAT: ['Highlight matches', 'List matches', 'List capture groups', 'List matches with capture groups'],
/**
* @constant
* @default
@ -97,35 +97,35 @@ var StrUtils = {
* @param {Object[]} args
* @returns {html}
*/
run_regex: function(input, args) {
var user_regex = args[1],
run_regex(input, args) {
let user_regex = args[1],
i = args[2],
m = args[3],
display_total = args[4],
output_format = args[5],
modifiers = "g";
modifiers = 'g';
if (i) modifiers += "i";
if (m) modifiers += "m";
if (i) modifiers += 'i';
if (m) modifiers += 'm';
if (user_regex && user_regex != "^" && user_regex != "$") {
if (user_regex && user_regex != '^' && user_regex != '$') {
try {
var regex = new RegExp(user_regex, modifiers);
const regex = new RegExp(user_regex, modifiers);
switch (output_format) {
case "Highlight matches":
case 'Highlight matches':
return StrUtils._regex_highlight(input, regex, display_total);
case "List matches":
case 'List matches':
return Utils.escape_html(StrUtils._regex_list(input, regex, display_total, true, false));
case "List capture groups":
case 'List capture groups':
return Utils.escape_html(StrUtils._regex_list(input, regex, display_total, false, true));
case "List matches with capture groups":
case 'List matches with capture groups':
return Utils.escape_html(StrUtils._regex_list(input, regex, display_total, true, true));
default:
return "Error: Invalid output format";
return 'Error: Invalid output format';
}
} catch (err) {
return "Invalid regex. Details: " + err.message;
return `Invalid regex. Details: ${err.message}`;
}
} else {
return Utils.escape_html(input);
@ -137,7 +137,7 @@ var StrUtils = {
* @constant
* @default
*/
CASE_SCOPE: ["All", "Word", "Sentence", "Paragraph"],
CASE_SCOPE: ['All', 'Word', 'Sentence', 'Paragraph'],
/**
* To Upper case operation.
@ -146,23 +146,17 @@ var StrUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_upper: function (input, args) {
var scope = args[0];
run_upper(input, args) {
const scope = args[0];
switch (scope) {
case "Word":
return input.replace(/(\b\w)/gi, function(m) {
return m.toUpperCase();
});
case "Sentence":
return input.replace(/(?:\.|^)\s*(\b\w)/gi, function(m) {
return m.toUpperCase();
});
case "Paragraph":
return input.replace(/(?:\n|^)\s*(\b\w)/gi, function(m) {
return m.toUpperCase();
});
case "All":
case 'Word':
return input.replace(/(\b\w)/gi, m => m.toUpperCase());
case 'Sentence':
return input.replace(/(?:\.|^)\s*(\b\w)/gi, m => m.toUpperCase());
case 'Paragraph':
return input.replace(/(?:\n|^)\s*(\b\w)/gi, m => m.toUpperCase());
case 'All':
/* falls through */
default:
return input.toUpperCase();
@ -177,7 +171,7 @@ var StrUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_lower: function (input, args) {
run_lower(input, args) {
return input.toLowerCase();
},
@ -186,7 +180,7 @@ var StrUtils = {
* @constant
* @default
*/
SEARCH_TYPE: ["Regex", "Extended (\\n, \\t, \\x...)", "Simple string"],
SEARCH_TYPE: ['Regex', 'Extended (\\n, \\t, \\x...)', 'Simple string'],
/**
* @constant
* @default
@ -210,22 +204,22 @@ var StrUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_find_replace: function(input, args) {
var find = args[0].string,
run_find_replace(input, args) {
let find = args[0].string,
type = args[0].option,
replace = args[1],
g = args[2],
i = args[3],
m = args[4],
modifiers = "";
modifiers = '';
if (g) modifiers += "g";
if (i) modifiers += "i";
if (m) modifiers += "m";
if (g) modifiers += 'g';
if (i) modifiers += 'i';
if (m) modifiers += 'm';
if (type == "Regex") {
if (type == 'Regex') {
find = new RegExp(find, modifiers);
} else if (type.indexOf("Extended") === 0) {
} else if (type.indexOf('Extended') === 0) {
find = Utils.parse_escaped_chars(find);
}
@ -240,12 +234,12 @@ var StrUtils = {
* @constant
* @default
*/
SPLIT_DELIM: ",",
SPLIT_DELIM: ',',
/**
* @constant
* @default
*/
DELIMITER_OPTIONS: ["Line feed", "CRLF", "Space", "Comma", "Semi-colon", "Colon", "Nothing (separate chars)"],
DELIMITER_OPTIONS: ['Line feed', 'CRLF', 'Space', 'Comma', 'Semi-colon', 'Colon', 'Nothing (separate chars)'],
/**
* Split operation.
@ -254,8 +248,8 @@ var StrUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_split: function(input, args) {
var split_delim = args[0] || StrUtils.SPLIT_DELIM,
run_split(input, args) {
let split_delim = args[0] || StrUtils.SPLIT_DELIM,
join_delim = Utils.char_rep[args[1]],
sections = input.split(split_delim);
@ -267,12 +261,12 @@ var StrUtils = {
* @constant
* @default
*/
DIFF_SAMPLE_DELIMITER: "\\n\\n",
DIFF_SAMPLE_DELIMITER: '\\n\\n',
/**
* @constant
* @default
*/
DIFF_BY: ["Character", "Word", "Line", "Sentence", "CSS", "JSON"],
DIFF_BY: ['Character', 'Word', 'Line', 'Sentence', 'CSS', 'JSON'],
/**
* Diff operation.
@ -281,56 +275,56 @@ var StrUtils = {
* @param {Object[]} args
* @returns {html}
*/
run_diff: function(input, args) {
var sample_delim = args[0],
run_diff(input, args) {
let sample_delim = args[0],
diff_by = args[1],
show_added = args[2],
show_removed = args[3],
ignore_whitespace = args[4],
samples = input.split(sample_delim),
output = "",
output = '',
diff;
if (!samples || samples.length != 2) {
return "Incorrect number of samples, perhaps you need to modify the sample delimiter or add more samples?";
return 'Incorrect number of samples, perhaps you need to modify the sample delimiter or add more samples?';
}
switch (diff_by) {
case "Character":
case 'Character':
diff = JsDiff.diffChars(samples[0], samples[1]);
break;
case "Word":
case 'Word':
if (ignore_whitespace) {
diff = JsDiff.diffWords(samples[0], samples[1]);
} else {
diff = JsDiff.diffWordsWithSpace(samples[0], samples[1]);
}
break;
case "Line":
case 'Line':
if (ignore_whitespace) {
diff = JsDiff.diffTrimmedLines(samples[0], samples[1]);
} else {
diff = JsDiff.diffLines(samples[0], samples[1]);
}
break;
case "Sentence":
case 'Sentence':
diff = JsDiff.diffSentences(samples[0], samples[1]);
break;
case "CSS":
case 'CSS':
diff = JsDiff.diffCss(samples[0], samples[1]);
break;
case "JSON":
case 'JSON':
diff = JsDiff.diffJson(samples[0], samples[1]);
break;
default:
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 (show_added) output += "<span class='hlgreen'>" + Utils.escape_html(diff[i].value) + "</span>";
if (show_added) output += `<span class='hlgreen'>${Utils.escape_html(diff[i].value)}</span>`;
} else if (diff[i].removed) {
if (show_removed) output += "<span class='hlred'>" + Utils.escape_html(diff[i].value) + "</span>";
if (show_removed) output += `<span class='hlred'>${Utils.escape_html(diff[i].value)}</span>`;
} else {
output += Utils.escape_html(diff[i].value);
}
@ -344,7 +338,7 @@ var StrUtils = {
* @constant
* @default
*/
OFF_CHK_SAMPLE_DELIMITER: "\\n\\n",
OFF_CHK_SAMPLE_DELIMITER: '\\n\\n',
/**
* Offset checker operation.
@ -353,8 +347,8 @@ var StrUtils = {
* @param {Object[]} args
* @returns {html}
*/
run_offset_checker: function(input, args) {
var sample_delim = args[0],
run_offset_checker(input, args) {
let sample_delim = args[0],
samples = input.split(sample_delim),
outputs = [],
i = 0,
@ -364,12 +358,12 @@ var StrUtils = {
chr;
if (!samples || samples.length < 2) {
return "Not enough samples, perhaps you need to modify the sample delimiter or add more data?";
return 'Not enough samples, perhaps you need to modify the sample delimiter or add more data?';
}
// Initialise output strings
for (s = 0; s < samples.length; s++) {
outputs[s] = "";
outputs[s] = '';
}
// Loop through each character in the first sample
@ -389,28 +383,28 @@ var StrUtils = {
// Write output for each sample
for (s = 0; s < samples.length; s++) {
if (samples[s].length <= i) {
if (in_match) outputs[s] += "</span>";
if (in_match) outputs[s] += '</span>';
if (s == samples.length - 1) in_match = false;
continue;
}
if (match && !in_match) {
outputs[s] += "<span class='hlgreen'>" + Utils.escape_html(samples[s][i]);
if (samples[s].length == i + 1) outputs[s] += "</span>";
outputs[s] += `<span class='hlgreen'>${Utils.escape_html(samples[s][i])}`;
if (samples[s].length == i + 1) outputs[s] += '</span>';
if (s == samples.length - 1) in_match = true;
} else if (!match && in_match) {
outputs[s] += "</span>" + Utils.escape_html(samples[s][i]);
outputs[s] += `</span>${Utils.escape_html(samples[s][i])}`;
if (s == samples.length - 1) in_match = false;
} else {
outputs[s] += Utils.escape_html(samples[s][i]);
if (in_match && samples[s].length == i + 1) {
outputs[s] += "</span>";
outputs[s] += '</span>';
if (samples[s].length - 1 != i) in_match = false;
}
}
if (samples[0].length - 1 == i) {
if (in_match) outputs[s] += "</span>";
if (in_match) outputs[s] += '</span>';
outputs[s] += Utils.escape_html(samples[s].substring(i + 1));
}
}
@ -427,7 +421,7 @@ var StrUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_parse_escaped_string: function(input, args) {
run_parse_escaped_string(input, args) {
return Utils.parse_escaped_chars(input);
},
@ -441,19 +435,19 @@ var StrUtils = {
* @param {boolean} display_total
* @returns {string}
*/
_regex_highlight: function(input, regex, display_total) {
var output = "",
_regex_highlight(input, regex, display_total) {
let output = '',
m,
hl = 1,
i = 0,
total = 0;
while (!!(m = regex.exec(input))) {
while (m = regex.exec(input)) {
// Add up to match
output += Utils.escape_html(input.slice(i, m.index));
// Add match with highlighting
output += "<span class='hl"+hl+"'>" + Utils.escape_html(m[0]) + "</span>";
output += `<span class='hl${hl}'>${Utils.escape_html(m[0])}</span>`;
// Switch highlight
hl = hl == 1 ? 2 : 1;
@ -465,8 +459,7 @@ var StrUtils = {
// Add all after final match
output += Utils.escape_html(input.slice(i, input.length));
if (display_total)
output = "Total found: " + total + "\n\n" + output;
if (display_total) { output = `Total found: ${total}\n\n${output}`; }
return output;
},
@ -483,28 +476,27 @@ var StrUtils = {
* @param {boolean} capture_groups - Display each of the capture groups separately
* @returns {string}
*/
_regex_list: function(input, regex, display_total, matches, capture_groups) {
var output = "",
_regex_list(input, regex, display_total, matches, capture_groups) {
let output = '',
total = 0,
match;
while (!!(match = regex.exec(input))) {
while (match = regex.exec(input)) {
total++;
if (matches) {
output += match[0] + "\n";
output += `${match[0]}\n`;
}
if (capture_groups) {
for (var i = 1; i < match.length; i++) {
for (let i = 1; i < match.length; i++) {
if (matches) {
output += " Group " + i + ": ";
output += ` Group ${i}: `;
}
output += match[i] + "\n";
output += `${match[i]}\n`;
}
}
}
if (display_total)
output = "Total found: " + total + "\n\n" + output;
if (display_total) { output = `Total found: ${total}\n\n${output}`; }
return output;
},

View file

@ -7,7 +7,7 @@
*
* @namespace
*/
var Tidy = {
const Tidy = {
/**
* @constant
@ -47,8 +47,8 @@ var Tidy = {
* @param {Object[]} args
* @returns {string}
*/
run_remove_whitespace: function (input, args) {
var remove_spaces = args[0],
run_remove_whitespace(input, args) {
let remove_spaces = args[0],
remove_cariage_returns = args[1],
remove_line_feeds = args[2],
remove_tabs = args[3],
@ -56,12 +56,12 @@ var Tidy = {
remove_full_stops = args[5],
data = input;
if (remove_spaces) data = data.replace(/ /g, "");
if (remove_cariage_returns) data = data.replace(/\r/g, "");
if (remove_line_feeds) data = data.replace(/\n/g, "");
if (remove_tabs) data = data.replace(/\t/g, "");
if (remove_form_feeds) data = data.replace(/\f/g, "");
if (remove_full_stops) data = data.replace(/\./g, "");
if (remove_spaces) data = data.replace(/ /g, '');
if (remove_cariage_returns) data = data.replace(/\r/g, '');
if (remove_line_feeds) data = data.replace(/\n/g, '');
if (remove_tabs) data = data.replace(/\t/g, '');
if (remove_form_feeds) data = data.replace(/\f/g, '');
if (remove_full_stops) data = data.replace(/\./g, '');
return data;
},
@ -73,9 +73,9 @@ var Tidy = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_remove_nulls: function (input, args) {
var output = [];
for (var i = 0; i < input.length; i++) {
run_remove_nulls(input, args) {
const output = [];
for (let i = 0; i < input.length; i++) {
if (input[i] !== 0) output.push(input[i]);
}
return output;
@ -105,19 +105,21 @@ var Tidy = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_drop_bytes: function(input, args) {
var start = args[0],
run_drop_bytes(input, args) {
let start = args[0],
length = args[1],
apply_to_each_line = args[2];
if (start < 0 || length < 0)
throw "Error: Invalid value";
if (start < 0 || length < 0) {
throw 'Error: Invalid value';
}
if (!apply_to_each_line)
if (!apply_to_each_line) {
return input.slice(0, start).concat(input.slice(start + length, input.length));
}
// Split input into lines
var lines = [],
let lines = [],
line = [];
for (var i = 0; i < input.length; i++) {
@ -130,7 +132,7 @@ var Tidy = {
}
lines.push(line);
var output = [];
let output = [];
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.push(0x0a);
@ -157,19 +159,21 @@ var Tidy = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_take_bytes: function(input, args) {
var start = args[0],
run_take_bytes(input, args) {
let start = args[0],
length = args[1],
apply_to_each_line = args[2];
if (start < 0 || length < 0)
throw "Error: Invalid value";
if (start < 0 || length < 0) {
throw 'Error: Invalid value';
}
if (!apply_to_each_line)
if (!apply_to_each_line) {
return input.slice(start, start + length);
}
// Split input into lines
var lines = [],
let lines = [],
line = [];
for (var i = 0; i < input.length; i++) {
@ -182,7 +186,7 @@ var Tidy = {
}
lines.push(line);
var output = [];
let output = [];
for (i = 0; i < lines.length; i++) {
output = output.concat(lines[i].slice(start, start + length));
output.push(0x0a);
@ -195,7 +199,7 @@ var Tidy = {
* @constant
* @default
*/
PAD_POSITION : ["Start", "End"],
PAD_POSITION: ['Start', 'End'],
/**
* @constant
* @default
@ -205,7 +209,7 @@ var Tidy = {
* @constant
* @default
*/
PAD_CHAR : " ",
PAD_CHAR: ' ',
/**
* Pad lines operation.
@ -214,21 +218,21 @@ var Tidy = {
* @param {Object[]} args
* @returns {string}
*/
run_pad: function(input, args) {
var position = args[0],
run_pad(input, args) {
let position = args[0],
len = args[1],
chr = args[2],
lines = input.split("\n"),
output = "",
lines = input.split('\n'),
output = '',
i = 0;
if (position == "Start") {
if (position == 'Start') {
for (i = 0; i < lines.length; i++) {
output += Utils.pad_left(lines[i], lines[i].length+len, chr) + "\n";
output += `${Utils.pad_left(lines[i], lines[i].length + len, chr)}\n`;
}
} else if (position == "End") {
} else if (position == 'End') {
for (i = 0; i < lines.length; i++) {
output += Utils.pad_right(lines[i], lines[i].length+len, chr) + "\n";
output += `${Utils.pad_right(lines[i], lines[i].length + len, chr)}\n`;
}
}

View file

@ -10,7 +10,7 @@
*
* @namespace
*/
var URL_ = {
const URL_ = {
/**
* @constant
@ -25,8 +25,8 @@ var URL_ = {
* @param {Object[]} args
* @returns {string}
*/
run_to: function(input, args) {
var encode_all = args[0];
run_to(input, args) {
const encode_all = args[0];
return encode_all ? URL_._encode_all_chars(input) : encodeURI(input);
},
@ -38,8 +38,8 @@ var URL_ = {
* @param {Object[]} args
* @returns {string}
*/
run_from: function(input, args) {
var data = input.replace(/\+/g, "%20");
run_from(input, args) {
const data = input.replace(/\+/g, '%20');
try {
return decodeURIComponent(data);
} catch (err) {
@ -55,53 +55,56 @@ var URL_ = {
* @param {Object[]} args
* @returns {string}
*/
run_parse: function(input, args) {
var a = document.createElement("a");
run_parse(input, args) {
const a = document.createElement('a');
// 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;
if (a.protocol) {
var output = "";
let output = '';
if (a.hostname != window.location.hostname) {
output = "Protocol:\t" + a.protocol + "\n";
if (a.hostname) output += "Hostname:\t" + a.hostname + "\n";
if (a.port) output += "Port:\t\t" + a.port + "\n";
output = `Protocol:\t${a.protocol}\n`;
if (a.hostname) output += `Hostname:\t${a.hostname}\n`;
if (a.port) output += `Port:\t\t${a.port}\n`;
}
if (a.pathname) {
var pathname = a.pathname;
if (pathname.indexOf(window.location.pathname) === 0)
pathname = pathname.replace(window.location.pathname, "");
if (pathname)
output += "Path name:\t" + pathname + "\n";
let pathname = a.pathname;
if (pathname.indexOf(window.location.pathname) === 0) {
pathname = pathname.replace(window.location.pathname, '');
}
if (pathname) {
output += `Path name:\t${pathname}\n`;
}
}
if (a.hash) {
output += "Hash:\t\t" + a.hash + "\n";
output += `Hash:\t\t${a.hash}\n`;
}
if (a.search) {
output += "Arguments:\n";
var args_ = (a.search.slice(1, a.search.length)).split("&");
var split_args = [], padding = 0;
output += 'Arguments:\n';
const args_ = (a.search.slice(1, a.search.length)).split('&');
let split_args = [],
padding = 0;
for (var i = 0; i < args_.length; i++) {
split_args.push(args_[i].split("="));
split_args.push(args_[i].split('='));
padding = (split_args[i][0].length > padding) ? split_args[i][0].length : padding;
}
for (i = 0; i < split_args.length; i++) {
output += "\t" + Utils.pad_right(split_args[i][0], padding);
if (split_args[i].length > 1 && split_args[i][1].length)
output += " = " + split_args[i][1] + "\n";
else output += "\n";
output += `\t${Utils.pad_right(split_args[i][0], padding)}`;
if (split_args[i].length > 1 && split_args[i][1].length) {
output += ` = ${split_args[i][1]}\n`;
} else output += '\n';
}
}
return output;
}
return "Invalid URI";
return 'Invalid URI';
},
@ -112,19 +115,19 @@ var URL_ = {
* @param {string} str
* @returns {string}
*/
_encode_all_chars: function(str) {
_encode_all_chars(str) {
// TODO Do this programatically
return encodeURIComponent(str)
.replace(/!/g, "%21")
.replace(/#/g, "%23")
.replace(/'/g, "%27")
.replace(/\(/g, "%28")
.replace(/\)/g, "%29")
.replace(/\*/g, "%2A")
.replace(/\-/g, "%2D")
.replace(/\./g, "%2E")
.replace(/_/g, "%5F")
.replace(/~/g, "%7E");
.replace(/!/g, '%21')
.replace(/#/g, '%23')
.replace(/'/g, '%27')
.replace(/\(/g, '%28')
.replace(/\)/g, '%29')
.replace(/\*/g, '%2A')
.replace(/\-/g, '%2D')
.replace(/\./g, '%2E')
.replace(/_/g, '%5F')
.replace(/~/g, '%7E');
},
};

View file

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

View file

@ -7,13 +7,13 @@
*
* @namespace
*/
var Unicode = {
const Unicode = {
/**
* @constant
* @default
*/
PREFIXES: ["\\u", "%u", "U+"],
PREFIXES: ['\\u', '%u', 'U+'],
/**
* Unescape Unicode Characters operation.
@ -22,14 +22,14 @@ var Unicode = {
* @param {Object[]} args
* @returns {string}
*/
run_unescape: function(input, args) {
var prefix = Unicode._prefix_to_regex[args[0]],
regex = new RegExp(prefix+"([a-f\\d]{4,6})", "ig"),
output = "",
run_unescape(input, args) {
let prefix = Unicode._prefix_to_regex[args[0]],
regex = new RegExp(`${prefix}([a-f\\d]{4,6})`, 'ig'),
output = '',
m,
i = 0;
while (!!(m = regex.exec(input))) {
while (m = regex.exec(input)) {
// Add up to match
output += input.slice(i, m.index);
i = m.index;
@ -54,9 +54,9 @@ var Unicode = {
* @constant
*/
_prefix_to_regex: {
"\\u": "\\\\u",
"%u": "%u",
"U+": "U\\+"
'\\u': '\\\\u',
'%u': '%u',
'U+': 'U\\+',
},
};

View file

@ -9,7 +9,7 @@
* @param {HTMLApp} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager.
*/
var ControlsWaiter = function(app, manager) {
const ControlsWaiter = function (app, manager) {
this.app = app;
this.manager = manager;
};
@ -20,39 +20,39 @@ var ControlsWaiter = function(app, manager) {
* without wrapping or overflowing.
*/
ControlsWaiter.prototype.adjust_width = function () {
var controls = document.getElementById("controls"),
step = document.getElementById("step"),
clr_breaks = document.getElementById("clr-breaks"),
save_img = document.querySelector("#save img"),
load_img = document.querySelector("#load img"),
step_img = document.querySelector("#step img"),
clr_recip_img = document.querySelector("#clr-recipe img"),
clr_breaks_img = document.querySelector("#clr-breaks img");
let controls = document.getElementById('controls'),
step = document.getElementById('step'),
clr_breaks = document.getElementById('clr-breaks'),
save_img = document.querySelector('#save img'),
load_img = document.querySelector('#load img'),
step_img = document.querySelector('#step img'),
clr_recip_img = document.querySelector('#clr-recipe img'),
clr_breaks_img = document.querySelector('#clr-breaks img');
if (controls.clientWidth < 470) {
step.childNodes[1].nodeValue = " Step";
step.childNodes[1].nodeValue = ' Step';
} else {
step.childNodes[1].nodeValue = " Step through";
step.childNodes[1].nodeValue = ' Step through';
}
if (controls.clientWidth < 400) {
save_img.style.display = "none";
load_img.style.display = "none";
step_img.style.display = "none";
clr_recip_img.style.display = "none";
clr_breaks_img.style.display = "none";
save_img.style.display = 'none';
load_img.style.display = 'none';
step_img.style.display = 'none';
clr_recip_img.style.display = 'none';
clr_breaks_img.style.display = 'none';
} else {
save_img.style.display = "inline";
load_img.style.display = "inline";
step_img.style.display = "inline";
clr_recip_img.style.display = "inline";
clr_breaks_img.style.display = "inline";
save_img.style.display = 'inline';
load_img.style.display = 'inline';
step_img.style.display = 'inline';
clr_recip_img.style.display = 'inline';
clr_breaks_img.style.display = 'inline';
}
if (controls.clientWidth < 330) {
clr_breaks.childNodes[1].nodeValue = " Clear breaks";
clr_breaks.childNodes[1].nodeValue = ' Clear breaks';
} else {
clr_breaks.childNodes[1].nodeValue = " Clear breakpoints";
clr_breaks.childNodes[1].nodeValue = ' Clear breakpoints';
}
};
@ -63,7 +63,7 @@ ControlsWaiter.prototype.adjust_width = function() {
* @param {boolean} value - The new value for Auto Bake.
*/
ControlsWaiter.prototype.set_auto_bake = function (value) {
var auto_bake_checkbox = document.getElementById("auto-bake");
const auto_bake_checkbox = document.getElementById('auto-bake');
if (auto_bake_checkbox.checked != value) {
auto_bake_checkbox.click();
@ -76,7 +76,7 @@ ControlsWaiter.prototype.set_auto_bake = function(value) {
*/
ControlsWaiter.prototype.bake_click = function () {
this.app.bake();
$("#output-text").selectRange(0);
$('#output-text').selectRange(0);
};
@ -85,7 +85,7 @@ ControlsWaiter.prototype.bake_click = function() {
*/
ControlsWaiter.prototype.step_click = function () {
this.app.bake(true);
$("#output-text").selectRange(0);
$('#output-text').selectRange(0);
};
@ -93,17 +93,17 @@ ControlsWaiter.prototype.step_click = function() {
* Handler for changes made to the Auto Bake checkbox.
*/
ControlsWaiter.prototype.auto_bake_change = function () {
var auto_bake_label = document.getElementById("auto-bake-label"),
auto_bake_checkbox = document.getElementById("auto-bake");
let auto_bake_label = document.getElementById('auto-bake-label'),
auto_bake_checkbox = document.getElementById('auto-bake');
this.app.auto_bake_ = auto_bake_checkbox.checked;
if (auto_bake_checkbox.checked) {
auto_bake_label.classList.remove("btn-default");
auto_bake_label.classList.add("btn-success");
auto_bake_label.classList.remove('btn-default');
auto_bake_label.classList.add('btn-success');
} else {
auto_bake_label.classList.remove("btn-success");
auto_bake_label.classList.add("btn-default");
auto_bake_label.classList.remove('btn-success');
auto_bake_label.classList.add('btn-default');
}
};
@ -121,11 +121,11 @@ ControlsWaiter.prototype.clear_recipe_click = function() {
* recipe.
*/
ControlsWaiter.prototype.clear_breaks_click = 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++) {
bps[i].setAttribute("break", "false");
bps[i].classList.remove("breakpoint-selected");
for (let i = 0; i < bps.length; i++) {
bps[i].setAttribute('break', 'false');
bps[i].classList.remove('breakpoint-selected');
}
};
@ -138,15 +138,15 @@ ControlsWaiter.prototype.clear_breaks_click = function() {
ControlsWaiter.prototype.initialise_save_link = function (recipe_config) {
recipe_config = recipe_config || this.app.get_recipe_config();
var recipe_str = JSON.stringify(recipe_config),
let recipe_str = JSON.stringify(recipe_config),
input_str = Utils.to_base64(this.app.get_input()),
include_recipe = document.getElementById("save-link-recipe-checkbox").checked,
include_input = document.getElementById("save-link-input-checkbox").checked,
save_link_el = document.getElementById("save-link"),
include_recipe = document.getElementById('save-link-recipe-checkbox').checked,
include_input = document.getElementById('save-link-input-checkbox').checked,
save_link_el = document.getElementById('save-link'),
save_link = this.generate_state_url(include_recipe, include_input, recipe_config);
save_link_el.innerHTML = Utils.truncate(save_link, 120);
save_link_el.setAttribute("href", save_link);
save_link_el.setAttribute('href', save_link);
};
@ -161,23 +161,23 @@ ControlsWaiter.prototype.initialise_save_link = function(recipe_config) {
ControlsWaiter.prototype.generate_state_url = function (include_recipe, include_input, recipe_config) {
recipe_config = recipe_config || this.app.get_recipe_config();
var link = window.location.protocol + "//" +
window.location.host +
window.location.pathname,
let link = `${window.location.protocol}//${
window.location.host
}${window.location.pathname}`,
recipe_str = JSON.stringify(recipe_config),
input_str = Utils.to_base64(this.app.get_input(), "A-Za-z0-9+/"); // B64 alphabet with no padding
input_str = Utils.to_base64(this.app.get_input(), 'A-Za-z0-9+/'); // B64 alphabet with no padding
include_recipe = include_recipe && (recipe_config.length > 0);
include_input = include_input && (input_str.length > 0) && (input_str.length < 8000);
if (include_recipe) {
link += "?recipe=" + encodeURIComponent(recipe_str);
link += `?recipe=${encodeURIComponent(recipe_str)}`;
}
if (include_recipe && include_input) {
link += "&input=" + encodeURIComponent(input_str);
link += `&input=${encodeURIComponent(input_str)}`;
} else if (include_input) {
link += "?input=" + encodeURIComponent(input_str);
link += `?input=${encodeURIComponent(input_str)}`;
}
return link;
@ -189,7 +189,7 @@ ControlsWaiter.prototype.generate_state_url = function(include_recipe, include_i
*/
ControlsWaiter.prototype.save_text_change = function () {
try {
var recipe_config = JSON.parse(document.getElementById("save-text").value);
const recipe_config = JSON.parse(document.getElementById('save-text').value);
this.initialise_save_link(recipe_config);
} catch (err) {}
};
@ -199,12 +199,12 @@ ControlsWaiter.prototype.save_text_change = function() {
* Handler for the 'Save' command. Pops up the save dialog box.
*/
ControlsWaiter.prototype.save_click = function () {
var recipe_config = this.app.get_recipe_config();
var recipe_str = JSON.stringify(recipe_config).replace(/},{/g, '},\n{');
document.getElementById("save-text").value = recipe_str;
const recipe_config = this.app.get_recipe_config();
const recipe_str = JSON.stringify(recipe_config).replace(/},{/g, '},\n{');
document.getElementById('save-text').value = recipe_str;
this.initialise_save_link(recipe_config);
$("#save-modal").modal();
$('#save-modal').modal();
};
@ -229,7 +229,7 @@ ControlsWaiter.prototype.sli_check_change = function() {
*/
ControlsWaiter.prototype.load_click = function () {
this.populate_load_recipes_list();
$("#load-modal").modal();
$('#load-modal').modal();
};
@ -237,28 +237,28 @@ ControlsWaiter.prototype.load_click = function() {
* Saves the recipe specified in the save textarea to local storage.
*/
ControlsWaiter.prototype.save_button_click = function () {
var recipe_name = document.getElementById("save-name").value,
recipe_str = document.getElementById("save-text").value;
let recipe_name = document.getElementById('save-name').value,
recipe_str = document.getElementById('save-text').value;
if (!recipe_name) {
this.app.alert("Please enter a recipe name", "danger", 2000);
this.app.alert('Please enter a recipe name', 'danger', 2000);
return;
}
var saved_recipes = localStorage.saved_recipes ?
let saved_recipes = localStorage.saved_recipes ?
JSON.parse(localStorage.saved_recipes) : [],
recipe_id = localStorage.recipe_id || 0;
saved_recipes.push({
id: ++recipe_id,
name: recipe_name,
recipe: recipe_str
recipe: recipe_str,
});
localStorage.saved_recipes = JSON.stringify(saved_recipes);
localStorage.recipe_id = recipe_id;
this.app.alert("Recipe saved as \"" + recipe_name + "\".", "success", 2000);
this.app.alert(`Recipe saved as "${recipe_name}".`, 'success', 2000);
};
@ -266,20 +266,20 @@ ControlsWaiter.prototype.save_button_click = function() {
* Populates the list of saved recipes in the load dialog box from local storage.
*/
ControlsWaiter.prototype.populate_load_recipes_list = function () {
var load_name_el = document.getElementById("load-name");
const load_name_el = document.getElementById('load-name');
// Remove current recipes from select
var i = load_name_el.options.length;
let i = load_name_el.options.length;
while (i--) {
load_name_el.remove(i);
}
// Add recipes to select
var saved_recipes = localStorage.saved_recipes ?
const saved_recipes = localStorage.saved_recipes ?
JSON.parse(localStorage.saved_recipes) : [];
for (i = 0; i < saved_recipes.length; i++) {
var opt = document.createElement("option");
const opt = document.createElement('option');
opt.value = saved_recipes[i].id;
opt.innerHTML = saved_recipes[i].name;
@ -287,7 +287,7 @@ ControlsWaiter.prototype.populate_load_recipes_list = function() {
}
// Populate textarea with first recipe
document.getElementById("load-text").value = saved_recipes.length ? saved_recipes[0].recipe : "";
document.getElementById('load-text').value = saved_recipes.length ? saved_recipes[0].recipe : '';
};
@ -295,13 +295,11 @@ ControlsWaiter.prototype.populate_load_recipes_list = function() {
* Removes the currently selected recipe from local storage.
*/
ControlsWaiter.prototype.load_delete_click = function () {
var id = document.getElementById("load-name").value,
let id = document.getElementById('load-name').value,
saved_recipes = localStorage.saved_recipes ?
JSON.parse(localStorage.saved_recipes) : [];
saved_recipes = saved_recipes.filter(function(r) {
return r.id != id;
});
saved_recipes = saved_recipes.filter(r => r.id != id);
localStorage.saved_recipes = JSON.stringify(saved_recipes);
this.populate_load_recipes_list();
@ -312,16 +310,14 @@ ControlsWaiter.prototype.load_delete_click = function() {
* Displays the selected recipe in the load text box.
*/
ControlsWaiter.prototype.load_name_change = function (e) {
var el = e.target,
let el = e.target,
saved_recipes = localStorage.saved_recipes ?
JSON.parse(localStorage.saved_recipes) : [],
id = parseInt(el.value, 10);
var recipe = saved_recipes.filter(function(r) {
return r.id == id;
})[0];
const recipe = saved_recipes.filter(r => r.id == id)[0];
document.getElementById("load-text").value = recipe.recipe;
document.getElementById('load-text').value = recipe.recipe;
};
@ -330,11 +326,11 @@ ControlsWaiter.prototype.load_name_change = function(e) {
*/
ControlsWaiter.prototype.load_button_click = function () {
try {
var recipe_config = JSON.parse(document.getElementById("load-text").value);
const recipe_config = JSON.parse(document.getElementById('load-text').value);
this.app.set_recipe_config(recipe_config);
$("#rec_list [data-toggle=popover]").popover();
$('#rec_list [data-toggle=popover]').popover();
} catch (e) {
this.app.alert("Invalid recipe", "danger", 2000);
this.app.alert('Invalid recipe', 'danger', 2000);
}
};

View file

@ -14,7 +14,7 @@
* @param {String[]} default_favourites - A list of default favourite operations.
* @param {Object} options - Default setting for app options.
*/
var HTMLApp = function(categories, operations, default_favourites, default_options) {
const HTMLApp = function (categories, operations, default_favourites, default_options) {
this.categories = categories;
this.operations = operations;
this.dfavourites = default_favourites;
@ -56,8 +56,8 @@ HTMLApp.prototype.setup = function() {
*/
HTMLApp.prototype.handle_error = function (err) {
console.error(err);
var msg = err.display_str || err.toString();
this.alert(msg, "danger", this.options.error_timeout, !this.options.show_errors);
const msg = err.display_str || err.toString();
this.alert(msg, 'danger', this.options.error_timeout, !this.options.show_errors);
};
@ -68,7 +68,7 @@ HTMLApp.prototype.handle_error = function(err) {
* whole recipe.
*/
HTMLApp.prototype.bake = function (step) {
var response;
let response;
try {
response = this.chef.bake(
@ -76,7 +76,7 @@ HTMLApp.prototype.bake = function(step) {
this.get_recipe_config(), // The configuration of the recipe
this.options, // Options set by the user
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
);
} catch (err) {
this.handle_error(err);
@ -87,7 +87,7 @@ HTMLApp.prototype.bake = function(step) {
this.handle_error(response.error);
}
this.options = response.options;
this.dish_str = response.type == "html" ? Utils.strip_html_tags(response.result, true) : response.result;
this.dish_str = response.type == 'html' ? Utils.strip_html_tags(response.result, true) : response.result;
this.progress = response.progress;
this.manager.recipe.update_breakpoint_indicator(response.progress);
this.manager.output.set(response.result, response.type, response.duration);
@ -95,8 +95,8 @@ HTMLApp.prototype.bake = function(step) {
// If baking took too long, disable auto-bake
if (response.duration > this.options.auto_bake_threshold && this.auto_bake_) {
this.manager.controls.set_auto_bake(false);
this.alert("Baking took longer than " + this.options.auto_bake_threshold +
"ms, Auto Bake has been disabled.", "warning", 5000);
this.alert(`Baking took longer than ${this.options.auto_bake_threshold
}ms, Auto Bake has been disabled.`, 'warning', 5000);
}
}
};
@ -122,7 +122,7 @@ HTMLApp.prototype.auto_bake = function() {
* @returns {number} - The number of miliseconds it took to run the silent bake.
*/
HTMLApp.prototype.silent_bake = function () {
var start_time = new Date().getTime(),
let start_time = new Date().getTime(),
recipe_config = this.get_recipe_config();
if (this.auto_bake_) {
@ -139,11 +139,11 @@ HTMLApp.prototype.silent_bake = function() {
* @returns {string}
*/
HTMLApp.prototype.get_input = 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
sessionStorage.setItem("input_length", input.length);
sessionStorage.setItem("input", input);
sessionStorage.setItem('input_length', input.length);
sessionStorage.setItem('input', input);
return input;
};
@ -155,8 +155,8 @@ HTMLApp.prototype.get_input = function() {
* @param {string} input - The string to set the input to
*/
HTMLApp.prototype.set_input = function (input) {
sessionStorage.setItem("input_length", input.length);
sessionStorage.setItem("input", input);
sessionStorage.setItem('input_length', input.length);
sessionStorage.setItem('input', input);
this.manager.input.set(input);
};
@ -169,17 +169,17 @@ HTMLApp.prototype.set_input = function(input) {
*/
HTMLApp.prototype.populate_operations_list = function () {
// 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 = '';
for (var i = 0; i < this.categories.length; i++) {
var cat_conf = this.categories[i],
let cat_conf = this.categories[i],
selected = i === 0,
cat = new HTMLCategory(cat_conf.name, selected);
for (var j = 0; j < cat_conf.ops.length; j++) {
var op_name = cat_conf.ops[j],
for (let j = 0; j < cat_conf.ops.length; j++) {
let op_name = cat_conf.ops[j],
op = new HTMLOperation(op_name, this.operations[op_name], this, this.manager);
cat.add_operation(op);
}
@ -187,16 +187,16 @@ HTMLApp.prototype.populate_operations_list = function() {
html += cat.to_html();
}
document.getElementById("categories").innerHTML = html;
document.getElementById('categories').innerHTML = html;
var op_lists = document.querySelectorAll("#categories .op_list");
const op_lists = document.querySelectorAll('#categories .op_list');
for (i = 0; i < op_lists.length; i++) {
op_lists[i].dispatchEvent(this.manager.oplistcreate);
}
// Add edit button to first category (Favourites)
document.querySelector("#categories a").appendChild(document.getElementById("edit-favourites"));
document.querySelector('#categories a').appendChild(document.getElementById('edit-favourites'));
};
@ -204,15 +204,15 @@ HTMLApp.prototype.populate_operations_list = function() {
* Sets up the adjustable splitter to allow the user to resize areas of the page.
*/
HTMLApp.prototype.initialise_splitter = function () {
Split(["#operations", "#recipe", "#IO"], {
Split(['#operations', '#recipe', '#IO'], {
sizes: [20, 30, 50],
minSize: [240, 325, 500],
gutterSize: 4,
onDrag: this.manager.controls.adjust_width.bind(this.manager.controls)
onDrag: this.manager.controls.adjust_width.bind(this.manager.controls),
});
Split(["#input", "#output"], {
direction: "vertical",
Split(['#input', '#output'], {
direction: 'vertical',
gutterSize: 4,
});
@ -226,7 +226,7 @@ HTMLApp.prototype.initialise_splitter = function() {
*/
HTMLApp.prototype.load_local_storage = function () {
// Load options
var l_options;
let l_options;
if (localStorage.options !== undefined) {
l_options = JSON.parse(localStorage.options);
}
@ -243,7 +243,7 @@ HTMLApp.prototype.load_local_storage = function() {
* If the user currently has no saved favourites, the defaults from the view constructor are used.
*/
HTMLApp.prototype.load_favourites = function () {
var favourites = localStorage.favourites &&
let favourites = localStorage.favourites &&
localStorage.favourites.length > 2 ?
JSON.parse(localStorage.favourites) :
this.dfavourites;
@ -251,16 +251,14 @@ HTMLApp.prototype.load_favourites = function() {
favourites = this.valid_favourites(favourites);
this.save_favourites(favourites);
var fav_cat = this.categories.filter(function(c) {
return c.name == "Favourites";
})[0];
const fav_cat = this.categories.filter(c => c.name == 'Favourites')[0];
if (fav_cat) {
fav_cat.ops = favourites;
} else {
this.categories.unshift({
name: "Favourites",
ops: favourites
name: 'Favourites',
ops: favourites,
});
}
};
@ -274,13 +272,13 @@ HTMLApp.prototype.load_favourites = function() {
* @returns {string[]} A list of the valid favourites
*/
HTMLApp.prototype.valid_favourites = function (favourites) {
var valid_favs = [];
for (var i = 0; i < favourites.length; i++) {
const valid_favs = [];
for (let i = 0; i < favourites.length; i++) {
if (this.operations.hasOwnProperty(favourites[i])) {
valid_favs.push(favourites[i]);
} else {
this.alert("The operation \"" + favourites[i] + "\" is no longer " +
"available. It has been removed from your favourites.", "info");
this.alert(`The operation "${favourites[i]}" is no longer ` +
'available. It has been removed from your favourites.', 'info');
}
}
return valid_favs;
@ -293,7 +291,7 @@ HTMLApp.prototype.valid_favourites = function(favourites) {
* @param {string[]} favourites - A list of the user's favourite operations
*/
HTMLApp.prototype.save_favourites = function (favourites) {
localStorage.setItem("favourites", JSON.stringify(this.valid_favourites(favourites)));
localStorage.setItem('favourites', JSON.stringify(this.valid_favourites(favourites)));
};
@ -315,10 +313,10 @@ HTMLApp.prototype.reset_favourites = function() {
* @param {string} name - The name of the operation
*/
HTMLApp.prototype.add_favourite = function (name) {
var favourites = JSON.parse(localStorage.favourites);
const favourites = JSON.parse(localStorage.favourites);
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);
return;
}
@ -336,27 +334,27 @@ HTMLApp.prototype.add_favourite = function(name) {
HTMLApp.prototype.load_URI_params = function () {
// Load query string from URI
this.query_string = (function (a) {
if (a === "") return {};
var b = {};
for (var i = 0; i < a.length; i++) {
var p = a[i].split('=');
if (a === '') return {};
const b = {};
for (let i = 0; i < a.length; i++) {
const p = a[i].split('=');
if (p.length != 2) {
b[a[i]] = true;
} else {
b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, ' '));
}
}
return b;
})(window.location.search.substr(1).split('&'));
}(window.location.search.substr(1).split('&')));
// Turn off auto-bake while loading
var auto_bake_val = this.auto_bake_;
const auto_bake_val = this.auto_bake_;
this.auto_bake_ = false;
// Read in recipe from query string
if (this.query_string.recipe) {
try {
var recipe_config = JSON.parse(this.query_string.recipe);
const recipe_config = JSON.parse(this.query_string.recipe);
this.set_recipe_config(recipe_config);
} catch (err) {}
} else if (this.query_string.op) {
@ -366,23 +364,23 @@ HTMLApp.prototype.load_URI_params = function() {
this.manager.recipe.add_operation(this.query_string.op);
} catch (err) {
// If no exact match, search for nearest match and add that
var matched_ops = this.manager.ops.filter_operations(this.query_string.op, false);
const matched_ops = this.manager.ops.filter_operations(this.query_string.op, false);
if (matched_ops.length) {
this.manager.recipe.add_operation(matched_ops[0].name);
}
// Populate search with the string
var search = document.getElementById("search");
const search = document.getElementById('search');
search.value = this.query_string.op;
search.dispatchEvent(new Event("search"));
search.dispatchEvent(new Event('search'));
}
}
// Read in input data from query string
if (this.query_string.input) {
try {
var input_data = Utils.from_base64(this.query_string.input);
const input_data = Utils.from_base64(this.query_string.input);
this.set_input(input_data);
} catch (err) {}
}
@ -409,8 +407,8 @@ HTMLApp.prototype.next_ing_id = function() {
* @returns {Object[]}
*/
HTMLApp.prototype.get_recipe_config = function () {
var recipe_config = this.manager.recipe.get_config();
sessionStorage.setItem("recipe_config", JSON.stringify(recipe_config));
const recipe_config = this.manager.recipe.get_config();
sessionStorage.setItem('recipe_config', JSON.stringify(recipe_config));
return recipe_config;
};
@ -421,23 +419,23 @@ HTMLApp.prototype.get_recipe_config = function() {
* @param {Object[]} recipe_config - The recipe configuration
*/
HTMLApp.prototype.set_recipe_config = function (recipe_config) {
sessionStorage.setItem("recipe_config", JSON.stringify(recipe_config));
document.getElementById("rec_list").innerHTML = null;
sessionStorage.setItem('recipe_config', JSON.stringify(recipe_config));
document.getElementById('rec_list').innerHTML = null;
for (var i = 0; i < recipe_config.length; i++) {
var item = this.manager.recipe.add_operation(recipe_config[i].op);
for (let i = 0; i < recipe_config.length; i++) {
const item = this.manager.recipe.add_operation(recipe_config[i].op);
// Populate arguments
var args = item.querySelectorAll(".arg");
for (var j = 0; j < args.length; j++) {
if (args[j].getAttribute("type") == "checkbox") {
const args = item.querySelectorAll('.arg');
for (let j = 0; j < args.length; j++) {
if (args[j].getAttribute('type') == 'checkbox') {
// checkbox
args[j].checked = recipe_config[i].args[j];
} else if (args[j].classList.contains("toggle-string")) {
} else if (args[j].classList.contains('toggle-string')) {
// toggle_string
args[j].value = recipe_config[i].args[j].string;
args[j].previousSibling.children[0].innerHTML = recipe_config[i].args[j].option +
" <span class='caret'></span>";
args[j].previousSibling.children[0].innerHTML = `${recipe_config[i].args[j].option
} <span class='caret'></span>`;
} else {
// all others
args[j].value = recipe_config[i].args[j];
@ -446,10 +444,10 @@ HTMLApp.prototype.set_recipe_config = function(recipe_config) {
// Set disabled and breakpoint
if (recipe_config[i].disabled) {
item.querySelector(".disable-icon").click();
item.querySelector('.disable-icon').click();
}
if (recipe_config[i].breakpoint) {
item.querySelector(".breakpoint").click();
item.querySelector('.breakpoint').click();
}
this.progress = 0;
@ -461,11 +459,11 @@ HTMLApp.prototype.set_recipe_config = function(recipe_config) {
* Resets the splitter positions to default.
*/
HTMLApp.prototype.reset_layout = function () {
document.getElementById("operations").style.width = "calc(20% - 2px)";
document.getElementById("recipe").style.width = "calc(30% - 4px)";
document.getElementById("IO").style.width = "calc(50% - 2px)";
document.getElementById("input").style.height = "calc(50% - 2px)";
document.getElementById("output").style.height = "calc(50% - 2px)";
document.getElementById('operations').style.width = 'calc(20% - 2px)';
document.getElementById('recipe').style.width = 'calc(30% - 4px)';
document.getElementById('IO').style.width = 'calc(50% - 2px)';
document.getElementById('input').style.height = 'calc(50% - 2px)';
document.getElementById('output').style.height = 'calc(50% - 2px)';
this.manager.controls.adjust_width();
};
@ -476,17 +474,17 @@ HTMLApp.prototype.reset_layout = function() {
*/
HTMLApp.prototype.set_compile_message = function () {
// Display time since last build and compile message
var now = new Date(),
let now = new Date(),
time_since_compile = Utils.fuzzy_time(now.getTime() - window.compile_time),
compile_info = "<span style=\"font-weight: normal\">Last build: " +
time_since_compile.substr(0,1).toUpperCase() + time_since_compile.substr(1) + " ago";
compile_info = `<span style="font-weight: normal">Last build: ${
time_since_compile.substr(0, 1).toUpperCase()}${time_since_compile.substr(1)} ago`;
if (window.compile_message !== "") {
compile_info += " - " + window.compile_message;
if (window.compile_message !== '') {
compile_info += ` - ${window.compile_message}`;
}
compile_info += "</span>";
document.getElementById("notice").innerHTML = compile_info;
compile_info += '</span>';
document.getElementById('notice').innerHTML = compile_info;
};
@ -514,41 +512,41 @@ HTMLApp.prototype.set_compile_message = function() {
* this.alert("Happy Christmas!", "info", 5000);
*/
HTMLApp.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;
style = style || "danger";
style = style || 'danger';
timeout = timeout || 0;
var alert_el = document.getElementById("alert"),
alert_content = document.getElementById("alert-content");
let alert_el = document.getElementById('alert'),
alert_content = document.getElementById('alert-content');
alert_el.classList.remove("alert-danger");
alert_el.classList.remove("alert-warning");
alert_el.classList.remove("alert-info");
alert_el.classList.remove("alert-success");
alert_el.classList.add("alert-" + style);
alert_el.classList.remove('alert-danger');
alert_el.classList.remove('alert-warning');
alert_el.classList.remove('alert-info');
alert_el.classList.remove('alert-success');
alert_el.classList.add(`alert-${style}`);
// If the box hasn't been closed, append to it rather than replacing
if (alert_el.style.display == "block") {
if (alert_el.style.display == 'block') {
alert_content.innerHTML +=
"<br><br>[" + time.toLocaleTimeString() + "] " + str;
`<br><br>[${time.toLocaleTimeString()}] ${str}`;
} else {
alert_content.innerHTML =
"[" + time.toLocaleTimeString() + "] " + str;
`[${time.toLocaleTimeString()}] ${str}`;
}
// Stop the animation if it is in progress
$("#alert").stop();
alert_el.style.display = "block";
$('#alert').stop();
alert_el.style.display = 'block';
alert_el.style.opacity = 1;
if (timeout > 0) {
clearTimeout(this.alert_timeout);
this.alert_timeout = setTimeout(function(){
$("#alert").slideUp(100);
this.alert_timeout = setTimeout(() => {
$('#alert').slideUp(100);
}, timeout);
}
};
@ -569,25 +567,24 @@ HTMLApp.prototype.alert = function(str, style, timeout, silent) {
*/
HTMLApp.prototype.confirm = function (title, body, callback, scope) {
scope = scope || this;
document.getElementById("confirm-title").innerHTML = title;
document.getElementById("confirm-body").innerHTML = body;
document.getElementById("confirm-modal").style.display = "block";
document.getElementById('confirm-title').innerHTML = title;
document.getElementById('confirm-body').innerHTML = body;
document.getElementById('confirm-modal').style.display = 'block';
this.confirm_closed = false;
$("#confirm-modal").modal()
.one("show.bs.modal", function(e) {
$('#confirm-modal').modal()
.one('show.bs.modal', (e) => {
this.confirm_closed = false;
}.bind(this))
.one("click", "#confirm-yes", function() {
})
.one('click', '#confirm-yes', () => {
this.confirm_closed = true;
callback.bind(scope)(true);
$("#confirm-modal").modal("hide");
}.bind(this))
.one("hide.bs.modal", function(e) {
if (!this.confirm_closed)
callback.bind(scope)(false);
$('#confirm-modal').modal('hide');
})
.one('hide.bs.modal', (e) => {
if (!this.confirm_closed) { callback.bind(scope)(false); }
this.confirm_closed = true;
}.bind(this));
});
};
@ -596,7 +593,7 @@ HTMLApp.prototype.confirm = function(title, body, callback, scope) {
* Closes the alert box.
*/
HTMLApp.prototype.alert_close_click = function () {
document.getElementById("alert").style.display = "none";
document.getElementById('alert').style.display = 'none';
};
@ -613,7 +610,7 @@ HTMLApp.prototype.state_change = function(e) {
// Update the current history state (not creating a new one)
if (this.options.update_url) {
this.last_state_url = this.manager.controls.generate_state_url(true, true);
window.history.replaceState({}, "CyberChef", this.last_state_url);
window.history.replaceState({}, 'CyberChef', this.last_state_url);
}
};
@ -625,7 +622,7 @@ HTMLApp.prototype.state_change = function(e) {
* @param {event} e
*/
HTMLApp.prototype.pop_state = function (e) {
if (window.location.href.split("#")[0] !== this.last_state_url) {
if (window.location.href.split('#')[0] !== this.last_state_url) {
this.load_URI_params();
}
};
@ -635,33 +632,33 @@ HTMLApp.prototype.pop_state = function(e) {
* Function to call an external API from this view.
*/
HTMLApp.prototype.call_api = function (url, type, data, data_type, content_type) {
type = type || "POST";
type = type || 'POST';
data = data || {};
data_type = data_type || undefined;
content_type = content_type || "application/json";
content_type = content_type || 'application/json';
var response = null,
let response = null,
success = false;
$.ajax({
url: url,
url,
async: false,
type: type,
data: data,
type,
data,
dataType: data_type,
contentType: content_type,
success: function(data) {
success(data) {
success = true;
response = data;
},
error: function(data) {
error(data) {
success = false;
response = data;
},
});
return {
success: success,
response: response
success,
response,
};
};

View file

@ -9,7 +9,7 @@
* @param {string} name - The name of the category.
* @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.selected = selected;
this.op_list = [];
@ -32,19 +32,19 @@ HTMLCategory.prototype.add_operation = function(operation) {
* @returns {string}
*/
HTMLCategory.prototype.to_html = function () {
var cat_name = "cat" + this.name.replace(/[\s/-:_]/g, "");
var html = "<div class='panel category'>\
const cat_name = `cat${this.name.replace(/[\s/-:_]/g, '')}`;
let html = `<div class='panel category'>\
<a class='category-title' data-toggle='collapse'\
data-parent='#categories' href='#" + cat_name + "'>\
" + this.name + "\
data-parent='#categories' href='#${cat_name}'>\
${this.name}\
</a>\
<div id='" + cat_name + "' class='panel-collapse collapse\
" + (this.selected ? " in" : "") + "'><ul class='op_list'>";
<div id='${cat_name}' class='panel-collapse collapse\
${this.selected ? ' in' : ''}'><ul class='op_list'>`;
for (var i = 0; i < this.op_list.length; i++) {
for (let i = 0; i < this.op_list.length; i++) {
html += this.op_list[i].to_stub_html();
}
html += "</ul></div></div>";
html += '</ul></div></div>';
return html;
};

View file

@ -10,7 +10,7 @@
* @param {HTMLApp} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager.
*/
var HTMLIngredient = function(config, app, manager) {
const HTMLIngredient = function (config, app, manager) {
this.app = app;
this.manager = manager;
@ -22,7 +22,7 @@ var HTMLIngredient = function(config, app, manager) {
this.placeholder = config.placeholder || false;
this.target = config.target;
this.toggle_values = config.toggle_values;
this.id = "ing-" + this.app.next_ing_id();
this.id = `ing-${this.app.next_ing_id()}`;
};
@ -32,120 +32,121 @@ var HTMLIngredient = function(config, app, manager) {
* @returns {string}
*/
HTMLIngredient.prototype.to_html = function () {
var inline = (this.type == "boolean" ||
this.type == "number" ||
this.type == "option" ||
this.type == "short_string" ||
this.type == "binary_short_string"),
html = inline ? "" : "<div class='clearfix'>&nbsp;</div>",
i, m;
let inline = (this.type == 'boolean' ||
this.type == 'number' ||
this.type == 'option' ||
this.type == 'short_string' ||
this.type == 'binary_short_string'),
html = inline ? '' : "<div class='clearfix'>&nbsp;</div>",
i,
m;
html += "<div class='arg-group" + (inline ? " inline-args" : "") +
(this.type == "text" ? " arg-group-text" : "") + "'><label class='arg-label' for='" +
this.id + "'>" + this.name + "</label>";
html += `<div class='arg-group${inline ? ' inline-args' : ''
}${this.type == 'text' ? ' arg-group-text' : ''}'><label class='arg-label' for='${
this.id}'>${this.name}</label>`;
switch (this.type) {
case "string":
case "binary_string":
case "byte_array":
html += "<input type='text' id='" + this.id + "' class='arg arg-input' arg_name='" +
this.name + "' value='" + this.value + "'" +
(this.disabled ? " disabled='disabled'" : "") +
(this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + ">";
case 'string':
case 'binary_string':
case 'byte_array':
html += `<input type='text' id='${this.id}' class='arg arg-input' arg_name='${
this.name}' value='${this.value}'${
this.disabled ? " disabled='disabled'" : ''
}${this.placeholder ? ` placeholder='${this.placeholder}'` : ''}>`;
break;
case "short_string":
case "binary_short_string":
html += "<input type='text' id='" + this.id +
"'class='arg arg-input short-string' arg_name='" + this.name + "'value='" +
this.value + "'" + (this.disabled ? " disabled='disabled'" : "") +
(this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + ">";
case 'short_string':
case 'binary_short_string':
html += `<input type='text' id='${this.id
}'class='arg arg-input short-string' arg_name='${this.name}'value='${
this.value}'${this.disabled ? " disabled='disabled'" : ''
}${this.placeholder ? ` placeholder='${this.placeholder}'` : ''}>`;
break;
case "toggle_string":
html += "<div class='input-group'><div class='input-group-btn'>\
case 'toggle_string':
html += `<div class='input-group'><div class='input-group-btn'>\
<button type='button' class='btn btn-default dropdown-toggle' data-toggle='dropdown'\
aria-haspopup='true' aria-expanded='false'" +
(this.disabled ? " disabled='disabled'" : "") + ">" + this.toggle_values[0] +
" <span class='caret'></span></button><ul class='dropdown-menu'>";
aria-haspopup='true' aria-expanded='false'${
this.disabled ? " disabled='disabled'" : ''}>${this.toggle_values[0]
} <span class='caret'></span></button><ul class='dropdown-menu'>`;
for (i = 0; i < this.toggle_values.length; i++) {
html += "<li><a href='#'>" + this.toggle_values[i] + "</a></li>";
html += `<li><a href='#'>${this.toggle_values[i]}</a></li>`;
}
html += "</ul></div><input type='text' class='arg arg-input toggle-string'" +
(this.disabled ? " disabled='disabled'" : "") +
(this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + "></div>";
html += `</ul></div><input type='text' class='arg arg-input toggle-string'${
this.disabled ? " disabled='disabled'" : ''
}${this.placeholder ? ` placeholder='${this.placeholder}'` : ''}></div>`;
break;
case "number":
html += "<input type='number' id='" + this.id + "'class='arg arg-input' arg_name='" +
this.name + "'value='" + this.value + "'" +
(this.disabled ? " disabled='disabled'" : "") +
(this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + ">";
case 'number':
html += `<input type='number' id='${this.id}'class='arg arg-input' arg_name='${
this.name}'value='${this.value}'${
this.disabled ? " disabled='disabled'" : ''
}${this.placeholder ? ` placeholder='${this.placeholder}'` : ''}>`;
break;
case "boolean":
html += "<input type='checkbox' id='" + this.id + "'class='arg' arg_name='" +
this.name + "'" + (this.value ? " checked='checked' " : "") +
(this.disabled ? " disabled='disabled'" : "") + ">";
case 'boolean':
html += `<input type='checkbox' id='${this.id}'class='arg' arg_name='${
this.name}'${this.value ? " checked='checked' " : ''
}${this.disabled ? " disabled='disabled'" : ''}>`;
if (this.disable_args) {
this.manager.add_dynamic_listener("#" + this.id, "click", this.toggle_disable_args, this);
this.manager.add_dynamic_listener(`#${this.id}`, 'click', this.toggle_disable_args, this);
}
break;
case "option":
html += "<select class='arg' id='" + this.id + "'arg_name='" + this.name + "'" +
(this.disabled ? " disabled='disabled'" : "") + ">";
case 'option':
html += `<select class='arg' id='${this.id}'arg_name='${this.name}'${
this.disabled ? " disabled='disabled'" : ''}>`;
for (i = 0; i < this.value.length; i++) {
if (!!(m = this.value[i].match(/\[([a-z0-9 -()^]+)\]/i))) {
html += "<optgroup label='" + m[1] + "'>";
} else if (!!(m = this.value[i].match(/\[\/([a-z0-9 -()^]+)\]/i))) {
html += "</optgroup>";
if (m = this.value[i].match(/\[([a-z0-9 -()^]+)\]/i)) {
html += `<optgroup label='${m[1]}'>`;
} else if (m = this.value[i].match(/\[\/([a-z0-9 -()^]+)\]/i)) {
html += '</optgroup>';
} else {
html += "<option>" + this.value[i] + "</option>";
html += `<option>${this.value[i]}</option>`;
}
}
html += "</select>";
html += '</select>';
break;
case "populate_option":
html += "<select class='arg' id='" + this.id + "'arg_name='" + this.name + "'" +
(this.disabled ? " disabled='disabled'" : "") + ">";
case 'populate_option':
html += `<select class='arg' id='${this.id}'arg_name='${this.name}'${
this.disabled ? " disabled='disabled'" : ''}>`;
for (i = 0; i < this.value.length; i++) {
if (!!(m = this.value[i].name.match(/\[([a-z0-9 -()^]+)\]/i))) {
html += "<optgroup label='" + m[1] + "'>";
} else if (!!(m = this.value[i].name.match(/\[\/([a-z0-9 -()^]+)\]/i))) {
html += "</optgroup>";
if (m = this.value[i].name.match(/\[([a-z0-9 -()^]+)\]/i)) {
html += `<optgroup label='${m[1]}'>`;
} else if (m = this.value[i].name.match(/\[\/([a-z0-9 -()^]+)\]/i)) {
html += '</optgroup>';
} else {
html += "<option populate-value='" + this.value[i].value + "'>" +
this.value[i].name + "</option>";
html += `<option populate-value='${this.value[i].value}'>${
this.value[i].name}</option>`;
}
}
html += "</select>";
html += '</select>';
this.manager.add_dynamic_listener("#" + this.id, "change", this.populate_option_change, this);
this.manager.add_dynamic_listener(`#${this.id}`, 'change', this.populate_option_change, this);
break;
case "editable_option":
case 'editable_option':
html += "<div class='editable-option'>";
html += "<select class='editable-option-select' id='sel-" + this.id + "'" +
(this.disabled ? " disabled='disabled'" : "") + ">";
html += `<select class='editable-option-select' id='sel-${this.id}'${
this.disabled ? " disabled='disabled'" : ''}>`;
for (i = 0; i < this.value.length; i++) {
html += "<option value='" + this.value[i].value + "'>" + this.value[i].name + "</option>";
html += `<option value='${this.value[i].value}'>${this.value[i].name}</option>`;
}
html += "</select>";
html += "<input class='arg arg-input editable-option-input' id='" + this.id +
"'arg_name='" + this.name + "'" + " value='" + this.value[0].value + "'" +
(this.disabled ? " disabled='disabled'" : "") +
(this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + ">";
html += "</div>";
html += '</select>';
html += `<input class='arg arg-input editable-option-input' id='${this.id
}'arg_name='${this.name}'` + ` value='${this.value[0].value}'${
this.disabled ? " disabled='disabled'" : ''
}${this.placeholder ? ` placeholder='${this.placeholder}'` : ''}>`;
html += '</div>';
this.manager.add_dynamic_listener("#sel-" + this.id, "change", this.editable_option_change, this);
this.manager.add_dynamic_listener(`#sel-${this.id}`, 'change', this.editable_option_change, this);
break;
case "text":
html += "<textarea id='" + this.id + "' class='arg' arg_name='" +
this.name + "'" + (this.disabled ? " disabled='disabled'" : "") +
(this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + ">" +
this.value + "</textarea>";
case 'text':
html += `<textarea id='${this.id}' class='arg' arg_name='${
this.name}'${this.disabled ? " disabled='disabled'" : ''
}${this.placeholder ? ` placeholder='${this.placeholder}'` : ''}>${
this.value}</textarea>`;
break;
default:
break;
}
html += "</div>";
html += '</div>';
return html;
};
@ -158,19 +159,19 @@ HTMLIngredient.prototype.to_html = function() {
* @param {event} e
*/
HTMLIngredient.prototype.toggle_disable_args = function (e) {
var el = e.target,
let el = e.target,
op = el.parentNode.parentNode,
args = op.querySelectorAll(".arg-group"),
args = op.querySelectorAll('.arg-group'),
els;
for (var i = 0; i < this.disable_args.length; i++) {
els = args[this.disable_args[i]].querySelectorAll("input, select, button");
for (let i = 0; i < this.disable_args.length; i++) {
els = args[this.disable_args[i]].querySelectorAll('input, select, button');
for (var j = 0; j < els.length; j++) {
if (els[j].getAttribute("disabled")) {
els[j].removeAttribute("disabled");
for (let j = 0; j < els.length; j++) {
if (els[j].getAttribute('disabled')) {
els[j].removeAttribute('disabled');
} else {
els[j].setAttribute("disabled", "disabled");
els[j].setAttribute('disabled', 'disabled');
}
}
}
@ -186,11 +187,11 @@ HTMLIngredient.prototype.toggle_disable_args = function(e) {
* @param {event} e
*/
HTMLIngredient.prototype.populate_option_change = function (e) {
var el = e.target,
let el = e.target,
op = el.parentNode.parentNode,
target = op.querySelectorAll(".arg-group")[this.target].querySelector("input, select, textarea");
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');
this.manager.recipe.ing_change();
};
@ -203,7 +204,7 @@ HTMLIngredient.prototype.populate_option_change = function(e) {
* @param {event} e
*/
HTMLIngredient.prototype.editable_option_change = function (e) {
var select = e.target,
let select = e.target,
input = select.nextSibling;
input.value = select.childNodes[select.selectedIndex].value;

View file

@ -11,7 +11,7 @@
* @param {HTMLApp} app - The main view object for CyberChef.
* @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.manager = manager;
@ -21,8 +21,8 @@ var HTMLOperation = function(name, config, app, manager) {
this.config = config;
this.ing_list = [];
for (var i = 0; i < config.args.length; i++) {
var ing = new HTMLIngredient(config.args[i], this.app, this.manager);
for (let i = 0; i < config.args.length; i++) {
const ing = new HTMLIngredient(config.args[i], this.app, this.manager);
this.ing_list.push(ing);
}
};
@ -31,11 +31,11 @@ var HTMLOperation = function(name, config, app, manager) {
/**
* @constant
*/
HTMLOperation.INFO_ICON = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByElEQVR4XqVTzWoaYRQ9KZJmoVaS1J1QiYTIuOgqi9lEugguQhYhdGs3hTyAi0CWJTvJIks30ZBNsimUtlqkVLoQCuJsphRriyFjabWtEyf/Rv3iWcwwymTlgQuH851z5hu43wRGkEwmXwCIA4hiGAUAmUQikQbhEHwyGCWVSglVVUW73RYmyKnxjB56ncJ6NpsVxHGrI/ZLuniVb3DIqQmCHnrNkgcggNeSJPlisRgyJR2b737j/TcDsQUPwv6H5NR4BnroZcb6Z16N2PvyX6yna9Z8qp6JQ0Uf0ughmGHWBSAuyzJqrQ7eqKewY/dzE363C71e39LoWQq5wUwul4uzIBoIBHD01RgyrkZ8eDbvwUWnj623v2DHx4qB51IAzLIAXq8XP/7W0bUVVJtXWIk8wvlN364TA+/1IDMLwmWK/Hq3axmhaBdoGLeklm73ElaBYRgIzkyifHIOO4QQJKM3oJcZq6CgaVp0OTyHw9K/kQI4FiyHfdC0n2CWe5ApFosIPZ7C2tNpXpcDOehGyD/FIbd0euhlhllzFxRzC3fydbG4XRYbB9/tQ41n9m1U7l3lyp9LkfygiZeZCoecmtMqj/+Yxn7Od3v0j50qCO3zAAAAAElFTkSuQmCC";
HTMLOperation.INFO_ICON = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByElEQVR4XqVTzWoaYRQ9KZJmoVaS1J1QiYTIuOgqi9lEugguQhYhdGs3hTyAi0CWJTvJIks30ZBNsimUtlqkVLoQCuJsphRriyFjabWtEyf/Rv3iWcwwymTlgQuH851z5hu43wRGkEwmXwCIA4hiGAUAmUQikQbhEHwyGCWVSglVVUW73RYmyKnxjB56ncJ6NpsVxHGrI/ZLuniVb3DIqQmCHnrNkgcggNeSJPlisRgyJR2b737j/TcDsQUPwv6H5NR4BnroZcb6Z16N2PvyX6yna9Z8qp6JQ0Uf0ughmGHWBSAuyzJqrQ7eqKewY/dzE363C71e39LoWQq5wUwul4uzIBoIBHD01RgyrkZ8eDbvwUWnj623v2DHx4qB51IAzLIAXq8XP/7W0bUVVJtXWIk8wvlN364TA+/1IDMLwmWK/Hq3axmhaBdoGLeklm73ElaBYRgIzkyifHIOO4QQJKM3oJcZq6CgaVp0OTyHw9K/kQI4FiyHfdC0n2CWe5ApFosIPZ7C2tNpXpcDOehGyD/FIbd0euhlhllzFxRzC3fydbG4XRYbB9/tQ41n9m1U7l3lyp9LkfygiZeZCoecmtMqj/+Yxn7Od3v0j50qCO3zAAAAAElFTkSuQmCC';
/**
* @constant
*/
HTMLOperation.REMOVE_ICON = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABwklEQVR42qRTPU8CQRB9K2CCMRJ6NTQajOUaqfxIbLCRghhjQixosLAgFNBQ3l8wsabxLxBJbCyVUBiMCVQEQkOEKBbCnefM3p4eohWXzM3uvHlv52b2hG3bmOWZw4yPn1/XQkCQ9wFxcgZZ0QLKpifpN8Z1n1L13griBBjHhYK0nMT4b+wom53ClAAFQacZJ/m8rNfrSOZy0vxJjPP6IJ2WzWYTO6mUwiwtILiJJSHUKVSWkchkZK1WQzQaxU2pVGUglkjIbreLUCiEx0qlStlFCpfPiPstYDtVKJH9ZFI2Gw1FGA6H6LTbCAaDeGu1FJl6UuYjpwTGzucokZW1NfnS66kyfT4fXns9RaZmlgNcuhZQU+jowLzuOK/HgwEW3E5ZlhLXVWKk11P3wNYNWw+HZdA0sUgx1zjGmD05nckx0ilGjBJdUq3fr7K5e8bGf43RdL7fOPSQb4lI8SLbrUfkUIuY32VTI1bJn5BqDnh4Dodt9ryPUDzyD7aquWoKQohl2i9sAbubwPkTcHkP3FHsg+yT+7sN7G0AF3Xg6sHB3onbdgWWKBDQg/BcTuVt51dQA/JrnIcyIu6rmPV3/hJgACPc0BMEYTg+AAAAAElFTkSuQmCC";
HTMLOperation.REMOVE_ICON = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABwklEQVR42qRTPU8CQRB9K2CCMRJ6NTQajOUaqfxIbLCRghhjQixosLAgFNBQ3l8wsabxLxBJbCyVUBiMCVQEQkOEKBbCnefM3p4eohWXzM3uvHlv52b2hG3bmOWZw4yPn1/XQkCQ9wFxcgZZ0QLKpifpN8Z1n1L13griBBjHhYK0nMT4b+wom53ClAAFQacZJ/m8rNfrSOZy0vxJjPP6IJ2WzWYTO6mUwiwtILiJJSHUKVSWkchkZK1WQzQaxU2pVGUglkjIbreLUCiEx0qlStlFCpfPiPstYDtVKJH9ZFI2Gw1FGA6H6LTbCAaDeGu1FJl6UuYjpwTGzucokZW1NfnS66kyfT4fXns9RaZmlgNcuhZQU+jowLzuOK/HgwEW3E5ZlhLXVWKk11P3wNYNWw+HZdA0sUgx1zjGmD05nckx0ilGjBJdUq3fr7K5e8bGf43RdL7fOPSQb4lI8SLbrUfkUIuY32VTI1bJn5BqDnh4Dodt9ryPUDzyD7aquWoKQohl2i9sAbubwPkTcHkP3FHsg+yT+7sN7G0AF3Xg6sHB3onbdgWWKBDQg/BcTuVt51dQA/JrnIcyIu6rmPV3/hJgACPc0BMEYTg+AAAAAElFTkSuQmCC';
/**
@ -44,25 +44,25 @@ HTMLOperation.REMOVE_ICON = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABwkl
* @returns {string}
*/
HTMLOperation.prototype.to_stub_html = function (remove_icon) {
var html = "<li class='operation'";
let html = "<li class='operation'";
if (this.description) {
html += " data-container='body' data-toggle='popover' data-placement='auto right'\
data-content=\"" + this.description + "\" data-html='true' data-trigger='hover'";
html += ` data-container='body' data-toggle='popover' data-placement='auto right'\
data-content="${this.description}" data-html='true' data-trigger='hover'`;
}
html += ">" + this.name;
html += `>${this.name}`;
if (remove_icon) {
html += "<img src='data:image/png;base64," + HTMLOperation.REMOVE_ICON +
"' class='op-icon remove-icon'>";
html += `<img src='data:image/png;base64,${HTMLOperation.REMOVE_ICON
}' class='op-icon remove-icon'>`;
}
if (this.description) {
html += "<img src='data:image/png;base64," + HTMLOperation.INFO_ICON + "' class='op-icon'>";
html += `<img src='data:image/png;base64,${HTMLOperation.INFO_ICON}' class='op-icon'>`;
}
html += "</li>";
html += '</li>';
return html;
};
@ -74,9 +74,9 @@ HTMLOperation.prototype.to_stub_html = function(remove_icon) {
* @returns {string}
*/
HTMLOperation.prototype.to_full_html = 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.ing_list.length; i++) {
for (let i = 0; i < this.ing_list.length; i++) {
html += this.ing_list[i].to_html();
}
@ -101,14 +101,14 @@ HTMLOperation.prototype.to_full_html = function() {
*/
HTMLOperation.prototype.highlight_search_string = function (search_str, name_pos, desc_pos) {
if (name_pos >= 0) {
this.name = this.name.slice(0, name_pos) + "<b><u>" +
this.name.slice(name_pos, name_pos + search_str.length) + "</u></b>" +
this.name.slice(name_pos + search_str.length);
this.name = `${this.name.slice(0, name_pos)}<b><u>${
this.name.slice(name_pos, name_pos + search_str.length)}</u></b>${
this.name.slice(name_pos + search_str.length)}`;
}
if (this.description && desc_pos >= 0) {
this.description = this.description.slice(0, desc_pos) + "<b><u>" +
this.description.slice(desc_pos, desc_pos + search_str.length) + "</u></b>" +
this.description.slice(desc_pos + search_str.length);
this.description = `${this.description.slice(0, desc_pos)}<b><u>${
this.description.slice(desc_pos, desc_pos + search_str.length)}</u></b>${
this.description.slice(desc_pos + search_str.length)}`;
}
};

View file

@ -8,7 +8,7 @@
* @constructor
* @param {HTMLApp} app - The main view object for CyberChef.
*/
var HighlighterWaiter = function(app) {
const HighlighterWaiter = function (app) {
this.app = app;
this.mouse_button_down = false;
@ -38,11 +38,11 @@ HighlighterWaiter.OUTPUT = 1;
* @returns {boolean}
*/
HighlighterWaiter.prototype._is_selection_backwards = function () {
var backwards = false,
let backwards = false,
sel = window.getSelection();
if (!sel.isCollapsed) {
var range = document.createRange();
const range = document.createRange();
range.setStart(sel.anchorNode, sel.anchorOffset);
range.setEnd(sel.focusNode, sel.focusOffset);
backwards = range.collapsed;
@ -61,10 +61,10 @@ HighlighterWaiter.prototype._is_selection_backwards = function() {
* @returns {number}
*/
HighlighterWaiter.prototype._get_output_html_offset = function (node, offset) {
var sel = window.getSelection(),
let sel = window.getSelection(),
range = document.createRange();
range.selectNodeContents(document.getElementById("output-html"));
range.selectNodeContents(document.getElementById('output-html'));
range.setEnd(node, offset);
sel.removeAllRanges();
sel.addRange(range);
@ -82,7 +82,7 @@ HighlighterWaiter.prototype._get_output_html_offset = function(node, offset) {
* @returns {number} pos.end
*/
HighlighterWaiter.prototype._get_output_html_selection_offsets = function () {
var sel = window.getSelection(),
let sel = window.getSelection(),
range,
start = 0,
end = 0,
@ -105,8 +105,8 @@ HighlighterWaiter.prototype._get_output_html_selection_offsets = function() {
}
return {
start: start,
end: end
start,
end,
};
};
@ -118,9 +118,9 @@ HighlighterWaiter.prototype._get_output_html_selection_offsets = function() {
* @param {event} e
*/
HighlighterWaiter.prototype.input_scroll = function (e) {
var el = e.target;
document.getElementById("input-highlighter").scrollTop = el.scrollTop;
document.getElementById("input-highlighter").scrollLeft = el.scrollLeft;
const el = e.target;
document.getElementById('input-highlighter').scrollTop = el.scrollTop;
document.getElementById('input-highlighter').scrollLeft = el.scrollLeft;
};
@ -131,9 +131,9 @@ HighlighterWaiter.prototype.input_scroll = function(e) {
* @param {event} e
*/
HighlighterWaiter.prototype.output_scroll = function (e) {
var el = e.target;
document.getElementById("output-highlighter").scrollTop = el.scrollTop;
document.getElementById("output-highlighter").scrollLeft = el.scrollLeft;
const el = e.target;
document.getElementById('output-highlighter').scrollTop = el.scrollTop;
document.getElementById('output-highlighter').scrollLeft = el.scrollLeft;
};
@ -148,13 +148,13 @@ HighlighterWaiter.prototype.input_mousedown = function(e) {
this.mouse_target = HighlighterWaiter.INPUT;
this.remove_highlights();
var el = e.target,
let el = e.target,
start = el.selectionStart,
end = el.selectionEnd;
if (start !== 0 || end !== 0) {
document.getElementById("input-selection-info").innerHTML = this.selection_info(start, end);
this.highlight_output([{start: start, end: end}]);
document.getElementById('input-selection-info').innerHTML = this.selection_info(start, end);
this.highlight_output([{ start, end }]);
}
};
@ -170,13 +170,13 @@ HighlighterWaiter.prototype.output_mousedown = function(e) {
this.mouse_target = HighlighterWaiter.OUTPUT;
this.remove_highlights();
var el = e.target,
let el = e.target,
start = el.selectionStart,
end = el.selectionEnd;
if (start !== 0 || end !== 0) {
document.getElementById("output-selection-info").innerHTML = this.selection_info(start, end);
this.highlight_input([{start: start, end: end}]);
document.getElementById('output-selection-info').innerHTML = this.selection_info(start, end);
this.highlight_input([{ start, end }]);
}
};
@ -191,9 +191,9 @@ HighlighterWaiter.prototype.output_html_mousedown = function(e) {
this.mouse_button_down = true;
this.mouse_target = HighlighterWaiter.OUTPUT;
var sel = this._get_output_html_selection_offsets();
const sel = this._get_output_html_selection_offsets();
if (sel.start !== 0 || sel.end !== 0) {
document.getElementById("output-selection-info").innerHTML = this.selection_info(sel.start, sel.end);
document.getElementById('output-selection-info').innerHTML = this.selection_info(sel.start, sel.end);
}
};
@ -238,16 +238,15 @@ HighlighterWaiter.prototype.input_mousemove = function(e) {
// Check that the left mouse button is pressed
if (!this.mouse_button_down ||
e.which != 1 ||
this.mouse_target != HighlighterWaiter.INPUT)
return;
this.mouse_target != HighlighterWaiter.INPUT) { return; }
var el = e.target,
let el = e.target,
start = el.selectionStart,
end = el.selectionEnd;
if (start !== 0 || end !== 0) {
document.getElementById("input-selection-info").innerHTML = this.selection_info(start, end);
this.highlight_output([{start: start, end: end}]);
document.getElementById('input-selection-info').innerHTML = this.selection_info(start, end);
this.highlight_output([{ start, end }]);
}
};
@ -262,16 +261,15 @@ HighlighterWaiter.prototype.output_mousemove = function(e) {
// Check that the left mouse button is pressed
if (!this.mouse_button_down ||
e.which != 1 ||
this.mouse_target != HighlighterWaiter.OUTPUT)
return;
this.mouse_target != HighlighterWaiter.OUTPUT) { return; }
var el = e.target,
let el = e.target,
start = el.selectionStart,
end = el.selectionEnd;
if (start !== 0 || end !== 0) {
document.getElementById("output-selection-info").innerHTML = this.selection_info(start, end);
this.highlight_input([{start: start, end: end}]);
document.getElementById('output-selection-info').innerHTML = this.selection_info(start, end);
this.highlight_input([{ start, end }]);
}
};
@ -286,12 +284,11 @@ HighlighterWaiter.prototype.output_html_mousemove = function(e) {
// Check that the left mouse button is pressed
if (!this.mouse_button_down ||
e.which != 1 ||
this.mouse_target != HighlighterWaiter.OUTPUT)
return;
this.mouse_target != HighlighterWaiter.OUTPUT) { return; }
var sel = this._get_output_html_selection_offsets();
const sel = this._get_output_html_selection_offsets();
if (sel.start !== 0 || sel.end !== 0) {
document.getElementById("output-selection-info").innerHTML = this.selection_info(sel.start, sel.end);
document.getElementById('output-selection-info').innerHTML = this.selection_info(sel.start, sel.end);
}
};
@ -305,13 +302,13 @@ HighlighterWaiter.prototype.output_html_mousemove = function(e) {
* @returns {string}
*/
HighlighterWaiter.prototype.selection_info = function (start, end) {
var width = end.toString().length;
let width = end.toString().length;
width = width < 2 ? 2 : width;
var start_str = Utils.pad(start.toString(), width, " ").replace(/ /g, "&nbsp;"),
end_str = Utils.pad(end.toString(), width, " ").replace(/ /g, "&nbsp;"),
len_str = Utils.pad((end-start).toString(), width, " ").replace(/ /g, "&nbsp;");
let start_str = Utils.pad(start.toString(), width, ' ').replace(/ /g, '&nbsp;'),
end_str = Utils.pad(end.toString(), width, ' ').replace(/ /g, '&nbsp;'),
len_str = Utils.pad((end - start).toString(), width, ' ').replace(/ /g, '&nbsp;');
return "start: " + start_str + "<br>end: " + end_str + "<br>length: " + len_str;
return `start: ${start_str}<br>end: ${end_str}<br>length: ${len_str}`;
};
@ -319,10 +316,10 @@ HighlighterWaiter.prototype.selection_info = function(start, end) {
* Removes highlighting and selection information.
*/
HighlighterWaiter.prototype.remove_highlights = function () {
document.getElementById("input-highlighter").innerHTML = "";
document.getElementById("output-highlighter").innerHTML = "";
document.getElementById("input-selection-info").innerHTML = "";
document.getElementById("output-selection-info").innerHTML = "";
document.getElementById('input-highlighter').innerHTML = '';
document.getElementById('output-highlighter').innerHTML = '';
document.getElementById('input-selection-info').innerHTML = '';
document.getElementById('output-selection-info').innerHTML = '';
};
@ -336,16 +333,16 @@ HighlighterWaiter.prototype.remove_highlights = function() {
* @returns {Object[]} highlights[].args
*/
HighlighterWaiter.prototype.generate_highlight_list = function () {
var recipe_config = this.app.get_recipe_config(),
let recipe_config = this.app.get_recipe_config(),
highlights = [];
for (var i = 0; i < recipe_config.length; i++) {
for (let i = 0; i < recipe_config.length; i++) {
if (recipe_config[i].disabled) continue;
// If any breakpoints are set, do not attempt to highlight
if (recipe_config[i].breakpoint) return false;
var op = this.app.operations[recipe_config[i].op];
const op = this.app.operations[recipe_config[i].op];
// If any of the operations do not support highlighting, fail immediately.
if (op.highlight === false || op.highlight === undefined) return false;
@ -353,7 +350,7 @@ HighlighterWaiter.prototype.generate_highlight_list = function() {
highlights.push({
f: op.highlight,
b: op.highlight_reverse,
args: recipe_config[i].args
args: recipe_config[i].args,
});
}
@ -373,25 +370,25 @@ HighlighterWaiter.prototype.generate_highlight_list = function() {
* @param {number} pos.end - The end offset.
*/
HighlighterWaiter.prototype.highlight_output = function (pos) {
var highlights = this.generate_highlight_list();
const highlights = this.generate_highlight_list();
if (!highlights || !this.app.auto_bake_) {
return false;
}
for (var i = 0; i < highlights.length; i++) {
for (let i = 0; i < highlights.length; i++) {
// Remove multiple highlights before processing again
pos = [pos[0]];
if (typeof highlights[i].f == "function") {
if (typeof highlights[i].f === 'function') {
pos = highlights[i].f(pos, highlights[i].args);
}
}
document.getElementById("output-selection-info").innerHTML = this.selection_info(pos[0].start, pos[0].end);
document.getElementById('output-selection-info').innerHTML = this.selection_info(pos[0].start, pos[0].end);
this.highlight(
document.getElementById("output-text"),
document.getElementById("output-highlighter"),
document.getElementById('output-text'),
document.getElementById('output-highlighter'),
pos);
};
@ -408,25 +405,25 @@ HighlighterWaiter.prototype.highlight_output = function(pos) {
* @param {number} pos.end - The end offset.
*/
HighlighterWaiter.prototype.highlight_input = function (pos) {
var highlights = this.generate_highlight_list();
const highlights = this.generate_highlight_list();
if (!highlights || !this.app.auto_bake_) {
return false;
}
for (var i = 0; i < highlights.length; i++) {
for (let i = 0; i < highlights.length; i++) {
// Remove multiple highlights before processing again
pos = [pos[0]];
if (typeof highlights[i].b == "function") {
if (typeof highlights[i].b === 'function') {
pos = highlights[i].b(pos, highlights[i].args);
}
}
document.getElementById("input-selection-info").innerHTML = this.selection_info(pos[0].start, pos[0].end);
document.getElementById('input-selection-info').innerHTML = this.selection_info(pos[0].start, pos[0].end);
this.highlight(
document.getElementById("input-text"),
document.getElementById("input-highlighter"),
document.getElementById('input-text'),
document.getElementById('input-highlighter'),
pos);
};
@ -447,11 +444,11 @@ HighlighterWaiter.prototype.highlight = function(textarea, highlighter, pos) {
// Check if there is a carriage return in the output dish as this will not
// be displayed by the HTML textarea and will mess up highlighting offsets.
if (!this.app.dish_str || this.app.dish_str.indexOf("\r") >= 0) return false;
if (!this.app.dish_str || this.app.dish_str.indexOf('\r') >= 0) return false;
var start_placeholder = "[start_highlight]",
let start_placeholder = '[start_highlight]',
start_placeholder_regex = /\[start_highlight\]/g,
end_placeholder = "[end_highlight]",
end_placeholder = '[end_highlight]',
end_placeholder_regex = /\[end_highlight\]/g,
text = textarea.value;
@ -465,11 +462,11 @@ HighlighterWaiter.prototype.highlight = function(textarea, highlighter, pos) {
text.slice(pos[0].end, text.length);
} else {
// O(n^2) - Can anyone improve this without overwriting placeholders?
var result = "",
let result = '',
end_placed = true;
for (var i = 0; i < text.length; i++) {
for (var j = 1; j < pos.length; j++) {
for (let i = 0; i < text.length; i++) {
for (let j = 1; j < pos.length; j++) {
if (pos[j].end < pos[j].start) continue;
if (pos[j].start == i) {
result += start_placeholder;
@ -486,20 +483,20 @@ HighlighterWaiter.prototype.highlight = function(textarea, highlighter, pos) {
text = result;
}
var css_class = "hl1";
const css_class = 'hl1';
// if (colour) css_class += "-"+colour;
// Remove HTML tags
text = text.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/\n/g, "&#10;")
text = `${text.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/\n/g, '&#10;')
// Convert placeholders to tags
.replace(start_placeholder_regex, "<span class=\""+css_class+"\">")
.replace(end_placeholder_regex, "</span>") + "&nbsp;";
.replace(start_placeholder_regex, `<span class="${css_class}">`)
.replace(end_placeholder_regex, '</span>')}&nbsp;`;
// Adjust width to allow for scrollbars
highlighter.style.width = textarea.clientWidth + "px";
highlighter.style.width = `${textarea.clientWidth}px`;
highlighter.innerHTML = text;
highlighter.scrollTop = textarea.scrollTop;
highlighter.scrollLeft = textarea.scrollLeft;

View file

@ -9,7 +9,7 @@
* @param {HTMLApp} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager.
*/
var InputWaiter = function(app, manager) {
const InputWaiter = function (app, manager) {
this.app = app;
this.manager = manager;
@ -39,7 +39,7 @@ var InputWaiter = function(app, manager) {
* @returns {string}
*/
InputWaiter.prototype.get = function () {
return document.getElementById("input-text").value;
return document.getElementById('input-text').value;
};
@ -51,7 +51,7 @@ InputWaiter.prototype.get = function() {
* @fires Manager#statechange
*/
InputWaiter.prototype.set = function (input) {
document.getElementById("input-text").value = input;
document.getElementById('input-text').value = input;
window.dispatchEvent(this.manager.statechange);
};
@ -63,13 +63,13 @@ InputWaiter.prototype.set = function(input) {
* @param {number} lines - The number of the lines in the current input string
*/
InputWaiter.prototype.set_input_info = function (length, lines) {
var width = length.toString().length;
let width = length.toString().length;
width = width < 2 ? 2 : width;
var length_str = Utils.pad(length.toString(), width, " ").replace(/ /g, "&nbsp;");
var lines_str = Utils.pad(lines.toString(), width, " ").replace(/ /g, "&nbsp;");
const length_str = Utils.pad(length.toString(), width, ' ').replace(/ /g, '&nbsp;');
const lines_str = Utils.pad(lines.toString(), width, ' ').replace(/ /g, '&nbsp;');
document.getElementById("input-info").innerHTML = "length: " + length_str + "<br>lines: " + lines_str;
document.getElementById('input-info').innerHTML = `length: ${length_str}<br>lines: ${lines_str}`;
};
@ -89,8 +89,8 @@ InputWaiter.prototype.input_change = function(e) {
this.app.progress = 0;
// Update the input metadata info
var input_text = this.get(),
lines = input_text.count("\n") + 1;
let input_text = this.get(),
lines = input_text.count('\n') + 1;
this.set_input_info(input_text.length, lines);
@ -110,12 +110,13 @@ InputWaiter.prototype.input_change = function(e) {
*/
InputWaiter.prototype.input_dragover = function (e) {
// This will be set if we're dragging an operation
if (e.dataTransfer.effectAllowed === "move")
if (e.dataTransfer.effectAllowed === 'move') {
return false;
}
e.stopPropagation();
e.preventDefault();
e.target.classList.add("dropping-file");
e.target.classList.add('dropping-file');
};
@ -128,7 +129,7 @@ InputWaiter.prototype.input_dragover = function(e) {
InputWaiter.prototype.input_dragleave = function (e) {
e.stopPropagation();
e.preventDefault();
e.target.classList.remove("dropping-file");
e.target.classList.remove('dropping-file');
};
@ -140,58 +141,59 @@ InputWaiter.prototype.input_dragleave = function(e) {
*/
InputWaiter.prototype.input_drop = function (e) {
// This will be set if we're dragging an operation
if (e.dataTransfer.effectAllowed === "move")
if (e.dataTransfer.effectAllowed === 'move') {
return false;
}
e.stopPropagation();
e.preventDefault();
var el = e.target,
let el = e.target,
file = e.dataTransfer.files[0],
text = e.dataTransfer.getData("Text"),
text = e.dataTransfer.getData('Text'),
reader = new FileReader(),
input_charcode = "",
input_charcode = '',
offset = 0,
CHUNK_SIZE = 20480; // 20KB
var set_input = function() {
const set_input = function () {
if (input_charcode.length > 100000 && this.app.auto_bake_) {
this.manager.controls.set_auto_bake(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(input_charcode);
var recipe_config = this.app.get_recipe_config();
if (!recipe_config[0] || recipe_config[0].op != "From Hex") {
recipe_config.unshift({op:"From Hex",args:["Space"]});
const recipe_config = this.app.get_recipe_config();
if (!recipe_config[0] || recipe_config[0].op != 'From Hex') {
recipe_config.unshift({ op: 'From Hex', args: ['Space'] });
this.app.set_recipe_config(recipe_config);
}
el.classList.remove("loading_file");
el.classList.remove('loading_file');
}.bind(this);
var seek = function() {
const seek = function () {
if (offset >= file.size) {
set_input();
return;
}
el.value = "Processing... " + Math.round(offset / file.size * 100) + "%";
var slice = file.slice(offset, offset + CHUNK_SIZE);
el.value = `Processing... ${Math.round(offset / file.size * 100)}%`;
const slice = file.slice(offset, offset + CHUNK_SIZE);
reader.readAsArrayBuffer(slice);
}.bind(this);
};
reader.onload = function (e) {
var data = new Uint8Array(reader.result);
const data = new Uint8Array(reader.result);
input_charcode += Utils.to_hex_fast(data);
offset += CHUNK_SIZE;
seek();
}.bind(this);
};
el.classList.remove("dropping-file");
el.classList.remove('dropping-file');
if (file) {
el.classList.add("loading_file");
el.classList.add('loading_file');
seek();
} else if (text) {
this.set(text);
@ -207,11 +209,11 @@ InputWaiter.prototype.input_drop = function(e) {
*/
InputWaiter.prototype.clear_io_click = function () {
this.manager.highlighter.remove_highlights();
document.getElementById("input-text").value = "";
document.getElementById("output-text").value = "";
document.getElementById("input-info").innerHTML = "";
document.getElementById("output-info").innerHTML = "";
document.getElementById("input-selection-info").innerHTML = "";
document.getElementById("output-selection-info").innerHTML = "";
document.getElementById('input-text').value = '';
document.getElementById('output-text').value = '';
document.getElementById('input-info').innerHTML = '';
document.getElementById('output-info').innerHTML = '';
document.getElementById('input-selection-info').innerHTML = '';
document.getElementById('output-selection-info').innerHTML = '';
window.dispatchEvent(this.manager.statechange);
};

View file

@ -8,30 +8,30 @@
* @constructor
* @param {HTMLApp} app - The main view object for CyberChef.
*/
var Manager = function(app) {
const Manager = function (app) {
this.app = app;
// Define custom events
/**
* @event Manager#appstart
*/
this.appstart = new CustomEvent("appstart", {bubbles: true});
this.appstart = new CustomEvent('appstart', { bubbles: true });
/**
* @event Manager#operationadd
*/
this.operationadd = new CustomEvent("operationadd", {bubbles: true});
this.operationadd = new CustomEvent('operationadd', { bubbles: true });
/**
* @event Manager#operationremove
*/
this.operationremove = new CustomEvent("operationremove", {bubbles: true});
this.operationremove = new CustomEvent('operationremove', { bubbles: true });
/**
* @event Manager#oplistcreate
*/
this.oplistcreate = new CustomEvent("oplistcreate", {bubbles: true});
this.oplistcreate = new CustomEvent('oplistcreate', { bubbles: true });
/**
* @event Manager#statechange
*/
this.statechange = new CustomEvent("statechange", {bubbles: true});
this.statechange = new CustomEvent('statechange', { bubbles: true });
// Define Waiter objects to handle various areas
this.window = new WindowWaiter(this.app);
@ -66,84 +66,84 @@ Manager.prototype.setup = function() {
*/
Manager.prototype.initialise_event_listeners = function () {
// Global
window.addEventListener("resize", this.window.window_resize.bind(this.window));
window.addEventListener("blur", this.window.window_blur.bind(this.window));
window.addEventListener("focus", this.window.window_focus.bind(this.window));
window.addEventListener("statechange", this.app.state_change.bind(this.app));
window.addEventListener("popstate", this.app.pop_state.bind(this.app));
window.addEventListener('resize', this.window.window_resize.bind(this.window));
window.addEventListener('blur', this.window.window_blur.bind(this.window));
window.addEventListener('focus', this.window.window_focus.bind(this.window));
window.addEventListener('statechange', this.app.state_change.bind(this.app));
window.addEventListener('popstate', this.app.pop_state.bind(this.app));
// Controls
document.getElementById("bake").addEventListener("click", this.controls.bake_click.bind(this.controls));
document.getElementById("auto-bake").addEventListener("change", this.controls.auto_bake_change.bind(this.controls));
document.getElementById("step").addEventListener("click", this.controls.step_click.bind(this.controls));
document.getElementById("clr-recipe").addEventListener("click", this.controls.clear_recipe_click.bind(this.controls));
document.getElementById("clr-breaks").addEventListener("click", this.controls.clear_breaks_click.bind(this.controls));
document.getElementById("save").addEventListener("click", this.controls.save_click.bind(this.controls));
document.getElementById("save-button").addEventListener("click", this.controls.save_button_click.bind(this.controls));
document.getElementById("save-link-recipe-checkbox").addEventListener("change", this.controls.slr_check_change.bind(this.controls));
document.getElementById("save-link-input-checkbox").addEventListener("change", this.controls.sli_check_change.bind(this.controls));
document.getElementById("load").addEventListener("click", this.controls.load_click.bind(this.controls));
document.getElementById("load-delete-button").addEventListener("click", this.controls.load_delete_click.bind(this.controls));
document.getElementById("load-name").addEventListener("change", this.controls.load_name_change.bind(this.controls));
document.getElementById("load-button").addEventListener("click", this.controls.load_button_click.bind(this.controls));
this.add_multi_event_listener("#save-text", "keyup paste", this.controls.save_text_change, this.controls);
document.getElementById('bake').addEventListener('click', this.controls.bake_click.bind(this.controls));
document.getElementById('auto-bake').addEventListener('change', this.controls.auto_bake_change.bind(this.controls));
document.getElementById('step').addEventListener('click', this.controls.step_click.bind(this.controls));
document.getElementById('clr-recipe').addEventListener('click', this.controls.clear_recipe_click.bind(this.controls));
document.getElementById('clr-breaks').addEventListener('click', this.controls.clear_breaks_click.bind(this.controls));
document.getElementById('save').addEventListener('click', this.controls.save_click.bind(this.controls));
document.getElementById('save-button').addEventListener('click', this.controls.save_button_click.bind(this.controls));
document.getElementById('save-link-recipe-checkbox').addEventListener('change', this.controls.slr_check_change.bind(this.controls));
document.getElementById('save-link-input-checkbox').addEventListener('change', this.controls.sli_check_change.bind(this.controls));
document.getElementById('load').addEventListener('click', this.controls.load_click.bind(this.controls));
document.getElementById('load-delete-button').addEventListener('click', this.controls.load_delete_click.bind(this.controls));
document.getElementById('load-name').addEventListener('change', this.controls.load_name_change.bind(this.controls));
document.getElementById('load-button').addEventListener('click', this.controls.load_button_click.bind(this.controls));
this.add_multi_event_listener('#save-text', 'keyup paste', this.controls.save_text_change, this.controls);
// Operations
this.add_multi_event_listener("#search", "keyup paste search", this.ops.search_operations, this.ops);
this.add_dynamic_listener(".op_list li.operation", "dblclick", this.ops.operation_dblclick, this.ops);
document.getElementById("edit-favourites").addEventListener("click", this.ops.edit_favourites_click.bind(this.ops));
document.getElementById("save-favourites").addEventListener("click", this.ops.save_favourites_click.bind(this.ops));
document.getElementById("reset-favourites").addEventListener("click", this.ops.reset_favourites_click.bind(this.ops));
this.add_dynamic_listener(".op_list .op-icon", "mouseover", this.ops.op_icon_mouseover, this.ops);
this.add_dynamic_listener(".op_list .op-icon", "mouseleave", this.ops.op_icon_mouseleave, this.ops);
this.add_dynamic_listener(".op_list", "oplistcreate", this.ops.op_list_create, this.ops);
this.add_dynamic_listener("li.operation", "operationadd", this.recipe.op_add.bind(this.recipe));
this.add_multi_event_listener('#search', 'keyup paste search', this.ops.search_operations, this.ops);
this.add_dynamic_listener('.op_list li.operation', 'dblclick', this.ops.operation_dblclick, this.ops);
document.getElementById('edit-favourites').addEventListener('click', this.ops.edit_favourites_click.bind(this.ops));
document.getElementById('save-favourites').addEventListener('click', this.ops.save_favourites_click.bind(this.ops));
document.getElementById('reset-favourites').addEventListener('click', this.ops.reset_favourites_click.bind(this.ops));
this.add_dynamic_listener('.op_list .op-icon', 'mouseover', this.ops.op_icon_mouseover, this.ops);
this.add_dynamic_listener('.op_list .op-icon', 'mouseleave', this.ops.op_icon_mouseleave, this.ops);
this.add_dynamic_listener('.op_list', 'oplistcreate', this.ops.op_list_create, this.ops);
this.add_dynamic_listener('li.operation', 'operationadd', this.recipe.op_add.bind(this.recipe));
// Recipe
this.add_dynamic_listener(".arg", "keyup", this.recipe.ing_change, this.recipe);
this.add_dynamic_listener(".arg", "change", this.recipe.ing_change, this.recipe);
this.add_dynamic_listener(".disable-icon", "click", this.recipe.disable_click, this.recipe);
this.add_dynamic_listener(".breakpoint", "click", this.recipe.breakpoint_click, this.recipe);
this.add_dynamic_listener("#rec_list li.operation", "dblclick", this.recipe.operation_dblclick, this.recipe);
this.add_dynamic_listener("#rec_list li.operation > div", "dblclick", this.recipe.operation_child_dblclick, this.recipe);
this.add_dynamic_listener("#rec_list .input-group .dropdown-menu a", "click", this.recipe.dropdown_toggle_click, this.recipe);
this.add_dynamic_listener("#rec_list", "operationremove", this.recipe.op_remove.bind(this.recipe));
this.add_dynamic_listener('.arg', 'keyup', this.recipe.ing_change, this.recipe);
this.add_dynamic_listener('.arg', 'change', this.recipe.ing_change, this.recipe);
this.add_dynamic_listener('.disable-icon', 'click', this.recipe.disable_click, this.recipe);
this.add_dynamic_listener('.breakpoint', 'click', this.recipe.breakpoint_click, this.recipe);
this.add_dynamic_listener('#rec_list li.operation', 'dblclick', this.recipe.operation_dblclick, this.recipe);
this.add_dynamic_listener('#rec_list li.operation > div', 'dblclick', this.recipe.operation_child_dblclick, this.recipe);
this.add_dynamic_listener('#rec_list .input-group .dropdown-menu a', 'click', this.recipe.dropdown_toggle_click, this.recipe);
this.add_dynamic_listener('#rec_list', 'operationremove', this.recipe.op_remove.bind(this.recipe));
// Input
this.add_multi_event_listener("#input-text", "keyup paste", this.input.input_change, this.input);
document.getElementById("reset-layout").addEventListener("click", this.app.reset_layout.bind(this.app));
document.getElementById("clr-io").addEventListener("click", this.input.clear_io_click.bind(this.input));
document.getElementById("input-text").addEventListener("dragover", this.input.input_dragover.bind(this.input));
document.getElementById("input-text").addEventListener("dragleave", this.input.input_dragleave.bind(this.input));
document.getElementById("input-text").addEventListener("drop", this.input.input_drop.bind(this.input));
document.getElementById("input-text").addEventListener("scroll", this.highlighter.input_scroll.bind(this.highlighter));
document.getElementById("input-text").addEventListener("mouseup", this.highlighter.input_mouseup.bind(this.highlighter));
document.getElementById("input-text").addEventListener("mousemove", this.highlighter.input_mousemove.bind(this.highlighter));
this.add_multi_event_listener("#input-text", "mousedown dblclick select", this.highlighter.input_mousedown, this.highlighter);
this.add_multi_event_listener('#input-text', 'keyup paste', this.input.input_change, this.input);
document.getElementById('reset-layout').addEventListener('click', this.app.reset_layout.bind(this.app));
document.getElementById('clr-io').addEventListener('click', this.input.clear_io_click.bind(this.input));
document.getElementById('input-text').addEventListener('dragover', this.input.input_dragover.bind(this.input));
document.getElementById('input-text').addEventListener('dragleave', this.input.input_dragleave.bind(this.input));
document.getElementById('input-text').addEventListener('drop', this.input.input_drop.bind(this.input));
document.getElementById('input-text').addEventListener('scroll', this.highlighter.input_scroll.bind(this.highlighter));
document.getElementById('input-text').addEventListener('mouseup', this.highlighter.input_mouseup.bind(this.highlighter));
document.getElementById('input-text').addEventListener('mousemove', this.highlighter.input_mousemove.bind(this.highlighter));
this.add_multi_event_listener('#input-text', 'mousedown dblclick select', this.highlighter.input_mousedown, this.highlighter);
// Output
document.getElementById("save-to-file").addEventListener("click", this.output.save_click.bind(this.output));
document.getElementById("switch").addEventListener("click", this.output.switch_click.bind(this.output));
document.getElementById("undo-switch").addEventListener("click", this.output.undo_switch_click.bind(this.output));
document.getElementById("output-text").addEventListener("scroll", this.highlighter.output_scroll.bind(this.highlighter));
document.getElementById("output-text").addEventListener("mouseup", this.highlighter.output_mouseup.bind(this.highlighter));
document.getElementById("output-text").addEventListener("mousemove", this.highlighter.output_mousemove.bind(this.highlighter));
document.getElementById("output-html").addEventListener("mouseup", this.highlighter.output_html_mouseup.bind(this.highlighter));
document.getElementById("output-html").addEventListener("mousemove", this.highlighter.output_html_mousemove.bind(this.highlighter));
this.add_multi_event_listener("#output-text", "mousedown dblclick select", this.highlighter.output_mousedown, this.highlighter);
this.add_multi_event_listener("#output-html", "mousedown dblclick select", this.highlighter.output_html_mousedown, this.highlighter);
document.getElementById('save-to-file').addEventListener('click', this.output.save_click.bind(this.output));
document.getElementById('switch').addEventListener('click', this.output.switch_click.bind(this.output));
document.getElementById('undo-switch').addEventListener('click', this.output.undo_switch_click.bind(this.output));
document.getElementById('output-text').addEventListener('scroll', this.highlighter.output_scroll.bind(this.highlighter));
document.getElementById('output-text').addEventListener('mouseup', this.highlighter.output_mouseup.bind(this.highlighter));
document.getElementById('output-text').addEventListener('mousemove', this.highlighter.output_mousemove.bind(this.highlighter));
document.getElementById('output-html').addEventListener('mouseup', this.highlighter.output_html_mouseup.bind(this.highlighter));
document.getElementById('output-html').addEventListener('mousemove', this.highlighter.output_html_mousemove.bind(this.highlighter));
this.add_multi_event_listener('#output-text', 'mousedown dblclick select', this.highlighter.output_mousedown, this.highlighter);
this.add_multi_event_listener('#output-html', 'mousedown dblclick select', this.highlighter.output_html_mousedown, this.highlighter);
// Options
document.getElementById("options").addEventListener("click", this.options.options_click.bind(this.options));
document.getElementById("reset-options").addEventListener("click", this.options.reset_options_click.bind(this.options));
$(".option-item input:checkbox").on("switchChange.bootstrapSwitch", this.options.switch_change.bind(this.options));
$(".option-item input:checkbox").on("switchChange.bootstrapSwitch", this.options.set_word_wrap.bind(this.options));
this.add_dynamic_listener(".option-item input[type=number]", "keyup", this.options.number_change, this.options);
this.add_dynamic_listener(".option-item input[type=number]", "change", this.options.number_change, this.options);
this.add_dynamic_listener(".option-item select", "change", this.options.select_change, this.options);
document.getElementById('options').addEventListener('click', this.options.options_click.bind(this.options));
document.getElementById('reset-options').addEventListener('click', this.options.reset_options_click.bind(this.options));
$('.option-item input:checkbox').on('switchChange.bootstrapSwitch', this.options.switch_change.bind(this.options));
$('.option-item input:checkbox').on('switchChange.bootstrapSwitch', this.options.set_word_wrap.bind(this.options));
this.add_dynamic_listener('.option-item input[type=number]', 'keyup', this.options.number_change, this.options);
this.add_dynamic_listener('.option-item input[type=number]', 'change', this.options.number_change, this.options);
this.add_dynamic_listener('.option-item select', 'change', this.options.select_change, this.options);
// Misc
document.getElementById("alert-close").addEventListener("click", this.app.alert_close_click.bind(this.app));
document.getElementById('alert-close').addEventListener('click', this.app.alert_close_click.bind(this.app));
};
@ -162,7 +162,7 @@ Manager.prototype.initialise_event_listeners = function() {
*/
Manager.prototype.add_listeners = function (selector, event_type, callback, scope) {
scope = scope || this;
[].forEach.call(document.querySelectorAll(selector), function(el) {
[].forEach.call(document.querySelectorAll(selector), (el) => {
el.addEventListener(event_type, callback.bind(scope));
});
};
@ -182,8 +182,8 @@ Manager.prototype.add_listeners = function(selector, event_type, callback, scope
* this.add_multi_event_listener("search", "keyup paste search", this.search, this);
*/
Manager.prototype.add_multi_event_listener = function (selector, event_types, callback, scope) {
var evs = event_types.split(" ");
for (var i = 0; i < evs.length; i++) {
const evs = event_types.split(' ');
for (let i = 0; i < evs.length; i++) {
document.querySelector(selector).addEventListener(evs[i], callback.bind(scope));
}
};
@ -203,8 +203,8 @@ Manager.prototype.add_multi_event_listener = function(selector, event_types, cal
* this.add_multi_event_listener(".saveable", "keyup paste", this.save, this);
*/
Manager.prototype.add_multi_event_listeners = function (selector, event_types, callback, scope) {
var evs = event_types.split(" ");
for (var i = 0; i < evs.length; i++) {
const evs = event_types.split(' ');
for (let i = 0; i < evs.length; i++) {
this.add_listeners(selector, evs[i], callback, scope);
}
};
@ -225,9 +225,9 @@ Manager.prototype.add_multi_event_listeners = function(selector, event_types, ca
* this.add_dynamic_listener("button", "click", alert, this);
*/
Manager.prototype.add_dynamic_listener = function (selector, event_type, callback, scope) {
var event_config = {
selector: selector,
callback: callback.bind(scope || this)
const event_config = {
selector,
callback: callback.bind(scope || this),
};
if (this.dynamic_handlers.hasOwnProperty(event_type)) {
@ -248,14 +248,14 @@ Manager.prototype.add_dynamic_listener = function(selector, event_type, callback
* @param {Event} e - The event to be handled
*/
Manager.prototype.dynamic_listener_handler = function (e) {
var handlers = this.dynamic_handlers[e.type],
let handlers = this.dynamic_handlers[e.type],
matches = e.target.matches ||
e.target.webkitMatchesSelector ||
e.target.mozMatchesSelector ||
e.target.msMatchesSelector ||
e.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)) {
handlers[i].callback(e);
}

View file

@ -11,7 +11,7 @@
* @param {HTMLApp} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager.
*/
var OperationsWaiter = function(app, manager) {
const OperationsWaiter = function (app, manager) {
this.app = app;
this.manager = manager;
@ -27,11 +27,12 @@ var OperationsWaiter = function(app, manager) {
* @param {event} e
*/
OperationsWaiter.prototype.search_operations = function (e) {
var ops, selected;
let ops,
selected;
if (e.type == "search") { // Search
if (e.type == 'search') { // Search
e.preventDefault();
ops = document.querySelectorAll("#search-results li");
ops = document.querySelectorAll('#search-results li');
if (ops.length) {
selected = this.get_selected_op(ops);
if (selected > -1) {
@ -45,28 +46,28 @@ OperationsWaiter.prototype.search_operations = function(e) {
e.preventDefault();
} else if (e.keyCode == 40) { // Down
e.preventDefault();
ops = document.querySelectorAll("#search-results li");
ops = document.querySelectorAll('#search-results li');
if (ops.length) {
selected = this.get_selected_op(ops);
if (selected > -1) {
ops[selected].classList.remove("selected-op");
ops[selected].classList.remove('selected-op');
}
if (selected == ops.length - 1) selected = -1;
ops[selected+1].classList.add("selected-op");
ops[selected + 1].classList.add('selected-op');
}
} else if (e.keyCode == 38) { // Up
e.preventDefault();
ops = document.querySelectorAll("#search-results li");
ops = document.querySelectorAll('#search-results li');
if (ops.length) {
selected = this.get_selected_op(ops);
if (selected > -1) {
ops[selected].classList.remove("selected-op");
ops[selected].classList.remove('selected-op');
}
if (selected === 0) selected = ops.length;
ops[selected-1].classList.add("selected-op");
ops[selected - 1].classList.add('selected-op');
}
} else {
var search_results_el = document.getElementById("search-results"),
let search_results_el = document.getElementById('search-results'),
el = e.target,
str = el.value;
@ -74,12 +75,12 @@ OperationsWaiter.prototype.search_operations = function(e) {
search_results_el.removeChild(search_results_el.firstChild);
}
$("#categories .in").collapse("hide");
$('#categories .in').collapse('hide');
if (str) {
var matched_ops = this.filter_operations(str, true),
matched_ops_html = "";
let matched_ops = this.filter_operations(str, true),
matched_ops_html = '';
for (var i = 0; i < matched_ops.length; i++) {
for (let i = 0; i < matched_ops.length; i++) {
matched_ops_html += matched_ops[i].to_stub_html();
}
@ -99,18 +100,18 @@ OperationsWaiter.prototype.search_operations = function(e) {
* @returns {string[]}
*/
OperationsWaiter.prototype.filter_operations = function (search_str, highlight) {
var matched_ops = [],
let matched_ops = [],
matched_descs = [];
search_str = search_str.toLowerCase();
for (var op_name in this.app.operations) {
var op = this.app.operations[op_name],
for (const op_name in this.app.operations) {
let op = this.app.operations[op_name],
name_pos = op_name.toLowerCase().indexOf(search_str),
desc_pos = op.description.toLowerCase().indexOf(search_str);
if (name_pos >= 0 || desc_pos >= 0) {
var operation = new HTMLOperation(op_name, this.app.operations[op_name], this.app, this.manager);
const operation = new HTMLOperation(op_name, this.app.operations[op_name], this.app, this.manager);
if (highlight) {
operation.highlight_search_string(search_str, name_pos, desc_pos);
}
@ -135,8 +136,8 @@ OperationsWaiter.prototype.filter_operations = function(search_str, highlight) {
* @returns {number}
*/
OperationsWaiter.prototype.get_selected_op = function (ops) {
for (var i = 0; i < ops.length; i++) {
if (ops[i].classList.contains("selected-op")) {
for (let i = 0; i < ops.length; i++) {
if (ops[i].classList.contains('selected-op')) {
return i;
}
}
@ -152,7 +153,7 @@ OperationsWaiter.prototype.get_selected_op = function(ops) {
*/
OperationsWaiter.prototype.op_list_create = function (e) {
this.manager.recipe.create_sortable_seed_list(e.target);
$("[data-toggle=popover]").popover();
$('[data-toggle=popover]').popover();
};
@ -163,7 +164,7 @@ OperationsWaiter.prototype.op_list_create = function(e) {
* @param {event} e
*/
OperationsWaiter.prototype.operation_dblclick = function (e) {
var li = e.target;
const li = e.target;
this.manager.recipe.add_operation(li.textContent);
this.app.auto_bake();
@ -181,27 +182,25 @@ OperationsWaiter.prototype.edit_favourites_click = function(e) {
e.stopPropagation();
// Add favourites to modal
var fav_cat = this.app.categories.filter(function(c) {
return c.name == "Favourites";
})[0];
const fav_cat = this.app.categories.filter(c => c.name == 'Favourites')[0];
var html = "";
for (var i = 0; i < fav_cat.ops.length; i++) {
var op_name = fav_cat.ops[i];
var operation = new HTMLOperation(op_name, this.app.operations[op_name], this.app, this.manager);
let html = '';
for (let i = 0; i < fav_cat.ops.length; i++) {
const op_name = fav_cat.ops[i];
const operation = new HTMLOperation(op_name, this.app.operations[op_name], this.app, this.manager);
html += operation.to_stub_html(true);
}
var edit_favourites_list = document.getElementById("edit-favourites-list");
const edit_favourites_list = document.getElementById('edit-favourites-list');
edit_favourites_list.innerHTML = html;
this.remove_intent = false;
var editable_list = Sortable.create(edit_favourites_list, {
const editable_list = Sortable.create(edit_favourites_list, {
filter: '.remove-icon',
onFilter: function (evt) {
var el = editable_list.closest(evt.item);
onFilter(evt) {
const el = editable_list.closest(evt.item);
if (el) {
$(el).popover("destroy");
$(el).popover('destroy');
el.parentNode.removeChild(el);
}
},
@ -210,16 +209,16 @@ OperationsWaiter.prototype.edit_favourites_click = function(e) {
}.bind(this),
});
Sortable.utils.on(edit_favourites_list, "dragleave", function() {
Sortable.utils.on(edit_favourites_list, 'dragleave', () => {
this.remove_intent = true;
}.bind(this));
});
Sortable.utils.on(edit_favourites_list, "dragover", function() {
Sortable.utils.on(edit_favourites_list, 'dragover', () => {
this.remove_intent = false;
}.bind(this));
});
$("#edit-favourites-list [data-toggle=popover]").popover();
$("#favourites-modal").modal();
$('#edit-favourites-list [data-toggle=popover]').popover();
$('#favourites-modal').modal();
};
@ -228,10 +227,10 @@ OperationsWaiter.prototype.edit_favourites_click = function(e) {
* Saves the selected favourites and reloads them.
*/
OperationsWaiter.prototype.save_favourites_click = function () {
var favourites_list = [],
favs = document.querySelectorAll("#edit-favourites-list li");
let favourites_list = [],
favs = document.querySelectorAll('#edit-favourites-list li');
for (var i = 0; i < favs.length; i++) {
for (let i = 0; i < favs.length; i++) {
favourites_list.push(favs[i].textContent);
}
@ -258,9 +257,9 @@ OperationsWaiter.prototype.reset_favourites_click = function() {
* @param {event} e
*/
OperationsWaiter.prototype.op_icon_mouseover = function (e) {
var op_el = e.target.parentNode;
if (e.target.getAttribute("data-toggle") == "popover") {
$(op_el).popover("hide");
const op_el = e.target.parentNode;
if (e.target.getAttribute('data-toggle') == 'popover') {
$(op_el).popover('hide');
}
};
@ -273,10 +272,10 @@ OperationsWaiter.prototype.op_icon_mouseover = function(e) {
* @param {event} e
*/
OperationsWaiter.prototype.op_icon_mouseleave = function (e) {
var op_el = e.target.parentNode,
let op_el = e.target.parentNode,
to_el = e.toElement || e.relatedElement;
if (e.target.getAttribute("data-toggle") == "popover" && to_el === op_el) {
$(op_el).popover("show");
if (e.target.getAttribute('data-toggle') == 'popover' && to_el === op_el) {
$(op_el).popover('show');
}
};

View file

@ -8,7 +8,7 @@
* @constructor
* @param {HTMLApp} app - The main view object for CyberChef.
*/
var OptionsWaiter = function(app) {
const OptionsWaiter = function (app) {
this.app = app;
};
@ -19,31 +19,31 @@ var OptionsWaiter = function(app) {
* @param {Object} options
*/
OptionsWaiter.prototype.load = function (options) {
$(".option-item input:checkbox").bootstrapSwitch({
size: "small",
$('.option-item input:checkbox').bootstrapSwitch({
size: 'small',
animate: false,
});
for (var option in options) {
for (const option in options) {
this.app.options[option] = options[option];
}
// 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++) {
$(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++) {
nboxes[i].value = this.app.options[nboxes[i].getAttribute("option")];
nboxes[i].dispatchEvent(new CustomEvent("change", {bubbles: true}));
nboxes[i].value = this.app.options[nboxes[i].getAttribute('option')];
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++) {
selects[i].value = this.app.options[selects[i].getAttribute("option")];
selects[i].dispatchEvent(new CustomEvent("change", {bubbles: true}));
selects[i].value = this.app.options[selects[i].getAttribute('option')];
selects[i].dispatchEvent(new CustomEvent('change', { bubbles: true }));
}
};
@ -53,7 +53,7 @@ OptionsWaiter.prototype.load = function(options) {
* Dispays the options pane.
*/
OptionsWaiter.prototype.options_click = function () {
$("#options-modal").modal();
$('#options-modal').modal();
};
@ -74,11 +74,11 @@ OptionsWaiter.prototype.reset_options_click = function() {
* @param {boolean} state
*/
OptionsWaiter.prototype.switch_change = function (e, state) {
var el = e.target,
option = el.getAttribute("option");
let el = e.target,
option = el.getAttribute('option');
this.app.options[option] = state;
localStorage.setItem("options", JSON.stringify(this.app.options));
localStorage.setItem('options', JSON.stringify(this.app.options));
};
@ -89,11 +89,11 @@ OptionsWaiter.prototype.switch_change = function(e, state) {
* @param {event} e
*/
OptionsWaiter.prototype.number_change = function (e) {
var el = e.target,
option = el.getAttribute("option");
let el = e.target,
option = el.getAttribute('option');
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,11 +104,11 @@ OptionsWaiter.prototype.number_change = function(e) {
* @param {event} e
*/
OptionsWaiter.prototype.select_change = function (e) {
var el = e.target,
option = el.getAttribute("option");
let el = e.target,
option = el.getAttribute('option');
this.app.options[option] = el.value;
localStorage.setItem("options", JSON.stringify(this.app.options));
localStorage.setItem('options', JSON.stringify(this.app.options));
};
@ -116,17 +116,17 @@ OptionsWaiter.prototype.select_change = function(e) {
* Sets or unsets word wrap on the input and output depending on the word_wrap option value.
*/
OptionsWaiter.prototype.set_word_wrap = function () {
document.getElementById("input-text").classList.remove("word-wrap");
document.getElementById("output-text").classList.remove("word-wrap");
document.getElementById("output-html").classList.remove("word-wrap");
document.getElementById("input-highlighter").classList.remove("word-wrap");
document.getElementById("output-highlighter").classList.remove("word-wrap");
document.getElementById('input-text').classList.remove('word-wrap');
document.getElementById('output-text').classList.remove('word-wrap');
document.getElementById('output-html').classList.remove('word-wrap');
document.getElementById('input-highlighter').classList.remove('word-wrap');
document.getElementById('output-highlighter').classList.remove('word-wrap');
if (!this.app.options.word_wrap) {
document.getElementById("input-text").classList.add("word-wrap");
document.getElementById("output-text").classList.add("word-wrap");
document.getElementById("output-html").classList.add("word-wrap");
document.getElementById("input-highlighter").classList.add("word-wrap");
document.getElementById("output-highlighter").classList.add("word-wrap");
document.getElementById('input-text').classList.add('word-wrap');
document.getElementById('output-text').classList.add('word-wrap');
document.getElementById('output-html').classList.add('word-wrap');
document.getElementById('input-highlighter').classList.add('word-wrap');
document.getElementById('output-highlighter').classList.add('word-wrap');
}
};

View file

@ -9,7 +9,7 @@
* @param {HTMLApp} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager.
*/
var OutputWaiter = function(app, manager) {
const OutputWaiter = function (app, manager) {
this.app = app;
this.manager = manager;
};
@ -21,7 +21,7 @@ var OutputWaiter = function(app, manager) {
* @returns {string}
*/
OutputWaiter.prototype.get = function () {
return document.getElementById("output-text").value;
return document.getElementById('output-text').value;
};
@ -33,23 +33,23 @@ OutputWaiter.prototype.get = function() {
* @param {number} duration - The length of time (ms) it took to generate the output
*/
OutputWaiter.prototype.set = function (data_str, type, duration) {
var output_text = document.getElementById("output-text"),
output_html = document.getElementById("output-html"),
output_highlighter = document.getElementById("output-highlighter"),
input_highlighter = document.getElementById("input-highlighter");
let output_text = document.getElementById('output-text'),
output_html = document.getElementById('output-html'),
output_highlighter = document.getElementById('output-highlighter'),
input_highlighter = document.getElementById('input-highlighter');
if (type == "html") {
output_text.style.display = "none";
output_html.style.display = "block";
output_highlighter.display = "none";
input_highlighter.display = "none";
if (type == 'html') {
output_text.style.display = 'none';
output_html.style.display = 'block';
output_highlighter.display = 'none';
input_highlighter.display = 'none';
output_text.value = "";
output_text.value = '';
output_html.innerHTML = data_str;
// Execute script sections
var script_elements = output_html.querySelectorAll("script");
for (var i = 0; i < script_elements.length; i++) {
const script_elements = output_html.querySelectorAll('script');
for (let i = 0; i < script_elements.length; i++) {
try {
eval(script_elements[i].innerHTML); // jshint ignore:line
} catch (err) {
@ -57,17 +57,17 @@ OutputWaiter.prototype.set = function(data_str, type, duration) {
}
}
} else {
output_text.style.display = "block";
output_html.style.display = "none";
output_highlighter.display = "block";
input_highlighter.display = "block";
output_text.style.display = 'block';
output_html.style.display = 'none';
output_highlighter.display = 'block';
input_highlighter.display = 'block';
output_text.value = Utils.printable(data_str, true);
output_html.innerHTML = "";
output_html.innerHTML = '';
}
this.manager.highlighter.remove_highlights();
var lines = data_str.count("\n") + 1;
const lines = data_str.count('\n') + 1;
this.set_output_info(data_str.length, lines, duration);
};
@ -80,18 +80,18 @@ OutputWaiter.prototype.set = function(data_str, type, duration) {
* @param {number} duration - The length of time (ms) it took to generate the output
*/
OutputWaiter.prototype.set_output_info = function (length, lines, duration) {
var width = length.toString().length;
let width = length.toString().length;
width = width < 4 ? 4 : width;
var length_str = Utils.pad(length.toString(), width, " ").replace(/ /g, "&nbsp;");
var lines_str = Utils.pad(lines.toString(), width, " ").replace(/ /g, "&nbsp;");
var time_str = Utils.pad(duration.toString() + "ms", width, " ").replace(/ /g, "&nbsp;");
const length_str = Utils.pad(length.toString(), width, ' ').replace(/ /g, '&nbsp;');
const lines_str = Utils.pad(lines.toString(), width, ' ').replace(/ /g, '&nbsp;');
const time_str = Utils.pad(`${duration.toString()}ms`, width, ' ').replace(/ /g, '&nbsp;');
document.getElementById("output-info").innerHTML = "time: " + time_str +
"<br>length: " + length_str +
"<br>lines: " + lines_str;
document.getElementById("input-selection-info").innerHTML = "";
document.getElementById("output-selection-info").innerHTML = "";
document.getElementById('output-info').innerHTML = `time: ${time_str
}<br>length: ${length_str
}<br>lines: ${lines_str}`;
document.getElementById('input-selection-info').innerHTML = '';
document.getElementById('output-selection-info').innerHTML = '';
};
@ -100,16 +100,16 @@ OutputWaiter.prototype.set_output_info = function(length, lines, duration) {
* Saves the current output to a file, downloaded as a URL octet stream.
*/
OutputWaiter.prototype.save_click = function () {
var data = Utils.to_base64(this.app.dish_str),
filename = window.prompt("Please enter a filename:", "download.dat");
let data = Utils.to_base64(this.app.dish_str),
filename = window.prompt('Please enter a filename:', 'download.dat');
if (filename) {
var el = document.createElement("a");
el.setAttribute("href", "data:application/octet-stream;base64;charset=utf-8," + data);
el.setAttribute("download", filename);
const el = document.createElement('a');
el.setAttribute('href', `data:application/octet-stream;base64;charset=utf-8,${data}`);
el.setAttribute('download', filename);
// Firefox requires that the element be added to the DOM before it can be clicked
el.style.display = "none";
el.style.display = 'none';
document.body.appendChild(el);
el.click();
@ -124,7 +124,7 @@ OutputWaiter.prototype.save_click = function() {
*/
OutputWaiter.prototype.switch_click = function () {
this.switch_orig_data = this.manager.input.get();
document.getElementById("undo-switch").disabled = false;
document.getElementById('undo-switch').disabled = false;
this.app.set_input(this.app.dish_str);
};
@ -135,5 +135,5 @@ OutputWaiter.prototype.switch_click = function() {
*/
OutputWaiter.prototype.undo_switch_click = function () {
this.app.set_input(this.switch_orig_data);
document.getElementById("undo-switch").disabled = true;
document.getElementById('undo-switch').disabled = true;
};

View file

@ -11,7 +11,7 @@
* @param {HTMLApp} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager.
*/
var RecipeWaiter = function(app, manager) {
const RecipeWaiter = function (app, manager) {
this.app = app;
this.manager = manager;
this.remove_intent = false;
@ -22,41 +22,41 @@ var RecipeWaiter = function(app, manager) {
* Sets up the drag and drop capability for operations in the operations and recipe areas.
*/
RecipeWaiter.prototype.initialise_operation_drag_n_drop = function () {
var rec_list = document.getElementById("rec_list"),
op_lists = document.querySelectorAll(".category .op_list");
let rec_list = document.getElementById('rec_list'),
op_lists = document.querySelectorAll('.category .op_list');
// Recipe list
Sortable.create(rec_list, {
group: "recipe",
group: 'recipe',
sort: true,
animation: 0,
delay: 0,
filter: ".arg-input,.arg", // Relies on commenting out a line in Sortable.js which calls evt.preventDefault()
setData: function(dataTransfer, drag_el) {
dataTransfer.setData("Text", drag_el.querySelector(".arg-title").textContent);
filter: '.arg-input,.arg', // Relies on commenting out a line in Sortable.js which calls evt.preventDefault()
setData(dataTransfer, drag_el) {
dataTransfer.setData('Text', drag_el.querySelector('.arg-title').textContent);
},
onEnd: function (evt) {
if (this.remove_intent) {
evt.item.remove();
evt.target.dispatchEvent(this.manager.operationremove);
}
}.bind(this)
}.bind(this),
});
Sortable.utils.on(rec_list, "dragover", function() {
Sortable.utils.on(rec_list, 'dragover', () => {
this.remove_intent = false;
}.bind(this));
});
Sortable.utils.on(rec_list, "dragleave", function() {
Sortable.utils.on(rec_list, 'dragleave', () => {
this.remove_intent = true;
this.app.progress = 0;
}.bind(this));
});
// Favourites category
document.querySelector("#categories a").addEventListener("dragover", this.fav_dragover.bind(this));
document.querySelector("#categories a").addEventListener("dragleave", this.fav_dragleave.bind(this));
document.querySelector("#categories a").addEventListener("drop", this.fav_drop.bind(this));
document.querySelector('#categories a').addEventListener('dragover', this.fav_dragover.bind(this));
document.querySelector('#categories a').addEventListener('dragleave', this.fav_dragleave.bind(this));
document.querySelector('#categories a').addEventListener('drop', this.fav_drop.bind(this));
};
@ -68,19 +68,19 @@ RecipeWaiter.prototype.initialise_operation_drag_n_drop = function() {
RecipeWaiter.prototype.create_sortable_seed_list = function (list_el) {
Sortable.create(list_el, {
group: {
name: "recipe",
pull: "clone",
put: false
name: 'recipe',
pull: 'clone',
put: false,
},
sort: false,
setData: function(dataTransfer, drag_el) {
dataTransfer.setData("Text", drag_el.textContent);
setData(dataTransfer, drag_el) {
dataTransfer.setData('Text', drag_el.textContent);
},
onStart: function(evt) {
$(evt.item).popover("destroy");
evt.item.setAttribute("data-toggle", "popover-disabled");
onStart(evt) {
$(evt.item).popover('destroy');
evt.item.setAttribute('data-toggle', 'popover-disabled');
},
onEnd: this.op_sort_end.bind(this)
onEnd: this.op_sort_end.bind(this),
});
};
@ -95,7 +95,7 @@ RecipeWaiter.prototype.create_sortable_seed_list = function(list_el) {
*/
RecipeWaiter.prototype.op_sort_end = function (evt) {
if (this.remove_intent) {
if (evt.item.parentNode.id == "rec_list") {
if (evt.item.parentNode.id == 'rec_list') {
evt.item.remove();
}
return;
@ -104,9 +104,9 @@ RecipeWaiter.prototype.op_sort_end = function(evt) {
// Reinitialise the popover on the original element in the ops list because for some reason it
// gets destroyed and recreated.
$(evt.clone).popover();
$(evt.clone).children("[data-toggle=popover]").popover();
$(evt.clone).children('[data-toggle=popover]').popover();
if (evt.item.parentNode.id !== "rec_list") {
if (evt.item.parentNode.id !== 'rec_list') {
return;
}
@ -123,20 +123,21 @@ RecipeWaiter.prototype.op_sort_end = function(evt) {
* @param {event} e
*/
RecipeWaiter.prototype.fav_dragover = function (e) {
if (e.dataTransfer.effectAllowed !== "move")
if (e.dataTransfer.effectAllowed !== 'move') {
return false;
}
e.stopPropagation();
e.preventDefault();
if (e.target.className && e.target.className.indexOf("category-title") > -1) {
if (e.target.className && e.target.className.indexOf('category-title') > -1) {
// Hovering over the a
e.target.classList.add("favourites-hover");
} else if (e.target.parentNode.className && e.target.parentNode.className.indexOf("category-title") > -1) {
e.target.classList.add('favourites-hover');
} else if (e.target.parentNode.className && e.target.parentNode.className.indexOf('category-title') > -1) {
// Hovering over the Edit button
e.target.parentNode.classList.add("favourites-hover");
} else if (e.target.parentNode.parentNode.className && e.target.parentNode.parentNode.className.indexOf("category-title") > -1) {
e.target.parentNode.classList.add('favourites-hover');
} else if (e.target.parentNode.parentNode.className && e.target.parentNode.parentNode.className.indexOf('category-title') > -1) {
// Hovering over the image on the Edit button
e.target.parentNode.parentNode.classList.add("favourites-hover");
e.target.parentNode.parentNode.classList.add('favourites-hover');
}
};
@ -150,7 +151,7 @@ RecipeWaiter.prototype.fav_dragover = function(e) {
RecipeWaiter.prototype.fav_dragleave = function (e) {
e.stopPropagation();
e.preventDefault();
document.querySelector("#categories a").classList.remove("favourites-hover");
document.querySelector('#categories a').classList.remove('favourites-hover');
};
@ -163,9 +164,9 @@ RecipeWaiter.prototype.fav_dragleave = function(e) {
RecipeWaiter.prototype.fav_drop = function (e) {
e.stopPropagation();
e.preventDefault();
e.target.classList.remove("favourites-hover");
e.target.classList.remove('favourites-hover');
var op_name = e.dataTransfer.getData("Text");
const op_name = e.dataTransfer.getData('Text');
this.app.add_favourite(op_name);
};
@ -188,16 +189,16 @@ RecipeWaiter.prototype.ing_change = function() {
* @param {event} e
*/
RecipeWaiter.prototype.disable_click = function (e) {
var icon = e.target;
const icon = e.target;
if (icon.getAttribute("disabled") == "false") {
icon.setAttribute("disabled", "true");
icon.classList.add("disable-icon-selected");
icon.parentNode.parentNode.classList.add("disabled");
if (icon.getAttribute('disabled') == 'false') {
icon.setAttribute('disabled', 'true');
icon.classList.add('disable-icon-selected');
icon.parentNode.parentNode.classList.add('disabled');
} else {
icon.setAttribute("disabled", "false");
icon.classList.remove("disable-icon-selected");
icon.parentNode.parentNode.classList.remove("disabled");
icon.setAttribute('disabled', 'false');
icon.classList.remove('disable-icon-selected');
icon.parentNode.parentNode.classList.remove('disabled');
}
this.app.progress = 0;
@ -213,14 +214,14 @@ RecipeWaiter.prototype.disable_click = function(e) {
* @param {event} e
*/
RecipeWaiter.prototype.breakpoint_click = function (e) {
var bp = e.target;
const bp = e.target;
if (bp.getAttribute("break") == "false") {
bp.setAttribute("break", "true");
bp.classList.add("breakpoint-selected");
if (bp.getAttribute('break') == 'false') {
bp.setAttribute('break', 'true');
bp.classList.add('breakpoint-selected');
} else {
bp.setAttribute("break", "false");
bp.classList.remove("breakpoint-selected");
bp.setAttribute('break', 'false');
bp.classList.remove('breakpoint-selected');
}
window.dispatchEvent(this.manager.statechange);
@ -259,24 +260,29 @@ RecipeWaiter.prototype.operation_child_dblclick = function(e) {
* @returns {recipe_config}
*/
RecipeWaiter.prototype.get_config = function () {
var config = [], ingredients, ing_list, disabled, bp, item,
operations = document.querySelectorAll("#rec_list li.operation");
let config = [],
ingredients,
ing_list,
disabled,
bp,
item,
operations = document.querySelectorAll('#rec_list li.operation');
for (var i = 0; i < operations.length; i++) {
for (let i = 0; i < operations.length; i++) {
ingredients = [];
disabled = operations[i].querySelector(".disable-icon");
bp = operations[i].querySelector(".breakpoint");
ing_list = operations[i].querySelectorAll(".arg");
disabled = operations[i].querySelector('.disable-icon');
bp = operations[i].querySelector('.breakpoint');
ing_list = operations[i].querySelectorAll('.arg');
for (var j = 0; j < ing_list.length; j++) {
if (ing_list[j].getAttribute("type") == "checkbox") {
for (let j = 0; j < ing_list.length; j++) {
if (ing_list[j].getAttribute('type') == 'checkbox') {
// checkbox
ingredients[j] = ing_list[j].checked;
} else if (ing_list[j].classList.contains("toggle-string")) {
} else if (ing_list[j].classList.contains('toggle-string')) {
// toggle_string
ingredients[j] = {
option: ing_list[j].previousSibling.children[0].textContent.slice(0, -1),
string: ing_list[j].value
string: ing_list[j].value,
};
} else {
// all others
@ -285,15 +291,15 @@ RecipeWaiter.prototype.get_config = function() {
}
item = {
op: operations[i].querySelector(".arg-title").textContent,
args: ingredients
op: operations[i].querySelector('.arg-title').textContent,
args: ingredients,
};
if (disabled && disabled.getAttribute("disabled") == "true") {
if (disabled && disabled.getAttribute('disabled') == 'true') {
item.disabled = true;
}
if (bp && bp.getAttribute("break") == "true") {
if (bp && bp.getAttribute('break') == 'true') {
item.breakpoint = true;
}
@ -310,12 +316,12 @@ RecipeWaiter.prototype.get_config = function() {
* @param {number} position
*/
RecipeWaiter.prototype.update_breakpoint_indicator = function (position) {
var operations = document.querySelectorAll("#rec_list li.operation");
for (var i = 0; i < operations.length; i++) {
const operations = document.querySelectorAll('#rec_list li.operation');
for (let i = 0; i < operations.length; i++) {
if (i == position) {
operations[i].classList.add("break");
operations[i].classList.add('break');
} else {
operations[i].classList.remove("break");
operations[i].classList.remove('break');
}
}
};
@ -328,19 +334,19 @@ RecipeWaiter.prototype.update_breakpoint_indicator = function(position) {
* @param {element} el - The operation stub element from the operations pane
*/
RecipeWaiter.prototype.build_recipe_operation = function (el) {
var op_name = el.textContent;
var op = new HTMLOperation(op_name, this.app.operations[op_name], this.app, this.manager);
const op_name = el.textContent;
const op = new HTMLOperation(op_name, this.app.operations[op_name], this.app, this.manager);
el.innerHTML = op.to_full_html();
if (this.app.operations[op_name].flow_control) {
el.classList.add("flow-control-op");
el.classList.add('flow-control-op');
}
// Disable auto-bake if this is a manual op - this should be moved to the 'operationadd'
// handler after event restructuring
if (op.manual_bake && this.app.auto_bake_) {
this.manager.controls.set_auto_bake(false);
this.app.alert("Auto-Bake is disabled by default when using this operation.", "info", 5000);
this.app.alert('Auto-Bake is disabled by default when using this operation.', 'info', 5000);
}
};
@ -352,11 +358,11 @@ RecipeWaiter.prototype.build_recipe_operation = function(el) {
* @returns {element}
*/
RecipeWaiter.prototype.add_operation = function (name) {
var item = document.createElement("li");
item.classList.add("operation");
const item = document.createElement('li');
item.classList.add('operation');
item.innerHTML = name;
this.build_recipe_operation(item);
document.getElementById("rec_list").appendChild(item);
document.getElementById('rec_list').appendChild(item);
item.dispatchEvent(this.manager.operationadd);
return item;
@ -369,7 +375,7 @@ RecipeWaiter.prototype.add_operation = function(name) {
* @fires Manager#operationremove
*/
RecipeWaiter.prototype.clear_recipe = function () {
var rec_list = document.getElementById("rec_list");
const rec_list = document.getElementById('rec_list');
while (rec_list.firstChild) {
rec_list.removeChild(rec_list.firstChild);
}
@ -384,10 +390,10 @@ RecipeWaiter.prototype.clear_recipe = function() {
* @param {event} e
*/
RecipeWaiter.prototype.dropdown_toggle_click = function (e) {
var el = e.target,
let el = e.target,
button = el.parentNode.parentNode.previousSibling;
button.innerHTML = el.textContent + " <span class='caret'></span>";
button.innerHTML = `${el.textContent} <span class='caret'></span>`;
this.ing_change();
};

View file

@ -9,7 +9,7 @@
* @param {HTMLApp} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager.
*/
var SeasonalWaiter = function(app, manager) {
const SeasonalWaiter = function (app, manager) {
this.app = app;
this.manager = manager;
};
@ -19,15 +19,15 @@ var SeasonalWaiter = function(app, manager) {
* Loads all relevant items depending on the current date.
*/
SeasonalWaiter.prototype.load = function () {
var now = new Date();
const now = new Date();
// Snowfall
if (now.getMonth() == 11 && now.getDate() > 12) { // Dec 13 -> Dec 31
this.app.options.snow = false;
this.create_snow_option();
this.manager.add_dynamic_listener(".option-item input:checkbox[option='snow']", "switchChange.bootstrapSwitch", this.let_it_snow, this);
this.manager.add_window_listener("resize", this.let_it_snow, this);
this.manager.add_listeners(".btn", "click", this.shake_off_snow, this);
this.manager.add_dynamic_listener(".option-item input:checkbox[option='snow']", 'switchChange.bootstrapSwitch', this.let_it_snow, this);
this.manager.add_window_listener('resize', this.let_it_snow, this);
this.manager.add_listeners('.btn', 'click', this.shake_off_snow, this);
if (now.getDate() == 25) this.let_it_snow();
}
@ -39,7 +39,7 @@ SeasonalWaiter.prototype.load = function() {
// Konami code
this.kkeys = [];
window.addEventListener("keydown", this.konami_code_listener.bind(this));
window.addEventListener('keydown', this.konami_code_listener.bind(this));
};
@ -48,18 +48,18 @@ SeasonalWaiter.prototype.load = function() {
* #spiderchef
*/
SeasonalWaiter.prototype.insert_spider_icons = 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=";
let 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);
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);
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);
document.querySelector('.about-img-left').setAttribute('src', `data:image/png;base64,${spider64}`);
};
@ -69,26 +69,26 @@ SeasonalWaiter.prototype.insert_spider_icons = function() {
*/
SeasonalWaiter.prototype.insert_spider_text = function () {
// Title
document.title = document.title.replace(/Cyber/g, "Spider");
document.title = document.title.replace(/Cyber/g, 'Spider');
// Body
SeasonalWaiter.tree_walk(document.body, function(node) {
SeasonalWaiter.tree_walk(document.body, (node) => {
// process only text nodes
if (node.nodeType == 3) {
node.nodeValue = node.nodeValue.replace(/Cyber/g, "Spider");
node.nodeValue = node.nodeValue.replace(/Cyber/g, 'Spider');
}
}, true);
// Bake button
SeasonalWaiter.tree_walk(document.getElementById("bake-group"), function(node) {
SeasonalWaiter.tree_walk(document.getElementById('bake-group'), (node) => {
// process only text nodes
if (node.nodeType == 3) {
node.nodeValue = node.nodeValue.replace(/Bake/g, "Spin");
node.nodeValue = node.nodeValue.replace(/Bake/g, 'Spin');
}
}, true);
// Recipe title
document.querySelector("#recipe .title").innerHTML = "Web";
document.querySelector('#recipe .title').innerHTML = 'Web';
};
@ -97,10 +97,10 @@ SeasonalWaiter.prototype.insert_spider_text = function() {
* #letitsnow
*/
SeasonalWaiter.prototype.create_snow_option = function () {
var options_body = document.getElementById("options-body"),
option_item = document.createElement("div");
let options_body = document.getElementById('options-body'),
option_item = document.createElement('div');
option_item.className = "option-item";
option_item.className = 'option-item';
option_item.innerHTML =
"<input type='checkbox' option='snow' checked />\
Let it snow";
@ -115,10 +115,10 @@ SeasonalWaiter.prototype.create_snow_option = function() {
* #letitsnow
*/
SeasonalWaiter.prototype.let_it_snow = function () {
$(document).snowfall("clear");
$(document).snowfall('clear');
if (!this.app.options.snow) return;
var options = {},
let options = {},
firefox_version = navigator.userAgent.match(/Firefox\/(\d\d?)/);
if (firefox_version && parseInt(firefox_version[1], 10) < 30) {
@ -135,7 +135,7 @@ SeasonalWaiter.prototype.let_it_snow = function() {
shadow: false,
collection: false,
collectionHeight: 20,
deviceorientation : true
deviceorientation: true,
};
} else {
// All other browsers
@ -149,9 +149,9 @@ SeasonalWaiter.prototype.let_it_snow = function() {
maxSpeed: 5,
round: true,
shadow: true,
collection : ".btn",
collection: '.btn',
collectionHeight: 20,
deviceorientation : true
deviceorientation: true,
};
}
@ -163,21 +163,21 @@ SeasonalWaiter.prototype.let_it_snow = function() {
* #letitsnow
*/
SeasonalWaiter.prototype.shake_off_snow = function (e) {
var el = e.target,
let el = e.target,
rect = el.getBoundingClientRect(),
canvases = document.querySelectorAll("canvas.snowfall-canvas"),
canvases = document.querySelectorAll('canvas.snowfall-canvas'),
canvas = null,
remove_func = function () {
ctx.clearRect(0, 0, canvas.width, canvas.height);
$(this).fadeIn();
};
for (var i = 0; i < canvases.length; i++) {
for (let i = 0; i < canvases.length; i++) {
canvas = canvases[i];
if (canvas.style.left == rect.left + "px" && canvas.style.top == (rect.top - 20) + "px") {
var ctx = canvas.getContext("2d");
if (canvas.style.left == `${rect.left}px` && canvas.style.top == `${rect.top - 20}px`) {
var ctx = canvas.getContext('2d');
$(canvas).fadeOut("slow", remove_func);
$(canvas).fadeOut('slow', remove_func);
break;
}
}
@ -191,14 +191,14 @@ SeasonalWaiter.prototype.shake_off_snow = function(e) {
*/
SeasonalWaiter.prototype.konami_code_listener = function (e) {
this.kkeys.push(e.keyCode);
var konami = [38,38,40,40,37,39,37,39,66,65];
for (var i = 0; i < this.kkeys.length; i++) {
const konami = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65];
for (let i = 0; i < this.kkeys.length; i++) {
if (this.kkeys[i] != konami[i]) {
this.kkeys = [];
break;
}
if (i == konami.length - 1) {
$("body").children().toggleClass("konami");
$('body').children().toggleClass('konami');
this.kkeys = [];
}
}
@ -215,13 +215,13 @@ SeasonalWaiter.prototype.konami_code_listener = function(e) {
*/
SeasonalWaiter.tree_walk = (function () {
// Create closure for constants
var skipTags = {
"SCRIPT": true, "IFRAME": true, "OBJECT": true,
"EMBED": true, "STYLE": true, "LINK": true, "META": true
const skipTags = {
SCRIPT: true, IFRAME: true, OBJECT: true,
EMBED: true, STYLE: true, LINK: true, META: true,
};
return function (parent, fn, all_nodes) {
var node = parent.firstChild;
let node = parent.firstChild;
while (node && node != parent) {
if (all_nodes || node.nodeType === 1) {
@ -251,4 +251,4 @@ SeasonalWaiter.tree_walk = (function() {
}
}
};
})();
}());

View file

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

View file

@ -9,21 +9,21 @@
/**
* Main function used to build the CyberChef web app.
*/
var main = function() {
var default_favourites = [
"To Base64",
"From Base64",
"To Hex",
"From Hex",
"To Hexdump",
"From Hexdump",
"URL Decode",
"Regular expression",
"Entropy",
"Fork"
const main = function () {
const default_favourites = [
'To Base64',
'From Base64',
'To Hex',
'From Hex',
'To Hexdump',
'From Hexdump',
'URL Decode',
'Regular expression',
'Entropy',
'Fork',
];
var default_options = {
const default_options = {
update_url: true,
show_highlighter: true,
treat_as_utf8: true,
@ -35,15 +35,15 @@ var main = function() {
snow: false,
};
document.removeEventListener("DOMContentLoaded", main, false);
document.removeEventListener('DOMContentLoaded', main, false);
window.app = new HTMLApp(Categories, OperationConfig, default_favourites, default_options);
window.app.setup();
};
// Fix issues with browsers that don't support console.log()
window.console = console || {log: function() {}, error: function() {}};
window.console = console || { log() {}, error() {} };
window.compile_time = moment.tz("<%= grunt.template.today() %>", "ddd MMM D YYYY HH:mm:ss", "UTC").valueOf();
window.compile_message = "<%= compile_msg %>";
window.compile_time = moment.tz('<%= grunt.template.today() %>', 'ddd MMM D YYYY HH:mm:ss', 'UTC').valueOf();
window.compile_message = '<%= compile_msg %>';
document.addEventListener("DOMContentLoaded", main, false);
document.addEventListener('DOMContentLoaded', main, false);

View file

@ -76,7 +76,7 @@ export default {
[
'env', {
modules: false,
targets: { chrome: 55, firefox: 50}
targets: { chrome: 55, firefox: 50 },
},
],
],
@ -105,7 +105,7 @@ export default {
test: /\.svg(\?[^/]*)?$/,
loader: fontLoader,
},
].concat(cssConfig.loaders)
].concat(cssConfig.loaders),
},
plugins: [
cssConfig.plugin,
@ -113,6 +113,6 @@ export default {
template: './src/html/index.html',
filename: 'index.html',
compileTime: new Date().toISOString(),
})
]
}
}),
],
};