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