[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Fri Jun 11 20:57:31 MDT 2010


The branch, master has been updated
       via  8d8678f... s4:dsdb Allow calling dsdb_convert_object_ex() directly
       via  72486a6... s4:dsdb Add debug
       via  088d5b7... s4:dsdb Simplfy match of objectclass in dsdb_schema_set_el_from_ldb_msg
       via  57b6979... s4:provision Allow both additional and override prefixmaps in Schema
       via  6336f24... s4:dsdb Allow a binary prefix map to be specified in the LDIF
       via  d6f5c1a... s4:dsdb Provide a function to convert from DRS prefix maps to the LDB prefixmap
       via  e828364... s4:dsdb Add more debugs to help track down failures to parse the prefixmap
       via  c6bf8e4... s4:dsdb Put back the reference and set_attributes in dsdb_reference_schema
      from  7aa8af1... check if LD_AS_NEEDED breaks linking with libreadline fixes #7209

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 8d8678fcfd8017a679ec9ce442f050a43689fcaa
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Sat Jun 12 11:03:36 2010 +1000

    s4:dsdb Allow calling dsdb_convert_object_ex() directly
    
    This will allow the libnet_vampire code to manually convert individual
    schema objects.
    
    Andrew Bartlett

commit 72486a6dd16608465e1b76bf838d3f5b019dac8f
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Jun 10 21:34:48 2010 +1000

    s4:dsdb Add debug

commit 088d5b76ca416e798b505d9fd9266db73a0a8450
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Jun 10 21:29:57 2010 +1000

    s4:dsdb Simplfy match of objectclass in dsdb_schema_set_el_from_ldb_msg
    
    There is no need to do a full ldb_match_msg() for a simple case
    insensitive string.
    
    Andrew Bartlett

commit 57b6979ad034b50debd47979e05b925daa54b5a4
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Jun 10 08:58:44 2010 +1000

    s4:provision Allow both additional and override prefixmaps in Schema
    
    The idea here is to allow some callers to specify a new prefixMap that
    will override the values loaded from the prefixMap.txt.
    
    Andrew Bartlett

commit 6336f244758e78dfce61715b5de403e3db7fb02e
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Jun 10 08:51:30 2010 +1000

    s4:dsdb Allow a binary prefix map to be specified in the LDIF
    
    This allows it to be specified in either binary or as a string.
    
    Andrew Bartlett

commit d6f5c1ace215131dc09611abcd2a52254bdab4d6
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Jun 10 08:27:59 2010 +1000

    s4:dsdb Provide a function to convert from DRS prefix maps to the LDB prefixmap
    
    This allows us to push a prefixmap directly into the schema we
    generate in the provision code.
    
    Andrew Bartlett

commit e82836467c2ecdcb2c89c2b6eb4dae51bd2f22a2
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Jun 10 08:25:49 2010 +1000

    s4:dsdb Add more debugs to help track down failures to parse the prefixmap

commit c6bf8e4cadea563011630af2fa673e3ea5e3b2ee
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Wed Jun 9 20:21:19 2010 +1000

    s4:dsdb Put back the reference and set_attributes in dsdb_reference_schema
    
    I'm not sure why I removed these in fe3e1af901c970f738bee92baac5d7d4f5736e17
    
    Andrew Bartlett

-----------------------------------------------------------------------

Summary of changes:
 source4/dsdb/repl/replicated_objects.c             |   12 ++--
 source4/dsdb/schema/schema_init.c                  |   58 ++++++++++++++------
 source4/dsdb/schema/schema_set.c                   |   30 +++++------
 source4/lib/ldb-samba/ldif_handlers.c              |   14 +++++
 source4/libnet/libnet_vampire.c                    |    1 +
 source4/scripting/python/samba/provisionbackend.py |    2 +-
 source4/scripting/python/samba/schema.py           |   11 +++--
 7 files changed, 83 insertions(+), 45 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/dsdb/repl/replicated_objects.c b/source4/dsdb/repl/replicated_objects.c
index 5e69236..838dc84 100644
--- a/source4/dsdb/repl/replicated_objects.c
+++ b/source4/dsdb/repl/replicated_objects.c
@@ -31,12 +31,12 @@
 #include "libcli/auth/libcli_auth.h"
 #include "param/param.h"
 
-static WERROR dsdb_convert_object_ex(struct ldb_context *ldb,
-				     const struct dsdb_schema *schema,
-				     const struct drsuapi_DsReplicaObjectListItemEx *in,
-				     const DATA_BLOB *gensec_skey,
-				     TALLOC_CTX *mem_ctx,
-				     struct dsdb_extended_replicated_object *out)
+WERROR dsdb_convert_object_ex(struct ldb_context *ldb,
+			      const struct dsdb_schema *schema,
+			      const struct drsuapi_DsReplicaObjectListItemEx *in,
+			      const DATA_BLOB *gensec_skey,
+			      TALLOC_CTX *mem_ctx,
+			      struct dsdb_extended_replicated_object *out)
 {
 	NTSTATUS nt_status;
 	WERROR status;
diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c
index 55e78eb..8e47f12 100644
--- a/source4/dsdb/schema/schema_init.c
+++ b/source4/dsdb/schema/schema_init.c
@@ -81,17 +81,25 @@ static WERROR _dsdb_prefixmap_from_ldb_val(const struct ldb_val *pfm_ldb_val,
 	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
 		NTSTATUS nt_status = ndr_map_error2ntstatus(ndr_err);
 		talloc_free(temp_ctx);
+		DEBUG(0,("_dsdb_prefixmap_from_ldb_val: Failed to parse prefixmap of length %u: %s\n",
+			 (unsigned int)pfm_ldb_val->length, ndr_map_error2string(ndr_err)));
+		talloc_free(temp_ctx);
 		return ntstatus_to_werror(nt_status);
 	}
 
 	if (pfm_blob.version != PREFIX_MAP_VERSION_DSDB) {
-		DEBUG(0,("_dsdb_prefixmap_from_ldb_val: pfm_blob->version incorrect\n"));
+		DEBUG(0,("_dsdb_prefixmap_from_ldb_val: pfm_blob->version %u incorrect\n", (unsigned int)pfm_blob.version));
 		talloc_free(temp_ctx);
 		return WERR_VERSION_PARSE_ERROR;
 	}
 
 	/* call the drsuapi version */
 	werr = dsdb_schema_pfm_from_drsuapi_pfm(&pfm_blob.ctr.dsdb, false, mem_ctx, _pfm, NULL);
+	if (!W_ERROR_IS_OK(werr)) {
+		DEBUG(0, (__location__ " dsdb_schema_pfm_from_drsuapi_pfm failed: %s\n", win_errstr(werr)));
+		talloc_free(temp_ctx);
+		return werr;
+	}
 
 	talloc_free(temp_ctx);
 
@@ -113,12 +121,20 @@ WERROR dsdb_load_oid_mappings_ldb(struct dsdb_schema *schema,
 
 	/* parse schemaInfo blob to verify it is valid */
 	werr = dsdb_schema_info_from_blob(schemaInfo, mem_ctx, &schi);
-	W_ERROR_NOT_OK_GOTO(werr, DONE);
+	if (!W_ERROR_IS_OK(werr)) {
+		DEBUG(0, (__location__ " dsdb_schema_info_from_blob failed: %s\n", win_errstr(werr)));
+		talloc_free(mem_ctx);
+		return werr;
+	}
 
 	/* fetch prefixMap */
 	werr = _dsdb_prefixmap_from_ldb_val(prefixMap,
 					    mem_ctx, &pfm);
-	W_ERROR_NOT_OK_GOTO(werr, DONE);
+	if (!W_ERROR_IS_OK(werr)) {
+		DEBUG(0, (__location__ " _dsdb_prefixmap_from_ldb_val failed: %s\n", win_errstr(werr)));
+		talloc_free(mem_ctx);
+		return werr;
+	}
 
 	/* decode schema_info */
 	schema_info = hex_encode_talloc(mem_ctx,
@@ -136,11 +152,10 @@ WERROR dsdb_load_oid_mappings_ldb(struct dsdb_schema *schema,
 	talloc_free(discard_const(schema->schema_info));
 	schema->schema_info = talloc_steal(schema, schema_info);
 
-DONE:
 	/* clean up locally allocated mem */
 	talloc_free(mem_ctx);
 
-	return werr;
+	return WERR_OK;
 }
 
 WERROR dsdb_get_oid_mappings_drsuapi(const struct dsdb_schema *schema,
@@ -153,30 +168,39 @@ WERROR dsdb_get_oid_mappings_drsuapi(const struct dsdb_schema *schema,
 						mem_ctx, _ctr);
 }
 
-WERROR dsdb_get_oid_mappings_ldb(const struct dsdb_schema *schema,
-				 TALLOC_CTX *mem_ctx,
-				 struct ldb_val *prefixMap,
-				 struct ldb_val *schemaInfo)
+WERROR dsdb_get_drsuapi_prefixmap_as_blob(const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr,
+					  TALLOC_CTX *mem_ctx,
+					  struct ldb_val *prefixMap)
 {
-	WERROR status;
-	enum ndr_err_code ndr_err;
-	struct drsuapi_DsReplicaOIDMapping_Ctr *ctr;
 	struct prefixMapBlob pfm;
-
-	status = dsdb_get_oid_mappings_drsuapi(schema, false, mem_ctx, &ctr);
-	W_ERROR_NOT_OK_RETURN(status);
-
+	enum ndr_err_code ndr_err;
 	pfm.version	= PREFIX_MAP_VERSION_DSDB;
 	pfm.reserved	= 0;
 	pfm.ctr.dsdb	= *ctr;
 
 	ndr_err = ndr_push_struct_blob(prefixMap, mem_ctx, &pfm,
 					(ndr_push_flags_fn_t)ndr_push_prefixMapBlob);
-	talloc_free(ctr);
 	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
 		NTSTATUS nt_status = ndr_map_error2ntstatus(ndr_err);
 		return ntstatus_to_werror(nt_status);
 	}
+	return WERR_OK;
+}
+
+WERROR dsdb_get_oid_mappings_ldb(const struct dsdb_schema *schema,
+				 TALLOC_CTX *mem_ctx,
+				 struct ldb_val *prefixMap,
+				 struct ldb_val *schemaInfo)
+{
+	WERROR status;
+	struct drsuapi_DsReplicaOIDMapping_Ctr *ctr;
+
+	status = dsdb_get_oid_mappings_drsuapi(schema, false, mem_ctx, &ctr);
+	W_ERROR_NOT_OK_RETURN(status);
+
+	status = dsdb_get_drsuapi_prefixmap_as_blob(ctr, mem_ctx, prefixMap);
+	talloc_free(ctr);
+	W_ERROR_NOT_OK_RETURN(status);
 
 	*schemaInfo = strhex_to_data_blob(mem_ctx, schema->schema_info);
 	W_ERROR_HAVE_NO_MEMORY(schemaInfo->data);
diff --git a/source4/dsdb/schema/schema_set.c b/source4/dsdb/schema/schema_set.c
index 07d75c4..5ecbad2 100644
--- a/source4/dsdb/schema/schema_set.c
+++ b/source4/dsdb/schema/schema_set.c
@@ -390,6 +390,15 @@ int dsdb_reference_schema(struct ldb_context *ldb, struct dsdb_schema *schema,
 		return ret;
 	}
 
+	if (talloc_reference(ldb, schema) == NULL) {
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
+	ret = dsdb_schema_set_attributes(ldb, schema, write_attributes);
+	if (ret != LDB_SUCCESS) {
+		return ret;
+	}
+
 	return LDB_SUCCESS;
 }
 
@@ -540,24 +549,11 @@ int dsdb_schema_fill_extended_dn(struct ldb_context *ldb, struct dsdb_schema *sc
 WERROR dsdb_schema_set_el_from_ldb_msg(struct ldb_context *ldb, struct dsdb_schema *schema, 
 				       struct ldb_message *msg) 
 {
-	static struct ldb_parse_tree *attr_tree, *class_tree;
-	if (!attr_tree) {
-		attr_tree = ldb_parse_tree(talloc_autofree_context(), "(objectClass=attributeSchema)");
-		if (!attr_tree) {
-			return WERR_NOMEM;
-		}
-	}
-
-	if (!class_tree) {
-		class_tree = ldb_parse_tree(talloc_autofree_context(), "(objectClass=classSchema)");
-		if (!class_tree) {
-			return WERR_NOMEM;
-		}
-	}
-
-	if (ldb_match_msg(ldb, msg, attr_tree, NULL, LDB_SCOPE_BASE)) {
+	if (samdb_find_attribute(ldb, msg,
+				 "objectclass", "attributeSchema") != NULL) {
 		return dsdb_attribute_from_ldb(ldb, schema, msg);
-	} else if (ldb_match_msg(ldb, msg, class_tree, NULL, LDB_SCOPE_BASE)) {
+	} else if (samdb_find_attribute(ldb, msg,
+				 "objectclass", "classSchema") != NULL) {
 		return dsdb_class_from_ldb(schema, msg);
 	}
 
diff --git a/source4/lib/ldb-samba/ldif_handlers.c b/source4/lib/ldb-samba/ldif_handlers.c
index 91abefc..f335d6c 100644
--- a/source4/lib/ldb-samba/ldif_handlers.c
+++ b/source4/lib/ldb-samba/ldif_handlers.c
@@ -526,6 +526,20 @@ static int ldif_read_prefixMap(struct ldb_context *ldb, void *mem_ctx,
 		return -1;
 	}
 
+	ndr_err = ndr_pull_struct_blob(in, blob, blob,
+				       (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob);
+	if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+		ndr_err = ndr_push_struct_blob(out, mem_ctx,
+					       blob,
+					       (ndr_push_flags_fn_t)ndr_push_prefixMapBlob);
+		talloc_free(tmp_ctx);
+		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+			return -1;
+		}
+		return 0;
+	}
+
+	/* If this does not parse, then it is probably the text version, and we should try it that way */
 	blob->version = PREFIX_MAP_VERSION_DSDB;
 	
 	string = talloc_strndup(mem_ctx, (const char *)in->data, in->length);
diff --git a/source4/libnet/libnet_vampire.c b/source4/libnet/libnet_vampire.c
index d083fc9..06387a9 100644
--- a/source4/libnet/libnet_vampire.c
+++ b/source4/libnet/libnet_vampire.c
@@ -288,6 +288,7 @@ static NTSTATUS vampire_apply_schema(struct vampire_state *s,
 	/* attach the schema to the ldb */
 	ret = dsdb_set_schema(s->ldb, s->self_made_schema);
 	if (ret != LDB_SUCCESS) {
+		DEBUG(0,("Failed to attach schema from DRS.\n"));
 		return NT_STATUS_FOOBAR;
 	}
 	/* we don't want to access the self made schema anymore */
diff --git a/source4/scripting/python/samba/provisionbackend.py b/source4/scripting/python/samba/provisionbackend.py
index 629bc28..b8abc28 100644
--- a/source4/scripting/python/samba/provisionbackend.py
+++ b/source4/scripting/python/samba/provisionbackend.py
@@ -604,7 +604,7 @@ class FDSBackend(LDAPBackend):
                 schemadn=self.names.schemadn,
                 serverdn=self.names.serverdn,
                 files=[setup_path("schema_samba4.ldif"), self.samba3_ldif],
-                prefixmap=["1000:1.3.6.1.4.1.7165.2.1", "1001:1.3.6.1.4.1.7165.2.2"])
+                additional_prefixmap=["1000:1.3.6.1.4.1.7165.2.1", "1001:1.3.6.1.4.1.7165.2.2"])
 
     def provision(self):
         from samba.provision import ProvisioningError
diff --git a/source4/scripting/python/samba/schema.py b/source4/scripting/python/samba/schema.py
index fc4f131..bdc09cf 100644
--- a/source4/scripting/python/samba/schema.py
+++ b/source4/scripting/python/samba/schema.py
@@ -53,7 +53,7 @@ def get_schema_descriptor(domain_sid):
 class Schema(object):
 
     def __init__(self, setup_path, domain_sid, invocationid=None, schemadn=None,
-                 serverdn=None, files=None, prefixmap=None, am_rodc=False):
+                 serverdn=None, files=None, override_prefixmap=None, additional_prefixmap=None, am_rodc=False):
         """Load schema for the SamDB from the AD schema files and samba4_schema.ldif
         
         :param samdb: Load a schema into a SamDB.
@@ -92,10 +92,13 @@ class Schema(object):
             setup_path("provision_schema_basedn.ldif"),
             {"SCHEMADN": schemadn, "DESCRIPTOR": descr})
 
-        self.prefixmap_data = open(setup_path("prefixMap.txt"), 'r').read()
+        if override_prefixmap is not None:
+            self.prefixmap_data = override_prefixmap
+        else:
+            self.prefixmap_data = open(setup_path("prefixMap.txt"), 'r').read()
 
-        if prefixmap is not None:
-            for map in prefixmap:
+        if additional_prefixmap is not None:
+            for map in additional_prefixmap:
                 self.prefixmap_data += "%s\n" % map
 
         self.prefixmap_data = b64encode(self.prefixmap_data)


-- 
Samba Shared Repository


More information about the samba-cvs mailing list