s4:dsdb/repl/replicated_objects - Applicate also here the new "lDAPDisplayName" generator
[ira/wip.git] / source4 / dsdb / repl / replicated_objects.c
index 5ae622eeaad300b50cc72dcd395d9f6fae664c98..043c620f523b20834f2df04b1c68209b1d43d91e 100644 (file)
@@ -153,7 +153,10 @@ static WERROR dsdb_convert_object_ex(struct ldb_context *ldb,
                struct ldb_message_element *el;
                el = ldb_msg_find_element(msg, rdn_attr->lDAPDisplayName);
                if (!el) {
-                       ret = ldb_msg_add_value(msg, rdn_attr->lDAPDisplayName, rdn_value, NULL);
+                       /* we assume that the RDN has prefix "CN" */
+                       ret = ldb_msg_add_string(msg, rdn_attr->lDAPDisplayName,
+                               samdb_cn_to_lDAPDisplayName(mem_ctx,
+                                       (const char *) rdn_value->data));
                        if (ret != LDB_SUCCESS) {
                                return WERR_FOOBAR;
                        }
@@ -201,35 +204,31 @@ static WERROR dsdb_convert_object_ex(struct ldb_context *ldb,
        return WERR_OK;
 }
 
-WERROR dsdb_extended_replicated_objects_commit(struct ldb_context *ldb,
-                                              const char *partition_dn,
-                                              const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr,
-                                              uint32_t object_count,
-                                              const struct drsuapi_DsReplicaObjectListItemEx *first_object,
-                                              uint32_t linked_attributes_count,
-                                              const struct drsuapi_DsReplicaLinkedAttribute *linked_attributes,
-                                              const struct repsFromTo1 *source_dsa,
-                                              const struct drsuapi_DsReplicaCursor2CtrEx *uptodateness_vector,
-                                              const DATA_BLOB *gensec_skey,
-                                              TALLOC_CTX *mem_ctx,
-                                              struct dsdb_extended_replicated_objects **_out,
-                                              uint64_t *notify_uSN)
+WERROR dsdb_extended_replicated_objects_convert(struct ldb_context *ldb,
+                                               const char *partition_dn,
+                                               const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr,
+                                               uint32_t object_count,
+                                               const struct drsuapi_DsReplicaObjectListItemEx *first_object,
+                                               uint32_t linked_attributes_count,
+                                               const struct drsuapi_DsReplicaLinkedAttribute *linked_attributes,
+                                               const struct repsFromTo1 *source_dsa,
+                                               const struct drsuapi_DsReplicaCursor2CtrEx *uptodateness_vector,
+                                               const DATA_BLOB *gensec_skey,
+                                               TALLOC_CTX *mem_ctx,
+                                               struct dsdb_extended_replicated_objects **objects)
 {
        WERROR status;
        const struct dsdb_schema *schema;
        struct dsdb_extended_replicated_objects *out;
-       struct ldb_result *ext_res;
        const struct drsuapi_DsReplicaObjectListItemEx *cur;
        uint32_t i;
-       int ret;
-       uint64_t seq_num1, seq_num2;
 
        schema = dsdb_get_schema(ldb);
        if (!schema) {
                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);
@@ -270,6 +269,18 @@ WERROR dsdb_extended_replicated_objects_commit(struct ldb_context *ldb,
                return WERR_FOOBAR;
        }
 
+       *objects = out;
+       return WERR_OK;
+}
+
+WERROR dsdb_extended_replicated_objects_commit(struct ldb_context *ldb,
+                                              struct dsdb_extended_replicated_objects *objects,
+                                              uint64_t *notify_uSN)
+{
+       struct ldb_result *ext_res;
+       int ret;
+       uint64_t seq_num1, seq_num2;
+
        /* TODO: handle linked attributes */
 
        /* wrap the extended operation in a transaction 
@@ -278,23 +289,20 @@ WERROR dsdb_extended_replicated_objects_commit(struct ldb_context *ldb,
        ret = ldb_transaction_start(ldb);
        if (ret != LDB_SUCCESS) {
                DEBUG(0,(__location__ " Failed to start transaction\n"));
-               talloc_free(out);
                return WERR_FOOBAR;
        }
 
-       ret = dsdb_load_partition_usn(ldb, out->partition_dn, &seq_num1);
+       ret = dsdb_load_partition_usn(ldb, objects->partition_dn, &seq_num1);
        if (ret != LDB_SUCCESS) {
                DEBUG(0,(__location__ " Failed to load partition uSN\n"));
-               talloc_free(out);
                ldb_transaction_cancel(ldb);
                return WERR_FOOBAR;             
        }
 
-       ret = ldb_extended(ldb, DSDB_EXTENDED_REPLICATED_OBJECTS_OID, out, &ext_res);
+       ret = ldb_extended(ldb, DSDB_EXTENDED_REPLICATED_OBJECTS_OID, objects, &ext_res);
        if (ret != LDB_SUCCESS) {
                DEBUG(0,("Failed to apply records: %s: %s\n",
                         ldb_errstring(ldb), ldb_strerror(ret)));
-               talloc_free(out);
                ldb_transaction_cancel(ldb);
                return WERR_FOOBAR;
        }
@@ -303,14 +311,12 @@ WERROR dsdb_extended_replicated_objects_commit(struct ldb_context *ldb,
        ret = ldb_transaction_prepare_commit(ldb);
        if (ret != LDB_SUCCESS) {
                DEBUG(0,(__location__ " Failed to prepare commit of transaction\n"));
-               talloc_free(out);
                return WERR_FOOBAR;
        }
 
-       ret = dsdb_load_partition_usn(ldb, out->partition_dn, &seq_num2);
+       ret = dsdb_load_partition_usn(ldb, objects->partition_dn, &seq_num2);
        if (ret != LDB_SUCCESS) {
                DEBUG(0,(__location__ " Failed to load partition uSN\n"));
-               talloc_free(out);
                ldb_transaction_cancel(ldb);
                return WERR_FOOBAR;             
        }
@@ -325,22 +331,14 @@ WERROR dsdb_extended_replicated_objects_commit(struct ldb_context *ldb,
        ret = ldb_transaction_commit(ldb);
        if (ret != LDB_SUCCESS) {
                DEBUG(0,(__location__ " Failed to commit transaction\n"));
-               talloc_free(out);
                return WERR_FOOBAR;
        }
 
 
        DEBUG(2,("Replicated %u objects (%u linked attributes) for %s\n",
-                out->num_objects, out->linked_attributes_count,
-                ldb_dn_get_linearized(out->partition_dn)));
+                objects->num_objects, objects->linked_attributes_count,
+                ldb_dn_get_linearized(objects->partition_dn)));
                 
-
-       if (_out) {
-               *_out = out;
-       } else {
-               talloc_free(out);
-       }
-
        return WERR_OK;
 }
 
@@ -424,31 +422,78 @@ WERROR dsdb_origin_objects_commit(struct ldb_context *ldb,
                return WERR_OK;
        }
 
+       ret = ldb_transaction_start(ldb);
+       if (ret != LDB_SUCCESS) {
+               return WERR_DS_INTERNAL_FAILURE;
+       }
+
        objects = talloc_array(mem_ctx, struct ldb_message *,
                               num_objects);
-       W_ERROR_HAVE_NO_MEMORY(objects);
+       if (objects == NULL) {
+               status = WERR_NOMEM;
+               goto cancel;
+       }
 
        for (i=0, cur = first_object; cur; cur = cur->next_object, i++) {
                status = dsdb_convert_object(ldb, schema,
                                             cur, objects, &objects[i]);
-               W_ERROR_NOT_OK_RETURN(status);
+               if (!W_ERROR_IS_OK(status)) {
+                       goto cancel;
+               }
        }
 
        ids = talloc_array(mem_ctx,
                           struct drsuapi_DsReplicaObjectIdentifier2,
                           num_objects);
-       W_ERROR_HAVE_NO_MEMORY(objects);
+       if (ids == NULL) {
+               status = WERR_NOMEM;
+               goto cancel;
+       }
 
        for (i=0; i < num_objects; i++) {
                struct dom_sid *sid = NULL;
-               ret = ldb_add(ldb, objects[i]);
-               if (ret != 0) {
+               struct ldb_request *add_req;
+
+               DEBUG(6,(__location__ ": adding %s\n", 
+                        ldb_dn_get_linearized(objects[i]->dn)));
+
+               ret = ldb_build_add_req(&add_req,
+                                       ldb,
+                                       objects,
+                                       objects[i],
+                                       NULL,
+                                       NULL,
+                                       ldb_op_default_callback,
+                                       NULL);
+               if (ret != LDB_SUCCESS) {
+                       status = WERR_DS_INTERNAL_FAILURE;
+                       goto cancel;
+               }
+
+               ret = ldb_request_add_control(add_req, LDB_CONTROL_RELAX_OID, true, NULL);
+               if (ret != LDB_SUCCESS) {
+                       status = WERR_DS_INTERNAL_FAILURE;
                        goto cancel;
                }
+               
+               ret = ldb_request(ldb, add_req);
+               if (ret == LDB_SUCCESS) {
+                       ret = ldb_wait(add_req->handle, LDB_WAIT_ALL);
+               }
+               if (ret != LDB_SUCCESS) {
+                       DEBUG(0,(__location__ ": Failed add of %s - %s\n",
+                                ldb_dn_get_linearized(objects[i]->dn), ldb_errstring(ldb)));
+                       status = WERR_DS_INTERNAL_FAILURE;
+                       goto cancel;
+               }
+
+               talloc_free(add_req);
+
                ret = ldb_search(ldb, objects, &res, objects[i]->dn,
                                 LDB_SCOPE_BASE, attrs,
                                 "(objectClass=*)");
-               if (ret != 0) {
+               if (ret != LDB_SUCCESS) {
+                       status = WERR_DS_INTERNAL_FAILURE;
                        goto cancel;
                }
                ids[i].guid = samdb_result_guid(res->msgs[0], "objectGUID");
@@ -460,13 +505,19 @@ WERROR dsdb_origin_objects_commit(struct ldb_context *ldb,
                }
        }
 
+       ret = ldb_transaction_commit(ldb);
+       if (ret != LDB_SUCCESS) {
+               return WERR_DS_INTERNAL_FAILURE;
+       }
+
        talloc_free(objects);
 
        *_num = num_objects;
        *_ids = ids;
        return WERR_OK;
+
 cancel:
        talloc_free(objects);
        ldb_transaction_cancel(ldb);
-       return WERR_FOOBAR;
+       return status;
 }