Excuse all of my past ramblings about schema...
Active Directory (and possibly ADAM) stores extended attribute schema
information in extendedAttributeInfo. I wrote a function which merges this
information with attributeTypes. Each extended attribute will be prefixed
with an 'x-' in keeping with some much needed guidance from Peter Marschall.
The result is a merged Net::LDAP::Schema object with some important
information such as attribute length and if it is indexed etc.
Is this a hack? Absolutely.
Is extentedattributeinfo LDAP standard? Nope, But I have seen it implemented
in Active Directory, ADAM and even seen mention of it in Lotus Notes.
My hope is that someone can carry this code on into a sub class
(Net::LDAP::Schema::Extended?). I have only tested this code in so far as
reading attribute information. I have not played with any other Schema
functions with this hacked object.
Feedback is always welcome.
Happy Holidays!
Eric
sub get_ad_extendedschema
{
my $msg=$_[0]->search(base=>$_[0]->root_dse->get_value('subschemaSubentry'),
scope=>base,
filter=>'(objectclass=subschema)',
attrs=>[ qw( objectClasses attributeTypes matchingRules
matchingRuleUse dITStructureRules
dITContentRules nameForms ldapSyntaxes
extendedAttributeInfo) ]
);
die join(" : ",$msg->code,$msg->error) if $msg->code;
my $schema=Net::LDAP::Schema->new($msg->entry);
foreach my $line ($msg->entry->get_value('extendedAttributeInfo'))
{
$line=~s/^\(\s*//g;
$line=~s/\s+\)$//g;
$line=~s/(INDEXED|SYSTEM-ONLY)/\1 \'1\'/g;
$line=~s/\'//g;
my ($oid,%hash)=split(/\s/,$line);
my $temp=$schema->{'at'}->{lc $hash{'NAME'}};
foreach my $i (keys %hash)
{
$temp->{'x-' . lc $i}=$hash{$i} if $temp->{lc $i} eq undef;
}
$schema->{'at'}->{lc $hash{'NAME'}}=$temp;
}
return $schema;
}