1# 
    2# This file is part of pyasn1-modules software. 
    3# 
    4# Copyright (c) 2005-2020, Ilya Etingof <etingof@gmail.com> 
    5# License: http://snmplabs.com/pyasn1/license.html 
    6# 
    7# LDAP message syntax 
    8# 
    9# ASN.1 source from: 
    10# http://www.trl.ibm.com/projects/xml/xss4j/data/asn1/grammars/ldap.asn 
    11# 
    12# Sample captures from: 
    13# http://wiki.wireshark.org/SampleCaptures/ 
    14# 
    15from pyasn1.type import constraint 
    16from pyasn1.type import namedtype 
    17from pyasn1.type import namedval 
    18from pyasn1.type import tag 
    19from pyasn1.type import univ 
    20 
    21maxInt = univ.Integer(2147483647) 
    22 
    23 
    24class LDAPString(univ.OctetString): 
    25    pass 
    26 
    27 
    28class LDAPOID(univ.OctetString): 
    29    pass 
    30 
    31 
    32class LDAPDN(LDAPString): 
    33    pass 
    34 
    35 
    36class RelativeLDAPDN(LDAPString): 
    37    pass 
    38 
    39 
    40class AttributeType(LDAPString): 
    41    pass 
    42 
    43 
    44class AttributeDescription(LDAPString): 
    45    pass 
    46 
    47 
    48class AttributeDescriptionList(univ.SequenceOf): 
    49    componentType = AttributeDescription() 
    50 
    51 
    52class AttributeValue(univ.OctetString): 
    53    pass 
    54 
    55 
    56class AssertionValue(univ.OctetString): 
    57    pass 
    58 
    59 
    60class AttributeValueAssertion(univ.Sequence): 
    61    componentType = namedtype.NamedTypes( 
    62        namedtype.NamedType('attributeDesc', AttributeDescription()), 
    63        namedtype.NamedType('assertionValue', AssertionValue()) 
    64    ) 
    65 
    66 
    67class Attribute(univ.Sequence): 
    68    componentType = namedtype.NamedTypes( 
    69        namedtype.NamedType('type', AttributeDescription()), 
    70        namedtype.NamedType('vals', univ.SetOf(componentType=AttributeValue())) 
    71    ) 
    72 
    73 
    74class MatchingRuleId(LDAPString): 
    75    pass 
    76 
    77 
    78class Control(univ.Sequence): 
    79    componentType = namedtype.NamedTypes( 
    80        namedtype.NamedType('controlType', LDAPOID()), 
    81        namedtype.DefaultedNamedType('criticality', univ.Boolean('False')), 
    82        namedtype.OptionalNamedType('controlValue', univ.OctetString()) 
    83    ) 
    84 
    85 
    86class Controls(univ.SequenceOf): 
    87    componentType = Control() 
    88 
    89 
    90class LDAPURL(LDAPString): 
    91    pass 
    92 
    93 
    94class Referral(univ.SequenceOf): 
    95    componentType = LDAPURL() 
    96 
    97 
    98class SaslCredentials(univ.Sequence): 
    99    componentType = namedtype.NamedTypes( 
    100        namedtype.NamedType('mechanism', LDAPString()), 
    101        namedtype.OptionalNamedType('credentials', univ.OctetString()) 
    102    ) 
    103 
    104 
    105class AuthenticationChoice(univ.Choice): 
    106    componentType = namedtype.NamedTypes( 
    107        namedtype.NamedType('simple', univ.OctetString().subtype( 
    108            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))), 
    109        namedtype.NamedType('reserved-1', univ.OctetString().subtype( 
    110            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1))), 
    111        namedtype.NamedType('reserved-2', univ.OctetString().subtype( 
    112            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 2))), 
    113        namedtype.NamedType('sasl', 
    114                            SaslCredentials().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 3))) 
    115    ) 
    116 
    117 
    118class BindRequest(univ.Sequence): 
    119    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    120        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 0) 
    121    ) 
    122    componentType = namedtype.NamedTypes( 
    123        namedtype.NamedType('version', univ.Integer().subtype(subtypeSpec=constraint.ValueRangeConstraint(1, 127))), 
    124        namedtype.NamedType('name', LDAPDN()), 
    125        namedtype.NamedType('authentication', AuthenticationChoice()) 
    126    ) 
    127 
    128 
    129class PartialAttributeList(univ.SequenceOf): 
    130    componentType = univ.Sequence( 
    131        componentType=namedtype.NamedTypes( 
    132            namedtype.NamedType('type', AttributeDescription()), 
    133            namedtype.NamedType('vals', univ.SetOf(componentType=AttributeValue())) 
    134        ) 
    135    ) 
    136 
    137 
    138class SearchResultEntry(univ.Sequence): 
    139    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    140        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 4) 
    141    ) 
    142    componentType = namedtype.NamedTypes( 
    143        namedtype.NamedType('objectName', LDAPDN()), 
    144        namedtype.NamedType('attributes', PartialAttributeList()) 
    145    ) 
    146 
    147 
    148class MatchingRuleAssertion(univ.Sequence): 
    149    componentType = namedtype.NamedTypes( 
    150        namedtype.OptionalNamedType('matchingRule', MatchingRuleId().subtype( 
    151            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1))), 
    152        namedtype.OptionalNamedType('type', AttributeDescription().subtype( 
    153            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 2))), 
    154        namedtype.NamedType('matchValue', 
    155                            AssertionValue().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 3))), 
    156        namedtype.DefaultedNamedType('dnAttributes', univ.Boolean('False').subtype( 
    157            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 4))) 
    158    ) 
    159 
    160 
    161class SubstringFilter(univ.Sequence): 
    162    componentType = namedtype.NamedTypes( 
    163        namedtype.NamedType('type', AttributeDescription()), 
    164        namedtype.NamedType('substrings', 
    165            univ.SequenceOf( 
    166                componentType=univ.Choice( 
    167                    componentType=namedtype.NamedTypes( 
    168                        namedtype.NamedType( 
    169                            'initial', LDAPString().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)) 
    170                        ), 
    171                        namedtype.NamedType( 
    172                            'any', LDAPString().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1)) 
    173                        ), 
    174                        namedtype.NamedType( 
    175                            'final', LDAPString().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 2)) 
    176                        ) 
    177                    ) 
    178                ) 
    179            ) 
    180        ) 
    181    ) 
    182 
    183 
    184# Ugly hack to handle recursive Filter reference (up to 3-levels deep). 
    185 
    186class Filter3(univ.Choice): 
    187    componentType = namedtype.NamedTypes( 
    188        namedtype.NamedType('equalityMatch', AttributeValueAssertion().subtype( 
    189            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 3))), 
    190        namedtype.NamedType('substrings', SubstringFilter().subtype( 
    191            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 4))), 
    192        namedtype.NamedType('greaterOrEqual', AttributeValueAssertion().subtype( 
    193            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 5))), 
    194        namedtype.NamedType('lessOrEqual', AttributeValueAssertion().subtype( 
    195            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 6))), 
    196        namedtype.NamedType('present', AttributeDescription().subtype( 
    197            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 7))), 
    198        namedtype.NamedType('approxMatch', AttributeValueAssertion().subtype( 
    199            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 8))), 
    200        namedtype.NamedType('extensibleMatch', MatchingRuleAssertion().subtype( 
    201            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 9))) 
    202    ) 
    203 
    204 
    205class Filter2(univ.Choice): 
    206    componentType = namedtype.NamedTypes( 
    207        namedtype.NamedType('and', univ.SetOf(componentType=Filter3()).subtype( 
    208            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0))), 
    209        namedtype.NamedType('or', univ.SetOf(componentType=Filter3()).subtype( 
    210            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 1))), 
    211        namedtype.NamedType('not', 
    212                            Filter3().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 2))), 
    213        namedtype.NamedType('equalityMatch', AttributeValueAssertion().subtype( 
    214            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 3))), 
    215        namedtype.NamedType('substrings', SubstringFilter().subtype( 
    216            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 4))), 
    217        namedtype.NamedType('greaterOrEqual', AttributeValueAssertion().subtype( 
    218            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 5))), 
    219        namedtype.NamedType('lessOrEqual', AttributeValueAssertion().subtype( 
    220            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 6))), 
    221        namedtype.NamedType('present', AttributeDescription().subtype( 
    222            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 7))), 
    223        namedtype.NamedType('approxMatch', AttributeValueAssertion().subtype( 
    224            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 8))), 
    225        namedtype.NamedType('extensibleMatch', MatchingRuleAssertion().subtype( 
    226            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 9))) 
    227    ) 
    228 
    229 
    230class Filter(univ.Choice): 
    231    componentType = namedtype.NamedTypes( 
    232        namedtype.NamedType('and', univ.SetOf(componentType=Filter2()).subtype( 
    233            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0))), 
    234        namedtype.NamedType('or', univ.SetOf(componentType=Filter2()).subtype( 
    235            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 1))), 
    236        namedtype.NamedType('not', 
    237                            Filter2().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 2))), 
    238        namedtype.NamedType('equalityMatch', AttributeValueAssertion().subtype( 
    239            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 3))), 
    240        namedtype.NamedType('substrings', SubstringFilter().subtype( 
    241            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 4))), 
    242        namedtype.NamedType('greaterOrEqual', AttributeValueAssertion().subtype( 
    243            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 5))), 
    244        namedtype.NamedType('lessOrEqual', AttributeValueAssertion().subtype( 
    245            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 6))), 
    246        namedtype.NamedType('present', AttributeDescription().subtype( 
    247            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 7))), 
    248        namedtype.NamedType('approxMatch', AttributeValueAssertion().subtype( 
    249            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 8))), 
    250        namedtype.NamedType('extensibleMatch', MatchingRuleAssertion().subtype( 
    251            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 9))) 
    252    ) 
    253 
    254 
    255# End of Filter hack 
    256 
    257class SearchRequest(univ.Sequence): 
    258    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    259        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 3) 
    260    ) 
    261    componentType = namedtype.NamedTypes( 
    262        namedtype.NamedType('baseObject', LDAPDN()), 
    263        namedtype.NamedType('scope', univ.Enumerated( 
    264            namedValues=namedval.NamedValues(('baseObject', 0), ('singleLevel', 1), ('wholeSubtree', 2)))), 
    265        namedtype.NamedType('derefAliases', univ.Enumerated( 
    266            namedValues=namedval.NamedValues(('neverDerefAliases', 0), ('derefInSearching', 1), 
    267                                             ('derefFindingBaseObj', 2), ('derefAlways', 3)))), 
    268        namedtype.NamedType('sizeLimit', 
    269                            univ.Integer().subtype(subtypeSpec=constraint.ValueRangeConstraint(0, maxInt))), 
    270        namedtype.NamedType('timeLimit', 
    271                            univ.Integer().subtype(subtypeSpec=constraint.ValueRangeConstraint(0, maxInt))), 
    272        namedtype.NamedType('typesOnly', univ.Boolean()), 
    273        namedtype.NamedType('filter', Filter()), 
    274        namedtype.NamedType('attributes', AttributeDescriptionList()) 
    275    ) 
    276 
    277 
    278class UnbindRequest(univ.Null): 
    279    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    280        tag.Tag(tag.tagClassApplication, tag.tagFormatSimple, 2) 
    281    ) 
    282 
    283 
    284class BindResponse(univ.Sequence): 
    285    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    286        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 1) 
    287    ) 
    288    componentType = namedtype.NamedTypes( 
    289        namedtype.NamedType('resultCode', univ.Enumerated( 
    290            namedValues=namedval.NamedValues(('success', 0), ('operationsError', 1), ('protocolError', 2), 
    291                                             ('timeLimitExceeded', 3), ('sizeLimitExceeded', 4), ('compareFalse', 5), 
    292                                             ('compareTrue', 6), ('authMethodNotSupported', 7), 
    293                                             ('strongAuthRequired', 8), ('reserved-9', 9), ('referral', 10), 
    294                                             ('adminLimitExceeded', 11), ('unavailableCriticalExtension', 12), 
    295                                             ('confidentialityRequired', 13), ('saslBindInProgress', 14), 
    296                                             ('noSuchAttribute', 16), ('undefinedAttributeType', 17), 
    297                                             ('inappropriateMatching', 18), ('constraintViolation', 19), 
    298                                             ('attributeOrValueExists', 20), ('invalidAttributeSyntax', 21), 
    299                                             ('noSuchObject', 32), ('aliasProblem', 33), ('invalidDNSyntax', 34), 
    300                                             ('reserved-35', 35), ('aliasDereferencingProblem', 36), 
    301                                             ('inappropriateAuthentication', 48), ('invalidCredentials', 49), 
    302                                             ('insufficientAccessRights', 50), ('busy', 51), ('unavailable', 52), 
    303                                             ('unwillingToPerform', 53), ('loopDetect', 54), ('namingViolation', 64), 
    304                                             ('objectClassViolation', 65), ('notAllowedOnNonLeaf', 66), 
    305                                             ('notAllowedOnRDN', 67), ('entryAlreadyExists', 68), 
    306                                             ('objectClassModsProhibited', 69), ('reserved-70', 70), 
    307                                             ('affectsMultipleDSAs', 71), ('other', 80), ('reserved-81', 81), 
    308                                             ('reserved-82', 82), ('reserved-83', 83), ('reserved-84', 84), 
    309                                             ('reserved-85', 85), ('reserved-86', 86), ('reserved-87', 87), 
    310                                             ('reserved-88', 88), ('reserved-89', 89), ('reserved-90', 90)))), 
    311        namedtype.NamedType('matchedDN', LDAPDN()), 
    312        namedtype.NamedType('errorMessage', LDAPString()), 
    313        namedtype.OptionalNamedType('referral', Referral().subtype( 
    314            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 3))), 
    315        namedtype.OptionalNamedType('serverSaslCreds', univ.OctetString().subtype( 
    316            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 7))) 
    317    ) 
    318 
    319 
    320class LDAPResult(univ.Sequence): 
    321    componentType = namedtype.NamedTypes( 
    322        namedtype.NamedType('resultCode', univ.Enumerated( 
    323            namedValues=namedval.NamedValues(('success', 0), ('operationsError', 1), ('protocolError', 2), 
    324                                             ('timeLimitExceeded', 3), ('sizeLimitExceeded', 4), ('compareFalse', 5), 
    325                                             ('compareTrue', 6), ('authMethodNotSupported', 7), 
    326                                             ('strongAuthRequired', 8), ('reserved-9', 9), ('referral', 10), 
    327                                             ('adminLimitExceeded', 11), ('unavailableCriticalExtension', 12), 
    328                                             ('confidentialityRequired', 13), ('saslBindInProgress', 14), 
    329                                             ('noSuchAttribute', 16), ('undefinedAttributeType', 17), 
    330                                             ('inappropriateMatching', 18), ('constraintViolation', 19), 
    331                                             ('attributeOrValueExists', 20), ('invalidAttributeSyntax', 21), 
    332                                             ('noSuchObject', 32), ('aliasProblem', 33), ('invalidDNSyntax', 34), 
    333                                             ('reserved-35', 35), ('aliasDereferencingProblem', 36), 
    334                                             ('inappropriateAuthentication', 48), ('invalidCredentials', 49), 
    335                                             ('insufficientAccessRights', 50), ('busy', 51), ('unavailable', 52), 
    336                                             ('unwillingToPerform', 53), ('loopDetect', 54), ('namingViolation', 64), 
    337                                             ('objectClassViolation', 65), ('notAllowedOnNonLeaf', 66), 
    338                                             ('notAllowedOnRDN', 67), ('entryAlreadyExists', 68), 
    339                                             ('objectClassModsProhibited', 69), ('reserved-70', 70), 
    340                                             ('affectsMultipleDSAs', 71), ('other', 80), ('reserved-81', 81), 
    341                                             ('reserved-82', 82), ('reserved-83', 83), ('reserved-84', 84), 
    342                                             ('reserved-85', 85), ('reserved-86', 86), ('reserved-87', 87), 
    343                                             ('reserved-88', 88), ('reserved-89', 89), ('reserved-90', 90)))), 
    344        namedtype.NamedType('matchedDN', LDAPDN()), 
    345        namedtype.NamedType('errorMessage', LDAPString()), 
    346        namedtype.OptionalNamedType('referral', Referral().subtype( 
    347            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 3))) 
    348    ) 
    349 
    350 
    351class SearchResultReference(univ.SequenceOf): 
    352    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    353        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 19) 
    354    ) 
    355    componentType = LDAPURL() 
    356 
    357 
    358class SearchResultDone(LDAPResult): 
    359    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    360        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 5) 
    361    ) 
    362 
    363 
    364class AttributeTypeAndValues(univ.Sequence): 
    365    componentType = namedtype.NamedTypes( 
    366        namedtype.NamedType('type', AttributeDescription()), 
    367        namedtype.NamedType('vals', univ.SetOf(componentType=AttributeValue())) 
    368    ) 
    369 
    370 
    371class ModifyRequest(univ.Sequence): 
    372    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    373        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 6) 
    374    ) 
    375    componentType = namedtype.NamedTypes( 
    376        namedtype.NamedType('object', LDAPDN()), 
    377        namedtype.NamedType('modification', 
    378            univ.SequenceOf( 
    379                componentType=univ.Sequence( 
    380                    componentType=namedtype.NamedTypes( 
    381                        namedtype.NamedType( 
    382                            'operation', univ.Enumerated(namedValues=namedval.NamedValues(('add', 0), ('delete', 1), ('replace', 2))) 
    383                        ), 
    384                        namedtype.NamedType('modification', AttributeTypeAndValues()))) 
    385            ) 
    386        ) 
    387    ) 
    388 
    389 
    390class ModifyResponse(LDAPResult): 
    391    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    392        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 7) 
    393    ) 
    394 
    395 
    396class AttributeList(univ.SequenceOf): 
    397    componentType = univ.Sequence( 
    398        componentType=namedtype.NamedTypes( 
    399           namedtype.NamedType('type', AttributeDescription()), 
    400           namedtype.NamedType('vals', univ.SetOf(componentType=AttributeValue())) 
    401        ) 
    402    ) 
    403 
    404 
    405class AddRequest(univ.Sequence): 
    406    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    407        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 8) 
    408    ) 
    409    componentType = namedtype.NamedTypes( 
    410        namedtype.NamedType('entry', LDAPDN()), 
    411        namedtype.NamedType('attributes', AttributeList()) 
    412    ) 
    413 
    414 
    415class AddResponse(LDAPResult): 
    416    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    417        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 9) 
    418    ) 
    419 
    420 
    421class DelRequest(LDAPResult): 
    422    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    423        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 10) 
    424    ) 
    425 
    426 
    427class DelResponse(LDAPResult): 
    428    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    429        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 11) 
    430    ) 
    431 
    432 
    433class ModifyDNRequest(univ.Sequence): 
    434    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    435        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 12) 
    436    ) 
    437    componentType = namedtype.NamedTypes( 
    438        namedtype.NamedType('entry', LDAPDN()), 
    439        namedtype.NamedType('newrdn', RelativeLDAPDN()), 
    440        namedtype.NamedType('deleteoldrdn', univ.Boolean()), 
    441        namedtype.OptionalNamedType('newSuperior', 
    442                                    LDAPDN().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))) 
    443 
    444    ) 
    445 
    446 
    447class ModifyDNResponse(LDAPResult): 
    448    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    449        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 13) 
    450    ) 
    451 
    452 
    453class CompareRequest(univ.Sequence): 
    454    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    455        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 14) 
    456    ) 
    457    componentType = namedtype.NamedTypes( 
    458        namedtype.NamedType('entry', LDAPDN()), 
    459        namedtype.NamedType('ava', AttributeValueAssertion()) 
    460    ) 
    461 
    462 
    463class CompareResponse(LDAPResult): 
    464    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    465        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 15) 
    466    ) 
    467 
    468 
    469class AbandonRequest(LDAPResult): 
    470    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    471        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 16) 
    472    ) 
    473 
    474 
    475class ExtendedRequest(univ.Sequence): 
    476    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    477        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 23) 
    478    ) 
    479    componentType = namedtype.NamedTypes( 
    480        namedtype.NamedType('requestName', 
    481                            LDAPOID().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))), 
    482        namedtype.OptionalNamedType('requestValue', univ.OctetString().subtype( 
    483            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1))) 
    484    ) 
    485 
    486 
    487class ExtendedResponse(univ.Sequence): 
    488    tagSet = univ.Sequence.tagSet.tagImplicitly( 
    489        tag.Tag(tag.tagClassApplication, tag.tagFormatConstructed, 24) 
    490    ) 
    491    componentType = namedtype.NamedTypes( 
    492        namedtype.NamedType('resultCode', univ.Enumerated( 
    493            namedValues=namedval.NamedValues(('success', 0), ('operationsError', 1), ('protocolError', 2), 
    494                                             ('timeLimitExceeded', 3), ('sizeLimitExceeded', 4), ('compareFalse', 5), 
    495                                             ('compareTrue', 6), ('authMethodNotSupported', 7), 
    496                                             ('strongAuthRequired', 8), ('reserved-9', 9), ('referral', 10), 
    497                                             ('adminLimitExceeded', 11), ('unavailableCriticalExtension', 12), 
    498                                             ('confidentialityRequired', 13), ('saslBindInProgress', 14), 
    499                                             ('noSuchAttribute', 16), ('undefinedAttributeType', 17), 
    500                                             ('inappropriateMatching', 18), ('constraintViolation', 19), 
    501                                             ('attributeOrValueExists', 20), ('invalidAttributeSyntax', 21), 
    502                                             ('noSuchObject', 32), ('aliasProblem', 33), ('invalidDNSyntax', 34), 
    503                                             ('reserved-35', 35), ('aliasDereferencingProblem', 36), 
    504                                             ('inappropriateAuthentication', 48), ('invalidCredentials', 49), 
    505                                             ('insufficientAccessRights', 50), ('busy', 51), ('unavailable', 52), 
    506                                             ('unwillingToPerform', 53), ('loopDetect', 54), ('namingViolation', 64), 
    507                                             ('objectClassViolation', 65), ('notAllowedOnNonLeaf', 66), 
    508                                             ('notAllowedOnRDN', 67), ('entryAlreadyExists', 68), 
    509                                             ('objectClassModsProhibited', 69), ('reserved-70', 70), 
    510                                             ('affectsMultipleDSAs', 71), ('other', 80), ('reserved-81', 81), 
    511                                             ('reserved-82', 82), ('reserved-83', 83), ('reserved-84', 84), 
    512                                             ('reserved-85', 85), ('reserved-86', 86), ('reserved-87', 87), 
    513                                             ('reserved-88', 88), ('reserved-89', 89), ('reserved-90', 90)))), 
    514        namedtype.NamedType('matchedDN', LDAPDN()), 
    515        namedtype.NamedType('errorMessage', LDAPString()), 
    516        namedtype.OptionalNamedType('referral', Referral().subtype( 
    517            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 3))), 
    518 
    519        namedtype.OptionalNamedType('responseName', LDAPOID().subtype( 
    520            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 10))), 
    521        namedtype.OptionalNamedType('response', univ.OctetString().subtype( 
    522            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 11))) 
    523    ) 
    524 
    525 
    526class MessageID(univ.Integer): 
    527    subtypeSpec = univ.Integer.subtypeSpec + constraint.ValueRangeConstraint( 
    528        0, maxInt 
    529    ) 
    530 
    531 
    532class LDAPMessage(univ.Sequence): 
    533    componentType = namedtype.NamedTypes( 
    534        namedtype.NamedType('messageID', MessageID()), 
    535        namedtype.NamedType( 
    536            'protocolOp', univ.Choice( 
    537                componentType=namedtype.NamedTypes( 
    538                    namedtype.NamedType('bindRequest', BindRequest()), 
    539                    namedtype.NamedType('bindResponse', BindResponse()), 
    540                    namedtype.NamedType('unbindRequest', UnbindRequest()), 
    541                    namedtype.NamedType('searchRequest', SearchRequest()), 
    542                    namedtype.NamedType('searchResEntry', SearchResultEntry()), 
    543                    namedtype.NamedType('searchResDone', SearchResultDone()), 
    544                    namedtype.NamedType('searchResRef', SearchResultReference()), 
    545                    namedtype.NamedType('modifyRequest', ModifyRequest()), 
    546                    namedtype.NamedType('modifyResponse', ModifyResponse()), 
    547                    namedtype.NamedType('addRequest', AddRequest()), 
    548                    namedtype.NamedType('addResponse', AddResponse()), 
    549                    namedtype.NamedType('delRequest', DelRequest()), 
    550                    namedtype.NamedType('delResponse', DelResponse()), 
    551                    namedtype.NamedType('modDNRequest', ModifyDNRequest()), 
    552                    namedtype.NamedType('modDNResponse', ModifyDNResponse()), 
    553                    namedtype.NamedType('compareRequest', CompareRequest()), 
    554                    namedtype.NamedType('compareResponse', CompareResponse()), 
    555                    namedtype.NamedType('abandonRequest', AbandonRequest()), 
    556                    namedtype.NamedType('extendedReq', ExtendedRequest()), 
    557                    namedtype.NamedType('extendedResp', ExtendedResponse()) 
    558                ) 
    559            ) 
    560        ), 
    561        namedtype.OptionalNamedType('controls', Controls().subtype( 
    562            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0))) 
    563    )