perl-ldap-0.58/0002755000175000000620000000000012256064226013013 5ustar marschapstaffperl-ldap-0.58/install-nomake0000755000175000000620000000153712173014262015654 0ustar marschapstaff#!/bin/sh # # This script is included in this distribution for the benefit # of those users who cannot use MakeMaker and make to install. # Run this script with # # perl install-nomake [-s ] # # -s Install into this directory instead of the system site_lib # (This directory must already exist) # eval 'exec perl -x -S $0 ${1+"$@"}' if $running_under_some_shell; #! -*- perl -*- use Config; use File::Spec; use Getopt::Long; use ExtUtils::Install qw(install); my $sitelib = $Config{'sitelibexp'}; GetOptions( 'sitelib=s' => \$sitelib ); die "$sitelib is not a directory: $!" unless -d $sitelib; my $src = File::Spec->catdir(File::Spec->curdir, 'lib'); die "This script must be run from the perl-ldap distribution directory: $!\n" unless -f File::Spec->catfile($src, qw(Net LDAP.pm)); install( { $src => $sitelib }, 1,0,0); perl-ldap-0.58/META.json0000644000175000000620000000401112256063704014426 0ustar marschapstaff{ "name" : "perl-ldap", "version" : "0.58", "abstract" : "LDAP client library", "author" : [ "Graham Barr " ], "release_status" : "stable", "resources" : { "homepage" : "http://ldap.perl.org/", "repository" : { "url" : "git://github.com/perl-ldap/perl-ldap.git", "web" : "https://github.com/perl-ldap/perl-ldap", "type" : "git" }, "bugtracker" : { "web" : "https://rt.cpan.org/Public/Dist/Display.html?Name=perl-ldap" } }, "prereqs" : { "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "build" : { "requires" : { "ExtUtils::MakeMaker" : "6.42" } }, "test" : { "requires" : { "File::Basename" : "0", "File::Compare" : "0", "File::Path" : "0", "IO::File" : "0", "Test::More" : "0", "Text::Soundex" : "0" } }, "runtime" : { "requires" : { "Convert::ASN1" : "0.2", "MIME::Base64" : "0", "perl" : "5.008001" }, "recommends" : { "IO::Socket::INET6" : "0", "IO::Socket::SSL" : "1.26", "Authen::SASL" : "2.00", "URI::ldap" : "1.10", "Time::Local" : "0" }, "suggests" : { "XML::SAX::Writer" : "0", "XML::SAX::Base" : "0", "LWP::Protocol" : "0", "LWP::MediaTypes" : "0", "HTTP::Negotiate" : "0", "HTTP::Response" : "0", "HTTP::Status" : "0", "JSON" : "0" } } }, "dynamic_config" : 1, "generated_by" : "ExtUtils::MakeMaker version 6.66, hand-edited", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : "2" }, "no_index" : { "directory" : [ "t", "inc" ] } } perl-ldap-0.58/data/0002755000175000000620000000000012256064226013724 5ustar marschapstaffperl-ldap-0.58/data/openldap.schema0000644000175000000620000000275212173014262016705 0ustar marschapstaff# $OpenLDAP$ ## This work is part of OpenLDAP Software . ## ## Copyright 1998-2012 The OpenLDAP Foundation. ## All rights reserved. ## ## Redistribution and use in source and binary forms, with or without ## modification, are permitted only as authorized by the OpenLDAP ## Public License. ## ## A copy of this license is available in the file LICENSE in the ## top-level directory of the distribution or, alternatively, at ## . # # OpenLDAP Project's directory schema items # # depends upon: # core.schema # cosine.schema # inetorgperson.schema # # These are provided for informational purposes only. objectIdentifier OpenLDAProot 1.3.6.1.4.1.4203 objectIdentifier OpenLDAP OpenLDAProot:1 objectIdentifier OpenLDAPattributeType OpenLDAP:3 objectIdentifier OpenLDAPobjectClass OpenLDAP:4 objectClass ( OpenLDAPobjectClass:3 NAME 'OpenLDAPorg' DESC 'OpenLDAP Organizational Object' SUP organization MAY ( buildingName $ displayName $ labeledURI ) ) objectClass ( OpenLDAPobjectClass:4 NAME 'OpenLDAPou' DESC 'OpenLDAP Organizational Unit Object' SUP organizationalUnit MAY ( buildingName $ displayName $ labeledURI $ o ) ) objectClass ( OpenLDAPobjectClass:5 NAME 'OpenLDAPperson' DESC 'OpenLDAP Person' SUP ( pilotPerson $ inetOrgPerson ) MUST ( uid $ cn ) MAY ( givenName $ labeledURI $ o ) ) objectClass ( OpenLDAPobjectClass:6 NAME 'OpenLDAPdisplayableObject' DESC 'OpenLDAP Displayable Object' AUXILIARY MAY displayName ) perl-ldap-0.58/data/00-cmp2.ldif0000644000175000000620000000151412173014262015632 0ustar marschapstaff dn: o=University of Michigan, c=US l: Ann Arbor, Michigan st: Michigan streetaddress: 535 West William St. o: University of Michigan o: UMICH o: U-M o: U of M description: The University of Michigan at Ann Arbor postaladdress: University of Michigan $ 535 W. William St. $ Ann Arbor, MI 481 09 $ USpostalcode: 48109 telephonenumber: 911 lastmodifiedtime: 930106182800Z lastmodifiedby: cn=manager, o=university of michigan, c=US associateddomain: umich.edu counting: one counting: two counting: three first: 1 first: 2 first: 3 second: a second: b second: c dn: o=University of Michigan, c=US changetype: modify delete: objectclass - delete: o o: UM - add: counting counting: one counting: two counting: three - add: first first: 1 first: 2 first: 3 - add: second second: a second: b second: c - replace: telephonenumber telephonenumber: 911 perl-ldap-0.58/data/40-in.ldif0000644000175000000620000002312712173014262015407 0ustar marschapstaffdn: o=University of Michigan, c=US objectclass: top objectclass: organization objectclass: domainRelatedObject l: Ann Arbor, Michigan st: Michigan o: University of Michigan o: UMICH o: UM o: U-M o: U of M description: The University of Michigan at Ann Arbor postaladdress: University of Michigan $ 535 W. William St. $ Ann Arbor, MI 481 09 $ US telephonenumber: +1 313 764-1817 associateddomain: umich.edu dn: ou=People, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit ou: People dn: ou=Groups, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit ou: Groups dn: ou=Alumni Association, ou=People, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit ou: Alumni Association dn: ou=Information Technology Division, ou=People, o=University of Michigan, c =US objectclass: top objectclass: organizationalUnit ou: Information Technology Division dn: cn=All Staff,ou=Groups,o=University of Michigan,c=US member: cn=Manager, o=University of Michigan, c=US member: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=Un iversity of Michigan, c=US member: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michiga n, c=US member: cn=John Doe, ou=Information Technology Division, ou=People, o=Universi ty of Michigan, c=US member: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Mich igan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 2, ou=Information Technology Division, ou=People, o=U niversity of Michigan, c=US member: cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of M ichigan, c=US member: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=Univ ersity of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US cn: All Staff description: Everyone in the sample data objectclass: groupofnames dn: cn=Alumni Assoc Staff,ou=Groups,o=University of Michigan,c=US member: cn=Manager, o=University of Michigan, c=US member: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michiga n, c=US member: cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of M ichigan, c=US member: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Mich igan, c=US member: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US description: All Alumni Assoc Staff cn: Alumni Assoc Staff objectclass: groupofnames dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=Univer sity of Michigan, c=US objectclass: OpenLDAPperson cn: Barbara Jensen uid: barbara cn: Babs Jensen sn: Jensen title: Mythical Manager, Research Systems postaladdress: ITD Prod Dev & Deployment $ 535 W. William St. Room 4212 $ Ann Arbor, MI 48103-4943 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US userpassword:: YmplbnNlbg== mail: bjensen@mailgw.umich.edu homepostaladdress: 123 Wesley $ Ann Arbor, MI 48103 description: Mythical manager of the rsdd unix project drink: water homephone: +1 313 555 2333 pager: +1 313 555 3233 facsimiletelephonenumber: +1 313 555 2274 telephonenumber: +1 313 555 9022 dn: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=Universi ty of Michigan, c=US objectclass: OpenLDAPperson cn: Bjorn Jensen cn: Biiff Jensen uid: bjorn sn: Jensen seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US userpassword:: Ympvcm4= homepostaladdress: 19923 Seven Mile Rd. $ South Lyon, MI 49999 drink: Iced Tea description: Hiker, biker title: Director, Embedded Systems postaladdress: Info Tech Division $ 535 W. William St. $ Ann Arbor, MI 48103 mail: bjorn@mailgw.umich.edu homephone: +1 313 555 5444 pager: +1 313 555 4474 facsimiletelephonenumber: +1 313 555 2177 telephonenumber: +1 313 555 0355 dn: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Mich igan, c=US objectclass: OpenLDAPperson cn: Dorothy Stevens cn: Dot Stevens uid: dorothy sn: Stevens title: Secretary, UM Alumni Association postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US drink: Lemonade homepostaladdress: 377 White St. Apt. 3 $ Ann Arbor, MI 48104 description: Very tall facsimiletelephonenumber: +1 313 555 3223 telephonenumber: +1 313 555 3664 mail: dots@mail.alumni.umich.edu homephone: +1 313 555 0454 dn: cn=ITD Staff,ou=Groups,o=University of Michigan,c=US owner: cn=Manager, o=University of Michigan, c=US description: All ITD Staff cn: ITD Staff objectclass: groupofnames member: cn=Manager, o=University of Michigan, c=US member: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=Univ ersity of Michigan, c=US member: cn=James A Jones 2, ou=Information Technology Division, ou=People, o=U niversity of Michigan, c=US member: cn=John Doe, ou=Information Technology Division, ou=People, o=Universi ty of Michigan, c=US dn: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Mich igan, c=US objectclass: OpenLDAPperson cn: James A Jones 1 cn: James Jones cn: Jim Jones uid: james sn: Jones postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US userpassword:: amFq homepostaladdress: 3882 Beverly Rd. $ Ann Arbor, MI 48105 homephone: +1 313 555 4772 description: Outstanding title: Mad Cow Researcher, UM Alumni Association pager: +1 313 555 3923 mail: jaj@mail.alumni.umich.edu facsimiletelephonenumber: +1 313 555 4332 telephonenumber: +1 313 555 0895 dn: cn=James A Jones 2, ou=Information Technology Division, ou=People, o=Unive rsity of Michigan, c=US objectclass: OpenLDAPperson cn: James A Jones 2 cn: James Jones cn: Jim Jones uid: jim sn: Doe seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US homepostaladdress: 933 Brooks $ Ann Arbor, MI 48104 homephone: +1 313 555 8838 title: Senior Manager, Information Technology Division description: Not around very much mail: jjones@mailgw.umich.edu postaladdress: Info Tech Division $ 535 W William $ Ann Arbor, MI 48103 pager: +1 313 555 2833 facsimiletelephonenumber: +1 313 555 8688 telephonenumber: +1 313 555 7334 dn: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michigan, c =US objectclass: OpenLDAPperson cn: Jane Doe cn: Jane Alverson uid: jane sn: Doe title: Programmer Analyst, UM Alumni Association postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US homepostaladdress: 123 Anystreet $ Ann Arbor, MI 48104 drink: diet coke description: Enthusiastic mail: jdoe@woof.net homephone: +1 313 555 5445 pager: +1 313 555 1220 facsimiletelephonenumber: +1 313 555 2311 telephonenumber: +1 313 555 4774 dn: cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of Michi gan, c=US objectclass: OpenLDAPperson cn: Jennifer Smith cn: Jen Smith uid: jen sn: Smith postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US drink: Sam Adams homepostaladdress: 1000 Maple #44 $ Ann Arbor, MI 48103 title: Telemarketer, UM Alumni Association mail: jen@mail.alumni.umich.edu homephone: +1 313 555 2333 pager: +1 313 555 6442 facsimiletelephonenumber: +1 313 555 2756 telephonenumber: +1 313 555 8232 dn: cn=John Doe, ou=Information Technology Division, ou=People, o=University o f Michigan, c=US objectclass: OpenLDAPperson cn: John Doe cn: Jonathon Doe uid: john sn: Doe postaladdress: ITD $ 535 W. William $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US homepostaladdress: 912 East Bllvd $ Ann Arbor, MI 48104 title: System Administrator, Information Technology Division description: overworked! mail: johnd@mailgw.umich.edu homephone: +1 313 555 3774 pager: +1 313 555 6573 facsimiletelephonenumber: +1 313 555 4544 telephonenumber: +1 313 555 9394 dn: cn=Manager, o=University of Michigan, c=US objectclass: top objectclass: person cn: Manager cn: Directory Manager cn: Dir Man sn: Manager description: Manager of the directory userpassword:: c2VjcmV0 dn: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Michigan , c=US objectclass: OpenLDAPperson cn: Mark Elliot cn: Mark A Elliot uid: mark sn: Elliot postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US homepostaladdress: 199 Outer Drive $ Ypsilanti, MI 48198 homephone: +1 313 555 0388 drink: Gasoline title: Director, UM Alumni Association mail: melliot@mail.alumni.umich.edu pager: +1 313 555 7671 facsimiletelephonenumber: +1 313 555 7762 telephonenumber: +1 313 555 4177 dn: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Mich igan, c=US objectclass: OpenLDAPperson cn: Ursula Hampster uid: ursula sn: Hampster title: Secretary, UM Alumni Association postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US homepostaladdress: 123 Anystreet $ Ann Arbor, MI 48104 mail: uham@mail.alumni.umich.edu homephone: +1 313 555 8421 pager: +1 313 555 2844 facsimiletelephonenumber: +1 313 555 9700 telephonenumber: +1 313 555 5331 perl-ldap-0.58/data/41b-cmp.ldif0000644000175000000620000000621512173014262015722 0ustar marschapstaff dn: cn=All Staff, ou=Groups, o=University of Michigan, c=US member: cn=Manager, o=University of Michigan, c=US member: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=Un iversity of Michigan, c=US member: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michiga n, c=US member: cn=John Doe, ou=Information Technology Division, ou=People, o=Universi ty of Michigan, c=US member: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Mich igan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 2, ou=Information Technology Division, ou=People, o=U niversity of Michigan, c=US member: cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of M ichigan, c=US member: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=Univ ersity of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US cn: All Staff description: Everyone in the sample data objectclass: groupOfNames dn: cn=Alumni Assoc Staff, ou=Groups, o=University of Michigan, c=US member: cn=Manager, o=University of Michigan, c=US member: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michiga n, c=US member: cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of M ichigan, c=US member: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Mich igan, c=US member: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US description: All Alumni Assoc Staff cn: Alumni Assoc Staff objectclass: groupOfNames dn: cn=ITD Staff, ou=Groups, o=University of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US description: All ITD Staff cn: ITD Staff objectclass: groupOfNames member: cn=Manager, o=University of Michigan, c=US member: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=Univ ersity of Michigan, c=US member: cn=James A Jones 2, ou=Information Technology Division, ou=People, o=U niversity of Michigan, c=US member: cn=John Doe, ou=Information Technology Division, ou=People, o=Universi ty of Michigan, c=US dn: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Mich igan, c=US objectclass: OpenLDAPperson cn: James A Jones 1 cn: James Jones cn: Jim Jones uid: james sn: Jones postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US userpassword: jaj homepostaladdress: 3882 Beverly Rd. $ Ann Arbor, MI 48105 homephone: +1 313 555 4772 description: Outstanding title: Mad Cow Researcher, UM Alumni Association pager: +1 313 555 3923 mail: jaj@mail.alumni.umich.edu facsimiletelephonenumber: +1 313 555 4332 telephonenumber: +1 313 555 0895 perl-ldap-0.58/data/regenerate_cert.sh0000755000175000000620000000071612173014262017414 0ustar marschapstaff#/bin/sh # regenerate server certificate for the SSL tests if [ -e openssl.cnf ]; then # make sure we have a password-less 2048-bit RSA key openssl genrsa -out key.pem 2048 >/dev/null 2>&1 # create a self-signed certificate with the DN cn=localhost,dc=demo,dc=perl-ldap openssl req -config openssl.cnf \ -new -x509 \ -key key.pem \ -out cert.pem \ -days 365 \ -subj /domainComponent=perl-ldap/domainComponent=demo/commonName=localhost fi # EOF perl-ldap-0.58/data/00-in.ldif0000644000175000000620000000544012173014262015401 0ustar marschapstaffversion: 1 dn: o=University of Michigan, c=US objectclass: top objectclass: organization objectclass: domainRelatedObject objectclass: quipuObject objectclass: quipuNonLeafObject l: Ann Arbor, Michigan st: Michigan streetaddress: 535 West William St. o: University of Michigan o: UMICH o: UM o: U-M o: U of M description: The University of Michigan at Ann Arbor postaladdress: University of Michigan $ 535 W. William St. $ Ann Arbor, MI 481 09 $ USpostalcode: 48109 telephonenumber: +1 313 764-1817 lastmodifiedtime: 930106182800Z lastmodifiedby: cn=manager, o=university of michigan, c=US associateddomain: umich.edu dn: ou=People, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit objectclass: quipuObject objectclass: quipuNonLeafObject ou: People dn: ou=Groups, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit objectclass: quipuObject objectclass: quipuNonLeafObject ou: Groups lastmodifiedtime: 950120182331Z lastmodifiedby: cn=manager, o=university of michigan, c=US dn: ou=Alumni Association, ou=People, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit objectclass: quipuObject objectclass: quipuNonLeafObject ou: Alumni Association dn: ou=Information Technology Division, ou=People, o=University of Michigan, c =US objectclass: top objectclass: organizationalUnit objectclass: quipuObject objectclass: quipuNonLeafObject ou: Information Technology Divisio dn: cn=All Staff,ou=Groups,o=University of Michigan,c=US member: cn=Manager, o=University of Michigan, c=US member: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=Un iversity of Michigan, c=US member: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michiga n, c=US member: cn=John Doe, ou=Information Technology Division, ou=People, o=Universi ty of Michigan, c=US member: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Mich igan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 2, ou=Information Technology Division, ou=People, o=U niversity of Michigan, c=US member: cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of M ichigan, c=US member: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=Univ ersity of Michigan, c=US associateddomain: umich.edu requeststo: cn=Manager, o=University of Michigan, c=US errorsto: cn=Manager, o=University of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US cn: All Staff joinable: FALSE multi-linedescription: Everyone in the sample data objectclass: rfc822mailgroup perl-ldap-0.58/data/42-mod.ldif0000644000175000000620000000306112173014262015555 0ustar marschapstaffdn: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US changetype: modify add: drink drink: Orange Juice dn: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US changetype: modify replace: description description: The replaced multiLineDescription $ Blah Woof. - replace: drink drink: Iced Tea drink: Mad Dog 20/20 dn: cn=ITD Staff,ou=Groups,o=University of Michigan,c=US changetype: modify delete: member member: cn=James A Jones 2, ou=Information Technology Division, ou=People, o=University of Michigan, c=US member: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US - add: member member: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US dn: cn=Gern Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US changetype: add objectclass: OpenLDAPperson cn: Gern Jensen sn: Jensen uid: gern title: Chief Investigator, ITD postaladdress: ITD $ 535 W. William St $ Ann Arbor, MI 48103 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US drink: Coffee homepostaladdress: 844 Brown St. Apt. 4 $ Ann Arbor, MI 48104 description: Very odd facsimiletelephonenumber: +1 313 555 7557 telephonenumber: +1 313 555 8343 mail: gjensen@mailgw.umich.edu homephone: +1 313 555 8844 dn: cn=James A Jones 2, ou=Information Technology Division, ou=People, o=University of Michigan, c=US changetype: delete perl-ldap-0.58/data/cosine.schema0000644000175000000620000022041212173014262016356 0ustar marschapstaff# RFC1274: Cosine and Internet X.500 schema # $OpenLDAP$ ## This work is part of OpenLDAP Software . ## ## Copyright 1998-2012 The OpenLDAP Foundation. ## All rights reserved. ## ## Redistribution and use in source and binary forms, with or without ## modification, are permitted only as authorized by the OpenLDAP ## Public License. ## ## A copy of this license is available in the file LICENSE in the ## top-level directory of the distribution or, alternatively, at ## . # # RFC1274: Cosine and Internet X.500 schema # # This file contains LDAPv3 schema derived from X.500 COSINE "pilot" # schema. As this schema was defined for X.500(89), some # oddities were introduced in the mapping to LDAPv3. The # mappings were based upon: draft-ietf-asid-ldapv3-attributes-03.txt # (a work in progress) # # Note: It seems that the pilot schema evolved beyond what was # described in RFC1274. However, this document attempts to describes # RFC1274 as published. # # Depends on core.schema # Network Working Group P. Barker # Request for Comments: 1274 S. Kille # University College London # November 1991 # # The COSINE and Internet X.500 Schema # # [trimmed] # # Abstract # # This document suggests an X.500 Directory Schema, or Naming # Architecture, for use in the COSINE and Internet X.500 pilots. The # schema is independent of any specific implementation. As well as # indicating support for the standard object classes and attributes, a # large number of generally useful object classes and attributes are # also defined. An appendix to this document includes a machine # processable version of the schema. # # [trimmed] # 7. Object Identifiers # # Some additional object identifiers are defined for this schema. # These are also reproduced in Appendix C. # # data OBJECT IDENTIFIER ::= {ccitt 9} # pss OBJECT IDENTIFIER ::= {data 2342} # ucl OBJECT IDENTIFIER ::= {pss 19200300} # pilot OBJECT IDENTIFIER ::= {ucl 100} # # pilotAttributeType OBJECT IDENTIFIER ::= {pilot 1} # pilotAttributeSyntax OBJECT IDENTIFIER ::= {pilot 3} # pilotObjectClass OBJECT IDENTIFIER ::= {pilot 4} # pilotGroups OBJECT IDENTIFIER ::= {pilot 10} # # iA5StringSyntax OBJECT IDENTIFIER ::= {pilotAttributeSyntax 4} # caseIgnoreIA5StringSyntax OBJECT IDENTIFIER ::= # {pilotAttributeSyntax 5} # # 8. Object Classes # [relocated after 9] # # 9. Attribute Types # # 9.1. X.500 standard attribute types # # A number of generally useful attribute types are defined in X.520, # and these are supported. Refer to that document for descriptions of # the suggested usage of these attribute types. The ASN.1 for these # attribute types is reproduced for completeness in Appendix C. # # 9.2. X.400 standard attribute types # # The standard X.400 attribute types are supported. See X.402 for full # details. The ASN.1 for these attribute types is reproduced in # Appendix C. # # 9.3. COSINE/Internet attribute types # # This section describes all the attribute types defined for use in the # COSINE and Internet pilots. Descriptions are given as to the # suggested usage of these attribute types. The ASN.1 for these # attribute types is reproduced in Appendix C. # # 9.3.1. Userid # # The Userid attribute type specifies a computer system login name. # # userid ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-user-identifier)) # ::= {pilotAttributeType 1} # #(in core.schema) ##attributetype ( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userid' ) ## EQUALITY caseIgnoreMatch ## SUBSTR caseIgnoreSubstringsMatch ## SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) # 9.3.2. Text Encoded O/R Address # # The Text Encoded O/R Address attribute type specifies a text encoding # of an X.400 O/R address, as specified in RFC 987. The use of this # attribute is deprecated as the attribute is intended for interim use # only. This attribute will be the first candidate for the attribute # expiry mechanisms! # # textEncodedORAddress ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-text-encoded-or-address)) # ::= {pilotAttributeType 2} # attributetype ( 0.9.2342.19200300.100.1.2 NAME 'textEncodedORAddress' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) # 9.3.3. RFC 822 Mailbox # # The RFC822 Mailbox attribute type specifies an electronic mailbox # attribute following the syntax specified in RFC 822. Note that this # attribute should not be used for greybook or other non-Internet order # mailboxes. # # rfc822Mailbox ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreIA5StringSyntax # (SIZE (1 .. ub-rfc822-mailbox)) # ::= {pilotAttributeType 3} # #(in core.schema) ##attributetype ( 0.9.2342.19200300.100.1.3 NAME ( 'mail' 'rfc822Mailbox' ) ## EQUALITY caseIgnoreIA5Match ## SUBSTR caseIgnoreIA5SubstringsMatch ## SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} ) # 9.3.4. Information # # The Information attribute type specifies any general information # pertinent to an object. It is recommended that specific usage of # this attribute type is avoided, and that specific requirements are # met by other (possibly additional) attribute types. # # info ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-information)) # ::= {pilotAttributeType 4} # attributetype ( 0.9.2342.19200300.100.1.4 NAME 'info' DESC 'RFC1274: general information' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{2048} ) # 9.3.5. Favourite Drink # # The Favourite Drink attribute type specifies the favourite drink of # an object (or person). # # favouriteDrink ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-favourite-drink)) # ::= {pilotAttributeType 5} # attributetype ( 0.9.2342.19200300.100.1.5 NAME ( 'drink' 'favouriteDrink' ) DESC 'RFC1274: favorite drink' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) # 9.3.6. Room Number # # The Room Number attribute type specifies the room number of an # object. Note that the commonName attribute should be used for naming # room objects. # # roomNumber ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-room-number)) # ::= {pilotAttributeType 6} # attributetype ( 0.9.2342.19200300.100.1.6 NAME 'roomNumber' DESC 'RFC1274: room number' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) # 9.3.7. Photo # # The Photo attribute type specifies a "photograph" for an object. # This should be encoded in G3 fax as explained in recommendation T.4, # with an ASN.1 wrapper to make it compatible with an X.400 BodyPart as # defined in X.420. # # IMPORT G3FacsimileBodyPart FROM { mhs-motis ipms modules # information-objects } # # photo ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # CHOICE { # g3-facsimile [3] G3FacsimileBodyPart # } # (SIZE (1 .. ub-photo)) # ::= {pilotAttributeType 7} # attributetype ( 0.9.2342.19200300.100.1.7 NAME 'photo' DESC 'RFC1274: photo (G3 fax)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.23{25000} ) # 9.3.8. User Class # # The User Class attribute type specifies a category of computer user. # The semantics placed on this attribute are for local interpretation. # Examples of current usage od this attribute in academia are # undergraduate student, researcher, lecturer, etc. Note that the # organizationalStatus attribute may now often be preferred as it makes # no distinction between computer users and others. # # userClass ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-user-class)) # ::= {pilotAttributeType 8} # attributetype ( 0.9.2342.19200300.100.1.8 NAME 'userClass' DESC 'RFC1274: category of user' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) # 9.3.9. Host # # The Host attribute type specifies a host computer. # # host ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-host)) # ::= {pilotAttributeType 9} # attributetype ( 0.9.2342.19200300.100.1.9 NAME 'host' DESC 'RFC1274: host computer' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) # 9.3.10. Manager # # The Manager attribute type specifies the manager of an object # represented by an entry. # # manager ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # distinguishedNameSyntax # ::= {pilotAttributeType 10} # attributetype ( 0.9.2342.19200300.100.1.10 NAME 'manager' DESC 'RFC1274: DN of manager' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) # 9.3.11. Document Identifier # # The Document Identifier attribute type specifies a unique identifier # for a document. # # documentIdentifier ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-document-identifier)) # ::= {pilotAttributeType 11} # attributetype ( 0.9.2342.19200300.100.1.11 NAME 'documentIdentifier' DESC 'RFC1274: unique identifier of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) # 9.3.12. Document Title # # The Document Title attribute type specifies the title of a document. # # documentTitle ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-document-title)) # ::= {pilotAttributeType 12} # attributetype ( 0.9.2342.19200300.100.1.12 NAME 'documentTitle' DESC 'RFC1274: title of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) # 9.3.13. Document Version # # The Document Version attribute type specifies the version number of a # document. # # documentVersion ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-document-version)) # ::= {pilotAttributeType 13} # attributetype ( 0.9.2342.19200300.100.1.13 NAME 'documentVersion' DESC 'RFC1274: version of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) # 9.3.14. Document Author # # The Document Author attribute type specifies the distinguished name # of the author of a document. # # documentAuthor ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # distinguishedNameSyntax # ::= {pilotAttributeType 14} # attributetype ( 0.9.2342.19200300.100.1.14 NAME 'documentAuthor' DESC 'RFC1274: DN of author of document' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) # 9.3.15. Document Location # # The Document Location attribute type specifies the location of the # document original. # # documentLocation ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-document-location)) # ::= {pilotAttributeType 15} # attributetype ( 0.9.2342.19200300.100.1.15 NAME 'documentLocation' DESC 'RFC1274: location of document original' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) # 9.3.16. Home Telephone Number # # The Home Telephone Number attribute type specifies a home telephone # number associated with a person. Attribute values should follow the # agreed format for international telephone numbers: i.e., "+44 71 123 # 4567". # # homeTelephoneNumber ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # telephoneNumberSyntax # ::= {pilotAttributeType 20} # attributetype ( 0.9.2342.19200300.100.1.20 NAME ( 'homePhone' 'homeTelephoneNumber' ) DESC 'RFC1274: home telephone number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 ) # 9.3.17. Secretary # # The Secretary attribute type specifies the secretary of a person. # The attribute value for Secretary is a distinguished name. # # secretary ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # distinguishedNameSyntax # ::= {pilotAttributeType 21} # attributetype ( 0.9.2342.19200300.100.1.21 NAME 'secretary' DESC 'RFC1274: DN of secretary' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) # 9.3.18. Other Mailbox # # The Other Mailbox attribute type specifies values for electronic # mailbox types other than X.400 and rfc822. # # otherMailbox ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # SEQUENCE { # mailboxType PrintableString, -- e.g. Telemail # mailbox IA5String -- e.g. X378:Joe # } # ::= {pilotAttributeType 22} # attributetype ( 0.9.2342.19200300.100.1.22 NAME 'otherMailbox' SYNTAX 1.3.6.1.4.1.1466.115.121.1.39 ) # 9.3.19. Last Modified Time # # The Last Modified Time attribute type specifies the last time, in UTC # time, that an entry was modified. Ideally, this attribute should be # maintained by the DSA. # # lastModifiedTime ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # uTCTimeSyntax # ::= {pilotAttributeType 23} # ## Deprecated in favor of modifyTimeStamp #attributetype ( 0.9.2342.19200300.100.1.23 NAME 'lastModifiedTime' # DESC 'RFC1274: time of last modify, replaced by modifyTimestamp' # OBSOLETE # SYNTAX 1.3.6.1.4.1.1466.115.121.1.53 # USAGE directoryOperation ) # 9.3.20. Last Modified By # # The Last Modified By attribute specifies the distinguished name of # the last user to modify the associated entry. Ideally, this # attribute should be maintained by the DSA. # # lastModifiedBy ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # distinguishedNameSyntax # ::= {pilotAttributeType 24} # ## Deprecated in favor of modifiersName #attributetype ( 0.9.2342.19200300.100.1.24 NAME 'lastModifiedBy' # DESC 'RFC1274: last modifier, replaced by modifiersName' # OBSOLETE # EQUALITY distinguishedNameMatch # SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 # USAGE directoryOperation ) # 9.3.21. Domain Component # # The Domain Component attribute type specifies a DNS/NRS domain. For # example, "uk" or "ac". # # domainComponent ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreIA5StringSyntax # SINGLE VALUE # ::= {pilotAttributeType 25} # ##(in core.schema) ##attributetype ( 0.9.2342.19200300.100.1.25 NAME ( 'dc' 'domainComponent' ) ## EQUALITY caseIgnoreIA5Match ## SUBSTR caseIgnoreIA5SubstringsMatch ## SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) # 9.3.22. DNS ARecord # # The A Record attribute type specifies a type A (Address) DNS resource # record [6] [7]. # # aRecord ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # DNSRecordSyntax # ::= {pilotAttributeType 26} # ## incorrect syntax? attributetype ( 0.9.2342.19200300.100.1.26 NAME 'aRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) ## missing from RFC1274 ## incorrect syntax? attributetype ( 0.9.2342.19200300.100.1.27 NAME 'mDRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) # 9.3.23. MX Record # # The MX Record attribute type specifies a type MX (Mail Exchange) DNS # resource record [6] [7]. # # mXRecord ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # DNSRecordSyntax # ::= {pilotAttributeType 28} # ## incorrect syntax!! attributetype ( 0.9.2342.19200300.100.1.28 NAME 'mXRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) # 9.3.24. NS Record # # The NS Record attribute type specifies an NS (Name Server) DNS # resource record [6] [7]. # # nSRecord ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # DNSRecordSyntax # ::= {pilotAttributeType 29} # ## incorrect syntax!! attributetype ( 0.9.2342.19200300.100.1.29 NAME 'nSRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) # 9.3.25. SOA Record # # The SOA Record attribute type specifies a type SOA (Start of # Authority) DNS resorce record [6] [7]. # # sOARecord ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # DNSRecordSyntax # ::= {pilotAttributeType 30} # ## incorrect syntax!! attributetype ( 0.9.2342.19200300.100.1.30 NAME 'sOARecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) # 9.3.26. CNAME Record # # The CNAME Record attribute type specifies a type CNAME (Canonical # Name) DNS resource record [6] [7]. # # cNAMERecord ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # iA5StringSyntax # ::= {pilotAttributeType 31} # ## incorrect syntax!! attributetype ( 0.9.2342.19200300.100.1.31 NAME 'cNAMERecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) # 9.3.27. Associated Domain # # The Associated Domain attribute type specifies a DNS or NRS domain # which is associated with an object in the DIT. For example, the entry # in the DIT with a distinguished name "C=GB, O=University College # London" would have an associated domain of "UCL.AC.UK. Note that all # domains should be represented in rfc822 order. See [3] for more # details of usage of this attribute. # # associatedDomain ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreIA5StringSyntax # ::= {pilotAttributeType 37} # #attributetype ( 0.9.2342.19200300.100.1.37 NAME 'associatedDomain' # EQUALITY caseIgnoreIA5Match # SUBSTR caseIgnoreIA5SubstringsMatch # SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) # 9.3.28. Associated Name # # The Associated Name attribute type specifies an entry in the # organisational DIT associated with a DNS/NRS domain. See [3] for # more details of usage of this attribute. # # associatedName ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # distinguishedNameSyntax # ::= {pilotAttributeType 38} # attributetype ( 0.9.2342.19200300.100.1.38 NAME 'associatedName' DESC 'RFC1274: DN of entry associated with domain' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) # 9.3.29. Home postal address # # The Home postal address attribute type specifies a home postal # address for an object. This should be limited to up to 6 lines of 30 # characters each. # # homePostalAddress ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # postalAddress # MATCHES FOR EQUALITY # ::= {pilotAttributeType 39} # attributetype ( 0.9.2342.19200300.100.1.39 NAME 'homePostalAddress' DESC 'RFC1274: home postal address' EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 ) # 9.3.30. Personal Title # # The Personal Title attribute type specifies a personal title for a # person. Examples of personal titles are "Ms", "Dr", "Prof" and "Rev". # # personalTitle ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-personal-title)) # ::= {pilotAttributeType 40} # attributetype ( 0.9.2342.19200300.100.1.40 NAME 'personalTitle' DESC 'RFC1274: personal title' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) # 9.3.31. Mobile Telephone Number # # The Mobile Telephone Number attribute type specifies a mobile # telephone number associated with a person. Attribute values should # follow the agreed format for international telephone numbers: i.e., # "+44 71 123 4567". # # mobileTelephoneNumber ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # telephoneNumberSyntax # ::= {pilotAttributeType 41} # attributetype ( 0.9.2342.19200300.100.1.41 NAME ( 'mobile' 'mobileTelephoneNumber' ) DESC 'RFC1274: mobile telephone number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 ) # 9.3.32. Pager Telephone Number # # The Pager Telephone Number attribute type specifies a pager telephone # number for an object. Attribute values should follow the agreed # format for international telephone numbers: i.e., "+44 71 123 4567". # # pagerTelephoneNumber ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # telephoneNumberSyntax # ::= {pilotAttributeType 42} # attributetype ( 0.9.2342.19200300.100.1.42 NAME ( 'pager' 'pagerTelephoneNumber' ) DESC 'RFC1274: pager telephone number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 ) # 9.3.33. Friendly Country Name # # The Friendly Country Name attribute type specifies names of countries # in human readable format. The standard attribute country name must # be one of the two-letter codes defined in ISO 3166. # # friendlyCountryName ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # ::= {pilotAttributeType 43} # attributetype ( 0.9.2342.19200300.100.1.43 NAME ( 'co' 'friendlyCountryName' ) DESC 'RFC1274: friendly country name' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) # 9.3.34. Unique Identifier # # The Unique Identifier attribute type specifies a "unique identifier" # for an object represented in the Directory. The domain within which # the identifier is unique, and the exact semantics of the identifier, # are for local definition. For a person, this might be an # institution-wide payroll number. For an organisational unit, it # might be a department code. # # uniqueIdentifier ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-unique-identifier)) # ::= {pilotAttributeType 44} # attributetype ( 0.9.2342.19200300.100.1.44 NAME 'uniqueIdentifier' DESC 'RFC1274: unique identifer' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) # 9.3.35. Organisational Status # # The Organisational Status attribute type specifies a category by # which a person is often referred to in an organisation. Examples of # usage in academia might include undergraduate student, researcher, # lecturer, etc. # # A Directory administrator should probably consider carefully the # distinctions between this and the title and userClass attributes. # # organizationalStatus ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-organizational-status)) # ::= {pilotAttributeType 45} # attributetype ( 0.9.2342.19200300.100.1.45 NAME 'organizationalStatus' DESC 'RFC1274: organizational status' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) # 9.3.36. Janet Mailbox # # The Janet Mailbox attribute type specifies an electronic mailbox # attribute following the syntax specified in the Grey Book of the # Coloured Book series. This attribute is intended for the convenience # of U.K users unfamiliar with rfc822 and little-endian mail addresses. # Entries using this attribute MUST also include an rfc822Mailbox # attribute. # # janetMailbox ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreIA5StringSyntax # (SIZE (1 .. ub-janet-mailbox)) # ::= {pilotAttributeType 46} # attributetype ( 0.9.2342.19200300.100.1.46 NAME 'janetMailbox' DESC 'RFC1274: Janet mailbox' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} ) # 9.3.37. Mail Preference Option # # An attribute to allow users to indicate a preference for inclusion of # their names on mailing lists (electronic or physical). The absence # of such an attribute should be interpreted as if the attribute was # present with value "no-list-inclusion". This attribute should be # interpreted by anyone using the directory to derive mailing lists, # and its value respected. # # mailPreferenceOption ATTRIBUTE # WITH ATTRIBUTE-SYNTAX ENUMERATED { # no-list-inclusion(0), # any-list-inclusion(1), -- may be added to any lists # professional-list-inclusion(2) # -- may be added to lists # -- which the list provider # -- views as related to the # -- users professional inter- # -- ests, perhaps evaluated # -- from the business of the # -- organisation or keywords # -- in the entry. # } # ::= {pilotAttributeType 47} # attributetype ( 0.9.2342.19200300.100.1.47 NAME 'mailPreferenceOption' DESC 'RFC1274: mail preference option' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) # 9.3.38. Building Name # # The Building Name attribute type specifies the name of the building # where an organisation or organisational unit is based. # # buildingName ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-building-name)) # ::= {pilotAttributeType 48} # attributetype ( 0.9.2342.19200300.100.1.48 NAME 'buildingName' DESC 'RFC1274: name of building' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) # 9.3.39. DSA Quality # # The DSA Quality attribute type specifies the purported quality of a # DSA. It allows a DSA manager to indicate the expected level of # availability of the DSA. See [8] for details of the syntax. # # dSAQuality ATTRIBUTE # WITH ATTRIBUTE-SYNTAX DSAQualitySyntax # SINGLE VALUE # ::= {pilotAttributeType 49} # attributetype ( 0.9.2342.19200300.100.1.49 NAME 'dSAQuality' DESC 'RFC1274: DSA Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.19 SINGLE-VALUE ) # 9.3.40. Single Level Quality # # The Single Level Quality attribute type specifies the purported data # quality at the level immediately below in the DIT. See [8] for # details of the syntax. # # singleLevelQuality ATTRIBUTE # WITH ATTRIBUTE-SYNTAX DataQualitySyntax # SINGLE VALUE # ::= {pilotAttributeType 50} # attributetype ( 0.9.2342.19200300.100.1.50 NAME 'singleLevelQuality' DESC 'RFC1274: Single Level Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.13 SINGLE-VALUE ) # 9.3.41. Subtree Minimum Quality # # The Subtree Minimum Quality attribute type specifies the purported # minimum data quality for a DIT subtree. See [8] for more discussion # and details of the syntax. # # subtreeMinimumQuality ATTRIBUTE # WITH ATTRIBUTE-SYNTAX DataQualitySyntax # SINGLE VALUE # -- Defaults to singleLevelQuality # ::= {pilotAttributeType 51} # attributetype ( 0.9.2342.19200300.100.1.51 NAME 'subtreeMinimumQuality' DESC 'RFC1274: Subtree Mininum Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.13 SINGLE-VALUE ) # 9.3.42. Subtree Maximum Quality # # The Subtree Maximum Quality attribute type specifies the purported # maximum data quality for a DIT subtree. See [8] for more discussion # and details of the syntax. # # subtreeMaximumQuality ATTRIBUTE # WITH ATTRIBUTE-SYNTAX DataQualitySyntax # SINGLE VALUE # -- Defaults to singleLevelQuality # ::= {pilotAttributeType 52} # attributetype ( 0.9.2342.19200300.100.1.52 NAME 'subtreeMaximumQuality' DESC 'RFC1274: Subtree Maximun Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.13 SINGLE-VALUE ) # 9.3.43. Personal Signature # # The Personal Signature attribute type allows for a representation of # a person's signature. This should be encoded in G3 fax as explained # in recommendation T.4, with an ASN.1 wrapper to make it compatible # with an X.400 BodyPart as defined in X.420. # # IMPORT G3FacsimileBodyPart FROM { mhs-motis ipms modules # information-objects } # # personalSignature ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # CHOICE { # g3-facsimile [3] G3FacsimileBodyPart # } # (SIZE (1 .. ub-personal-signature)) # ::= {pilotAttributeType 53} # attributetype ( 0.9.2342.19200300.100.1.53 NAME 'personalSignature' DESC 'RFC1274: Personal Signature (G3 fax)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.23 ) # 9.3.44. DIT Redirect # # The DIT Redirect attribute type is used to indicate that the object # described by one entry now has a newer entry in the DIT. The entry # containing the redirection attribute should be expired after a # suitable grace period. This attribute may be used when an individual # changes his/her place of work, and thus acquires a new organisational # DN. # # dITRedirect ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # distinguishedNameSyntax # ::= {pilotAttributeType 54} # attributetype ( 0.9.2342.19200300.100.1.54 NAME 'dITRedirect' DESC 'RFC1274: DIT Redirect' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) # 9.3.45. Audio # # The Audio attribute type allows the storing of sounds in the # Directory. The attribute uses a u-law encoded sound file as used by # the "play" utility on a Sun 4. This is an interim format. # # audio ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # Audio # (SIZE (1 .. ub-audio)) # ::= {pilotAttributeType 55} # attributetype ( 0.9.2342.19200300.100.1.55 NAME 'audio' DESC 'RFC1274: audio (u-law)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.4{25000} ) # 9.3.46. Publisher of Document # # # The Publisher of Document attribute is the person and/or organization # that published a document. # # documentPublisher ATTRIBUTE # WITH ATTRIBUTE SYNTAX caseIgnoreStringSyntax # ::= {pilotAttributeType 56} # attributetype ( 0.9.2342.19200300.100.1.56 NAME 'documentPublisher' DESC 'RFC1274: publisher of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) # 9.4. Generally useful syntaxes # # caseIgnoreIA5StringSyntax ATTRIBUTE-SYNTAX # IA5String # MATCHES FOR EQUALITY SUBSTRINGS # # iA5StringSyntax ATTRIBUTE-SYNTAX # IA5String # MATCHES FOR EQUALITY SUBSTRINGS # # # -- Syntaxes to support the DNS attributes # # DNSRecordSyntax ATTRIBUTE-SYNTAX # IA5String # MATCHES FOR EQUALITY # # # NRSInformationSyntax ATTRIBUTE-SYNTAX # NRSInformation # MATCHES FOR EQUALITY # # # NRSInformation ::= SET { # [0] Context, # [1] Address-space-id, # routes [2] SEQUENCE OF SEQUENCE { # Route-cost, # Addressing-info } # } # # # 9.5. Upper bounds on length of attribute values # # # ub-document-identifier INTEGER ::= 256 # # ub-document-location INTEGER ::= 256 # # ub-document-title INTEGER ::= 256 # # ub-document-version INTEGER ::= 256 # # ub-favourite-drink INTEGER ::= 256 # # ub-host INTEGER ::= 256 # # ub-information INTEGER ::= 2048 # # ub-unique-identifier INTEGER ::= 256 # # ub-personal-title INTEGER ::= 256 # # ub-photo INTEGER ::= 250000 # # ub-rfc822-mailbox INTEGER ::= 256 # # ub-room-number INTEGER ::= 256 # # ub-text-or-address INTEGER ::= 256 # # ub-user-class INTEGER ::= 256 # # ub-user-identifier INTEGER ::= 256 # # ub-organizational-status INTEGER ::= 256 # # ub-janet-mailbox INTEGER ::= 256 # # ub-building-name INTEGER ::= 256 # # ub-personal-signature ::= 50000 # # ub-audio INTEGER ::= 250000 # # [back to 8] # 8. Object Classes # # 8.1. X.500 standard object classes # # A number of generally useful object classes are defined in X.521, and # these are supported. Refer to that document for descriptions of the # suggested usage of these object classes. The ASN.1 for these object # classes is reproduced for completeness in Appendix C. # # 8.2. X.400 standard object classes # # A number of object classes defined in X.400 are supported. Refer to # X.402 for descriptions of the usage of these object classes. The # ASN.1 for these object classes is reproduced for completeness in # Appendix C. # # 8.3. COSINE/Internet object classes # # This section attempts to fuse together the object classes designed # for use in the COSINE and Internet pilot activities. Descriptions # are given of the suggested usage of these object classes. The ASN.1 # for these object classes is also reproduced in Appendix C. # # 8.3.1. Pilot Object # # The PilotObject object class is used as a sub-class to allow some # common, useful attributes to be assigned to entries of all other # object classes. # # pilotObject OBJECT-CLASS # SUBCLASS OF top # MAY CONTAIN { # info, # photo, # manager, # uniqueIdentifier, # lastModifiedTime, # lastModifiedBy, # dITRedirect, # audio} # ::= {pilotObjectClass 3} # #objectclass ( 0.9.2342.19200300.100.4.3 NAME 'pilotObject' # DESC 'RFC1274: pilot object' # SUP top AUXILIARY # MAY ( info $ photo $ manager $ uniqueIdentifier $ # lastModifiedTime $ lastModifiedBy $ dITRedirect $ audio ) # ) # 8.3.2. Pilot Person # # The PilotPerson object class is used as a sub-class of person, to # allow the use of a number of additional attributes to be assigned to # entries of object class person. # # pilotPerson OBJECT-CLASS # SUBCLASS OF person # MAY CONTAIN { # userid, # textEncodedORAddress, # rfc822Mailbox, # favouriteDrink, # roomNumber, # userClass, # homeTelephoneNumber, # homePostalAddress, # secretary, # personalTitle, # preferredDeliveryMethod, # businessCategory, # janetMailbox, # otherMailbox, # mobileTelephoneNumber, # pagerTelephoneNumber, # organizationalStatus, # mailPreferenceOption, # personalSignature} # ::= {pilotObjectClass 4} # objectclass ( 0.9.2342.19200300.100.4.4 NAME ( 'pilotPerson' 'newPilotPerson' ) SUP person STRUCTURAL MAY ( userid $ textEncodedORAddress $ rfc822Mailbox $ favouriteDrink $ roomNumber $ userClass $ homeTelephoneNumber $ homePostalAddress $ secretary $ personalTitle $ preferredDeliveryMethod $ businessCategory $ janetMailbox $ otherMailbox $ mobileTelephoneNumber $ pagerTelephoneNumber $ organizationalStatus $ mailPreferenceOption $ personalSignature ) ) # 8.3.3. Account # # The Account object class is used to define entries representing # computer accounts. The userid attribute should be used for naming # entries of this object class. # # account OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # userid} # MAY CONTAIN { # description, # seeAlso, # localityName, # organizationName, # organizationalUnitName, # host} # ::= {pilotObjectClass 5} # objectclass ( 0.9.2342.19200300.100.4.5 NAME 'account' SUP top STRUCTURAL MUST userid MAY ( description $ seeAlso $ localityName $ organizationName $ organizationalUnitName $ host ) ) # 8.3.4. Document # # The Document object class is used to define entries which represent # documents. # # document OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # documentIdentifier} # MAY CONTAIN { # commonName, # description, # seeAlso, # localityName, # organizationName, # organizationalUnitName, # documentTitle, # documentVersion, # documentAuthor, # documentLocation, # documentPublisher} # ::= {pilotObjectClass 6} # objectclass ( 0.9.2342.19200300.100.4.6 NAME 'document' SUP top STRUCTURAL MUST documentIdentifier MAY ( commonName $ description $ seeAlso $ localityName $ organizationName $ organizationalUnitName $ documentTitle $ documentVersion $ documentAuthor $ documentLocation $ documentPublisher ) ) # 8.3.5. Room # # The Room object class is used to define entries representing rooms. # The commonName attribute should be used for naming pentries of this # object class. # # room OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # commonName} # MAY CONTAIN { # roomNumber, # description, # seeAlso, # telephoneNumber} # ::= {pilotObjectClass 7} # objectclass ( 0.9.2342.19200300.100.4.7 NAME 'room' SUP top STRUCTURAL MUST commonName MAY ( roomNumber $ description $ seeAlso $ telephoneNumber ) ) # 8.3.6. Document Series # # The Document Series object class is used to define an entry which # represents a series of documents (e.g., The Request For Comments # papers). # # documentSeries OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # commonName} # MAY CONTAIN { # description, # seeAlso, # telephoneNumber, # localityName, # organizationName, # organizationalUnitName} # ::= {pilotObjectClass 9} # objectclass ( 0.9.2342.19200300.100.4.9 NAME 'documentSeries' SUP top STRUCTURAL MUST commonName MAY ( description $ seeAlso $ telephonenumber $ localityName $ organizationName $ organizationalUnitName ) ) # 8.3.7. Domain # # The Domain object class is used to define entries which represent DNS # or NRS domains. The domainComponent attribute should be used for # naming entries of this object class. The usage of this object class # is described in more detail in [3]. # # domain OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # domainComponent} # MAY CONTAIN { # associatedName, # organizationName, # organizationalAttributeSet} # ::= {pilotObjectClass 13} # objectclass ( 0.9.2342.19200300.100.4.13 NAME 'domain' SUP top STRUCTURAL MUST domainComponent MAY ( associatedName $ organizationName $ description $ businessCategory $ seeAlso $ searchGuide $ userPassword $ localityName $ stateOrProvinceName $ streetAddress $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ streetAddress $ facsimileTelephoneNumber $ internationalISDNNumber $ telephoneNumber $ teletexTerminalIdentifier $ telexNumber $ preferredDeliveryMethod $ destinationIndicator $ registeredAddress $ x121Address ) ) # 8.3.8. RFC822 Local Part # # The RFC822 Local Part object class is used to define entries which # represent the local part of RFC822 mail addresses. This treats this # part of an RFC822 address as a domain. The usage of this object # class is described in more detail in [3]. # # rFC822localPart OBJECT-CLASS # SUBCLASS OF domain # MAY CONTAIN { # commonName, # surname, # description, # seeAlso, # telephoneNumber, # postalAttributeSet, # telecommunicationAttributeSet} # ::= {pilotObjectClass 14} # objectclass ( 0.9.2342.19200300.100.4.14 NAME 'RFC822localPart' SUP domain STRUCTURAL MAY ( commonName $ surname $ description $ seeAlso $ telephoneNumber $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ streetAddress $ facsimileTelephoneNumber $ internationalISDNNumber $ telephoneNumber $ teletexTerminalIdentifier $ telexNumber $ preferredDeliveryMethod $ destinationIndicator $ registeredAddress $ x121Address ) ) # 8.3.9. DNS Domain # # The DNS Domain (Domain NameServer) object class is used to define # entries for DNS domains. The usage of this object class is described # in more detail in [3]. # # dNSDomain OBJECT-CLASS # SUBCLASS OF domain # MAY CONTAIN { # ARecord, # MDRecord, # MXRecord, # NSRecord, # SOARecord, # CNAMERecord} # ::= {pilotObjectClass 15} # objectclass ( 0.9.2342.19200300.100.4.15 NAME 'dNSDomain' SUP domain STRUCTURAL MAY ( ARecord $ MDRecord $ MXRecord $ NSRecord $ SOARecord $ CNAMERecord ) ) # 8.3.10. Domain Related Object # # The Domain Related Object object class is used to define entries # which represent DNS/NRS domains which are "equivalent" to an X.500 # domain: e.g., an organisation or organisational unit. The usage of # this object class is described in more detail in [3]. # # domainRelatedObject OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # associatedDomain} # ::= {pilotObjectClass 17} # objectclass ( 0.9.2342.19200300.100.4.17 NAME 'domainRelatedObject' DESC 'RFC1274: an object related to an domain' SUP top AUXILIARY MUST associatedDomain ) # 8.3.11. Friendly Country # # The Friendly Country object class is used to define country entries # in the DIT. The object class is used to allow friendlier naming of # countries than that allowed by the object class country. The naming # attribute of object class country, countryName, has to be a 2 letter # string defined in ISO 3166. # # friendlyCountry OBJECT-CLASS # SUBCLASS OF country # MUST CONTAIN { # friendlyCountryName} # ::= {pilotObjectClass 18} # objectclass ( 0.9.2342.19200300.100.4.18 NAME 'friendlyCountry' SUP country STRUCTURAL MUST friendlyCountryName ) # 8.3.12. Simple Security Object # # The Simple Security Object object class is used to allow an entry to # have a userPassword attribute when an entry's principal object # classes do not allow userPassword as an attribute type. # # simpleSecurityObject OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # userPassword } # ::= {pilotObjectClass 19} # ## (in core.schema) ## objectclass ( 0.9.2342.19200300.100.4.19 NAME 'simpleSecurityObject' ## SUP top AUXILIARY ## MUST userPassword ) # 8.3.13. Pilot Organization # # The PilotOrganization object class is used as a sub-class of # organization and organizationalUnit to allow a number of additional # attributes to be assigned to entries of object classes organization # and organizationalUnit. # # pilotOrganization OBJECT-CLASS # SUBCLASS OF organization, organizationalUnit # MAY CONTAIN { # buildingName} # ::= {pilotObjectClass 20} # objectclass ( 0.9.2342.19200300.100.4.20 NAME 'pilotOrganization' SUP ( organization $ organizationalUnit ) STRUCTURAL MAY buildingName ) # 8.3.14. Pilot DSA # # The PilotDSA object class is used as a sub-class of the dsa object # class to allow additional attributes to be assigned to entries for # DSAs. # # pilotDSA OBJECT-CLASS # SUBCLASS OF dsa # MUST CONTAIN { # dSAQuality} # ::= {pilotObjectClass 21} # objectclass ( 0.9.2342.19200300.100.4.21 NAME 'pilotDSA' SUP dsa STRUCTURAL MAY dSAQuality ) # 8.3.15. Quality Labelled Data # # The Quality Labelled Data object class is used to allow the # assignment of the data quality attributes to subtrees in the DIT. # # See [8] for more details. # # qualityLabelledData OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # dSAQuality} # MAY CONTAIN { # subtreeMinimumQuality, # subtreeMaximumQuality} # ::= {pilotObjectClass 22} objectclass ( 0.9.2342.19200300.100.4.22 NAME 'qualityLabelledData' SUP top AUXILIARY MUST dsaQuality MAY ( subtreeMinimumQuality $ subtreeMaximumQuality ) ) # References # # [1] CCITT/ISO, "X.500, The Directory - overview of concepts, # models and services, CCITT /ISO IS 9594. # # [2] Kille, S., "The THORN and RARE X.500 Naming Architecture, in # University College London, Department of Computer Science # Research Note 89/48, May 1989. # # [3] Kille, S., "X.500 and Domains", RFC 1279, University College # London, November 1991. # # [4] Rose, M., "PSI/NYSERNet White Pages Pilot Project: Status # Report", Technical Report 90-09-10-1, published by NYSERNet # Inc, 1990. # # [5] Craigie, J., "UK Academic Community Directory Service Pilot # Project, pp. 305-310 in Computer Networks and ISDN Systems # 17 (1989), published by North Holland. # # [6] Mockapetris, P., "Domain Names - Concepts and Facilities", # RFC 1034, USC/Information Sciences Institute, November 1987. # # [7] Mockapetris, P., "Domain Names - Implementation and # Specification, RFC 1035, USC/Information Sciences Institute, # November 1987. # # [8] Kille, S., "Handling QOS (Quality of service) in the # Directory," publication in process, March 1991. # # # APPENDIX C - Summary of all Object Classes and Attribute Types # # -- Some Important Object Identifiers # # data OBJECT IDENTIFIER ::= {ccitt 9} # pss OBJECT IDENTIFIER ::= {data 2342} # ucl OBJECT IDENTIFIER ::= {pss 19200300} # pilot OBJECT IDENTIFIER ::= {ucl 100} # # pilotAttributeType OBJECT IDENTIFIER ::= {pilot 1} # pilotAttributeSyntax OBJECT IDENTIFIER ::= {pilot 3} # pilotObjectClass OBJECT IDENTIFIER ::= {pilot 4} # pilotGroups OBJECT IDENTIFIER ::= {pilot 10} # # iA5StringSyntax OBJECT IDENTIFIER ::= {pilotAttributeSyntax 4} # caseIgnoreIA5StringSyntax OBJECT IDENTIFIER ::= # {pilotAttributeSyntax 5} # # -- Standard Object Classes # # top OBJECT-CLASS # MUST CONTAIN { # objectClass} # ::= {objectClass 0} # # # alias OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # aliasedObjectName} # ::= {objectClass 1} # # # country OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # countryName} # MAY CONTAIN { # description, # searchGuide} # ::= {objectClass 2} # # # locality OBJECT-CLASS # SUBCLASS OF top # MAY CONTAIN { # description, # localityName, # stateOrProvinceName, # searchGuide, # seeAlso, # streetAddress} # ::= {objectClass 3} # # # organization OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # organizationName} # MAY CONTAIN { # organizationalAttributeSet} # ::= {objectClass 4} # # # organizationalUnit OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # organizationalUnitName} # MAY CONTAIN { # organizationalAttributeSet} # ::= {objectClass 5} # # # person OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # commonName, # surname} # MAY CONTAIN { # description, # seeAlso, # telephoneNumber, # userPassword} # ::= {objectClass 6} # # # organizationalPerson OBJECT-CLASS # SUBCLASS OF person # MAY CONTAIN { # localeAttributeSet, # organizationalUnitName, # postalAttributeSet, # telecommunicationAttributeSet, # title} # ::= {objectClass 7} # # # organizationalRole OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # commonName} # MAY CONTAIN { # description, # localeAttributeSet, # organizationalUnitName, # postalAttributeSet, # preferredDeliveryMethod, # roleOccupant, # seeAlso, # telecommunicationAttributeSet} # ::= {objectClass 8} # # # groupOfNames OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # commonName, # member} # MAY CONTAIN { # description, # organizationName, # organizationalUnitName, # owner, # seeAlso, # businessCategory} # ::= {objectClass 9} # # # residentialPerson OBJECT-CLASS # SUBCLASS OF person # MUST CONTAIN { # localityName} # MAY CONTAIN { # localeAttributeSet, # postalAttributeSet, # preferredDeliveryMethod, # telecommunicationAttributeSet, # businessCategory} # ::= {objectClass 10} # # # applicationProcess OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # commonName} # MAY CONTAIN { # description, # localityName, # organizationalUnitName, # seeAlso} # ::= {objectClass 11} # # # applicationEntity OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # commonName, # presentationAddress} # MAY CONTAIN { # description, # localityName, # organizationName, # organizationalUnitName, # seeAlso, # supportedApplicationContext} # ::= {objectClass 12} # # # dSA OBJECT-CLASS # SUBCLASS OF applicationEntity # MAY CONTAIN { # knowledgeInformation} # ::= {objectClass 13} # # # device OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # commonName} # MAY CONTAIN { # description, # localityName, # organizationName, # organizationalUnitName, # owner, # seeAlso, # serialNumber} # ::= {objectClass 14} # # # strongAuthenticationUser OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # userCertificate} # ::= {objectClass 15} # # # certificationAuthority OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # cACertificate, # certificateRevocationList, # authorityRevocationList} # MAY CONTAIN { # crossCertificatePair} # ::= {objectClass 16} # # -- Standard MHS Object Classes # # mhsDistributionList OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # commonName, # mhsDLSubmitPermissions, # mhsORAddresses} # MAY CONTAIN { # description, # organizationName, # organizationalUnitName, # owner, # seeAlso, # mhsDeliverableContentTypes, # mhsdeliverableEits, # mhsDLMembers, # mhsPreferredDeliveryMethods} # ::= {mhsObjectClass 0} # # # mhsMessageStore OBJECT-CLASS # SUBCLASS OF applicationEntity # MAY CONTAIN { # description, # owner, # mhsSupportedOptionalAttributes, # mhsSupportedAutomaticActions, # mhsSupportedContentTypes} # ::= {mhsObjectClass 1} # # # mhsMessageTransferAgent OBJECT-CLASS # SUBCLASS OF applicationEntity # MAY CONTAIN { # description, # owner, # mhsDeliverableContentLength} # ::= {mhsObjectClass 2} # # # mhsOrganizationalUser OBJECT-CLASS # SUBCLASS OF organizationalPerson # MUST CONTAIN { # mhsORAddresses} # MAY CONTAIN { # mhsDeliverableContentLength, # mhsDeliverableContentTypes, # mhsDeliverableEits, # mhsMessageStoreName, # mhsPreferredDeliveryMethods } # ::= {mhsObjectClass 3} # # # mhsResidentialUser OBJECT-CLASS # SUBCLASS OF residentialPerson # MUST CONTAIN { # mhsORAddresses} # MAY CONTAIN { # mhsDeliverableContentLength, # mhsDeliverableContentTypes, # mhsDeliverableEits, # mhsMessageStoreName, # mhsPreferredDeliveryMethods } # ::= {mhsObjectClass 4} # # # mhsUserAgent OBJECT-CLASS # SUBCLASS OF applicationEntity # MAY CONTAIN { # mhsDeliverableContentLength, # mhsDeliverableContentTypes, # mhsDeliverableEits, # mhsORAddresses, # owner} # ::= {mhsObjectClass 5} # # # # # -- Pilot Object Classes # # pilotObject OBJECT-CLASS # SUBCLASS OF top # MAY CONTAIN { # info, # photo, # manager, # uniqueIdentifier, # lastModifiedTime, # lastModifiedBy, # dITRedirect, # audio} # ::= {pilotObjectClass 3} # pilotPerson OBJECT-CLASS # SUBCLASS OF person # MAY CONTAIN { # userid, # textEncodedORAddress, # rfc822Mailbox, # favouriteDrink, # roomNumber, # userClass, # homeTelephoneNumber, # homePostalAddress, # secretary, # personalTitle, # preferredDeliveryMethod, # businessCategory, # janetMailbox, # otherMailbox, # mobileTelephoneNumber, # pagerTelephoneNumber, # organizationalStatus, # mailPreferenceOption, # personalSignature} # ::= {pilotObjectClass 4} # # # account OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # userid} # MAY CONTAIN { # description, # seeAlso, # localityName, # organizationName, # organizationalUnitName, # host} # ::= {pilotObjectClass 5} # # # document OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # documentIdentifier} # MAY CONTAIN { # commonName, # description, # seeAlso, # localityName, # organizationName, # organizationalUnitName, # documentTitle, # documentVersion, # documentAuthor, # documentLocation, # documentPublisher} # ::= {pilotObjectClass 6} # # # room OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # commonName} # MAY CONTAIN { # roomNumber, # description, # seeAlso, # telephoneNumber} # ::= {pilotObjectClass 7} # # # documentSeries OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # commonName} # MAY CONTAIN { # description, # seeAlso, # telephoneNumber, # localityName, # organizationName, # organizationalUnitName} # ::= {pilotObjectClass 9} # # # domain OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # domainComponent} # MAY CONTAIN { # associatedName, # organizationName, # organizationalAttributeSet} # ::= {pilotObjectClass 13} # # # rFC822localPart OBJECT-CLASS # SUBCLASS OF domain # MAY CONTAIN { # commonName, # surname, # description, # seeAlso, # telephoneNumber, # postalAttributeSet, # telecommunicationAttributeSet} # ::= {pilotObjectClass 14} # # # dNSDomain OBJECT-CLASS # SUBCLASS OF domain # MAY CONTAIN { # ARecord, # MDRecord, # MXRecord, # NSRecord, # SOARecord, # CNAMERecord} # ::= {pilotObjectClass 15} # # # domainRelatedObject OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # associatedDomain} # ::= {pilotObjectClass 17} # # # friendlyCountry OBJECT-CLASS # SUBCLASS OF country # MUST CONTAIN { # friendlyCountryName} # ::= {pilotObjectClass 18} # # # simpleSecurityObject OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # userPassword } # ::= {pilotObjectClass 19} # # # pilotOrganization OBJECT-CLASS # SUBCLASS OF organization, organizationalUnit # MAY CONTAIN { # buildingName} # ::= {pilotObjectClass 20} # # # pilotDSA OBJECT-CLASS # SUBCLASS OF dsa # MUST CONTAIN { # dSAQuality} # ::= {pilotObjectClass 21} # # # qualityLabelledData OBJECT-CLASS # SUBCLASS OF top # MUST CONTAIN { # dSAQuality} # MAY CONTAIN { # subtreeMinimumQuality, # subtreeMaximumQuality} # ::= {pilotObjectClass 22} # # # # # -- Standard Attribute Types # # objectClass ObjectClass # ::= {attributeType 0} # # # aliasedObjectName AliasedObjectName # ::= {attributeType 1} # # # knowledgeInformation ATTRIBUTE # WITH ATTRIBUTE-SYNTAX caseIgnoreString # ::= {attributeType 2} # # # commonName ATTRIBUTE # WITH ATTRIBUTE-SYNTAX caseIgnoreStringSyntax # (SIZE (1..ub-common-name)) # ::= {attributeType 3} # # # surname ATTRIBUTE # WITH ATTRIBUTE-SYNTAX caseIgnoreStringSyntax # (SIZE (1..ub-surname)) # ::= {attributeType 4} # # # serialNumber ATTRIBUTE # WITH ATTRIBUTE-SYNTAX printableStringSyntax # (SIZE (1..ub-serial-number)) # ::= {attributeType 5} # # # countryName ATTRIBUTE # WITH ATTRIBUTE-SYNTAX PrintableString # (SIZE (1..ub-country-code)) # SINGLE VALUE # ::= {attributeType 6} # # # localityName ATTRIBUTE # WITH ATTRIBUTE-SYNTAX caseIgnoreStringSyntax # (SIZE (1..ub-locality-name)) # ::= {attributeType 7} # # # stateOrProvinceName ATTRIBUTE # WITH ATTRIBUTE-SYNTAX caseIgnoreStringSyntax # (SIZE (1..ub-state-name)) # ::= {attributeType 8} # # # streetAddress ATTRIBUTE # WITH ATTRIBUTE-SYNTAX caseIgnoreStringSyntax # (SIZE (1..ub-street-address)) # ::= {attributeType 9} # # # organizationName ATTRIBUTE # WITH ATTRIBUTE-SYNTAX caseIgnoreStringSyntax # (SIZE (1..ub-organization-name)) # ::= {attributeType 10} # # # organizationalUnitName ATTRIBUTE # WITH ATTRIBUTE-SYNTAX caseIgnoreStringSyntax # (SIZE (1..ub-organizational-unit-name)) # ::= {attributeType 11} # # # title ATTRIBUTE # WITH ATTRIBUTE-SYNTAX caseIgnoreStringSyntax # (SIZE (1..ub-title)) # ::= {attributeType 12} # # # description ATTRIBUTE # WITH ATTRIBUTE-SYNTAX caseIgnoreStringSyntax # (SIZE (1..ub-description)) # ::= {attributeType 13} # # # searchGuide ATTRIBUTE # WITH ATTRIBUTE-SYNTAX Guide # ::= {attributeType 14} # # # businessCategory ATTRIBUTE # WITH ATTRIBUTE-SYNTAX caseIgnoreStringSyntax # (SIZE (1..ub-business-category)) # ::= {attributeType 15} # # # postalAddress ATTRIBUTE # WITH ATTRIBUTE-SYNTAX PostalAddress # MATCHES FOR EQUALITY # ::= {attributeType 16} # # # postalCode ATTRIBUTE # WITH ATTRIBUTE-SYNTAX caseIgnoreStringSyntax # (SIZE (1..ub-postal-code)) # ::= {attributeType 17} # # # postOfficeBox ATTRIBUTE # WITH ATTRIBUTE-SYNTAX caseIgnoreStringSyntax # (SIZE (1..ub-post-office-box)) # ::= {attributeType 18} # # # physicalDeliveryOfficeName ATTRIBUTE # WITH ATTRIBUTE-SYNTAX caseIgnoreStringSyntax # (SIZE (1..ub-physical-office-name)) # ::= {attributeType 19} # # # telephoneNumber ATTRIBUTE # WITH ATTRIBUTE-SYNTAX telephoneNumberSyntax # (SIZE (1..ub-telephone-number)) # ::= {attributeType 20} # # # telexNumber ATTRIBUTE # WITH ATTRIBUTE-SYNTAX TelexNumber # (SIZE (1..ub-telex)) # ::= {attributeType 21} # # # teletexTerminalIdentifier ATTRIBUTE # WITH ATTRIBUTE-SYNTAX TeletexTerminalIdentifier # (SIZE (1..ub-teletex-terminal-id)) # ::= {attributeType 22} # # # facsimileTelephoneNumber ATTRIBUTE # WITH ATTRIBUTE-SYNTAX FacsimileTelephoneNumber # ::= {attributeType 23} # # # x121Address ATTRIBUTE # WITH ATTRIBUTE-SYNTAX NumericString # (SIZE (1..ub-x121-address)) # ::= {attributeType 24} # # # internationaliSDNNumber ATTRIBUTE # WITH ATTRIBUTE-SYNTAX NumericString # (SIZE (1..ub-isdn-address)) # ::= {attributeType 25} # # # registeredAddress ATTRIBUTE # WITH ATTRIBUTE-SYNTAX PostalAddress # ::= {attributeType 26} # # # destinationIndicator ATTRIBUTE # WITH ATTRIBUTE-SYNTAX PrintableString # (SIZE (1..ub-destination-indicator)) # MATCHES FOR EQUALITY SUBSTRINGS # ::= {attributeType 27} # # # preferredDeliveryMethod ATTRIBUTE # WITH ATTRIBUTE-SYNTAX deliveryMethod # ::= {attributeType 28} # # # presentationAddress ATTRIBUTE # WITH ATTRIBUTE-SYNTAX PresentationAddress # MATCHES FOR EQUALITY # ::= {attributeType 29} # # # supportedApplicationContext ATTRIBUTE # WITH ATTRIBUTE-SYNTAX objectIdentifierSyntax # ::= {attributeType 30} # # # member ATTRIBUTE # WITH ATTRIBUTE-SYNTAX distinguishedNameSyntax # ::= {attributeType 31} # # # owner ATTRIBUTE # WITH ATTRIBUTE-SYNTAX distinguishedNameSyntax # ::= {attributeType 32} # # # roleOccupant ATTRIBUTE # WITH ATTRIBUTE-SYNTAX distinguishedNameSyntax # ::= {attributeType 33} # # # seeAlso ATTRIBUTE # WITH ATTRIBUTE-SYNTAX distinguishedNameSyntax # ::= {attributeType 34} # # # userPassword ATTRIBUTE # WITH ATTRIBUTE-SYNTAX Userpassword # ::= {attributeType 35} # # # userCertificate ATTRIBUTE # WITH ATTRIBUTE-SYNTAX UserCertificate # ::= {attributeType 36} # # # cACertificate ATTRIBUTE # WITH ATTRIBUTE-SYNTAX cACertificate # ::= {attributeType 37} # # # authorityRevocationList ATTRIBUTE # WITH ATTRIBUTE-SYNTAX AuthorityRevocationList # ::= {attributeType 38} # # # certificateRevocationList ATTRIBUTE # WITH ATTRIBUTE-SYNTAX CertificateRevocationList # ::= {attributeType 39} # # # crossCertificatePair ATTRIBUTE # WITH ATTRIBUTE-SYNTAX CrossCertificatePair # ::= {attributeType 40} # # # # # -- Standard MHS Attribute Types # # mhsDeliverableContentLength ATTRIBUTE # WITH ATTRIBUTE-SYNTAX integer # ::= {mhsAttributeType 0} # # # mhsDeliverableContentTypes ATTRIBUTE # WITH ATTRIBUTE-SYNTAX oID # ::= {mhsAttributeType 1} # # # mhsDeliverableEits ATTRIBUTE # WITH ATTRIBUTE-SYNTAX oID # ::= {mhsAttributeType 2} # # # mhsDLMembers ATTRIBUTE # WITH ATTRIBUTE-SYNTAX oRName # ::= {mhsAttributeType 3} # # # mhsDLSubmitPermissions ATTRIBUTE # WITH ATTRIBUTE-SYNTAX dLSubmitPermission # ::= {mhsAttributeType 4} # # # mhsMessageStoreName ATTRIBUTE # WITH ATTRIBUTE-SYNTAX dN # ::= {mhsAttributeType 5} # # # mhsORAddresses ATTRIBUTE # WITH ATTRIBUTE-SYNTAX oRAddress # ::= {mhsAttributeType 6} # # # mhsPreferredDeliveryMethods ATTRIBUTE # WITH ATTRIBUTE-SYNTAX deliveryMethod # ::= {mhsAttributeType 7} # # # mhsSupportedAutomaticActions ATTRIBUTE # WITH ATTRIBUTE-SYNTAX oID # ::= {mhsAttributeType 8} # # # mhsSupportedContentTypes ATTRIBUTE # # WITH ATTRIBUTE-SYNTAX oID # ::= {mhsAttributeType 9} # # # mhsSupportedOptionalAttributes ATTRIBUTE # WITH ATTRIBUTE-SYNTAX oID # ::= {mhsAttributeType 10} # # # # # -- Pilot Attribute Types # # userid ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-user-identifier)) # ::= {pilotAttributeType 1} # # # textEncodedORAddress ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-text-encoded-or-address)) # ::= {pilotAttributeType 2} # # # rfc822Mailbox ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreIA5StringSyntax # (SIZE (1 .. ub-rfc822-mailbox)) # ::= {pilotAttributeType 3} # # # info ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-information)) # ::= {pilotAttributeType 4} # # # favouriteDrink ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-favourite-drink)) # ::= {pilotAttributeType 5} # # # roomNumber ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-room-number)) # ::= {pilotAttributeType 6} # # # photo ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # CHOICE { # g3-facsimile [3] G3FacsimileBodyPart # } # (SIZE (1 .. ub-photo)) # ::= {pilotAttributeType 7} # # # userClass ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-user-class)) # ::= {pilotAttributeType 8} # # # host ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-host)) # ::= {pilotAttributeType 9} # # # manager ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # distinguishedNameSyntax # ::= {pilotAttributeType 10} # # # documentIdentifier ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-document-identifier)) # ::= {pilotAttributeType 11} # # # documentTitle ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-document-title)) # ::= {pilotAttributeType 12} # # # documentVersion ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-document-version)) # ::= {pilotAttributeType 13} # # # documentAuthor ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # distinguishedNameSyntax # ::= {pilotAttributeType 14} # # # documentLocation ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-document-location)) # ::= {pilotAttributeType 15} # # # homeTelephoneNumber ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # telephoneNumberSyntax # ::= {pilotAttributeType 20} # # # secretary ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # distinguishedNameSyntax # ::= {pilotAttributeType 21} # # # otherMailbox ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # SEQUENCE { # mailboxType PrintableString, -- e.g. Telemail # mailbox IA5String -- e.g. X378:Joe # } # ::= {pilotAttributeType 22} # # # lastModifiedTime ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # uTCTimeSyntax # ::= {pilotAttributeType 23} # # # lastModifiedBy ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # distinguishedNameSyntax # ::= {pilotAttributeType 24} # # # domainComponent ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreIA5StringSyntax # SINGLE VALUE # ::= {pilotAttributeType 25} # # # aRecord ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # DNSRecordSyntax # ::= {pilotAttributeType 26} # # # mXRecord ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # DNSRecordSyntax # ::= {pilotAttributeType 28} # # # nSRecord ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # DNSRecordSyntax # ::= {pilotAttributeType 29} # # sOARecord ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # DNSRecordSyntax # ::= {pilotAttributeType 30} # # # cNAMERecord ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # iA5StringSyntax # ::= {pilotAttributeType 31} # # # associatedDomain ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreIA5StringSyntax # ::= {pilotAttributeType 37} # # # associatedName ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # distinguishedNameSyntax # ::= {pilotAttributeType 38} # # # homePostalAddress ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # postalAddress # MATCHES FOR EQUALITY # ::= {pilotAttributeType 39} # # # personalTitle ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-personal-title)) # ::= {pilotAttributeType 40} # # # mobileTelephoneNumber ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # telephoneNumberSyntax # ::= {pilotAttributeType 41} # # # pagerTelephoneNumber ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # telephoneNumberSyntax # ::= {pilotAttributeType 42} # # # friendlyCountryName ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # ::= {pilotAttributeType 43} # # # uniqueIdentifier ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-unique-identifier)) # ::= {pilotAttributeType 44} # # # organizationalStatus ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-organizational-status)) # ::= {pilotAttributeType 45} # # # janetMailbox ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreIA5StringSyntax # (SIZE (1 .. ub-janet-mailbox)) # ::= {pilotAttributeType 46} # # # mailPreferenceOption ATTRIBUTE # WITH ATTRIBUTE-SYNTAX ENUMERATED { # no-list-inclusion(0), # any-list-inclusion(1), -- may be added to any lists # professional-list-inclusion(2) # -- may be added to lists # -- which the list provider # -- views as related to the # -- users professional inter- # -- ests, perhaps evaluated # -- from the business of the # -- organisation or keywords # -- in the entry. # } # ::= {pilotAttributeType 47} # # # buildingName ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # caseIgnoreStringSyntax # (SIZE (1 .. ub-building-name)) # ::= {pilotAttributeType 48} # # # dSAQuality ATTRIBUTE # WITH ATTRIBUTE-SYNTAX DSAQualitySyntax # SINGLE VALUE # ::= {pilotAttributeType 49} # # # singleLevelQuality ATTRIBUTE # WITH ATTRIBUTE-SYNTAX DataQualitySyntax # SINGLE VALUE # # # subtreeMinimumQuality ATTRIBUTE # WITH ATTRIBUTE-SYNTAX DataQualitySyntax # SINGLE VALUE # -- Defaults to singleLevelQuality # ::= {pilotAttributeType 51} # # # subtreeMaximumQuality ATTRIBUTE # WITH ATTRIBUTE-SYNTAX DataQualitySyntax # SINGLE VALUE # -- Defaults to singleLevelQuality # ::= {pilotAttributeType 52} # # # personalSignature ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # CHOICE { # g3-facsimile [3] G3FacsimileBodyPart # } # (SIZE (1 .. ub-personal-signature)) # ::= {pilotAttributeType 53} # # # dITRedirect ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # distinguishedNameSyntax # ::= {pilotAttributeType 54} # # # audio ATTRIBUTE # WITH ATTRIBUTE-SYNTAX # Audio # (SIZE (1 .. ub-audio)) # ::= {pilotAttributeType 55} # # documentPublisher ATTRIBUTE # WITH ATTRIBUTE SYNTAX caseIgnoreStringSyntax # ::= {pilotAttributeType 56} # # # # -- Generally useful syntaxes # # # caseIgnoreIA5StringSyntax ATTRIBUTE-SYNTAX # IA5String # MATCHES FOR EQUALITY SUBSTRINGS # # # iA5StringSyntax ATTRIBUTE-SYNTAX # IA5String # MATCHES FOR EQUALITY SUBSTRINGS # # # -- Syntaxes to support the DNS attributes # # DNSRecordSyntax ATTRIBUTE-SYNTAX # IA5String # MATCHES FOR EQUALITY # # # NRSInformationSyntax ATTRIBUTE-SYNTAX # NRSInformation # MATCHES FOR EQUALITY # # # NRSInformation ::= SET { # [0] Context, # [1] Address-space-id, # routes [2] SEQUENCE OF SEQUENCE { # Route-cost, # Addressing-info } # } # # # -- Upper bounds on length of attribute values # # # ub-document-identifier INTEGER ::= 256 # # ub-document-location INTEGER ::= 256 # # ub-document-title INTEGER ::= 256 # # ub-document-version INTEGER ::= 256 # # ub-favourite-drink INTEGER ::= 256 # # ub-host INTEGER ::= 256 # # ub-information INTEGER ::= 2048 # # ub-unique-identifier INTEGER ::= 256 # # ub-personal-title INTEGER ::= 256 # # ub-photo INTEGER ::= 250000 # # ub-rfc822-mailbox INTEGER ::= 256 # # ub-room-number INTEGER ::= 256 # # ub-text-or-address INTEGER ::= 256 # # ub-user-class INTEGER ::= 256 # # ub-user-identifier INTEGER ::= 256 # # ub-organizational-status INTEGER ::= 256 # # ub-janet-mailbox INTEGER ::= 256 # # ub-building-name INTEGER ::= 256 # # ub-personal-signature ::= 50000 # # ub-audio INTEGER ::= 250000 # # [remainder of memo trimmed] perl-ldap-0.58/data/41a-cmp.ldif0000644000175000000620000000246712173014262015726 0ustar marschapstaff dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=Univer sity of Michigan, c=US objectclass: OpenLDAPperson cn: Barbara Jensen cn: Babs Jensen uid: babs sn: Jensen title: Mythical Manager, Research Systems postaladdress: ITD Prod Dev & Deployment $ 535 W. William St. Room 4212 $ Ann Arbor, MI 48103-4943 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US userpassword: bjensen mail: bjensen@mailgw.umich.edu homepostaladdress: 123 Wesley $ Ann Arbor, MI 48103 description: Mythical manager of the rsdd unix project drink: water homephone: +1 313 555 2333 pager: +1 313 555 3233 facsimiletelephonenumber: +1 313 555 2274 telephonenumber: +1 313 555 9022 dn: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=Universi ty of Michigan, c=US objectclass: OpenLDAPperson cn: Bjorn Jensen cn: Biiff Jensen uid: bjorn sn: Jensen seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US userpassword: bjorn homepostaladdress: 19923 Seven Mile Rd. $ South Lyon, MI 49999 drink: Iced Tea description: Hiker, biker title: Director, Embedded Systems postaladdress: Info Tech Division $ 535 W. William St. $ Ann Arbor, MI 48103 mail: bjorn@mailgw.umich.edu homephone: +1 313 555 5444 pager: +1 313 555 4474 facsimiletelephonenumber: +1 313 555 2177 telephonenumber: +1 313 555 0355 perl-ldap-0.58/data/41c-cmp.ldif0000644000175000000620000000376412173014262015731 0ustar marschapstaff dn: cn=All Staff, ou=Groups, o=University of Michigan, c=US member: cn=Manager, o=University of Michigan, c=US member: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=Un iversity of Michigan, c=US member: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michiga n, c=US member: cn=John Doe, ou=Information Technology Division, ou=People, o=Universi ty of Michigan, c=US member: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Mich igan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 2, ou=Information Technology Division, ou=People, o=U niversity of Michigan, c=US member: cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of M ichigan, c=US member: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=Univ ersity of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US cn: All Staff description: Everyone in the sample data objectclass: groupOfNames dn: cn=Alumni Assoc Staff, ou=Groups, o=University of Michigan, c=US member: cn=Manager, o=University of Michigan, c=US member: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michiga n, c=US member: cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of M ichigan, c=US member: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Mich igan, c=US member: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US description: All Alumni Assoc Staff cn: Alumni Assoc Staff objectclass: groupOfNames perl-ldap-0.58/data/openssl.cnf0000644000175000000620000000333112173014262016066 0ustar marschapstaff# # OpenSSL configuration file for perl-ldap demo/test certificates. # # This definition stops the following lines choking if HOME isn't # defined. HOME = . RANDFILE = $ENV::HOME/.rnd #################################################################### [ req ] default_bits = 2048 default_keyfile = privkey.pem distinguished_name = req_distinguished_name x509_extensions = server_cert # The extentions to add to the self signed cert # This sets a mask for permitted string types. There are several options. string_mask = utf8only req_extensions = v3_req # The extensions to add to a certificate request [ req_distinguished_name ] 0.domainComponent = 1st level Domain Component 0.domainComponent_default = perl-ldap 1.domainComponent = 2nd level Domain Component 1.domainComponent_default = demo commonName = Common Name (e.g. server FQDN or YOUR name) commonName_default = localhost commonName_max = 64 #################################################################### # These extensions are added when 'ca' signs a request. [ server_cert ] # This goes against PKIX guidelines but some CAs do it and some software # requires this to avoid interpreting an end user certificate as a CA. basicConstraints=CA:FALSE # This is OK for an SSL server. nsCertType = server # This will be displayed in Netscape's comment listbox. nsComment = "demo certificate for perl-ldap tests" # PKIX recommendations harmless if included in all certificates. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer #################################################################### # Extensions to add to a certificate request [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment # EOF perl-ldap-0.58/data/41d-cmp.ldif0000644000175000000620000000667112173014262015732 0ustar marschapstaff dn: o=University of Michigan, c=US objectclass: top objectclass: organization objectclass: domainRelatedObject l: Ann Arbor, Michigan st: Michigan o: University of Michigan o: UMICH o: UM o: U-M o: U of M description: The University of Michigan at Ann Arbor postaladdress: University of Michigan $ 535 W. William St. $ Ann Arbor, MI 481 09 $ US telephonenumber: +1 313 764-1817 associateddomain: umich.edu dn: ou=Groups, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit ou: Groups dn: cn=All Staff, ou=Groups, o=University of Michigan, c=US member: cn=Manager, o=University of Michigan, c=US member: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=Un iversity of Michigan, c=US member: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michiga n, c=US member: cn=John Doe, ou=Information Technology Division, ou=People, o=Universi ty of Michigan, c=US member: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Mich igan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 2, ou=Information Technology Division, ou=People, o=U niversity of Michigan, c=US member: cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of M ichigan, c=US member: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=Univ ersity of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US cn: All Staff description: Everyone in the sample data objectclass: groupOfNames dn: cn=Alumni Assoc Staff, ou=Groups, o=University of Michigan, c=US member: cn=Manager, o=University of Michigan, c=US member: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michiga n, c=US member: cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of M ichigan, c=US member: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Mich igan, c=US member: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US description: All Alumni Assoc Staff cn: Alumni Assoc Staff objectclass: groupOfNames dn: cn=ITD Staff, ou=Groups, o=University of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US description: All ITD Staff cn: ITD Staff objectclass: groupOfNames member: cn=Manager, o=University of Michigan, c=US member: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=Univ ersity of Michigan, c=US member: cn=James A Jones 2, ou=Information Technology Division, ou=People, o=U niversity of Michigan, c=US member: cn=John Doe, ou=Information Technology Division, ou=People, o=Universi ty of Michigan, c=US dn: ou=People, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit ou: People dn: ou=Alumni Association, ou=People, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit ou: Alumni Association dn: ou=Information Technology Division, ou=People, o=University of Michigan, c =US objectclass: top objectclass: organizationalUnit ou: Information Technology Division perl-ldap-0.58/data/00-cmp.ldif0000644000175000000620000000542512173014262015555 0ustar marschapstaff dn: o=University of Michigan, c=US objectclass: top objectclass: organization objectclass: domainRelatedObject objectclass: quipuObject objectclass: quipuNonLeafObject l: Ann Arbor, Michigan st: Michigan streetaddress: 535 West William St. o: University of Michigan o: UMICH o: UM o: U-M o: U of M description: The University of Michigan at Ann Arbor postaladdress: University of Michigan $ 535 W. William St. $ Ann Arbor, MI 481 09 $ USpostalcode: 48109 telephonenumber: +1 313 764-1817 lastmodifiedtime: 930106182800Z lastmodifiedby: cn=manager, o=university of michigan, c=US associateddomain: umich.edu dn: ou=People, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit objectclass: quipuObject objectclass: quipuNonLeafObject ou: People dn: ou=Groups, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit objectclass: quipuObject objectclass: quipuNonLeafObject ou: Groups lastmodifiedtime: 950120182331Z lastmodifiedby: cn=manager, o=university of michigan, c=US dn: ou=Alumni Association, ou=People, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit objectclass: quipuObject objectclass: quipuNonLeafObject ou: Alumni Association dn: ou=Information Technology Division, ou=People, o=University of Michigan, c =US objectclass: top objectclass: organizationalUnit objectclass: quipuObject objectclass: quipuNonLeafObject ou: Information Technology Divisio dn: cn=All Staff,ou=Groups,o=University of Michigan,c=US member: cn=Manager, o=University of Michigan, c=US member: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=Un iversity of Michigan, c=US member: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michiga n, c=US member: cn=John Doe, ou=Information Technology Division, ou=People, o=Universi ty of Michigan, c=US member: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Mich igan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 2, ou=Information Technology Division, ou=People, o=U niversity of Michigan, c=US member: cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of M ichigan, c=US member: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=Univ ersity of Michigan, c=US associateddomain: umich.edu requeststo: cn=Manager, o=University of Michigan, c=US errorsto: cn=Manager, o=University of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US cn: All Staff joinable: FALSE multi-linedescription: Everyone in the sample data objectclass: rfc822mailgroup perl-ldap-0.58/data/40-cmp.ldif0000644000175000000620000002312212173014262015553 0ustar marschapstaff dn: o=University of Michigan, c=US objectclass: top objectclass: organization objectclass: domainRelatedObject l: Ann Arbor, Michigan st: Michigan o: University of Michigan o: UMICH o: UM o: U-M o: U of M description: The University of Michigan at Ann Arbor postaladdress: University of Michigan $ 535 W. William St. $ Ann Arbor, MI 481 09 $ US telephonenumber: +1 313 764-1817 associateddomain: umich.edu dn: cn=Manager, o=University of Michigan, c=US objectclass: top objectclass: person cn: Manager cn: Directory Manager cn: Dir Man sn: Manager description: Manager of the directory userpassword: secret dn: ou=Groups, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit ou: Groups dn: cn=All Staff, ou=Groups, o=University of Michigan, c=US member: cn=Manager, o=University of Michigan, c=US member: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=Un iversity of Michigan, c=US member: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michiga n, c=US member: cn=John Doe, ou=Information Technology Division, ou=People, o=Universi ty of Michigan, c=US member: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Mich igan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 2, ou=Information Technology Division, ou=People, o=U niversity of Michigan, c=US member: cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of M ichigan, c=US member: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=Univ ersity of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US cn: All Staff description: Everyone in the sample data objectclass: groupOfNames dn: cn=Alumni Assoc Staff, ou=Groups, o=University of Michigan, c=US member: cn=Manager, o=University of Michigan, c=US member: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michiga n, c=US member: cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of M ichigan, c=US member: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Mich igan, c=US member: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US description: All Alumni Assoc Staff cn: Alumni Assoc Staff objectclass: groupOfNames dn: cn=ITD Staff, ou=Groups, o=University of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US description: All ITD Staff cn: ITD Staff objectclass: groupOfNames member: cn=Manager, o=University of Michigan, c=US member: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=Univ ersity of Michigan, c=US member: cn=James A Jones 2, ou=Information Technology Division, ou=People, o=U niversity of Michigan, c=US member: cn=John Doe, ou=Information Technology Division, ou=People, o=Universi ty of Michigan, c=US dn: ou=People, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit ou: People dn: ou=Alumni Association, ou=People, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit ou: Alumni Association dn: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Mich igan, c=US objectclass: OpenLDAPperson cn: Dorothy Stevens cn: Dot Stevens uid: dorothy sn: Stevens title: Secretary, UM Alumni Association postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US drink: Lemonade homepostaladdress: 377 White St. Apt. 3 $ Ann Arbor, MI 48104 description: Very tall facsimiletelephonenumber: +1 313 555 3223 telephonenumber: +1 313 555 3664 mail: dots@mail.alumni.umich.edu homephone: +1 313 555 0454 dn: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Mich igan, c=US objectclass: OpenLDAPperson cn: James A Jones 1 cn: James Jones cn: Jim Jones uid: james sn: Jones postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US userpassword: jaj homepostaladdress: 3882 Beverly Rd. $ Ann Arbor, MI 48105 homephone: +1 313 555 4772 description: Outstanding title: Mad Cow Researcher, UM Alumni Association pager: +1 313 555 3923 mail: jaj@mail.alumni.umich.edu facsimiletelephonenumber: +1 313 555 4332 telephonenumber: +1 313 555 0895 dn: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michigan, c =US objectclass: OpenLDAPperson cn: Jane Doe cn: Jane Alverson uid: jane sn: Doe title: Programmer Analyst, UM Alumni Association postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US homepostaladdress: 123 Anystreet $ Ann Arbor, MI 48104 drink: diet coke description: Enthusiastic mail: jdoe@woof.net homephone: +1 313 555 5445 pager: +1 313 555 1220 facsimiletelephonenumber: +1 313 555 2311 telephonenumber: +1 313 555 4774 dn: cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of Michi gan, c=US objectclass: OpenLDAPperson cn: Jennifer Smith cn: Jen Smith uid: jen sn: Smith postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US drink: Sam Adams homepostaladdress: 1000 Maple #44 $ Ann Arbor, MI 48103 title: Telemarketer, UM Alumni Association mail: jen@mail.alumni.umich.edu homephone: +1 313 555 2333 pager: +1 313 555 6442 facsimiletelephonenumber: +1 313 555 2756 telephonenumber: +1 313 555 8232 dn: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Michigan , c=US objectclass: OpenLDAPperson cn: Mark Elliot cn: Mark A Elliot uid: mark sn: Elliot postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US homepostaladdress: 199 Outer Drive $ Ypsilanti, MI 48198 homephone: +1 313 555 0388 drink: Gasoline title: Director, UM Alumni Association mail: melliot@mail.alumni.umich.edu pager: +1 313 555 7671 facsimiletelephonenumber: +1 313 555 7762 telephonenumber: +1 313 555 4177 dn: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Mich igan, c=US objectclass: OpenLDAPperson cn: Ursula Hampster uid: ursula sn: Hampster title: Secretary, UM Alumni Association postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US homepostaladdress: 123 Anystreet $ Ann Arbor, MI 48104 mail: uham@mail.alumni.umich.edu homephone: +1 313 555 8421 pager: +1 313 555 2844 facsimiletelephonenumber: +1 313 555 9700 telephonenumber: +1 313 555 5331 dn: ou=Information Technology Division, ou=People, o=University of Michigan, c =US objectclass: top objectclass: organizationalUnit ou: Information Technology Division dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=Univer sity of Michigan, c=US objectclass: OpenLDAPperson cn: Barbara Jensen cn: Babs Jensen uid: barbara sn: Jensen title: Mythical Manager, Research Systems postaladdress: ITD Prod Dev & Deployment $ 535 W. William St. Room 4212 $ Ann Arbor, MI 48103-4943 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US userpassword: bjensen mail: bjensen@mailgw.umich.edu homepostaladdress: 123 Wesley $ Ann Arbor, MI 48103 description: Mythical manager of the rsdd unix project drink: water homephone: +1 313 555 2333 pager: +1 313 555 3233 facsimiletelephonenumber: +1 313 555 2274 telephonenumber: +1 313 555 9022 dn: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=Universi ty of Michigan, c=US objectclass: OpenLDAPperson cn: Bjorn Jensen cn: Biiff Jensen uid: bjorn sn: Jensen seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US userpassword: bjorn homepostaladdress: 19923 Seven Mile Rd. $ South Lyon, MI 49999 drink: Iced Tea description: Hiker, biker title: Director, Embedded Systems postaladdress: Info Tech Division $ 535 W. William St. $ Ann Arbor, MI 48103 mail: bjorn@mailgw.umich.edu homephone: +1 313 555 5444 pager: +1 313 555 4474 facsimiletelephonenumber: +1 313 555 2177 telephonenumber: +1 313 555 0355 dn: cn=James A Jones 2, ou=Information Technology Division, ou=People, o=Unive rsity of Michigan, c=US objectclass: OpenLDAPperson cn: James A Jones 2 cn: James Jones cn: Jim Jones uid: jim sn: Doe seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US homepostaladdress: 933 Brooks $ Ann Arbor, MI 48104 homephone: +1 313 555 8838 title: Senior Manager, Information Technology Division description: Not around very much mail: jjones@mailgw.umich.edu postaladdress: Info Tech Division $ 535 W William $ Ann Arbor, MI 48103 pager: +1 313 555 2833 facsimiletelephonenumber: +1 313 555 8688 telephonenumber: +1 313 555 7334 dn: cn=John Doe, ou=Information Technology Division, ou=People, o=University o f Michigan, c=US objectclass: OpenLDAPperson cn: John Doe cn: Jonathon Doe uid: john sn: Doe postaladdress: ITD $ 535 W. William $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US homepostaladdress: 912 East Bllvd $ Ann Arbor, MI 48104 title: System Administrator, Information Technology Division description: overworked! mail: johnd@mailgw.umich.edu homephone: +1 313 555 3774 pager: +1 313 555 6573 facsimiletelephonenumber: +1 313 555 4544 telephonenumber: +1 313 555 9394 perl-ldap-0.58/data/woman.jpg0000644000175000000620000000200612063407340015535 0ustar marschapstaffÿØÿàJFIFHHÿÛC     ÿÛC   ÿÀ%"ÿÄ ÿÄ0 !1"AQq¡ #2Ba‘ÁÑÿÄÿÄ, !1AQa"2Rq‘ÁðÿÚ ?éeùyÓì;jMZ¤µ©–ÆÆÛlã΄¶‘Û'ý:BÓù£¸§MSÏÛQ)´´+?ŒâÖîÜô$äOÀë[Ìã¤Û°\’¨q×PSåÔ¬¤îBp;•(Œz,ªtDÓ 1êse7·y)I}² 2’ ’TqØë—ßî7G&.-µÀ€ØÓRH'M6ØzÒ«|&”ÇzèÎO㊥¬îõH£%L¹i}Ò~ÇZ½N|¶W„š«‘Rr—Ü@íÐŒ¨þuFi'f.Ž]íÉ}éѨ“˜ßR·ˆâ•C½léðk˜P™Pš…„."‘æñBAŽýz{ê`ª¨È0ÑSn¡N¨ÇDøsÛ )lm 8˜‘ýéËÎú7€—:©iuo»à¶èe%JðŠÒ8§nr}u/ZüF¡&mÞ·1I‡E‚šZ!GWž\†T¢ŒÙ;T2{d+³Ž\¢ qQ—JÂ4ÆØÎO÷ÓKE®C¶ßmd•‚çG@Ôç§)8ßUiÀÀÔÓs‚í/ƒW•ÛýmHw ÕÄ£0ìÖ֖”T. ## ## Copyright 1998-2012 The OpenLDAP Foundation. ## All rights reserved. ## ## Redistribution and use in source and binary forms, with or without ## modification, are permitted only as authorized by the OpenLDAP ## Public License. ## ## A copy of this license is available in the file LICENSE in the ## top-level directory of the distribution or, alternatively, at ## . # ## Portions Copyright (C) The Internet Society (1997-2006). ## All Rights Reserved. ## ## This document and translations of it may be copied and furnished to ## others, and derivative works that comment on or otherwise explain it ## or assist in its implementation may be prepared, copied, published ## and distributed, in whole or in part, without restriction of any ## kind, provided that the above copyright notice and this paragraph are ## included on all such copies and derivative works. However, this ## document itself may not be modified in any way, such as by removing ## the copyright notice or references to the Internet Society or other ## Internet organizations, except as needed for the purpose of ## developing Internet standards in which case the procedures for ## copyrights defined in the Internet Standards process must be ## followed, or as required to translate it into languages other than ## English. ## ## The limited permissions granted above are perpetual and will not be ## revoked by the Internet Society or its successors or assigns. ## ## This document and the information contained herein is provided on an ## "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING ## TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING ## BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION ## HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF ## MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. # # # Includes LDAPv3 schema items from: # RFC 2252/2256 (LDAPv3) # # Select standard track schema items: # RFC 1274 (uid/dc) # RFC 2079 (URI) # RFC 2247 (dc/dcObject) # RFC 2587 (PKI) # RFC 2589 (Dynamic Directory Services) # RFC 4524 (associatedDomain) # # Select informational schema items: # RFC 2377 (uidObject) # # Standard attribute types from RFC 2256 # # system schema #attributetype ( 2.5.4.0 NAME 'objectClass' # DESC 'RFC2256: object classes of the entity' # EQUALITY objectIdentifierMatch # SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 ) # system schema #attributetype ( 2.5.4.1 NAME ( 'aliasedObjectName' 'aliasedEntryName' ) # DESC 'RFC2256: name of aliased object' # EQUALITY distinguishedNameMatch # SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE ) attributetype ( 2.5.4.2 NAME 'knowledgeInformation' DESC 'RFC2256: knowledge information' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} ) # system schema #attributetype ( 2.5.4.3 NAME ( 'cn' 'commonName' ) # DESC 'RFC2256: common name(s) for which the entity is known by' # SUP name ) attributetype ( 2.5.4.4 NAME ( 'sn' 'surname' ) DESC 'RFC2256: last (family) name(s) for which the entity is known by' SUP name ) attributetype ( 2.5.4.5 NAME 'serialNumber' DESC 'RFC2256: serial number of the entity' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64} ) # RFC 4519 definition ('countryName' in X.500 and RFC2256) attributetype ( 2.5.4.6 NAME ( 'c' 'countryName' ) DESC 'RFC4519: two-letter ISO-3166 country code' SUP name SYNTAX 1.3.6.1.4.1.1466.115.121.1.11 SINGLE-VALUE ) #attributetype ( 2.5.4.6 NAME ( 'c' 'countryName' ) # DESC 'RFC2256: ISO-3166 country 2-letter code' # SUP name SINGLE-VALUE ) attributetype ( 2.5.4.7 NAME ( 'l' 'localityName' ) DESC 'RFC2256: locality which this object resides in' SUP name ) attributetype ( 2.5.4.8 NAME ( 'st' 'stateOrProvinceName' ) DESC 'RFC2256: state or province which this object resides in' SUP name ) attributetype ( 2.5.4.9 NAME ( 'street' 'streetAddress' ) DESC 'RFC2256: street address of this object' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} ) attributetype ( 2.5.4.10 NAME ( 'o' 'organizationName' ) DESC 'RFC2256: organization this object belongs to' SUP name ) attributetype ( 2.5.4.11 NAME ( 'ou' 'organizationalUnitName' ) DESC 'RFC2256: organizational unit this object belongs to' SUP name ) attributetype ( 2.5.4.12 NAME 'title' DESC 'RFC2256: title associated with the entity' SUP name ) # system schema #attributetype ( 2.5.4.13 NAME 'description' # DESC 'RFC2256: descriptive information' # EQUALITY caseIgnoreMatch # SUBSTR caseIgnoreSubstringsMatch # SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1024} ) # Deprecated by enhancedSearchGuide attributetype ( 2.5.4.14 NAME 'searchGuide' DESC 'RFC2256: search guide, deprecated by enhancedSearchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.25 ) attributetype ( 2.5.4.15 NAME 'businessCategory' DESC 'RFC2256: business category' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} ) attributetype ( 2.5.4.16 NAME 'postalAddress' DESC 'RFC2256: postal address' EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 ) attributetype ( 2.5.4.17 NAME 'postalCode' DESC 'RFC2256: postal code' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} ) attributetype ( 2.5.4.18 NAME 'postOfficeBox' DESC 'RFC2256: Post Office Box' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} ) attributetype ( 2.5.4.19 NAME 'physicalDeliveryOfficeName' DESC 'RFC2256: Physical Delivery Office Name' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} ) attributetype ( 2.5.4.20 NAME 'telephoneNumber' DESC 'RFC2256: Telephone Number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{32} ) attributetype ( 2.5.4.21 NAME 'telexNumber' DESC 'RFC2256: Telex Number' SYNTAX 1.3.6.1.4.1.1466.115.121.1.52 ) attributetype ( 2.5.4.22 NAME 'teletexTerminalIdentifier' DESC 'RFC2256: Teletex Terminal Identifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.51 ) attributetype ( 2.5.4.23 NAME ( 'facsimileTelephoneNumber' 'fax' ) DESC 'RFC2256: Facsimile (Fax) Telephone Number' EQUALITY facsimileNumberMatch SUBSTR facsimileNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.22 ) attributetype ( 2.5.4.24 NAME 'x121Address' DESC 'RFC2256: X.121 Address' EQUALITY numericStringMatch SUBSTR numericStringSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{15} ) attributetype ( 2.5.4.25 NAME 'internationaliSDNNumber' DESC 'RFC2256: international ISDN number' EQUALITY numericStringMatch SUBSTR numericStringSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{16} ) attributetype ( 2.5.4.26 NAME 'registeredAddress' DESC 'RFC2256: registered postal address' SUP postalAddress SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 ) attributetype ( 2.5.4.27 NAME 'destinationIndicator' DESC 'RFC2256: destination indicator' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{128} ) attributetype ( 2.5.4.28 NAME 'preferredDeliveryMethod' DESC 'RFC2256: preferred delivery method' SYNTAX 1.3.6.1.4.1.1466.115.121.1.14 SINGLE-VALUE ) attributetype ( 2.5.4.29 NAME 'presentationAddress' DESC 'RFC2256: presentation address' EQUALITY presentationAddressMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.43 SINGLE-VALUE ) attributetype ( 2.5.4.30 NAME 'supportedApplicationContext' DESC 'RFC2256: supported application context' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 ) attributetype ( 2.5.4.31 NAME 'member' DESC 'RFC2256: member of a group' SUP distinguishedName ) attributetype ( 2.5.4.32 NAME 'owner' DESC 'RFC2256: owner (of the object)' SUP distinguishedName ) attributetype ( 2.5.4.33 NAME 'roleOccupant' DESC 'RFC2256: occupant of role' SUP distinguishedName ) # system schema #attributetype ( 2.5.4.34 NAME 'seeAlso' # DESC 'RFC2256: DN of related object' # SUP distinguishedName ) # system schema #attributetype ( 2.5.4.35 NAME 'userPassword' # DESC 'RFC2256/2307: password of user' # EQUALITY octetStringMatch # SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} ) # Must be transferred using ;binary # with certificateExactMatch rule (per X.509) attributetype ( 2.5.4.36 NAME 'userCertificate' DESC 'RFC2256: X.509 user certificate, use ;binary' EQUALITY certificateExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.8 ) # Must be transferred using ;binary # with certificateExactMatch rule (per X.509) attributetype ( 2.5.4.37 NAME 'cACertificate' DESC 'RFC2256: X.509 CA certificate, use ;binary' EQUALITY certificateExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.8 ) # Must be transferred using ;binary attributetype ( 2.5.4.38 NAME 'authorityRevocationList' DESC 'RFC2256: X.509 authority revocation list, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.9 ) # Must be transferred using ;binary attributetype ( 2.5.4.39 NAME 'certificateRevocationList' DESC 'RFC2256: X.509 certificate revocation list, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.9 ) # Must be stored and requested in the binary form attributetype ( 2.5.4.40 NAME 'crossCertificatePair' DESC 'RFC2256: X.509 cross certificate pair, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.10 ) # system schema #attributetype ( 2.5.4.41 NAME 'name' # EQUALITY caseIgnoreMatch # SUBSTR caseIgnoreSubstringsMatch # SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} ) attributetype ( 2.5.4.42 NAME ( 'givenName' 'gn' ) DESC 'RFC2256: first name(s) for which the entity is known by' SUP name ) attributetype ( 2.5.4.43 NAME 'initials' DESC 'RFC2256: initials of some or all of names, but not the surname(s).' SUP name ) attributetype ( 2.5.4.44 NAME 'generationQualifier' DESC 'RFC2256: name qualifier indicating a generation' SUP name ) attributetype ( 2.5.4.45 NAME 'x500UniqueIdentifier' DESC 'RFC2256: X.500 unique identifier' EQUALITY bitStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 ) attributetype ( 2.5.4.46 NAME 'dnQualifier' DESC 'RFC2256: DN qualifier' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 ) attributetype ( 2.5.4.47 NAME 'enhancedSearchGuide' DESC 'RFC2256: enhanced search guide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.21 ) attributetype ( 2.5.4.48 NAME 'protocolInformation' DESC 'RFC2256: protocol information' EQUALITY protocolInformationMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.42 ) # system schema #attributetype ( 2.5.4.49 NAME 'distinguishedName' # EQUALITY distinguishedNameMatch # SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) attributetype ( 2.5.4.50 NAME 'uniqueMember' DESC 'RFC2256: unique member of a group' EQUALITY uniqueMemberMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 ) attributetype ( 2.5.4.51 NAME 'houseIdentifier' DESC 'RFC2256: house identifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} ) # Must be transferred using ;binary attributetype ( 2.5.4.52 NAME 'supportedAlgorithms' DESC 'RFC2256: supported algorithms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.49 ) # Must be transferred using ;binary attributetype ( 2.5.4.53 NAME 'deltaRevocationList' DESC 'RFC2256: delta revocation list; use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.9 ) attributetype ( 2.5.4.54 NAME 'dmdName' DESC 'RFC2256: name of DMD' SUP name ) attributetype ( 2.5.4.65 NAME 'pseudonym' DESC 'X.520(4th): pseudonym for the object' SUP name ) # Standard object classes from RFC2256 # system schema #objectclass ( 2.5.6.0 NAME 'top' # DESC 'RFC2256: top of the superclass chain' # ABSTRACT # MUST objectClass ) # system schema #objectclass ( 2.5.6.1 NAME 'alias' # DESC 'RFC2256: an alias' # SUP top STRUCTURAL # MUST aliasedObjectName ) objectclass ( 2.5.6.2 NAME 'country' DESC 'RFC2256: a country' SUP top STRUCTURAL MUST c MAY ( searchGuide $ description ) ) objectclass ( 2.5.6.3 NAME 'locality' DESC 'RFC2256: a locality' SUP top STRUCTURAL MAY ( street $ seeAlso $ searchGuide $ st $ l $ description ) ) objectclass ( 2.5.6.4 NAME 'organization' DESC 'RFC2256: an organization' SUP top STRUCTURAL MUST o MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) ) objectclass ( 2.5.6.5 NAME 'organizationalUnit' DESC 'RFC2256: an organizational unit' SUP top STRUCTURAL MUST ou MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) ) objectclass ( 2.5.6.6 NAME 'person' DESC 'RFC2256: a person' SUP top STRUCTURAL MUST ( sn $ cn ) MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) ) objectclass ( 2.5.6.7 NAME 'organizationalPerson' DESC 'RFC2256: an organizational person' SUP person STRUCTURAL MAY ( title $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l ) ) objectclass ( 2.5.6.8 NAME 'organizationalRole' DESC 'RFC2256: an organizational role' SUP top STRUCTURAL MUST cn MAY ( x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ seeAlso $ roleOccupant $ preferredDeliveryMethod $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l $ description ) ) objectclass ( 2.5.6.9 NAME 'groupOfNames' DESC 'RFC2256: a group of names (DNs)' SUP top STRUCTURAL MUST ( member $ cn ) MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ description ) ) objectclass ( 2.5.6.10 NAME 'residentialPerson' DESC 'RFC2256: an residential person' SUP person STRUCTURAL MUST l MAY ( businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ preferredDeliveryMethod $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l ) ) objectclass ( 2.5.6.11 NAME 'applicationProcess' DESC 'RFC2256: an application process' SUP top STRUCTURAL MUST cn MAY ( seeAlso $ ou $ l $ description ) ) objectclass ( 2.5.6.12 NAME 'applicationEntity' DESC 'RFC2256: an application entity' SUP top STRUCTURAL MUST ( presentationAddress $ cn ) MAY ( supportedApplicationContext $ seeAlso $ ou $ o $ l $ description ) ) objectclass ( 2.5.6.13 NAME 'dSA' DESC 'RFC2256: a directory system agent (a server)' SUP applicationEntity STRUCTURAL MAY knowledgeInformation ) objectclass ( 2.5.6.14 NAME 'device' DESC 'RFC2256: a device' SUP top STRUCTURAL MUST cn MAY ( serialNumber $ seeAlso $ owner $ ou $ o $ l $ description ) ) objectclass ( 2.5.6.15 NAME 'strongAuthenticationUser' DESC 'RFC2256: a strong authentication user' SUP top AUXILIARY MUST userCertificate ) objectclass ( 2.5.6.16 NAME 'certificationAuthority' DESC 'RFC2256: a certificate authority' SUP top AUXILIARY MUST ( authorityRevocationList $ certificateRevocationList $ cACertificate ) MAY crossCertificatePair ) objectclass ( 2.5.6.17 NAME 'groupOfUniqueNames' DESC 'RFC2256: a group of unique names (DN and Unique Identifier)' SUP top STRUCTURAL MUST ( uniqueMember $ cn ) MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ description ) ) objectclass ( 2.5.6.18 NAME 'userSecurityInformation' DESC 'RFC2256: a user security information' SUP top AUXILIARY MAY ( supportedAlgorithms ) ) objectclass ( 2.5.6.16.2 NAME 'certificationAuthority-V2' SUP certificationAuthority AUXILIARY MAY ( deltaRevocationList ) ) objectclass ( 2.5.6.19 NAME 'cRLDistributionPoint' SUP top STRUCTURAL MUST ( cn ) MAY ( certificateRevocationList $ authorityRevocationList $ deltaRevocationList ) ) objectclass ( 2.5.6.20 NAME 'dmd' SUP top STRUCTURAL MUST ( dmdName ) MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) ) # # Object Classes from RFC 2587 # objectclass ( 2.5.6.21 NAME 'pkiUser' DESC 'RFC2587: a PKI user' SUP top AUXILIARY MAY userCertificate ) objectclass ( 2.5.6.22 NAME 'pkiCA' DESC 'RFC2587: PKI certificate authority' SUP top AUXILIARY MAY ( authorityRevocationList $ certificateRevocationList $ cACertificate $ crossCertificatePair ) ) objectclass ( 2.5.6.23 NAME 'deltaCRL' DESC 'RFC2587: PKI user' SUP top AUXILIARY MAY deltaRevocationList ) # # Standard Track URI label schema from RFC 2079 # system schema #attributetype ( 1.3.6.1.4.1.250.1.57 NAME 'labeledURI' # DESC 'RFC2079: Uniform Resource Identifier with optional label' # EQUALITY caseExactMatch # SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) objectclass ( 1.3.6.1.4.1.250.3.15 NAME 'labeledURIObject' DESC 'RFC2079: object that contains the URI attribute type' SUP top AUXILIARY MAY ( labeledURI ) ) # # Derived from RFC 1274, but with new "short names" # #attributetype ( 0.9.2342.19200300.100.1.1 # NAME ( 'uid' 'userid' ) # DESC 'RFC1274: user identifier' # EQUALITY caseIgnoreMatch # SUBSTR caseIgnoreSubstringsMatch # SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) attributetype ( 0.9.2342.19200300.100.1.3 NAME ( 'mail' 'rfc822Mailbox' ) DESC 'RFC1274: RFC822 Mailbox' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} ) objectclass ( 0.9.2342.19200300.100.4.19 NAME 'simpleSecurityObject' DESC 'RFC1274: simple security object' SUP top AUXILIARY MUST userPassword ) # RFC 1274 + RFC 2247 attributetype ( 0.9.2342.19200300.100.1.25 NAME ( 'dc' 'domainComponent' ) DESC 'RFC1274/2247: domain component' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) # RFC 2247 objectclass ( 1.3.6.1.4.1.1466.344 NAME 'dcObject' DESC 'RFC2247: domain component object' SUP top AUXILIARY MUST dc ) # RFC 2377 objectclass ( 1.3.6.1.1.3.1 NAME 'uidObject' DESC 'RFC2377: uid object' SUP top AUXILIARY MUST uid ) # RFC 4524 # The 'associatedDomain' attribute specifies DNS [RFC1034][RFC2181] # host names [RFC1123] that are associated with an object. That is, # values of this attribute should conform to the following ABNF: # # domain = root / label *( DOT label ) # root = SPACE # label = LETDIG [ *61( LETDIG / HYPHEN ) LETDIG ] # LETDIG = %x30-39 / %x41-5A / %x61-7A ; "0" - "9" / "A"-"Z" / "a"-"z" # SPACE = %x20 ; space (" ") # HYPHEN = %x2D ; hyphen ("-") # DOT = %x2E ; period (".") attributetype ( 0.9.2342.19200300.100.1.37 NAME 'associatedDomain' DESC 'RFC1274: domain associated with object' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) # RFC 2459 -- deprecated in favor of 'mail' (in cosine.schema) attributetype ( 1.2.840.113549.1.9.1 NAME ( 'email' 'emailAddress' 'pkcs9email' ) DESC 'RFC3280: legacy attribute for email addresses in DNs' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} ) perl-ldap-0.58/data/key.pem0000644000175000000620000000321712173014262015211 0ustar marschapstaff-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAyrzC3PIbnEI+aI4ZO4nRzag4M2IesMS/RexAt/INyqil6BWa DQ1xYwmFJs38LYIvDCKdCCT0KS3wnwv29BL0jXxO5YV7BWnZdK52axGbUY3WjU7y 7Csy1UNk2KmJ48qwPc3FtDRiBkVQr6PPYxlgOB3UM4nE2njZ6Nf3UW7SMIazJZp3 7VXGfsfDcQ5K5N8TNA4KHOg9dz4883q8xibU2dd+igJ6kH3znqW43bPH5TmHI8Ws JKlksyWittLadWG2Rp0X+BBnVjMO/n7ZLCRQa1yhyGIEU63KwZWBDmKOWX0i8dFi p8ePCRwqymQgb3D4F+JkM4eAPGZMDXvY13ztnQIDAQABAoIBAQCXRJ5UguTtA1RT aOsUzHFZdJFybVye4j4hKvTjCt0VgB5B+5Q09vnKPnk2Ce2F+yOld1IZmJEBBMEL ur6pQFduFfk8Mgsnb+ILuHysyLdN83nJd8WzR0wnaaCeNGmpKDu18Yn5OjiFm0Rn uN7tfyqW1FLXnYzewds9a56iCQEVqKZ5m+YbMWRTShLq3OvmyZlz5pvgqpfo+lvp TQkvc+0IU/mIysiHRVQtvZNm/ktzirq+/RjBD35HtHA8Bjwvkdf/irCnlz0DNioX Jz9usYTE6yzedodum9WJMJrdGYQSmGnGVAJMxBiktfEKHl6HBKnKfmzdltfjCopL txbQCYC1AoGBAPc8SQZ1RLpMfv6Shg5BPvV5tcX0ML/sz6haP/rfTXcZP9LBajxs Qn6tDVquTQr5YWPh0bzagZTwqeTd+/Kob/8NzWglGZN2Wv/bN5f8B9UQgbRqutxZ gp8+JQ5I7b2r/NcXC+ny6akZH9smbbDKf66s8nA1VXRnEiI5zttowUu/AoGBANHs pVRi9JCj5fJf6ZqWeh9Xzla0yhqiAUi5tElkvG769JELAKijKDsCfvcwQZoPdX44 3CmkK21nR/BVam9BBqNeIp4sqoEqQeDXLofT8Gyu8HddT4H0jL6P10TarZtIU6nh rt4Va0OrwZ/5vZaKWKc2UlUmMyX78SQ6oCJ0rw2jAoGABbkKg7DBN4K/ycrAeaH/ ABWiJIPjgP3NTLtSEc+Lbn9SH+HEQMPMwjvlPD0eoWtmWraGcVWpfDYZ6KdOxq4p cYDzST7ambQ6pQOBBO6bi84HApMZ4jHcOS1qFCuR/Tr27k+lQfQSfoyLVTpNfbMi Q3vTXM+PO9OK8undpOyG1OcCgYBjiAFHhneQkLU4+vLGoewbKkWh5Kwifod/VNU/ Ky0QrZoBnybbzigH+oH6b33bLtM1Wn5AnB8fCyYXtFf3kew0zzA4sNLS1RdRJJVi P0GyNiu7XJmS80E8JPUbJ1fC1UMdu+xuTdeCyU/PqtiSJNwtw9q7lpYPv2mxFL7S N2K8YwKBgQDbLfnDQYqcoYI5hOazcR2Whc/dQsE3MEyZZdkF4KDzBvs/pfApJrR0 Kqx8xNjd76TZP0s9Ggi8hrWY7y1fhLXHlNr8OpRJSgXhSVmY4Zo2cYTGQTeP3ixi YhHGXfqLDuDmKVkuzhQuCZ+jcPXzA+y87tw9Dt0fU/LKUSmhMBVgzA== -----END RSA PRIVATE KEY----- perl-ldap-0.58/data/slapd.conf.in0000644000175000000620000000201712173014262016272 0ustar marschapstaff# # slapd config -- for perl-ldap testing # # load schema files include $SLAPD_SCHEMA_DIR/core.schema include $SLAPD_SCHEMA_DIR/cosine.schema include $SLAPD_SCHEMA_DIR/inetorgperson.schema include $SLAPD_SCHEMA_DIR/openldap.schema # get required dynmaic modules #modulepath $SLAPD_MODULE_DIR #moduleload back_$SLAPD_DB #moduleload sssvlv # PID & args file pidfile $TESTDB/slapd.pid argsfile $TESTDB/slapd.args # TLS info TLSCertificateFile ./data/cert.pem TLSCertificateKeyFile ./data/key.pem #password-hash {CLEARTEXT} # SASL info #sasl-host localhost #sasl-realm testing #sasl-secprops passcred #sasl-secprops noanonymous sasl-secprops none sasl-regexp "uid=(.*),cn=.*,cn=auth" "cn=$1,o=University of Michigan,c=US" ####################################################################### # database definitions ####################################################################### database $SLAPD_DB suffix "$BASEDN" directory $TESTDB rootdn "$MANAGERDN" rootpw $PASSWD overlay sssvlv # EOF perl-ldap-0.58/data/05-cmp.dsml0000644000175000000620000001236012173014262015577 0ustar marschapstaff top organization domainRelatedObject quipuObject quipuNonLeafObject Ann Arbor, Michigan Michigan 535 West William St. University of Michigan UMICH UM U-M U of M The University of Michigan at Ann Arbor University of Michigan $ 535 W. William St. $ Ann Arbor, MI 48109 $ USpostalcode: 48109 +1 313 764-1817 930106182800Z cn=manager, o=university of michigan, c=US umich.edu top organizationalUnit quipuObject quipuNonLeafObject People top organizationalUnit quipuObject quipuNonLeafObject Groups 950120182331Z cn=manager, o=university of michigan, c=US top organizationalUnit quipuObject quipuNonLeafObject Alumni Association top organizationalUnit quipuObject quipuNonLeafObject Information Technology Divisio cn=Manager, o=University of Michigan, c=US cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michigan, c=US cn=John Doe, ou=Information Technology Division, ou=People, o=University of Michigan, c=US cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Michigan, c=US cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US cn=James A Jones 2, ou=Information Technology Division, ou=People, o=University of Michigan, c=US cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of Michigan, c=US cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Michigan, c=US cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Michigan, c=US cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US umich.edu cn=Manager, o=University of Michigan, c=US cn=Manager, o=University of Michigan, c=US cn=Manager, o=University of Michigan, c=US All Staff FALSE Everyone in the sample data rfc822mailgroup perl-ldap-0.58/data/man.jpg0000644000175000000620000000200112063406563015170 0ustar marschapstaffÿØÿàJFIFHHÿÛC     ÿÛC   ÿÀ%"ÿÄ ÿÄ0!1"AQ aq23B‚¡ÿÄÿÄ*!1A¡QR‘"aqÑáÿÚ ?¥º—›Ó|˜3C°Ÿ©"“ É~é÷Ú.=.|ìmÞǶµ{=³*mF^žReÐZþœÓŒÜøw¼w¤Ÿè?¢Z”¾^F«é倡~à¨þaXÔÌ‹Hκs_ËöáÓR1gœ–‚R— VR?Uº}ð½¨Lu‡ÐÚÄ_|=+O4¥¸9톾x¦q;¦¿3B§®:,•A¨SVï7ò@W…v’R¤l;‘å|°¨{;ô6n‹iÎkLÇÕ!ºqà âÙoŸ”†öÒnä,Û¯@:›á¯Á¦¥¶•+™Àï¥ÅòÎz›K§å*£Õ§Ó™ÈR^uBöXXy›ÚÃåR½\¥j%?&Á§Í𩱨›R7}‡Fäíúø~¸cxµ•1œ‘Lm¶–¨ š—%))% $«vësap0½ aÌ™}µª›]”Z1„v›}|ÆØNÐ.ÕDŽؠžçÓ_×X©ˆrU‚‘fɲ7éU¸Þñoˆ pΦä9 7ð¤íVTlÞüÀg*g4:z¼¦àËe¶Zn Ñì](MÚQ¿@ôô=;`͉QT‘*£5`:ßšV»‘æVMº›ŠI£…ìÕ¥y^©!eÉÀo˜µwR€ÚIû‘Îôé —. ## ## Copyright 1998-2012 The OpenLDAP Foundation. ## All rights reserved. ## ## Redistribution and use in source and binary forms, with or without ## modification, are permitted only as authorized by the OpenLDAP ## Public License. ## ## A copy of this license is available in the file LICENSE in the ## top-level directory of the distribution or, alternatively, at ## . # # InetOrgPerson (RFC2798) # # Depends upon # Definition of an X.500 Attribute Type and an Object Class to Hold # Uniform Resource Identifiers (URIs) [RFC2079] # (core.schema) # # A Summary of the X.500(96) User Schema for use with LDAPv3 [RFC2256] # (core.schema) # # The COSINE and Internet X.500 Schema [RFC1274] (cosine.schema) # carLicense # This multivalued field is used to record the values of the license or # registration plate associated with an individual. attributetype ( 2.16.840.1.113730.3.1.1 NAME 'carLicense' DESC 'RFC2798: vehicle license or registration plate' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) # departmentNumber # Code for department to which a person belongs. This can also be # strictly numeric (e.g., 1234) or alphanumeric (e.g., ABC/123). attributetype ( 2.16.840.1.113730.3.1.2 NAME 'departmentNumber' DESC 'RFC2798: identifies a department within an organization' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) # displayName # When displaying an entry, especially within a one-line summary list, it # is useful to be able to identify a name to be used. Since other attri- # bute types such as 'cn' are multivalued, an additional attribute type is # needed. Display name is defined for this purpose. attributetype ( 2.16.840.1.113730.3.1.241 NAME 'displayName' DESC 'RFC2798: preferred name to be used when displaying entries' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) # employeeNumber # Numeric or alphanumeric identifier assigned to a person, typically based # on order of hire or association with an organization. Single valued. attributetype ( 2.16.840.1.113730.3.1.3 NAME 'employeeNumber' DESC 'RFC2798: numerically identifies an employee within an organization' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) # employeeType # Used to identify the employer to employee relationship. Typical values # used will be "Contractor", "Employee", "Intern", "Temp", "External", and # "Unknown" but any value may be used. attributetype ( 2.16.840.1.113730.3.1.4 NAME 'employeeType' DESC 'RFC2798: type of employment for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) # jpegPhoto # Used to store one or more images of a person using the JPEG File # Interchange Format [JFIF]. # Note that the jpegPhoto attribute type was defined for use in the # Internet X.500 pilots but no referencable definition for it could be # located. attributetype ( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' DESC 'RFC2798: a JPEG image' SYNTAX 1.3.6.1.4.1.1466.115.121.1.28 ) # preferredLanguage # Used to indicate an individual's preferred written or spoken # language. This is useful for international correspondence or human- # computer interaction. Values for this attribute type MUST conform to # the definition of the Accept-Language header field defined in # [RFC2068] with one exception: the sequence "Accept-Language" ":" # should be omitted. This is a single valued attribute type. attributetype ( 2.16.840.1.113730.3.1.39 NAME 'preferredLanguage' DESC 'RFC2798: preferred written or spoken language for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) # userSMIMECertificate # A PKCS#7 [RFC2315] SignedData, where the content that is signed is # ignored by consumers of userSMIMECertificate values. It is # recommended that values have a `contentType' of data with an absent # `content' field. Values of this attribute contain a person's entire # certificate chain and an smimeCapabilities field [RFC2633] that at a # minimum describes their SMIME algorithm capabilities. Values for # this attribute are to be stored and requested in binary form, as # 'userSMIMECertificate;binary'. If available, this attribute is # preferred over the userCertificate attribute for S/MIME applications. ## OpenLDAP note: ";binary" transfer should NOT be used as syntax is binary attributetype ( 2.16.840.1.113730.3.1.40 NAME 'userSMIMECertificate' DESC 'RFC2798: PKCS#7 SignedData used to support S/MIME' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 ) # userPKCS12 # PKCS #12 [PKCS12] provides a format for exchange of personal identity # information. When such information is stored in a directory service, # the userPKCS12 attribute should be used. This attribute is to be stored # and requested in binary form, as 'userPKCS12;binary'. The attribute # values are PFX PDUs stored as binary data. ## OpenLDAP note: ";binary" transfer should NOT be used as syntax is binary attributetype ( 2.16.840.1.113730.3.1.216 NAME 'userPKCS12' DESC 'RFC2798: personal identity information, a PKCS #12 PFX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 ) # inetOrgPerson # The inetOrgPerson represents people who are associated with an # organization in some way. It is a structural class and is derived # from the organizationalPerson which is defined in X.521 [X521]. objectclass ( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' DESC 'RFC2798: Internet Organizational Person' SUP organizationalPerson STRUCTURAL MAY ( audio $ businessCategory $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ givenName $ homePhone $ homePostalAddress $ initials $ jpegPhoto $ labeledURI $ mail $ manager $ mobile $ o $ pager $ photo $ roomNumber $ secretary $ uid $ userCertificate $ x500uniqueIdentifier $ preferredLanguage $ userSMIMECertificate $ userPKCS12 ) ) perl-ldap-0.58/data/schema.in0000644000175000000620000022231012173014262015503 0ustar marschapstaffdn: cn=Subschema attributeTypes: ( 0.9.2342.19200300.100.1.10 NAME 'manager' DESC 'RFC1274: DN of manager' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) attributeTypes: ( 0.9.2342.19200300.100.1.11 NAME 'documentIdentifier' DESC 'RFC1274: unique identifier of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) attributeTypes: ( 0.9.2342.19200300.100.1.12 NAME 'documentTitle' DESC 'RFC1274: title of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) attributeTypes: ( 0.9.2342.19200300.100.1.13 NAME 'documentVersion' DESC 'RFC1274: version of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) attributeTypes: ( 0.9.2342.19200300.100.1.14 NAME 'documentAuthor' DESC 'RFC1274: DN of author of document' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) attributeTypes: ( 0.9.2342.19200300.100.1.15 NAME 'documentLocation' DESC 'RFC1274: location of document original' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) attributeTypes: ( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userid' ) DESC 'RFC4519: user identifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) attributeTypes: ( 0.9.2342.19200300.100.1.20 NAME ( 'homePhone' 'homeTelephoneNumber' ) DESC 'RFC1274: home telephone number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 ) attributeTypes: ( 0.9.2342.19200300.100.1.21 NAME 'secretary' DESC 'RFC1274: DN of secretary' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) attributeTypes: ( 0.9.2342.19200300.100.1.22 NAME 'otherMailbox' SYNTAX 1.3.6.1.4.1.1466.115.121.1.39 ) attributeTypes: ( 0.9.2342.19200300.100.1.25 NAME ( 'dc' 'domainComponent' ) DESC 'RFC1274/2247: domain component' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) attributeTypes: ( 0.9.2342.19200300.100.1.26 NAME 'aRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributeTypes: ( 0.9.2342.19200300.100.1.27 NAME 'mDRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributeTypes: ( 0.9.2342.19200300.100.1.28 NAME 'mXRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributeTypes: ( 0.9.2342.19200300.100.1.29 NAME 'nSRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributeTypes: ( 0.9.2342.19200300.100.1.2 NAME 'textEncodedORAddress' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) attributeTypes: ( 0.9.2342.19200300.100.1.30 NAME 'sOARecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributeTypes: ( 0.9.2342.19200300.100.1.31 NAME 'cNAMERecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributeTypes: ( 0.9.2342.19200300.100.1.37 NAME 'associatedDomain' DESC 'RFC1274: domain associated with object' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) attributeTypes: ( 0.9.2342.19200300.100.1.38 NAME 'associatedName' DESC 'RFC1274: DN of entry associated with domain' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) attributeTypes: ( 0.9.2342.19200300.100.1.39 NAME 'homePostalAddress' DESC 'RFC1274: home postal address' EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 ) attributeTypes: ( 0.9.2342.19200300.100.1.3 NAME ( 'mail' 'rfc822Mailbox' ) DESC 'RFC1274: RFC822 Mailbox' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} ) attributeTypes: ( 0.9.2342.19200300.100.1.40 NAME 'personalTitle' DESC 'RFC1274: personal title' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) attributeTypes: ( 0.9.2342.19200300.100.1.41 NAME ( 'mobile' 'mobileTelephoneNumber' ) DESC 'RFC1274: mobile telephone number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 ) attributeTypes: ( 0.9.2342.19200300.100.1.42 NAME ( 'pager' 'pagerTelephoneNumber' ) DESC 'RFC1274: pager telephone number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 ) attributeTypes: ( 0.9.2342.19200300.100.1.43 NAME ( 'co' 'friendlyCountryName' ) DESC 'RFC1274: friendly country name' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 0.9.2342.19200300.100.1.44 NAME 'uniqueIdentifier' DESC 'RFC1274: unique identifer' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) attributeTypes: ( 0.9.2342.19200300.100.1.45 NAME 'organizationalStatus' DESC 'RFC1274: organizational status' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) attributeTypes: ( 0.9.2342.19200300.100.1.46 NAME 'janetMailbox' DESC 'RFC1274: Janet mailbox' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} ) attributeTypes: ( 0.9.2342.19200300.100.1.47 NAME 'mailPreferenceOption' DESC 'RFC1274: mail preference option' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) attributeTypes: ( 0.9.2342.19200300.100.1.48 NAME 'buildingName' DESC 'RFC1274: name of building' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) attributeTypes: ( 0.9.2342.19200300.100.1.49 NAME 'dSAQuality' DESC 'RFC1274: DSA Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.19 SINGLE-VALUE ) attributeTypes: ( 0.9.2342.19200300.100.1.4 NAME 'info' DESC 'RFC1274: general information' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{2048} ) attributeTypes: ( 0.9.2342.19200300.100.1.50 NAME 'singleLevelQuality' DESC 'RFC1274: Single Level Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.13 SINGLE-VALUE ) attributeTypes: ( 0.9.2342.19200300.100.1.51 NAME 'subtreeMinimumQuality' DESC 'RFC1274: Subtree Mininum Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.13 SINGLE-VALUE ) attributeTypes: ( 0.9.2342.19200300.100.1.52 NAME 'subtreeMaximumQuality' DESC 'RFC1274: Subtree Maximun Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.13 SINGLE-VALUE ) attributeTypes: ( 0.9.2342.19200300.100.1.53 NAME 'personalSignature' DESC 'RFC1274: Personal Signature (G3 fax)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.23 ) attributeTypes: ( 0.9.2342.19200300.100.1.54 NAME 'dITRedirect' DESC 'RFC1274: DIT Redirect' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) attributeTypes: ( 0.9.2342.19200300.100.1.55 NAME 'audio' DESC 'RFC1274: audio (u-law)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.4{25000} ) attributeTypes: ( 0.9.2342.19200300.100.1.56 NAME 'documentPublisher' DESC 'RFC1274: publisher of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 0.9.2342.19200300.100.1.5 NAME ( 'drink' 'favouriteDrink' ) DESC 'RFC1274: favorite drink' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) attributeTypes: ( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' DESC 'RFC2798: a JPEG image' SYNTAX 1.3.6.1.4.1.1466.115.121.1.28 ) attributeTypes: ( 0.9.2342.19200300.100.1.6 NAME 'roomNumber' DESC 'RFC1274: room number' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) attributeTypes: ( 0.9.2342.19200300.100.1.7 NAME 'photo' DESC 'RFC1274: photo (G3 fax)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.23{25000} ) attributeTypes: ( 0.9.2342.19200300.100.1.8 NAME 'userClass' DESC 'RFC1274: category of user' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) attributeTypes: ( 0.9.2342.19200300.100.1.9 NAME 'host' DESC 'RFC1274: host computer' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) attributeTypes: ( 1.2.840.113549.1.9.1 NAME ( 'email' 'emailAddress' 'pkcs9email' ) DESC 'RFC3280: legacy attribute for email addresses in DNs' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} ) attributeTypes: ( 1.3.6.1.1.1.1.0 NAME 'uidNumber' DESC 'RFC2307: An integer uniquely identifying a user in an administrative domain' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.1.1.1.1 NAME 'gidNumber' DESC 'RFC2307: An integer uniquely identifying a group in an administrative domain' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.1.16.4 NAME 'entryUUID' DESC 'UUID of the entry' EQUALITY UUIDMatch ORDERING UUIDOrderingMatch SYNTAX 1.3.6.1.1.16.1 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation ) attributeTypes: ( 1.3.6.1.1.20 NAME 'entryDN' DESC 'DN of the entry' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation ) attributeTypes: ( 1.3.6.1.1.4 NAME 'vendorName' DESC 'RFC3045: name of implementation vendor' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation ) attributeTypes: ( 1.3.6.1.1.5 NAME 'vendorVersion' DESC 'RFC3045: version of implementation' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation ) attributeTypes: ( 1.3.6.1.4.1.1466.101.119.3 NAME 'entryTtl' DESC 'RFC2589: entry time-to-live' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation ) attributeTypes: ( 1.3.6.1.4.1.1466.101.119.4 NAME 'dynamicSubtrees' DESC 'RFC2589: dynamic subtrees' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION USAGE dSAOperation ) attributeTypes: ( 1.3.6.1.4.1.1466.101.120.13 NAME 'supportedControl' DESC 'RFC4512: supported controls' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation ) attributeTypes: ( 1.3.6.1.4.1.1466.101.120.14 NAME 'supportedSASLMechanisms' DESC 'RFC4512: supported SASL mechanisms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE dSAOperation ) attributeTypes: ( 1.3.6.1.4.1.1466.101.120.15 NAME 'supportedLDAPVersion' DESC 'RFC4512: supported LDAP versions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 USAGE dSAOperation ) attributeTypes: ( 1.3.6.1.4.1.1466.101.120.16 NAME 'ldapSyntaxes' DESC 'RFC4512: LDAP syntaxes' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.54 USAGE directoryOperation ) attributeTypes: ( 1.3.6.1.4.1.1466.101.120.5 NAME 'namingContexts' DESC 'RFC4512: naming contexts' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE dSAOperation ) attributeTypes: ( 1.3.6.1.4.1.1466.101.120.6 NAME 'altServer' DESC 'RFC4512: alternative servers' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 USAGE dSAOperation ) attributeTypes: ( 1.3.6.1.4.1.1466.101.120.7 NAME 'supportedExtension' DESC 'RFC4512: supported extended operations' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation ) attributeTypes: ( 1.3.6.1.4.1.250.1.57 NAME 'labeledURI' DESC 'RFC2079: Uniform Resource Identifier with optional label' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.10 NAME 'olcConcurrency' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.11 NAME 'olcConnMaxPending' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.12 NAME 'olcConnMaxPendingAuth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.13 NAME 'olcDatabase' DESC 'The backend type for a database instance' SUP olcBackend SINGLE-VALUE X-ORDERED 'SIBLINGS' ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.14 NAME 'olcDefaultSearchBase' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.15 NAME 'olcDisallows' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.16 NAME 'olcDitContentRules' DESC 'OpenLDAP DIT content rules' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.17 NAME 'olcGentleHUP' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.18 NAME 'olcIdleTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.19 NAME 'olcInclude' SUP labeledURI ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.1 NAME 'olcAccess' DESC 'Access Control List' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.20 NAME 'olcIndexSubstrIfMinLen' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.21 NAME 'olcIndexSubstrIfMaxLen' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.22 NAME 'olcIndexSubstrAnyLen' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.23 NAME 'olcIndexSubstrAnyStep' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.26 NAME 'olcLocalSSF' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.27 NAME 'olcLogFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.28 NAME 'olcLogLevel' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.2 NAME 'olcAllows' DESC 'Allowed set of deprecated features' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.30 NAME 'olcModuleLoad' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.31 NAME 'olcModulePath' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.32 NAME 'olcObjectClasses' DESC 'OpenLDAP object classes' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.33 NAME 'olcObjectIdentifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.34 NAME 'olcOverlay' SUP olcDatabase SINGLE-VALUE X-ORDERED 'SIBLINGS' ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.35 NAME 'olcPasswordCryptSaltFormat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.36 NAME 'olcPasswordHash' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.37 NAME 'olcPidFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.38 NAME 'olcPlugin' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.39 NAME 'olcPluginLogFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.3 NAME 'olcArgsFile' DESC 'File for slapd command line options' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.40 NAME 'olcReadOnly' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.41 NAME 'olcReferral' SUP labeledURI SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.43 NAME 'olcReplicaArgsFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.44 NAME 'olcReplicaPidFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.45 NAME 'olcReplicationInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.46 NAME 'olcReplogFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.47 NAME 'olcRequires' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.48 NAME 'olcRestrict' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.49 NAME 'olcReverseLookup' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.4 NAME 'olcAttributeTypes' DESC 'OpenLDAP attributeTypes' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.51 NAME 'olcRootDSE' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.53 NAME 'olcSaslHost' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.54 NAME 'olcSaslRealm' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.56 NAME 'olcSaslSecProps' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.58 NAME 'olcSchemaDN' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.59 NAME 'olcSecurity' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.5 NAME 'olcAttributeOptions' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.60 NAME 'olcSizeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.61 NAME 'olcSockbufMaxIncoming' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.62 NAME 'olcSockbufMaxIncomingAuth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.66 NAME 'olcThreads' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.67 NAME 'olcTimeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.68 NAME 'olcTLSCACertificateFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.69 NAME 'olcTLSCACertificatePath' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.6 NAME 'olcAuthIDRewrite' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.70 NAME 'olcTLSCertificateFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.71 NAME 'olcTLSCertificateKeyFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.72 NAME 'olcTLSCipherSuite' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.73 NAME 'olcTLSCRLCheck' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.74 NAME 'olcTLSRandFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.75 NAME 'olcTLSVerifyClient' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.77 NAME 'olcTLSDHParamFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.78 NAME 'olcConfigFile' DESC 'File for slapd configuration directives' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.79 NAME 'olcConfigDir' DESC 'Directory for slapd configuration backend' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.7 NAME 'olcAuthzPolicy' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.80 NAME 'olcToolThreads' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.81 NAME 'olcServerID' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.82 NAME 'olcTLSCRLFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.83 NAME 'olcSortVals' DESC 'Attributes whose values will always be sorted' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.84 NAME 'olcIndexIntLen' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.85 NAME 'olcLdapSyntaxes' DESC 'OpenLDAP ldapSyntax' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.86 NAME 'olcAddContentAcl' DESC 'Check ACLs against content of Add ops' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.87 NAME 'olcTLSProtocolMin' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.88 NAME 'olcWriteTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.89 NAME 'olcSaslAuxprops' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.8 NAME 'olcAuthzRegexp' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.90 NAME 'olcTCPBuffer' DESC 'Custom TCP buffer size' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.93 NAME 'olcListenerThreads' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.9 NAME 'olcBackend' DESC 'A type of backend' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORDERED 'SIBLINGS' ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.10 NAME 'olcSuffix' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.11 NAME 'olcSyncrepl' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.12 NAME 'olcUpdateDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.13 NAME 'olcUpdateRef' SUP labeledURI EQUALITY caseIgnoreMatch ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.15 NAME 'olcSubordinate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.16 NAME 'olcMirrorMode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.17 NAME 'olcHidden' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.18 NAME 'olcMonitoring' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.19 NAME 'olcSyncUseSubentry' DESC 'Store sync context in a subentry' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.1 NAME 'olcDbDirectory' DESC 'Directory for database content' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.20 NAME 'olcExtraAttrs' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.2 NAME 'olcDbIndex' DESC 'Attribute index parameters' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.3 NAME 'olcDbMode' DESC 'Unix permissions of database files' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.4 NAME 'olcLastMod' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.5 NAME 'olcLimits' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.6 NAME 'olcMaxDerefDepth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.7 NAME 'olcReplica' SUP labeledURI EQUALITY caseIgnoreMatch X-ORDERED 'VALUES' ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.8 NAME 'olcRootDN' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.9 NAME 'olcRootPW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.12.1 NAME 'olcDbMaxReaders' DESC 'Maximum number of threads that may access the DB concurrently' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.12.2 NAME 'olcDbMaxSize' DESC 'Maximum size of DB in bytes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.12.3 NAME 'olcDbEnvFlags' DESC 'Database environment flags' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.1.2 NAME 'olcDbCheckpoint' DESC 'Database checkpoint interval in kbytes and minutes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.1.4 NAME 'olcDbNoSync' DESC 'Disable synchronous database writes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.1.9 NAME 'olcDbSearchStack' DESC 'Depth of search stack in IDLs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) attributeTypes: ( 1.3.6.1.4.1.4203.1.3.5 NAME 'supportedFeatures' DESC 'RFC4512: features supported by the server' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation ) attributeTypes: ( 2.16.840.1.113730.3.1.1 NAME 'carLicense' DESC 'RFC2798: vehicle license or registration plate' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 2.16.840.1.113730.3.1.216 NAME 'userPKCS12' DESC 'RFC2798: personal identity information, a PKCS #12 PFX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 ) attributeTypes: ( 2.16.840.1.113730.3.1.241 NAME 'displayName' DESC 'RFC2798: preferred name to be used when displaying entries' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 2.16.840.1.113730.3.1.2 NAME 'departmentNumber' DESC 'RFC2798: identifies a department within an organization' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 2.16.840.1.113730.3.1.34 NAME 'ref' DESC 'RFC3296: subordinate referral URL' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE distributedOperation ) attributeTypes: ( 2.16.840.1.113730.3.1.39 NAME 'preferredLanguage' DESC 'RFC2798: preferred written or spoken language for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 2.16.840.1.113730.3.1.3 NAME 'employeeNumber' DESC 'RFC2798: numerically identifies an employee within an organization' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) attributeTypes: ( 2.16.840.1.113730.3.1.40 NAME 'userSMIMECertificate' DESC 'RFC2798: PKCS#7 SignedData used to support S/MIME' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 ) attributeTypes: ( 2.16.840.1.113730.3.1.4 NAME 'employeeType' DESC 'RFC2798: type of employment for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) attributeTypes: ( 2.5.18.10 NAME 'subschemaSubentry' DESC 'RFC4512: name of controlling subschema entry' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation ) attributeTypes: ( 2.5.18.1 NAME 'createTimestamp' DESC 'RFC4512: time which object was created' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation ) attributeTypes: ( 2.5.18.2 NAME 'modifyTimestamp' DESC 'RFC4512: time which object was last modified' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation ) attributeTypes: ( 2.5.18.3 NAME 'creatorsName' DESC 'RFC4512: name of creator' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation ) attributeTypes: ( 2.5.18.4 NAME 'modifiersName' DESC 'RFC4512: name of last modifier' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation ) attributeTypes: ( 2.5.18.9 NAME 'hasSubordinates' DESC 'X.501: entry has children' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation ) attributeTypes: ( 2.5.21.4 NAME 'matchingRules' DESC 'RFC4512: matching rules' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.30 USAGE directoryOperation ) attributeTypes: ( 2.5.21.5 NAME 'attributeTypes' DESC 'RFC4512: attribute types' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.3 USAGE directoryOperation ) attributeTypes: ( 2.5.21.6 NAME 'objectClasses' DESC 'RFC4512: object classes' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.37 USAGE directoryOperation ) attributeTypes: ( 2.5.21.8 NAME 'matchingRuleUse' DESC 'RFC4512: matching rule uses' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.31 USAGE directoryOperation ) attributeTypes: ( 2.5.21.9 NAME 'structuralObjectClass' DESC 'RFC4512: structural object class of entry' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation ) attributeTypes: ( 2.5.4.0 NAME 'objectClass' DESC 'RFC4512: object classes of the entity' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 ) attributeTypes: ( 2.5.4.10 NAME ( 'o' 'organizationName' ) DESC 'RFC2256: organization this object belongs to' SUP name ) attributeTypes: ( 2.5.4.11 NAME ( 'ou' 'organizationalUnitName' ) DESC 'RFC2256: organizational unit this object belongs to' SUP name ) attributeTypes: ( 2.5.4.12 NAME 'title' DESC 'RFC2256: title associated with the entity' SUP name ) attributeTypes: ( 2.5.4.13 NAME 'description' DESC 'RFC4519: descriptive information' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1024} ) attributeTypes: ( 2.5.4.14 NAME 'searchGuide' DESC 'RFC2256: search guide, deprecated by enhancedSearchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.25 ) attributeTypes: ( 2.5.4.15 NAME 'businessCategory' DESC 'RFC2256: business category' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} ) attributeTypes: ( 2.5.4.16 NAME 'postalAddress' DESC 'RFC2256: postal address' EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 ) attributeTypes: ( 2.5.4.17 NAME 'postalCode' DESC 'RFC2256: postal code' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} ) attributeTypes: ( 2.5.4.18 NAME 'postOfficeBox' DESC 'RFC2256: Post Office Box' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} ) attributeTypes: ( 2.5.4.19 NAME 'physicalDeliveryOfficeName' DESC 'RFC2256: Physical Delivery Office Name' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} ) attributeTypes: ( 2.5.4.1 NAME ( 'aliasedObjectName' 'aliasedEntryName' ) DESC 'RFC4512: name of aliased object' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE ) attributeTypes: ( 2.5.4.20 NAME 'telephoneNumber' DESC 'RFC2256: Telephone Number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{32} ) attributeTypes: ( 2.5.4.21 NAME 'telexNumber' DESC 'RFC2256: Telex Number' SYNTAX 1.3.6.1.4.1.1466.115.121.1.52 ) attributeTypes: ( 2.5.4.22 NAME 'teletexTerminalIdentifier' DESC 'RFC2256: Teletex Terminal Identifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.51 ) attributeTypes: ( 2.5.4.23 NAME ( 'facsimileTelephoneNumber' 'fax' ) DESC 'RFC2256: Facsimile (Fax) Telephone Number' EQUALITY facsimileNumberMatch SUBSTR facsimileNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.22 ) attributeTypes: ( 2.5.4.24 NAME 'x121Address' DESC 'RFC2256: X.121 Address' EQUALITY numericStringMatch SUBSTR numericStringSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{15} ) attributeTypes: ( 2.5.4.25 NAME 'internationaliSDNNumber' DESC 'RFC2256: international ISDN number' EQUALITY numericStringMatch SUBSTR numericStringSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{16} ) attributeTypes: ( 2.5.4.26 NAME 'registeredAddress' DESC 'RFC2256: registered postal address' SUP postalAddress SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 ) attributeTypes: ( 2.5.4.27 NAME 'destinationIndicator' DESC 'RFC2256: destination indicator' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{128} ) attributeTypes: ( 2.5.4.28 NAME 'preferredDeliveryMethod' DESC 'RFC2256: preferred delivery method' SYNTAX 1.3.6.1.4.1.1466.115.121.1.14 SINGLE-VALUE ) attributeTypes: ( 2.5.4.29 NAME 'presentationAddress' DESC 'RFC2256: presentation address' EQUALITY presentationAddressMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.43 SINGLE-VALUE ) attributeTypes: ( 2.5.4.2 NAME 'knowledgeInformation' DESC 'RFC2256: knowledge information' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} ) attributeTypes: ( 2.5.4.30 NAME 'supportedApplicationContext' DESC 'RFC2256: supported application context' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 ) attributeTypes: ( 2.5.4.31 NAME 'member' DESC 'RFC2256: member of a group' SUP distinguishedName ) attributeTypes: ( 2.5.4.32 NAME 'owner' DESC 'RFC2256: owner (of the object)' SUP distinguishedName ) attributeTypes: ( 2.5.4.33 NAME 'roleOccupant' DESC 'RFC2256: occupant of role' SUP distinguishedName ) attributeTypes: ( 2.5.4.34 NAME 'seeAlso' DESC 'RFC4519: DN of related object' SUP distinguishedName ) attributeTypes: ( 2.5.4.35 NAME 'userPassword' DESC 'RFC4519/2307: password of user' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} ) attributeTypes: ( 2.5.4.36 NAME 'userCertificate' DESC 'RFC2256: X.509 user certificate, use ;binary' EQUALITY certificateExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.8 ) attributeTypes: ( 2.5.4.37 NAME 'cACertificate' DESC 'RFC2256: X.509 CA certificate, use ;binary' EQUALITY certificateExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.8 ) attributeTypes: ( 2.5.4.38 NAME 'authorityRevocationList' DESC 'RFC2256: X.509 authority revocation list, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.9 ) attributeTypes: ( 2.5.4.39 NAME 'certificateRevocationList' DESC 'RFC2256: X.509 certificate revocation list, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.9 ) attributeTypes: ( 2.5.4.3 NAME ( 'cn' 'commonName' ) DESC 'RFC4519: common name(s) for which the entity is known by' SUP name ) attributeTypes: ( 2.5.4.40 NAME 'crossCertificatePair' DESC 'RFC2256: X.509 cross certificate pair, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.10 ) attributeTypes: ( 2.5.4.41 NAME 'name' DESC 'RFC4519: common supertype of name attributes' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} ) attributeTypes: ( 2.5.4.42 NAME ( 'givenName' 'gn' ) DESC 'RFC2256: first name(s) for which the entity is known by' SUP name ) attributeTypes: ( 2.5.4.43 NAME 'initials' DESC 'RFC2256: initials of some or all of names, but not the surname(s).' SUP name ) attributeTypes: ( 2.5.4.44 NAME 'generationQualifier' DESC 'RFC2256: name qualifier indicating a generation' SUP name ) attributeTypes: ( 2.5.4.45 NAME 'x500UniqueIdentifier' DESC 'RFC2256: X.500 unique identifier' EQUALITY bitStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 ) attributeTypes: ( 2.5.4.46 NAME 'dnQualifier' DESC 'RFC2256: DN qualifier' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 ) attributeTypes: ( 2.5.4.47 NAME 'enhancedSearchGuide' DESC 'RFC2256: enhanced search guide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.21 ) attributeTypes: ( 2.5.4.48 NAME 'protocolInformation' DESC 'RFC2256: protocol information' EQUALITY protocolInformationMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.42 ) attributeTypes: ( 2.5.4.49 NAME 'distinguishedName' DESC 'RFC4519: common supertype of DN attributes' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) attributeTypes: ( 2.5.4.4 NAME ( 'sn' 'surname' ) DESC 'RFC2256: last (family) name(s) for which the entity is known by' SUP name ) attributeTypes: ( 2.5.4.50 NAME 'uniqueMember' DESC 'RFC2256: unique member of a group' EQUALITY uniqueMemberMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 ) attributeTypes: ( 2.5.4.51 NAME 'houseIdentifier' DESC 'RFC2256: house identifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} ) attributeTypes: ( 2.5.4.52 NAME 'supportedAlgorithms' DESC 'RFC2256: supported algorithms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.49 ) attributeTypes: ( 2.5.4.53 NAME 'deltaRevocationList' DESC 'RFC2256: delta revocation list; use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.9 ) attributeTypes: ( 2.5.4.54 NAME 'dmdName' DESC 'RFC2256: name of DMD' SUP name ) attributeTypes: ( 2.5.4.5 NAME 'serialNumber' DESC 'RFC2256: serial number of the entity' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64} ) attributeTypes: ( 2.5.4.65 NAME 'pseudonym' DESC 'X.520(4th): pseudonym for the object' SUP name ) attributeTypes: ( 2.5.4.6 NAME ( 'c' 'countryName' ) DESC 'RFC4519: two-letter ISO-3166 country code' SUP name SYNTAX 1.3.6.1.4.1.1466.115.121.1.11 SINGLE-VALUE ) attributeTypes: ( 2.5.4.7 NAME ( 'l' 'localityName' ) DESC 'RFC2256: locality which this object resides in' SUP name ) attributeTypes: ( 2.5.4.8 NAME ( 'st' 'stateOrProvinceName' ) DESC 'RFC2256: state or province which this object resides in' SUP name ) attributeTypes: ( 2.5.4.9 NAME ( 'street' 'streetAddress' ) DESC 'RFC2256: street address of this object' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} ) ldapSyntaxes: ( 1.2.36.79672281.1.5.0 DESC 'RDN' ) ldapSyntaxes: ( 1.3.6.1.1.1.0.0 DESC 'RFC2307 NIS Netgroup Triple' ) ldapSyntaxes: ( 1.3.6.1.1.1.0.1 DESC 'RFC2307 Boot Parameter' ) ldapSyntaxes: ( 1.3.6.1.1.16.1 DESC 'UUID' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.10 DESC 'Certificate Pair' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.11 DESC 'Country String' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'Distinguished Name' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'Delivery Method' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'Directory String' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'Facsimile Telephone Number' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'Generalized Time' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5 String' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'Integer' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' X-NOT-HUMAN-READABLE 'TRUE' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'Name And Optional UID' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'Numeric String' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.39 DESC 'Other Mailbox' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'Octet String' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'Postal Address' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'Printable String' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.45 DESC 'SubtreeSpecification' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.49 DESC 'Supported Algorithm' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.4 DESC 'Audio' X-NOT-HUMAN-READABLE 'TRUE' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'Telephone Number' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'Telex Number' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.5 DESC 'Binary' X-NOT-HUMAN-READABLE 'TRUE' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'Bit String' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.7 DESC 'Boolean' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.8 DESC 'Certificate' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' ) ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.9 DESC 'Certificate List' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' ) ldapSyntaxes: ( 1.3.6.1.4.1.4203.666.11.10.2.1 DESC 'X.509 AttributeCertificate' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' ) matchingRules: ( 1.2.36.79672281.1.13.3 NAME 'rdnMatch' SYNTAX 1.2.36.79672281.1.5.0 ) matchingRules: ( 1.2.840.113556.1.4.803 NAME 'integerBitAndMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) matchingRules: ( 1.2.840.113556.1.4.804 NAME 'integerBitOrMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) matchingRules: ( 1.3.6.1.1.16.2 NAME 'UUIDMatch' SYNTAX 1.3.6.1.1.16.1 ) matchingRules: ( 1.3.6.1.1.16.3 NAME 'UUIDOrderingMatch' SYNTAX 1.3.6.1.1.16.1 ) matchingRules: ( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) matchingRules: ( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) matchingRules: ( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) matchingRules: ( 1.3.6.1.4.1.4203.1.2.1 NAME 'caseExactIA5SubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) matchingRules: ( 2.5.13.0 NAME 'objectIdentifierMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 ) matchingRules: ( 2.5.13.10 NAME 'numericStringSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 ) matchingRules: ( 2.5.13.11 NAME 'caseIgnoreListMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 ) matchingRules: ( 2.5.13.12 NAME 'caseIgnoreListSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 ) matchingRules: ( 2.5.13.13 NAME 'booleanMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 ) matchingRules: ( 2.5.13.14 NAME 'integerMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) matchingRules: ( 2.5.13.15 NAME 'integerOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) matchingRules: ( 2.5.13.16 NAME 'bitStringMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 ) matchingRules: ( 2.5.13.17 NAME 'octetStringMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 ) matchingRules: ( 2.5.13.18 NAME 'octetStringOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 ) matchingRules: ( 2.5.13.19 NAME 'octetStringSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 ) matchingRules: ( 2.5.13.1 NAME 'distinguishedNameMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 ) matchingRules: ( 2.5.13.20 NAME 'telephoneNumberMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 ) matchingRules: ( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 ) matchingRules: ( 2.5.13.23 NAME 'uniqueMemberMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 ) matchingRules: ( 2.5.13.27 NAME 'generalizedTimeMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 ) matchingRules: ( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 ) matchingRules: ( 2.5.13.29 NAME 'integerFirstComponentMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) matchingRules: ( 2.5.13.2 NAME 'caseIgnoreMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) matchingRules: ( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 ) matchingRules: ( 2.5.13.34 NAME 'certificateExactMatch' SYNTAX 1.3.6.1.1.15.1 ) matchingRules: ( 2.5.13.38 NAME 'certificateListExactMatch' SYNTAX 1.3.6.1.1.15.5 ) matchingRules: ( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) matchingRules: ( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 ) matchingRules: ( 2.5.13.5 NAME 'caseExactMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) matchingRules: ( 2.5.13.63 NAME 'facsimileNumberMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 ) matchingRules: ( 2.5.13.64 NAME 'facsimileNumberSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 ) matchingRules: ( 2.5.13.6 NAME 'caseExactOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) matchingRules: ( 2.5.13.7 NAME 'caseExactSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 ) matchingRules: ( 2.5.13.8 NAME 'numericStringMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 ) matchingRules: ( 2.5.13.9 NAME 'numericStringOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 ) matchingRuleUse: ( 1.2.840.113556.1.4.803 NAME 'integerBitAndMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbMaxReaders $ olcDbMaxSize $ olcDbSearchStack $ mailPreferenceOption ) ) matchingRuleUse: ( 1.2.840.113556.1.4.804 NAME 'integerBitOrMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbMaxReaders $ olcDbMaxSize $ olcDbSearchStack $ mailPreferenceOption ) ) matchingRuleUse: ( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' APPLIES ( altServer $ c $ mail $ dc $ associatedDomain $ email $ aRecord $ mDRecord $ mXRecord $ nSRecord $ sOARecord $ cNAMERecord $ janetMailbox ) ) matchingRuleUse: ( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' APPLIES ( altServer $ c $ mail $ dc $ associatedDomain $ email $ aRecord $ mDRecord $ mXRecord $ nSRecord $ sOARecord $ cNAMERecord $ janetMailbox ) ) matchingRuleUse: ( 2.5.13.0 NAME 'objectIdentifierMatch' APPLIES ( supportedControl $ supportedExtension $ supportedFeatures $ supportedApplicationContext ) ) matchingRuleUse: ( 2.5.13.11 NAME 'caseIgnoreListMatch' APPLIES ( postalAddress $ registeredAddress $ homePostalAddress ) ) matchingRuleUse: ( 2.5.13.12 NAME 'caseIgnoreListSubstringsMatch' APPLIES ( postalAddress $ registeredAddress $ homePostalAddress ) ) matchingRuleUse: ( 2.5.13.13 NAME 'booleanMatch' APPLIES ( hasSubordinates $ olcAddContentAcl $ olcGentleHUP $ olcHidden $ olcLastMod $ olcMirrorMode $ olcMonitoring $ olcReadOnly $ olcReverseLookup $ olcSyncUseSubentry $ olcDbNoSync ) ) matchingRuleUse: ( 2.5.13.14 NAME 'integerMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbMaxReaders $ olcDbMaxSize $ olcDbSearchStack $ mailPreferenceOption ) ) matchingRuleUse: ( 2.5.13.15 NAME 'integerOrderingMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbMaxReaders $ olcDbMaxSize $ olcDbSearchStack $ mailPreferenceOption ) ) matchingRuleUse: ( 2.5.13.16 NAME 'bitStringMatch' APPLIES x500UniqueIdentifier ) matchingRuleUse: ( 2.5.13.17 NAME 'octetStringMatch' APPLIES userPassword ) matchingRuleUse: ( 2.5.13.18 NAME 'octetStringOrderingMatch' APPLIES userPassword ) matchingRuleUse: ( 2.5.13.1 NAME 'distinguishedNameMatch' APPLIES ( creatorsName $ modifiersName $ subschemaSubentry $ entryDN $ namingContexts $ aliasedObjectName $ dynamicSubtrees $ distinguishedName $ seeAlso $ olcDefaultSearchBase $ olcRootDN $ olcSchemaDN $ olcSuffix $ olcUpdateDN $ member $ owner $ roleOccupant $ manager $ documentAuthor $ secretary $ associatedName $ dITRedirect ) ) matchingRuleUse: ( 2.5.13.20 NAME 'telephoneNumberMatch' APPLIES ( telephoneNumber $ homePhone $ mobile $ pager ) ) matchingRuleUse: ( 2.5.13.22 NAME 'presentationAddressMatch' APPLIES presentationAddress ) matchingRuleUse: ( 2.5.13.23 NAME 'uniqueMemberMatch' APPLIES uniqueMember ) matchingRuleUse: ( 2.5.13.24 NAME 'protocolInformationMatch' APPLIES protocolInformation ) matchingRuleUse: ( 2.5.13.27 NAME 'generalizedTimeMatch' APPLIES ( createTimestamp $ modifyTimestamp ) ) matchingRuleUse: ( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' APPLIES ( createTimestamp $ modifyTimestamp ) ) matchingRuleUse: ( 2.5.13.29 NAME 'integerFirstComponentMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbMaxReaders $ olcDbMaxSize $ olcDbSearchStack $ mailPreferenceOption ) ) matchingRuleUse: ( 2.5.13.2 NAME 'caseIgnoreMatch' APPLIES ( supportedSASLMechanisms $ vendorName $ vendorVersion $ ref $ name $ cn $ uid $ labeledURI $ description $ olcConfigFile $ olcConfigDir $ olcAccess $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAttributeTypes $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcBackend $ olcDatabase $ olcDisallows $ olcDitContentRules $ olcExtraAttrs $ olcInclude $ olcLdapSyntaxes $ olcLimits $ olcLogFile $ olcLogLevel $ olcModuleLoad $ olcModulePath $ olcObjectClasses $ olcObjectIdentifier $ olcOverlay $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPlugin $ olcPluginLogFile $ olcReferral $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDSE $ olcRootPW $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSortVals $ olcSubordinate $ olcSyncrepl $ olcTCPBuffer $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSCRLFile $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSProtocolMin $ olcUpdateRef $ olcDbDirectory $ olcDbCheckpoint $ olcDbEnvFlags $ olcDbIndex $ olcDbMode $ knowledgeInformation $ sn $ serialNumber $ c $ l $ st $ street $ o $ ou $ title $ businessCategory $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ destinationIndicator $ givenName $ initials $ generationQualifier $ dnQualifier $ houseIdentifier $ dmdName $ pseudonym $ textEncodedORAddress $ info $ drink $ roomNumber $ userClass $ host $ documentIdentifier $ documentTitle $ documentVersion $ documentLocation $ personalTitle $ co $ uniqueIdentifier $ organizationalStatus $ buildingName $ documentPublisher $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ preferredLanguage ) ) matchingRuleUse: ( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' APPLIES ( supportedControl $ supportedExtension $ supportedFeatures $ ldapSyntaxes $ supportedApplicationContext ) ) matchingRuleUse: ( 2.5.13.34 NAME 'certificateExactMatch' APPLIES ( userCertificate $ cACertificate ) ) matchingRuleUse: ( 2.5.13.38 NAME 'certificateListExactMatch' APPLIES ( authorityRevocationList $ certificateRevocationList $ deltaRevocationList ) ) matchingRuleUse: ( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' APPLIES ( supportedSASLMechanisms $ vendorName $ vendorVersion $ ref $ name $ cn $ uid $ labeledURI $ description $ olcConfigFile $ olcConfigDir $ olcAccess $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAttributeTypes $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcBackend $ olcDatabase $ olcDisallows $ olcDitContentRules $ olcExtraAttrs $ olcInclude $ olcLdapSyntaxes $ olcLimits $ olcLogFile $ olcLogLevel $ olcModuleLoad $ olcModulePath $ olcObjectClasses $ olcObjectIdentifier $ olcOverlay $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPlugin $ olcPluginLogFile $ olcReferral $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDSE $ olcRootPW $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSortVals $ olcSubordinate $ olcSyncrepl $ olcTCPBuffer $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSCRLFile $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSProtocolMin $ olcUpdateRef $ olcDbDirectory $ olcDbCheckpoint $ olcDbEnvFlags $ olcDbIndex $ olcDbMode $ knowledgeInformation $ sn $ serialNumber $ c $ l $ st $ street $ o $ ou $ title $ businessCategory $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ destinationIndicator $ givenName $ initials $ generationQualifier $ dnQualifier $ houseIdentifier $ dmdName $ pseudonym $ textEncodedORAddress $ info $ drink $ roomNumber $ userClass $ host $ documentIdentifier $ documentTitle $ documentVersion $ documentLocation $ personalTitle $ co $ uniqueIdentifier $ organizationalStatus $ buildingName $ documentPublisher $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ preferredLanguage ) ) matchingRuleUse: ( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' APPLIES ( serialNumber $ destinationIndicator $ dnQualifier ) ) matchingRuleUse: ( 2.5.13.5 NAME 'caseExactMatch' APPLIES ( supportedSASLMechanisms $ vendorName $ vendorVersion $ ref $ name $ cn $ uid $ labeledURI $ description $ olcConfigFile $ olcConfigDir $ olcAccess $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAttributeTypes $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcBackend $ olcDatabase $ olcDisallows $ olcDitContentRules $ olcExtraAttrs $ olcInclude $ olcLdapSyntaxes $ olcLimits $ olcLogFile $ olcLogLevel $ olcModuleLoad $ olcModulePath $ olcObjectClasses $ olcObjectIdentifier $ olcOverlay $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPlugin $ olcPluginLogFile $ olcReferral $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDSE $ olcRootPW $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSortVals $ olcSubordinate $ olcSyncrepl $ olcTCPBuffer $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSCRLFile $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSProtocolMin $ olcUpdateRef $ olcDbDirectory $ olcDbCheckpoint $ olcDbEnvFlags $ olcDbIndex $ olcDbMode $ knowledgeInformation $ sn $ serialNumber $ c $ l $ st $ street $ o $ ou $ title $ businessCategory $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ destinationIndicator $ givenName $ initials $ generationQualifier $ dnQualifier $ houseIdentifier $ dmdName $ pseudonym $ textEncodedORAddress $ info $ drink $ roomNumber $ userClass $ host $ documentIdentifier $ documentTitle $ documentVersion $ documentLocation $ personalTitle $ co $ uniqueIdentifier $ organizationalStatus $ buildingName $ documentPublisher $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ preferredLanguage ) ) matchingRuleUse: ( 2.5.13.63 NAME 'facsimileNumberMatch' APPLIES ( telephoneNumber $ facsimileTelephoneNumber $ homePhone $ mobile $ pager ) ) matchingRuleUse: ( 2.5.13.64 NAME 'facsimileNumberSubstringsMatch' APPLIES ( telephoneNumber $ facsimileTelephoneNumber $ homePhone $ mobile $ pager ) ) matchingRuleUse: ( 2.5.13.6 NAME 'caseExactOrderingMatch' APPLIES ( supportedSASLMechanisms $ vendorName $ vendorVersion $ ref $ name $ cn $ uid $ labeledURI $ description $ olcConfigFile $ olcConfigDir $ olcAccess $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAttributeTypes $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcBackend $ olcDatabase $ olcDisallows $ olcDitContentRules $ olcExtraAttrs $ olcInclude $ olcLdapSyntaxes $ olcLimits $ olcLogFile $ olcLogLevel $ olcModuleLoad $ olcModulePath $ olcObjectClasses $ olcObjectIdentifier $ olcOverlay $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPlugin $ olcPluginLogFile $ olcReferral $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDSE $ olcRootPW $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSortVals $ olcSubordinate $ olcSyncrepl $ olcTCPBuffer $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSCRLFile $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSProtocolMin $ olcUpdateRef $ olcDbDirectory $ olcDbCheckpoint $ olcDbEnvFlags $ olcDbIndex $ olcDbMode $ knowledgeInformation $ sn $ serialNumber $ c $ l $ st $ street $ o $ ou $ title $ businessCategory $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ destinationIndicator $ givenName $ initials $ generationQualifier $ dnQualifier $ houseIdentifier $ dmdName $ pseudonym $ textEncodedORAddress $ info $ drink $ roomNumber $ userClass $ host $ documentIdentifier $ documentTitle $ documentVersion $ documentLocation $ personalTitle $ co $ uniqueIdentifier $ organizationalStatus $ buildingName $ documentPublisher $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ preferredLanguage ) ) matchingRuleUse: ( 2.5.13.7 NAME 'caseExactSubstringsMatch' APPLIES ( serialNumber $ destinationIndicator $ dnQualifier ) ) matchingRuleUse: ( 2.5.13.8 NAME 'numericStringMatch' APPLIES ( x121Address $ internationaliSDNNumber ) ) matchingRuleUse: ( 2.5.13.9 NAME 'numericStringOrderingMatch' APPLIES ( x121Address $ internationaliSDNNumber ) ) objectClasses: ( 0.9.2342.19200300.100.4.13 NAME 'domain' SUP top STRUCTURAL MUST domainComponent MAY ( associatedName $ organizationName $ description $ businessCategory $ seeAlso $ searchGuide $ userPassword $ localityName $ stateOrProvinceName $ streetAddress $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ streetAddress $ facsimileTelephoneNumber $ internationalISDNNumber $ telephoneNumber $ teletexTerminalIdentifier $ telexNumber $ preferredDeliveryMethod $ destinationIndicator $ registeredAddress $ x121Address ) ) objectClasses: ( 0.9.2342.19200300.100.4.14 NAME 'RFC822localPart' SUP domain STRUCTURAL MAY ( commonName $ surname $ description $ seeAlso $ telephoneNumber $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ streetAddress $ facsimileTelephoneNumber $ internationalISDNNumber $ telephoneNumber $ teletexTerminalIdentifier $ telexNumber $ preferredDeliveryMethod $ destinationIndicator $ registeredAddress $ x121Address ) ) objectClasses: ( 0.9.2342.19200300.100.4.15 NAME 'dNSDomain' SUP domain STRUCTURAL MAY ( ARecord $ MDRecord $ MXRecord $ NSRecord $ SOARecord $ CNAMERecord ) ) objectClasses: ( 0.9.2342.19200300.100.4.17 NAME 'domainRelatedObject' DESC 'RFC1274: an object related to an domain' SUP top AUXILIARY MUST associatedDomain ) objectClasses: ( 0.9.2342.19200300.100.4.18 NAME 'friendlyCountry' SUP country STRUCTURAL MUST friendlyCountryName ) objectClasses: ( 0.9.2342.19200300.100.4.19 NAME 'simpleSecurityObject' DESC 'RFC1274: simple security object' SUP top AUXILIARY MUST userPassword ) objectClasses: ( 0.9.2342.19200300.100.4.20 NAME 'pilotOrganization' SUP ( organization $ organizationalUnit ) STRUCTURAL MAY buildingName ) objectClasses: ( 0.9.2342.19200300.100.4.21 NAME 'pilotDSA' SUP dsa STRUCTURAL MAY dSAQuality ) objectClasses: ( 0.9.2342.19200300.100.4.22 NAME 'qualityLabelledData' SUP top AUXILIARY MUST dsaQuality MAY ( subtreeMinimumQuality $ subtreeMaximumQuality ) ) objectClasses: ( 0.9.2342.19200300.100.4.4 NAME ( 'pilotPerson' 'newPilotPerson' ) SUP person STRUCTURAL MAY ( userid $ textEncodedORAddress $ rfc822Mailbox $ favouriteDrink $ roomNumber $ userClass $ homeTelephoneNumber $ homePostalAddress $ secretary $ personalTitle $ preferredDeliveryMethod $ businessCategory $ janetMailbox $ otherMailbox $ mobileTelephoneNumber $ pagerTelephoneNumber $ organizationalStatus $ mailPreferenceOption $ personalSignature ) ) objectClasses: ( 0.9.2342.19200300.100.4.5 NAME 'account' SUP top STRUCTURAL MUST userid MAY ( description $ seeAlso $ localityName $ organizationName $ organizationalUnitName $ host ) ) objectClasses: ( 0.9.2342.19200300.100.4.6 NAME 'document' SUP top STRUCTURAL MUST documentIdentifier MAY ( commonName $ description $ seeAlso $ localityName $ organizationName $ organizationalUnitName $ documentTitle $ documentVersion $ documentAuthor $ documentLocation $ documentPublisher ) ) objectClasses: ( 0.9.2342.19200300.100.4.7 NAME 'room' SUP top STRUCTURAL MUST commonName MAY ( roomNumber $ description $ seeAlso $ telephoneNumber ) ) objectClasses: ( 0.9.2342.19200300.100.4.9 NAME 'documentSeries' SUP top STRUCTURAL MUST commonName MAY ( description $ seeAlso $ telephonenumber $ localityName $ organizationName $ organizationalUnitName ) ) objectClasses: ( 1.3.6.1.1.3.1 NAME 'uidObject' DESC 'RFC2377: uid object' SUP top AUXILIARY MUST uid ) objectClasses: ( 1.3.6.1.4.1.1466.101.119.2 NAME 'dynamicObject' DESC 'RFC2589: Dynamic Object' SUP top AUXILIARY ) objectClasses: ( 1.3.6.1.4.1.1466.101.120.111 NAME 'extensibleObject' DESC 'RFC4512: extensible object' SUP top AUXILIARY ) objectClasses: ( 1.3.6.1.4.1.1466.344 NAME 'dcObject' DESC 'RFC2247: domain component object' SUP top AUXILIARY MUST dc ) objectClasses: ( 1.3.6.1.4.1.250.3.15 NAME 'labeledURIObject' DESC 'RFC2079: object that contains the URI attribute type' SUP top AUXILIARY MAY labeledURI ) objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.0 NAME 'olcConfig' DESC 'OpenLDAP configuration object' SUP top ABSTRACT ) objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.1 NAME 'olcGlobal' DESC 'OpenLDAP Global configuration options' SUP olcConfig STRUCTURAL MAY ( cn $ olcConfigFile $ olcConfigDir $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcDisallows $ olcGentleHUP $ olcIdleTimeout $ olcIndexSubstrIfMaxLen $ olcIndexSubstrIfMinLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcLocalSSF $ olcLogFile $ olcLogLevel $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPluginLogFile $ olcReadOnly $ olcReferral $ olcReplogFile $ olcRequires $ olcRestrict $ olcReverseLookup $ olcRootDSE $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcTCPBuffer $ olcThreads $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSCRLFile $ olcToolThreads $ olcWriteTimeout $ olcObjectIdentifier $ olcAttributeTypes $ olcObjectClasses $ olcDitContentRules $ olcLdapSyntaxes ) ) objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.2 NAME 'olcSchemaConfig' DESC 'OpenLDAP schema object' SUP olcConfig STRUCTURAL MAY ( cn $ olcObjectIdentifier $ olcLdapSyntaxes $ olcAttributeTypes $ olcObjectClasses $ olcDitContentRules ) ) objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.3 NAME 'olcBackendConfig' DESC 'OpenLDAP Backend-specific options' SUP olcConfig STRUCTURAL MUST olcBackend ) objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.4 NAME 'olcDatabaseConfig' DESC 'OpenLDAP Database-specific options' SUP olcConfig STRUCTURAL MUST olcDatabase MAY ( olcHidden $ olcSuffix $ olcSubordinate $ olcAccess $ olcAddContentAcl $ olcLastMod $ olcLimits $ olcMaxDerefDepth $ olcPlugin $ olcReadOnly $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplicationInterval $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDN $ olcRootPW $ olcSchemaDN $ olcSecurity $ olcSizeLimit $ olcSyncUseSubentry $ olcSyncrepl $ olcTimeLimit $ olcUpdateDN $ olcUpdateRef $ olcMirrorMode $ olcMonitoring $ olcExtraAttrs ) ) objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.5 NAME 'olcOverlayConfig' DESC 'OpenLDAP Overlay-specific options' SUP olcConfig STRUCTURAL MUST olcOverlay ) objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.6 NAME 'olcIncludeFile' DESC 'OpenLDAP configuration include file' SUP olcConfig STRUCTURAL MUST olcInclude MAY ( cn $ olcRootDSE ) ) objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.7 NAME 'olcFrontendConfig' DESC 'OpenLDAP frontend configuration' AUXILIARY MAY ( olcDefaultSearchBase $ olcPasswordHash $ olcSortVals ) ) objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.8 NAME 'olcModuleList' DESC 'OpenLDAP dynamic module info' SUP olcConfig STRUCTURAL MAY ( cn $ olcModulePath $ olcModuleLoad ) ) objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.2.12.1 NAME 'olcMdbConfig' DESC 'MDB backend configuration' SUP olcDatabaseConfig STRUCTURAL MUST olcDbDirectory MAY ( olcDbCheckpoint $ olcDbEnvFlags $ olcDbNoSync $ olcDbIndex $ olcDbMaxReaders $ olcDbMaxsize $ olcDbMode $ olcDbSearchStack ) ) objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.2.2.1 NAME 'olcLdifConfig' DESC 'LDIF backend configuration' SUP olcDatabaseConfig STRUCTURAL MUST olcDbDirectory ) objectClasses: ( 1.3.6.1.4.1.4203.1.4.1 NAME ( 'OpenLDAProotDSE' 'LDAProotDSE' ) DESC 'OpenLDAP Root DSE object' SUP top STRUCTURAL MAY cn ) objectClasses: ( 1.3.6.1.4.1.4203.1.4.3 NAME 'OpenLDAPorg' DESC 'OpenLDAP Organizational Object' SUP organization STRUCTURAL MAY ( buildingName $ displayName $ labeledURI ) ) objectClasses: ( 1.3.6.1.4.1.4203.1.4.4 NAME 'OpenLDAPou' DESC 'OpenLDAP Organizational Unit Object' SUP organizationalUnit STRUCTURAL MAY ( buildingName $ displayName $ labeledURI $ o ) ) objectClasses: ( 1.3.6.1.4.1.4203.1.4.5 NAME 'OpenLDAPperson' DESC 'OpenLDAP Person' SUP ( pilotPerson $ inetOrgPerson ) STRUCTURAL MUST ( uid $ cn ) MAY ( givenName $ labeledURI $ o ) ) objectClasses: ( 1.3.6.1.4.1.4203.1.4.6 NAME 'OpenLDAPdisplayableObject' DESC 'OpenLDAP Displayable Object' AUXILIARY MAY displayName ) objectClasses: ( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' DESC 'RFC2798: Internet Organizational Person' SUP organizationalPerson STRUCTURAL MAY ( audio $ businessCategory $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ givenName $ homePhone $ homePostalAddress $ initials $ jpegPhoto $ labeledURI $ mail $ manager $ mobile $ o $ pager $ photo $ roomNumber $ secretary $ uid $ userCertificate $ x500uniqueIdentifier $ preferredLanguage $ userSMIMECertificate $ userPKCS12 ) ) objectClasses: ( 2.16.840.1.113730.3.2.6 NAME 'referral' DESC 'namedref: named subordinate referral' SUP top STRUCTURAL MUST ref ) objectClasses: ( 2.5.17.0 NAME 'subentry' DESC 'RFC3672: subentry' SUP top STRUCTURAL MUST ( cn $ subtreeSpecification ) ) objectClasses: ( 2.5.20.1 NAME 'subschema' DESC 'RFC4512: controlling subschema (sub)entry' AUXILIARY MAY ( dITStructureRules $ nameForms $ dITContentRules $ objectClasses $ attributeTypes $ matchingRules $ matchingRuleUse ) ) objectClasses: ( 2.5.6.0 NAME 'top' DESC 'top of the superclass chain' ABSTRACT MUST objectClass ) objectClasses: ( 2.5.6.10 NAME 'residentialPerson' DESC 'RFC2256: an residential person' SUP person STRUCTURAL MUST l MAY ( businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ preferredDeliveryMethod $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l ) ) objectClasses: ( 2.5.6.11 NAME 'applicationProcess' DESC 'RFC2256: an application process' SUP top STRUCTURAL MUST cn MAY ( seeAlso $ ou $ l $ description ) ) objectClasses: ( 2.5.6.12 NAME 'applicationEntity' DESC 'RFC2256: an application entity' SUP top STRUCTURAL MUST ( presentationAddress $ cn ) MAY ( supportedApplicationContext $ seeAlso $ ou $ o $ l $ description ) ) objectClasses: ( 2.5.6.13 NAME 'dSA' DESC 'RFC2256: a directory system agent (a server)' SUP applicationEntity STRUCTURAL MAY knowledgeInformation ) objectClasses: ( 2.5.6.14 NAME 'device' DESC 'RFC2256: a device' SUP top STRUCTURAL MUST cn MAY ( serialNumber $ seeAlso $ owner $ ou $ o $ l $ description ) ) objectClasses: ( 2.5.6.15 NAME 'strongAuthenticationUser' DESC 'RFC2256: a strong authentication user' SUP top AUXILIARY MUST userCertificate ) objectClasses: ( 2.5.6.16.2 NAME 'certificationAuthority-V2' SUP certificationAuthority AUXILIARY MAY deltaRevocationList ) objectClasses: ( 2.5.6.16 NAME 'certificationAuthority' DESC 'RFC2256: a certificate authority' SUP top AUXILIARY MUST ( authorityRevocationList $ certificateRevocationList $ cACertificate ) MAY crossCertificatePair ) objectClasses: ( 2.5.6.17 NAME 'groupOfUniqueNames' DESC 'RFC2256: a group of unique names (DN and Unique Identifier)' SUP top STRUCTURAL MUST ( uniqueMember $ cn ) MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ description ) ) objectClasses: ( 2.5.6.18 NAME 'userSecurityInformation' DESC 'RFC2256: a user security information' SUP top AUXILIARY MAY supportedAlgorithms ) objectClasses: ( 2.5.6.19 NAME 'cRLDistributionPoint' SUP top STRUCTURAL MUST cn MAY ( certificateRevocationList $ authorityRevocationList $ deltaRevocationList ) ) objectClasses: ( 2.5.6.1 NAME 'alias' DESC 'RFC4512: an alias' SUP top STRUCTURAL MUST aliasedObjectName ) objectClasses: ( 2.5.6.20 NAME 'dmd' SUP top STRUCTURAL MUST dmdName MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) ) objectClasses: ( 2.5.6.21 NAME 'pkiUser' DESC 'RFC2587: a PKI user' SUP top AUXILIARY MAY userCertificate ) objectClasses: ( 2.5.6.22 NAME 'pkiCA' DESC 'RFC2587: PKI certificate authority' SUP top AUXILIARY MAY ( authorityRevocationList $ certificateRevocationList $ cACertificate $ crossCertificatePair ) ) objectClasses: ( 2.5.6.23 NAME 'deltaCRL' DESC 'RFC2587: PKI user' SUP top AUXILIARY MAY deltaRevocationList ) objectClasses: ( 2.5.6.2 NAME 'country' DESC 'RFC2256: a country' SUP top STRUCTURAL MUST c MAY ( searchGuide $ description ) ) objectClasses: ( 2.5.6.3 NAME 'locality' DESC 'RFC2256: a locality' SUP top STRUCTURAL MAY ( street $ seeAlso $ searchGuide $ st $ l $ description ) ) objectClasses: ( 2.5.6.4 NAME 'organization' DESC 'RFC2256: an organization' SUP top STRUCTURAL MUST o MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) ) objectClasses: ( 2.5.6.5 NAME 'organizationalUnit' DESC 'RFC2256: an organizational unit' SUP top STRUCTURAL MUST ou MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) ) objectClasses: ( 2.5.6.6 NAME 'person' DESC 'RFC2256: a person' SUP top STRUCTURAL MUST ( sn $ cn ) MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) ) objectClasses: ( 2.5.6.7 NAME 'organizationalPerson' DESC 'RFC2256: an organizational person' SUP person STRUCTURAL MAY ( title $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l ) ) objectClasses: ( 2.5.6.8 NAME 'organizationalRole' DESC 'RFC2256: an organizational role' SUP top STRUCTURAL MUST cn MAY ( x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ seeAlso $ roleOccupant $ preferredDeliveryMethod $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l $ description ) ) objectClasses: ( 2.5.6.9 NAME 'groupOfNames' DESC 'RFC2256: a group of names (DNs)' SUP top STRUCTURAL MUST ( member $ cn ) MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ description ) ) perl-ldap-0.58/data/42-cmp.ldif0000644000175000000620000002306012173014262015556 0ustar marschapstaff dn: o=University of Michigan, c=US objectclass: top objectclass: organization objectclass: domainRelatedObject l: Ann Arbor, Michigan st: Michigan o: University of Michigan o: UMICH o: UM o: U-M o: U of M description: The University of Michigan at Ann Arbor postaladdress: University of Michigan $ 535 W. William St. $ Ann Arbor, MI 481 09 $ US telephonenumber: +1 313 764-1817 associateddomain: umich.edu dn: cn=Manager, o=University of Michigan, c=US objectclass: top objectclass: person cn: Manager cn: Directory Manager cn: Dir Man sn: Manager description: Manager of the directory userpassword: secret dn: ou=Groups, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit ou: Groups dn: cn=All Staff, ou=Groups, o=University of Michigan, c=US member: cn=Manager, o=University of Michigan, c=US member: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=Un iversity of Michigan, c=US member: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michiga n, c=US member: cn=John Doe, ou=Information Technology Division, ou=People, o=Universi ty of Michigan, c=US member: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Mich igan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 2, ou=Information Technology Division, ou=People, o=U niversity of Michigan, c=US member: cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of M ichigan, c=US member: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=Univ ersity of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US cn: All Staff description: Everyone in the sample data objectclass: groupOfNames dn: cn=Alumni Assoc Staff, ou=Groups, o=University of Michigan, c=US member: cn=Manager, o=University of Michigan, c=US member: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michiga n, c=US member: cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of M ichigan, c=US member: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Mich igan, c=US member: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US description: All Alumni Assoc Staff cn: Alumni Assoc Staff objectclass: groupOfNames dn: cn=ITD Staff, ou=Groups, o=University of Michigan, c=US owner: cn=Manager, o=University of Michigan, c=US description: All ITD Staff cn: ITD Staff objectclass: groupOfNames member: cn=Manager, o=University of Michigan, c=US member: cn=John Doe, ou=Information Technology Division, ou=People, o=Universi ty of Michigan, c=US member: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US dn: ou=People, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit ou: People dn: ou=Alumni Association, ou=People, o=University of Michigan, c=US objectclass: top objectclass: organizationalUnit ou: Alumni Association dn: cn=Dorothy Stevens, ou=Alumni Association, ou=People, o=University of Mich igan, c=US objectclass: OpenLDAPperson cn: Dorothy Stevens cn: Dot Stevens uid: dot sn: Stevens title: Secretary, UM Alumni Association postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US drink: Lemonade homepostaladdress: 377 White St. Apt. 3 $ Ann Arbor, MI 48104 description: Very tall facsimiletelephonenumber: +1 313 555 3223 telephonenumber: +1 313 555 3664 mail: dots@mail.alumni.umich.edu homephone: +1 313 555 0454 dn: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Mich igan, c=US objectclass: OpenLDAPperson cn: James A Jones 1 cn: James Jones cn: Jim Jones uid: james sn: Jones postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US userpassword: jaj homepostaladdress: 3882 Beverly Rd. $ Ann Arbor, MI 48105 homephone: +1 313 555 4772 description: Outstanding title: Mad Cow Researcher, UM Alumni Association pager: +1 313 555 3923 mail: jaj@mail.alumni.umich.edu facsimiletelephonenumber: +1 313 555 4332 telephonenumber: +1 313 555 0895 drink: Orange Juice dn: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michigan, c =US objectclass: OpenLDAPperson cn: Jane Doe cn: Jane Alverson sn: Doe uid: jane title: Programmer Analyst, UM Alumni Association postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US homepostaladdress: 123 Anystreet $ Ann Arbor, MI 48104 drink: diet coke description: Enthusiastic mail: jdoe@woof.net homephone: +1 313 555 5445 pager: +1 313 555 1220 facsimiletelephonenumber: +1 313 555 2311 telephonenumber: +1 313 555 4774 dn: cn=Jennifer Smith, ou=Alumni Association, ou=People, o=University of Michi gan, c=US objectclass: OpenLDAPperson cn: Jennifer Smith cn: Jen Smith uid: jen sn: Smith postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US drink: Sam Adams homepostaladdress: 1000 Maple #44 $ Ann Arbor, MI 48103 title: Telemarketer, UM Alumni Association mail: jen@mail.alumni.umich.edu homephone: +1 313 555 2333 pager: +1 313 555 6442 facsimiletelephonenumber: +1 313 555 2756 telephonenumber: +1 313 555 8232 dn: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Michigan , c=US objectclass: OpenLDAPperson cn: Mark Elliot cn: Mark A Elliot uid: mark sn: Elliot postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US homepostaladdress: 199 Outer Drive $ Ypsilanti, MI 48198 homephone: +1 313 555 0388 drink: Gasoline title: Director, UM Alumni Association mail: melliot@mail.alumni.umich.edu pager: +1 313 555 7671 facsimiletelephonenumber: +1 313 555 7762 telephonenumber: +1 313 555 4177 dn: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Mich igan, c=US objectclass: OpenLDAPperson cn: Ursula Hampster uid: ursula sn: Hampster title: Secretary, UM Alumni Association postaladdress: Alumni Association $ 111 Maple St $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US homepostaladdress: 123 Anystreet $ Ann Arbor, MI 48104 mail: uham@mail.alumni.umich.edu homephone: +1 313 555 8421 pager: +1 313 555 2844 facsimiletelephonenumber: +1 313 555 9700 telephonenumber: +1 313 555 5331 dn: ou=Information Technology Division, ou=People, o=University of Michigan, c =US objectclass: top objectclass: organizationalUnit ou: Information Technology Division dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=Univer sity of Michigan, c=US objectclass: OpenLDAPperson cn: Barbara Jensen cn: Babs Jensen uid: babs sn: Jensen title: Mythical Manager, Research Systems postaladdress: ITD Prod Dev & Deployment $ 535 W. William St. Room 4212 $ Ann Arbor, MI 48103-4943 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US userpassword: bjensen mail: bjensen@mailgw.umich.edu homepostaladdress: 123 Wesley $ Ann Arbor, MI 48103 description: Mythical manager of the rsdd unix project drink: water homephone: +1 313 555 2333 pager: +1 313 555 3233 facsimiletelephonenumber: +1 313 555 2274 telephonenumber: +1 313 555 9022 dn: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=Universi ty of Michigan, c=US objectclass: OpenLDAPperson cn: Bjorn Jensen cn: Biiff Jensen uid: bjorn sn: Jensen seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US userpassword: bjorn homepostaladdress: 19923 Seven Mile Rd. $ South Lyon, MI 49999 title: Director, Embedded Systems postaladdress: Info Tech Division $ 535 W. William St. $ Ann Arbor, MI 48103 mail: bjorn@mailgw.umich.edu homephone: +1 313 555 5444 pager: +1 313 555 4474 facsimiletelephonenumber: +1 313 555 2177 telephonenumber: +1 313 555 0355 description: The replaced multiLineDescription $ Blah Woof. drink: Iced Tea drink: Mad Dog 20/20 dn: cn=Gern Jensen, ou=Information Technology Division, ou=People, o=Universit y of Michigan, c=US objectclass: OpenLDAPperson cn: Gern Jensen sn: Jensen uid: gern title: Chief Investigator, ITD postaladdress: ITD $ 535 W. William St $ Ann Arbor, MI 48103 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US drink: Coffee homepostaladdress: 844 Brown St. Apt. 4 $ Ann Arbor, MI 48104 description: Very odd facsimiletelephonenumber: +1 313 555 7557 telephonenumber: +1 313 555 8343 mail: gjensen@mailgw.umich.edu homephone: +1 313 555 8844 dn: cn=John Doe, ou=Information Technology Division, ou=People, o=University o f Michigan, c=US objectclass: OpenLDAPperson cn: John Doe cn: Jonathon Doe uid: john sn: Doe postaladdress: ITD $ 535 W. William $ Ann Arbor, MI 48109 seealso: cn=All Staff, ou=Groups, o=University of Michigan, c=US homepostaladdress: 912 East Bllvd $ Ann Arbor, MI 48104 title: System Administrator, Information Technology Division description: overworked! mail: johnd@mailgw.umich.edu homephone: +1 313 555 3774 pager: +1 313 555 6573 facsimiletelephonenumber: +1 313 555 4544 telephonenumber: +1 313 555 9394 perl-ldap-0.58/SIGNATURE0000644000175000000620000002577612256064213014312 0ustar marschapstaffThis file contains message digests of all files listed in MANIFEST, signed via the Module::Signature module, version 0.73. To verify the content in this distribution, first make sure you have Module::Signature installed, then type: % cpansign -v It will check each file's integrity, as well as the signature's validity. If "==> Signature verified OK! <==" is not displayed, the distribution may already have been compromised, and you should not run its Makefile.PL or Build.PL. -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 SHA1 b3d7b971ea6fc7fbb96cdf4cea3d1cdf68f4d24f CREDITS SHA1 a7ea3169fdca82c009202386976e4ad4cb2af17c Changes SHA1 18422f27b2f17b10e9d18b4e482d7bfc95c8df86 INSTALL SHA1 037d70bd2535dc79bda1bafca57dad7682851ffc MANIFEST SHA1 b1dde8d68f20d9f0353c7a891f4efbaa20882305 MANIFEST.SKIP SHA1 bcfb597c5fda0cbcfb967043c159c59812659a44 META.json SHA1 ffe82367f16b332f397246be40203027297afc34 Makefile.PL SHA1 dcc1167f3a731aa88d036f282bad68b23e5c2ac1 README SHA1 45d3c0297db0a7e960a2456ece90ea3e37242919 TODO SHA1 8e15e7abefa826736358685aa1115810baaa9b4a bin/ldapdelete SHA1 fb042e706fb1f873b39138c95b8f362a8f1bea8d bin/ldapmodrdn SHA1 212b83f5dae352596008329dc6bfac445a3ab4ac bin/ldapsearch SHA1 0820488b025a7d48333e6f8ec640993be155d3cd contrib/LWPsearch.pl SHA1 4fe62673c3d2d30fcf6ce320ed303695e5cba078 contrib/README SHA1 a74eca9ed266c3bf2280744a3c05aecaaf0c222a contrib/dot.tklkup SHA1 c1528100aa9eae5d5e98f778820e83af7c584fa2 contrib/isMember.pl SHA1 1b11ae1f3e5cde0d577988fd8936c4895e0c6096 contrib/jpegDisplay.pl SHA1 45be5e0f79345b5e55e8b1b97c25615c8b43d547 contrib/jpegLoad.pl SHA1 848646da05eed8b27cb7d498cfb421ed1a67a5c5 contrib/ldapmodify.pl SHA1 7543799f405159a69f4394c59f35617efa1478d8 contrib/ldifdiff.pl SHA1 eb6932a765ae6f1ba47f75b1919dd1335cbb82f8 contrib/ldifsort.pl SHA1 9823ffdc3c2d75d0d4af5f3c1ec60bf6e8c5e037 contrib/ldifuniq.pl SHA1 eacb3515921f5843240603f949c83e3b1c1f725e contrib/printMembers.pl SHA1 6950da15067e5b7c27bfb29158ebdbd503eb3485 contrib/recursive-ldap-delete.pl SHA1 3b6aac6e5e237307efa3506a6c8e0ca7d60208a0 contrib/schema2ad.pl SHA1 df87a8de85e4952f48325c4d8d218b7ec46ccb6b contrib/simple-proxy.pl SHA1 ba3288445bdf161914b9632f20c81c09c0800bf5 contrib/tklkup SHA1 6294227b00010f90afc17c2c6f114a0ef7610c15 data/00-cmp.ldif SHA1 1739c30b959c46cf0402447f79a555235b7992e7 data/00-cmp2.ldif SHA1 25488cd6943fc31cdce5dcc57e2ab0e71b0af6fa data/00-in.ldif SHA1 cbe464de69d6ce8cdd685a6c974cadefa30f59e4 data/05-cmp.dsml SHA1 b09b216730801f2e87ac6477209b9880d01760e2 data/40-cmp.ldif SHA1 cb80f6c7512155ef78e088c2bc646c060e6b28a6 data/40-in.ldif SHA1 75ead7bee1a193df0d85b1213ce7598b8f9ceebf data/41-in.ldif SHA1 6a9339527895ab398bc6815ef5252113d058c5b1 data/41a-cmp.ldif SHA1 c34bd74218e43344518270a127a84b147b611c54 data/41b-cmp.ldif SHA1 8255138264d063dd6d6278e71517a971ba0fd580 data/41c-cmp.ldif SHA1 bcc285bb208851e7d4af035bea125398e9c2f9e1 data/41d-cmp.ldif SHA1 e561309f55b042659970491c0f9785a6143b674f data/42-cmp.ldif SHA1 75ead7bee1a193df0d85b1213ce7598b8f9ceebf data/42-in.ldif SHA1 fdf3c652989ce5d07f776dd62e2c1126fd9c8f21 data/42-mod.ldif SHA1 788046b6d8491c50727b0403a77b3a0ed7382dc1 data/cert.pem SHA1 e60597d7c5e9d76450f56c5b1dc228dbd34d8a84 data/core.schema SHA1 6e768e1051f0b46ecd208e24b60960a2492371c3 data/cosine.schema SHA1 1d5a27e237d85c4199f1ca695586341e6b74c7e3 data/inetorgperson.schema SHA1 33947f5584a583ecd2fc87782ea6fb4b0c6fbbf4 data/key.pem SHA1 725bddda1e67a25aa2ad26bc7dcbdf1c292ec85d data/man.jpg SHA1 7897801051b6437fd96f79b1a001a31c8ebd4e6b data/openldap.schema SHA1 9cbcaaf738631b82bb02a602e91377b26f3858c0 data/openssl.cnf SHA1 a9ef9a3261b37bf32d810a879d77165512ca45c6 data/regenerate_cert.sh SHA1 7efb3a704a09e1981312fc10430959f8553f7dfc data/schema.in SHA1 948d7db5102d58a3ea2a04dd401b40e3ba082cd8 data/slapd.conf.in SHA1 a00c5f9a600aad361ac7b5a9b90b34499515cca4 data/woman.jpg SHA1 8842ca38ce27ccf75e1ce8f5dfb93fa62d933b2e inc/Module/AutoInstall.pm SHA1 1ebec4119486a032a5612a403e8d7b7be973e938 inc/Module/Install.pm SHA1 bec3c7f9af6e1a3cb4d143249956c98af30f0552 inc/Module/Install/AutoInstall.pm SHA1 24038af925a69df41972971356ccce885b0fe2ad inc/Module/Install/Base.pm SHA1 8f96eddfef548c9328457fbb17a121631cda356b inc/Module/Install/Can.pm SHA1 ec29048e48edd9c9c55f9de7b773bd7c904335ad inc/Module/Install/Fetch.pm SHA1 01862227830d2547f38275eaee0eb9f5add5a252 inc/Module/Install/Include.pm SHA1 0384525d85d51e99532e3ad8729d870113646d14 inc/Module/Install/Makefile.pm SHA1 38c657de4d91f5a60ff8e6c6f6a5547daf7c4ab2 inc/Module/Install/Metadata.pm SHA1 5c25f1104c0038041e3b93e0660c39171e4caf2b inc/Module/Install/Win32.pm SHA1 94d47349c803c4bd2a9230d25e4db0b6aaf1acd8 inc/Module/Install/WriteAll.pm SHA1 4dde3f6e30c239c15c234309b7c32dd5a7d409a9 install-nomake SHA1 ae47bafae19103063a8903d071843e4276cfbb02 lib/Bundle/Net/LDAP.pm SHA1 e3ae35cf39741a7fa85f11671b6c12cbcf8ffbd4 lib/LWP/Protocol/ldap.pm SHA1 4c0725acda3f08370b63824a62a9cca2dc52b858 lib/LWP/Protocol/ldapi.pm SHA1 1cb4c54544fda3f59b11470c3e21c8d2022b40b9 lib/LWP/Protocol/ldaps.pm SHA1 769f02810910cdd8bc3b7b356014b18d1072498b lib/Net/LDAP.pm SHA1 bba287f34fbebdf1915c645154ab3ea4bd484ab1 lib/Net/LDAP.pod SHA1 4cf74c0f17bd8bd684e1775bbc361f0eba5fd829 lib/Net/LDAP/ASN.pm SHA1 941fb60d0aade9b827cf1df3ed37c8ec9d9d70ab lib/Net/LDAP/Bind.pm SHA1 72208c59c57b8d687ca5541ed981195795105bb4 lib/Net/LDAP/Constant.pm SHA1 6c8135c8b886bf58dff0da6dfa37a7c55f0ace5a lib/Net/LDAP/Control.pm SHA1 8d9e40e9d0bb94f9b2cdb865b10c4bd7db5b96b0 lib/Net/LDAP/Control/Assertion.pm SHA1 132de095e47c3937e46e40061f4589780bb913ca lib/Net/LDAP/Control/EntryChange.pm SHA1 cd635c78479d2d9550147633e81d0a55ced85050 lib/Net/LDAP/Control/ManageDsaIT.pm SHA1 dec36f3e05b369725ba4c10ee41924a5742c68e9 lib/Net/LDAP/Control/MatchedValues.pm SHA1 4ef5d292b78bc8fbdd83501fc1247da1e8820a61 lib/Net/LDAP/Control/Paged.pm SHA1 5def1a80ac4f2d4d54a7e58eeaabc709809ba056 lib/Net/LDAP/Control/PasswordPolicy.pm SHA1 7c35ec08c53f6d91696e96d8a8dad24131f34f23 lib/Net/LDAP/Control/PersistentSearch.pm SHA1 66b21ddd57d5d609510bc1bc1f5e65c1c3ddb6b2 lib/Net/LDAP/Control/PostRead.pm SHA1 f4344e69b392a0aed91b77cfe478bc3b58b9ae36 lib/Net/LDAP/Control/PreRead.pm SHA1 c440e1cf6334da809e038f3c03377ae199a1c1f8 lib/Net/LDAP/Control/ProxyAuth.pm SHA1 d192ab5e04c2ca9aa56af0920c9006ee84cb86e9 lib/Net/LDAP/Control/Relax.pm SHA1 1a7e82c52c01348a3b7b6c8e5e573832506e59e3 lib/Net/LDAP/Control/Sort.pm SHA1 cfba44f46dfd51d479f63c1c258f90788dd32b6b lib/Net/LDAP/Control/SortResult.pm SHA1 89f0666fdfbb1ca6a511dcaf7b33bfa91876b81e lib/Net/LDAP/Control/SyncDone.pm SHA1 bc7cfcc6ecaeac461142335b7a67826e99fe332c lib/Net/LDAP/Control/SyncRequest.pm SHA1 4e3b116d79176b0fb2a2be3b04a5afff32763552 lib/Net/LDAP/Control/SyncState.pm SHA1 15b15d592c41098431679c42d1795a717e5b1414 lib/Net/LDAP/Control/VLV.pm SHA1 a895fb1e2a244c3adb312e9efb1ee40b89dabe58 lib/Net/LDAP/Control/VLVResponse.pm SHA1 684fac988baf21bce4323fa97577f07f9ad095ba lib/Net/LDAP/DSML.pm SHA1 c0076ece64d05984c24b5e4ab652bc09aa751bab lib/Net/LDAP/Entry.pm SHA1 28fd0ab9cc3ccac1d3e568a9d75804e1b31144ea lib/Net/LDAP/Entry.pod SHA1 2a20c984e7ff49a53a95d2233374ba18a446e5dc lib/Net/LDAP/Examples.pod SHA1 0195e6ab43507bceb5fe0797c751e85f9cbf4fbf lib/Net/LDAP/Extension.pm SHA1 94a97cdb53a2437d8fca5805f679626ea66e9cf6 lib/Net/LDAP/Extension/Cancel.pm SHA1 912baab0794cb65538b91fb02cabd6fc95c3fc18 lib/Net/LDAP/Extension/Refresh.pm SHA1 a6db215b5ead03fd9981f0cc5402e5cba0a695ce lib/Net/LDAP/Extension/SetPassword.pm SHA1 9a6ba9fc53dcb41f216f277b3b89fbbbf29417c8 lib/Net/LDAP/Extension/WhoAmI.pm SHA1 f8a69d8a6c086fdf38c12a72816bcd3d624ac261 lib/Net/LDAP/Extra.pm SHA1 21863d25b0bff03ef279e10efe707539c7cd448c lib/Net/LDAP/Extra/AD.pm SHA1 e8f760369f662f5b36cb1812282fb657f026bb18 lib/Net/LDAP/Extra/eDirectory.pm SHA1 d8300b672ec5ca1023ec157998bdd6009e875a5e lib/Net/LDAP/FAQ.pod SHA1 37174a971d6ffa5283b508f3c8fc657c624558c9 lib/Net/LDAP/Filter.pm SHA1 0209a4d3c52a6cb2330a15fc9db2a6d686f42c0e lib/Net/LDAP/Filter.pod SHA1 5bf16183794a235f2b7929ce350fe9032a8a1636 lib/Net/LDAP/FilterMatch.pm SHA1 a1ae96a07309aeb49f0025a536d9074ae55b43c1 lib/Net/LDAP/Intermediate.pm SHA1 4a2cbf16a0436782db19f126d587c17799823714 lib/Net/LDAP/Intermediate/SyncInfo.pm SHA1 e18033b45f28fae9777638cf463e1cbaa90ec74a lib/Net/LDAP/LDIF.pm SHA1 f4c6fa55228cab320d79db6732edebadc176a420 lib/Net/LDAP/LDIF.pod SHA1 70255d10236d45ee645be63f51257f283af4db67 lib/Net/LDAP/Message.pm SHA1 6a8b2d30a43d6295de37771c2576cb66c7f10bfd lib/Net/LDAP/Message.pod SHA1 76961fd1aa4b78c8c7ad6f9638c2cf0a3aefb281 lib/Net/LDAP/RFC.pod SHA1 4921a9eb85f595aaa4c5c2bf7261feae54440763 lib/Net/LDAP/Reference.pod SHA1 f8e82f88b6d0160d57730f7a38845060cdfb9e8a lib/Net/LDAP/RootDSE.pm SHA1 04658b75b38c5c90e33c4dbff16d5daa94782cdd lib/Net/LDAP/Schema.pm SHA1 e3af23701aa0c14b21cc85e8fd9f50337ef908d1 lib/Net/LDAP/Schema.pod SHA1 1835813ea3a15daadd224a70bdc6d99afc2f37ed lib/Net/LDAP/Search.pm SHA1 7c982f3ea575be892eabe7a4bdbc83fa3d341530 lib/Net/LDAP/Search.pod SHA1 4b26cf51ff535d6e5bda888dded5962d59a7ce4a lib/Net/LDAP/Security.pod SHA1 9ed1928343dd69152520cd50409818ba55375955 lib/Net/LDAP/Util.pm SHA1 b69e822e4f2a2e6bf1f1a46febd64c38581f6b7d lib/Net/LDAPI.pm SHA1 e53f9b7b96c9a31d9a5a83309301c4a0b6b7400c lib/Net/LDAPS.pm SHA1 597ef9192f4a32a125393baa8afea48b17d88166 t/00ldif-entry.t SHA1 f38c4d5745741f309e19cd37403e89ab8ebc9813 t/01canon_dn.t SHA1 f273242b84a55fd1b5650cfcb1b0fe5f6585bf19 t/02filter.t SHA1 597ad626d087446f18a971c89e4597abd48acc3c t/03schema.t SHA1 a37b37639de26666dc11a16492a86f82b620a34d t/04refloop.t SHA1 55afdcc98524242dc92abb13e1c651dffa3efef6 t/05dsml.t SHA1 3af9d72c25bb5092d2a6779cf086eb82bd5244f3 t/06constant.t SHA1 4304acd9b08ecdeb0d7ba40f429f39df3670d670 t/07filtermatch.t SHA1 2d7028cb0e5b6c0012855f922a0e9116e5bed30b t/40connect.t SHA1 475e5cea559d71ad95e9b170faa82b4bc9f4eeb1 t/41populate.t SHA1 b555a519acb877d5d0192de19aa728f94b0256bb t/42search.t SHA1 a667c625b689452cc243256a2090e4093853cda8 t/43modify.t SHA1 faef92140a58ce04112691aa852f6668bbcdee80 t/44schema.t SHA1 5309f8f50504dd547e103c8b481456506bafef61 t/45dse.t SHA1 f34b6a3a7b20a76ca112a7c990bdfd2539e82c51 t/46ssl.t SHA1 a215528c8720051c3618f13b438bd0fe7c7f66a7 t/47ipc.t SHA1 59209bd86fdc61e75eb56e4562c273fdc8417144 t/48url.t SHA1 21223e1cdc91f16e3e11f21a7ffda8da54102599 t/49lwp.t SHA1 ed31642a61c9e8eabdc5512dca26fc03d093db0a t/60cancel.t SHA1 7937fb8aa1eac68e8bb80e45e2513edcd2c19b22 t/70sortctrl.t SHA1 804d275b50505b33bbdd604ac82699ef49358923 t/71preread.t SHA1 243db5ee07aac845c98edcd5cfcca9f29c4a9863 t/72postread.t SHA1 c18ddb5404354a7da445d65efe85a9129abff6ac t/73assert.t SHA1 e0370c941f4e8d54f1dc309256341d70c5952082 t/74matchedvalues.t SHA1 1632a66cb14d4d3fb446a36bd9098b42616ce19a t/common.pl SHA1 ea5c5379848a59de0912fbb9f65ae2e86b735b6e test.cfg -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.15 (GNU/Linux) iQEcBAEBCAAGBQJSuGh4AAoJEEp47DaHHvaSo+UH/jHHBVndhYsm5QurfIisdELZ rCv3Mei/eY8xE2i4eJSLIlvP9PZew1sm19Gn+sPUF7Ut4iJpyDTUkNfBvLMTYwy0 o+qXnGPc8u8XC4C56eTlZrS4HwnnjCoCO5mFMBKJspRXKetvw3LML0fGLzcehLwE gsFEwjPap2HaVNtkGpagTcr1Wn4RjIfz8yJ5s9w9hW6bJip51yCGV0zsm6rUSbg5 Z6IBea7kAqqsColK76+ABsQNR5WtPSsNDs15uo0t+XSz9shxWVXBo1MD89xo1mOD j6kS2bVxWSfsLUZ2fMhJMV5jxz42XhMIRjx28n/q3SnPZgd+5p+rUWUlkzd3JFs= =wtUl -----END PGP SIGNATURE----- perl-ldap-0.58/inc/0002755000175000000620000000000012256064226013564 5ustar marschapstaffperl-ldap-0.58/inc/Module/0002755000175000000620000000000012256064226015011 5ustar marschapstaffperl-ldap-0.58/inc/Module/Install/0002755000175000000620000000000012256064226016417 5ustar marschapstaffperl-ldap-0.58/inc/Module/Install/Can.pm0000644000175000000620000000333312173014262017447 0ustar marschapstaff#line 1 package Module::Install::Can; use strict; use Config (); use File::Spec (); use ExtUtils::MakeMaker (); use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '0.95'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } # check if we can load some module ### Upgrade this to not have to load the module if possible sub can_use { my ($self, $mod, $ver) = @_; $mod =~ s{::|\\}{/}g; $mod .= '.pm' unless $mod =~ /\.pm$/i; my $pkg = $mod; $pkg =~ s{/}{::}g; $pkg =~ s{\.pm$}{}i; local $@; eval { require $mod; $pkg->VERSION($ver || 0); 1 }; } # check if we can run some command sub can_run { my ($self, $cmd) = @_; my $_cmd = $cmd; return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd)); for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') { next if $dir eq ''; my $abs = File::Spec->catfile($dir, $_[1]); return $abs if (-x $abs or $abs = MM->maybe_command($abs)); } return; } # can we locate a (the) C compiler sub can_cc { my $self = shift; my @chunks = split(/ /, $Config::Config{cc}) or return; # $Config{cc} may contain args; try to find out the program part while (@chunks) { return $self->can_run("@chunks") || (pop(@chunks), next); } return; } # Fix Cygwin bug on maybe_command(); if ( $^O eq 'cygwin' ) { require ExtUtils::MM_Cygwin; require ExtUtils::MM_Win32; if ( ! defined(&ExtUtils::MM_Cygwin::maybe_command) ) { *ExtUtils::MM_Cygwin::maybe_command = sub { my ($self, $file) = @_; if ($file =~ m{^/cygdrive/}i and ExtUtils::MM_Win32->can('maybe_command')) { ExtUtils::MM_Win32->maybe_command($file); } else { ExtUtils::MM_Unix->maybe_command($file); } } } } 1; __END__ #line 156 perl-ldap-0.58/inc/Module/Install/Fetch.pm0000644000175000000620000000462712173014262020006 0ustar marschapstaff#line 1 package Module::Install::Fetch; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '0.95'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub get_file { my ($self, %args) = @_; my ($scheme, $host, $path, $file) = $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; if ( $scheme eq 'http' and ! eval { require LWP::Simple; 1 } ) { $args{url} = $args{ftp_url} or (warn("LWP support unavailable!\n"), return); ($scheme, $host, $path, $file) = $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; } $|++; print "Fetching '$file' from $host... "; unless (eval { require Socket; Socket::inet_aton($host) }) { warn "'$host' resolve failed!\n"; return; } return unless $scheme eq 'ftp' or $scheme eq 'http'; require Cwd; my $dir = Cwd::getcwd(); chdir $args{local_dir} or return if exists $args{local_dir}; if (eval { require LWP::Simple; 1 }) { LWP::Simple::mirror($args{url}, $file); } elsif (eval { require Net::FTP; 1 }) { eval { # use Net::FTP to get past firewall my $ftp = Net::FTP->new($host, Passive => 1, Timeout => 600); $ftp->login("anonymous", 'anonymous@example.com'); $ftp->cwd($path); $ftp->binary; $ftp->get($file) or (warn("$!\n"), return); $ftp->quit; } } elsif (my $ftp = $self->can_run('ftp')) { eval { # no Net::FTP, fallback to ftp.exe require FileHandle; my $fh = FileHandle->new; local $SIG{CHLD} = 'IGNORE'; unless ($fh->open("|$ftp -n")) { warn "Couldn't open ftp: $!\n"; chdir $dir; return; } my @dialog = split(/\n/, <<"END_FTP"); open $host user anonymous anonymous\@example.com cd $path binary get $file $file quit END_FTP foreach (@dialog) { $fh->print("$_\n") } $fh->close; } } else { warn "No working 'ftp' program available!\n"; chdir $dir; return; } unless (-f $file) { warn "Fetching failed: $@\n"; chdir $dir; return; } return if exists $args{size} and -s $file != $args{size}; system($args{run}) if exists $args{run}; unlink($file) if $args{remove}; print(((!exists $args{check_for} or -e $args{check_for}) ? "done!" : "failed! ($!)"), "\n"); chdir $dir; return !$?; } 1; perl-ldap-0.58/inc/Module/Install/Makefile.pm0000644000175000000620000002622012173014262020463 0ustar marschapstaff#line 1 package Module::Install::Makefile; use strict 'vars'; use ExtUtils::MakeMaker (); use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '0.95'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub Makefile { $_[0] } my %seen = (); sub prompt { shift; # Infinite loop protection my @c = caller(); if ( ++$seen{"$c[1]|$c[2]|$_[0]"} > 3 ) { die "Caught an potential prompt infinite loop ($c[1]|$c[2]|$_[0])"; } # In automated testing or non-interactive session, always use defaults if ( ($ENV{AUTOMATED_TESTING} or -! -t STDIN) and ! $ENV{PERL_MM_USE_DEFAULT} ) { local $ENV{PERL_MM_USE_DEFAULT} = 1; goto &ExtUtils::MakeMaker::prompt; } else { goto &ExtUtils::MakeMaker::prompt; } } # Store a cleaned up version of the MakeMaker version, # since we need to behave differently in a variety of # ways based on the MM version. my $makemaker = eval $ExtUtils::MakeMaker::VERSION; # If we are passed a param, do a "newer than" comparison. # Otherwise, just return the MakeMaker version. sub makemaker { ( @_ < 2 or $makemaker >= eval($_[1]) ) ? $makemaker : 0 } # Ripped from ExtUtils::MakeMaker 6.56, and slightly modified # as we only need to know here whether the attribute is an array # or a hash or something else (which may or may not be appendable). my %makemaker_argtype = ( C => 'ARRAY', CONFIG => 'ARRAY', # CONFIGURE => 'CODE', # ignore DIR => 'ARRAY', DL_FUNCS => 'HASH', DL_VARS => 'ARRAY', EXCLUDE_EXT => 'ARRAY', EXE_FILES => 'ARRAY', FUNCLIST => 'ARRAY', H => 'ARRAY', IMPORTS => 'HASH', INCLUDE_EXT => 'ARRAY', LIBS => 'ARRAY', # ignore '' MAN1PODS => 'HASH', MAN3PODS => 'HASH', META_ADD => 'HASH', META_MERGE => 'HASH', PL_FILES => 'HASH', PM => 'HASH', PMLIBDIRS => 'ARRAY', PMLIBPARENTDIRS => 'ARRAY', PREREQ_PM => 'HASH', CONFIGURE_REQUIRES => 'HASH', SKIP => 'ARRAY', TYPEMAPS => 'ARRAY', XS => 'HASH', # VERSION => ['version',''], # ignore # _KEEP_AFTER_FLUSH => '', clean => 'HASH', depend => 'HASH', dist => 'HASH', dynamic_lib=> 'HASH', linkext => 'HASH', macro => 'HASH', postamble => 'HASH', realclean => 'HASH', test => 'HASH', tool_autosplit => 'HASH', # special cases where you can use makemaker_append CCFLAGS => 'APPENDABLE', DEFINE => 'APPENDABLE', INC => 'APPENDABLE', LDDLFLAGS => 'APPENDABLE', LDFROM => 'APPENDABLE', ); sub makemaker_args { my ($self, %new_args) = @_; my $args = ( $self->{makemaker_args} ||= {} ); foreach my $key (keys %new_args) { if ($makemaker_argtype{$key} eq 'ARRAY') { $args->{$key} = [] unless defined $args->{$key}; unless (ref $args->{$key} eq 'ARRAY') { $args->{$key} = [$args->{$key}] } push @{$args->{$key}}, ref $new_args{$key} eq 'ARRAY' ? @{$new_args{$key}} : $new_args{$key}; } elsif ($makemaker_argtype{$key} eq 'HASH') { $args->{$key} = {} unless defined $args->{$key}; foreach my $skey (keys %{ $new_args{$key} }) { $args->{$key}{$skey} = $new_args{$key}{$skey}; } } elsif ($makemaker_argtype{$key} eq 'APPENDABLE') { $self->makemaker_append($key => $new_args{$key}); } else { if (defined $args->{$key}) { warn qq{MakeMaker attribute "$key" is overriden; use "makemaker_append" to append values\n}; } $args->{$key} = $new_args{$key}; } } return $args; } # For mm args that take multiple space-seperated args, # append an argument to the current list. sub makemaker_append { my $self = shift; my $name = shift; my $args = $self->makemaker_args; $args->{$name} = defined $args->{$name} ? join( ' ', $args->{$name}, @_ ) : join( ' ', @_ ); } sub build_subdirs { my $self = shift; my $subdirs = $self->makemaker_args->{DIR} ||= []; for my $subdir (@_) { push @$subdirs, $subdir; } } sub clean_files { my $self = shift; my $clean = $self->makemaker_args->{clean} ||= {}; %$clean = ( %$clean, FILES => join ' ', grep { length $_ } ($clean->{FILES} || (), @_), ); } sub realclean_files { my $self = shift; my $realclean = $self->makemaker_args->{realclean} ||= {}; %$realclean = ( %$realclean, FILES => join ' ', grep { length $_ } ($realclean->{FILES} || (), @_), ); } sub libs { my $self = shift; my $libs = ref $_[0] ? shift : [ shift ]; $self->makemaker_args( LIBS => $libs ); } sub inc { my $self = shift; $self->makemaker_args( INC => shift ); } my %test_dir = (); sub _wanted_t { /\.t$/ and -f $_ and $test_dir{$File::Find::dir} = 1; } sub tests_recursive { my $self = shift; if ( $self->tests ) { die "tests_recursive will not work if tests are already defined"; } my $dir = shift || 't'; unless ( -d $dir ) { die "tests_recursive dir '$dir' does not exist"; } %test_dir = (); require File::Find; File::Find::find( \&_wanted_t, $dir ); if ( -d 'xt' and ($Module::Install::AUTHOR or $ENV{RELEASE_TESTING}) ) { File::Find::find( \&_wanted_t, 'xt' ); } $self->tests( join ' ', map { "$_/*.t" } sort keys %test_dir ); } sub write { my $self = shift; die "&Makefile->write() takes no arguments\n" if @_; # Check the current Perl version my $perl_version = $self->perl_version; if ( $perl_version ) { eval "use $perl_version; 1" or die "ERROR: perl: Version $] is installed, " . "but we need version >= $perl_version"; } # Make sure we have a new enough MakeMaker require ExtUtils::MakeMaker; if ( $perl_version and $self->_cmp($perl_version, '5.006') >= 0 ) { # MakeMaker can complain about module versions that include # an underscore, even though its own version may contain one! # Hence the funny regexp to get rid of it. See RT #35800 # for details. my $v = $ExtUtils::MakeMaker::VERSION =~ /^(\d+\.\d+)/; $self->build_requires( 'ExtUtils::MakeMaker' => $v ); $self->configure_requires( 'ExtUtils::MakeMaker' => $v ); } else { # Allow legacy-compatibility with 5.005 by depending on the # most recent EU:MM that supported 5.005. $self->build_requires( 'ExtUtils::MakeMaker' => 6.42 ); $self->configure_requires( 'ExtUtils::MakeMaker' => 6.42 ); } # Generate the MakeMaker params my $args = $self->makemaker_args; $args->{DISTNAME} = $self->name; $args->{NAME} = $self->module_name || $self->name; $args->{NAME} =~ s/-/::/g; $args->{VERSION} = $self->version or die <<'EOT'; ERROR: Can't determine distribution version. Please specify it explicitly via 'version' in Makefile.PL, or set a valid $VERSION in a module, and provide its file path via 'version_from' (or 'all_from' if you prefer) in Makefile.PL. EOT $DB::single = 1; if ( $self->tests ) { my @tests = split ' ', $self->tests; my %seen; $args->{test} = { TESTS => (join ' ', grep {!$seen{$_}++} @tests), }; } elsif ( -d 'xt' and ($Module::Install::AUTHOR or $ENV{RELEASE_TESTING}) ) { $args->{test} = { TESTS => join( ' ', map { "$_/*.t" } grep { -d $_ } qw{ t xt } ), }; } if ( $] >= 5.005 ) { $args->{ABSTRACT} = $self->abstract; $args->{AUTHOR} = join ', ', @{$self->author || []}; } if ( $self->makemaker(6.10) ) { $args->{NO_META} = 1; #$args->{NO_MYMETA} = 1; } if ( $self->makemaker(6.17) and $self->sign ) { $args->{SIGN} = 1; } unless ( $self->is_admin ) { delete $args->{SIGN}; } if ( $self->makemaker(6.31) and $self->license ) { $args->{LICENSE} = $self->license; } my $prereq = ($args->{PREREQ_PM} ||= {}); %$prereq = ( %$prereq, map { @$_ } # flatten [module => version] map { @$_ } grep $_, ($self->requires) ); # Remove any reference to perl, PREREQ_PM doesn't support it delete $args->{PREREQ_PM}->{perl}; # Merge both kinds of requires into BUILD_REQUIRES my $build_prereq = ($args->{BUILD_REQUIRES} ||= {}); %$build_prereq = ( %$build_prereq, map { @$_ } # flatten [module => version] map { @$_ } grep $_, ($self->configure_requires, $self->build_requires) ); # Remove any reference to perl, BUILD_REQUIRES doesn't support it delete $args->{BUILD_REQUIRES}->{perl}; # Delete bundled dists from prereq_pm my $subdirs = ($args->{DIR} ||= []); if ($self->bundles) { foreach my $bundle (@{ $self->bundles }) { my ($file, $dir) = @$bundle; push @$subdirs, $dir if -d $dir; delete $build_prereq->{$file}; #Delete from build prereqs only } } unless ( $self->makemaker('6.55_03') ) { %$prereq = (%$prereq,%$build_prereq); delete $args->{BUILD_REQUIRES}; } if ( my $perl_version = $self->perl_version ) { eval "use $perl_version; 1" or die "ERROR: perl: Version $] is installed, " . "but we need version >= $perl_version"; if ( $self->makemaker(6.48) ) { $args->{MIN_PERL_VERSION} = $perl_version; } } if ($self->installdirs) { warn qq{old INSTALLDIRS (probably set by makemaker_args) is overriden by installdirs\n} if $args->{INSTALLDIRS}; $args->{INSTALLDIRS} = $self->installdirs; } my %args = map { ( $_ => $args->{$_} ) } grep {defined($args->{$_} ) } keys %$args; my $user_preop = delete $args{dist}->{PREOP}; if ( my $preop = $self->admin->preop($user_preop) ) { foreach my $key ( keys %$preop ) { $args{dist}->{$key} = $preop->{$key}; } } my $mm = ExtUtils::MakeMaker::WriteMakefile(%args); $self->fix_up_makefile($mm->{FIRST_MAKEFILE} || 'Makefile'); } sub fix_up_makefile { my $self = shift; my $makefile_name = shift; my $top_class = ref($self->_top) || ''; my $top_version = $self->_top->VERSION || ''; my $preamble = $self->preamble ? "# Preamble by $top_class $top_version\n" . $self->preamble : ''; my $postamble = "# Postamble by $top_class $top_version\n" . ($self->postamble || ''); local *MAKEFILE; open MAKEFILE, "< $makefile_name" or die "fix_up_makefile: Couldn't open $makefile_name: $!"; my $makefile = do { local $/; }; close MAKEFILE or die $!; $makefile =~ s/\b(test_harness\(\$\(TEST_VERBOSE\), )/$1'inc', /; $makefile =~ s/( -I\$\(INST_ARCHLIB\))/ -Iinc$1/g; $makefile =~ s/( "-I\$\(INST_LIB\)")/ "-Iinc"$1/g; $makefile =~ s/^(FULLPERL = .*)/$1 "-Iinc"/m; $makefile =~ s/^(PERL = .*)/$1 "-Iinc"/m; # Module::Install will never be used to build the Core Perl # Sometimes PERL_LIB and PERL_ARCHLIB get written anyway, which breaks # PREFIX/PERL5LIB, and thus, install_share. Blank them if they exist $makefile =~ s/^PERL_LIB = .+/PERL_LIB =/m; #$makefile =~ s/^PERL_ARCHLIB = .+/PERL_ARCHLIB =/m; # Perl 5.005 mentions PERL_LIB explicitly, so we have to remove that as well. $makefile =~ s/(\"?)-I\$\(PERL_LIB\)\1//g; # XXX - This is currently unused; not sure if it breaks other MM-users # $makefile =~ s/^pm_to_blib\s+:\s+/pm_to_blib :: /mg; open MAKEFILE, "> $makefile_name" or die "fix_up_makefile: Couldn't open $makefile_name: $!"; print MAKEFILE "$preamble$makefile$postamble" or die $!; close MAKEFILE or die $!; 1; } sub preamble { my ($self, $text) = @_; $self->{preamble} = $text . $self->{preamble} if defined $text; $self->{preamble}; } sub postamble { my ($self, $text) = @_; $self->{postamble} ||= $self->admin->postamble; $self->{postamble} .= $text if defined $text; $self->{postamble} } 1; __END__ #line 531 perl-ldap-0.58/inc/Module/Install/Metadata.pm0000644000175000000620000004100012173014262020457 0ustar marschapstaff#line 1 package Module::Install::Metadata; use strict 'vars'; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '0.95'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } my @boolean_keys = qw{ sign }; my @scalar_keys = qw{ name module_name abstract version distribution_type tests installdirs }; my @tuple_keys = qw{ configure_requires build_requires requires recommends bundles resources }; my @resource_keys = qw{ homepage bugtracker repository }; my @array_keys = qw{ keywords author }; *authors = \&author; sub Meta { shift } sub Meta_BooleanKeys { @boolean_keys } sub Meta_ScalarKeys { @scalar_keys } sub Meta_TupleKeys { @tuple_keys } sub Meta_ResourceKeys { @resource_keys } sub Meta_ArrayKeys { @array_keys } foreach my $key ( @boolean_keys ) { *$key = sub { my $self = shift; if ( defined wantarray and not @_ ) { return $self->{values}->{$key}; } $self->{values}->{$key} = ( @_ ? $_[0] : 1 ); return $self; }; } foreach my $key ( @scalar_keys ) { *$key = sub { my $self = shift; return $self->{values}->{$key} if defined wantarray and !@_; $self->{values}->{$key} = shift; return $self; }; } foreach my $key ( @array_keys ) { *$key = sub { my $self = shift; return $self->{values}->{$key} if defined wantarray and !@_; $self->{values}->{$key} ||= []; push @{$self->{values}->{$key}}, @_; return $self; }; } foreach my $key ( @resource_keys ) { *$key = sub { my $self = shift; unless ( @_ ) { return () unless $self->{values}->{resources}; return map { $_->[1] } grep { $_->[0] eq $key } @{ $self->{values}->{resources} }; } return $self->{values}->{resources}->{$key} unless @_; my $uri = shift or die( "Did not provide a value to $key()" ); $self->resources( $key => $uri ); return 1; }; } foreach my $key ( grep { $_ ne "resources" } @tuple_keys) { *$key = sub { my $self = shift; return $self->{values}->{$key} unless @_; my @added; while ( @_ ) { my $module = shift or last; my $version = shift || 0; push @added, [ $module, $version ]; } push @{ $self->{values}->{$key} }, @added; return map {@$_} @added; }; } # Resource handling my %lc_resource = map { $_ => 1 } qw{ homepage license bugtracker repository }; sub resources { my $self = shift; while ( @_ ) { my $name = shift or last; my $value = shift or next; if ( $name eq lc $name and ! $lc_resource{$name} ) { die("Unsupported reserved lowercase resource '$name'"); } $self->{values}->{resources} ||= []; push @{ $self->{values}->{resources} }, [ $name, $value ]; } $self->{values}->{resources}; } # Aliases for build_requires that will have alternative # meanings in some future version of META.yml. sub test_requires { shift->build_requires(@_) } sub install_requires { shift->build_requires(@_) } # Aliases for installdirs options sub install_as_core { $_[0]->installdirs('perl') } sub install_as_cpan { $_[0]->installdirs('site') } sub install_as_site { $_[0]->installdirs('site') } sub install_as_vendor { $_[0]->installdirs('vendor') } sub dynamic_config { my $self = shift; unless ( @_ ) { warn "You MUST provide an explicit true/false value to dynamic_config\n"; return $self; } $self->{values}->{dynamic_config} = $_[0] ? 1 : 0; return 1; } sub perl_version { my $self = shift; return $self->{values}->{perl_version} unless @_; my $version = shift or die( "Did not provide a value to perl_version()" ); # Normalize the version $version = $self->_perl_version($version); # We don't support the reall old versions unless ( $version >= 5.005 ) { die "Module::Install only supports 5.005 or newer (use ExtUtils::MakeMaker)\n"; } $self->{values}->{perl_version} = $version; } #Stolen from M::B my %license_urls = ( perl => 'http://dev.perl.org/licenses/', apache => 'http://apache.org/licenses/LICENSE-2.0', artistic => 'http://opensource.org/licenses/artistic-license.php', artistic_2 => 'http://opensource.org/licenses/artistic-license-2.0.php', lgpl => 'http://opensource.org/licenses/lgpl-license.php', lgpl2 => 'http://opensource.org/licenses/lgpl-2.1.php', lgpl3 => 'http://opensource.org/licenses/lgpl-3.0.html', bsd => 'http://opensource.org/licenses/bsd-license.php', gpl => 'http://opensource.org/licenses/gpl-license.php', gpl2 => 'http://opensource.org/licenses/gpl-2.0.php', gpl3 => 'http://opensource.org/licenses/gpl-3.0.html', mit => 'http://opensource.org/licenses/mit-license.php', mozilla => 'http://opensource.org/licenses/mozilla1.1.php', open_source => undef, unrestricted => undef, restrictive => undef, unknown => undef, ); sub license { my $self = shift; return $self->{values}->{license} unless @_; my $license = shift or die( 'Did not provide a value to license()' ); $self->{values}->{license} = $license; # Automatically fill in license URLs if ( $license_urls{$license} ) { $self->resources( license => $license_urls{$license} ); } return 1; } sub all_from { my ( $self, $file ) = @_; unless ( defined($file) ) { my $name = $self->name or die( "all_from called with no args without setting name() first" ); $file = join('/', 'lib', split(/-/, $name)) . '.pm'; $file =~ s{.*/}{} unless -e $file; unless ( -e $file ) { die("all_from cannot find $file from $name"); } } unless ( -f $file ) { die("The path '$file' does not exist, or is not a file"); } $self->{values}{all_from} = $file; # Some methods pull from POD instead of code. # If there is a matching .pod, use that instead my $pod = $file; $pod =~ s/\.pm$/.pod/i; $pod = $file unless -e $pod; # Pull the different values $self->name_from($file) unless $self->name; $self->version_from($file) unless $self->version; $self->perl_version_from($file) unless $self->perl_version; $self->author_from($pod) unless @{$self->author || []}; $self->license_from($pod) unless $self->license; $self->abstract_from($pod) unless $self->abstract; return 1; } sub provides { my $self = shift; my $provides = ( $self->{values}->{provides} ||= {} ); %$provides = (%$provides, @_) if @_; return $provides; } sub auto_provides { my $self = shift; return $self unless $self->is_admin; unless (-e 'MANIFEST') { warn "Cannot deduce auto_provides without a MANIFEST, skipping\n"; return $self; } # Avoid spurious warnings as we are not checking manifest here. local $SIG{__WARN__} = sub {1}; require ExtUtils::Manifest; local *ExtUtils::Manifest::manicheck = sub { return }; require Module::Build; my $build = Module::Build->new( dist_name => $self->name, dist_version => $self->version, license => $self->license, ); $self->provides( %{ $build->find_dist_packages || {} } ); } sub feature { my $self = shift; my $name = shift; my $features = ( $self->{values}->{features} ||= [] ); my $mods; if ( @_ == 1 and ref( $_[0] ) ) { # The user used ->feature like ->features by passing in the second # argument as a reference. Accomodate for that. $mods = $_[0]; } else { $mods = \@_; } my $count = 0; push @$features, ( $name => [ map { ref($_) ? ( ref($_) eq 'HASH' ) ? %$_ : @$_ : $_ } @$mods ] ); return @$features; } sub features { my $self = shift; while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) { $self->feature( $name, @$mods ); } return $self->{values}->{features} ? @{ $self->{values}->{features} } : (); } sub no_index { my $self = shift; my $type = shift; push @{ $self->{values}->{no_index}->{$type} }, @_ if $type; return $self->{values}->{no_index}; } sub read { my $self = shift; $self->include_deps( 'YAML::Tiny', 0 ); require YAML::Tiny; my $data = YAML::Tiny::LoadFile('META.yml'); # Call methods explicitly in case user has already set some values. while ( my ( $key, $value ) = each %$data ) { next unless $self->can($key); if ( ref $value eq 'HASH' ) { while ( my ( $module, $version ) = each %$value ) { $self->can($key)->($self, $module => $version ); } } else { $self->can($key)->($self, $value); } } return $self; } sub write { my $self = shift; return $self unless $self->is_admin; $self->admin->write_meta; return $self; } sub version_from { require ExtUtils::MM_Unix; my ( $self, $file ) = @_; $self->version( ExtUtils::MM_Unix->parse_version($file) ); } sub abstract_from { require ExtUtils::MM_Unix; my ( $self, $file ) = @_; $self->abstract( bless( { DISTNAME => $self->name }, 'ExtUtils::MM_Unix' )->parse_abstract($file) ); } # Add both distribution and module name sub name_from { my ($self, $file) = @_; if ( Module::Install::_read($file) =~ m/ ^ \s* package \s* ([\w:]+) \s* ; /ixms ) { my ($name, $module_name) = ($1, $1); $name =~ s{::}{-}g; $self->name($name); unless ( $self->module_name ) { $self->module_name($module_name); } } else { die("Cannot determine name from $file\n"); } } sub _extract_perl_version { if ( $_[0] =~ m/ ^\s* (?:use|require) \s* v? ([\d_\.]+) \s* ; /ixms ) { my $perl_version = $1; $perl_version =~ s{_}{}g; return $perl_version; } else { return; } } sub perl_version_from { my $self = shift; my $perl_version=_extract_perl_version(Module::Install::_read($_[0])); if ($perl_version) { $self->perl_version($perl_version); } else { warn "Cannot determine perl version info from $_[0]\n"; return; } } sub author_from { my $self = shift; my $content = Module::Install::_read($_[0]); if ($content =~ m/ =head \d \s+ (?:authors?)\b \s* ([^\n]*) | =head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s* .*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s* ([^\n]*) /ixms) { my $author = $1 || $2; # XXX: ugly but should work anyway... if (eval "require Pod::Escapes; 1") { # Pod::Escapes has a mapping table. # It's in core of perl >= 5.9.3, and should be installed # as one of the Pod::Simple's prereqs, which is a prereq # of Pod::Text 3.x (see also below). $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } { defined $2 ? chr($2) : defined $Pod::Escapes::Name2character_number{$1} ? chr($Pod::Escapes::Name2character_number{$1}) : do { warn "Unknown escape: E<$1>"; "E<$1>"; }; }gex; } elsif (eval "require Pod::Text; 1" && $Pod::Text::VERSION < 3) { # Pod::Text < 3.0 has yet another mapping table, # though the table name of 2.x and 1.x are different. # (1.x is in core of Perl < 5.6, 2.x is in core of # Perl < 5.9.3) my $mapping = ($Pod::Text::VERSION < 2) ? \%Pod::Text::HTML_Escapes : \%Pod::Text::ESCAPES; $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } { defined $2 ? chr($2) : defined $mapping->{$1} ? $mapping->{$1} : do { warn "Unknown escape: E<$1>"; "E<$1>"; }; }gex; } else { $author =~ s{E}{<}g; $author =~ s{E}{>}g; } $self->author($author); } else { warn "Cannot determine author info from $_[0]\n"; } } sub _extract_license { my $pod = shift; my $matched; return __extract_license( ($matched) = $pod =~ m/ (=head \d \s+ (?:licen[cs]e|licensing)\b.*?) (=head \d.*|=cut.*|)\z /ixms ) || __extract_license( ($matched) = $pod =~ m/ (=head \d \s+ (?:copyrights?|legal)\b.*?) (=head \d.*|=cut.*|)\z /ixms ); } sub __extract_license { my $license_text = shift or return; my @phrases = ( 'under the same (?:terms|license) as (?:perl|the perl programming language)' => 'perl', 1, 'under the terms of (?:perl|the perl programming language) itself' => 'perl', 1, 'Artistic and GPL' => 'perl', 1, 'GNU general public license' => 'gpl', 1, 'GNU public license' => 'gpl', 1, 'GNU lesser general public license' => 'lgpl', 1, 'GNU lesser public license' => 'lgpl', 1, 'GNU library general public license' => 'lgpl', 1, 'GNU library public license' => 'lgpl', 1, 'BSD license' => 'bsd', 1, 'Artistic license' => 'artistic', 1, 'GPL' => 'gpl', 1, 'LGPL' => 'lgpl', 1, 'BSD' => 'bsd', 1, 'Artistic' => 'artistic', 1, 'MIT' => 'mit', 1, 'proprietary' => 'proprietary', 0, ); while ( my ($pattern, $license, $osi) = splice(@phrases, 0, 3) ) { $pattern =~ s#\s+#\\s+#gs; if ( $license_text =~ /\b$pattern\b/i ) { return $license; } } } sub license_from { my $self = shift; if (my $license=_extract_license(Module::Install::_read($_[0]))) { $self->license($license); } else { warn "Cannot determine license info from $_[0]\n"; return 'unknown'; } } sub _extract_bugtracker { my @links = $_[0] =~ m#L<( \Qhttp://rt.cpan.org/\E[^>]+| \Qhttp://github.com/\E[\w_]+/[\w_]+/issues| \Qhttp://code.google.com/p/\E[\w_\-]+/issues/list )>#gx; my %links; @links{@links}=(); @links=keys %links; return @links; } sub bugtracker_from { my $self = shift; my $content = Module::Install::_read($_[0]); my @links = _extract_bugtracker($content); unless ( @links ) { warn "Cannot determine bugtracker info from $_[0]\n"; return 0; } if ( @links > 1 ) { warn "Found more than one bugtracker link in $_[0]\n"; return 0; } # Set the bugtracker bugtracker( $links[0] ); return 1; } sub requires_from { my $self = shift; my $content = Module::Install::_readperl($_[0]); my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+([\d\.]+)/mg; while ( @requires ) { my $module = shift @requires; my $version = shift @requires; $self->requires( $module => $version ); } } sub test_requires_from { my $self = shift; my $content = Module::Install::_readperl($_[0]); my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+([\d\.]+)/mg; while ( @requires ) { my $module = shift @requires; my $version = shift @requires; $self->test_requires( $module => $version ); } } # Convert triple-part versions (eg, 5.6.1 or 5.8.9) to # numbers (eg, 5.006001 or 5.008009). # Also, convert double-part versions (eg, 5.8) sub _perl_version { my $v = $_[-1]; $v =~ s/^([1-9])\.([1-9]\d?\d?)$/sprintf("%d.%03d",$1,$2)/e; $v =~ s/^([1-9])\.([1-9]\d?\d?)\.(0|[1-9]\d?\d?)$/sprintf("%d.%03d%03d",$1,$2,$3 || 0)/e; $v =~ s/(\.\d\d\d)000$/$1/; $v =~ s/_.+$//; if ( ref($v) ) { # Numify $v = $v + 0; } return $v; } ###################################################################### # MYMETA Support sub WriteMyMeta { die "WriteMyMeta has been deprecated"; } sub write_mymeta_yaml { my $self = shift; # We need YAML::Tiny to write the MYMETA.yml file unless ( eval { require YAML::Tiny; 1; } ) { return 1; } # Generate the data my $meta = $self->_write_mymeta_data or return 1; # Save as the MYMETA.yml file print "Writing MYMETA.yml\n"; YAML::Tiny::DumpFile('MYMETA.yml', $meta); } sub write_mymeta_json { my $self = shift; # We need JSON to write the MYMETA.json file unless ( eval { require JSON; 1; } ) { return 1; } # Generate the data my $meta = $self->_write_mymeta_data or return 1; # Save as the MYMETA.yml file print "Writing MYMETA.json\n"; Module::Install::_write( 'MYMETA.json', JSON->new->pretty(1)->canonical->encode($meta), ); } sub _write_mymeta_data { my $self = shift; # If there's no existing META.yml there is nothing we can do return undef unless -f 'META.yml'; # We need Parse::CPAN::Meta to load the file unless ( eval { require Parse::CPAN::Meta; 1; } ) { return undef; } # Merge the perl version into the dependencies my $val = $self->Meta->{values}; my $perl = delete $val->{perl_version}; if ( $perl ) { $val->{requires} ||= []; my $requires = $val->{requires}; # Canonize to three-dot version after Perl 5.6 if ( $perl >= 5.006 ) { $perl =~ s{^(\d+)\.(\d\d\d)(\d*)}{join('.', $1, int($2||0), int($3||0))}e } unshift @$requires, [ perl => $perl ]; } # Load the advisory META.yml file my @yaml = Parse::CPAN::Meta::LoadFile('META.yml'); my $meta = $yaml[0]; # Overwrite the non-configure dependency hashs delete $meta->{requires}; delete $meta->{build_requires}; delete $meta->{recommends}; if ( exists $val->{requires} ) { $meta->{requires} = { map { @$_ } @{ $val->{requires} } }; } if ( exists $val->{build_requires} ) { $meta->{build_requires} = { map { @$_ } @{ $val->{build_requires} } }; } return $meta; } 1; perl-ldap-0.58/inc/Module/Install/Base.pm0000644000175000000620000000176612173014262017630 0ustar marschapstaff#line 1 package Module::Install::Base; use strict 'vars'; use vars qw{$VERSION}; BEGIN { $VERSION = '0.95'; } # Suspend handler for "redefined" warnings BEGIN { my $w = $SIG{__WARN__}; $SIG{__WARN__} = sub { $w }; } #line 42 sub new { my $class = shift; unless ( defined &{"${class}::call"} ) { *{"${class}::call"} = sub { shift->_top->call(@_) }; } unless ( defined &{"${class}::load"} ) { *{"${class}::load"} = sub { shift->_top->load(@_) }; } bless { @_ }, $class; } #line 61 sub AUTOLOAD { local $@; my $func = eval { shift->_top->autoload } or return; goto &$func; } #line 75 sub _top { $_[0]->{_top}; } #line 90 sub admin { $_[0]->_top->{admin} or Module::Install::Base::FakeAdmin->new; } #line 106 sub is_admin { $_[0]->admin->VERSION; } sub DESTROY {} package Module::Install::Base::FakeAdmin; my $fake; sub new { $fake ||= bless(\@_, $_[0]); } sub AUTOLOAD {} sub DESTROY {} # Restore warning handler BEGIN { $SIG{__WARN__} = $SIG{__WARN__}->(); } 1; #line 154 perl-ldap-0.58/inc/Module/Install/Win32.pm0000644000175000000620000000340312173014262017646 0ustar marschapstaff#line 1 package Module::Install::Win32; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '0.95'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } # determine if the user needs nmake, and download it if needed sub check_nmake { my $self = shift; $self->load('can_run'); $self->load('get_file'); require Config; return unless ( $^O eq 'MSWin32' and $Config::Config{make} and $Config::Config{make} =~ /^nmake\b/i and ! $self->can_run('nmake') ); print "The required 'nmake' executable not found, fetching it...\n"; require File::Basename; my $rv = $self->get_file( url => 'http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe', ftp_url => 'ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe', local_dir => File::Basename::dirname($^X), size => 51928, run => 'Nmake15.exe /o > nul', check_for => 'Nmake.exe', remove => 1, ); die <<'END_MESSAGE' unless $rv; ------------------------------------------------------------------------------- Since you are using Microsoft Windows, you will need the 'nmake' utility before installation. It's available at: http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe or ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe Please download the file manually, save it to a directory in %PATH% (e.g. C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to that directory, and run "Nmake15.exe" from there; that will create the 'nmake.exe' file needed by this module. You may then resume the installation process described in README. ------------------------------------------------------------------------------- END_MESSAGE } 1; perl-ldap-0.58/inc/Module/Install/Include.pm0000644000175000000620000000101512173014262020324 0ustar marschapstaff#line 1 package Module::Install::Include; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '0.95'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub include { shift()->admin->include(@_); } sub include_deps { shift()->admin->include_deps(@_); } sub auto_include { shift()->admin->auto_include(@_); } sub auto_include_deps { shift()->admin->auto_include_deps(@_); } sub auto_include_dependent_dists { shift()->admin->auto_include_dependent_dists(@_); } 1; perl-ldap-0.58/inc/Module/Install/WriteAll.pm0000644000175000000620000000237712173014262020500 0ustar marschapstaff#line 1 package Module::Install::WriteAll; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '0.95';; @ISA = qw{Module::Install::Base}; $ISCORE = 1; } sub WriteAll { my $self = shift; my %args = ( meta => 1, sign => 0, inline => 0, check_nmake => 1, @_, ); $self->sign(1) if $args{sign}; $self->admin->WriteAll(%args) if $self->is_admin; $self->check_nmake if $args{check_nmake}; unless ( $self->makemaker_args->{PL_FILES} ) { # XXX: This still may be a bit over-defensive... unless ($self->makemaker(6.25)) { $self->makemaker_args( PL_FILES => {} ) if -f 'Build.PL'; } } # Until ExtUtils::MakeMaker support MYMETA.yml, make sure # we clean it up properly ourself. $self->realclean_files('MYMETA.yml'); if ( $args{inline} ) { $self->Inline->write; } else { $self->Makefile->write; } # The Makefile write process adds a couple of dependencies, # so write the META.yml files after the Makefile. if ( $args{meta} ) { $self->Meta->write; } # Experimental support for MYMETA if ( $ENV{X_MYMETA} ) { if ( $ENV{X_MYMETA} eq 'JSON' ) { $self->Meta->write_mymeta_json; } else { $self->Meta->write_mymeta_yaml; } } return 1; } 1; perl-ldap-0.58/inc/Module/Install/AutoInstall.pm0000644000175000000620000000227312173014262021207 0ustar marschapstaff#line 1 package Module::Install::AutoInstall; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '0.95'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub AutoInstall { $_[0] } sub run { my $self = shift; $self->auto_install_now(@_); } sub write { my $self = shift; $self->auto_install(@_); } sub auto_install { my $self = shift; return if $self->{done}++; # Flatten array of arrays into a single array my @core = map @$_, map @$_, grep ref, $self->build_requires, $self->requires; my @config = @_; # We'll need Module::AutoInstall $self->include('Module::AutoInstall'); require Module::AutoInstall; Module::AutoInstall->import( (@config ? (-config => \@config) : ()), (@core ? (-core => \@core) : ()), $self->features, ); $self->makemaker_args( Module::AutoInstall::_make_args() ); my $class = ref($self); $self->postamble( "# --- $class section:\n" . Module::AutoInstall::postamble() ); } sub auto_install_now { my $self = shift; $self->auto_install(@_); Module::AutoInstall::do_install(); } 1; perl-ldap-0.58/inc/Module/Install.pm0000644000175000000620000002637112173014262016755 0ustar marschapstaff#line 1 package Module::Install; # For any maintainers: # The load order for Module::Install is a bit magic. # It goes something like this... # # IF ( host has Module::Install installed, creating author mode ) { # 1. Makefile.PL calls "use inc::Module::Install" # 2. $INC{inc/Module/Install.pm} set to installed version of inc::Module::Install # 3. The installed version of inc::Module::Install loads # 4. inc::Module::Install calls "require Module::Install" # 5. The ./inc/ version of Module::Install loads # } ELSE { # 1. Makefile.PL calls "use inc::Module::Install" # 2. $INC{inc/Module/Install.pm} set to ./inc/ version of Module::Install # 3. The ./inc/ version of Module::Install loads # } use 5.005; use strict 'vars'; use Cwd (); use File::Find (); use File::Path (); use FindBin; use vars qw{$VERSION $MAIN}; BEGIN { # All Module::Install core packages now require synchronised versions. # This will be used to ensure we don't accidentally load old or # different versions of modules. # This is not enforced yet, but will be some time in the next few # releases once we can make sure it won't clash with custom # Module::Install extensions. $VERSION = '0.95'; # Storage for the pseudo-singleton $MAIN = undef; *inc::Module::Install::VERSION = *VERSION; @inc::Module::Install::ISA = __PACKAGE__; } sub import { my $class = shift; my $self = $class->new(@_); my $who = $self->_caller; #------------------------------------------------------------- # all of the following checks should be included in import(), # to allow "eval 'require Module::Install; 1' to test # installation of Module::Install. (RT #51267) #------------------------------------------------------------- # Whether or not inc::Module::Install is actually loaded, the # $INC{inc/Module/Install.pm} is what will still get set as long as # the caller loaded module this in the documented manner. # If not set, the caller may NOT have loaded the bundled version, and thus # they may not have a MI version that works with the Makefile.PL. This would # result in false errors or unexpected behaviour. And we don't want that. my $file = join( '/', 'inc', split /::/, __PACKAGE__ ) . '.pm'; unless ( $INC{$file} ) { die <<"END_DIE" } Please invoke ${\__PACKAGE__} with: use inc::${\__PACKAGE__}; not: use ${\__PACKAGE__}; END_DIE # This reportedly fixes a rare Win32 UTC file time issue, but # as this is a non-cross-platform XS module not in the core, # we shouldn't really depend on it. See RT #24194 for detail. # (Also, this module only supports Perl 5.6 and above). eval "use Win32::UTCFileTime" if $^O eq 'MSWin32' && $] >= 5.006; # If the script that is loading Module::Install is from the future, # then make will detect this and cause it to re-run over and over # again. This is bad. Rather than taking action to touch it (which # is unreliable on some platforms and requires write permissions) # for now we should catch this and refuse to run. if ( -f $0 ) { my $s = (stat($0))[9]; # If the modification time is only slightly in the future, # sleep briefly to remove the problem. my $a = $s - time; if ( $a > 0 and $a < 5 ) { sleep 5 } # Too far in the future, throw an error. my $t = time; if ( $s > $t ) { die <<"END_DIE" } Your installer $0 has a modification time in the future ($s > $t). This is known to create infinite loops in make. Please correct this, then run $0 again. END_DIE } # Build.PL was formerly supported, but no longer is due to excessive # difficulty in implementing every single feature twice. if ( $0 =~ /Build.PL$/i ) { die <<"END_DIE" } Module::Install no longer supports Build.PL. It was impossible to maintain duel backends, and has been deprecated. Please remove all Build.PL files and only use the Makefile.PL installer. END_DIE #------------------------------------------------------------- # To save some more typing in Module::Install installers, every... # use inc::Module::Install # ...also acts as an implicit use strict. $^H |= strict::bits(qw(refs subs vars)); #------------------------------------------------------------- unless ( -f $self->{file} ) { require "$self->{path}/$self->{dispatch}.pm"; File::Path::mkpath("$self->{prefix}/$self->{author}"); $self->{admin} = "$self->{name}::$self->{dispatch}"->new( _top => $self ); $self->{admin}->init; @_ = ($class, _self => $self); goto &{"$self->{name}::import"}; } *{"${who}::AUTOLOAD"} = $self->autoload; $self->preload; # Unregister loader and worker packages so subdirs can use them again delete $INC{"$self->{file}"}; delete $INC{"$self->{path}.pm"}; # Save to the singleton $MAIN = $self; return 1; } sub autoload { my $self = shift; my $who = $self->_caller; my $cwd = Cwd::cwd(); my $sym = "${who}::AUTOLOAD"; $sym->{$cwd} = sub { my $pwd = Cwd::cwd(); if ( my $code = $sym->{$pwd} ) { # Delegate back to parent dirs goto &$code unless $cwd eq $pwd; } $$sym =~ /([^:]+)$/ or die "Cannot autoload $who - $sym"; my $method = $1; if ( uc($method) eq $method ) { # Do nothing return; } elsif ( $method =~ /^_/ and $self->can($method) ) { # Dispatch to the root M:I class return $self->$method(@_); } # Dispatch to the appropriate plugin unshift @_, ( $self, $1 ); goto &{$self->can('call')}; }; } sub preload { my $self = shift; unless ( $self->{extensions} ) { $self->load_extensions( "$self->{prefix}/$self->{path}", $self ); } my @exts = @{$self->{extensions}}; unless ( @exts ) { @exts = $self->{admin}->load_all_extensions; } my %seen; foreach my $obj ( @exts ) { while (my ($method, $glob) = each %{ref($obj) . '::'}) { next unless $obj->can($method); next if $method =~ /^_/; next if $method eq uc($method); $seen{$method}++; } } my $who = $self->_caller; foreach my $name ( sort keys %seen ) { *{"${who}::$name"} = sub { ${"${who}::AUTOLOAD"} = "${who}::$name"; goto &{"${who}::AUTOLOAD"}; }; } } sub new { my ($class, %args) = @_; # ignore the prefix on extension modules built from top level. my $base_path = Cwd::abs_path($FindBin::Bin); unless ( Cwd::abs_path(Cwd::cwd()) eq $base_path ) { delete $args{prefix}; } return $args{_self} if $args{_self}; $args{dispatch} ||= 'Admin'; $args{prefix} ||= 'inc'; $args{author} ||= ($^O eq 'VMS' ? '_author' : '.author'); $args{bundle} ||= 'inc/BUNDLES'; $args{base} ||= $base_path; $class =~ s/^\Q$args{prefix}\E:://; $args{name} ||= $class; $args{version} ||= $class->VERSION; unless ( $args{path} ) { $args{path} = $args{name}; $args{path} =~ s!::!/!g; } $args{file} ||= "$args{base}/$args{prefix}/$args{path}.pm"; $args{wrote} = 0; bless( \%args, $class ); } sub call { my ($self, $method) = @_; my $obj = $self->load($method) or return; splice(@_, 0, 2, $obj); goto &{$obj->can($method)}; } sub load { my ($self, $method) = @_; $self->load_extensions( "$self->{prefix}/$self->{path}", $self ) unless $self->{extensions}; foreach my $obj (@{$self->{extensions}}) { return $obj if $obj->can($method); } my $admin = $self->{admin} or die <<"END_DIE"; The '$method' method does not exist in the '$self->{prefix}' path! Please remove the '$self->{prefix}' directory and run $0 again to load it. END_DIE my $obj = $admin->load($method, 1); push @{$self->{extensions}}, $obj; $obj; } sub load_extensions { my ($self, $path, $top) = @_; unless ( grep { ! ref $_ and lc $_ eq lc $self->{prefix} } @INC ) { unshift @INC, $self->{prefix}; } foreach my $rv ( $self->find_extensions($path) ) { my ($file, $pkg) = @{$rv}; next if $self->{pathnames}{$pkg}; local $@; my $new = eval { require $file; $pkg->can('new') }; unless ( $new ) { warn $@ if $@; next; } $self->{pathnames}{$pkg} = delete $INC{$file}; push @{$self->{extensions}}, &{$new}($pkg, _top => $top ); } $self->{extensions} ||= []; } sub find_extensions { my ($self, $path) = @_; my @found; File::Find::find( sub { my $file = $File::Find::name; return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is; my $subpath = $1; return if lc($subpath) eq lc($self->{dispatch}); $file = "$self->{path}/$subpath.pm"; my $pkg = "$self->{name}::$subpath"; $pkg =~ s!/!::!g; # If we have a mixed-case package name, assume case has been preserved # correctly. Otherwise, root through the file to locate the case-preserved # version of the package name. if ( $subpath eq lc($subpath) || $subpath eq uc($subpath) ) { my $content = Module::Install::_read($subpath . '.pm'); my $in_pod = 0; foreach ( split //, $content ) { $in_pod = 1 if /^=\w/; $in_pod = 0 if /^=cut/; next if ($in_pod || /^=cut/); # skip pod text next if /^\s*#/; # and comments if ( m/^\s*package\s+($pkg)\s*;/i ) { $pkg = $1; last; } } } push @found, [ $file, $pkg ]; }, $path ) if -d $path; @found; } ##################################################################### # Common Utility Functions sub _caller { my $depth = 0; my $call = caller($depth); while ( $call eq __PACKAGE__ ) { $depth++; $call = caller($depth); } return $call; } # Done in evals to avoid confusing Perl::MinimumVersion eval( $] >= 5.006 ? <<'END_NEW' : <<'END_OLD' ); die $@ if $@; sub _read { local *FH; open( FH, '<', $_[0] ) or die "open($_[0]): $!"; my $string = do { local $/; }; close FH or die "close($_[0]): $!"; return $string; } END_NEW sub _read { local *FH; open( FH, "< $_[0]" ) or die "open($_[0]): $!"; my $string = do { local $/; }; close FH or die "close($_[0]): $!"; return $string; } END_OLD sub _readperl { my $string = Module::Install::_read($_[0]); $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; $string =~ s/(\n)\n*__(?:DATA|END)__\b.*\z/$1/s; $string =~ s/\n\n=\w+.+?\n\n=cut\b.+?\n+/\n\n/sg; return $string; } sub _readpod { my $string = Module::Install::_read($_[0]); $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; return $string if $_[0] =~ /\.pod\z/; $string =~ s/(^|\n=cut\b.+?\n+)[^=\s].+?\n(\n=\w+|\z)/$1$2/sg; $string =~ s/\n*=pod\b[^\n]*\n+/\n\n/sg; $string =~ s/\n*=cut\b[^\n]*\n+/\n\n/sg; $string =~ s/^\n+//s; return $string; } # Done in evals to avoid confusing Perl::MinimumVersion eval( $] >= 5.006 ? <<'END_NEW' : <<'END_OLD' ); die $@ if $@; sub _write { local *FH; open( FH, '>', $_[0] ) or die "open($_[0]): $!"; foreach ( 1 .. $#_ ) { print FH $_[$_] or die "print($_[0]): $!"; } close FH or die "close($_[0]): $!"; } END_NEW sub _write { local *FH; open( FH, "> $_[0]" ) or die "open($_[0]): $!"; foreach ( 1 .. $#_ ) { print FH $_[$_] or die "print($_[0]): $!"; } close FH or die "close($_[0]): $!"; } END_OLD # _version is for processing module versions (eg, 1.03_05) not # Perl versions (eg, 5.8.1). sub _version ($) { my $s = shift || 0; my $d =()= $s =~ /(\.)/g; if ( $d >= 2 ) { # Normalise multipart versions $s =~ s/(\.)(\d{1,3})/sprintf("$1%03d",$2)/eg; } $s =~ s/^(\d+)\.?//; my $l = $1 || 0; my @v = map { $_ . '0' x (3 - length $_) } $s =~ /(\d{1,3})\D?/g; $l = $l . '.' . join '', @v if @v; return $l + 0; } sub _cmp ($$) { _version($_[0]) <=> _version($_[1]); } # Cloned from Params::Util::_CLASS sub _CLASS ($) { ( defined $_[0] and ! ref $_[0] and $_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s ) ? $_[0] : undef; } 1; # Copyright 2008 - 2010 Adam Kennedy. perl-ldap-0.58/inc/Module/AutoInstall.pm0000644000175000000620000005416612173014262017611 0ustar marschapstaff#line 1 package Module::AutoInstall; use strict; use Cwd (); use ExtUtils::MakeMaker (); use vars qw{$VERSION}; BEGIN { $VERSION = '1.03'; } # special map on pre-defined feature sets my %FeatureMap = ( '' => 'Core Features', # XXX: deprecated '-core' => 'Core Features', ); # various lexical flags my ( @Missing, @Existing, %DisabledTests, $UnderCPAN, $HasCPANPLUS ); my ( $Config, $CheckOnly, $SkipInstall, $AcceptDefault, $TestOnly, $AllDeps ); my ( $PostambleActions, $PostambleUsed ); # See if it's a testing or non-interactive session _accept_default( $ENV{AUTOMATED_TESTING} or ! -t STDIN ); _init(); sub _accept_default { $AcceptDefault = shift; } sub missing_modules { return @Missing; } sub do_install { __PACKAGE__->install( [ $Config ? ( UNIVERSAL::isa( $Config, 'HASH' ) ? %{$Config} : @{$Config} ) : () ], @Missing, ); } # initialize various flags, and/or perform install sub _init { foreach my $arg ( @ARGV, split( /[\s\t]+/, $ENV{PERL_AUTOINSTALL} || $ENV{PERL_EXTUTILS_AUTOINSTALL} || '' ) ) { if ( $arg =~ /^--config=(.*)$/ ) { $Config = [ split( ',', $1 ) ]; } elsif ( $arg =~ /^--installdeps=(.*)$/ ) { __PACKAGE__->install( $Config, @Missing = split( /,/, $1 ) ); exit 0; } elsif ( $arg =~ /^--default(?:deps)?$/ ) { $AcceptDefault = 1; } elsif ( $arg =~ /^--check(?:deps)?$/ ) { $CheckOnly = 1; } elsif ( $arg =~ /^--skip(?:deps)?$/ ) { $SkipInstall = 1; } elsif ( $arg =~ /^--test(?:only)?$/ ) { $TestOnly = 1; } elsif ( $arg =~ /^--all(?:deps)?$/ ) { $AllDeps = 1; } } } # overrides MakeMaker's prompt() to automatically accept the default choice sub _prompt { goto &ExtUtils::MakeMaker::prompt unless $AcceptDefault; my ( $prompt, $default ) = @_; my $y = ( $default =~ /^[Yy]/ ); print $prompt, ' [', ( $y ? 'Y' : 'y' ), '/', ( $y ? 'n' : 'N' ), '] '; print "$default\n"; return $default; } # the workhorse sub import { my $class = shift; my @args = @_ or return; my $core_all; print "*** $class version " . $class->VERSION . "\n"; print "*** Checking for Perl dependencies...\n"; my $cwd = Cwd::cwd(); $Config = []; my $maxlen = length( ( sort { length($b) <=> length($a) } grep { /^[^\-]/ } map { ref($_) ? ( ( ref($_) eq 'HASH' ) ? keys(%$_) : @{$_} ) : '' } map { +{@args}->{$_} } grep { /^[^\-]/ or /^-core$/i } keys %{ +{@args} } )[0] ); # We want to know if we're under CPAN early to avoid prompting, but # if we aren't going to try and install anything anyway then skip the # check entirely since we don't want to have to load (and configure) # an old CPAN just for a cosmetic message $UnderCPAN = _check_lock(1) unless $SkipInstall; while ( my ( $feature, $modules ) = splice( @args, 0, 2 ) ) { my ( @required, @tests, @skiptests ); my $default = 1; my $conflict = 0; if ( $feature =~ m/^-(\w+)$/ ) { my $option = lc($1); # check for a newer version of myself _update_to( $modules, @_ ) and return if $option eq 'version'; # sets CPAN configuration options $Config = $modules if $option eq 'config'; # promote every features to core status $core_all = ( $modules =~ /^all$/i ) and next if $option eq 'core'; next unless $option eq 'core'; } print "[" . ( $FeatureMap{ lc($feature) } || $feature ) . "]\n"; $modules = [ %{$modules} ] if UNIVERSAL::isa( $modules, 'HASH' ); unshift @$modules, -default => &{ shift(@$modules) } if ( ref( $modules->[0] ) eq 'CODE' ); # XXX: bugward combatability while ( my ( $mod, $arg ) = splice( @$modules, 0, 2 ) ) { if ( $mod =~ m/^-(\w+)$/ ) { my $option = lc($1); $default = $arg if ( $option eq 'default' ); $conflict = $arg if ( $option eq 'conflict' ); @tests = @{$arg} if ( $option eq 'tests' ); @skiptests = @{$arg} if ( $option eq 'skiptests' ); next; } printf( "- %-${maxlen}s ...", $mod ); if ( $arg and $arg =~ /^\D/ ) { unshift @$modules, $arg; $arg = 0; } # XXX: check for conflicts and uninstalls(!) them. my $cur = _load($mod); if (_version_cmp ($cur, $arg) >= 0) { print "loaded. ($cur" . ( $arg ? " >= $arg" : '' ) . ")\n"; push @Existing, $mod => $arg; $DisabledTests{$_} = 1 for map { glob($_) } @skiptests; } else { if (not defined $cur) # indeed missing { print "missing." . ( $arg ? " (would need $arg)" : '' ) . "\n"; } else { # no need to check $arg as _version_cmp ($cur, undef) would satisfy >= above print "too old. ($cur < $arg)\n"; } push @required, $mod => $arg; } } next unless @required; my $mandatory = ( $feature eq '-core' or $core_all ); if ( !$SkipInstall and ( $CheckOnly or ($mandatory and $UnderCPAN) or $AllDeps or _prompt( qq{==> Auto-install the } . ( @required / 2 ) . ( $mandatory ? ' mandatory' : ' optional' ) . qq{ module(s) from CPAN?}, $default ? 'y' : 'n', ) =~ /^[Yy]/ ) ) { push( @Missing, @required ); $DisabledTests{$_} = 1 for map { glob($_) } @skiptests; } elsif ( !$SkipInstall and $default and $mandatory and _prompt( qq{==> The module(s) are mandatory! Really skip?}, 'n', ) =~ /^[Nn]/ ) { push( @Missing, @required ); $DisabledTests{$_} = 1 for map { glob($_) } @skiptests; } else { $DisabledTests{$_} = 1 for map { glob($_) } @tests; } } if ( @Missing and not( $CheckOnly or $UnderCPAN ) ) { require Config; print "*** Dependencies will be installed the next time you type '$Config::Config{make}'.\n"; # make an educated guess of whether we'll need root permission. print " (You may need to do that as the 'root' user.)\n" if eval '$>'; } print "*** $class configuration finished.\n"; chdir $cwd; # import to main:: no strict 'refs'; *{'main::WriteMakefile'} = \&Write if caller(0) eq 'main'; } sub _running_under { my $thing = shift; print <<"END_MESSAGE"; *** Since we're running under ${thing}, I'll just let it take care of the dependency's installation later. END_MESSAGE return 1; } # Check to see if we are currently running under CPAN.pm and/or CPANPLUS; # if we are, then we simply let it taking care of our dependencies sub _check_lock { return unless @Missing or @_; my $cpan_env = $ENV{PERL5_CPAN_IS_RUNNING}; if ($ENV{PERL5_CPANPLUS_IS_RUNNING}) { return _running_under($cpan_env ? 'CPAN' : 'CPANPLUS'); } require CPAN; if ($CPAN::VERSION > '1.89') { if ($cpan_env) { return _running_under('CPAN'); } return; # CPAN.pm new enough, don't need to check further } # last ditch attempt, this -will- configure CPAN, very sorry _load_cpan(1); # force initialize even though it's already loaded # Find the CPAN lock-file my $lock = MM->catfile( $CPAN::Config->{cpan_home}, ".lock" ); return unless -f $lock; # Check the lock local *LOCK; return unless open(LOCK, $lock); if ( ( $^O eq 'MSWin32' ? _under_cpan() : == getppid() ) and ( $CPAN::Config->{prerequisites_policy} || '' ) ne 'ignore' ) { print <<'END_MESSAGE'; *** Since we're running under CPAN, I'll just let it take care of the dependency's installation later. END_MESSAGE return 1; } close LOCK; return; } sub install { my $class = shift; my $i; # used below to strip leading '-' from config keys my @config = ( map { s/^-// if ++$i; $_ } @{ +shift } ); my ( @modules, @installed ); while ( my ( $pkg, $ver ) = splice( @_, 0, 2 ) ) { # grep out those already installed if ( _version_cmp( _load($pkg), $ver ) >= 0 ) { push @installed, $pkg; } else { push @modules, $pkg, $ver; } } return @installed unless @modules; # nothing to do return @installed if _check_lock(); # defer to the CPAN shell print "*** Installing dependencies...\n"; return unless _connected_to('cpan.org'); my %args = @config; my %failed; local *FAILED; if ( $args{do_once} and open( FAILED, '.#autoinstall.failed' ) ) { while () { chomp; $failed{$_}++ } close FAILED; my @newmod; while ( my ( $k, $v ) = splice( @modules, 0, 2 ) ) { push @newmod, ( $k => $v ) unless $failed{$k}; } @modules = @newmod; } if ( _has_cpanplus() and not $ENV{PERL_AUTOINSTALL_PREFER_CPAN} ) { _install_cpanplus( \@modules, \@config ); } else { _install_cpan( \@modules, \@config ); } print "*** $class installation finished.\n"; # see if we have successfully installed them while ( my ( $pkg, $ver ) = splice( @modules, 0, 2 ) ) { if ( _version_cmp( _load($pkg), $ver ) >= 0 ) { push @installed, $pkg; } elsif ( $args{do_once} and open( FAILED, '>> .#autoinstall.failed' ) ) { print FAILED "$pkg\n"; } } close FAILED if $args{do_once}; return @installed; } sub _install_cpanplus { my @modules = @{ +shift }; my @config = _cpanplus_config( @{ +shift } ); my $installed = 0; require CPANPLUS::Backend; my $cp = CPANPLUS::Backend->new; my $conf = $cp->configure_object; return unless $conf->can('conf') # 0.05x+ with "sudo" support or _can_write($conf->_get_build('base')); # 0.04x # if we're root, set UNINST=1 to avoid trouble unless user asked for it. my $makeflags = $conf->get_conf('makeflags') || ''; if ( UNIVERSAL::isa( $makeflags, 'HASH' ) ) { # 0.03+ uses a hashref here $makeflags->{UNINST} = 1 unless exists $makeflags->{UNINST}; } else { # 0.02 and below uses a scalar $makeflags = join( ' ', split( ' ', $makeflags ), 'UNINST=1' ) if ( $makeflags !~ /\bUNINST\b/ and eval qq{ $> eq '0' } ); } $conf->set_conf( makeflags => $makeflags ); $conf->set_conf( prereqs => 1 ); while ( my ( $key, $val ) = splice( @config, 0, 2 ) ) { $conf->set_conf( $key, $val ); } my $modtree = $cp->module_tree; while ( my ( $pkg, $ver ) = splice( @modules, 0, 2 ) ) { print "*** Installing $pkg...\n"; MY::preinstall( $pkg, $ver ) or next if defined &MY::preinstall; my $success; my $obj = $modtree->{$pkg}; if ( $obj and _version_cmp( $obj->{version}, $ver ) >= 0 ) { my $pathname = $pkg; $pathname =~ s/::/\\W/; foreach my $inc ( grep { m/$pathname.pm/i } keys(%INC) ) { delete $INC{$inc}; } my $rv = $cp->install( modules => [ $obj->{module} ] ); if ( $rv and ( $rv->{ $obj->{module} } or $rv->{ok} ) ) { print "*** $pkg successfully installed.\n"; $success = 1; } else { print "*** $pkg installation cancelled.\n"; $success = 0; } $installed += $success; } else { print << "."; *** Could not find a version $ver or above for $pkg; skipping. . } MY::postinstall( $pkg, $ver, $success ) if defined &MY::postinstall; } return $installed; } sub _cpanplus_config { my @config = (); while ( @_ ) { my ($key, $value) = (shift(), shift()); if ( $key eq 'prerequisites_policy' ) { if ( $value eq 'follow' ) { $value = CPANPLUS::Internals::Constants::PREREQ_INSTALL(); } elsif ( $value eq 'ask' ) { $value = CPANPLUS::Internals::Constants::PREREQ_ASK(); } elsif ( $value eq 'ignore' ) { $value = CPANPLUS::Internals::Constants::PREREQ_IGNORE(); } else { die "*** Cannot convert option $key = '$value' to CPANPLUS version.\n"; } } else { die "*** Cannot convert option $key to CPANPLUS version.\n"; } } return @config; } sub _install_cpan { my @modules = @{ +shift }; my @config = @{ +shift }; my $installed = 0; my %args; _load_cpan(); require Config; if (CPAN->VERSION < 1.80) { # no "sudo" support, probe for writableness return unless _can_write( MM->catfile( $CPAN::Config->{cpan_home}, 'sources' ) ) and _can_write( $Config::Config{sitelib} ); } # if we're root, set UNINST=1 to avoid trouble unless user asked for it. my $makeflags = $CPAN::Config->{make_install_arg} || ''; $CPAN::Config->{make_install_arg} = join( ' ', split( ' ', $makeflags ), 'UNINST=1' ) if ( $makeflags !~ /\bUNINST\b/ and eval qq{ $> eq '0' } ); # don't show start-up info $CPAN::Config->{inhibit_startup_message} = 1; # set additional options while ( my ( $opt, $arg ) = splice( @config, 0, 2 ) ) { ( $args{$opt} = $arg, next ) if $opt =~ /^force$/; # pseudo-option $CPAN::Config->{$opt} = $arg; } local $CPAN::Config->{prerequisites_policy} = 'follow'; while ( my ( $pkg, $ver ) = splice( @modules, 0, 2 ) ) { MY::preinstall( $pkg, $ver ) or next if defined &MY::preinstall; print "*** Installing $pkg...\n"; my $obj = CPAN::Shell->expand( Module => $pkg ); my $success = 0; if ( $obj and _version_cmp( $obj->cpan_version, $ver ) >= 0 ) { my $pathname = $pkg; $pathname =~ s/::/\\W/; foreach my $inc ( grep { m/$pathname.pm/i } keys(%INC) ) { delete $INC{$inc}; } my $rv = $args{force} ? CPAN::Shell->force( install => $pkg ) : CPAN::Shell->install($pkg); $rv ||= eval { $CPAN::META->instance( 'CPAN::Distribution', $obj->cpan_file, ) ->{install} if $CPAN::META; }; if ( $rv eq 'YES' ) { print "*** $pkg successfully installed.\n"; $success = 1; } else { print "*** $pkg installation failed.\n"; $success = 0; } $installed += $success; } else { print << "."; *** Could not find a version $ver or above for $pkg; skipping. . } MY::postinstall( $pkg, $ver, $success ) if defined &MY::postinstall; } return $installed; } sub _has_cpanplus { return ( $HasCPANPLUS = ( $INC{'CPANPLUS/Config.pm'} or _load('CPANPLUS::Shell::Default') ) ); } # make guesses on whether we're under the CPAN installation directory sub _under_cpan { require Cwd; require File::Spec; my $cwd = File::Spec->canonpath( Cwd::cwd() ); my $cpan = File::Spec->canonpath( $CPAN::Config->{cpan_home} ); return ( index( $cwd, $cpan ) > -1 ); } sub _update_to { my $class = __PACKAGE__; my $ver = shift; return if _version_cmp( _load($class), $ver ) >= 0; # no need to upgrade if ( _prompt( "==> A newer version of $class ($ver) is required. Install?", 'y' ) =~ /^[Nn]/ ) { die "*** Please install $class $ver manually.\n"; } print << "."; *** Trying to fetch it from CPAN... . # install ourselves _load($class) and return $class->import(@_) if $class->install( [], $class, $ver ); print << '.'; exit 1; *** Cannot bootstrap myself. :-( Installation terminated. . } # check if we're connected to some host, using inet_aton sub _connected_to { my $site = shift; return ( ( _load('Socket') and Socket::inet_aton($site) ) or _prompt( qq( *** Your host cannot resolve the domain name '$site', which probably means the Internet connections are unavailable. ==> Should we try to install the required module(s) anyway?), 'n' ) =~ /^[Yy]/ ); } # check if a directory is writable; may create it on demand sub _can_write { my $path = shift; mkdir( $path, 0755 ) unless -e $path; return 1 if -w $path; print << "."; *** You are not allowed to write to the directory '$path'; the installation may fail due to insufficient permissions. . if ( eval '$>' and lc(`sudo -V`) =~ /version/ and _prompt( qq( ==> Should we try to re-execute the autoinstall process with 'sudo'?), ((-t STDIN) ? 'y' : 'n') ) =~ /^[Yy]/ ) { # try to bootstrap ourselves from sudo print << "."; *** Trying to re-execute the autoinstall process with 'sudo'... . my $missing = join( ',', @Missing ); my $config = join( ',', UNIVERSAL::isa( $Config, 'HASH' ) ? %{$Config} : @{$Config} ) if $Config; return unless system( 'sudo', $^X, $0, "--config=$config", "--installdeps=$missing" ); print << "."; *** The 'sudo' command exited with error! Resuming... . } return _prompt( qq( ==> Should we try to install the required module(s) anyway?), 'n' ) =~ /^[Yy]/; } # load a module and return the version it reports sub _load { my $mod = pop; # class/instance doesn't matter my $file = $mod; $file =~ s|::|/|g; $file .= '.pm'; local $@; return eval { require $file; $mod->VERSION } || ( $@ ? undef: 0 ); } # Load CPAN.pm and it's configuration sub _load_cpan { return if $CPAN::VERSION and $CPAN::Config and not @_; require CPAN; # CPAN-1.82+ adds CPAN::Config::AUTOLOAD to redirect to # CPAN::HandleConfig->load. CPAN reports that the redirection # is deprecated in a warning printed at the user. # CPAN-1.81 expects CPAN::HandleConfig->load, does not have # $CPAN::HandleConfig::VERSION but cannot handle # CPAN::Config->load # Which "versions expect CPAN::Config->load? if ( $CPAN::HandleConfig::VERSION || CPAN::HandleConfig->can('load') ) { # Newer versions of CPAN have a HandleConfig module CPAN::HandleConfig->load; } else { # Older versions had the load method in Config directly CPAN::Config->load; } } # compare two versions, either use Sort::Versions or plain comparison # return values same as <=> sub _version_cmp { my ( $cur, $min ) = @_; return -1 unless defined $cur; # if 0 keep comparing return 1 unless $min; $cur =~ s/\s+$//; # check for version numbers that are not in decimal format if ( ref($cur) or ref($min) or $cur =~ /v|\..*\./ or $min =~ /v|\..*\./ ) { if ( ( $version::VERSION or defined( _load('version') )) and version->can('new') ) { # use version.pm if it is installed. return version->new($cur) <=> version->new($min); } elsif ( $Sort::Versions::VERSION or defined( _load('Sort::Versions') ) ) { # use Sort::Versions as the sorting algorithm for a.b.c versions return Sort::Versions::versioncmp( $cur, $min ); } warn "Cannot reliably compare non-decimal formatted versions.\n" . "Please install version.pm or Sort::Versions.\n"; } # plain comparison local $^W = 0; # shuts off 'not numeric' bugs return $cur <=> $min; } # nothing; this usage is deprecated. sub main::PREREQ_PM { return {}; } sub _make_args { my %args = @_; $args{PREREQ_PM} = { %{ $args{PREREQ_PM} || {} }, @Existing, @Missing } if $UnderCPAN or $TestOnly; if ( $args{EXE_FILES} and -e 'MANIFEST' ) { require ExtUtils::Manifest; my $manifest = ExtUtils::Manifest::maniread('MANIFEST'); $args{EXE_FILES} = [ grep { exists $manifest->{$_} } @{ $args{EXE_FILES} } ]; } $args{test}{TESTS} ||= 't/*.t'; $args{test}{TESTS} = join( ' ', grep { !exists( $DisabledTests{$_} ) } map { glob($_) } split( /\s+/, $args{test}{TESTS} ) ); my $missing = join( ',', @Missing ); my $config = join( ',', UNIVERSAL::isa( $Config, 'HASH' ) ? %{$Config} : @{$Config} ) if $Config; $PostambleActions = ( ($missing and not $UnderCPAN) ? "\$(PERL) $0 --config=$config --installdeps=$missing" : "\$(NOECHO) \$(NOOP)" ); return %args; } # a wrapper to ExtUtils::MakeMaker::WriteMakefile sub Write { require Carp; Carp::croak "WriteMakefile: Need even number of args" if @_ % 2; if ($CheckOnly) { print << "."; *** Makefile not written in check-only mode. . return; } my %args = _make_args(@_); no strict 'refs'; $PostambleUsed = 0; local *MY::postamble = \&postamble unless defined &MY::postamble; ExtUtils::MakeMaker::WriteMakefile(%args); print << "." unless $PostambleUsed; *** WARNING: Makefile written with customized MY::postamble() without including contents from Module::AutoInstall::postamble() -- auto installation features disabled. Please contact the author. . return 1; } sub postamble { $PostambleUsed = 1; return <<"END_MAKE"; config :: installdeps \t\$(NOECHO) \$(NOOP) checkdeps :: \t\$(PERL) $0 --checkdeps installdeps :: \t$PostambleActions END_MAKE } 1; __END__ #line 1069 perl-ldap-0.58/t/0002755000175000000620000000000012256064226013256 5ustar marschapstaffperl-ldap-0.58/t/43modify.t0000644000175000000620000000110712173014262015067 0ustar marschapstaff#!perl use Test::More; BEGIN { require "t/common.pl" } start_server() ? plan tests => 7 : plan skip_all => 'no server'; $ldap = client(); ok($ldap, "client"); $mesg = $ldap->bind($MANAGERDN, password => $PASSWD); ok(!$mesg->code, "bind: " . $mesg->code . ": " . $mesg->error); ok(ldif_populate($ldap, "data/42-in.ldif"), "data/42-in.ldif"); # load modify LDIF ok(ldif_populate($ldap, "data/42-mod.ldif", 'modify'), "data/42-mod.ldif"); # now search the database $mesg = $ldap->search(base => $BASEDN, filter => 'objectclass=*'); compare_ldif("42",$mesg,$mesg->sorted); perl-ldap-0.58/t/71preread.t0000644000175000000620000001047112173014262015227 0ustar marschapstaff#!perl use Test::More; use Net::LDAP; use Net::LDAP::Constant qw(LDAP_CONTROL_PREREAD); use Net::LDAP::Control::PreRead; BEGIN { require "t/common.pl" } my @tests; { # parse DATA into a list (= tests) of hashes (= test parameters) of lists (= parameter values) local $/ = ''; while(my $para = ) { my @lines = split(/\n/, $para); my %params; chomp(@lines); @lines = grep(!/^\s*(?:#.*?)?$/, @lines); map { push(@{$params{$1}}, $2) if (/^(\w+):\s*(.*)$/) } @lines; push(@tests, \%params) if (%params); } } start_server() ? plan tests => 4 + 6 * scalar(@tests) : plan skip_all => 'no server'; $ldap = client(); isa_ok($ldap, Net::LDAP, "client"); $rootdse = $ldap->root_dse; isa_ok($rootdse, Net::LDAP::RootDSE, "root_dse"); SKIP: { skip("RootDSE does not offer PreRead control", 2 + 6 * scalar(@tests)) unless($rootdse->supported_control(LDAP_CONTROL_PREREAD)); #$mesg = $ldap->start_tls(%tlsargs); #ok(!$mesg->code, "start_tls yields: ". $m->error); my $mesg = $ldap->bind($MANAGERDN, password => $PASSWD); ok(!$mesg->code, "bind: " . $mesg->code . ": " . $mesg->error); ok(ldif_populate($ldap, "data/40-in.ldif"), "data/40-in.ldif"); foreach my $test (@tests) { $mesg = $ldap->search(base => @{$test->{dn}} ? $test->{dn}[0] : '', filter => '(objectclass=*)', scope => 'base', attrs => $test->{attrs}); ok(!$mesg->code, "search: ". $mesg->code . ": " . $mesg->error); my $entry = $mesg->entry(0); my $origValue = join(':', map { sort $entry->get_value($_) } @{$test->{attrs}}); $control = Net::LDAP::Control::PreRead->new(attrs => $test->{attrs}); isa_ok($control, Net::LDAP::Control::PreRead, "control object"); foreach my $attr (@{$test->{attrs}}) { $entry->replace($attr => $test->{$attr} || []); } $mesg = $entry->update($ldap, control => $control); ok(!$mesg->code, "modify: " . $mesg->code . ": " . $mesg->error); my ($previous) = $mesg->control( LDAP_CONTROL_PREREAD ); isa_ok($control, Net::LDAP::Control::PreRead, "response object"); $entry = $previous->entry(); isa_ok($entry, Net::LDAP::Entry, "entry object"); my $prereadValue = join(':', map { sort $entry->get_value($_) } @{$test->{attrs}}); is($prereadValue, $origValue, "value in PreRead control matches"); } } __DATA__ ## each section below represents one test; logic similar to , structure similar to LDIF # each tests needs at least the elements # - dn: the object to modify/perform the test on # - attrs: the attributes to change and use in PreRead control # - $attr: optional - the new values (if any) for the attribute $attr # one attribute: replace a single value with another one dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US attrs: title title: HyperMythical Manager, Research Systems # one attribute: replace a single value attribute with multiple values dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US attrs: title title: Uber-Mythical Manager, Research Systems title: Cyber-Mythical Manager, Research Systems # one attribute: delete all values dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US attrs: title # multiple attribute: replace some values dn: cn=All Staff,ou=Groups,o=University of Michigan,c=US attrs: member attrs: description member: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US member: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=John Doe, ou=Information Technology Division, ou=People, o=University of Michigan, c=US member: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US description: Some of the sample data # multiple attribute: delete one, update the other dn: cn=All Staff,ou=Groups,o=University of Michigan,c=US attrs: member attrs: description member: cn=Manager, o=University of Michigan, c=US perl-ldap-0.58/t/03schema.t0000644000175000000620000000463312173014262015043 0ustar marschapstaff#!perl -w use Test::More tests => 14; use Net::LDAP::Schema; my $schema = Net::LDAP::Schema->new( "data/schema.in" ) or die "Cannot open schema"; isa_ok($schema, Net::LDAP::Schema, 'load schema file'); my @atts = $schema->all_attributes(); is(@atts, 265, 'number of attribute types in schema'); print "The schema contains ", scalar @atts, " attributes\n"; my @ocs = $schema->all_objectclasses(); is(@ocs, 66, 'number of object classes in schema'); print "The schema contains ", scalar @ocs, " object classes\n"; my @mrs = $schema->all_matchingrules(); is(@mrs, 40, 'number of matching rules in schema'); print "The schema contains ", scalar @mrs, " matching rules\n"; my @mrus = $schema->all_matchingruleuses(); is(@mrus, 34, 'number of matching rule uses in schema'); print "The schema contains ", scalar @mrus, " matching rule uses\n"; my @stxs = $schema->all_syntaxes(); is(@stxs, 32, 'number of LDAP syntaxes in schema'); print "The schema contains ", scalar @stxs, " LDAP syntaxes\n"; %namechildren = map { $_->{name} => 1 } grep { grep(/^name$/i, @{$_->{sup}}) } $schema->all_attributes(); is(scalar(keys(%namechildren)), 13, "attributes derived from 'name'"); @atts = $schema->must( "person" ); is(join(' ', sort map { lc $_->{name} } @atts), join(' ', sort map lc, qw(cn sn objectClass)), 'mandatory attributes'); print "The 'person' OC must have these attributes [", join(',', map $_->{name}, @atts), "]\n"; @atts = $schema->may( "mhsOrganizationalUser" ); ok(!@atts, 'optional attributes'); print "The 'mhsOrganizationalUser' OC may have these attributes [", join(',', map $_->{name}, @atts), "]\n"; @super = $schema->superclass('OpenLDAPperson'); is(join(' ', sort map lc, @super), join(' ', sort map lc, qw(pilotPerson inetOrgPerson)), 'superclass'); $mru = $schema->matchingruleuse('generalizedtimematch'); is(join(' ', sort map lc, @{$mru->{applies}}), join(' ', sort map lc, qw(createTimestamp modifyTimestamp)), 'attribute types a matching rule applies to'); @binarysyntaxes = map { $_->{name} } grep { $_->{'x-binary-transfer-required'} } $schema->all_syntaxes(); is(scalar(@binarysyntaxes), 5, "number of syntaxes that need ';binary' appended to the attribute type"); ok(! defined($schema->attribute('distinguishedName')->{max_length}), 'infinite length attribute type'); is($schema->attribute('userPassword')->{max_length}, 128, 'attribute type max. length'); perl-ldap-0.58/t/49lwp.t0000644000175000000620000000541512173014262014416 0ustar marschapstaff#!perl use Test::More; BEGIN { require "t/common.pl" } start_server() ? plan tests => 6 : plan skip_all => 'no server'; SKIP: { skip('LWP::UserAgent not installed', 6) unless (eval { require LWP::UserAgent }); $ldap = client(); ok($ldap, "client"); $mesg = $ldap->bind($MANAGERDN, password => $PASSWD); ok(!$mesg->code, "bind: " . $mesg->code . ": " . $mesg->error); ok(ldif_populate($ldap, "data/41-in.ldif"), "data/41-in.ldif"); my $ua = LWP::UserAgent->new; my $res; # now search the database $res = $ua->get("ldap://${HOST}:$PORT/$BASEDN??sub?sn=jensen"); ok($res->content =~ /2 Matches found/); my $expect = <<'LDIF'; version: 1 dn: cn=Barbara Jensen,ou=Information Technology Division,ou=People,o=Universit y of Michigan,c=US objectClass: OpenLDAPperson cn: Barbara Jensen cn: Babs Jensen uid: babs sn: Jensen title: Mythical Manager, Research Systems postalAddress: ITD Prod Dev & Deployment $ 535 W. William St. Room 4212 $ Ann Arbor, MI 48103-4943 seeAlso: cn=All Staff,ou=Groups,o=University of Michigan,c=US userPassword: bjensen mail: bjensen@mailgw.umich.edu homePostalAddress: 123 Wesley $ Ann Arbor, MI 48103 description: Mythical manager of the rsdd unix project drink: water homePhone: +1 313 555 2333 pager: +1 313 555 3233 facsimileTelephoneNumber: +1 313 555 2274 telephoneNumber: +1 313 555 9022 dn: cn=Bjorn Jensen,ou=Information Technology Division,ou=People,o=University of Michigan,c=US objectClass: OpenLDAPperson cn: Bjorn Jensen cn: Biiff Jensen uid: bjorn sn: Jensen seeAlso: cn=All Staff,ou=Groups,o=University of Michigan,c=US userPassword: bjorn homePostalAddress: 19923 Seven Mile Rd. $ South Lyon, MI 49999 drink: Iced Tea description: Hiker, biker title: Director, Embedded Systems postalAddress: Info Tech Division $ 535 W. William St. $ Ann Arbor, MI 48103 mail: bjorn@mailgw.umich.edu homePhone: +1 313 555 5444 pager: +1 313 555 4474 facsimileTelephoneNumber: +1 313 555 2177 telephoneNumber: +1 313 555 0355 LDIF $res = $ua->get("ldap://${HOST}:$PORT/$BASEDN??sub?(sn=jensen)", Accept => 'text/ldif'); is($res->content,$expect,'ldif result'); $res = $ua->get("ldap://${HOST}:$PORT/$BASEDN??sub?(sn=jensen)?x-format=ldif"); is($res->content,$expect,'ldif result'); } __END__ # Exact searching $mesg = $ldap->search(base => $BASEDN, filter => 'sn=jensen'); compare_ldif("41a",$mesg,$mesg->sorted); # Or searching $mesg = $ldap->search(base => $BASEDN, filter => '(|(objectclass=groupofnames)(sn=jones))'); compare_ldif("41b",$mesg,$mesg->sorted); # And searching $mesg = $ldap->search(base => $BASEDN, filter => '(&(objectclass=groupofnames)(cn=A*))'); compare_ldif("41c",$mesg,$mesg->sorted); # Not searching $mesg = $ldap->search(base => $BASEDN, filter => '(!(objectclass=person))'); compare_ldif("41d",$mesg,$mesg->sorted); perl-ldap-0.58/t/01canon_dn.t0000644000175000000620000001142612255343661015367 0ustar marschapstaff#!perl use Test::More; use Net::LDAP::Util qw(canonical_dn); # Each line has an opcode and a DN, opcode are # bad cacnonical_dn should return undef # ref Set new reference DN # same Should be the same as the current refdn # diff Should be different to the current refdn my @tests = map { /^(\w+)\s+(.*)/ } ; plan tests => scalar(@tests) >> 1; my $refdn; while(my($op,$dn) = splice(@tests,0,2)) { my $canon = canonical_dn($dn); my $failed = 0; if ($op eq 'ref') { $refdn=$dn; if ($failed = !defined $canon) { print "'$dn' should have parsed\n"; } } elsif ($op eq 'bad') { if ($failed = defined $canon) { print "'$dn' should not have parsed\n '$canon'\n"; } } elsif ( $op eq 'same' ) { if ($failed = !defined $canon) { print "'$dn' failed to parse\n"; } elsif ($failed = $canon ne $refdn) { print "'$refdn'\n\ndid not match\n\n from '$dn'\n got '$canon'\n"; } } elsif ($op eq 'diff' ) { if ($failed = !defined $canon) { print "'$dn' failed to parse\n"; } elsif ($failed = $canon eq $refdn) { print "'$refdn'\n\nmatched\n\n'$dn'\n'$canon'\n"; } } else { $failed = 1; warn "Bad opcode $op\n"; } ok(!$failed, "$dn is " . (($op eq 'bad') ? 'illegal' : 'legal')); } __DATA__ bad OU=Sales+CN=J. Smith,O=Widget Inc.,C=US, ref CN=J. Smith+OU=Sales,O=Widget Inc.,C=US same ou=Sales+cn=J. Smith,O=Widget Inc.,C=US same cn=J. Smith+ou=Sales,O=Widget Inc.,C=US same cn=J.\20Smith+ou=Sales,O=Widget\20Inc.,C=US same OU=Sales+CN=J. Smith;O=Widget Inc.;C=US same OU=Sales + CN=J. Smith,O=Widget Inc.,C=US same OU=Sales+CN=J. Smith , O=Widget Inc. , C=US same OU = Sales+CN =J. Smith,O= Widget Inc.,C=US same OU="Sales"+CN=J. Smith,O=Widget Inc.,C=US diff OU="Sales+CN=J. Smith",O=Widget Inc.,C=US ref cn=J.\20Smith\+ou=Sales,O=Widget\20Inc.,C=US ref cn=Clerk #1\+ou=Sales,O=Widget\20Inc.,C=US ref CN=Babs Jensen,O=Widget Inc.,C=US same cn=Babs Jensen,o=Widget Inc.,c=US # This is here to test a restriction that # canonical_dn does not decode BER encoded values ref 1.3.6.1.4.1.1466.0=#04024869,O=Test,C=GB same 1.3.6.1.4.1.1466.0=#04024869,O=Test,C=GB diff 1.3.6.1.4.1.1466.0=\04\02Hi,O=Test,C=GB ref 1.3.6.1.4.1.1466.0=Hi,O=Test,C=GB same oid.1.3.6.1.4.1.1466.0=Hi,O=Test,C=GB same OID.1.3.6.1.4.1.1466.0=Hi,O=Test,C=GB ref CN=Clif Harden+IDNUMBER=a0125589\20,OU=tiPerson,OU=person,O=ti,C=us diff cn=Clif Harden+IDNumber=a0125589,ou=tiPerson,ou=person,o=ti,c=us same cn=Clif Harden+IDNumber=a0125589\ ,ou=tiPerson,ou=person,o=ti,c=us same cn=Clif Harden+IDNumber=a0125589\20 ,ou=tiPerson,ou=person,o=ti,c=us same cn=Clif Harden+IDNumber="a0125589 ",ou=tiPerson,ou=person,o=ti,c=us ref CN=\20\20Graham Barr\20\20,OU=person,O=vc,C=us same Cn=" Graham Barr ",OU=person,O=vc,C=us same cn=" Graham \20Barr\20 ",OU=person,O=vc,C=us # empty ref ref UID=jsmith,DC=example,DC=net same UID=jsmith,DC=example,DC=net ref CN=J. Smith+OU=Sales,DC=example,DC=net same OU=Sales+CN=J. Smith,DC=example,DC=net ref CN=John Smith\2c III,DC=example,DC=net same CN=John Smith\, III,DC=example,DC=net same CN=John Smith\2C III,DC=example,DC=net ref CN=Before\0dAfter,DC=example,DC=net same CN=Before\0dAfter,DC=example,DC=net ref CN=\23John Smith\20,DC=example,DC=net same CN=\23John Smith\20,DC=example,DC=net same CN=\#John Smith\ ,DC=example,DC=net ref 1.3.6.1.4.1.1466.0=#04024869,DC=example,DC=com same 1.3.6.1.4.1.1466.0=#04024869,DC=example,DC=com ref CN=LuÄić same CN=Lu\C4\8Di\C4\87 # empty value ref 1.1.1= # option bad uid;x-option=jsmith # invalid attribute type name bad at_tr=jsmith # invalid attribute type name bad -attr=jsmith # invalid attribute type name #bad OID.1.1=jsmith # invalid numeric OID bad 1..1=jsmith # invalid numeric OID bad 1.1.=jsmith # invalid numeric OID #bad 01.1=jsmith # invalid numeric OID bad 1.ff=jsmith # invalid HEX form bad 1.1.1=#GG # invalid HEX form bad 1.1.1=#000 # invalid HEX form bad 1.1.1=#F # invalid HEX form bad 1.1.1=# # spaces #bad UID=jsmith, DC=example, DC=net # extra comma bad UID=jsmith,,DC=example,DC=net # semi-colons #bad UID=jsmith;DC=example;DC=net # quotes #bad CN="John Smith",DC=example,DC=net # brackets bad # unescaped , bad UID=john,smith # unescaped + bad UID=john+smith # invalid escape of ? or unescaped \ bad UID=john\?smith # invalid hex escape bad UID=john\Fsmith # invalid hex escape bad UID=john\GGsmith ref CN=John Smith \2c III,DC=example,DC=net same CN=John Smith \, III,DC=example,DC=net same CN=John Smith \2C III,DC=example,DC=net ref DISTINGUISHEDNAMETABLEKEY=cn\3dDSA\2c c\3dGB,CN=bilateral table,CN=DSA,C=US same distinguishedNameTableKey=cn\=DSA\, c\=GB, cn=bilateral table, cn=DSA, c=US # RT 51165 ref CN=tester\2c karl,OU=test,DC=example,DC=com same cn=tester\, karl,ou=test,dc=example,dc=com perl-ldap-0.58/t/05dsml.t0000644000175000000620000000214712173014262014542 0ustar marschapstaff#!perl use Test::More; use File::Compare qw(compare_text); BEGIN { require "t/common.pl" } (eval { require XML::SAX::Base } && eval { require XML::SAX::Writer }) ? plan tests => 1 : plan skip_all => 'XML::SAX::Base and XML::SAX::Writer need to be installed'; require Net::LDAP::LDIF; require Net::LDAP::DSML; my $infile = "data/00-in.ldif"; my $outfile1 = "$TEMPDIR/05-out1.dsml"; my $cmpfile1 = "data/05-cmp.dsml"; my $ldif = Net::LDAP::LDIF->new($infile,"r"); @entry = $ldif->read; open(FH,">$outfile1"); binmode FH; my $dsml = Net::LDAP::DSML->new(output => \*FH,pretty_print => 1); $dsml->write_entry($_) for @entry; $dsml->end_dsml; close(FH); # postprocess generated DSML file for more flexible comparison # (don't rely on unpatched XML::SAX::Writer [e.g. Debian]) { open(FH, "+<$outfile1"); binmode FH; local $/; # slurp mode my $txt = ; $txt =~ s/>\n[\n\t ]+/>\n/g; # remove empty lines & leading spaces after tags $txt =~ s/\"/'/g; # convert " to ' in tag attribute values seek(FH, 0, 0); print FH $txt; truncate(FH, length($txt)); close(FH); } ok(!compare_text($cmpfile1,$outfile1), $cmpfile1); perl-ldap-0.58/t/40connect.t0000644000175000000620000000120712173014262015227 0ustar marschapstaff#!perl use Test::More; BEGIN { require "t/common.pl" } start_server() ? plan tests => 3 : plan skip_all => 'no server'; $ldap = client(); ok($ldap, 'client with IPv4/IPv6 auto-selection' . ($ldap ? (', bound to ' . $ldap->{net_ldap_socket}->peerhost) : '')); $ldap = client(inet4 => 1); ok($ldap, 'client with IPv4' . ($ldap ? (', bound to ' . $ldap->{net_ldap_socket}->peerhost) : '')); SKIP: { skip('IO::Socket::INET6 not installed', 1) unless (eval { require IO::Socket::INET6; }); $ldap = client(inet6 => 1); ok($ldap, 'client with IPv6' . ($ldap ? (', bound to ' . $ldap->{net_ldap_socket}->peerhost) : '')); } perl-ldap-0.58/t/common.pl0000644000175000000620000001240512173014262015074 0ustar marschapstaffBEGIN { foreach (qw(my.cfg test.cfg)) { -f and require "$_" and last; } undef $SERVER_EXE unless $SERVER_EXE and -x $SERVER_EXE; # fallback for the host to connect - needs to support IPv4 & IPv6 $HOST ||= 'localhost'; # Where to put temporary files while testing # the Makefile is setup to delete temp/ when make clean is run $TEMPDIR = "./temp"; $SLAPD_SCHEMA_DIR ||= "./data"; $SLAPD_DB ||= 'bdb'; $SLAPD_MODULE_DIR ||= ''; $TESTDB = "$TEMPDIR/test-db"; $CONF = "$TEMPDIR/conf"; $PASSWD = 'secret'; $BASEDN = "o=University of Michigan, c=US"; $MANAGERDN= "cn=Manager, o=University of Michigan, c=US"; $JAJDN = "cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US"; $BABSDN = "cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US"; $PORT = 9009; @URL = (); my @server_opts; ($SERVER_TYPE,@server_opts) = split(/\+/, $SERVER_TYPE || 'none'); if ($SERVER_TYPE =~ /^openldap$/i) { $CONF_IN = "./data/slapd.conf.in"; $CONF = "$TEMPDIR/slapd.conf"; $SSL_PORT = 9010 if grep /^ssl$/i, @server_opts and eval { require IO::Socket::SSL; 1}; ($IPC_SOCK = "$TEMPDIR/ldapi_sock") =~ s,/,%2f,g if grep /^ipc$/i, @server_opts; $SASL = 1 if grep /^sasl$/i, @server_opts and eval { require Authen::SASL; 1 }; push @URL, "ldap://${HOST}:$PORT/"; push @URL, "ldaps://${HOST}:$SSL_PORT/" if $SSL_PORT; push @URL, "ldapi://$IPC_SOCK/" if $IPC_SOCK; @LDAPD = ($SERVER_EXE, '-f', $CONF, '-h', "@URL", qw(-d 1)); } $LDAP_VERSION ||= 3; mkdir($TEMPDIR,0777); die "$TEMPDIR is not a directory" unless -d $TEMPDIR; } use Test::More; use Net::LDAP; use Net::LDAP::LDIF; use Net::LDAP::Util qw(canonical_dn); use File::Path qw(rmtree); use File::Basename qw(basename); use File::Compare qw(compare_text); my $pid; sub start_server { my %arg = (version => 3, @_); return 0 unless ($LDAP_VERSION >= $arg{version} and $LDAPD[0] and -x $LDAPD[0] and (!$arg{ssl} or $SSL_PORT) and (!$arg{ipc} or $IPC_SOCK)); if ($CONF_IN and -f $CONF_IN) { # Create slapd config file open(CONFI, "<$CONF_IN") or die "$!"; open(CONFO, ">$CONF") or die "$!"; while() { # this will choke if a variable is not defined s/\$([A-Z]\w*)/${$1}/g; s/^TLS/#TLS/ unless $SSL_PORT; s/^(sasl.*)/#$1/ unless $SASL; s/^#module/module/ if $SLAPD_MODULE_DIR; print CONFO; } close(CONFI); close(CONFO); } rmtree($TESTDB) if ( -d $TESTDB ); mkdir($TESTDB, 0777); die "$TESTDB is not a directory" unless -d $TESTDB; note("@LDAPD") if $ENV{TEST_VERBOSE}; my $log = $TEMPDIR . "/" . basename($0,'.t'); unless ($pid = fork) { die "fork: $!" unless defined $pid; open(STDERR, ">$log"); open(STDOUT, ">&STDERR"); close(STDIN); exec(@LDAPD) or die "cannot exec @LDAPD"; } sleep 2; # wait for server to start return 1; } sub kill_server { if ($pid) { kill 9, $pid; sleep 2; undef $pid; } } END { kill_server(); } sub client { my %arg = @_; my $ldap; my $count; local $^W = 0; my %opt = map { $_ => $arg{$_} } grep { exists($arg{$_}) } qw/inet4 inet6 debug/; if ($arg{ssl}) { require Net::LDAPS; until($ldap = Net::LDAPS->new($HOST, %opt, port => $SSL_PORT, version => 3)) { die "ldaps://$HOST:$SSL_PORT/ $@" if ++$count > 10; sleep 1; } } elsif ($arg{ipc}) { require Net::LDAPI; until($ldap = Net::LDAPI->new($IPC_SOCK)) { die "ldapi://$IPC_SOCK/ $@" if ++$count > 10; sleep 1; } } elsif ($arg{url}) { print "Trying $arg{url}\n"; until($ldap = Net::LDAP->new($arg{url}, %opt)) { die "$arg{url} $@" if ++$count > 10; sleep 1; } } else { until($ldap = Net::LDAP->new($HOST, %opt, port => $PORT, version => $LDAP_VERSION)) { die "ldap://$HOST:$PORT/ $@" if ++$count > 10; sleep 1; } } $ldap; } sub compare_ldif { my($test,$mesg) = splice(@_,0,2); unless (ok(!$mesg->code, $mesg->error)) { skip($mesg->error, 2); return; } my $ldif = Net::LDAP::LDIF->new("$TEMPDIR/${test}-out.ldif","w", lowercase => 1); unless (ok($ldif, "Read ${test}-out.ldif")) { skip("Read error", 1); return; } my @canon_opt = (casefold => 'lower', separator => ', '); foreach $entry (@_) { $entry->dn(canonical_dn($entry->dn, @canon_opt)); foreach $attr ($entry->attributes) { $entry->delete($attr) if $attr =~ /^(modifiersname|modifytimestamp|creatorsname|createtimestamp)$/i; if ($attr =~ /^(seealso|member|owner)$/i) { $entry->replace($attr => [ map { canonical_dn($_, @canon_opt) } $entry->get_value($attr) ]); } } $ldif->write($entry); } $ldif->done; # close the file; ok(!compare_text("$TEMPDIR/${test}-out.ldif", "data/${test}-cmp.ldif"), "data/${test}-cmp.ldif"); } sub ldif_populate { my ($ldap, $file, $change) = @_; my $ok = 1; my $ldif = Net::LDAP::LDIF->new($file,"r", changetype => $change || 'add') or return; while (my $e = $ldif->read_entry) { $mesg = $e->update($ldap); if ($mesg->code) { $ok = 0; Net::LDAP::LDIF->new(qw(- w))->write_entry($e); print "# ",$mesg->code,": ",$mesg->error,"\n"; } } $ok; } 1; perl-ldap-0.58/t/06constant.t0000644000175000000620000000401512173014262015431 0ustar marschapstaff#!perl -w use Test::More; BEGIN { for (1,2) { require Net::LDAP::Constant; } } use Net::LDAP::Util qw(ldap_error_name);; my @constant = qw( LDAP_SUCCESS LDAP_OPERATIONS_ERROR LDAP_PROTOCOL_ERROR LDAP_TIMELIMIT_EXCEEDED LDAP_SIZELIMIT_EXCEEDED LDAP_COMPARE_FALSE LDAP_COMPARE_TRUE LDAP_STRONG_AUTH_NOT_SUPPORTED LDAP_STRONG_AUTH_REQUIRED LDAP_PARTIAL_RESULTS LDAP_REFERRAL LDAP_ADMIN_LIMIT_EXCEEDED LDAP_UNAVAILABLE_CRITICAL_EXT LDAP_CONFIDENTIALITY_REQUIRED LDAP_SASL_BIND_IN_PROGRESS 15 LDAP_NO_SUCH_ATTRIBUTE LDAP_UNDEFINED_TYPE LDAP_INAPPROPRIATE_MATCHING LDAP_CONSTRAINT_VIOLATION LDAP_TYPE_OR_VALUE_EXISTS LDAP_INVALID_SYNTAX 22 23 24 25 26 27 28 29 30 31 LDAP_NO_SUCH_OBJECT LDAP_ALIAS_PROBLEM LDAP_INVALID_DN_SYNTAX LDAP_IS_LEAF LDAP_ALIAS_DEREF_PROBLEM 37 38 39 40 41 42 43 44 45 46 LDAP_PROXY_AUTHZ_FAILURE LDAP_INAPPROPRIATE_AUTH LDAP_INVALID_CREDENTIALS LDAP_INSUFFICIENT_ACCESS LDAP_BUSY LDAP_UNAVAILABLE LDAP_UNWILLING_TO_PERFORM LDAP_LOOP_DETECT 55 56 57 58 59 LDAP_SORT_CONTROL_MISSING LDAP_INDEX_RANGE_ERROR 62 63 LDAP_NAMING_VIOLATION LDAP_OBJECT_CLASS_VIOLATION LDAP_NOT_ALLOWED_ON_NONLEAF LDAP_NOT_ALLOWED_ON_RDN LDAP_ALREADY_EXISTS LDAP_NO_OBJECT_CLASS_MODS LDAP_RESULTS_TOO_LARGE LDAP_AFFECTS_MULTIPLE_DSAS 72 73 74 75 LDAP_VLV_ERROR 77 78 79 LDAP_OTHER LDAP_SERVER_DOWN LDAP_LOCAL_ERROR LDAP_ENCODING_ERROR LDAP_DECODING_ERROR LDAP_TIMEOUT LDAP_AUTH_UNKNOWN LDAP_FILTER_ERROR LDAP_USER_CANCELED LDAP_PARAM_ERROR LDAP_NO_MEMORY LDAP_CONNECT_ERROR LDAP_NOT_SUPPORTED LDAP_CONTROL_NOT_FOUND LDAP_NO_RESULTS_RETURNED LDAP_MORE_RESULTS_TO_RETURN LDAP_CLIENT_LOOP LDAP_REFERRAL_LIMIT_EXCEEDED ); plan tests => scalar(@constant); my $i = 0; while (my $const = $constant[$i]) { my $name = ldap_error_name($i); $const = sprintf("LDAP error code %d(0x%02X)",$i,$i) unless $const =~ /\D/; ok($name && $name eq $const, "$const"); ++$i; } perl-ldap-0.58/t/46ssl.t0000644000175000000620000000230112173014262014401 0ustar marschapstaff#!perl use Test::More; BEGIN { require "t/common.pl" } start_server(version => 3, ssl => 1) ? plan tests => 15 : plan skip_all => 'no server'; SKIP: { skip('IO::Socket::SSL not installed', 15) unless (eval { require IO::Socket::SSL; } ); $ldap = client(); ok($ldap, "client"); $mesg = $ldap->bind($MANAGERDN, password => $PASSWD, version => 3); ok(!$mesg->code, "bind: " . $mesg->code . ": " . $mesg->error); ok(ldif_populate($ldap, "data/40-in.ldif"), "data/40-in.ldif"); $mesg = $ldap->start_tls; ok(!$mesg->code, "start_tls: " . $mesg->code . ": " . $mesg->error); $mesg = $ldap->start_tls; ok($mesg->code, "start_tls: " . $mesg->code . ": " . $mesg->error); $mesg = $ldap->search(base => $BASEDN, filter => 'objectclass=*'); ok(!$mesg->code, "search: " . $mesg->code . ": " . $mesg->error); compare_ldif("40",$mesg,$mesg->sorted); $ldap = client(ssl => 1); ok($ldap, "ssl client"); $mesg = $ldap->start_tls; ok($mesg->code, "start_tls: " . $mesg->code . ": " . $mesg->error); $mesg = $ldap->search(base => $BASEDN, filter => 'objectclass=*'); ok(!$mesg->code, "search: " . $mesg->code . ": " . $mesg->error); compare_ldif("40",$mesg,$mesg->sorted); } perl-ldap-0.58/t/48url.t0000644000175000000620000000145412173014262014414 0ustar marschapstaff#!perl use Test::More; BEGIN { require "t/common.pl" } start_server() ? plan tests => scalar(@URL) * 5 + 7 : plan skip_all => 'no server'; $ldap = client(); ok($ldap, "client"); $mesg = $ldap->bind($MANAGERDN, password => $PASSWD); ok(!$mesg->code, "bind: " . $mesg->code . ": " . $mesg->error); ok(ldif_populate($ldap, "data/40-in.ldif"), "data/40-in.ldif"); $mesg = $ldap->search(base => $BASEDN, filter => 'objectclass=*'); ok(!$mesg->code, "search: " . $mesg->code . ": " . $mesg->error); compare_ldif("40", $mesg, $mesg->sorted); for my $url (@URL) { $ldap = client(url => $url); ok($ldap, "$url client"); $mesg = $ldap->search(base => $BASEDN, filter => 'objectclass=*'); ok(!$mesg->code, "search: " . $mesg->code . ": " . $mesg->error); compare_ldif("40", $mesg, $mesg->sorted); } perl-ldap-0.58/t/42search.t0000644000175000000620000000165012173014262015047 0ustar marschapstaff#!perl use Test::More; BEGIN { require "t/common.pl" } start_server() ? plan tests => 15 : plan skip_all => 'no server'; $ldap = client(); ok($ldap, "client"); $mesg = $ldap->bind($MANAGERDN, password => $PASSWD); ok(!$mesg->code, "bind: " . $mesg->code . ": " . $mesg->error); ok(ldif_populate($ldap, "data/41-in.ldif"), "data/41-in.ldif"); # now search the database # Exact searching $mesg = $ldap->search(base => $BASEDN, filter => 'sn=jensen'); compare_ldif("41a",$mesg,$mesg->sorted); # Or searching $mesg = $ldap->search(base => $BASEDN, filter => '(|(objectclass=groupofnames)(sn=jones))'); compare_ldif("41b",$mesg,$mesg->sorted); # And searching $mesg = $ldap->search(base => $BASEDN, filter => '(&(objectclass=groupofnames)(cn=A*))'); compare_ldif("41c",$mesg,$mesg->sorted); # Not searching $mesg = $ldap->search(base => $BASEDN, filter => '(!(objectclass=person))'); compare_ldif("41d",$mesg,$mesg->sorted); perl-ldap-0.58/t/45dse.t0000644000175000000620000000067112173014262014362 0ustar marschapstaff#!perl use Test::More; BEGIN { require "t/common.pl" } start_server(version => 3) ? plan tests => 4 : plan skip_all => 'no server'; $ldap = client(); ok($ldap, "client"); $dse = $ldap->root_dse; ok($dse, "dse"); $dse->dump if $dse and $ENV{TEST_VERBOSE}; my @extn = $dse->get_value('supportedExtension'); ok($dse->supported_extension(@extn), 'supported_extension'); ok(!$dse->supported_extension('foobar'), 'extension foobar'); perl-ldap-0.58/t/73assert.t0000644000175000000620000001367412173014262015120 0ustar marschapstaff#!perl use Test::More; use Net::LDAP; use Net::LDAP::Constant qw(LDAP_CONTROL_ASSERTION); use Net::LDAP::Control::Assertion; BEGIN { require "t/common.pl" } my @tests; { # parse DATA into a list (= tests) of hashes (= test parameters) of lists (= parameter values) local $/ = ''; while(my $para = ) { my @lines = split(/\n/, $para); my %params; chomp(@lines); @lines = grep(!/^\s*(?:#.*?)?$/, @lines); map { push(@{$params{$1}}, $2) if (/^(\w+):\s*(.*)$/) } @lines; push(@tests, \%params) if (%params); } } start_server() ? plan tests => 4 + 2 * scalar(@tests) : plan skip_all => 'no server'; $ldap = client(); isa_ok($ldap, Net::LDAP, "client"); $rootdse = $ldap->root_dse; isa_ok($rootdse, Net::LDAP::RootDSE, "root_dse"); SKIP: { skip("RootDSE does not offer Assertion control", 2 + 2 * scalar(@tests)) unless($rootdse->supported_control(LDAP_CONTROL_ASSERTION)); #$mesg = $ldap->start_tls; #ok(!$mesg->code, "start_tls: " . $mesg->code . ": " . $mesg->error); $mesg = $ldap->bind($MANAGERDN, password => $PASSWD); ok(!$mesg->code, "bind: " . $mesg->code . ": " . $mesg->error); ok(ldif_populate($ldap, "data/40-in.ldif"), "data/40-in.ldif"); foreach my $test (@tests) { $control = Net::LDAP::Control::Assertion->new(assertion => $test->{assertion}->[0]); isa_ok($control, Net::LDAP::Control::Assertion, "control object"); if ($test->{action}->[0] eq 'search') { $mesg = $ldap->search(base => $test->{dn}->[0], filter => $test->{filter} ? $test->{filter}->[0] : '(objectclass=*)', scope => $test->{scope} ? $test->{scope}->[0] : 'sub', control => $control); is($mesg->code, $test->{code}->[0] || 0, ($test->{code}->[0] ? "search [expecting ".$test->{code}->[0]."]: " : "search: ") . $mesg->code . ": " . $mesg->error); } elsif ($test->{action}->[0] eq 'compare') { $mesg = $ldap->compare($test->{dn}->[0], attr => $test->{attr}->[0], value => $test->{value}->[0], control => $control); is($mesg->code, $test->{code}->[0] || 6, ($test->{code}->[0] ? "compare [expecting ".$test->{code}->[0]."]: " : "search: ") . $mesg->code . ": " . $mesg->error); } elsif ($test->{action}->[0] eq 'modify') { $mesg = $ldap->modify($test->{dn}->[0], $test->{changetype}->[0] => { map { $_ => $test->{$_} } @{$test->{attrs}} }, control => $control); is($mesg->code, $test->{code}->[0] || 0, ($test->{code}->[0] ? "modify [expecting ".$test->{code}->[0]."]: " : "modify: ") . $mesg->code . ": " . $mesg->error); } elsif ($test->{action}->[0] eq 'moddn') { my %sup = $test->{newsuperior} ? ( newsuperior => $test->{newsuperior}->[0] ) : (); $mesg = $ldap->moddn($test->{dn}->[0], newrdn => $test->{newrdn}->[0], %sup, control => $control); is($mesg->code, $test->{code}->[0] || 0, ($test->{code}->[0] ? "moddn [expecting ".$test->{code}->[0]."]: " : "moddn: ") . $mesg->code . ": " . $mesg->error); } elsif ($test->{action}->[0] eq 'delete') { $mesg = $ldap->delete($test->{dn}->[0], control => $control); is($mesg->code, $test->{code}->[0] || 0, ($test->{code}->[0] ? "delete [expecting ".$test->{code}->[0]."]: " : "delete: ") . $mesg->code . ": " . $mesg->error); } else { ok(0, "illegal action"); note("test: ", explain($test)); } } } __DATA__ ## each section below represents one test; logic similar to , structure similar to LDIF # each tests needs at least the elements # - assertion: the assertion filter to use # - action: the action on which the assertion is to be tested # - dn: (base-)DN to use in the operation # - ...: all other elements depend on the operation [see above] # search (expect failing assertion) action: search dn: ou=People, o=University of Michigan, c=US filter: (cn=Babs Jensen) assertion: (title=Mythical Manager, Research Systems) code: 122 # search action: search dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US filter: (cn=Babs Jensen) assertion: (title=Mythical Manager, Research Systems) # modify action: modify dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US assertion: (title=MegaMythical Manager, Research Systems) changetype: replace attrs: title title: Uber-Mythical Manager, Research Systems title: Hyper-Mythical Manager, Research Systems code: 122 # modify action: modify dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US assertion: (title=Mythical Manager, Research Systems) changetype: replace attrs: title title: Uber-Mythical Manager, Research Systems title: Hyper-Mythical Manager, Research Systems # compare (expect failing assertion) action: compare dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US filter: (cn=Babs Jensen) assertion: (title=HyperMythical Manager, Research Systems) attr: sn value: Jensen code: 122 # compare action: compare dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US filter: (cn=Babs Jensen) assertion: (title=Hyper-Mythical Manager, Research Systems) attr: sn value: Jensen # moddn action: moddn dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US newrdn: cn=Babs Jensen assertion: (title=HyperMythical Manager, Research Systems) code: 122 # moddn action: moddn dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US newrdn: cn=Babs Jensen assertion: (title=Hyper-Mythical Manager, Research Systems) # delete action: delete dn: cn=Babs Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US assertion: (title=HyperMythical Manager, Research Systems) code: 122 # delete action: delete dn: cn=Babs Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US assertion: (title=Hyper-Mythical Manager, Research Systems) perl-ldap-0.58/t/00ldif-entry.t0000644000175000000620000001073412255400133015651 0ustar marschapstaff#!perl BEGIN { require "t/common.pl"; } use Test::More tests => 16; use File::Compare qw(compare_text); use Net::LDAP::LDIF; my $infile = "data/00-in.ldif"; my $outfile1 = "$TEMPDIR/00-out1.ldif"; my $outfile2 = "$TEMPDIR/00-out2.ldif"; my $cmpfile1 = "data/00-cmp.ldif"; my $cmpfile2 = $infile; my $ldif = Net::LDAP::LDIF->new($infile,"r"); my $entry0_ldif = <<'LDIF'; dn: o=University of Michigan, c=US objectclass: top objectclass: organization objectclass: domainRelatedObject objectclass: quipuObject objectclass: quipuNonLeafObject l: Ann Arbor, Michigan st: Michigan streetaddress: 535 West William St. o: University of Michigan o: UMICH o: UM o: U-M o: U of M description: The University of Michigan at Ann Arbor postaladdress: University of Michigan $ 535 W. William St. $ Ann Arbor, MI 481 09 $ USpostalcode: 48109 telephonenumber: +1 313 764-1817 lastmodifiedtime: 930106182800Z lastmodifiedby: cn=manager, o=university of michigan, c=US associateddomain: umich.edu LDIF my $e = $ldif->read_entry; my @lines = $ldif->current_lines; is(join("",@lines),$entry0_ldif,"ldif lines"); my @entry = ($e, $ldif->read); ok($ldif->version == 1, "version == 1"); Net::LDAP::LDIF->new($outfile1,"w")->write(@entry); Net::LDAP::LDIF->new($outfile2,"w", version => 1)->write(@entry); ok(!compare_text($cmpfile1,$outfile1), $cmpfile1); ok(!compare_text($cmpfile2,$outfile2), $cmpfile2); is($e->ldif, "\n$entry0_ldif", "ldif method"); is($e->ldif(change => 1), <<'LDIF', "ldif method"); dn: o=University of Michigan, c=US changetype: add objectclass: top objectclass: organization objectclass: domainRelatedObject objectclass: quipuObject objectclass: quipuNonLeafObject l: Ann Arbor, Michigan st: Michigan streetaddress: 535 West William St. o: University of Michigan o: UMICH o: UM o: U-M o: U of M description: The University of Michigan at Ann Arbor postaladdress: University of Michigan $ 535 W. William St. $ Ann Arbor, MI 481 09 $ USpostalcode: 48109 telephonenumber: +1 313 764-1817 lastmodifiedtime: 930106182800Z lastmodifiedby: cn=manager, o=university of michigan, c=US associateddomain: umich.edu LDIF $e->changetype('modify'); $e->delete('objectclass'); $e->delete('o',['UM']); $e->add('counting',[qw(one two three)]); $e->add('first',[qw(1 2 3)], 'second',[qw(a b c)]); $e->replace('telephonenumber' => ['911']); is($e->ldif, <<'LDIF',"changes ldif"); dn: o=University of Michigan, c=US changetype: modify delete: objectclass - delete: o o: UM - add: counting counting: one counting: two counting: three - add: first first: 1 first: 2 first: 3 - add: second second: a second: b second: c - replace: telephonenumber telephonenumber: 911 LDIF is($e->ldif(change => 0), <<'LDIF',"changes ldif"); dn: o=University of Michigan, c=US l: Ann Arbor, Michigan st: Michigan streetaddress: 535 West William St. o: University of Michigan o: UMICH o: U-M o: U of M description: The University of Michigan at Ann Arbor postaladdress: University of Michigan $ 535 W. William St. $ Ann Arbor, MI 481 09 $ USpostalcode: 48109 telephonenumber: 911 lastmodifiedtime: 930106182800Z lastmodifiedby: cn=manager, o=university of michigan, c=US associateddomain: umich.edu counting: one counting: two counting: three first: 1 first: 2 first: 3 second: a second: b second: c LDIF $outfile = "$TEMPDIR/00-out3.ldif"; $cmpfile = "data/00-cmp2.ldif"; $ldif = Net::LDAP::LDIF->new($outfile,"w"); $ldif->write($e); $ldif->write_cmd($e); $ldif->done; ok(!compare_text($cmpfile,$outfile), $cmpfile); $e->add('name' => 'Graham Barr'); $e->add('name;en-us' => 'Bob'); is(join(":",sort $e->attributes), "associateddomain:counting:description:first:l:lastmodifiedby:lastmodifiedtime:name:name;en-us:o:postaladdress:second:st:streetaddress:telephonenumber", 'attributes'); is(join(":",sort $e->attributes(nooptions => 1)), "associateddomain:counting:description:first:l:lastmodifiedby:lastmodifiedtime:name:o:postaladdress:second:st:streetaddress:telephonenumber", "attributes - nooptions"); $r = $e->get_value('name', asref => 1); ok(($r and @$r == 1 and $r->[0] eq 'Graham Barr'), "name eq Graham Barr"); $r = $e->get_value('name;en-us', asref => 1); ok(($r and @$r == 1 and $r->[0] eq 'Bob'), "name;en-us eq Bob"); $r = $e->get_value('name', alloptions => 1, asref => 1); ok(($r and join("*", sort keys %$r) eq "*;en-us"), "name keys"); ok(($r and $r->{''} and @{$r->{''}} == 1 and $r->{''}[0] eq 'Graham Barr'), "name alloptions"); ok(($r and $r->{';en-us'} and @{$r->{';en-us'}} == 1 and $r->{';en-us'}[0] eq 'Bob'), "name alloptions Bob"); perl-ldap-0.58/t/72postread.t0000644000175000000620000001066612173014262015435 0ustar marschapstaff#!perl use Test::More; use Net::LDAP; use Net::LDAP::Constant qw(LDAP_CONTROL_POSTREAD); use Net::LDAP::Control::PostRead; BEGIN { require "t/common.pl" } my @tests; { # parse DATA into a list (= tests) of hashes (= test parameters) of lists (= parameter values) local $/ = ''; while(my $para = ) { my @lines = split(/\n/, $para); my %params; chomp(@lines); @lines = grep(!/^\s*(?:#.*?)?$/, @lines); map { push(@{$params{$1}}, $2) if (/^(\w+):\s*(.*)$/) } @lines; push(@tests, \%params) if (%params); } } start_server() ? plan tests => 4 + 6 * scalar(@tests) : plan skip_all => 'no server'; $ldap = client(); isa_ok($ldap, Net::LDAP, "client"); $rootdse = $ldap->root_dse; isa_ok($rootdse, Net::LDAP::RootDSE, "root_dse"); SKIP: { skip("RootDSE does not offer PostRead control", 2 + 6 * scalar(@tests)) unless($rootdse->supported_control(LDAP_CONTROL_POSTREAD)); #$mesg = $ldap->start_tls(%tlsargs); #ok(!$mesg->code, "start_tls yields: ". $m->error); my $mesg = $ldap->bind($MANAGERDN, password => $PASSWD); ok(!$mesg->code, "bind: " . $mesg->code . ": " . $mesg->error); ok(ldif_populate($ldap, "data/40-in.ldif"), "data/40-in.ldif"); foreach my $test (@tests) { my $entry = Net::LDAP::Entry->new(@{$test->{dn}} ? $test->{dn}[0] : ''); my $control = Net::LDAP::Control::PostRead->new(attrs => $test->{attrs}); isa_ok($control, Net::LDAP::Control::PostRead, "control object"); $entry->changetype('modify'); foreach my $attr (@{$test->{attrs}}) { $entry->replace($attr => $test->{$attr} || []); } $mesg = $entry->update($ldap, control => $control); ok(!$mesg->code, "modify: " . $mesg->code . ": " . $mesg->error); my ($previous) = $mesg->control( LDAP_CONTROL_POSTREAD ); isa_ok($control, Net::LDAP::Control::PostRead, "response object"); $entry = $previous->entry(); isa_ok($entry, Net::LDAP::Entry, "entry object"); my $postreadValue = join(':', map { sort $entry->get_value($_) } @{$test->{attrs}}); $mesg = $ldap->search(base => @{$test->{dn}} ? $test->{dn}[0] : '', filter => '(objectclass=*)', scope => 'base', attrs => $test->{attrs}); ok(!$mesg->code, "search: ". $mesg->code . ": " . $mesg->error); $entry = $mesg->entry(0); my $origValue = join(':', map { sort $entry->get_value($_) } @{$test->{attrs}}); is($postreadValue, $origValue, "value in PostRead control matches"); } } __DATA__ ## each section below represents one test; logic similar to , structure similar to LDIF # each tests needs at least the elements # - dn: the object to modify/perform the test on # - attrs: the attributes to change and use in PostRead control # - $attr: optional - the new values (if any) for the attribute $attr # one attribute: replace a single value with another one dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US attrs: title title: HyperMythical Manager, Research Systems # one attribute: replace a single value attribute with multiple values dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US attrs: title title: Uber-Mythical Manager, Research Systems title: Cyber-Mythical Manager, Research Systems # one attribute: delete all values dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US attrs: title # multiple attribute: replace some values dn: cn=All Staff,ou=Groups,o=University of Michigan,c=US attrs: member attrs: description member: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US member: cn=Jane Doe, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=John Doe, ou=Information Technology Division, ou=People, o=University of Michigan, c=US member: cn=Mark Elliot, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=James A Jones 1, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Ursula Hampster, ou=Alumni Association, ou=People, o=University of Michigan, c=US member: cn=Bjorn Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US description: Some of the sample data # multiple attribute: delete one, update the other dn: cn=All Staff,ou=Groups,o=University of Michigan,c=US attrs: member attrs: description member: cn=Manager, o=University of Michigan, c=US perl-ldap-0.58/t/70sortctrl.t0000644000175000000620000000601212173014262015454 0ustar marschapstaff#!perl # # The attribute given must have unique values over the entries # returned from the search. This is because this test checks # that the order of entries returned by 'attr' is the exact # opposite of '-attr' this is not guaranteed if two entries have # the same value for attr. use Test::More; BEGIN { require "t/common.pl" } use Net::LDAP::LDIF; use Net::LDAP::Control::Sort; use Net::LDAP::Constant qw( LDAP_CONTROL_SORTREQUEST LDAP_CONTROL_SORTRESULT LDAP_SUCCESS ); # @testcases is a list of ($order => $reversed) tuples my @testcases = ( [ 'cn:2.5.13.3' => '-cn:2.5.13.3' ] , [ 'sn:2.5.13.3 uid:2.5.13.3' => '-sn:2.5.13.3 -uid:2.5.13.3' ] ); start_server() ? plan tests => (4 + scalar(@testcases) * 9) : plan skip_all => 'no server'; $ldap = client(); isa_ok($ldap, Net::LDAP, "client"); $rootdse = $ldap->root_dse; isa_ok($rootdse, Net::LDAP::RootDSE, "root_dse"); SKIP: { skip("RootDSE does not offer sort control", 2 + scalar(@testcases) * 9) unless($rootdse->supported_control(LDAP_CONTROL_SORTREQUEST)); #$mesg = $ldap->start_tls; #ok(!$mesg->code, "start_tls: " . $mesg->code . ": " . $mesg->error); $mesg = $ldap->bind($MANAGERDN, password => $PASSWD); ok(!$mesg->code, "bind: " . $mesg->code . ": " . $mesg->error); ok(ldif_populate($ldap, "data/40-in.ldif"), "data/40-in.ldif"); foreach my $elem (@testcases) { my ($ordered,$reversed) = @{$elem}; my @attrs = map { s/:.*$//; $_ } split(/\s+/, $ordered); my $sort = Net::LDAP::Control::Sort->new(order => $ordered); isa_ok($sort, Net::LDAP::Control::Sort, "sort control object"); my $mesg = $ldap->search( base => $BASEDN, filter => '(objectclass=OpenLDAPperson)', control => [ $sort ], ); is($mesg->code, LDAP_SUCCESS, "search: " . $mesg->code . ": " . $mesg->error); my ($resp) = $mesg->control( LDAP_CONTROL_SORTRESULT ); ok($resp, 'LDAP_CONTROL_SORTRESULT response'); ok($resp && $resp->result == LDAP_SUCCESS , 'LDAP_CONTROL_SORTRESULT success'); if ($ENV{TEST_VERBOSE}) { my $rank = 0; foreach my $e ($mesg->entries) { note(++$rank, '. ', join(':', map { join(',',$e->get_value($_)) } @attrs)); } } my $dn1 = join ";", map { $_->dn } $mesg->entries; $sort = Net::LDAP::Control::Sort->new(order => $reversed); isa_ok($sort, Net::LDAP::Control::Sort, "sort control object (reversed)"); $mesg = $ldap->search( base => $BASEDN, filter => '(objectclass=OpenLDAPperson)', control => [ $sort ], ); is($mesg->code, LDAP_SUCCESS, 'search result'); ($resp) = $mesg->control( LDAP_CONTROL_SORTRESULT ); ok($resp, 'LDAP_CONTROL_SORTRESULT response'); ok($resp && $resp->result == LDAP_SUCCESS , 'LDAP_CONTROL_SORTRESULT success'); if ($ENV{TEST_VERBOSE}) { my $rank = 0; foreach my $e (reverse $mesg->entries) { note(++$rank,'. ',join(':', map { join(',',$e->get_value($_)) } @attrs)); } } my $dn2 = join ";", map { $_->dn } reverse $mesg->entries; is($dn1, $dn2, 'sort order'); } } perl-ldap-0.58/t/44schema.t0000644000175000000620000000054512173014262015046 0ustar marschapstaff#!perl use Test::More; BEGIN { require "t/common.pl" } start_server(version => 3) ? plan tests => 4 : plan skip_all => 'no server'; $ldap = client(); ok($ldap, "client"); $schema = $ldap->schema; ok($schema, "schema"); $ob = $schema->attribute('objectClass'); ok($ob, 'objectClass'); ok($ob->{syntax} eq '1.3.6.1.4.1.1466.115.121.1.38', 'syntax'); perl-ldap-0.58/t/02filter.t0000644000175000000620000004435612173014262015075 0ustar marschapstaff#!perl # Testcase contributed by Julian Onions use Test::More; use Net::LDAP::Filter; use Net::LDAP::ASN qw(Filter); use Convert::ASN1 qw(asn_dump); my $asn = $Filter; my @tests = do { local $/=""; }; plan tests => 4 * scalar(@tests); my $testno = 0; my $test; foreach $test (@tests) { my ($filter, $ber, $filter_out) = $test =~ /^ (?:\#.*\n)* (.*)\n ((?:[\da-fA-F]+:.*\n)+) (.*) /x or die "Cannot parse test\n$test\n"; $filter_out ||= $filter; my $binary = pack("H*", join("", map { /\w+/g } $ber =~ /:((?: [\dA-Fa-f]{2}){1,16})/g)); my $filt = new Net::LDAP::Filter $filter; isa_ok($filt, Net::LDAP::Filter, "$filter");; my $data = $asn->encode($filt); ok($data, "$filter ASN.1 encode(".($asn->error || 0).')'); is($data, $binary, "$filter asn_dump"); unless($data eq $binary) { note(explain($filt)) if ($ENV{TEST_VERBOSE}); print "got ", unpack("H*", $data), "\n"; asn_dump(\*STDOUT, $data); print "wanted ", unpack("H*", $binary), "\n"; asn_dump(\*STDOUT, $binary); } my $str = $filt->as_string; is($str, $filter_out, "$filter as_string"); } __DATA__ (objectclass=foo) 0000: A3 12 04 0B 6F 62 6A 65 63 74 63 6C 61 73 73 04 ....objectclass. 0010: 03 66 6F 6F __ __ __ __ __ __ __ __ __ __ __ __ .foo (objectclass=) 0000: A3 0F 04 0B 6F 62 6A 65 63 74 63 6C 61 73 73 04 ....objectclass. 0010: 00 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ . createTimestamp>=199701011200Z 0000: A5 20 04 0F 63 72 65 61 74 65 54 69 6D 65 73 74 . ..createTimest 0010: 61 6D 70 04 0D 31 39 39 37 30 31 30 31 31 32 30 amp..19970101120 0020: 30 5A __ __ __ __ __ __ __ __ __ __ __ __ __ __ 0Z (createTimestamp>=199701011200Z) createTimestamp<=199801011210Z 0000: A6 20 04 0F 63 72 65 61 74 65 54 69 6D 65 73 74 . ..createTimest 0010: 61 6D 70 04 0D 31 39 39 38 30 31 30 31 31 32 31 amp..19980101121 0020: 30 5A __ __ __ __ __ __ __ __ __ __ __ __ __ __ 0Z (createTimestamp<=199801011210Z) (cn=a*) 0000: A4 09 04 02 63 6E 30 03 80 01 61 __ __ __ __ __ ....cn0...a (cn=*a) 0000: A4 09 04 02 63 6E 30 03 82 01 61 __ __ __ __ __ ....cn0...a cn=*a* 0000: A4 09 04 02 63 6E 30 03 81 01 61 __ __ __ __ __ ....cn0...a (cn=*a*) (cn=*) 0000: 87 02 63 6E __ __ __ __ __ __ __ __ __ __ __ __ ..cn (cn~=foo) 0000: A8 09 04 02 63 6E 04 03 66 6F 6F __ __ __ __ __ ....cn..foo (cn=Babs Jensen) 0000: A3 11 04 02 63 6E 04 0B 42 61 62 73 20 4A 65 6E ....cn..Babs Jen 0010: 73 65 6E __ __ __ __ __ __ __ __ __ __ __ __ __ sen (!(cn=Tim Howes)) 0000: A2 11 A3 0F 04 02 63 6E 04 09 54 69 6D 20 48 6F ......cn..Tim Ho 0010: 77 65 73 __ __ __ __ __ __ __ __ __ __ __ __ __ wes !(cn=Tim Howes) 0000: A2 11 A3 0F 04 02 63 6E 04 09 54 69 6D 20 48 6F ......cn..Tim Ho 0010: 77 65 73 __ __ __ __ __ __ __ __ __ __ __ __ __ wes (!(cn=Tim Howes)) (&(objectClass=Person)(|(sn=Jensen)(cn=Babs J*))) 0000: A0 37 A3 15 04 0B 6F 62 6A 65 63 74 43 6C 61 73 .7....objectClas 0010: 73 04 06 50 65 72 73 6F 6E A1 1E A3 0C 04 02 73 s..Person......s 0020: 6E 04 06 4A 65 6E 73 65 6E A4 0E 04 02 63 6E 30 n..Jensen....cn0 0030: 08 80 06 42 61 62 73 20 4A __ __ __ __ __ __ __ ...Babs J (o=univ*of*mich*) 0000: A4 15 04 01 6F 30 10 80 04 75 6E 69 76 81 02 6F ....o0...univ..o 0010: 66 81 04 6D 69 63 68 __ __ __ __ __ __ __ __ __ f..mich (cn:1.2.3.4.5:=Fred Flintstone) 0000: A9 20 81 09 31 2E 32 2E 33 2E 34 2E 35 82 02 63 .#..1.2.3.4.5..c 0010: 6E 83 0F 46 72 65 64 20 46 6C 69 6E 74 73 74 6F n..Fred Flintsto 0020: 6E 65 __ __ __ __ __ __ __ __ __ __ __ __ __ __ ne (sn:dn:2.4.6.8.10:=Barney Rubble) 0000: A9 22 81 0A 32 2E 34 2E 36 2E 38 2E 31 30 82 02 ."..2.4.6.8.10.. 0010: 73 6E 83 0D 42 61 72 6E 65 79 20 52 75 62 62 6C sn..Barney Rubbl 0020: 65 84 01 FF __ __ __ __ __ __ __ __ __ __ __ __ e... (o:dn:=Ace Industry) 0000: A9 14 82 01 6F 83 0C 41 63 65 20 49 6E 64 75 73 ....o..Ace Indus 0010: 74 72 79 84 01 FF __ __ __ __ __ __ __ __ __ __ try... (:dn:2.4.6.8.10:=Dino) 0000: A9 15 81 0A 32 2E 34 2E 36 2E 38 2E 31 30 83 04 ....2.4.6.8.10.. 0010: 44 69 6E 6F 84 01 FF __ __ __ __ __ __ __ __ __ Dino... (o=univ*of*mich*an) 0000: A4 19 04 01 6F 30 14 80 04 75 6E 69 76 81 02 6F ....o0...univ..o 0010: 66 81 04 6D 69 63 68 82 02 61 6E __ __ __ __ __ f..mich..an (&(cn=fred)(!(objectclass=organization))) 0000: A0 2B A3 0A 04 02 63 6E 04 04 66 72 65 64 A2 1D .+....cn..fred.. 0010: A3 1B 04 0B 6F 62 6A 65 63 74 63 6C 61 73 73 04 ....objectclass. 0020: 0C 6F 72 67 61 6E 69 7A 61 74 69 6F 6E __ __ __ .organization (| (& (cn=test)) (| (cn=foo))) 0000: A1 1B A0 0C A3 0A 04 02 63 6E 04 04 74 65 73 74 ........cn..test 0010: A1 0B A3 09 04 02 63 6E 04 03 66 6F 6F __ __ __ ......cn..foo (|(&(cn=test))(|(cn=foo))) (| (cn=foo) (cn=test)) 0000: A1 17 A3 09 04 02 63 6E 04 03 66 6F 6F A3 0A 04 ......cn..foo... 0010: 02 63 6E 04 04 74 65 73 74 __ __ __ __ __ __ __ .cn..test (|(cn=foo)(cn=test)) (& (| (cn=test) (cn=foo) (sn=bar)) (| (c=GB) (c=AU))) 0000: A0 38 A1 22 A3 0A 04 02 63 6E 04 04 74 65 73 74 .8."....cn..test 0010: A3 09 04 02 63 6E 04 03 66 6F 6F A3 09 04 02 73 ....cn..foo....s 0020: 6E 04 03 62 61 72 A1 12 A3 07 04 01 63 04 02 47 n..bar......c..G 0030: 42 A3 07 04 01 63 04 02 41 55 __ __ __ __ __ __ B....c..AU (&(|(cn=test)(cn=foo)(sn=bar))(|(c=GB)(c=AU))) (| (& (c=GB) (cn=test)) (& (c=AU) (cn=test)) (& (c=GB) (cn=foo)) (& (c=AU) (cn=foo)) (& (c=GB) (sn=bar)) (& (c=AU) (sn=bar))) 0000: A1 81 86 A0 15 A3 07 04 01 63 04 02 47 42 A3 0A .........c..GB.. 0010: 04 02 63 6E 04 04 74 65 73 74 A0 15 A3 07 04 01 ..cn..test...... 0020: 63 04 02 41 55 A3 0A 04 02 63 6E 04 04 74 65 73 c..AU....cn..tes 0030: 74 A0 14 A3 07 04 01 63 04 02 47 42 A3 09 04 02 t......c..GB.... 0040: 63 6E 04 03 66 6F 6F A0 14 A3 07 04 01 63 04 02 cn..foo......c.. 0050: 41 55 A3 09 04 02 63 6E 04 03 66 6F 6F A0 14 A3 AU....cn..foo... 0060: 07 04 01 63 04 02 47 42 A3 09 04 02 73 6E 04 03 ...c..GB....sn.. 0070: 62 61 72 A0 14 A3 07 04 01 63 04 02 41 55 A3 09 bar......c..AU.. 0080: 04 02 73 6E 04 03 62 61 72 __ __ __ __ __ __ __ ..sn..bar (|(&(c=GB)(cn=test))(&(c=AU)(cn=test))(&(c=GB)(cn=foo))(&(c=AU)(cn=foo))(&(c=GB)(sn=bar))(&(c=AU)(sn=bar))) (& (| (cn=test) (cn=foo) (sn=bar)) (c=GB)) 0000: A0 2D A1 22 A3 0A 04 02 63 6E 04 04 74 65 73 74 .-."....cn..test 0010: A3 09 04 02 63 6E 04 03 66 6F 6F A3 09 04 02 73 ....cn..foo....s 0020: 6E 04 03 62 61 72 A3 07 04 01 63 04 02 47 42 __ n..bar....c..GB (&(|(cn=test)(cn=foo)(sn=bar))(c=GB)) (| (& (sn=bar) (c=GB)) (& (cn=foo) (c=GB)) (& (cn=test) (c=GB))) 0000: A1 43 A0 14 A3 09 04 02 73 6E 04 03 62 61 72 A3 .C......sn..bar. 0010: 07 04 01 63 04 02 47 42 A0 14 A3 09 04 02 63 6E ...c..GB......cn 0020: 04 03 66 6F 6F A3 07 04 01 63 04 02 47 42 A0 15 ..foo....c..GB.. 0030: A3 0A 04 02 63 6E 04 04 74 65 73 74 A3 07 04 01 ....cn..test.... 0040: 63 04 02 47 42 __ __ __ __ __ __ __ __ __ __ __ c..GB (|(&(sn=bar)(c=GB))(&(cn=foo)(c=GB))(&(cn=test)(c=GB))) (& (& (cn=foo) (| (cn=bar) (cn=xyz))) (& (cn=foo2) (| (cn=1) (cn=2)))) 0000: A0 47 A0 23 A3 09 04 02 63 6E 04 03 66 6F 6F A1 .G.#....cn..foo. 0010: 16 A3 09 04 02 63 6E 04 03 62 61 72 A3 09 04 02 .....cn..bar.... 0020: 63 6E 04 03 78 79 7A A0 20 A3 0A 04 02 63 6E 04 cn..xyz. ....cn. 0030: 04 66 6F 6F 32 A1 12 A3 07 04 02 63 6E 04 01 31 .foo2......cn..1 0040: A3 07 04 02 63 6E 04 01 32 __ __ __ __ __ __ __ ....cn..2 (&(&(cn=foo)(|(cn=bar)(cn=xyz)))(&(cn=foo2)(|(cn=1)(cn=2)))) (& (& (cn=foo) (! (cn=bar))) (| (cn=oof) (cn=foobie))) 0000: A0 35 A0 18 A3 09 04 02 63 6E 04 03 66 6F 6F A2 .5......cn..foo. 0010: 0B A3 09 04 02 63 6E 04 03 62 61 72 A1 19 A3 09 .....cn..bar.... 0020: 04 02 63 6E 04 03 6F 6F 66 A3 0C 04 02 63 6E 04 ..cn..oof....cn. 0030: 06 66 6F 6F 62 69 65 __ __ __ __ __ __ __ __ __ .foobie (&(&(cn=foo)(!(cn=bar)))(|(cn=oof)(cn=foobie))) (| (& (cn=foobie) (cn=foo) (! (cn=bar))) (& (cn=oof) (cn=foo) (! (cn=bar)))) 0000: A1 4D A0 26 A3 0C 04 02 63 6E 04 06 66 6F 6F 62 .M.&....cn..foob 0010: 69 65 A3 09 04 02 63 6E 04 03 66 6F 6F A2 0B A3 ie....cn..foo... 0020: 09 04 02 63 6E 04 03 62 61 72 A0 23 A3 09 04 02 ...cn..bar.#.... 0030: 63 6E 04 03 6F 6F 66 A3 09 04 02 63 6E 04 03 66 cn..oof....cn..f 0040: 6F 6F A2 0B A3 09 04 02 63 6E 04 03 62 61 72 __ oo......cn..bar (|(&(cn=foobie)(cn=foo)(!(cn=bar)))(&(cn=oof)(cn=foo)(!(cn=bar)))) (| (cn=foo) (cn=bar) (! (& (cn=a) (cn=b) (cn=c)))) 0000: A1 35 A3 09 04 02 63 6E 04 03 66 6F 6F A3 09 04 .5....cn..foo... 0010: 02 63 6E 04 03 62 61 72 A2 1D A0 1B A3 07 04 02 .cn..bar........ 0020: 63 6E 04 01 61 A3 07 04 02 63 6E 04 01 62 A3 07 cn..a....cn..b.. 0030: 04 02 63 6E 04 01 63 __ __ __ __ __ __ __ __ __ ..cn..c (|(cn=foo)(cn=bar)(!(&(cn=a)(cn=b)(cn=c)))) (| (! (cn=a)) (! (cn=b)) (! (cn=c)) (cn=foo) (cn=bar)) 0000: A1 37 A2 09 A3 07 04 02 63 6E 04 01 61 A2 09 A3 .7......cn..a... 0010: 07 04 02 63 6E 04 01 62 A2 09 A3 07 04 02 63 6E ...cn..b......cn 0020: 04 01 63 A3 09 04 02 63 6E 04 03 66 6F 6F A3 09 ..c....cn..foo.. 0030: 04 02 63 6E 04 03 62 61 72 __ __ __ __ __ __ __ ..cn..bar (|(!(cn=a))(!(cn=b))(!(cn=c))(cn=foo)(cn=bar)) (& (cn=foo) (cn=bar) (! (& (cn=a) (cn=b) (cn=c)))) 0000: A0 35 A3 09 04 02 63 6E 04 03 66 6F 6F A3 09 04 .5....cn..foo... 0010: 02 63 6E 04 03 62 61 72 A2 1D A0 1B A3 07 04 02 .cn..bar........ 0020: 63 6E 04 01 61 A3 07 04 02 63 6E 04 01 62 A3 07 cn..a....cn..b.. 0030: 04 02 63 6E 04 01 63 __ __ __ __ __ __ __ __ __ ..cn..c (&(cn=foo)(cn=bar)(!(&(cn=a)(cn=b)(cn=c)))) (| (& (! (cn=a)) (cn=bar) (cn=foo)) (& (! (cn=b)) (cn=bar) (cn=foo)) (& (! (cn=c)) (cn=bar) (cn=foo))) 0000: A1 69 A0 21 A2 09 A3 07 04 02 63 6E 04 01 61 A3 .i.!......cn..a. 0010: 09 04 02 63 6E 04 03 62 61 72 A3 09 04 02 63 6E ...cn..bar....cn 0020: 04 03 66 6F 6F A0 21 A2 09 A3 07 04 02 63 6E 04 ..foo.!......cn. 0030: 01 62 A3 09 04 02 63 6E 04 03 62 61 72 A3 09 04 .b....cn..bar... 0040: 02 63 6E 04 03 66 6F 6F A0 21 A2 09 A3 07 04 02 .cn..foo.!...... 0050: 63 6E 04 01 63 A3 09 04 02 63 6E 04 03 62 61 72 cn..c....cn..bar 0060: A3 09 04 02 63 6E 04 03 66 6F 6F __ __ __ __ __ ....cn..foo (|(&(!(cn=a))(cn=bar)(cn=foo))(&(!(cn=b))(cn=bar)(cn=foo))(&(!(cn=c))(cn=bar)(cn=foo))) (| (cn=foo\(bar\)) (cn=test)) 0000: A1 1C A3 0E 04 02 63 6E 04 08 66 6F 6F 28 62 61 ......cn..foo(ba 0010: 72 29 A3 0A 04 02 63 6E 04 04 74 65 73 74 __ __ r)....cn..test (|(cn=foo\28bar\29)(cn=test)) (cn=foo\*) 0000: A3 0A 04 02 63 6E 04 04 66 6F 6F 2A __ __ __ __ ....cn..foo* (cn=foo\2a) (cn=foo\\*) 0000: A4 0C 04 02 63 6E 30 06 80 04 66 6F 6F 5C __ __ ....cn0...foo\ (cn=foo\5c*) (cn=\\*foo) 0000: A4 0E 04 02 63 6E 30 08 80 01 5C 82 03 66 6F 6F ....cn0...\..foo (cn=\5c*foo) (cn=\\*foo\\*) 0000: A4 0F 04 02 63 6E 30 09 80 01 5C 81 04 66 6F 6F ....cn0...\..foo 0010: 5C __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ \ (cn=\5c*foo\5c*) (ou:dn:caseIgnoreMatch:=people) 0000: A9 20 81 0F 63 61 73 65 49 67 6E 6F 72 65 4D 61 . ..caseIgnoreMa 0010: 74 63 68 82 02 6F 75 83 06 70 65 6F 70 6C 65 84 tch..ou..people. 0020: 01 FF __ __ __ __ __ __ __ __ __ __ __ __ __ __ .. (sn:caseIgnoreMatch:=barr) 0000: A9 1B 81 0F 63 61 73 65 49 67 6E 6F 72 65 4D 61 ....caseIgnoreMa 0010: 74 63 68 82 02 73 6E 83 04 62 61 72 72 __ __ __ tch..sn..barr (attr=*) 0000: 87 04 61 74 74 72 __ __ __ __ __ __ __ __ __ __ ..attr (attr;x-tag=*) 0000: 87 0A 61 74 74 72 3B 78 2D 74 61 67 __ __ __ __ ..attr;x-tag (attr=) 0000: A3 08 04 04 61 74 74 72 04 00 __ __ __ __ __ __ ....attr.. (1.2.3.4.5=) 0000: A3 0D 04 09 31 2E 32 2E 33 2E 34 2E 35 04 00 __ ....1.2.3.4.5.. (1.2.3.4.5;x-tag=) 0000: A3 13 04 0F 31 2E 32 2E 33 2E 34 2E 35 3B 78 2D ....1.2.3.4.5;x- 0010: 74 61 67 04 00 __ __ __ __ __ __ __ __ __ __ __ tag.. (attr=value) 0000: A3 0D 04 04 61 74 74 72 04 05 76 61 6C 75 65 __ ....attr..value (space= ) 0000: A3 0A 04 05 73 70 61 63 65 04 01 20 __ __ __ __ ....space.. (null=\00) 0000: A3 09 04 04 6E 75 6C 6C 04 01 00 __ __ __ __ __ ....null... (bell=\07) 0000: A3 09 04 04 62 65 6C 6C 04 01 07 __ __ __ __ __ ....bell... (bell=) 0000: A3 09 04 04 62 65 6C 6C 04 01 07 __ __ __ __ __ ....bell... (bell=\07) (attr;x-star=\2a) 0000: A3 10 04 0B 61 74 74 72 3B 78 2D 73 74 61 72 04 ....attr;x-star. 0010: 01 2A __ __ __ __ __ __ __ __ __ __ __ __ __ __ .* (attr;x-star=\2a) (attr;x-escape=\5C) 0000: A3 12 04 0D 61 74 74 72 3B 78 2D 65 73 63 61 70 ....attr;x-escap 0010: 65 04 01 5C __ __ __ __ __ __ __ __ __ __ __ __ e..\ (attr;x-escape=\5c) (attr=initial*) 0000: A4 11 04 04 61 74 74 72 30 09 80 07 69 6E 69 74 ....attr0...init 0010: 69 61 6C __ __ __ __ __ __ __ __ __ __ __ __ __ ial (attr=*any*) 0000: A4 0D 04 04 61 74 74 72 30 05 81 03 61 6E 79 __ ....attr0...any (attr=*final) 0000: A4 0F 04 04 61 74 74 72 30 07 82 05 66 69 6E 61 ....attr0...fina 0010: 6C __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ l (attr=initial*final) 0000: A4 18 04 04 61 74 74 72 30 10 80 07 69 6E 69 74 ....attr0...init 0010: 69 61 6C 82 05 66 69 6E 61 6C __ __ __ __ __ __ ial..final (attr=initial*any*any*final) 0000: A4 22 04 04 61 74 74 72 30 1A 80 07 69 6E 69 74 ."..attr0...init 0010: 69 61 6C 81 03 61 6E 79 81 03 61 6E 79 82 05 66 ial..any..any..f 0020: 69 6E 61 6C __ __ __ __ __ __ __ __ __ __ __ __ inal (attr=initial*any*) 0000: A4 16 04 04 61 74 74 72 30 0E 80 07 69 6E 69 74 ....attr0...init 0010: 69 61 6C 81 03 61 6E 79 __ __ __ __ __ __ __ __ ial..any (attr=*any*final) 0000: A4 14 04 04 61 74 74 72 30 0C 81 03 61 6E 79 82 ....attr0...any. 0010: 05 66 69 6E 61 6C __ __ __ __ __ __ __ __ __ __ .final (attr=*any*any*) 0000: A4 12 04 04 61 74 74 72 30 0A 81 03 61 6E 79 81 ....attr0...any. 0010: 03 61 6E 79 __ __ __ __ __ __ __ __ __ __ __ __ .any (attr=**) 0000: A4 0A 04 04 61 74 74 72 30 02 81 00 __ __ __ __ ....attr0... (attr=initial**) 0000: A4 13 04 04 61 74 74 72 30 0B 80 07 69 6E 69 74 ....attr0...init 0010: 69 61 6C 81 00 __ __ __ __ __ __ __ __ __ __ __ ial.. (attr=**final) 0000: A4 11 04 04 61 74 74 72 30 09 81 00 82 05 66 69 ....attr0.....fi 0010: 6E 61 6C __ __ __ __ __ __ __ __ __ __ __ __ __ nal (attr=initial**final) 0000: A4 1A 04 04 61 74 74 72 30 12 80 07 69 6E 69 74 ....attr0...init 0010: 69 61 6C 81 00 82 05 66 69 6E 61 6C __ __ __ __ ial....final (attr=initial***final) 0000: A4 1C 04 04 61 74 74 72 30 14 80 07 69 6E 69 74 ....attr0...init 0010: 69 61 6C 81 00 81 00 82 05 66 69 6E 61 6C __ __ ial......final (attr~=) 0000: A8 08 04 04 61 74 74 72 04 00 __ __ __ __ __ __ ....attr.. (attr~=fubar) 0000: A8 0D 04 04 61 74 74 72 04 05 66 75 62 61 72 __ ....attr..fubar (attr>=fubar) 0000: A5 0D 04 04 61 74 74 72 04 05 66 75 62 61 72 __ ....attr..fubar (attr<=fubar) 0000: A6 0D 04 04 61 74 74 72 04 05 66 75 62 61 72 __ ....attr..fubar # attribute 'attr' matching 'fubar' using matching rule '1.2.3' (attr:1.2.3:=fubar) 0000: A9 14 81 05 31 2E 32 2E 33 82 04 61 74 74 72 83 ....1.2.3..attr. 0010: 05 66 75 62 61 72 __ __ __ __ __ __ __ __ __ __ .fubar # attribute 'attr' in DN matching 'fubar' using default equality matching rule (attr:dn:=fubar) 0000: A9 10 82 04 61 74 74 72 83 05 66 75 62 61 72 84 ....attr..fubar. 0010: 01 FF __ __ __ __ __ __ __ __ __ __ __ __ __ __ .. # attribute 'attr' in DN matching 'fubar' using default equality matching rule (attr:DN:=fubar) 0000: A9 11 81 02 44 4E 82 04 61 74 74 72 83 05 66 75 ....DN..attr..fu 0010: 62 61 72 __ __ __ __ __ __ __ __ __ __ __ __ __ bar # attribute 'attr' in DN matching 'fubar' using matching rule '1.2.3' (attr:dn:1.2.3:=fubar) 0000: A9 17 81 05 31 2E 32 2E 33 82 04 61 74 74 72 83 ....1.2.3..attr. 0010: 05 66 75 62 61 72 84 01 FF __ __ __ __ __ __ __ .fubar... # any attribute matching 'fubar' with matching rule '1.2.3' (:1.2.3:=fubar) 0000: A9 0E 81 05 31 2E 32 2E 33 83 05 66 75 62 61 72 ....1.2.3..fubar # any attribute matching 'fubar' with matching rule 'caseExactMatch' (:caseExactMatch:=fubar) 0000: A9 17 81 0E 63 61 73 65 45 78 61 63 74 4D 61 74 ....caseExactMat 0010: 63 68 83 05 66 75 62 61 72 __ __ __ __ __ __ __ ch..fubar # any attribute from DN matching 'fubar' using matching rule '1.2.3' (:dn:1.2.3:=fubar) 0000: A9 11 81 05 31 2E 32 2E 33 83 05 66 75 62 61 72 ....1.2.3..fubar 0010: 84 01 FF __ __ __ __ __ __ __ __ __ __ __ __ __ ... (:dn:caseIgnoreMatch:=fubar) 0000: A9 1B 81 0F 63 61 73 65 49 67 6E 6F 72 65 4D 61 ....caseIgnoreMa 0010: 74 63 68 83 05 66 75 62 61 72 84 01 FF __ __ __ tch..fubar... (!(objectClass=*)) 0000: A2 0D 87 0B 6F 62 6A 65 63 74 43 6C 61 73 73 __ ....objectClass (!(|(&(!(objectClass=*))))) 0000: A2 13 A1 11 A0 0F A2 0D 87 0B 6F 62 6A 65 63 74 ..........object 0010: 43 6C 61 73 73 __ __ __ __ __ __ __ __ __ __ __ Class (&(objectClass=*)) 0000: A0 0D 87 0B 6F 62 6A 65 63 74 43 6C 61 73 73 __ ....objectClass (&(objectClass=*)(name~=)) 0000: A0 17 87 0B 6F 62 6A 65 63 74 43 6C 61 73 73 A8 ....objectClass. 0010: 08 04 04 6E 61 6D 65 04 00 __ __ __ __ __ __ __ ...name.. (|(objectClass=*)) 0000: A1 0D 87 0B 6F 62 6A 65 63 74 43 6C 61 73 73 __ ....objectClass (|(objectClass=*)(name~=)) 0000: A1 17 87 0B 6F 62 6A 65 63 74 43 6C 61 73 73 A8 ....objectClass. 0010: 08 04 04 6E 61 6D 65 04 00 __ __ __ __ __ __ __ ...name.. # multi-valued RDN (member=sn=Doe+givenName=John,ou=People,o=University of Michigan,c=US) 0000: A3 47 04 06 6D 65 6D 62 65 72 04 3D 73 6E 3D 44 .G..member.=sn=D 0001: 6F 65 2B 67 69 76 65 6E 4E 61 6D 65 3D 4A 6F 68 oe+givenName=Joh 0002: 6E 2C 6F 75 3D 50 65 6F 70 6C 65 2C 6F 3D 55 6E n,ou=People,o=Un 0003: 69 76 65 72 73 69 74 79 20 6F 66 20 4D 69 63 68 iversity of Mich 0004: 69 67 61 6E 2C 63 3D 55 53 __ __ __ __ __ __ __ igan,c=US # RDN containing a plus sign (dimension=width=2\5c+height=2,unit=meters) 0000: A3 2A 04 09 64 69 6D 65 6E 73 69 6F 6E 04 1D 77 .*..dimension..w 0001: 69 64 74 68 3D 32 5C 2B 68 65 69 67 68 74 3D 32 idth=2\+height=2 0002: 2C 75 6E 69 74 3D 6D 65 74 65 72 73 __ __ __ __ ,unit=meters # literal asterisk needs to be hexpair-escaped (cn=\2a) 0000: A3 07 04 02 63 6E 04 01 2A __ __ __ __ __ __ __ ....cn..* # literal backslash needs to be hexpair-escaped (cn=\5c) 0000: A3 07 04 02 63 6E 04 01 5C __ __ __ __ __ __ __ ....cn..\ # literal braces need to be hexpair-escaped (cn=\28braces\29) 0000: A3 0E 04 02 63 6E 04 08 28 62 72 61 63 65 73 29 ....cn..(braces) # non-ASCII UTF-8 character umlaut-a (cn=Hägar) 0000: A3 0C 04 02 63 6E 04 06 48 C3 A4 67 61 72 __ __ ....cn..H..gar (cn=H\c3\a4gar) # perl-ldap extension - strictly speaking a violation of the RFC (cn=\*) 0000: A3 07 04 02 63 6E 04 01 2A __ __ __ __ __ __ __ ....cn..* (cn=\2a) # perl-ldap extension - strictly speaking a violation of the RFC (cn=\\) 0000: A3 07 04 02 63 6E 04 01 5C __ __ __ __ __ __ __ ....cn..\ (cn=\5c) # perl-ldap extension - strictly speaking a violation of the RFC (cn=\(braces\)) 0000: A3 0E 04 02 63 6E 04 08 28 62 72 61 63 65 73 29 ....cn..(braces) (cn=\28braces\29) perl-ldap-0.58/t/47ipc.t0000644000175000000620000000233212173014262014360 0ustar marschapstaff#!perl use Test::More; BEGIN { require "t/common.pl" } start_server(ipc => 1) ? plan tests => 18 : plan skip_all => 'no server'; $ldap = client(); ok($ldap, "client"); $mesg = $ldap->bind($MANAGERDN, password => $PASSWD); ok(!$mesg->code, "bind: " . $mesg->code . ": " . $mesg->error); ok(ldif_populate($ldap, "data/40-in.ldif"), "data/40-in.ldif"); $mesg = $ldap->search(base => $BASEDN, filter => 'objectclass=*'); ok(!$mesg->code, "search: " . $mesg->code . ": " . $mesg->error); compare_ldif("40",$mesg,$mesg->sorted); $ldap = client(ipc => 1); ok($ldap, "ipc client"); $mesg = $ldap->search(base => $BASEDN, filter => 'objectclass=*'); ok(!$mesg->code, "search: " . $mesg->code . ": " . $mesg->error); compare_ldif("40",$mesg,$mesg->sorted); SKIP: { skip('IO::Socket::SSL not installed') unless (eval { require IO::Socket::SSL; } ); $mesg = $ldap->start_tls; ok(!$mesg->code, "start_tls: " . $mesg->code . ": " . $mesg->error); $mesg = $ldap->start_tls; ok($mesg->code, "start_tls: " . $mesg->code . ": " . $mesg->error); $mesg = $ldap->search(base => $BASEDN, filter => 'objectclass=*'); ok(!$mesg->code, "search: " . $mesg->code . ": " . $mesg->error); compare_ldif("40",$mesg,$mesg->sorted); } perl-ldap-0.58/t/74matchedvalues.t0000644000175000000620000000652712173014262016444 0ustar marschapstaff#!perl use Test::More; use Net::LDAP; use Net::LDAP::Constant qw(LDAP_CONTROL_MATCHEDVALUES); use Net::LDAP::Control::MatchedValues; BEGIN { require "t/common.pl" } my @tests; { # parse DATA into a list (= tests) of hashes (= test parameters) of lists (= parameter values) local $/ = ''; while(my $para = ) { my @lines = split(/\n/, $para); my %params; chomp(@lines); @lines = grep(!/^\s*(?:#.*?)?$/, @lines); map { push(@{$params{$1}}, $2) if (/^(\w+):\s*(.*)$/) } @lines; push(@tests, \%params) if (%params); } } start_server() ? plan tests => 4 + 3 * scalar(@tests) : plan skip_all => 'no server'; $ldap = client(); isa_ok($ldap, Net::LDAP, "client"); $rootdse = $ldap->root_dse; isa_ok($rootdse, Net::LDAP::RootDSE, "root_dse"); SKIP: { skip("RootDSE does not offer MatchedValues control", 2 + 3 * scalar(@tests)) unless($rootdse->supported_control(LDAP_CONTROL_MATCHEDVALUES)); #$mesg = $ldap->start_tls(%tlsargs); #ok(!$mesg->code, "start_tls yields: ". $m->error); $mesg = $ldap->bind($MANAGERDN, password => $PASSWD); ok(!$mesg->code, "bind: " . $mesg->code . ": " . $mesg->error); ok(ldif_populate($ldap, "data/40-in.ldif"), "data/40-in.ldif"); foreach my $test (@tests) { $control = Net::LDAP::Control::MatchedValues->new(matchedValues => $test->{match}->[0]); isa_ok($control, Net::LDAP::Control::MatchedValues, "control object"); $mesg = $ldap->search(base => $test->{dn}->[0], filter => $test->{filter} ? $test->{filter}->[0] : '(objectclass=*)', scope => $test->{scope} ? $test->{scope}->[0] : 'sub', attrs => $test->{attrs} || [ '*' ], control => $control); ok(!$mesg->code, "search: " . $mesg->code . ": " . $mesg->error); my $success = 1; my $entry = $mesg->entry(0); foreach $attr (@{$test->{attrs}}) { my $vals = join(':', sort $entry->get_value($attr)); my $expected = $test->{$attr} ? join(':', sort @{$test->{$attr}}) : ''; $success = 0 if ($vals ne $expected); } ok($success, "values match expectations"); } } __DATA__ ## each section below represents one test; logic similar to , structure similar to LDIF # each tests needs at least the elements # - match: the value of the MatchedValues control # - dn: the base-DN of the search # - filter: the filter to use (first element important only) # one attribute, no wildcards match: ((cn=Babs Jensen)) dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US filter: (mail=bjensen@mailgw.umich.edu) scope: base attrs: cn cn: Babs Jensen # one attribute, wildcards match: ((cn=Babs Jensen)) dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US filter: (mail=bjensen@mailgw.umich.edu) scope: base attrs: cn cn: Babs Jensen # multiple attributes, wildcards match: ((cn=* Jensen)(title=*Myth*)) dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US filter: (mail=bjensen@mailgw.umich.edu) scope: base attrs: title attrs: cn title: Mythical Manager, Research Systems cn: Barbara Jensen cn: Babs Jensen # one attribute, wildcards, no matching value match: ((description=*LDAP*)) dn: cn=Barbara Jensen, ou=Information Technology Division, ou=People, o=University of Michigan, c=US filter: (mail=bjensen@mailgw.umich.edu) scope: base attrs: description perl-ldap-0.58/t/04refloop.t0000644000175000000620000000175112173014262015250 0ustar marschapstaff#!perl use Test::More; use Net::LDAP qw(LDAP_UNAVAILABLE); my $devnull = eval { require File::Spec; File::Spec->devnull } || "/dev/null"; (-e $devnull) ? plan tests => 5 : plan skip_all => 'no null device'; $::destroy = 0; { my $ldap = Net::LDAP::Dummy->new("host", async => 1); $ldap->bind; # create an internal ref loop note(explain($ldap->inner)) if $ENV{TEST_VERBOSE}; } ok($::destroy, ''); my $ref; my $mesg; $::destroy = 0; { my $ldap = Net::LDAP::Dummy->new("host", async => 1); $mesg = $ldap->bind; # create an internal ref loop $ref = $ldap->inner->outer; is($ref == $ldap, ''); } ok(!$::destroy, ''); $ref = undef; ok($mesg->code == LDAP_UNAVAILABLE, ''); undef $mesg; ok($::destroy, ''); package Net::LDAP::Dummy; use IO::File; BEGIN { @ISA = qw(Net::LDAP); } sub connect_ldap { my $ldap = shift; $ldap->{net_ldap_socket} = IO::File->new("+> $devnull"); } sub DESTROY { my $self = shift; $::destroy = 1 unless tied(%$self); $self->SUPER::DESTROY; } perl-ldap-0.58/t/41populate.t0000644000175000000620000000101612173014262015426 0ustar marschapstaff#!perl use Test::More; BEGIN { require "t/common.pl" } start_server() ? plan tests => 7 : plan skip_all => 'no server'; $ldap = client(); ok($ldap, "client"); $mesg = $ldap->bind($MANAGERDN, password => $PASSWD); ok(!$mesg->code, "bind: " . $mesg->code . ": " . $mesg->error); ok(ldif_populate($ldap, "data/40-in.ldif"), "data/40-in.ldif"); $mesg = $ldap->search(base => $BASEDN, filter => 'objectclass=*'); ok(!$mesg->code, "search: " . $mesg->code . ": " . $mesg->error); compare_ldif("40",$mesg,$mesg->sorted); perl-ldap-0.58/t/07filtermatch.t0000644000175000000620000001371512173014262016112 0ustar marschapstaff#!perl use Test::More; use Net::LDAP::Entry; use Net::LDAP::Filter; use Net::LDAP::FilterMatch qw(Text::Soundex); # Each line consists of an OPCODE-LIST and a DN, # where # - OPCODE-LIST is a comma separated list of OPCODES, # each potentially prefixed with a TESTCASE prefix followed by : # OPCODE-LIST = OPCODE (, [ TESTCASE:] OPCODE )+ # - within the OPCODE-LIST each TESTCASE prefix needs to be unique # - no TESTCASE prefix means: default result # - OPCODES are # yes $filter->match() returns true # no $filter->match() returns false # fail $filter->match() returns undef # To keep the order of tests, @tests is an array of ($filterstring => @ops) tuples my @tests = map { /^([\w:,]+)\s+(\(.*\))/ && { $2 => [ split(/,/, $1) ] } } grep(/^[\w:,]+\s+\(.*\)/, ); # The elements of the @testcases array are the TESTCASE prefixes described above my @testcases = qw/raw schema/; # calculate number of tests: plan tests => 3 + # general preparation scalar(@tests) * # @tests is a list of ($filter => \@ops) pairs ( 1 + # one Net::LDAP::Filter test per ... scalar(@testcases)); # ... every test case my $entry = Net::LDAP::Entry->new( 'cn=John Doe, ou=Information Technology Division, ou=People, o=University of Michigan, c=US', objectClass => [ 'OpenLDAPperson' ], cn => [ 'John Doe', 'Jonathon Doe' ], uid => [ 'john' ], sn => [ 'Doe' ], givenName => [ qw/John Jonathon/ ], mailPreferenceOption => 2, # uidnumber is not a legal attribute of OpenLDAPperson: # does not matter here, but will not load into an LDAP server uidNumber => 1012, o => 'University of Michigan', postalAddress => [ 'ITD $ 535 W. William $ Ann Arbor, MI 48109' ], seeAlso => [ 'cn=All Staff, ou=Groups, o=University of Michigan, c=US' ], homePostalAddress => [ '912 East Bllvd $ Ann Arbor, MI 48104' ], title => [ 'System Administrator, Information Technology Division' ], description => [ 'overworked!' ], mail => [ 'johnd@mailgw.umich.edu' ], homePhone => [ '+1 313 555 3774' ], pager => [ '+1 313 555 6573' ], facsimileTelephoneNumber => [ '+1 313 555 4544' ], telephoneNumber => [ '+1 313 555 9394' ], createTimestamp => '20090209123456Z', creatorsName => 'cn=James A Jones 2, ou=Information Technology Division, ou=People, o=University of Michigan, c=US', modifyTimestamp => '20121102212634Z', modifiersName => 'cn=John Doe, ou=Information Technology Division, ou=People, o=University of Michigan, c=US'); isa_ok($entry, Net::LDAP::Entry, 'entry object created'); my $schema = Net::LDAP::Schema->new(); isa_ok($schema, Net::LDAP::Schema, 'schema object created'); ok($schema->parse('data/schema.in'), "schema loaded: ".($schema->error ? $schema->error : '')); note('Schema: ', explain($schema)) if ($ENV{TEST_VERBOSE}); foreach my $elem (@tests) { my ($filterstring, $ops) = %{$elem}; my $filter = Net::LDAP::Filter->new($filterstring); isa_ok($filter, Net::LDAP::Filter, 'filter object created'); #note("$filterstring => ", explain($filter)); SKIP: { eval { require Text::Soundex }; skip("Text::Soundex not installed", scalar(@testcases)) if ($@); for my $case (@testcases) { my ($op) = grep(/^$case:/, @{$ops}); ($op) = grep(/^[^:]+$/, @{$ops}) if (!$op); $op =~ s/^$case://; my $match = $filter->match($entry, $case eq 'schema' ? $schema : undef); foreach ($op) { /fail/ && ok(!defined($match), "$filterstring should cause failure in $case mode"); /yes/ && ok($match, "$filterstring should match in $case mode"); /(todo|no)/ && ok(!$match, "$filterstring should not match in $case mode"); } } } } __DATA__ ## "basic" match # caseIgnoreIA5Match yes (mail=johnd@mailgw.umich.edu) # caseIgnoreListMatch yes (postaladdress=ITD $ 535 W. William $ Ann Arbor, MI 48109) # caseIgnoreMatch no (cn=Babs Jensen) yes (!(cn=Tim Howes)) yes (cn=John Doe) # distinguishedNameMatch yes,raw:no (seeAlso=cn=All Staff, OU=Groups, o=University of Michigan,c=US) # facsimileNumberMatch #yes (facsimiletelephoneNumber=+1 313 555 4544) # generalizedTimeMatch yes (createTimestamp>=19970101120000Z) yes (createTimestamp<=25250101000000Z) # integerMatch yes (uidNumber=1012) no (uidNumber=1011) # integerMatch not listed in attributeType => fail with schema fail,raw:yes (mailPreferenceOption=2) # objectIdentifierMatch no (objectclass=top) yes (objectclass=OpenLDAPPerson) # telephoneNumberMatch yes (telephoneNumber=+1 313 555 9394) yes,raw:no (homephone=+13135553774) yes,raw:no (homephone=001313 5553774) # generalizedTimeOrderingMatch yes (createTimestamp>=19970101120000Z) yes (createTimestamp<=25250101000000Z) # integerOrderingMatch yes (uidNumber>=1000) yes (uidNumber<=2000) # integerOrderingMatch not listed in attributeType => fail with schema fail,raw:yes (mailpreferenceOption>=2) # caseIgnoreIA5SubstringsMatch yes (mail=johnd@*) yes (mail=johnd*@*umich.edu) # caseIgnoreListSubstringsMatch yes (postaladdress=ITD $ * William $ Ann Arbor, MI 48109) # caseIgnoreSubstringsMatch yes (cn=j*) no (cn=*a) yes (cn=*a*) yes (o=univ*of*mich*) # facsimileNumberSubstringsMatch #yes (facsimiletelephoneNumber=*1 313 555 4544) #yes (facsimiletelephoneNumber=+1*555*) # telephoneNumberSubstringsMatch yes (telephoneNumber=+1*313 555 9394) yes (telephoneNumber=+1*313*) yes,raw:no (homephone=+131355*) yes,raw:no (homephone=0013*774) ## presence match yes (cn=*) ## approx match yes (cn~=Jonathon Doe) yes (cn~=jonathon doe) yes (cn~=jonathan doe) yes (cn~=jonothan doe) yes (cn~=jonathan do) yes (cn~=john doe) yes (cn~=jon doe) yes (cn~=jomatan doe) yes (cn~=jonatan oe) yes (cn~=jon dee) ## extensible match yes (cn:dn:=John Doe) yes (:dn:caseIgnoreMatch:=People) yes (mailPreferenceOption:integerBitAndMatch:=2) yes,raw:no (mailPreferenceOption:integerBitOrMatch:=3) yes (!(mailPreferenceOption:integerBitAndMatch:=1)) yes (!(mailPreferenceOption:integerBitAndMatch:=3)) yes,raw:fail (:caseignoreMatch:=University of michigan) # EOF perl-ldap-0.58/t/60cancel.t0000644000175000000620000000372412173014262015033 0ustar marschapstaff#!perl use Test::More; use Net::LDAP; use Net::LDAP::Entry; use Net::LDAP::Constant qw(LDAP_EXTENSION_CANCEL LDAP_CANCELED); use Net::LDAP::Extension::Cancel; BEGIN { require "t/common.pl" } start_server() ? plan tests => 7 : plan skip_all => 'no server'; $ldap = client(); isa_ok($ldap, Net::LDAP, "client"); $rootdse = $ldap->root_dse; isa_ok($rootdse, Net::LDAP::RootDSE, "root_dse"); SKIP: { skip("RootDSE does not offer cancel extension", 5) unless($rootdse->supported_extension(LDAP_EXTENSION_CANCEL)); #$mesg = $ldap->start_tls; #ok(!$mesg->code, "start_tls: " . $mesg->code . ": " . $mesg->error); $mesg = $ldap->bind($MANAGERDN, password => $PASSWD); ok(!$mesg->code, "bind: " . $mesg->code . ": " . $mesg->error); ok(ldif_populate($ldap, "data/40-in.ldif"), "data/40-in.ldif"); # cancel undef => should fail $cancel = $ldap->cancel(undef); ok($cancel->code, "cancel an undefined operation: " . $cancel->code . ": " . $cancel->error); # perform a search my $search = $ldap->search( base => $BASEDN, filter => '(objectclass=*)' ); # cancel the finished search => should fail $cancel = $ldap->cancel($search); ok($cancel->code, "cancel a finished operation: " . $cancel->code . ": " . $cancel->error); # switch to async mode $ldap->async(1); # perform a search (asynchronously) $search = $ldap->search( base => $BASEDN, filter => '(objectclass=*)', callback => \&process_entry, # Call this sub for each entry ); # cancel the running search => should work [may fail, as it depends on the server's speed] $cancel = $ldap->cancel($search); ok(!$cancel->code, "cancel a running operation: " . $cancel->code . ": " . $cancel->error); } sub process_entry { my $m = shift; my $e = shift; note($m->mesg_id.':'.$e->dn()) if ($ENV{TEST_VERBOSE} && ref($e)); } perl-ldap-0.58/TODO0000644000175000000620000000340512173014262013474 0ustar marschapstaffproxy server Write a proxy server that can dump PDU's from the real server to a file. Then later play these back. This would allow benchmarking to produce more reliable figures. Net::LDAP::LDIF Still need to add support for moddn Authentication Authen::SASL Needs completion and documentation command line utilities ldapmodify ldapadd Net::LDAP::Utils utility functions like explode_dn CLDAP performance testing/tuning Documentation, Modules The docs need to be "beefed up" with more descriptions of what the operation performs, instead of assuming the user knows and just describing the arguments. Maybe steal^Wborrow from other docs and the RFCs FAQ Need an active maintainer Examples Needs to be rewritten so that all code is in a consistant format. Net::LDAP::Intro An introduction to LDAP POD Website Need to find an active maintainer with a creative touch Testcases Need more tests for anything that can be tested without a server. Referral Add a rebind option new() which is a sub. The sub will be passed a hostname and should return a new ldap object. For this to work we need to be able to chain multiple requests behind a single message object so that it looks seamless to the calling script. This would be useful for LDAPiranah Errors local vs protocol errors Controls rfc2649 - Operation Signatures dup ent control General Move the TCP connect out of new() and into a connect() method Add a configure/cget methods for options, async and version methods become deprecated rename _recvresp and document to make available for async users if bind() is passed options then require an auth option, stop accidental anon binds. make bind(password => '') illegal, force then to use noauth => '' perl-ldap-0.58/Changes0000644000175000000620000005414612256063704014316 0ustar marschapstaff0.58 -- Mon Dec 23 17:35:53 CET 2013 Bug Fixes: * RT#91210: Paged.pm: fix example code * RT#90459: LDAP.pm: make LDAPS work after LDAP+start_tls * RT#91177: AD.pm: fix change_ADpassword() * RT#88792: Constant.pm: add LDAP_CONTROL_SORTRESPONSE Enhancements: * Filter.pod: remove misleading text * typo fixes * RT#91156: add META.json * DSML.pm, Protocol/ldap.pm: use MIME::Base64::decode() * make MIME::Base64 mandatory * README: update optional modules, slight reorganization * Entry.pod: update documentation of N:L:E->update * Makefile.PL: require Text::Soundex for tests 0.57 -- Sun Jul 21 18:35:12 CEST 2013 COMPATIBILITY WARNING: The bug fix "LDAP.pm: new parameter bind(sasl_host => SASLHOST)" is an incompatible change that may break some corner-case configurations * that use SASL for authentication and * where the SASL host name differs from the host name connecting to. The incompatible change was necessary as it was not possible to fix the issue which was introduced in perl-ldap 0.37 in a compatible way. See Net::LDAP's manual page for the details on "sasl_host". Bug Fixes: * LDAP.pm: new parameter bind(sasl_host => SASLHOST) * Entry.pm: ignore options when update()ing LDIF * Entry.pm: let update() fail correctly on illegal target * RT#86053: FAQ.pod: fix spelling error * *.{pm,pod}: lots of more grammar & spelling fixes / harmonizations Enhancements: * LDAP.pm: use data_ready() in process() * Util.pm: simplify return on error * Constant.pm: add constant LDAP_CONTROL_NOOP * Schema.pm: call isa() as recommented in UNIVERSAL.pm 0.56 -- Sat Jun 8 13:14:47 CEST 2013 Bug Fixes: * RT#85941: LDAP.pm: new method data_ready() * RT#84886: Control/Relax.pm: fix typo in documentation Enhancements: * FAQ.pod: add more directory servers * t/07filtermatch.t: skip some tests unless Text::Soundex is installed * t/74matchedvalues.t: new, tests for MatchedValues control * t/73assert.t: new, tests for Assertion control * LDIF.pm: overhaul - flexibilize mode handling, accept PerlIO layers - get rid of dependency on Symbol & SelectSaver - convert _write_... to object methods - use indirect file handles for URLs * LWP/Protocol/ldap.pm: use regex as 1st arg to split() 0.55 -- Tue Apr 23 11:18:15 CEST 2013 Bug Fixes: RT#84410: PersistentSearch.pm: use $message->pop_entry() in example RT#84774: Constant.pm: unbreak Novell eDirectory constants Enhancements: Control/ManageDsaIT.pm: update documentation & simplify a bit Control/Relax.pm: new Constant.pm: add LDAP_CONTROL_RELAX LDAP.pod: omit space from filter in synopsis FAQ.pod: don't talk of "2 lines" when there's only one Extra/eDirectory.pm: fix typo, space police 0.54 -- Fri Mar 29 12:07:40 CET 2013 Bug Fixes: * RT#73202: LDIF.pm: Base64-encode values ending in spaces * RT#83815: fix typo/bug in example for root_dse Enhancements: * FAQ.pod: mention Dancer::Plugin::LDAP, update example * Extra/eDirectory.pm: new; extensions for eDirectory * Constant.pm: add constants for Novell eDirectory * LDIF.pm: clean up handling of mode parameter * LDIF.pm: partially support controls when reading * Util.pm: add time conversion functions * Makefile.PL: update recommends, add comments on core modules * FAQ.pod: update info on required/optional modules * LDAP.pod,FAQ.pod: harmonize documentation of scope values 0.53 -- Sat Jan 26 18:23:35 CET 2013 Bug Fixes: * various clarification & fixes in documentation * t/7{1pre,2post}read.t: don't use deprecated methods Enhancements: * Filter.pm: new method negate() * Util.pm: new function ldap_url_parse() * RT#77716: LDAP.pm: new option keepalive for new() * LDAP.pm: convert scheme to lowercase in new() * FAQ.pod: how to search all members of a large AD group * FAQ.pod: how to do nested group searches in AD 0.52 -- Tue Jan 1 13:54:22 CET 2013 Bug Fixes: * fix PreRead & PostRead controls * AD.pm: fix typo in documentation Enhancements: * add tests for PreRead & PostRead controls * FAQ.pm: example for certificateExactMatch * coding style overhaul: * use single-quoted strings where possible * 2 SPACEs before postfix if,unless,or,and * SPACE after comma * SPACE between if,elsif,unless,while,for and ( * make private lexical variables more private * unquote identifiers before => * unquote identifiers used as hash keys 0.51 -- Sat Dec 1 14:37:35 CET 2012 Bug Fixes: * RT#81380: in Filter.pm unescape hexpairs and ( ) \ * only * tests: compare files in "text mode" * Makefile.PL: mention all requirements for tests Enhancements: * Schema.pod: document attribute_syntax() * contrib/schema2ad.pl: new, convert schema file to something AD can digest 0.50 -- Sat Nov 24 13:03:45 CET 2012 Bug Fixes: * t/07filtermatch.t: use core module Text::Soundex instead of String::Approx * Message.pm: fix regression w.r.t. Net::LDAP::Message::Dummy Enhancements: * Makefile.PL: make dependencies reflect reality better * LDAP.pm: avoid warning in new() that might have occurred in corner cases 0.50_01 -- Sat Nov 17 18:05:15 CET 2012 Bug Fixes: * RT#80482 fix display of =item inet6 in LDAP.pod * RT#66753: new key & cert for SSL server tests * RT#79763 Net::LDAP::Util's $VERSION increased * t/06constant.t: numbering glitch in t/06constant.t * FilterMatch.pm: fix mapping of greaterOrEqual * FAQ.pod: small fixes Enhancements: * add constant LDAP_PROXY_AUTHZ_FAILURE * FilterMatch.pm: complete overhaul - update matching rules known in OpenLDAP - support matching rules for extensibleMatch - avoid warning if no matching rule is found - add specific implementations for a lot of rules * global overhaul towards Perl 5.8 features - declare @ISA and $VERSION as package-local - replace 'use vars' by 'our'. * Makefile.PL: overhaul * tests: cleanup & extensions - convert to Test::More - t/common.pl: allow client() to take options for Net::LDAP - t/common.pl: get rid of local compare function - t/03schema.t: overhaul, update data/schema.in - t/07filtermatch.t: new, tests for Net::LDAP::FilterMatch - t/40connect.t: new, test for IPv4 / IPv6 connections - reorganize servers tests: rename t/5X*.t -> t/4(X+1)*.t - t/47ipc.t: add TLS tests - t/60cancel.t: new, tests for Net::LDAP::Extension::Cancel - t/70sortctrl.t: make it a server test & add multi-attribute testcase 0.49 -- Sat Oct 5 10:00:30 CEST 2012 Bug Fixes: * RT#79763 extend ldap_explode_dn() for RFC 4514 * RT#77291 canonicalize host name with ldapi:// * LDAP.pm: don't try to set errors on undefined objects Extensions: * Net/LDAP/Extra/AD.pm: convenience functions for AD * various documentation updates 0.48 -- Thu Sep 20 10:55:20 CEST 2012 Bug Fixes: * Util.pm: fix bug in escape_dn_value() * t/55ssl.t: fix typos in output text * LDIF.pm: with encode => 'canonical', do mbcescape DNs * the usual typo fixes in docs Enhancements: * ASN.pm: adapt to RFC 4511 * Extension/{SetPassword,Refresh}.pm: polish ASN.1 definition * LWP/Protocol/ldap.pm: respond with requested MIME type * LWP/Protocol/ldap.pm: document 'x-format' URI extension * LWP/Protocol/ldap.pm: add DSMLv1 as output format * test routines updated to work with recent OpenLDAP * removed trailing spaces * support OpenLDAP extension: scope => "children" 0.47 -- Sun Sep 16 12:00:30 CEST 2012 Bug Fixes * contrib/ldifdiff.pl: fix POD * Intermediate/SyncInfo.pm: fix newcookie() method * LWP/Protocol/ldap.pm: complete overhaul Enhancements * more feature constants in Net/LDAP/Constant.pm * new features & documentation for LWP/Protocol/ldap.pm * LWP/Protocol/ldapi.pm: support ldapi:// URIs with LWP * contrib/LWPsearch.pl: demo program for LWP::Protocol::ldap* * update link list in the FAQ * update references to RFCs 0.46 -- Wed Sep 5 18:09:00 CEST 2012 Bug Fixes * LDAP.pm: unbreak - make done a real sub * Message.pm: fix typo, i.e. add forgotten ';' Enhancements: * FAQ.pod: update URLs a bit more 0.45 -- Wed Sep 5 11:20:46 CEST 2012 Bug Fixes * RT#72108 fix non-blocking IO with SSL * RT#74572 fix $entry->update($ldif) * RT#74759 fix POD spelling/grammar errors * RT#77180 use "sslv23" instead of "sslv2/3" for sslversion * work around a warning in Authen::SASL::Perl <= 2.1.5 * various typo fixes in documentation Enhancements * RT#77458 re-work IPv6 support * Don't accumulate intermediate messages passed to a callback. * slightly extend Net::LDAP::Entry->update() and document it * convenience alias done() for Net::LDAP->unbind() * various updates to the FAQ 0.44 -- Sun Jan 29 10:36:08 CET 2012 Bug Fixes * un-break certificate verification * fixes for the ProxyAuthorization control * fix typos & spelling errors in POD Enhancements * MANIFEST.SKIP: sync with Perl 5.14.2's ExtUtils version * Makefile.PL: update resource info on repository * new extended operation Net::LDAP::Extension::Cancel * new control Net::LDAP::Control::MatchedValues * new control Net::LDAP::Control::Assertion * update reference documents in POD * extend documentation for Pre-Read & Post-Read controls * add error string for LDAP_VLV_ERROR * add result codes for VLV and cancel * add constant for DontUseCopy control * add constant for PermissiveModify control 0.43 -- Sat Sep 3 12:50:49 CDT 2011 * Fix copy & paste errors in Net::LDAP::Message 0.42 -- Sat Sep 3 07:46:06 CDT 2011 * Check whether LDAP socket object has a peerhost() method defined before calling it. This fixes SASL authentication over UNIX domain (ldapi://) sockets. [Chris Mikkelson] 0.41 -- Sat Sep 3 07:37:31 CDT 2011 * use of non-localised $_ in Net::LDAP::Constant causes prolems in lemonldap-ng [Damyan Ivanov] * Added cn,o,ou to the default set of case-insensitive attributes [Kartik Subbarao] * Entry.pod: fix typos [Peter Marschall] * extend Net::LDAP::Entry->update() to take LDIF objects [Peter Marschall] * Specify that we want to use the 'ldap' scheme to verify certificates. [Kevan Carstensen] 0.4001 -- Wed Mar 24 14:54:35 CDT 2010 * Update Module::Install and generate META.yml 0.40 -- Thu Mar 11 20:56:28 CST 2010 * Avoid 'cookie parsing error' on OpenLDAP 2.3 [Mathieu Parent] * Added e-syncRefreshRequired constant [Mathieu Parent] * Minor typo fix in documentation [Quanah Gibson-Mount] * Update CREDITS for Mathieu Parent * Remove runtime dependency on DATA handle for constants * Clarify documentation for gen_password * Allow caller to pass Authen::SASL client_new object * fix typo [Peter Marschall] * use current IO::Socket::SSL's method start_SSL instead of deprecated function socketToSSL; raise required IO::Socket:SSL version appropriately [Peter Marschall] * FilterMatch.pm: fix regex treatment in _{cis,exact}_substrings(). [Peter Marschall] * FilterMatch.pm: correct # of args in function declarations/definitions [Peter Marschall] * Don't duplicate documentation [Mathieu Parent] * Added numcmp option to compare attributes numerically. [Kartik Subbarao] * Avoid infinite loop when authenticating with EXTERNAL mechanism * Add Net::LDAP::Extension::Refresh as described in RFC2589 [Etienne Bagnoud] * RT#40068 Fix tests to work with 2.4.11 * Add ldif method to Net::LDAP::Entry * RT#46111 Make LWP::Protocol::ldap return ldif when requested * RT#51165 Compact multiple consecutive spaces in Net::LDAP::Util::canonical_dn * RT#46125 Add LWP::Protocol::ldaps to support ldaps: urls * RT#44110 Fix Net::LDAP::LDIF->current_lines perl-ldap 0.39 -- Mon Oct 27 15:02:37 CDT 2008 ============================================== Bug Fixes * Several fixes to the handling of IntermediateMessage and LDAP Content synchronisation * Fix dsmt test to not fail on win32 * Fix Net::LDAP::Util to not cause Undefined subroutine &Net::LDAP::Util::ldap_error_desc perl-ldap 0.38 -- Sun Sep 21 09:17:25 CDT 2008 ============================================== Bug Fixes * Fix bug in Net::LDAP::Extension using wrong field for resultCode * Fix Net::LDAP::Control::PasswordPolicy decoding bug. Enhancements * Net::LDAP::Extension::SetPassword now supports controls perl-ldap 0.37 -- Thu Aug 28 07:48:13 CDT 2008 ============================================== Bug Fixes * Pass correct hostname to SASL when connecting to a round-robin * Return the SASL error message when sasl client_start fails Enhancements * Add Modify Increment (RFC 4525) support * Add Content Synchronization (RFC 4453) support perl-ldap 0.36 -- Mon Apr 21 10:00:09 CDT 2008 ============================================== Bug Fixes * Fixed Net::LDAP::constant to return correct names for values 0 - 9 * Fixed DSML test to be more tolerant of whitespace Enhancements * Added controls for PreRead & PostRead perl-ldap 0.35 -- Sun Mar 30 13:35:04 CDT 2008 ============================================== Bug Fixes * Fix wrapping in Net::LDAP::LDIF * Patch from Gergely Santa to allow entries with no attributes in LDIF * Fix modr?dn to fetch values in sclar context * send packets in sizes that IO::Socket::SSL can chew * Avoid attept to use undef as hash reference in ->sync * Ensure Bind.pm presents final server response to SASL object Enhancements * Added vendorName/vendorVersion (RFC 3045) to root_dse() * add option to support IPv6 * Allow Entry->deleted to be called with a single value is well as array ref * Added Net::LDAP::Control::PasswordPolicy to support draft RFC perl-ldap 0.34 -- Sat Feb 10 17:39:49 CST 2007 ============================================== Bug Fixes * Improve dealing with mixed case attributes in Net::LDAP::Entry * Documentation fixes & updates * Don't let Net::LDAP->bind() die on SASL errors * Fix case-folding in Net::LDAP::Util::ldap_explode_dn() * Saner default for ldapi socket * Update test suite to work with recent OpenLDAP versions * The usual bunch of typo fixes * Fix escaping on non-ascii characters in Net::LDAP::Filter Enhancements * Flexible handling of line ends in Net::LDAP::LDIF when reading * Improve writing speed in Net::LDAP::LDIF * Net::LDAP accessor methods for scheme, host, port, URI connected to * New checkcrl option to Net::LDAP->new() to do CRL checking * New package Net::LDAP::Filtermatch for client side filtering * More ASN1 messages handled in Net::LDAP:ASN: IntermediateResponse * Option 'raw' to return Perl UTF-8 strings from queries (requires Perl 5.8) * Support Active Directory's extendedAttributeInfo schema information * Method to find matchingrule for an attribute in Net::LDAP:Schema * Updated build dependecies: GSSAPI support, .. perl-ldap 0.33 -- Mon Apr 25 08:02:26 CDT 2005 ============================================== Bug Fixes * Removed superfluous "print" in Net::LDAP::LDIF before _write_attr on writing * Base64 encode any value starting with < in Net::LDAP::LDIF * Documentation updates * Fix case insensitivity issues in contrib/ldifdiff.pl Enhancements * Added Net::LDAP::Extension::WhoAmI * Added write_version() and handle() methods to Net::LDAP::LDIF * Updated Net::LDAP::Control::ProxyAuth to support new OID from latest rfc-draft * Added contrib/recursive-ldap-delete.pl * Added ability to do case in comparisons to contrib/ldifsort.pl perl-ldap 0.3202 -- Mon Jul 19 11:44:08 BST 2004 ================================================ Bug Fixes * Fixed case typo in Makefile.PL perl-ldap 0.3201 -- Wed Jul 14 21:52:59 BST 2004 Bug Fixes * Fixed dependancies in Makefile.PL perl-ldap 0.32 -- Bug Fixes * Documentation updates * Fixed LDIF output from ldapsearch command * Return an error if no filter is passed to Net::LDAP::filter->parse * Fixed bug handling comments in LDIF parser * Fix to ldapsearch for passing scope with -s * Do not send a fake userid in SASL binds * Net::LDAP::Schema->parse() now returns undef on errors Enhancements * Added supportedFeatures to the default list of attributes fetched by ->root_dse * Added option to sort attributes in LDIF output, with objectclass being first floowed by all other attributes in alphabetical order * Add escape/unescape filters/DN utility functions * Added support for reading LDIF URL attributes using file:// * The socket created by new can now be bound to a local address & port * Any controls returned by the server with each entry as a result from a search are now available in the callback function * Added classes for EntryChange, PersistentSearch and ManageDsaIT controls * Allow options passed to Net::LDAP::Entry-.update to be passed to the Net::LDAP method that is finally called perl-ldap 0.31 1 Jan 2004 ========================== * Fixed bug that could cause methods to return an integer instead of an object * Fixed bug causing Schema.pm to ignore superior classes that had no attributes * Documentation updates * Updates to LDIF module perl-ldap 0.30 17 Oct 2003 ========================== * Documentation updates * Fixed bug checking return value of client_step in bind() * Fixed bug in Entry.pm causing method calls on unblessed references perl-ldap 0.29 24 Jun 2003 ========================== * Workaround bug in IO::Socket::SSL when startTLS fails * Fix reference loop memory leak problem * Add a SIGNATURE to the distribution * Re-added support for :all in the import list to get all constants * New methods error_name, error_text, error_desc added to Message.pm perl-ldap 0.28 19 May 2003 ========================== * Net::LDAP::Entry object can now be cloned * New class Net::LDAP::RootDSE * Net::LDAP->new can now accept URLs for the host * Added support for ldapi: * Now supports Notice of disconnection * Net::LDAP::Constant now implements its own import function, it no longer inherits from Exporter. So :all and /^LDAP_CONTROL/ etc are no longer valid arguments for import. The result is that Net::LDAP::Constant only defined the subs that are needed. perl-ldap 0.27 27 Jan 2003 ========================== * Default protocol version is now version 3 * Fixed support for multiple hosts to be passed to new perl-ldap 0.26 18 Jul 2002 ========================== * canonical_dn and ldap_explode_dn have a new implementation. * Net::LDAP::DSML reimplemented using XML::SAX * Net::LDAP::Schema reimplemented. API needed to change to fix many bugs in previous implementation * Added support for version number in Net::LDAP::LDIF (support for fill version still todo) perl-ldap 0.251 15 May 2002 =========================== * Added support for Adamson's SASL authentication * Both Cyrus SASL and Perl SASL modules are sought perl-ldap 0.25 29 Oct 2001 ========================== * Added support for EXTERNAL SASL authentication * Caller can now specify attributes to return from root_dse * More scripts added to contrib * Various bug fixes * Caller can now specify sslversion for LDAPS and start_tls perl-ldap 0.24 17 July 2001 =========================== * Added support for startTLS * Better error checking in Net::LDAP methods * VLV control now works * Can now use oid or name for the matchingRule in filter extensible matches * Major overhaul of LDIF.pm * $schema->name2oid is now context sensetive * test suite now works with openldap2 perl-ldap 0.23 April 20 2001 ============================ * Fixed bug in Net::LDAP::Filter when the filter contained an escaped * * Fixed SASL bind to call challenge with serverSaslCreds * Fixed some uninit errors in Net::LDAP::Entry * Various documention updates * Added Net::LDAP::Util::canonical_dn * Net::LDAP::LDIF will now call canonical_dn for any DN which contains non-printable characters * Added support for matchingruleuse, ditstructurerules, ditcontentrules and nameForms into Net::LDAP::Schema * The ->schema method in Net::LDAP has changed how it finds the schema to return. The new method is more correct, but there may be a possibility that this change has created an incompatability. * New control module Net::LDAP::Control::ProxyAuth from Olivier Dubois added * Added support for moddn in Net::LDAP::LDIF. * Minor fixes to the DSML output (fixing illegal XML.) perl-ldap 0.22 September 14 2000 ================================ * Quick release to fix memory problem with 5.6.0 perl-ldap 0.21 September 12 2000 ================================ * Change ->get back to return what 0.19 returned * Deprecate ->get in favor of ->get_value * Net::LDAP::Schema now supports matchingRules * Added experimental onerror option to ->new * New FAQ by Clif Harden perl-ldap 0.20 August 3 2000 ============================ * Added INSTALL and CREDITS files * Net::LDAP::Entry ->get and ->attributes methods now support options * Added Net::LDAP::DSML from Mark Wilcox * Added Net::LDAPS from Chris Ridd * Many documentation updates * Several fixes to ::Control::* classes, they should now work as intended. * Net::LDAP::Entry->get now always returns a scalar result as documented. * bin/ldapsearch now requires URI-1.08 perl-ldap 0.19 June 8 2000 ============================ * Fixed bug which caused 2nd and subsequent binds to be anonymous. * Fixed bug in moddn. * Fix bug which caused a call to ->pop_entry or ->shift_entry to hang forever. perl-ldap 0.18 May 22 2000 ============================ * Now passes -wc with 5.004, 5.005_03 and 5.6.0 * Bundle now correctly references Convert::ASN1 instead of the non-existant Convert::ASN * Net::LDAP::Filter will now catch the case of unmatched ()'s and return an error * as_struct, which was broken in the changeover to Convert::ASN1, now works again. KNOWN PROBLEMS -------------- Test t/02filter.t fails with perl 5.6.0 compiled with threads enabled This is due to a bug in 5.6.0 when compiled with threads, see http://bugs.perl.org/perlbug.cgi?req=tidmids&tidmids=20000409.003&range=32323&format=h perl-ldap 0.17 May 12 2000 ============================ * Change to use asn_read instead of asn_resc. This seems to have fixed the known problem with 0.16 * Various bug fixes, see ChangeLog perl-ldap 0.16 April 27 2000 ============================ * This is the first release which uses Convert::ASN1 instead of Convert::BER. This should show an increase in performance. * Added support for LDAPv3 controls. Controls supported are - VirtualListView - Sort - Paged * HTML version of the documentation is now included in the distribution * Added Bundle::Net::LDAP * Net::LDAP->schema can now be told where to search for the schema. KNOWN PROBLEMS -------------- In a pre-release of 0.16 it has been seen that a search result may not contain all entries and $mesg->code will be LDAP_DECODING_ERROR. This has been seen when the client is running on NT or Linux and the server is an Exchange server. perl-ldap-0.58/test.cfg0000644000175000000620000000167412173014262014452 0ustar marschapstaff# Currently test that require a server are only implemented to work # with OpenLDAP v2.4.xx or higher. Edit this file so the tests # can find the executable and know what type of server it is # Set this to the full path of your LDAP server executable # (e.g '/usr/sbin/slapd') $SERVER_EXE = ''; # This should be one of # * openldap[+ssl][+ipc][+sasl] # options are appended with '+' signs $SERVER_TYPE = 'openldap'; # Change this if your host cannot be contacted as localhost # Some tests may fail if the name does not resolve to an IPv4 and an IPv6 address #$HOST = 'localhost'; # Set this to the directory where your OpenLDAP schema files are located $SLAPD_SCHEMA_DIR = ''; # OpenLDAP DB type: default is bdb, alternatives: hdb, mdb, ... #$SLAPD_DB = 'bdb'; # Set this to the slapd module directory if your $SLAPD_DB is dynamically built # (e.g. '/usr/lib/ldap/') $SLAPD_MODULE_DIR = ''; $EXTERNAL_TESTS = 0; 1; perl-ldap-0.58/MANIFEST0000644000175000000620000000631312256064140014140 0ustar marschapstaffbin/ldapdelete bin/ldapmodrdn bin/ldapsearch Changes contrib/dot.tklkup contrib/isMember.pl contrib/jpegDisplay.pl contrib/jpegLoad.pl contrib/ldapmodify.pl contrib/ldifdiff.pl contrib/ldifsort.pl contrib/ldifuniq.pl contrib/LWPsearch.pl contrib/printMembers.pl contrib/README contrib/recursive-ldap-delete.pl contrib/schema2ad.pl contrib/simple-proxy.pl contrib/tklkup CREDITS data/00-cmp.ldif data/00-cmp2.ldif data/00-in.ldif data/05-cmp.dsml data/40-cmp.ldif data/40-in.ldif data/41-in.ldif data/41a-cmp.ldif data/41b-cmp.ldif data/41c-cmp.ldif data/41d-cmp.ldif data/42-cmp.ldif data/42-in.ldif data/42-mod.ldif data/cert.pem data/core.schema data/cosine.schema data/inetorgperson.schema data/key.pem data/man.jpg data/openldap.schema data/openssl.cnf data/regenerate_cert.sh data/schema.in data/slapd.conf.in data/woman.jpg inc/Module/AutoInstall.pm inc/Module/Install.pm inc/Module/Install/AutoInstall.pm inc/Module/Install/Base.pm inc/Module/Install/Can.pm inc/Module/Install/Fetch.pm inc/Module/Install/Include.pm inc/Module/Install/Makefile.pm inc/Module/Install/Metadata.pm inc/Module/Install/Win32.pm inc/Module/Install/WriteAll.pm INSTALL install-nomake lib/Bundle/Net/LDAP.pm lib/LWP/Protocol/ldap.pm lib/LWP/Protocol/ldapi.pm lib/LWP/Protocol/ldaps.pm lib/Net/LDAP.pm lib/Net/LDAP.pod lib/Net/LDAP/ASN.pm lib/Net/LDAP/Bind.pm lib/Net/LDAP/Constant.pm lib/Net/LDAP/Control.pm lib/Net/LDAP/Control/Assertion.pm lib/Net/LDAP/Control/EntryChange.pm lib/Net/LDAP/Control/ManageDsaIT.pm lib/Net/LDAP/Control/MatchedValues.pm lib/Net/LDAP/Control/Paged.pm lib/Net/LDAP/Control/PasswordPolicy.pm lib/Net/LDAP/Control/PersistentSearch.pm lib/Net/LDAP/Control/PostRead.pm lib/Net/LDAP/Control/PreRead.pm lib/Net/LDAP/Control/ProxyAuth.pm lib/Net/LDAP/Control/Relax.pm lib/Net/LDAP/Control/Sort.pm lib/Net/LDAP/Control/SortResult.pm lib/Net/LDAP/Control/SyncDone.pm lib/Net/LDAP/Control/SyncRequest.pm lib/Net/LDAP/Control/SyncState.pm lib/Net/LDAP/Control/VLV.pm lib/Net/LDAP/Control/VLVResponse.pm lib/Net/LDAP/DSML.pm lib/Net/LDAP/Entry.pm lib/Net/LDAP/Entry.pod lib/Net/LDAP/Examples.pod lib/Net/LDAP/Extension.pm lib/Net/LDAP/Extension/Cancel.pm lib/Net/LDAP/Extension/Refresh.pm lib/Net/LDAP/Extension/SetPassword.pm lib/Net/LDAP/Extension/WhoAmI.pm lib/Net/LDAP/Extra.pm lib/Net/LDAP/Extra/AD.pm lib/Net/LDAP/Extra/eDirectory.pm lib/Net/LDAP/FAQ.pod lib/Net/LDAP/Filter.pm lib/Net/LDAP/Filter.pod lib/Net/LDAP/FilterMatch.pm lib/Net/LDAP/Intermediate.pm lib/Net/LDAP/Intermediate/SyncInfo.pm lib/Net/LDAP/LDIF.pm lib/Net/LDAP/LDIF.pod lib/Net/LDAP/Message.pm lib/Net/LDAP/Message.pod lib/Net/LDAP/Reference.pod lib/Net/LDAP/RFC.pod lib/Net/LDAP/RootDSE.pm lib/Net/LDAP/Schema.pm lib/Net/LDAP/Schema.pod lib/Net/LDAP/Search.pm lib/Net/LDAP/Search.pod lib/Net/LDAP/Security.pod lib/Net/LDAP/Util.pm lib/Net/LDAPI.pm lib/Net/LDAPS.pm Makefile.PL MANIFEST This list of files MANIFEST.SKIP META.json README SIGNATURE t/00ldif-entry.t t/01canon_dn.t t/02filter.t t/03schema.t t/04refloop.t t/05dsml.t t/06constant.t t/07filtermatch.t t/40connect.t t/41populate.t t/42search.t t/43modify.t t/44schema.t t/45dse.t t/46ssl.t t/47ipc.t t/48url.t t/49lwp.t t/60cancel.t t/70sortctrl.t t/71preread.t t/72postread.t t/73assert.t t/74matchedvalues.t t/common.pl test.cfg TODO perl-ldap-0.58/README0000644000175000000620000000373712256063704013703 0ustar marschapstaffperl-ldap - A Client interface to LDAP servers Copyright (c) 1997-2004 Graham Barr. All rights reserved. This package is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ******************************************************************************* This code should be considered very much as work-in-progress. Any part of this release could be subject to change. The development of the distribution is discussed on a mailing list at perl-ldap@perl.org To subscribe send an empty email to perl-ldap-subscribe@perl.org ******************************************************************************* For the latest information see http://ldap.perl.org/ QUICK START GUIDE: perl-ldap uses the following modules/distributions. MIME::Base64 - required, core module since Perl 5.7.3 Convert::ASN1 - required IO::Socket::SSL - optional, for LDAPS / start_tls support IO::Socket::INET6 - optional, for IPv6 support Authen::SASL - optional, for SASL authentication Digest::MD5 - optional, for SASL DIGEST-MD5 mechanism GSSAPI - optional, for SASL GSSAPI mechanism URI::ldap - optional, for URL parsing XML::SAX::Writer - optional, for Net::LDAP::DSML Time::Local - optional, for Net::LDAP::Util's time conversion functions First ensure the above modules/distributions are installed then build/test/install Net::LDAP by doing perl Makefile.PL make make test make install Several modules in the distribution contain documentation. Once installed you can use the 'perldoc Net::LDAP' command to obtain the documentation. This documentation will contain pointers to the other modules. ******************************************************************************* NOTE: Everything that has been deprecated will be removed when V1.00 is released, but who knows when that will be. ******************************************************************************* Share and Enjoy! perl-ldap-0.58/MANIFEST.SKIP0000644000175000000620000000162112173014262014700 0ustar marschapstaff# Avoid version control files. \bRCS\b \bCVS\b \bSCCS\b ,v$ \B\.svn\b \B\.git\b \B\.gitignore\b \b_darcs\b \B\.cvsignore$ # Avoid VMS specific MakeMaker generated files \bDescrip.MMS$ \bDESCRIP.MMS$ \bdescrip.mms$ # Avoid Makemaker generated and utility files. \bMANIFEST\.bak \bMakefile$ \bblib/ \bMakeMaker-\d \bpm_to_blib\.ts$ \bpm_to_blib$ \bblibdirs\.ts$ # 6.18 through 6.25 generated this # Avoid Module::Build generated and utility files. \bBuild$ \b_build/ \bBuild.bat$ \bBuild.COM$ \bBUILD.COM$ \bbuild.com$ # Avoid temp and backup files. ~$ \.old$ \#$ \b\.# \.bak$ \.tmp$ \.# \.rej$ # Avoid OS-specific files/dirs # Mac OSX metadata \B\.DS_Store # Mac OSX SMB mount metadata files \B\._ # Avoid Devel::Cover and Devel::CoverX::Covered files. \bcover_db\b \bcovered\b # Avoid MYMETA files ^MYMETA\. # perl-ldap-sepcifc extensions \b_dev/ \b_test/ \btemp/ \bperl-ldap-\d \bmy.cfg$ # EOF perl-ldap-0.58/contrib/0002755000175000000620000000000012256064226014453 5ustar marschapstaffperl-ldap-0.58/contrib/schema2ad.pl0000644000175000000620000002165012173014262016632 0ustar marschapstaff#!/usr/bin/perl -w # convert standard LDAP schema into a format that AD can digest use Net::LDAP::Schema; use Net::LDAP::LDIF; use Net::LDAP::Entry; sub simplify($); sub addAUXclass($$@); sub updateSchemaCache($); # syntax mappings according to # * http://msdn.microsoft.com/en-us/library/cc223177.aspx # * http://msdn.microsoft.com/en-us/library/windows/desktop/aa772375.aspx my %syntaxMap = ( # Boolean '1.3.6.1.4.1.1466.115.121.1.7' => { as => '2.5.5.8', oms => '1' }, # Enumeration #'1.3.6.1.4.1.1466.115.121.1.27' => { as => '2.5.5.9', oms => '10' }, # Integer #'1.3.6.1.4.1.1466.115.121.1.27' => { as => '2.5.5.9', oms => '2' }, # LargeInteger '1.3.6.1.4.1.1466.115.121.1.27' => { as => '2.5.5.16', oms => '65' }, # Object(Access-Point) #'' => { as => '2.5.5.14', oms => '127' }, # Object(DN-String) #'' => { as => '2.5.5.14', oms => '127' }, # Object(OR-Name) #'' => { as => '2.5.5.7', oms => '127' }, # Object(DN-Binary) #'' => { as => '2.5.5.7', oms => '127' }, # Object(DS-DN) '1.3.6.1.4.1.1466.115.121.1.12' => { as => '2.5.5.1', oms => '127' }, # Object(Presentation-Address) #'1.3.6.1.4.1.1466.115.121.1.43' => { as => '2.5.5.13', oms => '127' }, # Object(Replica-Link) #'1.3.6.1.4.1.1466.115.121.1.5' => { as => '2.5.5.10', oms => '127' }, # String(Case) #'' => { as => '2.5.5.3', oms => '27' }, # String(IA5) '1.3.6.1.4.1.1466.115.121.1.26' => { as => '2.5.5.5', oms => '22' }, # String(NT-Sec-Desc) #'' => { as => '2.5.5.15', oms => '66' }, # String(Numeric) '1.3.6.1.4.1.1466.115.121.1.36' => { as => '2.5.5.6', oms => '18' }, # String(Object-Identifier) '1.3.6.1.4.1.1466.115.121.1.38' => { as => '2.5.5.2', oms => '6' }, # String(Octet) '1.3.6.1.4.1.1466.115.121.1.5' => { as => '2.5.5.10', oms => '4' }, # String(Printable) '1.3.6.1.4.1.1466.115.121.1.44' => { as => '2.5.5.5', oms => '19' }, # String(Sid) #'' => { as => '2.5.5.17', oms => '4' }, # String(Teletex) #'' => { as => '2.5.5.4', oms => '20' }, # String(Unicode) '1.3.6.1.4.1.1466.115.121.1.15' => { as => '2.5.5.12', oms => '64' }, # String(UTC-Time) '1.3.6.1.4.1.1466.115.121.1.53' => { as => '2.5.5.11', oms => '23' }, # String(Generalized-Time) '1.3.6.1.4.1.1466.115.121.1.24' => { as => '2.5.5.11', oms => '24' }, # telephoneNumber => String(Unicode) '1.3.6.1.4.1.1466.115.121.1.50' => { as => '2.5.5.12', oms => '64' }, # facsimileTelephoneNumber => String(Unicode) '1.3.6.1.4.1.1466.115.121.1.22' => { as => '2.5.5.12', oms => '64' }, # PostalAddress => String(Unicode) '1.3.6.1.4.1.1466.115.121.1.41' => { as => '2.5.5.12', oms => '64' }, # PresentationAddress => String(Unicode) '1.3.6.1.4.1.1466.115.121.1.43' => { as => '2.5.5.12', oms => '64' }, # DataQualitySyntax => String(Unicode) '1.3.6.1.4.1.1466.115.121.1.13' => { as => '2.5.5.12', oms => '64' }, # OctetString => String(Octet) '1.3.6.1.4.1.1466.115.121.1.40' => { as => '2.5.5.10', oms => '4' }, ); # die on errors on the command line die "Usage: schema2ad [] \n" if (scalar(@ARGV) != 2); # parse Schema file my $schema = Net::LDAP::Schema->new($ARGV[0]) or die 'Unable to parse schema file '.$ARGV[0]."\n"; my $ldifdata; # open an "intermediate" file handle pointing to a scalar open(my $ldifhandle, '>', \$ldifdata) or die 'Unable to open Perl scalar as file handle'."\n"; # print header print $ldifhandle < -j # =============================================================================== EOT # create LDAP pointing to the intermediate file handle # this is necessary as we want to post-process the generated ldif data my $ldif = Net::LDAP::LDIF->new($ldifhandle,"w", change => 1, wrap => 0, version => 1) or die 'Unable to create LDIF object'."\n"; # loop over all attribute types # http://msdn.microsoft.com/en-us/library/windows/desktop/ms675578.aspx foreach my $at ($schema->all_attributes) { my $cn = $at->{name}; my $syntax = $schema->attribute_syntax($cn); die "Syntax not known for attribute $cn\n" if (!$syntax); $syntax = $syntax->{name}; die "Unknown syntax $syntax for attribute $cn\n" if (!exists($syntaxMap{$syntax})); my $entry = Net::LDAP::Entry->new('CN='.$cn.',CN=Schema,CN=Configuration,DC=X', objectclass => [ qw/top attributeSchema/ ], cn => $cn, attributeID => $at->{oid}, attributeSyntax => $syntaxMap{$syntax}->{as}, adminDisplayName => $cn, lDAPDisplayName => simplify($cn), oMSyntax => $syntaxMap{$syntax}->{oms}); $entry->add(isSingleValued => 'TRUE') if ($at->{'single-value'}); $entry->add(rangeLower => 1, rangeUpper => $at->{max_length}) if ($at->{max_length}); $entry->add(description => $at->{desc}, adminDescription => $at->{desc}) if ($at->{desc}); # set default indexing to "per Container" $entry->add(searchFlags => 3); $entry->update($ldif); } updateSchemaCache($ldif); # loop over all object classes # http://msdn.microsoft.com/en-us/library/windows/desktop/ms675579.aspx foreach my $oc ($schema->all_objectclasses) { my $cn = $oc->{name}; my $entry = Net::LDAP::Entry->new('CN='.$cn.',CN=Schema,CN=Configuration,DC=X', objectclass => [ qw/top classSchema/ ], cn => $cn, # object is writable instanceType => 4, governsID => $oc->{oid}, adminDisplayName => $cn, # http://msdn.microsoft.com/en-us/library/windows/desktop/ms677964.aspx objectClassCategory => $oc->{auxiliary} ? 3 : 1, lDAPDisplayName => simplify($cn)); $entry->add(subClassOf => $oc->{sup}) if ($oc->{sup}); $entry->add(description => $oc->{desc}, adminDescription => $oc->{desc}) if ($oc->{desc}); $entry->add(mustContain => [ sort map { simplify($_) } @{$oc->{must}} ]) if ($oc->{must}); $entry->add(mayContain => [ sort map { simplify($_) } @{$oc->{may}} ]) if ($oc->{may}); $entry->update($ldif); updateSchemaCache($ldif); } # add freshly created objectclasses to other objectclasses #addAUXclass($ldif, $structural, @auxiliary); #updateSchemaCache($ldif); $ldif->done; # post-process the ldif data # http://msdn.microsoft.com/en-us/library/windows/desktop/ms677268.aspx $ldifdata =~ s/^(changetype:)\s+add$/$1 ntdsSchemaAdd/mg; # write footer $ldifdata .= "\n\n# EOF"; # write output file with DOS/Windows line endings if ($ARGV[1] eq '-') { binmode(*STDOUT, ':crlf'); print $ldifdata; } else { open(my $outputfile, '>:crlf', $ARGV[1]) or die 'Unable to create output file '.$ARGV[1]."\n"; print $outputfile $ldifdata; close($outputfile); } #### function definitions #### ## simplify attribute / objectclass name to letters and digits only ## # Synopsis: $simplifiedName = simplify($name) sub simplify($) { my $str = shift; $str =~ s/;.*$//; $str =~ s/[^A-Za-z0-9]//g; return $str; } ## add AUXILIARY classes to a STRUCTURAL class ## # Synopsis: addAUXclass($ldif, $structural, @auxiliary) sub addAUXclass($$@) { my $ldif = shift; my $structural = shift; my @auxiliary = @_; if ($structural && @auxiliary) { my $entry = Net::LDAP::Entry->new('CN='.$structural.',CN=Schema,CN=Configuration,DC=X'); $entry->changetype('modify'); $entry->add(auxiliaryClass => \@auxiliary); } } ## trigger updating the schema cache ## # Synopsis: updateSchemaCache($ldif) # see: http://msdn.microsoft.com/en-us/library/windows/desktop/ms677976.aspx sub updateSchemaCache($) { my $ldif = shift; my $entry = Net::LDAP::Entry->new(''); # empty DN $entry->changetype('modify'); $entry->add(schemaUpdateNow => 1); #DN: #changetype: modify #add: schemaUpdateNow #schemaUpdateNow: 1 #- $entry->update($ldif); } =head1 NAME schema2ad.pl -- convert standard LDAP schema into a format that AD can digest =head1 SYNOPSIS B I I =head1 DESCRIPTION schema2ad.pl parses the contents of the schema file I, converts them to Active Directory / Active Directory Application Mode / Active Directory Lightweight Directory Service compatible format, and writes the result to I. =head1 ARGUMENTS schema2ad.pl takes two arguments: =over 4 =item I Input file containing a schema entry with its I and I attributes. =item I Output file holding the generated AD compatible schema. =back =head1 AUTHOR Peter Marschall =head1 COPYRIGHT & LICENSE Copyright (c) 2012 Peter Marschall All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut perl-ldap-0.58/contrib/tklkup0000755000175000000620000052446112173014262015716 0ustar marschapstaff#!/usr/local/bin/perl # # Copyright (c) 1999 - 2003 Clif Harden. All Rights Reserved # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU GENERAL PUBLIC LICENSE. #---------------------------------------------------------------------------- # # This program was originally written by Clif Harden. # Some of the software in the LDAP search subroutine was orginally # written by Graham Barr. It is based on Graham Barr's PERL LDAP # module and the PERL TK module. # Both modules are available from the CPAN.org system. # # $Id: tklkup,v 2.47 2006/03/27 01:45:56 clif Exp $ # # Purpose: This program is designed to retrieve data from a LDAP # directory and display on the graphical user interface # created by this program. This program can edit the data # retrieved from the directory. # # # # #---------------------------------------------------------------------------- # use Carp; use Data::Dumper; use MIME::Base64; #use Net::LDAP qw(:all); use Net::LDAP; use Net::LDAP::Filter; use Net::LDAP::Util qw( ldap_explode_dn ldap_error_name ldap_error_text canonical_dn ); use Net::LDAP::Constant; use Net::LDAP::DSML; use Net::LDAP::LDIF; use Getopt::Std; use Tk; use Tk::NoteBook; use Tk::ErrorDialog; use Tk::LabFrame; use Tk::ROText; use Tk::HList; use Tk::Tree; use Tk::Label; use subs qw/ops_items/; # # Global variables, wish I did not have to use them # but Tk forces me to. # my %Global = (); my %Tree = (); $Global{'jpeg'} = 1; eval 'require Tk::JPEG'; $Global{'jpeg'} = 0 if ( $@ ); $Global{'splash'} = 1; eval { require Tk::Splashscreen; require Tie::Watch; }; $Global{'splash'} = 0 if ( $@ ); # # Window roots # $Global{'mainWindow'} = undef(); $Global{'schemaWindow'} = undef(); $Global{'histWindow'} = undef(); $Global{'portWindow'} = undef(); $Global{'bindWindow'} = undef(); my %schemaHash = (); &init_schemaHash; $Global{'LDAP_SERVER'} = ""; $Global{'ldap'} = undef; $Global{'bindpw'} = ""; $Global{'binddn'} = ""; $Global{fref} = 0; $Global{'adata'} = ""; $Global{'info'} = ""; $Global{'slist'} = 0; $Global{'setVersion'} = 3; # set version 3 ldap $Global{'sfile'} = 0; $Global{'fdata'} = ""; $Global{'hand'} = 'left'; $Global{'horz'} = 200; $Global{'vert'} = 20; $Global{'Font'} = "{ MS Sans Serif} 10"; $Global{'CORE_SERVER'} = ""; $Global{'sclear'} = 0; $Global{'limit'} = 100; $Global{port} = 389; $Global{nsslport} = 389; $Global{sslport} = 636; $Global{'platform'} = ($^O eq 'MSWin32') ? $^O : 'unix' ; $Global{'max'} = 0; $Global{'infoFilter'} = "equal"; $Global{'nismapname'} = 0; $Global{'automountMapName'} = 0; $Global{'records'} = 0; $Global{'mwwidth'} = 600; $Global{'mwheight'} = 520; $Global{dirConnError} = undef(); $Global{'setSSL'} = 0; my $sbbframe; my $LDAP_SEARCH_BASE = ""; my $DN_BASE = ""; my @base = (); my $base = ""; my $defaultPort = 389; my $sepChar = "\f"; # formfeed separator #-------------------------------------------------------- # Handle the command line parameter(s) #-------------------------------------------------------- getopts( 'hnrd:i:' ); Usage() if ( $opt_h ); my $debug = $opt_n ? 1 : 0; # Fork this process on start up. # # If not in debug mode; # Fork a child process and kill the parent. # (That sounds nasty) # if ( !$debug && $Global{'platform'} eq 'unix' ) { FORK: { if ( $pid = fork ) { # this is parent process, so DIE # exit; } elsif ( defined $pid) { # this is the child process, so keep on running # &MAIN_PROCESS(); } # End of elsif in FORK. } # End of FORK block. } # End of if. else { # # in debug mode, so do not fork but continue to run. # &MAIN_PROCESS(); } # End of else sub MAIN_PROCESS { $Global{'mainWindow'} = MainWindow->new; $splash = $Global{'mainWindow'}->Splashscreen(-milliseconds => 0) if ( $Global{splash} ); $splframe = $splash->LabFrame(-label => "TKLKUP SPLASH SCREEN", -labelside => "acrosstop") ->pack() if ( $Global{splash} ); $splashList = $splframe->Listbox( -height => 2, -width => 40 ) if ( $Global{splash} ); $splashList->pack() if ( $Global{splash} ); $splash->Splash() if ( $Global{splash} ); $splashList->insert("0", "Reading initialization file") if ( $Global{splash} ); $splash->update() if ( $Global{splash} ); &initializeProgram; # Read the dot file. $Global{'mainWindow'}->geometry("$Global{'mwwidth'}x$Global{'mwheight'}+$Global{'horz'}+$Global{'vert'}"); $splash->update() if ( $Global{splash} ); &createSearchBaseWindow(); $Global{'sbWindow'}->withdraw if Tk::Exists($Global{'sbWindow'}); &initializeBases; $splashList->insert("0", "Setting tklkup GUI.") if ( $Global{splash} ); $splash->update() if ( $Global{splash} ); $Global{'mainWindow'}->title("TKLKUP"); # # Create the Menubar # $Global{'mainWindow'}->configure(-menu => $Global{'menubar'} = $Global{'mainWindow'}->Menu); $Global{'menubar'}->cascade(-label => "Directory ~OPS", -menuitems => ops_items); $Global{'menubar'}->command(-label => "Set ~Bind Credentials", -command => \&BIND ); $Global{'menubar'}->command(-label => "Set DSA ~Port", -command => \&PORT ); $Global{'menubar'}->command(-label => "E~XIT PROGRAM", -command => sub{exit;} ); # # Create process Exit button # $mwf = $Global{'mainWindow'} -> Frame() -> pack(-side => "top"); $mwf ->Label( -text => "DIRECTORY SERVER") ->pack (-side =>"left"); $Global{'slist'} = $mwf ->Listbox( -height => 1 ); $Global{'slist'}->pack( -side => "left", -padx => 2, -pady => 5 ); $Global{'slist'}->insert("end", $Global{'LDAP_SERVER'}); # # Create directory server selection button # This is where the user will select the directory server to # query. # $smenu = $mwf -> Menubutton(-text => "SELECT SERVER", -relief => "raised", -font => $Global{'Font'}, -borderwidth => 3 ) -> pack(-side => "left", -pady => 2, -padx => 5 ); # # Create a LDAP version status label # $Versionstatus = $mwf -> Label -> pack(-side => "left", -anchor => "center" ); if ( $Global{setVersion} == 3 ) { $Versionstatus->configure( -text => "LDAP V3", -font => $Global{Font}); } else { $Versionstatus->configure( -text => "LDAP V2", -font => $Global{Font}); } # # Create a SSL status label # $SSLstatus = $mwf -> Label -> pack(-side => "left", -anchor => "center" ); if ( $Global{setSSL} ) { $SSLstatus->configure( -text => "SSL", -font => $Global{Font}); } else { $SSLstatus->configure( -text => "NON-SSL", -font => $Global{Font}); } # # Create a REF status label # $FRstatus = $mwf -> Label -> pack(-side => "left", -anchor => "center" ); if ( $Global{fref} ) { $FRstatus->configure( -text => "REF", -font => $Global{Font}); } else { $FRstatus->configure( -text => " ", -font => $Global{Font}); } $Global{'mainWindow'}->update(); $Global{nb} = $Global{'mainWindow'}->NoteBook() ->pack(-expand => 1, -fill => 'both'); $Global{p2} = $Global{nb}->add('SEARCH',-label => 'SEARCH'); $Global{'mainWindow'}->update(); &initializeP2; $Global{'mainWindow'}->update(); $Global{p3} = $Global{nb}->add('SEARCH DISPLAY',-label => 'SEARCH DISPLAY'); &initializeP3; $Global{'mainWindow'}->update(); $Global{p4} = $Global{nb}->add('SCHEMA',-label => 'SCHEMA DATA'); &initializeP4; $Global{'mainWindow'}->update(); $Global{p5} = $Global{nb}->add('CREATE ENTRY',-label => 'CREATE ENTRY'); &initializeP5; $Global{'mainWindow'}->update(); $Global{p1} = $Global{nb}->add('INFO',-label => 'INFO'); &initializeP1; $splash->Destroy() if ( $Global{splash} ); $splash = undef(); $Global{schema_timer} = $Global{mainWindow}->repeat(1000, \&update_schema); # # Run the Main loop looking for events. # MainLoop; } sub ops_items { [ [ 'command', 'Explore ~Root DSE', -accelerator => "Ctrl-r", -command => \&rootDse ], "", [ 'command', 'Set ~SSL', -accelerator => "Ctrl-s", -command => \&setSSL ], "", [ 'command', 'Set ~NON-SSL', -accelerator => "Ctrl-n", -command => \&nonSSL ], "", [ 'command', 'Toggle ~LDAP Version', -accelerator => "Ctrl-l", -command => \&toggleVersion ], "", [ 'command', 'Toggle ~Follow Referral', -accelerator => "Ctrl-f", -command => \&toggleRef ], "", [ 'command', 'E~xit', -accelerator => "Ctrl-x", -command => sub { exit;} ], ]; }# End of subroutine ops_items sub update_schema { if ( $Global{schemaServer} ne $Global{CORE_SERVER} ) { $Global{mainWindow} -> Busy(-recurse => 1); # window is busy $Global{schema_timer}->cancel; if ( $Global{schemaServer} ne $Global{CORE_SERVER} ) { $currentPanel = $Global{nb} -> raised(); $Global{nb} -> raise('INFO'); &schema; $Global{nb} -> raise($currentPanel); } $Global{schemaServer} = $Global{LDAP_SERVER}; $Global{schema_timer} = $Global{mainWindow}->repeat(1000, \&update_schema); $Global{mainWindow} -> Unbusy; # window is not busy } } # End of subroutine update_schema sub init_schemaHash { $schemaHash{ 'schema' } = undef(); $schemaHash{ 'obj' } = {}; $schemaHash{ 'tree' } = {}; $schemaHash{ 'atts' } = []; $schemaHash{ 'ocs' } = []; $schemaHash{ 'mrs' } = []; $schemaHash{ 'nfm' } = []; $schemaHash{ 'lsyn' } = []; $schemaHash{ 'dits' } = []; $schemaHash{ 'ditc' } = []; $schemaHash{ 'mru' } = []; } # End of subroutine init_schemaHash sub setSSL { $Global{setSSL} = 1; $Global{port} = $Global{sslport}; $SSLstatus->configure( -text => "SSL", -font => $Global{Font}); } # End of subroutine setSSL sub nonSSL { $Global{setSSL} = 0; $Global{port} = $Global{nsslport}; $SSLstatus->configure(-text => "NON-SSL", -font => $Global{Font}); } # End of subroutine nonSSL sub toggleVersion { if ( $Global{setVersion} == 2 ) { $Global{setVersion} = 3; $Versionstatus->configure( -text => "LDAP V3", -font => $Global{Font}); } else { $Global{setVersion} = 2; $Versionstatus->configure( -text => "LDAP V2", -font => $Global{Font}); } } # End of subroutine toggleVersion sub toggleRef { if ( $Global{fref} == 0 ) { $Global{fref} = 1; $FRstatus->configure( -text => "REF", -font => $Global{Font}); } else { $Global{fref} = 0; $FRstatus->configure( -text => " ", -font => $Global{Font}); } } # End of subroutine toggleRef sub saveLdif { $Global{'saveLdifck'} -> select; $Global{'saveXmlck'} -> deselect; } # End of subroutine saveLdif sub saveXml { $Global{'saveXmlck'} -> select; $Global{'saveLdifck'} -> deselect; } # End of subroutine saveXml sub initializeProgram { # # Check for dot file, use it to configure program. # if ( $Global{'platform'} eq 'unix' ) { $ENV{'TMP'} = "/tmp"; } else { $ENV{'TMP'} = "./"; } @dotfile = (); push(@dotfile,$opt_i) if $opt_i; # # Active State Perl does not always set ENV HOME. # if ( !$ENV{HOME} ) { $ENV{"HOME"} = "."; } if ( !$ENV{PWD} ) { $ENV{PWD} = "."; } push( @dotfile, "$ENV{HOME}/.tklkup"); push( @dotfile, "$ENV{PWD}/.tklkup"); foreach (@dotfile) { # # first .tklkup file found is the one that will be used. # if ( -e $_ && -r $_ ) { $dotfile = $_; last; } } if ( -e $dotfile && -r $dotfile ) { open(DOT, "<$dotfile"); @Input = ; foreach (@Input) { my @data = (); if ( /^#/ || /^\s+$/ ) { next; } chomp(); @data = split(/:/); $data[1] =~ s/^\s*//; $data[1] =~ s/\s+$//; $data[2] =~ s/^\s*// if ( defined($data[2]) ); $data[2] =~ s/\s+$// if ( defined($data[2]) ); $_ = $data[0]; TYPE: { /^followref/i && do { $Global{fref} = 1; last TYPE; }; /^binddn/i && do { $Global{binddn} = $data[1]; last TYPE; }; /^hand/i && do { $Global{'hand'} = $data[1]; last TYPE; }; /^port/i && do { $Global{port} = $data[1]; $Global{nsslport} = $data[1]; last TYPE; }; /^sslport/i && do { $Global{sslport} = $data[1]; last TYPE; }; /^limit/i && do { if (defined($data[1]) ) { $Global{'limit'} = $data[1]; } else { $Global{'limit'} = 100; } last TYPE; }; /^attribute/i && do { push(@attribute, $data[1]); last TYPE; }; /^server/i && do { push(@server, $data[1]); if ( defined($data[2]) ) { $server{$data[1]} = $data[2]; } last TYPE; }; /^font/i && do { $Global{'Font'} = $data[1]; last TYPE; }; /^nismapname/i && do { $Global{'nismapname'} = 1; last TYPE; }; /^automountMapName/i && do { $Global{'nismapname'} = 1; last TYPE; }; /^mwwidth/i && do { $Global{'mwwidth'} = $data[1]; last TYPE; }; /^mwheight/i && do { $Global{'mwheight'} = $data[1]; last TYPE; }; my $error = "Parsing configuration file found an undefined type: $_"; ERROR(\$error); } # End of case TYPE } close(DOT); } # # Default is for left hand people! # Over ride the dot file if the -r command line # option is used. # if ( defined($opt_r) ) { $Global{'hand'} = $opt_r ? 'right' : 'left'; # my $Global{'hand'} = $opt_r ? 'left' : 'right'; # uncomment this for right hand def. } # # Default directory search attributes. # if ( $#attribute < 1 ) { @attribute = qw/ uid sn cn rfc822mailbox telephonenumber facsimiletelephonenumber gidnumber uidnumber/; } push(@attribute,"Filter"); # put roll your on filter at the end } # End of subroutine initializeProgram sub initializeBases { # # Default directory server. # if ( @server < 1 ) { $server[0] = "ldap.umich.edu"; } $Global{'LDAP_SERVER'} = $server[0]; $Global{'CORE_SERVER'} = $Global{'LDAP_SERVER'}; # # Default directory search base. # $error = &dirConn(); # connect and bind to the directory. if ( !$error ) { # # Find the branches of the directory. # if ( !$error || $Global{setVersion} ) { if ( defined($server{$server[0]}) ) { # user defined base my $t1 = []; push(@$t1, getBases($Global{'LDAP_SERVER'}, $server{$server[0]})); $ncbase =~ tr/[A-Z]/[a-z]/; $Tree{$ncbase} = $t1; $BASEDN{$ncbase} = $ncbase; } else { my $error = 0; my $entry; my $mesg; # use root_dse to find the bases @base = (); $entry = $Global{ldap}->root_dse(); if ( defined($entry) ) { my $attr = $entry->get_value('namingContexts', asref => 1); if ( defined($attr) ) { foreach my $ncbase ( @$attr ) { $splashList->insert("1", "Searching $ncbase") if ( $Global{splash} ); $splash->update() if ( $Global{splash} ); my $t1 = []; push(@$t1, getBases($Global{'LDAP_SERVER'}, $ncbase)); $ncbase =~ tr/[A-Z]/[a-z]/; $Tree{$ncbase} = $t1; $BASEDN{$ncbase} = $ncbase; } } } } } &initTree(); } else { if ( defined($Global{dirConnError}) ) { ERROR(\$Global{dirConnError}); } else { ERROR($error); } } @NcKeys = sort(keys(%Tree)); if ( @NcKeys ) { $LDAP_SEARCH_BASE = $NcKeys[0]; $DN_BASE = $NcKeys[0]; } else { $LDAP_SEARCH_BASE = ""; $DN_BASE = ""; } } # End of subroutine initializeBases # # Initialize panel 1 # sub initializeP1 { $dsaframe = $Global{p1}->Frame() ->pack( -fill => "both", -side => "top" ); # # Set up the select directory server radio buttons. # foreach (@server) { $smenu->radiobutton( -label => $_, -variable => \$Global{'LDAP_SERVER'}, -value => $_, -command => \&server, -font => $Global{'Font'} ); } $dsads = $dsaframe ->LabFrame( -labelside => "acrosstop", -label => "DIRECTORY SERVER") ->pack (-side =>"left"); $Global{dsadsls} = $dsads->Listbox( -height => 1 ); $Global{dsadsls}->pack( -side => "top", -padx => 2, -pady => 5 ); $Global{dsadsls}->insert("end", $Global{'LDAP_SERVER'}); $dsasb = $dsaframe ->LabFrame( -labelside => "acrosstop", -label => "SEARCH BASE") ->pack (-side =>"left"); $Global{dsasbls} = $dsasb->Listbox( -height => 1); $Global{dsasbls}->pack( -side => "left", -padx => 2, -pady => 5 ); $Global{dsasbls}->insert("end", $LDAP_SEARCH_BASE); $dsapt = $dsaframe ->LabFrame( -labelside => "acrosstop", -label => "PORT") ->pack (-side =>"left"); $Global{dsaptls} = $dsapt->Listbox( -height => 1 ); $Global{dsaptls}->pack( -side => "left", -padx => 2, -pady => 5 ); $Global{dsaptls}->insert("end", $Global{port}); $attframe = $Global{p1}->Frame() ->pack( -fill => "both", -side => "bottom"); $msgframe = $attframe->LabFrame(-label => "Process Messages", -labelside => "acrosstop" ) ->pack( -fill => "both", -side => "top", -padx => 1, -pady => 1 ); $splashList->insert("0", "Creating root dse and attribute buttons.") if ( $Global{splash} ); $splash->update() if ( $Global{splash} ); $msgbox = $msgframe ->Scrolled('Listbox', -scrollbars => 's', -width => 50, -height => 10 ); $msgbox->pack( -side => "left" ); # # Allow mainWindow to update # $Global{'mainWindow'}->update; } # End of subroutine initializeP1 # # Initialize panel 2 # sub initializeP2 { $tpframe = $Global{p2} ->Frame(-borderwidth => 2,-relief => "raised") ->pack(-side => "top", -fill => "x"); $bmframe = $Global{p2} ->Frame ->pack(-side => "bottom", -fill => "x"); $hlframe = $tpframe ->Frame(-borderwidth => 2,-relief => "raised") ->pack( -side => "right"); # # Create search base list box. # $sbbframe = $hlframe->LabFrame(-label => "DIRECTORY SEARCH BASE", -labelside => "acrosstop") ->pack( -side => "top", -anchor => "e"); # # Create the Attributes and Save to frame # $ltframe = $tpframe ->Frame() ->pack( -side => "left", -fill => "both"); # # Create the Attributes frame # $aframe = $ltframe ->LabFrame(-label => "FILTER\nATTRIBUTES", -labelside => "acrosstop", -relief => "raised") ->pack( -side => "top", -fill => "both"); # # Create the Save to frame # $fmtframe = $ltframe ->LabFrame( -label => "SAVE FORMAT", -labelside => "acrosstop", -relief => "raised") ->pack( -side => "top", -fill => "both"); # # Create a ldif Checkbutton that will set up a ldif variable # # $Global{saveLdifck} = $fmtframe -> Checkbutton( -text => "LDIF", -command => \&saveLdif, -variable => \$Global{ldif}, -onvalue => 1, -offvalue => 0, -font => $Global{'Font'} ) -> pack(-side => "bottom", -anchor => "w" ); $Global{saveLdifck}->select(); # # Create a ldif Checkbutton that will set up a ldif variable # # $Global{saveXmlck} = $fmtframe -> Checkbutton( -text => "XML", -command => \&saveXml, -variable => \$Global{xml}, -onvalue => 1, -offvalue => 0, -font => $Global{'Font'} ) -> pack(-side => "left", -anchor => "w" ); $Global{saveXmlck} -> deselect; $btframe = $tpframe ->Frame(-borderwidth => 2, -relief => "raised") ->pack( -side => "left", -fill => "both"); # # Create the search base box # $sbblist = $sbbframe ->Listbox( -width => 40, -font => $Global{'Font'}, -height => 1 ); $sbblist->pack(-side => $Global{hand}); $sbblist->insert("end", $LDAP_SEARCH_BASE); $Global{dsasbls}->insert(0, $LDAP_SEARCH_BASE) if ( $Global{dsasbls} ); # # Create directory server search base button. # This is the point from which the search operation # will start from. # $sbmenu = $sbbframe->Button( -text => " SELECT\nBASE", -command => \&sbHlist, -font => $Global{'Font'}, -borderwidth => 3 ) -> pack(-side => "top", -anchor => "w", -padx => 1, -pady => 1 ) if ( !Exists($sbmenu)); # # Create Hierarchial DN list box, this is where the DN data # tree will be displayed. # $Global{'searchHList'} = $hlframe ->Scrolled('HList', -font => $Global{'Font'}, -scrollbars => 'se', -width => 50, -height => 13, -itemtype => 'text', -separator => $sepChar, -selectmode => 'single', -browsecmd => sub { # my $objects = shift; # get base and the dn &ldapAction($objects); } # End of subroutine browsecmd ); # End of Scrolled HList. #$Global{'searchHList'}->add($LDAP_SEARCH_BASE, -text=>$LDAP_SEARCH_BASE); $Global{'searchHList'}->pack(-side => "right"); # # Create additional attributes selection button # This is where the user will select any special attribute to # search on. # $amenu = $aframe -> Menubutton(-text => " SELECT\n ADDITIONAL\n ATTRIBUTES", -relief => "raised", -font => $Global{'Font'}, -borderwidth => 3 ) -> pack( -side => "top", -anchor => "w" ); # # First set up the 4 main attribute Radio buttons. # # # If there are other attribute after the first 4 then set them # up inside the select additional attributes button. # # if ( $#attribute > 4 ) { my $sptr = 0; while ( $sptr <= 3 ) { $_ = shift(@attribute); $rbsn = $aframe -> Radiobutton(-text => "$_", -variable => \$Global{'info'}, -value => "$_", -font => $Global{'Font'} ) -> pack( -side => "top", -anchor => 'w'); if ( !$sptr ) { $rbsn->select(); } # select first attribute ++$sptr; } } # End of if ( $#attribute > 4 ) else { # # Less than 4 attributes in user create initialization # file, this is valid if that is what the user wants. # my $sptr = 0; while ( @attribute ) { $_ = shift(@attribute); $rbsn = $aframe -> Radiobutton(-text => "$_", -variable => \$Global{'info'}, -value => "$_", -font => $Global{'Font'} ) -> pack( -side => "top", -anchor => "w"); if ( !$sptr ) { $rbsn->select(); } # select first attribute ++$sptr; } } # # Create radio buttons in attributes selection box. # # foreach (@attribute) { $amenu->radiobutton( -label => $_, -variable => \$Global{'info'}, -value => $_, -font => $Global{'Font'}); } # End of foreach (@attribute) # # Create ldap display button # $Global{actionDisplay} = $btframe->Button( -text => "DISPLAY", -command => \&ldapActionDisplay, -font => $Global{'Font'}, -borderwidth => 3 ) -> pack(-side => "top", -anchor => "w", -padx => 1, -pady => 1 ) if ( !Exists($Global{actionDisplay})); # # Create save to ldif button # $Global{actionLdif} = $btframe->Button(-text => "SAVE TO", -command => \&ldapActionSaveToLdif, -font => $Global{'Font'}, -borderwidth => 3) -> pack(-side => "top", -anchor => "w", -padx => 1 ) if ( !Exists($Global{actionLdif})); # # Create ldap rename button # $Global{actionRename} = $btframe->Button( -text => "RENAME ", -command => \&getRenameData, -font => $Global{'Font'}, -borderwidth => 3 ) -> pack(-side => "top", -anchor => "w", -padx => 1, -pady => 1 ) if ( !Exists($Global{actionRename})); # # Create ldap edit button # $Global{actionEdit} = $btframe->Button(-text => " EDIT ", -command => \&ldapActionEdit, -font => $Global{'Font'}, -borderwidth => 3) -> pack(-side => "top", -anchor => "w", -padx => 1 ) if ( !Exists($Global{actionEdit})); # # Create ldap delete button # $Global{actionDelete} = $btframe->Button(-text => "DELETE ", -command => \&questionAction, -font => $Global{'Font'}, -borderwidth => 3, -activeforeground => 'red') -> pack(-side => "top", -anchor => "w", -padx => 1, -pady => 1 ) if ( !Exists($Global{actionDelete})); # # Create process cancel button # $Global{actionCancel} = $btframe->Button(-text => "CANCEL ", -command => \&ldapActionCancel, -font => $Global{'Font'}, -borderwidth => 3) -> pack(-side => "top", -anchor => "w", -padx => 1 ) if ( !Exists($Global{actionCancel})); # # Create save all to ldif button # $Global{actionLdifAll} = $btframe->Button( -text => "SAVE ALL\nTO", -command => \&ldapActionMultiSaveToLdif, -font => $Global{'Font'}, -borderwidth => 3 ) -> pack(-side => "left", -anchor => "w", -padx => 1 ) if ( !Exists($Global{actionLdifAll})); $bmlframe = $bmframe ->LabFrame(-label => "File Name", -labelside => "acrosstop") ->pack(-side => "bottom", -fill => "x"); # # Create Text Entry list box. # $bmlframe->Entry(-textvariable => \$Global{'ldifFile'}, -width => 40 ) -> pack(-side => "left", -anchor => "w", -fill => 'x'); $splashList->insert("0", "Creating cascading search base menus.") if ( $Global{splash} ); $splash->update() if ( $Global{splash} ); # # Create Bottom Attribute frame. # This is where the user will enter data to be # searched for. # $tframe = $bmframe->LabFrame(-label => "FILTER DATA", -labelside => "acrosstop") ->pack( -fill => "both", -side => "bottom" , -anchor => "w"); # # Create Text Entry list box. # $tframe_text = $tframe->Entry(-textvariable => \$Global{'adata'}, -width => 27 ) -> pack(-side => "left",-anchor => "w", ); $tframe_text->bind('' => \&search ); # # Create Clear Attribute Data and Search Directory buttons # $tframe -> Button(-text => "CLEAR FILTER DATA", -command => \&AClear, -font => $Global{'Font'}, -borderwidth => 5 ) -> pack( -side => "left", -anchor => "w", -pady => 2, -padx => 2 ); # # Create get Filter selection menu button. # $sfcmenu = $tframe -> Menubutton(-text => "SET FILTER\nCONDITON", -relief => "raised", -font => $Global{'Font'}, -borderwidth => 5 ) -> pack(-side => "left", -anchor => "w", -pady => 2, -padx => 2 ); $flclist = $tframe ->Listbox( -width => 11, -height => 1 ); $flclist->pack(-side => 'top', -anchor => "w" ); $flclist->insert(0, $Global{'infoFilter'}); # # Set up the filter type radio buttons. # $rbsf = $sfcmenu -> radiobutton(-label => "equal", -variable => \$Global{'infoFilter'}, -value => "equal", -command => \&setFilter ); $rbsf = $sfcmenu -> radiobutton(-label => "begins with", -variable => \$Global{'infoFilter'}, -value => "begins with", -command => \&setFilter ); $rbsf = $sfcmenu -> radiobutton(-label => "ends with", -variable => \$Global{'infoFilter'}, -value => "ends with", -command => \&setFilter ); $rbsf = $sfcmenu -> radiobutton(-label => "contains", -variable => \$Global{'infoFilter'}, -value => "contains", -command => \&setFilter ); # # Create Search Directory button # $bmframe -> Button(-text => "SEARCH THE DIRECTORY", -command => \&search, -font => $Global{'Font'}, -borderwidth => 5 ) -> pack( -side => "bottom", -fill => "both"); #$Global{'searchHList'}->delete('all'); $Global{actionDelete}->configure( -state => 'disable'); $Global{actionDisplay}->configure( -state => 'disable'); $Global{actionEdit}->configure( -state => 'disable'); $Global{actionRename}->configure( -state => 'disable'); $Global{actionLdif}->configure( -state => 'disable'); $Global{actionCancel}->configure( -state => 'disable'); # # Allow mainWindow to update # $Global{'mainWindow'}->update; } # End of subroutine initializeP2 # # Initialize panel 3 # sub initializeP3 { my $cframe; my $lframe; my $rbclear; # # Create frame for clear buttons. # $cframe = $Global{p3}->Frame() ->pack( -fill => "both", -side => "bottom", -padx => 5, -pady => 2); # # Create Clear Data # $cframe -> Button(-text => " CLEAR DATA ", -command => \&display_clear, -font => $Global{'Font'}, -borderwidth => 3 ) ->pack( -fill => 'both' ); # # Create list frame. # $lframe = $Global{p3}->LabFrame(-label => "DIRECTORY DATA", -labelside => "acrosstop" ) ->pack( -fill => "both", -side => "top", -padx => 5, -pady => 2, -expand => 1); # # Create a Clear Data Radiobutton that will execute subroutine clear # to clear the List box before each directory query. # $rbclear = $lframe -> Checkbutton(-text => "CLEAR DIRECTORY DATA ON EACH QUERY", -variable => \$display_clear, -onvalue => 1, -offvalue => 0, -font => $Global{'Font'} ) -> pack(-anchor => 'sw' ); $rbclear->select(); # # Create a ROText Box that will actually contain the # returned directory data. # $list = $lframe ->Scrolled('ROText', -scrollbars => 'se', -width => 80, -height => 20, -wrap => 'none', -font => $Global{'Font'} ); $list->pack(-fill => "both", -expand => 1 ); # # Allow mainWindow to update # $Global{'mainWindow'}->update; } # End of subroutine initializeP3 # # Initialize panel 4 # sub initializeP4 { # # Search the directory for schema data # my $srbclear; my $srbfile; my $srbfilelabel; my $slframe; my $ssframe; my $sbbframe; my $aframe; my $tframe; my $sbframe; # # Create bottom Search Directory frame # $sbframe = $Global{'p4'}->Frame( -borderwidth => 2, -relief => "raised")->pack( -fill => "both", -side => "bottom", -padx => 2); # # Create Search Directory button # $sbframe -> Button(-text => "RETRIEVE DIRECTORY SCHEMA", -command => \&schema, -font => $Global{'Font'}, -borderwidth => 3 ) -> pack( -fill => "both"); $srbfilelabel = $Global{'p4'}->LabFrame(-label => "SCHEMA DUMP TO FILE", -labelside => "acrosstop") ->pack( -fill => "both", -anchor => "w", -padx => 2); $srbfile = $srbfilelabel -> Checkbutton( -text => "Write schema data to file, enter file name in text box below this line. ", -variable => \$Global{'sfile'}, -onvalue => 1, -offvalue => 0, -font => $Global{'Font'} ) -> pack(-anchor => "w" ); $srbfilelabel -> Checkbutton( -text => "Write schema data to file in DSML XML format.", -variable => \$Global{'xml'}, -onvalue => 1, -offvalue => 0, -font => $Global{'Font'} ) -> pack(-anchor => "w" ); # # Create Text Entry list box. # $srbfilelabel->Entry(-textvariable => \$Global{'fdata'}, -width => 25 ) -> pack(-fill => 'x'); # # Create list frame. # $slframe = $Global{'p4'}->LabFrame(-label => "DIRECTORY SCHEMA DATA", -labelside => "acrosstop") ->pack( -fill => "both", -side => "top", -expand => 1); # # Create a Clear Data Radiobutton that will execute subroutine clear # to clear the List box before each directory query. # $selframe = $slframe -> LabFrame(-label => "DISPLAY SELECTED OBJECTS", -labelside => "acrosstop" ) ->pack( -side => $Global{'hand'}, -expand => 1, -fill => "both" ); $sellframe = $selframe->Frame( -borderwidth => 0, -relief => "raised")->pack( -fill => "both", -side => "top", -padx => 0, -pady => 0); $sellAll = $sellframe -> Checkbutton(-text => "ALL", -variable => \$selectAll, -onvalue => 1, -offvalue => 0, -font => $Global{'Font'} ) -> pack(-side => "top", -anchor => 'w' ); $sellAll->select(); $sellObj = $sellframe -> Checkbutton(-text => "objectClasses", -variable => \$selectObj, -onvalue => 1, -offvalue => 0, -font => $Global{'Font'} ) -> pack(-side => "top", -anchor => 'w' ); $sellMatch = $sellframe -> Checkbutton(-text => "matchingRules", -variable => \$selectMatch, -onvalue => 1, -offvalue => 0, -font => $Global{'Font'} ) -> pack(-side => "top", -anchor => 'w' ); $sellAtt = $sellframe -> Checkbutton(-text => "attributeType", -variable => \$selectAtt, -onvalue => 1, -offvalue => 0, -font => $Global{'Font'} ) -> pack(-side => "top", -anchor => 'w' ); $sellsyn = $sellframe -> Checkbutton(-text => "ldapsyntaxes", -variable => \$selectSyn, -onvalue => 1, -offvalue => 0, -font => $Global{'Font'} ) -> pack(-side => "top", -anchor => 'w' ); $sellnf = $sellframe -> Checkbutton(-text => "nameforms", -variable => \$selectNf, -onvalue => 1, -offvalue => 0, -font => $Global{'Font'} ) -> pack(-side => "top", -anchor => 'w' ); $selldsr = $sellframe -> Checkbutton(-text => "ditstructurerules", -variable => \$selectDsr, -onvalue => 1, -offvalue => 0, -font => $Global{'Font'} ) -> pack(-side => "top", -anchor => 'w' ); $selldcr = $sellframe -> Checkbutton(-text => "ditcontentrules", -variable => \$selectDcr, -onvalue => 1, -offvalue => 0, -font => $Global{'Font'} ) -> pack(-side => "top", -anchor => 'w' ); $sellmru = $sellframe -> Checkbutton(-text => "matchingruleuse", -variable => \$selectMru, -onvalue => 1, -offvalue => 0, -font => $Global{'Font'} ) -> pack(-side => "top", -anchor => 'w' ); $sellframe -> Button(-text => "SHOW HIERARCHIAL\nOBJECTCLASS TREE", -command => \&Hierarchial, -font => $Global{'Font'}, -borderwidth => 3 ) -> pack(-side => "bottom" ); # # Create Clear Attribute Data and Search Directory buttons # $slframe ->Button(-text => " CLEAR DATA ", -command => \&schema_clear, -font => $Global{'Font'}, -borderwidth => 3 ) -> pack(-side => "bottom", -fill => "both", -padx => 5 ); # # Create a ROText Box that will actually contain the # returned directory data. # $schema_list = $slframe ->Scrolled('ROText', -scrollbars => 'se', -width => 50, -height => 20, -wrap => 'none', -font => $Global{'Font'} ); $schema_list->pack( -side => "bottom" ); # # Allow mainWindow to update # $Global{'mainWindow'}->update; } # End of subroutine initializeP4 # # Initialize panel 5 # sub initializeP5 { $ldifframe = $Global{p5} ->LabFrame(-label => "LDIF FILE NAME") ->pack(-side => "top", -fill => "x"); # # Create Text Entry list box. # $ldifframe->Entry(-textvariable => \$Global{'createLdifFile'}, -width => 25 ) -> pack(-fill => 'x'); # # Create Create Ldif Entry button # $Global{createLdifEntry} = $ldifframe->Button( -text => "CREATE/MODIFY ENTRY FROM LDIF FILE", -command => \&ldapActionCreateLdifEntry, -font => $Global{'Font'}, -borderwidth => 3 ) -> pack(-side => "top", -anchor => "w", -padx => 5, -pady => 5 ) if ( !Exists($Global{createLdifEntry})); $eframe = $Global{p5} ->Frame(-borderwidth => 2,-relief => "raised") ->pack(-side => "top", -anchor => 'e'); $cteframe = $eframe ->LabFrame(-label => "MANUALLY CREATE ENTRY") ->pack(-side => "top", -anchor => 'e'); # # Create dn base button. # $dnmenu = $cteframe->Button( -text => " SELECT\nDN BASE", -command => \&sbHlist, -font => $Global{'Font'}, -borderwidth => 3 ) -> pack(-side => "right", -anchor => "e", -padx => 5, -pady => 5 ) if ( !Exists($dnmenu)); # # Create the search base box # $dnblist = $cteframe ->Listbox( -width => 40, -font => $Global{'Font'}, -height => 1 ); $dnblist->pack(-side => "right", -anchor => 'e', -padx => 5, -pady => 5 ); $dnblist->insert("end", $DN_BASE); # # create attribute action button # $cteframe->Button(-text => "Create The\nEntry", -font => $Global{'Font'}, -borderwidth => 3, -command => \&getObjectAttributes, -relief => 'raised' ) ->pack(); } # End of subroutine initializeP5 # # Initialize panel 5a # sub initializeP5a { my $ocs = $schemaHash{'ocs'}; my $obj = $schemaHash{'obj'}; my $tree = $schemaHash{'tree'}; my $schema = $schemaHash{'schema'}; my @tmpKeys; my @must; my @may; my $colist; $Global{ceObject} = {}; my $optr = 0; # # Create Hierarchial list box, this is where the objectclass data # tree will be displayed. # $Global{'olist'} = $eframe->Scrolled('HList', -font => $Global{'Font'}, -scrollbars => 'se', -width => $Global{'max'}, -height => 20, -itemtype => 'text', -separator => $sepChar, -selectmode => 'single', -browsecmd => sub { # my $objects = shift; my $oid; my $colist; my $ab; #my @objectclasses = (); my $objectclasses = []; @$objectclasses = split(/$sepChar/,$objects); $schema = $schemaHash{'schema'}; $colist = $Global{'colist'}; $obj = $schemaHash{'obj'}; $Global{entryData} = {}; $Global{entryData}->{objectClass} = []; $Global{entryData}->{may} = []; $Global{entryData}->{must} = []; my $var = $$objectclasses[-1]; # foreach my $var (@var) # { if ( !(exists($Global{ceObject}->{$var})) ) { # # create attribute action button # $ab = $colist->Button(-text => $var, -font => $Global{'Font'}, -borderwidth => 3, -relief => 'raised' ); $Global{ceObject}->{$var} = []; $Global{ceObject}->{$var}->[0] = $ab; $Global{ceObject}->{$var}->[1] = $objects; $colist->windowCreate("end", -window => $ab ); $ab->configure( -command => [ \&deleteObjectclass, \$ab, $var ] ); # position to the next row. $colist->insert("end", "\n"); } # } } # End of subroutine browsecmd ) -> pack( -side => "top", -anchor => 'e') if ( !Tk::Exists($Global{'olist'}) ) ; # End of Scrolled HList. # # Create a ROText Box that will contain the selected objectclass(s) # for the new entry. # $Global{'colist'} = $eframe ->Scrolled('Text', -scrollbars => 'se', -width => $Global{'max'}, -height => 20, -wrap => 'none', -font => $Global{'Font'} ) ->pack( -side => "top", -anchor => 'e' ) if ( !Tk::Exists($Global{'colist'}) ) ; # End of Scrolled HList. # # Create Hierarchial list box, this is where the objectclass data # tree will be displayed. # # #$Global{'colist'} = $eframe ->Listbox( -width => $Global{'max'}, # -height => 20 ) # -> pack( -side => "top", -anchor => 'e') # if ( !Tk::Exists($Global{'colist'}) ) ; # End of Scrolled HList. @tmpKeys = sort(keys(%$tree)); my $base; $base = ""; # # Create Hierarchial list box data tree, # and display data. # eval{ foreach ( @tmpKeys ) { if ( $$tree{$_} ->[0] == 0 ) { $$tree{$_} ->[0] = 1; $Global{'olist'}->add($_, -text=>$_); # do the base. } $base = $_; $array = $$tree{$_}; $ptr = 0; foreach my $var ( @$array ) { if ( !$ptr ) { $ptr = 1; next; } $_ = $base . $sepChar . $var; $Global{'olist'}->add($_, -text => $var); if ( defined($$tree{$_}) ) { $$tree{$_}->[0] = 1; } } } $Global{'olist'}->pack(-side => "right"); }; print "$@" if ( defined($@)); @tmpKeys = sort(keys(%$tree)); # # Reset objectClass array. # foreach ( @tmpKeys ) { if ( defined($$tree{$_}) ) { $$tree{$_}->[0] = 0; } } } # End of subroutine initializeP5a sub histSearch_clear { # # Clear out text in List Box # $Global{'searchList'}->delete("1.0", "end"); } # End of clear subroutine sub histSearch_cancel{ $Global{'searchList'}->destroy if Tk::Exists($Global{'searchList'}); $Global{'searchHList'}->destroy if Tk::Exists($Global{'searchHList'}); } # End of cancel subroutine sub deleteObjectclass { my ($aba, $var) = @_; my $ab; my $colist = $Global{colist}; $ab = $Global{ceObject}->{$var}->[0]; $ab->destroy; delete($Global{ceObject}->{$var}); # # if no objects, clear the ROTEXT box. # $Global{colist}->delete("1.0","end") if ( !(keys(%{$Global{ceObject}})) ); } # # Create the Search base window to display the # search base tree. # sub createSearchBaseWindow { &globalPos(); my $x = $Global{'horz'} + 150; my $y = $Global{'vert'} + 150; # # Create Main Bind Window # $Global{'sbWindow'} = MainWindow->new; $Global{'sbWindow'}->title("Select Search Base"); $Global{'sbWindow'}->geometry("+$x+$y"); # # Create process accept button # $Global{'sbWindow'}->Button( -text => "ACCEPT SELECTED DN", -command => \&sbaccept, -font => $Global{'Font'}, -borderwidth => 3 ) -> pack(-side => "bottom", -padx => 5, -pady => 5 ) ; # # Create process cancel button # $Global{'sbWindow'}->Button(-text => "CANCEL BASE CHANGE", -command => \&sbcancel, -font => $Global{'Font'}, -borderwidth => 3) -> pack(-side => "top", -padx => 5, -pady => 5 ) ; my $sbdnframe = $Global{'sbWindow'}->Frame() ->pack( -fill => "both", -side => "top", -padx => 5, -pady => 5 ); $Global{sbtree} = $sbdnframe->Scrolled("Tree", -width => 50, -height => 20, -separator => $sepChar, -indent => 35, -scrollbars => 'sw', -selectmod => 'single', -browsecmd => sub { my $objects = shift; my %tree = %BASEDN; $Global{SelectedDN} = $tree{$objects}; } )->pack(-fill => "both", -expand => 1); sub sbcancel { $Global{'sbWindow'}->withdraw if Tk::Exists($Global{'sbWindow'}); } # End of cancel subroutine sub sbaccept { if ( exists($Global{SelectedDN}) ) { $LDAP_SEARCH_BASE = $Global{SelectedDN}; $DN_BASE = $LDAP_SEARCH_BASE; $sbblist->insert(0 , $LDAP_SEARCH_BASE); $dnblist->insert(0 , $LDAP_SEARCH_BASE); $Global{dsasbls}->insert(0, $LDAP_SEARCH_BASE) if ( $Global{dsasbls} ); delete($Global{SelectedDN}); $Global{'sbWindow'}->withdraw if Tk::Exists($Global{'sbWindow'}); } } # End of sbaccept subroutine sub sbHlist { if (Tk::Exists($Global{'sbWindow'})) { $Global{'sbWindow'}->deiconify(); $Global{mainWindow}->update; #$Global{'sbWindow'}->raise(); $Global{mainWindow}->update; } else { &createSearchBaseWindow(); &initTree(); } } } # End of createSearchBaseWindow subroutine sub initTree { my $onvar; my $bvar; my $cvar; my $t1v; my $t1; my $t2; my $t2K; my @t2Keys; my $path; my $size; my $wack; my $nvar; my @keys = sort(keys(%Tree)); foreach $nvar (@keys) { $onvar = $nvar; $t1v = $Tree{$nvar}; # print "t1 : " ,Dumper($t1v), "\n"; $Global{sbtree}->add($nvar, -text => $nvar); foreach $bvar (@$t1v) { $cvar = canonical_dn($bvar, casefold => "lower" ); $adn = $cvar; $cvar =~ s/$nvar//; chop($cvar) if ($cvar =~ /,$/); # print $bvar,"\n"; # print $cvar,"\n"; $path = "$nvar" . $sepChar; $t1 = ldap_explode_dn($cvar, casefold => "lower" ); $size = @$t1; # print "t1 size == $size\n"; while ($size > 1) { $t2 = pop(@$t1); @t2Keys = keys(%$t2); while (@t2Keys) { $t2K = shift( @t2Keys); $t2size = @t2Keys; $path .= "$t2K=$$t2{$t2K}"; $path .= "+" if ($t2size > 0 ); } $path .= $sepChar; $size = @$t1; } # chop($path) if ( $path =~ /\|$/ ); $text = ""; $t2 = pop(@$t1); @t2Keys = keys(%$t2); while (@t2Keys) { $wack = shift(@t2Keys); $t2size = @$t2Keys; $text .= "$wack=$$t2{$wack}"; $text .= "+" if ($t2size > 0 ); } $path .= $text; # print "path == $path\n"; # print "text == $text\n"; $path = $text if ( !length($path)) ; $BASEDN{$path} = $adn; $Global{sbtree}->add($path, -text => $text); } $Global{sbtree}->setmode($onvar,'close'); $Global{sbtree}->close($onvar); } $Global{sbtree}->autosetmode(); } # End of subroutine initTree sub destroyTree { } # # Get the attributes of the selected objectClasses # sub getObjectAttributes { my $oid; my $ahash; my $alArray; my @objectclasses = (); my @tmp; my $hash = $Global{ceObject}; my @hashKeys = keys(%$hash); foreach my $hvar ( @hashKeys) { @tmp = split(/$sepChar/,$Global{ceObject}->{$hvar}->[1]); foreach my $nvar (@tmp) { if ( !(grep(/$nvar/,@objectclasses)) ) { push(@objectclasses,$nvar); } } } return if (!@objectclasses); # can not create an entry with no objectclass. # # If this is a posixAccount or shadowAccount, automatically put # posixAccount, shadowAccount, and account as objectclasses for # the new entry. # push(@objectclasses, "posixAccount") if ( grep(/shadowAccount/,@objectclasses) && !( grep(/posixAccount/,@objectclasses) ) ); push(@objectclasses, "shadowAccount") if ( grep(/posixAccount/,@objectclasses) && !( grep(/shadowAccount/,@objectclasses) ) ); push(@objectclasses, "account") if ( grep(/shadowAccount/,@objectclasses) && grep(/posixAccount/,@objectclasses) && !( grep(/account/,@objectclasses) ) ); my $schema = $schemaHash{'schema'}; $obj = $schemaHash{'obj'}; $Global{entryData} = {}; $Global{entryData}->{objectClass} = []; $Global{entryData}->{may} = []; $Global{entryData}->{must} = []; foreach my $var (@objectclasses) { $Global{mainWindow}->update; $oid = $$obj{$var}->[0]; # # Get the various other items associated with # this objectclass. # my $ahash = $schema->objectclass( $oid ); # # Get the objectclass name. # push( @{$Global{entryData}->{objectClass}},$$ahash{'name'}); if ( $$ahash{must} ) { $alArray = $$ahash{must}; if ( ref($alArray) eq 'ARRAY' ) { my $aMust = $Global{entryData}->{must}; foreach my $avar ( @$alArray ) { push(@{$Global{entryData}->{must}}, $avar ) if ( !(grep(/$avar/,@$aMust)) ); } } else { push(@{$Global{entryData}->{must}}, $alArray ) if ( !(grep(/$alArray/,@{$Global{entryData}})) ); } } if ( $$ahash{may} ) { $alArray = $$ahash{may}; if ( ref($alArray) eq 'ARRAY' ) { my $aMay = $Global{entryData}->{may}; foreach my $avar ( @$alArray ) { push(@{$Global{entryData}->{may}}, $avar ) if ( !(grep(/$avar/,@$aMay)) ); } } else { push(@{$Global{entryData}->{may}}, $alArray ) if ( !(grep(/$alArray/,@{$Global{entryData}})) ); } } } &makeTheEntry; } # End of subroutine getObjectAttributes # # Search the directory for data # sub search { my $mesg; my $error; my %opt = ( 'd' => 0 ); $Global{mainWindow} -> Busy(-recurse => 1); # window is busy # # Destroy the dn history list if it exists. # $Global{'searchHList'}->delete('all') if Tk::Exists($Global{'searchHList'}); # # Parameter(s) to return # if ( $Global{'setVersion'} == 3 ) { # # Default to return everything. # $Global{att_wanted} = [ "*", "aci", "createTimeStamp", "modifyTimeStamp", "creatorsName", "modifiersName" ]; } else { # # # If you have only version 2 ldap servers you will need to # to add the attributes that you want data returned for to # this list. # # $Global{att_wanted} = [ "cn" , "sn", "mail", "modifyTimeStamp", "creatorsName", "modifiersName" ]; } # # Set Filter options. # if ( $Global{'info'} eq "Filter" ) { $match = $Global{'adata'}; } else { if ( $Global{'infoFilter'} =~ /^equal$/ ) { $match = "(" . $Global{'info'} . '=' . $Global{'adata'} . ")"; } elsif ( $Global{'infoFilter'} =~ /^begins with$/ ) { $match = "(" . $Global{'info'} . '=' . $Global{'adata'} . "*)"; } elsif ( $Global{'infoFilter'} =~ /^ends with$/ ) { $match = "(" . $Global{'info'} . '=*' . $Global{'adata'} . ")"; } elsif ( $Global{'infoFilter'} =~ /^contains$/ ) { $match = "(" . $Global{'info'} . '=*' . $Global{'adata'} . "*)"; } else { $match = "(" . $Global{'info'} . '=' . $Global{'adata'} . ")"; } } $error = 0; # initialize error flag. $Global{filter} = Net::LDAP::Filter->new($match) or $error = 1; if ( $error == 1 ) { $error = "Bad filter $match."; ERROR(\$error); $Global{mainWindow} -> Unbusy; # window is busy return; } if ( !defined($Global{ldap}) ) { $error = dirConn(); if ( $error == 1 ) { if ( defined($Global{dirConnError}) ) { $error = "search $Global{dirConnError}"; ERROR(\$error); } else { ERROR($error); } $Global{mainWindow} -> Unbusy; # window is busy return; } } # # Display the DN search results list box. # $msgbox->delete("0.0", "end"); $msgbox->update; $Global{'records'} = 0; # initialize record count. $Global{'searchResults'} = {}; # initialize results hash. $mesg = $Global{ldap}->search( base => $LDAP_SEARCH_BASE, filter => $Global{filter}, attrs => $Global{att_wanted}, callback => \&print_entry, ); if ( $mesg->code && $mesg->code != 48 ) { ERROR($mesg->code); } # # Create Hierarchial DN list box data tree, # and display data. # eval { # # Create the base point. # $Global{'searchHList'}->add($LDAP_SEARCH_BASE, -text=>$LDAP_SEARCH_BASE); $results = $Global{'searchResults'}; @dnKeys = sort(keys(%$results)); # # build the hierachical list using the DN # foreach my $dnvar ( @dnKeys ) { $var = $$results{$dnvar}; # get entry data array $shbase = $LDAP_SEARCH_BASE . $sepChar . $$var[0]; # create new leaf $Global{'searchHList'}->add($shbase, -text => $$var[0]); # add leaf to tree. } $Global{'searchHList'}->pack(-side => "right"); }; # End of eval ERROR( \$@ ) if ( $@ ); # # Get and print out the record attributes. # sub print_entry { my($mesg,$entry) = @_; my @ref = (); my $dn; my $max; my $data = []; my $information = {}; if ( !defined($entry) ) { return; } $dn = $entry->dn; # store the entry dn ++$Global{'records'}; $msgbox->delete("0.0", "end") if ( !($Global{'records'} % 10 )); $msgbox->update if ( !($Global{'records'} % 10 )); $msgbox->insert("0.0", "Entries found: $Global{'records'}") if ( !($Global{'records'} % 10 )); $msgbox->update if ( !($Global{'records'} % 10 )); # # # @ref = $mesg->referrals(); if ( @ref ) { foreach (@ref ) { my $rvar = "LDAP Referral: $_"; ERROR(\$rvar); } } else { # # Get a list of record attributes # my @attrs = sort $entry->attributes; $max = 0; # # Calculate each attribute`s text length. # We use this to create a pretty print out in the # List Box # foreach (@attrs) { $max = length($_) if length($_) > $max } # # Get attribute`s data # foreach (@attrs) { # my $attr = $entry->get_value($_, asref => 1); my $attr = []; @$attr = $entry->get_value($_); next unless $attr; if ( /^jpegPhoto/i ) { # # record jpegPhoto data. # $encoded = encode_base64(@$attr[0]); $$information{$_} = $encoded; next; } $$information{$_} = $attr; # record ldap data next; } } push(@$data, $dn); # dn of entry push(@$data, $max); # max attribute string lenght push(@$data, $information); ${$Global{'searchResults'}}{$dn} = $data; } $Global{mainWindow} -> Unbusy; # window is not busy } # End of search subroutine sub AClear { # # Clear out text in Attribute Box # $Global{'adata'} = ""; } # End of AClear subroutine # # Change to a new directory server. # sub server { my $widget; my $ptr; my $mesg; my $error; $error = 0; $currentPanel = $Global{nb} -> raised(); $Global{nb} -> raise('INFO'); $Global{ldap}->unbind if ( defined($Global{ldap}) ); $Global{ldap} = undef if ( defined($Global{ldap}) ); # # Put directory server name in list box # $Global{'slist'}->insert(0 , $Global{'LDAP_SERVER'}); $sslist->insert(0 , $Global{'LDAP_SERVER'}) if ( Exists($sslist) ) ; $Global{dsadsls}->insert(0, $Global{'LDAP_SERVER'}) if ( $Global{dsadsls} ); # # Destroy the dn history list if it exists. # $Global{'searchHList'}->delete('all') if Tk::Exists($Global{'searchHList'}); $Global{mainWindow} -> Busy(-recurse => 1); # window is busy $Global{mainWindow} -> update; # Allow Tk to update $ptr = 1; %Tree = (); # Delete the old stuff. %BASEDN = (); # Delete the old stuff. @NcKeys = (); # Delete the old stuff. $Global{'sbtree'}->delete("all"); $msgbox->delete("0.0", "end"); $msgbox->update(); $error = dirConn(); if ( !$error ) { if ( $Global{'CORE_SERVER'} ne $Global{'LDAP_SERVER'} && defined($server{$Global{'LDAP_SERVER'}} ) ) { # user defined base my $t1 = []; push(@$t1, getBases($Global{'LDAP_SERVER'}, $server{$Global{'LDAP_SERVER'}})); $ncbase =~ tr/[A-Z]/[a-z]/; $Tree{$ncbase} = $t1; $BASEDN{$ncbase} = $ncbase; } elsif ( $Global{setVersion} == 3 ) { my $entry; # use root_dse to find the bases $entry = $Global{ldap}->root_dse(); if ( defined($entry) ) { my $attr = $entry->get_value('namingContexts', asref => 1); if ( defined($attr) ) { foreach my $ncbase ( @$attr ) { $Global{mainWindow}->update; my $t1 = []; push(@$t1, getBases($Global{'LDAP_SERVER'}, $ncbase)); $ncbase =~ tr/[A-Z]/[a-z]/; $Tree{$ncbase} = $t1; $BASEDN{$ncbase} = $ncbase; } } } } # # Create the search base tree # &initTree(); @NcKeys = sort(keys(%Tree)); } else { if ( defined($Global{dirConnError}) ) { ERROR(\$Global{dirConnError}); $msgbox->insert("1", "$Global{dirConnError}"); $msgbox->update; } else { ERROR($error); } } if ( @NcKeys) { $LDAP_SEARCH_BASE = shift (@NcKeys); $DN_BASE = $LDAP_SEARCH_BASE; } else { $LDAP_SEARCH_BASE = ""; $DN_BASE = ""; } $sbblist->insert(0 , $LDAP_SEARCH_BASE); $dnblist->insert(0 , $LDAP_SEARCH_BASE); $Global{dsasbls}->insert(0, $LDAP_SEARCH_BASE) if ( $Global{dsasbls} ); $Global{'CORE_SERVER'} = $Global{'LDAP_SERVER'}; $Global{mainWindow} -> update; # $Global{mainWindow} -> Unbusy; # window is not busy $Global{nb} -> raise($currentPanel); } # End of server subroutine sub base { # # Put directory server search base into the list box. # $sbblist->insert(0 , $LDAP_SEARCH_BASE); $Global{dsasbls}->insert(0, $LDAP_SEARCH_BASE) if ( $Global{dsasbls} ); } # End of base subroutine sub dnbase { # Put dn base into the list box. $dnblist->insert(0 , $DN_BASE); } # End of dnbase subroutine sub setFilter { # # Put search filter conditions into the list box. # $flclist->insert(0 , $Global{'infoFilter'}); } # End of setFilter subroutine # # Make the correction and bind to the directory server. # sub dirConn { my $error; $error = 0; $Global{dirConnError} = undef(); # # Make the connection to the directory server # if ( $Global{port} == 636 || $Global{'setSSL'} ) { $bindcommand = 'require Net::LDAPS; new Net::LDAPS( $Global{LDAP_SERVER}, timeout => 1, port => $Global{port}, debug => $opt{d} ) '; if ( $Global{'platform'} eq 'MSWin32') { $error = "This program currently does not support SSL on Microsoft Windows systems."; ERROR(\$error); return 1; } $Global{ldap} = eval $bindcommand; if ($@) { $msgbox->insert("0.0", $@) if ($@ && Tk::Exists($msgbox)) ; return -1; } if ( !($Global{ldap}->isa('Net::LDAPS') ) ) { $Global{dirConnError} = "LDAPS connection error to $Global{'LDAP_SERVER'}."; return -1; } } else { $Global{ldap} = new Net::LDAP( $Global{'LDAP_SERVER'}, timeout => 1, port => $Global{port}, debug => $opt_d, ) or $error = 1; if ( $error ) { $Global{dirConnError} = "LDAP connection error to $Global{'LDAP_SERVER'}."; return 1; } } $mesg = $Global{ldap}->bind( password => "$Global{'bindpw'}", dn => "$Global{'binddn'}", version => $Global{'setVersion'}, ); if ( $mesg->code && $mesg->code != 48 ) { # $errstr = $mesg->code; # ERROR($errstr); return $mesg->code; } return 0; } # End of subroutine dirConn # # Connect and bind to the referral directory server # sub dirRConn { my ($url) = @_; my $error; $error = 0; $Global{dirConnError} = undef(); # # Make the connection to the directory server # if ( $Global{port} == 636 || $Global{'setSSL'} ) { $bindcommand = 'require Net::LDAPS; new Net::LDAPS( $url, timeout => 1, debug => $opt{d} ) '; if ( $Global{'platform'} eq 'MSWin32') { $error = "This program currently does not support SSL on Microsoft Windows systems."; ERROR(\$error); return 1; } $Global{rldap} = eval $bindcommand; if ($@) { $msgbox->insert("0.0", $@) if ($@ && Tk::Exists($msgbox)) ; return -1; } if ( !($Global{rldap}->isa('Net::LDAPS') ) ) { $Global{dirConnError} = "LDAPS connection error to $url."; return -1; } } else { $Global{rldap} = new Net::LDAP( $url, timeout => 1, debug => $opt_d, ) or $error = 1; if ( $error ) { $Global{dirConnError} = "LDAP connection error to $url."; return 1; } } $mesg = $Global{rldap}->bind( password => "$Global{'bindpw'}", dn => "$Global{'binddn'}", version => $Global{'setVersion'}, ); if ( $mesg->code && $mesg->code != 48 ) { # $errstr = $mesg->code; # ERROR($errstr); return $mesg->code; } return 0; } # End of subroutine dirRConn # # Disconnect from the directory server. # sub dirRUConn { $Global{rldap}->disconnect; delete($Global{rldap}); return 0; } # End of subroutine dirRUConn # # Detect and record the sub-bases, or branches, of the directory. # sub getBases() { my $mesg; my ( $host, $base ) = @_; my @base = (); my $ptr; my $match; my $error = 0; # initialize error flag. if ( $Global{'nismapname'} ) { # # Solaris Native LDAP enabled # #$match = "(|(ou=*)(nismapname=*)(objectClass=organizationalUnit))"; #search only for ou entries. $match = "(|(objectClass=nisMap)(objectClass=organizationalUnit)(objectClass=automountMap))"; #search only for ou entries. } else { $match = "(objectClass=organizationalUnit)"; #search only for ou entries. } my $f = Net::LDAP::Filter->new($match) or $error = 1; if ( $error ) { $error = "getBases subroutine Bad filter $match"; ERROR(\$error); return @base; } $base[0] = $base; $ptr = 0; while ( $ptr < @base ) { if ( @base < $Global{'limit'} ) { $splashList->insert("1", "Searching $base") if ( defined( $splash) ); $splash->update() if ( defined( $splash) ); $msgbox->insert("0", "Searching $base") if ( defined( $msgbox) ); $msgbox->update() if ( defined( $msgbox) ); my @new_base = calBase($base, $f ); push(@base, @new_base); } $base = $base[++$ptr]; } shift(@base); # get rid of the namingContext entry return @base; } # End of subroutine getBases() sub calBase() { my ( $base, $f ) = @_; my $mesg; my $entry; my $errstr; my $error = 0; my @new_base = (); $mesg = $Global{ldap}->search( base => $base, filter => $f, attrs => [ "cn","nismapname","automountMapName" ], scope => "one", ); # # Check for an error on search # Search call work, but there was an ldap error. # if ( $mesg->code && $mesg->code != 11 ) { $errstr = $mesg->code; ERROR($errstr); return @new_base; } else { $entry = $mesg->entry; return @new_base unless defined($entry); $count = $mesg->count(); for($i = 0 ; $i < $count ; $i++) { my $entry = $mesg->entry($i); $dn = $entry->dn; $dn = canonical_dn($dn,casefold => "lower"); $dn =~ tr/[A-Z]/[a-z]/; $_ = $dn; # # Record only dn that start with ou=, or in some cases nismapname. # Normal entrys can be mixed in with these objects. # if ( $Global{'nismapname'} && ( /^ou=/ || /^nismapname/i || /^automountMapName/i ) ) { push(@new_base, $dn); # record only dn that start with ou= } elsif ( /^ou=/ ) { push(@new_base, $dn); # record only dn that start with ou= } } return @new_base; } } # End of subroutine calBase() # # Determine new mainWindow position. # sub globalPos { my @pos; @pos = split(/\+/,$Global{'mainWindow'}->geometry()); $Global{'horz'} = $pos[1]; $Global{'vert'} = $pos[2]; } # End of subrountine globalPos sub root_cancel { $Global{'rootWindow'}->destroy if Tk::Exists($Global{'rootWindow'}); } # End of subrountine root_cancel # # Display jpegPhoto in separate window if Tk::JPEG is used. # sub displayPhoto { my ($picture, $dn) = @_; my $jpegFile = $ENV{'TMP'} ."/jpegfile.$$"; # # Store the jpeg data to a temp file. # open(TMP, "+>$jpegFile"); $| = 1; print TMP $picture; close(TMP); if ( !-e "$jpegFile" ) { my $str = "Could not create temporary jpeg file $jpegFile"; ERROR( \$str ); return; } # # Create a TK window to display the jpeg picture. # my $mw = MainWindow->new(); $mw->title("JPEG PHOTO DISPLAY"); my $list = $mw ->Listbox( -height => 1, width => length($dn) ); $list->pack( -side => "top" ); $list->insert("end", $dn); my $image = $mw->Photo(-file => $jpegFile, -format => "jpeg" ); $mw->Label(-image => $image)->pack(-expand => 1, -fill => 'both'); $mw->Button(-text => 'CLOSE WINDOW', -command => [destroy => $mw])->pack; MainLoop; unlink $jpegFile; } # End of displayPhoto # # Create Main Error Window # sub ERROR { my ($errcode ) = @_; my $errmsg; return if ($errcode == 48 && $Global{'setVersion'} == 3 ); # Anonymous bind error, not really an error. my $x = $Global{'horz'} + 150; my $y = $Global{'vert'} + 150; if ( ref($errcode) ) { $errmsg = $$errcode; } else { $errmsg = ldap_error_text($errcode); } my @errmsg = split(/\n/,$errmsg); # # Create Main Error Window # if ( ! Exists($Global{'errorWindow'} ) ) { $Global{'errorWindow'} = MainWindow->new; $Global{'errorWindow'}->title("ERROR MESSAGES"); $Global{'errorWindow'}->geometry("+$x+$y"); # # Create process dismiss button # $Global{'errorWindow'}->Button( -text => "DISMISS", -command => \&dismiss, -font => $Global{'Font'}, -borderwidth => 3 ) -> pack(-side => "bottom", -padx => 5, -pady => 5 ) ; $errlist = $Global{'errorWindow'} ->Scrolled(Listbox, -scrollbars => 'se', -width => 70, -height => 10 ); $errlist->pack(-fill => "both", -expand => 1 ); } $errlist->insert("end", "Error Code: $errcode") if ( !ref($errcode) ); $errlist->insert("end", "") if ( !ref($errcode) ); foreach my $msg ( @errmsg ) { $errlist->insert("end", $msg); } sub dismiss{ $Global{'errorWindow'}->destroy() if Tk::Exists($Global{'errorWindow'}); $errlist = undef(); } # End of dismiss subroutine } # End of ERROR subroutine # # LDAP Error check, some return codes are not really errors. # You can retry the ldap action after waiting a while. # sub CheckError { my ( $error ) = @_; # # Check for DSA busy or internal error # if ( $Global{loopCount} > 61 ) { return 0; # return an error condition. } ++$Global{loopCount}; # Increment the loop counter. if ( $error =~ /too busy/ || $error =~ /Server encountered an internal error/ ) { # # DSA Busy. # sleep 1; return 1; # No error, try again } else { # # DSA did not return "DSA busy" message # return 0; # error } } # End of subrountine CheckError # # Create Main Bind Window # sub BIND { $dn_data = ""; $pw_data = ""; &globalPos(); my $x = $Global{'horz'} + 150; my $y = $Global{'vert'} + 150; if ( !Tk::Exists( $Global{'bindWindow'} ) ) { # # Create Main Bind Window # $Global{'bindWindow'} = MainWindow->new; $Global{'bindWindow'}->title("SET BIND CREDENTIALS"); $Global{'bindWindow'}->geometry("+$x+$y"); # # Create process accept button # $Global{'bindWindow'}->Button( -text => "ACCEPT", -command => \&accept, -font => $Global{'Font'}, -borderwidth => 3 ) -> pack(-side => "bottom", -padx => 5, -pady => 5 ) ; # # Create process cancel button # $Global{'bindWindow'}->Button(-text => "CANCEL", -command => \&cancel, -font => $Global{'Font'}, -borderwidth => 3) -> pack(-side => "top", -padx => 5, -pady => 5 ) ; my $binddnframe = $Global{'bindWindow'}->LabFrame(-label => "DN", -labelside => "acrosstop") ->pack( -fill => "both", -side => "top", -padx => 5, -pady => 5 ); # # Create DN Entry text box. # $dn_data = $Global{binddn} if ( length($Global{binddn}) ); $binddnframe->Entry(-textvariable => \$dn_data, -width => 25 ) -> pack(-fill => 'x'); my $bindpwframe = $Global{'bindWindow'}->LabFrame(-label => "PASSWORD", -labelside => "acrosstop") ->pack( -fill => "both", -side => "top", -padx => 5, -pady => 5 ); # # Create Password Entry text box. # $bindpwdata = $bindpwframe->Entry(-show => '*', -textvariable => \$pw_data, -width => 25, -font => $Global{'Font'} ) -> pack(-fill => 'x'); $bindpwdata->bind('' => \&accept ); sub cancel{ $Global{'bindWindow'}->destroy() if Tk::Exists($Global{'bindWindow'}); $Global{'bindWindow'} = undef(); } # End of cancel subroutine sub accept{ my $mesg; if (defined($Global{ldap}) ) { # # Connect to directory server # $mesg = $Global{ldap}->bind( password => "$pw_data", dn => "$dn_data", version => $Global{'setVersion'}, ); if ( $mesg->code && $mesg->code != 48 ) { $errstr = $mesg->code; ERROR($errstr); } else { $Global{'bindWindow'}->Busy(-recurse => 1); $Global{'binddn'} = $dn_data; $Global{'bindpw'} = $pw_data; &server; $Global{'bindWindow'}->Unbusy; } } $Global{'bindWindow'}->destroy() if Tk::Exists($Global{'bindWindow'}); $Global{'bindWindow'} = undef(); } # End of accept subroutine } } # End of BIND subroutine # # Create Main Port Window # sub PORT { $port_data = $Global{port}; &globalPos(); my $x = $Global{'horz'} + 150; my $y = $Global{'vert'} + 150; # # Create Main Port Window # $Global{'portWindow'} = MainWindow->new; $Global{'portWindow'}->title("DIRECTORY PORT"); $Global{'portWindow'}->geometry("+$x+$y"); # # Create process accept button # $Global{'portWindow'}->Button( -text => "ACCEPT", -command => \&portAccept, -font => $Global{'Font'}, -borderwidth => 3 ) -> pack(-side => "bottom", -padx => 5, -pady => 5 ) ; # # Create process cancel button # $Global{'portWindow'}->Button(-text => "CANCEL", -command => \&portCancel, -font => $Global{'Font'}, -borderwidth => 3) -> pack(-side => "top", -padx => 5, -pady => 5 ) ; $Global{'portWindow'}->Label(-text => "Port 389 default") ->pack( -side => "top", -anchor => 'w', -pady => 1 ); $Global{'portWindow'}->Label(-text => "Port 636 ssl default") ->pack( -side => "top", -anchor => 'w', -pady => 1 ); # # Create a ssl Checkbutton that will set up ssl variable # to set ssl if not port 636. # #$Global{'portWindow'} -> Checkbutton( # -text => "SSL connection", # -variable => \$Global{'setSSL'}, # -font => $Global{'Font'} ) # -> pack(-side => "top", -anchor => "w" ); $PSSLstatus = $Global{'portWindow'} -> Label -> pack(-side => "top", -anchor => "w" ); if ( $Global{setSSL} ) { $PSSLstatus->configure( -text => "SSL", -font => $Global{Font}); } else { $PSSLstatus->configure(-text => "NON-SSL", -font => $Global{Font}); } my $portframe = $Global{'portWindow'}->LabFrame(-label => "PORT", -labelside => "acrosstop") ->pack( -fill => "both", -side => "top", -padx => 5, -pady => 5 ); # # Create Port Entry text box. # $portframe->Entry(-textvariable => \$port_data, -width => 10 ) -> pack(-fill => 'x'); sub portCancel{ $Global{'portWindow'}->destroy() if Tk::Exists($Global{'portWindow'}); $Global{'portWindow'} = undef(); } # End of cancel subroutine sub portAccept{ $Global{port} = $port_data; if ( $Global{setSSL} ) { $Global{sslport} = $port_data;} else { $Global{nsslport} = $port_data;} $Global{dsaptls}->insert(0, $Global{port}); $Global{'portWindow'}->destroy() if Tk::Exists($Global{'portWindow'}); $Global{'portWindow'} = undef(); } # End of accept subroutine } # End of PORT subroutine # # Create Schema Display Window # sub print_loop() { my $list = shift; my $ocs = shift; my $Title = shift; #my $method = shift; my $asize; my $ahash; my $var; foreach $ahash ( @$ocs) { $list->insert("end", "$Title\n"); # # Get and display the data for this object # my @hkeys = keys(%$ahash); foreach $var (@hkeys) { # Step through the hash keys next if ( $var =~ /type/); # do not care about type $alArray = $$ahash{$var}; if ( ref($alArray) eq 'ARRAY' ) { # it is a n array pointer so there is probably a list. my $asize = @$alArray; # get the size of the list. # # if the array has size then print the array # else ignore the array. # if ( $asize ) { # Okay, there is something in the array. $list->insert("end", "\t$var: "); foreach $a ( @$alArray ) { $list->insert("end", "$a "); } $list->insert("end", "\n"); } } else { # There is not an array if ( $alArray == 1) { # it is just information attribute for the object $list->insert("end", "\t$var\n"); } else { $list->insert("end", "\t$var: $alArray\n"); } } } } } # End of subroutine print_loop sub schema_clear { # # Clear out text in List Box # $schema_list->delete("1.0", "end"); } # End of clear subroutine # # # Get the directory schema # sub schema { my $mesg; my $error = 0; $schemaHash{'obj'} = {}; $schemaHash{'tree'} = {}; $msgbox->insert("0.0", "Retrieving schema information."); $msgbox->update; &schema_clear(); $Global{'max'} = 0; # Reset objectclass name lenght. my $dt = "/tmp/schema.dat.$$"; if ( ! defined($Global{ldap}) ) { # # Connect to directory server # $error = dirConn(); if ( $error == 1 ) { if ( defined($Global{dirConnError}) ) { $schema_list->insert("end", "$Global{dirConnError}\n"); } else { ERROR($error); } return; } } # # Get the schema, tries to read rootdse, if unable assumes cn=schema. # This is NOT always the case. # $schema = undef(); my @items; my @item; my $dsml; $schemaHash{'schema'} = $Global{ldap}->schema(); if ( defined($schemaHash{'schema'}) ) { if ( $Global{'sfile'} && defined($schemaHash{'schema'}) ) { if ( $Global{'xml'} ) { # # write XML text to file instead of text box # # @xml_data = (); # $dsml = Net::LDAP::DSML->new( output => \@xml_data, pretty_print => 1 ); open(FXML, ">$Global{'fdata'}"); $dsml = Net::LDAP::DSML->new( output => *FXML, pretty_print => 1 ); $dsml->write_schema($schemaHash{'schema'}); $dsml->end_dsml; close(FXML); } else { # # write straight text to file instead of text box # $schemaHash{'schema'}->dump( $Global{'fdata'} ); } $schema_list->insert("end", "Schema data written to file: $Global{'fdata'}\n"); $Global{'sfile'} = 0; $Global{'fdata'} = ""; $Global{'xml'} = 0; return; } # # Allow mainWindow to update # $Global{'mainWindow'}->update; $ra_atts = []; # # Get the attributes # @$ra_atts = $schemaHash{'schema'}->all_attributes(); $schemaHash{'atts'} = $ra_atts; # # Display the attributes # if ( $selectAll || $selectAtt ) { &print_loop($schema_list, $schemaHash{'atts'}, "attributeType") if ( defined($schemaHash{'atts'}) ); } $ra_atts = []; # # Get the schema objectclasses # @$ra_atts = $schemaHash{'schema'}->all_objectclasses(); $schemaHash{'ocs'} = $ra_atts; # # Calculate the text length of each objectclass string. # foreach my $var (@$ra_atts) { $Global{'max'} = length($$var{'name'}) if length($$var{'name'}) > $Global{'max'} ; } # # Add 6 to the max objectclass string size, # got to allow for graphics information. # $Global{'max'} += 6; # # Display the objectclasses # if ( $selectAll || $selectObj ) { &print_loop($schema_list, $schemaHash{'ocs'}, "objectClasses") if ( defined($schemaHash{'ocs'}) ); } # # Get the schema matchingrules # $ra_atts = []; @$ra_atts = $schemaHash{'schema'}->all_matchingrules(); $schemaHash{'mrs'} = $ra_atts; # # Display the matchingrules # if ( $selectAll || $selectMatch ) { &print_loop($schema_list, $schemaHash{'mrs'}, "matchingRules" ) if ( defined($schemaHash{'mrs'}) ); } # # Get the schema matchingruleuse # $ra_atts = []; @$ra_atts = $schemaHash{'schema'}->all_matchingruleuses(); $schemaHash{'mru'} = $ra_atts; # # Display the matchingruleuse # if ( $selectAll || $selectMru ) { &print_loop($schema_list, $schemaHash{'mru'}, "matchingRuleUse" ) if ( defined($schemaHash{'mru'}) ); } # # Get the schema ldapsyntaxes # $ra_atts = []; @$ra_atts = $schemaHash{'schema'}->all_syntaxes(); $schemaHash{'lsyn'} = $ra_atts; # # Display the ldapsyntaxes # if ( $selectAll || $selectSyn ) { &print_loop($schema_list, $schemaHash{'lsyn'}, "ldapSyntax" ) if ( defined($schemaHash{'lsyn'}) ); } # # Get the schema nameForms # $ra_atts = []; @$ra_atts = $schemaHash{'schema'}->all_nameforms(); $schemaHash{'nfm'} = $ra_atts; # # Display the nameForms # if ( $selectAll || $selectNf ) { &print_loop($schema_list, $schemaHash{'nfm'}, "nameForms" ) if ( defined($schemaHash{'nfm'}) ); } # # Get the schema ditstructurerules # $ra_atts = []; @$ra_atts = $schemaHash{'schema'}->all_ditstructurerules(); $schemaHash{'dits'} = $ra_atts; # # Display the ditstructurerules # if ( $selectAll || $selectDsr ) { &print_loop($schema_list, $schemaHash{'dits'}, "ditstructurerules" ) if ( defined($schemaHash{'dits'}) ); } # # Get the schema ditcontentrules # $ra_atts = []; @$ra_atts = $schemaHash{'schema'}->all_ditcontentrules(); $schemaHash{'ditc'} = $ra_atts; # # Display the ditcontentrules # if ( $selectAll || $selectDcr ) { &print_loop($schema_list, $schemaHash{'ditc'}, "ditcontentrules" ) if ( defined($schemaHash{'ditc'}) ); } $Global{'max'} = 50 if ( $Global{'max'} > 50 ); &objTree(); # Create the objectClass tree $Global{'olist'}->delete('all') if Tk::Exists($Global{'olist'}); $Global{mainWindow} -> update; # Allow Tk to update &initializeP5a(); # Finish making panel 5 } # End of if ( defined($schema) ) else { $schema_list->insert("end", "The schema object was return undefined.\n"); $schema_list->insert("end", "There are several problems that can cause\n"); $schema_list->insert("end", "this situation.\n"); $schema_list->insert("end", "1. Your server may require you to be bound\n"); $schema_list->insert("end", " to the directory as the directory\n"); $schema_list->insert("end", " administrator. Bind to the directory\n"); $schema_list->insert("end", " as the directory administrator and \n"); $schema_list->insert("end", " retry pulling the schema data.\n"); $schema_list->insert("end", "\n"); $schema_list->insert("end", "2. Your server is a version 2 LDAP server\n"); $schema_list->insert("end", " or the version 3 LDAP radio button is in\n"); $schema_list->insert("end", " the version 2 position. Version 2 LDAP\n"); $schema_list->insert("end", " servers will not return schema data.\n"); } } # End of schema subroutine sub objTree { my $ocs = $schemaHash{'ocs'}; my $obj = $schemaHash{'obj'}; #$schemaHash{'tree'} = {}; my $tree = $schemaHash{'tree'}; my $schema = $schemaHash{'schema'}; my @tmpKeys; my $size; my $Path; my $done; my @sup; my @name; my $name; my $SUP; my $array; if ( !defined($ocs) || !defined($tree) || !defined($obj) || !defined($schema) ) { # # No schema data available # my $error = "LDAP Schema data is not available."; ERROR(\$error); return; } # # Get the schema objectClasses # foreach my $aobj ( @$ocs) { # # Get the oid number of the objectclass. # my $oid; undef($oid); $oid = $$aobj{'oid'}; next if ( !defined($oid) ); @sup = $$aobj{'sup'}[0]; @name = $$aobj{'name'}; $$obj{"$name[0]"} = [ "$oid", "$sup[0]" ]; # store data } # # get objectclass hash keys. # @tmpKeys = sort(keys(%$obj)) if (defined($$obj{'top'})); $$tree{'top'} = [0,]; # pre-load top objectclass. foreach (@tmpKeys) { next if ( $_ eq "" || $_ eq "top" ); $done = 0; # initialize done flag $Path = ""; # initialize objectclass Path $name = $_; while ( !$done ) { $SUP = $$obj{$_}->[1]; # get current objectclass's superior $SUP = "top" if ( $SUP eq "" ); # on null superior, make top superior if ( $Path eq "" ) { $Path = $SUP; # Start objectclass path. } else { $Path = $SUP . $sepChar . $Path; # add new objectclass to path. } $done = 1 if ( $SUP eq 'top' ) ; # when we reach objectclass top we are done. $_ = $SUP; # walk back up the chain } if ( defined($$tree{$Path}) ) { # # Path key has already been initialized, add current objectclass # to list. # $array = $$tree{$Path}; push(@$array,$name); } else { # # Path key needs to be initialized, add current objectclass # to list. # $$tree{$Path} = [0, "$name"]; } } # # Allow mainWindow to update # $Global{'mainWindow'}->update; } sub Hierarchial { &globalPos(); my $x = $Global{'horz'}; my $y = $Global{'vert'} + 200 ; my $ocs = $schemaHash{'ocs'}; my $obj = $schemaHash{'obj'}; my $tree = $schemaHash{'tree'}; my $schema = $schemaHash{'schema'}; my @tmpKeys; my $size; my $Path; my $done; my @sup; my @name; my $name; my $SUP; my $array; # # Set up the Tk windows. # # if ( ! Exists($Global{'histWindow'} ) ) { eval { $Global{'histWindow'} = MainWindow->new(); $Global{'histWindow'}->title("HIERARCHICAL OBJECTCLASS DISPLAY WINDOW"); }; ERROR(\$@) if ( $@ ); } else { my $wstate = $Global{'histWindow'}->state(); if ( $wstate =~ /iconic/ || $wstate =~ /withdrawn/ ) { $Global{'histWindow'}->deiconify() if Tk::Exists($Global{'histWindow'}); $Global{'histWindow'}->raise() if Tk::Exists($Global{'histWindow'}); } } $Global{'histWindow'}->geometry("+$x+$y"); # # Create label box # if ( !Exists($Global{'label'}) ) { $Global{'label'} = $Global{'histWindow'}->Label()->pack; } $hbutton = $Global{'histWindow'}->Button( -text => "CLOSE HIERARCHICAL DISPLAY WINDOW", -command => \&hist_cancel, -font => $Global{'Font'}, -borderwidth => 5 ) -> pack(-fill => "both", -padx => 2, -pady => 2 ) if ( Exists($Global{'histWindow'} ) && !Exists($hbutton ) ); # # Create list box, this is where the selected objectclass data will # be displayed. # if ( !Exists($Global{'list'}) ) { $Global{'list'} = $Global{'histWindow'}->Scrolled('ROText', -scrollbars => 'se', -width=>50, -wrap => "none", -font => $Global{'Font'}, -height => 20 ) ->pack(-side => "left"); } # # Create Hierarchial list box, this is where the objectclass data # tree will be displayed. # if ( !Exists($Global{'hlist'}) ) { $Global{'hlist'} = $Global{'histWindow'}->Scrolled('HList', -font => $Global{'Font'}, -scrollbars => 'se', -width => $Global{'max'}, -height => 20, -itemtype => 'text', -separator => $sepChar, -selectmode => 'single', -browsecmd => sub { # my $objects = shift; my $oid; my @objectclasses = (); @objectclasses = split(/$sepChar/,$objects); $Global{'list'}->delete("1.0", "end"); $Global{'label'}->configure(-text=>$objects); $Global{'list'}->insert("end", " \n"); foreach my $var (@objectclasses) { $Global{mainWindow}->update; $oid = $$obj{$var}->[0]; # # Get the various other items associated with # this objectclass. # my $ahash = $schema->objectclass( $oid ); my @hkeys = sort(keys(%$ahash)); # # Get and display the objectclass name. # $alArray = $$ahash{'name'}; $Global{'list'}->insert("end", "name: $alArray\n"); foreach $varr (@hkeys) { # Step through the hash keys next if ( $varr =~ /name/); # already done name. next if ( $varr =~ /type/); # do not care about type $alArray = $$ahash{$varr}; if ( ref($alArray) eq 'ARRAY' ) { # it is a n array pointer so there is probably a list. my $asize = @$alArray; # get the size of the list. # # if the array has size then print the array # else ignore the array. # if ( $asize ) { # Okay, there is something in the array. $Global{'list'}->insert("end", "\t$varr: "); foreach $a ( @$alArray ) { $Global{'list'}->insert("end", "$a "); } $Global{'list'}->insert("end", "\n"); } } else { # It is not an array if ( $alArray == 1) { # it is just and information attribute for the object $Global{'list'}->insert("end", "\t$varr\n"); } else { $Global{'list'}->insert("end", "\t$varr: $alArray\n"); } } } $Global{'list'}->insert("end", " \n"); $Global{'list'}->insert("end", "--------------------------------------------------\n"); $Global{'list'}->insert("end", " \n"); } } # End of subroutine browsecmd ); # End of Scrolled HList. @tmpKeys = sort(keys(%$tree)); my $base; $base = ""; # # Create Hierarchial list box data tree, # and display data. # eval{ foreach ( @tmpKeys ) { if ( $$tree{$_} ->[0] == 0 ) { $$tree{$_} ->[0] = 1; $Global{'hlist'}->add($_, -text=>$_); # do the base. } $base = $_; $array = $$tree{$_}; $ptr = 0; foreach my $var ( @$array ) { if ( !$ptr ) { $ptr = 1; next; } $_ = $base . $sepChar . $var; $Global{'hlist'}->add($_, -text => $var); if ( defined($$tree{$_}) ) { $$tree{$_}->[0] = 1; } } } $Global{'hlist'}->pack(-side => "right"); }; print "$@" if ( defined($@)); @tmpKeys = sort(keys(%$tree)); # # Reset objectClass array. # foreach ( @tmpKeys ) { if ( defined($$tree{$_}) ) { $$tree{$_}->[0] = 0; } } } sub hist_clear { # # Clear out text in List Box # $Global{'list'}->delete("1.0", "end"); } # End of clear subroutine sub hist_cancel{ $Global{'list'}->destroy if Tk::Exists($Global{'list'}); $Global{'hlist'}->destroy if Tk::Exists($Global{'hlist'}); $Global{'histWindow'}->destroy if Tk::Exists($Global{'histWindow'}); } # End of cancel subroutine } # End of subroutine Hierarchial # # Create Accept/Cancel Window # sub questionAction { &globalPos(); my $x = $Global{'horz'} + 0; my $y = $Global{'vert'} + 50; # # Create Main Window # $Global{'answerWindow'} = MainWindow->new; $Global{'answerWindow'}->title("CONFIRM DECISION"); $Global{'answerWindow'}->geometry("+$x+$y"); # # Create process accept button # $Global{'answerWindow'}->Button( -text => "ACCEPT", -command => \&doAction, -font => $Global{'Font'}, -borderwidth => 3 ) -> pack(-side => "bottom", -padx => 5, -pady => 5 ) ; # # Create process cancel button # $Global{'answerWindow'}->Button(-text => "CANCEL", -command => \&cancelAction, -font => $Global{'Font'}, -borderwidth => 3) -> pack(-side => "top", -padx => 5, -pady => 5 ) ; sub cancelAction{ $Global{'answerWindow'}->destroy() if Tk::Exists($Global{'answerWindow'}); delete($Global{'answerWindow'}); } # End of cancel subroutine sub doAction{ $Global{'answerWindow'}->destroy() if Tk::Exists($Global{'answerWindow'}); delete($Global{'answerWindow'}); $Global{'searchHistWindow'}->destroy if Tk::Exists($Global{'searchHistWindow'}); $Global{'searchHistWindow'} = undef(); &ldapActionDelete; # Delete the entry from the directory } # End of accept subroutine } # End of questionAction subroutine # # Create ldapAction Window # sub ldapAction { $Global{'ldapActionDN'} = shift; $Global{actionDelete}->configure( -state => 'normal'); $Global{actionDisplay}->configure( -state => 'normal'); $Global{actionEdit}->configure( -state => 'normal'); $Global{actionRename}->configure( -state => 'normal'); $Global{actionLdif}->configure( -state => 'normal'); $Global{actionCancel}->configure( -state => 'normal'); } # End of ldapAction subroutine sub ldapActionCancel{ delete($Global{'ldapActionDN'}); $Global{actionDelete}->configure( -state => 'disable'); $Global{actionDisplay}->configure( -state => 'disable'); $Global{actionEdit}->configure( -state => 'disable'); $Global{actionRename}->configure( -state => 'disable'); $Global{actionLdif}->configure( -state => 'disable'); $Global{actionCancel}->configure( -state => 'disable'); } # End of cancel subroutine sub ldapActionCreateEntry { if ( !Exists($Global{'olist'}) ) { &initializeP5a(); # Finish making panel 5 } } # End of subroutine ldapActionCreateEntry sub makeTheEntry { &globalPos(); my $x = $Global{'horz'} + 100; my $y = $Global{'vert'} + 100; %Creation = (); # # Create Main Window # if (! Exists($Global{'createWindow'}) ) { $Global{'createWindow'} = MainWindow->new; $Global{'createWindow'}->title("CREATE DIRECTORY ENTRY"); $Global{'createWindow'}->geometry("+$x+$y"); # # Create process Exit button # $createExit = $Global{'createWindow'}->Button( -text => "CANCEL CREATE ENTRY DISPLAY", -command => \&create_cancel, -font => $Global{'Font'}, -borderwidth => 5 ) -> pack(-fill => "both", -padx => 2, -pady => 2 ) ; $Global{'createWindow'}->Label( -text => "Select a radiobutton to indicate the Naming Attribute and make sure your dn base is correct.") ->pack(-side => "top", -anchor => 'w'); $Global{'createWindow'}->Label( -text => "All attributes in red, or located above the objectClass attributes, must have data") ->pack(-side => "top", -anchor => 'w'); $Global{'createWindow'}->Label(-text => "entered for the attribute.") ->pack(-side => "top", -anchor => 'w'); # # Create a ROText Box that will actually contain the # returned directory data. # $createlist = $Global{'createWindow'} ->Scrolled('ROText', -scrollbars => 'se', -width => 100, -height => 20, -wrap => 'none', -font => $Global{'Font'} ); $createlist->pack(-fill => "both", -expand => 1 ); $max = 0; foreach ( @{$Global{entryData}->{must}} ) { $max = length($_) if ( length($_) > $max ); } foreach ( @{$Global{entryData}->{may}} ) { $max = length($_) if ( length($_) > $max ); } $Creation{dn} = []; $Creation{dn}->[0] = "$DN_BASE"; $dnLabel = $createlist->Label(-text => "dn", -font => $Global{'Font'}, -relief => 'groove', -anchor => 'e', # -foreground => 'red', -width => ($max+7) ); $createlist->windowCreate("end", -window => $dnLabel ); $dnTxt = $createlist->Entry(-width => 65, -textvariable => \$Creation{dn}->[0] ); $createlist->windowCreate("end", -window => $dnTxt ); $createlist->insert("end", "\n"); # position to the next row. # # create attribute label # #$tmpdn = ""; foreach ( @{$Global{entryData}->{must}} ) { $Creation{$_} = [] if ( !/objectClass/ ); $Creation{$_}->[0] = "" if ( !/objectClass/ ); $NamingAttribute = ""; ${$_} = $createlist->Radiobutton( -text => "", -anchor => 'w', -variable => \$NamingAttribute, -value => "$_" ) if ( !/objectClass/ ); $createlist->windowCreate("end", -window => ${$_} ); ${$_} = $createlist->Label(-text => "$_", -font => $Global{'Font'}, -relief => 'groove', -foreground => 'red', -anchor => 'e', -width => ($max+2) ) if ( !/objectClass/ ); $createlist->windowCreate("end", -window => ${$_} ); # # create data entry window # ${$_} = $createlist->Entry(-width => 65, -textvariable => \$Creation{$_}->[0] ) if ( !/objectClass/ ); $createlist->windowCreate("end", -window => ${$_} ) if ( !/objectClass/ ); $createlist->insert("end", "\n") if ( !/objectClass/ ); } $ptr = 0; $Creation{objectClass} = []; foreach ( @{$Global{entryData}->{objectClass}} ) { $Creation{objectClass}->[$ptr] = "$_"; ${$_} = $createlist->Label(-text => "objectClass", -font => $Global{'Font'}, -relief => 'groove', -anchor => 'e', -width => ($max+7) ); $createlist->windowCreate("end", -window => ${$_} ); # # create data entry window # ${$_} = $createlist->Label(-width => 65, -anchor => 'w', -text => $Creation{objectClass}->[$ptr]); $createlist->windowCreate("end", -window => ${$_} ); $createlist->insert("end", "\n"); # position to the next row. ++$ptr; } $Global{'createWindow'} ->update; foreach ( @{$Global{entryData}->{may}} ) { $Creation{$_} = []; $Creation{$_}->[0] = ""; ${$_} = $createlist->Radiobutton( -text => "", -anchor => 'w', -variable => \$NamingAttribute, -value => "$_" ) if ( !/objectClass/ ); $createlist->windowCreate("end", -window => ${$_} ); ${$_} = $createlist->Label(-text => "$_", -font => $Global{'Font'}, -relief => 'groove', -anchor => 'e', -width => ($max+2) )if ( !/objectClass/ ); $createlist->windowCreate("end", -window => ${$_} ); # # create data entry window # ${$_} = $createlist->Entry(-width => 65, -textvariable => \$Creation{$_}->[0] ); $createlist->windowCreate("end", -window => ${$_} ); $createlist->insert("end", "\n"); # position to the next row. } # # Create the Create button # $createMe = $Global{'createWindow'}->Button( -text => "CREATE ENTRY", -command => \&create_entry, -font => $Global{'Font'}, -borderwidth => 5 ) -> pack(-fill => "both", -padx => 2, -pady => 2 ) ; } } # End of subroutine makeTheEntry sub create_cancel { $Global{ceObject} = undef(); $Global{colist}->delete("1.0","end"); $Global{'createWindow'}->destroy if Tk::Exists($Global{'createWindow'}); $Global{'createWindow'} = undef(); } # End of create_cancel subroutine sub create_entry { my $error; my $do_it; my @add = (); my $mesg; my $rmesg; my $DN; push(@add, 'objectClass'); push(@add, $Creation{objectClass}); delete($Creation{objectClass}); if ( length($NamingAttribute) ) { $DN = "$NamingAttribute=". $Creation{$NamingAttribute}[0] . "," . $Creation{dn}[0]; } else { $DN = $Creation{dn}[0]; } delete($Creation{dn}); my @attrs = keys( %Creation ); foreach $att ( @attrs ) { if ( length($Creation{$att}->[0]) ) { push(@add, $att); push(@add, $Creation{$att}); } } $Global{ldap}->unbind if ( defined($Global{ldap}) ); $Global{ldap} = undef if ( defined($Global{ldap}) ); $error = 0; $error = dirConn(); if ( $error == 1 ) { if ( defined($Global{dirConnError}) ) { $error = "Create Entry $Global{dirConnError}"; ERROR(\$error); } else { ERROR($error); } # %Creation = (); # &create_cancel; return; } $do_it = 1; $Global{loopCount} = 0; while ($do_it == 1 ) { $mesg = $Global{ldap}->add($DN, attrs => \@add ); if ( $mesg->code ) { if ( $mesg->code == 10 && $Global{fref} ) { # # Being refer'ed to another directory server. # @referral = $mesg->referrals(); foreach my $rref (@referral ) { print "LDAP Referral: $rref \n" if $debug; $rresult = &dirRConn($rref); if ( $rresult != 0 ) { print "Referral connect error, trying next now\n" if ( $debug ); next; } else { $rmesg = $Global{rldap}->add($DN, attrs => \@add ); if ( !$rmesg->code ) { &dirRUConn(); $do_it = 0; last; } } } # End of foreach my $rref (@ref ) if ( $do_it ) { # # All referrals have been tried, there is a major error. # &dirRUConn(); $errstr = "There has been a major referral error creating this DN."; $errstr .= "The following referrals were tried;\n"; foreach my $rref (@referral ) { $errstr .= "$rref\n"; } ERROR($errstr); return; } # End of if ( $do_it ) } else { # # There was an error, check for dsa busy # error. # # $errstr = $mesg->code; $errstr = ldap_error_text($errstr); # # Check for server busy. # if ( !(CheckError($errstr) ) ) { $errstr = $mesg->code; ERROR($errstr); return; } } } else { # # There was no error # $do_it = 0; } } %Creation = (); &create_cancel; } # End of subroutine create_entry # # Do LDAP entry data display. # sub ldapActionDisplay { my $dataArray; my $blank = " "; my $data; my $dn; my $max; my $lb; my $info; my $text; my @infoKeys; my @DNs = (); if ( !$Global{'ldapActionDN'} ) { &ldapActionCancel; return; } my $objects = $Global{'ldapActionDN'}; &ldapActionCancel; # # Display the DN search results list box. # $Global{nb}->raise("SEARCH DISPLAY"); delete($Global{'ldapActionDN'}); # clear the entry data display window. if ( $display_clear ) { &display_clear(); } # # Format and display the data associcated with the dn # passed to this subroutine. # @DNs = split(/$sepChar/,$objects); # split base from dn. $dataArray = $Global{'searchResults'}; $data = $$dataArray{$DNs[1]}; # get data associated with this dn $dn = $$data[0]; # get DN $max = $$data[1]; # get max size of atttributes $info = $$data[2]; # get data hash address. @infoKeys = sort(keys(%$info)); # get a list of all attributes. $text = sprintf "%${max}s: %s\n",'dn',$dn; $list->insert("end", $text); # insert data # # For each attribute display it's data # foreach my $var (@infoKeys) { if ( $var =~ /^jpegPhoto/i ) { # # Display jpegPhoto in separate window if Tk::JPEG is used. # my $Value = decode_base64($$info{$var}); displayPhoto($Value, $dn ) if ( $Global{'jpeg'}) ; $dstring = "JpegPhoto binary data is not being displayed.\n"; # # $text = sprintf "%${max}s: %s\n",$var,$dstring; $list->insert("end", $text); # position to the next row. next; } my $values = $$info{$var}; # get attribute data array. foreach my $Value ( @$values) { # # Format data and print data into Entry Box # if ( $var =~ /;binary$/ ) { $encoded = encode_base64($Value); $text = sprintf "%${max}s: %s\n",$var,$encoded; } else { $text = sprintf "%${max}s: %s\n",$var,$Value; } $list->insert("end", $text); # position to the next row. } } # position to the next row. $list->insert("end", "-----------------------------------------------------------------------------\n"); $list->insert("end", "\n"); } # # Do LDAP entry edit. # sub ldapActionEdit { my $dataArray; my $editArray; my $blank = " "; my $data; my $dn; my $max; my $lb; my $info; my @infoKeys; my @DNs = (); my @tmp1 = (); #my $index; my $indexCount; my $text; if ( !$Global{'ldapActionDN'} ) { &ldapActionCancel(); return; } my $objects = $Global{'ldapActionDN'}; &ldapActionCancel(); return if Tk::Exists($Global{'editWindow'}); &displayEdit(); # clear the entry data display window. # # Format and display the data associcated with the dn # passed to this subroutine. # @DNs = split(/$sepChar/,$objects); # split base from dn. $dataArray = $Global{'searchResults'}; $data = $$dataArray{$DNs[1]}; # get data associated with this dn $dn = $$data[0]; # get DN my $tmpdn = $dn; # save DN $Global{'entryDN'} = $dn; # save DN $max = $$data[1]; # get max size of atttributes $info = $$data[2]; # get data hash address. @tmp1 = sort(keys(%$info)); # get a list of all attributes. foreach my $attrKey ( @tmp1 ) { # # User can not edit these attributes, remove from the list of # attributes to display. # if ( $attrKey =~ /createTimeStamp/i || $attrKey =~ /modifyTimeStamp/i || $attrKey =~ /creatorsName/i || $attrKey =~ /modifiersName/i ) { next; } push( @infoKeys, $attrKey ); # get a list of all attributes. } # # create attribute label # $text = sprintf "%${max}s",'DN'; $lb = $elist->Label(-text => $text, -font => $Global{'Font'}, -relief => 'groove', -anchor => 'e', -width => ($max+2) ); $elist->windowCreate("end", -window => $lb ); # # create data entry window # $lb = $elist->Entry(-width => 85, -textvariable => \$tmpdn); $elist->windowCreate("end", -window => $lb ); $elist->insert("end", "\n"); # position to the next row. # # For each attribute display it's data # my $sptr = 0; foreach my $var (@infoKeys) { $$Global{'multi'}[$sptr] = 0; $text = sprintf "%${max}s",$var; my $values = $$info{$var}; # get attribute data array. $$Global{'multi'}[$sptr] = 1 if (@$values > 1); foreach my $Value ( @$values ) { if ( $var =~ /;binary$/ ) { next; } # We do not do binary data, yet. # # create attribute action button # $ab = $elist->Button(-text => $text, -font => $Global{'Font'}, -borderwidth => 3, -relief => 'raised' ); $elist->windowCreate("end", -window => $ab ); # # Format data and print data into Entry Box # $lb = $elist->Listbox(-width => 85, -height => 1 ); $elist->windowCreate("end", -window => $lb ); $lb->insert('end', $Value ); $ab->configure( -command => [ \&changeAttribute, \$ab, \$lb, \$Value, \$var, $sptr ] ); # position to the next row. $elist->insert("end", "\n"); } ++$sptr; } $lb = $elist->Entry(-width => 85, -textvariable => \$blank); $elist->windowCreate("end", -window => $lb ); # position to the next row. $elist->insert("end", "\n"); } sub changeAttribute { my ( $ab, $lb, $Value, $attr, $mv ) = @_; # # Create change attribute Window # if (!Exists($Global{'changeWindow'}) ) { &globalPos(); my $x = $Global{'horz'} + 75; my $y = $Global{'vert'} + 75; my $acframe; my $alframe; my $attribute; $Global{'tmpADD'} = {}; $Global{'tmpDELETE'} = {}; $Global{'tmpREPLACE'} = {}; $Global{'changeWindow'} = MainWindow->new; $Global{'changeWindow'}->title("ATTRIBUTE MODIFICATION WINDOW"); $Global{'changeWindow'}->geometry("+$x+$y"); # # Create process Cancel button # $Global{'changeWindow'}->Button(-text => "CANCEL ATTRIBUTE EDIT", -command => \&change_cancel, -font => $Global{'Font'}, -borderwidth => 5 ) -> pack(-fill => "both", -padx => 2, -pady => 2 ) ; # # Create frame for clear buttons. # $acframe = $Global{'changeWindow'}->Frame() ->pack( -fill => "both", -side => "bottom", -padx => 5, -pady => 2); # # Create Clear Data # $acframe -> Button(-text => " ACCEPT DATA CHANGE ", -command => \&makeChanges, -font => $Global{'Font'}, -borderwidth => 3 ) ->pack( -fill => 'both' ); # # Create list frame. # $outerframe = $Global{'changeWindow'}->Frame() ->pack( -fill => "both", -side => "top", -padx => 5, -pady => 2, -expand => 1); # # Create data frame. # $alframe = $outerframe->LabFrame(-label => "ATTRIBUTE DATA", -labelside => "acrosstop" ) ->pack( -fill => "both", -side => "top", -padx => 5, -pady => 2, -expand => 1); # # Create a Text Box that will actually contain the # returned directory data. # $attrlist = $alframe ->Text( -width => 80, -height => 1, -wrap => 'none', -font => $Global{'Font'} ); $attrlist->pack(-fill => "both", -expand => 1 ); $attrlist->insert('end', $$Value); if ( $Global{'add_new_attribute'} ) { # # Create data frame. # $Global{'newAttributeFrame'} = $outerframe->LabFrame( -label => "NEW ATTRBUTE NAME", -labelside => "acrosstop" ) ->pack( -fill => "both", -side => "top", -padx => 5, -pady => 2, -expand => 1); # # Create a Text Box that will actually contain the # returned directory data. # $Global{'newAttribute'} = $Global{'newAttributeFrame'}->Text( -width => 80, -height => 1, -wrap => 'none', -font => $Global{'Font'} ); $Global{'newAttribute'}->pack(-fill => "both", -expand => 1 ); $Global{'newAttributeReady'} = 1 ; } # # Create process Add button # $Global{'changeWindow'}->Button(-text => "ADD", -command => [\&add_data, $attr, $Value, \$attrlist], -font => $Global{'Font'}, -borderwidth => 5 ) -> pack(-side => $Global{'hand'}, -padx => 2, -pady => 2 ) ; if ( !defined($Global{'add_new_attribute'}) ) { # # Create process Delete button # $Global{'changeWindow'}->Button(-text => "DELETE", -command => [\&delete_data, $attr, $Value], -font => $Global{'Font'}, -borderwidth => 5 ) -> pack(-side => $Global{'hand'}, -padx => 2, -pady => 2 ) ; # # Create process Replace button # $Global{'changeWindow'}->Button(-text => "REPLACE", -command => [\&replace_data, $attr, $Value,\$attrlist, $mv], -font => $Global{'Font'}, -borderwidth => 5 ) -> pack(-side => $Global{'hand'}, -padx => 2, -pady => 2 ) ; $Global{'multi'} = []; } } else { return; } sub delete_data { my ( $attr, $Value ) = @_; # # # $Global{'tmpDELETE'}{$$attr} = $$Value; } # End of delete_data subroutine sub replace_data { my ( $attr, $Value, $tbox,$mv ) = @_; # # Replace this attributes value. # But what if this is a multi-valued attribute. # if ( $$Global{'multi'}[$mv] ) { # # User says it is a multi-valued attribute. # # First I add the new data then delete the old data. # $Global{'tmpDELETE'}{$$attr} = $$Value; $Global{'tmpADD'}{$$attr} = $$tbox->get('1.0','1.end'); } else { $Global{'tmpREPLACE'}{$$attr} = $$tbox->get('1.0','1.end'); } } # End of replace_data subroutine sub add_data { my ( $attr, $Value, $tbox ) = @_; my $newAttribute; if ( $Global{'newAttributeReady'} ) { # # add new attribute and it's value # $newAttribute = $Global{'newAttribute'}->get('1.0','1.end'); #print $newAttribute, "\n"; $Global{'tmpADD'}{$newAttribute} = $$tbox->get('1.0','1.end'); } else { # # add new value to attribute # $Global{'tmpADD'}{$$attr} = $$tbox->get('1.0','1.end'); } } # End of add_data subroutine sub makeChanges { my $tmp = $Global{'tmpADD'}; my @Keys = sort(keys(%$tmp)); if ( @Keys ) { foreach my $var ( @Keys) { $Global{'add'}{$var} = $Global{'tmpADD'}{$var}; # print $var, " == ", $Global{'tmpADD'}{$var},"\n"; } $Global{tmpADD} = {}; $Global{'newAttribute'}->destroy if Tk::Exists($Global{'newAttribute'}); $Global{'newAttributeFrame'}->destroy if Tk::Exists($Global{'newAttributeFrame'}); delete( $Global{'newAttributeReady'} ) if ( defined($Global{'newAttributeReady'} )); delete( $Global{'newAttribute'}) if ( defined($Global{'newAttribute'} )); delete( $Global{'newAttributeFrame'}) if ( defined($Global{'newAttributeFrame'} )); } $tmp = $Global{'tmpDELETE'}; @Keys = sort(keys(%$tmp)); if ( @Keys ) { foreach my $var ( @Keys) { $Global{'delete'}{$var} = $Global{'tmpDELETE'}{$var}; # print $Global{'tmpDELETE'}{$var},"\n"; } $Global{tmpDELETE} = {}; } $tmp = $Global{'tmpREPLACE'}; @Keys = sort(keys(%$tmp)); if ( @Keys ) { foreach my $var ( @Keys) { $Global{'replace'}{$var} = $Global{'tmpREPLACE'}{$var}; # print $Global{'tmpREPLACE'}{$var},"\n"; } $Global{tmpREPLACE} = {}; } $Global{'changeWindow'}->destroy if Tk::Exists($Global{'changeWindow'}); } # End of clear subroutine sub change_cancel { $Global{tmpADD} = {}; $Global{tmpDELETE} = {}; $Global{tmpREPLACE} = {}; $Global{'multi'} = []; $Global{'changeWindow'}->destroy if Tk::Exists($Global{'changeWindow'}); } # End of cancel subroutine } # End of subroutine changeAttribute # # Do LDAP entry delete. # sub ldapActionDelete { my $error; my $mesg; my $rmesg; my @DNs; my $do_it; my $okay; my @referral; my $rresult; if ( !$Global{'ldapActionDN'} ) { &ldapActionCancel(); return; } my $objects = $Global{'ldapActionDN'}; &ldapActionCancel(); @DNs = split(/$sepChar/,$objects); # split base from dn. $error = 0; if ( !defined($Global{ldap}) ) { $error = dirConn(); if ( $error == 1 ) { if ( defined($Global{dirConnError}) ) { $error = "ldapActionDelete $Global{dirConnError}"; ERROR(\$error); } else { ERROR($error); } return; } } $do_it = 1; $Global{loopCount} = 0; $okay = 0; while ($do_it == 1 ) { $mesg = $Global{ldap}->delete($DNs[1]); if ( $mesg->code ) { if ( $mesg->code == 10 && $Global{fref} ) { # # Being refer'ed to another directory server. # @referral = $mesg->referrals(); foreach my $rref (@referral ) { print "LDAP Referral: $rref \n" if $debug; $rresult = &dirRConn($rref); if ( $rresult != 0 ) { print "Referral connect error, trying next now\n" if ( $debug ); next; } else { $rmesg = $Global{rldap}->delete($DNs[1]); if ( !$rmesg->code ) { &dirRUConn(); $do_it = 0; last; } } } # End of foreach my $rref (@ref ) if ( $do_it ) { # # All referrals have been tried, there is a major error. # &dirRUConn(); $errstr = "There has been a major referral error deleteing this DN."; $errstr .= "The following referrals were tried;\n"; foreach my $rref (@referral ) { $errstr .= "$rref\n"; } ERROR($errstr); return; } # End of if ( $do_it ) } # End of if ( $mesg->code == 10 && $Global{fref} ) else { print "Delete check busy now\n" if ( $debug ); # # There was an error, check for dsa busy # error. # # $errstr = $mesg->code; $errstr = ldap_error_text($errstr); # # Check for server busy. # if ( !(CheckError($errstr) ) ) { $errstr = $mesg->code; ERROR($errstr); return; } } # End of else for if ( $mesg->code == 10 && $Global{fref} ) } # End of if ( $mesg->code ) else { # # There was no error # $do_it = 0; } } # End of while ($do_it == 1 ) # # Destroy the dn history list if it exists. # $Global{'searchHList'}->delete('all') if Tk::Exists($Global{'searchHList'}); $Global{nb}->raise('SEARCH'); } # End of ldapActionDelete subroutine # # Do create entry from ldif file. # sub ldapActionCreateLdifEntry { my $error; my $mesg; my $rmesg; my $f; my $ldif; my @entry; my $do_it; my $type; my $task; my $rresult; my @referral; $error = 0; if ( !defined($Global{ldap}) ) { $error = dirConn(); if ( $error == 1 ) { if ( defined($Global{dirConnError}) ) { $error = "ldapActionCreateLdifEntry $Global{dirConnError}"; ERROR(\$error); return; } else { ERROR($error); return; } } } @entry = (); if ( $Global{createLdifFile} && -f $Global{createLdifFile}) { $ldif = Net::LDAP::LDIF->new( "$Global{createLdifFile}", "r", onerror => 'undef' ); if ( $ldif->error() ) { $mesg = "MESG create entry error msg: " . $ldif->error() . "\n"; $mesg .= "Error lines:\n" . $ldif->error_lines() . "\n"; ERROR(\$mesg); } while( not $ldif->eof() ) { $entry = $ldif->read_entry(); if ( $ldif->error() ) { $mesg = "LDIF create entry error msg: " . $ldif->error() . "\n"; $mesg .= "Error lines:\n" . $ldif->error_lines() . "\n"; ERROR(\$mesg); } else { $op = $$entry{changetype}; if ( $op =~ /add/) { $type = "add"; # $mesg = $Global{ldap}->add($entry); $task = '$Global{ldap}->add($entry)'; } else { $type = "change"; $op = $$entry{changes}; #$mesg = $Global{ldap}->modify($entry); $task = '$entry->update($Global{ldap})'; } $do_it = 1; while ( $do_it ) { $mesg = eval $task; if ( $mesg->code ) { if ( $mesg->code == 10 && $Global{fref} ) { # # Being refer'ed to another directory server. # @referral = $mesg->referrals(); foreach my $rref (@referral ) { print "LDAP Referral: $rref \n" if $debug; $rresult = &dirRConn($rref); if ( $rresult != 0 ) { print "Referral connect error, trying next now\n" if ( $debug ); next; } else { $task = '$entry->update($Global{rldap})'; $rmesg = eval $task; if ( !$rmesg->code ) { &dirRUConn(); $do_it = 0; last; } } } # End of foreach my $rref (@ref ) if ( $do_it ) { # # All referrals have been tried, there is a major error. # &dirRUConn(); $errstr = "There has been a major referral updating this DN."; $errstr .= "The following referrals were tried;\n"; foreach my $rref (@referral ) { $errstr .= "$rref\n"; } ERROR($errstr); return; } # End of if ( $do_it ) } # End of if ( $mesg->code == 10 && $Global{fref} ) else { print "Delete check busy now\n" if ( $debug ); # # There was an error, check for dsa busy # error. # # $errstr = $mesg->code; $errstr = ldap_error_text($errstr); # # Check for server busy. # if ( !(CheckError($errstr) ) ) { $errstr = $mesg->code; ERROR($errstr); return; } } } # End of if ( $mesg->code ) else { # # There was no error # $do_it = 0; } # End of else for if ( $mesg->code == 10 && $Global{fref} ) } # End of while ( $do_it ) } # End of else for if ( $ldif->error() ) } $ldif->done(); @entry = undef; } else { $msgbox->insert("0", "LDIF file not defined or does not exist.") if ( defined( $msgbox) ); $msgbox->update() if ( defined( $msgbox) ); $mesg = "LDIF file not defined or does not exist."; ERROR(\$mesg); } $mesg = undef; } # End of ldapActionCreateLdifEntry subroutine # # Do LDAP multi-entry save to ldif # sub ldapActionMultiSaveToLdif { my $error; my $mesg; my $f; my $ldif; my @entry; my $do_it; &ldapActionCancel(); $error = 0; if ( !defined($Global{ldap}) ) { $error = dirConn(); if ( $error == 1 ) { if ( defined($Global{dirConnError}) ) { $error = "ldapActionMultiSaveToLdif $Global{dirConnError}"; ERROR(\$error); return; } else { ERROR($error); return; } } } @entry = (); $mesg = $Global{ldap}->search( base => $LDAP_SEARCH_BASE, filter => $Global{filter}, attrs => $Global{att_wanted}, ); if ( $mesg->code && $mesg->code != 48 ) { ERROR($mesg->code); } if ( $mesg->count ) { if ( $Global{ldifFile} ) { @entry = $mesg->all_entries; if ( $Global{ldif} ) { $ldif = Net::LDAP::LDIF->new( "$Global{ldifFile}", "w", onerror => 'undef' ); $ldif->write(@entry, -encode => "base64"); $ldif->done(); } elsif ( $Global{xml} ) { open(FXML, ">$Global{'ldifFile'}"); my $dsml = Net::LDAP::DSML->new(output => *FXML, pretty_print => 1); $dsml->write_entry(@entry); $dsml->end_dsml; close(FXML); } else { print "saveldif ",$Global{ldif}, "\n"; print "saveXml ",$Global{xml}, "\n"; $msgbox->insert("0", "Neither LDIF or XML variable is defined.") if ( defined( $msgbox) ); $msgbox->update() if ( defined( $msgbox) ); } @entry = undef; } else { $msgbox->insert("0", "LDIF file not defined.") if ( defined( $msgbox) ); $msgbox->update() if ( defined( $msgbox) ); } $mesg = undef; } else { $msgbox->insert("0", "No entry found for ldif storage.") if ( defined( $msgbox) ); $msgbox->update() if ( defined( $msgbox) ); } } # End of ldapActionMultiSaveToLdif subroutine # # Do single LDAP entry save to ldif # sub ldapActionSaveToLdif { my $error; my $mesg; my $f; my $ldif; my @entry; my $do_it; if ( !$Global{'ldapActionDN'} ) { &ldapActionCancel(); return; } my $objects = $Global{'ldapActionDN'}; &ldapActionCancel(); @DNs = split(/$sepChar/,$objects); # split base from dn. $error = 0; if ( !defined($Global{ldap}) ) { $error = dirConn(); if ( $error == 1 ) { if ( defined($Global{dirConnError}) ) { $error = "ldapActionSaveToLdif $Global{dirConnError}"; ERROR(\$error); return; } else { ERROR($error); return; } } } @entry = (); $mesg = $Global{ldap}->search( base => $LDAP_SEARCH_BASE, filter => $Global{filter}, attrs => $Global{att_wanted}, ); if ( $mesg->code && $mesg->code != 48 ) { ERROR($mesg->code); } if ( $mesg->count ) { if ( $Global{ldifFile} ) { @entry = $mesg->all_entries; foreach $entry (@entry) { my $edn = $entry->dn; if ( $DNs[1] eq $edn ) { if ( $Global{ldif} ) { $ldif = Net::LDAP::LDIF->new( "$Global{ldifFile}", "w", onerror => 'undef' ); $ldif->write($entry, -encode => "base64"); $ldif->done(); } elsif ( $Global{xml} ) { open(FXML, ">$Global{'ldifFile'}"); my $dsml = Net::LDAP::DSML->new(output => *FXML, pretty_print => 1); $dsml->write_entry($entry); $dsml->end_dsml; close(FXML); } else { print "saveldif ",$Global{ldif}, "\n"; print "saveXml ",$Global{xml}, "\n"; $msgbox->insert("0", "Neither LDIF or XML variable is defined.") if ( defined( $msgbox) ); $msgbox->update() if ( defined( $msgbox) ); } } else { $entry = undef; } } } else { $msgbox->insert("0", "LDIF file not defined.") if ( defined( $msgbox) ); $msgbox->update() if ( defined( $msgbox) ); } $mesg = undef; } else { $msgbox->insert("0", "No entry found for ldif storage.") if ( defined( $msgbox) ); $msgbox->update() if ( defined( $msgbox) ); } } # End of ldapActionSaveToLdif subroutine # # Do LDAP entry rename. # sub ldapActionRename { my $error; my $mesg; my $rmesg; $error = 0; my $do_it; my $rresult; my @referral; if ( $Global{'Rename'} == -1 ) { return; } if ( !defined($Global{ldap}) ) { $error = dirConn(); if ( $error == 1 ) { if ( defined($Global{dirConnError}) ) { $error = "ldapActionRename $Global{dirConnError}"; ERROR(\$error); return; } else { ERROR($error); } } } $do_it = 1; $Global{loopCount} = 0; while ($do_it == 1 ) { $mesg = $Global{ldap}->moddn($Global{'RenameDN'}, newrdn => $Global{'newrdn'}, deleteoldrdn => $Global{'deleteoldrdn'}, newsuperior => $Global{'newsuperior'} ); if ( $mesg->code ) { if ( $mesg->code == 10 && $Global{fref} ) { # # Being refer'ed to another directory server. # @referral = $mesg->referrals(); foreach my $rref (@referral ) { print "LDAP Referral: $rref \n" if $debug; $rresult = &dirRConn($rref); if ( $rresult != 0 ) { print "Rename referral connect error, trying next now\n" if ( $debug ); next; } else { $rmesg = $Global{rldap}->moddn($Global{'RenameDN'}, newrdn => $Global{'newrdn'}, deleteoldrdn => $Global{'deleteoldrdn'}, newsuperior => $Global{'newsuperior'} ); if ( !$rmesg->code ) { &dirRUConn(); $do_it = 0; last; } } } # End of foreach my $rref (@ref ) if ( $do_it ) { # # All referrals have been tried, there is a major error. # &dirRUConn(); $errstr = "There has been a major referral error renaming this DN."; $errstr .= "The following referrals were tried;\n"; foreach my $rref (@referral ) { $errstr .= "$rref\n"; } ERROR($errstr); return; } # End of if ( $do_it ) } # End of if ( $mesg->code == 10 && $Global{fref} ) else { # # There was an error, check for dsa busy # error. # # $errstr = $mesg->code; $errstr = ldap_error_text($errstr); # # Check for server busy. # if ( !(CheckError($errstr) ) ) { $errstr = $mesg->code; ERROR($errstr); return; } } } # End of if ( $mesg->code ) else { # # There was no error # $do_it = 0; } } # End of while ($do_it == 1 ) # # Destroy the dn history list if it exists. # $Global{'searchHList'}->delete('all') if Tk::Exists($Global{'searchHList'}); $Global{nb}->raise('SEARCH'); } # End of subroutine ldapActionRename # # Create Rename DATA Window # sub getRenameData { $Global{'newsuperior'} = ""; $Global{'newrdn'} = ""; $Global{'RenameDN'} = ""; $Global{'deleteoldrdn'} = 1; &globalPos(); my $x = $Global{'horz'} + 0; my $y = $Global{'vert'} + 50; my @rdnData; my $rdn; my $super; my $delrdn; my @DNs; if ( !$Global{'ldapActionDN'} ) { &ldapActionCancel(); return; } my $objects = $Global{'ldapActionDN'}; &ldapActionCancel(); @DNs = split(/$sepChar/,$objects); # split base from dn. $Global{'RenameDN'} = $DNs[1]; @rdnData = split(/,/,$DNs[1]); $rdn = shift(@rdnData); foreach my $var (@rdnData) { $super .= $var . ","; } chop($super); # get rid of trailing comma # # Create Data Window # $Global{'renameWindow'} = MainWindow->new; $Global{'renameWindow'}->title("MODDN INFORMATION"); $Global{'renameWindow'}->geometry("+$x+$y"); # # Create process accept button # $Global{'renameWindow'}->Button( -text => "ACCEPT", -command => \&rdnAccept, -font => $Global{'Font'}, -borderwidth => 3 ) -> pack(-side => "bottom", -padx => 5, -pady => 5 ) ; # # Create process cancel button # $Global{'renameWindow'}->Button(-text => "CANCEL", -command => \&rdnCancel, -font => $Global{'Font'}, -borderwidth => 3) -> pack(-side => "top", -padx => 5, -pady => 5 ) ; my $newrdnframe = $Global{'renameWindow'}->LabFrame(-label => "Newrdn", -labelside => "acrosstop") ->pack( -fill => "both", -side => "top", -padx => 5, -pady => 5 ); # # Create newrdn text box. # my $t1 = $newrdnframe->Entry(-textvariable => \$Global{'newrdn'}, -width => 25 ) -> pack(-fill => 'x'); $t1->insert("end", $rdn); # # Create a Deleteoldrdn Radiobutton that will execute subroutine clear # to clear the List box before each directory query. # $delrdn = $Global{'renameWindow'} -> Checkbutton(-text => "DELETE OLD RDN DATA", -variable => \$Global{'deleteoldrdn'}, -onvalue => 1, -offvalue => 0, -font => $Global{'Font'} ) -> pack(-anchor => 'sw' ); $delrdn->select(); my $newsuperiorframe = $Global{'renameWindow'}->LabFrame(-label => "Newsuperior RDN", -labelside => "acrosstop") ->pack( -fill => "both", -side => "top", -padx => 5, -pady => 5 ); # # Create Password Entry text box. # my $t2 = $newsuperiorframe->Entry( -textvariable => \$Global{'newsuperior'}, -width => 25, -font => $Global{'Font'} ) -> pack(-fill => 'x'); $t2->insert("end", $super); sub rdnCancel{ $Global{'renameWindow'}->destroy() if Tk::Exists($Global{'renameWindow'}); delete($Global{'renameWindow'}); delete( $Global{'newsuperior'}); delete( $Global{'newrdn'}); delete( $Global{'deleteoldrdn'} ); delete( $Global{'RenameDN'} ); } # End of cancel subroutine sub rdnAccept{ # # Clean up data and close windows, forces another search to # get valid new data. # $Global{'renameWindow'}->destroy() if Tk::Exists($Global{'renameWindow'}); $Global{'searchHistWindow'}->destroy if Tk::Exists($Global{'searchHistWindow'}); $Global{'renameWindow'} = undef(); $Global{'searchHistWindow'} = undef(); &ldapActionRename(); # Rename the entry in the directory delete( $Global{'newsuperior'}); delete( $Global{'newrdn'}); delete( $Global{'deleteoldrdn'} ); delete( $Global{'RenameDN'} ); delete($Global{'index'}) if ( defined($Global{'index'})); } # End of accept subroutine } # End of getRenameData subroutine sub display_clear { # # Clear out text in List Box # $list->delete("1.0", "end"); } # End of clear subroutine sub displayEdit() { my $ecframe; my $elframe; my $erbclear; &globalPos(); my $x = $Global{'horz'} + 75; my $y = $Global{'vert'} + 75; # # Create Edit Window # if (!Exists($Global{'editWindow'}) ) { $Global{'editWindow'} = MainWindow->new; $Global{'editWindow'}->title("ENTRY EDIT DISPLAY"); $Global{'editWindow'}->geometry("+$x+$y"); # # Create process Exit button # $Global{'editWindow'}->Button(-text => "CANCEL ENTRY EDIT", -command => \&edit_cancel, -font => $Global{'Font'}, -borderwidth => 5 ) -> pack(-fill => "both", -padx => 2, -pady => 2 ) ; # # Create frame for clear buttons. # $ecframe = $Global{'editWindow'}->Frame() ->pack( -fill => "both", -side => "bottom", -padx => 5, -pady => 2); # # Create Clear Data # $ecframe -> Button(-text => " CHANGE DATA ", -command => \&changeEntry, -font => $Global{'Font'}, -borderwidth => 3 ) ->pack( -fill => 'both' ); # # Create list frame. # $elframe = $Global{'editWindow'}->LabFrame(-label => "ENTRY DATA", -labelside => "acrosstop" ) ->pack( -fill => "both", -side => "top", -padx => 5, -pady => 2, -expand => 1); # # Create a ROText Box that will actually contain the # returned directory data. # $elist = $elframe ->Scrolled('Text', -scrollbars => 'se', -width => 80, -height => 20, -wrap => 'none', -font => $Global{'Font'} ); $elist->pack(-fill => "both", -expand => 1 ); # # Create process add new attribute button # $elframe->Button(-text => "ADD\nATTRIBUTE", -command => \&add_new_attribute, -font => $Global{'Font'}, -borderwidth => 5 ) -> pack(-side => $Global{'hand'}, -padx => 2, -pady => 2 ) ; } sub edit_cancel{ delete($Global{'add'}); delete($Global{'delete'}); delete($Global{'replace'}); $Global{'editWindow'}->destroy if Tk::Exists($Global{'editWindow'}); } # End of cancel subroutine } # End of subroutine displayEdit # # Add new attribute to entry that is being edited. # sub add_new_attribute { $Global{'add_new_attribute'} = 1; changeAttribute( 1,1,1,1); delete($Global{'add_new_attribute'}); } # End of subroutine add_new_attribute # # Execute any LDAP add, delete, or replace changes. # sub changeEntry { my $errstr; my $mesg; my $rmesg; my $error = 0; # initialize error flag. my $do_it; my $rresult; my @referral; if ( !defined($Global{ldap}) ) { $error = dirConn(); if ( $error == 1 ) { if ( defined($Global{dirConnError}) ) { $error = "changeEntry $Global{dirConnError}"; ERROR(\$error); } else { ERROR($error); } return; } } # # Execute any LDAP add changes. # if ( defined($Global{'add'}) ) { $do_it = 1; $Global{loopCount} = 0; while ($do_it == 1 ) { $mesg = $Global{ldap}->modify( $Global{'entryDN'}, add => $Global{'add'}); if ( $mesg->code ) { if ( $mesg->code == 10 && $Global{fref} ) { # # Being refer'ed to another directory server. # # @referral = $mesg->referrals(); foreach my $rref (@referral ) { print "LDAP Referral: $rref \n" if $debug; $rresult = &dirRConn($rref); if ( $rresult != 0 ) { print "Referral connect error, trying next now\n" if ( $debug ); next; } else { $rmesg = $Global{rldap}->modify( $Global{'entryDN'}, add => $Global{'add'}); if ( !$rmesg->code ) { &dirRUConn(); $do_it = 0; last; } } } # End of foreach my $rref (@ref ) if ( $do_it ) { # # All referrals have been tried, there is a major error. # &dirRUConn(); $errstr = "There has been a major referral error adding an attribute to this DN."; $errstr .= "The following referrals were tried;\n"; foreach my $rref (@referral ) { $errstr .= "$rref\n"; } ERROR($errstr); return; } # End of if ( $do_it ) } else { # # There was an error, check for dsa busy # error. # # $errstr = $mesg->code; $errstr = ldap_error_text($errstr); # # Check for server busy. # if ( !(CheckError($errstr) ) ) { $errstr = $mesg->code; ERROR($errstr); return; } } } else { # # There was no error # $do_it = 0; } } delete( $Global{'add'} ); } # # Execute any delete changes. # if ( defined($Global{'delete'}) ) { $do_it = 1; $Global{loopCount} = 0; while ($do_it == 1 ) { $mesg = $Global{ldap}->modify( $Global{'entryDN'}, delete => $Global{'delete'}); if ( $mesg->code ) { if ( $mesg->code == 10 && $Global{fref} ) { # # Being refer'ed to another directory server. # # @referral = $mesg->referrals(); foreach my $rref (@referral ) { $rresult = &dirRConn($rref); if ( $rresult != 0 ) { print "Referral connect error, trying next now\n" if ( $debug ); next; } else { $rmesg = $Global{rldap}->modify( $Global{'entryDN'}, delete => $Global{'delete'}); if ( !$rmesg->code ) { &dirRUConn(); $do_it = 0; last; } } } # End of foreach my $rref (@ref ) if ( $do_it ) { # # All referrals have been tried, there is a major error. # &dirRUConn(); $errstr = "There has been a major referral error deleteing an attribute on this DN."; $errstr .= "The following referrals were tried;\n"; foreach my $rref (@referral ) { $errstr .= "$rref\n"; } ERROR($errstr); return; } # End of if ( $do_it ) } else { # # There was an error, check for dsa busy # error. # # $errstr = $mesg->code; $errstr = ldap_error_text($errstr); # # Check for server busy. # if ( !(CheckError($errstr) ) ) { $errstr = $mesg->code; ERROR($errstr); return; } } } else { # # There was no error # $do_it = 0; } } delete( $Global{'delete'} ); } # # Execute any replace changes. # if ( defined($Global{'replace'}) ) { $do_it = 1; $Global{loopCount} = 0; while ($do_it == 1 ) { $mesg = $Global{ldap}->modify( $Global{'entryDN'}, replace => $Global{'replace'}); if ( $mesg->code ) { if ( $mesg->code == 10 && $Global{fref} ) { # # Being refer'ed to another directory server. # # @referral = $mesg->referrals(); foreach my $rref (@referral ) { $rresult = &dirRConn($rref); if ( $rresult != 0 ) { print "Referral connect error, trying next now\n" if ( $debug ); next; } else { $rmesg = $Global{rldap}->modify( $Global{'entryDN'}, replace => $Global{'replace'}); if ( !$rmesg->code ) { &dirRUConn(); $do_it = 0; last; } } } # End of foreach my $rref (@ref ) if ( $do_it ) { # # All referrals have been tried, there is a major error. # &dirRUConn(); $errstr = "There has been a major referral error replacing an attribute on this DN."; $errstr .= "The following referrals were tried;\n"; foreach my $rref (@referral ) { $errstr .= "$rref\n"; } ERROR($errstr); return; } # End of if ( $do_it ) } else { # # There was an error, check for dsa busy # error. # # $errstr = $mesg->code; $errstr = ldap_error_text($errstr); # # Check for server busy. # if ( !(CheckError($errstr) ) ) { $errstr = $mesg->code; ERROR($errstr); return; } } } else { # # There was no error # $do_it = 0; } } delete( $Global{'replace'} ); } # # Clean up data and close windows, forces another search to # get valid new data. # delete($Global{'index'}) if ( defined($Global{'index'})); delete($Global{'tmpADD'}) if ( defined($Global{'tmpADD'})); delete($Global{'tmpDELETE'}) if ( defined($Global{'tmpDELETE'})); delete($Global{'tmpREPLACE'}) if ( defined($Global{'tmpREPLACE'})); delete($Global{'add'}) if ( defined($Global{'add'})); delete($Global{'delete'}) if ( defined($Global{'delete'})); delete($Global{'replace'}) if ( defined($Global{'replace'})); $Global{'editWindow'}->destroy if Tk::Exists($Global{'editWindow'}); $Global{'changeWindow'}->destroy if Tk::Exists($Global{'changeWindow'}); $Global{'searchHistWindow'}->destroy if Tk::Exists($Global{'searchHistWindow'}); # # Destroy the dn history list if it exists. # $Global{'searchHList'}->delete('all') if Tk::Exists($Global{'searchHList'}); $Global{nb}->raise('SEARCH'); } # End of changeEntry subroutine # # Get and display the root dse entry. # sub rootDse { my $base; &globalPos(); my $x = $Global{'horz'} + 150; my $y = $Global{'vert'} + 150; my $error; my $mesg; $error = 0; if ( !defined($Global{ldap} ) ) { $error = dirConn(); if ( $error ) { if ( defined($Global{dirConnError}) ) { $error = "rootDSE $Global{dirConnError}"; ERROR(\$error); } else { ERROR($error); } return; } } my $root = $Global{ldap}->root_dse(); my @Attributes = ( qw(subschemaSubentry namingContexts supportedLDAPVersion supportedControl supportedExtension altServer supportedSASLMechanisms) ); if ( !defined($root) ) { my $error = "Root DSE entry could not be obtained."; ERROR(\$error); return; } # # Set up the Tk windows. # # if ( ! Exists($Global{'rootWindow'} ) ) { $Global{'rootWindow'} = MainWindow->new(); $Global{'rootWindow'}->title("ROOT DSE ENTRY"); $Global{'rootWindow'}->geometry("+$x+$y"); } # # Create label box # # if ( !Exists($Global{'labelDSE'}) ) { $Global{'labelDSE'} = $Global{'rootWindow'}->Label()->pack; } # # Create process Exit button # $Global{'ebuttonDSE'} = $Global{'rootWindow'}->Button( -text => "CLOSE ROOT DSE DISPLAY WINDOW", -command => \&root_cancel, -font => $Global{'Font'}, -borderwidth => 5 ) -> pack(-fill => "both", -padx => 2, -pady => 2 ) if ( Exists($Global{'rootWindow'} ) && !Exists($Global{'ebuttonDSE'} ) ); # # Create list box, this is where the selected objectclass data will # be displayed. # if ( !Exists($Global{'listDSE'}) ) { $Global{'listDSE'} = $Global{'rootWindow'}->Scrolled('ROText', -scrollbars => 'se', -width=>50, -wrap => "none", -font => $Global{'Font'}, -height => 10 ) ->pack(); } else { # # clear the list box # $Global{'listDSE'}->delete("1.0", "end"); } foreach $attr (@Attributes) { $base = $root->get_value( $attr, asref => 1); foreach (@$base) { $Global{'listDSE'}->insert("end", "$attr: $_\n"); } } } # End of subrountine rootDse #----------------------------------------# # Usage() - display simple usage message # #----------------------------------------# sub Usage { print( "Usage: [-h] | [-d <#> ] | [-n] | -i \n" ); print( "\t-d Perl-LDAP debug mode. Display debug messages to stdout.\n" ); print( "\t Should be used with -n so that process will not fork a\n" ); print( "\t new process.\n" ); print( "\t Value: 0 - display tklkup messages only.\n" ); print( "\t Value: 1 - Show outgoing packets (using asn_hexdump).\n" ); print( "\t Value: 2 - Show incoming packets (using asn_hexdump).\n" ); print( "\t Value: 4 - Show outgoing packets (using asn_dump).\n" ); print( "\t Value: 8 - Show incoming packets (using asn_dump).\n" ); print( "\t These values can be add to display several functions.\n" ); print( "\t-h Help. Display this message.\n" ); print( "\t-i Use the named file as the initialization file.\n" ); print( "\t-n Tklkup debug mode. Display debug messages to stdout.\n" ); print( "\n" ); print( "\t Perldoc pod documentation is included in this script.\n" ); print( "\t To read the pod documentation do the following;\n" ); print( "\t perldoc