405 lines
11 KiB
Python
405 lines
11 KiB
Python
"""Definitions for constants exported by OpenLDAP
|
|
|
|
This file lists all constants we know about, even those that aren't
|
|
available in the OpenLDAP version python-ldap is compiled against.
|
|
|
|
The information serves two purposes:
|
|
|
|
- Generate a C header with the constants
|
|
- Provide support for building documentation without compiling python-ldap
|
|
|
|
"""
|
|
|
|
# This module cannot import anything from ldap.
|
|
# When building documentation, it is used to initialize ldap.__init__.
|
|
|
|
from __future__ import print_function
|
|
|
|
class Constant(object):
|
|
"""Base class for a definition of an OpenLDAP constant
|
|
"""
|
|
|
|
def __init__(self, name, optional=False, requirements=(), doc=None):
|
|
self.name = name
|
|
if optional:
|
|
self_requirement = 'defined(LDAP_{})'.format(self.name)
|
|
requirements = list(requirements) + [self_requirement]
|
|
self.requirements = requirements
|
|
self.doc = self.__doc__ = doc
|
|
|
|
|
|
class Error(Constant):
|
|
"""Definition for an OpenLDAP error code
|
|
|
|
This is a constant at the C level; in Python errors are provided as
|
|
exception classes.
|
|
"""
|
|
|
|
c_template = 'add_err({self.name});'
|
|
|
|
|
|
class Int(Constant):
|
|
"""Definition for an OpenLDAP integer constant"""
|
|
|
|
c_template = 'add_int({self.name});'
|
|
|
|
|
|
class TLSInt(Int):
|
|
"""Definition for a TLS integer constant -- requires HAVE_TLS"""
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
requrements = list(kwargs.get('requirements', ()))
|
|
kwargs['requirements'] = ['HAVE_TLS'] + requrements
|
|
super(TLSInt, self).__init__(*args, **kwargs)
|
|
|
|
|
|
class Feature(Constant):
|
|
"""Definition for a feature: 0 or 1 based on a C #ifdef
|
|
|
|
"""
|
|
|
|
c_template = '\n'.join([
|
|
'',
|
|
'#ifdef {self.c_feature}',
|
|
'if (PyModule_AddIntConstant(m, "{self.name}", 1) != 0) return -1;',
|
|
'#else',
|
|
'if (PyModule_AddIntConstant(m, "{self.name}", 0) != 0) return -1;',
|
|
'#endif',
|
|
'',
|
|
])
|
|
|
|
|
|
def __init__(self, name, c_feature, **kwargs):
|
|
super(Feature, self).__init__(name, **kwargs)
|
|
self.c_feature = c_feature
|
|
|
|
|
|
class Str(Constant):
|
|
c_template = 'add_string({self.name});'
|
|
|
|
|
|
API_2004 = 'LDAP_API_VERSION >= 2004'
|
|
|
|
CONSTANTS = (
|
|
Error('ADMINLIMIT_EXCEEDED'),
|
|
Error('AFFECTS_MULTIPLE_DSAS'),
|
|
Error('ALIAS_DEREF_PROBLEM'),
|
|
Error('ALIAS_PROBLEM'),
|
|
Error('ALREADY_EXISTS'),
|
|
Error('AUTH_METHOD_NOT_SUPPORTED'),
|
|
Error('AUTH_UNKNOWN'),
|
|
Error('BUSY'),
|
|
Error('CLIENT_LOOP'),
|
|
Error('COMPARE_FALSE'),
|
|
Error('COMPARE_TRUE'),
|
|
Error('CONFIDENTIALITY_REQUIRED'),
|
|
Error('CONNECT_ERROR'),
|
|
Error('CONSTRAINT_VIOLATION'),
|
|
Error('CONTROL_NOT_FOUND'),
|
|
Error('DECODING_ERROR'),
|
|
Error('ENCODING_ERROR'),
|
|
Error('FILTER_ERROR'),
|
|
Error('INAPPROPRIATE_AUTH'),
|
|
Error('INAPPROPRIATE_MATCHING'),
|
|
Error('INSUFFICIENT_ACCESS'),
|
|
Error('INVALID_CREDENTIALS'),
|
|
Error('INVALID_DN_SYNTAX'),
|
|
Error('INVALID_SYNTAX'),
|
|
Error('IS_LEAF'),
|
|
Error('LOCAL_ERROR'),
|
|
Error('LOOP_DETECT'),
|
|
Error('MORE_RESULTS_TO_RETURN'),
|
|
Error('NAMING_VIOLATION'),
|
|
Error('NO_MEMORY'),
|
|
Error('NO_OBJECT_CLASS_MODS'),
|
|
Error('NO_OBJECT_CLASS_MODS'),
|
|
Error('NO_RESULTS_RETURNED'),
|
|
Error('NO_SUCH_ATTRIBUTE'),
|
|
Error('NO_SUCH_OBJECT'),
|
|
Error('NOT_ALLOWED_ON_NONLEAF'),
|
|
Error('NOT_ALLOWED_ON_RDN'),
|
|
Error('NOT_SUPPORTED'),
|
|
Error('OBJECT_CLASS_VIOLATION'),
|
|
Error('OPERATIONS_ERROR'),
|
|
Error('OTHER'),
|
|
Error('PARAM_ERROR'),
|
|
Error('PARTIAL_RESULTS'),
|
|
Error('PROTOCOL_ERROR'),
|
|
Error('REFERRAL'),
|
|
Error('REFERRAL_LIMIT_EXCEEDED'),
|
|
Error('RESULTS_TOO_LARGE'),
|
|
Error('SASL_BIND_IN_PROGRESS'),
|
|
Error('SERVER_DOWN'),
|
|
Error('SIZELIMIT_EXCEEDED'),
|
|
Error('STRONG_AUTH_NOT_SUPPORTED'),
|
|
Error('STRONG_AUTH_REQUIRED'),
|
|
Error('SUCCESS'),
|
|
Error('TIMELIMIT_EXCEEDED'),
|
|
Error('TIMEOUT'),
|
|
Error('TYPE_OR_VALUE_EXISTS'),
|
|
Error('UNAVAILABLE'),
|
|
Error('UNAVAILABLE_CRITICAL_EXTENSION'),
|
|
Error('UNDEFINED_TYPE'),
|
|
Error('UNWILLING_TO_PERFORM'),
|
|
Error('USER_CANCELLED'),
|
|
Error('VLV_ERROR'),
|
|
Error('X_PROXY_AUTHZ_FAILURE'),
|
|
|
|
Error('CANCELLED', requirements=['defined(LDAP_API_FEATURE_CANCEL)']),
|
|
Error('NO_SUCH_OPERATION', requirements=['defined(LDAP_API_FEATURE_CANCEL)']),
|
|
Error('TOO_LATE', requirements=['defined(LDAP_API_FEATURE_CANCEL)']),
|
|
Error('CANNOT_CANCEL', requirements=['defined(LDAP_API_FEATURE_CANCEL)']),
|
|
|
|
Error('ASSERTION_FAILED', optional=True),
|
|
|
|
Error('PROXIED_AUTHORIZATION_DENIED', optional=True),
|
|
|
|
# simple constants
|
|
|
|
Int('API_VERSION'),
|
|
Int('VENDOR_VERSION'),
|
|
|
|
Int('PORT'),
|
|
Int('VERSION1'),
|
|
Int('VERSION2'),
|
|
Int('VERSION3'),
|
|
Int('VERSION_MIN'),
|
|
Int('VERSION'),
|
|
Int('VERSION_MAX'),
|
|
Int('TAG_MESSAGE'),
|
|
Int('TAG_MSGID'),
|
|
|
|
Int('REQ_BIND'),
|
|
Int('REQ_UNBIND'),
|
|
Int('REQ_SEARCH'),
|
|
Int('REQ_MODIFY'),
|
|
Int('REQ_ADD'),
|
|
Int('REQ_DELETE'),
|
|
Int('REQ_MODRDN'),
|
|
Int('REQ_COMPARE'),
|
|
Int('REQ_ABANDON'),
|
|
|
|
Int('TAG_LDAPDN'),
|
|
Int('TAG_LDAPCRED'),
|
|
Int('TAG_CONTROLS'),
|
|
Int('TAG_REFERRAL'),
|
|
|
|
Int('REQ_EXTENDED'),
|
|
Int('TAG_NEWSUPERIOR', requirements=[API_2004]),
|
|
Int('TAG_EXOP_REQ_OID', requirements=[API_2004]),
|
|
Int('TAG_EXOP_REQ_VALUE', requirements=[API_2004]),
|
|
Int('TAG_EXOP_RES_OID', requirements=[API_2004]),
|
|
Int('TAG_EXOP_RES_VALUE', requirements=[API_2004]),
|
|
Int('TAG_SASL_RES_CREDS', requirements=[API_2004, 'defined(HAVE_SASL)']),
|
|
|
|
Int('SASL_AUTOMATIC'),
|
|
Int('SASL_INTERACTIVE'),
|
|
Int('SASL_QUIET'),
|
|
|
|
# reversibles
|
|
|
|
Int('RES_BIND'),
|
|
Int('RES_SEARCH_ENTRY'),
|
|
Int('RES_SEARCH_RESULT'),
|
|
Int('RES_MODIFY'),
|
|
Int('RES_ADD'),
|
|
Int('RES_DELETE'),
|
|
Int('RES_MODRDN'),
|
|
Int('RES_COMPARE'),
|
|
Int('RES_ANY'),
|
|
|
|
Int('RES_SEARCH_REFERENCE'),
|
|
Int('RES_EXTENDED'),
|
|
Int('RES_UNSOLICITED'),
|
|
|
|
Int('RES_INTERMEDIATE'),
|
|
|
|
# non-reversibles
|
|
|
|
Int('AUTH_NONE'),
|
|
Int('AUTH_SIMPLE'),
|
|
Int('SCOPE_BASE'),
|
|
Int('SCOPE_ONELEVEL'),
|
|
Int('SCOPE_SUBTREE'),
|
|
Int('SCOPE_SUBORDINATE', optional=True),
|
|
Int('MOD_ADD'),
|
|
Int('MOD_DELETE'),
|
|
Int('MOD_REPLACE'),
|
|
Int('MOD_INCREMENT'),
|
|
Int('MOD_BVALUES'),
|
|
|
|
Int('MSG_ONE'),
|
|
Int('MSG_ALL'),
|
|
Int('MSG_RECEIVED'),
|
|
|
|
# (error constants handled above)
|
|
|
|
Int('DEREF_NEVER'),
|
|
Int('DEREF_SEARCHING'),
|
|
Int('DEREF_FINDING'),
|
|
Int('DEREF_ALWAYS'),
|
|
Int('NO_LIMIT'),
|
|
|
|
Int('OPT_API_INFO'),
|
|
Int('OPT_DEREF'),
|
|
Int('OPT_SIZELIMIT'),
|
|
Int('OPT_TIMELIMIT'),
|
|
Int('OPT_REFERRALS', optional=True),
|
|
Int('OPT_ERROR_NUMBER'),
|
|
Int('OPT_RESTART'),
|
|
Int('OPT_PROTOCOL_VERSION'),
|
|
Int('OPT_SERVER_CONTROLS'),
|
|
Int('OPT_CLIENT_CONTROLS'),
|
|
Int('OPT_API_FEATURE_INFO'),
|
|
Int('OPT_HOST_NAME'),
|
|
|
|
Int('OPT_DESC'),
|
|
Int('OPT_DIAGNOSTIC_MESSAGE'),
|
|
|
|
Int('OPT_ERROR_STRING'),
|
|
Int('OPT_MATCHED_DN'),
|
|
Int('OPT_DEBUG_LEVEL'),
|
|
Int('OPT_TIMEOUT'),
|
|
Int('OPT_REFHOPLIMIT'),
|
|
Int('OPT_NETWORK_TIMEOUT'),
|
|
Int('OPT_URI'),
|
|
|
|
Int('OPT_DEFBASE', optional=True),
|
|
|
|
TLSInt('OPT_X_TLS', optional=True),
|
|
TLSInt('OPT_X_TLS_CTX'),
|
|
TLSInt('OPT_X_TLS_CACERTFILE'),
|
|
TLSInt('OPT_X_TLS_CACERTDIR'),
|
|
TLSInt('OPT_X_TLS_CERTFILE'),
|
|
TLSInt('OPT_X_TLS_KEYFILE'),
|
|
TLSInt('OPT_X_TLS_REQUIRE_CERT'),
|
|
TLSInt('OPT_X_TLS_CIPHER_SUITE'),
|
|
TLSInt('OPT_X_TLS_RANDOM_FILE'),
|
|
TLSInt('OPT_X_TLS_DHFILE'),
|
|
TLSInt('OPT_X_TLS_NEVER'),
|
|
TLSInt('OPT_X_TLS_HARD'),
|
|
TLSInt('OPT_X_TLS_DEMAND'),
|
|
TLSInt('OPT_X_TLS_ALLOW'),
|
|
TLSInt('OPT_X_TLS_TRY'),
|
|
|
|
TLSInt('OPT_X_TLS_VERSION', optional=True),
|
|
TLSInt('OPT_X_TLS_CIPHER', optional=True),
|
|
TLSInt('OPT_X_TLS_PEERCERT', optional=True),
|
|
|
|
# only available if OpenSSL supports it => might cause
|
|
# backward compatibility problems
|
|
TLSInt('OPT_X_TLS_CRLCHECK', optional=True),
|
|
|
|
TLSInt('OPT_X_TLS_CRLFILE', optional=True),
|
|
|
|
TLSInt('OPT_X_TLS_CRL_NONE'),
|
|
TLSInt('OPT_X_TLS_CRL_PEER'),
|
|
TLSInt('OPT_X_TLS_CRL_ALL'),
|
|
TLSInt('OPT_X_TLS_NEWCTX', optional=True),
|
|
TLSInt('OPT_X_TLS_PROTOCOL_MIN', optional=True),
|
|
TLSInt('OPT_X_TLS_PACKAGE', optional=True),
|
|
|
|
Int('OPT_X_SASL_MECH'),
|
|
Int('OPT_X_SASL_REALM'),
|
|
Int('OPT_X_SASL_AUTHCID'),
|
|
Int('OPT_X_SASL_AUTHZID'),
|
|
Int('OPT_X_SASL_SSF'),
|
|
Int('OPT_X_SASL_SSF_EXTERNAL'),
|
|
Int('OPT_X_SASL_SECPROPS'),
|
|
Int('OPT_X_SASL_SSF_MIN'),
|
|
Int('OPT_X_SASL_SSF_MAX'),
|
|
Int('OPT_X_SASL_NOCANON', optional=True),
|
|
Int('OPT_X_SASL_USERNAME', optional=True),
|
|
Int('OPT_CONNECT_ASYNC', optional=True),
|
|
Int('OPT_X_KEEPALIVE_IDLE', optional=True),
|
|
Int('OPT_X_KEEPALIVE_PROBES', optional=True),
|
|
Int('OPT_X_KEEPALIVE_INTERVAL', optional=True),
|
|
|
|
Int('DN_FORMAT_LDAP'),
|
|
Int('DN_FORMAT_LDAPV3'),
|
|
Int('DN_FORMAT_LDAPV2'),
|
|
Int('DN_FORMAT_DCE'),
|
|
Int('DN_FORMAT_UFN'),
|
|
Int('DN_FORMAT_AD_CANONICAL'),
|
|
# Int('DN_FORMAT_LBER'), # for testing only
|
|
Int('DN_FORMAT_MASK'),
|
|
Int('DN_PRETTY'),
|
|
Int('DN_SKIP'),
|
|
Int('DN_P_NOLEADTRAILSPACES'),
|
|
Int('DN_P_NOSPACEAFTERRDN'),
|
|
Int('DN_PEDANTIC'),
|
|
|
|
Int('AVA_NULL'),
|
|
Int('AVA_STRING'),
|
|
Int('AVA_BINARY'),
|
|
Int('AVA_NONPRINTABLE'),
|
|
|
|
Int('OPT_SUCCESS'),
|
|
|
|
# XXX - these should be errors
|
|
Int('URL_ERR_BADSCOPE'),
|
|
Int('URL_ERR_MEM'),
|
|
# Int('LIBLDAP_R'),
|
|
|
|
Feature('LIBLDAP_R', 'HAVE_LIBLDAP_R'),
|
|
Feature('SASL_AVAIL', 'HAVE_SASL'),
|
|
Feature('TLS_AVAIL', 'HAVE_TLS'),
|
|
Feature('INIT_FD_AVAIL', 'HAVE_LDAP_INIT_FD'),
|
|
|
|
Str("CONTROL_MANAGEDSAIT"),
|
|
Str("CONTROL_PROXY_AUTHZ"),
|
|
Str("CONTROL_SUBENTRIES"),
|
|
Str("CONTROL_VALUESRETURNFILTER"),
|
|
Str("CONTROL_ASSERT"),
|
|
Str("CONTROL_PRE_READ"),
|
|
Str("CONTROL_POST_READ"),
|
|
Str("CONTROL_SORTREQUEST"),
|
|
Str("CONTROL_SORTRESPONSE"),
|
|
Str("CONTROL_PAGEDRESULTS"),
|
|
Str("CONTROL_SYNC"),
|
|
Str("CONTROL_SYNC_STATE"),
|
|
Str("CONTROL_SYNC_DONE"),
|
|
Str("SYNC_INFO"),
|
|
Str("CONTROL_PASSWORDPOLICYREQUEST"),
|
|
Str("CONTROL_PASSWORDPOLICYRESPONSE"),
|
|
Str("CONTROL_RELAX"),
|
|
)
|
|
|
|
|
|
def print_header(): # pragma: no cover
|
|
"""Print the C header file to standard output"""
|
|
|
|
print('/*')
|
|
print(' * Generated with:')
|
|
print(' * python Lib/ldap/constants.py > Modules/constants_generated.h')
|
|
print(' *')
|
|
print(' * Please do any modifications there, then re-generate this file')
|
|
print(' */')
|
|
print('')
|
|
|
|
current_requirements = []
|
|
|
|
def pop_requirement():
|
|
popped = current_requirements.pop()
|
|
print('#endif')
|
|
print()
|
|
|
|
for definition in CONSTANTS:
|
|
while not set(current_requirements).issubset(definition.requirements):
|
|
pop_requirement()
|
|
|
|
for requirement in definition.requirements:
|
|
if requirement not in current_requirements:
|
|
current_requirements.append(requirement)
|
|
print()
|
|
print('#if {}'.format(requirement))
|
|
|
|
print(definition.c_template.format(self=definition))
|
|
|
|
while current_requirements:
|
|
pop_requirement()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
print_header()
|