Support Sieve RFC3894

This commit is contained in:
the-djmaze 2022-03-14 14:06:28 +01:00
parent 8761b860fd
commit 219589b8ea
4 changed files with 30 additions and 11 deletions

View file

@ -2,6 +2,8 @@
* https://tools.ietf.org/html/rfc5228#section-2.9
*/
import { capa } from 'Sieve/Utils';
import {
GrammarCommand,
GrammarString,
@ -102,11 +104,13 @@ export class FileIntoCommand extends GrammarCommand
toString()
{
// https://datatracker.ietf.org/doc/html/rfc3894
// :copy
// https://datatracker.ietf.org/doc/html/rfc5490#section-3.2
// :create
return 'fileinto ' + this._mailbox + ';';
return 'fileinto '
// https://datatracker.ietf.org/doc/html/rfc3894
+ ((this.copy && capa.includes('copy')) ? ':copy ' : '')
// https://datatracker.ietf.org/doc/html/rfc5490#section-3.2
+ ((this.create && capa.includes('mailbox')) ? ':create ' : '')
+ this._mailbox
+ ';';
}
get mailbox()
@ -141,9 +145,11 @@ export class RedirectCommand extends GrammarCommand
toString()
{
// https://datatracker.ietf.org/doc/html/rfc3894
// :copy
return 'redirect ' + this._address + ';';
return 'redirect '
// https://datatracker.ietf.org/doc/html/rfc3894
+ ((this.copy && capa.includes('copy')) ? ':copy ' : '')
+ this._address
+ ';';
}
get address()

View file

@ -2,6 +2,8 @@
* https://tools.ietf.org/html/rfc5228#section-8
*/
import { capa, forEachObjectEntry } from 'Sieve/Utils';
import {
BRACKET_COMMENT,
HASH_COMMENT,
@ -84,7 +86,7 @@ import {
} from 'Sieve/Extensions/rfc6609';
const
Commands = {
AllCommands = {
// Control commands
if: IfCommand,
elsif: ElsIfCommand,
@ -182,6 +184,17 @@ const
export const parseScript = (script, name = 'script.sieve') => {
script = script.replace(/\r?\n/g, '\r\n');
// Only activate available commands
const Commands = {};
forEachObjectEntry(AllCommands, (key, cmd) => {
const requires = (new cmd).require;
if (!requires
|| (Array.isArray(requires) ? requires : [requires]).every(string => capa.includes(string))
) {
Commands[key] = cmd;
}
});
let match,
line = 1,
tree = [],

View file

@ -2,7 +2,7 @@ https://www.iana.org/assignments/sieve-extensions/sieve-extensions.xhtml
- [ ] RFC2852 envelope-deliverby / redirect-deliverby
- [ ] RFC3461 envelope-dsn / redirect-dsn
- [ ] RFC3894 copy
- [x] RFC3894 copy
- [ ] RFC4790 comparator-*
- [x] RFC5173 body
- [x] RFC5183 environment

View file

@ -25,7 +25,7 @@
<b data-i18n="POPUPS_SIEVE_SCRIPT/CAPABILITY_LABEL"></b>:
<span data-bind="text: $root.sieveCapabilities"></span>
</pre>
<textarea style="width:100%" data-bind="value: body, valueUpdate: 'input'"></textarea>
<textarea style="width:100%;height:60vh" data-bind="value: body, valueUpdate: 'input'"></textarea>
</div>
</div>
<div data-bind="visible: !$root.rawActive()">