summaryrefslogtreecommitdiff
path: root/source4/dsdb/schema/schema_inferiors.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/dsdb/schema/schema_inferiors.c')
-rw-r--r--source4/dsdb/schema/schema_inferiors.c79
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) {