2009-06-30 08:07:14 +00:00
|
|
|
<?php
|
2009-06-30 10:27:11 +00:00
|
|
|
// $Header: /cvsroot/phpldapadmin/phpldapadmin/lib/schema_functions.php,v 1.88.2.6 2006/03/08 08:22:56 wurley Exp $
|
2009-06-30 08:07:14 +00:00
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
2009-06-30 09:22:30 +00:00
|
|
|
* Classes and functions for fetching and parsing schema from an LDAP server.
|
2009-06-30 09:29:51 +00:00
|
|
|
*
|
2009-06-30 09:22:30 +00:00
|
|
|
* @package phpLDAPadmin
|
|
|
|
* @author The phpLDAPadmin development team
|
2009-06-30 09:29:51 +00:00
|
|
|
*/
|
2009-06-30 09:22:30 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Generic parent class for all schema items. A schema item is
|
|
|
|
* an ObjectClass, an AttributeBype, a MatchingRule, or a Syntax.
|
2009-06-30 09:29:51 +00:00
|
|
|
* All schema items have at least two things in common: An OID
|
|
|
|
* and a description. This class provides an implementation for
|
2009-06-30 09:22:30 +00:00
|
|
|
* these two data.
|
2009-06-30 09:29:51 +00:00
|
|
|
* @package phpLDAPadmin
|
2009-06-30 09:22:30 +00:00
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
class SchemaItem {
|
|
|
|
/** The OID of this schema item. */
|
|
|
|
var $oid;
|
|
|
|
|
|
|
|
/** The description of this schema item. */
|
|
|
|
var $description;
|
|
|
|
|
|
|
|
/** Initialize class members to default values. */
|
|
|
|
function initVars() {
|
|
|
|
$this->oid = null;
|
|
|
|
$this->description = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
function setOID( $new_oid ) {
|
2009-06-30 09:22:30 +00:00
|
|
|
$this->oid = $new_oid;
|
2009-06-30 08:09:20 +00:00
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
function setDescription( $new_desc ) {
|
2009-06-30 09:22:30 +00:00
|
|
|
$this->description = $new_desc;
|
2009-06-30 08:09:20 +00:00
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
function getOID() {
|
|
|
|
return $this->oid;
|
|
|
|
}
|
2009-06-30 09:22:30 +00:00
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
function getDescription() {
|
|
|
|
return $this->description;
|
|
|
|
}
|
|
|
|
}
|
2009-06-30 08:09:20 +00:00
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/**
|
2009-06-30 08:07:14 +00:00
|
|
|
* Represents an LDAP objectClass
|
2009-06-30 09:29:51 +00:00
|
|
|
* @package phpLDAPadmin
|
2009-06-30 08:07:14 +00:00
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
class ObjectClass extends SchemaItem {
|
2009-06-30 09:22:30 +00:00
|
|
|
/** This objectClass' name, ie "inetOrgPerson" */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $name;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** array of objectClass names from which this objectClass inherits */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $sup_classes;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** one of STRUCTURAL, ABSTRACT, or AUXILIARY */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $type;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** arrays of attribute names that this objectClass requires */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $must_attrs;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** arrays of attribute names that this objectClass allows, but does not require */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $may_attrs;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** boolean value indicating whether this objectClass is obsolete */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $is_obsolete;
|
2009-06-30 09:29:51 +00:00
|
|
|
/** array of objectClasses which inherit from this one (must be set at runtime explicitly by the caller) */
|
|
|
|
var $children_objectclasses;
|
2009-06-30 08:07:14 +00:00
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/** Initialize the class' member variables */
|
2009-06-30 10:26:08 +00:00
|
|
|
function initVars($ldapserver) {
|
2009-06-30 09:29:51 +00:00
|
|
|
parent::initVars();
|
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->oid = null;
|
|
|
|
$this->name = null;
|
|
|
|
$this->description = null;
|
|
|
|
$this->sup_classes = array();
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->type = $ldapserver->schema_oclass_default;
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->must_attrs = array();
|
|
|
|
$this->may_attrs = array();
|
|
|
|
$this->is_obsolete = false;
|
2009-06-30 09:29:51 +00:00
|
|
|
$this->children_objectclasses = array();
|
2009-06-30 08:07:14 +00:00
|
|
|
}
|
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
function _parse_list($i, $strings, &$attrs) {
|
|
|
|
/**
|
|
|
|
** A list starts with a ( followed by a list of attributes separated by $ terminated by )
|
|
|
|
** The first token can therefore be a ( or a (NAME or a (NAME)
|
|
|
|
** The last token can therefore be a ) or NAME)
|
|
|
|
** The last token may be terminate by more than one bracket
|
|
|
|
*/
|
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::_parse_list(): Entered with (%d,%s,%s)',9,
|
|
|
|
get_class($this),$i,$strings,$attrs);
|
2009-06-30 09:40:37 +00:00
|
|
|
|
|
|
|
$string = $strings[$i];
|
|
|
|
if (!preg_match('/^\(/',$string)) {
|
|
|
|
// A bareword only - can be terminated by a ) if the last item
|
|
|
|
if (preg_match('/\)+$/',$string))
|
2009-06-30 10:26:08 +00:00
|
|
|
$string = preg_replace('/\)+$/','',$string);
|
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
array_push($attrs, $string);
|
2009-06-30 10:26:08 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
} elseif (preg_match('/^\(.*\)$/',$string)) {
|
2009-06-30 10:26:08 +00:00
|
|
|
$string = preg_replace('/^\(/','',$string);
|
|
|
|
$string = preg_replace('/\)+$/','',$string);
|
2009-06-30 09:40:37 +00:00
|
|
|
array_push($attrs, $string);
|
2009-06-30 10:26:08 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
} else {
|
|
|
|
// Handle the opening cases first
|
2009-06-30 10:26:08 +00:00
|
|
|
|
|
|
|
if ($string == '(') {
|
2009-06-30 09:40:37 +00:00
|
|
|
$i++;
|
2009-06-30 10:26:08 +00:00
|
|
|
|
|
|
|
} elseif (preg_match('/^\(./',$string)) {
|
|
|
|
$string = preg_replace('/^\(/','',$string);
|
2009-06-30 09:40:37 +00:00
|
|
|
array_push ($attrs, $string);
|
|
|
|
$i++;
|
|
|
|
}
|
2009-06-30 10:26:08 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
// Token is either a name, a $ or a ')'
|
|
|
|
// NAME can be terminated by one or more ')'
|
|
|
|
while (! preg_match('/\)+$/',$strings[$i])) {
|
|
|
|
$string = $strings[$i];
|
2009-06-30 10:26:08 +00:00
|
|
|
if ($string == '$') {
|
2009-06-30 09:40:37 +00:00
|
|
|
$i++;
|
|
|
|
continue;
|
|
|
|
}
|
2009-06-30 10:26:08 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (preg_match('/\)$/',$string)) {
|
2009-06-30 10:26:08 +00:00
|
|
|
$string = preg_replace('/\)+$/','',$string);
|
2009-06-30 09:40:37 +00:00
|
|
|
} else {
|
|
|
|
$i++;
|
|
|
|
}
|
2009-06-30 10:26:08 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
array_push ($attrs, $string);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sort($attrs);
|
2009-06-30 10:26:08 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
|
|
|
debug_log('%s::_parse_list(): Returning (%d,[%s],[%s])',9,
|
2009-06-30 10:26:08 +00:00
|
|
|
get_class($this),$i,$strings,$attrs);
|
2009-06-30 09:40:37 +00:00
|
|
|
return $i;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/**
|
|
|
|
* Creates a new ObjectClass object given a raw LDAP objectClass string.
|
2009-06-30 10:27:11 +00:00
|
|
|
* @todo: Unfortunately, some schemas are not well defined - eg: dNSDomain. Where the schema definition is not case consistent with the attribute definitions. This causes us some problems, which we need to resolve.
|
2009-06-30 08:07:14 +00:00
|
|
|
*/
|
2009-06-30 10:26:08 +00:00
|
|
|
function ObjectClass($raw_ldap_schema_string,$ldapserver) {
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::__construct(): Entered with (%s)',9,get_class($this),$raw_ldap_schema_string);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->initVars($ldapserver);
|
2009-06-30 08:07:14 +00:00
|
|
|
$class = $raw_ldap_schema_string;
|
2009-06-30 10:26:08 +00:00
|
|
|
$strings = preg_split('/[\s,]+/',$class,-1,PREG_SPLIT_DELIM_CAPTURE);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
$str_count = count($strings);
|
|
|
|
|
|
|
|
for ($i=0; $i < $str_count; $i++) {
|
2009-06-30 09:29:51 +00:00
|
|
|
|
|
|
|
switch ($strings[$i]) {
|
2009-06-30 08:07:14 +00:00
|
|
|
case '(':
|
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'NAME':
|
2009-06-30 10:26:08 +00:00
|
|
|
if ($strings[$i+1]!='(') {
|
2009-06-30 08:07:14 +00:00
|
|
|
do {
|
|
|
|
$i++;
|
|
|
|
if(strlen($this->name)==0)
|
|
|
|
$this->name = $strings[$i];
|
|
|
|
else
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->name .= ' '.$strings[$i];
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 10:26:08 +00:00
|
|
|
} while (!preg_match('/\'$/s', $strings[$i]));
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
} else {
|
|
|
|
$i++;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
do {
|
|
|
|
$i++;
|
|
|
|
if(strlen($this->name) == 0)
|
2009-06-30 09:29:51 +00:00
|
|
|
$this->name = $strings[$i];
|
2009-06-30 08:07:14 +00:00
|
|
|
else
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->name .= ' ' . $strings[$i];
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 10:26:08 +00:00
|
|
|
} while (!preg_match('/\'$/s', $strings[$i]));
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
do {
|
|
|
|
$i++;
|
2009-06-30 09:29:51 +00:00
|
|
|
} while (! preg_match('/\)+\)?/',$strings[$i]));
|
2009-06-30 08:07:14 +00:00
|
|
|
}
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->name = preg_replace('/^\'/', '', $this->name);
|
|
|
|
$this->name = preg_replace('/\'$/', '', $this->name);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::__construct(): Case NAME returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->name);
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'DESC':
|
|
|
|
do {
|
|
|
|
$i++;
|
2009-06-30 09:29:51 +00:00
|
|
|
if (strlen($this->description)==0)
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->description=$this->description . $strings[$i];
|
|
|
|
else
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->description=$this->description . ' ' . $strings[$i];
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 10:26:08 +00:00
|
|
|
} while (!preg_match('/\'$/s', $strings[$i]));
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::__construc(): Case DESC returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->description);
|
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'OBSOLETE':
|
|
|
|
$this->is_obsolete = TRUE;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::__construct(): Case OBSOLETE returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->is_obsolete);
|
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'SUP':
|
2009-06-30 10:26:08 +00:00
|
|
|
if ($strings[$i+1]!='(') {
|
2009-06-30 08:07:14 +00:00
|
|
|
$i++;
|
2009-06-30 10:26:08 +00:00
|
|
|
array_push($this->sup_classes,preg_replace("/'/",'',$strings[$i]));
|
2009-06-30 09:29:51 +00:00
|
|
|
|
|
|
|
} else {
|
2009-06-30 08:07:14 +00:00
|
|
|
$i++;
|
|
|
|
do {
|
|
|
|
$i++;
|
2009-06-30 10:26:08 +00:00
|
|
|
if ($strings[$i]!='$')
|
|
|
|
array_push($this->sup_classes,preg_replace("/'/",'',$strings[$i]));
|
2009-06-30 09:29:51 +00:00
|
|
|
|
|
|
|
} while (! preg_match('/\)+\)?/',$strings[$i+1]));
|
2009-06-30 08:07:14 +00:00
|
|
|
}
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::__construct(): Case SUP returned (%s)',8,
|
|
|
|
get_class($this),$this->sup_classes);
|
2009-06-30 09:40:37 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'ABSTRACT':
|
|
|
|
$this->type='abstract';
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::__construct(): Case ABSTRACT returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->type);
|
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'STRUCTURAL':
|
|
|
|
$this->type='structural';
|
2009-06-30 10:26:08 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::__construct(): Case STRUCTURAL returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->type);
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'AUXILIARY':
|
|
|
|
$this->type='auxiliary';
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::__construct(): Case AUXILIARY returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->type);
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'MUST':
|
2009-06-30 09:40:37 +00:00
|
|
|
$attrs = array();
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
$i = $this->_parse_list(++$i, $strings, $attrs);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::__construct(): _parse_list returned %d (%s)',8,
|
|
|
|
get_class($this),$i,$attrs);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
foreach ($attrs as $string) {
|
|
|
|
$attr = new ObjectClassAttribute($string, $this->name);
|
|
|
|
array_push ($this->must_attrs, $attr);
|
2009-06-30 08:07:14 +00:00
|
|
|
}
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::__construct(): Case MUST returned (%s)',8,
|
|
|
|
get_class($this),$this->must_attrs);
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'MAY':
|
2009-06-30 09:40:37 +00:00
|
|
|
$attrs = array();
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
$i = $this->_parse_list(++$i, $strings, $attrs);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::__construct(): _parse_list returned %d (%s)',8,
|
|
|
|
get_class($this),$i,$attrs);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
foreach ($attrs as $string) {
|
|
|
|
$attr = new ObjectClassAttribute($string, $this->name);
|
|
|
|
array_push ($this->may_attrs, $attr);
|
2009-06-30 08:07:14 +00:00
|
|
|
}
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::__construct(): Case MAY returned (%s)',8,
|
|
|
|
get_class($this),$this->may_attrs);
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
default:
|
2009-06-30 10:26:08 +00:00
|
|
|
if(preg_match ('/[\d\.]+/i',$strings[$i]) && $i == 1) {
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->oid = $strings[$i];
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::__construct(): Case default returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->oid);
|
|
|
|
}
|
|
|
|
break;
|
2009-06-30 08:07:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->description = preg_replace("/^\'/", '', $this->description);
|
|
|
|
$this->description = preg_replace("/\'$/", '', $this->description);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
|
|
|
debug_log('%s::__construct(): Returning () - NAME (%s), DESCRIPTION (%s), MUST (%s), MAY (%s)',9,
|
2009-06-30 10:26:08 +00:00
|
|
|
get_class($this),$this->name,$this->description,$this->must_attrs,$this->may_attrs);
|
2009-06-30 08:07:14 +00:00
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets an array of AttributeType objects that entries of this ObjectClass must define.
|
|
|
|
* This differs from getMustAttrNames in that it returns an array of AttributeType objects
|
|
|
|
*
|
|
|
|
* @param array $oclasses An array of ObjectClass objects to use when traversing
|
|
|
|
* the inheritance tree. This presents some what of a bootstrapping problem
|
|
|
|
* as we must fetch all objectClasses to determine through inheritance which
|
|
|
|
* attributes this objectClass requires.
|
|
|
|
* @return array The array of required AttributeType objects.
|
|
|
|
*
|
|
|
|
* @see getMustAttrNames
|
|
|
|
* @see getMayAttrs
|
|
|
|
* @see getMayAttrNames
|
|
|
|
*/
|
|
|
|
function getMustAttrs($oclasses = NULL) {
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::getMustAttrs(): Entered with (%s)',9,get_class($this),$oclasses);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
$all_must_attrs = array();
|
|
|
|
$all_must_attrs = $this->must_attrs;
|
2009-06-30 10:26:08 +00:00
|
|
|
foreach ($this->sup_classes as $sup_class) {
|
|
|
|
if (! is_null($oclasses) && $sup_class != 'top'
|
|
|
|
&& isset($oclasses[strtolower($sup_class)])) {
|
|
|
|
$sup_class = $oclasses[ strtolower($sup_class)];
|
|
|
|
$sup_class_must_attrs = $sup_class->getMustAttrs($oclasses);
|
|
|
|
$all_must_attrs = array_merge($sup_class_must_attrs,$all_must_attrs);
|
2009-06-30 08:09:20 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-06-30 10:26:08 +00:00
|
|
|
masort($all_must_attrs,'name,source',1);
|
|
|
|
|
|
|
|
# Remove any duplicates
|
|
|
|
foreach ($all_must_attrs as $index => $attr)
|
|
|
|
if (isset($allattr[$attr->name]))
|
|
|
|
unset($all_must_attrs[$index]);
|
|
|
|
else
|
|
|
|
$allattr[$attr->name] = 1;
|
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
return $all_must_attrs;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets an array of AttributeType objects that entries of this ObjectClass may define.
|
|
|
|
* This differs from getMayAttrNames in that it returns an array of AttributeType objects
|
|
|
|
*
|
|
|
|
* @param array $oclasses An array of ObjectClass objects to use when traversing
|
|
|
|
* the inheritance tree. This presents some what of a bootstrapping problem
|
|
|
|
* as we must fetch all objectClasses to determine through inheritance which
|
|
|
|
* attributes this objectClass provides.
|
|
|
|
* @return array The array of allowed AttributeType objects.
|
|
|
|
*
|
|
|
|
* @see getMustAttrNames
|
|
|
|
* @see getMustAttrs
|
|
|
|
* @see getMayAttrNames
|
|
|
|
* @see AttributeType
|
|
|
|
*/
|
2009-06-30 10:26:08 +00:00
|
|
|
function getMayAttrs($oclasses=null) {
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::getMayAttrs(): Entered with (%s)',9,get_class($this),$oclasses);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
$all_may_attrs = array();
|
|
|
|
$all_may_attrs = $this->may_attrs;
|
2009-06-30 10:26:08 +00:00
|
|
|
foreach ($this->sup_classes as $sup_class_name) {
|
|
|
|
if (! is_null($oclasses) && $sup_class_name != 'top'
|
|
|
|
&& isset($oclasses[strtolower($sup_class_name)])) {
|
|
|
|
|
|
|
|
$sup_class = $oclasses[strtolower($sup_class_name)];
|
|
|
|
$sup_class_may_attrs = $sup_class->getMayAttrs($oclasses);
|
|
|
|
$all_may_attrs = array_merge($sup_class_may_attrs,$all_may_attrs);
|
2009-06-30 09:29:51 +00:00
|
|
|
}
|
2009-06-30 08:09:20 +00:00
|
|
|
}
|
|
|
|
|
2009-06-30 10:26:08 +00:00
|
|
|
masort($all_may_attrs,'name,source',1);
|
|
|
|
|
|
|
|
# Remove any duplicates
|
|
|
|
foreach ($all_may_attrs as $index => $attr)
|
|
|
|
if (isset($allattr[$attr->name]))
|
|
|
|
unset($all_may_attrs[$index]);
|
|
|
|
else
|
|
|
|
$allattr[$attr->name] = 1;
|
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
return $all_may_attrs;
|
2009-06-30 08:07:14 +00:00
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets an array of attribute names (strings) that entries of this ObjectClass must define.
|
|
|
|
* This differs from getMustAttrs in that it returns an array of strings rather than
|
|
|
|
* array of AttributeType objects
|
|
|
|
*
|
|
|
|
* @param array $oclasses An array of ObjectClass objects to use when traversing
|
|
|
|
* the inheritance tree. This presents some what of a bootstrapping problem
|
|
|
|
* as we must fetch all objectClasses to determine through inheritance which
|
|
|
|
* attributes this objectClass provides.
|
|
|
|
* @return array The array of allowed attribute names (strings).
|
|
|
|
*
|
|
|
|
* @see getMustAttrs
|
|
|
|
* @see getMayAttrs
|
|
|
|
* @see getMayAttrNames
|
|
|
|
*/
|
|
|
|
function getMustAttrNames( $oclasses = null ) {
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::getMustAttrNames(): Entered with (%s)',9,get_class($this),$oclasses);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
$attrs = $this->getMustAttrs( $oclasses );
|
|
|
|
$attr_names = array();
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
foreach( $attrs as $attr )
|
|
|
|
$attr_names[] = $attr->getName();
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
return $attr_names;
|
2009-06-30 08:07:14 +00:00
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets an array of attribute names (strings) that entries of this ObjectClass must define.
|
|
|
|
* This differs from getMayAttrs in that it returns an array of strings rather than
|
|
|
|
* array of AttributeType objects
|
|
|
|
*
|
|
|
|
* @param array $oclasses An array of ObjectClass objects to use when traversing
|
|
|
|
* the inheritance tree. This presents some what of a bootstrapping problem
|
|
|
|
* as we must fetch all objectClasses to determine through inheritance which
|
|
|
|
* attributes this objectClass provides.
|
|
|
|
* @return array The array of allowed attribute names (strings).
|
|
|
|
*
|
|
|
|
* @see getMustAttrs
|
|
|
|
* @see getMayAttrs
|
|
|
|
* @see getMustAttrNames
|
|
|
|
*/
|
|
|
|
function getMayAttrNames( $oclasses = null ) {
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::getMayAttrNames(): Entered with (%s)',9,get_class($this),$oclasses);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
$attrs = $this->getMayAttrs( $oclasses );
|
|
|
|
$attr_names = array();
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
foreach( $attrs as $attr )
|
|
|
|
$attr_names[] = $attr->getName();
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
return $attr_names;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Adds an objectClass to the list of objectClasses that inherit
|
|
|
|
* from this objectClass.
|
|
|
|
* @param String $object_class_name The name of the objectClass to add
|
|
|
|
* @return bool Returns true on success or false on failure (objectclass already existed for example)
|
|
|
|
*/
|
|
|
|
function addChildObjectClass( $object_class_name ) {
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::addChildObjectClass(): Entered with (%s)',9,get_class($this),$object_class_name);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
|
|
|
$object_class_name = trim( $object_class_name );
|
|
|
|
if( ! is_array( $this->children_objectclasses ) )
|
|
|
|
$this->children_objectclasses = array();
|
|
|
|
|
|
|
|
foreach( $this->children_objectclasses as $existing_objectclass )
|
|
|
|
if( 0 == strcasecmp( $object_class_name, $existing_objectclass ) )
|
|
|
|
return false;
|
|
|
|
|
|
|
|
$this->children_objectclasses[] = $object_class_name;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the array of objectClass names which inherit from this objectClass.
|
|
|
|
* @return Array Names of objectClasses which inherit from this objectClass.
|
|
|
|
*/
|
|
|
|
function getChildObjectClasses() {
|
|
|
|
return $this->children_objectclasses;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the name of this objectClass (ie, "inetOrgPerson")
|
|
|
|
* @return string The name of the objectClass
|
|
|
|
*/
|
|
|
|
function getName() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->name;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets the objectClass names from which this objectClass inherits.
|
|
|
|
*
|
|
|
|
* @return array An array of objectClass names (strings)
|
|
|
|
*/
|
|
|
|
function getSupClasses() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->sup_classes;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets the type of this objectClass: STRUCTURAL, ABSTRACT, or AUXILIARY.
|
|
|
|
*/
|
|
|
|
function getType() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->type;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets whether this objectClass is flagged as obsolete by the LDAP server.
|
|
|
|
*/
|
|
|
|
function getIsObsolete() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->is_obsolete;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/**
|
2009-06-30 09:29:51 +00:00
|
|
|
* Adds the specified array of attributes to this objectClass' list of
|
2009-06-30 08:07:14 +00:00
|
|
|
* MUST attributes. The resulting array of must attributes will contain
|
|
|
|
* unique members.
|
2009-06-30 09:29:51 +00:00
|
|
|
*
|
|
|
|
* @param array $new_must_attrs An array of attribute names (strings) to add.
|
2009-06-30 08:07:14 +00:00
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
function addMustAttrs( $new_must_attrs ) {
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::addMustAttrs(): Entered with (%s)',9,get_class($this),$new_must_attrs);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
if( ! is_array( $new_must_attrs ) )
|
|
|
|
return;
|
|
|
|
if( 0 == count( $new_must_attrs ) )
|
|
|
|
return;
|
|
|
|
$this->must_attrs = array_values( array_unique( array_merge( $this->must_attrs, $new_must_attrs ) ) );
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/**
|
2009-06-30 08:07:14 +00:00
|
|
|
* Behaves identically to addMustAttrs, but it operates on the MAY
|
|
|
|
* attributes of this objectClass.
|
2009-06-30 09:29:51 +00:00
|
|
|
*
|
|
|
|
* @param array $new_may_attrs An array of attribute names (strings) to add.
|
2009-06-30 08:07:14 +00:00
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
function addMayAttrs( $new_may_attrs ) {
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::addMayAttrs(): Entered with (%s)',9,get_class($this),$new_may_attrs);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
if( ! is_array( $new_may_attrs ) )
|
|
|
|
return;
|
|
|
|
if( 0 == count( $new_may_attrs ) )
|
|
|
|
return;
|
|
|
|
$this->may_attrs = array_values( array_unique( array_merge( $this->may_attrs, $new_may_attrs ) ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* A simple class for representing AttributeTypes used only by the ObjectClass class.
|
|
|
|
* Users should never instantiate this class. It represents an attribute internal to
|
|
|
|
* an ObjectClass. If PHP supported inner-classes and variable permissions, this would
|
|
|
|
* be interior to class ObjectClass and flagged private. The reason this class is used
|
|
|
|
* and not the "real" class AttributeType is because this class supports the notion of
|
|
|
|
* a "source" objectClass, meaning that it keeps track of which objectClass originally
|
|
|
|
* specified it. This class is therefore used by the class ObjectClass to determine
|
|
|
|
* inheritance.
|
|
|
|
* @package phpLDAPadmin
|
|
|
|
*/
|
|
|
|
class ObjectClassAttribute {
|
2009-06-30 09:22:30 +00:00
|
|
|
/** This Attribute's name */
|
|
|
|
var $name;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/** This Attribute's root */
|
|
|
|
var $source;
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Creates a new ObjectClassAttribute with specified name and source objectClass.
|
|
|
|
* @param string $name the name of the new attribute.
|
|
|
|
* @param string $source the name of the ObjectClass which
|
|
|
|
* specifies this attribute.
|
|
|
|
*/
|
2009-06-30 10:26:08 +00:00
|
|
|
function ObjectClassAttribute($name,$source) {
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
|
|
|
debug_log('%s::__construct(): Entered with name (%s), source (%s)',9,get_class($this),$name,$source);
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->name = $name;
|
|
|
|
$this->source = $source;
|
2009-06-30 09:22:30 +00:00
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/** Gets this attribute's name */
|
|
|
|
function getName () {
|
|
|
|
return $this->name;
|
2009-06-30 09:22:30 +00:00
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/** Gets the name of the ObjectClass which originally specified this attribute. */
|
|
|
|
function getSource () {
|
|
|
|
return $this->source;
|
2009-06-30 09:22:30 +00:00
|
|
|
}
|
2009-06-30 09:29:51 +00:00
|
|
|
}
|
2009-06-30 09:22:30 +00:00
|
|
|
|
|
|
|
/**
|
2009-06-30 09:29:51 +00:00
|
|
|
* Represents an LDAP AttributeType
|
|
|
|
* @package phpLDAPadmin
|
2009-06-30 08:07:14 +00:00
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
class AttributeType extends SchemaItem {
|
2009-06-30 09:22:30 +00:00
|
|
|
/** The name of this attributeType */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $name;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** string: the description */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $is_obsolete;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** The attribute from which this attribute inherits (if any) */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $sup_attribute;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** The equality rule used */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $equality;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** The ordering of the attributeType */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $ordering;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** Boolean: supports substring matching? */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $sub_str;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** The full syntax string, ie 1.2.3.4{16} */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $syntax;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** boolean: is single valued only? */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $is_single_value;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** boolean: is collective? */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $is_collective;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** boolean: can use modify? */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $is_no_user_modification;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** The usage string set by the LDAP schema */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $usage;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** An array of alias attribute names, strings */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $aliases;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** The max number of characters this attribute can be */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $max_length;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** A string description of the syntax type (taken from the LDAPSyntaxes) */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $type;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** An array of objectClasses which use this attributeType (must be set by caller) */
|
2009-06-30 08:07:14 +00:00
|
|
|
var $used_in_object_classes;
|
2009-06-30 09:29:51 +00:00
|
|
|
/** A list of object class names that require this attribute type. */
|
2009-06-30 09:40:37 +00:00
|
|
|
var $required_by_object_classes;
|
2009-06-30 08:07:14 +00:00
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Initialize the class' member variables
|
2009-06-30 08:07:14 +00:00
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
function initVars() {
|
|
|
|
parent::initVars();
|
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->oid = null;
|
|
|
|
$this->name = null;
|
|
|
|
$this->description = null;
|
|
|
|
$this->is_obsolete = false;
|
|
|
|
$this->sup_attribute = null;
|
|
|
|
$this->equality = null;
|
|
|
|
$this->ordering = null;
|
|
|
|
$this->sub_str = null;
|
|
|
|
$this->syntax_oid = null;
|
|
|
|
$this->syntax = null;
|
|
|
|
$this->max_length = null;
|
2009-06-30 08:09:20 +00:00
|
|
|
$this->is_single_value= null;
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->is_collective = false;
|
|
|
|
$this->is_no_user_modification = false;
|
|
|
|
$this->usage = null;
|
|
|
|
$this->aliases = array();
|
|
|
|
$this->type = null;
|
|
|
|
$this->used_in_object_classes = array();
|
2009-06-30 09:22:30 +00:00
|
|
|
$this->required_by_object_classes = array();
|
2009-06-30 08:07:14 +00:00
|
|
|
}
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/**
|
|
|
|
* Creates a new AttributeType objcet from a raw LDAP AttributeType string.
|
2009-06-30 08:07:14 +00:00
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
function AttributeType( $raw_ldap_attr_string ) {
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::__construct(): Entered with (%s)',9,get_class($this),$raw_ldap_attr_string);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->initVars();
|
|
|
|
$attr = $raw_ldap_attr_string;
|
2009-06-30 10:26:08 +00:00
|
|
|
$strings = preg_split('/[\s,]+/',$attr,-1,PREG_SPLIT_DELIM_CAPTURE);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
for($i=0; $i<count($strings); $i++) {
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
switch($strings[$i]) {
|
|
|
|
case '(':
|
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'NAME':
|
2009-06-30 10:26:08 +00:00
|
|
|
if ($strings[$i+1]!='(') {
|
2009-06-30 08:07:14 +00:00
|
|
|
do {
|
|
|
|
$i++;
|
2009-06-30 09:29:51 +00:00
|
|
|
if (strlen($this->name)==0)
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->name = $strings[$i];
|
|
|
|
else
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->name .= ' ' . $strings[$i];
|
2009-06-30 09:29:51 +00:00
|
|
|
|
|
|
|
} while (!preg_match("/\'$/s", $strings[$i]));
|
2009-06-30 08:07:14 +00:00
|
|
|
// this attribute has no aliases
|
|
|
|
$this->aliases = array();
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
} else {
|
|
|
|
$i++;
|
|
|
|
do {
|
|
|
|
$i++;
|
2009-06-30 09:29:51 +00:00
|
|
|
if (strlen($this->name) == 0)
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->name = $strings[$i];
|
|
|
|
else
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->name .= ' ' . $strings[$i];
|
2009-06-30 09:29:51 +00:00
|
|
|
|
|
|
|
} while (!preg_match("/\'$/s", $strings[$i]));
|
2009-06-30 08:07:14 +00:00
|
|
|
// add alias names for this attribute
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 10:26:08 +00:00
|
|
|
while ($strings[++$i]!=')') {
|
2009-06-30 08:07:14 +00:00
|
|
|
$alias = $strings[$i];
|
2009-06-30 10:26:08 +00:00
|
|
|
$alias = preg_replace("/^\'/", '', $alias );
|
|
|
|
$alias = preg_replace("/\'$/", '', $alias );
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->aliases[] = $alias;
|
|
|
|
}
|
|
|
|
}
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::AttributeType(): Case NAME returned (%s) (%s)',8,
|
|
|
|
get_class($this),$this->name,$this->aliases);
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'DESC':
|
|
|
|
do {
|
|
|
|
$i++;
|
2009-06-30 09:29:51 +00:00
|
|
|
if (strlen($this->description)==0)
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->description=$this->description . $strings[$i];
|
|
|
|
else
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->description=$this->description . ' ' . $strings[$i];
|
2009-06-30 09:29:51 +00:00
|
|
|
} while (!preg_match("/\'$/s", $strings[$i]));
|
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::AttributeType(): Case DESC returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->description);
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'OBSOLETE':
|
|
|
|
$this->is_obsolete = TRUE;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::AttributeType(): Case OBSOLETE returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->is_obsolete);
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'SUP':
|
|
|
|
$i++;
|
|
|
|
$this->sup_attribute = $strings[$i];
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::AttributeType(): Case SUP returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->sup_attribute);
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'EQUALITY':
|
|
|
|
$i++;
|
|
|
|
$this->equality = $strings[$i];
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::AttributeType(): Case EQUALITY returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->equality);
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'ORDERING':
|
|
|
|
$i++;
|
|
|
|
$this->ordering = $strings[$i];
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::AttributeType(): Case ORDERING returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->ordering);
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'SUBSTR':
|
|
|
|
$i++;
|
|
|
|
$this->sub_str = $strings[$i];
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::AttributeType(): Case SUBSTR returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->sub_str);
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'SYNTAX':
|
|
|
|
$i++;
|
|
|
|
$this->syntax = $strings[$i];
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->syntax_oid = preg_replace('/{\d+}$/', '', $this->syntax);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
// does this SYNTAX string specify a max length (ie, 1.2.3.4{16})
|
2009-06-30 10:26:08 +00:00
|
|
|
if (preg_match( '/{(\d+)}$/', $this->syntax, $this->max_length))
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->max_length = $this->max_length[1];
|
2009-06-30 09:29:51 +00:00
|
|
|
else
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->max_length = null;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 10:26:08 +00:00
|
|
|
if ($i < count($strings) - 1 && $strings[$i+1]=='{') {
|
2009-06-30 08:07:14 +00:00
|
|
|
do {
|
|
|
|
$i++;
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->name .= ' ' . $strings[$i];
|
|
|
|
} while ($strings[$i]!='}');
|
2009-06-30 08:07:14 +00:00
|
|
|
}
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::AttributeType(): Case SYNTAX returned (%s) (%s) (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->syntax,$this->syntax_oid,$this->max_length);
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'SINGLE-VALUE':
|
|
|
|
$this->is_single_value = TRUE;
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::AttributeType(): Case SINGLE-VALUE returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->is_single_value);
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'COLLECTIVE':
|
|
|
|
$this->is_collective = TRUE;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::AttributeType(): Case COLLECTIVE returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->is_collective);
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'NO-USER-MODIFICATION':
|
|
|
|
$this->is_no_user_modification = TRUE;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::AttributeType(): Case NO-USER-MODIFICATION returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->is_no_user_modification);
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
case 'USAGE':
|
|
|
|
$i++;
|
|
|
|
$this->usage = $strings[$i];
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::AttributeType(): Case USAGE returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->usage);
|
2009-06-30 08:07:14 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
default:
|
2009-06-30 10:26:08 +00:00
|
|
|
if(preg_match ('/[\d\.]+/i',$strings[$i]) && $i == 1) {
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->oid = $strings[$i];
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::AttributeType(): Case default returned (%s)',8,
|
2009-06-30 09:40:37 +00:00
|
|
|
get_class($this),$this->oid);
|
|
|
|
}
|
2009-06-30 08:07:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->name = preg_replace("/^\'/", '', $this->name);
|
|
|
|
$this->name = preg_replace("/\'$/", '', $this->name);
|
|
|
|
$this->description = preg_replace("/^\'/", '', $this->description);
|
|
|
|
$this->description = preg_replace("/\'$/", '', $this->description);
|
|
|
|
$this->syntax = preg_replace("/^\'/", '', $this->syntax );
|
|
|
|
$this->syntax = preg_replace("/\'$/", '', $this->syntax );
|
|
|
|
$this->syntax_oid = preg_replace("/^\'/", '', $this->syntax_oid );
|
|
|
|
$this->syntax_oid = preg_replace("/\'$/", '', $this->syntax_oid );
|
|
|
|
$this->sup_attribute = preg_replace("/^\'/", '', $this->sup_attribute );
|
|
|
|
$this->sup_attribute = preg_replace("/\'$/", '', $this->sup_attribute );
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::AttributeType(): Returning ()',9,get_class($this));
|
2009-06-30 08:07:14 +00:00
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets this attribute's name
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
function getName() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->name;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets whether this attribute has been flagged as obsolete by the LDAP server
|
|
|
|
* @return bool
|
|
|
|
*/
|
|
|
|
function getIsObsolete() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->is_obsolete;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets this attribute's usage string as defined by the LDAP server
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
function getUsage() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->usage;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets this attribute's parent attribute (if any). If this attribute does not
|
|
|
|
* inherit from another attribute, null is returned.
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
function getSupAttribute() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->sup_attribute;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets this attribute's equality string
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
function getEquality() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->equality;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets this attribute's ordering specification.
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
function getOrdering() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->ordering;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets this attribute's substring matching specification
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
function getSubstr() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->sub_str;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets the names of attributes that are an alias for this attribute (if any).
|
|
|
|
* @return array An array of names of attributes which alias this attribute or
|
|
|
|
* an empty array if no attribute aliases this object.
|
|
|
|
*/
|
|
|
|
function getAliases() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->aliases;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Returns whether the specified attribute is an alias for this one (based on this attribute's alias list).
|
|
|
|
* @param string $attr_name The name of the attribute to check.
|
|
|
|
* @return bool True if the specified attribute is an alias for this one, or false otherwise.
|
|
|
|
*/
|
|
|
|
function isAliasFor( $attr_name ) {
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::isAliasFor(): Entered with (%s)',9,get_class($this),$attr_name);
|
2009-06-30 09:22:30 +00:00
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
foreach( $this->aliases as $alias_attr_name )
|
|
|
|
if( 0 == strcasecmp( $alias_attr_name, $attr_name ) )
|
|
|
|
return true;
|
|
|
|
return false;
|
|
|
|
}
|
2009-06-30 09:22:30 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets this attribute's raw syntax string (ie: "1.2.3.4{16}").
|
2009-06-30 09:29:51 +00:00
|
|
|
* @return string The raw syntax string
|
2009-06-30 08:07:14 +00:00
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
function getSyntaxString() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->syntax;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/**
|
2009-06-30 09:29:51 +00:00
|
|
|
* Gets this attribute's syntax OID. Differs from getSyntaxString() in that this
|
|
|
|
* function only returns the actual OID with any length specification removed.
|
|
|
|
* Ie, if the syntax string is "1.2.3.4{16}", this function only retruns
|
|
|
|
* "1.2.3.4".
|
|
|
|
* @return string The syntax OID string.
|
2009-06-30 08:07:14 +00:00
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
function getSyntaxOID() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->syntax_oid;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/**
|
|
|
|
* Gets this attribute's the maximum length. If no maximum is defined by the LDAP server, null is returned.
|
2009-06-30 09:29:51 +00:00
|
|
|
* @return int The maximum length (in characters) of this attribute or null if no maximum is specified.
|
2009-06-30 08:07:14 +00:00
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
function getMaxLength() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->max_length;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/**
|
|
|
|
* Gets whether this attribute is single-valued. If this attribute only supports single values, true
|
2009-06-30 09:29:51 +00:00
|
|
|
* is returned. If this attribute supports multiple values, false is returned.
|
|
|
|
* @return bool Returns true if this attribute is single-valued or false otherwise.
|
2009-06-30 09:22:30 +00:00
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
function getIsSingleValue() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->is_single_value;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Sets whether this attribute is single-valued.
|
|
|
|
* @param bool $is_single_value
|
|
|
|
*/
|
|
|
|
function setIsSingleValue( $is_single_value ) {
|
2009-06-30 08:09:20 +00:00
|
|
|
$this->is_single_value = $is_single_value;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets whether this attribute is collective.
|
|
|
|
* @return bool Returns true if this attribute is collective and false otherwise.
|
|
|
|
*/
|
|
|
|
function getIsCollective() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->is_collective;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets whether this attribute is not modifiable by users.
|
|
|
|
* @return bool Returns true if this attribute is not modifiable by users.
|
|
|
|
*/
|
|
|
|
function getIsNoUserModification() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->is_no_user_modification;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets this attribute's type
|
|
|
|
* @return string The attribute's type.
|
|
|
|
*/
|
|
|
|
function getType() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->type;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/**
|
|
|
|
* Removes an attribute name from this attribute's alias array.
|
2009-06-30 09:29:51 +00:00
|
|
|
* @param string $remove_alias_name The name of the attribute to remove.
|
|
|
|
* @return bool true on success or false on failure (ie, if the specified
|
|
|
|
* attribute name is not found in this attribute's list of aliases)
|
2009-06-30 08:07:14 +00:00
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
function removeAlias( $remove_alias_name ) {
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::removeAlias(): Entered with (%s)',9,get_class($this),$remove_alias_name);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
foreach( $this->aliases as $i => $alias_name ) {
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
if( 0 == strcasecmp( $alias_name, $remove_alias_name ) ) {
|
|
|
|
unset( $this->aliases[ $i ] );
|
|
|
|
$this->aliases = array_values( $this->aliases );
|
|
|
|
return true;
|
|
|
|
}
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:07:14 +00:00
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/**
|
2009-06-30 08:07:14 +00:00
|
|
|
* Adds an attribute name to the alias array.
|
2009-06-30 09:29:51 +00:00
|
|
|
* @param string $new_alias_name The name of a new attribute to add to this attribute's list of aliases.
|
2009-06-30 08:07:14 +00:00
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
function addAlias( $new_alias_name ) {
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->aliases[] = $new_alias_name;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Sets this attriute's name.
|
|
|
|
* @param string $new_name The new name to give this attribute.
|
|
|
|
*/
|
|
|
|
function setName( $new_name ) {
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->name = $new_name;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Sets this attriute's SUP attribute (ie, the attribute from which this attribute inherits).
|
|
|
|
* @param string $new_sup_attr The name of the new parent (SUP) attribute
|
|
|
|
*/
|
|
|
|
function setSupAttribute( $new_sup_attr ) {
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->sup_attribute = $new_sup_attr;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Sets this attribute's list of aliases.
|
|
|
|
* @param array $new_aliases The array of alias names (strings)
|
|
|
|
*/
|
|
|
|
function setAliases( $new_aliases ) {
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->aliases = $new_aliases;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Sets this attribute's type.
|
|
|
|
* @param string $new_type The new type.
|
|
|
|
*/
|
|
|
|
function setType( $new_type ) {
|
2009-06-30 08:07:14 +00:00
|
|
|
$this->type = $new_type;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Adds an objectClass name to this attribute's list of "used in" objectClasses,
|
|
|
|
* that is the list of objectClasses which provide this attribute.
|
|
|
|
* @param string $object_class_name The name of the objectClass to add.
|
|
|
|
*/
|
|
|
|
function addUsedInObjectClass( $object_class_name ) {
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::addUsedInObjectClass(): Entered with (%s)',9,get_class($this),$object_class_name);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
foreach( $this->used_in_object_classes as $used_in_object_class )
|
|
|
|
if( 0 == strcasecmp( $used_in_object_class, $object_class_name ) )
|
|
|
|
return false;
|
|
|
|
$this->used_in_object_classes[] = $object_class_name;
|
|
|
|
return true;
|
2009-06-30 08:07:14 +00:00
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets the list of "used in" objectClasses, that is the list of objectClasses
|
|
|
|
* which provide this attribute.
|
|
|
|
* @return array An array of names of objectclasses (strings) which provide this attribute
|
|
|
|
*/
|
|
|
|
function getUsedInObjectClasses() {
|
2009-06-30 08:07:14 +00:00
|
|
|
return $this->used_in_object_classes;
|
|
|
|
}
|
2009-06-30 09:22:30 +00:00
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Adds an objectClass name to this attribute's list of "required by" objectClasses,
|
|
|
|
* that is the list of objectClasses which must have this attribute.
|
|
|
|
* @param string $object_class_name The name of the objectClass to add.
|
|
|
|
*/
|
|
|
|
function addRequiredByObjectClass( $object_class_name ) {
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::addRequiredByObjectClass(): Entered with (%s)',9,get_class($this),$object_class_name);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
foreach( $this->required_by_object_classes as $required_by_object_class )
|
|
|
|
if( 0 == strcasecmp( $required_by_object_class, $object_class_name ) )
|
|
|
|
return false;
|
|
|
|
$this->required_by_object_classes[] = $object_class_name;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets the list of "required by" objectClasses, that is the list of objectClasses
|
|
|
|
* which provide must have attribute.
|
|
|
|
* @return array An array of names of objectclasses (strings) which provide this attribute
|
|
|
|
*/
|
|
|
|
function getRequiredByObjectClasses() {
|
2009-06-30 09:22:30 +00:00
|
|
|
return $this->required_by_object_classes;
|
|
|
|
}
|
2009-06-30 08:07:14 +00:00
|
|
|
}
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/**
|
2009-06-30 08:09:20 +00:00
|
|
|
* Represents an LDAP Syntax
|
2009-06-30 09:29:51 +00:00
|
|
|
* @package phpLDAPadmin
|
2009-06-30 08:09:20 +00:00
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
class Syntax extends SchemaItem {
|
2009-06-30 09:22:30 +00:00
|
|
|
/** Initializes the class' member variables */
|
2009-06-30 09:40:37 +00:00
|
|
|
function initVars() {
|
2009-06-30 09:29:51 +00:00
|
|
|
parent::initVars();
|
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
$this->oid = null;
|
|
|
|
$this->description = null;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/**
|
|
|
|
* Creates a new Syntax object from a raw LDAP syntax string.
|
2009-06-30 08:09:20 +00:00
|
|
|
*/
|
2009-06-30 09:40:37 +00:00
|
|
|
function Syntax ( $raw_ldap_syntax_string ) {
|
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::__construct(): Entered with (%s)',9,get_class($this),$raw_ldap_syntax_string);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
$this->initVars();
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
$class = $raw_ldap_syntax_string;
|
2009-06-30 10:26:08 +00:00
|
|
|
$strings = preg_split ('/[\s,]+/', $class, -1,PREG_SPLIT_DELIM_CAPTURE);
|
2009-06-30 08:09:20 +00:00
|
|
|
for($i=0; $i<count($strings); $i++) {
|
|
|
|
switch($strings[$i]) {
|
|
|
|
case '(':
|
|
|
|
break;
|
|
|
|
case 'DESC':
|
|
|
|
do {
|
|
|
|
$i++;
|
|
|
|
if(strlen($this->description)==0)
|
|
|
|
$this->description=$this->description . $strings[$i];
|
|
|
|
else
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->description=$this->description . ' ' . $strings[$i];
|
2009-06-30 08:09:20 +00:00
|
|
|
}while(!preg_match("/\'$/s", $strings[$i]));
|
|
|
|
break;
|
|
|
|
default:
|
2009-06-30 10:26:08 +00:00
|
|
|
if(preg_match ('/[\d\.]+/i',$strings[$i]) && $i == 1)
|
2009-06-30 08:09:20 +00:00
|
|
|
$this->oid = $strings[$i];
|
|
|
|
}
|
|
|
|
}
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->description = preg_replace("/^\'/", '', $this->description);
|
|
|
|
$this->description = preg_replace("/\'$/", '', $this->description);
|
2009-06-30 08:09:20 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/**
|
2009-06-30 08:09:20 +00:00
|
|
|
* Represents an LDAP MatchingRule
|
2009-06-30 09:29:51 +00:00
|
|
|
* @package phpLDAPadmin
|
2009-06-30 08:09:20 +00:00
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
class MatchingRule extends SchemaItem {
|
2009-06-30 09:22:30 +00:00
|
|
|
/** This rule's name */
|
2009-06-30 08:09:20 +00:00
|
|
|
var $name;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** This rule's syntax OID */
|
2009-06-30 08:09:20 +00:00
|
|
|
var $syntax;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** Boolean value indicating whether this MatchingRule is obsolete */
|
2009-06-30 08:09:20 +00:00
|
|
|
var $is_obsolete;
|
2009-06-30 09:22:30 +00:00
|
|
|
/** An array of attribute names who use this MatchingRule */
|
2009-06-30 08:09:20 +00:00
|
|
|
var $used_by_attrs;
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/** Initialize the class' member variables */
|
2009-06-30 09:29:51 +00:00
|
|
|
function initVars() {
|
|
|
|
parent::initVars();
|
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
$this->oid = null;
|
|
|
|
$this->name = null;
|
|
|
|
$this->description = null;
|
|
|
|
$this->is_obsolete = false;
|
|
|
|
$this->syntax = null;
|
|
|
|
$this->used_by_attrs = array();
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/**
|
|
|
|
* Creates a new MatchingRule object from a raw LDAP MatchingRule string.
|
2009-06-30 08:09:20 +00:00
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
function MatchingRule( $raw_ldap_matching_rule_string ) {
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::__construct(): Entered with (%s)',9,get_class($this),$raw_ldap_matching_rule_string);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
$this->initVars();
|
2009-06-30 10:26:08 +00:00
|
|
|
$strings = preg_split ('/[\s,]+/', $raw_ldap_matching_rule_string, -1,PREG_SPLIT_DELIM_CAPTURE);
|
2009-06-30 08:09:20 +00:00
|
|
|
for($i=0; $i<count($strings); $i++) {
|
|
|
|
switch($strings[$i]) {
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
case '(':
|
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
case 'NAME':
|
2009-06-30 10:26:08 +00:00
|
|
|
if($strings[$i+1]!='(') {
|
2009-06-30 08:09:20 +00:00
|
|
|
do {
|
|
|
|
$i++;
|
|
|
|
if(strlen($this->name)==0)
|
|
|
|
$this->name = $strings[$i];
|
|
|
|
else
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->name .= ' ' . $strings[$i];
|
2009-06-30 08:09:20 +00:00
|
|
|
}while(!preg_match("/\'$/s", $strings[$i]));
|
|
|
|
} else {
|
|
|
|
$i++;
|
|
|
|
do {
|
|
|
|
$i++;
|
|
|
|
if(strlen($this->name) == 0)
|
|
|
|
$this->name = $strings[$i];
|
|
|
|
else
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->name .= ' ' . $strings[$i];
|
2009-06-30 08:09:20 +00:00
|
|
|
} while(!preg_match("/\'$/s", $strings[$i]));
|
|
|
|
do {
|
|
|
|
$i++;
|
2009-06-30 09:29:51 +00:00
|
|
|
} while (! preg_match('/\)+\)?/',$strings[$i]));
|
2009-06-30 08:09:20 +00:00
|
|
|
}
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->name = preg_replace("/^\'/", '', $this->name);
|
|
|
|
$this->name = preg_replace("/\'$/", '', $this->name);
|
2009-06-30 08:09:20 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
case 'DESC':
|
|
|
|
do {
|
|
|
|
$i++;
|
|
|
|
if(strlen($this->description)==0)
|
|
|
|
$this->description=$this->description . $strings[$i];
|
|
|
|
else
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->description=$this->description . ' ' . $strings[$i];
|
2009-06-30 08:09:20 +00:00
|
|
|
}while(!preg_match("/\'$/s", $strings[$i]));
|
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
case 'OBSOLETE':
|
|
|
|
$this->is_obsolete = TRUE;
|
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
case 'SYNTAX':
|
|
|
|
$this->syntax = $strings[++$i];
|
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
default:
|
2009-06-30 10:26:08 +00:00
|
|
|
if(preg_match ('/[\d\.]+/i',$strings[$i]) && $i == 1)
|
2009-06-30 08:09:20 +00:00
|
|
|
$this->oid = $strings[$i];
|
|
|
|
}
|
|
|
|
}
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->description = preg_replace("/^\'/", '', $this->description);
|
|
|
|
$this->description = preg_replace("/\'$/", '', $this->description);
|
2009-06-30 08:09:20 +00:00
|
|
|
}
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/**
|
2009-06-30 08:09:20 +00:00
|
|
|
* Sets the list of used_by_attrs to the array specified by $attrs;
|
2009-06-30 09:29:51 +00:00
|
|
|
* @param array $attrs The array of attribute names (strings) which use this MatchingRule
|
2009-06-30 08:09:20 +00:00
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
function setUsedByAttrs( $attrs ) {
|
2009-06-30 08:09:20 +00:00
|
|
|
$this->used_by_attrs = $attrs;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/**
|
2009-06-30 08:09:20 +00:00
|
|
|
* Adds an attribute name to the list of attributes who use this MatchingRule
|
|
|
|
* @return true if the attribute was added and false otherwise (already in the list)
|
|
|
|
*/
|
2009-06-30 09:29:51 +00:00
|
|
|
function addUsedByAttr( $new_attr_name ) {
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::addUsedByAttr(): Entered with (%s)',9,get_class($this),$new_attr_name);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
foreach( $this->used_by_attrs as $attr_name )
|
|
|
|
if( 0 == strcasecmp( $attr_name, $new_attr_name ) )
|
|
|
|
return false;
|
|
|
|
$this->used_by_attrs[] = $new_attr_name;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets this MatchingRule's name.
|
|
|
|
* @return string The name.
|
|
|
|
*/
|
|
|
|
function getName() {
|
2009-06-30 08:09:20 +00:00
|
|
|
return $this->name;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets whether this MatchingRule is flagged as obsolete by the LDAP server.
|
|
|
|
* @return bool True if this MatchingRule is obsolete and false otherwise.
|
|
|
|
*/
|
|
|
|
function getIsObsolete() {
|
2009-06-30 08:09:20 +00:00
|
|
|
return $this->is_obsolete;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets this MatchingRule's syntax string (an OID).
|
|
|
|
*/
|
|
|
|
function getSyntax() {
|
2009-06-30 08:09:20 +00:00
|
|
|
return $this->description;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets an array of attribute names (strings) which use this MatchingRule
|
|
|
|
* @return array The array of attribute names (strings).
|
|
|
|
*/
|
|
|
|
function getUsedByAttrs() {
|
2009-06-30 08:09:20 +00:00
|
|
|
return $this->used_by_attrs;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/**
|
2009-06-30 08:09:20 +00:00
|
|
|
* Represents an LDAP schema matchingRuleUse entry
|
2009-06-30 09:29:51 +00:00
|
|
|
* @package phpLDAPadmin
|
|
|
|
*/
|
|
|
|
class MatchingRuleUse extends SchemaItem {
|
2009-06-30 09:22:30 +00:00
|
|
|
/** The name of the MathingRule this applies to */
|
2009-06-30 08:09:20 +00:00
|
|
|
var $name;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
|
|
|
/** An array of attributeType names who make use of the mathingRule
|
2009-06-30 08:09:20 +00:00
|
|
|
* identified by $this->oid and $this->name */
|
|
|
|
var $used_by_attrs;
|
|
|
|
|
2009-06-30 09:22:30 +00:00
|
|
|
/** Initialize the class' member variables */
|
2009-06-30 09:29:51 +00:00
|
|
|
function initVars() {
|
|
|
|
parent::initVars();
|
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
$this->oid = null;
|
|
|
|
$this->name = null;
|
|
|
|
$this->used_by_attrs = array();
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
function MatchingRuleUse( $raw_matching_rule_use_string ) {
|
2009-06-30 09:40:37 +00:00
|
|
|
if (DEBUG_ENABLED)
|
2009-06-30 10:26:08 +00:00
|
|
|
debug_log('%s::__construct(): Entered with (%s)',9,get_class($this),$raw_matching_rule_use_string);
|
2009-06-30 09:29:51 +00:00
|
|
|
|
|
|
|
$this->initVars();
|
|
|
|
|
2009-06-30 10:26:08 +00:00
|
|
|
$strings = preg_split ('/[\s,]+/', $raw_matching_rule_use_string, -1,PREG_SPLIT_DELIM_CAPTURE);
|
2009-06-30 08:09:20 +00:00
|
|
|
for($i=0; $i<count($strings); $i++) {
|
|
|
|
switch($strings[$i]) {
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
case '(':
|
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
case 'NAME':
|
2009-06-30 10:26:08 +00:00
|
|
|
if($strings[$i+1]!='(') {
|
2009-06-30 08:09:20 +00:00
|
|
|
do {
|
|
|
|
$i++;
|
2009-06-30 09:22:30 +00:00
|
|
|
if( ! isset( $this->name ) || strlen( $this->name ) ==0 )
|
2009-06-30 08:09:20 +00:00
|
|
|
$this->name = $strings[$i];
|
|
|
|
else
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->name .= ' ' . $strings[$i];
|
2009-06-30 08:09:20 +00:00
|
|
|
}while(!preg_match("/\'$/s", $strings[$i]));
|
|
|
|
} else {
|
|
|
|
$i++;
|
|
|
|
do {
|
|
|
|
$i++;
|
|
|
|
if(strlen($this->name) == 0)
|
|
|
|
$this->name = $strings[$i];
|
|
|
|
else
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->name .= ' ' . $strings[$i];
|
2009-06-30 08:09:20 +00:00
|
|
|
} while(!preg_match("/\'$/s", $strings[$i]));
|
|
|
|
do {
|
|
|
|
$i++;
|
2009-06-30 09:29:51 +00:00
|
|
|
} while (! preg_match('/\)+\)?/',$strings[$i]));
|
2009-06-30 08:09:20 +00:00
|
|
|
}
|
2009-06-30 10:26:08 +00:00
|
|
|
$this->name = preg_replace("/^\'/", '', $this->name);
|
|
|
|
$this->name = preg_replace("/\'$/", '', $this->name);
|
2009-06-30 08:09:20 +00:00
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
case 'APPLIES':
|
|
|
|
// TODO
|
2009-06-30 10:26:08 +00:00
|
|
|
if($strings[$i+1]!='(') {
|
2009-06-30 08:09:20 +00:00
|
|
|
// has a single attribute name
|
|
|
|
$i++;
|
|
|
|
$this->used_by_attrs = array( $strings[$i] );
|
|
|
|
//echo "Adding single: " . $strings[$i] . "<br />";
|
|
|
|
} else {
|
|
|
|
// has multiple attribute names
|
|
|
|
$i++;
|
2009-06-30 10:26:08 +00:00
|
|
|
while($strings[$i]!=')') {
|
2009-06-30 08:09:20 +00:00
|
|
|
$i++;
|
|
|
|
$new_attr = $strings[$i];
|
2009-06-30 10:26:08 +00:00
|
|
|
$new_attr = preg_replace("/^\'/", '', $new_attr );
|
|
|
|
$new_attr = preg_replace("/\'$/", '', $new_attr );
|
2009-06-30 08:09:20 +00:00
|
|
|
$this->used_by_attrs[] = $new_attr;
|
|
|
|
//echo "Adding $new_attr<br />";
|
|
|
|
$i++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2009-06-30 09:29:51 +00:00
|
|
|
|
2009-06-30 08:09:20 +00:00
|
|
|
default:
|
2009-06-30 10:26:08 +00:00
|
|
|
if(preg_match ('/[\d\.]+/i',$strings[$i]) && $i == 1)
|
2009-06-30 08:09:20 +00:00
|
|
|
$this->oid = $strings[$i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sort( $this->used_by_attrs );
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets this MatchingRuleUse's name
|
|
|
|
* @return string The name
|
|
|
|
*/
|
|
|
|
function getName() {
|
2009-06-30 08:09:20 +00:00
|
|
|
return $this->name;
|
|
|
|
}
|
|
|
|
|
2009-06-30 09:29:51 +00:00
|
|
|
/**
|
|
|
|
* Gets an array of attribute names (strings) which use this MatchingRuleUse object.
|
|
|
|
* @return array The array of attribute names (strings).
|
|
|
|
*/
|
|
|
|
function getUsedByAttrs() {
|
2009-06-30 08:09:20 +00:00
|
|
|
return $this->used_by_attrs;
|
|
|
|
}
|
|
|
|
}
|
2009-06-30 08:07:14 +00:00
|
|
|
?>
|