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
145
146
147
|
# Copyright (C) 2002-2018 by the Free Software Foundation, Inc.
#
# This program 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 2
# of the License, or (at your option) any later version.
#
# This program 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 this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
"""
subscribe [password] [digest|nodigest] [address=<address>]
Subscribe to this mailing list. Your password must be given to
unsubscribe or change your options, but if you omit the password, one
will be generated for you. You may be periodically reminded of your
password.
The next argument may be either: `nodigest' or `digest' (no quotes!).
If you wish to subscribe an address other than the address you sent
this request from, you may specify `address=<address>' (no brackets
around the email address, and no quotes!)
"""
from email.Utils import parseaddr
from email.Header import decode_header, make_header
from Mailman import Utils
from Mailman import Errors
from Mailman.UserDesc import UserDesc
from Mailman.i18n import _
STOP = 1
def gethelp(mlist):
return _(__doc__)
def process(res, args):
mlist = res.mlist
digest = None
password = None
address = None
realname = None
# Parse the args
argnum = 0
for arg in args:
if arg.lower().startswith('address='):
address = arg[8:]
elif argnum == 0:
password = arg
elif argnum == 1:
if arg.lower() not in ('digest', 'nodigest'):
res.results.append(_('Bad digest specifier: %(arg)s'))
return STOP
if arg.lower() == 'digest':
digest = 1
else:
digest = 0
else:
res.results.append(_('Usage:'))
res.results.append(gethelp(mlist))
return STOP
argnum += 1
# Fix the password/digest issue
if (digest is None
and password and password.lower() in ('digest', 'nodigest')):
if password.lower() == 'digest':
digest = 1
else:
digest = 0
password = None
# Fill in empty defaults
if digest is None:
digest = mlist.digest_is_default
if password is None:
password = Utils.MakeRandomPassword()
if address is None:
realname, address = parseaddr(res.msg['from'])
if not address:
# Fall back to the sender address
address = res.msg.get_sender()
if not address:
res.results.append(_('No valid address found to subscribe'))
return STOP
# Watch for encoded names
try:
h = make_header(decode_header(realname))
# BAW: in Python 2.2, use just unicode(h)
realname = h.__unicode__()
except UnicodeError:
realname = u''
# Coerce to byte string if uh contains only ascii
try:
realname = realname.encode('us-ascii')
except UnicodeError:
pass
# Create the UserDesc record and do a non-approved subscription
listowner = mlist.GetOwnerEmail()
userdesc = UserDesc(address, realname, password, digest)
remote = res.msg.get_sender()
try:
mlist.AddMember(userdesc, remote)
except Errors.MembershipIsBanned:
res.results.append(_("""\
The email address you supplied is banned from this mailing list.
If you think this restriction is erroneous, please contact the list
owners at %(listowner)s."""))
return STOP
except Errors.MMBadEmailError:
res.results.append(_("""\
Mailman won't accept the given email address as a valid address.
(E.g. it must have an @ in it.)"""))
return STOP
except Errors.MMHostileAddress:
res.results.append(_("""\
Your subscription is not allowed because
the email address you gave is insecure."""))
return STOP
except Errors.MMAlreadyAMember:
res.results.append(_('You are already subscribed!'))
return STOP
except Errors.MMCantDigestError:
res.results.append(
_('No one can subscribe to the digest of this list!'))
return STOP
except Errors.MMMustDigestError:
res.results.append(_('This list only supports digest subscriptions!'))
return STOP
except Errors.MMSubscribeNeedsConfirmation:
# We don't need to respond /and/ send a confirmation message.
res.respond = 0
except Errors.MMNeedApproval:
res.results.append(_("""\
Your subscription request has been forwarded to the list administrator
at %(listowner)s for review."""))
else:
# Everything is a-ok
res.results.append(_('Subscription request succeeded.'))
|