diff options
Diffstat (limited to 'source4/dsdb/schema')
-rw-r--r-- | source4/dsdb/schema/schema.h | 2 | ||||
-rw-r--r-- | source4/dsdb/schema/schema_inferiors.c | 28 |
2 files changed, 30 insertions, 0 deletions
diff --git a/source4/dsdb/schema/schema.h b/source4/dsdb/schema/schema.h index 75351798c2..289fd4276c 100644 --- a/source4/dsdb/schema/schema.h +++ b/source4/dsdb/schema/schema.h @@ -107,6 +107,8 @@ struct dsdb_attribute { bool isDefunct; bool systemOnly; + bool one_way_link; + /* internal stuff */ const struct dsdb_syntax *syntax; const struct ldb_schema_attribute *ldb_schema_attribute; diff --git a/source4/dsdb/schema/schema_inferiors.c b/source4/dsdb/schema/schema_inferiors.c index d2c134ea9e..7b80c20a60 100644 --- a/source4/dsdb/schema/schema_inferiors.c +++ b/source4/dsdb/schema/schema_inferiors.c @@ -328,6 +328,7 @@ int schema_fill_constructed(const struct dsdb_schema *schema) { int ret; struct dsdb_class *schema_class; + struct dsdb_attribute *attribute; schema_fill_from_ids(schema); @@ -353,5 +354,32 @@ int schema_fill_constructed(const struct dsdb_schema *schema) schema_class->posssuperiors = NULL; } + /* setup fast access to one_way_link */ + for (attribute=schema->attributes; attribute; attribute=attribute->next) { + if (dsdb_dn_oid_to_format(attribute->syntax->ldap_oid) == DSDB_INVALID_DN) { + attribute->one_way_link = false; + continue; + } + + /* these are not considered to be one way links for + the purpose of DN link fixups */ + if (ldb_attr_cmp("distinguishedName", attribute->lDAPDisplayName) == 0 || + ldb_attr_cmp("objectCategory", attribute->lDAPDisplayName) == 0) { + attribute->one_way_link = false; + continue; + } + + if (attribute->linkID == 0) { + attribute->one_way_link = true; + continue; + } + /* handle attributes with a linkID but no backlink */ + if (dsdb_attribute_by_linkID(schema, attribute->linkID) == NULL) { + attribute->one_way_link = true; + continue; + } + attribute->one_way_link = false; + } + return LDB_SUCCESS; } |