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
|
# Copyright (C) 2007-2015 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/>.
"""Interface describing a user registration service.
This is a higher level interface to user registration, address confirmation,
etc. than the IUserManager. The latter does no validation, syntax checking,
or confirmation, while this interface does.
"""
__all__ = [
'ConfirmationNeededEvent',
'IRegistrar',
]
from zope.interface import Interface
class ConfirmationNeededEvent:
"""Triggered when an address needs confirmation.
Addresses must be verified before they can receive messages or post to
mailing list. When an address is registered with Mailman, via the
`IRegistrar` interface, an `IPendable` is created which represents the
pending registration. This pending registration is stored in the
database, keyed by a token. Then this event is triggered.
There may be several ways to confirm an email address. On some sites,
registration may immediately produce a verification, e.g. because it is on
a known intranet. Or verification may occur via external database lookup
(e.g. LDAP). On most public mailing lists, a mail-back confirmation is
sent to the address, and only if they reply to the mail-back, or click on
an embedded link, is the registered address confirmed.
"""
def __init__(self, mlist, pendable, token):
self.mlist = mlist
self.pendable = pendable
self.token = token
class IRegistrar(Interface):
"""Interface for registering and verifying email addresses and users.
This is a higher level interface to user registration, email address
confirmation, etc. than the IUserManager. The latter does no validation,
syntax checking, or confirmation, while this interface does.
"""
def register(mlist, email, display_name=None, delivery_mode=None):
"""Register the email address, requesting verification.
No `IAddress` or `IUser` is created during this step, but after
successful confirmation, it is guaranteed that an `IAddress` with a
linked `IUser` will exist. When a verified `IAddress` matching
`email` already exists, this method will do nothing, except link a new
`IUser` to the `IAddress` if one is not yet associated with the
email address.
In all cases, the email address is sanity checked for validity first.
:param mlist: The mailing list that is the focus of this registration.
:type mlist: `IMailingList`
:param email: The email address to register.
:type email: str
:param display_name: The optional display name of the user.
:type display_name: str
:param delivery_mode: The optional delivery mode for this
registration. If not given, regular delivery is used.
:type delivery_mode: `DeliveryMode`
:return: The confirmation token string.
:rtype: str
:raises InvalidEmailAddressError: if the address is not allowed.
"""
def confirm(token):
"""Confirm the pending registration matched to the given `token`.
Confirmation ensures that the IAddress exists and is linked to an
IUser, with the latter being created and linked if necessary.
:param token: A token matching a pending event with a type of
'registration'.
:return: Boolean indicating whether the confirmation succeeded or
not. It may fail if the token is no longer in the database, or if
the token did not match a registration event.
"""
def discard(token):
"""Discard the pending registration matched to the given `token`.
The event record is discarded and the IAddress is not verified. No
IUser is created.
:param token: A token matching a pending event with a type of
'registration'.
"""
|