snappymail/dev/Sieve/Commands.js

181 lines
3.8 KiB
JavaScript

import { capa } from 'Sieve/Utils';
import {
ActionCommand,
ControlCommand,
TestCommand
} from 'Sieve/Grammar';
import {
DiscardCommand,
FileIntoCommand,
KeepCommand,
RedirectCommand
} from 'Sieve/Commands/Actions';
import {
ConditionalCommand,
ElsIfCommand,
ElseCommand,
IfCommand,
RequireCommand,
StopCommand
} from 'Sieve/Commands/Controls';
import {
AddressTest,
AllOfTest,
AnyOfTest,
EnvelopeTest,
ExistsTest,
FalseTest,
HeaderTest,
NotTest,
SizeTest,
TrueTest
} from 'Sieve/Commands/Tests';
import { BodyTest } from 'Sieve/Extensions/rfc5173';
import { EnvironmentTest } from 'Sieve/Extensions/rfc5183';
import { SetCommand, StringTest } from 'Sieve/Extensions/rfc5229';
import { VacationCommand } from 'Sieve/Extensions/rfc5230';
import { SetFlagCommand, AddFlagCommand, RemoveFlagCommand, HasFlagTest } from 'Sieve/Extensions/rfc5232';
import { SpamTestTest, VirusTestTest } from 'Sieve/Extensions/rfc5235';
import { DateTest, CurrentDateTest } from 'Sieve/Extensions/rfc5260';
import { AddHeaderCommand, DeleteHeaderCommand } from 'Sieve/Extensions/rfc5293';
import { ErejectCommand, RejectCommand } from 'Sieve/Extensions/rfc5429';
import { NotifyCommand, ValidNotifyMethodTest, NotifyMethodCapabilityTest } from 'Sieve/Extensions/rfc5435';
import { IHaveTest, ErrorCommand } from 'Sieve/Extensions/rfc5463';
import { MailboxExistsTest, MetadataTest, MetadataExistsTest } from 'Sieve/Extensions/rfc5490';
import { ForEveryPartCommand, BreakCommand, ReplaceCommand, EncloseCommand, ExtractTextCommand } from 'Sieve/Extensions/rfc5703';
import { IncludeCommand, ReturnCommand, GlobalCommand } from 'Sieve/Extensions/rfc6609';
export const
getIdentifier = (cmd, type) => {
const obj = new cmd, requires = obj.require;
return (
(!type || obj instanceof type)
&& (!requires || (Array.isArray(requires) ? requires : [requires]).every(string => capa.includes(string)))
)
? obj.identifier
: null;
},
AllCommands = [
// Control commands
IfCommand,
ElsIfCommand,
ElseCommand,
ConditionalCommand,
RequireCommand,
StopCommand,
// Action commands
DiscardCommand,
FileIntoCommand,
KeepCommand,
RedirectCommand,
// Test commands
AddressTest,
AllOfTest,
AnyOfTest,
EnvelopeTest,
ExistsTest,
FalseTest,
HeaderTest,
NotTest,
SizeTest,
TrueTest,
// rfc5173
BodyTest,
// rfc5183
EnvironmentTest,
// rfc5229
SetCommand,
StringTest,
// rfc5230
VacationCommand,
// rfc5232
SetFlagCommand,
AddFlagCommand,
RemoveFlagCommand,
HasFlagTest,
// rfc5235
SpamTestTest,
VirusTestTest,
// rfc5260
DateTest,
CurrentDateTest,
// rfc5293
AddHeaderCommand,
DeleteHeaderCommand,
// rfc5429
ErejectCommand,
RejectCommand,
// rfc5435
NotifyCommand,
ValidNotifyMethodTest,
NotifyMethodCapabilityTest,
// rfc5463
IHaveTest,
ErrorCommand,
// rfc5490
MailboxExistsTest,
MetadataTest,
MetadataExistsTest,
// rfc5703
ForEveryPartCommand,
BreakCommand,
ReplaceCommand,
EncloseCommand,
ExtractTextCommand,
// rfc6609
IncludeCommand,
ReturnCommand,
GlobalCommand
],
availableCommands = () => {
let commands = {}, id;
AllCommands.forEach(cmd => {
id = getIdentifier(cmd);
if (id) {
commands[id] = cmd;
}
});
return commands;
},
availableActions = () => {
let actions = {}, id;
AllCommands.forEach(cmd => {
id = getIdentifier(cmd, ActionCommand);
if (id) {
actions[id] = cmd;
}
});
return actions;
},
availableControls = () => {
let controls = {}, id;
AllCommands.forEach(cmd => {
id = getIdentifier(cmd, ControlCommand);
if (id) {
controls[id] = cmd;
}
});
return controls;
},
availableTests = () => {
let tests = {}, id;
AllCommands.forEach(cmd => {
id = getIdentifier(cmd, TestCommand);
if (id) {
tests[id] = cmd;
}
});
return tests;
};