88
def banlist_matcher(request, segments):
89
"""A matcher of all banned addresses for a mailing list.
93
if len(segments) != 1 or segments[0] != 'banlist':
100
def banned_matcher(request, segments):
101
"""A matcher of a single banned addresses for a mailing list.
103
e.g. /banlist/something@example.org
105
if len(segments) != 2 or segments[0] != 'banlist':
108
return (), dict(address=segments[1]), ()
85
112
def config_matcher(request, segments):
86
113
"""A matcher for a mailing list's configuration resource.
173
200
return http.not_found()
174
201
return HeldMessages(self._mlist)
203
@resource.child(banlist_matcher)
204
def banlist(self, request, segments, attribute=None):
205
"""Return a list of banned addresses."""
206
return BannedAddresses(self._mlist)
208
@resource.child(banned_matcher)
209
def banned(self, request, segments, address):
210
"""Return a list of banned addresses."""
211
return BannedAddress(self._mlist, address)
215
class BannedAddress(resource.Resource, CollectionMixin):
216
"""Class to represent a banned address."""
218
def __init__(self, mlist, address):
220
self._address = address
221
self.ban_manager = getUtility(IBanManager)
224
def container(self, request):
225
"""/banlist/someone@example.com"""
226
if self._mlist is None or self._address is None or not self.ban_manager.is_banned(self._address, self._mlist.fqdn_listname):
227
return http.not_found()
228
resource = dict(banned_email=self._address)
229
return http.ok([], etag(resource))
232
def remove(self, request):
233
"""Remove an address from the ban list."""
234
if self._mlist is None or self._address is None:
235
return http.not_found()
237
if not self.ban_manager.is_banned(self._address, self._mlist.fqdn_listname):
238
return http.bad_request([], b'Address is not in ban list')
240
self.ban_manager.unban(self._address, self._mlist.fqdn_listname)
241
return http.ok([], '')
243
class BannedAddresses(resource.Resource, CollectionMixin):
244
"""Class to represent the list of all banned addresses."""
246
def __init__(self, mlist):
248
self.ban_manager = getUtility(IBanManager)
250
def _resource_as_dict(self, item):
251
"""See `CollectionMixin`."""
256
def _get_collection(self, request):
257
"""See `CollectionMixin`."""
258
return self.ban_manager.ban_list(self._mlist.fqdn_listname)
261
def container(self, request):
263
resource = self._make_collection(request)
264
return http.ok([], etag(resource))
267
def create(self, request):
268
"""Ban some address from subscribing."""
270
validator = Validator(address=unicode)
271
converted = validator(request)
273
address = converted['address']
274
if self.ban_manager.is_banned(address, self._mlist.fqdn_listname):
275
return http.bad_request([], b'Address is already in ban list')
277
self.ban_manager.ban(address, self._mlist.fqdn_listname)
278
except ValueError as error:
279
return http.bad_request([], str(error))
280
location = path_to('lists/{0}/banlist'.format(self._mlist.fqdn_listname))
281
return http.created(location, [], None)
178
285
class AllLists(_ListBase):