From e853a934eab3ab9587a77d7ffa9ef3dda37ce986 Mon Sep 17 00:00:00 2001 From: El RIDO Date: Mon, 6 Oct 2025 14:52:08 +0200 Subject: [PATCH 1/5] improve JS unit test readability & error reporting --- js/test/Alert.js | 13 ++--- js/test/CryptTool.js | 7 +-- js/test/PasteStatus.js | 6 +-- js/test/TopNav.js | 100 ++++++++++++++++++++++++++++------- js/test/emailTemplateTest.js | 10 ++-- 5 files changed, 97 insertions(+), 39 deletions(-) diff --git a/js/test/Alert.js b/js/test/Alert.js index a6c888f4..92464ed1 100644 --- a/js/test/Alert.js +++ b/js/test/Alert.js @@ -306,10 +306,8 @@ describe('Alert', function () { $('body').addClass('loading'); $.PrivateBin.Alert.init(); $.PrivateBin.Alert.hideLoading(); - assert.ok( - !$('body').hasClass('loading') && - $('#loadingindicator').hasClass('hidden') - ); + assert.ok(!$('body').hasClass('loading')); + assert.ok($('#loadingindicator').hasClass('hidden')); } ); }); @@ -328,10 +326,8 @@ describe('Alert', function () { ); $.PrivateBin.Alert.init(); $.PrivateBin.Alert.hideMessages(); - assert.ok( - $('#status').hasClass('hidden') && - $('#errormessage').hasClass('hidden') - ); + assert.ok($('#status').hasClass('hidden')); + assert.ok($('#errormessage').hasClass('hidden')); } ); }); @@ -381,4 +377,3 @@ describe('Alert', function () { ); }); }); - diff --git a/js/test/CryptTool.js b/js/test/CryptTool.js index ed94320a..e48e0b35 100644 --- a/js/test/CryptTool.js +++ b/js/test/CryptTool.js @@ -58,9 +58,10 @@ describe('CryptTool', function () { 'foo', 'bar', cipherMessage ); clean(); - const result = (message === plaintext); - if (!result) console.log(plaintext, cipherMessage); - assert.ok(result); + if (message !== plaintext) { + console.log(plaintext, cipherMessage); + } + assert.strictEqual(message, plaintext); }); it('can en- and decrypt a particular message (#260)', function () { diff --git a/js/test/PasteStatus.js b/js/test/PasteStatus.js index f5132342..3df9511b 100644 --- a/js/test/PasteStatus.js +++ b/js/test/PasteStatus.js @@ -217,10 +217,8 @@ describe('PasteStatus', function () { ); $.PrivateBin.PasteStatus.init(); $.PrivateBin.PasteStatus.hideMessages(); - assert.ok( - $('#remainingtime').hasClass('hidden') && - $('#pastesuccess').hasClass('hidden') - ); + assert.ok($('#remainingtime').hasClass('hidden')); + assert.ok($('#pastesuccess').hasClass('hidden')); } ); }); diff --git a/js/test/TopNav.js b/js/test/TopNav.js index b1237deb..93f215b5 100644 --- a/js/test/TopNav.js +++ b/js/test/TopNav.js @@ -52,7 +52,11 @@ describe('TopNav', function () { $('#qrcodelink').hasClass('hidden') ); cleanup(); - assert.ok(results.every(element => element)); + const result = results.every(element => element); + if (!result) { + console.log(results); + } + assert.ok(result); } ); }); @@ -113,7 +117,11 @@ describe('TopNav', function () { $('#attach').hasClass('hidden') ); cleanup(); - assert.ok(results.every(element => element)); + const result = results.every(element => element); + if (!result) { + console.log(results); + } + assert.ok(result); } ); }); @@ -140,7 +148,11 @@ describe('TopNav', function () { !$('#newbutton').hasClass('hidden') ); cleanup(); - assert.ok(results.every(element => element)); + const result = results.every(element => element); + if (!result) { + console.log(results); + } + assert.ok(result); } ); }); @@ -169,7 +181,11 @@ describe('TopNav', function () { $('#clonebutton').hasClass('hidden') ); cleanup(); - assert.ok(results.every(element => element)); + const result = results.every(element => element); + if (!result) { + console.log(results); + } + assert.ok(result); } ); }); @@ -199,7 +215,11 @@ describe('TopNav', function () { $('#rawtextbutton').hasClass('hidden') ); cleanup(); - assert.ok(results.every(element => element)); + const result = results.every(element => element); + if (!result) { + console.log(results); + } + assert.ok(result); } ); }); @@ -233,7 +253,11 @@ describe('TopNav', function () { $('#filewrap').hasClass('hidden') ); cleanup(); - assert.ok(results.every(element => element)); + const result = results.every(element => element); + if (!result) { + console.log(results); + } + assert.ok(result); } ); }); @@ -267,7 +291,11 @@ describe('TopNav', function () { !$('#customattachment').hasClass('hidden') ); cleanup(); - assert.ok(results.every(element => element)); + const result = results.every(element => element); + if (!result) { + console.log(results); + } + assert.ok(result); } ); }); @@ -318,7 +346,11 @@ describe('TopNav', function () { ); */ clean(); - assert.ok(results.every(element => element)); + const result = results.every(element => element); + if (!result) { + console.log(results); + } + assert.ok(result); } ); }); @@ -364,7 +396,11 @@ describe('TopNav', function () { !$.PrivateBin.TopNav.getOpenDiscussion() ); cleanup(); - assert.ok(results.every(element => element)); + const result = results.every(element => element); + if (!result) { + console.log(results); + } + assert.ok(result); } ); @@ -403,7 +439,11 @@ describe('TopNav', function () { !$.PrivateBin.TopNav.getOpenDiscussion() ); cleanup(); - assert.ok(results.every(element => element)); + const result = results.every(element => element); + if (!result) { + console.log(results); + } + assert.ok(result); } ); @@ -443,7 +483,11 @@ describe('TopNav', function () { $.PrivateBin.TopNav.getOpenDiscussion() ); cleanup(); - assert.ok(results.every(element => element)); + const result = results.every(element => element); + if (!result) { + console.log(results); + } + assert.ok(result); } ); }); @@ -462,7 +506,7 @@ describe('TopNav', function () { '' ); $.PrivateBin.TopNav.init(); - assert.ok($.PrivateBin.TopNav.getExpiration() === '1day'); + assert.strictEqual($.PrivateBin.TopNav.getExpiration(), '1day'); cleanup(); } ); @@ -541,7 +585,11 @@ describe('TopNav', function () { files[1].name === 'busy.gif' ); cleanup(); - assert.ok(results.every(element => element)); + const result = results.every(element => element); + if (!result) { + console.log(results); + } + assert.ok(result); } ); }); @@ -574,7 +622,11 @@ describe('TopNav', function () { !$.PrivateBin.TopNav.getBurnAfterReading() ); cleanup(); - assert.ok(results.every(element => element)); + const result = results.every(element => element); + if (!result) { + console.log(results); + } + assert.ok(result); } ); }); @@ -607,7 +659,11 @@ describe('TopNav', function () { !$.PrivateBin.TopNav.getOpenDiscussion() ); cleanup(); - assert.ok(results.every(element => element)); + const result = results.every(element => element); + if (!result) { + console.log(results); + } + assert.ok(result); } ); }); @@ -642,7 +698,11 @@ describe('TopNav', function () { $.PrivateBin.TopNav.getPassword() === '' ); cleanup(); - return results.every(element => element); + const result = results.every(element => element); + if (!result) { + console.log(results); + } + return result; } ); }); @@ -676,7 +736,11 @@ describe('TopNav', function () { $.PrivateBin.TopNav.getCustomAttachment().hasClass('test') ); cleanup(); - assert.ok(results.every(element => element)); + const result = results.every(element => element); + if (!result) { + console.log(results); + } + assert.ok(result); } ); }); @@ -738,7 +802,7 @@ describe('TopNav', function () { $.PrivateBin.Helper.reset(); $.PrivateBin.TopNav.init(); $('#rawtextbutton').click(); - assert.equal($('pre').text(), sample); + assert.strictEqual($('pre').text(), sample); clean(); } ); diff --git a/js/test/emailTemplateTest.js b/js/test/emailTemplateTest.js index ce56ab8f..29380457 100644 --- a/js/test/emailTemplateTest.js +++ b/js/test/emailTemplateTest.js @@ -80,7 +80,7 @@ function stubWinOpen($element) { // Extract and decode the body from a "mailto:?body=..." URL. function extractMailtoBody(mailtoUrl) { - assert.ok(/^mailto:\?body=/.test(mailtoUrl), 'expected a mailto:?body= URL'); + assert.match(mailtoUrl, /^mailto:\?body=/, 'expected a mailto:?body= URL'); return decodeURIComponent(mailtoUrl.replace(/^mailto:\?body=/, '')); } @@ -104,8 +104,8 @@ describe('Email - mail body content (short URL vs. fallback)', function () { assert.ok(openedUrl, 'window.open should have been called'); const body = extractMailtoBody(openedUrl); - assert.ok(body.includes('https://short.example/xYz'), 'email body should include the short URL'); - assert.ok(!body.includes('undefined'), 'email body must not contain "undefined"'); + assert.match(body, /https:\/\/short\.example\/xYz/, 'email body should include the short URL'); + assert.doesNotMatch(body, /undefined/, 'email body must not contain "undefined"'); } finally { restore(); cleanup(); @@ -127,8 +127,8 @@ describe('Email - mail body content (short URL vs. fallback)', function () { assert.ok(openedUrl, 'window.open should have been called'); const body = extractMailtoBody(openedUrl); - assert.ok(body.includes(win.location.href), 'email body should include the fallback page URL'); - assert.ok(!body.includes('undefined'), 'email body must not contain "undefined"'); + assert.match(body, new RegExp(win.location.href), 'email body should include the fallback page URL'); + assert.doesNotMatch(body, /undefined/, 'email body must not contain "undefined"'); } finally { restore(); cleanup(); From b8037d869cd2efc5576f1d61ac2e12689732e70a Mon Sep 17 00:00:00 2001 From: El RIDO Date: Mon, 6 Oct 2025 15:50:26 +0200 Subject: [PATCH 2/5] stick to a single code style --- js/test/TopNav.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/js/test/TopNav.js b/js/test/TopNav.js index 93f215b5..84b30643 100644 --- a/js/test/TopNav.js +++ b/js/test/TopNav.js @@ -535,25 +535,25 @@ describe('TopNav', function () { lastModified, type: mime.lookup(file_path) || '', } - ) + ); } function addFileList(input, file_paths) { - if (typeof file_paths === 'string') - file_paths = [file_paths] - else if (!Array.isArray(file_paths)) { - throw new Error('file_paths needs to be a file path string or an Array of file path strings') + if (typeof file_paths === 'string') { + file_paths = [file_paths]; + } else if (!Array.isArray(file_paths)) { + throw new Error('file_paths needs to be a file path string or an Array of file path strings'); } - const file_list = file_paths.map(fp => createFile(fp)) - file_list.__proto__ = Object.create(FileList.prototype) + const file_list = file_paths.map(fp => createFile(fp)); + file_list.__proto__ = Object.create(FileList.prototype); Object.defineProperty(input, 'files', { value: file_list, writeable: false, - }) + }); - return input + return input; } it( From d40dac482575598eed727eb8a4a68601b67b8ce0 Mon Sep 17 00:00:00 2001 From: El RIDO Date: Mon, 6 Oct 2025 17:35:34 +0200 Subject: [PATCH 3/5] improve error reporting --- js/test/Check.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/js/test/Check.js b/js/test/Check.js index 63428c93..167970ae 100644 --- a/js/test/Check.js +++ b/js/test/Check.js @@ -50,7 +50,11 @@ describe('Check', function () { result2 = isSecureContext === (document.getElementById('insecurecontextnotice').className === 'hidden'), result3 = (document.getElementById('oldnotice').className !== 'hidden'); clean(); - return result1 && result2 && result3; + if (result1 && result2 && result3) { + return true; + } + console.log(result1, result2, result3); + return false; } ); @@ -74,9 +78,12 @@ describe('Check', function () { const result1 = Legacy.Check.getInit() && Legacy.Check.getStatus(), result2 = secureProtocol === (document.getElementById('httpnotice').className === 'hidden'); clean(); - return result1 && result2; + if (result1 && result2) { + return true; + } + console.log(result1, result2); + return false; } ); }); }); - From ead315251f23579301adefbae16cc34594b5f0f1 Mon Sep 17 00:00:00 2001 From: El RIDO Date: Mon, 6 Oct 2025 17:38:09 +0200 Subject: [PATCH 4/5] suppress noise from early initialization during unit tests the tests still all passed, but the missing browser globals in the node environment could cause misleading messages in the mocha output --- js/legacy.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/js/legacy.js b/js/legacy.js index 1f27107b..38f3cb2d 100644 --- a/js/legacy.js +++ b/js/legacy.js @@ -246,6 +246,11 @@ */ me.init = function() { + // prevent early init + if (typeof document === 'undefined' || typeof navigator === 'undefined' || typeof window === 'undefined') { + return; + } + // prevent bots from viewing a document and potentially deleting data // when burn-after-reading is set if (isBadBot()) { From 7f9324227967aafd110e0692dee2f01c26d1d890 Mon Sep 17 00:00:00 2001 From: El RIDO Date: Mon, 6 Oct 2025 18:30:19 +0200 Subject: [PATCH 5/5] upgrade eslint config and remove workaround for implicit globals we seem to have used eslint through codeclimate in the past, but that service seems no longer integrated, possibly due to no longer being free --- .eslintignore | 2 - .eslintrc | 236 ------------------------------------------ .gitattributes | 3 +- eslint.config.mjs | 213 ++++++++++++++++++++++++++++++++++++++ js/privatebin.js | 2 - lib/Configuration.php | 4 +- 6 files changed, 216 insertions(+), 244 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc create mode 100644 eslint.config.mjs diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index f3c9e2a4..00000000 --- a/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -js/*.js -!js/privatebin.js diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 8275c969..00000000 --- a/.eslintrc +++ /dev/null @@ -1,236 +0,0 @@ ---- -parserOptions: - ecmaVersion: 2017 - -ecmaFeatures: - modules: true - jsx: true - -env: - amd: true - browser: true - es6: true - jquery: true - node: true - mocha: true - -globals: - DOMPurify: readonly - cleanup: writable - describe: readonly - jsc: readonly - jsdom: writable - kjua: writable - WebCrypto: writable - -# http://eslint.org/docs/rules/ -rules: - # Possible Errors - comma-dangle: - - error - - never - no-cond-assign: 2 - no-console: 0 - no-constant-condition: 2 - no-control-regex: 2 - no-debugger: 2 - no-dupe-args: 2 - no-dupe-keys: 2 - no-duplicate-case: 2 - no-empty: 2 - no-empty-character-class: 2 - no-ex-assign: 2 - no-extra-boolean-cast: 2 - no-extra-parens: 0 - no-extra-semi: 2 - no-func-assign: 2 - no-inner-declarations: - - error - - functions - no-invalid-regexp: 2 - no-irregular-whitespace: 2 - no-negated-in-lhs: 2 - no-obj-calls: 2 - no-regex-spaces: 2 - no-sparse-arrays: 2 - no-unexpected-multiline: 2 - no-unreachable: 2 - use-isnan: 2 - valid-jsdoc: 0 - valid-typeof: 2 - - # Best Practices - accessor-pairs: 2 - block-scoped-var: 0 - complexity: - - error - - 20 - consistent-return: 0 - curly: 0 - default-case: 0 - dot-location: 0 - dot-notation: 0 - eqeqeq: 2 - guard-for-in: 2 - no-alert: 0 - no-caller: 2 - no-case-declarations: 2 - no-div-regex: 2 - no-else-return: 0 - no-empty-pattern: 2 - no-eq-null: 2 - no-eval: 2 - no-extend-native: 2 - no-extra-bind: 2 - no-fallthrough: 2 - no-floating-decimal: 0 - no-implicit-coercion: 0 - no-implied-eval: 2 - no-invalid-this: 0 - no-iterator: 2 - no-labels: 0 - no-lone-blocks: 2 - no-loop-func: 2 - no-magic-number: 0 - no-multi-spaces: 0 - no-multi-str: 0 - no-native-reassign: 2 - no-new-func: 2 - no-new-wrappers: 2 - no-new: 2 - no-octal-escape: 2 - no-octal: 2 - no-proto: 2 - no-redeclare: 0 - no-return-assign: 2 - no-script-url: 2 - no-self-compare: 2 - no-sequences: 0 - no-throw-literal: 0 - no-unused-expressions: 2 - no-useless-call: 2 - no-useless-concat: 2 - no-void: 2 - no-warning-comments: 0 - no-with: 2 - radix: 2 - vars-on-top: 0 - wrap-iife: 0 - yoda: 0 - - # Strict - strict: 0 - - # Variables - init-declarations: 0 - no-catch-shadow: 2 - no-delete-var: 2 - no-label-var: 2 - no-shadow-restricted-names: 2 - no-shadow: 0 - no-undef-init: 2 - no-undef: 0 - no-undefined: 0 - no-unused-vars: 0 - no-use-before-define: 0 - - # Node.js and CommonJS - callback-return: 2 - global-require: 2 - handle-callback-err: 2 - no-mixed-requires: 0 - no-new-require: 0 - no-path-concat: 2 - no-process-exit: 2 - no-restricted-modules: 0 - no-sync: 0 - - # Stylistic Issues - array-bracket-spacing: 0 - block-spacing: 0 - brace-style: 0 - camelcase: 0 - comma-spacing: 0 - comma-style: 0 - computed-property-spacing: 0 - consistent-this: 0 - eol-last: 0 - func-names: 0 - func-style: 0 - id-length: 0 - id-match: 0 - indent: 0 - jsx-quotes: 0 - key-spacing: 0 - linebreak-style: 0 - lines-around-comment: 0 - max-depth: 0 - max-len: 0 - max-nested-callbacks: 0 - max-params: 0 - max-statements: - - error - - 60 - new-cap: 0 - new-parens: 0 - newline-after-var: 0 - no-array-constructor: 0 - no-bitwise: 0 - no-continue: 0 - no-inline-comments: 0 - no-lonely-if: 0 - no-mixed-spaces-and-tabs: 0 - no-multiple-empty-lines: 0 - no-negated-condition: 0 - no-nested-ternary: 0 - no-new-object: 0 - no-plusplus: 0 - no-restricted-syntax: 0 - no-spaced-func: 0 - no-ternary: 0 - no-trailing-spaces: 0 - no-underscore-dangle: 0 - no-unneeded-ternary: 0 - object-curly-spacing: 0 - one-var: 0 - operator-assignment: 0 - operator-linebreak: 0 - padded-blocks: 0 - quote-props: 0 - quotes: - - error - - single - require-jsdoc: 0 - semi-spacing: 0 - semi: 0 - sort-vars: 0 - space-after-keywords: 0 - space-before-blocks: 0 - space-before-function-paren: 0 - space-before-keywords: 0 - space-in-parens: 0 - space-infix-ops: 0 - space-return-throw-case: 0 - space-unary-ops: 0 - spaced-comment: 0 - wrap-regex: 0 - - # ECMAScript 6 - arrow-body-style: 0 - arrow-parens: 0 - arrow-spacing: 0 - constructor-super: 0 - generator-star-spacing: 0 - no-arrow-condition: 0 - no-class-assign: 0 - no-const-assign: 0 - no-dupe-class-members: 0 - no-this-before-super: 0 - no-var: 0 - object-shorthand: 0 - prefer-arrow-callback: 0 - prefer-const: 0 - prefer-reflect: 0 - prefer-spread: 0 - prefer-template: 0 - require-yield: 0 diff --git a/.gitattributes b/.gitattributes index 9073910f..ae408079 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12,8 +12,6 @@ js/test/ export-ignore .csslintrc export-ignore .devcontainer export-ignore .editorconfig export-ignore -.eslintignore export-ignore -.eslintrc export-ignore .gitattributes export-ignore .github export-ignore .gitignore export-ignore @@ -26,6 +24,7 @@ js/test/ export-ignore .vscode export-ignore codacy-analysis.yml export-ignore crowdin.yml export-ignore +eslint.config.mjs export-ignore BADGES.md export-ignore CODE_OF_CONDUCT.md export-ignore Makefile export-ignore diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..25828cc2 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,213 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import globals from "globals"; + +export default defineConfig([globalIgnores(["js/*.js", "!js/privatebin.js"]), { + languageOptions: { + globals: { + ...globals.amd, + ...globals.browser, + ...globals.jquery, + ...globals.node, + ...globals.mocha, + DOMPurify: "readonly", + cleanup: "writable", + describe: "readonly", + jsc: "readonly", + jsdom: "writable", + kjua: "writable", + WebCrypto: "writable", + }, + + ecmaVersion: 2017, + sourceType: "commonjs", + }, + + rules: { + "comma-dangle": ["error", "never"], + "no-cond-assign": 2, + "no-console": 0, + "no-constant-condition": 2, + "no-control-regex": 2, + "no-debugger": 2, + "no-dupe-args": 2, + "no-dupe-keys": 2, + "no-duplicate-case": 2, + "no-empty": 2, + "no-empty-character-class": 2, + "no-ex-assign": 2, + "no-extra-boolean-cast": 2, + "no-extra-parens": 0, + "no-extra-semi": 2, + "no-func-assign": 2, + "no-inner-declarations": ["error", "functions"], + "no-invalid-regexp": 2, + "no-irregular-whitespace": 2, + "no-negated-in-lhs": 2, + "no-obj-calls": 2, + "no-regex-spaces": 2, + "no-sparse-arrays": 2, + "no-unexpected-multiline": 2, + "no-unreachable": 2, + "use-isnan": 2, + "valid-jsdoc": 0, + "valid-typeof": 2, + "accessor-pairs": 2, + "block-scoped-var": 0, + complexity: ["error", 20], + "consistent-return": 0, + curly: 0, + "default-case": 0, + "dot-location": 0, + "dot-notation": 0, + eqeqeq: 2, + "guard-for-in": 2, + "no-alert": 0, + "no-caller": 2, + "no-case-declarations": 2, + "no-div-regex": 2, + "no-else-return": 0, + "no-empty-pattern": 2, + "no-eq-null": 2, + "no-eval": 2, + "no-extend-native": 2, + "no-extra-bind": 2, + "no-fallthrough": 2, + "no-floating-decimal": 0, + "no-implicit-coercion": 0, + "no-implied-eval": 2, + "no-invalid-this": 0, + "no-iterator": 2, + "no-labels": 0, + "no-lone-blocks": 2, + "no-loop-func": 2, + "no-magic-number": 0, + "no-multi-spaces": 0, + "no-multi-str": 0, + "no-native-reassign": 2, + "no-new-func": 2, + "no-new-wrappers": 2, + "no-new": 2, + "no-octal-escape": 2, + "no-octal": 2, + "no-proto": 2, + "no-redeclare": 0, + "no-return-assign": 2, + "no-script-url": 2, + "no-self-compare": 2, + "no-sequences": 0, + "no-throw-literal": 0, + "no-unused-expressions": 2, + "no-useless-call": 2, + "no-useless-concat": 2, + "no-void": 2, + "no-warning-comments": 0, + "no-with": 2, + radix: 2, + "vars-on-top": 0, + "wrap-iife": 0, + yoda: 0, + strict: 0, + "init-declarations": 0, + "no-catch-shadow": 2, + "no-delete-var": 2, + "no-label-var": 2, + "no-shadow-restricted-names": 2, + "no-shadow": 0, + "no-undef-init": 2, + "no-undef": 0, + "no-undefined": 0, + "no-unused-vars": 0, + "no-use-before-define": 0, + "callback-return": 2, + "global-require": 2, + "handle-callback-err": 2, + "no-mixed-requires": 0, + "no-new-require": 0, + "no-path-concat": 2, + "no-process-exit": 2, + "no-restricted-modules": 0, + "no-sync": 0, + "array-bracket-spacing": 0, + "block-spacing": 0, + "brace-style": 0, + camelcase: 0, + "comma-spacing": 0, + "comma-style": 0, + "computed-property-spacing": 0, + "consistent-this": 0, + "eol-last": 0, + "func-names": 0, + "func-style": 0, + "id-length": 0, + "id-match": 0, + indent: 0, + "jsx-quotes": 0, + "key-spacing": 0, + "linebreak-style": 0, + "lines-around-comment": 0, + "max-depth": 0, + "max-len": 0, + "max-nested-callbacks": 0, + "max-params": 0, + "max-statements": ["error", 60], + "new-cap": 0, + "new-parens": 0, + "newline-after-var": 0, + "no-array-constructor": 0, + "no-bitwise": 0, + "no-continue": 0, + "no-inline-comments": 0, + "no-lonely-if": 0, + "no-mixed-spaces-and-tabs": 0, + "no-multiple-empty-lines": 0, + "no-negated-condition": 0, + "no-nested-ternary": 0, + "no-new-object": 0, + "no-plusplus": 0, + "no-restricted-syntax": 0, + "no-spaced-func": 0, + "no-ternary": 0, + "no-trailing-spaces": 0, + "no-underscore-dangle": 0, + "no-unneeded-ternary": 0, + "object-curly-spacing": 0, + "one-var": 0, + "operator-assignment": 0, + "operator-linebreak": 0, + "padded-blocks": 0, + "quote-props": 0, + quotes: ["error", "single"], + "require-jsdoc": 0, + "semi-spacing": 0, + semi: 0, + "sort-vars": 0, + "space-after-keywords": 0, + "space-before-blocks": 0, + "space-before-function-paren": 0, + "space-before-keywords": 0, + "space-in-parens": 0, + "space-infix-ops": 0, + "space-return-throw-case": 0, + "space-unary-ops": 0, + "spaced-comment": 0, + "wrap-regex": 0, + "arrow-body-style": 0, + "arrow-parens": 0, + "arrow-spacing": 0, + "constructor-super": 0, + "generator-star-spacing": 0, + "no-arrow-condition": 0, + "no-class-assign": 0, + "no-const-assign": 0, + "no-dupe-class-members": 0, + "no-this-before-super": 0, + "no-var": 0, + "object-shorthand": 0, + "prefer-arrow-callback": 0, + "prefer-const": 0, + "prefer-reflect": 0, + "prefer-spread": 0, + "prefer-template": 0, + "require-yield": 0, + }, +}]); diff --git a/js/privatebin.js b/js/privatebin.js index 4e765db3..912aae18 100644 --- a/js/privatebin.js +++ b/js/privatebin.js @@ -10,8 +10,6 @@ * @namespace */ -// global Base64, DOMPurify, FileReader, baseX, bootstrap, history, navigator, prettyPrint, prettyPrintOne, showdown, kjua - jQuery.fn.draghover = function() { 'use strict'; return this.each(function() { diff --git a/lib/Configuration.php b/lib/Configuration.php index b5ee90b5..8a2f7270 100644 --- a/lib/Configuration.php +++ b/lib/Configuration.php @@ -119,9 +119,9 @@ class Configuration 'js/dark-mode-switch.js' => 'sha512-BhY7dNU14aDN5L+muoUmA66x0CkYUWkQT0nxhKBLP/o2d7jE025+dvWJa4OiYffBGEFgmhrD/Sp+QMkxGMTz2g==', 'js/jquery-3.7.1.js' => 'sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==', 'js/kjua-0.10.0.js' => 'sha512-BYj4xggowR7QD150VLSTRlzH62YPfhpIM+b/1EUEr7RQpdWAGKulxWnOvjFx1FUlba4m6ihpNYuQab51H6XlYg==', - 'js/legacy.js' => 'sha512-mXAgFn/DonfPANvPO6Kf08zRKCeQ75jXK69gcUUOpPLFkp3KHnDhnvij8nEJxlutD/670Bfi4RNMG6uEjA4nNQ==', + 'js/legacy.js' => 'sha512-rGXYUpIqbFoHAgBXZ0UlJBdNAIMOC9EQ67MG0X46D5uRB8LvwzgKirbSQRGdYfk8I2jsUcm+tvHXYboUnC6DUg==', 'js/prettify.js' => 'sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==', - 'js/privatebin.js' => 'sha512-Id47n8ZPz6j93KoR7DkaS48MxtwKftVq3RyZw9WRGpRT+6bYKP/ZkU84RscbcW3icxBTS9fQKQpdnmZ3rr00dQ==', + 'js/privatebin.js' => 'sha512-11h/j/h3QEv2Qt2zJLbmbbThQDuBisAwY/3dygHKx3h/Or1UZFhw+Q7COpCC7erndNtevTvYRqEEIsKw3tOJLQ==', 'js/purify-3.2.6.js' => 'sha512-zqwL4OoBLFx89QPewkz4Lz5CSA2ktU+f31fuECkF0iK3Id5qd3Zpq5dMby8KwHjIEpsUgOqwF58cnmcaNem0EA==', 'js/showdown-2.1.0.js' => 'sha512-WYXZgkTR0u/Y9SVIA4nTTOih0kXMEd8RRV6MLFdL6YU8ymhR528NLlYQt1nlJQbYz4EW+ZsS0fx1awhiQJme1Q==', 'js/zlib-1.3.1-1.js' => 'sha512-5bU9IIP4PgBrOKLZvGWJD4kgfQrkTz8Z3Iqeu058mbQzW3mCumOU6M3UVbVZU9rrVoVwaW4cZK8U8h5xjF88eQ==',