From 43c669e6299222d5510961367c10a1f4ecc11c94 Mon Sep 17 00:00:00 2001 From: djmaze Date: Fri, 15 Jan 2021 00:14:45 +0100 Subject: [PATCH] Added draft code for handling "require []" --- dev/Sieve/Commands.js | 3 ++- dev/Sieve/Extensions/rfc5173.js | 3 ++- dev/Sieve/Extensions/rfc5230.js | 3 ++- dev/Sieve/Extensions/rfc5232.js | 6 ++++-- dev/Sieve/Extensions/rfc5235.js | 9 +++++++-- dev/Sieve/Extensions/rfc5429.js | 6 ++++-- dev/Sieve/Parser.js | 13 +++++++++++++ dev/Sieve/Tests.js | 2 ++ 8 files changed, 36 insertions(+), 9 deletions(-) diff --git a/dev/Sieve/Commands.js b/dev/Sieve/Commands.js index 29d030e97..b1a4d5300 100644 --- a/dev/Sieve/Commands.js +++ b/dev/Sieve/Commands.js @@ -115,9 +115,10 @@ class FileInto extends Command super('fileinto'); // QuotedString / MultiLine this._mailbox = new Grammar.QuotedString(); -// this.require = 'fileinto'; } + get require() { return 'fileinto'; } + toString() { return 'fileinto ' + this._mailbox + ';'; diff --git a/dev/Sieve/Extensions/rfc5173.js b/dev/Sieve/Extensions/rfc5173.js index 24a0c104a..5d5180daf 100644 --- a/dev/Sieve/Extensions/rfc5173.js +++ b/dev/Sieve/Extensions/rfc5173.js @@ -15,9 +15,10 @@ class Body extends Grammar.Test this.match_type = ':is', this.body_transform = ''; // :raw, :content , :text this.key_list = new Grammar.StringList; -// this.require = 'body'; } + get require() { return 'body'; } + toString() { return 'body' diff --git a/dev/Sieve/Extensions/rfc5230.js b/dev/Sieve/Extensions/rfc5230.js index 39a02a22b..a42e4e324 100644 --- a/dev/Sieve/Extensions/rfc5230.js +++ b/dev/Sieve/Extensions/rfc5230.js @@ -20,9 +20,10 @@ class Vacation extends Grammar.Command ':handle' : new Grammar.QuotedString }; this.reason = ''; // QuotedString / MultiLine -// this.require = 'vacation'; } + get require() { return 'vacation'; } + toString() { let result = 'vacation'; diff --git a/dev/Sieve/Extensions/rfc5232.js b/dev/Sieve/Extensions/rfc5232.js index 186d4ae30..de3c4ab00 100644 --- a/dev/Sieve/Extensions/rfc5232.js +++ b/dev/Sieve/Extensions/rfc5232.js @@ -13,9 +13,10 @@ class Flag extends Grammar.Command super(identifier); this._variablename = new Grammar.QuotedString; this.list_of_flags = new Grammar.StringList; -// this.require = 'imap4flags'; } + get require() { return 'imap4flags'; } + toString() { return this.identifier + ' ' + this._variablename + ' ' + this.list_of_flags + ';'; @@ -79,9 +80,10 @@ class HasFlag extends Grammar.Test this.match_type = ':is', this.variable_list = new Grammar.StringList; this.list_of_flags = new Grammar.StringList; -// this.require = 'imap4flags'; } + get require() { return 'imap4flags'; } + toString() { return 'hasflag' diff --git a/dev/Sieve/Extensions/rfc5235.js b/dev/Sieve/Extensions/rfc5235.js index 08a610efe..8a9ac146c 100644 --- a/dev/Sieve/Extensions/rfc5235.js +++ b/dev/Sieve/Extensions/rfc5235.js @@ -15,9 +15,12 @@ class SpamTest extends Grammar.Test this.comparator = 'i;ascii-casemap', this.match_type = ':is', this.value = new Grammar.QuotedString; -// this.require = this.percent ? 'spamtestplus' : 'spamtest'; } +// get require() { return this.percent ? 'spamtestplus' : 'spamtest'; } +// get require() { return /:value|:count/.test(this.match_type) ? 'relational' : ''; } + get require() { return 'spamtestplus'; } + toString() { return 'spamtest' @@ -56,9 +59,11 @@ class VirusTest extends Grammar.Test this.comparator = 'i;ascii-casemap', this.match_type = ':is', this.value = new Grammar.QuotedString; // 1 - 5 -// this.require = 'virustest'; } +// get require() { return /:value|:count/.test(this.match_type) ? ['virustest','relational'] : 'virustest'; } + get require() { return 'virustest'; } + toString() { return 'virustest' diff --git a/dev/Sieve/Extensions/rfc5429.js b/dev/Sieve/Extensions/rfc5429.js index f956a06dc..66eaf54ff 100644 --- a/dev/Sieve/Extensions/rfc5429.js +++ b/dev/Sieve/Extensions/rfc5429.js @@ -15,9 +15,10 @@ class Ereject extends Grammar.Command { super('ereject'); this._reason = new Grammar.QuotedString; -// this.require = 'ereject'; } + get require() { return 'ereject'; } + toString() { return 'ereject ' + this._reason + ';'; @@ -50,9 +51,10 @@ class Reject extends Grammar.Command { super('reject'); this._reason = new Grammar.QuotedString; -// this.require = 'reject'; } + get require() { return 'reject'; } + toString() { return 'reject ' + this._reason + ';'; diff --git a/dev/Sieve/Parser.js b/dev/Sieve/Parser.js index 15a4f3780..9ffa25aee 100644 --- a/dev/Sieve/Parser.js +++ b/dev/Sieve/Parser.js @@ -56,6 +56,7 @@ Sieve.parseScript = script => { levels = [], command = null, + requires = [], args = []; const @@ -128,10 +129,19 @@ Sieve.parseScript = script => { } levels.push(new_command); command = new_command; + if (command.require) { + (Array.isArray(command.require) ? command.require : [command.require]) + .forEach(string => requires.push(string)); + } break; } // Arguments case T_TAG: +/* + if (':value' === value || ':count' === value) { + requires.push('relational'); + } +*/ command ? args.push(value.toLowerCase()) : error('Tag must be command argument'); @@ -179,6 +189,9 @@ Sieve.parseScript = script => { case T_SEMICOLON: command || error('Semicolon not at end of command'); pushArgs(); + if (command instanceof Commands.require) { + command.capabilities.forEach(string => requires.push(string.value)); + } levels.pop(); command = levels.last(); break; diff --git a/dev/Sieve/Tests.js b/dev/Sieve/Tests.js index 028038784..81848aa22 100644 --- a/dev/Sieve/Tests.js +++ b/dev/Sieve/Tests.js @@ -88,6 +88,8 @@ class Envelope extends Test this.key_list = new StringList; } + get require() { return 'envelope'; } + toString() { return 'envelope'