# Copyright (C) 2001 Tommi Virtanen
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of version 2.1 of the GNU Lesser General Public
# License as published by the Free Software Foundation.
#
# This library 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# make pyflakes not complain about undefined names
reverse = None
LDAPOther = None
[docs]def get(resultCode, errorMessage):
"""Get an instance of the correct exception for this resultCode."""
klass = reverse.get(resultCode)
if klass is not None:
return klass(errorMessage)
else:
return LDAPUnknownError(resultCode, errorMessage)
[docs]class LDAPResult:
resultCode=None
name=None
[docs]class Success(LDAPResult):
resultCode=0
name='success'
def __init__(self, msg):
pass
[docs]class LDAPException(Exception, LDAPResult):
def _get_message(self): return self.__message
def _set_message(self, value): self.__message = value
message = property(_get_message, _set_message)
def __init__(self, message=None):
Exception.__init__(self)
self.message=message
def __str__(self):
message=self.message
if message:
return '%s: %s' % (self.name, message)
elif self.name:
return self.name
else:
return 'Unknown LDAP error %r' % self
[docs]class LDAPUnknownError(LDAPException):
resultCode=None
def __init__(self, resultCode, message=None):
assert resultCode not in reverse, \
"resultCode %r must be unknown" % resultCode
self.code=resultCode
LDAPException.__init__(self, message)
def __str__(self):
codeName='unknownError(%d)'%self.code
if self.message:
return '%s: %s' % (codeName, self.message)
else:
return codeName
import new
[docs]def init(**errors):
global reverse
reverse = {}
for name, value in errors.items():
if value == errors['success']:
klass = Success
else:
classname = 'LDAP'+name[0].upper()+name[1:]
klass = new.classobj(classname,
(LDAPException,),
{ 'resultCode': value,
'name': name,
})
globals()[classname] = klass
reverse[value] = klass
init(
success=0,
operationsError=1,
protocolError=2,
timeLimitExceeded=3,
sizeLimitExceeded=4,
compareFalse=5,
compareTrue=6,
authMethodNotSupported=7,
strongAuthRequired=8,
# 9 reserved
referral=10 ,
adminLimitExceeded=11 ,
unavailableCriticalExtension=12 ,
confidentialityRequired=13 ,
saslBindInProgress=14 ,
noSuchAttribute=16,
undefinedAttributeType=17,
inappropriateMatching=18,
constraintViolation=19,
attributeOrValueExists=20,
invalidAttributeSyntax=21,
# 22-31 unused
noSuchObject=32,
aliasProblem=33,
invalidDNSyntax=34,
# 35 reserved for undefined isLeaf
aliasDereferencingProblem=36,
# 37-47 unused
inappropriateAuthentication=48,
invalidCredentials=49,
insufficientAccessRights=50,
busy=51,
unavailable=52,
unwillingToPerform=53,
loopDetect=54,
# 55-63 unused
namingViolation=64,
objectClassViolation=65,
notAllowedOnNonLeaf=66,
notAllowedOnRDN=67,
entryAlreadyExists=68,
objectClassModsProhibited=69,
# 70 reserved for CLDAP
affectsMultipleDSAs=71,
# 72-79 unused
other=80,
# 81-90 reserved for APIs
)
other=LDAPOther.resultCode