diff options
Diffstat (limited to 'Mailman/MemberAdaptor.py')
| -rw-r--r-- | Mailman/MemberAdaptor.py | 388 |
1 files changed, 0 insertions, 388 deletions
diff --git a/Mailman/MemberAdaptor.py b/Mailman/MemberAdaptor.py deleted file mode 100644 index 6b5b4a5e2..000000000 --- a/Mailman/MemberAdaptor.py +++ /dev/null @@ -1,388 +0,0 @@ -# Copyright (C) 2001-2007 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. - -"""This is an interface to list-specific membership information. - -This class should not be instantiated directly, but instead, it should be -subclassed for specific adaptation to membership databases. The default -MM2.0.x style adaptor is in OldStyleMemberships.py. Through the extend.py -mechanism, you can instantiate different membership information adaptors to -get info out of LDAP, Zope, other, or any combination of the above. - -Members have three pieces of identifying information: a unique identifying -opaque key (KEY), a lower-cased email address (LCE), and a case-preserved -email (CPE) address. Adaptors must ensure that both member keys and lces can -uniquely identify a member, and that they can (usually) convert freely between -keys and lces. Most methods must accept either a key or an lce, unless -specifically documented otherwise. - -The CPE is always used to calculate the recipient address for a message. Some -remote MTAs make a distinction based on localpart case, so we always send -messages to the case-preserved address. Note that DNS is case insensitive so -it doesn't matter what the case is for the domain part of an email address, -although by default, we case-preserve that too. - -The adaptors must support the readable interface for getting information about -memberships, and may optionally support the writeable interface. If they do -not, then members cannot change their list attributes via Mailman's web or -email interfaces. Updating membership information in that case is the -backend's responsibility. Adaptors are allowed to support parts of the -writeable interface. - -For any writeable method not supported, a NotImplementedError exception should -be raised. -""" - -# Delivery statuses -ENABLED = 0 # enabled -UNKNOWN = 1 # legacy disabled -BYUSER = 2 # disabled by user choice -BYADMIN = 3 # disabled by admin choice -BYBOUNCE = 4 # disabled by bounces - - - -class MemberAdaptor: - def __init__(self, mlist): - """Create the adaptor, attached to the given mailing list.""" - raise NotImplementedError - - # - # Transaction interface - # - def load(self): - """Called when the mailing list data is loaded. - - The adaptor should refresh/clear all in-memory objects. The reason is - that other processes may have changed the database since the last time - the adaptor has been accessed. - """ - - def lock(self): - """Called when the mailing list is locked. - - This should correspond to a database 'begin'. - """ - raise NotImplementedError - - def save(self): - """Called when a locked mailing list is saved. - - This should correspond to a database 'commit' except that the adaptor - should record that the database has been saved, and this flag should - be checked in any subsequent unlock() calls. - """ - raise NotImplementedError - - def unlock(self): - """Called when a locked mailing list is unlocked. - - Generally, this can be no-op'd if save() was previously called, but if - not, then a database 'rollback' should be issued. There is no - explicit transaction rollback operation in the MailList API, but - processes will unlock without saving to mean the same thing. - """ - raise NotImplementedError - - # - # The readable interface - # - def getMembers(self): - """Get the LCE for all the members of the mailing list.""" - raise NotImplementedError - - def getRegularMemberKeys(self): - """Get the LCE for all regular delivery members (i.e. non-digest).""" - raise NotImplementedError - - def getDigestMemberKeys(self): - """Get the LCE for all digest delivery members.""" - raise NotImplementedError - - def isMember(self, member): - """Return 1 if member KEY/LCE is a valid member, otherwise 0.""" - - def getMemberKey(self, member): - """Return the KEY for the member KEY/LCE. - - If member does not refer to a valid member, raise NotAMemberError. - """ - raise NotImplementedError - - def getMemberCPAddress(self, member): - """Return the CPE for the member KEY/LCE. - - If member does not refer to a valid member, raise NotAMemberError. - """ - raise NotImplementedError - - def getMemberCPAddresses(self, members): - """Return a sequence of CPEs for the given sequence of members. - - The returned sequence will be the same length as members. If any of - the KEY/LCEs in members does not refer to a valid member, that entry - in the returned sequence will be None (i.e. NotAMemberError is never - raised). - """ - raise NotImplementedError - - def authenticateMember(self, member, response): - """Authenticate the member KEY/LCE with the given response. - - If the response authenticates the member, return a secret that is - known only to the authenticated member. This need not be the member's - password, but it will be used to craft a session cookie, so it should - be persistent for the life of the session. - - If the authentication failed return False. If member did not refer to - a valid member, raise NotAMemberError. - - Normally, the response will be the password typed into a web form or - given in an email command, but it needn't be. It is up to the adaptor - to compare the typed response to the user's authentication token. - """ - raise NotImplementedError - - def getMemberPassword(self, member): - """Return the member's password. - - If the member KEY/LCE is not a member of the list, raise - NotAMemberError. - """ - raise NotImplementedError - - def getMemberLanguage(self, member): - """Return the preferred language for the member KEY/LCE. - - The language returned must be a key in mm_cfg.LC_DESCRIPTIONS and the - mailing list must support that language. - - If member does not refer to a valid member, the list's default - language is returned instead of raising a NotAMemberError error. - """ - raise NotImplementedError - - def getMemberOption(self, member, flag): - """Return the boolean state of the member option for member KEY/LCE. - - Option flags are defined in Defaults.py. - - If member does not refer to a valid member, raise NotAMemberError. - """ - raise NotImplementedError - - def getMemberName(self, member): - """Return the full name of the member KEY/LCE. - - None is returned if the member has no registered full name. The - returned value may be a Unicode string if there are non-ASCII - characters in the name. NotAMemberError is raised if member does not - refer to a valid member. - """ - raise NotImplementedError - - def getMemberTopics(self, member): - """Return the list of topics this member is interested in. - - The return value is a list of strings which name the topics. - """ - raise NotImplementedError - - def getDeliveryStatus(self, member): - """Return the delivery status of this member. - - Value is one of the module constants: - - ENABLED - The deliveries to the user are not disabled - UNKNOWN - Deliveries are disabled for unknown reasons. The - primary reason for this to happen is that we've copied - their delivery status from a legacy version which didn't - keep track of disable reasons - BYUSER - The user explicitly disable deliveries - BYADMIN - The list administrator explicitly disabled deliveries - BYBOUNCE - The system disabled deliveries due to bouncing - - If member is not a member of the list, raise NotAMemberError. - """ - raise NotImplementedError - - def getDeliveryStatusChangeTime(self, member): - """Return the time of the last disabled delivery status change. - - Time is returned in float seconds since the epoch. XXX this should be - a Python datetime. - - If the current delivery status is ENABLED, the status change time will - be zero. If member is not a member of the list, raise - NotAMemberError. - """ - raise NotImplementedError - - def getDeliveryStatusMembers(self, - status=(UNKNOWN, BYUSER, BYADMIN, BYBOUNCE)): - """Return the list of members with a matching delivery status. - - Optional `status' if given, must be a sequence containing one or more - of ENABLED, UNKNOWN, BYUSER, BYADMIN, or BYBOUNCE. The members whose - delivery status is in this sequence are returned. - """ - raise NotImplementedError - - def getBouncingMembers(self): - """Return the list of members who have outstanding bounce information. - - This list of members doesn't necessarily overlap with - getDeliveryStatusMembers() since getBouncingMembers() will return - member who have bounced but not yet reached the disable threshold. - """ - raise NotImplementedError - - def getBounceInfo(self, member): - """Return the member's bounce information. - - A value of None means there is no bounce information registered for - the member. - - Bounce info is opaque to the MemberAdaptor. It is set by - setBounceInfo() and returned by this method without modification. - - If member is not a member of the list, raise NotAMemberError. - """ - raise NotImplementedError - - - # - # The writeable interface - # - def addNewMember(self, member, **kws): - """Subscribes a new member to the mailing list. - - member is the case-preserved address to subscribe. The LCE is - calculated from this argument. Return the new member KEY. - - This method also takes a keyword dictionary which can be used to set - additional attributes on the member. The actual set of supported - keywords is adaptor specific, but should at least include: - - - digest == subscribing to digests instead of regular delivery - - password == user's password - - language == user's preferred language - - realname == user's full name (should be Unicode if there are - non-ASCII characters in the name) - - Any values not passed to **kws is set to the adaptor-specific - defaults. - - Raise AlreadyAMemberError it the member is already subscribed to the - list. Raises ValueError if **kws contains an invalid option. - """ - raise NotImplementedError - - def removeMember(self, memberkey): - """Unsubscribes the member from the mailing list. - - Raise NotAMemberError if member is not subscribed to the list. - """ - raise NotImplementedError - - def changeMemberAddress(self, memberkey, newaddress, nodelete=False): - """Change the address for the member KEY. - - memberkey will be a KEY, not an LCE. newaddress should be the - new case-preserved address for the member; the LCE will be calculated - from newaddress. - - If memberkey does not refer to a valid member, raise NotAMemberError. - No verification on the new address is done here (such assertions - should be performed by the caller). - - If nodelete flag is true, then the old membership is not removed. - """ - raise NotImplementedError - - def setMemberPassword(self, member, password): - """Set the password for member LCE/KEY. - - If member does not refer to a valid member, raise NotAMemberError. - """ - raise NotImplementedError - - def setMemberLanguage(self, member, language): - """Set the language for the member LCE/KEY. - - If member does not refer to a valid member, raise NotAMemberError. - """ - raise NotImplementedError - - def setMemberOption(self, member, flag, value): - """Set the option for the given member to value. - - member is an LCE/KEY, flag is one of the option flags defined in - Default.py, and value is a boolean. - - If member does not refer to a valid member, raise NotAMemberError. - """ - raise NotImplementedError - - def setMemberName(self, member, realname): - """Set the member's full name. - - member is an LCE/KEY and realname is an arbitrary string. It should - be a Unicode string if there are non-ASCII characters in the name. - NotAMemberError is raised if member does not refer to a valid member. - """ - raise NotImplementedError - - def setMemberTopics(self, member, topics): - """Add list of topics to member's interest. - - member is an LCE/KEY and realname is an arbitrary string. - NotAMemberError is raised if member does not refer to a valid member. - topics must be a sequence of strings. - """ - raise NotImplementedError - - def setDeliveryStatus(self, member, status): - """Set the delivery status of the member's address. - - Status must be one of the module constants: - - ENABLED - The deliveries to the user are not disabled - UNKNOWN - Deliveries are disabled for unknown reasons. The - primary reason for this to happen is that we've copied - their delivery status from a legacy version which didn't - keep track of disable reasons - BYUSER - The user explicitly disable deliveries - BYADMIN - The list administrator explicitly disabled deliveries - BYBOUNCE - The system disabled deliveries due to bouncing - - This method also records the time (in seconds since epoch) at which - the last status change was made. If the delivery status is changed to - ENABLED, then the change time information will be deleted. This value - is retrievable via getDeliveryStatusChangeTime(). - """ - raise NotImplementedError - - def setBounceInfo(self, member, info): - """Set the member's bounce information. - - When info is None, any bounce info for the member is cleared. - - Bounce info is opaque to the MemberAdaptor. It is set by this method - and returned by getBounceInfo() without modification. - """ - raise NotImplementedError |
