From ced4a3a67cceb19905586259ec64a03ec5b22dd6 Mon Sep 17 00:00:00 2001 From: Kai <7957852+kaivol@users.noreply.github.com> Date: Wed, 10 Nov 2021 21:22:25 +0100 Subject: [PATCH] Added (rudimentary) support for the vnd.dovecot.pgp-encrypt sieve filter. --- src/common/libSieve/extensions/extensions.mjs | 3 + .../pgpencrypt/logic/SievePgpEncrypt.mjs | 52 ++++++++++++ .../templates/SievePgpEncryptActionUI.html | 26 ++++++ .../pgpencrypt/tests/SievePgpEncryptTest.mjs | 34 ++++++++ .../pgpencrypt/widgets/SievePgpEncryptUI.mjs | 84 +++++++++++++++++++ src/common/libSieve/i18n/en-US.json | 12 ++- tests/tests/tests.js | 8 ++ 7 files changed, 216 insertions(+), 3 deletions(-) create mode 100644 src/common/libSieve/extensions/pgpencrypt/logic/SievePgpEncrypt.mjs create mode 100644 src/common/libSieve/extensions/pgpencrypt/templates/SievePgpEncryptActionUI.html create mode 100644 src/common/libSieve/extensions/pgpencrypt/tests/SievePgpEncryptTest.mjs create mode 100644 src/common/libSieve/extensions/pgpencrypt/widgets/SievePgpEncryptUI.mjs diff --git a/src/common/libSieve/extensions/extensions.mjs b/src/common/libSieve/extensions/extensions.mjs index cff4d999d8..25f2aa186c 100644 --- a/src/common/libSieve/extensions/extensions.mjs +++ b/src/common/libSieve/extensions/extensions.mjs @@ -56,3 +56,6 @@ import "./notify/widgets/SieveNotifyUI.mjs"; // vnd.dovecot.pipe - pipe import "./pipe/widgets/SievePipeUI.mjs"; + +// vnd.dovecot.pgp-encrypt - pgp_encrypt +import "./pgpencrypt/widgets/SievePgpEncryptUI.mjs"; diff --git a/src/common/libSieve/extensions/pgpencrypt/logic/SievePgpEncrypt.mjs b/src/common/libSieve/extensions/pgpencrypt/logic/SievePgpEncrypt.mjs new file mode 100644 index 0000000000..a8844a0eda --- /dev/null +++ b/src/common/libSieve/extensions/pgpencrypt/logic/SievePgpEncrypt.mjs @@ -0,0 +1,52 @@ +/* + * The contents of this file are licensed. You may obtain a copy of + * the license at https://github.com/thsmi/sieve/ or request it via + * email from the author. + * + * Do not remove or change this comment. + * + * The initial author of the code is: + * kaivol + * + */ + +import { SieveGrammar } from "./../../../toolkit/logic/GenericElements.mjs"; + +// :keys +SieveGrammar.addTag({ + node: "action/pgpencrypt/keys", + type: "action/pgpencrypt/", + + token: ":keys", + + properties: [{ + id: "parameters", + + elements: [{ + id: "keys", + type: "string", + + value: '""' + }] + }] +}); + +// Usage: pgp_encrypt :keys +SieveGrammar.addAction({ + node: "action/pgpencrypt", + type: "action", + + token: "pgp_encrypt", + + requires: "vnd.dovecot.pgp-encrypt", + + properties: [{ + id: "tags", + optional: true, + + elements: [{ + id: "keys", + type: "action/pgpencrypt/keys" + }] + }] +}); diff --git a/src/common/libSieve/extensions/pgpencrypt/templates/SievePgpEncryptActionUI.html b/src/common/libSieve/extensions/pgpencrypt/templates/SievePgpEncryptActionUI.html new file mode 100644 index 0000000000..88bdcfd9d4 --- /dev/null +++ b/src/common/libSieve/extensions/pgpencrypt/templates/SievePgpEncryptActionUI.html @@ -0,0 +1,26 @@ +
+
    + + +
+ +
+
+
+ +
+ + +
+
+
+
+
+
diff --git a/src/common/libSieve/extensions/pgpencrypt/tests/SievePgpEncryptTest.mjs b/src/common/libSieve/extensions/pgpencrypt/tests/SievePgpEncryptTest.mjs new file mode 100644 index 0000000000..8d815198a1 --- /dev/null +++ b/src/common/libSieve/extensions/pgpencrypt/tests/SievePgpEncryptTest.mjs @@ -0,0 +1,34 @@ +/* +* The contents of this file are licensed. You may obtain a copy of +* the license at https://github.com/thsmi/sieve/ or request it via +* email from the author. +* +* Do not remove or change this comment. +* +* The initial author of the code is: + * kaivol +* +*/ + +/* global net */ + +const suite = net.tschmid.yautt.test; + +if (!suite) + throw new Error("Could not initialize test suite"); + +suite.description("pgpencrypt Unit Tests..."); + +suite.add("pgpencrypt Snippet I", () => { + + const script = '' + + 'require "vnd.dovecot.pgp-encrypt";\r\n' + + 'if true {\r\n' + + ' pgp_encrypt :keys text:\r\n' + + 'ABCDEF\r\n' + + '.\r\n' + + ';\r\n' + + '}\r\n'; + + suite.expectValidScript(script, ["vnd.dovecot.pgp-encrypt"]); +}); diff --git a/src/common/libSieve/extensions/pgpencrypt/widgets/SievePgpEncryptUI.mjs b/src/common/libSieve/extensions/pgpencrypt/widgets/SievePgpEncryptUI.mjs new file mode 100644 index 0000000000..f72a200de9 --- /dev/null +++ b/src/common/libSieve/extensions/pgpencrypt/widgets/SievePgpEncryptUI.mjs @@ -0,0 +1,84 @@ +/* + * The contents of this file are licensed. You may obtain a copy of + * the license at https://github.com/thsmi/sieve/ or request it via + * email from the author. + * + * Do not remove or change this comment. + * + * The initial author of the code is: + * kaivol + * + */ + +import "./../logic/SievePgpEncrypt.mjs"; + +import { SieveDesigner } from "./../../../toolkit/SieveDesigner.mjs"; + +import { + SieveActionDialogBoxUI +} from "./../../../toolkit/widgets/Boxes.mjs"; + +import { SieveTemplate } from "./../../../toolkit/utils/SieveTemplate.mjs"; +import { SieveI18n } from "../../../toolkit/utils/SieveI18n.mjs"; + +/** + * Provides an abstract UI for the pgpencrypt action. + */ +class SievePgpEncryptUI extends SieveActionDialogBoxUI { + + /** + * @inheritdoc + */ + getTemplate() { + return "./extensions/pgpencrypt/templates/SievePgpEncryptActionUI.html"; + } + + /** + * Gets the currently set key. + * + * @returns {string} + * the element's key + */ + keys(key) { + return this.getSieve().getElement("keys").getElement("keys").value(key); + } + + /** + * @inheritdoc + */ + onSave() { + const key = document.querySelector("#sivPgpKey").value; + this.keys(key); + this.getSieve().enable("keys", key.length > 0); + // should check if the given key is a valid PGP key + return true; + } + + /** + * @inheritdoc + */ + onLoad() { + document.querySelector("#sivPgpKey").value = this.keys(); + } + + /** + * @inheritdoc + */ + getSummary() { + const msg = SieveI18n.getInstance().getString("pgpencrypt.summary").replace("${address}", ` +

+`);
+
+    const elm = (new SieveTemplate()).convert(`
${msg}
`); + elm.querySelector(".sivPgpKey").textContent = this.keys(); + return elm; + } +} + +SieveDesigner.register("action/pgpencrypt", SievePgpEncryptUI); diff --git a/src/common/libSieve/i18n/en-US.json b/src/common/libSieve/i18n/en-US.json index 6bbe296d46..e54bb06fc8 100644 --- a/src/common/libSieve/i18n/en-US.json +++ b/src/common/libSieve/i18n/en-US.json @@ -675,6 +675,12 @@ "notifymethodcapability.maybe" : "maybe", "notifymethodcapability.maybe.text" : "The Sieve interpreter can't determine if the entity identified by the notification-uri is online or not", "notifymethodcapability.help" :"The notify_method_capability test retrieves the notification capability for given method and matches it to the given values.\n\nThe capability parameter is case insensitive. Currently only a single capability \"online\" is defined. But Sieve Notifications extensions may add aditional capabilities.\n\nThe \"online\" capabilities result is either \"yes\", \"no\" or \"maybe\". And describes the likelyness for a successfull delivery.\n\nNote that even after a \"yes\", there is no guarantee when and if the notification is received. Transport errors, recipient policy, etc. can prevent that.", - "notifymethodcapability.summary" :"Check the notification capabilities." - -} \ No newline at end of file + "notifymethodcapability.summary" :"Check the notification capabilities.", + + "pgpencrypt.tab.home": "PGP encryption", + "pgpencrypt.tab.help": "Help", + "pgpencrypt.key.label": "Encryption key: ", + "pgpencrypt.key.placeholder": "Enter key", + "pgpencrypt.help": "Encrypts incoming mails with the given PGP key.", + "pgpencrypt.summary" : "Encrypt mails with the following key:${address}" +} diff --git a/tests/tests/tests.js b/tests/tests/tests.js index 87f3e2cab0..3679083729 100755 --- a/tests/tests/tests.js +++ b/tests/tests/tests.js @@ -236,6 +236,14 @@ ] }); + tests.set("pgpencrypt", { + script: "${workspace}/libSieve/extensions/pgpencrypt/tests/SievePgpEncryptTest.mjs", + extend: "rfc5228", + require: [ + "${workspace}/libSieve/extensions/pgpencrypt/logic/SievePgpEncrypt.mjs" + ] + }); + tests.set("examples-fastmail", { script: "${workspace}/libSieve/tests/SieveFastMailTest.mjs", extend: "rfc5228",