Apply attributes (and their syntax) from the schema into ldb
authorAndrew Bartlett <abartlet@samba.org>
Wed, 20 Aug 2008 05:46:46 +0000 (15:46 +1000)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 20 Aug 2008 05:46:46 +0000 (15:46 +1000)
This changes the @ATTRIBUTES record to be for bootstrapping only,
before we find the schema.

Andrew Bartlett
(This used to be commit 358477fcc041d5fb2e6ac5641c2f899cc49cfb69)

source4/dsdb/schema/schema_set.c
source4/setup/provision_init.ldif

index 431ea3da65f07d80c8bac6e9f124b9c8cedcb90f..b8b39bd1d4d4d105419bfb0c6e4c60e9afa9ee64 100644 (file)
 #include "includes.h"
 #include "dsdb/samdb/samdb.h"
 #include "lib/ldb/include/ldb_errors.h"
+#include "lib/ldb/include/ldb_private.h"
 #include "lib/util/dlinklist.h"
 #include "param/param.h"
 
+
+static int schema_set_attributes(struct ldb_context *ldb, struct dsdb_schema *schema)
+{
+       int ret = LDB_SUCCESS;
+       
+       struct dsdb_attribute *attr;
+       
+       for (attr = schema->attributes; attr; attr = attr->next) {
+               const struct ldb_schema_syntax *s;
+               if (!attr->syntax) {
+                       continue;
+               }
+               if (attr->syntax->ldb_syntax) {
+                       ret = ldb_schema_attribute_add(ldb, attr->lDAPDisplayName, 0,
+                                                      attr->syntax->ldb_syntax);
+               } else {
+                       s = ldb_standard_syntax_by_name(ldb, attr->syntax->ldap_oid);
+                       if (s) {
+                               ret = ldb_schema_attribute_add_with_syntax(ldb, attr->lDAPDisplayName, 0, s);
+                       } else {
+                               s = ldb_samba_syntax_by_name(ldb, attr->syntax->ldap_oid);
+                               if (s) {
+                                       ret = ldb_schema_attribute_add_with_syntax(ldb, attr->lDAPDisplayName, 0, s);
+                               } else {
+                                       ret = LDB_SUCCESS; /* Nothing to do here */
+                               }
+                       }
+               }
+               if (ret != LDB_SUCCESS) {
+                       return ret;
+               }
+       }
+
+       /* Now put back the hardcoded Samba special handlers */
+       return ldb_register_samba_handlers(ldb);
+}
+
+
 /**
  * Attach the schema to an opaque pointer on the ldb, so ldb modules
  * can find it 
@@ -40,6 +79,11 @@ int dsdb_set_schema(struct ldb_context *ldb, struct dsdb_schema *schema)
                return ret;
        }
 
+       ret = schema_set_attributes(ldb, schema);
+       if (ret != LDB_SUCCESS) {
+               return ret;
+       }
+
        talloc_steal(ldb, schema);
 
        return LDB_SUCCESS;
@@ -64,6 +108,11 @@ int dsdb_set_global_schema(struct ldb_context *ldb)
                return ret;
        }
 
+       ret = schema_set_attributes(ldb, global_schema);
+       if (ret != LDB_SUCCESS) {
+               return ret;
+       }
+
        /* Keep a reference to this schema, just incase the global copy is replaced */
        if (talloc_reference(ldb, global_schema) == NULL) {
                return LDB_ERR_OPERATIONS_ERROR;
index 65a12f1afa3543a3c176800b0bcbfbec94ce1dbf..a6c591dd51cdf2f04d57ba313312cf18c93852e7 100644 (file)
@@ -1,3 +1,8 @@
+#These attributes are only used as far as the bootstrapping of the
+# schema.  After that, the attributes from the schema are used.
+#
+# Therefore, they must strictly match the schema
+
 dn: @ATTRIBUTES
 userPrincipalName: CASE_INSENSITIVE
 servicePrincipalName: CASE_INSENSITIVE
@@ -7,6 +12,8 @@ nETBIOSName: CASE_INSENSITIVE
 cn: CASE_INSENSITIVE
 dc: CASE_INSENSITIVE
 name: CASE_INSENSITIVE
+lDAPDisplayName: CASE_INSENSITIVE
+subClassOf: CASE_INSENSITIVE
 dn: CASE_INSENSITIVE
 sAMAccountName: CASE_INSENSITIVE
 objectClass: CASE_INSENSITIVE