Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

constants.py 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. """Definitions for constants exported by OpenLDAP
  2. This file lists all constants we know about, even those that aren't
  3. available in the OpenLDAP version python-ldap is compiled against.
  4. The information serves two purposes:
  5. - Generate a C header with the constants
  6. - Provide support for building documentation without compiling python-ldap
  7. """
  8. # This module cannot import anything from ldap.
  9. # When building documentation, it is used to initialize ldap.__init__.
  10. from __future__ import print_function
  11. class Constant(object):
  12. """Base class for a definition of an OpenLDAP constant
  13. """
  14. def __init__(self, name, optional=False, requirements=(), doc=None):
  15. self.name = name
  16. if optional:
  17. self_requirement = 'defined(LDAP_{})'.format(self.name)
  18. requirements = list(requirements) + [self_requirement]
  19. self.requirements = requirements
  20. self.doc = self.__doc__ = doc
  21. class Error(Constant):
  22. """Definition for an OpenLDAP error code
  23. This is a constant at the C level; in Python errors are provided as
  24. exception classes.
  25. """
  26. c_template = 'add_err({self.name});'
  27. class Int(Constant):
  28. """Definition for an OpenLDAP integer constant"""
  29. c_template = 'add_int({self.name});'
  30. class TLSInt(Int):
  31. """Definition for a TLS integer constant -- requires HAVE_TLS"""
  32. def __init__(self, *args, **kwargs):
  33. requrements = list(kwargs.get('requirements', ()))
  34. kwargs['requirements'] = ['HAVE_TLS'] + requrements
  35. super(TLSInt, self).__init__(*args, **kwargs)
  36. class Feature(Constant):
  37. """Definition for a feature: 0 or 1 based on a C #ifdef
  38. """
  39. c_template = '\n'.join([
  40. '',
  41. '#ifdef {self.c_feature}',
  42. 'if (PyModule_AddIntConstant(m, "{self.name}", 1) != 0) return -1;',
  43. '#else',
  44. 'if (PyModule_AddIntConstant(m, "{self.name}", 0) != 0) return -1;',
  45. '#endif',
  46. '',
  47. ])
  48. def __init__(self, name, c_feature, **kwargs):
  49. super(Feature, self).__init__(name, **kwargs)
  50. self.c_feature = c_feature
  51. class Str(Constant):
  52. c_template = 'add_string({self.name});'
  53. API_2004 = 'LDAP_API_VERSION >= 2004'
  54. CONSTANTS = (
  55. Error('ADMINLIMIT_EXCEEDED'),
  56. Error('AFFECTS_MULTIPLE_DSAS'),
  57. Error('ALIAS_DEREF_PROBLEM'),
  58. Error('ALIAS_PROBLEM'),
  59. Error('ALREADY_EXISTS'),
  60. Error('AUTH_METHOD_NOT_SUPPORTED'),
  61. Error('AUTH_UNKNOWN'),
  62. Error('BUSY'),
  63. Error('CLIENT_LOOP'),
  64. Error('COMPARE_FALSE'),
  65. Error('COMPARE_TRUE'),
  66. Error('CONFIDENTIALITY_REQUIRED'),
  67. Error('CONNECT_ERROR'),
  68. Error('CONSTRAINT_VIOLATION'),
  69. Error('CONTROL_NOT_FOUND'),
  70. Error('DECODING_ERROR'),
  71. Error('ENCODING_ERROR'),
  72. Error('FILTER_ERROR'),
  73. Error('INAPPROPRIATE_AUTH'),
  74. Error('INAPPROPRIATE_MATCHING'),
  75. Error('INSUFFICIENT_ACCESS'),
  76. Error('INVALID_CREDENTIALS'),
  77. Error('INVALID_DN_SYNTAX'),
  78. Error('INVALID_SYNTAX'),
  79. Error('IS_LEAF'),
  80. Error('LOCAL_ERROR'),
  81. Error('LOOP_DETECT'),
  82. Error('MORE_RESULTS_TO_RETURN'),
  83. Error('NAMING_VIOLATION'),
  84. Error('NO_MEMORY'),
  85. Error('NO_OBJECT_CLASS_MODS'),
  86. Error('NO_OBJECT_CLASS_MODS'),
  87. Error('NO_RESULTS_RETURNED'),
  88. Error('NO_SUCH_ATTRIBUTE'),
  89. Error('NO_SUCH_OBJECT'),
  90. Error('NOT_ALLOWED_ON_NONLEAF'),
  91. Error('NOT_ALLOWED_ON_RDN'),
  92. Error('NOT_SUPPORTED'),
  93. Error('OBJECT_CLASS_VIOLATION'),
  94. Error('OPERATIONS_ERROR'),
  95. Error('OTHER'),
  96. Error('PARAM_ERROR'),
  97. Error('PARTIAL_RESULTS'),
  98. Error('PROTOCOL_ERROR'),
  99. Error('REFERRAL'),
  100. Error('REFERRAL_LIMIT_EXCEEDED'),
  101. Error('RESULTS_TOO_LARGE'),
  102. Error('SASL_BIND_IN_PROGRESS'),
  103. Error('SERVER_DOWN'),
  104. Error('SIZELIMIT_EXCEEDED'),
  105. Error('STRONG_AUTH_NOT_SUPPORTED'),
  106. Error('STRONG_AUTH_REQUIRED'),
  107. Error('SUCCESS'),
  108. Error('TIMELIMIT_EXCEEDED'),
  109. Error('TIMEOUT'),
  110. Error('TYPE_OR_VALUE_EXISTS'),
  111. Error('UNAVAILABLE'),
  112. Error('UNAVAILABLE_CRITICAL_EXTENSION'),
  113. Error('UNDEFINED_TYPE'),
  114. Error('UNWILLING_TO_PERFORM'),
  115. Error('USER_CANCELLED'),
  116. Error('VLV_ERROR'),
  117. Error('X_PROXY_AUTHZ_FAILURE'),
  118. Error('CANCELLED', requirements=['defined(LDAP_API_FEATURE_CANCEL)']),
  119. Error('NO_SUCH_OPERATION', requirements=['defined(LDAP_API_FEATURE_CANCEL)']),
  120. Error('TOO_LATE', requirements=['defined(LDAP_API_FEATURE_CANCEL)']),
  121. Error('CANNOT_CANCEL', requirements=['defined(LDAP_API_FEATURE_CANCEL)']),
  122. Error('ASSERTION_FAILED', optional=True),
  123. Error('PROXIED_AUTHORIZATION_DENIED', optional=True),
  124. # simple constants
  125. Int('API_VERSION'),
  126. Int('VENDOR_VERSION'),
  127. Int('PORT'),
  128. Int('VERSION1'),
  129. Int('VERSION2'),
  130. Int('VERSION3'),
  131. Int('VERSION_MIN'),
  132. Int('VERSION'),
  133. Int('VERSION_MAX'),
  134. Int('TAG_MESSAGE'),
  135. Int('TAG_MSGID'),
  136. Int('REQ_BIND'),
  137. Int('REQ_UNBIND'),
  138. Int('REQ_SEARCH'),
  139. Int('REQ_MODIFY'),
  140. Int('REQ_ADD'),
  141. Int('REQ_DELETE'),
  142. Int('REQ_MODRDN'),
  143. Int('REQ_COMPARE'),
  144. Int('REQ_ABANDON'),
  145. Int('TAG_LDAPDN'),
  146. Int('TAG_LDAPCRED'),
  147. Int('TAG_CONTROLS'),
  148. Int('TAG_REFERRAL'),
  149. Int('REQ_EXTENDED'),
  150. Int('TAG_NEWSUPERIOR', requirements=[API_2004]),
  151. Int('TAG_EXOP_REQ_OID', requirements=[API_2004]),
  152. Int('TAG_EXOP_REQ_VALUE', requirements=[API_2004]),
  153. Int('TAG_EXOP_RES_OID', requirements=[API_2004]),
  154. Int('TAG_EXOP_RES_VALUE', requirements=[API_2004]),
  155. Int('TAG_SASL_RES_CREDS', requirements=[API_2004, 'defined(HAVE_SASL)']),
  156. Int('SASL_AUTOMATIC'),
  157. Int('SASL_INTERACTIVE'),
  158. Int('SASL_QUIET'),
  159. # reversibles
  160. Int('RES_BIND'),
  161. Int('RES_SEARCH_ENTRY'),
  162. Int('RES_SEARCH_RESULT'),
  163. Int('RES_MODIFY'),
  164. Int('RES_ADD'),
  165. Int('RES_DELETE'),
  166. Int('RES_MODRDN'),
  167. Int('RES_COMPARE'),
  168. Int('RES_ANY'),
  169. Int('RES_SEARCH_REFERENCE'),
  170. Int('RES_EXTENDED'),
  171. Int('RES_UNSOLICITED'),
  172. Int('RES_INTERMEDIATE'),
  173. # non-reversibles
  174. Int('AUTH_NONE'),
  175. Int('AUTH_SIMPLE'),
  176. Int('SCOPE_BASE'),
  177. Int('SCOPE_ONELEVEL'),
  178. Int('SCOPE_SUBTREE'),
  179. Int('SCOPE_SUBORDINATE', optional=True),
  180. Int('MOD_ADD'),
  181. Int('MOD_DELETE'),
  182. Int('MOD_REPLACE'),
  183. Int('MOD_INCREMENT'),
  184. Int('MOD_BVALUES'),
  185. Int('MSG_ONE'),
  186. Int('MSG_ALL'),
  187. Int('MSG_RECEIVED'),
  188. # (error constants handled above)
  189. Int('DEREF_NEVER'),
  190. Int('DEREF_SEARCHING'),
  191. Int('DEREF_FINDING'),
  192. Int('DEREF_ALWAYS'),
  193. Int('NO_LIMIT'),
  194. Int('OPT_API_INFO'),
  195. Int('OPT_DEREF'),
  196. Int('OPT_SIZELIMIT'),
  197. Int('OPT_TIMELIMIT'),
  198. Int('OPT_REFERRALS', optional=True),
  199. Int('OPT_ERROR_NUMBER'),
  200. Int('OPT_RESTART'),
  201. Int('OPT_PROTOCOL_VERSION'),
  202. Int('OPT_SERVER_CONTROLS'),
  203. Int('OPT_CLIENT_CONTROLS'),
  204. Int('OPT_API_FEATURE_INFO'),
  205. Int('OPT_HOST_NAME'),
  206. Int('OPT_DESC'),
  207. Int('OPT_DIAGNOSTIC_MESSAGE'),
  208. Int('OPT_ERROR_STRING'),
  209. Int('OPT_MATCHED_DN'),
  210. Int('OPT_DEBUG_LEVEL'),
  211. Int('OPT_TIMEOUT'),
  212. Int('OPT_REFHOPLIMIT'),
  213. Int('OPT_NETWORK_TIMEOUT'),
  214. Int('OPT_URI'),
  215. Int('OPT_DEFBASE', optional=True),
  216. TLSInt('OPT_X_TLS', optional=True),
  217. TLSInt('OPT_X_TLS_CTX'),
  218. TLSInt('OPT_X_TLS_CACERTFILE'),
  219. TLSInt('OPT_X_TLS_CACERTDIR'),
  220. TLSInt('OPT_X_TLS_CERTFILE'),
  221. TLSInt('OPT_X_TLS_KEYFILE'),
  222. TLSInt('OPT_X_TLS_REQUIRE_CERT'),
  223. TLSInt('OPT_X_TLS_CIPHER_SUITE'),
  224. TLSInt('OPT_X_TLS_RANDOM_FILE'),
  225. TLSInt('OPT_X_TLS_DHFILE'),
  226. TLSInt('OPT_X_TLS_NEVER'),
  227. TLSInt('OPT_X_TLS_HARD'),
  228. TLSInt('OPT_X_TLS_DEMAND'),
  229. TLSInt('OPT_X_TLS_ALLOW'),
  230. TLSInt('OPT_X_TLS_TRY'),
  231. TLSInt('OPT_X_TLS_PEERCERT', optional=True),
  232. TLSInt('OPT_X_TLS_VERSION', optional=True),
  233. TLSInt('OPT_X_TLS_CIPHER', optional=True),
  234. TLSInt('OPT_X_TLS_PEERCERT', optional=True),
  235. # only available if OpenSSL supports it => might cause
  236. # backward compatibility problems
  237. TLSInt('OPT_X_TLS_CRLCHECK', optional=True),
  238. TLSInt('OPT_X_TLS_CRLFILE', optional=True),
  239. TLSInt('OPT_X_TLS_CRL_NONE'),
  240. TLSInt('OPT_X_TLS_CRL_PEER'),
  241. TLSInt('OPT_X_TLS_CRL_ALL'),
  242. TLSInt('OPT_X_TLS_NEWCTX', optional=True),
  243. TLSInt('OPT_X_TLS_PROTOCOL_MIN', optional=True),
  244. TLSInt('OPT_X_TLS_PACKAGE', optional=True),
  245. Int('OPT_X_SASL_MECH'),
  246. Int('OPT_X_SASL_REALM'),
  247. Int('OPT_X_SASL_AUTHCID'),
  248. Int('OPT_X_SASL_AUTHZID'),
  249. Int('OPT_X_SASL_SSF'),
  250. Int('OPT_X_SASL_SSF_EXTERNAL'),
  251. Int('OPT_X_SASL_SECPROPS'),
  252. Int('OPT_X_SASL_SSF_MIN'),
  253. Int('OPT_X_SASL_SSF_MAX'),
  254. Int('OPT_X_SASL_NOCANON', optional=True),
  255. Int('OPT_X_SASL_USERNAME', optional=True),
  256. Int('OPT_CONNECT_ASYNC', optional=True),
  257. Int('OPT_X_KEEPALIVE_IDLE', optional=True),
  258. Int('OPT_X_KEEPALIVE_PROBES', optional=True),
  259. Int('OPT_X_KEEPALIVE_INTERVAL', optional=True),
  260. Int('DN_FORMAT_LDAP'),
  261. Int('DN_FORMAT_LDAPV3'),
  262. Int('DN_FORMAT_LDAPV2'),
  263. Int('DN_FORMAT_DCE'),
  264. Int('DN_FORMAT_UFN'),
  265. Int('DN_FORMAT_AD_CANONICAL'),
  266. # Int('DN_FORMAT_LBER'), # for testing only
  267. Int('DN_FORMAT_MASK'),
  268. Int('DN_PRETTY'),
  269. Int('DN_SKIP'),
  270. Int('DN_P_NOLEADTRAILSPACES'),
  271. Int('DN_P_NOSPACEAFTERRDN'),
  272. Int('DN_PEDANTIC'),
  273. Int('AVA_NULL'),
  274. Int('AVA_STRING'),
  275. Int('AVA_BINARY'),
  276. Int('AVA_NONPRINTABLE'),
  277. Int('OPT_SUCCESS'),
  278. # XXX - these should be errors
  279. Int('URL_ERR_BADSCOPE'),
  280. Int('URL_ERR_MEM'),
  281. # Int('LIBLDAP_R'),
  282. Feature('LIBLDAP_R', 'HAVE_LIBLDAP_R'),
  283. Feature('SASL_AVAIL', 'HAVE_SASL'),
  284. Feature('TLS_AVAIL', 'HAVE_TLS'),
  285. Str("CONTROL_MANAGEDSAIT"),
  286. Str("CONTROL_PROXY_AUTHZ"),
  287. Str("CONTROL_SUBENTRIES"),
  288. Str("CONTROL_VALUESRETURNFILTER"),
  289. Str("CONTROL_ASSERT"),
  290. Str("CONTROL_PRE_READ"),
  291. Str("CONTROL_POST_READ"),
  292. Str("CONTROL_SORTREQUEST"),
  293. Str("CONTROL_SORTRESPONSE"),
  294. Str("CONTROL_PAGEDRESULTS"),
  295. Str("CONTROL_SYNC"),
  296. Str("CONTROL_SYNC_STATE"),
  297. Str("CONTROL_SYNC_DONE"),
  298. Str("SYNC_INFO"),
  299. Str("CONTROL_PASSWORDPOLICYREQUEST"),
  300. Str("CONTROL_PASSWORDPOLICYRESPONSE"),
  301. Str("CONTROL_RELAX"),
  302. )
  303. def print_header(): # pragma: no cover
  304. """Print the C header file to standard output"""
  305. print('/*')
  306. print(' * Generated with:')
  307. print(' * python Lib/ldap/constants.py > Modules/constants_generated.h')
  308. print(' *')
  309. print(' * Please do any modifications there, then re-generate this file')
  310. print(' */')
  311. print('')
  312. current_requirements = []
  313. def pop_requirement():
  314. popped = current_requirements.pop()
  315. print('#endif')
  316. print()
  317. for definition in CONSTANTS:
  318. while not set(current_requirements).issubset(definition.requirements):
  319. pop_requirement()
  320. for requirement in definition.requirements:
  321. if requirement not in current_requirements:
  322. current_requirements.append(requirement)
  323. print()
  324. print('#if {}'.format(requirement))
  325. print(definition.c_template.format(self=definition))
  326. while current_requirements:
  327. pop_requirement()
  328. if __name__ == '__main__':
  329. print_header()