1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
# Copyright (C) 2007-2016 by the Free Software Foundation, Inc.
#
# This file is part of GNU Mailman.
#
# GNU Mailman is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along with
# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
"""Interfaces describing the basics of chains and links."""
__all__ = [
'AcceptEvent',
'AcceptOwnerEvent',
'ChainEvent',
'DiscardEvent',
'HoldEvent',
'IChain',
'IChainIterator',
'IChainLink',
'IMutableChain',
'LinkAction',
'RejectEvent',
]
from enum import Enum
from zope.interface import Interface, Attribute
class ChainEvent:
"""Base class for chain notification events."""
def __init__(self, mlist, msg, msgdata, chain):
self.mlist = mlist
self.msg = msg
self.msgdata = msgdata
self.chain = chain
class AcceptEvent(ChainEvent):
"""A notification event signaling that a message is being accepted."""
class AcceptOwnerEvent(ChainEvent):
"""An event signaling that a message is accepted to the -owner address."""
class DiscardEvent(ChainEvent):
"""A notification event signaling that a message is being discarded."""
class HoldEvent(ChainEvent):
"""A notification event signaling that a message is being held."""
class RejectEvent(ChainEvent):
"""A notification event signaling that a message is being rejected."""
class LinkAction(Enum):
# Jump to another chain.
jump = 0
# Take a detour to another chain, returning to the original chain when
# completed (if no other jump occurs).
detour = 1
# Stop processing all chains.
stop = 2
# Continue processing the next link in the chain.
defer = 3
# Run a function and continue processing.
run = 4
class IChainLink(Interface):
"""A link in the chain."""
rule = Attribute('The rule to run for this link.')
action = Attribute('The LinkAction to take if this rule matches.')
chain = Attribute('The chain to jump or detour to.')
function = Attribute(
"""The function to execute.
The function takes three arguments and returns nothing.
:param mlist: the IMailingList object
:param msg: the message being processed
:param msgdata: the message metadata dictionary
""")
class IChain(Interface):
"""A chain of rules."""
name = Attribute('Chain name; must be unique.')
description = Attribute('A brief description of the chain.')
def get_links(mlist, msg, msgdata):
"""Get an `IChainIterator` for processing.
:param mlist: The mailing list.
:param msg: The message being processed.
:param msgdata: The message metadata dictionary.
:return: `IChainIterator`.
"""
class IChainIterator(Interface):
"""An iterator over chain rules."""
def __iter__():
"""Iterate over all the IChainLinks in this chain.
:return: an IChainLink.
"""
class IMutableChain(IChain):
"""Like `IChain` but can be mutated."""
def append_link(link):
"""Add a new chain link to the end of this chain.
:param link: The chain link to add.
"""
def flush():
"""Delete all links in this chain."""
|