mirror of
https://github.com/the-djmaze/snappymail.git
synced 2025-09-13 16:44:37 +08:00
Centralize some argument parsing
Improved parser error handling Fix Sieve Vacation extension
This commit is contained in:
parent
55178016a0
commit
68fc9f21bd
7 changed files with 131 additions and 168 deletions
|
@ -11,7 +11,7 @@ class Body extends Grammar.Test
|
||||||
constructor()
|
constructor()
|
||||||
{
|
{
|
||||||
super('body');
|
super('body');
|
||||||
this.comparator = 'i;ascii-casemap',
|
this.comparator = '',
|
||||||
this.match_type = ':is',
|
this.match_type = ':is',
|
||||||
this.body_transform = ''; // :raw, :content <string-list>, :text
|
this.body_transform = ''; // :raw, :content <string-list>, :text
|
||||||
this.key_list = new Grammar.StringList;
|
this.key_list = new Grammar.StringList;
|
||||||
|
@ -31,14 +31,10 @@ class Body extends Grammar.Test
|
||||||
pushArguments(args)
|
pushArguments(args)
|
||||||
{
|
{
|
||||||
args.forEach((arg, i) => {
|
args.forEach((arg, i) => {
|
||||||
if (':is' === arg || ':contains' === arg || ':matches' === arg) {
|
if (':raw' === arg || ':text' === arg) {
|
||||||
this.match_type = arg;
|
|
||||||
} else if (':raw' === arg || ':text' === arg) {
|
|
||||||
this.body_transform = arg;
|
this.body_transform = arg;
|
||||||
} else if (arg instanceof Grammar.StringList || arg instanceof Grammar.StringType) {
|
} else if (arg instanceof Grammar.StringList || arg instanceof Grammar.StringType) {
|
||||||
if (':comparator' === args[i-1]) {
|
if (':content' === args[i-1]) {
|
||||||
this.comparator = arg;
|
|
||||||
} else if (':content' === args[i-1]) {
|
|
||||||
this.body_transform = ':content ' + arg;
|
this.body_transform = ':content ' + arg;
|
||||||
} else {
|
} else {
|
||||||
this[args[i+1] ? 'content_list' : 'key_list'] = arg;
|
this[args[i+1] ? 'content_list' : 'key_list'] = arg;
|
||||||
|
|
|
@ -11,15 +11,13 @@ class Vacation extends Grammar.Command
|
||||||
constructor()
|
constructor()
|
||||||
{
|
{
|
||||||
super('vacation');
|
super('vacation');
|
||||||
this.arguments = {
|
this._days = new Grammar.Number;
|
||||||
':days' : new Grammar.Number,
|
this._subject = new Grammar.QuotedString;
|
||||||
':subject' : new Grammar.QuotedString,
|
this._from = new Grammar.QuotedString;
|
||||||
':from' : new Grammar.QuotedString,
|
this.addresses = new Grammar.StringList;
|
||||||
':addresses': new Grammar.StringList,
|
this.mime = false;
|
||||||
':mime' : false,
|
this._handle = new Grammar.QuotedString;
|
||||||
':handle' : new Grammar.QuotedString
|
this._reason = new Grammar.QuotedString; // QuotedString / MultiLine
|
||||||
};
|
|
||||||
this.reason = ''; // QuotedString / MultiLine
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get require() { return 'vacation'; }
|
get require() { return 'vacation'; }
|
||||||
|
@ -27,63 +25,66 @@ class Vacation extends Grammar.Command
|
||||||
toString()
|
toString()
|
||||||
{
|
{
|
||||||
let result = 'vacation';
|
let result = 'vacation';
|
||||||
if (0 < this.arguments[':days'].value) {
|
if (0 < this._days.value) {
|
||||||
result += ' :days ' + this.arguments[':days'];
|
result += ' :days ' + this._days;
|
||||||
}
|
}
|
||||||
if (this.arguments[':subject'].length()) {
|
if (this._subject.length) {
|
||||||
result += ' :subject ' + this.arguments[':subject'];
|
result += ' :subject ' + this._subject;
|
||||||
}
|
}
|
||||||
if (this.arguments[':from'].length()) {
|
if (this._from.length) {
|
||||||
result += ' :from ' + this.arguments[':from'];
|
result += ' :from ' + this.arguments[':from'];
|
||||||
}
|
}
|
||||||
if (this.arguments[':addresses'].length) {
|
if (this.addresses.length) {
|
||||||
result += ' :addresses ' + this.arguments[':addresses'];
|
result += ' :addresses ' + this.addresses;
|
||||||
}
|
}
|
||||||
if (this.arguments[':mime']) {
|
if (this.mime) {
|
||||||
result += ' :mime';
|
result += ' :mime';
|
||||||
}
|
}
|
||||||
if (this.arguments[':handle'].length()) {
|
if (this._handle.length) {
|
||||||
result += ' :handle ' + this.arguments[':handle'];
|
result += ' :handle ' + this._handle;
|
||||||
}
|
|
||||||
return result + ' ' + this.reason;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
function __get($key)
|
|
||||||
{
|
|
||||||
if ('reason' === $key) {
|
|
||||||
return this.reason;
|
|
||||||
}
|
|
||||||
if (isset(this.arguments[":{$key}"])) {
|
|
||||||
return this.arguments[":{$key}"];
|
|
||||||
}
|
}
|
||||||
|
return result + ' ' + this._reason;
|
||||||
}
|
}
|
||||||
|
|
||||||
function __set($key, $value)
|
|
||||||
{
|
|
||||||
if ('days' === $key) {
|
|
||||||
this.arguments[":{$key}"] = (int) $value;
|
|
||||||
} else if ('mime' === $key) {
|
|
||||||
this.arguments[":{$key}"] = (bool) $value;
|
|
||||||
} else if ('reason' === $key) {
|
|
||||||
this.reason = (string) $value;
|
|
||||||
} else if ('addresses' !== $key && isset(this.arguments[":{$key}"])) {
|
|
||||||
this.arguments[":{$key}"] = (string) $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function pushArguments(array $args): void
|
get days() { return this._days.value; }
|
||||||
|
get subject() { return this._subject.value; }
|
||||||
|
get from() { return this._from.value; }
|
||||||
|
get handle() { return this._handle.value; }
|
||||||
|
get reason() { return this._reason.value; }
|
||||||
|
|
||||||
|
set days(int) { this._days.value = int; }
|
||||||
|
set subject(str) { this._subject.value = str; }
|
||||||
|
set from(str) { this._from.value = str; }
|
||||||
|
set handle(str) { this._handle.value = str; }
|
||||||
|
set reason(str) { this._reason.value = str; }
|
||||||
|
|
||||||
|
pushArguments(args)
|
||||||
{
|
{
|
||||||
foreach ($args as $i => $arg) {
|
args.forEach((arg, i) => {
|
||||||
if (\in_array($arg, [':days',':subject',':from',':addresses', ':handle'])) {
|
if (':mime' === arg) {
|
||||||
this.arguments[$arg] = $args[$i+1];
|
this.mime = true;
|
||||||
} else if (':mime' === $arg) {
|
} else if (i === args.length-1) {
|
||||||
this.arguments[':mime'] = true;
|
this._reason.value = arg.value; // Grammar.QuotedString
|
||||||
} else if (!isset($args[$i+1])) {
|
} else switch (args[i-1]) {
|
||||||
this.reason = $arg;
|
case ':days':
|
||||||
|
this._days.value = arg.value; // Grammar.Number
|
||||||
|
break;
|
||||||
|
case ':subject':
|
||||||
|
this._subject.value = arg.value; // Grammar.QuotedString
|
||||||
|
break;
|
||||||
|
case ':from':
|
||||||
|
this._from.value = arg.value; // Grammar.QuotedString
|
||||||
|
break;
|
||||||
|
case ':addresses':
|
||||||
|
this.addresses = arg; // Grammar.StringList
|
||||||
|
break;
|
||||||
|
case ':handle':
|
||||||
|
this._from.value = arg.value; // Grammar.QuotedString
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Sieve.Commands.vacation = Vacation;
|
Sieve.Commands.vacation = Vacation;
|
||||||
|
|
|
@ -76,7 +76,7 @@ class HasFlag extends Grammar.Test
|
||||||
constructor()
|
constructor()
|
||||||
{
|
{
|
||||||
super('hasflag');
|
super('hasflag');
|
||||||
this.comparator = 'i;ascii-casemap',
|
this.comparator = '',
|
||||||
this.match_type = ':is',
|
this.match_type = ':is',
|
||||||
this.variable_list = new Grammar.StringList;
|
this.variable_list = new Grammar.StringList;
|
||||||
this.list_of_flags = new Grammar.StringList;
|
this.list_of_flags = new Grammar.StringList;
|
||||||
|
@ -96,14 +96,8 @@ class HasFlag extends Grammar.Test
|
||||||
pushArguments(args)
|
pushArguments(args)
|
||||||
{
|
{
|
||||||
args.forEach((arg, i) => {
|
args.forEach((arg, i) => {
|
||||||
if (':is' === arg || ':contains' === arg || ':matches' === arg) {
|
if (arg instanceof Grammar.StringList || arg instanceof Grammar.StringType) {
|
||||||
this.match_type = arg;
|
this[args[i+1] ? 'variable_list' : 'list_of_flags'] = arg;
|
||||||
} else if (arg instanceof Grammar.StringList || arg instanceof Grammar.StringType) {
|
|
||||||
if (':comparator' === args[i-1]) {
|
|
||||||
this.comparator = arg;
|
|
||||||
} else {
|
|
||||||
this[args[i+1] ? 'variable_list' : 'list_of_flags'] = arg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ class SpamTest extends Grammar.Test
|
||||||
{
|
{
|
||||||
super('spamtest');
|
super('spamtest');
|
||||||
this.percent = false, // 0 - 100 else 0 - 10
|
this.percent = false, // 0 - 100 else 0 - 10
|
||||||
this.comparator = 'i;ascii-casemap',
|
this.comparator = '',
|
||||||
this.match_type = ':is',
|
this.match_type = ':is',
|
||||||
this.value = new Grammar.QuotedString;
|
this.value = new Grammar.QuotedString;
|
||||||
}
|
}
|
||||||
|
@ -32,20 +32,11 @@ class SpamTest extends Grammar.Test
|
||||||
|
|
||||||
pushArguments(args)
|
pushArguments(args)
|
||||||
{
|
{
|
||||||
args.forEach((arg, i) => {
|
args.forEach(arg => {
|
||||||
if (':is' === arg || ':contains' === arg || ':matches' === arg) {
|
if (':percent' === arg) {
|
||||||
this.match_type = arg;
|
|
||||||
} else if (':percent' === arg) {
|
|
||||||
this.percent = true;
|
this.percent = true;
|
||||||
} else if (arg instanceof Grammar.StringType) {
|
} else if (arg instanceof Grammar.StringType) {
|
||||||
if (':comparator' === args[i-1]) {
|
this.value = arg;
|
||||||
this.comparator = arg;
|
|
||||||
} else if (':value' === args[i-1] || ':count' === args[i-1]) {
|
|
||||||
// Sieve relational [RFC5231] match types
|
|
||||||
this.match_type = args[i-1] + ' ' + arg;
|
|
||||||
} else {
|
|
||||||
this.value = arg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -56,7 +47,7 @@ class VirusTest extends Grammar.Test
|
||||||
constructor()
|
constructor()
|
||||||
{
|
{
|
||||||
super('virustest');
|
super('virustest');
|
||||||
this.comparator = 'i;ascii-casemap',
|
this.comparator = '',
|
||||||
this.match_type = ':is',
|
this.match_type = ':is',
|
||||||
this.value = new Grammar.QuotedString; // 1 - 5
|
this.value = new Grammar.QuotedString; // 1 - 5
|
||||||
}
|
}
|
||||||
|
@ -74,18 +65,9 @@ class VirusTest extends Grammar.Test
|
||||||
|
|
||||||
pushArguments(args)
|
pushArguments(args)
|
||||||
{
|
{
|
||||||
args.forEach((arg, i) => {
|
args.forEach(arg => {
|
||||||
if (':is' === arg || ':contains' === arg || ':matches' === arg) {
|
if (arg instanceof Grammar.StringType) {
|
||||||
this.match_type = arg;
|
this.value = arg;
|
||||||
} else if (arg instanceof Grammar.StringType) {
|
|
||||||
if (':comparator' === args[i-1]) {
|
|
||||||
this.comparator = arg;
|
|
||||||
} else if (':value' === args[i-1] || ':count' === args[i-1]) {
|
|
||||||
// Sieve relational [RFC5231] match types
|
|
||||||
this.match_type = args[i-1] + ' ' + arg;
|
|
||||||
} else {
|
|
||||||
this.value = arg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ class StringType /*extends String*/
|
||||||
this._value = value;
|
this._value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
length()
|
get length()
|
||||||
{
|
{
|
||||||
return this._value.length;
|
return this._value.length;
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ const
|
||||||
/* T_UNKNOWN */ '[^ \\r\\n\\t]+'
|
/* T_UNKNOWN */ '[^ \\r\\n\\t]+'
|
||||||
].join(')|(') + ')';
|
].join(')|(') + ')';
|
||||||
|
|
||||||
Sieve.parseScript = script => {
|
Sieve.parseScript = (script, name = 'script.sieve') => {
|
||||||
let match,
|
let match,
|
||||||
line = 1,
|
line = 1,
|
||||||
tree = [],
|
tree = [],
|
||||||
|
@ -61,11 +61,30 @@ Sieve.parseScript = script => {
|
||||||
|
|
||||||
const
|
const
|
||||||
error = message => {
|
error = message => {
|
||||||
throw new SyntaxError(message + ' at ' + regex.lastIndex + ' line ' + line, 'script.sieve', line)
|
// throw new SyntaxError(message + ' at ' + regex.lastIndex + ' line ' + line, name, line)
|
||||||
|
throw new SyntaxError(message + ' on line ' + line
|
||||||
|
+ ' around: ' + script.substr(regex.lastIndex - 10, 20).replace(/\r\n/gm, '\\r\\n'), name, line)
|
||||||
|
},
|
||||||
|
pushArg = arg => {
|
||||||
|
command || error('Argument not part of command');
|
||||||
|
let prev_arg = args[args.length-1];
|
||||||
|
if (':is' === arg || ':contains' === arg || ':matches' === arg) {
|
||||||
|
command.match_type = arg;
|
||||||
|
} else if (':value' === prev_arg || ':count' === prev_arg) {
|
||||||
|
// Sieve relational [RFC5231] match types
|
||||||
|
command.match_type = prev_arg + ' ' + arg;
|
||||||
|
--args.length;
|
||||||
|
// requires.push('relational');
|
||||||
|
} else if (':comparator' === prev_arg) {
|
||||||
|
command.comparator = arg;
|
||||||
|
--args.length;
|
||||||
|
} else {
|
||||||
|
args.push(arg);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
pushArgs = () => {
|
pushArgs = () => {
|
||||||
if (command && args.length) {
|
if (args.length) {
|
||||||
command.pushArguments(args);
|
command && command.pushArguments(args);
|
||||||
args = [];
|
args = [];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -91,7 +110,7 @@ Sieve.parseScript = script => {
|
||||||
new_command = new Commands.conditional(value);
|
new_command = new Commands.conditional(value);
|
||||||
} else if (Commands[value]) {
|
} else if (Commands[value]) {
|
||||||
if ('allof' === value || 'anyof' === value) {
|
if ('allof' === value || 'anyof' === value) {
|
||||||
(command instanceof Commands.conditional) || error('Test-list not in conditional');
|
// (command instanceof Commands.conditional || command instanceof Commands.not) || error('Test-list not in conditional');
|
||||||
}
|
}
|
||||||
new_command = new Commands[value]();
|
new_command = new Commands[value]();
|
||||||
} else {
|
} else {
|
||||||
|
@ -115,14 +134,13 @@ Sieve.parseScript = script => {
|
||||||
// allof/anyof .tests[] new_command
|
// allof/anyof .tests[] new_command
|
||||||
command.tests.push(new_command);
|
command.tests.push(new_command);
|
||||||
} else {
|
} else {
|
||||||
error('Test not allowed here');
|
error('Test "' + value + '" not allowed in "' + command.identifier + '" command');
|
||||||
}
|
}
|
||||||
} else if (command) {
|
} else if (command) {
|
||||||
if (command.commands) {
|
if (command.commands) {
|
||||||
command.commands.push(new_command);
|
command.commands.push(new_command);
|
||||||
} else {
|
} else {
|
||||||
console.dir(command);
|
error('commands not allowed in "' + command.identifier + '" command');
|
||||||
error('commands not allowed');
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
tree.push(new_command);
|
tree.push(new_command);
|
||||||
|
@ -137,48 +155,36 @@ Sieve.parseScript = script => {
|
||||||
|
|
||||||
// Arguments
|
// Arguments
|
||||||
case T_TAG:
|
case T_TAG:
|
||||||
/*
|
pushArg(value.toLowerCase());
|
||||||
if (':value' === value || ':count' === value) {
|
|
||||||
requires.push('relational');
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
command
|
|
||||||
? args.push(value.toLowerCase())
|
|
||||||
: error('Tag must be command argument');
|
|
||||||
break;
|
break;
|
||||||
case T_STRING_LIST:
|
case T_STRING_LIST:
|
||||||
command
|
pushArg(Grammar.StringList.fromString(value));
|
||||||
? args.push(Grammar.StringList.fromString(value))
|
|
||||||
: error('String list must be command argument');
|
|
||||||
break;
|
break;
|
||||||
case T_MULTILINE_STRING:
|
case T_MULTILINE_STRING:
|
||||||
command
|
pushArg(new Grammar.MultiLine(value));
|
||||||
? args.push(new Grammar.MultiLine(value))
|
|
||||||
: error('Multi-line string must be command argument');
|
|
||||||
break;
|
break;
|
||||||
case T_QUOTED_STRING:
|
case T_QUOTED_STRING:
|
||||||
command
|
pushArg(new Grammar.QuotedString(value.substr(1,value.length-2)));
|
||||||
? args.push(new Grammar.QuotedString(value.substr(1,value.length-2)))
|
|
||||||
: error('Quoted string must be command argument');
|
|
||||||
break;
|
break;
|
||||||
case T_NUMBER:
|
case T_NUMBER:
|
||||||
command
|
pushArg(new Grammar.Number(value));
|
||||||
? args.push(new Grammar.Number(value))
|
|
||||||
: error('Number must be command argument');
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Comments
|
// Comments
|
||||||
case T_BRACKET_COMMENT:
|
case T_BRACKET_COMMENT:
|
||||||
(command ? command.commands : tree).push(
|
case T_HASH_COMMENT: {
|
||||||
new Grammar.BracketComment(value.substr(2, value.length-4))
|
let obj = (T_HASH_COMMENT == type)
|
||||||
);
|
? new Grammar.HashComment(value.substr(1).trim())
|
||||||
break;
|
: new Grammar.BracketComment(value.substr(2, value.length-4));
|
||||||
|
if (command) {
|
||||||
case T_HASH_COMMENT:
|
if (!command.comments) {
|
||||||
(command ? command.commands : tree).push(
|
command.comments = [];
|
||||||
new Grammar.HashComment(value.substr(1).trim())
|
}
|
||||||
);
|
(command.commands || command.comments).push(obj);
|
||||||
break;
|
} else {
|
||||||
|
tree.push(obj);
|
||||||
|
}
|
||||||
|
break; }
|
||||||
|
|
||||||
case T_WHITESPACE:
|
case T_WHITESPACE:
|
||||||
// (command ? command.commands : tree).push(value.trim());
|
// (command ? command.commands : tree).push(value.trim());
|
||||||
|
@ -231,10 +237,12 @@ Sieve.parseScript = script => {
|
||||||
break;
|
break;
|
||||||
case T_COMMA:
|
case T_COMMA:
|
||||||
pushArgs();
|
pushArgs();
|
||||||
levels.pop();
|
|
||||||
command = levels.last();
|
|
||||||
// Must be inside PARENTHESIS aka test-list
|
// Must be inside PARENTHESIS aka test-list
|
||||||
(command.tests instanceof Grammar.TestList) || error('Comma not part of test-list');
|
while (command && !(command.tests instanceof Grammar.TestList)) {
|
||||||
|
levels.pop();
|
||||||
|
command = levels.last();
|
||||||
|
}
|
||||||
|
command || error('Comma not part of test-list');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_UNKNOWN:
|
case T_UNKNOWN:
|
||||||
|
|
|
@ -16,7 +16,7 @@ class Address extends Test
|
||||||
constructor()
|
constructor()
|
||||||
{
|
{
|
||||||
super('address');
|
super('address');
|
||||||
this.comparator = 'i;ascii-casemap';
|
this.comparator = '';
|
||||||
this.address_part = ':all'; // :localpart | :domain | :all
|
this.address_part = ':all'; // :localpart | :domain | :all
|
||||||
this.match_type = ':is';
|
this.match_type = ':is';
|
||||||
this.header_list = new StringList;
|
this.header_list = new StringList;
|
||||||
|
@ -36,17 +36,11 @@ class Address extends Test
|
||||||
pushArguments(args)
|
pushArguments(args)
|
||||||
{
|
{
|
||||||
args.forEach((arg, i) => {
|
args.forEach((arg, i) => {
|
||||||
if (':is' === arg || ':contains' === arg || ':matches' === arg) {
|
if (':localpart' === arg || ':domain' === arg || ':all' === arg) {
|
||||||
this.match_type = arg;
|
|
||||||
} else if (':localpart' === arg || ':domain' === arg || ':all' === arg) {
|
|
||||||
this.address_part = arg;
|
this.address_part = arg;
|
||||||
} else if (arg instanceof StringList || arg instanceof Grammar.StringType) {
|
} else if (arg instanceof StringList || arg instanceof Grammar.StringType) {
|
||||||
if (':comparator' === args[i-1]) {
|
this[args[i+1] ? 'header_list' : 'key_list'] = arg;
|
||||||
this.comparator = arg;
|
// (args[i+1] ? this.header_list : this.key_list) = arg;
|
||||||
} else {
|
|
||||||
this[args[i+1] ? 'header_list' : 'key_list'] = arg;
|
|
||||||
// (args[i+1] ? this.header_list : this.key_list) = arg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -65,7 +59,7 @@ class AllOf extends Test
|
||||||
|
|
||||||
toString()
|
toString()
|
||||||
{
|
{
|
||||||
return 'allof' + this.tests;
|
return 'allof ' + this.tests;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,7 +76,7 @@ class AnyOf extends Test
|
||||||
|
|
||||||
toString()
|
toString()
|
||||||
{
|
{
|
||||||
return 'anyof' + this.tests;
|
return 'anyof ' + this.tests;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,7 +88,7 @@ class Envelope extends Test
|
||||||
constructor()
|
constructor()
|
||||||
{
|
{
|
||||||
super('envelope');
|
super('envelope');
|
||||||
this.comparator = 'i;ascii-casemap';
|
this.comparator = '';
|
||||||
this.address_part = ':all'; // :localpart | :domain | :all
|
this.address_part = ':all'; // :localpart | :domain | :all
|
||||||
this.match_type = ':is';
|
this.match_type = ':is';
|
||||||
this.envelope_part = new StringList;
|
this.envelope_part = new StringList;
|
||||||
|
@ -116,17 +110,11 @@ class Envelope extends Test
|
||||||
pushArguments(args)
|
pushArguments(args)
|
||||||
{
|
{
|
||||||
args.forEach((arg, i) => {
|
args.forEach((arg, i) => {
|
||||||
if (':is' === arg || ':contains' === arg || ':matches' === arg) {
|
if (':localpart' === arg || ':domain' === arg || ':all' === arg) {
|
||||||
this.match_type = arg;
|
|
||||||
} else if (':localpart' === arg || ':domain' === arg || ':all' === arg) {
|
|
||||||
this.address_part = arg;
|
this.address_part = arg;
|
||||||
} else if (arg instanceof StringList || arg instanceof Grammar.StringType) {
|
} else if (arg instanceof StringList || arg instanceof Grammar.StringType) {
|
||||||
if (':comparator' === args[i-1]) {
|
this[args[i+1] ? 'envelope_part' : 'key_list'] = arg;
|
||||||
this.comparator = arg;
|
// (args[i+1] ? this.envelope_part : this.key_list) = arg;
|
||||||
} else {
|
|
||||||
this[args[i+1] ? 'envelope_part' : 'key_list'] = arg;
|
|
||||||
// (args[i+1] ? this.envelope_part : this.key_list) = arg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -177,7 +165,7 @@ class Header extends Test
|
||||||
constructor()
|
constructor()
|
||||||
{
|
{
|
||||||
super('header');
|
super('header');
|
||||||
this.comparator = 'i;ascii-casemap';
|
this.comparator = '';
|
||||||
this.address_part = ':all'; // :localpart | :domain | :all
|
this.address_part = ':all'; // :localpart | :domain | :all
|
||||||
this.match_type = ':is';
|
this.match_type = ':is';
|
||||||
this.header_names = new StringList;
|
this.header_names = new StringList;
|
||||||
|
@ -196,17 +184,11 @@ class Header extends Test
|
||||||
pushArguments(args)
|
pushArguments(args)
|
||||||
{
|
{
|
||||||
args.forEach((arg, i) => {
|
args.forEach((arg, i) => {
|
||||||
if (':is' === arg || ':contains' === arg || ':matches' === arg) {
|
if (':localpart' === arg || ':domain' === arg || ':all' === arg) {
|
||||||
this.match_type = arg;
|
|
||||||
} else if (':localpart' === arg || ':domain' === arg || ':all' === arg) {
|
|
||||||
this.address_part = arg;
|
this.address_part = arg;
|
||||||
} else if (arg instanceof StringList || arg instanceof Grammar.StringType) {
|
} else if (arg instanceof StringList || arg instanceof Grammar.StringType) {
|
||||||
if (':comparator' === args[i-1]) {
|
this[args[i+1] ? 'header_names' : 'key_list'] = arg;
|
||||||
this.comparator = arg;
|
// (args[i+1] ? this.header_names : this.key_list) = arg;
|
||||||
} else {
|
|
||||||
this[args[i+1] ? 'header_names' : 'key_list'] = arg;
|
|
||||||
// (args[i+1] ? this.header_names : this.key_list) = arg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue