diff --git a/.editorconfig b/.editorconfig index 93b74687..0bd8e54b 100644 --- a/.editorconfig +++ b/.editorconfig @@ -5,7 +5,7 @@ indent_style = tab indent_size = 4 end_of_line = lf charset = utf-8 -trim_trailing_whitespace = unset +trim_trailing_whitespace = set insert_final_newline = true [*.d.ts] @@ -14,8 +14,21 @@ indent_style = space [*.md] indent_style = space +[*.yml] +indent_style = space +indent_size = 2 + [.vscode/cSpell.json] indent_style = space [.vscode/settings.json] indent_style = space + +[.vscode/tasks.json] +indent_style = space + +[.eslintrc.json] +indent_style = space + +[jsconfig.json] +indent_style = space diff --git a/.eslintrc-ci.json b/.eslintrc-ci.json new file mode 100644 index 00000000..75ad7213 --- /dev/null +++ b/.eslintrc-ci.json @@ -0,0 +1,5 @@ +{ + "rules": { + "no-warning-comments": "off" + } +} diff --git a/.eslintrc.json b/.eslintrc.json index c8c93f92..a6bb73b6 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,6 +1,5 @@ { "extends": [ - "eslint:all", "eslint:recommended" ], "env": { @@ -13,6 +12,9 @@ "ecmaFeatures": {}, "sourceType": "script" }, + "ignorePatterns": [ + "thirdparty/**" + ], "rules": { // Possible Errors "for-direction": "warn", @@ -49,7 +51,6 @@ "no-labels": "warn", "no-lone-blocks": "warn", "no-loop-func": "warn", - "no-magic-numbers": ["warn", { "ignoreArrayIndexes": true }], "no-multi-spaces": "warn", "no-multi-str": "warn", "no-new": "warn", @@ -81,7 +82,12 @@ "strict": ["warn", "global"], // Variables "no-undef": "error", - "no-unused-vars": "error", + "no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_" + } + ], // Stylistic Issues "no-mixed-spaces-and-tabs": ["warn", "smart-tabs"], "semi": "warn", @@ -90,4 +96,4 @@ "no-const-assign": "warn", "no-this-before-super": "warn" } -} \ No newline at end of file +} diff --git a/.github/problemMatchers/tsc-pretty.json b/.github/problemMatchers/tsc-pretty.json new file mode 100644 index 00000000..c015bfd6 --- /dev/null +++ b/.github/problemMatchers/tsc-pretty.json @@ -0,0 +1,18 @@ +{ + "problemMatcher": [ + { + "owner": "tsc", + "pattern": [ + { + "regexp": "^(?:\\x1b\\[[\\d;]+m)([^\\s].*)(?:\\x1b\\[[\\d;]+m)[\\(:](?:\\x1b\\[[\\d;]+m)(\\d+)(?:\\x1b\\[[\\d;]+m)[,:](?:\\x1b\\[[\\d;]+m)(\\d+)(?:\\x1b\\[[\\d;]+m)(?:\\):\\s+|\\s+-\\s+)(?:\\x1b\\[[\\d;]+m)(error|warning|info)(?:\\x1b\\[[\\d;]+m)(?:\\x1b\\[[\\d;]+m)\\s+TS(\\d+)\\s*:\\s*(?:\\x1b\\[[\\d;]+m)(.*)$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "code": 5, + "message": 6 + } + ] + } + ] +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..f9d50229 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,42 @@ +name: CI 2.x + +on: + - push + - pull_request + +permissions: + contents: read + # implicitly all other scopes not listed become none + +jobs: + ESLint: + name: ESLint + runs-on: ubuntu-22.04 + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 16 + - name: Install Node.js dependencies + run: npm ci + - name: Run ESLint + run: npm run lint:ci + + checkJs: + name: Type Check + runs-on: ubuntu-22.04 + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 16 + - name: Install Node.js dependencies + run: npm ci + - name: Register Problem Matcher for colored tsc output + run: echo "##[add-matcher].github/problemMatchers/tsc-pretty.json" + - name: Run type checking + run: npm run checkJs diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c2658d7d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 6e1ce42a..67bab21c 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -11,6 +11,33 @@ "kind": "build", "isDefault": true } - } + }, + { + "label": "lint", + "detail": "Run ESLint", + "type": "npm", + "script": "lint", + "problemMatcher": [ + "$eslint-stylish" + ], + }, + { + "label": "lint:ci", + "detail": "Run ESLint with config for CI", + "type": "npm", + "script": "lint:ci", + "problemMatcher": [ + "$eslint-stylish" + ], + }, + { + "label": "checkJs", + "detail": "Run type checking with TS", + "type": "npm", + "script": "checkJs", + "problemMatcher": [ + "$tsc" + ], + }, ] -} \ No newline at end of file +} diff --git a/_reference.js b/_reference.js deleted file mode 100644 index a9d5ed98..00000000 --- a/_reference.js +++ /dev/null @@ -1,27 +0,0 @@ -// The .jsm extension does not work well together with IntelliSense. -// Even with reference and explicit @ts-check, the types of arguments are not detected. -// -// Workaround: -// Creating symbolic links with .js extension for each .jsm file, and edit the js files. -// -// Powershell command for creating the links: -// DIR *.jsm | % { cmd /c "mklink modlinks\$($_.BaseName).js ..\$($_.BaseName).jsm" } - -// /// -// /// -// /// - -// /// -// /// -// /// -// /// -// /// -// /// -// /// -// /// -// /// -// /// -// /// -// /// -// /// -// /// diff --git a/chrome/content/addSignersRule.js b/chrome/content/addSignersRule.js index 80e334cd..2b652185 100644 --- a/chrome/content/addSignersRule.js +++ b/chrome/content/addSignersRule.js @@ -1,9 +1,18 @@ -Components.utils.import("resource://dkim_verifier/logging.jsm"); -Components.utils.import("resource://dkim_verifier/dkimPolicy.jsm"); +// @ts-nocheck +/* eslint-env browser */ +/* eslint strict: ["warn", "function"] */ +/* global Components */ +/* global Logging, Policy */ +/* exported onAccept, onCancel, init */ + +Components.utils.import("resource://dkim_verifier/logging.jsm.js"); +Components.utils.import("resource://dkim_verifier/dkimPolicy.jsm.js"); var log = Logging.getLogger("addSignersRule"); function onAccept(){ + "use strict"; + try { var input = {}; input.domain = document.getElementById("domain").value; @@ -30,7 +39,7 @@ function onAccept(){ input.priority = document.getElementById("priority").value; } input.enabled = document.getElementById("enabled").checked; - + window.arguments[0].addRow(input); } catch (exception) { log.fatal(exception); @@ -40,14 +49,20 @@ function onAccept(){ } function onCancel(){ + "use strict"; + return true; } function updatePriorityMode() { + "use strict"; + document.getElementById("priority").disabled = - (document.getElementById("priorityMode").value === "1"); + document.getElementById("priorityMode").value === "1"; } function init() { + "use strict"; + updatePriorityMode(); } diff --git a/chrome/content/am-dkim_verifier-prefs.js b/chrome/content/am-dkim_verifier-prefs.js index 13400053..908b8d27 100644 --- a/chrome/content/am-dkim_verifier-prefs.js +++ b/chrome/content/am-dkim_verifier-prefs.js @@ -1,12 +1,23 @@ +// @ts-check +/* eslint-env browser */ +/* eslint strict: ["warn", "function"] */ +/* exported onPreInit, onInit, onSave */ + +// @ts-expect-error +// eslint-disable-next-line curly if (!DKIMVerifier) var DKIMVerifier = {}; // var gPref = null; -function onPreInit(account, accountValues) { +function onPreInit(account, _accountValues) { + "use strict"; + DKIMVerifier.server = account.incomingServer; } -function onInit(aPageId, aServerId) { +function onInit(_aPageId, _aServerId) { + "use strict"; + DKIMVerifier.dkimEnable = document. getElementById("dkimVerifier_dkim.enable"); DKIMVerifier.arhRead = document.getElementById("dkimVerifier_arh.read"); @@ -22,6 +33,8 @@ function onInit(aPageId, aServerId) { } function onSave() { + "use strict"; + DKIMVerifier.server.setIntValue("dkim_verifier.dkim.enable", DKIMVerifier.dkimEnable.value); DKIMVerifier.server.setIntValue("dkim_verifier.arh.read", diff --git a/chrome/content/dkim.js b/chrome/content/dkim.js index c4888295..9768bb25 100644 --- a/chrome/content/dkim.js +++ b/chrome/content/dkim.js @@ -20,11 +20,11 @@ // namespace // @ts-ignore var DKIM_Verifier = {}; -Cu.import("resource://dkim_verifier/logging.jsm", DKIM_Verifier); -Cu.import("resource://dkim_verifier/helper.jsm", DKIM_Verifier); -Cu.import("resource://dkim_verifier/AuthVerifier.jsm", DKIM_Verifier); -Cu.import("resource://dkim_verifier/dkimPolicy.jsm", DKIM_Verifier); -Cu.import("resource://dkim_verifier/dkimKey.jsm", DKIM_Verifier); +Cu.import("resource://dkim_verifier/logging.jsm.js", DKIM_Verifier); +Cu.import("resource://dkim_verifier/helper.jsm.js", DKIM_Verifier); +Cu.import("resource://dkim_verifier/AuthVerifier.jsm.js", DKIM_Verifier); +Cu.import("resource://dkim_verifier/dkimPolicy.jsm.js", DKIM_Verifier); +Cu.import("resource://dkim_verifier/dkimKey.jsm.js", DKIM_Verifier); // @ts-ignore @@ -208,6 +208,7 @@ DKIM_Verifier.Display = (function() { * @param {IAuthVerifier.IAuthResult} result * @return {void} */ + // eslint-disable-next-line complexity function displayResult(result) { log.trace("displayResult begin"); header.dkimResults = result.dkim; @@ -673,8 +674,14 @@ var that = { markKeyAsSecure : function Display_markKeyAsSecure() { let promise = (async () => { log.trace("markKeyAsSecure Task"); + const sdid = header.dkimResults[0].sdid; + const selector = header.dkimResults[0].selector; + if (sdid === undefined || selector === undefined) { + log.error("Can not mark key as secure, result does not contain an sdid or selector"); + return; + } await DKIM_Verifier.Key.markKeyAsSecure( - header.dkimResults[0].sdid, header.dkimResults[0].selector); + sdid, selector); that.reverify(); })(); @@ -690,8 +697,13 @@ var that = { let promise = (async () => { log.trace("updateKey Task"); for (let dkimResult of header.dkimResults) { - await DKIM_Verifier.Key.deleteKey( - dkimResult.sdid, dkimResult.selector); + const sdid = dkimResult.sdid; + const selector = dkimResult.selector; + if (sdid === undefined || selector === undefined) { + log.error("Can not delete key, result does not contain an sdid or selector"); + return; + } + await DKIM_Verifier.Key.deleteKey(sdid, selector); } that.reverify(); diff --git a/chrome/content/options.js b/chrome/content/options.js index 6c25271e..fbc4594d 100644 --- a/chrome/content/options.js +++ b/chrome/content/options.js @@ -1,12 +1,22 @@ +// @ts-nocheck +/* eslint-env browser */ +/* eslint strict: ["warn", "function"] */ +/* global Components, Services */ +/* exported onLoad, gDKIMonpaneload */ + Components.utils.import("resource://gre/modules/Services.jsm"); function onLoad(paneID) { + "use strict"; + var fadeInEffect = Services.prefs. getBoolPref("browser.preferences.animateFadeIn"); if (!fadeInEffect) { + // @ts-expect-error window.sizeToContent(); } else { var currentPane = document.getElementById(paneID); + // @ts-expect-error var changeWidthBy = currentPane._content.scrollWidth - currentPane._content.clientWidth; window.resizeBy(changeWidthBy, 0); } diff --git a/chrome/content/options_general.js b/chrome/content/options_general.js index 21810b03..89de2452 100644 --- a/chrome/content/options_general.js +++ b/chrome/content/options_general.js @@ -1,5 +1,13 @@ +// @ts-nocheck +/* eslint-env browser */ +/* eslint strict: ["warn", "function"] */ +/* global gDKIMonpaneload */ +/* exported gDKIMOptionsGeneralPane */ + var gDKIMOptionsGeneralPane = { init: function () { + "use strict"; + gDKIMonpaneload("paneGeneral"); this.update_key_storing(); this.update_dns_resolver(); @@ -8,24 +16,33 @@ var gDKIMOptionsGeneralPane = { }, update_key_storing: function () { + "use strict"; + + // eslint-disable-next-line eqeqeq var disabled = document.getElementById("key.storing").value == 0; document.getElementById("key.viewKeys").disabled = disabled; }, update_dns_resolver: function () { + "use strict"; + var deckIndex = document.getElementById("dns.resolver.label").value - 1; document.getElementById("resolverDeck").selectedIndex = deckIndex; }, update_dns_proxy: function () { + "use strict"; + var disabled = !document.getElementById("dns.proxy.enable").checked; - var proxyConfigs = document.querySelectorAll(".proxyConfig") + var proxyConfigs = document.querySelectorAll(".proxyConfig"); for (var e of proxyConfigs) { e.disabled = disabled; } }, update_Policy_signRules_enable: function () { + "use strict"; + var disabled = !document.getElementById("policy.signRules.enable").checked; document.getElementById("policy.signRules.checkDefaultRules").disabled = disabled; document.getElementById("policy.signRules.autoAddRule").disabled = disabled; @@ -39,10 +56,12 @@ var gDKIMOptionsGeneralPane = { }, update_Policy_autoAddRule_enable: function () { + "use strict"; + var disabled = !document.getElementById("policy.signRules.enable").checked || !document.getElementById("policy.signRules.autoAddRule").checked; document.getElementById("policy.signRules.autoAddRule.onlyIfFromAddressInSDID"). disabled = disabled; document.getElementById("policy.signRules.autoAddRule.for").disabled = disabled; }, -} +}; diff --git a/chrome/content/treeviewKeys.xul b/chrome/content/treeviewKeys.xul index 116c42af..fbf6031d 100644 --- a/chrome/content/treeviewKeys.xul +++ b/chrome/content/treeviewKeys.xul @@ -8,8 +8,8 @@ onload="setView();">