WIP: Add drs_convert context for dsdb_syntax conversion functions
authorKamen Mazdrashki <kamenim@samba.org>
Sat, 14 Aug 2010 00:23:57 +0000 (03:23 +0300)
committerKamen Mazdrashki <kamenim@samba.org>
Sat, 14 Aug 2010 00:26:41 +0000 (03:26 +0300)
This structure is intended to hold context-dependent data.

Syntax-conversion and object-conversion functions need
that data to convert objects and attributes from drs-to-ldb
and ldb-to-drs correctly.

For instance: ATTID value depends on whether we are converting
object from partition different that Schema partition.

source4/dsdb/schema/schema.h
source4/dsdb/schema/schema_syntax.c
source4/rpc_server/drsuapi/getncchanges.c

index 34423be8090155a33a65d168c7d7ec134f2c0781..9e9af7320debd9120ea28a6be3130e6a619fa4ba 100644 (file)
@@ -28,6 +28,15 @@ struct dsdb_attribute;
 struct dsdb_class;
 struct dsdb_schema;
 
+struct dsdb_drs_convert_ctx {
+       const struct ldb_context *ldb;
+       const struct dsdb_schema *schema;
+
+       /* flags is set when converting Schema partition */
+       bool schema_partition;
+};
+
+
 struct dsdb_syntax {
        const char *name;
        const char *ldap_oid;
@@ -45,8 +54,7 @@ struct dsdb_syntax {
                                 const struct drsuapi_DsReplicaAttribute *in,
                                 TALLOC_CTX *mem_ctx,
                                 struct ldb_message_element *out);
-       WERROR (*ldb_to_drsuapi)(struct ldb_context *ldb, 
-                                const struct dsdb_schema *schema,
+       WERROR (*ldb_to_drsuapi)(const struct dsdb_drs_convert_ctx *ctx,
                                 const struct dsdb_attribute *attr,
                                 const struct ldb_message_element *in,
                                 TALLOC_CTX *mem_ctx,
index 193d62dfcca3bcf11e7275c8cfb142abb80e0071..27e635c3dd2364bbf7e9244f0d1ce6518b455c71 100644 (file)
 #include "../lib/util/charset/charset.h"
 #include "librpc/ndr/libndr.h"
 
+inline static uint32_t dsdb_attribute_attributeID_id(const struct dsdb_attribute *attr,
+                                                    bool for_schema_partition)
+{
+       if (!for_schema_partition && attr->msDS_IntId) {
+               return attr->msDS_IntId;
+       }
+
+       return attr->attributeID_id;
+}
+
 static WERROR dsdb_syntax_FOOBAR_drsuapi_to_ldb(struct ldb_context *ldb, 
                                                const struct dsdb_schema *schema,
                                                const struct dsdb_attribute *attr,
@@ -128,8 +138,7 @@ static WERROR dsdb_syntax_BOOL_drsuapi_to_ldb(struct ldb_context *ldb,
        return WERR_OK;
 }
 
-static WERROR dsdb_syntax_BOOL_ldb_to_drsuapi(struct ldb_context *ldb, 
-                                             const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_BOOL_ldb_to_drsuapi(const struct dsdb_drs_convert_ctx *ctx,
                                              const struct dsdb_attribute *attr,
                                              const struct ldb_message_element *in,
                                              TALLOC_CTX *mem_ctx,
@@ -142,7 +151,7 @@ static WERROR dsdb_syntax_BOOL_ldb_to_drsuapi(struct ldb_context *ldb,
                return WERR_FOOBAR;
        }
 
-       out->attid                      = attr->attributeID_id;
+       out->attid                      = dsdb_attribute_attributeID_id(attr);
        out->value_ctr.num_values       = in->num_values;
        out->value_ctr.values           = talloc_array(mem_ctx,
                                                       struct drsuapi_DsAttributeValue,
index cea5fc99c6291022d2c68561c38d45507ccd9f81..fbdad9efb0c5d9b581c2be04183ad895d5c46b82 100644 (file)
@@ -90,6 +90,7 @@ static WERROR get_nc_changes_build_object(struct drsuapi_DsReplicaObjectListItem
                                          struct ldb_message *msg,
                                          struct ldb_context *sam_ctx,
                                          struct ldb_dn *ncRoot_dn,
+                                         bool is_schema_nc,
                                          struct dsdb_schema *schema,
                                          DATA_BLOB *session_key,
                                          uint64_t highest_usn,
@@ -105,6 +106,7 @@ static WERROR get_nc_changes_build_object(struct drsuapi_DsReplicaObjectListItem
        const char *rdn;
        const struct dsdb_attribute *rdn_sa;
        unsigned int instanceType;
+       struct dsdb_drs_convert_ctx conv_ctx;
 
        instanceType = ldb_msg_find_attr_as_uint(msg, "instanceType", 0);
        if (instanceType & INSTANCE_TYPE_IS_NC_HEAD) {
@@ -242,6 +244,9 @@ static WERROR get_nc_changes_build_object(struct drsuapi_DsReplicaObjectListItem
        obj->object.attribute_ctr.attributes = talloc_array(obj, struct drsuapi_DsReplicaAttribute,
                                                            obj->object.attribute_ctr.num_attributes);
 
+       /* initialize dsdb_drs_convert_ctx to use for conversions */
+       dsdb_drs_convert_ctx_init(&conv_ctx, sam_ctx, schema);
+
        /*
         * Note that the meta_data array and the attributes array must
         * be the same size and in the same order
@@ -265,7 +270,7 @@ static WERROR get_nc_changes_build_object(struct drsuapi_DsReplicaObjectListItem
                        ZERO_STRUCT(obj->object.attribute_ctr.attributes[i]);
                        obj->object.attribute_ctr.attributes[i].attid = attids[i];
                } else {
-                       werr = dsdb_attribute_ldb_to_drsuapi(sam_ctx, schema, el, obj,
+                       werr = dsdb_attribute_ldb_to_drsuapi(&conv_ctx, el, obj,
                                                             &obj->object.attribute_ctr.attributes[i]);
                        if (!W_ERROR_IS_OK(werr)) {
                                DEBUG(0,("Unable to convert %s to DRS object - %s\n", 
@@ -660,6 +665,7 @@ struct drsuapi_getncchanges_state {
        struct ldb_result *site_res;
        uint32_t num_sent;
        struct ldb_dn *ncRoot_dn;
+       bool is_schema_nc;
        uint64_t min_usn;
        uint64_t highest_usn;
        struct ldb_dn *last_dn;
@@ -827,6 +833,9 @@ WERROR dcesrv_drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_
                }
                b_state->getncchanges_state = getnc_state;
                getnc_state->ncRoot_dn = ldb_dn_new(getnc_state, b_state->sam_ctx, ncRoot->dn);
+               ret = ldb_dn_compare(getnc_state->ncRoot_dn,
+                                     ldb_get_schema_basedn(b_state->sam_ctx));
+               getnc_state->is_schema_nc = (0 == ret);
        }
 
        if (!ldb_dn_validate(getnc_state->ncRoot_dn) ||
@@ -961,7 +970,8 @@ WERROR dcesrv_drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_
                obj = talloc_zero(mem_ctx, struct drsuapi_DsReplicaObjectListItemEx);
 
                werr = get_nc_changes_build_object(obj, msg,
-                                                  b_state->sam_ctx, getnc_state->ncRoot_dn, 
+                                                  b_state->sam_ctx,
+                                                  getnc_state->ncRoot_dn, getnc_state->is_schema_nc,
                                                   schema, &session_key, getnc_state->min_usn,
                                                   req8->replica_flags, getnc_state->uptodateness_vector);
                if (!W_ERROR_IS_OK(werr)) {