Apply 67_update_handle_old_versions.patch
[mspang/vmailman.git] / Mailman / Errors.py
1 # Copyright (C) 1998-2003 by the Free Software Foundation, Inc.
2 #
3 # This program is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU General Public License
5 # as published by the Free Software Foundation; either version 2
6 # of the License, or (at your option) any later version.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software
15 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16
17
18 """Shared mailman errors and messages."""
19
20 \f
21 # exceptions for problems related to opening a list
22 class MMListError(Exception): pass
23 class MMUnknownListError(MMListError): pass
24 class MMCorruptListDatabaseError(MMListError): pass
25 class MMListNotReadyError(MMListError): pass
26 class MMListAlreadyExistsError(MMListError): pass
27 class BadListNameError(MMListError): pass
28
29 # Membership exceptions
30 class MMMemberError(Exception): pass
31 class MMBadUserError(MMMemberError): pass
32 class MMAlreadyAMember(MMMemberError): pass
33
34 # "New" style membership exceptions (new w/ MM2.1)
35 class MemberError(Exception): pass
36 class NotAMemberError(MemberError): pass
37 class AlreadyReceivingDigests(MemberError): pass
38 class AlreadyReceivingRegularDeliveries(MemberError): pass
39 class CantDigestError(MemberError): pass
40 class MustDigestError(MemberError): pass
41 class MembershipIsBanned(MemberError): pass
42
43 # Exception hierarchy for various authentication failures, can be
44 # raised from functions in SecurityManager.py
45 class MMAuthenticationError(Exception): pass
46 class MMBadPasswordError(MMAuthenticationError): pass
47 class MMPasswordsMustMatch(MMAuthenticationError): pass
48 class MMCookieError(MMAuthenticationError): pass
49 class MMExpiredCookieError(MMCookieError): pass
50 class MMInvalidCookieError(MMCookieError): pass
51
52 # BAW: these still need to be converted to classes.
53 MMMustDigestError    = "MMMustDigestError"
54 MMCantDigestError    = "MMCantDigestError"
55 MMNeedApproval       = "MMNeedApproval"
56 MMSubscribeNeedsConfirmation = "MMSubscribeNeedsConfirmation"
57 MMBadConfirmation    = "MMBadConfirmation"
58 MMAlreadyDigested    = "MMAlreadyDigested"
59 MMAlreadyUndigested  = "MMAlreadyUndigested"
60
61 MODERATED_LIST_MSG    = "Moderated list"
62 IMPLICIT_DEST_MSG     = "Implicit destination"
63 SUSPICIOUS_HEADER_MSG = "Suspicious header"
64 FORBIDDEN_SENDER_MSG  = "Forbidden sender"
65
66
67 \f
68 # New style class based exceptions.  All the above errors should eventually be
69 # converted.
70
71 class MailmanError(Exception):
72     """Base class for all Mailman exceptions."""
73     pass
74
75
76 class MMLoopingPost(MailmanError):
77     """Post already went through this list!"""
78     pass
79
80
81 # Exception hierarchy for bad email address errors that can be raised from
82 # Utils.ValidateEmail()
83 class EmailAddressError(MailmanError):
84     """Base class for email address validation errors."""
85     pass
86
87 class MMBadEmailError(EmailAddressError):
88     """Email address is invalid (empty string or not fully qualified)."""
89     pass
90
91 class MMHostileAddress(EmailAddressError):
92     """Email address has potentially hostile characters in it."""
93     pass
94
95
96 # Exceptions for admin request database
97 class LostHeldMessage(MailmanError):
98     """Held message was lost."""
99     pass
100
101
102 \f
103 def _(s):
104     return s
105
106 # Exceptions for the Handler subsystem
107 class HandlerError(MailmanError):
108     """Base class for all handler errors."""
109
110 class HoldMessage(HandlerError):
111     """Base class for all message-being-held short circuits."""
112
113     # funky spelling is necessary to break import loops
114     reason = _('For some unknown reason')
115
116     def reason_notice(self):
117         return self.reason
118
119     # funky spelling is necessary to break import loops
120     rejection = _('Your message was rejected')
121
122     def rejection_notice(self, mlist):
123         return self.rejection
124
125 class DiscardMessage(HandlerError):
126     """The message can be discarded with no further action"""
127
128 class SomeRecipientsFailed(HandlerError):
129     """Delivery to some or all recipients failed"""
130     def __init__(self, tempfailures, permfailures):
131         HandlerError.__init__(self)
132         self.tempfailures = tempfailures
133         self.permfailures = permfailures
134
135 # multiple inheritance for backwards compatibility
136 class LoopError(DiscardMessage, MMLoopingPost):
137     """We've seen this message before"""
138
139 class RejectMessage(HandlerError):
140     """The message will be bounced back to the sender"""
141     def __init__(self, notice=None):
142         if notice is None:
143             notice = _('Your message was rejected')
144         if notice.endswith('\n\n'):
145             pass
146         elif notice.endswith('\n'):
147             notice += '\n'
148         else:
149             notice += '\n\n'
150         self.__notice = notice
151
152     def notice(self):
153         return self.__notice
154
155 \f
156 # Additional exceptions
157 class HostileSubscriptionError(MailmanError):
158     """A cross-subscription attempt was made."""
159     # This exception gets raised when an invitee attempts to use the
160     # invitation to cross-subscribe to some other mailing list.