diff options
Diffstat (limited to 'source4/dsdb/schema/schema_inferiors.c')
-rw-r--r-- | source4/dsdb/schema/schema_inferiors.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/source4/dsdb/schema/schema_inferiors.c b/source4/dsdb/schema/schema_inferiors.c index fc1845bb42..63ddb4a424 100644 --- a/source4/dsdb/schema/schema_inferiors.c +++ b/source4/dsdb/schema/schema_inferiors.c @@ -166,10 +166,89 @@ static void schema_fill_possible_inferiors(struct dsdb_schema *schema, struct ds schema_class->possibleInferiors = str_list_unique(schema_class->possibleInferiors); } +/* + fill in a string class name from a governs_ID + */ +static void schema_fill_from_class_one(struct dsdb_schema *schema, struct dsdb_class *c, + const char **s, uint32_t id) +{ + if (*s == NULL && id != 0) { + struct dsdb_class *c2 = dsdb_class_by_governsID_id(schema, id); + if (c2) { + *s = c2->lDAPDisplayName; + } + } +} + +/* + fill in a list of string class names from a governs_ID list + */ +static void schema_fill_from_class_list(struct dsdb_schema *schema, struct dsdb_class *c, + const char ***s, uint32_t *ids) +{ + if (*s == NULL && ids != NULL) { + int i; + for (i=0;ids[i];i++) ; + *s = talloc_array(c, const char *, i+1); + for (i=0;ids[i];i++) { + struct dsdb_class *c2 = dsdb_class_by_governsID_id(schema, ids[i]); + if (c2) { + (*s)[i] = c2->lDAPDisplayName; + } else { + (*s)[i] = NULL; + } + } + (*s)[i] = NULL; + } +} + +/* + fill in a list of string attribute names from a attributeID list + */ +static void schema_fill_from_attribute_list(struct dsdb_schema *schema, struct dsdb_class *c, + const char ***s, uint32_t *ids) +{ + if (*s == NULL && ids != NULL) { + int i; + for (i=0;ids[i];i++) ; + *s = talloc_array(c, const char *, i+1); + for (i=0;ids[i];i++) { + struct dsdb_attribute *a = dsdb_attribute_by_attributeID_id(schema, ids[i]); + if (a) { + (*s)[i] = a->lDAPDisplayName; + } else { + (*s)[i] = NULL; + } + } + (*s)[i] = NULL; + } +} + +/* + if the schema came from DRS then some attributes will be setup as IDs + */ +static void schema_fill_from_ids(struct dsdb_schema *schema) +{ + struct dsdb_class *c; + for (c=schema->classes; c; c=c->next) { + schema_fill_from_class_one(schema, c, &c->subClassOf, c->subClassOf_id); + schema_fill_from_attribute_list(schema, c, &c->systemMayContain, c->systemMayContain_ids); + schema_fill_from_attribute_list(schema, c, &c->systemMustContain, c->systemMustContain_ids); + schema_fill_from_attribute_list(schema, c, &c->mustContain, c->mustContain_ids); + schema_fill_from_attribute_list(schema, c, &c->mayContain, c->mayContain_ids); + schema_fill_from_class_list(schema, c, &c->possSuperiors, c->possSuperiors_ids); + schema_fill_from_class_list(schema, c, &c->systemPossSuperiors, c->systemPossSuperiors_ids); + schema_fill_from_class_list(schema, c, &c->systemAuxiliaryClass, c->systemAuxiliaryClass_ids); + schema_fill_from_class_list(schema, c, &c->auxiliaryClass, c->auxiliaryClass_ids); + } +} + void schema_fill_constructed(struct dsdb_schema *schema) { struct dsdb_class *schema_class; + schema_fill_from_ids(schema); + schema_create_subclasses(schema); for (schema_class=schema->classes; schema_class; schema_class=schema_class->next) { |