89 lines
2.4 KiB
Python
89 lines
2.4 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
"""
|
||
|
ldap.controls.readentry - classes for the Read Entry controls
|
||
|
(see RFC 4527)
|
||
|
|
||
|
See https://www.python-ldap.org/ for project details.
|
||
|
"""
|
||
|
|
||
|
import ldap
|
||
|
|
||
|
from pyasn1.codec.ber import encoder,decoder
|
||
|
from ldap.controls import LDAPControl,KNOWN_RESPONSE_CONTROLS
|
||
|
|
||
|
from pyasn1_modules.rfc2251 import AttributeDescriptionList,SearchResultEntry
|
||
|
|
||
|
|
||
|
class ReadEntryControl(LDAPControl):
|
||
|
"""
|
||
|
Base class for read entry control described in RFC 4527
|
||
|
|
||
|
attrList
|
||
|
list of attribute type names requested
|
||
|
|
||
|
Class attributes with values extracted from the response control:
|
||
|
|
||
|
dn
|
||
|
string holding the distinguished name of the LDAP entry
|
||
|
entry
|
||
|
dictionary holding the LDAP entry
|
||
|
"""
|
||
|
|
||
|
def __init__(self,criticality=False,attrList=None):
|
||
|
self.criticality,self.attrList,self.entry = criticality,attrList or [],None
|
||
|
|
||
|
def encodeControlValue(self):
|
||
|
attributeSelection = AttributeDescriptionList()
|
||
|
for i in range(len(self.attrList)):
|
||
|
attributeSelection.setComponentByPosition(i,self.attrList[i])
|
||
|
return encoder.encode(attributeSelection)
|
||
|
|
||
|
def decodeControlValue(self,encodedControlValue):
|
||
|
decodedEntry,_ = decoder.decode(encodedControlValue,asn1Spec=SearchResultEntry())
|
||
|
self.dn = str(decodedEntry[0])
|
||
|
self.entry = {}
|
||
|
for attr in decodedEntry[1]:
|
||
|
self.entry[str(attr[0])] = [ str(attr_value) for attr_value in attr[1] ]
|
||
|
|
||
|
|
||
|
class PreReadControl(ReadEntryControl):
|
||
|
"""
|
||
|
Class for pre-read control described in RFC 4527
|
||
|
|
||
|
attrList
|
||
|
list of attribute type names requested
|
||
|
|
||
|
Class attributes with values extracted from the response control:
|
||
|
|
||
|
dn
|
||
|
string holding the distinguished name of the LDAP entry
|
||
|
before the operation was done by the server
|
||
|
entry
|
||
|
dictionary holding the LDAP entry
|
||
|
before the operation was done by the server
|
||
|
"""
|
||
|
controlType = ldap.CONTROL_PRE_READ
|
||
|
|
||
|
KNOWN_RESPONSE_CONTROLS[PreReadControl.controlType] = PreReadControl
|
||
|
|
||
|
|
||
|
class PostReadControl(ReadEntryControl):
|
||
|
"""
|
||
|
Class for post-read control described in RFC 4527
|
||
|
|
||
|
attrList
|
||
|
list of attribute type names requested
|
||
|
|
||
|
Class attributes with values extracted from the response control:
|
||
|
|
||
|
dn
|
||
|
string holding the distinguished name of the LDAP entry
|
||
|
after the operation was done by the server
|
||
|
entry
|
||
|
dictionary holding the LDAP entry
|
||
|
after the operation was done by the server
|
||
|
"""
|
||
|
controlType = ldap.CONTROL_POST_READ
|
||
|
|
||
|
KNOWN_RESPONSE_CONTROLS[PostReadControl.controlType] = PostReadControl
|