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();">