|
Packit |
ef9df4 |
$desc = <<'ESQ';
|
|
Packit |
ef9df4 |
LDAPMessage ::= SEQUENCE {
|
|
Packit |
ef9df4 |
messageID MessageID,
|
|
Packit |
ef9df4 |
protocolOp CHOICE {
|
|
Packit |
ef9df4 |
bindRequest BindRequest,
|
|
Packit |
ef9df4 |
bindResponse BindResponse,
|
|
Packit |
ef9df4 |
unbindRequest UnbindRequest,
|
|
Packit |
ef9df4 |
searchRequest SearchRequest,
|
|
Packit |
ef9df4 |
searchResEntry SearchResultEntry,
|
|
Packit |
ef9df4 |
searchResDone SearchResultDone,
|
|
Packit |
ef9df4 |
searchResRef SearchResultReference,
|
|
Packit |
ef9df4 |
modifyRequest ModifyRequest,
|
|
Packit |
ef9df4 |
modifyResponse ModifyResponse,
|
|
Packit |
ef9df4 |
addRequest AddRequest,
|
|
Packit |
ef9df4 |
addResponse AddResponse,
|
|
Packit |
ef9df4 |
delRequest DelRequest,
|
|
Packit |
ef9df4 |
delResponse DelResponse,
|
|
Packit |
ef9df4 |
modDNRequest ModifyDNRequest,
|
|
Packit |
ef9df4 |
modDNResponse ModifyDNResponse,
|
|
Packit |
ef9df4 |
compareRequest CompareRequest,
|
|
Packit |
ef9df4 |
compareResponse CompareResponse,
|
|
Packit |
ef9df4 |
abandonRequest AbandonRequest,
|
|
Packit |
ef9df4 |
extendedReq ExtendedRequest,
|
|
Packit |
ef9df4 |
extendedResp ExtendedResponse }
|
|
Packit |
ef9df4 |
controls [0] Controls OPTIONAL }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
MessageID ::= INTEGER -- (0 .. maxInt)
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
-- maxInt INTEGER ::= 2147483647 -- (2^^31 - 1) --
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
LDAPString ::= OCTET STRING
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
LDAPOID ::= OCTET STRING
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
LDAPDN ::= LDAPString
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
RelativeLDAPDN ::= LDAPString
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
AttributeType ::= LDAPString
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
AttributeDescription ::= LDAPString
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
AttributeDescriptionList ::= SEQUENCE OF
|
|
Packit |
ef9df4 |
AttributeDescription
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
AttributeValue ::= OCTET STRING
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
AttributeValueAssertion ::= SEQUENCE {
|
|
Packit |
ef9df4 |
attributeDesc AttributeDescription,
|
|
Packit |
ef9df4 |
assertionValue AssertionValue }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
AssertionValue ::= OCTET STRING
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
Attribute ::= SEQUENCE {
|
|
Packit |
ef9df4 |
type AttributeDescription,
|
|
Packit |
ef9df4 |
vals SET OF AttributeValue }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
MatchingRuleId ::= LDAPString
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
LDAPResult ::= SEQUENCE {
|
|
Packit |
ef9df4 |
resultCode ENUMERATED {
|
|
Packit |
ef9df4 |
success (0),
|
|
Packit |
ef9df4 |
operationsError (1),
|
|
Packit |
ef9df4 |
protocolError (2),
|
|
Packit |
ef9df4 |
timeLimitExceeded (3),
|
|
Packit |
ef9df4 |
sizeLimitExceeded (4),
|
|
Packit |
ef9df4 |
compareFalse (5),
|
|
Packit |
ef9df4 |
compareTrue (6),
|
|
Packit |
ef9df4 |
authMethodNotSupported (7),
|
|
Packit |
ef9df4 |
strongAuthRequired (8),
|
|
Packit |
ef9df4 |
-- 9 reserved --
|
|
Packit |
ef9df4 |
referral (10), -- new
|
|
Packit |
ef9df4 |
adminLimitExceeded (11), -- new
|
|
Packit |
ef9df4 |
unavailableCriticalExtension (12), -- new
|
|
Packit |
ef9df4 |
confidentialityRequired (13), -- new
|
|
Packit |
ef9df4 |
saslBindInProgress (14), -- new
|
|
Packit |
ef9df4 |
noSuchAttribute (16),
|
|
Packit |
ef9df4 |
undefinedAttributeType (17),
|
|
Packit |
ef9df4 |
inappropriateMatching (18),
|
|
Packit |
ef9df4 |
constraintViolation (19),
|
|
Packit |
ef9df4 |
attributeOrValueExists (20),
|
|
Packit |
ef9df4 |
invalidAttributeSyntax (21),
|
|
Packit |
ef9df4 |
-- 22-31 unused --
|
|
Packit |
ef9df4 |
noSuchObject (32),
|
|
Packit |
ef9df4 |
aliasProblem (33),
|
|
Packit |
ef9df4 |
invalidDNSyntax (34),
|
|
Packit |
ef9df4 |
-- 35 reserved for undefined isLeaf --
|
|
Packit |
ef9df4 |
aliasDereferencingProblem (36),
|
|
Packit |
ef9df4 |
-- 37-47 unused --
|
|
Packit |
ef9df4 |
inappropriateAuthentication (48),
|
|
Packit |
ef9df4 |
invalidCredentials (49),
|
|
Packit |
ef9df4 |
insufficientAccessRights (50),
|
|
Packit |
ef9df4 |
busy (51),
|
|
Packit |
ef9df4 |
unavailable (52),
|
|
Packit |
ef9df4 |
unwillingToPerform (53),
|
|
Packit |
ef9df4 |
loopDetect (54),
|
|
Packit |
ef9df4 |
-- 55-63 unused --
|
|
Packit |
ef9df4 |
namingViolation (64),
|
|
Packit |
ef9df4 |
objectClassViolation (65),
|
|
Packit |
ef9df4 |
notAllowedOnNonLeaf (66),
|
|
Packit |
ef9df4 |
notAllowedOnRDN (67),
|
|
Packit |
ef9df4 |
entryAlreadyExists (68),
|
|
Packit |
ef9df4 |
objectClassModsProhibited (69),
|
|
Packit |
ef9df4 |
-- 70 reserved for CLDAP --
|
|
Packit |
ef9df4 |
affectsMultipleDSAs (71), -- new
|
|
Packit |
ef9df4 |
-- 72-79 unused --
|
|
Packit |
ef9df4 |
other (80)}
|
|
Packit |
ef9df4 |
-- 81-90 reserved for APIs --
|
|
Packit |
ef9df4 |
matchedDN LDAPDN,
|
|
Packit |
ef9df4 |
errorMessage LDAPString,
|
|
Packit |
ef9df4 |
referral [3] Referral OPTIONAL }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
Referral ::= SEQUENCE OF LDAPURL
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
LDAPURL ::= LDAPString -- limited to characters permitted in URLs
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
Controls ::= SEQUENCE OF Control
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
Control ::= SEQUENCE {
|
|
Packit |
ef9df4 |
controlType LDAPOID,
|
|
Packit |
ef9df4 |
criticality BOOLEAN , -- DEFAULT FALSE,
|
|
Packit |
ef9df4 |
controlValue OCTET STRING OPTIONAL }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
BindRequest ::= [APPLICATION 0] SEQUENCE {
|
|
Packit |
ef9df4 |
version INTEGER, -- (1 .. 127),
|
|
Packit |
ef9df4 |
name LDAPDN,
|
|
Packit |
ef9df4 |
authentication AuthenticationChoice }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
AuthenticationChoice ::= CHOICE {
|
|
Packit |
ef9df4 |
simple [0] OCTET STRING,
|
|
Packit |
ef9df4 |
-- 1 and 2 reserved
|
|
Packit |
ef9df4 |
sasl [3] SaslCredentials }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
SaslCredentials ::= SEQUENCE {
|
|
Packit |
ef9df4 |
mechanism LDAPString,
|
|
Packit |
ef9df4 |
credentials OCTET STRING OPTIONAL }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
BindResponse ::= [APPLICATION 1] SEQUENCE {
|
|
Packit |
ef9df4 |
COMPONENTS OF LDAPResult,
|
|
Packit |
ef9df4 |
serverSaslCreds [7] OCTET STRING OPTIONAL }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
UnbindRequest ::= [APPLICATION 2] NULL
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
SearchRequest ::= [APPLICATION 3] SEQUENCE {
|
|
Packit |
ef9df4 |
baseObject LDAPDN,
|
|
Packit |
ef9df4 |
scope ENUMERATED {
|
|
Packit |
ef9df4 |
baseObject (0),
|
|
Packit |
ef9df4 |
singleLevel (1),
|
|
Packit |
ef9df4 |
wholeSubtree (2) }
|
|
Packit |
ef9df4 |
derefAliases ENUMERATED {
|
|
Packit |
ef9df4 |
neverDerefAliases (0),
|
|
Packit |
ef9df4 |
derefInSearching (1),
|
|
Packit |
ef9df4 |
derefFindingBaseObj (2),
|
|
Packit |
ef9df4 |
derefAlways (3) }
|
|
Packit |
ef9df4 |
sizeLimit INTEGER , -- (0 .. maxInt),
|
|
Packit |
ef9df4 |
timeLimit INTEGER , -- (0 .. maxInt),
|
|
Packit |
ef9df4 |
typesOnly BOOLEAN,
|
|
Packit |
ef9df4 |
filter Filter,
|
|
Packit |
ef9df4 |
attributes AttributeDescriptionList }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
Filter ::= CHOICE {
|
|
Packit |
ef9df4 |
and [0] SET OF Filter,
|
|
Packit |
ef9df4 |
or [1] SET OF Filter,
|
|
Packit |
ef9df4 |
not [2] Filter,
|
|
Packit |
ef9df4 |
equalityMatch [3] AttributeValueAssertion,
|
|
Packit |
ef9df4 |
substrings [4] SubstringFilter,
|
|
Packit |
ef9df4 |
greaterOrEqual [5] AttributeValueAssertion,
|
|
Packit |
ef9df4 |
lessOrEqual [6] AttributeValueAssertion,
|
|
Packit |
ef9df4 |
present [7] AttributeDescription,
|
|
Packit |
ef9df4 |
approxMatch [8] AttributeValueAssertion,
|
|
Packit |
ef9df4 |
extensibleMatch [9] MatchingRuleAssertion }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
SubstringFilter ::= SEQUENCE {
|
|
Packit |
ef9df4 |
type AttributeDescription,
|
|
Packit |
ef9df4 |
-- at least one must be present
|
|
Packit |
ef9df4 |
substrings SEQUENCE OF CHOICE {
|
|
Packit |
ef9df4 |
initial [0] LDAPString,
|
|
Packit |
ef9df4 |
any [1] LDAPString,
|
|
Packit |
ef9df4 |
final [2] LDAPString } }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
MatchingRuleAssertion ::= SEQUENCE {
|
|
Packit |
ef9df4 |
matchingRule [1] MatchingRuleId OPTIONAL,
|
|
Packit |
ef9df4 |
type [2] AttributeDescription OPTIONAL,
|
|
Packit |
ef9df4 |
matchValue [3] AssertionValue,
|
|
Packit |
ef9df4 |
dnAttributes [4] BOOLEAN } -- DEFAULT FALSE }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
SearchResultEntry ::= [APPLICATION 4] SEQUENCE {
|
|
Packit |
ef9df4 |
objectName LDAPDN,
|
|
Packit |
ef9df4 |
attributes PartialAttributeList }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
PartialAttributeList ::= SEQUENCE OF SEQUENCE {
|
|
Packit |
ef9df4 |
type AttributeDescription,
|
|
Packit |
ef9df4 |
vals SET OF AttributeValue }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
SearchResultReference ::= [APPLICATION 19] SEQUENCE OF LDAPURL
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
SearchResultDone ::= [APPLICATION 5] LDAPResult
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
ModifyRequest ::= [APPLICATION 6] SEQUENCE {
|
|
Packit |
ef9df4 |
object LDAPDN,
|
|
Packit |
ef9df4 |
modification SEQUENCE OF SEQUENCE {
|
|
Packit |
ef9df4 |
operation ENUMERATED {
|
|
Packit |
ef9df4 |
add (0),
|
|
Packit |
ef9df4 |
delete (1),
|
|
Packit |
ef9df4 |
replace (2) }
|
|
Packit |
ef9df4 |
modification AttributeTypeAndValues } }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
AttributeTypeAndValues ::= SEQUENCE {
|
|
Packit |
ef9df4 |
type AttributeDescription,
|
|
Packit |
ef9df4 |
vals SET OF AttributeValue }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
ModifyResponse ::= [APPLICATION 7] LDAPResult
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
AddRequest ::= [APPLICATION 8] SEQUENCE {
|
|
Packit |
ef9df4 |
entry LDAPDN,
|
|
Packit |
ef9df4 |
attributes AttributeList }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
AttributeList ::= SEQUENCE OF SEQUENCE {
|
|
Packit |
ef9df4 |
type AttributeDescription,
|
|
Packit |
ef9df4 |
vals SET OF AttributeValue }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
AddResponse ::= [APPLICATION 9] LDAPResult
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
DelRequest ::= [APPLICATION 10] LDAPDN
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
DelResponse ::= [APPLICATION 11] LDAPResult
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
ModifyDNRequest ::= [APPLICATION 12] SEQUENCE {
|
|
Packit |
ef9df4 |
entry LDAPDN,
|
|
Packit |
ef9df4 |
newrdn RelativeLDAPDN,
|
|
Packit |
ef9df4 |
deleteoldrdn BOOLEAN,
|
|
Packit |
ef9df4 |
newSuperior [0] LDAPDN OPTIONAL }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
ModifyDNResponse ::= [APPLICATION 13] LDAPResult
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
CompareRequest ::= [APPLICATION 14] SEQUENCE {
|
|
Packit |
ef9df4 |
entry LDAPDN,
|
|
Packit |
ef9df4 |
ava AttributeValueAssertion }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
CompareResponse ::= [APPLICATION 15] LDAPResult
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
AbandonRequest ::= [APPLICATION 16] MessageID
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
ExtendedRequest ::= [APPLICATION 23] SEQUENCE {
|
|
Packit |
ef9df4 |
requestName [0] LDAPOID,
|
|
Packit |
ef9df4 |
requestValue [1] OCTET STRING OPTIONAL }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
ExtendedResponse ::= [APPLICATION 24] SEQUENCE {
|
|
Packit |
ef9df4 |
COMPONENTS OF LDAPResult,
|
|
Packit |
ef9df4 |
responseName [10] LDAPOID OPTIONAL,
|
|
Packit |
ef9df4 |
response [11] OCTET STRING OPTIONAL }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
VirtualListViewRequest ::= SEQUENCE {
|
|
Packit |
ef9df4 |
beforeCount INTEGER , --(0 .. maxInt),
|
|
Packit |
ef9df4 |
afterCount INTEGER , --(0 .. maxInt),
|
|
Packit |
ef9df4 |
CHOICE {
|
|
Packit |
ef9df4 |
byIndex [0] SEQUENCE {
|
|
Packit |
ef9df4 |
index INTEGER , --(0 .. maxInt),
|
|
Packit |
ef9df4 |
contentCount INTEGER } --(0 .. maxInt) }
|
|
Packit |
ef9df4 |
byValue [1] AssertionValue }
|
|
Packit |
ef9df4 |
-- byValue [1] greaterThanOrEqual assertionValue }
|
|
Packit |
ef9df4 |
contextID OCTET STRING OPTIONAL }
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
VirtualListViewResponse ::= SEQUENCE {
|
|
Packit |
ef9df4 |
targetPosition INTEGER , --(0 .. maxInt),
|
|
Packit |
ef9df4 |
contentCount INTEGER , --(0 .. maxInt),
|
|
Packit |
ef9df4 |
virtualListViewResult ENUMERATED {
|
|
Packit |
ef9df4 |
success (0),
|
|
Packit |
ef9df4 |
operatonsError (1),
|
|
Packit |
ef9df4 |
unwillingToPerform (53),
|
|
Packit |
ef9df4 |
insufficientAccessRights (50),
|
|
Packit |
ef9df4 |
busy (51),
|
|
Packit |
ef9df4 |
timeLimitExceeded (3),
|
|
Packit |
ef9df4 |
adminLimitExceeded (11),
|
|
Packit |
ef9df4 |
sortControlMissing (60),
|
|
Packit |
ef9df4 |
indexRangeError (61),
|
|
Packit |
ef9df4 |
other (80) } }
|
|
Packit |
ef9df4 |
ESQ
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
use lib 'lib';
|
|
Packit |
ef9df4 |
use Convert::ASN1;
|
|
Packit |
ef9df4 |
use Convert::ASN1::Debug qw(asn_dump asn_hexdump);
|
|
Packit |
ef9df4 |
$asn = Convert::ASN1->new;
|
|
Packit |
ef9df4 |
$asn->prepare($desc) or die $asn->error;
|
|
Packit |
ef9df4 |
#$asn->dump;
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
$filter = $asn->find('Filter');
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
# A Filter
|
|
Packit |
ef9df4 |
# (&(!(desc=value))(|(xx=x*y*)(yy=*1*2)))
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
$buf = $filter->encode(
|
|
Packit |
ef9df4 |
{
|
|
Packit |
ef9df4 |
and => [
|
|
Packit |
ef9df4 |
{
|
|
Packit |
ef9df4 |
not => {
|
|
Packit |
ef9df4 |
equalityMatch => {
|
|
Packit |
ef9df4 |
attributeDesc => 'desc',
|
|
Packit |
ef9df4 |
assertionValue => 'value'
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
},
|
|
Packit |
ef9df4 |
{
|
|
Packit |
ef9df4 |
or => [
|
|
Packit |
ef9df4 |
{
|
|
Packit |
ef9df4 |
substrings => {
|
|
Packit |
ef9df4 |
type => 'xx',
|
|
Packit |
ef9df4 |
substrings => [
|
|
Packit |
ef9df4 |
{
|
|
Packit |
ef9df4 |
initial => 'x'
|
|
Packit |
ef9df4 |
},
|
|
Packit |
ef9df4 |
{
|
|
Packit |
ef9df4 |
any => 'y'
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
]
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
},
|
|
Packit |
ef9df4 |
{
|
|
Packit |
ef9df4 |
substrings => {
|
|
Packit |
ef9df4 |
type => 'yy',
|
|
Packit |
ef9df4 |
substrings => [
|
|
Packit |
ef9df4 |
{
|
|
Packit |
ef9df4 |
any => 1
|
|
Packit |
ef9df4 |
},
|
|
Packit |
ef9df4 |
{
|
|
Packit |
ef9df4 |
final => 2
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
]
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
]
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
]
|
|
Packit |
ef9df4 |
}
|
|
Packit |
ef9df4 |
) or die $filter->error;
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
asn_dump($buf);
|
|
Packit |
ef9df4 |
|
|
Packit |
ef9df4 |
$ret = $filter->decode($buf) or die $filter->error;
|
|
Packit |
ef9df4 |
use Data::Dumper;
|
|
Packit |
ef9df4 |
$Data::Dumper::Indent=1;
|
|
Packit |
ef9df4 |
$Data::Dumper::Quotekeys=0;
|
|
Packit |
ef9df4 |
print Dumper($ret);
|