From a74f4673eda682bbca4adfed8a924b16114a0dcd Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 1 Aug 2011 13:54:58 +1000 Subject: s4-dsdb: setup a one_way_link attribute on schema attributes this allows us to quickly determine if a DN is a one way link Pair-Programmed-With: Andrew Bartlett Pair-Programmed-With: Amitay Isaacs --- source4/dsdb/schema/schema.h | 2 ++ source4/dsdb/schema/schema_inferiors.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) 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; } -- cgit