eslint autofix

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

View File

@ -1,152 +1,152 @@
module.exports = function(grunt) {
grunt.file.defaultEncoding = "utf8";
grunt.file.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("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("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("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");
// JS includes
var 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",
// 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",
// Custom libraries
"src/js/lib/canvas_components.js",
// Utility functions
"src/js/core/Utils.js",
// Operation objects
"src/js/operations/*.js",
// Core framework objects
"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",
// Start the app!
"src/js/views/html/main.js",
];
module.exports = function (grunt) {
grunt.file.defaultEncoding = 'utf8';
grunt.file.preserveBOM = false;
var banner = '/**\n\
// 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('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('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('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');
// JS includes
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',
// 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',
// Custom libraries
'src/js/lib/canvas_components.js',
// Utility functions
'src/js/core/Utils.js',
// Operation objects
'src/js/operations/*.js',
// Core framework objects
'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',
// Start the app!
'src/js/views/html/main.js',
];
const banner = '/**\n\
* CyberChef - The Cyber Swiss Army Knife\n\
*\n\
* @copyright Crown Copyright 2016\n\
@ -167,278 +167,277 @@ module.exports = function(grunt) {
* limitations under the License.\n\
*/\n';
var 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>")
}
};
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>'),
},
};
// Project configuration
grunt.initConfig({
jshint: {
options: {
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"],
},
jsdoc: {
options: {
destination: "docs",
template: "node_modules/ink-docstrap/template",
recurse: true,
readme: "./README.md",
configure: "docs/jsdoc.conf.json"
},
all: {
src: [
"src/js/**/*.js",
"!src/js/lib/**/*",
],
}
},
clean: {
dev: ["build/dev/*"],
prod: ["build/prod/*"],
docs: ["docs/*", "!docs/*.conf.json", "!docs/*.ico"],
},
concat: {
options: {
process: template_options
},
css: {
options: {
banner: banner.replace(/\/\*\*/g, "/*!"),
process: function(content, srcpath) {
grunt.initConfig({
jshint: {
options: {
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'],
},
jsdoc: {
options: {
destination: 'docs',
template: 'node_modules/ink-docstrap/template',
recurse: true,
readme: './README.md',
configure: 'docs/jsdoc.conf.json',
},
all: {
src: [
'src/js/**/*.js',
'!src/js/lib/**/*',
],
},
},
clean: {
dev: ['build/dev/*'],
prod: ['build/prod/*'],
docs: ['docs/*', '!docs/*.conf.json', '!docs/*.ico'],
},
concat: {
options: {
process: template_options,
},
css: {
options: {
banner: banner.replace(/\/\*\*/g, '/*!'),
process(content, srcpath) {
// Change special comments from /** to /*! to comply with cssmin
content = content.replace(/^\/\*\* /g, "/*! ");
return grunt.template.process(content);
}
},
src: [
"src/css/lib/**/*.css",
"src/css/structure/**/*.css",
"src/css/themes/classic.css"
],
dest: "build/dev/styles.css"
},
js: {
options: {
banner: '"use strict";\n'
},
src: js_files,
dest: "build/dev/scripts.js"
}
content = content.replace(/^\/\*\* /g, '/*! ');
return grunt.template.process(content);
},
},
copy: {
html_dev: {
options: {
process: function(content, srcpath) {
return grunt.template.process(content, template_options);
}
},
src: "src/html/index.html",
dest: "build/dev/index.html"
},
html_prod: {
options: {
process: function(content, srcpath) {
return grunt.template.process(content, template_options);
}
},
src: "src/html/index.html",
dest: "build/prod/index.html"
},
html_inline: {
options: {
process: function(content, srcpath) {
src: [
'src/css/lib/**/*.css',
'src/css/structure/**/*.css',
'src/css/themes/classic.css',
],
dest: 'build/dev/styles.css',
},
js: {
options: {
banner: '"use strict";\n',
},
src: js_files,
dest: 'build/dev/scripts.js',
},
},
copy: {
html_dev: {
options: {
process(content, srcpath) {
return grunt.template.process(content, template_options);
},
},
src: 'src/html/index.html',
dest: 'build/dev/index.html',
},
html_prod: {
options: {
process(content, srcpath) {
return grunt.template.process(content, template_options);
},
},
src: 'src/html/index.html',
dest: 'build/prod/index.html',
},
html_inline: {
options: {
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>');
return grunt.template.process(content, template_options);
}
},
src: "src/html/index.html",
dest: "build/prod/cyberchef.htm"
},
static_dev: {
files: [
{
expand: true,
cwd: "src/static/",
src: [
"**/*",
"**/.*",
"!stats.txt"
],
dest: "build/dev/"
}
]
},
static_prod: {
files: [
{
expand: true,
cwd: "src/static/",
src: [
"**/*",
"**/.*",
"!stats.txt"
],
dest: "build/prod/"
}
]
}
content = content.replace(
'<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);
},
},
uglify: {
options: {
preserveComments: function(node, comment) {
if (comment.value.indexOf("* @license") === 0) return true;
return false;
},
screwIE8: true,
ASCIIOnly: true,
beautify: {
beautify: false,
inline_script: true,
ascii_only: true,
screw_ie8: true
},
compress: {
screw_ie8: true
},
banner: banner
},
prod: {
src: "build/dev/scripts.js",
dest: "build/prod/scripts.js"
}
src: 'src/html/index.html',
dest: 'build/prod/cyberchef.htm',
},
static_dev: {
files: [
{
expand: true,
cwd: 'src/static/',
src: [
'**/*',
'**/.*',
'!stats.txt',
],
dest: 'build/dev/',
},
],
},
static_prod: {
files: [
{
expand: true,
cwd: 'src/static/',
src: [
'**/*',
'**/.*',
'!stats.txt',
],
dest: 'build/prod/',
},
],
},
},
uglify: {
options: {
preserveComments(node, comment) {
if (comment.value.indexOf('* @license') === 0) return true;
return false;
},
cssmin: {
prod: {
src: "build/dev/styles.css",
dest: "build/prod/styles.css"
}
screwIE8: true,
ASCIIOnly: true,
beautify: {
beautify: false,
inline_script: true,
ascii_only: true,
screw_ie8: true,
},
htmlmin: {
prod: {
options: {
removeComments: true,
collapseWhitespace: true,
minifyJS: true,
minifyCSS: true
},
src: "build/prod/index.html",
dest: "build/prod/index.html"
},
inline: {
options: {
removeComments: true,
collapseWhitespace: true,
minifyJS: false,
minifyCSS: false
},
src: "build/prod/cyberchef.htm",
dest: "build/prod/cyberchef.htm"
}
compress: {
screw_ie8: true,
},
inline: {
options: {
tag: "",
inlineTagAttributes: {
js: "type='application/javascript'",
css: "type='text/css'"
}
},
prod: {
src: "build/prod/cyberchef.htm",
dest: "build/prod/cyberchef.htm"
}
banner,
},
prod: {
src: 'build/dev/scripts.js',
dest: 'build/prod/scripts.js',
},
},
cssmin: {
prod: {
src: 'build/dev/styles.css',
dest: 'build/prod/styles.css',
},
},
htmlmin: {
prod: {
options: {
removeComments: true,
collapseWhitespace: true,
minifyJS: true,
minifyCSS: true,
},
chmod: {
build: {
options: {
mode: "755",
},
src: ["build/**/*", "build/**/.htaccess", "build/"]
},
docs: {
options: {
mode: "755",
},
src: ["docs/**/*", "docs/"]
}
src: 'build/prod/index.html',
dest: 'build/prod/index.html',
},
inline: {
options: {
removeComments: true,
collapseWhitespace: true,
minifyJS: false,
minifyCSS: false,
},
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
},
stats: {
command: "rm src/static/stats.txt;" +
src: 'build/prod/cyberchef.htm',
dest: 'build/prod/cyberchef.htm',
},
},
inline: {
options: {
tag: '',
inlineTagAttributes: {
js: "type='application/javascript'",
css: "type='text/css'",
},
},
prod: {
src: 'build/prod/cyberchef.htm',
dest: 'build/prod/cyberchef.htm',
},
},
chmod: {
build: {
options: {
mode: '755',
},
src: ['build/**/*', 'build/**/.htaccess', 'build/'],
},
docs: {
options: {
mode: '755',
},
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,
},
stats: {
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'",
"du -hs src/ | pcregrep -o '^[^\t]*' | xargs printf '%b\tsize\n'",
"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'",
"du -hs src/ | pcregrep -o '^[^\t]*' | xargs printf '%b\tsize\n'",
"ls src/js/ -R1 | grep '\.js$' | wc -l | xargs printf '\n%b\tJavaScript source files\n'",
"find src/js/ -regex '.*\.js' -print | xargs cat | wc -l | xargs printf '%b\tlines\n'",
"find src/js/ -regex '.*\.js' -exec du -hcs {} \+ | tail -n1 | egrep -o '^[^\t]*' | xargs printf '%b\tsize\n'",
"ls src/js/ -R1 | grep '\.js$' | wc -l | xargs printf '\n%b\tJavaScript source files\n'",
"find src/js/ -regex '.*\.js' -print | xargs cat | wc -l | xargs printf '%b\tlines\n'",
"find src/js/ -regex '.*\.js' -exec du -hcs {} \+ | tail -n1 | egrep -o '^[^\t]*' | xargs printf '%b\tsize\n'",
"find src/js/ -regex '.*/lib/.*\.js' -print | wc -l | xargs printf '\n%b\tthird party JavaScript source files\n'",
"find src/js/ -regex '.*/lib/.*\.js' -print | xargs cat | wc -l | xargs printf '%b\tlines\n'",
"find src/js/ -regex '.*/lib/.*\.js' -exec du -hcs {} \+ | tail -n1 | egrep -o '^[^\t]*' | xargs printf '%b\tsize\n'",
"find src/js/ -regex '.*/lib/.*\.js' -print | wc -l | xargs printf '\n%b\tthird party JavaScript source files\n'",
"find src/js/ -regex '.*/lib/.*\.js' -print | xargs cat | wc -l | xargs printf '%b\tlines\n'",
"find src/js/ -regex '.*/lib/.*\.js' -exec du -hcs {} \+ | tail -n1 | egrep -o '^[^\t]*' | xargs printf '%b\tsize\n'",
"find src/js/ -regex '.*\.js' -not -regex '.*/lib/.*' -print | wc -l | xargs printf '\n%b\tfirst party JavaScript source files\n'",
"find src/js/ -regex '.*\.js' -not -regex '.*/lib/.*' -print | xargs cat | wc -l | xargs printf '%b\tlines\n'",
"find src/js/ -regex '.*\.js' -not -regex '.*/lib/.*' -exec du -hcs {} \+ | tail -n1 | egrep -o '^[^\t]*' | xargs printf '%b\tsize\n'",
"find src/js/ -regex '.*\.js' -not -regex '.*/lib/.*' -print | wc -l | xargs printf '\n%b\tfirst party JavaScript source files\n'",
"find src/js/ -regex '.*\.js' -not -regex '.*/lib/.*' -print | xargs cat | wc -l | xargs printf '%b\tlines\n'",
"find src/js/ -regex '.*\.js' -not -regex '.*/lib/.*' -exec du -hcs {} \+ | tail -n1 | egrep -o '^[^\t]*' | xargs printf '%b\tsize\n'",
"du build/dev/scripts.js -h | egrep -o '^[^\t]*' | xargs printf '\n%b\tuncompressed JavaScript size\n'",
"du build/prod/scripts.js -h | egrep -o '^[^\t]*' | xargs printf '%b\tcompressed JavaScript size\n'",
"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
},
display_stats: {
command: "cat src/static/stats.txt"
},
clean_git: {
command: "git gc --prune=now --aggressive"
},
},
watch: {
css: {
files: "src/css/**/*.css",
tasks: ["concat:css", "chmod:build"]
},
js: {
files: "src/js/**/*.js",
tasks: ["concat:js_all", "chmod:build"]
},
html: {
files: "src/html/**/*.html",
tasks: ["copy:html_dev", "chmod:build"]
},
static: {
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"]
}
},
});
"du build/dev/scripts.js -h | egrep -o '^[^\t]*' | xargs printf '\n%b\tuncompressed JavaScript size\n'",
"du build/prod/scripts.js -h | egrep -o '^[^\t]*' | xargs printf '%b\tcompressed JavaScript size\n'",
"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,
},
display_stats: {
command: 'cat src/static/stats.txt',
},
clean_git: {
command: 'git gc --prune=now --aggressive',
},
},
watch: {
css: {
files: 'src/css/**/*.css',
tasks: ['concat:css', 'chmod:build'],
},
js: {
files: 'src/js/**/*.js',
tasks: ['concat:js_all', 'chmod:build'],
},
html: {
files: 'src/html/**/*.html',
tasks: ['copy:html_dev', 'chmod:build'],
},
static: {
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'],
},
},
});
};

View File

@ -17,250 +17,250 @@
* @constant
* @type {CatConf[]}
*/
var Categories = [
{
name: "Favourites",
ops: []
},
{
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",
]
},
{
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",
]
},
{
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",
]
},
{
name: "Logical operations",
ops: [
"XOR",
"XOR Brute Force",
"OR",
"NOT",
"AND",
"ADD",
"SUB",
"Rotate left",
"Rotate right",
"ROT13",
]
},
{
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",
]
},
{
name: "Language",
ops: [
"Text encoding",
"Unescape Unicode Characters",
]
},
{
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",
]
},
{
name: "Date / Time",
ops: [
"Parse DateTime",
"Translate DateTime Format",
"From UNIX Timestamp",
"To UNIX Timestamp",
"Extract dates",
]
},
{
name: "Extractors",
ops: [
"Strings",
"Extract IP addresses",
"Extract email addresses",
"Extract MAC addresses",
"Extract URLs",
"Extract domains",
"Extract file paths",
"Extract dates",
"Regular expression",
]
},
{
name: "Compression",
ops: [
"Raw Deflate",
"Raw Inflate",
"Zlib Deflate",
"Zlib Inflate",
"Gzip",
"Gunzip",
"Zip",
"Unzip",
"Bzip2 Decompress",
]
},
{
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",
]
},
{
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",
]
},
{
name: "Other",
ops: [
"Entropy",
"Frequency distribution",
"Detect File Type",
"Scan for Embedded Files",
"Generate UUID",
"Numberwang",
]
},
{
name: "Flow control",
ops: [
"Fork",
"Merge",
"Jump",
"Conditional Jump",
"Return",
]
},
const Categories = [
{
name: 'Favourites',
ops: [],
},
{
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',
],
},
{
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',
],
},
{
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',
],
},
{
name: 'Logical operations',
ops: [
'XOR',
'XOR Brute Force',
'OR',
'NOT',
'AND',
'ADD',
'SUB',
'Rotate left',
'Rotate right',
'ROT13',
],
},
{
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',
],
},
{
name: 'Language',
ops: [
'Text encoding',
'Unescape Unicode Characters',
],
},
{
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',
],
},
{
name: 'Date / Time',
ops: [
'Parse DateTime',
'Translate DateTime Format',
'From UNIX Timestamp',
'To UNIX Timestamp',
'Extract dates',
],
},
{
name: 'Extractors',
ops: [
'Strings',
'Extract IP addresses',
'Extract email addresses',
'Extract MAC addresses',
'Extract URLs',
'Extract domains',
'Extract file paths',
'Extract dates',
'Regular expression',
],
},
{
name: 'Compression',
ops: [
'Raw Deflate',
'Raw Inflate',
'Zlib Deflate',
'Zlib Inflate',
'Gzip',
'Gunzip',
'Zip',
'Unzip',
'Bzip2 Decompress',
],
},
{
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',
],
},
{
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',
],
},
{
name: 'Other',
ops: [
'Entropy',
'Frequency distribution',
'Detect File Type',
'Scan for Embedded Files',
'Generate UUID',
'Numberwang',
],
},
{
name: 'Flow control',
ops: [
'Fork',
'Merge',
'Jump',
'Conditional Jump',
'Return',
],
},
];

File diff suppressed because it is too large Load Diff

View File

@ -7,8 +7,8 @@
*
* @class
*/
var Chef = function() {
this.dish = new Dish();
const Chef = function () {
this.dish = new Dish();
};
@ -30,62 +30,62 @@ 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(),
recipe = new Recipe(recipe_config),
contains_fc = recipe.contains_flow_control(),
error = false;
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")) {
options.attempt_highlight = true;
}
if (contains_fc) options.attempt_highlight = false;
if (options.hasOwnProperty('attempt_highlight')) {
options.attempt_highlight = true;
}
if (contains_fc) options.attempt_highlight = false;
// Clean up progress
if (progress >= recipe_config.length) {
progress = 0;
}
if (step) {
if (progress >= recipe_config.length) {
progress = 0;
}
if (step) {
// Unset breakpoint on this step
recipe.set_breakpoint(progress, false);
recipe.set_breakpoint(progress, false);
// Set breakpoint on next step
recipe.set_breakpoint(progress + 1, true);
}
recipe.set_breakpoint(progress + 1, true);
}
// If stepping with flow control, we have to start from the beginning
// but still want to skip all previous breakpoints
if (progress > 0 && contains_fc) {
recipe.remove_breaks_up_to(progress);
progress = 0;
}
// If starting from scratch, load data
if (progress === 0) {
this.dish.set(input_text, Dish.STRING);
}
if (progress > 0 && contains_fc) {
recipe.remove_breaks_up_to(progress);
progress = 0;
}
try {
progress = recipe.execute(this.dish, progress);
} catch (err) {
// If starting from scratch, load data
if (progress === 0) {
this.dish.set(input_text, Dish.STRING);
}
try {
progress = recipe.execute(this.dish, progress);
} catch (err) {
// We can't throw the error from here as we will return in the finally block and ignore it
// so we return the error in the result instead.
error = err;
progress = err.progress;
} finally {
return {
result: this.dish.type == Dish.HTML ?
error = err;
progress = err.progress;
} finally {
return {
result: this.dish.type == Dish.HTML ?
this.dish.get(Dish.HTML) :
this.dish.get(Dish.STRING),
type: Dish.enum_lookup(this.dish.type),
progress: progress,
options: options,
duration: new Date().getTime() - start_time,
error: error
};
}
type: Dish.enum_lookup(this.dish.type),
progress,
options,
duration: new Date().getTime() - start_time,
error,
};
}
};
@ -94,27 +94,27 @@ Chef.prototype.bake = function(input_text, recipe_config, options, progress, ste
* it swaps out the memory for that tab. If the CyberChef tab has been unfocused for more than a
* minute, we run a silent bake which will force the browser to load and cache all the relevant
* JavaScript code needed to do a real bake.
*
*
* 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.
*
*
* The output will not be modified (hence "silent" bake).
*
*
* This will only actually execute the recipe if auto-bake is enabled, otherwise it will just load
* the recipe, ingredients and dish.
*
* @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(),
recipe = new Recipe(recipe_config),
dish = new Dish("", Dish.STRING);
try {
recipe.execute(dish);
} catch(err) {
Chef.prototype.silent_bake = function (recipe_config) {
let start_time = new Date().getTime(),
recipe = new Recipe(recipe_config),
dish = new Dish('', Dish.STRING);
try {
recipe.execute(dish);
} catch (err) {
// Suppress all errors
}
return new Date().getTime() - start_time;
}
return new Date().getTime() - start_time;
};

View File

@ -9,9 +9,9 @@
* @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;
this.type = type || Dish.BYTE_ARRAY;
const Dish = function (value, type) {
this.value = value || typeof value === 'string' ? value : null;
this.type = type || Dish.BYTE_ARRAY;
};
@ -48,23 +48,23 @@ 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) {
switch (type_str) {
case "byte_array":
case "Byte array":
return Dish.BYTE_ARRAY;
case "string":
case "String":
return Dish.STRING;
case "number":
case "Number":
return Dish.NUMBER;
case "html":
case "HTML":
return Dish.HTML;
default:
throw "Invalid data type string. No matching enum.";
}
Dish.type_enum = function (type_str) {
switch (type_str) {
case 'byte_array':
case 'Byte array':
return Dish.BYTE_ARRAY;
case 'string':
case 'String':
return Dish.STRING;
case 'number':
case 'Number':
return Dish.NUMBER;
case 'html':
case 'HTML':
return Dish.HTML;
default:
throw 'Invalid data type string. No matching enum.';
}
};
@ -75,19 +75,19 @@ 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) {
switch (type_enum) {
case Dish.BYTE_ARRAY:
return "byte_array";
case Dish.STRING:
return "string";
case Dish.NUMBER:
return "number";
case Dish.HTML:
return "html";
default:
throw "Invalid data type enum. No matching type.";
}
Dish.enum_lookup = function (type_enum) {
switch (type_enum) {
case Dish.BYTE_ARRAY:
return 'byte_array';
case Dish.STRING:
return 'string';
case Dish.NUMBER:
return 'number';
case Dish.HTML:
return 'html';
default:
throw 'Invalid data type enum. No matching type.';
}
};
@ -97,14 +97,14 @@ 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) {
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;
}
Dish.prototype.set = function (value, type) {
this.value = value;
this.type = type;
if (!this.valid()) {
const sample = Utils.truncate(JSON.stringify(this.value), 13);
throw `Data is not a valid ${Dish.enum_lookup(type)}: ${sample}`;
}
};
@ -114,11 +114,11 @@ 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) {
if (this.type != type) {
this.translate(type);
}
return this.value;
Dish.prototype.get = function (type) {
if (this.type != type) {
this.translate(type);
}
return this.value;
};
@ -127,39 +127,39 @@ 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:
this.value = this.value ? Utils.str_to_byte_array(this.value) : [];
this.type = Dish.BYTE_ARRAY;
break;
case Dish.NUMBER:
this.value = typeof this.value == "number" ? Utils.str_to_byte_array(this.value.toString()) : [];
this.type = Dish.BYTE_ARRAY;
break;
case Dish.HTML:
this.value = this.value ? Utils.str_to_byte_array(Utils.strip_html_tags(this.value, true)) : [];
this.type = Dish.BYTE_ARRAY;
break;
default:
break;
}
switch (this.type) {
case Dish.STRING:
this.value = this.value ? Utils.str_to_byte_array(this.value) : [];
this.type = Dish.BYTE_ARRAY;
break;
case Dish.NUMBER:
this.value = typeof this.value === 'number' ? Utils.str_to_byte_array(this.value.toString()) : [];
this.type = Dish.BYTE_ARRAY;
break;
case Dish.HTML:
this.value = this.value ? Utils.str_to_byte_array(Utils.strip_html_tags(this.value, true)) : [];
this.type = Dish.BYTE_ARRAY;
break;
default:
break;
}
// Convert from byte_array to to_type
switch (to_type) {
case Dish.STRING:
case Dish.HTML:
this.value = this.value ? Utils.byte_array_to_utf8(this.value) : "";
this.type = Dish.STRING;
break;
case Dish.NUMBER:
this.value = this.value ? parseFloat(Utils.byte_array_to_utf8(this.value)) : 0;
this.type = Dish.NUMBER;
break;
default:
break;
}
switch (to_type) {
case Dish.STRING:
case Dish.HTML:
this.value = this.value ? Utils.byte_array_to_utf8(this.value) : '';
this.type = Dish.STRING;
break;
case Dish.NUMBER:
this.value = this.value ? parseFloat(Utils.byte_array_to_utf8(this.value)) : 0;
this.type = Dish.NUMBER;
break;
default:
break;
}
};
@ -169,34 +169,34 @@ Dish.prototype.translate = function(to_type) {
*
* @returns {boolean} Whether the data is valid or not.
*/
Dish.prototype.valid = function() {
switch (this.type) {
case Dish.BYTE_ARRAY:
if (!(this.value instanceof Array)) {
return false;
}
Dish.prototype.valid = function () {
switch (this.type) {
case Dish.BYTE_ARRAY:
if (!(this.value instanceof Array)) {
return false;
}
// 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;
}
}
return true;
case Dish.STRING:
case Dish.HTML:
if (typeof this.value == "string") {
return true;
}
return false;
case Dish.NUMBER:
if (typeof this.value == "number") {
return true;
}
return false;
default:
return false;
}
return false;
}
}
return true;
case Dish.STRING:
case Dish.HTML:
if (typeof this.value === 'string') {
return true;
}
return false;
case Dish.NUMBER:
if (typeof this.value === 'number') {
return true;
}
return false;
default:
return false;
}
};

View File

@ -7,19 +7,19 @@
*
* @namespace
*/
var FlowControl = {
const FlowControl = {
/**
* @constant
* @default
*/
FORK_DELIM: "\\n",
FORK_DELIM: '\\n',
/**
* @constant
* @default
*/
MERGE_DELIM: "\\n",
MERGE_DELIM: '\\n',
/**
* Fork operation.
*
@ -29,49 +29,50 @@ 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,
input_type = op_list[state.progress].input_type,
output_type = op_list[state.progress].output_type,
input = state.dish.get(input_type),
ings = op_list[state.progress].get_ing_values(),
split_delim = ings[0],
merge_delim = ings[1],
sub_op_list = [],
inputs = [];
if (input)
inputs = input.split(split_delim);
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),
ings = op_list[state.progress].get_ing_values(),
split_delim = ings[0],
merge_delim = ings[1],
sub_op_list = [],
inputs = [];
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()) {
break;
} else {
sub_op_list.push(op_list[i]);
}
}
var recipe = new Recipe(),
output = "",
progress;
recipe.add_operations(sub_op_list);
for (var i = state.progress + 1; i < op_list.length; i++) {
if (op_list[i].name == 'Merge' && !op_list[i].is_disabled()) {
break;
} else {
sub_op_list.push(op_list[i]);
}
}
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);
progress = recipe.execute(dish, 0);
output += dish.get(output_type) + merge_delim;
}
state.dish.set(output, output_type);
state.progress += progress;
return state;
},
for (i = 0; i < inputs.length; i++) {
const dish = new Dish(inputs[i], input_type);
progress = recipe.execute(dish, 0);
output += dish.get(output_type) + merge_delim;
}
state.dish.set(output, output_type);
state.progress += progress;
return state;
},
/**
* Merge operation.
*
@ -81,24 +82,24 @@ 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;
},
return state;
},
/**
* @constant
* @default
*/
JUMP_NUM: 0,
JUMP_NUM: 0,
/**
* @constant
* @default
*/
MAX_JUMPS: 10,
MAX_JUMPS: 10,
/**
* Jump operation.
*
@ -109,21 +110,21 @@ 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(),
jump_num = ings[0],
max_jumps = ings[1];
if (state.num_jumps >= max_jumps) {
throw "Reached maximum jumps, sorry!";
}
state.progress += jump_num;
state.num_jumps++;
return state;
},
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!';
}
state.progress += jump_num;
state.num_jumps++;
return state;
},
/**
* Conditional Jump operation.
*
@ -134,26 +135,26 @@ 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(),
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!";
}
if (regex_str !== "" && dish.get(Dish.STRING).search(regex_str) > -1) {
state.progress += jump_num;
state.num_jumps++;
}
return state;
},
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!';
}
if (regex_str !== '' && dish.get(Dish.STRING).search(regex_str) > -1) {
state.progress += jump_num;
state.num_jumps++;
}
return state;
},
/**
* Return operation.
*
@ -163,9 +164,9 @@ 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) {
state.progress = state.op_list.length;
return state;
},
run_return(state) {
state.progress = state.op_list.length;
return state;
},
};

View File

@ -8,14 +8,14 @@
* @class
* @param {Object} ingredient_config
*/
var Ingredient = function(ingredient_config) {
this.name = "";
this.type = "";
this.value = null;
if (ingredient_config) {
this._parse_config(ingredient_config);
}
const Ingredient = function (ingredient_config) {
this.name = '';
this.type = '';
this.value = null;
if (ingredient_config) {
this._parse_config(ingredient_config);
}
};
@ -25,9 +25,9 @@ var Ingredient = function(ingredient_config) {
* @private
* @param {Object} ingredient_config
*/
Ingredient.prototype._parse_config = function(ingredient_config) {
this.name = ingredient_config.name;
this.type = ingredient_config.type;
Ingredient.prototype._parse_config = function (ingredient_config) {
this.name = ingredient_config.name;
this.type = ingredient_config.type;
};
@ -36,8 +36,8 @@ Ingredient.prototype._parse_config = function(ingredient_config) {
*
* @returns {*}
*/
Ingredient.prototype.get_config = function() {
return this.value;
Ingredient.prototype.get_config = function () {
return this.value;
};
@ -46,8 +46,8 @@ Ingredient.prototype.get_config = function() {
*
* @param {*} value
*/
Ingredient.prototype.set_value = function(value) {
this.value = Ingredient.prepare(value, this.type);
Ingredient.prototype.set_value = function (value) {
this.value = Ingredient.prepare(value, this.type);
};
@ -59,28 +59,28 @@ Ingredient.prototype.set_value = function(value) {
* @param {*} data
* @param {string} type - The name of the data type.
*/
Ingredient.prepare = function(data, type) {
switch (type) {
case "binary_string":
case "binary_short_string":
case "editable_option":
return Utils.parse_escaped_chars(data);
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":
var number = parseFloat(data);
if (isNaN(number)) {
var sample = Utils.truncate(data.toString(), 10);
throw "Invalid ingredient value. Not a number: " + sample;
}
return number;
default:
return data;
}
Ingredient.prepare = function (data, type) {
switch (type) {
case 'binary_string':
case 'binary_short_string':
case 'editable_option':
return Utils.parse_escaped_chars(data);
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':
var number = parseFloat(data);
if (isNaN(number)) {
const sample = Utils.truncate(data.toString(), 10);
throw `Invalid ingredient value. Not a number: ${sample}`;
}
return number;
default:
return data;
}
};

View File

@ -9,21 +9,21 @@
* @param {string} operation_name
* @param {Object} operation_config
*/
var Operation = function(operation_name, operation_config) {
this.name = operation_name;
this.description = "";
this.input_type = -1;
this.output_type = -1;
this.run = null;
this.highlight = null;
this.highlight_reverse = null;
this.breakpoint = false;
this.disabled = false;
this.ing_list = [];
if (operation_config) {
this._parse_config(operation_config);
}
const Operation = function (operation_name, operation_config) {
this.name = operation_name;
this.description = '';
this.input_type = -1;
this.output_type = -1;
this.run = null;
this.highlight = null;
this.highlight_reverse = null;
this.breakpoint = false;
this.disabled = false;
this.ing_list = [];
if (operation_config) {
this._parse_config(operation_config);
}
};
@ -33,20 +33,20 @@ var Operation = function(operation_name, operation_config) {
* @private
* @param {Object} 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);
this.run = operation_config.run;
this.highlight = operation_config.highlight;
this.highlight_reverse = operation_config.highlight_reverse;
this.flow_control = operation_config.flow_control;
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);
this.run = operation_config.run;
this.highlight = operation_config.highlight;
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);
this.add_ingredient(ingredient);
}
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,19 +55,19 @@ Operation.prototype._parse_config = function(operation_config) {
*
* @returns {Object}
*/
Operation.prototype.get_config = function() {
var ingredient_config = [];
for (var 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
};
return operation_config;
Operation.prototype.get_config = function () {
const ingredient_config = [];
for (let o = 0; o < this.ing_list.length; o++) {
ingredient_config.push(this.ing_list[o].get_config());
}
const operation_config = {
op: this.name,
args: ingredient_config,
};
return operation_config;
};
@ -76,8 +76,8 @@ Operation.prototype.get_config = function() {
*
* @param {Ingredient} ingredient
*/
Operation.prototype.add_ingredient = function(ingredient) {
this.ing_list.push(ingredient);
Operation.prototype.add_ingredient = function (ingredient) {
this.ing_list.push(ingredient);
};
@ -86,10 +86,10 @@ 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++) {
this.ing_list[i].set_value(ing_values[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,12 +98,12 @@ 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++) {
ing_values.push(this.ing_list[i].value);
}
return ing_values;
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,8 +112,8 @@ Operation.prototype.get_ing_values = function() {
*
* @param {boolean} value
*/
Operation.prototype.set_breakpoint = function(value) {
this.breakpoint = !!value;
Operation.prototype.set_breakpoint = function (value) {
this.breakpoint = !!value;
};
@ -122,8 +122,8 @@ Operation.prototype.set_breakpoint = function(value) {
*
* @returns {boolean}
*/
Operation.prototype.is_breakpoint = function() {
return this.breakpoint;
Operation.prototype.is_breakpoint = function () {
return this.breakpoint;
};
@ -132,8 +132,8 @@ Operation.prototype.is_breakpoint = function() {
*
* @param {boolean} value
*/
Operation.prototype.set_disabled = function(value) {
this.disabled = !!value;
Operation.prototype.set_disabled = function (value) {
this.disabled = !!value;
};
@ -142,8 +142,8 @@ Operation.prototype.set_disabled = function(value) {
*
* @returns {boolean}
*/
Operation.prototype.is_disabled = function() {
return this.disabled;
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() {
return this.flow_control;
Operation.prototype.is_flow_control = function () {
return this.flow_control;
};

View File

@ -8,12 +8,12 @@
* @class
* @param {Object} recipe_config
*/
var Recipe = function(recipe_config) {
this.op_list = [];
if (recipe_config) {
this._parse_config(recipe_config);
}
const Recipe = function (recipe_config) {
this.op_list = [];
if (recipe_config) {
this._parse_config(recipe_config);
}
};
@ -23,16 +23,16 @@ 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);
operation.set_ing_values(recipe_config[c].args);
operation.set_breakpoint(recipe_config[c].breakpoint);
operation.set_disabled(recipe_config[c].disabled);
this.add_operation(operation);
}
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);
this.add_operation(operation);
}
};
@ -41,14 +41,14 @@ Recipe.prototype._parse_config = function(recipe_config) {
*
* @returns {*}
*/
Recipe.prototype.get_config = function() {
var recipe_config = [];
for (var o = 0; o < this.op_list.length; o++) {
recipe_config.push(this.op_list[o].get_config());
}
return recipe_config;
Recipe.prototype.get_config = function () {
const recipe_config = [];
for (let o = 0; o < this.op_list.length; o++) {
recipe_config.push(this.op_list[o].get_config());
}
return recipe_config;
};
@ -57,8 +57,8 @@ Recipe.prototype.get_config = function() {
*
* @param {Operation} operation
*/
Recipe.prototype.add_operation = function(operation) {
this.op_list.push(operation);
Recipe.prototype.add_operation = function (operation) {
this.op_list.push(operation);
};
@ -67,8 +67,8 @@ Recipe.prototype.add_operation = function(operation) {
*
* @param {Operation[]} operations
*/
Recipe.prototype.add_operations = function(operations) {
this.op_list = this.op_list.concat(operations);
Recipe.prototype.add_operations = function (operations) {
this.op_list = this.op_list.concat(operations);
};
@ -78,12 +78,12 @@ Recipe.prototype.add_operations = function(operations) {
* @param {number} position - The index of the Operation
* @param {boolean} value
*/
Recipe.prototype.set_breakpoint = function(position, value) {
try {
this.op_list[position].set_breakpoint(value);
} catch (err) {
Recipe.prototype.set_breakpoint = function (position, value) {
try {
this.op_list[position].set_breakpoint(value);
} catch (err) {
// Ignore index error
}
}
};
@ -93,10 +93,10 @@ 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++) {
this.op_list[i].set_breakpoint(false);
}
Recipe.prototype.remove_breaks_up_to = function (pos) {
for (let i = 0; i < pos; i++) {
this.op_list[i].set_breakpoint(false);
}
};
@ -105,11 +105,11 @@ 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++) {
if (this.op_list[i].is_flow_control()) return true;
}
return false;
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,
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;
}
return i-1;
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;
}
return i - 1;
};
@ -141,56 +141,59 @@ 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) {
start_from = start_from || 0;
var op, input, output, num_jumps = 0;
for (var i = start_from; i < this.op_list.length; i++) {
op = this.op_list[i];
if (op.is_disabled()) {
continue;
}
if (op.is_breakpoint()) {
return i;
}
try {
input = dish.get(op.input_type);
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
};
state = op.run(state);
i = state.progress;
num_jumps = state.num_jumps;
} else {
output = op.run(input, op.get_ing_values());
dish.set(output, op.output_type);
}
} catch (err) {
var e = typeof err == "string" ? { message: err } : err;
Recipe.prototype.execute = function (dish, start_from) {
start_from = start_from || 0;
let op,
input,
output,
num_jumps = 0;
e.progress = i;
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;
} else {
e.display_str += e.message;
}
throw e;
}
for (let i = start_from; i < this.op_list.length; i++) {
op = this.op_list[i];
if (op.is_disabled()) {
continue;
}
return this.op_list.length;
if (op.is_breakpoint()) {
return i;
}
try {
input = dish.get(op.input_type);
if (op.is_flow_control()) {
// Package up the current state
let state = {
progress: i,
dish,
op_list: this.op_list,
num_jumps,
};
state = op.run(state);
i = state.progress;
num_jumps = state.num_jumps;
} else {
output = op.run(input, op.get_ing_values());
dish.set(output, op.output_type);
}
} catch (err) {
const e = typeof err === 'string' ? { message: err } : err;
e.progress = i;
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}`;
} else {
e.display_str += e.message;
}
throw e;
}
}
return this.op_list.length;
};
@ -199,8 +202,8 @@ Recipe.prototype.execute = function(dish, start_from) {
*
* @returns {string}
*/
Recipe.prototype.to_string = function() {
return JSON.stringify(this.get_config());
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);
this._parse_config(recipe_config);
Recipe.prototype.from_string = function (recipe_str) {
const recipe_config = JSON.parse(recipe_str);
this._parse_config(recipe_config);
};

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -7,31 +7,31 @@
*
* @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+/="},
],
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+/=' },
],
/**
* To Base64 operation.
@ -40,18 +40,18 @@ var Base64 = {
* @param {Object[]} args
* @returns {string}
*/
run_to: function(input, args) {
var alphabet = args[0] || Base64.ALPHABET;
return Utils.to_base64(input, alphabet);
},
run_to(input, args) {
const alphabet = args[0] || Base64.ALPHABET;
return Utils.to_base64(input, alphabet);
},
/**
* @constant
* @default
*/
REMOVE_NON_ALPH_CHARS: true,
REMOVE_NON_ALPH_CHARS: true,
/**
* From Base64 operation.
*
@ -59,20 +59,20 @@ var Base64 = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_from: function(input, args) {
var alphabet = args[0] || Base64.ALPHABET,
remove_non_alph_chars = args[1];
return Utils.from_base64(input, alphabet, "byte_array", remove_non_alph_chars);
},
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);
},
/**
* @constant
* @default
*/
BASE32_ALPHABET: "A-Z2-7=",
BASE32_ALPHABET: 'A-Z2-7=',
/**
* To Base32 operation.
*
@ -80,51 +80,62 @@ var Base64 = {
* @param {Object[]} args
* @returns {string}
*/
run_to_32: function(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,
i = 0;
run_to_32(input, args) {
if (!input) return '';
while (i < input.length) {
chr1 = input[i++];
chr2 = input[i++];
chr3 = input[i++];
chr4 = input[i++];
chr5 = input[i++];
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;
enc1 = chr1 >> 3;
enc2 = ((chr1 & 7) << 2) | (chr2 >> 6);
enc3 = (chr2 >> 1) & 31;
enc4 = ((chr2 & 1) << 4) | (chr3 >> 4);
enc5 = ((chr3 & 15) << 1) | (chr4 >> 7);
enc6 = (chr4 >> 2) & 63;
enc7 = ((chr4 & 3) << 3) | (chr5 >> 5);
enc8 = chr5 & 31;
while (i < input.length) {
chr1 = input[i++];
chr2 = input[i++];
chr3 = input[i++];
chr4 = input[i++];
chr5 = input[i++];
if (isNaN(chr2)) {
enc3 = enc4 = enc5 = enc6 = enc7 = enc8 = 32;
} else if (isNaN(chr3)) {
enc5 = enc6 = enc7 = enc8 = 32;
} else if (isNaN(chr4)) {
enc6 = enc7 = enc8 = 32;
} else if (isNaN(chr5)) {
enc8 = 32;
}
output += alphabet.charAt(enc1) + alphabet.charAt(enc2) + alphabet.charAt(enc3) +
enc1 = chr1 >> 3;
enc2 = ((chr1 & 7) << 2) | (chr2 >> 6);
enc3 = (chr2 >> 1) & 31;
enc4 = ((chr2 & 1) << 4) | (chr3 >> 4);
enc5 = ((chr3 & 15) << 1) | (chr4 >> 7);
enc6 = (chr4 >> 2) & 63;
enc7 = ((chr4 & 3) << 3) | (chr5 >> 5);
enc8 = chr5 & 31;
if (isNaN(chr2)) {
enc3 = enc4 = enc5 = enc6 = enc7 = enc8 = 32;
} else if (isNaN(chr3)) {
enc5 = enc6 = enc7 = enc8 = 32;
} else if (isNaN(chr4)) {
enc6 = enc7 = enc8 = 32;
} else if (isNaN(chr5)) {
enc8 = 32;
}
output += alphabet.charAt(enc1) + alphabet.charAt(enc2) + alphabet.charAt(enc3) +
alphabet.charAt(enc4) + alphabet.charAt(enc5) + alphabet.charAt(enc6) +
alphabet.charAt(enc7) + alphabet.charAt(enc8);
}
return output;
},
}
return output;
},
/**
* From Base32 operation.
*
@ -132,61 +143,72 @@ var Base64 = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_from_32: function(input, args) {
if (!input) return [];
var 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,
i = 0;
if (remove_non_alph_chars) {
var re = new RegExp("[^" + alphabet.replace(/[\]\\\-^]/g, "\\$&") + "]", "g");
input = input.replace(re, "");
}
run_from_32(input, args) {
if (!input) return [];
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++) || "=");
let alphabet = args[0] ?
Utils.expand_alph_range(args[0]).join('') : 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=',
remove_non_alph_chars = args[0];
let output = [],
chr1,
chr2,
chr3,
chr4,
chr5,
enc1,
enc2,
enc3,
enc4,
enc5,
enc6,
enc7,
enc8,
i = 0;
if (remove_non_alph_chars) {
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++) || '=');
chr1 = (enc1 << 3) | (enc2 >> 2);
chr2 = ((enc2 & 3) << 6) | (enc3 << 1) | (enc4 >> 4);
chr3 = ((enc4 & 15) << 4) | (enc5 >> 1);
chr4 = ((enc5 & 1) << 7) | (enc6 << 2) | (enc7 >> 3);
chr5 = ((enc7 & 7) << 5) | enc8;
output.push(chr1);
if (enc2 & 3 !== 0 || enc3 !== 32) output.push(chr2);
if (enc4 & 15 !== 0 || enc5 !== 32) output.push(chr3);
if (enc5 & 1 !== 0 || enc6 !== 32) output.push(chr4);
if (enc7 & 7 !== 0 || enc8 !== 32) output.push(chr5);
}
return output;
},
chr1 = (enc1 << 3) | (enc2 >> 2);
chr2 = ((enc2 & 3) << 6) | (enc3 << 1) | (enc4 >> 4);
chr3 = ((enc4 & 15) << 4) | (enc5 >> 1);
chr4 = ((enc5 & 1) << 7) | (enc6 << 2) | (enc7 >> 3);
chr5 = ((enc7 & 7) << 5) | enc8;
output.push(chr1);
if (enc2 & 3 !== 0 || enc3 !== 32) output.push(chr2);
if (enc4 & 15 !== 0 || enc5 !== 32) output.push(chr3);
if (enc5 & 1 !== 0 || enc6 !== 32) output.push(chr4);
if (enc7 & 7 !== 0 || enc8 !== 32) output.push(chr5);
}
return output;
},
/**
* @constant
* @default
*/
SHOW_IN_BINARY: false,
SHOW_IN_BINARY: false,
/**
* @constant
* @default
*/
OFFSETS_SHOW_VARIABLE: true,
OFFSETS_SHOW_VARIABLE: true,
/**
* Show Base64 offsets operation.
*
@ -194,120 +216,120 @@ var Base64 = {
* @param {Object[]} args
* @returns {html}
*/
run_offsets: function(input, args) {
var 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("="),
script = "<script type='application/javascript'>$('[data-toggle=\"tooltip\"]').tooltip()</script>",
static_section = "",
padding = "";
if (input.length < 1) {
return "Please enter a string.";
}
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('='),
script = "<script type='application/javascript'>$('[data-toggle=\"tooltip\"]').tooltip()</script>",
static_section = '',
padding = '';
if (input.length < 1) {
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>";
} 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>";
} else {
static_section = offset0;
offset0 = "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.from_base64(static_section, alphabet) + "'>" +
static_section + "</span>";
}
if (!show_variable) {
offset0 = static_section;
}
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>`;
} 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>`;
} else {
static_section = offset0;
offset0 = `<span data-toggle='tooltip' data-placement='top' title='${
Utils.from_base64(static_section, alphabet)}'>${
static_section}</span>`;
}
if (!show_variable) {
offset0 = static_section;
}
// Highlight offset 1
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>";
} 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>";
} 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>";
}
if (!show_variable) {
offset1 = static_section;
}
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>`;
} 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>`;
} 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>`;
}
if (!show_variable) {
offset1 = static_section;
}
// Highlight offset 2
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>";
} 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>";
} 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>";
}
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." +
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>`;
} 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>`;
} 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>`;
}
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." +
"\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}`);
},
/**
* Highlight to Base64
*
@ -317,12 +339,12 @@ var Base64 = {
* @param {Object[]} args
* @returns {Object[]} pos
*/
highlight_to: function(pos, args) {
pos[0].start = Math.floor(pos[0].start / 3 * 4);
pos[0].end = Math.ceil(pos[0].end / 3 * 4);
return pos;
},
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;
},
/**
* Highlight from Base64
*
@ -332,10 +354,10 @@ var Base64 = {
* @param {Object[]} args
* @returns {Object[]} pos
*/
highlight_from: function(pos, args) {
pos[0].start = Math.ceil(pos[0].start / 4 * 3);
pos[0].end = Math.floor(pos[0].end / 4 * 3);
return pos;
},
highlight_from(pos, args) {
pos[0].start = Math.ceil(pos[0].start / 4 * 3);
pos[0].end = Math.floor(pos[0].end / 4 * 3);
return pos;
},
};

View File

@ -9,7 +9,7 @@
*
* @namespace
*/
var BitwiseOp = {
const BitwiseOp = {
/**
* Runs bitwise operations across the input data.
@ -22,43 +22,43 @@ var BitwiseOp = {
* @param {boolean} differential
* @returns {byte_array}
*/
_bit_op: function (input, key, func, null_preserving, differential) {
if (!key || !key.length) key = [0];
var result = [],
x = null,
k = null,
o = null;
for (var 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);
result.push(x);
if (differential && !(null_preserving && (o === 0 || o == k))) {
key[i % key.length] = x;
}
}
return result;
},
_bit_op(input, key, func, null_preserving, differential) {
if (!key || !key.length) key = [0];
let result = [],
x = null,
k = null,
o = null;
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);
result.push(x);
if (differential && !(null_preserving && (o === 0 || o == k))) {
key[i % key.length] = x;
}
}
return result;
},
/**
* @constant
* @default
*/
XOR_PRESERVE_NULLS: false,
XOR_PRESERVE_NULLS: false,
/**
* @constant
* @default
*/
XOR_DIFFERENTIAL: false,
XOR_DIFFERENTIAL: false,
/**
* @constant
* @default
*/
KEY_FORMAT: ["Hex", "Base64", "UTF8", "UTF16", "UTF16LE", "UTF16BE", "Latin1"],
KEY_FORMAT: ['Hex', 'Base64', 'UTF8', 'UTF16', 'UTF16LE', 'UTF16BE', 'Latin1'],
/**
* XOR operation.
*
@ -66,43 +66,43 @@ var BitwiseOp = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_xor: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || ""),
null_preserving = args[1],
differential = args[2];
key = Utils.word_array_to_byte_array(key);
return BitwiseOp._bit_op(input, key, BitwiseOp._xor, null_preserving, differential);
},
run_xor(input, args) {
let key = Utils.format[args[0].option].parse(args[0].string || ''),
null_preserving = args[1],
differential = args[2];
key = Utils.word_array_to_byte_array(key);
return BitwiseOp._bit_op(input, key, BitwiseOp._xor, null_preserving, differential);
},
/**
* @constant
* @default
*/
XOR_BRUTE_KEY_LENGTH: ["1", "2"],
XOR_BRUTE_KEY_LENGTH: ['1', '2'],
/**
* @constant
* @default
*/
XOR_BRUTE_SAMPLE_LENGTH: 100,
XOR_BRUTE_SAMPLE_LENGTH: 100,
/**
* @constant
* @default
*/
XOR_BRUTE_SAMPLE_OFFSET: 0,
XOR_BRUTE_SAMPLE_OFFSET: 0,
/**
* @constant
* @default
*/
XOR_BRUTE_PRINT_KEY: true,
XOR_BRUTE_PRINT_KEY: true,
/**
* @constant
* @default
*/
XOR_BRUTE_OUTPUT_HEX: false,
XOR_BRUTE_OUTPUT_HEX: false,
/**
* XOR Brute Force operation.
*
@ -110,43 +110,44 @@ var BitwiseOp = {
* @param {Object[]} args
* @returns {string}
*/
run_xor_brute: function (input, args) {
var key_length = parseInt(args[0], 10),
sample_length = args[1],
sample_offset = args[2],
null_preserving = args[3],
differential = args[4],
crib = args[5],
print_key = args[6],
output_hex = args[7],
regex;
var output = "",
result,
result_utf8;
input = input.slice(sample_offset, sample_offset + sample_length);
if (crib !== "") {
regex = new RegExp(crib, "im");
}
for (var 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";
}
return output;
},
run_xor_brute(input, args) {
let key_length = parseInt(args[0], 10),
sample_length = args[1],
sample_offset = args[2],
null_preserving = args[3],
differential = args[4],
crib = args[5],
print_key = args[6],
output_hex = args[7],
regex;
let output = '',
result,
result_utf8;
input = input.slice(sample_offset, sample_offset + sample_length);
if (crib !== '') {
regex = new RegExp(crib, 'im');
}
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';
}
return output;
},
/**
* NOT operation.
*
@ -154,11 +155,11 @@ var BitwiseOp = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_not: function (input, args) {
return BitwiseOp._bit_op(input, null, BitwiseOp._not);
},
run_not(input, args) {
return BitwiseOp._bit_op(input, null, BitwiseOp._not);
},
/**
* AND operation.
*
@ -166,14 +167,14 @@ var BitwiseOp = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_and: function (input, args) {
var 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);
},
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);
},
/**
* OR operation.
*
@ -181,14 +182,14 @@ var BitwiseOp = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_or: function (input, args) {
var 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);
},
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);
},
/**
* ADD operation.
*
@ -196,14 +197,14 @@ var BitwiseOp = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_add: function (input, args) {
var 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);
},
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);
},
/**
* SUB operation.
*
@ -211,14 +212,14 @@ var BitwiseOp = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_sub: function (input, args) {
var 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);
},
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);
},
/**
* XOR bitwise calculation.
*
@ -227,11 +228,11 @@ var BitwiseOp = {
* @param {number} key
* @returns {number}
*/
_xor: function (operand, key) {
return operand ^ key;
},
_xor(operand, key) {
return operand ^ key;
},
/**
* NOT bitwise calculation.
*
@ -239,11 +240,11 @@ var BitwiseOp = {
* @param {number} operand
* @returns {number}
*/
_not: function (operand, _) {
return ~operand & 0xff;
},
_not(operand, _) {
return ~operand & 0xff;
},
/**
* AND bitwise calculation.
*
@ -252,11 +253,11 @@ var BitwiseOp = {
* @param {number} key
* @returns {number}
*/
_and: function (operand, key) {
return operand & key;
},
_and(operand, key) {
return operand & key;
},
/**
* OR bitwise calculation.
*
@ -265,11 +266,11 @@ var BitwiseOp = {
* @param {number} key
* @returns {number}
*/
_or: function (operand, key) {
return operand | key;
},
_or(operand, key) {
return operand | key;
},
/**
* ADD bitwise calculation.
*
@ -278,11 +279,11 @@ var BitwiseOp = {
* @param {number} key
* @returns {number}
*/
_add: function (operand, key) {
return (operand + key) % 256;
},
_add(operand, key) {
return (operand + key) % 256;
},
/**
* SUB bitwise calculation.
*
@ -291,9 +292,9 @@ var BitwiseOp = {
* @param {number} key
* @returns {number}
*/
_sub: function (operand, key) {
var result = operand - key;
return (result < 0) ? 256 + result : result;
},
_sub(operand, key) {
const result = operand - key;
return (result < 0) ? 256 + result : result;
},
};

View File

@ -9,24 +9,24 @@
*
* @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,12 +34,12 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {string}
*/
run_to_hex: function(input, args) {
var delim = Utils.char_rep[args[0] || "Space"];
return Utils.to_hex(input, delim, 2);
},
run_to_hex(input, args) {
const delim = Utils.char_rep[args[0] || 'Space'];
return Utils.to_hex(input, delim, 2);
},
/**
* From Hex operation.
*
@ -47,18 +47,18 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_from_hex: function(input, args) {
var delim = args[0] || "Space";
return Utils.from_hex(input, delim, 2);
},
run_from_hex(input, args) {
const delim = args[0] || 'Space';
return Utils.from_hex(input, delim, 2);
},
/**
* @constant
* @default
*/
CHARCODE_BASE: 16,
CHARCODE_BASE: 16,
/**
* To Charcode operation.
*
@ -66,40 +66,40 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {string}
*/
run_to_charcode: function(input, args) {
var delim = Utils.char_rep[args[0] || "Space"],
base = args[1],
output = "",
padding = 2,
ordinal;
if (base < 2 || base > 36) {
throw "Error: Base argument must be between 2 and 36";
}
for (var i = 0; i < input.length; i++) {
ordinal = Utils.ord(input[i]);
if (base == 16) {
if (ordinal < 256) padding = 2;
else if (ordinal < 65536) padding = 4;
else if (ordinal < 16777216) padding = 6;
else if (ordinal < 4294967296) padding = 8;
else padding = 2;
if (padding > 2) app.options.attempt_highlight = false;
output += Utils.hex(ordinal, padding) + delim;
} else {
app.options.attempt_highlight = false;
output += ordinal.toString(base) + delim;
}
}
return output.slice(0, -delim.length);
},
run_to_charcode(input, args) {
let delim = Utils.char_rep[args[0] || 'Space'],
base = args[1],
output = '',
padding = 2,
ordinal;
if (base < 2 || base > 36) {
throw 'Error: Base argument must be between 2 and 36';
}
for (let i = 0; i < input.length; i++) {
ordinal = Utils.ord(input[i]);
if (base == 16) {
if (ordinal < 256) padding = 2;
else if (ordinal < 65536) padding = 4;
else if (ordinal < 16777216) padding = 6;
else if (ordinal < 4294967296) padding = 8;
else padding = 2;
if (padding > 2) app.options.attempt_highlight = false;
output += Utils.hex(ordinal, padding) + delim;
} else {
app.options.attempt_highlight = false;
output += ordinal.toString(base) + delim;
}
}
return output.slice(0, -delim.length);
},
/**
* From Charcode operation.
*
@ -107,37 +107,37 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_from_charcode: function(input, args) {
var 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";
}
if (base != 16) {
app.options.attempt_highlight = false;
}
// Split into groups of 2 if the whole string is concatenated and
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';
}
if (base != 16) {
app.options.attempt_highlight = false;
}
// Split into groups of 2 if the whole string is concatenated and
// too long to be a single character
if (bites.length == 1 && input.length > 17) {
bites = [];
for (i = 0; i < input.length; i += 2) {
bites.push(input.slice(i, i+2));
}
}
var latin1 = "";
for (i = 0; i < bites.length; i++) {
latin1 += Utils.chr(parseInt(bites[i], base));
}
return Utils.str_to_byte_array(latin1);
},
if (bites.length == 1 && input.length > 17) {
bites = [];
for (i = 0; i < input.length; i += 2) {
bites.push(input.slice(i, i + 2));
}
}
let latin1 = '';
for (i = 0; i < bites.length; i++) {
latin1 += Utils.chr(parseInt(bites[i], base));
}
return Utils.str_to_byte_array(latin1);
},
/**
* Highlight to hex
*
@ -147,22 +147,22 @@ 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;
pos[0].start = pos[0].start * (2 + len);
pos[0].end = pos[0].end * (2 + len) - len;
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") {
pos[0].start += 2;
pos[0].end += 2;
}
return pos;
},
if (delim == '0x' || delim == '\\x') {
pos[0].start += 2;
pos[0].end += 2;
}
return pos;
},
/**
* Highlight to hex
*
@ -172,25 +172,25 @@ 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,
width = len + 2;
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 (pos[0].start > 1) pos[0].start -= 2;
else pos[0].start = 0;
if (pos[0].end > 1) pos[0].end -= 2;
else pos[0].end = 0;
}
pos[0].start = pos[0].start === 0 ? 0 : Math.round(pos[0].start / width);
pos[0].end = pos[0].end === 0 ? 0 : Math.ceil(pos[0].end / width);
return pos;
},
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;
else pos[0].end = 0;
}
pos[0].start = pos[0].start === 0 ? 0 : Math.round(pos[0].start / width);
pos[0].end = pos[0].end === 0 ? 0 : Math.ceil(pos[0].end / width);
return pos;
},
/**
* To Decimal operation.
*
@ -198,12 +198,12 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {string}
*/
run_to_decimal: function(input, args) {
var delim = Utils.char_rep[args[0]];
return input.join(delim);
},
run_to_decimal(input, args) {
const delim = Utils.char_rep[args[0]];
return input.join(delim);
},
/**
* From Decimal operation.
*
@ -211,19 +211,19 @@ 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);
for (var i = 0; i < byte_str.length; i++) {
output[i] = parseInt(byte_str[i]);
}
return output;
},
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 (let i = 0; i < byte_str.length; i++) {
output[i] = parseInt(byte_str[i]);
}
return output;
},
/**
* To Binary operation.
*
@ -231,23 +231,23 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {string}
*/
run_to_binary: function(input, args) {
var delim = Utils.char_rep[args[0] || "Space"],
output = "",
padding = 8;
for (var i = 0; i < input.length; i++) {
output += Utils.pad(input[i].toString(2), padding) + delim;
}
if (delim.length) {
return output.slice(0, -delim.length);
} else {
return output;
}
},
run_to_binary(input, args) {
let delim = Utils.char_rep[args[0] || 'Space'],
output = '',
padding = 8;
for (let i = 0; i < input.length; i++) {
output += Utils.pad(input[i].toString(2), padding) + delim;
}
if (delim.length) {
return output.slice(0, -delim.length);
} else {
return output;
}
},
/**
* From Binary operation.
*
@ -255,21 +255,21 @@ 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"];
input = input.replace(delim_regex, '');
}
var output = [];
var byte_len = 8;
for (var i = 0; i < input.length; i += byte_len) {
output.push(parseInt(input.substr(i, byte_len), 2));
}
return output;
},
run_from_binary(input, args) {
if (args[0] != 'None') {
const delim_regex = Utils.regex_rep[args[0] || 'Space'];
input = input.replace(delim_regex, '');
}
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;
},
/**
* Highlight to binary
*
@ -279,14 +279,14 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {Object[]} pos
*/
highlight_to_binary: function(pos, args) {
var 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;
},
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;
},
/**
* Highlight from binary
*
@ -296,25 +296,25 @@ var ByteRepr = {
* @param {Object[]} args
* @returns {Object[]} pos
*/
highlight_from_binary: function(pos, args) {
var 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;
},
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;
},
/**
* @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
*/
HEX_CONTENT_SPACES_BETWEEN_BYTES: false,
HEX_CONTENT_SPACES_BETWEEN_BYTES: false,
/**
* To Hex Content operation.
*
@ -322,40 +322,40 @@ 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, "");
return result;
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;
}
let output = '',
in_hex = false,
convert_spaces = convert == 'Only special chars including spaces',
b;
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 += '|';
in_hex = true;
} else if (spaces) output += ' ';
output += Utils.to_hex([b]);
} else {
if (in_hex) {
output += '|';
in_hex = false;
}
var output = "",
in_hex = false,
convert_spaces = convert == "Only special chars including spaces",
b;
for (var 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 += "|";
in_hex = true;
} else if (spaces) output += " ";
output += Utils.to_hex([b]);
} else {
if (in_hex) {
output += "|";
in_hex = false;
}
output += Utils.chr(input[i]);
}
}
if (in_hex) output += "|";
return output;
},
output += Utils.chr(input[i]);
}
}
if (in_hex) output += '|';
return output;
},
/**
* From Hex Content operation.
*
@ -363,32 +363,36 @@ 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;)
output.push(Utils.ord(input[i++]));
for (; i < m.index;) {
output.push(Utils.ord(input[i++]));
}
// Add match
var bytes = Utils.from_hex(m[1]);
if (bytes) {
for (var a = 0; a < bytes.length;)
output.push(bytes[a++]);
} else {
const bytes = Utils.from_hex(m[1]);
if (bytes) {
for (let a = 0; a < bytes.length;) { output.push(bytes[a++]); }
} else {
// Not valid hex, print as normal
for (; i < regex.lastIndex;)
output.push(Utils.ord(input[i++]));
}
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;)
output.push(Utils.ord(input[i++]));
return output;
},
for (; i < input.length;) {
output.push(Utils.ord(input[i++]));
}
return output;
},
};

View File

@ -9,14 +9,14 @@
*
* @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,23 +24,23 @@ var CharEnc = {
* @param {Object[]} args
* @returns {string}
*/
run: function(input, args) {
var input_format = args[0],
output_format = args[1];
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") {
input = CryptoJS.enc.Utf8.stringify(input);
return Utils.unicode_to_win1251(input);
} else {
return Utils.format[output_format].stringify(input);
}
},
run(input, args) {
let input_format = args[0],
output_format = args[1];
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') {
input = CryptoJS.enc.Utf8.stringify(input);
return Utils.unicode_to_win1251(input);
} else {
return Utils.format[output_format].stringify(input);
}
},
};

View File

@ -7,7 +7,7 @@
*
* @namespace
*/
var Checksum = {
const Checksum = {
/**
* Fletcher-16 Checksum operation.
@ -16,19 +16,19 @@ var Checksum = {
* @param {Object[]} args
* @returns {string}
*/
run_fletcher16: function(input, args) {
var a = 0,
b = 0;
for (var i = 0; i < input.length; i++) {
a = (a + input[i]) % 0xff;
b = (b + a) % 0xff;
}
return Utils.hex(((b << 8) | a) >>> 0, 4);
},
run_fletcher16(input, args) {
let a = 0,
b = 0;
for (let i = 0; i < input.length; i++) {
a = (a + input[i]) % 0xff;
b = (b + a) % 0xff;
}
return Utils.hex(((b << 8) | a) >>> 0, 4);
},
/**
* Adler-32 Checksum operation.
*
@ -36,23 +36,23 @@ var Checksum = {
* @param {Object[]} args
* @returns {string}
*/
run_adler32: function(input, args) {
var MOD_ADLER = 65521,
a = 1,
b = 0;
for (var i = 0; i < input.length; i++) {
a += input[i];
b += a;
}
a %= MOD_ADLER;
b %= MOD_ADLER;
return Utils.hex(((b << 16) | a) >>> 0, 8);
},
run_adler32(input, args) {
let MOD_ADLER = 65521,
a = 1,
b = 0;
for (let i = 0; i < input.length; i++) {
a += input[i];
b += a;
}
a %= MOD_ADLER;
b %= MOD_ADLER;
return Utils.hex(((b << 16) | a) >>> 0, 8);
},
/**
* CRC-32 Checksum operation.
*
@ -60,18 +60,18 @@ 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()),
crc = 0 ^ (-1);
for (var i = 0; i < input.length; i++) {
crc = (crc >>> 8) ^ crc_table[(crc ^ input[i]) & 0xff];
}
return Utils.hex((crc ^ (-1)) >>> 0);
},
run_crc32(input, args) {
let crc_table = window.crc_table || (window.crc_table = Checksum._gen_crc_table()),
crc = 0 ^ (-1);
for (let i = 0; i < input.length; i++) {
crc = (crc >>> 8) ^ crc_table[(crc ^ input[i]) & 0xff];
}
return Utils.hex((crc ^ (-1)) >>> 0);
},
/**
* TCP/IP Checksum operation.
*
@ -89,42 +89,42 @@ 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;
for (var i = 0; i < input.length; i++) {
if(i % 2 === 0) {
csum += (input[i] << 8);
} else {
csum += input[i];
}
}
run_tcp_ip(input, args) {
let csum = 0;
for (let i = 0; i < input.length; i++) {
if (i % 2 === 0) {
csum += (input[i] << 8);
} else {
csum += input[i];
}
}
csum = (csum >> 16) + (csum & 0xffff);
return Utils.hex(0xffff - csum);
},
csum = (csum >> 16) + (csum & 0xffff);
return Utils.hex(0xffff - csum);
},
/**
* Generates a CRC table for use with CRC checksums.
*
* @private
* @returns {array}
*/
_gen_crc_table: function() {
var c,
crc_table = [];
for (var n = 0; n < 256; n++) {
c = n;
for (var k = 0; k < 8; k++) {
c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
}
crc_table[n] = c;
}
return crc_table;
},
_gen_crc_table() {
let c,
crc_table = [];
for (let n = 0; n < 256; n++) {
c = n;
for (let k = 0; k < 8; k++) {
c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
}
crc_table[n] = c;
}
return crc_table;
},
};

View File

@ -9,45 +9,45 @@
*
* @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'],
/**
* Runs encryption operations using the CryptoJS framework.
*
@ -57,41 +57,41 @@ 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 || ""),
mode = CryptoJS.mode[args[3]],
padding = CryptoJS.pad[args[4]],
result_option = args[5].toLowerCase(),
output_format = args[6];
if (iv.sigBytes === 0) {
_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(),
output_format = args[6];
if (iv.sigBytes === 0) {
// Use passphrase rather than key. Need to convert it to a string.
key = key.toString(CryptoJS.enc.Latin1);
}
var encrypted = algo.encrypt(input, key, {
salt: salt.sigBytes > 0 ? salt : false,
iv: iv.sigBytes > 0 ? iv : null,
mode: mode,
padding: 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]);
} else {
result = encrypted[result_option].toString(Utils.format[output_format]);
}
return result;
},
key = key.toString(CryptoJS.enc.Latin1);
}
const encrypted = algo.encrypt(input, key, {
salt: salt.sigBytes > 0 ? salt : false,
iv: iv.sigBytes > 0 ? iv : null,
mode,
padding,
});
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]);
}
return result;
},
/**
* Runs decryption operations using the CryptoJS framework.
*
@ -101,47 +101,47 @@ 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 || ""),
mode = CryptoJS.mode[args[3]],
padding = CryptoJS.pad[args[4]],
input_format = args[5],
output_format = args[6];
_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],
output_format = args[6];
// The ZeroPadding option causes a crash when the input length is 0
if (!input.length) {
return "No input";
}
var ciphertext = Utils.format[input_format].parse(input);
if (iv.sigBytes === 0) {
if (!input.length) {
return 'No 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
}, key, {
iv: iv.sigBytes > 0 ? iv : null,
mode: mode,
padding: padding
});
var result;
try {
result = decrypted.toString(Utils.format[output_format]);
} catch (err) {
result = "Decrypt error: " + err.message;
}
return result;
},
key = key.toString(CryptoJS.enc.Latin1);
}
const decrypted = algo.decrypt({
ciphertext,
salt: salt.sigBytes > 0 ? salt : false,
}, key, {
iv: iv.sigBytes > 0 ? iv : null,
mode,
padding,
});
let result;
try {
result = decrypted.toString(Utils.format[output_format]);
} catch (err) {
result = `Decrypt error: ${err.message}`;
}
return result;
},
/**
* AES Encrypt operation.
*
@ -149,11 +149,11 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_aes_enc: function (input, args) {
return Cipher._enc(CryptoJS.AES, input, args);
},
run_aes_enc(input, args) {
return Cipher._enc(CryptoJS.AES, input, args);
},
/**
* AES Decrypt operation.
*
@ -161,11 +161,11 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_aes_dec: function (input, args) {
return Cipher._dec(CryptoJS.AES, input, args);
},
run_aes_dec(input, args) {
return Cipher._dec(CryptoJS.AES, input, args);
},
/**
* DES Encrypt operation.
*
@ -173,11 +173,11 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_des_enc: function (input, args) {
return Cipher._enc(CryptoJS.DES, input, args);
},
run_des_enc(input, args) {
return Cipher._enc(CryptoJS.DES, input, args);
},
/**
* DES Decrypt operation.
*
@ -185,11 +185,11 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_des_dec: function (input, args) {
return Cipher._dec(CryptoJS.DES, input, args);
},
run_des_dec(input, args) {
return Cipher._dec(CryptoJS.DES, input, args);
},
/**
* Triple DES Encrypt operation.
*
@ -197,11 +197,11 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_triple_des_enc: function (input, args) {
return Cipher._enc(CryptoJS.TripleDES, input, args);
},
run_triple_des_enc(input, args) {
return Cipher._enc(CryptoJS.TripleDES, input, args);
},
/**
* Triple DES Decrypt operation.
*
@ -209,11 +209,11 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_triple_des_dec: function (input, args) {
return Cipher._dec(CryptoJS.TripleDES, input, args);
},
run_triple_des_dec(input, args) {
return Cipher._dec(CryptoJS.TripleDES, input, args);
},
/**
* Rabbit Encrypt operation.
*
@ -221,11 +221,11 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_rabbit_enc: function (input, args) {
return Cipher._enc(CryptoJS.Rabbit, input, args);
},
run_rabbit_enc(input, args) {
return Cipher._enc(CryptoJS.Rabbit, input, args);
},
/**
* Rabbit Decrypt operation.
*
@ -233,22 +233,22 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_rabbit_dec: function (input, args) {
return Cipher._dec(CryptoJS.Rabbit, input, args);
},
run_rabbit_dec(input, args) {
return Cipher._dec(CryptoJS.Rabbit, input, args);
},
/**
* @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,23 +256,23 @@ 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),
mode = args[1],
output_format = args[2];
if (key.length === 0) return "Enter a key";
var enc_hex = blowfish.encrypt(input, key, {
outputType: 1,
cipherMode: Cipher.BLOWFISH_MODES.indexOf(mode)
}),
enc = CryptoJS.enc.Hex.parse(enc_hex);
return enc.toString(Utils.format[output_format]);
},
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';
let enc_hex = blowfish.encrypt(input, key, {
outputType: 1,
cipherMode: Cipher.BLOWFISH_MODES.indexOf(mode),
}),
enc = CryptoJS.enc.Hex.parse(enc_hex);
return enc.toString(Utils.format[output_format]);
},
/**
* Blowfish Decrypt operation.
*
@ -280,33 +280,33 @@ 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),
mode = args[1],
input_format = args[2];
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)
});
},
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';
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),
});
},
/**
* @constant
* @default
*/
KDF_KEY_SIZE: 256,
KDF_KEY_SIZE: 256,
/**
* @constant
* @default
*/
KDF_ITERATIONS: 1,
KDF_ITERATIONS: 1,
/**
* Derive PBKDF2 key operation.
*
@ -314,19 +314,19 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_pbkdf2: function (input, args) {
var key_size = args[0] / 32,
iterations = args[1],
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 });
return key.toString(Utils.format[output_format]);
},
run_pbkdf2(input, args) {
let key_size = args[0] / 32,
iterations = args[1],
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 });
return key.toString(Utils.format[output_format]);
},
/**
* Derive EVP key operation.
*
@ -334,19 +334,19 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_evpkdf: function (input, args) {
var key_size = args[0] / 32,
iterations = args[1],
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 });
return key.toString(Utils.format[output_format]);
},
run_evpkdf(input, args) {
let key_size = args[0] / 32,
iterations = args[1],
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 });
return key.toString(Utils.format[output_format]);
},
/**
* RC4 operation.
*
@ -354,21 +354,21 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_rc4: function (input, args) {
var message = Utils.format[args[1]].parse(input),
passphrase = Utils.format[args[0].option].parse(args[0].string),
encrypted = CryptoJS.RC4.encrypt(message, passphrase);
return encrypted.ciphertext.toString(Utils.format[args[2]]);
},
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);
return encrypted.ciphertext.toString(Utils.format[args[2]]);
},
/**
* @constant
* @default
*/
RC4DROP_BYTES: 768,
RC4DROP_BYTES: 768,
/**
* RC4 Drop operation.
*
@ -376,22 +376,22 @@ var Cipher = {
* @param {Object[]} args
* @returns {string}
*/
run_rc4drop: function (input, args) {
var 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 });
return encrypted.ciphertext.toString(Utils.format[args[2]]);
},
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 });
return encrypted.ciphertext.toString(Utils.format[args[2]]);
},
};
/**
* Overwriting the CryptoJS OpenSSL key derivation function so that it is possible to not pass a
* salt in.
* @param {string} password - The password to derive from.
* @param {number} keySize - The size in words of the key to generate.
* @param {number} ivSize - The size in words of the IV to generate.
@ -413,17 +413,17 @@ var Cipher = {
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);
}
if (salt === undefined || salt === null) {
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);
key.sigBytes = keySize * 4;
const iv = CryptoJS.lib.WordArray.create(key.words.slice(keySize), ivSize * 4);
key.sigBytes = keySize * 4;
// Return params
return CryptoJS.lib.CipherParams.create({ key: key, iv: iv, salt: salt });
return CryptoJS.lib.CipherParams.create({ key, iv, salt });
};

View File

@ -9,19 +9,19 @@
*
* @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
*/
LINE_NUMS: false,
LINE_NUMS: false,
/**
* Syntax highlighter operation.
*
@ -29,19 +29,19 @@ var Code = {
* @param {Object[]} args
* @returns {html}
*/
run_syntax_highlight: function(input, args) {
var language = args[0],
line_nums = args[1];
return "<code class='prettyprint'>" + prettyPrintOne(Utils.escape_html(input), language, line_nums) + "</code>";
},
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>`;
},
/**
* @constant
* @default
*/
BEAUTIFY_INDENT: "\\t",
BEAUTIFY_INDENT: '\\t',
/**
* XML Beautify operation.
*
@ -49,12 +49,12 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_xml_beautify: function(input, args) {
var indent_str = args[0];
return vkbeautify.xml(input, indent_str);
},
run_xml_beautify(input, args) {
const indent_str = args[0];
return vkbeautify.xml(input, indent_str);
},
/**
* JSON Beautify operation.
*
@ -62,12 +62,12 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_json_beautify: function(input, args) {
var indent_str = args[0];
return vkbeautify.json(input, indent_str);
},
run_json_beautify(input, args) {
const indent_str = args[0];
return vkbeautify.json(input, indent_str);
},
/**
* CSS Beautify operation.
*
@ -75,12 +75,12 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_css_beautify: function(input, args) {
var indent_str = args[0];
return vkbeautify.css(input, indent_str);
},
run_css_beautify(input, args) {
const indent_str = args[0];
return vkbeautify.css(input, indent_str);
},
/**
* SQL Beautify operation.
*
@ -88,18 +88,18 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_sql_beautify: function(input, args) {
var indent_str = args[0];
return vkbeautify.sql(input, indent_str);
},
run_sql_beautify(input, args) {
const indent_str = args[0];
return vkbeautify.sql(input, indent_str);
},
/**
* @constant
* @default
*/
PRESERVE_COMMENTS: false,
PRESERVE_COMMENTS: false,
/**
* XML Minify operation.
*
@ -107,12 +107,12 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_xml_minify: function(input, args) {
var preserve_comments = args[0];
return vkbeautify.xmlmin(input, preserve_comments);
},
run_xml_minify(input, args) {
const preserve_comments = args[0];
return vkbeautify.xmlmin(input, preserve_comments);
},
/**
* JSON Minify operation.
*
@ -120,11 +120,11 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_json_minify: function(input, args) {
return vkbeautify.jsonmin(input);
},
run_json_minify(input, args) {
return vkbeautify.jsonmin(input);
},
/**
* CSS Minify operation.
*
@ -132,12 +132,12 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_css_minify: function(input, args) {
var preserve_comments = args[0];
return vkbeautify.cssmin(input, preserve_comments);
},
run_css_minify(input, args) {
const preserve_comments = args[0];
return vkbeautify.cssmin(input, preserve_comments);
},
/**
* SQL Minify operation.
*
@ -145,11 +145,11 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_sql_minify: function(input, args) {
return vkbeautify.sqlmin(input);
},
run_sql_minify(input, args) {
return vkbeautify.sqlmin(input);
},
/**
* Generic Code Beautify operation.
*
@ -158,10 +158,10 @@ var Code = {
* I'm not proud of this code, but seriously, try writing a generic lexer and parser that
* correctly generates an AST for multiple different languages. I have tried, and I can tell
* you it's pretty much impossible.
*
*
* This basically works. That'll have to be good enough. It's not meant to produce working code,
* just slightly more readable code.
*
*
* Things that don't work:
* - For loop formatting
* - Do-While loop formatting
@ -173,133 +173,133 @@ var Code = {
* @param {Object[]} args
* @returns {string}
*/
run_generic_beautify: function(input, args) {
var code = input,
t = 0,
preserved_tokens = [],
m;
run_generic_beautify(input, args) {
let code = input,
t = 0,
preserved_tokens = [],
m;
// Remove strings
var 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))) {
code = preserve_token(code, m, t++);
dstrings.lastIndex = m.index;
}
const sstrings = /'([^'\\]|\\.)*'/g;
while (m = sstrings.exec(code)) {
code = preserve_token(code, m, t++);
sstrings.lastIndex = m.index;
}
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))) {
code = preserve_token(code, m, t++);
scomments.lastIndex = m.index;
}
var 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))) {
code = preserve_token(code, m, t++);
hcomments.lastIndex = m.index;
}
const scomments = /\/\/[^\n\r]*/g;
while (m = scomments.exec(code)) {
code = preserve_token(code, m, t++);
scomments.lastIndex = m.index;
}
const mcomments = /\/\*[\s\S]*?\*\//gm;
while (m = mcomments.exec(code)) {
code = preserve_token(code, m, t++);
mcomments.lastIndex = m.index;
}
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))) {
code = preserve_token(code, m, t++);
regexes.lastIndex = m.index;
}
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,
level = 0;
while (i < code.length) {
switch(code[i]) {
case "{":
level++;
break;
case "\n":
if (i+1 >= code.length) break;
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;
break;
}
i++;
}
let i = 0,
level = 0;
while (i < code.length) {
switch (code[i]) {
case '{':
level++;
break;
case '\n':
if (i + 1 >= code.length) break;
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;
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");
// 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");
// 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");
// Replace preserved tokens
var ptokens = /###preserved_token(\d+)###/g;
while (!!(m = ptokens.exec(code))) {
var ti = parseInt(m[1]);
code = code.substring(0, m.index) + preserved_tokens[ti] + code.substring(m.index + m[0].length);
ptokens.lastIndex = m.index;
}
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');
return 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);
}
},
// 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');
// 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');
// Replace preserved tokens
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;
}
return 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)}`;
}
},
};

View File

@ -9,38 +9,38 @@
*
* @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,
},
RAW_COMPRESSION_TYPE_LOOKUP: {
'Fixed Huffman Coding': Zlib.RawDeflate.CompressionType.FIXED,
'Dynamic Huffman Coding': Zlib.RawDeflate.CompressionType.DYNAMIC,
'None (Store)': Zlib.RawDeflate.CompressionType.NONE,
},
/**
* Raw Deflate operation.
*
@ -48,43 +48,43 @@ 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]]
});
return Array.prototype.slice.call(deflate.compress());
},
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());
},
/**
* @constant
* @default
*/
INFLATE_INDEX: 0,
INFLATE_INDEX: 0,
/**
* @constant
* @default
*/
INFLATE_BUFFER_SIZE: 0,
INFLATE_BUFFER_SIZE: 0,
/**
* @constant
* @default
*/
INFLATE_RESIZE: false,
INFLATE_RESIZE: false,
/**
* @constant
* @default
*/
INFLATE_VERIFY: false,
INFLATE_VERIFY: false,
/**
* @constant
* @default
*/
RAW_BUFFER_TYPE_LOOKUP: {
"Adaptive" : Zlib.RawInflate.BufferType.ADAPTIVE,
"Block" : Zlib.RawInflate.BufferType.BLOCK,
},
RAW_BUFFER_TYPE_LOOKUP: {
Adaptive: Zlib.RawInflate.BufferType.ADAPTIVE,
Block: Zlib.RawInflate.BufferType.BLOCK,
},
/**
* Raw Inflate operation.
*
@ -92,51 +92,51 @@ 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, {
index: args[0],
bufferSize: args[1],
bufferType: Compress.RAW_BUFFER_TYPE_LOOKUP[args[2]],
resize: args[3],
verify: args[4]
}),
result = Array.prototype.slice.call(inflate.decompress());
input = Utils.str_to_byte_array(Utils.byte_array_to_utf8(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],
}),
result = Array.prototype.slice.call(inflate.decompress());
// Raw Inflate somethimes messes up and returns nonsense like this:
// ]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]...
// e.g. Input data of [8b, 1d, dc, 44]
// Look for the first two square brackets:
if (result.length > 158 && result[0] == 93 && result[5] == 93) {
if (result.length > 158 && result[0] == 93 && result[5] == 93) {
// If the first two square brackets are there, check that the others
// are also there. If they are, throw an error. If not, continue.
var valid = false;
for (var i = 0; i < 155; i += 5) {
if (result[i] != 93) {
valid = true;
}
}
if (!valid) {
throw "Error: Unable to inflate data";
}
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';
}
}
// Trust me, this is the easiest way...
return result;
},
return result;
},
/**
* @constant
* @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,
},
ZLIB_COMPRESSION_TYPE_LOOKUP: {
'Fixed Huffman Coding': Zlib.Deflate.CompressionType.FIXED,
'Dynamic Huffman Coding': Zlib.Deflate.CompressionType.DYNAMIC,
'None (Store)': Zlib.Deflate.CompressionType.NONE,
},
/**
* Zlib Deflate operation.
*
@ -144,23 +144,23 @@ 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]]
});
return Array.prototype.slice.call(deflate.compress());
},
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());
},
/**
* @constant
* @default
*/
ZLIB_BUFFER_TYPE_LOOKUP: {
"Adaptive" : Zlib.Inflate.BufferType.ADAPTIVE,
"Block" : Zlib.Inflate.BufferType.BLOCK,
},
ZLIB_BUFFER_TYPE_LOOKUP: {
Adaptive: Zlib.Inflate.BufferType.ADAPTIVE,
Block: Zlib.Inflate.BufferType.BLOCK,
},
/**
* Zlib Inflate operation.
*
@ -168,26 +168,26 @@ 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, {
index: args[0],
bufferSize: args[1],
bufferType: Compress.ZLIB_BUFFER_TYPE_LOOKUP[args[2]],
resize: args[3],
verify: args[4]
});
return Array.prototype.slice.call(inflate.decompress());
},
input = Utils.str_to_byte_array(Utils.byte_array_to_utf8(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],
});
return Array.prototype.slice.call(inflate.decompress());
},
/**
* @constant
* @default
*/
GZIP_CHECKSUM: false,
GZIP_CHECKSUM: false,
/**
* Gzip operation.
*
@ -195,32 +195,32 @@ var Compress = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_gzip: function(input, args) {
var filename = args[1],
comment = args[2],
options = {
deflateOptions: {
compressionType: Compress.ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]]
},
flags: {
fhcrc: args[3]
}
};
if (filename.length) {
options.flags.fname = true;
options.filename = filename;
}
if (comment.length) {
options.flags.fcommenct = true;
options.comment = comment;
}
var gzip = new Zlib.Gzip(input, options);
return Array.prototype.slice.call(gzip.compress());
},
run_gzip(input, args) {
let filename = args[1],
comment = args[2],
options = {
deflateOptions: {
compressionType: Compress.ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]],
},
flags: {
fhcrc: args[3],
},
};
if (filename.length) {
options.flags.fname = true;
options.filename = filename;
}
if (comment.length) {
options.flags.fcommenct = true;
options.comment = comment;
}
const gzip = new Zlib.Gzip(input, options);
return Array.prototype.slice.call(gzip.compress());
},
/**
* Gunzip operation.
*
@ -228,37 +228,37 @@ 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);
return Array.prototype.slice.call(gunzip.decompress());
},
input = Utils.str_to_byte_array(Utils.byte_array_to_utf8(input));
const gunzip = new Zlib.Gunzip(input);
return Array.prototype.slice.call(gunzip.decompress());
},
/**
* @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
},
ZIP_COMPRESSION_METHOD_LOOKUP: {
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
},
ZIP_OS_LOOKUP: {
MSDOS: Zlib.Zip.OperatingSystem.MSDOS,
Unix: Zlib.Zip.OperatingSystem.UNIX,
Macintosh: Zlib.Zip.OperatingSystem.MACINTOSH,
},
/**
* Zip operation.
*
@ -266,32 +266,31 @@ var Compress = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_pkzip: function(input, args) {
var 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]]
},
},
zip = new Zlib.Zip();
if (password.length)
zip.setPassword(password);
zip.addFile(input, options);
return Array.prototype.slice.call(zip.compress());
},
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]],
},
},
zip = new Zlib.Zip();
if (password.length) { zip.setPassword(password); }
zip.addFile(input, options);
return Array.prototype.slice.call(zip.compress());
},
/**
* @constant
* @default
*/
PKUNZIP_VERIFY: false,
PKUNZIP_VERIFY: false,
/**
* Unzip operation.
*
@ -299,36 +298,36 @@ var Compress = {
* @param {Object[]} args
* @returns {string}
*/
run_pkunzip: function(input, args) {
var options = {
password: Utils.str_to_byte_array(args[0]),
verify: args[1]
},
file = "",
unzip = new Zlib.Unzip(input, options),
filenames = unzip.getFilenames(),
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++) {
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>";
}
return output + "</div>";
},
run_pkunzip(input, args) {
let options = {
password: Utils.str_to_byte_array(args[0]),
verify: args[1],
},
file = '',
unzip = new Zlib.Unzip(input, options),
filenames = unzip.getFilenames(),
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 (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>`;
}
return `${output}</div>`;
},
/**
* Bzip2 Decompress operation.
*
@ -336,14 +335,14 @@ var Compress = {
* @param {Object[]} args
* @returns {string}
*/
run_bzip2_decompress: function(input, args) {
var compressed = new Uint8Array(input),
bzip2_reader,
plain = "";
bzip2_reader = bzip2.array(compressed);
plain = bzip2.simple(bzip2_reader);
return plain;
},
run_bzip2_decompress(input, args) {
let compressed = new Uint8Array(input),
bzip2_reader,
plain = '';
bzip2_reader = bzip2.array(compressed);
plain = bzip2.simple(bzip2_reader);
return plain;
},
};

View File

@ -7,56 +7,56 @@
*
* @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]",
],
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]',
],
/**
* @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,
"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,
"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
},
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,
'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,
'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,
},
/**
* Convert distance operation.
*
@ -64,80 +64,80 @@ var Convert = {
* @param {Object[]} args
* @returns {number}
*/
run_distance: function (input, args) {
var input_units = args[0],
output_units = args[1];
input = input * Convert.DISTANCE_FACTOR[input_units];
return input / Convert.DISTANCE_FACTOR[output_units];
run_distance(input, args) {
let input_units = args[0],
output_units = args[1];
input *= Convert.DISTANCE_FACTOR[input_units];
return input / Convert.DISTANCE_FACTOR[output_units];
// TODO Remove rounding errors (e.g. 1.000000000001)
},
},
/**
* @constant
* @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)]"
],
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)]',
],
/**
* @constant
* @default
*/
DATA_FACTOR: { // Multiples of a bit
"Bits (b)" : 1,
"Nibbles" : 4,
"Octets" : 8,
"Bytes (B)" : 8,
DATA_FACTOR: { // Multiples of a bit
'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,
},
/**
* Convert data units operation.
*
@ -145,79 +145,79 @@ var Convert = {
* @param {Object[]} args
* @returns {number}
*/
run_data_size: function (input, args) {
var input_units = args[0],
output_units = args[1];
input = input * Convert.DATA_FACTOR[input_units];
return input / Convert.DATA_FACTOR[output_units];
},
run_data_size(input, args) {
let input_units = args[0],
output_units = args[1];
input *= Convert.DATA_FACTOR[input_units];
return input / Convert.DATA_FACTOR[output_units];
},
/**
* @constant
* @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]",
],
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]',
],
/**
* @constant
* @default
*/
AREA_FACTOR: { // Multiples of a square metre
AREA_FACTOR: { // Multiples of a square metre
// Metric
"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,
'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,
// 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,
"Planck area" : 2.6e-70,
"Shed" : 1e-52,
"Outhouse" : 1e-34,
'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,
// 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,
},
/**
* Convert area operation.
*
@ -225,110 +225,110 @@ var Convert = {
* @param {Object[]} args
* @returns {number}
*/
run_area: function (input, args) {
var input_units = args[0],
output_units = args[1];
input = input * Convert.AREA_FACTOR[input_units];
return input / Convert.AREA_FACTOR[output_units];
},
run_area(input, args) {
let input_units = args[0],
output_units = args[1];
input *= Convert.AREA_FACTOR[input_units];
return input / Convert.AREA_FACTOR[output_units];
},
/**
* @constant
* @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]",
],
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]',
],
/**
* @constant
* @default
*/
MASS_FACTOR: { // Multiples of a gram
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,
},
/**
* Convert mass operation.
*
@ -336,64 +336,64 @@ var Convert = {
* @param {Object[]} args
* @returns {number}
*/
run_mass: function (input, args) {
var input_units = args[0],
output_units = args[1];
input = input * Convert.MASS_FACTOR[input_units];
return input / Convert.MASS_FACTOR[output_units];
},
run_mass(input, args) {
let input_units = args[0],
output_units = args[1];
input *= Convert.MASS_FACTOR[input_units];
return input / Convert.MASS_FACTOR[output_units];
},
/**
* @constant
* @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]",
],
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]',
],
/**
* @constant
* @default
*/
SPEED_FACTOR: { // Multiples of m/s
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,
},
/**
* Convert speed operation.
*
@ -401,12 +401,12 @@ var Convert = {
* @param {Object[]} args
* @returns {number}
*/
run_speed: function (input, args) {
var input_units = args[0],
output_units = args[1];
input = input * Convert.SPEED_FACTOR[input_units];
return input / Convert.SPEED_FACTOR[output_units];
},
run_speed(input, args) {
let input_units = args[0],
output_units = args[1];
input *= Convert.SPEED_FACTOR[input_units];
return input / Convert.SPEED_FACTOR[output_units];
},
};

View File

@ -9,14 +9,14 @@
*
* @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,30 +24,30 @@ var DateTime = {
* @param {Object[]} args
* @returns {string}
*/
run_from_unix_timestamp: function(input, args) {
var units = args[0],
d;
input = parseFloat(input);
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)") {
d = moment(input);
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)") {
d = moment(input / 1000000);
return d.tz("UTC").format("ddd D MMMM YYYY HH:mm:ss.SSS") + " UTC";
} else {
throw "Unrecognised unit";
}
},
run_from_unix_timestamp(input, args) {
let units = args[0],
d;
input = parseFloat(input);
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)') {
d = moment(input);
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)') {
d = moment(input / 1000000);
return `${d.tz('UTC').format('ddd D MMMM YYYY HH:mm:ss.SSS')} UTC`;
} else {
throw 'Unrecognised unit';
}
},
/**
* To UNIX Timestamp operation.
*
@ -55,74 +55,74 @@ var DateTime = {
* @param {Object[]} args
* @returns {number}
*/
run_to_unix_timestamp: function(input, args) {
var units = args[0],
d = moment(input);
if (units == "Seconds (s)") {
return d.unix();
} else if (units == "Milliseconds (ms)") {
return d.valueOf();
} else if (units == "Microseconds (μs)") {
return d.valueOf() * 1000;
} else if (units == "Nanoseconds (ns)") {
return d.valueOf() * 1000000;
} else {
throw "Unrecognised unit";
}
run_to_unix_timestamp(input, args) {
let units = args[0],
d = moment(input);
if (units == 'Seconds (s)') {
return d.unix();
} else if (units == 'Milliseconds (ms)') {
return d.valueOf();
} else if (units == 'Microseconds (μs)') {
return d.valueOf() * 1000;
} else if (units == 'Nanoseconds (ns)') {
return d.valueOf() * 1000000;
} else {
throw 'Unrecognised unit';
}
},
/**
* @constant
* @default
*/
DATETIME_FORMATS: [
{
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: '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: 'UNIX timestamp (seconds)',
value: 'X',
},
{
name: 'UNIX timestamp offset (milliseconds)',
value: 'x',
},
{
name: 'Automatic',
value: '',
},
],
/**
* @constant
* @default
*/
DATETIME_FORMATS: [
{
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: "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: "UNIX timestamp (seconds)",
value: "X"
},
{
name: "UNIX timestamp offset (milliseconds)",
value: "x"
},
{
name: "Automatic",
value: ""
},
],
INPUT_FORMAT_STRING: 'DD/MM/YYYY HH:mm:ss',
/**
* @constant
* @default
*/
INPUT_FORMAT_STRING: "DD/MM/YYYY HH:mm:ss",
OUTPUT_FORMAT_STRING: 'dddd Do MMMM YYYY HH:mm:ss Z z',
/**
* @constant
* @default
*/
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,24 +130,24 @@ var DateTime = {
* @param {Object[]} args
* @returns {html}
*/
run_translate_format: function(input, args) {
var input_format = args[1],
input_timezone = args[2],
output_format = args[3],
output_timezone = args[4],
date;
run_translate_format(input, args) {
let input_format = args[1],
input_timezone = args[2],
output_format = args[3],
output_timezone = args[4],
date;
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}`;
}
return date.tz(output_timezone).format(output_format);
},
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;
}
return date.tz(output_timezone).format(output_format);
},
/**
* Parse DateTime operation.
*
@ -155,39 +155,39 @@ var DateTime = {
* @param {Object[]} args
* @returns {html}
*/
run_parse: function(input, args) {
var input_format = args[1],
input_timezone = args[2],
date,
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;
}
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;
},
run_parse(input, args) {
let input_format = args[1],
input_timezone = args[2],
date,
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}`;
}
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;
},
/**
* @constant
*/
FORMAT_EXAMPLES: "Format string tokens:\n\n\
FORMAT_EXAMPLES: "Format string tokens:\n\n\
<table class='table table-striped table-hover table-condensed table-bordered' style='font-family: sans-serif'>\
<thead>\
<tr>\
@ -450,5 +450,5 @@ var DateTime = {
</tbody>\
</table>",
};

View File

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

View File

@ -7,14 +7,14 @@
*
* @namespace
*/
var Entropy = {
const Entropy = {
/**
* @constant
* @default
*/
CHUNK_SIZE: 1000,
CHUNK_SIZE: 1000,
/**
* Entropy operation.
*
@ -22,21 +22,21 @@ var Entropy = {
* @param {Object[]} args
* @returns {html}
*/
run_entropy: function(input, args) {
var 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>\
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>\
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,28 +53,28 @@ var Entropy = {
max: 8\
}\
]);\
</script>";
var 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";
}
} else {
output += "Chunk size cannot be 0.";
}
return output;
},
</script>`;
let chunk_entropy = 0;
if (chunk_size !== 0) {
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.';
}
return output;
},
/**
* @constant
* @default
*/
FREQ_ZEROS: false,
FREQ_ZEROS: false,
/**
* Frequency distribution operation.
*
@ -82,60 +82,60 @@ var Entropy = {
* @param {Object[]} args
* @returns {html}
*/
run_freq_distrib: function (input, args) {
if (!input.length) return "No data";
var distrib = new Array(256),
percentages = new Array(256),
len = input.length,
show_zeroes = args[0];
run_freq_distrib(input, args) {
if (!input.length) return 'No data';
let distrib = new Array(256),
percentages = new Array(256),
len = input.length,
show_zeroes = args[0];
// Initialise distrib to 0
for (var i = 0; i < 256; i++) {
distrib[i] = 0;
}
for (var i = 0; i < 256; i++) {
distrib[i] = 0;
}
// Count bytes
for (i = 0; i < len; i++) {
distrib[input[i]]++;
}
for (i = 0; i < len; i++) {
distrib[input[i]]++;
}
// Calculate percentages
var repr = 0;
for (i = 0; i < 256; i++) {
if (distrib[i] > 0) repr++;
percentages[i] = distrib[i] / len * 100;
}
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>";
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";
}
}
return output;
},
</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`;
}
}
return output;
},
/**
* Calculates the Shannon entropy for a given chunk of data.
*
@ -143,24 +143,24 @@ var Entropy = {
* @param {byte_array} data
* @returns {number}
*/
_calc_entropy: function(data) {
var prob = [],
uniques = data.unique(),
str = Utils.byte_array_to_chars(data);
for (var i = 0; i < uniques.length; i++) {
prob.push(str.count(Utils.chr(uniques[i])) / data.length);
}
var entropy = 0,
p;
for (i = 0; i < prob.length; i++) {
p = prob[i];
entropy += p * Math.log(p) / Math.log(2);
}
return -entropy;
},
_calc_entropy(data) {
let prob = [],
uniques = data.unique(),
str = Utils.byte_array_to_chars(data);
for (var i = 0; i < uniques.length; i++) {
prob.push(str.count(Utils.chr(uniques[i])) / data.length);
}
let entropy = 0,
p;
for (i = 0; i < prob.length; i++) {
p = prob[i];
entropy += p * Math.log(p) / Math.log(2);
}
return -entropy;
},
};

View File

@ -7,7 +7,7 @@
*
* @namespace
*/
var Extract = {
const Extract = {
/**
* Runs search operations across the input data using refular expressions.
@ -20,36 +20,38 @@ 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 = "",
total = 0,
match;
while (!!(match = search_regex.exec(input))) {
if (remove_regex && remove_regex.test(match[0]))
continue;
total++;
output += match[0] + "\n";
}
if (include_total)
output = "Total found: " + total + "\n\n" + output;
return 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])) {
continue;
}
total++;
output += `${match[0]}\n`;
}
if (include_total) {
output = `Total found: ${total}\n\n${output}`;
}
return output;
},
/**
* @constant
* @default
*/
MIN_STRING_LEN: 3,
MIN_STRING_LEN: 3,
/**
* @constant
* @default
*/
DISPLAY_TOTAL: false,
DISPLAY_TOTAL: false,
/**
* Strings operation.
*
@ -57,32 +59,32 @@ var Extract = {
* @param {Object[]} args
* @returns {string}
*/
run_strings: function(input, args) {
var min_len = args[0] || Extract.MIN_STRING_LEN,
display_total = args[1],
strings = "[A-Z\\d/\\-:.,_$%'\"()<>= !\\[\\]{}@]",
regex = new RegExp(strings + "{" + min_len + ",}", "ig");
return Extract._search(input, regex, null, display_total);
},
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');
return Extract._search(input, regex, null, display_total);
},
/**
* @constant
* @default
*/
INCLUDE_IPV4: true,
INCLUDE_IPV4: true,
/**
* @constant
* @default
*/
INCLUDE_IPV6: false,
INCLUDE_IPV6: false,
/**
* @constant
* @default
*/
REMOVE_LOCAL: false,
REMOVE_LOCAL: false,
/**
* Extract IP addresses operation.
*
@ -90,44 +92,44 @@ var Extract = {
* @param {Object[]} args
* @returns {string}
*/
run_ip: function(input, args) {
var 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 = "";
if (include_ipv4 && include_ipv6) {
ips = ipv4 + "|" + ipv6;
} else if (include_ipv4) {
ips = ipv4;
} else if (include_ipv6) {
ips = ipv6;
}
if (ips) {
var 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 + ")");
return Extract._search(input, regex, remove_regex, display_total);
} else {
return Extract._search(input, regex, null, display_total);
}
} else {
return "";
}
},
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 = '';
if (include_ipv4 && include_ipv6) {
ips = `${ipv4}|${ipv6}`;
} else if (include_ipv4) {
ips = ipv4;
} else if (include_ipv6) {
ips = ipv6;
}
if (ips) {
const regex = new RegExp(ips, 'ig');
if (remove_local) {
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 '';
}
},
/**
* Extract email addresses operation.
*
@ -135,14 +137,14 @@ var Extract = {
* @param {Object[]} args
* @returns {string}
*/
run_email: function(input, args) {
var display_total = args[0],
regex = /\w[-.\w]*@[-\w]+(?:\.[-\w]+)*\.[A-Z]{2,4}/ig;
return Extract._search(input, regex, null, display_total);
},
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);
},
/**
* Extract MAC addresses operation.
*
@ -150,14 +152,14 @@ var Extract = {
* @param {Object[]} args
* @returns {string}
*/
run_mac: function(input, args) {
var display_total = args[0],
regex = /[A-F\d]{2}(?:[:-][A-F\d]{2}){5}/ig;
return Extract._search(input, regex, null, display_total);
},
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);
},
/**
* Extract URLs operation.
*
@ -165,20 +167,20 @@ 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+",
path = "/[^.!,?;\"'<>()\\[\\]{}\\s\\x7F-\\xFF]*";
path += "(?:[.!,?]+[^.!,?;\"'<>()\\[\\]{}\\s\\x7F-\\xFF]+)*";
var regex = new RegExp(protocol + hostname + "(?:" + port +
")?(?:" + path + ")?", "ig");
return Extract._search(input, regex, null, display_total);
},
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]+)*";
const regex = new RegExp(`${protocol + hostname}(?:${port
})?(?:${path})?`, 'ig');
return Extract._search(input, regex, null, display_total);
},
/**
* Extract domains operation.
*
@ -186,28 +188,28 @@ 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");
return Extract._search(input, regex, null, display_total);
},
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);
},
/**
* @constant
* @default
*/
INCLUDE_WIN_PATH: true,
INCLUDE_WIN_PATH: true,
/**
* @constant
* @default
*/
INCLUDE_UNIX_PATH: true,
INCLUDE_UNIX_PATH: true,
/**
* Extract file paths operation.
*
@ -215,35 +217,35 @@ var Extract = {
* @param {Object[]} args
* @returns {string}
*/
run_file_paths: function(input, args) {
var include_win_path = args[0],
include_unix_path = args[1],
display_total = args[2],
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 = "";
if (include_win_path && include_unix_path) {
file_paths = win_path + "|" + unix_path;
} else if (include_win_path) {
file_paths = win_path;
} else if (include_unix_path) {
file_paths = unix_path;
}
if (file_paths) {
var regex = new RegExp(file_paths, "ig");
return Extract._search(input, regex, null, display_total);
} else {
return "";
}
},
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_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 = '';
if (include_win_path && include_unix_path) {
file_paths = `${win_path}|${unix_path}`;
} else if (include_win_path) {
file_paths = win_path;
} else if (include_unix_path) {
file_paths = unix_path;
}
if (file_paths) {
const regex = new RegExp(file_paths, 'ig');
return Extract._search(input, regex, null, display_total);
} else {
return '';
}
},
/**
* Extract dates operation.
*
@ -251,17 +253,17 @@ 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");
return Extract._search(input, regex, null, display_total);
},
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);
},
/**
* Extract all identifiers operation.
*
@ -269,29 +271,29 @@ var Extract = {
* @param {Object[]} args
* @returns {string}
*/
run_all_idents: function(input, args) {
var output = "";
output += "IP addresses\n";
output += Extract.run_ip(input, [true, true, false]);
output += "\nEmail addresses\n";
output += Extract.run_email(input, []);
output += "\nMAC addresses\n";
output += Extract.run_mac(input, []);
output += "\nURLs\n";
output += Extract.run_urls(input, []);
output += "\nDomain names\n";
output += Extract.run_domains(input, []);
output += "\nFile paths\n";
output += Extract.run_file_paths(input, [true, true]);
output += "\nDates\n";
output += Extract.run_dates(input, []);
return output;
},
run_all_idents(input, args) {
let output = '';
output += 'IP addresses\n';
output += Extract.run_ip(input, [true, true, false]);
output += '\nEmail addresses\n';
output += Extract.run_email(input, []);
output += '\nMAC addresses\n';
output += Extract.run_mac(input, []);
output += '\nURLs\n';
output += Extract.run_urls(input, []);
output += '\nDomain names\n';
output += Extract.run_domains(input, []);
output += '\nFile paths\n';
output += Extract.run_file_paths(input, [true, true]);
output += '\nDates\n';
output += Extract.run_dates(input, []);
return output;
},
};

View File

@ -7,7 +7,7 @@
*
* @namespace
*/
var FileType = {
const FileType = {
/**
* Detect File Type operation.
@ -16,30 +16,30 @@ var FileType = {
* @param {Object[]} args
* @returns {string}
*/
run_detect: function(input, args) {
var 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?";
} else {
var output = "File extension: " + type.ext + "\n" +
"MIME type: " + type.mime;
if (type.desc && type.desc.length) {
output += "\nDescription: " + type.desc;
}
return output;
}
},
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?';
} else {
let output = `File extension: ${type.ext}\n` +
`MIME type: ${type.mime}`;
if (type.desc && type.desc.length) {
output += `\nDescription: ${type.desc}`;
}
return output;
}
},
/**
* @constant
* @default
*/
IGNORE_COMMON_BYTE_SEQUENCES: true,
IGNORE_COMMON_BYTE_SEQUENCES: true,
/**
* Scan for Embedded Files operation.
*
@ -47,50 +47,50 @@ 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",
type,
ignore_common = args[0],
common_exts = ["ico", "ttf", ""],
num_found = 0,
num_common_found = 0;
for (var i = 0; i < input.length; i++) {
type = FileType._magic_type(input.slice(i));
if (type) {
if (ignore_common && common_exts.indexOf(type.ext) > -1) {
num_common_found++;
continue;
}
num_found++;
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";
}
}
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', ''],
num_found = 0,
num_common_found = 0;
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) {
num_common_found++;
continue;
}
if (num_found === 0) {
output += "\nNo embedded files were found.";
num_found++;
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`;
}
if (num_common_found > 0) {
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.";
output += " Run this operation with the 'Ignore common byte sequences' option unchecked to see details.";
}
return output;
},
}
}
if (num_found === 0) {
output += '\nNo embedded files were found.';
}
if (num_common_found > 0) {
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.';
output += " Run this operation with the 'Ignore common byte sequences' option unchecked to see details.";
}
return output;
},
/**
* Given a buffer, detects magic byte sequences at specific positions and returns the
* Given a buffer, detects magic byte sequences at specific positions and returns the
* extension and mime type.
*
* @private
@ -100,427 +100,427 @@ var FileType = {
* @returns {string} type.mime - Mime type
* @returns {string} [type.desc] - Description
*/
_magic_type: function (buf) {
if (!(buf && buf.length > 1)) {
return null;
}
_magic_type(buf) {
if (!(buf && buf.length > 1)) {
return null;
}
if (buf[0] === 0xFF && buf[1] === 0xD8 && buf[2] === 0xFF) {
return {
ext: 'jpg',
mime: 'image/jpeg'
};
}
if (buf[0] === 0xFF && buf[1] === 0xD8 && buf[2] === 0xFF) {
return {
ext: 'jpg',
mime: 'image/jpeg',
};
}
if (buf[0] === 0x89 && buf[1] === 0x50 && buf[2] === 0x4E && buf[3] === 0x47) {
return {
ext: 'png',
mime: 'image/png'
};
}
if (buf[0] === 0x89 && buf[1] === 0x50 && buf[2] === 0x4E && buf[3] === 0x47) {
return {
ext: 'png',
mime: 'image/png',
};
}
if (buf[0] === 0x47 && buf[1] === 0x49 && buf[2] === 0x46) {
return {
ext: 'gif',
mime: 'image/gif'
};
}
if (buf[0] === 0x47 && buf[1] === 0x49 && buf[2] === 0x46) {
return {
ext: 'gif',
mime: 'image/gif',
};
}
if (buf[8] === 0x57 && buf[9] === 0x45 && buf[10] === 0x42 && buf[11] === 0x50) {
return {
ext: 'webp',
mime: 'image/webp'
};
}
if (buf[8] === 0x57 && buf[9] === 0x45 && buf[10] === 0x42 && buf[11] === 0x50) {
return {
ext: 'webp',
mime: 'image/webp',
};
}
// needs to be before `tif` check
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'
};
}
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',
};
}
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'
};
}
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',
};
}
if (buf[0] === 0x42 && buf[1] === 0x4D) {
return {
ext: 'bmp',
mime: 'image/bmp'
};
}
if (buf[0] === 0x42 && buf[1] === 0x4D) {
return {
ext: 'bmp',
mime: 'image/bmp',
};
}
if (buf[0] === 0x49 && buf[1] === 0x49 && buf[2] === 0xBC) {
return {
ext: 'jxr',
mime: 'image/vnd.ms-photo'
};
}
if (buf[0] === 0x49 && buf[1] === 0x49 && buf[2] === 0xBC) {
return {
ext: 'jxr',
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'
};
}
if (buf[0] === 0x38 && buf[1] === 0x42 && buf[2] === 0x50 && buf[3] === 0x53) {
return {
ext: 'psd',
mime: 'image/vnd.adobe.photoshop',
};
}
// needs to be before `zip` check
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'
};
}
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',
};
}
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'
};
}
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',
};
}
if (buf[257] === 0x75 && buf[258] === 0x73 && buf[259] === 0x74 && buf[260] === 0x61 && buf[261] === 0x72) {
return {
ext: 'tar',
mime: 'application/x-tar'
};
}
if (buf[257] === 0x75 && buf[258] === 0x73 && buf[259] === 0x74 && buf[260] === 0x61 && buf[261] === 0x72) {
return {
ext: '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'
};
}
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',
};
}
if (buf[0] === 0x1F && buf[1] === 0x8B && buf[2] === 0x8) {
return {
ext: 'gz',
mime: 'application/gzip'
};
}
if (buf[0] === 0x1F && buf[1] === 0x8B && buf[2] === 0x8) {
return {
ext: 'gz',
mime: 'application/gzip',
};
}
if (buf[0] === 0x42 && buf[1] === 0x5A && buf[2] === 0x68) {
return {
ext: 'bz2',
mime: 'application/x-bzip2'
};
}
if (buf[0] === 0x42 && buf[1] === 0x5A && buf[2] === 0x68) {
return {
ext: 'bz2',
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'
};
}
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',
};
}
if (buf[0] === 0x78 && buf[1] === 0x01) {
return {
ext: 'dmg',
mime: 'application/x-apple-diskimage'
};
}
if (buf[0] === 0x78 && buf[1] === 0x01) {
return {
ext: 'dmg',
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'
};
}
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',
};
}
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'
};
}
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',
};
}
if (buf[0] === 0x4D && buf[1] === 0x54 && buf[2] === 0x68 && buf[3] === 0x64) {
return {
ext: 'mid',
mime: 'audio/midi'
};
}
if (buf[0] === 0x4D && buf[1] === 0x54 && buf[2] === 0x68 && buf[3] === 0x64) {
return {
ext: 'mid',
mime: 'audio/midi',
};
}
// needs to be before the `webm` check
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'
};
}
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',
};
}
if (buf[0] === 0x1A && buf[1] === 0x45 && buf[2] === 0xDF && buf[3] === 0xA3) {
return {
ext: 'webm',
mime: 'video/webm'
};
}
if (buf[0] === 0x1A && buf[1] === 0x45 && buf[2] === 0xDF && buf[3] === 0xA3) {
return {
ext: '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'
};
}
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',
};
}
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'
};
}
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',
};
}
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'
};
}
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',
};
}
if (buf[0] === 0x0 && buf[1] === 0x0 && buf[2] === 0x1 && buf[3].toString(16)[0] === 'b') {
return {
ext: 'mpg',
mime: 'video/mpeg'
};
}
if (buf[0] === 0x0 && buf[1] === 0x0 && buf[2] === 0x1 && buf[3].toString(16)[0] === 'b') {
return {
ext: 'mpg',
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'
};
}
if ((buf[0] === 0x49 && buf[1] === 0x44 && buf[2] === 0x33) || (buf[0] === 0xFF && buf[1] === 0xfb)) {
return {
ext: 'mp3',
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'
};
}
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',
};
}
if (buf[0] === 0x4F && buf[1] === 0x67 && buf[2] === 0x67 && buf[3] === 0x53) {
return {
ext: 'ogg',
mime: 'audio/ogg'
};
}
if (buf[0] === 0x4F && buf[1] === 0x67 && buf[2] === 0x67 && buf[3] === 0x53) {
return {
ext: 'ogg',
mime: 'audio/ogg',
};
}
if (buf[0] === 0x66 && buf[1] === 0x4C && buf[2] === 0x61 && buf[3] === 0x43) {
return {
ext: 'flac',
mime: 'audio/x-flac'
};
}
if (buf[0] === 0x66 && buf[1] === 0x4C && buf[2] === 0x61 && buf[3] === 0x43) {
return {
ext: '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'
};
}
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',
};
}
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'
};
}
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',
};
}
if (buf[0] === 0x25 && buf[1] === 0x50 && buf[2] === 0x44 && buf[3] === 0x46) {
return {
ext: 'pdf',
mime: 'application/pdf'
};
}
if (buf[0] === 0x25 && buf[1] === 0x50 && buf[2] === 0x44 && buf[3] === 0x46) {
return {
ext: 'pdf',
mime: 'application/pdf',
};
}
if (buf[0] === 0x4D && buf[1] === 0x5A) {
return {
ext: 'exe',
mime: 'application/x-msdownload'
};
}
if (buf[0] === 0x4D && buf[1] === 0x5A) {
return {
ext: 'exe',
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'
};
}
if ((buf[0] === 0x43 || buf[0] === 0x46) && buf[1] === 0x57 && buf[2] === 0x53) {
return {
ext: 'swf',
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'
};
}
if (buf[0] === 0x7B && buf[1] === 0x5C && buf[2] === 0x72 && buf[3] === 0x74 && buf[4] === 0x66) {
return {
ext: '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'
};
}
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',
};
}
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'
};
}
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',
};
}
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'
};
}
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',
};
}
if (buf[0] === 0x00 && buf[1] === 0x01 && buf[2] === 0x00 && buf[3] === 0x00 && buf[4] === 0x00) {
return {
ext: 'ttf',
mime: 'application/font-sfnt'
};
}
if (buf[0] === 0x00 && buf[1] === 0x01 && buf[2] === 0x00 && buf[3] === 0x00 && buf[4] === 0x00) {
return {
ext: 'ttf',
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'
};
}
if (buf[0] === 0x4F && buf[1] === 0x54 && buf[2] === 0x54 && buf[3] === 0x4F && buf[4] === 0x00) {
return {
ext: 'otf',
mime: 'application/font-sfnt',
};
}
if (buf[0] === 0x00 && buf[1] === 0x00 && buf[2] === 0x01 && buf[3] === 0x00) {
return {
ext: 'ico',
mime: 'image/x-icon'
};
}
if (buf[0] === 0x00 && buf[1] === 0x00 && buf[2] === 0x01 && buf[3] === 0x00) {
return {
ext: 'ico',
mime: 'image/x-icon',
};
}
if (buf[0] === 0x46 && buf[1] === 0x4C && buf[2] === 0x56 && buf[3] === 0x01) {
return {
ext: 'flv',
mime: 'video/x-flv'
};
}
if (buf[0] === 0x46 && buf[1] === 0x4C && buf[2] === 0x56 && buf[3] === 0x01) {
return {
ext: 'flv',
mime: 'video/x-flv',
};
}
if (buf[0] === 0x25 && buf[1] === 0x21) {
return {
ext: 'ps',
mime: 'application/postscript'
};
}
if (buf[0] === 0x25 && buf[1] === 0x21) {
return {
ext: 'ps',
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'
};
}
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',
};
}
if (buf[0] === 0x53 && buf[1] === 0x51 && buf[2] === 0x4C && buf[3] === 0x69) {
return {
ext: 'sqlite',
mime: 'application/x-sqlite3',
};
}
if (buf[0] === 0x53 && buf[1] === 0x51 && buf[2] === 0x4C && buf[3] === 0x69) {
return {
ext: 'sqlite',
mime: 'application/x-sqlite3'
};
}
// Added by n1474335 [n1474335@gmail.com] from here on
// ################################################################## //
if ((buf[0] === 0x1F && buf[1] === 0x9D) || (buf[0] === 0x1F && buf[1] === 0xA0)) {
return {
ext: 'z, tar.z',
mime: 'application/x-gtar'
};
}
if (buf[0] === 0x7F && buf[1] === 0x45 && buf[2] === 0x4C && buf[3] === 0x46) {
return {
ext: 'none, axf, bin, elf, o, prx, puff, so',
mime: 'application/x-executable',
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'
};
}
if (buf[0] === 0xEF && buf[1] === 0xBB && buf[2] === 0xBF) {
return {
ext: 'txt',
mime: 'text/plain',
desc: 'UTF-8 encoded Unicode byte order mark detected, commonly but not exclusively seen in text files.'
};
}
if ((buf[0] === 0x1F && buf[1] === 0x9D) || (buf[0] === 0x1F && buf[1] === 0xA0)) {
return {
ext: 'z, tar.z',
mime: 'application/x-gtar',
};
}
if (buf[0] === 0x7F && buf[1] === 0x45 && buf[2] === 0x4C && buf[3] === 0x46) {
return {
ext: 'none, axf, bin, elf, o, prx, puff, so',
mime: 'application/x-executable',
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',
};
}
if (buf[0] === 0xEF && buf[1] === 0xBB && buf[2] === 0xBF) {
return {
ext: 'txt',
mime: 'text/plain',
desc: 'UTF-8 encoded Unicode byte order mark detected, commonly but not exclusively seen in text files.',
};
}
// Must be before Little-endian UTF-16 BOM
if (buf[0] === 0xFF && buf[1] === 0xFE && buf[2] === 0x00 && buf[3] === 0x00) {
return {
ext: '',
mime: '',
desc: 'Little-endian UTF-32 encoded Unicode byte order mark detected.'
};
}
if (buf[0] === 0xFF && buf[1] === 0xFE) {
return {
ext: '',
mime: '',
desc: 'Little-endian UTF-16 encoded Unicode byte order mark detected.'
};
}
if ((buf[0x8001] === 0x43 && buf[0x8002] === 0x44 && buf[0x8003] === 0x30 && buf[0x8004] === 0x30 && buf[0x8005] === 0x31) ||
if (buf[0] === 0xFF && buf[1] === 0xFE && buf[2] === 0x00 && buf[3] === 0x00) {
return {
ext: '',
mime: '',
desc: 'Little-endian UTF-32 encoded Unicode byte order mark detected.',
};
}
if (buf[0] === 0xFF && buf[1] === 0xFE) {
return {
ext: '',
mime: '',
desc: 'Little-endian UTF-16 encoded Unicode byte order mark detected.',
};
}
if ((buf[0x8001] === 0x43 && buf[0x8002] === 0x44 && buf[0x8003] === 0x30 && buf[0x8004] === 0x30 && buf[0x8005] === 0x31) ||
(buf[0x8801] === 0x43 && buf[0x8802] === 0x44 && buf[0x8803] === 0x30 && buf[0x8804] === 0x30 && buf[0x8805] === 0x31) ||
(buf[0x9001] === 0x43 && buf[0x9002] === 0x44 && buf[0x9003] === 0x30 && buf[0x9004] === 0x30 && buf[0x9005] === 0x31)) {
return {
ext: 'iso',
mime: 'application/octet-stream',
desc: 'ISO 9660 CD/DVD image file'
};
}
if (buf[0] === 0xD0 && buf[1] === 0xCF && buf[2] === 0x11 && buf[3] === 0xE0 && buf[4] === 0xA1 && buf[5] === 0xB1 && buf[6] === 0x1A && buf[7] === 0xE1) {
return {
ext: 'doc, xls, ppt',
mime: 'application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint',
desc: 'Microsoft Office documents'
};
}
if (buf[0] === 0x64 && buf[1] === 0x65 && buf[2] === 0x78 && buf[3] === 0x0A && buf[4] === 0x30 && buf[5] === 0x33 && buf[6] === 0x35 && buf[7] === 0x00) {
return {
ext: 'dex',
mime: 'application/octet-stream',
desc: 'Dalvik Executable (Android)'
};
}
if (buf[0] === 0x4B && buf[1] === 0x44 && buf[2] === 0x4D) {
return {
ext: 'vmdk',
mime: 'application/vmdk, application/x-virtualbox-vmdk'
};
}
if (buf[0] === 0x43 && buf[1] === 0x72 && buf[2] === 0x32 && buf[3] == 0x34) {
return {
ext: 'crx',
mime: 'application/crx',
desc: 'Google Chrome extension or packaged app'
};
}
return {
ext: 'iso',
mime: 'application/octet-stream',
desc: 'ISO 9660 CD/DVD image file',
};
}
return null;
},
if (buf[0] === 0xD0 && buf[1] === 0xCF && buf[2] === 0x11 && buf[3] === 0xE0 && buf[4] === 0xA1 && buf[5] === 0xB1 && buf[6] === 0x1A && buf[7] === 0xE1) {
return {
ext: 'doc, xls, ppt',
mime: 'application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint',
desc: 'Microsoft Office documents',
};
}
if (buf[0] === 0x64 && buf[1] === 0x65 && buf[2] === 0x78 && buf[3] === 0x0A && buf[4] === 0x30 && buf[5] === 0x33 && buf[6] === 0x35 && buf[7] === 0x00) {
return {
ext: 'dex',
mime: 'application/octet-stream',
desc: 'Dalvik Executable (Android)',
};
}
if (buf[0] === 0x4B && buf[1] === 0x44 && buf[2] === 0x4D) {
return {
ext: 'vmdk',
mime: 'application/vmdk, application/x-virtualbox-vmdk',
};
}
if (buf[0] === 0x43 && buf[1] === 0x72 && buf[2] === 0x32 && buf[3] == 0x34) {
return {
ext: 'crx',
mime: 'application/crx',
desc: 'Google Chrome extension or packaged app',
};
}
return null;
},
};

File diff suppressed because it is too large Load Diff

View File

@ -9,8 +9,8 @@
*
* @namespace
*/
var HTTP = {
const HTTP = {
/**
* Strip HTTP headers operation.
*
@ -18,14 +18,14 @@ 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;
return (header_end < 2) ? input : input.slice(header_end, input.length);
},
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);
},
/**
* Parse User Agent operation.
*
@ -33,21 +33,21 @@ var HTTP = {
* @param {Object[]} args
* @returns {string}
*/
run_parse_user_agent: function(input, args) {
var 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";
},
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`;
},
};

View File

@ -9,8 +9,8 @@
*
* @namespace
*/
var Hash = {
const Hash = {
/**
* MD5 operation.
*
@ -18,12 +18,12 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_md5: function (input, args) {
input = CryptoJS.enc.Latin1.parse(input); // Cast to WordArray
return CryptoJS.MD5(input).toString(CryptoJS.enc.Hex);
},
run_md5(input, args) {
input = CryptoJS.enc.Latin1.parse(input); // Cast to WordArray
return CryptoJS.MD5(input).toString(CryptoJS.enc.Hex);
},
/**
* SHA1 operation.
*
@ -31,12 +31,12 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_sha1: function (input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA1(input).toString(CryptoJS.enc.Hex);
},
run_sha1(input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA1(input).toString(CryptoJS.enc.Hex);
},
/**
* SHA224 operation.
*
@ -44,12 +44,12 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_sha224: function (input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA224(input).toString(CryptoJS.enc.Hex);
},
run_sha224(input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA224(input).toString(CryptoJS.enc.Hex);
},
/**
* SHA256 operation.
*
@ -57,12 +57,12 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_sha256: function (input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA256(input).toString(CryptoJS.enc.Hex);
},
run_sha256(input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA256(input).toString(CryptoJS.enc.Hex);
},
/**
* SHA384 operation.
*
@ -70,12 +70,12 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_sha384: function (input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA384(input).toString(CryptoJS.enc.Hex);
},
run_sha384(input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA384(input).toString(CryptoJS.enc.Hex);
},
/**
* SHA512 operation.
*
@ -83,18 +83,18 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_sha512: function (input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA512(input).toString(CryptoJS.enc.Hex);
},
run_sha512(input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA512(input).toString(CryptoJS.enc.Hex);
},
/**
* @constant
* @default
*/
SHA3_LENGTH: ["512", "384", "256", "224"],
SHA3_LENGTH: ['512', '384', '256', '224'],
/**
* SHA3 operation.
*
@ -102,16 +102,16 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_sha3: function (input, args) {
input = CryptoJS.enc.Latin1.parse(input);
var sha3_length = args[0],
options = {
outputLength: parseInt(sha3_length, 10)
};
return CryptoJS.SHA3(input, options).toString(CryptoJS.enc.Hex);
},
run_sha3(input, args) {
input = CryptoJS.enc.Latin1.parse(input);
let sha3_length = args[0],
options = {
outputLength: parseInt(sha3_length, 10),
};
return CryptoJS.SHA3(input, options).toString(CryptoJS.enc.Hex);
},
/**
* RIPEMD-160 operation.
*
@ -119,18 +119,18 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_ripemd160: function (input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.RIPEMD160(input).toString(CryptoJS.enc.Hex);
},
run_ripemd160(input, args) {
input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.RIPEMD160(input).toString(CryptoJS.enc.Hex);
},
/**
* @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,23 +138,23 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_hmac: function (input, args) {
var 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]),
};
return execute[hash_func].toString(CryptoJS.enc.Hex);
},
run_hmac(input, args) {
const hash_func = args[1];
input = CryptoJS.enc.Latin1.parse(input);
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);
},
/**
* Generate all hashes operation.
*
@ -162,28 +162,28 @@ 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, []);
return output;
},
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;
},
/**
* Analyse hash operation.
*
@ -191,151 +191,151 @@ var Hash = {
* @param {Object[]} args
* @returns {string}
*/
run_analyse: function(input, args) {
input = input.replace(/\s/g, "");
var output = "",
byte_length = input.length / 2,
bit_length = byte_length * 8,
possible_hash_functions = [];
if (!/^[a-f0-9]+$/i.test(input)) {
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";
switch (bit_length) {
case 4:
possible_hash_functions = [
"Fletcher-4",
"Luhn algorithm",
"Verhoeff algorithm",
];
break;
case 8:
possible_hash_functions = [
"Fletcher-8",
];
break;
case 16:
possible_hash_functions = [
"BSD checksum",
"CRC-16",
"SYSV checksum",
"Fletcher-16"
];
break;
case 32:
possible_hash_functions = [
"CRC-32",
"Fletcher-32",
"Adler-32",
];
break;
case 64:
possible_hash_functions = [
"CRC-64",
"RIPEMD-64",
"SipHash",
];
break;
case 128:
possible_hash_functions = [
"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",
];
break;
case 192:
possible_hash_functions = [
"Tiger",
"HAVAL-192",
];
break;
case 224:
possible_hash_functions = [
"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",
];
break;
case 320:
possible_hash_functions = [
"RIPEMD-320",
];
break;
case 384:
possible_hash_functions = [
"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",
];
break;
case 1024:
possible_hash_functions = [
"Fowler-Noll-Vo",
];
break;
default:
possible_hash_functions = [
"Unknown"
];
break;
}
return output + possible_hash_functions.join("\n");
},
run_analyse(input, args) {
input = input.replace(/\s/g, '');
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';
}
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',
];
break;
case 8:
possible_hash_functions = [
'Fletcher-8',
];
break;
case 16:
possible_hash_functions = [
'BSD checksum',
'CRC-16',
'SYSV checksum',
'Fletcher-16',
];
break;
case 32:
possible_hash_functions = [
'CRC-32',
'Fletcher-32',
'Adler-32',
];
break;
case 64:
possible_hash_functions = [
'CRC-64',
'RIPEMD-64',
'SipHash',
];
break;
case 128:
possible_hash_functions = [
'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',
];
break;
case 192:
possible_hash_functions = [
'Tiger',
'HAVAL-192',
];
break;
case 224:
possible_hash_functions = [
'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',
];
break;
case 320:
possible_hash_functions = [
'RIPEMD-320',
];
break;
case 384:
possible_hash_functions = [
'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',
];
break;
case 1024:
possible_hash_functions = [
'Fowler-Noll-Vo',
];
break;
default:
possible_hash_functions = [
'Unknown',
];
break;
}
return output + possible_hash_functions.join('\n');
},
};

View File

@ -9,24 +9,24 @@
*
* @namespace
*/
var Hexdump = {
const Hexdump = {
/**
* @constant
* @default
*/
WIDTH: 16,
WIDTH: 16,
/**
* @constant
* @default
*/
UPPER_CASE: false,
UPPER_CASE: false,
/**
* @constant
* @default
*/
INCLUDE_FINAL_LENGTH: false,
INCLUDE_FINAL_LENGTH: false,
/**
* To Hexdump operation.
*
@ -34,39 +34,40 @@ 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];
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) + " ";
}
var 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";
if (include_final_length && i+buff.length == input.length) {
output += Utils.hex(i+buff.length, 8) + "\n";
}
}
return output.slice(0, -1);
},
run_to(input, args) {
const length = args[0] || Hexdump.WIDTH;
const upper_case = args[1];
const include_final_length = args[2];
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)} `;
}
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`;
if (include_final_length && i + buff.length == input.length) {
output += `${Utils.hex(i + buff.length, 8)}\n`;
}
}
return output.slice(0, -1);
},
/**
* From Hexdump operation.
*
@ -74,28 +75,29 @@ var Hexdump = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_from: function(input, args) {
var 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;
while (!!(block = regex.exec(input))) {
line = Utils.from_hex(block[1].replace(/-/g, " "));
for (var i = 0; i < line.length; i++) {
output.push(line[i]);
}
}
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;
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) {
app.options.attempt_highlight = false;
}
return output;
},
if (Math.floor(w) != w || input.indexOf('\r') != -1 || output.indexOf(13) != -1) {
app.options.attempt_highlight = false;
}
return output;
},
/**
* Highlight to hexdump
*
@ -105,55 +107,56 @@ 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),
line = Math.floor(pos[0].start / w),
offset = pos[0].start % w,
start = 0,
end = 0;
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;
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;
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;
// 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);
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 });
while (end < pos[0].end) {
start_line_num++;
start = start_line_num * width + 10;
end = (start_line_num+1) * width - w - 5;
if (end > pos[0].end) end = pos[0].end;
pos.push({ start: start, end: end });
}
}
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, end });
while (end < pos[0].end) {
start_line_num++;
start = start_line_num * width + 10;
end = (start_line_num + 1) * width - w - 5;
if (end > pos[0].end) end = pos[0].end;
pos.push({ start, end });
}
}
// Set up multiple selections for ASCII
var len = pos.length, line_num = 0;
start = 0;
end = 0;
for (var 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 });
}
return pos;
},
let len = pos.length,
line_num = 0;
start = 0;
end = 0;
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, end });
}
return pos;
},
/**
* Highlight from hexdump
*
@ -163,33 +166,33 @@ var Hexdump = {
* @param {Object[]} args
* @returns {Object[]} pos
*/
highlight_from: function(pos, args) {
var w = args[0] || 16;
var width = 14 + (w*4);
var line = Math.floor(pos[0].start / width);
var 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;
} else { // In byte section
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;
} else { // In byte section
pos[0].end = line*w + Math.ceil((offset-10)/3);
}
return pos;
},
highlight_from(pos, args) {
const w = args[0] || 16;
const width = 14 + (w * 4);
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;
} else { // In byte section
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;
} else { // In byte section
pos[0].end = line * w + Math.ceil((offset - 10) / 3);
}
return pos;
},
};

File diff suppressed because it is too large Load Diff

View File

@ -9,34 +9,34 @@
*
* @namespace
*/
var JS = {
const JS = {
/**
* @constant
* @default
*/
PARSE_LOC: false,
PARSE_LOC: false,
/**
* @constant
* @default
*/
PARSE_RANGE: false,
PARSE_RANGE: false,
/**
* @constant
* @default
*/
PARSE_TOKENS: false,
PARSE_TOKENS: false,
/**
* @constant
* @default
*/
PARSE_COMMENT: false,
PARSE_COMMENT: false,
/**
* @constant
* @default
*/
PARSE_TOLERANT: false,
PARSE_TOLERANT: false,
/**
* JavaScript Parser operation.
*
@ -44,47 +44,47 @@ var JS = {
* @param {Object[]} args
* @returns {string}
*/
run_parse: function (input, args) {
var parse_loc = args[0],
parse_range = args[1],
parse_tokens = args[2],
parse_comment = args[3],
parse_tolerant = args[4],
result = {},
options = {
loc: parse_loc,
range: parse_range,
tokens: parse_tokens,
comment: parse_comment,
tolerant: parse_tolerant
};
result = esprima.parse(input, options);
return JSON.stringify(result, null, 2);
},
run_parse(input, args) {
let parse_loc = args[0],
parse_range = args[1],
parse_tokens = args[2],
parse_comment = args[3],
parse_tolerant = args[4],
result = {},
options = {
loc: parse_loc,
range: parse_range,
tokens: parse_tokens,
comment: parse_comment,
tolerant: parse_tolerant,
};
result = esprima.parse(input, options);
return JSON.stringify(result, null, 2);
},
/**
* @constant
* @default
*/
BEAUTIFY_INDENT: "\\t",
BEAUTIFY_INDENT: '\\t',
/**
* @constant
* @default
*/
BEAUTIFY_QUOTES: ["Auto", "Single", "Double"],
BEAUTIFY_QUOTES: ['Auto', 'Single', 'Double'],
/**
* @constant
* @default
*/
BEAUTIFY_SEMICOLONS: true,
BEAUTIFY_SEMICOLONS: true,
/**
* @constant
* @default
*/
BEAUTIFY_COMMENT: true,
BEAUTIFY_COMMENT: true,
/**
* JavaScript Beautify operation.
*
@ -92,44 +92,45 @@ var JS = {
* @param {Object[]} args
* @returns {string}
*/
run_beautify: function(input, args) {
var beautify_indent = args[0] || JS.BEAUTIFY_INDENT,
quotes = args[1].toLowerCase(),
beautify_semicolons = args[2],
beautify_comment = args[3],
result = "",
AST;
try {
AST = esprima.parse(input, {
range: true,
tokens: true,
comment: true
});
var options = {
format: {
indent: {
style: beautify_indent
},
quotes: quotes,
semicolons: beautify_semicolons,
},
comment: beautify_comment
};
if (options.comment)
AST = escodegen.attachComments(AST, AST.comments, AST.tokens);
result = escodegen.generate(AST, options);
} catch(e) {
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 = '',
AST;
try {
AST = esprima.parse(input, {
range: true,
tokens: true,
comment: true,
});
const options = {
format: {
indent: {
style: beautify_indent,
},
quotes,
semicolons: beautify_semicolons,
},
comment: beautify_comment,
};
if (options.comment) {
AST = escodegen.attachComments(AST, AST.comments, AST.tokens);
}
result = escodegen.generate(AST, options);
} catch (e) {
// Leave original error so the user can see the detail
throw "Unable to parse JavaScript.<br>" + e.message;
}
return result;
},
throw `Unable to parse JavaScript.<br>${e.message}`;
}
return result;
},
/**
* JavaScript Minify operation.
*
@ -137,23 +138,23 @@ var JS = {
* @param {Object[]} args
* @returns {string}
*/
run_minify: function(input, args) {
var result = "",
AST = esprima.parse(input),
optimised_AST = esmangle.optimize(AST, null),
mangled_AST = esmangle.mangle(optimised_AST);
result = escodegen.generate(mangled_AST, {
format: {
renumber: true,
hexadecimal: true,
escapeless: true,
compact: true,
semicolons: false,
parentheses: false
}
});
return result;
},
run_minify(input, args) {
let result = '',
AST = esprima.parse(input),
optimised_AST = esmangle.optimize(AST, null),
mangled_AST = esmangle.mangle(optimised_AST);
result = escodegen.generate(mangled_AST, {
format: {
renumber: true,
hexadecimal: true,
escapeless: true,
compact: true,
semicolons: false,
parentheses: false,
},
});
return result;
},
};

View File

@ -7,33 +7,33 @@
*
* @namespace
*/
var MAC = {
const MAC = {
/**
* @constant
* @default
*/
OUTPUT_CASE: ["Both", "Upper only", "Lower only"],
OUTPUT_CASE: ['Both', 'Upper only', 'Lower only'],
/**
* @constant
* @default
*/
NO_DELIM: true,
NO_DELIM: true,
/**
* @constant
* @default
*/
DASH_DELIM: true,
DASH_DELIM: true,
/**
* @constant
* @default
*/
COLON_DELIM: true,
COLON_DELIM: true,
/**
* @constant
* @default
*/
CISCO_STYLE: false,
CISCO_STYLE: false,
/**
* Format MAC addresses operation.
@ -42,47 +42,47 @@ var MAC = {
* @param {Object[]} args
* @returns {string}
*/
run_format: function(input, args) {
if (!input) return "";
var output_case = args[0],
no_delim = args[1],
dash_delim = args[2],
colon_delim = args[3],
cisco_style = args[4],
output_list = [],
macs = input.toLowerCase().split(/[,\s\r\n]+/);
run_format(input, args) {
if (!input) return '';
macs.forEach(function(mac) {
var 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 (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") {
if (no_delim) output_list.push(cleanMac.toUpperCase());
if (dash_delim) output_list.push(macHyphen.toUpperCase());
if (colon_delim) output_list.push(macColon.toUpperCase());
if (cisco_style) output_list.push(macCisco.toUpperCase());
} else {
if (no_delim) output_list.push(cleanMac, cleanMac.toUpperCase());
if (dash_delim) output_list.push(macHyphen, macHyphen.toUpperCase());
if (colon_delim) output_list.push(macColon, macColon.toUpperCase());
if (cisco_style) output_list.push(macCisco, macCisco.toUpperCase());
}
output_list.push(
"" // Empty line to delimit groups
let output_case = args[0],
no_delim = args[1],
dash_delim = args[2],
colon_delim = args[3],
cisco_style = args[4],
output_list = [],
macs = input.toLowerCase().split(/[,\s\r\n]+/);
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 (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') {
if (no_delim) output_list.push(cleanMac.toUpperCase());
if (dash_delim) output_list.push(macHyphen.toUpperCase());
if (colon_delim) output_list.push(macColon.toUpperCase());
if (cisco_style) output_list.push(macCisco.toUpperCase());
} else {
if (no_delim) output_list.push(cleanMac, cleanMac.toUpperCase());
if (dash_delim) output_list.push(macHyphen, macHyphen.toUpperCase());
if (colon_delim) output_list.push(macColon, macColon.toUpperCase());
if (cisco_style) output_list.push(macCisco, macCisco.toUpperCase());
}
output_list.push(
'', // Empty line to delimit groups
);
});
});
// Return the data as a string
return output_list.join('\n');
},
return output_list.join('\n');
},
};

View File

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

View File

@ -7,7 +7,7 @@
*
* @namespace
*/
var OS = {
const OS = {
/**
* Parse UNIX file permissions operation.
@ -16,184 +16,184 @@ 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
},
d = 0,
u = 0,
g = 0,
o = 0,
output = "",
octal = null,
textual = null;
if (input.search(/\s*[0-7]{1,4}\s*/i) === 0) {
// Input is octal
octal = input.match(/\s*([0-7]{1,4})\s*/i)[1];
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 = '',
octal = null,
textual = null;
if (octal.length == 4) {
d = parseInt(octal[0], 8);
u = parseInt(octal[1], 8);
g = parseInt(octal[2], 8);
o = parseInt(octal[3], 8);
} else {
if (octal.length > 0) u = parseInt(octal[0], 8);
if (octal.length > 1) g = parseInt(octal[1], 8);
if (octal.length > 2) o = parseInt(octal[2], 8);
}
perms.su = d >> 2 & 0x1;
perms.sg = d >> 1 & 0x1;
perms.sb = d & 0x1;
perms.ru = u >> 2 & 0x1;
perms.wu = u >> 1 & 0x1;
perms.eu = u & 0x1;
perms.rg = g >> 2 & 0x1;
perms.wg = g >> 1 & 0x1;
perms.eg = g & 0x1;
perms.ro = o >> 2 & 0x1;
perms.wo = o >> 1 & 0x1;
perms.eo = o & 0x1;
} else if (input.search(/\s*[dlpcbDrwxsStT-]{1,10}\s*/) === 0) {
if (input.search(/\s*[0-7]{1,4}\s*/i) === 0) {
// Input is octal
octal = input.match(/\s*([0-7]{1,4})\s*/i)[1];
if (octal.length == 4) {
d = parseInt(octal[0], 8);
u = parseInt(octal[1], 8);
g = parseInt(octal[2], 8);
o = parseInt(octal[3], 8);
} else {
if (octal.length > 0) u = parseInt(octal[0], 8);
if (octal.length > 1) g = parseInt(octal[1], 8);
if (octal.length > 2) o = parseInt(octal[2], 8);
}
perms.su = d >> 2 & 0x1;
perms.sg = d >> 1 & 0x1;
perms.sb = d & 0x1;
perms.ru = u >> 2 & 0x1;
perms.wu = u >> 1 & 0x1;
perms.eu = u & 0x1;
perms.rg = g >> 2 & 0x1;
perms.wg = g >> 1 & 0x1;
perms.eg = g & 0x1;
perms.ro = o >> 2 & 0x1;
perms.wo = o >> 1 & 0x1;
perms.eo = o & 0x1;
} else if (input.search(/\s*[dlpcbDrwxsStT-]{1,10}\s*/) === 0) {
// Input is textual
textual = input.match(/\s*([dlpcbDrwxsStT-]{1,10})\s*/)[1];
switch (textual[0]) {
case "d":
perms.d = true;
break;
case "l":
perms.sl = true;
break;
case "p":
perms.np = true;
break;
case "s":
perms.s = true;
break;
case "c":
perms.cd = true;
break;
case "b":
perms.bd = true;
break;
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 > 3) {
switch (textual[3]) {
case "x":
perms.eu = true;
break;
case "s":
perms.eu = true;
perms.su = true;
break;
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 > 6) {
switch (textual[6]) {
case "x":
perms.eg = true;
break;
case "s":
perms.eg = true;
perms.sg = true;
break;
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 > 9) {
switch (textual[9]) {
case "x":
perms.eo = true;
break;
case "t":
perms.eo = true;
perms.sb = true;
break;
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.";
textual = input.match(/\s*([dlpcbDrwxsStT-]{1,10})\s*/)[1];
switch (textual[0]) {
case 'd':
perms.d = true;
break;
case 'l':
perms.sl = true;
break;
case 'p':
perms.np = true;
break;
case 's':
perms.s = true;
break;
case 'c':
perms.cd = true;
break;
case 'b':
perms.bd = true;
break;
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 > 3) {
switch (textual[3]) {
case 'x':
perms.eu = true;
break;
case 's':
perms.eu = true;
perms.su = true;
break;
case 'S':
perms.su = true;
break;
}
output += "Textual representation: " + OS._perms_to_str(perms);
output += "\nOctal representation: " + OS._perms_to_octal(perms);
}
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':
perms.eg = true;
break;
case 's':
perms.eg = true;
perms.sg = true;
break;
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 > 9) {
switch (textual[9]) {
case 'x':
perms.eo = true;
break;
case 't':
perms.eo = true;
perms.sb = true;
break;
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.';
}
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);
}
if (textual) {
output += `\nFile type: ${OS._ft_from_perms(perms)}`;
}
// setuid, setgid
if (perms.su) {
output += "\nThe setuid flag is set";
}
if (perms.sg) {
output += "\nThe setgid flag is set";
}
if (perms.su) {
output += '\nThe setuid flag is set';
}
if (perms.sg) {
output += '\nThe setgid flag is set';
}
// sticky bit
if (perms.sb) {
output += "\nThe sticky bit is set";
}
if (perms.sb) {
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";
return output;
},
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;
},
/**
* Given a permissions object dictionary, generates a textual permissions string.
*
@ -201,60 +201,60 @@ var OS = {
* @param {Object} perms
* @returns {string}
*/
_perms_to_str: function(perms) {
var 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";
str = type;
str += perms.ru ? "r" : "-";
str += perms.wu ? "w" : "-";
if (perms.eu && perms.su) {
str += "s";
} else if (perms.su) {
str += "S";
} else if (perms.eu) {
str += "x";
} else {
str += "-";
}
str += perms.rg ? "r" : "-";
str += perms.wg ? "w" : "-";
if (perms.eg && perms.sg) {
str += "s";
} else if (perms.sg) {
str += "S";
} else if (perms.eg) {
str += "x";
} else {
str += "-";
}
str += perms.ro ? "r" : "-";
str += perms.wo ? "w" : "-";
if (perms.eo && perms.sb) {
str += "t";
} else if (perms.sb) {
str += "T";
} else if (perms.eo) {
str += "x";
} else {
str += "-";
}
return str;
},
_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';
str = type;
str += perms.ru ? 'r' : '-';
str += perms.wu ? 'w' : '-';
if (perms.eu && perms.su) {
str += 's';
} else if (perms.su) {
str += 'S';
} else if (perms.eu) {
str += 'x';
} else {
str += '-';
}
str += perms.rg ? 'r' : '-';
str += perms.wg ? 'w' : '-';
if (perms.eg && perms.sg) {
str += 's';
} else if (perms.sg) {
str += 'S';
} else if (perms.eg) {
str += 'x';
} else {
str += '-';
}
str += perms.ro ? 'r' : '-';
str += perms.wo ? 'w' : '-';
if (perms.eo && perms.sb) {
str += 't';
} else if (perms.sb) {
str += 'T';
} else if (perms.eo) {
str += 'x';
} else {
str += '-';
}
return str;
},
/**
* Given a permissions object dictionary, generates an octal permissions string.
*
@ -262,32 +262,32 @@ var OS = {
* @param {Object} perms
* @returns {string}
*/
_perms_to_octal: function(perms) {
var d = 0,
u = 0,
g = 0,
o = 0;
if (perms.su) d += 4;
if (perms.sg) d += 2;
if (perms.sb) d += 1;
if (perms.ru) u += 4;
if (perms.wu) u += 2;
if (perms.eu) u += 1;
if (perms.rg) g += 4;
if (perms.wg) g += 2;
if (perms.eg) g += 1;
if (perms.ro) o += 4;
if (perms.wo) o += 2;
if (perms.eo) o += 1;
return d.toString() + u.toString() + g.toString() + o.toString();
},
_perms_to_octal(perms) {
let d = 0,
u = 0,
g = 0,
o = 0;
if (perms.su) d += 4;
if (perms.sg) d += 2;
if (perms.sb) d += 1;
if (perms.ru) u += 4;
if (perms.wu) u += 2;
if (perms.eu) u += 1;
if (perms.rg) g += 4;
if (perms.wg) g += 2;
if (perms.eg) g += 1;
if (perms.ro) o += 4;
if (perms.wo) o += 2;
if (perms.eo) o += 1;
return d.toString() + u.toString() + g.toString() + o.toString();
},
/**
* Given a permissions object dictionary, returns the file type.
*
@ -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

View File

@ -9,14 +9,14 @@
*
* @namespace
*/
var Punycode = {
const Punycode = {
/**
* @constant
* @default
*/
IDN: false,
IDN: false,
/**
* To Punycode operation.
*
@ -24,17 +24,17 @@ var Punycode = {
* @param {Object[]} args
* @returns {string}
*/
run_to_ascii: function(input, args) {
var idn = args[0];
if (idn) {
return punycode.ToASCII(input);
} else {
return punycode.encode(input);
}
},
run_to_ascii(input, args) {
const idn = args[0];
if (idn) {
return punycode.ToASCII(input);
} else {
return punycode.encode(input);
}
},
/**
* From Punycode operation.
*
@ -42,14 +42,14 @@ var Punycode = {
* @param {Object[]} args
* @returns {string}
*/
run_to_unicode: function(input, args) {
var idn = args[0];
if (idn) {
return punycode.ToUnicode(input);
} else {
return punycode.decode(input);
}
},
run_to_unicode(input, args) {
const idn = args[0];
if (idn) {
return punycode.ToUnicode(input);
} else {
return punycode.decode(input);
}
},
};

View File

@ -2,14 +2,14 @@
========================================================================
mimelib: http://github.com/andris9/mimelib
Copyright (c) 2011-2012 Andris Reinman
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@ -30,8 +30,8 @@
*
* @namespace
*/
var QuotedPrintable = {
const QuotedPrintable = {
/**
* To Quoted Printable operation.
*
@ -39,20 +39,16 @@ var QuotedPrintable = {
* @param {Object[]} args
* @returns {string}
*/
run_to: function (input, args) {
var 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");
});
run_to(input, args) {
let mimeEncodedStr = QuotedPrintable.mimeEncode(input);
// fix line breaks
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");
},
/**
* From Quoted Printable operation.
*
@ -60,47 +56,48 @@ var QuotedPrintable = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_from: function (input, args) {
var str = input.replace(/\=(?:\r?\n|$)/g, "");
return QuotedPrintable.mimeDecode(str);
},
run_from(input, args) {
const str = input.replace(/\=(?:\r?\n|$)/g, '');
return QuotedPrintable.mimeDecode(str);
},
/**
* Decodes mime-encoded data.
*
* @param {string} str
* @returns {byte_array}
*/
mimeDecode: function(str) {
var encodedBytesCount = (str.match(/\=[\da-fA-F]{2}/g) || []).length,
bufferLength = str.length - encodedBytesCount * 2,
chr, hex,
buffer = new Array(bufferLength),
bufferPos = 0;
mimeDecode(str) {
let encodedBytesCount = (str.match(/\=[\da-fA-F]{2}/g) || []).length,
bufferLength = str.length - encodedBytesCount * 2,
chr,
hex,
buffer = new Array(bufferLength),
bufferPos = 0;
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)) {
buffer[bufferPos++] = parseInt(hex, 16);
i += 2;
continue;
}
buffer[bufferPos++] = chr.charCodeAt(0);
}
return buffer;
},
for (var 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)) {
buffer[bufferPos++] = parseInt(hex, 16);
i += 2;
continue;
}
buffer[bufferPos++] = chr.charCodeAt(0);
}
return buffer;
},
/**
* Encodes mime data.
*
* @param {byte_array} buffer
* @returns {string}
*/
mimeEncode: function(buffer) {
var ranges = [
mimeEncode(buffer) {
let ranges = [
[0x09],
[0x0A],
[0x0D],
@ -109,22 +106,22 @@ var QuotedPrintable = {
[0x23, 0x3C],
[0x3E],
[0x40, 0x5E],
[0x60, 0x7E]
],
result = "";
[0x60, 0x7E],
],
result = '';
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()}`;
}
return result;
},
for (var 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();
}
return result;
},
/**
* Checks if a given number falls within a given set of ranges.
*
@ -133,19 +130,22 @@ 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)
continue;
if (ranges[i].length == 1 && nr == ranges[i][0])
return true;
if (ranges[i].length == 2 && nr >= ranges[i][0] && nr <= ranges[i][1])
return true;
}
return false;
},
_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]) {
return true;
}
if (ranges[i].length == 2 && nr >= ranges[i][0] && nr <= ranges[i][1]) {
return true;
}
}
return false;
},
/**
* Adds soft line breaks to a string.
* Lines can't be longer that 76 + <CR><LF> = 78 bytes
@ -156,19 +156,19 @@ 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') {
return this._addQPSoftLinebreaks(str, lineLengthMax);
} else {
return this._addBase64SoftLinebreaks(str, lineLengthMax);
}
},
if (encoding == "qp") {
return this._addQPSoftLinebreaks(str, lineLengthMax);
} else {
return this._addBase64SoftLinebreaks(str, lineLengthMax);
}
},
/**
* Adds soft line breaks to a base64 string.
*
@ -177,12 +177,12 @@ 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();
},
/**
* Adds soft line breaks to a quoted printable string.
*
@ -191,80 +191,78 @@ var QuotedPrintable = {
* @param {number} lineLengthMax
* @returns {string}
*/
_addQPSoftLinebreaks: function(mimeEncodedStr, lineLengthMax) {
var pos = 0,
len = mimeEncodedStr.length,
match, code, line,
lineMargin = Math.floor(lineLengthMax / 3),
result = "";
_addQPSoftLinebreaks(mimeEncodedStr, lineLengthMax) {
let pos = 0,
len = mimeEncodedStr.length,
match,
code,
line,
lineMargin = Math.floor(lineLengthMax / 3),
result = '';
// insert soft linebreaks where needed
while (pos < len) {
line = mimeEncodedStr.substr(pos, lineLengthMax);
if ((match = line.match(/\r\n/))) {
line = line.substr(0, match.index + match[0].length);
result += line;
pos += line.length;
continue;
}
while (pos < len) {
line = mimeEncodedStr.substr(pos, lineLengthMax);
if ((match = line.match(/\r\n/))) {
line = line.substr(0, match.index + match[0].length);
result += line;
pos += line.length;
continue;
}
if (line.substr(-1) == "\n") {
if (line.substr(-1) == '\n') {
// nothing to change here
result += line;
pos += line.length;
continue;
} else if ((match = line.substr(-lineMargin).match(/\n.*?$/))) {
result += line;
pos += line.length;
continue;
} else if ((match = line.substr(-lineMargin).match(/\n.*?$/))) {
// truncate to nearest line break
line = line.substr(0, line.length - (match[0].length - 1));
result += line;
pos += line.length;
continue;
} else if (line.length > lineLengthMax - lineMargin && (match = line.substr(-lineMargin).match(/[ \t\.,!\?][^ \t\.,!\?]*$/))) {
line = line.substr(0, line.length - (match[0].length - 1));
result += line;
pos += line.length;
continue;
} 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") {
line = line.substr(0, line.length - 1);
} else {
if (line.match(/\=[\da-f]{0,2}$/i)) {
line = line.substr(0, line.length - (match[0].length - 1));
} else if (line.substr(-1) == '\r') {
line = line.substr(0, line.length - 1);
} 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);
}
// ensure that utf-8 sequences are not split
while (line.length > 3 && line.length < len - pos && !line.match(/^(?:=[\da-f]{2}){1,4}$/i) && (match = line.match(/\=[\da-f]{2}$/ig))) {
code = parseInt(match[0].substr(1, 2), 16);
if (code < 128) {
break;
}
line = line.substr(0, line.length - 3);
if (code >= 0xC0) {
break;
}
}
}
}
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";
} else {
pos += line.length;
}
result += line;
if ((match = line.match(/\=[\da-f]{0,1}$/i))) {
line = line.substr(0, line.length - match[0].length);
}
return result;
},
// ensure that utf-8 sequences are not split
while (line.length > 3 && line.length < len - pos && !line.match(/^(?:=[\da-f]{2}){1,4}$/i) && (match = line.match(/\=[\da-f]{2}$/ig))) {
code = parseInt(match[0].substr(1, 2), 16);
if (code < 128) {
break;
}
line = line.substr(0, line.length - 3);
if (code >= 0xC0) {
break;
}
}
}
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';
} else {
pos += line.length;
}
result += line;
}
return result;
},
};

View File

@ -9,19 +9,19 @@
*
* @todo Support for UTF16
*/
var Rotate = {
const Rotate = {
/**
* @constant
* @default
*/
ROTATE_AMOUNT: 1,
ROTATE_AMOUNT: 1,
/**
* @constant
* @default
*/
ROTATE_WHOLE: false,
ROTATE_WHOLE: false,
/**
* Runs rotation operations across the input data.
*
@ -31,19 +31,19 @@ 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++) {
b = algo(b);
}
result.push(b);
}
return result;
},
_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);
}
return result;
},
/**
* Rotate right operation.
*
@ -51,15 +51,15 @@ var Rotate = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_rotr: function(input, args) {
if (args[1]) {
return Rotate._rotr_whole(input, args[0]);
} else {
return Rotate._rot(input, args[0], Rotate._rotr);
}
},
run_rotr(input, args) {
if (args[1]) {
return Rotate._rotr_whole(input, args[0]);
} else {
return Rotate._rot(input, args[0], Rotate._rotr);
}
},
/**
* Rotate left operation.
*
@ -67,31 +67,31 @@ var Rotate = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_rotl: function(input, args) {
if (args[1]) {
return Rotate._rotl_whole(input, args[0]);
} else {
return Rotate._rot(input, args[0], Rotate._rotl);
}
},
run_rotl(input, args) {
if (args[1]) {
return Rotate._rotl_whole(input, args[0]);
} else {
return Rotate._rot(input, args[0], Rotate._rotl);
}
},
/**
* @constant
* @default
*/
ROT13_AMOUNT: 13,
ROT13_AMOUNT: 13,
/**
* @constant
* @default
*/
ROT13_LOWERCASE: true,
ROT13_LOWERCASE: true,
/**
* @constant
* @default
*/
ROT13_UPPERCASE: true,
ROT13_UPPERCASE: true,
/**
* ROT13 operation.
*
@ -99,33 +99,33 @@ var Rotate = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_rot13: function(input, args) {
var amount = args[2],
output = input,
chr,
rot13_lowercase = args[0],
rot13_upperacse = args[1];
if (amount) {
if (amount < 0) {
amount = 26 - (Math.abs(amount) % 26);
}
for (var i = 0; i < input.length; i++) {
chr = input[i];
if (rot13_upperacse && chr >= 65 && chr <= 90) { // Upper case
chr = (chr - 65 + amount) % 26;
output[i] = chr + 65;
} else if (rot13_lowercase && chr >= 97 && chr <= 122) { // Lower case
chr = (chr - 97 + amount) % 26;
output[i] = chr + 97;
}
}
run_rot13(input, args) {
let amount = args[2],
output = input,
chr,
rot13_lowercase = args[0],
rot13_upperacse = args[1];
if (amount) {
if (amount < 0) {
amount = 26 - (Math.abs(amount) % 26);
}
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;
output[i] = chr + 65;
} else if (rot13_lowercase && chr >= 97 && chr <= 122) { // Lower case
chr = (chr - 97 + amount) % 26;
output[i] = chr + 97;
}
return output;
},
}
}
return output;
},
/**
* Rotate right bitwise op.
*
@ -133,12 +133,12 @@ var Rotate = {
* @param {byte} b
* @returns {byte}
*/
_rotr: function(b) {
var bit = (b & 1) << 7;
return (b >> 1) | bit;
},
_rotr(b) {
const bit = (b & 1) << 7;
return (b >> 1) | bit;
},
/**
* Rotate left bitwise op.
*
@ -146,12 +146,12 @@ var Rotate = {
* @param {byte} b
* @returns {byte}
*/
_rotl: function(b) {
var bit = (b >> 7) & 1;
return ((b << 1) | bit) & 0xFF;
},
_rotl(b) {
const bit = (b >> 7) & 1;
return ((b << 1) | bit) & 0xFF;
},
/**
* Rotates a byte array to the right by a specific amount as a whole, so that bits are wrapped
* from the end of the array to the beginning.
@ -161,23 +161,23 @@ var Rotate = {
* @param {number} amount
* @returns {byte_array}
*/
_rotr_whole: function(data, amount) {
var carry_bits = 0,
new_byte,
result = [];
amount = amount % 8;
for (var i = 0; i < data.length; i++) {
var old_byte = data[i] >>> 0;
new_byte = (old_byte >> amount) | carry_bits;
carry_bits = (old_byte & (Math.pow(2, amount)-1)) << (8-amount);
result.push(new_byte);
}
result[0] |= carry_bits;
return result;
},
_rotr_whole(data, amount) {
let carry_bits = 0,
new_byte,
result = [];
amount %= 8;
for (let i = 0; i < data.length; i++) {
const old_byte = data[i] >>> 0;
new_byte = (old_byte >> amount) | carry_bits;
carry_bits = (old_byte & (Math.pow(2, amount) - 1)) << (8 - amount);
result.push(new_byte);
}
result[0] |= carry_bits;
return result;
},
/**
* Rotates a byte array to the left by a specific amount as a whole, so that bits are wrapped
* from the beginning of the array to the end.
@ -187,20 +187,20 @@ var Rotate = {
* @param {number} amount
* @returns {byte_array}
*/
_rotl_whole: function(data, amount) {
var carry_bits = 0,
new_byte,
result = [];
amount = amount % 8;
for (var i = data.length-1; i >= 0; i--) {
var old_byte = data[i];
new_byte = ((old_byte << amount) | carry_bits) & 0xFF;
carry_bits = (old_byte >> (8-amount)) & (Math.pow(2, amount)-1);
result[i] = (new_byte);
}
result[data.length-1] = result[data.length-1] | carry_bits;
return result;
},
_rotl_whole(data, amount) {
let carry_bits = 0,
new_byte,
result = [];
amount %= 8;
for (let i = data.length - 1; i >= 0; i--) {
const old_byte = data[i];
new_byte = ((old_byte << amount) | carry_bits) & 0xFF;
carry_bits = (old_byte >> (8 - amount)) & (Math.pow(2, amount) - 1);
result[i] = (new_byte);
}
result[data.length - 1] = result[data.length - 1] | carry_bits;
return result;
},
};

View File

@ -7,24 +7,24 @@
*
* @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
*/
SORT_REVERSE: false,
SORT_REVERSE: false,
/**
* @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,25 +32,25 @@ var SeqUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_sort: function (input, args) {
var delim = Utils.char_rep[args[0]],
sort_reverse = args[1],
order = args[2],
sorted = input.split(delim);
if (order == "Alphabetical (case sensitive)") {
sorted = sorted.sort();
} else if (order == "Alphabetical (case insensitive)") {
sorted = sorted.sort(SeqUtils._case_insensitive_sort);
} else if (order == "IP address") {
sorted = sorted.sort(SeqUtils._ip_sort);
}
if (sort_reverse) sorted.reverse();
return sorted.join(delim);
},
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)') {
sorted = sorted.sort();
} else if (order == 'Alphabetical (case insensitive)') {
sorted = sorted.sort(SeqUtils._case_insensitive_sort);
} else if (order == 'IP address') {
sorted = sorted.sort(SeqUtils._ip_sort);
}
if (sort_reverse) sorted.reverse();
return sorted.join(delim);
},
/**
* Unique operation.
*
@ -58,18 +58,18 @@ var SeqUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_unique: function (input, args) {
var delim = Utils.char_rep[args[0]];
return input.split(delim).unique().join(delim);
},
run_unique(input, args) {
const delim = Utils.char_rep[args[0]];
return input.split(delim).unique().join(delim);
},
/**
* @constant
* @default
*/
SEARCH_TYPE: ["Regex", "Extended (\\n, \\t, \\x...)", "Simple string"],
SEARCH_TYPE: ['Regex', 'Extended (\\n, \\t, \\x...)', 'Simple string'],
/**
* Count occurrences operation.
*
@ -77,35 +77,35 @@ var SeqUtils = {
* @param {Object[]} args
* @returns {number}
*/
run_count: function(input, args) {
var search = args[0].string,
type = args[0].option;
if (type == "Regex" && search) {
try {
var regex = new RegExp(search, "gi"),
matches = input.match(regex);
return matches.length;
} catch(err) {
return 0;
}
} else if (search) {
if (type.indexOf("Extended") === 0) {
search = Utils.parse_escaped_chars(search);
}
return input.count(search);
} else {
return 0;
}
},
run_count(input, args) {
let search = args[0].string,
type = args[0].option;
if (type == 'Regex' && search) {
try {
let regex = new RegExp(search, 'gi'),
matches = input.match(regex);
return matches.length;
} catch (err) {
return 0;
}
} else if (search) {
if (type.indexOf('Extended') === 0) {
search = Utils.parse_escaped_chars(search);
}
return input.count(search);
} else {
return 0;
}
},
/**
* @constant
* @default
*/
REVERSE_BY: ["Character", "Line"],
REVERSE_BY: ['Character', 'Line'],
/**
* Reverse operation.
*
@ -113,32 +113,32 @@ var SeqUtils = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_reverse: function (input, args) {
if (args[0] == "Line") {
var lines = [],
line = [],
result = [];
for (var i = 0; i < input.length; i++) {
if (input[i] == 0x0a) {
lines.push(line);
line = [];
} else {
line.push(input[i]);
}
}
lines.push(line);
lines.reverse();
for (i = 0; i < lines.length; i++) {
result = result.concat(lines[i]);
result.push(0x0a);
}
return result.slice(0, input.length);
run_reverse(input, args) {
if (args[0] == 'Line') {
let lines = [],
line = [],
result = [];
for (var i = 0; i < input.length; i++) {
if (input[i] == 0x0a) {
lines.push(line);
line = [];
} else {
return input.reverse();
line.push(input[i]);
}
},
}
lines.push(line);
lines.reverse();
for (i = 0; i < lines.length; i++) {
result = result.concat(lines[i]);
result.push(0x0a);
}
return result.slice(0, input.length);
} else {
return input.reverse();
}
},
/**
* Add line numbers operation.
*
@ -146,18 +146,18 @@ var SeqUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_add_line_numbers: function(input, args) {
var 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";
}
return output.slice(0, output.length-1);
},
run_add_line_numbers(input, args) {
let lines = input.split('\n'),
output = '',
width = lines.length.toString().length;
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);
},
/**
* Remove line numbers operation.
*
@ -165,11 +165,11 @@ 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, '');
},
/**
* Expand alphabet range operation.
*
@ -177,11 +177,11 @@ var SeqUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_expand_alph_range: function(input, args) {
return Utils.expand_alph_range(input).join(args[0]);
},
run_expand_alph_range(input, args) {
return Utils.expand_alph_range(input).join(args[0]);
},
/**
* Comparison operation for sorting of strings ignoring case.
*
@ -190,11 +190,11 @@ var SeqUtils = {
* @param {string} b
* @returns {number}
*/
_case_insensitive_sort: function(a, b) {
return a.toLowerCase().localeCompare(b.toLowerCase());
},
_case_insensitive_sort(a, b) {
return a.toLowerCase().localeCompare(b.toLowerCase());
},
/**
* Comparison operation for sorting of IPv4 addresses.
*
@ -203,18 +203,18 @@ var SeqUtils = {
* @param {string} b
* @returns {number}
*/
_ip_sort: function(a, b) {
var 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;
if (isNaN(a_) && !isNaN(b_)) return 1;
if (!isNaN(a_) && isNaN(b_)) return -1;
if (isNaN(a_) && isNaN(b_)) return a.localeCompare(b);
return a_ - b_;
},
_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;
if (isNaN(a_) && !isNaN(b_)) return 1;
if (!isNaN(a_) && isNaN(b_)) return -1;
if (isNaN(a_) && isNaN(b_)) return a.localeCompare(b);
return a_ - b_;
},
};

View File

@ -9,87 +9,87 @@
*
* @namespace
*/
var StrUtils = {
const StrUtils = {
/**
* @constant
* @default
*/
REGEX_PRE_POPULATE: [
{
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: "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: "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: "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: "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 (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: "Strings",
value: "[A-Za-z\\d/\\-:.,_$%\\x27\"()<>= !\\[\\]{}@]{4,}"
},
],
REGEX_PRE_POPULATE: [
{
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: '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: '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: '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: '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 (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: 'Strings',
value: '[A-Za-z\\d/\\-:.,_$%\\x27"()<>= !\\[\\]{}@]{4,}',
},
],
/**
* @constant
* @default
*/
REGEX_CASE_INSENSITIVE: true,
REGEX_CASE_INSENSITIVE: true,
/**
* @constant
* @default
*/
REGEX_MULTILINE_MATCHING: true,
REGEX_MULTILINE_MATCHING: true,
/**
* @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
*/
DISPLAY_TOTAL: false,
DISPLAY_TOTAL: false,
/**
* Regular expression operation.
*
@ -97,79 +97,48 @@ var StrUtils = {
* @param {Object[]} args
* @returns {html}
*/
run_regex: function(input, args) {
var user_regex = args[1],
i = args[2],
m = args[3],
display_total = args[4],
output_format = args[5],
modifiers = "g";
if (i) modifiers += "i";
if (m) modifiers += "m";
if (user_regex && user_regex != "^" && user_regex != "$") {
try {
var regex = new RegExp(user_regex, modifiers);
switch (output_format) {
case "Highlight matches":
return StrUtils._regex_highlight(input, regex, display_total);
case "List matches":
return Utils.escape_html(StrUtils._regex_list(input, regex, display_total, true, false));
case "List capture groups":
return Utils.escape_html(StrUtils._regex_list(input, regex, display_total, false, true));
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";
}
} catch (err) {
return "Invalid regex. Details: " + err.message;
}
} else {
return Utils.escape_html(input);
}
},
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';
/**
* @constant
* @default
*/
CASE_SCOPE: ["All", "Word", "Sentence", "Paragraph"],
/**
* To Upper case operation.
*
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
run_upper: function (input, args) {
var 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":
/* falls through */
default:
return input.toUpperCase();
if (i) modifiers += 'i';
if (m) modifiers += 'm';
if (user_regex && user_regex != '^' && user_regex != '$') {
try {
const regex = new RegExp(user_regex, modifiers);
switch (output_format) {
case 'Highlight matches':
return StrUtils._regex_highlight(input, regex, display_total);
case 'List matches':
return Utils.escape_html(StrUtils._regex_list(input, regex, display_total, true, false));
case 'List capture groups':
return Utils.escape_html(StrUtils._regex_list(input, regex, display_total, false, true));
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';
}
},
} catch (err) {
return `Invalid regex. Details: ${err.message}`;
}
} else {
return Utils.escape_html(input);
}
},
/**
* @constant
* @default
*/
CASE_SCOPE: ['All', 'Word', 'Sentence', 'Paragraph'],
/**
* To Upper case operation.
*
@ -177,32 +146,57 @@ var StrUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_lower: function (input, args) {
return input.toLowerCase();
},
run_upper(input, args) {
const scope = args[0];
switch (scope) {
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();
}
},
/**
* To Upper case operation.
*
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
run_lower(input, args) {
return input.toLowerCase();
},
/**
* @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,43 +204,43 @@ var StrUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_find_replace: function(input, args) {
var find = args[0].string,
type = args[0].option,
replace = args[1],
g = args[2],
i = args[3],
m = args[4],
modifiers = "";
if (g) modifiers += "g";
if (i) modifiers += "i";
if (m) modifiers += "m";
if (type == "Regex") {
find = new RegExp(find, modifiers);
} else if (type.indexOf("Extended") === 0) {
find = Utils.parse_escaped_chars(find);
}
return input.replace(find, replace, modifiers);
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 = '';
if (g) modifiers += 'g';
if (i) modifiers += 'i';
if (m) modifiers += 'm';
if (type == 'Regex') {
find = new RegExp(find, modifiers);
} else if (type.indexOf('Extended') === 0) {
find = Utils.parse_escaped_chars(find);
}
return input.replace(find, replace, modifiers);
// Non-standard addition of flags in the third argument. This will work in Firefox but
// probably nowhere else. The purpose is to allow global matching when the `find` parameter
// is just a string.
},
},
/**
* @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,26 +248,26 @@ var StrUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_split: function(input, args) {
var split_delim = args[0] || StrUtils.SPLIT_DELIM,
join_delim = Utils.char_rep[args[1]],
sections = input.split(split_delim);
return sections.join(join_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);
return sections.join(join_delim);
},
/**
* @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,71 +275,71 @@ var StrUtils = {
* @param {Object[]} args
* @returns {html}
*/
run_diff: function(input, args) {
var 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 = "",
diff;
if (!samples || samples.length != 2) {
return "Incorrect number of samples, perhaps you need to modify the sample delimiter or add more samples?";
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 = '',
diff;
if (!samples || samples.length != 2) {
return 'Incorrect number of samples, perhaps you need to modify the sample delimiter or add more samples?';
}
switch (diff_by) {
case 'Character':
diff = JsDiff.diffChars(samples[0], samples[1]);
break;
case 'Word':
if (ignore_whitespace) {
diff = JsDiff.diffWords(samples[0], samples[1]);
} else {
diff = JsDiff.diffWordsWithSpace(samples[0], samples[1]);
}
switch (diff_by) {
case "Character":
diff = JsDiff.diffChars(samples[0], samples[1]);
break;
case "Word":
if (ignore_whitespace) {
diff = JsDiff.diffWords(samples[0], samples[1]);
} else {
diff = JsDiff.diffWordsWithSpace(samples[0], samples[1]);
}
break;
case "Line":
if (ignore_whitespace) {
diff = JsDiff.diffTrimmedLines(samples[0], samples[1]);
} else {
diff = JsDiff.diffLines(samples[0], samples[1]);
}
break;
case "Sentence":
diff = JsDiff.diffSentences(samples[0], samples[1]);
break;
case "CSS":
diff = JsDiff.diffCss(samples[0], samples[1]);
break;
case "JSON":
diff = JsDiff.diffJson(samples[0], samples[1]);
break;
default:
return "Invalid 'Diff by' option.";
break;
case 'Line':
if (ignore_whitespace) {
diff = JsDiff.diffTrimmedLines(samples[0], samples[1]);
} else {
diff = JsDiff.diffLines(samples[0], samples[1]);
}
for (var i = 0; i < diff.length; i++) {
if (diff[i].added) {
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>";
} else {
output += Utils.escape_html(diff[i].value);
}
}
return output;
},
break;
case 'Sentence':
diff = JsDiff.diffSentences(samples[0], samples[1]);
break;
case 'CSS':
diff = JsDiff.diffCss(samples[0], samples[1]);
break;
case 'JSON':
diff = JsDiff.diffJson(samples[0], samples[1]);
break;
default:
return "Invalid 'Diff by' option.";
}
for (let i = 0; i < diff.length; i++) {
if (diff[i].added) {
if (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>`;
} else {
output += Utils.escape_html(diff[i].value);
}
}
return output;
},
/**
* @constant
* @default
*/
OFF_CHK_SAMPLE_DELIMITER: "\\n\\n",
OFF_CHK_SAMPLE_DELIMITER: '\\n\\n',
/**
* Offset checker operation.
*
@ -353,73 +347,73 @@ var StrUtils = {
* @param {Object[]} args
* @returns {html}
*/
run_offset_checker: function(input, args) {
var sample_delim = args[0],
samples = input.split(sample_delim),
outputs = [],
i = 0,
s = 0,
match = false,
in_match = false,
chr;
if (!samples || samples.length < 2) {
return "Not enough samples, perhaps you need to modify the sample delimiter or add more data?";
}
run_offset_checker(input, args) {
let sample_delim = args[0],
samples = input.split(sample_delim),
outputs = [],
i = 0,
s = 0,
match = false,
in_match = false,
chr;
if (!samples || samples.length < 2) {
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] = "";
}
for (s = 0; s < samples.length; s++) {
outputs[s] = '';
}
// Loop through each character in the first sample
for (i = 0; i < samples[0].length; i++) {
chr = samples[0][i];
match = false;
for (i = 0; i < samples[0].length; i++) {
chr = samples[0][i];
match = false;
// Loop through each sample to see if the chars are the same
for (s = 1; s < samples.length; s++) {
if (samples[s][i] != chr) {
match = false;
break;
}
match = true;
}
// Write output for each sample
for (s = 0; s < samples.length; s++) {
if (samples[s].length <= i) {
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>";
if (s == samples.length - 1) in_match = true;
} else if (!match && in_match) {
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>";
if (samples[s].length - 1 != i) in_match = false;
}
}
if (samples[0].length - 1 == i) {
if (in_match) outputs[s] += "</span>";
outputs[s] += Utils.escape_html(samples[s].substring(i + 1));
}
}
for (s = 1; s < samples.length; s++) {
if (samples[s][i] != chr) {
match = false;
break;
}
return outputs.join(sample_delim);
},
match = true;
}
// Write output for each sample
for (s = 0; s < samples.length; s++) {
if (samples[s].length <= i) {
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>';
if (s == samples.length - 1) in_match = true;
} else if (!match && in_match) {
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>';
if (samples[s].length - 1 != i) in_match = false;
}
}
if (samples[0].length - 1 == i) {
if (in_match) outputs[s] += '</span>';
outputs[s] += Utils.escape_html(samples[s].substring(i + 1));
}
}
}
return outputs.join(sample_delim);
},
/**
* Parse escaped string operation.
*
@ -427,11 +421,11 @@ var StrUtils = {
* @param {Object[]} args
* @returns {string}
*/
run_parse_escaped_string: function(input, args) {
return Utils.parse_escaped_chars(input);
},
run_parse_escaped_string(input, args) {
return Utils.parse_escaped_chars(input);
},
/**
* Adds HTML highlights to matches within a string.
*
@ -441,37 +435,36 @@ var StrUtils = {
* @param {boolean} display_total
* @returns {string}
*/
_regex_highlight: function(input, regex, display_total) {
var output = "",
m,
hl = 1,
i = 0,
total = 0;
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>";
// Switch highlight
hl = hl == 1 ? 2 : 1;
i = regex.lastIndex;
total++;
}
// Add all after final match
output += Utils.escape_html(input.slice(i, input.length));
if (display_total)
output = "Total found: " + total + "\n\n" + output;
_regex_highlight(input, regex, display_total) {
let output = '',
m,
hl = 1,
i = 0,
total = 0;
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>`;
// Switch highlight
hl = hl == 1 ? 2 : 1;
i = regex.lastIndex;
total++;
}
// Add all after final match
output += Utils.escape_html(input.slice(i, input.length));
if (display_total) { output = `Total found: ${total}\n\n${output}`; }
return output;
},
return output;
},
/**
* Creates a string listing the matches within a string.
*
@ -483,30 +476,29 @@ 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 = "",
total = 0,
match;
while (!!(match = regex.exec(input))) {
total++;
if (matches) {
output += match[0] + "\n";
}
if (capture_groups) {
for (var i = 1; i < match.length; i++) {
if (matches) {
output += " Group " + i + ": ";
}
output += match[i] + "\n";
}
}
_regex_list(input, regex, display_total, matches, capture_groups) {
let output = '',
total = 0,
match;
while (match = regex.exec(input)) {
total++;
if (matches) {
output += `${match[0]}\n`;
}
if (capture_groups) {
for (let i = 1; i < match.length; i++) {
if (matches) {
output += ` Group ${i}: `;
}
output += `${match[i]}\n`;
}
if (display_total)
output = "Total found: " + total + "\n\n" + output;
return output;
},
}
}
if (display_total) { output = `Total found: ${total}\n\n${output}`; }
return output;
},
};

View File

@ -7,39 +7,39 @@
*
* @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,25 +47,25 @@ var Tidy = {
* @param {Object[]} args
* @returns {string}
*/
run_remove_whitespace: function (input, args) {
var remove_spaces = args[0],
remove_cariage_returns = args[1],
remove_line_feeds = args[2],
remove_tabs = args[3],
remove_form_feeds = args[4],
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, "");
return data;
},
run_remove_whitespace(input, args) {
let remove_spaces = args[0],
remove_cariage_returns = args[1],
remove_line_feeds = args[2],
remove_tabs = args[3],
remove_form_feeds = args[4],
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, '');
return data;
},
/**
* Remove null bytes operation.
*
@ -73,31 +73,31 @@ var Tidy = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_remove_nulls: function (input, args) {
var output = [];
for (var i = 0; i < input.length; i++) {
if (input[i] !== 0) output.push(input[i]);
}
return output;
},
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;
},
/**
* @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,51 +105,53 @@ var Tidy = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_drop_bytes: function(input, args) {
var start = args[0],
length = args[1],
apply_to_each_line = args[2];
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));
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 (!apply_to_each_line) {
return input.slice(0, start).concat(input.slice(start + length, input.length));
}
// Split input into lines
var lines = [],
line = [];
for (var i = 0; i < input.length; i++) {
if (input[i] == 0x0a) {
lines.push(line);
line = [];
} else {
line.push(input[i]);
}
}
let lines = [],
line = [];
for (var i = 0; i < input.length; i++) {
if (input[i] == 0x0a) {
lines.push(line);
var output = [];
for (i = 0; i < lines.length; i++) {
output = output.concat(lines[i].slice(0, start).concat(lines[i].slice(start+length, lines[i].length)));
output.push(0x0a);
}
return output.slice(0, output.length-1);
},
line = [];
} else {
line.push(input[i]);
}
}
lines.push(line);
let output = [];
for (i = 0; i < lines.length; i++) {
output = output.concat(lines[i].slice(0, start).concat(lines[i].slice(start + length, lines[i].length)));
output.push(0x0a);
}
return output.slice(0, output.length - 1);
},
/**
* @constant
* @default
*/
TAKE_START: 0,
TAKE_START: 0,
/**
* @constant
* @default
*/
TAKE_LENGTH: 5,
TAKE_LENGTH: 5,
/**
* Take bytes operation.
*
@ -157,56 +159,58 @@ var Tidy = {
* @param {Object[]} args
* @returns {byte_array}
*/
run_take_bytes: function(input, args) {
var start = args[0],
length = args[1],
apply_to_each_line = args[2];
if (start < 0 || length < 0)
throw "Error: Invalid value";
if (!apply_to_each_line)
return input.slice(start, start+length);
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 (!apply_to_each_line) {
return input.slice(start, start + length);
}
// Split input into lines
var lines = [],
line = [];
for (var i = 0; i < input.length; i++) {
if (input[i] == 0x0a) {
lines.push(line);
line = [];
} else {
line.push(input[i]);
}
}
let lines = [],
line = [];
for (var i = 0; i < input.length; i++) {
if (input[i] == 0x0a) {
lines.push(line);
var output = [];
for (i = 0; i < lines.length; i++) {
output = output.concat(lines[i].slice(start, start+length));
output.push(0x0a);
}
return output.slice(0, output.length-1);
},
line = [];
} else {
line.push(input[i]);
}
}
lines.push(line);
let output = [];
for (i = 0; i < lines.length; i++) {
output = output.concat(lines[i].slice(start, start + length));
output.push(0x0a);
}
return output.slice(0, output.length - 1);
},
/**
* @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],
len = args[1],
chr = args[2],
lines = input.split("\n"),
output = "",
i = 0;
if (position == "Start") {
for (i = 0; i < lines.length; i++) {
output += Utils.pad_left(lines[i], lines[i].length+len, chr) + "\n";
}
} else if (position == "End") {
for (i = 0; i < lines.length; i++) {
output += Utils.pad_right(lines[i], lines[i].length+len, chr) + "\n";
}
}
return output.slice(0, output.length-1);
},
run_pad(input, args) {
let position = args[0],
len = args[1],
chr = args[2],
lines = input.split('\n'),
output = '',
i = 0;
if (position == 'Start') {
for (i = 0; i < lines.length; i++) {
output += `${Utils.pad_left(lines[i], lines[i].length + len, chr)}\n`;
}
} else if (position == 'End') {
for (i = 0; i < lines.length; i++) {
output += `${Utils.pad_right(lines[i], lines[i].length + len, chr)}\n`;
}
}
return output.slice(0, output.length - 1);
},
};

View File

@ -10,14 +10,14 @@
*
* @namespace
*/
var URL_ = {
const URL_ = {
/**
* @constant
* @default
*/
ENCODE_ALL: false,
ENCODE_ALL: false,
/**
* URL Encode operation.
*
@ -25,12 +25,12 @@ var URL_ = {
* @param {Object[]} args
* @returns {string}
*/
run_to: function(input, args) {
var encode_all = args[0];
return encode_all ? URL_._encode_all_chars(input) : encodeURI(input);
},
run_to(input, args) {
const encode_all = args[0];
return encode_all ? URL_._encode_all_chars(input) : encodeURI(input);
},
/**
* URL Decode operation.
*
@ -38,16 +38,16 @@ var URL_ = {
* @param {Object[]} args
* @returns {string}
*/
run_from: function(input, args) {
var data = input.replace(/\+/g, "%20");
try {
return decodeURIComponent(data);
} catch(err) {
return unescape(data);
}
},
run_from(input, args) {
const data = input.replace(/\+/g, '%20');
try {
return decodeURIComponent(data);
} catch (err) {
return unescape(data);
}
},
/**
* Parse URI operation.
*
@ -55,56 +55,59 @@ 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 = input;
if (a.protocol) {
var 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";
}
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";
}
if (a.hash) {
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;
for (var i = 0; i < args_.length; i++) {
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";
}
}
return output;
a.href = 'http://example.com/';
a.href = input;
if (a.protocol) {
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`;
}
if (a.pathname) {
let pathname = a.pathname;
if (pathname.indexOf(window.location.pathname) === 0) {
pathname = pathname.replace(window.location.pathname, '');
}
return "Invalid URI";
},
if (pathname) {
output += `Path name:\t${pathname}\n`;
}
}
if (a.hash) {
output += `Hash:\t\t${a.hash}\n`;
}
if (a.search) {
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('='));
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';
}
}
return output;
}
return 'Invalid URI';
},
/**
* URL encodes additional special characters beyond the standard set.
*
@ -112,19 +115,19 @@ var URL_ = {
* @param {string} str
* @returns {string}
*/
_encode_all_chars: function(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");
},
_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');
},
};

View File

@ -7,7 +7,7 @@
*
* @namespace
*/
var UUID = {
const UUID = {
/**
* Generate UUID operation.
@ -16,24 +16,24 @@ 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),
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);
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 v.toString(16);
});
}
},
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, (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, (c) => {
let r = Math.random() * 16 | 0,
v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
},
};

View File

@ -7,13 +7,13 @@
*
* @namespace
*/
var Unicode = {
const Unicode = {
/**
* @constant
* @default
*/
PREFIXES: ["\\u", "%u", "U+"],
PREFIXES: ['\\u', '%u', 'U+'],
/**
* Unescape Unicode Characters operation.
@ -22,41 +22,41 @@ 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 = "",
m,
i = 0;
while (!!(m = regex.exec(input))) {
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)) {
// Add up to match
output += input.slice(i, m.index);
i = m.index;
output += input.slice(i, m.index);
i = m.index;
// Add match
output += Utils.chr(parseInt(m[1], 16));
i = regex.lastIndex;
}
output += Utils.chr(parseInt(m[1], 16));
i = regex.lastIndex;
}
// Add all after final match
output += input.slice(i, input.length);
return output;
},
output += input.slice(i, input.length);
return output;
},
/**
* Lookup table to add prefixes to unicode delimiters so that they can be used in a regex.
*
* @private
* @constant
*/
_prefix_to_regex: {
"\\u": "\\\\u",
"%u": "%u",
"U+": "U\\+"
},
_prefix_to_regex: {
'\\u': '\\\\u',
'%u': '%u',
'U+': 'U\\+',
},
};

View File

@ -9,9 +9,9 @@
* @param {HTMLApp} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager.
*/
var ControlsWaiter = function(app, manager) {
this.app = app;
this.manager = manager;
const ControlsWaiter = function (app, manager) {
this.app = app;
this.manager = manager;
};
@ -19,41 +19,41 @@ 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");
if (controls.clientWidth < 470) {
step.childNodes[1].nodeValue = " Step";
} else {
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";
} 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";
}
if (controls.clientWidth < 330) {
clr_breaks.childNodes[1].nodeValue = " Clear breaks";
} else {
clr_breaks.childNodes[1].nodeValue = " Clear breakpoints";
}
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';
} else {
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';
} 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';
}
if (controls.clientWidth < 330) {
clr_breaks.childNodes[1].nodeValue = ' Clear breaks';
} else {
clr_breaks.childNodes[1].nodeValue = ' Clear breakpoints';
}
};
@ -62,57 +62,57 @@ 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");
if (auto_bake_checkbox.checked != value) {
auto_bake_checkbox.click();
}
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();
}
};
/**
* Handler to trigger baking.
*/
ControlsWaiter.prototype.bake_click = function() {
this.app.bake();
$("#output-text").selectRange(0);
ControlsWaiter.prototype.bake_click = function () {
this.app.bake();
$('#output-text').selectRange(0);
};
/**
* Handler for the 'Step through' command. Executes the next step of the recipe.
*/
ControlsWaiter.prototype.step_click = function() {
this.app.bake(true);
$("#output-text").selectRange(0);
ControlsWaiter.prototype.step_click = function () {
this.app.bake(true);
$('#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");
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");
} else {
auto_bake_label.classList.remove("btn-success");
auto_bake_label.classList.add("btn-default");
}
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');
} else {
auto_bake_label.classList.remove('btn-success');
auto_bake_label.classList.add('btn-default');
}
};
/**
* Handler for the 'Clear recipe' command. Removes all operations from the recipe.
*/
ControlsWaiter.prototype.clear_recipe_click = function() {
this.manager.recipe.clear_recipe();
ControlsWaiter.prototype.clear_recipe_click = function () {
this.manager.recipe.clear_recipe();
};
@ -120,13 +120,13 @@ 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");
for (var i = 0; i < bps.length; i++) {
bps[i].setAttribute("break", "false");
bps[i].classList.remove("breakpoint-selected");
}
ControlsWaiter.prototype.clear_breaks_click = function () {
const bps = document.querySelectorAll('#rec_list li.operation .breakpoint');
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) {
recipe_config = recipe_config || this.app.get_recipe_config();
var 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"),
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);
ControlsWaiter.prototype.initialise_save_link = function (recipe_config) {
recipe_config = recipe_config || this.app.get_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'),
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);
};
@ -158,183 +158,179 @@ 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) {
recipe_config = recipe_config || this.app.get_recipe_config();
var 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
include_recipe = include_recipe && (recipe_config.length > 0);
include_input = include_input && (input_str.length > 0) && (input_str.length < 8000);
ControlsWaiter.prototype.generate_state_url = function (include_recipe, include_input, recipe_config) {
recipe_config = recipe_config || this.app.get_recipe_config();
if (include_recipe) {
link += "?recipe=" + encodeURIComponent(recipe_str);
}
if (include_recipe && include_input) {
link += "&input=" + encodeURIComponent(input_str);
} else if (include_input) {
link += "?input=" + encodeURIComponent(input_str);
}
return link;
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
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)}`;
}
if (include_recipe && include_input) {
link += `&input=${encodeURIComponent(input_str)}`;
} else if (include_input) {
link += `?input=${encodeURIComponent(input_str)}`;
}
return link;
};
/**
* Handler for changes made to the save dialog text area. Re-initialises the save link.
*/
ControlsWaiter.prototype.save_text_change = function() {
try {
var recipe_config = JSON.parse(document.getElementById("save-text").value);
this.initialise_save_link(recipe_config);
} catch(err) {}
ControlsWaiter.prototype.save_text_change = function () {
try {
const recipe_config = JSON.parse(document.getElementById('save-text').value);
this.initialise_save_link(recipe_config);
} 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;
this.initialise_save_link(recipe_config);
$("#save-modal").modal();
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();
};
/**
* Handler for the save link recipe checkbox change event.
*/
ControlsWaiter.prototype.slr_check_change = function() {
this.initialise_save_link();
ControlsWaiter.prototype.slr_check_change = function () {
this.initialise_save_link();
};
/**
* Handler for the save link input checkbox change event.
*/
ControlsWaiter.prototype.sli_check_change = function() {
this.initialise_save_link();
ControlsWaiter.prototype.sli_check_change = function () {
this.initialise_save_link();
};
/**
* Handler for the 'Load' command. Pops up the load dialog box.
*/
ControlsWaiter.prototype.load_click = function() {
this.populate_load_recipes_list();
$("#load-modal").modal();
ControlsWaiter.prototype.load_click = function () {
this.populate_load_recipes_list();
$('#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;
if (!recipe_name) {
this.app.alert("Please enter a recipe name", "danger", 2000);
return;
}
var saved_recipes = localStorage.saved_recipes ?
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);
return;
}
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
});
localStorage.saved_recipes = JSON.stringify(saved_recipes);
localStorage.recipe_id = recipe_id;
this.app.alert("Recipe saved as \"" + recipe_name + "\".", "success", 2000);
recipe_id = localStorage.recipe_id || 0;
saved_recipes.push({
id: ++recipe_id,
name: recipe_name,
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);
};
/**
* 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;
while (i--) {
load_name_el.remove(i);
}
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");
opt.value = saved_recipes[i].id;
opt.innerHTML = saved_recipes[i].name;
load_name_el.appendChild(opt);
}
for (i = 0; i < saved_recipes.length; i++) {
const opt = document.createElement('option');
opt.value = saved_recipes[i].id;
opt.innerHTML = saved_recipes[i].name;
load_name_el.appendChild(opt);
}
// 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,
saved_recipes = localStorage.saved_recipes ?
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;
});
localStorage.saved_recipes = JSON.stringify(saved_recipes);
this.populate_load_recipes_list();
saved_recipes = saved_recipes.filter(r => r.id != id);
localStorage.saved_recipes = JSON.stringify(saved_recipes);
this.populate_load_recipes_list();
};
/**
* Displays the selected recipe in the load text box.
*/
ControlsWaiter.prototype.load_name_change = function(e) {
var el = e.target,
saved_recipes = localStorage.saved_recipes ?
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];
document.getElementById("load-text").value = recipe.recipe;
id = parseInt(el.value, 10);
const recipe = saved_recipes.filter(r => r.id == id)[0];
document.getElementById('load-text').value = recipe.recipe;
};
/**
* Loads the selected recipe and populates the Recipe with its operations.
*/
ControlsWaiter.prototype.load_button_click = function() {
try {
var recipe_config = JSON.parse(document.getElementById("load-text").value);
this.app.set_recipe_config(recipe_config);
ControlsWaiter.prototype.load_button_click = function () {
try {
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);
}
};

View File

@ -14,21 +14,21 @@
* @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) {
this.categories = categories;
this.operations = operations;
this.dfavourites = default_favourites;
this.doptions = default_options;
this.options = Utils.extend({}, default_options);
this.chef = new Chef();
this.manager = new Manager(this);
this.auto_bake_ = false;
this.progress = 0;
this.ing_id = 0;
window.chef = this.chef;
const HTMLApp = function (categories, operations, default_favourites, default_options) {
this.categories = categories;
this.operations = operations;
this.dfavourites = default_favourites;
this.doptions = default_options;
this.options = Utils.extend({}, default_options);
this.chef = new Chef();
this.manager = new Manager(this);
this.auto_bake_ = false;
this.progress = 0;
this.ing_id = 0;
window.chef = this.chef;
};
@ -37,15 +37,15 @@ var HTMLApp = function(categories, operations, default_favourites, default_optio
*
* @fires Manager#appstart
*/
HTMLApp.prototype.setup = function() {
document.dispatchEvent(this.manager.appstart);
this.initialise_splitter();
this.load_local_storage();
this.populate_operations_list();
this.manager.setup();
this.reset_layout();
this.set_compile_message();
this.load_URI_params();
HTMLApp.prototype.setup = function () {
document.dispatchEvent(this.manager.appstart);
this.initialise_splitter();
this.load_local_storage();
this.populate_operations_list();
this.manager.setup();
this.reset_layout();
this.set_compile_message();
this.load_URI_params();
};
@ -54,10 +54,10 @@ HTMLApp.prototype.setup = function() {
*
* @param {Error} 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);
HTMLApp.prototype.handle_error = function (err) {
console.error(err);
const msg = err.display_str || err.toString();
this.alert(msg, 'danger', this.options.error_timeout, !this.options.show_errors);
};
@ -67,48 +67,48 @@ 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;
try {
response = this.chef.bake(
HTMLApp.prototype.bake = function (step) {
let response;
try {
response = this.chef.bake(
this.get_input(), // The user's input
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);
} finally {
if (!response) return;
if (response.error) {
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.progress = response.progress;
this.manager.recipe.update_breakpoint_indicator(response.progress);
this.manager.output.set(response.result, response.type, response.duration);
// 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);
}
} catch (err) {
this.handle_error(err);
} finally {
if (!response) return;
if (response.error) {
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.progress = response.progress;
this.manager.recipe.update_breakpoint_indicator(response.progress);
this.manager.output.set(response.result, response.type, response.duration);
// 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);
}
}
};
/**
* Runs Auto Bake if it is set.
*/
HTMLApp.prototype.auto_bake = function() {
if (this.auto_bake_) {
this.bake();
}
HTMLApp.prototype.auto_bake = function () {
if (this.auto_bake_) {
this.bake();
}
};
@ -121,15 +121,15 @@ 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(),
recipe_config = this.get_recipe_config();
if (this.auto_bake_) {
this.chef.silent_bake(recipe_config);
}
return new Date().getTime() - start_time;
HTMLApp.prototype.silent_bake = function () {
let start_time = new Date().getTime(),
recipe_config = this.get_recipe_config();
if (this.auto_bake_) {
this.chef.silent_bake(recipe_config);
}
return new Date().getTime() - start_time;
};
@ -138,14 +138,14 @@ 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);
return input;
sessionStorage.setItem('input_length', input.length);
sessionStorage.setItem('input', input);
return input;
};
@ -154,10 +154,10 @@ 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);
this.manager.input.set(input);
HTMLApp.prototype.set_input = function (input) {
sessionStorage.setItem('input_length', input.length);
sessionStorage.setItem('input', input);
this.manager.input.set(input);
};
@ -167,56 +167,56 @@ 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"));
var html = "";
for (var i = 0; i < this.categories.length; i++) {
var 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],
op = new HTMLOperation(op_name, this.operations[op_name], this, this.manager);
cat.add_operation(op);
}
html += cat.to_html();
document.body.appendChild(document.getElementById('edit-favourites'));
let html = '';
for (var i = 0; i < this.categories.length; i++) {
let cat_conf = this.categories[i],
selected = i === 0,
cat = new HTMLCategory(cat_conf.name, selected);
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);
}
document.getElementById("categories").innerHTML = html;
var op_lists = document.querySelectorAll("#categories .op_list");
for (i = 0; i < op_lists.length; i++) {
op_lists[i].dispatchEvent(this.manager.oplistcreate);
}
html += cat.to_html();
}
document.getElementById('categories').innerHTML = html;
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"], {
sizes: [20, 30, 50],
minSize: [240, 325, 500],
gutterSize: 4,
onDrag: this.manager.controls.adjust_width.bind(this.manager.controls)
});
Split(["#input", "#output"], {
direction: "vertical",
gutterSize: 4,
});
this.reset_layout();
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),
});
Split(['#input', '#output'], {
direction: 'vertical',
gutterSize: 4,
});
this.reset_layout();
};
@ -224,16 +224,16 @@ 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;
if (localStorage.options !== undefined) {
l_options = JSON.parse(localStorage.options);
}
this.manager.options.load(l_options);
let l_options;
if (localStorage.options !== undefined) {
l_options = JSON.parse(localStorage.options);
}
this.manager.options.load(l_options);
// Load favourites
this.load_favourites();
this.load_favourites();
};
@ -242,48 +242,46 @@ 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;
favourites = this.valid_favourites(favourites);
this.save_favourites(favourites);
var fav_cat = this.categories.filter(function(c) {
return c.name == "Favourites";
})[0];
if (fav_cat) {
fav_cat.ops = favourites;
} else {
this.categories.unshift({
name: "Favourites",
ops: favourites
});
}
favourites = this.valid_favourites(favourites);
this.save_favourites(favourites);
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,
});
}
};
/**
* Filters the list of favourite operations that the user had stored and removes any that are no
* longer available. The user is notified if this is the case.
* @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++) {
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");
}
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');
}
return valid_favs;
}
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,11 +299,11 @@ 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() {
this.save_favourites(this.dfavourites);
this.load_favourites();
this.populate_operations_list();
this.manager.recipe.initialise_operation_drag_n_drop();
HTMLApp.prototype.reset_favourites = function () {
this.save_favourites(this.dfavourites);
this.load_favourites();
this.populate_operations_list();
this.manager.recipe.initialise_operation_drag_n_drop();
};
@ -314,82 +312,82 @@ 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);
return;
}
favourites.push(name);
this.save_favourites(favourites);
this.load_favourites();
this.populate_operations_list();
this.manager.recipe.initialise_operation_drag_n_drop();
if (favourites.indexOf(name) >= 0) {
this.alert(`'${name}' is already in your favourites`, 'info', 2000);
return;
}
favourites.push(name);
this.save_favourites(favourites);
this.load_favourites();
this.populate_operations_list();
this.manager.recipe.initialise_operation_drag_n_drop();
};
/**
* 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('=');
if (p.length != 2) {
b[a[i]] = true;
} else {
b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
}
}
return b;
})(window.location.search.substr(1).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, ' '));
}
}
return b;
}(window.location.search.substr(1).split('&')));
// Turn off auto-bake while loading
var auto_bake_val = this.auto_bake_;
this.auto_bake_ = false;
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);
this.set_recipe_config(recipe_config);
} catch(err) {}
} else if (this.query_string.op) {
if (this.query_string.recipe) {
try {
const recipe_config = JSON.parse(this.query_string.recipe);
this.set_recipe_config(recipe_config);
} 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) {
this.manager.recipe.clear_recipe();
try {
this.manager.recipe.add_operation(this.query_string.op);
} catch (err) {
// If no exact match, search for nearest match and add that
var matched_ops = this.manager.ops.filter_operations(this.query_string.op, false);
if (matched_ops.length) {
this.manager.recipe.add_operation(matched_ops[0].name);
}
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");
search.value = this.query_string.op;
search.dispatchEvent(new Event("search"));
}
const search = document.getElementById('search');
search.value = this.query_string.op;
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);
this.set_input(input_data);
} catch(err) {}
}
if (this.query_string.input) {
try {
const input_data = Utils.from_base64(this.query_string.input);
this.set_input(input_data);
} catch (err) {}
}
// Restore auto-bake state
this.auto_bake_ = auto_bake_val;
this.auto_bake();
this.auto_bake_ = auto_bake_val;
this.auto_bake();
};
@ -398,8 +396,8 @@ HTMLApp.prototype.load_URI_params = function() {
*
* @returns {number}
*/
HTMLApp.prototype.next_ing_id = function() {
return this.ing_id++;
HTMLApp.prototype.next_ing_id = function () {
return this.ing_id++;
};
@ -408,10 +406,10 @@ 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));
return 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,73 +418,73 @@ 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;
for (var i = 0; i < recipe_config.length; i++) {
var item = this.manager.recipe.add_operation(recipe_config[i].op);
HTMLApp.prototype.set_recipe_config = function (recipe_config) {
sessionStorage.setItem('recipe_config', JSON.stringify(recipe_config));
document.getElementById('rec_list').innerHTML = null;
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")) {
args[j].checked = recipe_config[i].args[j];
} 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>";
} else {
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>`;
} else {
// all others
args[j].value = recipe_config[i].args[j];
}
}
// Set disabled and breakpoint
if (recipe_config[i].disabled) {
item.querySelector(".disable-icon").click();
}
if (recipe_config[i].breakpoint) {
item.querySelector(".breakpoint").click();
}
this.progress = 0;
args[j].value = recipe_config[i].args[j];
}
}
// Set disabled and breakpoint
if (recipe_config[i].disabled) {
item.querySelector('.disable-icon').click();
}
if (recipe_config[i].breakpoint) {
item.querySelector('.breakpoint').click();
}
this.progress = 0;
}
};
/**
* 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)";
this.manager.controls.adjust_width();
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();
};
/**
* 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(),
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";
if (window.compile_message !== "") {
compile_info += " - " + window.compile_message;
}
compile_info += "</span>";
document.getElementById("notice").innerHTML = compile_info;
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`;
if (window.compile_message !== '') {
compile_info += ` - ${window.compile_message}`;
}
compile_info += '</span>';
document.getElementById('notice').innerHTML = compile_info;
};
@ -513,44 +511,44 @@ 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();
console.log("[" + time.toLocaleString() + "] " + str);
if (silent) return;
style = style || "danger";
timeout = timeout || 0;
var 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);
HTMLApp.prototype.alert = function (str, style, timeout, silent) {
const time = new Date();
console.log(`[${time.toLocaleString()}] ${str}`);
if (silent) return;
style = style || 'danger';
timeout = timeout || 0;
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}`);
// If the box hasn't been closed, append to it rather than replacing
if (alert_el.style.display == "block") {
alert_content.innerHTML +=
"<br><br>[" + time.toLocaleTimeString() + "] " + str;
} else {
alert_content.innerHTML =
"[" + time.toLocaleTimeString() + "] " + str;
}
if (alert_el.style.display == 'block') {
alert_content.innerHTML +=
`<br><br>[${time.toLocaleTimeString()}] ${str}`;
} else {
alert_content.innerHTML =
`[${time.toLocaleTimeString()}] ${str}`;
}
// Stop the animation if it is in progress
$("#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);
}, timeout);
}
$('#alert').stop();
alert_el.style.display = 'block';
alert_el.style.opacity = 1;
if (timeout > 0) {
clearTimeout(this.alert_timeout);
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) {
scope = scope || this;
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) {
this.confirm_closed = false;
}.bind(this))
.one("click", "#confirm-yes", function() {
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);
this.confirm_closed = true;
}.bind(this));
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';
this.confirm_closed = false;
$('#confirm-modal').modal()
.one('show.bs.modal', (e) => {
this.confirm_closed = false;
})
.one('click', '#confirm-yes', () => {
this.confirm_closed = true;
callback.bind(scope)(true);
$('#confirm-modal').modal('hide');
})
.one('hide.bs.modal', (e) => {
if (!this.confirm_closed) { callback.bind(scope)(false); }
this.confirm_closed = true;
});
};
@ -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,14 +604,14 @@ HTMLApp.prototype.alert_close_click = function() {
* @listens Manager#statechange
* @param {event} e
*/
HTMLApp.prototype.state_change = function(e) {
this.auto_bake();
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);
}
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);
}
};
@ -624,44 +621,44 @@ 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) {
this.load_URI_params();
}
HTMLApp.prototype.pop_state = function (e) {
if (window.location.href.split('#')[0] !== this.last_state_url) {
this.load_URI_params();
}
};
/**
* Function to call an external API from this view.
*/
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";
var response = null,
success = false;
$.ajax({
url: url,
async: false,
type: type,
data: data,
dataType: data_type,
contentType: content_type,
success: function(data) {
success = true;
response = data;
},
error: function(data) {
success = false;
response = data;
},
});
return {
success: success,
response: response
};
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';
let response = null,
success = false;
$.ajax({
url,
async: false,
type,
data,
dataType: data_type,
contentType: content_type,
success(data) {
success = true;
response = data;
},
error(data) {
success = false;
response = data;
},
});
return {
success,
response,
};
};

View File

@ -9,10 +9,10 @@
* @param {string} name - The name of the category.
* @param {boolean} selected - Whether this category is pre-selected or not.
*/
var HTMLCategory = function(name, selected) {
this.name = name;
this.selected = selected;
this.op_list = [];
const HTMLCategory = function (name, selected) {
this.name = name;
this.selected = selected;
this.op_list = [];
};
@ -21,8 +21,8 @@ var HTMLCategory = function(name, selected) {
*
* @param {HTMLOperation} operation - The operation to add.
*/
HTMLCategory.prototype.add_operation = function(operation) {
this.op_list.push(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'>";
for (var i = 0; i < this.op_list.length; i++) {
html += this.op_list[i].to_stub_html();
}
html += "</ul></div></div>";
return html;
<div id='${cat_name}' class='panel-collapse collapse\
${this.selected ? ' in' : ''}'><ul class='op_list'>`;
for (let i = 0; i < this.op_list.length; i++) {
html += this.op_list[i].to_stub_html();
}
html += '</ul></div></div>';
return html;
};

View File

@ -10,19 +10,19 @@
* @param {HTMLApp} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager.
*/
var HTMLIngredient = function(config, app, manager) {
this.app = app;
this.manager = manager;
this.name = config.name;
this.type = config.type;
this.value = config.value;
this.disabled = config.disabled || false;
this.disable_args = config.disable_args || false;
this.placeholder = config.placeholder || false;
this.target = config.target;
this.toggle_values = config.toggle_values;
this.id = "ing-" + this.app.next_ing_id();
const HTMLIngredient = function (config, app, manager) {
this.app = app;
this.manager = manager;
this.name = config.name;
this.type = config.type;
this.value = config.value;
this.disabled = config.disabled || false;
this.disable_args = config.disable_args || false;
this.placeholder = config.placeholder || false;
this.target = config.target;
this.toggle_values = config.toggle_values;
this.id = `ing-${this.app.next_ing_id()}`;
};
@ -31,123 +31,124 @@ var HTMLIngredient = function(config, app, manager) {
*
* @returns {string}
*/
HTMLIngredient.prototype.to_html = function() {
var inline = (this.type == "boolean" ||
this.type == "number" ||
this.type == "option" ||
this.type == "short_string" ||
this.type == "binary_short_string"),
html = inline ? "" : "<div class='clearfix'>&nbsp;</div>",
i, m;
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 + "'" : "") + ">";
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 + "'" : "") + ">";
break;
case "toggle_string":
html += "<div class='input-group'><div class='input-group-btn'>\
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'>&nbsp;</div>",
i,
m;
html += `<div class='arg-group${inline ? ' inline-args' : ''
}${this.type == 'text' ? ' arg-group-text' : ''}'><label class='arg-label' for='${
this.id}'>${this.name}</label>`;
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}'` : ''}>`;
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}'` : ''}>`;
break;
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'>";
for (i = 0; i < this.toggle_values.length; i++) {
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>";
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 + "'" : "") + ">";
break;
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);
}
break;
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>";
} else {
html += "<option>" + this.value[i] + "</option>";
}
}
html += "</select>";
break;
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>";
} else {
html += "<option populate-value='" + this.value[i].value + "'>" +
this.value[i].name + "</option>";
}
}
html += "</select>";
this.manager.add_dynamic_listener("#" + this.id, "change", this.populate_option_change, this);
break;
case "editable_option":
html += "<div class='editable-option'>";
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 += "</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);
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>";
break;
default:
break;
}
html += "</div>";
return html;
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 += `</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}'` : ''}>`;
break;
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);
}
break;
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>';
} else {
html += `<option>${this.value[i]}</option>`;
}
}
html += '</select>';
break;
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>';
} else {
html += `<option populate-value='${this.value[i].value}'>${
this.value[i].name}</option>`;
}
}
html += '</select>';
this.manager.add_dynamic_listener(`#${this.id}`, 'change', this.populate_option_change, this);
break;
case 'editable_option':
html += "<div class='editable-option'>";
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 += '</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);
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>`;
break;
default:
break;
}
html += '</div>';
return html;
};
@ -157,25 +158,25 @@ HTMLIngredient.prototype.to_html = function() {
*
* @param {event} e
*/
HTMLIngredient.prototype.toggle_disable_args = function(e) {
var el = e.target,
op = el.parentNode.parentNode,
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 (var j = 0; j < els.length; j++) {
if (els[j].getAttribute("disabled")) {
els[j].removeAttribute("disabled");
} else {
els[j].setAttribute("disabled", "disabled");
}
}
HTMLIngredient.prototype.toggle_disable_args = function (e) {
let el = e.target,
op = el.parentNode.parentNode,
args = op.querySelectorAll('.arg-group'),
els;
for (let i = 0; i < this.disable_args.length; i++) {
els = args[this.disable_args[i]].querySelectorAll('input, select, button');
for (let j = 0; j < els.length; j++) {
if (els[j].getAttribute('disabled')) {
els[j].removeAttribute('disabled');
} else {
els[j].setAttribute('disabled', 'disabled');
}
}
this.manager.recipe.ing_change();
}
this.manager.recipe.ing_change();
};
@ -185,14 +186,14 @@ HTMLIngredient.prototype.toggle_disable_args = function(e) {
*
* @param {event} e
*/
HTMLIngredient.prototype.populate_option_change = function(e) {
var el = e.target,
op = el.parentNode.parentNode,
target = op.querySelectorAll(".arg-group")[this.target].querySelector("input, select, textarea");
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.value = el.childNodes[el.selectedIndex].getAttribute("populate-value");
this.manager.recipe.ing_change();
target.value = el.childNodes[el.selectedIndex].getAttribute('populate-value');
this.manager.recipe.ing_change();
};
@ -202,11 +203,11 @@ HTMLIngredient.prototype.populate_option_change = function(e) {
*
* @param {event} e
*/
HTMLIngredient.prototype.editable_option_change = function(e) {
var select = e.target,
input = select.nextSibling;
HTMLIngredient.prototype.editable_option_change = function (e) {
let select = e.target,
input = select.nextSibling;
input.value = select.childNodes[select.selectedIndex].value;
this.manager.recipe.ing_change();
input.value = select.childNodes[select.selectedIndex].value;
this.manager.recipe.ing_change();
};

View File

@ -11,31 +11,31 @@
* @param {HTMLApp} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager.
*/
var HTMLOperation = function(name, config, app, manager) {
this.app = app;
this.manager = manager;
this.name = name;
this.description = config.description;
this.manual_bake = config.manual_bake || false;
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);
this.ing_list.push(ing);
}
const HTMLOperation = function (name, config, app, manager) {
this.app = app;
this.manager = manager;
this.name = name;
this.description = config.description;
this.manual_bake = config.manual_bake || false;
this.config = config;
this.ing_list = [];
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);
}
};
/**
* @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,28 +43,28 @@ HTMLOperation.REMOVE_ICON = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABwkl
*
* @returns {string}
*/
HTMLOperation.prototype.to_stub_html = function(remove_icon) {
var 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 += ">" + this.name;
if (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 += "</li>";
return html;
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 += `>${this.name}`;
if (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 += '</li>';
return html;
};
@ -73,22 +73,22 @@ 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++) {
html += this.ing_list[i].to_html();
}
html += "<div class='recip-icons'>\
for (let i = 0; i < this.ing_list.length; i++) {
html += this.ing_list[i].to_html();
}
html += "<div class='recip-icons'>\
<div class='breakpoint' title='Set breakpoint' break='false'></div>\
<div class='disable-icon recip-icon' title='Disable operation'\
disabled='false'></div>";
html += "</div>\
html += "</div>\
<div class='clearfix'>&nbsp;</div>";
return html;
return 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) {
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);
}
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);
}
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)}`;
}
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)}`;
}
};

View File

@ -8,11 +8,11 @@
* @constructor
* @param {HTMLApp} app - The main view object for CyberChef.
*/
var HighlighterWaiter = function(app) {
this.app = app;
this.mouse_button_down = false;
this.mouse_target = null;
const HighlighterWaiter = function (app) {
this.app = app;
this.mouse_button_down = false;
this.mouse_target = null;
};
@ -21,7 +21,7 @@ var HighlighterWaiter = function(app) {
* @readonly
* @enum
*/
HighlighterWaiter.INPUT = 0;
HighlighterWaiter.INPUT = 0;
/**
* HighlighterWaiter data type enum for the output.
* @readonly
@ -37,18 +37,18 @@ HighlighterWaiter.OUTPUT = 1;
* @private
* @returns {boolean}
*/
HighlighterWaiter.prototype._is_selection_backwards = function() {
var backwards = false,
sel = window.getSelection();
if (!sel.isCollapsed) {
var range = document.createRange();
range.setStart(sel.anchorNode, sel.anchorOffset);
range.setEnd(sel.focusNode, sel.focusOffset);
backwards = range.collapsed;
range.detach();
}
return backwards;
HighlighterWaiter.prototype._is_selection_backwards = function () {
let backwards = false,
sel = window.getSelection();
if (!sel.isCollapsed) {
const range = document.createRange();
range.setStart(sel.anchorNode, sel.anchorOffset);
range.setEnd(sel.focusNode, sel.focusOffset);
backwards = range.collapsed;
range.detach();
}
return backwards;
};
@ -60,16 +60,16 @@ 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(),
range = document.createRange();
range.selectNodeContents(document.getElementById("output-html"));
range.setEnd(node, offset);
sel.removeAllRanges();
sel.addRange(range);
return sel.toString().length;
HighlighterWaiter.prototype._get_output_html_offset = function (node, offset) {
let sel = window.getSelection(),
range = document.createRange();
range.selectNodeContents(document.getElementById('output-html'));
range.setEnd(node, offset);
sel.removeAllRanges();
sel.addRange(range);
return sel.toString().length;
};
@ -81,33 +81,33 @@ 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(),
range,
start = 0,
end = 0,
backwards = false;
if (sel.rangeCount) {
range = sel.getRangeAt(sel.rangeCount - 1);
backwards = this._is_selection_backwards();
start = this._get_output_html_offset(range.startContainer, range.startOffset);
end = this._get_output_html_offset(range.endContainer, range.endOffset);
sel.removeAllRanges();
sel.addRange(range);
if (backwards) {
HighlighterWaiter.prototype._get_output_html_selection_offsets = function () {
let sel = window.getSelection(),
range,
start = 0,
end = 0,
backwards = false;
if (sel.rangeCount) {
range = sel.getRangeAt(sel.rangeCount - 1);
backwards = this._is_selection_backwards();
start = this._get_output_html_offset(range.startContainer, range.startOffset);
end = this._get_output_html_offset(range.endContainer, range.endOffset);
sel.removeAllRanges();
sel.addRange(range);
if (backwards) {
// If selecting backwards, reverse the start and end offsets for the selection to
// prevent deselecting as the drag continues.
sel.collapseToEnd();
sel.extend(sel.anchorNode, range.startOffset);
}
sel.collapseToEnd();
sel.extend(sel.anchorNode, range.startOffset);
}
return {
start: start,
end: end
};
}
return {
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,19 +143,19 @@ HighlighterWaiter.prototype.output_scroll = function(e) {
*
* @param {event} e
*/
HighlighterWaiter.prototype.input_mousedown = function(e) {
this.mouse_button_down = true;
this.mouse_target = HighlighterWaiter.INPUT;
this.remove_highlights();
var 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}]);
}
HighlighterWaiter.prototype.input_mousedown = function (e) {
this.mouse_button_down = true;
this.mouse_target = HighlighterWaiter.INPUT;
this.remove_highlights();
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, end }]);
}
};
@ -165,19 +165,19 @@ HighlighterWaiter.prototype.input_mousedown = function(e) {
*
* @param {event} e
*/
HighlighterWaiter.prototype.output_mousedown = function(e) {
this.mouse_button_down = true;
this.mouse_target = HighlighterWaiter.OUTPUT;
this.remove_highlights();
var 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}]);
}
HighlighterWaiter.prototype.output_mousedown = function (e) {
this.mouse_button_down = true;
this.mouse_target = HighlighterWaiter.OUTPUT;
this.remove_highlights();
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, end }]);
}
};
@ -187,14 +187,14 @@ HighlighterWaiter.prototype.output_mousedown = function(e) {
*
* @param {event} 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();
if (sel.start !== 0 || sel.end !== 0) {
document.getElementById("output-selection-info").innerHTML = this.selection_info(sel.start, sel.end);
}
HighlighterWaiter.prototype.output_html_mousedown = function (e) {
this.mouse_button_down = true;
this.mouse_target = HighlighterWaiter.OUTPUT;
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);
}
};
@ -203,8 +203,8 @@ HighlighterWaiter.prototype.output_html_mousedown = function(e) {
*
* @param {event} e
*/
HighlighterWaiter.prototype.input_mouseup = function(e) {
this.mouse_button_down = false;
HighlighterWaiter.prototype.input_mouseup = function (e) {
this.mouse_button_down = false;
};
@ -213,8 +213,8 @@ HighlighterWaiter.prototype.input_mouseup = function(e) {
*
* @param {event} e
*/
HighlighterWaiter.prototype.output_mouseup = function(e) {
this.mouse_button_down = false;
HighlighterWaiter.prototype.output_mouseup = function (e) {
this.mouse_button_down = false;
};
@ -223,8 +223,8 @@ HighlighterWaiter.prototype.output_mouseup = function(e) {
*
* @param {event} e
*/
HighlighterWaiter.prototype.output_html_mouseup = function(e) {
this.mouse_button_down = false;
HighlighterWaiter.prototype.output_html_mouseup = function (e) {
this.mouse_button_down = false;
};
@ -234,21 +234,20 @@ 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 ||
if (!this.mouse_button_down ||
e.which != 1 ||
this.mouse_target != HighlighterWaiter.INPUT)
return;
var el = e.target,
start = el.selectionStart,
end = el.selectionEnd;
this.mouse_target != HighlighterWaiter.INPUT) { return; }
if (start !== 0 || end !== 0) {
document.getElementById("input-selection-info").innerHTML = this.selection_info(start, end);
this.highlight_output([{start: start, end: end}]);
}
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, end }]);
}
};
@ -258,21 +257,20 @@ 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 ||
if (!this.mouse_button_down ||
e.which != 1 ||
this.mouse_target != HighlighterWaiter.OUTPUT)
return;
var 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}]);
}
this.mouse_target != HighlighterWaiter.OUTPUT) { return; }
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, end }]);
}
};
@ -282,17 +280,16 @@ 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 ||
if (!this.mouse_button_down ||
e.which != 1 ||
this.mouse_target != HighlighterWaiter.OUTPUT)
return;
var 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);
}
this.mouse_target != HighlighterWaiter.OUTPUT) { return; }
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);
}
};
@ -304,30 +301,30 @@ 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;
width = width < 2 ? 2 : width;
var start_str = Utils.pad(start.toString(), width, " ").replace(/ /g, "&nbsp;"),
end_str = Utils.pad(end.toString(), width, " ").replace(/ /g, "&nbsp;"),
len_str = Utils.pad((end-start).toString(), width, " ").replace(/ /g, "&nbsp;");
return "start: " + start_str + "<br>end: " + end_str + "<br>length: " + len_str;
HighlighterWaiter.prototype.selection_info = function (start, end) {
let width = end.toString().length;
width = width < 2 ? 2 : width;
let start_str = Utils.pad(start.toString(), width, ' ').replace(/ /g, '&nbsp;'),
end_str = Utils.pad(end.toString(), width, ' ').replace(/ /g, '&nbsp;'),
len_str = Utils.pad((end - start).toString(), width, ' ').replace(/ /g, '&nbsp;');
return `start: ${start_str}<br>end: ${end_str}<br>length: ${len_str}`;
};
/**
* 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 = '';
};
/**
* Generates a list of all the highlight functions assigned to operations in the recipe, if the
* Generates a list of all the highlight functions assigned to operations in the recipe, if the
* entire recipe supports highlighting.
*
* @returns {Object[]} highlights
@ -335,29 +332,29 @@ 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(),
highlights = [];
for (var i = 0; i < recipe_config.length; i++) {
if (recipe_config[i].disabled) continue;
HighlighterWaiter.prototype.generate_highlight_list = function () {
let recipe_config = this.app.get_recipe_config(),
highlights = [];
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];
if (recipe_config[i].breakpoint) return false;
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;
highlights.push({
f: op.highlight,
b: op.highlight_reverse,
args: recipe_config[i].args
});
}
return highlights;
if (op.highlight === false || op.highlight === undefined) return false;
highlights.push({
f: op.highlight,
b: op.highlight_reverse,
args: recipe_config[i].args,
});
}
return highlights;
};
@ -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;
}
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") {
pos = highlights[i].f(pos, highlights[i].args);
}
pos = [pos[0]];
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);
this.highlight(
document.getElementById("output-text"),
document.getElementById("output-highlighter"),
}
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'),
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();
if (!highlights || !this.app.auto_bake_) {
return false;
}
HighlighterWaiter.prototype.highlight_input = function (pos) {
const highlights = this.generate_highlight_list();
for (var i = 0; i < highlights.length; i++) {
if (!highlights || !this.app.auto_bake_) {
return false;
}
for (let i = 0; i < highlights.length; i++) {
// Remove multiple highlights before processing again
pos = [pos[0]];
if (typeof highlights[i].b == "function") {
pos = highlights[i].b(pos, highlights[i].args);
}
pos = [pos[0]];
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);
this.highlight(
document.getElementById("input-text"),
document.getElementById("input-highlighter"),
}
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'),
pos);
};
@ -441,66 +438,66 @@ 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) {
if (!this.app.options.show_highlighter) return false;
if (!this.app.options.attempt_highlight) return false;
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;
var start_placeholder = "[start_highlight]",
start_placeholder_regex = /\[start_highlight\]/g,
end_placeholder = "[end_highlight]",
end_placeholder_regex = /\[end_highlight\]/g,
text = textarea.value;
if (!this.app.dish_str || this.app.dish_str.indexOf('\r') >= 0) return false;
let start_placeholder = '[start_highlight]',
start_placeholder_regex = /\[start_highlight\]/g,
end_placeholder = '[end_highlight]',
end_placeholder_regex = /\[end_highlight\]/g,
text = textarea.value;
// Put placeholders in position
// If there's only one value, select that
// If there are multiple, ignore the first one and select all others
if (pos.length == 1) {
if (pos[0].end < pos[0].start) return;
text = text.slice(0, pos[0].start) +
if (pos.length == 1) {
if (pos[0].end < pos[0].start) return;
text = text.slice(0, pos[0].start) +
start_placeholder + text.slice(pos[0].start, pos[0].end) + end_placeholder +
text.slice(pos[0].end, text.length);
} else {
} else {
// O(n^2) - Can anyone improve this without overwriting placeholders?
var result = "",
end_placed = true;
for (var i = 0; i < text.length; i++) {
for (var j = 1; j < pos.length; j++) {
if (pos[j].end < pos[j].start) continue;
if (pos[j].start == i) {
result += start_placeholder;
end_placed = false;
}
if (pos[j].end == i) {
result += end_placeholder;
end_placed = true;
}
}
result += text[i];
let result = '',
end_placed = true;
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;
end_placed = false;
}
if (!end_placed) result += end_placeholder;
text = result;
if (pos[j].end == i) {
result += end_placeholder;
end_placed = true;
}
}
result += text[i];
}
var css_class = "hl1";
//if (colour) css_class += "-"+colour;
if (!end_placed) result += end_placeholder;
text = result;
}
const css_class = 'hl1';
// if (colour) css_class += "-"+colour;
// Remove HTML tags
text = text.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/\n/g, "&#10;")
text = `${text.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/\n/g, '&#10;')
// Convert placeholders to tags
.replace(start_placeholder_regex, "<span class=\""+css_class+"\">")
.replace(end_placeholder_regex, "</span>") + "&nbsp;";
.replace(start_placeholder_regex, `<span class="${css_class}">`)
.replace(end_placeholder_regex, '</span>')}&nbsp;`;
// Adjust width to allow for scrollbars
highlighter.style.width = textarea.clientWidth + "px";
highlighter.innerHTML = text;
highlighter.scrollTop = textarea.scrollTop;
highlighter.scrollLeft = textarea.scrollLeft;
highlighter.style.width = `${textarea.clientWidth}px`;
highlighter.innerHTML = text;
highlighter.scrollTop = textarea.scrollTop;
highlighter.scrollLeft = textarea.scrollLeft;
};

View File

@ -9,27 +9,27 @@
* @param {HTMLApp} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager.
*/
var InputWaiter = function(app, manager) {
this.app = app;
this.manager = 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
145, //Scroll
];
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
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,9 +50,9 @@ InputWaiter.prototype.get = function() {
*
* @fires Manager#statechange
*/
InputWaiter.prototype.set = function(input) {
document.getElementById("input-text").value = input;
window.dispatchEvent(this.manager.statechange);
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;
width = width < 2 ? 2 : width;
var length_str = Utils.pad(length.toString(), width, " ").replace(/ /g, "&nbsp;");
var lines_str = Utils.pad(lines.toString(), width, " ").replace(/ /g, "&nbsp;");
document.getElementById("input-info").innerHTML = "length: " + length_str + "<br>lines: " + lines_str;
InputWaiter.prototype.set_input_info = function (length, lines) {
let width = length.toString().length;
width = width < 2 ? 2 : width;
const length_str = Utils.pad(length.toString(), width, ' ').replace(/ /g, '&nbsp;');
const lines_str = Utils.pad(lines.toString(), width, ' ').replace(/ /g, '&nbsp;');
document.getElementById('input-info').innerHTML = `length: ${length_str}<br>lines: ${lines_str}`;
};
@ -81,24 +81,24 @@ 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();
this.manager.highlighter.remove_highlights();
// Reset recipe progress as any previous processing will be redundant now
this.app.progress = 0;
this.app.progress = 0;
// Update the input metadata info
var input_text = this.get(),
lines = input_text.count("\n") + 1;
this.set_input_info(input_text.length, lines);
if (this.bad_keys.indexOf(e.keyCode) < 0) {
let input_text = this.get(),
lines = input_text.count('\n') + 1;
this.set_input_info(input_text.length, lines);
if (this.bad_keys.indexOf(e.keyCode) < 0) {
// Fire the statechange event as the input has been modified
window.dispatchEvent(this.manager.statechange);
}
window.dispatchEvent(this.manager.statechange);
}
};
@ -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")
return false;
e.stopPropagation();
e.preventDefault();
e.target.classList.add("dropping-file");
if (e.dataTransfer.effectAllowed === 'move') {
return false;
}
e.stopPropagation();
e.preventDefault();
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) {
e.stopPropagation();
e.preventDefault();
e.target.classList.remove("dropping-file");
InputWaiter.prototype.input_dragleave = function (e) {
e.stopPropagation();
e.preventDefault();
e.target.classList.remove('dropping-file');
};
@ -138,64 +139,65 @@ 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")
return false;
e.stopPropagation();
e.preventDefault();
var el = e.target,
file = e.dataTransfer.files[0],
text = e.dataTransfer.getData("Text"),
reader = new FileReader(),
input_charcode = "",
offset = 0,
CHUNK_SIZE = 20480; // 20KB
var 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.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"]});
this.app.set_recipe_config(recipe_config);
}
el.classList.remove("loading_file");
}.bind(this);
var 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);
reader.readAsArrayBuffer(slice);
}.bind(this);
reader.onload = function(e) {
var data = new Uint8Array(reader.result);
input_charcode += Utils.to_hex_fast(data);
offset += CHUNK_SIZE;
seek();
}.bind(this);
el.classList.remove("dropping-file");
if (file) {
el.classList.add("loading_file");
seek();
} else if (text) {
this.set(text);
if (e.dataTransfer.effectAllowed === 'move') {
return false;
}
e.stopPropagation();
e.preventDefault();
let el = e.target,
file = e.dataTransfer.files[0],
text = e.dataTransfer.getData('Text'),
reader = new FileReader(),
input_charcode = '',
offset = 0,
CHUNK_SIZE = 20480; // 20KB
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.set(input_charcode);
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');
}.bind(this);
const seek = function () {
if (offset >= file.size) {
set_input();
return;
}
el.value = `Processing... ${Math.round(offset / file.size * 100)}%`;
const slice = file.slice(offset, offset + CHUNK_SIZE);
reader.readAsArrayBuffer(slice);
};
reader.onload = function (e) {
const data = new Uint8Array(reader.result);
input_charcode += Utils.to_hex_fast(data);
offset += CHUNK_SIZE;
seek();
};
el.classList.remove('dropping-file');
if (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() {
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 = "";
window.dispatchEvent(this.manager.statechange);
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 = '';
window.dispatchEvent(this.manager.statechange);
};

View File

@ -8,142 +8,142 @@
* @constructor
* @param {HTMLApp} app - The main view object for CyberChef.
*/
var Manager = function(app) {
this.app = 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);
this.controls = new ControlsWaiter(this.app, this);
this.recipe = new RecipeWaiter(this.app, this);
this.ops = new OperationsWaiter(this.app, this);
this.input = new InputWaiter(this.app, this);
this.output = new OutputWaiter(this.app, this);
this.options = new OptionsWaiter(this.app);
this.highlighter = new HighlighterWaiter(this.app);
this.seasonal = new SeasonalWaiter(this.app, this);
this.window = new WindowWaiter(this.app);
this.controls = new ControlsWaiter(this.app, this);
this.recipe = new RecipeWaiter(this.app, this);
this.ops = new OperationsWaiter(this.app, this);
this.input = new InputWaiter(this.app, this);
this.output = new OutputWaiter(this.app, this);
this.options = new OptionsWaiter(this.app);
this.highlighter = new HighlighterWaiter(this.app);
this.seasonal = new SeasonalWaiter(this.app, this);
// Object to store dynamic handlers to fire on elements that may not exist yet
this.dynamic_handlers = {};
this.initialise_event_listeners();
this.dynamic_handlers = {};
this.initialise_event_listeners();
};
/**
* Sets up the various components and listeners.
*/
Manager.prototype.setup = function() {
this.recipe.initialise_operation_drag_n_drop();
this.controls.auto_bake_change();
this.seasonal.load();
Manager.prototype.setup = function () {
this.recipe.initialise_operation_drag_n_drop();
this.controls.auto_bake_change();
this.seasonal.load();
};
/**
* 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,11 +160,11 @@ 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) {
scope = scope || this;
[].forEach.call(document.querySelectorAll(selector), function(el) {
el.addEventListener(event_type, callback.bind(scope));
});
Manager.prototype.add_listeners = function (selector, event_type, callback, scope) {
scope = scope || this;
[].forEach.call(document.querySelectorAll(selector), (el) => {
el.addEventListener(event_type, callback.bind(scope));
});
};
@ -181,11 +181,11 @@ 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++) {
document.querySelector(selector).addEventListener(evs[i], callback.bind(scope));
}
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,11 +202,11 @@ 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++) {
this.add_listeners(selector, evs[i], callback, scope);
}
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,20 +224,20 @@ 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)
};
if (this.dynamic_handlers.hasOwnProperty(event_type)) {
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)) {
// Listener already exists, add new handler to the appropriate list
this.dynamic_handlers[event_type].push(event_config);
} else {
this.dynamic_handlers[event_type] = [event_config];
this.dynamic_handlers[event_type].push(event_config);
} else {
this.dynamic_handlers[event_type] = [event_config];
// Set up listener for this new type
document.addEventListener(event_type, this.dynamic_listener_handler.bind(this));
}
document.addEventListener(event_type, this.dynamic_listener_handler.bind(this));
}
};
@ -247,17 +247,17 @@ 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],
matches = e.target.matches ||
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++) {
if (matches && e.target[matches.name](handlers[i].selector)) {
handlers[i].callback(e);
}
for (let i = 0; i < handlers.length; i++) {
if (matches && e.target[matches.name](handlers[i].selector)) {
handlers[i].callback(e);
}
}
};

View File

@ -11,12 +11,12 @@
* @param {HTMLApp} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager.
*/
var OperationsWaiter = function(app, manager) {
this.app = app;
this.manager = manager;
this.options = {};
this.remove_intent = false;
const OperationsWaiter = function (app, manager) {
this.app = app;
this.manager = manager;
this.options = {};
this.remove_intent = false;
};
@ -26,67 +26,68 @@ var OperationsWaiter = function(app, manager) {
*
* @param {event} e
*/
OperationsWaiter.prototype.search_operations = function(e) {
var ops, selected;
if (e.type == "search") { // Search
e.preventDefault();
ops = document.querySelectorAll("#search-results li");
if (ops.length) {
selected = this.get_selected_op(ops);
if (selected > -1) {
this.manager.recipe.add_operation(ops[selected].innerHTML);
this.app.auto_bake();
}
}
OperationsWaiter.prototype.search_operations = function (e) {
let ops,
selected;
if (e.type == 'search') { // Search
e.preventDefault();
ops = document.querySelectorAll('#search-results li');
if (ops.length) {
selected = this.get_selected_op(ops);
if (selected > -1) {
this.manager.recipe.add_operation(ops[selected].innerHTML);
this.app.auto_bake();
}
}
if (e.keyCode == 13) { // Return
e.preventDefault();
} else if (e.keyCode == 40) { // Down
e.preventDefault();
ops = document.querySelectorAll("#search-results li");
if (ops.length) {
selected = this.get_selected_op(ops);
if (selected > -1) {
ops[selected].classList.remove("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");
if (ops.length) {
selected = this.get_selected_op(ops);
if (selected > -1) {
ops[selected].classList.remove("selected-op");
}
if (selected === 0) selected = ops.length;
ops[selected-1].classList.add("selected-op");
}
} else {
var search_results_el = document.getElementById("search-results"),
el = e.target,
str = el.value;
while (search_results_el.firstChild) {
search_results_el.removeChild(search_results_el.firstChild);
}
$("#categories .in").collapse("hide");
if (str) {
var matched_ops = this.filter_operations(str, true),
matched_ops_html = "";
for (var i = 0; i < matched_ops.length; i++) {
matched_ops_html += matched_ops[i].to_stub_html();
}
search_results_el.innerHTML = matched_ops_html;
search_results_el.dispatchEvent(this.manager.oplistcreate);
}
}
if (e.keyCode == 13) { // Return
e.preventDefault();
} else if (e.keyCode == 40) { // Down
e.preventDefault();
ops = document.querySelectorAll('#search-results li');
if (ops.length) {
selected = this.get_selected_op(ops);
if (selected > -1) {
ops[selected].classList.remove('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');
if (ops.length) {
selected = this.get_selected_op(ops);
if (selected > -1) {
ops[selected].classList.remove('selected-op');
}
if (selected === 0) selected = ops.length;
ops[selected - 1].classList.add('selected-op');
}
} else {
let search_results_el = document.getElementById('search-results'),
el = e.target,
str = el.value;
while (search_results_el.firstChild) {
search_results_el.removeChild(search_results_el.firstChild);
}
$('#categories .in').collapse('hide');
if (str) {
let matched_ops = this.filter_operations(str, true),
matched_ops_html = '';
for (let i = 0; i < matched_ops.length; i++) {
matched_ops_html += matched_ops[i].to_stub_html();
}
search_results_el.innerHTML = matched_ops_html;
search_results_el.dispatchEvent(this.manager.oplistcreate);
}
}
};
@ -98,32 +99,32 @@ OperationsWaiter.prototype.search_operations = function(e) {
* name and description
* @returns {string[]}
*/
OperationsWaiter.prototype.filter_operations = function(search_str, highlight) {
var matched_ops = [],
matched_descs = [];
search_str = search_str.toLowerCase();
for (var op_name in this.app.operations) {
var 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);
if (highlight) {
operation.highlight_search_string(search_str, name_pos, desc_pos);
}
if (name_pos < 0) {
matched_ops.push(operation);
} else {
matched_descs.push(operation);
}
}
OperationsWaiter.prototype.filter_operations = function (search_str, highlight) {
let matched_ops = [],
matched_descs = [];
search_str = search_str.toLowerCase();
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) {
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);
}
if (name_pos < 0) {
matched_ops.push(operation);
} else {
matched_descs.push(operation);
}
}
return matched_descs.concat(matched_ops);
}
return matched_descs.concat(matched_ops);
};
@ -134,13 +135,13 @@ 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")) {
return i;
}
OperationsWaiter.prototype.get_selected_op = function (ops) {
for (let i = 0; i < ops.length; i++) {
if (ops[i].classList.contains('selected-op')) {
return i;
}
return -1;
}
return -1;
};
@ -150,9 +151,9 @@ OperationsWaiter.prototype.get_selected_op = function(ops) {
* @listens Manager#oplistcreate
* @param {event} e
*/
OperationsWaiter.prototype.op_list_create = function(e) {
this.manager.recipe.create_sortable_seed_list(e.target);
$("[data-toggle=popover]").popover();
OperationsWaiter.prototype.op_list_create = function (e) {
this.manager.recipe.create_sortable_seed_list(e.target);
$('[data-toggle=popover]').popover();
};
@ -162,11 +163,11 @@ OperationsWaiter.prototype.op_list_create = function(e) {
*
* @param {event} e
*/
OperationsWaiter.prototype.operation_dblclick = function(e) {
var li = e.target;
this.manager.recipe.add_operation(li.textContent);
this.app.auto_bake();
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) {
e.preventDefault();
e.stopPropagation();
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];
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);
html += operation.to_stub_html(true);
}
var edit_favourites_list = document.getElementById("edit-favourites-list");
edit_favourites_list.innerHTML = html;
const fav_cat = this.app.categories.filter(c => c.name == 'Favourites')[0];
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);
}
const edit_favourites_list = document.getElementById('edit-favourites-list');
edit_favourites_list.innerHTML = html;
this.remove_intent = false;
const editable_list = Sortable.create(edit_favourites_list, {
filter: '.remove-icon',
onFilter(evt) {
const el = editable_list.closest(evt.item);
if (el) {
$(el).popover('destroy');
el.parentNode.removeChild(el);
}
},
onEnd: function (evt) {
if (this.remove_intent) evt.item.remove();
}.bind(this),
});
Sortable.utils.on(edit_favourites_list, 'dragleave', () => {
this.remove_intent = true;
});
Sortable.utils.on(edit_favourites_list, 'dragover', () => {
this.remove_intent = false;
var editable_list = Sortable.create(edit_favourites_list, {
filter: '.remove-icon',
onFilter: function (evt) {
var el = editable_list.closest(evt.item);
if (el) {
$(el).popover("destroy");
el.parentNode.removeChild(el);
}
},
onEnd: function(evt) {
if (this.remove_intent) evt.item.remove();
}.bind(this),
});
Sortable.utils.on(edit_favourites_list, "dragleave", function() {
this.remove_intent = true;
}.bind(this));
Sortable.utils.on(edit_favourites_list, "dragover", function() {
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,18 +226,18 @@ 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");
for (var i = 0; i < favs.length; i++) {
favourites_list.push(favs[i].textContent);
}
OperationsWaiter.prototype.save_favourites_click = function () {
let favourites_list = [],
favs = document.querySelectorAll('#edit-favourites-list li');
this.app.save_favourites(favourites_list);
this.app.load_favourites();
this.app.populate_operations_list();
this.manager.recipe.initialise_operation_drag_n_drop();
for (let i = 0; i < favs.length; i++) {
favourites_list.push(favs[i].textContent);
}
this.app.save_favourites(favourites_list);
this.app.load_favourites();
this.app.populate_operations_list();
this.manager.recipe.initialise_operation_drag_n_drop();
};
@ -246,8 +245,8 @@ OperationsWaiter.prototype.save_favourites_click = function() {
* Handler for reset favourites click events.
* Resets favourites to their defaults.
*/
OperationsWaiter.prototype.reset_favourites_click = function() {
this.app.reset_favourites();
OperationsWaiter.prototype.reset_favourites_click = function () {
this.app.reset_favourites();
};
@ -257,11 +256,11 @@ 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,
to_el = e.toElement || e.relatedElement;
if (e.target.getAttribute("data-toggle") == "popover" && to_el === op_el) {
$(op_el).popover("show");
}
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');
}
};

View File

@ -8,8 +8,8 @@
* @constructor
* @param {HTMLApp} app - The main view object for CyberChef.
*/
var OptionsWaiter = function(app) {
this.app = app;
const OptionsWaiter = function (app) {
this.app = app;
};
@ -18,33 +18,33 @@ var OptionsWaiter = function(app) {
*
* @param {Object} options
*/
OptionsWaiter.prototype.load = function(options) {
$(".option-item input:checkbox").bootstrapSwitch({
size: "small",
animate: false,
});
for (var option in options) {
this.app.options[option] = options[option];
}
// Set options to match object
var 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")]);
}
OptionsWaiter.prototype.load = function (options) {
$('.option-item input:checkbox').bootstrapSwitch({
size: 'small',
animate: false,
});
var 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}));
}
var 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}));
}
for (const option in options) {
this.app.options[option] = options[option];
}
// Set options to match object
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')]);
}
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 }));
}
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 }));
}
};
@ -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,8 +61,8 @@ OptionsWaiter.prototype.options_click = function() {
* Handler for reset options click events.
* Resets options back to their default values.
*/
OptionsWaiter.prototype.reset_options_click = function() {
this.load(this.app.doptions);
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");
this.app.options[option] = state;
localStorage.setItem("options", JSON.stringify(this.app.options));
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));
};
@ -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");
this.app.options[option] = parseInt(el.value, 10);
localStorage.setItem("options", JSON.stringify(this.app.options));
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));
};
@ -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");
this.app.options[option] = el.value;
localStorage.setItem("options", JSON.stringify(this.app.options));
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));
};
/**
* 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");
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");
}
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');
}
};

View File

@ -9,9 +9,9 @@
* @param {HTMLApp} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager.
*/
var OutputWaiter = function(app, manager) {
this.app = app;
this.manager = 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,43 +32,43 @@ 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';
output_text.value = '';
output_html.innerHTML = data_str;
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_html.innerHTML = data_str;
// Execute script sections
var script_elements = output_html.querySelectorAll("script");
for (var i = 0; i < script_elements.length; i++) {
try {
eval(script_elements[i].innerHTML); // jshint ignore:line
} catch (err) {
console.error(err);
}
}
} else {
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 = "";
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) {
console.error(err);
}
}
this.manager.highlighter.remove_highlights();
var lines = data_str.count("\n") + 1;
this.set_output_info(data_str.length, lines, duration);
} else {
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 = '';
}
this.manager.highlighter.remove_highlights();
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;
width = width < 4 ? 4 : width;
var length_str = Utils.pad(length.toString(), width, " ").replace(/ /g, "&nbsp;");
var lines_str = Utils.pad(lines.toString(), width, " ").replace(/ /g, "&nbsp;");
var time_str = Utils.pad(duration.toString() + "ms", width, " ").replace(/ /g, "&nbsp;");
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 = "";
OutputWaiter.prototype.set_output_info = function (length, lines, duration) {
let width = length.toString().length;
width = width < 4 ? 4 : width;
const length_str = Utils.pad(length.toString(), width, ' ').replace(/ /g, '&nbsp;');
const lines_str = Utils.pad(lines.toString(), width, ' ').replace(/ /g, '&nbsp;');
const time_str = Utils.pad(`${duration.toString()}ms`, width, ' ').replace(/ /g, '&nbsp;');
document.getElementById('output-info').innerHTML = `time: ${time_str
}<br>length: ${length_str
}<br>lines: ${lines_str}`;
document.getElementById('input-selection-info').innerHTML = '';
document.getElementById('output-selection-info').innerHTML = '';
};
@ -99,22 +99,22 @@ 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");
if (filename) {
var el = document.createElement("a");
el.setAttribute("href", "data:application/octet-stream;base64;charset=utf-8," + data);
el.setAttribute("download", filename);
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) {
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";
document.body.appendChild(el);
el.click();
el.remove();
}
el.style.display = 'none';
document.body.appendChild(el);
el.click();
el.remove();
}
};
@ -122,10 +122,10 @@ OutputWaiter.prototype.save_click = function() {
* Handler for switch click events.
* Moves the current output into the input textarea.
*/
OutputWaiter.prototype.switch_click = function() {
this.switch_orig_data = this.manager.input.get();
document.getElementById("undo-switch").disabled = false;
this.app.set_input(this.app.dish_str);
OutputWaiter.prototype.switch_click = function () {
this.switch_orig_data = this.manager.input.get();
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() {
this.app.set_input(this.switch_orig_data);
document.getElementById("undo-switch").disabled = true;
OutputWaiter.prototype.undo_switch_click = function () {
this.app.set_input(this.switch_orig_data);
document.getElementById('undo-switch').disabled = true;
};

View File

@ -11,52 +11,52 @@
* @param {HTMLApp} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager.
*/
var RecipeWaiter = function(app, manager) {
this.app = app;
this.manager = manager;
this.remove_intent = false;
const RecipeWaiter = function (app, manager) {
this.app = app;
this.manager = manager;
this.remove_intent = false;
};
/**
* 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",
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);
},
onEnd: function(evt) {
if (this.remove_intent) {
evt.item.remove();
evt.target.dispatchEvent(this.manager.operationremove);
}
}.bind(this)
});
Sortable.utils.on(rec_list, "dragover", function() {
this.remove_intent = false;
}.bind(this));
Sortable.utils.on(rec_list, "dragleave", function() {
this.remove_intent = true;
this.app.progress = 0;
}.bind(this));
Sortable.create(rec_list, {
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(dataTransfer, drag_el) {
dataTransfer.setData('Text', drag_el.querySelector('.arg-title').textContent);
},
onEnd: function (evt) {
if (this.remove_intent) {
evt.item.remove();
evt.target.dispatchEvent(this.manager.operationremove);
}
}.bind(this),
});
Sortable.utils.on(rec_list, 'dragover', () => {
this.remove_intent = false;
});
Sortable.utils.on(rec_list, 'dragleave', () => {
this.remove_intent = true;
this.app.progress = 0;
});
// 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,23 +65,23 @@ 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) {
Sortable.create(list_el, {
group: {
name: "recipe",
pull: "clone",
put: false
},
sort: false,
setData: function(dataTransfer, drag_el) {
dataTransfer.setData("Text", drag_el.textContent);
},
onStart: function(evt) {
$(evt.item).popover("destroy");
evt.item.setAttribute("data-toggle", "popover-disabled");
},
onEnd: this.op_sort_end.bind(this)
});
RecipeWaiter.prototype.create_sortable_seed_list = function (list_el) {
Sortable.create(list_el, {
group: {
name: 'recipe',
pull: 'clone',
put: false,
},
sort: false,
setData(dataTransfer, drag_el) {
dataTransfer.setData('Text', drag_el.textContent);
},
onStart(evt) {
$(evt.item).popover('destroy');
evt.item.setAttribute('data-toggle', 'popover-disabled');
},
onEnd: this.op_sort_end.bind(this),
});
};
@ -93,25 +93,25 @@ RecipeWaiter.prototype.create_sortable_seed_list = function(list_el) {
* @fires Manager#operationadd
* @param {event} evt
*/
RecipeWaiter.prototype.op_sort_end = function(evt) {
if (this.remove_intent) {
if (evt.item.parentNode.id == "rec_list") {
evt.item.remove();
}
return;
RecipeWaiter.prototype.op_sort_end = function (evt) {
if (this.remove_intent) {
if (evt.item.parentNode.id == 'rec_list') {
evt.item.remove();
}
return;
}
// 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();
if (evt.item.parentNode.id !== "rec_list") {
return;
}
this.build_recipe_operation(evt.item);
evt.item.dispatchEvent(this.manager.operationadd);
$(evt.clone).popover();
$(evt.clone).children('[data-toggle=popover]').popover();
if (evt.item.parentNode.id !== 'rec_list') {
return;
}
this.build_recipe_operation(evt.item);
evt.item.dispatchEvent(this.manager.operationadd);
};
@ -122,22 +122,23 @@ RecipeWaiter.prototype.op_sort_end = function(evt) {
*
* @param {event} e
*/
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) {
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) {
// 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) {
e.stopPropagation();
e.preventDefault();
document.querySelector("#categories a").classList.remove("favourites-hover");
RecipeWaiter.prototype.fav_dragleave = function (e) {
e.stopPropagation();
e.preventDefault();
document.querySelector('#categories a').classList.remove('favourites-hover');
};
@ -160,13 +161,13 @@ RecipeWaiter.prototype.fav_dragleave = function(e) {
*
* @param {event} e
*/
RecipeWaiter.prototype.fav_drop = function(e) {
e.stopPropagation();
e.preventDefault();
e.target.classList.remove("favourites-hover");
var op_name = e.dataTransfer.getData("Text");
this.app.add_favourite(op_name);
RecipeWaiter.prototype.fav_drop = function (e) {
e.stopPropagation();
e.preventDefault();
e.target.classList.remove('favourites-hover');
const op_name = e.dataTransfer.getData('Text');
this.app.add_favourite(op_name);
};
@ -175,8 +176,8 @@ RecipeWaiter.prototype.fav_drop = function(e) {
*
* @fires Manager#statechange
*/
RecipeWaiter.prototype.ing_change = function() {
window.dispatchEvent(this.manager.statechange);
RecipeWaiter.prototype.ing_change = function () {
window.dispatchEvent(this.manager.statechange);
};
@ -187,21 +188,21 @@ RecipeWaiter.prototype.ing_change = function() {
* @fires Manager#statechange
* @param {event} e
*/
RecipeWaiter.prototype.disable_click = function(e) {
var icon = e.target;
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");
}
this.app.progress = 0;
window.dispatchEvent(this.manager.statechange);
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');
} else {
icon.setAttribute('disabled', 'false');
icon.classList.remove('disable-icon-selected');
icon.parentNode.parentNode.classList.remove('disabled');
}
this.app.progress = 0;
window.dispatchEvent(this.manager.statechange);
};
@ -212,18 +213,18 @@ 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");
} else {
bp.setAttribute("break", "false");
bp.classList.remove("breakpoint-selected");
}
window.dispatchEvent(this.manager.statechange);
if (bp.getAttribute('break') == 'false') {
bp.setAttribute('break', 'true');
bp.classList.add('breakpoint-selected');
} else {
bp.setAttribute('break', 'false');
bp.classList.remove('breakpoint-selected');
}
window.dispatchEvent(this.manager.statechange);
};
@ -234,9 +235,9 @@ RecipeWaiter.prototype.breakpoint_click = function(e) {
* @fires Manager#statechange
* @param {event} e
*/
RecipeWaiter.prototype.operation_dblclick = function(e) {
e.target.remove();
window.dispatchEvent(this.manager.statechange);
RecipeWaiter.prototype.operation_dblclick = function (e) {
e.target.remove();
window.dispatchEvent(this.manager.statechange);
};
@ -247,9 +248,9 @@ RecipeWaiter.prototype.operation_dblclick = function(e) {
* @fires Manager#statechange
* @param {event} e
*/
RecipeWaiter.prototype.operation_child_dblclick = function(e) {
e.target.parentNode.remove();
window.dispatchEvent(this.manager.statechange);
RecipeWaiter.prototype.operation_child_dblclick = function (e) {
e.target.parentNode.remove();
window.dispatchEvent(this.manager.statechange);
};
@ -258,49 +259,54 @@ 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");
for (var i = 0; i < operations.length; i++) {
ingredients = [];
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") {
RecipeWaiter.prototype.get_config = function () {
let config = [],
ingredients,
ing_list,
disabled,
bp,
item,
operations = document.querySelectorAll('#rec_list li.operation');
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');
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")) {
ingredients[j] = ing_list[j].checked;
} 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
};
} else {
// all others
ingredients[j] = ing_list[j].value;
}
}
item = {
op: operations[i].querySelector(".arg-title").textContent,
args: ingredients
ingredients[j] = {
option: ing_list[j].previousSibling.children[0].textContent.slice(0, -1),
string: ing_list[j].value,
};
if (disabled && disabled.getAttribute("disabled") == "true") {
item.disabled = true;
}
if (bp && bp.getAttribute("break") == "true") {
item.breakpoint = true;
}
config.push(item);
} else {
// all others
ingredients[j] = ing_list[j].value;
}
}
return config;
item = {
op: operations[i].querySelector('.arg-title').textContent,
args: ingredients,
};
if (disabled && disabled.getAttribute('disabled') == 'true') {
item.disabled = true;
}
if (bp && bp.getAttribute('break') == 'true') {
item.breakpoint = true;
}
config.push(item);
}
return config;
};
@ -309,15 +315,15 @@ 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++) {
if (i == position) {
operations[i].classList.add("break");
} else {
operations[i].classList.remove("break");
}
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');
} else {
operations[i].classList.remove('break');
}
}
};
@ -327,21 +333,21 @@ 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);
el.innerHTML = op.to_full_html();
if (this.app.operations[op_name].flow_control) {
el.classList.add("flow-control-op");
}
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');
}
// 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);
}
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);
}
};
/**
@ -351,15 +357,15 @@ 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");
item.innerHTML = name;
this.build_recipe_operation(item);
document.getElementById("rec_list").appendChild(item);
item.dispatchEvent(this.manager.operationadd);
return item;
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);
item.dispatchEvent(this.manager.operationadd);
return item;
};
@ -368,12 +374,12 @@ RecipeWaiter.prototype.add_operation = function(name) {
*
* @fires Manager#operationremove
*/
RecipeWaiter.prototype.clear_recipe = function() {
var rec_list = document.getElementById("rec_list");
while (rec_list.firstChild) {
rec_list.removeChild(rec_list.firstChild);
}
rec_list.dispatchEvent(this.manager.operationremove);
RecipeWaiter.prototype.clear_recipe = function () {
const rec_list = document.getElementById('rec_list');
while (rec_list.firstChild) {
rec_list.removeChild(rec_list.firstChild);
}
rec_list.dispatchEvent(this.manager.operationremove);
};
@ -383,12 +389,12 @@ RecipeWaiter.prototype.clear_recipe = function() {
*
* @param {event} e
*/
RecipeWaiter.prototype.dropdown_toggle_click = function(e) {
var el = e.target,
button = el.parentNode.parentNode.previousSibling;
button.innerHTML = el.textContent + " <span class='caret'></span>";
this.ing_change();
RecipeWaiter.prototype.dropdown_toggle_click = function (e) {
let el = e.target,
button = el.parentNode.parentNode.previousSibling;
button.innerHTML = `${el.textContent} <span class='caret'></span>`;
this.ing_change();
};
@ -399,8 +405,8 @@ RecipeWaiter.prototype.dropdown_toggle_click = function(e) {
* @fires Manager#statechange
* @param {event} e
*/
RecipeWaiter.prototype.op_add = function(e) {
window.dispatchEvent(this.manager.statechange);
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) {
window.dispatchEvent(this.manager.statechange);
};
RecipeWaiter.prototype.op_remove = function (e) {
window.dispatchEvent(this.manager.statechange);
};

View File

@ -9,37 +9,37 @@
* @param {HTMLApp} app - The main view object for CyberChef.
* @param {Manager} manager - The CyberChef event manager.
*/
var SeasonalWaiter = function(app, manager) {
this.app = app;
this.manager = manager;
const SeasonalWaiter = function (app, manager) {
this.app = app;
this.manager = 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);
if (now.getDate() == 25) this.let_it_snow();
}
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);
if (now.getDate() == 25) this.let_it_snow();
}
// SpiderChef
// if (now.getMonth() == 3 && now.getDate() == 1) { // Apr 1
// this.insert_spider_icons();
// this.insert_spider_text();
// }
// Konami code
this.kkeys = [];
window.addEventListener("keydown", this.konami_code_listener.bind(this));
this.kkeys = [];
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");
}
}, true);
if (node.nodeType == 3) {
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");
}
}, true);
if (node.nodeType == 3) {
node.nodeValue = node.nodeValue.replace(/Bake/g, 'Spin');
}
}, true);
// Recipe title
document.querySelector("#recipe .title").innerHTML = "Web";
document.querySelector('#recipe .title').innerHTML = 'Web';
};
@ -96,17 +96,17 @@ 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");
option_item.className = "option-item";
option_item.innerHTML =
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.innerHTML =
"<input type='checkbox' option='snow' checked />\
Let it snow";
options_body.appendChild(option_item);
this.manager.options.load();
options_body.appendChild(option_item);
this.manager.options.load();
};
@ -114,73 +114,73 @@ SeasonalWaiter.prototype.create_snow_option = function() {
* Initialises a snowstorm.
* #letitsnow
*/
SeasonalWaiter.prototype.let_it_snow = function() {
$(document).snowfall("clear");
if (!this.app.options.snow) return;
var options = {},
firefox_version = navigator.userAgent.match(/Firefox\/(\d\d?)/);
if (firefox_version && parseInt(firefox_version[1], 10) < 30) {
SeasonalWaiter.prototype.let_it_snow = function () {
$(document).snowfall('clear');
if (!this.app.options.snow) return;
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',
flakePosition: 'absolute',
minSize : 1,
maxSize : 2,
minSpeed : 1,
maxSpeed : 5,
round : false,
shadow : false,
collection : false,
collectionHeight : 20,
deviceorientation : true
};
} else {
options = {
flakeCount: 10,
flakeColor: '#fff',
flakePosition: 'absolute',
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',
flakePosition: 'absolute',
minSize : 5,
maxSize : 8,
minSpeed : 1,
maxSpeed : 5,
round : true,
shadow : true,
collection : ".btn",
collectionHeight : 20,
deviceorientation : true
};
}
$(document).snowfall(options);
options = {
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,
};
}
$(document).snowfall(options);
};
/**
* When a button is clicked, shake the snow off that button.
* #letitsnow
*/
SeasonalWaiter.prototype.shake_off_snow = function(e) {
var el = e.target,
rect = el.getBoundingClientRect(),
canvases = document.querySelectorAll("canvas.snowfall-canvas"),
canvas = null,
remove_func = function() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
$(this).fadeIn();
};
for (var i = 0; i < canvases.length; i++) {
canvas = canvases[i];
if (canvas.style.left == rect.left + "px" && canvas.style.top == (rect.top - 20) + "px") {
var ctx = canvas.getContext("2d");
$(canvas).fadeOut("slow", remove_func);
break;
}
SeasonalWaiter.prototype.shake_off_snow = function (e) {
let el = e.target,
rect = el.getBoundingClientRect(),
canvases = document.querySelectorAll('canvas.snowfall-canvas'),
canvas = null,
remove_func = function () {
ctx.clearRect(0, 0, canvas.width, canvas.height);
$(this).fadeIn();
};
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');
$(canvas).fadeOut('slow', remove_func);
break;
}
}
};
@ -189,19 +189,19 @@ SeasonalWaiter.prototype.shake_off_snow = function(e) {
* sequence.
* #konamicode
*/
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++) {
if (this.kkeys[i] != konami[i]) {
this.kkeys = [];
break;
}
if (i == konami.length - 1) {
$("body").children().toggleClass("konami");
this.kkeys = [];
}
SeasonalWaiter.prototype.konami_code_listener = function (e) {
this.kkeys.push(e.keyCode);
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');
this.kkeys = [];
}
}
};
@ -213,42 +213,42 @@ 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
};
return function(parent, fn, all_nodes) {
var node = parent.firstChild;
while (node && node != parent) {
if (all_nodes || node.nodeType === 1) {
if (fn(node) === false) {
return(false);
}
}
const skipTags = {
SCRIPT: true, IFRAME: true, OBJECT: true,
EMBED: true, STYLE: true, LINK: true, META: true,
};
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);
}
}
// If it's an element &&
// has children &&
// has a tagname && is not in the skipTags list
// then, we can enumerate children
if (node.nodeType === 1 &&
if (node.nodeType === 1 &&
node.firstChild &&
!(node.tagName && skipTags[node.tagName])) {
node = node.firstChild;
} else if (node.nextSibling) {
node = node.nextSibling;
} else {
node = node.firstChild;
} else if (node.nextSibling) {
node = node.nextSibling;
} else {
// No child and no nextsibling
// Find parent that has a nextSibling
while ((node = node.parentNode) != parent) {
if (node.nextSibling) {
node = node.nextSibling;
break;
}
}
}
while ((node = node.parentNode) != parent) {
if (node.nextSibling) {
node = node.nextSibling;
break;
}
}
};
})();
}
}
};
}());

View File

@ -8,8 +8,8 @@
* @constructor
* @param {HTMLApp} app - The main view object for CyberChef.
*/
var WindowWaiter = function(app) {
this.app = app;
const WindowWaiter = function (app) {
this.app = app;
};
@ -18,9 +18,9 @@ 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() {
clearTimeout(this.reset_layout_timeout);
this.reset_layout_timeout = setTimeout(this.app.reset_layout.bind(this.app), 200);
WindowWaiter.prototype.window_resize = function () {
clearTimeout(this.reset_layout_timeout);
this.reset_layout_timeout = setTimeout(this.app.reset_layout.bind(this.app), 200);
};
@ -29,8 +29,8 @@ 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() {
this.window_blur_time = new Date().getTime();
WindowWaiter.prototype.window_blur = function () {
this.window_blur_time = new Date().getTime();
};
@ -44,9 +44,9 @@ 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;
if (unfocused_time > 60000) {
this.app.silent_bake();
}
WindowWaiter.prototype.window_focus = function () {
const unfocused_time = new Date().getTime() - this.window_blur_time;
if (unfocused_time > 60000) {
this.app.silent_bake();
}
};

View File

@ -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"
];
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 main = function () {
const default_favourites = [
'To Base64',
'From Base64',
'To Hex',
'From Hex',
'To Hexdump',
'From Hexdump',
'URL Decode',
'Regular expression',
'Entropy',
'Fork',
];
document.removeEventListener("DOMContentLoaded", main, false);
window.app = new HTMLApp(Categories, OperationConfig, default_favourites, default_options);
window.app.setup();
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);
window.app = new HTMLApp(Categories, OperationConfig, default_favourites, default_options);
window.app.setup();
};
// Fix issues with browsers that don't support console.log()
window.console = console || {log: function() {}, error: function() {}};
window.console = console || { log() {}, error() {} };
window.compile_time = moment.tz("<%= grunt.template.today() %>", "ddd MMM D YYYY HH:mm:ss", "UTC").valueOf();
window.compile_message = "<%= compile_msg %>";
window.compile_time = moment.tz('<%= grunt.template.today() %>', 'ddd MMM D YYYY HH:mm:ss', 'UTC').valueOf();
window.compile_message = '<%= compile_msg %>';
document.addEventListener("DOMContentLoaded", main, false);
document.addEventListener('DOMContentLoaded', main, false);

View File

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