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.
 
 
 
 

300 lines
15 KiB

  1. """
  2. """
  3. # Created on 2016.08.31
  4. #
  5. # Author: Giovanni Cannata
  6. #
  7. # Copyright 2013 - 2020 Giovanni Cannata
  8. #
  9. # This file is part of ldap3.
  10. #
  11. # ldap3 is free software: you can redistribute it and/or modify
  12. # it under the terms of the GNU Lesser General Public License as published
  13. # by the Free Software Foundation, either version 3 of the License, or
  14. # (at your option) any later version.
  15. #
  16. # ldap3 is distributed in the hope that it will be useful,
  17. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. # GNU Lesser General Public License for more details.
  20. #
  21. # You should have received a copy of the GNU Lesser General Public License
  22. # along with ldap3 in the COPYING and COPYING.LESSER files.
  23. # If not, see <http://www.gnu.org/licenses/>.
  24. from sys import stdin, getdefaultencoding
  25. from .. import ALL_ATTRIBUTES, ALL_OPERATIONAL_ATTRIBUTES, NO_ATTRIBUTES, SEQUENCE_TYPES
  26. from ..core.exceptions import LDAPConfigurationParameterError
  27. # checks
  28. _CLASSES_EXCLUDED_FROM_CHECK = ['subschema']
  29. _ATTRIBUTES_EXCLUDED_FROM_CHECK = [ALL_ATTRIBUTES,
  30. ALL_OPERATIONAL_ATTRIBUTES,
  31. NO_ATTRIBUTES,
  32. 'ldapSyntaxes',
  33. 'matchingRules',
  34. 'matchingRuleUse',
  35. 'dITContentRules',
  36. 'dITStructureRules',
  37. 'nameForms',
  38. 'altServer',
  39. 'namingContexts',
  40. 'supportedControl',
  41. 'supportedExtension',
  42. 'supportedFeatures',
  43. 'supportedCapabilities',
  44. 'supportedLdapVersion',
  45. 'supportedSASLMechanisms',
  46. 'vendorName',
  47. 'vendorVersion',
  48. 'subschemaSubentry',
  49. 'ACL']
  50. _UTF8_ENCODED_SYNTAXES = ['1.2.840.113556.1.4.904', # DN String [MICROSOFT]
  51. '1.2.840.113556.1.4.1362', # String (Case) [MICROSOFT]
  52. '1.3.6.1.4.1.1466.115.121.1.12', # DN String [RFC4517]
  53. '1.3.6.1.4.1.1466.115.121.1.15', # Directory String [RFC4517]
  54. '1.3.6.1.4.1.1466.115.121.1.41', # Postal Address) [RFC4517]
  55. '1.3.6.1.4.1.1466.115.121.1.58', # Substring Assertion [RFC4517]
  56. '2.16.840.1.113719.1.1.5.1.6', # Case Ignore List [NOVELL]
  57. '2.16.840.1.113719.1.1.5.1.14', # Tagged String [NOVELL]
  58. '2.16.840.1.113719.1.1.5.1.15', # Tagged Name and String [NOVELL]
  59. '2.16.840.1.113719.1.1.5.1.23', # Tagged Name [NOVELL]
  60. '2.16.840.1.113719.1.1.5.1.25'] # Typed Name [NOVELL]
  61. _UTF8_ENCODED_TYPES = []
  62. _ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF = ['msds-memberOfTransitive', 'msds-memberTransitive', 'entryDN']
  63. _IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF = ['instanceType', 'nTSecurityDescriptor', 'objectCategory']
  64. _CASE_INSENSITIVE_ATTRIBUTE_NAMES = True
  65. _CASE_INSENSITIVE_SCHEMA_NAMES = True
  66. # abstraction layer
  67. _ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX = 'OA_'
  68. # communication
  69. _POOLING_LOOP_TIMEOUT = 10 # number of seconds to wait before restarting a cycle to find an active server in the pool
  70. _RESPONSE_SLEEPTIME = 0.05 # seconds to wait while waiting for a response in asynchronous strategies
  71. _RESPONSE_WAITING_TIMEOUT = 20 # waiting timeout for receiving a response in asynchronous strategies
  72. _SOCKET_SIZE = 4096 # socket byte size
  73. _CHECK_AVAILABILITY_TIMEOUT = 2.5 # default timeout for socket connect when checking availability
  74. _RESET_AVAILABILITY_TIMEOUT = 5 # default timeout for resetting the availability status when checking candidate addresses
  75. _RESTARTABLE_SLEEPTIME = 2 # time to wait in a restartable strategy before retrying the request
  76. _RESTARTABLE_TRIES = 30 # number of times to retry in a restartable strategy before giving up. Set to True for unlimited retries
  77. _REUSABLE_THREADED_POOL_SIZE = 5
  78. _REUSABLE_THREADED_LIFETIME = 3600 # 1 hour
  79. _DEFAULT_THREADED_POOL_NAME = 'REUSABLE_DEFAULT_POOL'
  80. _ADDRESS_INFO_REFRESH_TIME = 300 # seconds to wait before refreshing address info from dns
  81. _ADDITIONAL_SERVER_ENCODINGS = ['latin-1', 'koi8-r'] # some broken LDAP implementation may have different encoding than those expected by RFCs
  82. _ADDITIONAL_CLIENT_ENCODINGS = ['utf-8']
  83. _IGNORE_MALFORMED_SCHEMA = False # some flaky LDAP servers returns malformed schema. If True no expection is raised and schema is thrown away
  84. _DEFAULT_SERVER_ENCODING = 'utf-8' # should always be utf-8
  85. _LDIF_LINE_LENGTH = 78 # as stated in RFC 2849
  86. if stdin and hasattr(stdin, 'encoding') and stdin.encoding:
  87. _DEFAULT_CLIENT_ENCODING = stdin.encoding
  88. elif getdefaultencoding():
  89. _DEFAULT_CLIENT_ENCODING = getdefaultencoding()
  90. else:
  91. _DEFAULT_CLIENT_ENCODING = 'utf-8'
  92. PARAMETERS = ['CASE_INSENSITIVE_ATTRIBUTE_NAMES',
  93. 'CASE_INSENSITIVE_SCHEMA_NAMES',
  94. 'ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX',
  95. 'POOLING_LOOP_TIMEOUT',
  96. 'RESPONSE_SLEEPTIME',
  97. 'RESPONSE_WAITING_TIMEOUT',
  98. 'SOCKET_SIZE',
  99. 'CHECK_AVAILABILITY_TIMEOUT',
  100. 'RESTARTABLE_SLEEPTIME',
  101. 'RESTARTABLE_TRIES',
  102. 'REUSABLE_THREADED_POOL_SIZE',
  103. 'REUSABLE_THREADED_LIFETIME',
  104. 'DEFAULT_THREADED_POOL_NAME',
  105. 'ADDRESS_INFO_REFRESH_TIME',
  106. 'RESET_AVAILABILITY_TIMEOUT',
  107. 'DEFAULT_CLIENT_ENCODING',
  108. 'DEFAULT_SERVER_ENCODING',
  109. 'CLASSES_EXCLUDED_FROM_CHECK',
  110. 'ATTRIBUTES_EXCLUDED_FROM_CHECK',
  111. 'UTF8_ENCODED_SYNTAXES',
  112. 'UTF8_ENCODED_TYPES',
  113. 'ADDITIONAL_SERVER_ENCODINGS',
  114. 'ADDITIONAL_CLIENT_ENCODINGS',
  115. 'IGNORE_MALFORMED_SCHEMA',
  116. 'ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF',
  117. 'IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF',
  118. 'LDIF_LINE_LENGTH'
  119. ]
  120. def get_config_parameter(parameter):
  121. if parameter == 'CASE_INSENSITIVE_ATTRIBUTE_NAMES': # Boolean
  122. return _CASE_INSENSITIVE_ATTRIBUTE_NAMES
  123. elif parameter == 'CASE_INSENSITIVE_SCHEMA_NAMES': # Boolean
  124. return _CASE_INSENSITIVE_SCHEMA_NAMES
  125. elif parameter == 'ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX': # String
  126. return _ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX
  127. elif parameter == 'POOLING_LOOP_TIMEOUT': # Integer
  128. return _POOLING_LOOP_TIMEOUT
  129. elif parameter == 'RESPONSE_SLEEPTIME': # Integer
  130. return _RESPONSE_SLEEPTIME
  131. elif parameter == 'RESPONSE_WAITING_TIMEOUT': # Integer
  132. return _RESPONSE_WAITING_TIMEOUT
  133. elif parameter == 'SOCKET_SIZE': # Integer
  134. return _SOCKET_SIZE
  135. elif parameter == 'CHECK_AVAILABILITY_TIMEOUT': # Integer
  136. return _CHECK_AVAILABILITY_TIMEOUT
  137. elif parameter == 'RESTARTABLE_SLEEPTIME': # Integer
  138. return _RESTARTABLE_SLEEPTIME
  139. elif parameter == 'RESTARTABLE_TRIES': # Integer
  140. return _RESTARTABLE_TRIES
  141. elif parameter == 'REUSABLE_THREADED_POOL_SIZE': # Integer
  142. return _REUSABLE_THREADED_POOL_SIZE
  143. elif parameter == 'REUSABLE_THREADED_LIFETIME': # Integer
  144. return _REUSABLE_THREADED_LIFETIME
  145. elif parameter == 'DEFAULT_THREADED_POOL_NAME': # String
  146. return _DEFAULT_THREADED_POOL_NAME
  147. elif parameter == 'ADDRESS_INFO_REFRESH_TIME': # Integer
  148. return _ADDRESS_INFO_REFRESH_TIME
  149. elif parameter == 'RESET_AVAILABILITY_TIMEOUT': # Integer
  150. return _RESET_AVAILABILITY_TIMEOUT
  151. elif parameter in ['DEFAULT_CLIENT_ENCODING', 'DEFAULT_ENCODING']: # String - DEFAULT_ENCODING for backward compatibility
  152. return _DEFAULT_CLIENT_ENCODING
  153. elif parameter == 'DEFAULT_SERVER_ENCODING': # String
  154. return _DEFAULT_SERVER_ENCODING
  155. elif parameter == 'CLASSES_EXCLUDED_FROM_CHECK': # Sequence
  156. if isinstance(_CLASSES_EXCLUDED_FROM_CHECK, SEQUENCE_TYPES):
  157. return _CLASSES_EXCLUDED_FROM_CHECK
  158. else:
  159. return [_CLASSES_EXCLUDED_FROM_CHECK]
  160. elif parameter == 'ATTRIBUTES_EXCLUDED_FROM_CHECK': # Sequence
  161. if isinstance(_ATTRIBUTES_EXCLUDED_FROM_CHECK, SEQUENCE_TYPES):
  162. return _ATTRIBUTES_EXCLUDED_FROM_CHECK
  163. else:
  164. return [_ATTRIBUTES_EXCLUDED_FROM_CHECK]
  165. elif parameter == 'UTF8_ENCODED_SYNTAXES': # Sequence
  166. if isinstance(_UTF8_ENCODED_SYNTAXES, SEQUENCE_TYPES):
  167. return _UTF8_ENCODED_SYNTAXES
  168. else:
  169. return [_UTF8_ENCODED_SYNTAXES]
  170. elif parameter == 'UTF8_ENCODED_TYPES': # Sequence
  171. if isinstance(_UTF8_ENCODED_TYPES, SEQUENCE_TYPES):
  172. return _UTF8_ENCODED_TYPES
  173. else:
  174. return [_UTF8_ENCODED_TYPES]
  175. elif parameter in ['ADDITIONAL_SERVER_ENCODINGS', 'ADDITIONAL_ENCODINGS']: # Sequence - ADDITIONAL_ENCODINGS for backward compatibility
  176. if isinstance(_ADDITIONAL_SERVER_ENCODINGS, SEQUENCE_TYPES):
  177. return _ADDITIONAL_SERVER_ENCODINGS
  178. else:
  179. return [_ADDITIONAL_SERVER_ENCODINGS]
  180. elif parameter in ['ADDITIONAL_CLIENT_ENCODINGS']: # Sequence
  181. if isinstance(_ADDITIONAL_CLIENT_ENCODINGS, SEQUENCE_TYPES):
  182. return _ADDITIONAL_CLIENT_ENCODINGS
  183. else:
  184. return [_ADDITIONAL_CLIENT_ENCODINGS]
  185. elif parameter == 'IGNORE_MALFORMED_SCHEMA': # Boolean
  186. return _IGNORE_MALFORMED_SCHEMA
  187. elif parameter == 'ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF': # Sequence
  188. if isinstance(_ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF, SEQUENCE_TYPES):
  189. return _ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF
  190. else:
  191. return [_ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF]
  192. elif parameter == 'IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF': # Sequence
  193. if isinstance(_IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF, SEQUENCE_TYPES):
  194. return _IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF
  195. else:
  196. return [_IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF]
  197. elif parameter == 'LDIF_LINE_LENGTH': # Integer
  198. return _LDIF_LINE_LENGTH
  199. raise LDAPConfigurationParameterError('configuration parameter %s not valid' % parameter)
  200. def set_config_parameter(parameter, value):
  201. if parameter == 'CASE_INSENSITIVE_ATTRIBUTE_NAMES':
  202. global _CASE_INSENSITIVE_ATTRIBUTE_NAMES
  203. _CASE_INSENSITIVE_ATTRIBUTE_NAMES = value
  204. elif parameter == 'CASE_INSENSITIVE_SCHEMA_NAMES':
  205. global _CASE_INSENSITIVE_SCHEMA_NAMES
  206. _CASE_INSENSITIVE_SCHEMA_NAMES = value
  207. elif parameter == 'ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX':
  208. global _ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX
  209. _ABSTRACTION_OPERATIONAL_ATTRIBUTE_PREFIX = value
  210. elif parameter == 'POOLING_LOOP_TIMEOUT':
  211. global _POOLING_LOOP_TIMEOUT
  212. _POOLING_LOOP_TIMEOUT = value
  213. elif parameter == 'RESPONSE_SLEEPTIME':
  214. global _RESPONSE_SLEEPTIME
  215. _RESPONSE_SLEEPTIME = value
  216. elif parameter == 'RESPONSE_WAITING_TIMEOUT':
  217. global _RESPONSE_WAITING_TIMEOUT
  218. _RESPONSE_WAITING_TIMEOUT = value
  219. elif parameter == 'SOCKET_SIZE':
  220. global _SOCKET_SIZE
  221. _SOCKET_SIZE = value
  222. elif parameter == 'CHECK_AVAILABILITY_TIMEOUT':
  223. global _CHECK_AVAILABILITY_TIMEOUT
  224. _CHECK_AVAILABILITY_TIMEOUT = value
  225. elif parameter == 'RESTARTABLE_SLEEPTIME':
  226. global _RESTARTABLE_SLEEPTIME
  227. _RESTARTABLE_SLEEPTIME = value
  228. elif parameter == 'RESTARTABLE_TRIES':
  229. global _RESTARTABLE_TRIES
  230. _RESTARTABLE_TRIES = value
  231. elif parameter == 'REUSABLE_THREADED_POOL_SIZE':
  232. global _REUSABLE_THREADED_POOL_SIZE
  233. _REUSABLE_THREADED_POOL_SIZE = value
  234. elif parameter == 'REUSABLE_THREADED_LIFETIME':
  235. global _REUSABLE_THREADED_LIFETIME
  236. _REUSABLE_THREADED_LIFETIME = value
  237. elif parameter == 'DEFAULT_THREADED_POOL_NAME':
  238. global _DEFAULT_THREADED_POOL_NAME
  239. _DEFAULT_THREADED_POOL_NAME = value
  240. elif parameter == 'ADDRESS_INFO_REFRESH_TIME':
  241. global _ADDRESS_INFO_REFRESH_TIME
  242. _ADDRESS_INFO_REFRESH_TIME = value
  243. elif parameter == 'RESET_AVAILABILITY_TIMEOUT':
  244. global _RESET_AVAILABILITY_TIMEOUT
  245. _RESET_AVAILABILITY_TIMEOUT = value
  246. elif parameter in ['DEFAULT_CLIENT_ENCODING', 'DEFAULT_ENCODING']:
  247. global _DEFAULT_CLIENT_ENCODING
  248. _DEFAULT_CLIENT_ENCODING = value
  249. elif parameter == 'DEFAULT_SERVER_ENCODING':
  250. global _DEFAULT_SERVER_ENCODING
  251. _DEFAULT_SERVER_ENCODING = value
  252. elif parameter == 'CLASSES_EXCLUDED_FROM_CHECK':
  253. global _CLASSES_EXCLUDED_FROM_CHECK
  254. _CLASSES_EXCLUDED_FROM_CHECK = value
  255. elif parameter == 'ATTRIBUTES_EXCLUDED_FROM_CHECK':
  256. global _ATTRIBUTES_EXCLUDED_FROM_CHECK
  257. _ATTRIBUTES_EXCLUDED_FROM_CHECK = value
  258. elif parameter == 'UTF8_ENCODED_SYNTAXES':
  259. global _UTF8_ENCODED_SYNTAXES
  260. _UTF8_ENCODED_SYNTAXES = value
  261. elif parameter == 'UTF8_ENCODED_TYPES':
  262. global _UTF8_ENCODED_TYPES
  263. _UTF8_ENCODED_TYPES = value
  264. elif parameter in ['ADDITIONAL_SERVER_ENCODINGS', 'ADDITIONAL_ENCODINGS']:
  265. global _ADDITIONAL_SERVER_ENCODINGS
  266. _ADDITIONAL_SERVER_ENCODINGS = value if isinstance(value, SEQUENCE_TYPES) else [value]
  267. elif parameter in ['ADDITIONAL_CLIENT_ENCODINGS']:
  268. global _ADDITIONAL_CLIENT_ENCODINGS
  269. _ADDITIONAL_CLIENT_ENCODINGS = value if isinstance(value, SEQUENCE_TYPES) else [value]
  270. elif parameter == 'IGNORE_MALFORMED_SCHEMA':
  271. global _IGNORE_MALFORMED_SCHEMA
  272. _IGNORE_MALFORMED_SCHEMA = value
  273. elif parameter == 'ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF':
  274. global _ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF
  275. _ATTRIBUTES_EXCLUDED_FROM_OBJECT_DEF = value
  276. elif parameter == 'IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF':
  277. global _IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF
  278. _IGNORED_MANDATORY_ATTRIBUTES_IN_OBJECT_DEF = value
  279. elif parameter == 'LDIF_LINE_LENGTH':
  280. global _LDIF_LINE_LENGTH
  281. _LDIF_LINE_LENGTH = value
  282. else:
  283. raise LDAPConfigurationParameterError('unable to set configuration parameter %s' % parameter)