summaryrefslogtreecommitdiff
path: root/mailman/commands/cmd_confirm.py
blob: b5e4182bd7d594cd5dd0349f4a2c47a2836261c0 (plain)
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
# Copyright (C) 2002-2009 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/>.

"""
    confirm <confirmation-string>
        Confirm an action.  The confirmation-string is required and should be
        supplied by a mailback confirmation notice.
"""

from mailman import Errors
from mailman import Pending
from mailman.config import config
from mailman.i18n import _

STOP = 1



def gethelp(mlist):
    return _(__doc__)



def process(res, args):
    mlist = res.mlist
    if len(args) <> 1:
        res.results.append(_('Usage:'))
        res.results.append(gethelp(mlist))
        return STOP
    cookie = args[0]
    try:
        results = mlist.ProcessConfirmation(cookie, res.msg)
    except Errors.MMBadConfirmation, e:
        # Express in approximate days
        days = int(config.PENDING_REQUEST_LIFE / config.days(1) + 0.5)
        res.results.append(_("""\
Invalid confirmation string.  Note that confirmation strings expire
approximately %(days)s days after the initial subscription request.  If your
confirmation has expired, please try to re-submit your original request or
message."""))
    except Errors.MMNeedApproval:
        res.results.append(_("""\
Your request has been forwarded to the list moderator for approval."""))
    except Errors.MMAlreadyAMember:
        # Some other subscription request for this address has
        # already succeeded.
        res.results.append(_('You are already subscribed.'))
    except Errors.NotAMemberError:
        # They've already been unsubscribed
        res.results.append(_("""\
You are not currently a member.  Have you already unsubscribed or changed
your email address?"""))
    except Errors.MembershipIsBanned:
        owneraddr = mlist.GetOwnerEmail()
        res.results.append(_("""\
You are currently banned from subscribing to this list.  If you think this
restriction is erroneous, please contact the list owners at
%(owneraddr)s."""))
    except Errors.HostileSubscriptionError:
        res.results.append(_("""\
You were not invited to this mailing list.  The invitation has been discarded,
and both list administrators have been alerted."""))
    except Errors.MMBadPasswordError:
        res.results.append(_("""\
Bad approval password given.  Held message is still being held."""))
    else:
        if ((results[0] == Pending.SUBSCRIPTION and mlist.send_welcome_msg)
            or
            (results[0] == Pending.UNSUBSCRIPTION and mlist.send_goodbye_msg)):
            # We don't also need to send a confirmation succeeded message
            res.respond = 0
        else:
            res.results.append(_('Confirmation succeeded'))
            # Consume any other confirmation strings with the same cookie so
            # the user doesn't get a misleading "unprocessed" message.
            match = 'confirm ' + cookie
            unprocessed = []
            for line in res.commands:
                if line.lstrip() == match:
                    continue
                unprocessed.append(line)
            res.commands = unprocessed
    # Process just one confirmation string per message
    return STOP