3web2ldap plugin classes for OpenLDAP
10from pyasn1.codec.ber
import decoder
as ber_decoder
15from ldap0.controls
import KNOWN_RESPONSE_CONTROLS
19from ..searchform
import SEARCH_OPT_IS_EQUAL, SEARCH_SCOPE_STR_ONELEVEL
20from ..schema.syntaxes
import (
39from ...ldaputil.oidreg
import OID_REG
40from .quirks
import NamingContexts
47 oid: str =
'OlcSchemaDescription-oid'
52 schema_desc = attr_value.split(b
'}', 1)[1]
54 schema_desc = attr_value
55 return SchemaDescription._validate(self, schema_desc)
59 oid: str =
'OlcObjectClasses-oid'
60 schema_cls = ldap0.schema.models.ObjectClass
62syntax_registry.reg_at(
63 OlcObjectClasses.oid, [
64 '1.3.6.1.4.1.4203.1.12.2.3.0.32',
70 oid: str =
'OlcAttributeTypes-oid'
71 schema_cls = ldap0.schema.models.AttributeType
73syntax_registry.reg_at(
74 OlcAttributeTypes.oid, [
75 '1.3.6.1.4.1.4203.1.12.2.3.0.4',
81 oid: str =
'OlcLdapSyntaxes-oid'
82 schema_cls = ldap0.schema.models.LDAPSyntax
84syntax_registry.reg_at(
85 OlcLdapSyntaxes.oid, [
86 '1.3.6.1.4.1.4203.1.12.2.3.0.85',
92 oid: str =
'OlcDitContentRules-oid'
93 schema_cls = ldap0.schema.models.DITContentRule
95syntax_registry.reg_at(
96 OlcDitContentRules.oid, [
97 '1.3.6.1.4.1.4203.1.12.2.3.0.16',
107 oid: str =
'1.3.6.1.4.1.4203.666.11.2.4'
108 desc: str =
'change sequence number SID (CSN SID)'
111 pattern = re.compile(
'^[a-fA-F0-9]{3}$')
116 oid: str =
'1.3.6.1.4.1.4203.666.11.2.1'
117 desc: str =
'change sequence number (CSN)'
120 pattern = re.compile(
'^[0-9]{14}\\.[0-9]{6}Z#[a-fA-F0-9]{6}#[a-fA-F0-9]{3}#[a-fA-F0-9]{6}$')
122syntax_registry.reg_at(
124 '1.3.6.1.4.1.4203.666.1.25',
125 '1.3.6.1.4.1.4203.666.1.7',
126 '1.3.6.1.4.1.4203.666.1.13',
128 'contextCSN',
'entryCSN',
'namingCSN',
136syntax_registry.reg_at(
137 NamingContexts.oid, [
138 '1.3.6.1.4.1.4203.1.12.2.3.2.0.10',
144 oid: str =
'OlcDbIndex-oid'
145 desc: str =
'OpenLDAP indexing directive'
146 pattern = re.compile(
"^[a-zA-Z]?[a-zA-Z0-9.,;-]* (pres|eq|sub)(,(pres|eq|sub))*$")
148syntax_registry.reg_at(
150 '1.3.6.1.4.1.4203.1.12.2.3.2.0.2',
156 oid: str =
'OlcSubordinate-oid'
157 desc: str =
'Indicates whether backend is subordinate'
158 attr_value_dict: Dict[str, str] = {
161 'advertise':
'advertise',
164syntax_registry.reg_at(
165 OlcSubordinate.oid, [
166 '1.3.6.1.4.1.4203.1.12.2.3.2.0.15',
172 oid: str =
'OlcRootDN-oid'
173 desc: str =
'The rootdn in the database'
174 default_rdn =
'cn=admin'
177 fval = BindDN.form_value(self)
179 olc_suffix = self.
_entry[
'olcSuffix'][0].decode()
183 if not fval
or not fval.endswith(olc_suffix):
190syntax_registry.reg_at(
192 '1.3.6.1.4.1.4203.1.12.2.3.2.0.8',
198 oid: str =
'OlcMultilineText-oid'
199 desc: str =
'OpenLDAP multiline configuration strings'
204 return '<code>%s</code>' % MultilineText.display(self, vidx, links)
206syntax_registry.reg_at(
207 OlcMultilineText.oid, [
208 '1.3.6.1.4.1.4203.1.12.2.3.0.1',
209 '1.3.6.1.4.1.4203.1.12.2.3.0.6',
210 '1.3.6.1.4.1.4203.1.12.2.3.0.8',
211 '1.3.6.1.4.1.4203.1.12.2.3.2.0.5',
216 oid: str =
'OlcSyncRepl-oid'
217 desc: str =
'OpenLDAP syncrepl directive'
220 def __init__(self, app, dn: str, schema, attrType: str, attr_value: bytes, entry=
None):
221 OlcMultilineText.__init__(self, app, dn, schema, attrType, attr_value, entry)
224 if not links
or not self.
_av:
225 return OlcMultilineText.display(self, vidx, links)
226 srd = ldap0.openldap.SyncReplDesc(self.
av_u)
228 OlcMultilineText.display(self, vidx, links),
229 self.
_app.ldap_url_anchor(srd.ldap_url()),
232syntax_registry.reg_at(
234 '1.3.6.1.4.1.4203.1.12.2.3.2.0.11',
240 oid: str =
'OlmSeeAlso-oid'
241 desc: str =
'DN of a overlase or database object in back-monitor'
243 'ldap:///_?monitoredInfo?sub?'
245 '(objectClass=monitoredObject)'
247 '(entryDN:dnOneLevelMatch:=cn=Databases,cn=Monitor)'
248 '(entryDN:dnOneLevelMatch:=cn=Overlays,cn=Monitor)'
249 '(entryDN:dnOneLevelMatch:=cn=Backends,cn=Monitor)'
254syntax_registry.reg_at(
258 structural_oc_oids=[
'1.3.6.1.4.1.4203.666.3.16.8'],
263 oid: str =
'OlcPPolicyDefault-oid'
264 desc: str =
'DN of a pwdPolicy object for uncustomized objects'
266syntax_registry.reg_at(
267 OlcPPolicyDefault.oid, [
268 '1.3.6.1.4.1.4203.1.12.2.3.3.12.1',
274 oid: str =
'OlcMemberOfDangling-oid'
275 desc: str =
'Behavior in case of dangling references during modification'
276 attr_value_dict: Dict[str, str] = {
283syntax_registry.reg_at(
284 OlcMemberOfDangling.oid, [
285 '1.3.6.1.4.1.4203.1.12.2.3.3.18.1',
295syntax_registry.reg_at(
297 '1.3.6.1.4.1.4203.666.11.5.1.2',
'reqStart',
298 '1.3.6.1.4.1.4203.666.11.5.1.3',
'reqEnd',
304 oid: str =
'AuditContext'
305 desc: str =
'OpenLDAP DN pointing to audit naming context'
308 res = [DistinguishedName.display(self, vidx, links)]
312 'searchform',
'Search',
315 (
'scope',
str(ldap0.SCOPE_ONELEVEL)),
317 title=
'Go to search form for audit log',
320 'search',
'List all',
323 (
'filterstr',
'(objectClass=auditObject)'),
324 (
'scope',
str(ldap0.SCOPE_ONELEVEL)),
326 title=
'List audit log entries of all operations',
329 'search',
'List writes',
332 (
'filterstr',
'(objectClass=auditWriteObject)'),
333 (
'scope',
str(ldap0.SCOPE_ONELEVEL)),
335 title=
'List audit log entries of all write operations',
338 return web2ldapcnf.command_link_separator.join(res)
340syntax_registry.reg_at(
343 '1.3.6.1.4.1.4203.666.11.5.1.30',
'auditContext',
344 '1.3.6.1.4.1.4203.1.12.2.3.3.4.1',
350 oid: str =
'ReqResult-oid'
352syntax_registry.reg_at(
354 '1.3.6.1.4.1.4203.666.11.5.1.7',
'reqResult',
360 oid: str =
'ReqMod-oid'
361 desc: str =
'List of modifications/old values'
362 known_modtypes = {b
'+', b
'-', b
'=', b
'#', b
''}
365 return OctetString._validate(self, attr_value)
372 mod_attr_type, mod_attr_rest = self.
_av_av.split(b
':', 1)
373 mod_type = mod_attr_rest[0:1].strip()
374 except (ValueError, IndexError):
375 return OctetString.display(self, vidx, links)
377 return OctetString.display(self, vidx, links)
378 if len(mod_attr_rest) > 1:
380 mod_type, mod_attr_value = mod_attr_rest.split(b
' ', 1)
382 return OctetString.display(self, vidx, links)
385 mod_attr_type_u = mod_attr_type.decode(self.
_app.ls.charset)
386 mod_type_u = mod_type.decode(self.
_app.ls.charset)
388 mod_attr_value.decode(self.
_app.ls.charset)
389 except UnicodeDecodeError:
390 return '%s:%s<br>\n<code>\n%s\n</code>\n' % (
391 self.
_app.form.s2d(mod_attr_type_u),
392 self.
_app.form.s2d(mod_type_u),
393 mod_attr_value.hex().upper(),
396 return DirectoryString.display(self, vidx, links)
399syntax_registry.reg_at(
401 '1.3.6.1.4.1.4203.666.11.5.1.16',
'reqMod',
402 '1.3.6.1.4.1.4203.666.11.5.1.17',
'reqOld',
408 oid: str =
'1.3.6.1.4.1.4203.666.11.5.3.1'
409 desc: str =
'List of LDAPv3 extended controls sent along with a request'
412 result_lines = [IA5String.display(self, vidx, links)]
414 _, rest = self.
av_u.strip().split(
'}{', 1)
416 if rest.endswith(
'}'):
417 result_lines.append(
'Extracted:')
419 ctrl_tokens = list(filter(
421 [t.strip()
for t
in rest[:-1].split(
' ')]
423 ctrl_type = ctrl_tokens[0]
425 ctrl_name, _, _ = OID_REG[ctrl_type]
426 except (KeyError, ValueError):
428 ctrl_name = KNOWN_RESPONSE_CONTROLS.get(ctrl_type).__class__.__name__
432 result_lines.append(self.
_app.form.s2d(ctrl_name))
438 }[ctrl_tokens[ctrl_tokens.index(
'criticality')+1].upper()]
439 except (KeyError, ValueError, IndexError):
440 ctrl_criticality =
False
441 result_lines.append(
'criticality %s' %
str(ctrl_criticality).upper())
444 ctrl_value = binascii.unhexlify(
445 ctrl_tokens[ctrl_tokens.index(
'controlValue')+1].upper()[1:-1]
447 except (KeyError, ValueError, IndexError):
451 decoded_control_value = ber_decoder.decode(ctrl_value)
453 decoded_control_value = ctrl_value
455 'controlValue %s' % (
457 repr(decoded_control_value)
458 ).replace(
'\n',
'<br>')
461 return '<br>'.join(result_lines)
463syntax_registry.reg_at(
465 '1.3.6.1.4.1.4203.666.11.5.1.10',
'reqControls',
466 '1.3.6.1.4.1.4203.666.11.5.1.11',
'reqRespControls',
472 oid: str =
'ReqEntryUUID-oid'
475 display_value = UUID.display(self, vidx, links)
478 return web2ldapcnf.command_link_separator.join((
481 'search',
'Search target',
486 '(entryUUID=%s)' % (self.
av_u),
491 self.
_app.ls.get_search_root(
492 self.
_app.ls.uc_decode(self.
_entry[
'reqDN'][0])[0]
497 title=
'Search entry by UUID',
501syntax_registry.reg_at(
503 '1.3.6.1.4.1.4203.666.11.5.1.31',
'reqEntryUUID',
509 oid: str =
'ReqSession-oid'
512 display_value = Integer.display(self, vidx, links)
515 return web2ldapcnf.command_link_separator.join((
521 (
'search_root',
str(self.
_app.naming_context)),
522 (
'searchform_mode',
'adv'),
523 (
'search_attr',
'reqSession'),
524 (
'search_option', SEARCH_OPT_IS_EQUAL),
525 (
'search_string', self.
av_u),
527 title=
'Search all audit entries with same session number',
531syntax_registry.reg_at(
533 '1.3.6.1.4.1.4203.666.11.5.1.5',
'reqSession',
539 oid: str =
'ReqDN-oid'
540 desc: str =
'Target DN of request'
542 (
'reqDN',
'Same target',
None,
'Search all entries with same target DN'),
546syntax_registry.reg_at(
548 '1.3.6.1.4.1.4203.666.11.5.1.1',
'reqDN',
554 oid: str =
'ReqAuthzID-oid'
555 desc: str =
'Authorization DN'
557 (
'reqAuthzID',
'Same authz-DN',
None,
'Search all entries with same authz DN'),
561syntax_registry.reg_at(
564 '1.3.6.1.4.1.4203.666.11.5.1.6',
575 oid: str =
'1.3.6.1.4.1.4203.666.2.7'
576 desc: str =
'OpenLDAP authz'
579syntax_registry.reg_at(
581 'monitorConnectionAuthzDN',
582 '1.3.6.1.4.1.4203.666.1.55.7',
588 oid: str =
'1.3.6.1.4.1.4203.666.2.1'
589 desc: str =
'OpenLDAP ACI'
593 oid: str =
'OpenLDAPSpecialBackendSuffix-oid'
594 desc: str =
'OpenLDAP special backend suffix'
597 attr_type_u = self.
_at[:-7]
599 config_context = self.
_app.ls.uc_decode(self.
_app.ls.root_dse[
'configContext'][0])[0]
602 return self.
_app.anchor(
605 (
'dn', config_context),
606 (
'scope', SEARCH_SCOPE_STR_ONELEVEL),
609 '(&(objectClass=olcDatabaseConfig)(olcDatabase=%s))' % (attr_type_u),
612 title=
'Search for configuration entry below %s' % (config_context),
615syntax_registry.reg_at(
616 OpenLDAPSpecialBackendSuffix.oid,
618 'monitorContext',
'1.3.6.1.4.1.4203.666.1.10',
619 'configContext',
'1.3.6.1.4.1.4203.1.12.2.1',
624syntax_registry.reg_at(
625 Uri.oid, [
'monitorConnectionListener']
629syntax_registry.reg_at(
630 DistinguishedName.oid, [
636syntax_registry.reg_syntaxes(__name__)
str display(self, vidx, links)
str display(self, vidx, links)
bool _validate(self, bytes attr_value)
def __init__(self, app, str dn, schema, str attrType, bytes attr_value, entry=None)
str display(self, vidx, links)
str display(self, vidx, links)
str display(self, vidx, links)
dictionary known_modtypes
bool _validate(self, bytes attr_value)
str display(self, vidx, links)
str display(self, vidx, links)