s4-repl: Propagate remote prefixMap in DRSUAPI data conversion functions
authorKamen Mazdrashki <kamenim@samba.org>
Wed, 10 Nov 2010 01:45:22 +0000 (03:45 +0200)
committerKamen Mazdrashki <kamenim@samba.org>
Thu, 11 Nov 2010 18:54:20 +0000 (18:54 +0000)
source4/dsdb/repl/replicated_objects.c
source4/dsdb/schema/schema_syntax.c
source4/libnet/libnet_vampire.c

index 5e182776297c3ce322e8cc54c2054fb50fcc2880..58243349b905e35b461b50505fb7e5c993fd03df 100644 (file)
@@ -33,6 +33,7 @@
 
 WERROR dsdb_convert_object_ex(struct ldb_context *ldb,
                              const struct dsdb_schema *schema,
+                             const struct dsdb_schema_prefixmap *pfm_remote,
                              const struct drsuapi_DsReplicaObjectListItemEx *in,
                              const DATA_BLOB *gensec_skey,
                              TALLOC_CTX *mem_ctx,
@@ -127,7 +128,8 @@ WERROR dsdb_convert_object_ex(struct ldb_context *ldb,
                        W_ERROR_NOT_OK_RETURN(status);
                }
 
-               status = dsdb_attribute_drsuapi_to_ldb(ldb, schema, a, msg->elements, e);
+               status = dsdb_attribute_drsuapi_to_ldb(ldb, schema, pfm_remote,
+                                                      a, msg->elements, e);
                W_ERROR_NOT_OK_RETURN(status);
 
                m->attid                        = a->attid;
@@ -212,6 +214,7 @@ WERROR dsdb_replicated_objects_convert(struct ldb_context *ldb,
        WERROR status;
        struct ldb_dn *partition_dn;
        const struct dsdb_schema *schema;
+       struct dsdb_schema_prefixmap *pfm_remote;
        struct dsdb_extended_replicated_objects *out;
        const struct drsuapi_DsReplicaObjectListItemEx *cur;
        uint32_t i;
@@ -230,6 +233,15 @@ WERROR dsdb_replicated_objects_convert(struct ldb_context *ldb,
        partition_dn = ldb_dn_new(out, ldb, partition_dn_str);
        W_ERROR_HAVE_NO_MEMORY_AND_FREE(partition_dn, out);
 
+       status = dsdb_schema_pfm_from_drsuapi_pfm(mapping_ctr, true,
+                                                 out, &pfm_remote, NULL);
+       if (!W_ERROR_IS_OK(status)) {
+               DEBUG(0,(__location__ ": Failed to decode remote prefixMap: %s",
+                        win_errstr(status)));
+               talloc_free(out);
+               return status;
+       }
+
        if (ldb_dn_compare(partition_dn, ldb_get_schema_basedn(ldb)) != 0) {
                /*
                 * check for schema changes in case
@@ -266,7 +278,7 @@ WERROR dsdb_replicated_objects_convert(struct ldb_context *ldb,
                        return WERR_FOOBAR;
                }
 
-               status = dsdb_convert_object_ex(ldb, schema,
+               status = dsdb_convert_object_ex(ldb, schema, pfm_remote,
                                                cur, gensec_skey,
                                                out->objects, &out->objects[i]);
                if (!W_ERROR_IS_OK(status)) {
@@ -282,6 +294,9 @@ WERROR dsdb_replicated_objects_convert(struct ldb_context *ldb,
                return WERR_FOOBAR;
        }
 
+       /* free pfm_remote, we won't need it anymore */
+       talloc_free(pfm_remote);
+
        *objects = out;
        return WERR_OK;
 }
@@ -392,7 +407,8 @@ static WERROR dsdb_origin_object_convert(struct ldb_context *ldb,
                a = &in->object.attribute_ctr.attributes[i];
                e = &msg->elements[i];
 
-               status = dsdb_attribute_drsuapi_to_ldb(ldb, schema, a, msg->elements, e);
+               status = dsdb_attribute_drsuapi_to_ldb(ldb, schema, schema->prefixmap,
+                                                      a, msg->elements, e);
                W_ERROR_NOT_OK_RETURN(status);
        }
 
index bdc78d20b025bc6dce1a9c9d751971269126a082..0d1d27451905d73dfc52dba33937d94b0e82891d 100644 (file)
@@ -2586,6 +2586,7 @@ const struct dsdb_syntax *dsdb_syntax_for_attribute(const struct dsdb_attribute
 
 WERROR dsdb_attribute_drsuapi_to_ldb(struct ldb_context *ldb,
                                     const struct dsdb_schema *schema,
+                                    const struct dsdb_schema_prefixmap *pfm_remote,
                                     const struct drsuapi_DsReplicaAttribute *in,
                                     TALLOC_CTX *mem_ctx,
                                     struct ldb_message_element *out)
@@ -2601,6 +2602,7 @@ WERROR dsdb_attribute_drsuapi_to_ldb(struct ldb_context *ldb,
 
        /* use default syntax conversion context */
        dsdb_syntax_ctx_init(&syntax_ctx, ldb, schema);
+       syntax_ctx.pfm_remote = pfm_remote;
 
        return sa->syntax->drsuapi_to_ldb(&syntax_ctx, sa, in, mem_ctx, out);
 }
index cb89213fcf2b9441f8f1d3e7168f9ef2bbb52f38..164dcdec764130d9b33359b669170c5371924417 100644 (file)
@@ -225,6 +225,7 @@ static NTSTATUS libnet_vampire_cb_apply_schema(struct libnet_vampire_cb_state *s
        };
 
        WERROR status;
+       struct dsdb_schema_prefixmap *pfm_remote;
        const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr;
        struct schema_list *schema_list = NULL, *schema_list_item, *schema_list_next_item;
        struct dsdb_schema *working_schema;
@@ -280,6 +281,14 @@ static NTSTATUS libnet_vampire_cb_apply_schema(struct libnet_vampire_cb_state *s
                return NT_STATUS_INVALID_PARAMETER;
        }
 
+       status = dsdb_schema_pfm_from_drsuapi_pfm(mapping_ctr, true,
+                                                 s, &pfm_remote, NULL);
+       if (!W_ERROR_IS_OK(status)) {
+               DEBUG(0,(__location__ ": Failed to decode remote prefixMap: %s",
+                        win_errstr(status)));
+               return werror_to_ntstatus(status);
+       }
+
        s_dsa->replica_flags            = DRSUAPI_DRS_WRIT_REP
                                        | DRSUAPI_DRS_INIT_SYNC
                                        | DRSUAPI_DRS_PER_SYNC;
@@ -338,7 +347,7 @@ static NTSTATUS libnet_vampire_cb_apply_schema(struct libnet_vampire_cb_state *s
                         * schema we have so far. It's ok if we fail to convert
                         * an object. We should convert more objects on next pass.
                         */
-                       status = dsdb_convert_object_ex(s->ldb, working_schema,
+                       status = dsdb_convert_object_ex(s->ldb, working_schema, pfm_remote,
                                                        cur, c->gensec_skey,
                                                        tmp_ctx, &object);
                        if (!W_ERROR_IS_OK(status)) {