[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Fri Nov 6 06:07:28 MST 2009


The branch, master has been updated
       via  0f531e3... s4/drs: Refactor to be more SAMBA.Coding style compliant
       via  c236bb5... s4/drs: Remove unused structures and functions
       via  db82023... s4/drs: remove unused num_prefixes and prefixes from dsdb_schema
       via  2fa4c4d... s4/drs(tort): _torture_drs_pfm_compare_same() should not fail tctx by itself
       via  ef959b4... s4/drs(tort): Test case for dsdb_create_prefix_mapping() implemented
       via  b9dd44e... s4/drs: dsdb_create_prefix_mapping() refactored
       via  9405377... s4/drs: prefixMap lookup by full_OID implementation
       via  009361e... s4/drs(tort): refactor - SCHEMA_INFO_DEFAULT defined on file scope
       via  1aae751... s4/drs: dsdb_write_prefixes_from_schema_to_ldb() refactored
       via  82539b7... s4/drs: dsdb_read_prefixes_from_ldb() refactored
       via  b50df3b... s4/drs(tort): prefixMap read/write in LDB test case
       via  6a32200... s4/drs(tort): Create temporary LDB for testing purposes
       via  9da3343... s4/drs: refactor dsdb_load_oid_mappings_ldb() to use _dsdb_prefixmap_from_ldb_val()
       via  5381d8d... s4/drs: Load prefixMap from ldb_val moved in separate function
       via  20622de... s4/drs(tort): prefixMap to/from ldb_val serialization test case
       via  fc05386... s4/drs: dsdb_schema_pfm_from_drsuapi_pfm() to accept partial drsuapi_prefixMap
       via  ba4d87f... s4/drs: dsdb_map_int2oid() replaced by dsdb_schema_pfm_oid_from_attid()
       via  01302b8... s4/drs: dsdb_map_oid2int() replaced by dsdb_schema_pfm_make_attid()
       via  ddab9d1... s4/drs: dsdb_verify_oid_mappings_drsuapi() replaced by dsdb_schema_pfm_contains_drsuapi_pfm()
       via  28b6eb9... s4/drs: dsdb_get_oid_mappings_drsuapi() to use new prefixMap interface
       via  a833853... s4/drs: dsdb_load_oid_mappings_drsuapi() -> dsdb_load_prefixmap_from_drsuapi()
       via  3729272... s4/drs: dsdb_schema uses dsdb_schema_prefixmap definition
       via  3abe0ad... s4: DRS-RPC tests added to RPC group of tests
       via  7a51b3a... s4: Add DRS-UNIT test suite to LOCAL group of tests to be executed
       via  b54ec12... s4/drs: Move schema_prefixMap allocation in separate function
       via  6210237... s4/drs: schema_prefixMap to/from drsuapi_prefixMap conversion implementation
       via  5446123... s4/drs(tort): test for schema_prefixMap to/from drsuapi_prefixMap conversion
       via  3d91c8e... s4/drs(tort): implement prefixMap comparison function
       via  3fe4310... s4/drs: Implement binary-oid-lookup into prefixMap
       via  f447536... s4/drs: Move making of partial-binary-oid to a separate function
       via  39ab7b8... s4/drs: Fix memory leek in prefixMap
       via  716eb62... s4/ldb: Fix double allocation for "ldb_url"
       via  be06d5c... s4:torture/drs: move intern/ => unit/
      from  440db5a... Revert "s3-kerberos: add smb_krb5_parse_name_flags()."

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


- Log -----------------------------------------------------------------
commit 0f531e3a2a94594ad5a68bbf8bae85555b8f644e
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Thu Oct 29 18:18:54 2009 +0200

    s4/drs: Refactor to be more SAMBA.Coding style compliant
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit c236bb537f1ee8c287c9dbbbc1cbe47fabbeb688
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Thu Oct 29 16:28:38 2009 +0200

    s4/drs: Remove unused structures and functions
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit db82023af24ef89afe1559422ac5899646afff32
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Thu Oct 29 16:24:00 2009 +0200

    s4/drs: remove unused num_prefixes and prefixes from dsdb_schema
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 2fa4c4dceec67a85c40f37c992f5a603aada47c0
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Thu Oct 29 03:56:50 2009 +0200

    s4/drs(tort): _torture_drs_pfm_compare_same() should not fail tctx by itself
    
    The responsibility for failing torture_context sould be for the
    caller.
    This gives better control in for test case driver function.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit ef959b42cac81ba372fac25e4da797aec02747bc
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Thu Oct 29 03:17:33 2009 +0200

    s4/drs(tort): Test case for dsdb_create_prefix_mapping() implemented
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit b9dd44ee3971a9dea5d6221938e41e18cdf03443
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Thu Oct 29 03:54:12 2009 +0200

    s4/drs: dsdb_create_prefix_mapping() refactored
    
    TODO: this function may be refactored further.
    Actually we don't need to look up for the OID supplied,
    but just call sdb_schema_pfm_make_attid() - it will
    search for the OID anyway and add it if necessary
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 9405377a7027ea1d8ea98942efeb69de672d38e4
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Thu Oct 29 03:16:30 2009 +0200

    s4/drs: prefixMap lookup by full_OID implementation
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 009361e1ffc6bd51205985153e441001c650fc1a
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Wed Oct 28 18:33:13 2009 +0200

    s4/drs(tort): refactor - SCHEMA_INFO_DEFAULT defined on file scope
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 1aae751a68ea352f81e00d5c54023c844cd373cd
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Tue Oct 27 18:35:29 2009 +0200

    s4/drs: dsdb_write_prefixes_from_schema_to_ldb() refactored
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 82539b7d6615c2ac671a0a347d86a6850a238b28
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Tue Oct 27 18:06:58 2009 +0200

    s4/drs: dsdb_read_prefixes_from_ldb() refactored
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit b50df3bd7ff8823839d261e5b5985163b3f953af
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Tue Oct 27 18:03:47 2009 +0200

    s4/drs(tort): prefixMap read/write in LDB test case
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 6a322006671d929db77f99401634aa9aefa264dd
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Tue Oct 27 16:27:28 2009 +0200

    s4/drs(tort): Create temporary LDB for testing purposes
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 9da33436e4de8c092905b3a98584c480592bddc6
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Tue Oct 27 00:16:02 2009 +0200

    s4/drs: refactor dsdb_load_oid_mappings_ldb() to use _dsdb_prefixmap_from_ldb_val()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 5381d8d157e90ae0e6058a19c2486377221ef3f6
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Mon Oct 26 23:50:50 2009 +0200

    s4/drs: Load prefixMap from ldb_val moved in separate function
    
    It is to be used later in several places when we need such conversion.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 20622de49f8a876ef91db329348d0827126f11c2
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Mon Oct 26 21:04:28 2009 +0200

    s4/drs(tort): prefixMap to/from ldb_val serialization test case
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit fc05386c0d9bf2cf39223e05d3a633a8559c5973
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Tue Nov 3 07:49:36 2009 +0100

    s4/drs: dsdb_schema_pfm_from_drsuapi_pfm() to accept partial drsuapi_prefixMap
    
    "partial drsuapi_prefixMap" is a prefix map without last entry
    being special - i.e. map that does not contains schema_info entry.
    
    Test for dsdb_schema_pfm_from_drsuapi_pfm() were also extended to
    cover both 'full' and 'partial' map conversion.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit ba4d87f81790d5773c033a79ea0b9cd37debd19d
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Mon Oct 26 03:47:41 2009 +0200

    s4/drs: dsdb_map_int2oid() replaced by dsdb_schema_pfm_oid_from_attid()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 01302b8202cadcacf245b9f68ca765f03bf38a0b
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Mon Oct 26 03:35:29 2009 +0200

    s4/drs: dsdb_map_oid2int() replaced by dsdb_schema_pfm_make_attid()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit ddab9d1fe74c90b2b05cd1712931930e82380913
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Mon Oct 26 03:06:16 2009 +0200

    s4/drs: dsdb_verify_oid_mappings_drsuapi() replaced by dsdb_schema_pfm_contains_drsuapi_pfm()
    
    dsdb_schema_pfm_contains_drsuapi_pfm() is part of reimplemented
    prefixMap interface.
    
    This name was choosen to clearly show, that this a week verification
    in case we want to determine if remote schema is changed.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 28b6eb94944e5bca0fff4aeef181e61926df3568
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Mon Oct 26 02:41:46 2009 +0200

    s4/drs: dsdb_get_oid_mappings_drsuapi() to use new prefixMap interface
    
    dsdb_get_oid_mappings_drsuapi() just need to call
    dsdb_drsuapi_pfm_from_schema_pfm() to get filled-in DRSUAPI
    prefixMap.
    
    Perhaps it won't be bad to rename this function to have
    more expressive name in the future
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit a83385303b3d0cae61d3ace412f58ca49a01f9dc
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Tue Nov 3 09:05:51 2009 +0100

    s4/drs: dsdb_load_oid_mappings_drsuapi() -> dsdb_load_prefixmap_from_drsuapi()
    
    Also, dsdb_load_oid_mappings_drsuapi() was reimplemented to use
    dsdb_schema_pfm_from_drsuapi_pfm() function to load
    drsuapi_prefixMap into schema->prefixmap
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 3729272f0a43889b5cf2af4157219dc3962e393b
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Mon Oct 26 00:31:28 2009 +0200

    s4/drs: dsdb_schema uses dsdb_schema_prefixmap definition
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 3abe0ad7de11f22c7f4f3ddd8b6ffe8c06b9264f
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Sun Oct 25 22:43:04 2009 +0200

    s4: DRS-RPC tests added to RPC group of tests
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 7a51b3adc2d1b69eb3f461959cadd392857d51d6
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Sun Oct 25 22:07:18 2009 +0200

    s4: Add DRS-UNIT test suite to LOCAL group of tests to be executed
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit b54ec122b2f75fe74356ee73c18e3a76e28c7294
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Sun Oct 25 20:57:18 2009 +0200

    s4/drs: Move schema_prefixMap allocation in separate function
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 6210237b5aebce71e210dbe39cdf71593e6c03af
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Sun Oct 25 20:34:17 2009 +0200

    s4/drs: schema_prefixMap to/from drsuapi_prefixMap conversion implementation
    
    Along with this, dsdb_schema_pfm_contains_drsuapi_pfm()
    function is implemented to replace previous implementation
    for dsdb_verify_oid_mappings_drsuapi().
    Name of the function clearly implies how week this verification is,
    as currently it is used to indicate "Schema modified on remote"
    condition.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 5446123190a6db8a563289e902ed375771e29942
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Sun Oct 25 20:31:39 2009 +0200

    s4/drs(tort): test for schema_prefixMap to/from drsuapi_prefixMap conversion
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 3d91c8ef5a115171f96d33606879ab7d871f3e3d
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Sat Oct 24 03:01:01 2009 +0300

    s4/drs(tort): implement prefixMap comparison function
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 3fe4310df73cf2a314982fe62793ea33d44c5499
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Sat Oct 24 00:48:55 2009 +0300

    s4/drs: Implement binary-oid-lookup into prefixMap
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit f4475368f07f2de07f3f9d7c68de027dfb8e7284
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Sat Oct 24 00:48:14 2009 +0300

    s4/drs: Move making of partial-binary-oid to a separate function
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 39ab7b8ebdefd13fb586d65da76173c0a3fa5fa5
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Sat Oct 24 00:02:24 2009 +0300

    s4/drs: Fix memory leek in prefixMap
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 716eb62b5dab37c203b306047b65280ddf34844a
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Sat Oct 24 00:02:02 2009 +0300

    s4/ldb: Fix double allocation for "ldb_url"
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit be06d5ccb4120190571dd5eb91a6dcaae7e27561
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Nov 4 11:12:17 2009 +0100

    s4:torture/drs: move intern/ => unit/
    
    metze

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

Summary of changes:
 source4/dsdb/repl/replicated_objects.c         |    2 +-
 source4/dsdb/samdb/ldb_modules/rootdse.c       |    2 +-
 source4/dsdb/samdb/ldb_modules/schema_data.c   |    4 +-
 source4/dsdb/schema/schema.h                   |    9 +-
 source4/dsdb/schema/schema_init.c              |  579 +++++-------------
 source4/dsdb/schema/schema_prefixmap.c         |  418 ++++++++++++--
 source4/dsdb/schema/schema_syntax.c            |   20 +-
 source4/lib/ldb/common/ldb.c                   |    4 +-
 source4/libnet/libnet_vampire.c                |    7 +-
 source4/selftest/tests.sh                      |    7 +-
 source4/torture/drs/config.mk                  |    2 +-
 source4/torture/drs/internal/prefixmap_tests.c |  400 -------------
 source4/torture/drs/unit/prefixmap_tests.c     |  746 ++++++++++++++++++++++++
 source4/torture/libnet/libnet_BecomeDC.c       |    7 +-
 14 files changed, 1310 insertions(+), 897 deletions(-)
 delete mode 100644 source4/torture/drs/internal/prefixmap_tests.c
 create mode 100644 source4/torture/drs/unit/prefixmap_tests.c


Changeset truncated at 500 lines:

diff --git a/source4/dsdb/repl/replicated_objects.c b/source4/dsdb/repl/replicated_objects.c
index ec5dcd4..47291b6 100644
--- a/source4/dsdb/repl/replicated_objects.c
+++ b/source4/dsdb/repl/replicated_objects.c
@@ -229,7 +229,7 @@ WERROR dsdb_extended_replicated_objects_commit(struct ldb_context *ldb,
 		return WERR_DS_SCHEMA_NOT_LOADED;
 	}
 
-	status = dsdb_verify_oid_mappings_drsuapi(schema, mapping_ctr);
+	status = dsdb_schema_pfm_contains_drsuapi_pfm(schema->prefixmap, mapping_ctr);
 	W_ERROR_NOT_OK_RETURN(status);
 
 	out = talloc_zero(mem_ctx, struct dsdb_extended_replicated_objects);
diff --git a/source4/dsdb/samdb/ldb_modules/rootdse.c b/source4/dsdb/samdb/ldb_modules/rootdse.c
index 5af951a..661060d 100644
--- a/source4/dsdb/samdb/ldb_modules/rootdse.c
+++ b/source4/dsdb/samdb/ldb_modules/rootdse.c
@@ -273,7 +273,7 @@ static int rootdse_add_dynamic(struct ldb_module *module, struct ldb_message *ms
 
 	if (schema && do_attribute_explicit(attrs, "dsSchemaPrefixCount")) {
 		if (ldb_msg_add_fmt(msg, "dsSchemaPrefixCount", 
-				    "%u", schema->num_prefixes) != 0) {
+				    "%u", schema->prefixmap->length) != 0) {
 			goto failed;
 		}
 	}
diff --git a/source4/dsdb/samdb/ldb_modules/schema_data.c b/source4/dsdb/samdb/ldb_modules/schema_data.c
index bf80c01..9951bd6 100644
--- a/source4/dsdb/samdb/ldb_modules/schema_data.c
+++ b/source4/dsdb/samdb/ldb_modules/schema_data.c
@@ -140,7 +140,7 @@ static int schema_data_add(struct ldb_module *module, struct ldb_request *req)
 	const struct ldb_val *governsID = NULL;
 	const char *oid_attr = NULL;
 	const char *oid = NULL;
-	uint32_t id32;
+	uint32_t attid;
 	WERROR status;
 
 	ldb = ldb_module_get_ctx(module);
@@ -184,7 +184,7 @@ static int schema_data_add(struct ldb_module *module, struct ldb_request *req)
 		return LDB_ERR_OPERATIONS_ERROR;
 	}
 		
-	status = dsdb_map_oid2int(schema, oid, &id32);
+	status = dsdb_schema_pfm_make_attid(schema->prefixmap, oid, &attid);
 	if (W_ERROR_IS_OK(status)) {
 		return ldb_next_request(module, req);
 	} else if (!W_ERROR_EQUAL(WERR_DS_NO_MSDS_INTID, status)) {
diff --git a/source4/dsdb/schema/schema.h b/source4/dsdb/schema/schema.h
index 175e999..033dc6e 100644
--- a/source4/dsdb/schema/schema.h
+++ b/source4/dsdb/schema/schema.h
@@ -158,15 +158,10 @@ struct dsdb_class {
 	uint32_t subClass_order;
 };
 
-struct dsdb_schema_oid_prefix {
-	uint32_t id;
-	const char *oid;
-	size_t oid_len;
-};
 
 struct dsdb_schema {
-	uint32_t num_prefixes;
-	struct dsdb_schema_oid_prefix *prefixes;
+
+	struct dsdb_schema_prefixmap *prefixmap;
 
 	/* 
 	 * the last element of the prefix mapping table isn't a oid,
diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c
index f8b7d5d..de370e0 100644
--- a/source4/dsdb/schema/schema_init.c
+++ b/source4/dsdb/schema/schema_init.c
@@ -31,7 +31,6 @@
 #include "lib/ldb/include/ldb_module.h"
 #include "../lib/util/asn1.h"
 
-static WERROR dsdb_read_prefixes_from_ldb(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, uint32_t* num_prefixes, struct dsdb_schema_oid_prefix **prefixes);
 
 struct dsdb_schema *dsdb_new_schema(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience)
 {
@@ -45,158 +44,119 @@ struct dsdb_schema *dsdb_new_schema(TALLOC_CTX *mem_ctx, struct smb_iconv_conven
 }
 
 
-WERROR dsdb_load_oid_mappings_drsuapi(struct dsdb_schema *schema, const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr)
+WERROR dsdb_load_prefixmap_from_drsuapi(struct dsdb_schema *schema,
+					const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr)
 {
-	uint32_t i,j;
+	WERROR werr;
+	const char *schema_info;
+	struct dsdb_schema_prefixmap *pfm;
 
-	schema->prefixes = talloc_array(schema, struct dsdb_schema_oid_prefix, ctr->num_mappings);
-	W_ERROR_HAVE_NO_MEMORY(schema->prefixes);
+	werr = dsdb_schema_pfm_from_drsuapi_pfm(ctr, true, schema, &pfm, &schema_info);
+	W_ERROR_NOT_OK_RETURN(werr);
 
-	for (i=0, j=0; i < ctr->num_mappings; i++) {
-		if (ctr->mappings[i].oid.binary_oid == NULL) {
-			return WERR_INVALID_PARAM;
-		}
+	/* set loaded prefixMap */
+	talloc_free(schema->prefixmap);
+	schema->prefixmap = pfm;
 
-		if (ctr->mappings[i].oid.binary_oid[0] == 0xFF) {
-			if (ctr->mappings[i].id_prefix != 0) {
-				return WERR_INVALID_PARAM;
-			}
-
-			/* the magic value should be in the last array member */
-			if (i != (ctr->num_mappings - 1)) {
-				return WERR_INVALID_PARAM;
-			}
-
-			if (ctr->mappings[i].oid.length != 21) {
-				return WERR_INVALID_PARAM;
-			}
-
-			schema->schema_info = hex_encode_talloc(schema,
-								ctr->mappings[i].oid.binary_oid,
-								ctr->mappings[i].oid.length);
-			W_ERROR_HAVE_NO_MEMORY(schema->schema_info);
-		} else {
-			DATA_BLOB oid_blob;
-			const char *partial_oid = NULL;
-
-			/* the last array member should contain the magic value not a oid */
-			if (i == (ctr->num_mappings - 1)) {
-				return WERR_INVALID_PARAM;
-			}
-
-			oid_blob = data_blob_const(ctr->mappings[i].oid.binary_oid,
-						   ctr->mappings[i].oid.length);
-			if (!ber_read_partial_OID_String(schema->prefixes, oid_blob, &partial_oid)) {
-				DEBUG(0, ("ber_read_partial_OID failed on prefixMap item with id: 0x%X",
-					  ctr->mappings[i].id_prefix));
-				return WERR_INVALID_PARAM;
-			}
-
-			schema->prefixes[j].id	= ctr->mappings[i].id_prefix<<16;
-			schema->prefixes[j].oid	= partial_oid;
-			W_ERROR_HAVE_NO_MEMORY(schema->prefixes[j].oid);
-			schema->prefixes[j].oid_len = strlen(schema->prefixes[j].oid);
-			j++;
-		}
-	}
+	talloc_free(discard_const(schema->schema_info));
+	schema->schema_info = schema_info;
 
-	schema->num_prefixes = j;
 	return WERR_OK;
 }
 
-WERROR dsdb_load_oid_mappings_ldb(struct dsdb_schema *schema,
-				  const struct ldb_val *prefixMap,
-				  const struct ldb_val *schemaInfo)
+static WERROR _dsdb_prefixmap_from_ldb_val(const struct ldb_val *pfm_ldb_val,
+					   struct smb_iconv_convenience *iconv_convenience,
+					   TALLOC_CTX *mem_ctx,
+					   struct dsdb_schema_prefixmap **_pfm)
 {
-	WERROR status;
+	WERROR werr;
 	enum ndr_err_code ndr_err;
-	struct prefixMapBlob pfm;
-	DATA_BLOB schema_info_blob;
+	struct prefixMapBlob pfm_blob;
 
-	TALLOC_CTX *mem_ctx = talloc_new(schema);
-	W_ERROR_HAVE_NO_MEMORY(mem_ctx);
-	
-	ndr_err = ndr_pull_struct_blob(prefixMap, mem_ctx, schema->iconv_convenience, &pfm, (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob);
+	TALLOC_CTX *temp_ctx = talloc_new(mem_ctx);
+	W_ERROR_HAVE_NO_MEMORY(temp_ctx);
+
+	ndr_err = ndr_pull_struct_blob(pfm_ldb_val, temp_ctx,
+				iconv_convenience, &pfm_blob,
+				(ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob);
 	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
 		NTSTATUS nt_status = ndr_map_error2ntstatus(ndr_err);
-		talloc_free(mem_ctx);
+		talloc_free(temp_ctx);
 		return ntstatus_to_werror(nt_status);
 	}
 
-	if (pfm.version != PREFIX_MAP_VERSION_DSDB) {
-		talloc_free(mem_ctx);
-		return WERR_FOOBAR;
-	}
-
-	if (schemaInfo->length != 21 && schemaInfo->data[0] == 0xFF) {
-		talloc_free(mem_ctx);
-		return WERR_FOOBAR;
+	if (pfm_blob.version != PREFIX_MAP_VERSION_DSDB) {
+		DEBUG(0,("_dsdb_prefixmap_from_ldb_val: pfm_blob->version incorrect\n"));
+		talloc_free(temp_ctx);
+		return WERR_VERSION_PARSE_ERROR;
 	}
 
-	/* append the schema info as last element */
-	pfm.ctr.dsdb.num_mappings++;
-	pfm.ctr.dsdb.mappings = talloc_realloc(mem_ctx, pfm.ctr.dsdb.mappings,
-					       struct drsuapi_DsReplicaOIDMapping,
-					       pfm.ctr.dsdb.num_mappings);
-	W_ERROR_HAVE_NO_MEMORY(pfm.ctr.dsdb.mappings);
-
-	schema_info_blob = data_blob_dup_talloc(pfm.ctr.dsdb.mappings, schemaInfo);
-	W_ERROR_HAVE_NO_MEMORY(schema_info_blob.data);
-
-	pfm.ctr.dsdb.mappings[pfm.ctr.dsdb.num_mappings - 1].id_prefix		= 0;	
-	pfm.ctr.dsdb.mappings[pfm.ctr.dsdb.num_mappings - 1].oid.length		= schemaInfo->length;
-	pfm.ctr.dsdb.mappings[pfm.ctr.dsdb.num_mappings - 1].oid.binary_oid	= schema_info_blob.data;
-
 	/* call the drsuapi version */
-	status = dsdb_load_oid_mappings_drsuapi(schema, &pfm.ctr.dsdb);
-	talloc_free(mem_ctx);
+	werr = dsdb_schema_pfm_from_drsuapi_pfm(&pfm_blob.ctr.dsdb, false, mem_ctx, _pfm, NULL);
 
-	W_ERROR_NOT_OK_RETURN(status);
+	talloc_free(temp_ctx);
 
-	return WERR_OK;
+	return werr;
 }
 
-WERROR dsdb_get_oid_mappings_drsuapi(const struct dsdb_schema *schema,
-				     bool include_schema_info,
-				     TALLOC_CTX *mem_ctx,
-				     struct drsuapi_DsReplicaOIDMapping_Ctr **_ctr)
+WERROR dsdb_load_oid_mappings_ldb(struct dsdb_schema *schema,
+				  const struct ldb_val *prefixMap,
+				  const struct ldb_val *schemaInfo)
 {
-	DATA_BLOB oid_blob;
-	struct drsuapi_DsReplicaOIDMapping_Ctr *ctr;
-	uint32_t i;
+	WERROR status;
+	const char *schema_info;
+	struct dsdb_schema_prefixmap *pfm;
+	TALLOC_CTX *mem_ctx;
 
-	ctr = talloc(mem_ctx, struct drsuapi_DsReplicaOIDMapping_Ctr);
-	W_ERROR_HAVE_NO_MEMORY(ctr);
+	/* verify input params */
+	if (schemaInfo->length != 21) {
+		return WERR_INVALID_PARAMETER;
+	}
+	if (schemaInfo->data[0] != 0xFF) {
+		return WERR_INVALID_PARAMETER;
+	}
 
-	ctr->num_mappings	= schema->num_prefixes;
-	if (include_schema_info) ctr->num_mappings++;
-	ctr->mappings = talloc_array(schema, struct drsuapi_DsReplicaOIDMapping, ctr->num_mappings);
-	W_ERROR_HAVE_NO_MEMORY(ctr->mappings);
+	mem_ctx = talloc_new(schema);
+	W_ERROR_HAVE_NO_MEMORY(mem_ctx);
 
-	for (i=0; i < schema->num_prefixes; i++) {
-		if (!ber_write_partial_OID_String(ctr->mappings, &oid_blob, schema->prefixes[i].oid)) {
-			DEBUG(0, ("write_partial_OID failed for %s", schema->prefixes[i].oid));
-			return WERR_INTERNAL_ERROR;
-		}
+	/* fetch prefixMap */
+	status = _dsdb_prefixmap_from_ldb_val(prefixMap,
+					      schema->iconv_convenience,
+					      mem_ctx, &pfm);
+	W_ERROR_NOT_OK_RETURN(status);
 
-		ctr->mappings[i].id_prefix	= schema->prefixes[i].id>>16;
-		ctr->mappings[i].oid.length	= oid_blob.length;
-		ctr->mappings[i].oid.binary_oid	= oid_blob.data;
+	/* decode schema_info */
+	schema_info = hex_encode_talloc(mem_ctx,
+					schemaInfo->data,
+					schemaInfo->length);
+	if (!schema_info) {
+		talloc_free(mem_ctx);
+		return WERR_NOMEM;
 	}
 
-	if (include_schema_info) {
-		oid_blob = strhex_to_data_blob(ctr->mappings, schema->schema_info);
-		W_ERROR_HAVE_NO_MEMORY(oid_blob.data);
+	/* store prefixMap and schema_info into cached Schema */
+	talloc_free(schema->prefixmap);
+	schema->prefixmap = talloc_steal(schema, pfm);
 
-		ctr->mappings[i].id_prefix	= 0;
-		ctr->mappings[i].oid.length	= oid_blob.length;
-		ctr->mappings[i].oid.binary_oid	= oid_blob.data;
-	}
+	talloc_free(discard_const(schema->schema_info));
+	schema->schema_info = talloc_steal(schema, schema_info);
+
+	/* clean up locally allocated mem */
+	talloc_free(mem_ctx);
 
-	*_ctr = ctr;
 	return WERR_OK;
 }
 
+WERROR dsdb_get_oid_mappings_drsuapi(const struct dsdb_schema *schema,
+				     bool include_schema_info,
+				     TALLOC_CTX *mem_ctx,
+				     struct drsuapi_DsReplicaOIDMapping_Ctr **_ctr)
+{
+	return dsdb_drsuapi_pfm_from_schema_pfm(schema->prefixmap,
+						include_schema_info ? schema->schema_info : NULL,
+						mem_ctx, _ctr);
+}
+
 WERROR dsdb_get_oid_mappings_ldb(const struct dsdb_schema *schema,
 				 TALLOC_CTX *mem_ctx,
 				 struct ldb_val *prefixMap,
@@ -214,7 +174,8 @@ WERROR dsdb_get_oid_mappings_ldb(const struct dsdb_schema *schema,
 	pfm.reserved	= 0;
 	pfm.ctr.dsdb	= *ctr;
 
-	ndr_err = ndr_push_struct_blob(prefixMap, mem_ctx, schema->iconv_convenience, &pfm, (ndr_push_flags_fn_t)ndr_push_prefixMapBlob);
+	ndr_err = ndr_push_struct_blob(prefixMap, mem_ctx, schema->iconv_convenience, &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);
@@ -227,105 +188,6 @@ WERROR dsdb_get_oid_mappings_ldb(const struct dsdb_schema *schema,
 	return WERR_OK;
 }
 
-WERROR dsdb_verify_oid_mappings_drsuapi(const struct dsdb_schema *schema, const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr)
-{
-	uint32_t i,j;
-	DATA_BLOB oid_blob;
-
-	for (i=0; i < ctr->num_mappings; i++) {
-		if (ctr->mappings[i].oid.binary_oid == NULL) {
-			return WERR_INVALID_PARAM;
-		}
-
-		if (ctr->mappings[i].oid.binary_oid[0] == 0xFF) {
-			if (ctr->mappings[i].id_prefix != 0) {
-				return WERR_INVALID_PARAM;
-			}
-
-			/* the magic value should be in the last array member */
-			if (i != (ctr->num_mappings - 1)) {
-				return WERR_INVALID_PARAM;
-			}
-
-			if (ctr->mappings[i].oid.length != 21) {
-				return WERR_INVALID_PARAM;
-			}
-
-			oid_blob = strhex_to_data_blob(NULL, schema->schema_info);
-			W_ERROR_HAVE_NO_MEMORY(oid_blob.data);
-
-			if (memcmp(oid_blob.data, ctr->mappings[i].oid.binary_oid, 21) != 0) {
-				data_blob_free(&oid_blob);
-				return WERR_DS_DRA_SCHEMA_MISMATCH;
-			}
-
-			data_blob_free(&oid_blob);
-		} else {
-			/* the last array member should contain the magic value not a oid */
-			if (i == (ctr->num_mappings - 1)) {
-				return WERR_INVALID_PARAM;
-			}
-
-			for (j=0; j < schema->num_prefixes; j++) {
-				if (schema->prefixes[j].id != (ctr->mappings[i].id_prefix<<16)) {
-					continue;
-				}
-
-				if (!ber_write_partial_OID_String(NULL, &oid_blob, schema->prefixes[j].oid)) {
-					return WERR_INTERNAL_ERROR;
-				}
-
-				if (oid_blob.length != ctr->mappings[j].oid.length) {
-					data_blob_free(&oid_blob);
-					return WERR_DS_DRA_SCHEMA_MISMATCH;
-				}
-
-				if (memcmp(ctr->mappings[i].oid.binary_oid, oid_blob.data, oid_blob.length) != 0) {
-					data_blob_free(&oid_blob);
-					return WERR_DS_DRA_SCHEMA_MISMATCH;
-				}
-
-				data_blob_free(&oid_blob);
-
-				break;
-			}
-
-			if (j == schema->num_prefixes) {
-				return WERR_DS_DRA_SCHEMA_MISMATCH;				
-			}
-		}
-	}
-
-	return WERR_OK;
-}
-
-WERROR dsdb_map_oid2int(const struct dsdb_schema *schema, const char *in, uint32_t *out)
-{
-	return dsdb_find_prefix_for_oid(schema->num_prefixes, schema->prefixes, in, out);
-}
-
-
-WERROR dsdb_map_int2oid(const struct dsdb_schema *schema, uint32_t in, TALLOC_CTX *mem_ctx, const char **out)
-{
-	uint32_t i;
-
-	for (i=0; i < schema->num_prefixes; i++) {
-		const char *val;
-		if (schema->prefixes[i].id != (in & 0xFFFF0000)) {
-			continue;
-		}
-
-		val = talloc_asprintf(mem_ctx, "%s.%u",
-				      schema->prefixes[i].oid,
-				      in & 0xFFFF);
-		W_ERROR_HAVE_NO_MEMORY(val);
-
-		*out = val;
-		return WERR_OK;
-	}
-
-	return WERR_DS_NO_MSDS_INTID;
-}
 
 /*
  * this function is called from within a ldb transaction from the schema_fsmo module
@@ -333,16 +195,15 @@ WERROR dsdb_map_int2oid(const struct dsdb_schema *schema, uint32_t in, TALLOC_CT
 WERROR dsdb_create_prefix_mapping(struct ldb_context *ldb, struct dsdb_schema *schema, const char *full_oid)
 {
 	WERROR status;
-	uint32_t num_prefixes;
-	struct dsdb_schema_oid_prefix *prefixes;
+	uint32_t attid;
 	TALLOC_CTX *mem_ctx;
-	uint32_t out;
+	struct dsdb_schema_prefixmap *pfm;
 
 	mem_ctx = talloc_new(ldb);
 	W_ERROR_HAVE_NO_MEMORY(mem_ctx);
 
 	/* Read prefixes from disk*/
-	status = dsdb_read_prefixes_from_ldb( mem_ctx, ldb, &num_prefixes, &prefixes ); 
+	status = dsdb_read_prefixes_from_ldb(ldb, mem_ctx, &pfm);
 	if (!W_ERROR_IS_OK(status)) {
 		DEBUG(0,("dsdb_create_prefix_mapping: dsdb_read_prefixes_from_ldb: %s\n",
 			win_errstr(status)));
@@ -351,7 +212,7 @@ WERROR dsdb_create_prefix_mapping(struct ldb_context *ldb, struct dsdb_schema *s
 	}
 
 	/* Check if there is a prefix for the oid in the prefixes array*/
-	status = dsdb_find_prefix_for_oid( num_prefixes, prefixes, full_oid, &out ); 
+	status = dsdb_schema_pfm_find_oid(pfm, full_oid, NULL);
 	if (W_ERROR_IS_OK(status)) {
 		/* prefix found*/
 		talloc_free(mem_ctx);
@@ -365,17 +226,16 @@ WERROR dsdb_create_prefix_mapping(struct ldb_context *ldb, struct dsdb_schema *s
 	}
 
 	/* Create the new mapping for the prefix of full_oid */
-	status = dsdb_prefix_map_update(mem_ctx, &num_prefixes, &prefixes, full_oid);
+	status = dsdb_schema_pfm_make_attid(pfm, full_oid, &attid);
 	if (!W_ERROR_IS_OK(status)) {
-		DEBUG(0,("dsdb_create_prefix_mapping: dsdb_prefix_map_update: %s\n",
+		DEBUG(0,("dsdb_create_prefix_mapping: dsdb_schema_pfm_make_attid: %s\n",
 			win_errstr(status)));
 		talloc_free(mem_ctx);
 		return status;
 	}
 
-	talloc_free(schema->prefixes);
-	schema->prefixes = talloc_steal(schema, prefixes);
-	schema->num_prefixes = num_prefixes;
+	talloc_unlink(schema, schema->prefixmap);
+	schema->prefixmap = talloc_steal(schema, pfm);
 
 	/* Update prefixMap in ldb*/
 	status = dsdb_write_prefixes_from_schema_to_ldb(mem_ctx, ldb, schema);
@@ -387,166 +247,74 @@ WERROR dsdb_create_prefix_mapping(struct ldb_context *ldb, struct dsdb_schema *s
 	}
 
 	DEBUG(2,(__location__ " Added prefixMap %s - now have %u prefixes\n",
-		 full_oid, num_prefixes));
+		 full_oid, schema->prefixmap->length));
 
 	talloc_free(mem_ctx);
 	return status;
 }
 
-WERROR dsdb_prefix_map_update(TALLOC_CTX *mem_ctx, uint32_t *num_prefixes, struct dsdb_schema_oid_prefix **prefixes, const char *oid)
-{
-	uint32_t new_num_prefixes, index_new_prefix, new_entry_id;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list