mirror of
https://github.com/gchq/CyberChef.git
synced 2025-04-20 14:56:19 -04:00
eslint autofix
This commit is contained in:
parent
0d42541860
commit
ad730d806b
60 changed files with 13067 additions and 13014 deletions
455
Gruntfile.js
455
Gruntfile.js
|
@ -1,152 +1,152 @@
|
|||
module.exports = function(grunt) {
|
||||
grunt.file.defaultEncoding = "utf8";
|
||||
module.exports = function (grunt) {
|
||||
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'],
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
};
|
||||
|
|
|
@ -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
|
@ -7,7 +7,7 @@
|
|||
*
|
||||
* @class
|
||||
*/
|
||||
var Chef = function() {
|
||||
const Chef = function () {
|
||||
this.dish = new Dish();
|
||||
};
|
||||
|
||||
|
@ -30,14 +30,14 @@ var Chef = function() {
|
|||
* @returns {number} response.duration - The number of ms it took to execute the recipe
|
||||
* @returns {number} response.error - The error object thrown by a failed operation (false if no error)
|
||||
*/
|
||||
Chef.prototype.bake = function(input_text, recipe_config, options, progress, step) {
|
||||
var start_time = new Date().getTime(),
|
||||
Chef.prototype.bake = function (input_text, recipe_config, options, progress, step) {
|
||||
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,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
@ -106,14 +106,14 @@ Chef.prototype.bake = function(input_text, recipe_config, options, progress, ste
|
|||
* @param {Object[]} recipe_config - The recipe configuration object
|
||||
* @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(),
|
||||
Chef.prototype.silent_bake = function (recipe_config) {
|
||||
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);
|
||||
} catch(err) {
|
||||
} catch (err) {
|
||||
// Suppress all errors
|
||||
}
|
||||
return new Date().getTime() - start_time;
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -48,22 +48,22 @@ Dish.HTML = 3;
|
|||
* @param {string} type_str - The name of the data type.
|
||||
* @returns {number} The data type enum value.
|
||||
*/
|
||||
Dish.type_enum = function(type_str) {
|
||||
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.';
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -75,18 +75,18 @@ Dish.type_enum = function(type_str) {
|
|||
* @param {string} type_enum - The enum value of the data type.
|
||||
* @returns {number} The data type as a string.
|
||||
*/
|
||||
Dish.enum_lookup = function(type_enum) {
|
||||
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.';
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -97,13 +97,13 @@ Dish.enum_lookup = function(type_enum) {
|
|||
* @param {byte_array|string|number} value - The value of the input data.
|
||||
* @param {number} type - The data type of value, see Dish enums.
|
||||
*/
|
||||
Dish.prototype.set = function(value, type) {
|
||||
Dish.prototype.set = function (value, type) {
|
||||
this.value = value;
|
||||
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}`;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -114,7 +114,7 @@ Dish.prototype.set = function(value, type) {
|
|||
* @param {number} type - The data type of value, see Dish enums.
|
||||
* @returns {byte_array|string|number} The value of the output data.
|
||||
*/
|
||||
Dish.prototype.get = function(type) {
|
||||
Dish.prototype.get = function (type) {
|
||||
if (this.type != type) {
|
||||
this.translate(type);
|
||||
}
|
||||
|
@ -127,7 +127,7 @@ Dish.prototype.get = function(type) {
|
|||
*
|
||||
* @param {number} to_type - The data type of value, see Dish enums.
|
||||
*/
|
||||
Dish.prototype.translate = function(to_type) {
|
||||
Dish.prototype.translate = function (to_type) {
|
||||
// Convert data to intermediate byte_array type
|
||||
switch (this.type) {
|
||||
case Dish.STRING:
|
||||
|
@ -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:
|
||||
|
@ -169,7 +169,7 @@ Dish.prototype.translate = function(to_type) {
|
|||
*
|
||||
* @returns {boolean} Whether the data is valid or not.
|
||||
*/
|
||||
Dish.prototype.valid = function() {
|
||||
Dish.prototype.valid = function () {
|
||||
switch (this.type) {
|
||||
case Dish.BYTE_ARRAY:
|
||||
if (!(this.value instanceof Array)) {
|
||||
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
},
|
||||
|
|
|
@ -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) {
|
||||
|
@ -25,7 +25,7 @@ var Ingredient = function(ingredient_config) {
|
|||
* @private
|
||||
* @param {Object} ingredient_config
|
||||
*/
|
||||
Ingredient.prototype._parse_config = function(ingredient_config) {
|
||||
Ingredient.prototype._parse_config = function (ingredient_config) {
|
||||
this.name = ingredient_config.name;
|
||||
this.type = ingredient_config.type;
|
||||
};
|
||||
|
@ -36,7 +36,7 @@ Ingredient.prototype._parse_config = function(ingredient_config) {
|
|||
*
|
||||
* @returns {*}
|
||||
*/
|
||||
Ingredient.prototype.get_config = function() {
|
||||
Ingredient.prototype.get_config = function () {
|
||||
return this.value;
|
||||
};
|
||||
|
||||
|
@ -46,7 +46,7 @@ Ingredient.prototype.get_config = function() {
|
|||
*
|
||||
* @param {*} value
|
||||
*/
|
||||
Ingredient.prototype.set_value = function(value) {
|
||||
Ingredient.prototype.set_value = function (value) {
|
||||
this.value = Ingredient.prepare(value, this.type);
|
||||
};
|
||||
|
||||
|
@ -59,25 +59,25 @@ Ingredient.prototype.set_value = function(value) {
|
|||
* @param {*} data
|
||||
* @param {string} type - The name of the data type.
|
||||
*/
|
||||
Ingredient.prepare = function(data, type) {
|
||||
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:
|
||||
|
|
|
@ -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;
|
||||
|
@ -33,7 +33,7 @@ var Operation = function(operation_name, operation_config) {
|
|||
* @private
|
||||
* @param {Object} operation_config
|
||||
*/
|
||||
Operation.prototype._parse_config = function(operation_config) {
|
||||
Operation.prototype._parse_config = function (operation_config) {
|
||||
this.description = operation_config.description;
|
||||
this.input_type = Dish.type_enum(operation_config.input_type);
|
||||
this.output_type = Dish.type_enum(operation_config.output_type);
|
||||
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
@ -55,16 +55,16 @@ Operation.prototype._parse_config = function(operation_config) {
|
|||
*
|
||||
* @returns {Object}
|
||||
*/
|
||||
Operation.prototype.get_config = function() {
|
||||
var ingredient_config = [];
|
||||
Operation.prototype.get_config = function () {
|
||||
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;
|
||||
|
@ -76,7 +76,7 @@ Operation.prototype.get_config = function() {
|
|||
*
|
||||
* @param {Ingredient} ingredient
|
||||
*/
|
||||
Operation.prototype.add_ingredient = function(ingredient) {
|
||||
Operation.prototype.add_ingredient = function (ingredient) {
|
||||
this.ing_list.push(ingredient);
|
||||
};
|
||||
|
||||
|
@ -86,8 +86,8 @@ 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++) {
|
||||
Operation.prototype.set_ing_values = function (ing_values) {
|
||||
for (let i = 0; i < ing_values.length; i++) {
|
||||
this.ing_list[i].set_value(ing_values[i]);
|
||||
}
|
||||
};
|
||||
|
@ -98,9 +98,9 @@ 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++) {
|
||||
Operation.prototype.get_ing_values = function () {
|
||||
const ing_values = [];
|
||||
for (let i = 0; i < this.ing_list.length; i++) {
|
||||
ing_values.push(this.ing_list[i].value);
|
||||
}
|
||||
return ing_values;
|
||||
|
@ -112,7 +112,7 @@ Operation.prototype.get_ing_values = function() {
|
|||
*
|
||||
* @param {boolean} value
|
||||
*/
|
||||
Operation.prototype.set_breakpoint = function(value) {
|
||||
Operation.prototype.set_breakpoint = function (value) {
|
||||
this.breakpoint = !!value;
|
||||
};
|
||||
|
||||
|
@ -122,7 +122,7 @@ Operation.prototype.set_breakpoint = function(value) {
|
|||
*
|
||||
* @returns {boolean}
|
||||
*/
|
||||
Operation.prototype.is_breakpoint = function() {
|
||||
Operation.prototype.is_breakpoint = function () {
|
||||
return this.breakpoint;
|
||||
};
|
||||
|
||||
|
@ -132,7 +132,7 @@ Operation.prototype.is_breakpoint = function() {
|
|||
*
|
||||
* @param {boolean} value
|
||||
*/
|
||||
Operation.prototype.set_disabled = function(value) {
|
||||
Operation.prototype.set_disabled = function (value) {
|
||||
this.disabled = !!value;
|
||||
};
|
||||
|
||||
|
@ -142,7 +142,7 @@ Operation.prototype.set_disabled = function(value) {
|
|||
*
|
||||
* @returns {boolean}
|
||||
*/
|
||||
Operation.prototype.is_disabled = function() {
|
||||
Operation.prototype.is_disabled = function () {
|
||||
return this.disabled;
|
||||
};
|
||||
|
||||
|
@ -152,6 +152,6 @@ Operation.prototype.is_disabled = function() {
|
|||
*
|
||||
* @returns {boolean}
|
||||
*/
|
||||
Operation.prototype.is_flow_control = function() {
|
||||
Operation.prototype.is_flow_control = function () {
|
||||
return this.flow_control;
|
||||
};
|
||||
|
|
|
@ -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) {
|
||||
|
@ -23,11 +23,11 @@ var Recipe = function(recipe_config) {
|
|||
* @private
|
||||
* @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);
|
||||
Recipe.prototype._parse_config = function (recipe_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);
|
||||
|
@ -41,10 +41,10 @@ Recipe.prototype._parse_config = function(recipe_config) {
|
|||
*
|
||||
* @returns {*}
|
||||
*/
|
||||
Recipe.prototype.get_config = function() {
|
||||
var recipe_config = [];
|
||||
Recipe.prototype.get_config = function () {
|
||||
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());
|
||||
}
|
||||
|
||||
|
@ -57,7 +57,7 @@ Recipe.prototype.get_config = function() {
|
|||
*
|
||||
* @param {Operation} operation
|
||||
*/
|
||||
Recipe.prototype.add_operation = function(operation) {
|
||||
Recipe.prototype.add_operation = function (operation) {
|
||||
this.op_list.push(operation);
|
||||
};
|
||||
|
||||
|
@ -67,7 +67,7 @@ Recipe.prototype.add_operation = function(operation) {
|
|||
*
|
||||
* @param {Operation[]} operations
|
||||
*/
|
||||
Recipe.prototype.add_operations = function(operations) {
|
||||
Recipe.prototype.add_operations = function (operations) {
|
||||
this.op_list = this.op_list.concat(operations);
|
||||
};
|
||||
|
||||
|
@ -78,7 +78,7 @@ Recipe.prototype.add_operations = function(operations) {
|
|||
* @param {number} position - The index of the Operation
|
||||
* @param {boolean} value
|
||||
*/
|
||||
Recipe.prototype.set_breakpoint = function(position, value) {
|
||||
Recipe.prototype.set_breakpoint = function (position, value) {
|
||||
try {
|
||||
this.op_list[position].set_breakpoint(value);
|
||||
} catch (err) {
|
||||
|
@ -93,8 +93,8 @@ 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++) {
|
||||
Recipe.prototype.remove_breaks_up_to = function (pos) {
|
||||
for (let i = 0; i < pos; i++) {
|
||||
this.op_list[i].set_breakpoint(false);
|
||||
}
|
||||
};
|
||||
|
@ -105,8 +105,8 @@ 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++) {
|
||||
Recipe.prototype.contains_flow_control = function () {
|
||||
for (let i = 0; i < this.op_list.length; i++) {
|
||||
if (this.op_list[i].is_flow_control()) return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -120,17 +120,17 @@ Recipe.prototype.contains_flow_control = function() {
|
|||
* @param {number} [start_index=0] - The index to start searching from
|
||||
* @returns (number}
|
||||
*/
|
||||
Recipe.prototype.last_op_index = function(start_index) {
|
||||
var i = start_index + 1 || 0,
|
||||
Recipe.prototype.last_op_index = function (start_index) {
|
||||
let i = start_index + 1 || 0,
|
||||
op;
|
||||
|
||||
for (; i < this.op_list.length; i++) {
|
||||
op = this.op_list[i];
|
||||
if (op.is_disabled()) return i-1;
|
||||
if (op.is_breakpoint()) return i-1;
|
||||
if (op.is_disabled()) return i - 1;
|
||||
if (op.is_breakpoint()) return i - 1;
|
||||
}
|
||||
|
||||
return i-1;
|
||||
return i - 1;
|
||||
};
|
||||
|
||||
|
||||
|
@ -141,11 +141,14 @@ Recipe.prototype.last_op_index = function(start_index) {
|
|||
* @param {number} [start_from=0] - The index of the Operation to start executing from
|
||||
* @returns {number} - The final progress through the recipe
|
||||
*/
|
||||
Recipe.prototype.execute = function(dish, start_from) {
|
||||
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;
|
||||
}
|
||||
|
@ -199,7 +202,7 @@ Recipe.prototype.execute = function(dish, start_from) {
|
|||
*
|
||||
* @returns {string}
|
||||
*/
|
||||
Recipe.prototype.to_string = function() {
|
||||
Recipe.prototype.to_string = function () {
|
||||
return JSON.stringify(this.get_config());
|
||||
};
|
||||
|
||||
|
@ -209,7 +212,7 @@ Recipe.prototype.to_string = function() {
|
|||
*
|
||||
* @param {string} recipe_str
|
||||
*/
|
||||
Recipe.prototype.from_string = function(recipe_str) {
|
||||
var recipe_config = JSON.parse(recipe_str);
|
||||
Recipe.prototype.from_string = function (recipe_str) {
|
||||
const recipe_config = JSON.parse(recipe_str);
|
||||
this._parse_config(recipe_config);
|
||||
};
|
||||
|
|
|
@ -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,17 +86,17 @@ 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;
|
||||
Utils.pad_right(str + chr.slice(0, max - str.length), max, chr) : str;
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* @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]),
|
||||
end = Utils.ord(alph_str[i+2]);
|
||||
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,13 +297,13 @@ 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);
|
||||
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 <script> tag"
|
||||
* Utils.escape_html("A <script> tag");
|
||||
*/
|
||||
escape_html: function(str) {
|
||||
return str.replace(/</g, "<");
|
||||
escape_html(str) {
|
||||
return str.replace(/</g, '<');
|
||||
},
|
||||
|
||||
|
||||
|
@ -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,
|
||||
},
|
||||
|
||||
};
|
||||
|
@ -990,14 +1006,14 @@ var Utils = {
|
|||
* // Places the cursor at the beginning of the element #input-text.
|
||||
* $("#input-text").selectRange(0);
|
||||
*/
|
||||
$.fn.selectRange = function(start, end) {
|
||||
$.fn.selectRange = function (start, end) {
|
||||
if (!end) end = start;
|
||||
return this.each(function() {
|
||||
return this.each(function () {
|
||||
if (this.setSelectionRange) {
|
||||
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);
|
||||
|
@ -1019,9 +1035,10 @@ $.fn.selectRange = function(start, end) {
|
|||
* // returns ["One", "Two", "Three"]
|
||||
* ["One", "Two", "Three", "One"].unique();
|
||||
*/
|
||||
Array.prototype.unique = function() {
|
||||
var u = {}, a = [];
|
||||
for (var i = 0, l = this.length; i < l; i++) {
|
||||
Array.prototype.unique = function () {
|
||||
let u = {},
|
||||
a = [];
|
||||
for (let i = 0, l = this.length; i < l; i++) {
|
||||
if (u.hasOwnProperty(this[i])) {
|
||||
continue;
|
||||
}
|
||||
|
@ -1041,7 +1058,7 @@ Array.prototype.unique = function() {
|
|||
* // returns 7
|
||||
* [4,2,5,3,7].max();
|
||||
*/
|
||||
Array.prototype.max = function() {
|
||||
Array.prototype.max = function () {
|
||||
return Math.max.apply(null, this);
|
||||
};
|
||||
|
||||
|
@ -1055,7 +1072,7 @@ Array.prototype.max = function() {
|
|||
* // returns 2
|
||||
* [4,2,5,3,7].min();
|
||||
*/
|
||||
Array.prototype.min = function() {
|
||||
Array.prototype.min = function () {
|
||||
return Math.min.apply(null, this);
|
||||
};
|
||||
|
||||
|
@ -1069,10 +1086,8 @@ Array.prototype.min = function() {
|
|||
* // returns 21
|
||||
* [4,2,5,3,7].sum();
|
||||
*/
|
||||
Array.prototype.sum = function() {
|
||||
return this.reduce(function (a, b) {
|
||||
return a + b;
|
||||
}, 0);
|
||||
Array.prototype.sum = function () {
|
||||
return this.reduce((a, b) => a + b, 0);
|
||||
};
|
||||
|
||||
|
||||
|
@ -1089,9 +1104,9 @@ Array.prototype.sum = function() {
|
|||
* // returns false
|
||||
* [1,2,3].equals([3,2,1]);
|
||||
*/
|
||||
Array.prototype.equals = function(other) {
|
||||
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;
|
||||
|
@ -1110,15 +1125,14 @@ Array.prototype.equals = function(other) {
|
|||
* // returns 2
|
||||
* "Hello".count("l");
|
||||
*/
|
||||
String.prototype.count = function(chr) {
|
||||
String.prototype.count = function (chr) {
|
||||
return this.split(chr).length - 1;
|
||||
};
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// //////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Library overrides ///////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// //////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* Override for the CryptoJS Hex encoding parser to remove whitespace before attempting to parse
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
},
|
||||
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
},
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
@ -126,11 +126,11 @@ var ByteRepr = {
|
|||
if (bites.length == 1 && input.length > 17) {
|
||||
bites = [];
|
||||
for (i = 0; i < input.length; i += 2) {
|
||||
bites.push(input.slice(i, i+2));
|
||||
bites.push(input.slice(i, i + 2));
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
},
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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,11 +89,11 @@ 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++) {
|
||||
if(i % 2 === 0) {
|
||||
for (let i = 0; i < input.length; i++) {
|
||||
if (i % 2 === 0) {
|
||||
csum += (input[i] << 8);
|
||||
} else {
|
||||
csum += input[i];
|
||||
|
@ -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;
|
||||
|
|
|
@ -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]]);
|
||||
},
|
||||
|
@ -414,16 +414,16 @@ CryptoJS.kdf.OpenSSL.execute = function (password, keySize, ivSize, salt) {
|
|||
// Generate random salt if no salt specified and not set to false
|
||||
// This line changed from `if (!salt) {` to the following
|
||||
if (salt === undefined || salt === null) {
|
||||
salt = CryptoJS.lib.WordArray.random(64/8);
|
||||
salt = CryptoJS.lib.WordArray.random(64 / 8);
|
||||
}
|
||||
|
||||
// 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 });
|
||||
};
|
||||
|
|
|
@ -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,121 +173,121 @@ 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 "{":
|
||||
switch (code[i]) {
|
||||
case '{':
|
||||
level++;
|
||||
break;
|
||||
case "\n":
|
||||
if (i+1 >= code.length) break;
|
||||
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;
|
||||
code = code.substring(0, i + 1) + indent + code.substring(i + 1);
|
||||
if (level > 0) i += level * 4;
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
// 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)}`;
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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's equators" : 40075016.686,
|
||||
"Astronomical units (au)": 149597870700,
|
||||
"Light-years (ly)" : 9460730472580800,
|
||||
"Parsecs (pc)" : 3.0856776e16
|
||||
'Earth-to-Moons': 380000000,
|
||||
"Earth's equators": 40075016.686,
|
||||
'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,
|
||||
"Earth's oceans (1.4 yottagrams)" : 1.4e24,
|
||||
'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,
|
||||
"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,
|
||||
'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,
|
||||
|
||||
// Scientific
|
||||
"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,
|
||||
'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,
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -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];
|
||||
},
|
||||
|
||||
|
|
|
@ -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;
|
||||
} catch(err) {
|
||||
return "Invalid format.\n\n" + DateTime.FORMAT_EXAMPLES;
|
||||
if (!date || date.format() == 'Invalid date') throw Error;
|
||||
} catch (err) {
|
||||
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;
|
||||
} catch(err) {
|
||||
return "Invalid format.\n\n" + DateTime.FORMAT_EXAMPLES;
|
||||
if (!date || date.format() == 'Invalid date') throw Error;
|
||||
} catch (err) {
|
||||
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;
|
||||
},
|
||||
|
|
|
@ -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,10 +60,10 @@ 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){
|
||||
if (pad_incomplete_words && word.length < word_length) {
|
||||
for (j = word.length; j < word_length; j++) {
|
||||
word.push(0);
|
||||
}
|
||||
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
chunk_entropy = Entropy._calc_entropy(input.slice(i, i+chunk_size));
|
||||
output += "Bytes " + i + " to " + (i+chunk_size) + ": " + chunk_entropy + "\n";
|
||||
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`;
|
||||
}
|
||||
} 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++) {
|
||||
|
|
|
@ -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;
|
||||
},
|
||||
|
|
|
@ -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
|
@ -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`;
|
||||
},
|
||||
|
||||
};
|
||||
|
|
|
@ -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');
|
||||
},
|
||||
|
||||
};
|
||||
|
|
|
@ -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";
|
||||
if (include_final_length && i + buff.length == input.length) {
|
||||
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,50 +107,51 @@ 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,
|
||||
width = 14 + (w*4),
|
||||
let w = args[0] || 16,
|
||||
width = 14 + (w * 4),
|
||||
line = Math.floor(pos[0].start / w),
|
||||
offset = pos[0].start % w,
|
||||
start = 0,
|
||||
end = 0;
|
||||
|
||||
pos[0].start = line*width + 10 + offset*3;
|
||||
pos[0].start = line * width + 10 + offset * 3;
|
||||
|
||||
line = Math.floor(pos[0].end / w);
|
||||
offset = pos[0].end % w;
|
||||
if (offset === 0) { line--; offset = w; }
|
||||
pos[0].end = line*width + 10 + offset*3 - 1;
|
||||
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 });
|
||||
end = (start_line_num + 1) * width - w - 5;
|
||||
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;
|
||||
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 });
|
||||
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, end });
|
||||
}
|
||||
return pos;
|
||||
},
|
||||
|
@ -163,30 +166,30 @@ 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;
|
||||
} else if (offset > 10+(w*3)) { // In ASCII section
|
||||
pos[0].start = (line+1)*w;
|
||||
pos[0].start = line * w;
|
||||
} else if (offset > 10 + (w * 3)) { // In ASCII section
|
||||
pos[0].start = (line + 1) * w;
|
||||
} else { // In byte section
|
||||
pos[0].start = line*w + Math.floor((offset-10)/3);
|
||||
pos[0].start = line * w + Math.floor((offset - 10) / 3);
|
||||
}
|
||||
|
||||
line = Math.floor(pos[0].end / width);
|
||||
offset = pos[0].end % width;
|
||||
|
||||
if (offset < 10) { // In line number section
|
||||
pos[0].end = line*w;
|
||||
} else if (offset > 10+(w*3)) { // In ASCII section
|
||||
pos[0].end = (line+1)*w;
|
||||
pos[0].end = line * w;
|
||||
} else if (offset > 10 + (w * 3)) { // In ASCII section
|
||||
pos[0].end = (line + 1) * w;
|
||||
} else { // In byte section
|
||||
pos[0].end = line*w + Math.ceil((offset-10)/3);
|
||||
pos[0].end = line * w + Math.ceil((offset - 10) / 3);
|
||||
}
|
||||
|
||||
return pos;
|
||||
|
|
|
@ -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,71 +229,71 @@ 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';
|
||||
}
|
||||
}
|
||||
|
||||
return output.slice(0, output.length-1);
|
||||
return output.slice(0, output.length - 1);
|
||||
},
|
||||
|
||||
|
||||
|
@ -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,27 +373,27 @@ 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';
|
||||
}
|
||||
}
|
||||
|
||||
// Sort IPv6 network dictionaries and print
|
||||
for (network_str in ipv6_networks) {
|
||||
//ipv6_networks[network_str] = ipv6_networks[network_str].sort(); TODO
|
||||
// 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);
|
||||
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++) {
|
||||
total[i*16 + 16-(total_diff.length-n)] = total_diff[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,15 +505,15 @@ 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++) {
|
||||
if (cidr > ((i+1)*16)) {
|
||||
for (let i = 0; i < 8; i++) {
|
||||
if (cidr > ((i + 1) * 16)) {
|
||||
mask[i] = 0x0000FFFF;
|
||||
} else {
|
||||
shift = cidr-(i*16);
|
||||
shift = cidr - (i * 16);
|
||||
if (shift < 0) shift = 0;
|
||||
mask[i] = ~((0x0000FFFF >>> shift) | 0xFFFF0000);
|
||||
}
|
||||
|
@ -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++) {
|
||||
total[i*16 + 16-(t.length-n)] = t[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,16 +685,16 @@ 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++;
|
||||
if (i == (8 - num_blocks.slice(j).length)) j++;
|
||||
} else {
|
||||
ipv6[i] = num_blocks[j];
|
||||
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,24 +733,24 @@ 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;
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (ipv6[i] === 0 && e === (i-1)) {
|
||||
if (ipv6[i] === 0 && e === (i - 1)) {
|
||||
e = i;
|
||||
} else if (ipv6[i] === 0) {
|
||||
s = i; e = i;
|
||||
}
|
||||
if (e >= 0 && (e-s) > (end - start)) {
|
||||
if (e >= 0 && (e - s) > (end - start)) {
|
||||
start = s;
|
||||
end = e;
|
||||
}
|
||||
|
@ -757,21 +758,22 @@ 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);
|
||||
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;
|
||||
},
|
||||
|
|
|
@ -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) {
|
||||
} 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;
|
||||
},
|
||||
|
|
|
@ -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
|
||||
);
|
||||
});
|
||||
|
||||
|
|
|
@ -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!";
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
*
|
||||
* @namespace
|
||||
*/
|
||||
var OS = {
|
||||
const OS = {
|
||||
|
||||
/**
|
||||
* Parse UNIX file permissions operation.
|
||||
|
@ -16,33 +16,33 @@ var OS = {
|
|||
* @param {Object[]} args
|
||||
* @returns {string}
|
||||
*/
|
||||
run_parse_unix_perms: function(input, args) {
|
||||
var perms = {
|
||||
d : false, // directory
|
||||
sl : false, // symbolic link
|
||||
np : false, // named pipe
|
||||
s : false, // socket
|
||||
cd : false, // character device
|
||||
bd : false, // block device
|
||||
dr : false, // door
|
||||
sb : false, // sticky bit
|
||||
su : false, // setuid
|
||||
sg : false, // setgid
|
||||
ru : false, // read user
|
||||
wu : false, // write user
|
||||
eu : false, // execute user
|
||||
rg : false, // read group
|
||||
wg : false, // write group
|
||||
eg : false, // execute group
|
||||
ro : false, // read other
|
||||
wo : false, // write other
|
||||
eo : false // execute other
|
||||
run_parse_unix_perms(input, args) {
|
||||
let perms = {
|
||||
d: false, // directory
|
||||
sl: false, // symbolic link
|
||||
np: false, // named pipe
|
||||
s: false, // socket
|
||||
cd: false, // character device
|
||||
bd: false, // block device
|
||||
dr: false, // door
|
||||
sb: false, // sticky bit
|
||||
su: false, // setuid
|
||||
sg: false, // setgid
|
||||
ru: false, // read user
|
||||
wu: false, // write user
|
||||
eu: false, // execute user
|
||||
rg: false, // read group
|
||||
wg: false, // write group
|
||||
eg: false, // execute group
|
||||
ro: false, // read other
|
||||
wo: false, // write 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';
|
||||
},
|
||||
|
||||
};
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,16 +161,16 @@ 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);
|
||||
carry_bits = (old_byte & (Math.pow(2, amount) - 1)) << (8 - amount);
|
||||
result.push(new_byte);
|
||||
}
|
||||
result[0] |= carry_bits;
|
||||
|
@ -187,19 +187,19 @@ 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);
|
||||
carry_bits = (old_byte >> (8 - amount)) & (Math.pow(2, amount) - 1);
|
||||
result[i] = (new_byte);
|
||||
}
|
||||
result[data.length-1] = result[data.length-1] | carry_bits;
|
||||
result[data.length - 1] = result[data.length - 1] | carry_bits;
|
||||
return result;
|
||||
},
|
||||
|
||||
|
|
|
@ -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) {
|
||||
} 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,15 +146,15 @@ 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);
|
||||
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;
|
||||
|
|
|
@ -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,22 +180,22 @@ var StrUtils = {
|
|||
* @constant
|
||||
* @default
|
||||
*/
|
||||
SEARCH_TYPE: ["Regex", "Extended (\\n, \\t, \\x...)", "Simple string"],
|
||||
SEARCH_TYPE: ['Regex', 'Extended (\\n, \\t, \\x...)', 'Simple string'],
|
||||
/**
|
||||
* @constant
|
||||
* @default
|
||||
*/
|
||||
FIND_REPLACE_GLOBAL : true,
|
||||
FIND_REPLACE_GLOBAL: true,
|
||||
/**
|
||||
* @constant
|
||||
* @default
|
||||
*/
|
||||
FIND_REPLACE_CASE : false,
|
||||
FIND_REPLACE_CASE: false,
|
||||
/**
|
||||
* @constant
|
||||
* @default
|
||||
*/
|
||||
FIND_REPLACE_MULTILINE : true,
|
||||
FIND_REPLACE_MULTILINE: true,
|
||||
|
||||
/**
|
||||
* Find / Replace operation.
|
||||
|
@ -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;
|
||||
},
|
||||
|
|
|
@ -7,38 +7,38 @@
|
|||
*
|
||||
* @namespace
|
||||
*/
|
||||
var Tidy = {
|
||||
const Tidy = {
|
||||
|
||||
/**
|
||||
* @constant
|
||||
* @default
|
||||
*/
|
||||
REMOVE_SPACES : true,
|
||||
REMOVE_SPACES: true,
|
||||
/**
|
||||
* @constant
|
||||
* @default
|
||||
*/
|
||||
REMOVE_CARIAGE_RETURNS : true,
|
||||
REMOVE_CARIAGE_RETURNS: true,
|
||||
/**
|
||||
* @constant
|
||||
* @default
|
||||
*/
|
||||
REMOVE_LINE_FEEDS : true,
|
||||
REMOVE_LINE_FEEDS: true,
|
||||
/**
|
||||
* @constant
|
||||
* @default
|
||||
*/
|
||||
REMOVE_TABS : true,
|
||||
REMOVE_TABS: true,
|
||||
/**
|
||||
* @constant
|
||||
* @default
|
||||
*/
|
||||
REMOVE_FORM_FEEDS : true,
|
||||
REMOVE_FORM_FEEDS: true,
|
||||
/**
|
||||
* @constant
|
||||
* @default
|
||||
*/
|
||||
REMOVE_FULL_STOPS : false,
|
||||
REMOVE_FULL_STOPS: false,
|
||||
|
||||
/**
|
||||
* Remove whitespace operation.
|
||||
|
@ -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;
|
||||
|
@ -86,17 +86,17 @@ var Tidy = {
|
|||
* @constant
|
||||
* @default
|
||||
*/
|
||||
APPLY_TO_EACH_LINE : false,
|
||||
APPLY_TO_EACH_LINE: false,
|
||||
/**
|
||||
* @constant
|
||||
* @default
|
||||
*/
|
||||
DROP_START : 0,
|
||||
DROP_START: 0,
|
||||
/**
|
||||
* @constant
|
||||
* @default
|
||||
*/
|
||||
DROP_LENGTH : 5,
|
||||
DROP_LENGTH: 5,
|
||||
|
||||
/**
|
||||
* Drop bytes operation.
|
||||
|
@ -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)
|
||||
return input.slice(0, start).concat(input.slice(start+length, input.length));
|
||||
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,12 +132,12 @@ 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 = output.concat(lines[i].slice(0, start).concat(lines[i].slice(start + length, lines[i].length)));
|
||||
output.push(0x0a);
|
||||
}
|
||||
return output.slice(0, output.length-1);
|
||||
return output.slice(0, output.length - 1);
|
||||
},
|
||||
|
||||
|
||||
|
@ -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)
|
||||
return input.slice(start, start+length);
|
||||
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,12 +186,12 @@ 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 = output.concat(lines[i].slice(start, start + length));
|
||||
output.push(0x0a);
|
||||
}
|
||||
return output.slice(0, output.length-1);
|
||||
return output.slice(0, output.length - 1);
|
||||
},
|
||||
|
||||
|
||||
|
@ -195,17 +199,17 @@ var Tidy = {
|
|||
* @constant
|
||||
* @default
|
||||
*/
|
||||
PAD_POSITION : ["Start", "End"],
|
||||
PAD_POSITION: ['Start', 'End'],
|
||||
/**
|
||||
* @constant
|
||||
* @default
|
||||
*/
|
||||
PAD_LENGTH : 5,
|
||||
PAD_LENGTH: 5,
|
||||
/**
|
||||
* @constant
|
||||
* @default
|
||||
*/
|
||||
PAD_CHAR : " ",
|
||||
PAD_CHAR: ' ',
|
||||
|
||||
/**
|
||||
* Pad lines operation.
|
||||
|
@ -214,25 +218,25 @@ 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`;
|
||||
}
|
||||
}
|
||||
|
||||
return output.slice(0, output.length-1);
|
||||
return output.slice(0, output.length - 1);
|
||||
},
|
||||
|
||||
};
|
||||
|
|
|
@ -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,11 +38,11 @@ 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) {
|
||||
} catch (err) {
|
||||
return unescape(data);
|
||||
}
|
||||
},
|
||||
|
@ -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) {
|
||||
//TODO Do this programatically
|
||||
_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');
|
||||
},
|
||||
|
||||
};
|
||||
|
|
|
@ -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) {
|
||||
if (typeof(window.crypto) !== 'undefined' && typeof(window.crypto.getRandomValues) !== 'undefined') {
|
||||
var buf = new Uint32Array(4),
|
||||
run_generate_v4(input, args) {
|
||||
if (typeof (window.crypto) !== 'undefined' && typeof (window.crypto.getRandomValues) !== 'undefined') {
|
||||
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);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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\\+',
|
||||
},
|
||||
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
@ -19,40 +19,40 @@ var ControlsWaiter = function(app, manager) {
|
|||
* Adjusts the display properties of the control buttons so that they fit within the current width
|
||||
* 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");
|
||||
ControlsWaiter.prototype.adjust_width = function () {
|
||||
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';
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -62,8 +62,8 @@ 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");
|
||||
ControlsWaiter.prototype.set_auto_bake = function (value) {
|
||||
const auto_bake_checkbox = document.getElementById('auto-bake');
|
||||
|
||||
if (auto_bake_checkbox.checked != value) {
|
||||
auto_bake_checkbox.click();
|
||||
|
@ -74,36 +74,36 @@ ControlsWaiter.prototype.set_auto_bake = function(value) {
|
|||
/**
|
||||
* Handler to trigger baking.
|
||||
*/
|
||||
ControlsWaiter.prototype.bake_click = function() {
|
||||
ControlsWaiter.prototype.bake_click = function () {
|
||||
this.app.bake();
|
||||
$("#output-text").selectRange(0);
|
||||
$('#output-text').selectRange(0);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Handler for the 'Step through' command. Executes the next step of the recipe.
|
||||
*/
|
||||
ControlsWaiter.prototype.step_click = function() {
|
||||
ControlsWaiter.prototype.step_click = function () {
|
||||
this.app.bake(true);
|
||||
$("#output-text").selectRange(0);
|
||||
$('#output-text').selectRange(0);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* 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");
|
||||
ControlsWaiter.prototype.auto_bake_change = function () {
|
||||
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');
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -111,7 +111,7 @@ ControlsWaiter.prototype.auto_bake_change = function() {
|
|||
/**
|
||||
* Handler for the 'Clear recipe' command. Removes all operations from the recipe.
|
||||
*/
|
||||
ControlsWaiter.prototype.clear_recipe_click = function() {
|
||||
ControlsWaiter.prototype.clear_recipe_click = function () {
|
||||
this.manager.recipe.clear_recipe();
|
||||
};
|
||||
|
||||
|
@ -120,12 +120,12 @@ ControlsWaiter.prototype.clear_recipe_click = function() {
|
|||
* Handler for the 'Clear breakpoints' command. Removes all breakpoints from operations in the
|
||||
* recipe.
|
||||
*/
|
||||
ControlsWaiter.prototype.clear_breaks_click = function() {
|
||||
var bps = document.querySelectorAll("#rec_list li.operation .breakpoint");
|
||||
ControlsWaiter.prototype.clear_breaks_click = function () {
|
||||
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');
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -135,18 +135,18 @@ ControlsWaiter.prototype.clear_breaks_click = function() {
|
|||
*
|
||||
* @param {Object[]} [recipe_config] - The recipe configuration object array.
|
||||
*/
|
||||
ControlsWaiter.prototype.initialise_save_link = function(recipe_config) {
|
||||
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);
|
||||
};
|
||||
|
||||
|
||||
|
@ -158,26 +158,26 @@ ControlsWaiter.prototype.initialise_save_link = function(recipe_config) {
|
|||
* @param {Object[]} [recipe_config] - The recipe configuration object array.
|
||||
* @returns {string}
|
||||
*/
|
||||
ControlsWaiter.prototype.generate_state_url = function(include_recipe, include_input, 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;
|
||||
|
@ -187,31 +187,31 @@ ControlsWaiter.prototype.generate_state_url = function(include_recipe, include_i
|
|||
/**
|
||||
* Handler for changes made to the save dialog text area. Re-initialises the save link.
|
||||
*/
|
||||
ControlsWaiter.prototype.save_text_change = function() {
|
||||
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) {}
|
||||
} catch (err) {}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* 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;
|
||||
ControlsWaiter.prototype.save_click = function () {
|
||||
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();
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Handler for the save link recipe checkbox change event.
|
||||
*/
|
||||
ControlsWaiter.prototype.slr_check_change = function() {
|
||||
ControlsWaiter.prototype.slr_check_change = function () {
|
||||
this.initialise_save_link();
|
||||
};
|
||||
|
||||
|
@ -219,7 +219,7 @@ ControlsWaiter.prototype.slr_check_change = function() {
|
|||
/**
|
||||
* Handler for the save link input checkbox change event.
|
||||
*/
|
||||
ControlsWaiter.prototype.sli_check_change = function() {
|
||||
ControlsWaiter.prototype.sli_check_change = function () {
|
||||
this.initialise_save_link();
|
||||
};
|
||||
|
||||
|
@ -227,59 +227,59 @@ ControlsWaiter.prototype.sli_check_change = function() {
|
|||
/**
|
||||
* Handler for the 'Load' command. Pops up the load dialog box.
|
||||
*/
|
||||
ControlsWaiter.prototype.load_click = function() {
|
||||
ControlsWaiter.prototype.load_click = function () {
|
||||
this.populate_load_recipes_list();
|
||||
$("#load-modal").modal();
|
||||
$('#load-modal').modal();
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* 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;
|
||||
ControlsWaiter.prototype.save_button_click = function () {
|
||||
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);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* 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");
|
||||
ControlsWaiter.prototype.populate_load_recipes_list = function () {
|
||||
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,21 +287,19 @@ 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 : '';
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Removes the currently selected recipe from local storage.
|
||||
*/
|
||||
ControlsWaiter.prototype.load_delete_click = function() {
|
||||
var id = document.getElementById("load-name").value,
|
||||
ControlsWaiter.prototype.load_delete_click = function () {
|
||||
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();
|
||||
|
@ -311,30 +309,28 @@ 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,
|
||||
ControlsWaiter.prototype.load_name_change = function (e) {
|
||||
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;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Loads the selected recipe and populates the Recipe with its operations.
|
||||
*/
|
||||
ControlsWaiter.prototype.load_button_click = function() {
|
||||
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();
|
||||
} catch(e) {
|
||||
this.app.alert("Invalid recipe", "danger", 2000);
|
||||
$('#rec_list [data-toggle=popover]').popover();
|
||||
} catch (e) {
|
||||
this.app.alert('Invalid recipe', 'danger', 2000);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
@ -37,7 +37,7 @@ var HTMLApp = function(categories, operations, default_favourites, default_optio
|
|||
*
|
||||
* @fires Manager#appstart
|
||||
*/
|
||||
HTMLApp.prototype.setup = function() {
|
||||
HTMLApp.prototype.setup = function () {
|
||||
document.dispatchEvent(this.manager.appstart);
|
||||
this.initialise_splitter();
|
||||
this.load_local_storage();
|
||||
|
@ -54,10 +54,10 @@ HTMLApp.prototype.setup = function() {
|
|||
*
|
||||
* @param {Error} err
|
||||
*/
|
||||
HTMLApp.prototype.handle_error = function(err) {
|
||||
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);
|
||||
};
|
||||
|
||||
|
||||
|
@ -67,8 +67,8 @@ HTMLApp.prototype.handle_error = function(err) {
|
|||
* @param {boolean} [step] - Set to true if we should only execute one operation instead of the
|
||||
* whole recipe.
|
||||
*/
|
||||
HTMLApp.prototype.bake = function(step) {
|
||||
var response;
|
||||
HTMLApp.prototype.bake = function (step) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -105,7 +105,7 @@ HTMLApp.prototype.bake = function(step) {
|
|||
/**
|
||||
* Runs Auto Bake if it is set.
|
||||
*/
|
||||
HTMLApp.prototype.auto_bake = function() {
|
||||
HTMLApp.prototype.auto_bake = function () {
|
||||
if (this.auto_bake_) {
|
||||
this.bake();
|
||||
}
|
||||
|
@ -121,8 +121,8 @@ 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(),
|
||||
HTMLApp.prototype.silent_bake = function () {
|
||||
let start_time = new Date().getTime(),
|
||||
recipe_config = this.get_recipe_config();
|
||||
|
||||
if (this.auto_bake_) {
|
||||
|
@ -138,12 +138,12 @@ HTMLApp.prototype.silent_bake = function() {
|
|||
*
|
||||
* @returns {string}
|
||||
*/
|
||||
HTMLApp.prototype.get_input = function() {
|
||||
var input = this.manager.input.get();
|
||||
HTMLApp.prototype.get_input = function () {
|
||||
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;
|
||||
};
|
||||
|
@ -154,9 +154,9 @@ 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);
|
||||
HTMLApp.prototype.set_input = function (input) {
|
||||
sessionStorage.setItem('input_length', input.length);
|
||||
sessionStorage.setItem('input', input);
|
||||
this.manager.input.set(input);
|
||||
};
|
||||
|
||||
|
@ -167,19 +167,19 @@ HTMLApp.prototype.set_input = function(input) {
|
|||
*
|
||||
* @fires Manager#oplistcreate
|
||||
*/
|
||||
HTMLApp.prototype.populate_operations_list = function() {
|
||||
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,32 +187,32 @@ 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'));
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Sets up the adjustable splitter to allow the user to resize areas of the page.
|
||||
*/
|
||||
HTMLApp.prototype.initialise_splitter = function() {
|
||||
Split(["#operations", "#recipe", "#IO"], {
|
||||
HTMLApp.prototype.initialise_splitter = function () {
|
||||
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,
|
||||
});
|
||||
|
||||
|
@ -224,9 +224,9 @@ HTMLApp.prototype.initialise_splitter = function() {
|
|||
* Loads the information previously saved to the HTML5 local storage object so that user options
|
||||
* and favourites can be restored.
|
||||
*/
|
||||
HTMLApp.prototype.load_local_storage = 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);
|
||||
}
|
||||
|
@ -242,8 +242,8 @@ HTMLApp.prototype.load_local_storage = function() {
|
|||
* Favourites category with them.
|
||||
* 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 &&
|
||||
HTMLApp.prototype.load_favourites = function () {
|
||||
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,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
@ -273,14 +271,14 @@ HTMLApp.prototype.load_favourites = function() {
|
|||
* @param {string[]} favourites - A list of the user's favourite operations
|
||||
* @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++) {
|
||||
HTMLApp.prototype.valid_favourites = function (favourites) {
|
||||
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;
|
||||
|
@ -292,8 +290,8 @@ 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)));
|
||||
HTMLApp.prototype.save_favourites = function (favourites) {
|
||||
localStorage.setItem('favourites', JSON.stringify(this.valid_favourites(favourites)));
|
||||
};
|
||||
|
||||
|
||||
|
@ -301,7 +299,7 @@ HTMLApp.prototype.save_favourites = function(favourites) {
|
|||
* Resets favourite operations back to the default as specified in the view constructor and
|
||||
* refreshes the operation list.
|
||||
*/
|
||||
HTMLApp.prototype.reset_favourites = function() {
|
||||
HTMLApp.prototype.reset_favourites = function () {
|
||||
this.save_favourites(this.dfavourites);
|
||||
this.load_favourites();
|
||||
this.populate_operations_list();
|
||||
|
@ -314,11 +312,11 @@ 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);
|
||||
HTMLApp.prototype.add_favourite = function (name) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -333,58 +331,58 @@ HTMLApp.prototype.add_favourite = function(name) {
|
|||
/**
|
||||
* Checks for input and recipe in the URI parameters and loads them if present.
|
||||
*/
|
||||
HTMLApp.prototype.load_URI_params = function() {
|
||||
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('=');
|
||||
this.query_string = (function (a) {
|
||||
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) {}
|
||||
} catch (err) {}
|
||||
} else if (this.query_string.op) {
|
||||
// If there's no recipe, look for single operations
|
||||
this.manager.recipe.clear_recipe();
|
||||
try {
|
||||
this.manager.recipe.add_operation(this.query_string.op);
|
||||
} catch(err) {
|
||||
} 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) {}
|
||||
} catch (err) {}
|
||||
}
|
||||
|
||||
// Restore auto-bake state
|
||||
|
@ -398,7 +396,7 @@ HTMLApp.prototype.load_URI_params = function() {
|
|||
*
|
||||
* @returns {number}
|
||||
*/
|
||||
HTMLApp.prototype.next_ing_id = function() {
|
||||
HTMLApp.prototype.next_ing_id = function () {
|
||||
return this.ing_id++;
|
||||
};
|
||||
|
||||
|
@ -408,9 +406,9 @@ 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));
|
||||
HTMLApp.prototype.get_recipe_config = function () {
|
||||
const recipe_config = this.manager.recipe.get_config();
|
||||
sessionStorage.setItem('recipe_config', JSON.stringify(recipe_config));
|
||||
return recipe_config;
|
||||
};
|
||||
|
||||
|
@ -420,24 +418,24 @@ 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;
|
||||
HTMLApp.prototype.set_recipe_config = function (recipe_config) {
|
||||
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;
|
||||
|
@ -460,12 +458,12 @@ 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)";
|
||||
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)';
|
||||
|
||||
this.manager.controls.adjust_width();
|
||||
};
|
||||
|
@ -474,19 +472,19 @@ HTMLApp.prototype.reset_layout = function() {
|
|||
/**
|
||||
* Sets the compile message.
|
||||
*/
|
||||
HTMLApp.prototype.set_compile_message = 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;
|
||||
};
|
||||
|
||||
|
||||
|
@ -513,42 +511,42 @@ HTMLApp.prototype.set_compile_message = function() {
|
|||
* // that will disappear after 5 seconds.
|
||||
* this.alert("Happy Christmas!", "info", 5000);
|
||||
*/
|
||||
HTMLApp.prototype.alert = function(str, style, timeout, silent) {
|
||||
var time = new Date();
|
||||
HTMLApp.prototype.alert = function (str, style, timeout, silent) {
|
||||
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);
|
||||
}
|
||||
};
|
||||
|
@ -567,27 +565,26 @@ HTMLApp.prototype.alert = function(str, style, timeout, silent) {
|
|||
* // Pops up a box asking if the user would like a cookie. Prints the answer to the console.
|
||||
* this.confirm("Question", "Would you like a cookie?", function(answer) {console.log(answer);});
|
||||
*/
|
||||
HTMLApp.prototype.confirm = function(title, body, callback, scope) {
|
||||
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));
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
|
@ -595,8 +592,8 @@ HTMLApp.prototype.confirm = function(title, body, callback, scope) {
|
|||
* Handler for the alert close button click event.
|
||||
* Closes the alert box.
|
||||
*/
|
||||
HTMLApp.prototype.alert_close_click = function() {
|
||||
document.getElementById("alert").style.display = "none";
|
||||
HTMLApp.prototype.alert_close_click = function () {
|
||||
document.getElementById('alert').style.display = 'none';
|
||||
};
|
||||
|
||||
|
||||
|
@ -607,13 +604,13 @@ HTMLApp.prototype.alert_close_click = function() {
|
|||
* @listens Manager#statechange
|
||||
* @param {event} e
|
||||
*/
|
||||
HTMLApp.prototype.state_change = function(e) {
|
||||
HTMLApp.prototype.state_change = function (e) {
|
||||
this.auto_bake();
|
||||
|
||||
// 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);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -624,8 +621,8 @@ 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) {
|
||||
HTMLApp.prototype.pop_state = function (e) {
|
||||
if (window.location.href.split('#')[0] !== this.last_state_url) {
|
||||
this.load_URI_params();
|
||||
}
|
||||
};
|
||||
|
@ -634,34 +631,34 @@ 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";
|
||||
HTMLApp.prototype.call_api = function (url, type, data, data_type, content_type) {
|
||||
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,
|
||||
};
|
||||
};
|
||||
|
|
|
@ -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 = [];
|
||||
|
@ -21,7 +21,7 @@ var HTMLCategory = function(name, selected) {
|
|||
*
|
||||
* @param {HTMLOperation} operation - The operation to add.
|
||||
*/
|
||||
HTMLCategory.prototype.add_operation = function(operation) {
|
||||
HTMLCategory.prototype.add_operation = function (operation) {
|
||||
this.op_list.push(operation);
|
||||
};
|
||||
|
||||
|
@ -31,20 +31,20 @@ 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'>\
|
||||
HTMLCategory.prototype.to_html = function () {
|
||||
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;
|
||||
};
|
||||
|
|
|
@ -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()}`;
|
||||
};
|
||||
|
||||
|
||||
|
@ -31,121 +31,122 @@ 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'> </div>",
|
||||
i, m;
|
||||
HTMLIngredient.prototype.to_html = function () {
|
||||
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'> </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;
|
||||
};
|
||||
|
@ -157,20 +158,20 @@ HTMLIngredient.prototype.to_html = function() {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
HTMLIngredient.prototype.toggle_disable_args = function(e) {
|
||||
var el = e.target,
|
||||
HTMLIngredient.prototype.toggle_disable_args = function (e) {
|
||||
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');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -185,12 +186,12 @@ HTMLIngredient.prototype.toggle_disable_args = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
HTMLIngredient.prototype.populate_option_change = function(e) {
|
||||
var el = e.target,
|
||||
HTMLIngredient.prototype.populate_option_change = function (e) {
|
||||
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();
|
||||
};
|
||||
|
@ -202,8 +203,8 @@ HTMLIngredient.prototype.populate_option_change = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
HTMLIngredient.prototype.editable_option_change = function(e) {
|
||||
var select = e.target,
|
||||
HTMLIngredient.prototype.editable_option_change = function (e) {
|
||||
let select = e.target,
|
||||
input = select.nextSibling;
|
||||
|
||||
input.value = select.childNodes[select.selectedIndex].value;
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
||||
/**
|
||||
|
@ -43,26 +43,26 @@ HTMLOperation.REMOVE_ICON = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABwkl
|
|||
*
|
||||
* @returns {string}
|
||||
*/
|
||||
HTMLOperation.prototype.to_stub_html = function(remove_icon) {
|
||||
var html = "<li class='operation'";
|
||||
HTMLOperation.prototype.to_stub_html = function (remove_icon) {
|
||||
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;
|
||||
};
|
||||
|
@ -73,10 +73,10 @@ 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>";
|
||||
HTMLOperation.prototype.to_full_html = function () {
|
||||
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();
|
||||
}
|
||||
|
||||
|
@ -99,16 +99,16 @@ HTMLOperation.prototype.to_full_html = function() {
|
|||
* @param {number} name_pos - The position of the search string in the operation name
|
||||
* @param {number} desc_pos - The position of the search string in the operation description
|
||||
*/
|
||||
HTMLOperation.prototype.highlight_search_string = function(search_str, name_pos, desc_pos) {
|
||||
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)}`;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
@ -37,12 +37,12 @@ HighlighterWaiter.OUTPUT = 1;
|
|||
* @private
|
||||
* @returns {boolean}
|
||||
*/
|
||||
HighlighterWaiter.prototype._is_selection_backwards = function() {
|
||||
var backwards = false,
|
||||
HighlighterWaiter.prototype._is_selection_backwards = function () {
|
||||
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;
|
||||
|
@ -60,11 +60,11 @@ HighlighterWaiter.prototype._is_selection_backwards = function() {
|
|||
* @param {number} offset - The offset since the last HTML element.
|
||||
* @returns {number}
|
||||
*/
|
||||
HighlighterWaiter.prototype._get_output_html_offset = function(node, offset) {
|
||||
var sel = window.getSelection(),
|
||||
HighlighterWaiter.prototype._get_output_html_offset = function (node, offset) {
|
||||
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);
|
||||
|
@ -81,8 +81,8 @@ HighlighterWaiter.prototype._get_output_html_offset = function(node, offset) {
|
|||
* @returns {number} pos.start
|
||||
* @returns {number} pos.end
|
||||
*/
|
||||
HighlighterWaiter.prototype._get_output_html_selection_offsets = function() {
|
||||
var sel = window.getSelection(),
|
||||
HighlighterWaiter.prototype._get_output_html_selection_offsets = function () {
|
||||
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,
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -117,10 +117,10 @@ 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;
|
||||
HighlighterWaiter.prototype.input_scroll = function (e) {
|
||||
const el = e.target;
|
||||
document.getElementById('input-highlighter').scrollTop = el.scrollTop;
|
||||
document.getElementById('input-highlighter').scrollLeft = el.scrollLeft;
|
||||
};
|
||||
|
||||
|
||||
|
@ -130,10 +130,10 @@ 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;
|
||||
HighlighterWaiter.prototype.output_scroll = function (e) {
|
||||
const el = e.target;
|
||||
document.getElementById('output-highlighter').scrollTop = el.scrollTop;
|
||||
document.getElementById('output-highlighter').scrollLeft = el.scrollLeft;
|
||||
};
|
||||
|
||||
|
||||
|
@ -143,18 +143,18 @@ HighlighterWaiter.prototype.output_scroll = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
HighlighterWaiter.prototype.input_mousedown = function(e) {
|
||||
HighlighterWaiter.prototype.input_mousedown = function (e) {
|
||||
this.mouse_button_down = true;
|
||||
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 }]);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -165,18 +165,18 @@ HighlighterWaiter.prototype.input_mousedown = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
HighlighterWaiter.prototype.output_mousedown = function(e) {
|
||||
HighlighterWaiter.prototype.output_mousedown = function (e) {
|
||||
this.mouse_button_down = true;
|
||||
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 }]);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -187,13 +187,13 @@ HighlighterWaiter.prototype.output_mousedown = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
HighlighterWaiter.prototype.output_html_mousedown = function(e) {
|
||||
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);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -203,7 +203,7 @@ HighlighterWaiter.prototype.output_html_mousedown = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
HighlighterWaiter.prototype.input_mouseup = function(e) {
|
||||
HighlighterWaiter.prototype.input_mouseup = function (e) {
|
||||
this.mouse_button_down = false;
|
||||
};
|
||||
|
||||
|
@ -213,7 +213,7 @@ HighlighterWaiter.prototype.input_mouseup = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
HighlighterWaiter.prototype.output_mouseup = function(e) {
|
||||
HighlighterWaiter.prototype.output_mouseup = function (e) {
|
||||
this.mouse_button_down = false;
|
||||
};
|
||||
|
||||
|
@ -223,7 +223,7 @@ HighlighterWaiter.prototype.output_mouseup = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
HighlighterWaiter.prototype.output_html_mouseup = function(e) {
|
||||
HighlighterWaiter.prototype.output_html_mouseup = function (e) {
|
||||
this.mouse_button_down = false;
|
||||
};
|
||||
|
||||
|
@ -234,20 +234,19 @@ HighlighterWaiter.prototype.output_html_mouseup = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
HighlighterWaiter.prototype.input_mousemove = function(e) {
|
||||
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 }]);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -258,20 +257,19 @@ HighlighterWaiter.prototype.input_mousemove = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
HighlighterWaiter.prototype.output_mousemove = function(e) {
|
||||
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 }]);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -282,16 +280,15 @@ HighlighterWaiter.prototype.output_mousemove = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
HighlighterWaiter.prototype.output_html_mousemove = function(e) {
|
||||
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);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -304,25 +301,25 @@ HighlighterWaiter.prototype.output_html_mousemove = function(e) {
|
|||
* @param {number} end - The end offset.
|
||||
* @returns {string}
|
||||
*/
|
||||
HighlighterWaiter.prototype.selection_info = function(start, end) {
|
||||
var width = end.toString().length;
|
||||
HighlighterWaiter.prototype.selection_info = function (start, end) {
|
||||
let width = end.toString().length;
|
||||
width = width < 2 ? 2 : width;
|
||||
var start_str = Utils.pad(start.toString(), width, " ").replace(/ /g, " "),
|
||||
end_str = Utils.pad(end.toString(), width, " ").replace(/ /g, " "),
|
||||
len_str = Utils.pad((end-start).toString(), width, " ").replace(/ /g, " ");
|
||||
let start_str = Utils.pad(start.toString(), width, ' ').replace(/ /g, ' '),
|
||||
end_str = Utils.pad(end.toString(), width, ' ').replace(/ /g, ' '),
|
||||
len_str = Utils.pad((end - start).toString(), width, ' ').replace(/ /g, ' ');
|
||||
|
||||
return "start: " + start_str + "<br>end: " + end_str + "<br>length: " + len_str;
|
||||
return `start: ${start_str}<br>end: ${end_str}<br>length: ${len_str}`;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* 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 = "";
|
||||
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 = '';
|
||||
};
|
||||
|
||||
|
||||
|
@ -335,17 +332,17 @@ HighlighterWaiter.prototype.remove_highlights = function() {
|
|||
* @returns {function} highlights[].b
|
||||
* @returns {Object[]} highlights[].args
|
||||
*/
|
||||
HighlighterWaiter.prototype.generate_highlight_list = function() {
|
||||
var recipe_config = this.app.get_recipe_config(),
|
||||
HighlighterWaiter.prototype.generate_highlight_list = function () {
|
||||
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,
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -372,26 +369,26 @@ HighlighterWaiter.prototype.generate_highlight_list = function() {
|
|||
* @param {number} pos.start - The start offset.
|
||||
* @param {number} pos.end - The end offset.
|
||||
*/
|
||||
HighlighterWaiter.prototype.highlight_output = function(pos) {
|
||||
var highlights = this.generate_highlight_list();
|
||||
HighlighterWaiter.prototype.highlight_output = function (pos) {
|
||||
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);
|
||||
};
|
||||
|
||||
|
@ -407,26 +404,26 @@ HighlighterWaiter.prototype.highlight_output = function(pos) {
|
|||
* @param {number} pos.start - The start offset.
|
||||
* @param {number} pos.end - The end offset.
|
||||
*/
|
||||
HighlighterWaiter.prototype.highlight_input = function(pos) {
|
||||
var highlights = this.generate_highlight_list();
|
||||
HighlighterWaiter.prototype.highlight_input = function (pos) {
|
||||
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);
|
||||
};
|
||||
|
||||
|
@ -441,17 +438,17 @@ HighlighterWaiter.prototype.highlight_input = function(pos) {
|
|||
* @param {number} pos.start - The start offset.
|
||||
* @param {number} pos.end - The end offset.
|
||||
*/
|
||||
HighlighterWaiter.prototype.highlight = function(textarea, highlighter, pos) {
|
||||
HighlighterWaiter.prototype.highlight = function (textarea, highlighter, pos) {
|
||||
if (!this.app.options.show_highlighter) return false;
|
||||
if (!this.app.options.attempt_highlight) return false;
|
||||
|
||||
// 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";
|
||||
//if (colour) css_class += "-"+colour;
|
||||
const css_class = 'hl1';
|
||||
// if (colour) css_class += "-"+colour;
|
||||
|
||||
// Remove HTML tags
|
||||
text = text.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/\n/g, " ")
|
||||
text = `${text.replace(/&/g, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/\n/g, ' ')
|
||||
// Convert placeholders to tags
|
||||
.replace(start_placeholder_regex, "<span class=\""+css_class+"\">")
|
||||
.replace(end_placeholder_regex, "</span>") + " ";
|
||||
.replace(start_placeholder_regex, `<span class="${css_class}">`)
|
||||
.replace(end_placeholder_regex, '</span>')} `;
|
||||
|
||||
// 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;
|
||||
|
|
|
@ -9,25 +9,25 @@
|
|||
* @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;
|
||||
|
||||
// Define keys that don't change the input so we don't have to autobake when they are pressed
|
||||
this.bad_keys = [
|
||||
16, //Shift
|
||||
17, //Ctrl
|
||||
18, //Alt
|
||||
19, //Pause
|
||||
20, //Caps
|
||||
27, //Esc
|
||||
33,34,35,36, //PgUp, PgDn, End, Home
|
||||
37,38,39,40, //Directional
|
||||
44, //PrntScrn
|
||||
91,92, //Win
|
||||
93, //Context
|
||||
112,113,114,115,116,117,118,119,120,121,122,123, //F1-12
|
||||
144, //Num
|
||||
16, // Shift
|
||||
17, // Ctrl
|
||||
18, // Alt
|
||||
19, // Pause
|
||||
20, // Caps
|
||||
27, // Esc
|
||||
33, 34, 35, 36, // PgUp, PgDn, End, Home
|
||||
37, 38, 39, 40, // Directional
|
||||
44, // PrntScrn
|
||||
91, 92, // Win
|
||||
93, // Context
|
||||
112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, // F1-12
|
||||
144, // Num
|
||||
145, //Scroll
|
||||
];
|
||||
};
|
||||
|
@ -38,8 +38,8 @@ var InputWaiter = function(app, manager) {
|
|||
*
|
||||
* @returns {string}
|
||||
*/
|
||||
InputWaiter.prototype.get = function() {
|
||||
return document.getElementById("input-text").value;
|
||||
InputWaiter.prototype.get = function () {
|
||||
return document.getElementById('input-text').value;
|
||||
};
|
||||
|
||||
|
||||
|
@ -50,8 +50,8 @@ InputWaiter.prototype.get = function() {
|
|||
*
|
||||
* @fires Manager#statechange
|
||||
*/
|
||||
InputWaiter.prototype.set = function(input) {
|
||||
document.getElementById("input-text").value = input;
|
||||
InputWaiter.prototype.set = function (input) {
|
||||
document.getElementById('input-text').value = input;
|
||||
window.dispatchEvent(this.manager.statechange);
|
||||
};
|
||||
|
||||
|
@ -62,14 +62,14 @@ InputWaiter.prototype.set = function(input) {
|
|||
* @param {number} length - The length of the current input string
|
||||
* @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;
|
||||
InputWaiter.prototype.set_input_info = function (length, lines) {
|
||||
let width = length.toString().length;
|
||||
width = width < 2 ? 2 : width;
|
||||
|
||||
var length_str = Utils.pad(length.toString(), width, " ").replace(/ /g, " ");
|
||||
var lines_str = Utils.pad(lines.toString(), width, " ").replace(/ /g, " ");
|
||||
const length_str = Utils.pad(length.toString(), width, ' ').replace(/ /g, ' ');
|
||||
const lines_str = Utils.pad(lines.toString(), width, ' ').replace(/ /g, ' ');
|
||||
|
||||
document.getElementById("input-info").innerHTML = "length: " + length_str + "<br>lines: " + lines_str;
|
||||
document.getElementById('input-info').innerHTML = `length: ${length_str}<br>lines: ${lines_str}`;
|
||||
};
|
||||
|
||||
|
||||
|
@ -81,7 +81,7 @@ InputWaiter.prototype.set_input_info = function(length, lines) {
|
|||
*
|
||||
* @fires Manager#statechange
|
||||
*/
|
||||
InputWaiter.prototype.input_change = function(e) {
|
||||
InputWaiter.prototype.input_change = function (e) {
|
||||
// Remove highlighting from input and output panes as the offsets might be different now
|
||||
this.manager.highlighter.remove_highlights();
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -108,14 +108,15 @@ InputWaiter.prototype.input_change = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
InputWaiter.prototype.input_dragover = 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');
|
||||
};
|
||||
|
||||
|
||||
|
@ -125,10 +126,10 @@ InputWaiter.prototype.input_dragover = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
InputWaiter.prototype.input_dragleave = function(e) {
|
||||
InputWaiter.prototype.input_dragleave = function (e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
e.target.classList.remove("dropping-file");
|
||||
e.target.classList.remove('dropping-file');
|
||||
};
|
||||
|
||||
|
||||
|
@ -138,60 +139,61 @@ InputWaiter.prototype.input_dragleave = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
InputWaiter.prototype.input_drop = 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);
|
||||
reader.onload = function (e) {
|
||||
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);
|
||||
|
@ -205,13 +207,13 @@ InputWaiter.prototype.input_drop = function(e) {
|
|||
*
|
||||
* @fires Manager#statechange
|
||||
*/
|
||||
InputWaiter.prototype.clear_io_click = function() {
|
||||
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);
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
@ -54,7 +54,7 @@ var Manager = function(app) {
|
|||
/**
|
||||
* Sets up the various components and listeners.
|
||||
*/
|
||||
Manager.prototype.setup = function() {
|
||||
Manager.prototype.setup = function () {
|
||||
this.recipe.initialise_operation_drag_n_drop();
|
||||
this.controls.auto_bake_change();
|
||||
this.seasonal.load();
|
||||
|
@ -64,86 +64,86 @@ Manager.prototype.setup = function() {
|
|||
/**
|
||||
* Main function to handle the creation of the event listeners.
|
||||
*/
|
||||
Manager.prototype.initialise_event_listeners = 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));
|
||||
};
|
||||
|
||||
|
||||
|
@ -160,9 +160,9 @@ Manager.prototype.initialise_event_listeners = function() {
|
|||
* // Calls the clickable function whenever any element with the .clickable class is clicked
|
||||
* this.add_listeners(".clickable", "click", this.clickable, this);
|
||||
*/
|
||||
Manager.prototype.add_listeners = function(selector, event_type, callback, scope) {
|
||||
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));
|
||||
});
|
||||
};
|
||||
|
@ -181,9 +181,9 @@ Manager.prototype.add_listeners = function(selector, event_type, callback, scope
|
|||
* // search element
|
||||
* 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++) {
|
||||
Manager.prototype.add_multi_event_listener = function (selector, event_types, callback, scope) {
|
||||
const evs = event_types.split(' ');
|
||||
for (let i = 0; i < evs.length; i++) {
|
||||
document.querySelector(selector).addEventListener(evs[i], callback.bind(scope));
|
||||
}
|
||||
};
|
||||
|
@ -202,9 +202,9 @@ Manager.prototype.add_multi_event_listener = function(selector, event_types, cal
|
|||
* // with the .saveable class
|
||||
* 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++) {
|
||||
Manager.prototype.add_multi_event_listeners = function (selector, event_types, callback, scope) {
|
||||
const evs = event_types.split(' ');
|
||||
for (let i = 0; i < evs.length; i++) {
|
||||
this.add_listeners(selector, evs[i], callback, scope);
|
||||
}
|
||||
};
|
||||
|
@ -224,10 +224,10 @@ Manager.prototype.add_multi_event_listeners = function(selector, event_types, ca
|
|||
* // listener is created
|
||||
* 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)
|
||||
Manager.prototype.add_dynamic_listener = function (selector, event_type, callback, scope) {
|
||||
const event_config = {
|
||||
selector,
|
||||
callback: callback.bind(scope || this),
|
||||
};
|
||||
|
||||
if (this.dynamic_handlers.hasOwnProperty(event_type)) {
|
||||
|
@ -247,15 +247,15 @@ 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],
|
||||
Manager.prototype.dynamic_listener_handler = function (e) {
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
@ -26,12 +26,13 @@ var OperationsWaiter = function(app, manager) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
OperationsWaiter.prototype.search_operations = function(e) {
|
||||
var ops, selected;
|
||||
OperationsWaiter.prototype.search_operations = function (e) {
|
||||
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");
|
||||
if (selected == ops.length - 1) selected = -1;
|
||||
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();
|
||||
}
|
||||
|
||||
|
@ -98,19 +99,19 @@ OperationsWaiter.prototype.search_operations = function(e) {
|
|||
* name and description
|
||||
* @returns {string[]}
|
||||
*/
|
||||
OperationsWaiter.prototype.filter_operations = function(search_str, highlight) {
|
||||
var matched_ops = [],
|
||||
OperationsWaiter.prototype.filter_operations = function (search_str, highlight) {
|
||||
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);
|
||||
}
|
||||
|
@ -134,9 +135,9 @@ OperationsWaiter.prototype.filter_operations = function(search_str, highlight) {
|
|||
* @param {element[]} ops
|
||||
* @returns {number}
|
||||
*/
|
||||
OperationsWaiter.prototype.get_selected_op = function(ops) {
|
||||
for (var i = 0; i < ops.length; i++) {
|
||||
if (ops[i].classList.contains("selected-op")) {
|
||||
OperationsWaiter.prototype.get_selected_op = function (ops) {
|
||||
for (let i = 0; i < ops.length; i++) {
|
||||
if (ops[i].classList.contains('selected-op')) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
@ -150,9 +151,9 @@ OperationsWaiter.prototype.get_selected_op = function(ops) {
|
|||
* @listens Manager#oplistcreate
|
||||
* @param {event} e
|
||||
*/
|
||||
OperationsWaiter.prototype.op_list_create = function(e) {
|
||||
OperationsWaiter.prototype.op_list_create = function (e) {
|
||||
this.manager.recipe.create_sortable_seed_list(e.target);
|
||||
$("[data-toggle=popover]").popover();
|
||||
$('[data-toggle=popover]').popover();
|
||||
};
|
||||
|
||||
|
||||
|
@ -162,8 +163,8 @@ OperationsWaiter.prototype.op_list_create = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
OperationsWaiter.prototype.operation_dblclick = function(e) {
|
||||
var li = e.target;
|
||||
OperationsWaiter.prototype.operation_dblclick = function (e) {
|
||||
const li = e.target;
|
||||
|
||||
this.manager.recipe.add_operation(li.textContent);
|
||||
this.app.auto_bake();
|
||||
|
@ -176,50 +177,48 @@ OperationsWaiter.prototype.operation_dblclick = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
OperationsWaiter.prototype.edit_favourites_click = function(e) {
|
||||
OperationsWaiter.prototype.edit_favourites_click = function (e) {
|
||||
e.preventDefault();
|
||||
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);
|
||||
}
|
||||
},
|
||||
onEnd: function(evt) {
|
||||
onEnd: function (evt) {
|
||||
if (this.remove_intent) evt.item.remove();
|
||||
}.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();
|
||||
};
|
||||
|
||||
|
||||
|
@ -227,11 +226,11 @@ OperationsWaiter.prototype.edit_favourites_click = function(e) {
|
|||
* Handler for save favourites click events.
|
||||
* Saves the selected favourites and reloads them.
|
||||
*/
|
||||
OperationsWaiter.prototype.save_favourites_click = function() {
|
||||
var favourites_list = [],
|
||||
favs = document.querySelectorAll("#edit-favourites-list li");
|
||||
OperationsWaiter.prototype.save_favourites_click = function () {
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -246,7 +245,7 @@ OperationsWaiter.prototype.save_favourites_click = function() {
|
|||
* Handler for reset favourites click events.
|
||||
* Resets favourites to their defaults.
|
||||
*/
|
||||
OperationsWaiter.prototype.reset_favourites_click = function() {
|
||||
OperationsWaiter.prototype.reset_favourites_click = function () {
|
||||
this.app.reset_favourites();
|
||||
};
|
||||
|
||||
|
@ -257,10 +256,10 @@ 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");
|
||||
OperationsWaiter.prototype.op_icon_mouseover = function (e) {
|
||||
const op_el = e.target.parentNode;
|
||||
if (e.target.getAttribute('data-toggle') == 'popover') {
|
||||
$(op_el).popover('hide');
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -272,11 +271,11 @@ OperationsWaiter.prototype.op_icon_mouseover = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
OperationsWaiter.prototype.op_icon_mouseleave = function(e) {
|
||||
var op_el = e.target.parentNode,
|
||||
OperationsWaiter.prototype.op_icon_mouseleave = function (e) {
|
||||
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');
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -18,32 +18,32 @@ var OptionsWaiter = function(app) {
|
|||
*
|
||||
* @param {Object} options
|
||||
*/
|
||||
OptionsWaiter.prototype.load = function(options) {
|
||||
$(".option-item input:checkbox").bootstrapSwitch({
|
||||
size: "small",
|
||||
OptionsWaiter.prototype.load = function (options) {
|
||||
$('.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 }));
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -52,8 +52,8 @@ OptionsWaiter.prototype.load = function(options) {
|
|||
* Handler for options click events.
|
||||
* Dispays the options pane.
|
||||
*/
|
||||
OptionsWaiter.prototype.options_click = function() {
|
||||
$("#options-modal").modal();
|
||||
OptionsWaiter.prototype.options_click = function () {
|
||||
$('#options-modal').modal();
|
||||
};
|
||||
|
||||
|
||||
|
@ -61,7 +61,7 @@ OptionsWaiter.prototype.options_click = function() {
|
|||
* Handler for reset options click events.
|
||||
* Resets options back to their default values.
|
||||
*/
|
||||
OptionsWaiter.prototype.reset_options_click = function() {
|
||||
OptionsWaiter.prototype.reset_options_click = function () {
|
||||
this.load(this.app.doptions);
|
||||
};
|
||||
|
||||
|
@ -73,12 +73,12 @@ OptionsWaiter.prototype.reset_options_click = function() {
|
|||
* @param {event} e
|
||||
* @param {boolean} state
|
||||
*/
|
||||
OptionsWaiter.prototype.switch_change = function(e, state) {
|
||||
var el = e.target,
|
||||
option = el.getAttribute("option");
|
||||
OptionsWaiter.prototype.switch_change = function (e, state) {
|
||||
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));
|
||||
};
|
||||
|
||||
|
||||
|
@ -88,12 +88,12 @@ OptionsWaiter.prototype.switch_change = function(e, state) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
OptionsWaiter.prototype.number_change = function(e) {
|
||||
var el = e.target,
|
||||
option = el.getAttribute("option");
|
||||
OptionsWaiter.prototype.number_change = function (e) {
|
||||
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));
|
||||
};
|
||||
|
||||
|
||||
|
@ -103,30 +103,30 @@ OptionsWaiter.prototype.number_change = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
OptionsWaiter.prototype.select_change = function(e) {
|
||||
var el = e.target,
|
||||
option = el.getAttribute("option");
|
||||
OptionsWaiter.prototype.select_change = function (e) {
|
||||
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));
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* 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");
|
||||
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');
|
||||
|
||||
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');
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
@ -20,8 +20,8 @@ var OutputWaiter = function(app, manager) {
|
|||
*
|
||||
* @returns {string}
|
||||
*/
|
||||
OutputWaiter.prototype.get = function() {
|
||||
return document.getElementById("output-text").value;
|
||||
OutputWaiter.prototype.get = function () {
|
||||
return document.getElementById('output-text').value;
|
||||
};
|
||||
|
||||
|
||||
|
@ -32,24 +32,24 @@ OutputWaiter.prototype.get = function() {
|
|||
* @param {string} type - The data type of the output
|
||||
* @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");
|
||||
OutputWaiter.prototype.set = function (data_str, type, duration) {
|
||||
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);
|
||||
};
|
||||
|
||||
|
@ -79,19 +79,19 @@ OutputWaiter.prototype.set = function(data_str, type, duration) {
|
|||
* @param {number} lines - The number of the lines in the current output string
|
||||
* @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;
|
||||
OutputWaiter.prototype.set_output_info = function (length, lines, duration) {
|
||||
let width = length.toString().length;
|
||||
width = width < 4 ? 4 : width;
|
||||
|
||||
var length_str = Utils.pad(length.toString(), width, " ").replace(/ /g, " ");
|
||||
var lines_str = Utils.pad(lines.toString(), width, " ").replace(/ /g, " ");
|
||||
var time_str = Utils.pad(duration.toString() + "ms", width, " ").replace(/ /g, " ");
|
||||
const length_str = Utils.pad(length.toString(), width, ' ').replace(/ /g, ' ');
|
||||
const lines_str = Utils.pad(lines.toString(), width, ' ').replace(/ /g, ' ');
|
||||
const time_str = Utils.pad(`${duration.toString()}ms`, width, ' ').replace(/ /g, ' ');
|
||||
|
||||
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 = '';
|
||||
};
|
||||
|
||||
|
||||
|
@ -99,17 +99,17 @@ OutputWaiter.prototype.set_output_info = function(length, lines, duration) {
|
|||
* Handler for save click events.
|
||||
* 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");
|
||||
OutputWaiter.prototype.save_click = function () {
|
||||
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();
|
||||
|
@ -122,9 +122,9 @@ OutputWaiter.prototype.save_click = function() {
|
|||
* Handler for switch click events.
|
||||
* Moves the current output into the input textarea.
|
||||
*/
|
||||
OutputWaiter.prototype.switch_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);
|
||||
};
|
||||
|
||||
|
@ -133,7 +133,7 @@ OutputWaiter.prototype.switch_click = function() {
|
|||
* Handler for undo switch click events.
|
||||
* Removes the output from the input and replaces the input that was removed.
|
||||
*/
|
||||
OutputWaiter.prototype.undo_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;
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
@ -21,42 +21,42 @@ 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");
|
||||
RecipeWaiter.prototype.initialise_operation_drag_n_drop = function () {
|
||||
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) {
|
||||
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));
|
||||
};
|
||||
|
||||
|
||||
|
@ -65,22 +65,22 @@ RecipeWaiter.prototype.initialise_operation_drag_n_drop = function() {
|
|||
*
|
||||
* @param {element} list_el - The list the initialise
|
||||
*/
|
||||
RecipeWaiter.prototype.create_sortable_seed_list = function(list_el) {
|
||||
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),
|
||||
});
|
||||
};
|
||||
|
||||
|
@ -93,9 +93,9 @@ RecipeWaiter.prototype.create_sortable_seed_list = function(list_el) {
|
|||
* @fires Manager#operationadd
|
||||
* @param {event} evt
|
||||
*/
|
||||
RecipeWaiter.prototype.op_sort_end = function(evt) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -122,21 +122,22 @@ RecipeWaiter.prototype.op_sort_end = function(evt) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
RecipeWaiter.prototype.fav_dragover = function(e) {
|
||||
if (e.dataTransfer.effectAllowed !== "move")
|
||||
RecipeWaiter.prototype.fav_dragover = function (e) {
|
||||
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');
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -147,10 +148,10 @@ RecipeWaiter.prototype.fav_dragover = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
RecipeWaiter.prototype.fav_dragleave = 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');
|
||||
};
|
||||
|
||||
|
||||
|
@ -160,12 +161,12 @@ RecipeWaiter.prototype.fav_dragleave = function(e) {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
RecipeWaiter.prototype.fav_drop = 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);
|
||||
};
|
||||
|
||||
|
@ -175,7 +176,7 @@ RecipeWaiter.prototype.fav_drop = function(e) {
|
|||
*
|
||||
* @fires Manager#statechange
|
||||
*/
|
||||
RecipeWaiter.prototype.ing_change = function() {
|
||||
RecipeWaiter.prototype.ing_change = function () {
|
||||
window.dispatchEvent(this.manager.statechange);
|
||||
};
|
||||
|
||||
|
@ -187,17 +188,17 @@ RecipeWaiter.prototype.ing_change = function() {
|
|||
* @fires Manager#statechange
|
||||
* @param {event} e
|
||||
*/
|
||||
RecipeWaiter.prototype.disable_click = function(e) {
|
||||
var icon = e.target;
|
||||
RecipeWaiter.prototype.disable_click = function (e) {
|
||||
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;
|
||||
|
@ -212,15 +213,15 @@ RecipeWaiter.prototype.disable_click = function(e) {
|
|||
* @fires Manager#statechange
|
||||
* @param {event} e
|
||||
*/
|
||||
RecipeWaiter.prototype.breakpoint_click = function(e) {
|
||||
var bp = e.target;
|
||||
RecipeWaiter.prototype.breakpoint_click = function (e) {
|
||||
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);
|
||||
|
@ -234,7 +235,7 @@ RecipeWaiter.prototype.breakpoint_click = function(e) {
|
|||
* @fires Manager#statechange
|
||||
* @param {event} e
|
||||
*/
|
||||
RecipeWaiter.prototype.operation_dblclick = function(e) {
|
||||
RecipeWaiter.prototype.operation_dblclick = function (e) {
|
||||
e.target.remove();
|
||||
window.dispatchEvent(this.manager.statechange);
|
||||
};
|
||||
|
@ -247,7 +248,7 @@ RecipeWaiter.prototype.operation_dblclick = function(e) {
|
|||
* @fires Manager#statechange
|
||||
* @param {event} e
|
||||
*/
|
||||
RecipeWaiter.prototype.operation_child_dblclick = function(e) {
|
||||
RecipeWaiter.prototype.operation_child_dblclick = function (e) {
|
||||
e.target.parentNode.remove();
|
||||
window.dispatchEvent(this.manager.statechange);
|
||||
};
|
||||
|
@ -258,25 +259,30 @@ 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");
|
||||
RecipeWaiter.prototype.get_config = function () {
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -309,13 +315,13 @@ 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++) {
|
||||
RecipeWaiter.prototype.update_breakpoint_indicator = function (position) {
|
||||
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');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -327,20 +333,20 @@ 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);
|
||||
RecipeWaiter.prototype.build_recipe_operation = function (el) {
|
||||
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);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -351,12 +357,12 @@ RecipeWaiter.prototype.build_recipe_operation = function(el) {
|
|||
* @param {string} name - The name of the operation to add
|
||||
* @returns {element}
|
||||
*/
|
||||
RecipeWaiter.prototype.add_operation = function(name) {
|
||||
var item = document.createElement("li");
|
||||
item.classList.add("operation");
|
||||
RecipeWaiter.prototype.add_operation = function (name) {
|
||||
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;
|
||||
|
@ -368,8 +374,8 @@ RecipeWaiter.prototype.add_operation = function(name) {
|
|||
*
|
||||
* @fires Manager#operationremove
|
||||
*/
|
||||
RecipeWaiter.prototype.clear_recipe = function() {
|
||||
var rec_list = document.getElementById("rec_list");
|
||||
RecipeWaiter.prototype.clear_recipe = function () {
|
||||
const rec_list = document.getElementById('rec_list');
|
||||
while (rec_list.firstChild) {
|
||||
rec_list.removeChild(rec_list.firstChild);
|
||||
}
|
||||
|
@ -383,11 +389,11 @@ RecipeWaiter.prototype.clear_recipe = function() {
|
|||
*
|
||||
* @param {event} e
|
||||
*/
|
||||
RecipeWaiter.prototype.dropdown_toggle_click = function(e) {
|
||||
var el = e.target,
|
||||
RecipeWaiter.prototype.dropdown_toggle_click = function (e) {
|
||||
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();
|
||||
};
|
||||
|
||||
|
@ -399,7 +405,7 @@ RecipeWaiter.prototype.dropdown_toggle_click = function(e) {
|
|||
* @fires Manager#statechange
|
||||
* @param {event} e
|
||||
*/
|
||||
RecipeWaiter.prototype.op_add = function(e) {
|
||||
RecipeWaiter.prototype.op_add = function (e) {
|
||||
window.dispatchEvent(this.manager.statechange);
|
||||
};
|
||||
|
||||
|
@ -411,6 +417,6 @@ RecipeWaiter.prototype.op_add = function(e) {
|
|||
* @fires Manager#statechange
|
||||
* @param {event} e
|
||||
*/
|
||||
RecipeWaiter.prototype.op_remove = function(e) {
|
||||
RecipeWaiter.prototype.op_remove = function (e) {
|
||||
window.dispatchEvent(this.manager.statechange);
|
||||
};
|
|
@ -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;
|
||||
};
|
||||
|
@ -18,16 +18,16 @@ var SeasonalWaiter = function(app, manager) {
|
|||
/**
|
||||
* Loads all relevant items depending on the current date.
|
||||
*/
|
||||
SeasonalWaiter.prototype.load = function() {
|
||||
var now = new Date();
|
||||
SeasonalWaiter.prototype.load = function () {
|
||||
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));
|
||||
};
|
||||
|
||||
|
||||
|
@ -47,19 +47,19 @@ SeasonalWaiter.prototype.load = function() {
|
|||
* Replaces chef icons with spider icons.
|
||||
* #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=";
|
||||
SeasonalWaiter.prototype.insert_spider_icons = function () {
|
||||
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}`);
|
||||
};
|
||||
|
||||
|
||||
|
@ -67,28 +67,28 @@ SeasonalWaiter.prototype.insert_spider_icons = function() {
|
|||
* Replaces all instances of the word "cyber" with "spider".
|
||||
* #spiderchef
|
||||
*/
|
||||
SeasonalWaiter.prototype.insert_spider_text = 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';
|
||||
};
|
||||
|
||||
|
||||
|
@ -96,11 +96,11 @@ SeasonalWaiter.prototype.insert_spider_text = function() {
|
|||
* Adds an option to make it snow.
|
||||
* #letitsnow
|
||||
*/
|
||||
SeasonalWaiter.prototype.create_snow_option = function() {
|
||||
var options_body = document.getElementById("options-body"),
|
||||
option_item = document.createElement("div");
|
||||
SeasonalWaiter.prototype.create_snow_option = function () {
|
||||
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";
|
||||
|
@ -114,44 +114,44 @@ SeasonalWaiter.prototype.create_snow_option = function() {
|
|||
* Initialises a snowstorm.
|
||||
* #letitsnow
|
||||
*/
|
||||
SeasonalWaiter.prototype.let_it_snow = function() {
|
||||
$(document).snowfall("clear");
|
||||
SeasonalWaiter.prototype.let_it_snow = function () {
|
||||
$(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) {
|
||||
// Firefox < 30
|
||||
options = {
|
||||
flakeCount : 10,
|
||||
flakeColor : '#fff',
|
||||
flakeCount: 10,
|
||||
flakeColor: '#fff',
|
||||
flakePosition: 'absolute',
|
||||
minSize : 1,
|
||||
maxSize : 2,
|
||||
minSpeed : 1,
|
||||
maxSpeed : 5,
|
||||
round : false,
|
||||
shadow : false,
|
||||
collection : false,
|
||||
collectionHeight : 20,
|
||||
deviceorientation : true
|
||||
minSize: 1,
|
||||
maxSize: 2,
|
||||
minSpeed: 1,
|
||||
maxSpeed: 5,
|
||||
round: false,
|
||||
shadow: false,
|
||||
collection: false,
|
||||
collectionHeight: 20,
|
||||
deviceorientation: true,
|
||||
};
|
||||
} else {
|
||||
// All other browsers
|
||||
options = {
|
||||
flakeCount : 35, //35
|
||||
flakeColor : '#fff',
|
||||
flakeCount: 35, // 35
|
||||
flakeColor: '#fff',
|
||||
flakePosition: 'absolute',
|
||||
minSize : 5,
|
||||
maxSize : 8,
|
||||
minSpeed : 1,
|
||||
maxSpeed : 5,
|
||||
round : true,
|
||||
shadow : true,
|
||||
collection : ".btn",
|
||||
collectionHeight : 20,
|
||||
deviceorientation : true
|
||||
minSize: 5,
|
||||
maxSize: 8,
|
||||
minSpeed: 1,
|
||||
maxSpeed: 5,
|
||||
round: true,
|
||||
shadow: true,
|
||||
collection: '.btn',
|
||||
collectionHeight: 20,
|
||||
deviceorientation: true,
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -162,22 +162,22 @@ SeasonalWaiter.prototype.let_it_snow = function() {
|
|||
* When a button is clicked, shake the snow off that button.
|
||||
* #letitsnow
|
||||
*/
|
||||
SeasonalWaiter.prototype.shake_off_snow = function(e) {
|
||||
var el = e.target,
|
||||
SeasonalWaiter.prototype.shake_off_snow = function (e) {
|
||||
let el = e.target,
|
||||
rect = el.getBoundingClientRect(),
|
||||
canvases = document.querySelectorAll("canvas.snowfall-canvas"),
|
||||
canvases = document.querySelectorAll('canvas.snowfall-canvas'),
|
||||
canvas = null,
|
||||
remove_func = function() {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -189,16 +189,16 @@ SeasonalWaiter.prototype.shake_off_snow = function(e) {
|
|||
* sequence.
|
||||
* #konamicode
|
||||
*/
|
||||
SeasonalWaiter.prototype.konami_code_listener = 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 = [];
|
||||
}
|
||||
}
|
||||
|
@ -213,20 +213,20 @@ SeasonalWaiter.prototype.konami_code_listener = function(e) {
|
|||
* @param {Function} fn - The callback function to operate on each node
|
||||
* @param {booleam} all_nodes - Whether to operate on every node or not
|
||||
*/
|
||||
SeasonalWaiter.tree_walk = (function() {
|
||||
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;
|
||||
return function (parent, fn, all_nodes) {
|
||||
let node = parent.firstChild;
|
||||
|
||||
while (node && node != parent) {
|
||||
if (all_nodes || node.nodeType === 1) {
|
||||
if (fn(node) === false) {
|
||||
return(false);
|
||||
return (false);
|
||||
}
|
||||
}
|
||||
// If it's an element &&
|
||||
|
@ -251,4 +251,4 @@ SeasonalWaiter.tree_walk = (function() {
|
|||
}
|
||||
}
|
||||
};
|
||||
})();
|
||||
}());
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -18,7 +18,7 @@ var WindowWaiter = function(app) {
|
|||
* Resets the layout of CyberChef's panes after 200ms (so that continuous resizing doesn't cause
|
||||
* continuous resetting).
|
||||
*/
|
||||
WindowWaiter.prototype.window_resize = function() {
|
||||
WindowWaiter.prototype.window_resize = function () {
|
||||
clearTimeout(this.reset_layout_timeout);
|
||||
this.reset_layout_timeout = setTimeout(this.app.reset_layout.bind(this.app), 200);
|
||||
};
|
||||
|
@ -29,7 +29,7 @@ WindowWaiter.prototype.window_resize = function() {
|
|||
* Saves the current time so that we can calculate how long the window was unfocussed for when
|
||||
* focus is returned.
|
||||
*/
|
||||
WindowWaiter.prototype.window_blur = function() {
|
||||
WindowWaiter.prototype.window_blur = function () {
|
||||
this.window_blur_time = new Date().getTime();
|
||||
};
|
||||
|
||||
|
@ -44,8 +44,8 @@ WindowWaiter.prototype.window_blur = function() {
|
|||
* This will stop baking taking a long time when the CyberChef browser tab has been unfocused for
|
||||
* 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;
|
||||
WindowWaiter.prototype.window_focus = function () {
|
||||
const unfocused_time = new Date().getTime() - this.window_blur_time;
|
||||
if (unfocused_time > 60000) {
|
||||
this.app.silent_bake();
|
||||
}
|
||||
|
|
|
@ -9,41 +9,41 @@
|
|||
/**
|
||||
* 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 = {
|
||||
update_url : true,
|
||||
show_highlighter : true,
|
||||
treat_as_utf8 : true,
|
||||
word_wrap : true,
|
||||
show_errors : true,
|
||||
error_timeout : 4000,
|
||||
auto_bake_threshold : 200,
|
||||
attempt_highlight : true,
|
||||
snow : false,
|
||||
const default_options = {
|
||||
update_url: true,
|
||||
show_highlighter: true,
|
||||
treat_as_utf8: true,
|
||||
word_wrap: true,
|
||||
show_errors: true,
|
||||
error_timeout: 4000,
|
||||
auto_bake_threshold: 200,
|
||||
attempt_highlight: true,
|
||||
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);
|
||||
|
|
|
@ -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(),
|
||||
})
|
||||
]
|
||||
}
|
||||
}),
|
||||
],
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue