summaryrefslogtreecommitdiff
path: root/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/dsdb/samdb/ldb_modules/repl_meta_data.c')
-rw-r--r--source4/dsdb/samdb/ldb_modules/repl_meta_data.c101
1 files changed, 55 insertions, 46 deletions
diff --git a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
index 28aef32d07..2cc52b9918 100644
--- a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
+++ b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
@@ -195,7 +195,7 @@ struct la_backlink {
process a backlinks we accumulated during a transaction, adding and
deleting the backlinks from the target objects
*/
-static int replmd_process_backlink(struct ldb_module *module, struct la_backlink *bl)
+static int replmd_process_backlink(struct ldb_module *module, struct la_backlink *bl, struct ldb_request *parent)
{
struct ldb_dn *target_dn, *source_dn;
int ret;
@@ -210,14 +210,14 @@ static int replmd_process_backlink(struct ldb_module *module, struct la_backlink
- construct ldb_message
- either an add or a delete
*/
- ret = dsdb_module_dn_by_guid(module, tmp_ctx, &bl->target_guid, &target_dn);
+ ret = dsdb_module_dn_by_guid(module, tmp_ctx, &bl->target_guid, &target_dn, parent);
if (ret != LDB_SUCCESS) {
DEBUG(2,(__location__ ": WARNING: Failed to find target DN for linked attribute with GUID %s\n",
GUID_string(bl, &bl->target_guid)));
return LDB_SUCCESS;
}
- ret = dsdb_module_dn_by_guid(module, tmp_ctx, &bl->forward_guid, &source_dn);
+ ret = dsdb_module_dn_by_guid(module, tmp_ctx, &bl->forward_guid, &source_dn, parent);
if (ret != LDB_SUCCESS) {
ldb_asprintf_errstring(ldb, "Failed to find source DN for linked attribute with GUID %s\n",
GUID_string(bl, &bl->forward_guid));
@@ -247,7 +247,7 @@ static int replmd_process_backlink(struct ldb_module *module, struct la_backlink
}
msg->elements[0].flags = bl->active?LDB_FLAG_MOD_ADD:LDB_FLAG_MOD_DELETE;
- ret = dsdb_module_modify(module, msg, DSDB_FLAG_NEXT_MODULE);
+ ret = dsdb_module_modify(module, msg, DSDB_FLAG_NEXT_MODULE, parent);
if (ret != LDB_SUCCESS) {
ldb_asprintf_errstring(ldb, "Failed to %s backlink from %s to %s - %s",
bl->active?"add":"remove",
@@ -335,7 +335,7 @@ static int replmd_add_backlink(struct ldb_module *module, const struct dsdb_sche
/* the caller may ask for this backlink to be processed
immediately */
if (immediate) {
- int ret = replmd_process_backlink(module, bl);
+ int ret = replmd_process_backlink(module, bl, NULL);
talloc_free(bl);
return ret;
}
@@ -448,7 +448,7 @@ static int replmd_op_callback(struct ldb_request *req, struct ldb_reply *ares)
* update a @REPLCHANGED record in each partition if there have been
* any writes of replicated data in the partition
*/
-static int replmd_notify_store(struct ldb_module *module)
+static int replmd_notify_store(struct ldb_module *module, struct ldb_request *parent)
{
struct replmd_private *replmd_private =
talloc_get_type(ldb_module_get_private(module), struct replmd_private);
@@ -459,7 +459,7 @@ static int replmd_notify_store(struct ldb_module *module)
ret = dsdb_module_save_partition_usn(module, modified_partition->dn,
modified_partition->mod_usn,
- modified_partition->mod_usn_urgent);
+ modified_partition->mod_usn_urgent, parent);
if (ret != LDB_SUCCESS) {
DEBUG(0,(__location__ ": Failed to save partition uSN for %s\n",
ldb_dn_get_linearized(modified_partition->dn)));
@@ -663,7 +663,7 @@ static int replmd_build_la_val(TALLOC_CTX *mem_ctx, struct ldb_val *v, struct ds
*/
static int replmd_add_fix_la(struct ldb_module *module, struct ldb_message_element *el,
uint64_t seq_num, const struct GUID *invocationId, time_t t,
- struct GUID *guid, const struct dsdb_attribute *sa)
+ struct GUID *guid, const struct dsdb_attribute *sa, struct ldb_request *parent)
{
unsigned int i;
TALLOC_CTX *tmp_ctx = talloc_new(el->values);
@@ -686,7 +686,7 @@ static int replmd_add_fix_la(struct ldb_module *module, struct ldb_message_eleme
components from the extended_dn_store module */
status = dsdb_get_extended_dn_guid(dsdb_dn->dn, &target_guid, "GUID");
if (!NT_STATUS_IS_OK(status) || GUID_all_zero(&target_guid)) {
- ret = dsdb_module_guid_by_dn(module, dsdb_dn->dn, &target_guid);
+ ret = dsdb_module_guid_by_dn(module, dsdb_dn->dn, &target_guid, parent);
if (ret != LDB_SUCCESS) {
talloc_free(tmp_ctx);
return ret;
@@ -882,7 +882,7 @@ static int replmd_add(struct ldb_module *module, struct ldb_request *req)
}
if (sa->linkID != 0 && functional_level > DS_DOMAIN_FUNCTION_2000) {
- ret = replmd_add_fix_la(module, e, ac->seq_num, our_invocation_id, t, &guid, sa);
+ ret = replmd_add_fix_la(module, e, ac->seq_num, our_invocation_id, t, &guid, sa, req);
if (ret != LDB_SUCCESS) {
talloc_free(ac);
return ret;
@@ -1184,7 +1184,7 @@ static int replmd_update_rpmd(struct ldb_module *module,
DSDB_SEARCH_SHOW_RECYCLED |
DSDB_SEARCH_SHOW_EXTENDED_DN |
DSDB_SEARCH_SHOW_DN_IN_STORAGE_FORMAT |
- DSDB_SEARCH_REVEAL_INTERNALS);
+ DSDB_SEARCH_REVEAL_INTERNALS, req);
if (ret != LDB_SUCCESS || res->count != 1) {
DEBUG(0,(__location__ ": Object %s failed to find uSNChanged\n",
@@ -1217,7 +1217,7 @@ static int replmd_update_rpmd(struct ldb_module *module,
DSDB_SEARCH_SHOW_RECYCLED |
DSDB_SEARCH_SHOW_EXTENDED_DN |
DSDB_SEARCH_SHOW_DN_IN_STORAGE_FORMAT |
- DSDB_SEARCH_REVEAL_INTERNALS);
+ DSDB_SEARCH_REVEAL_INTERNALS, req);
if (ret != LDB_SUCCESS || res->count != 1) {
DEBUG(0,(__location__ ": Object %s failed to find replPropertyMetaData\n",
ldb_dn_get_linearized(msg->dn)));
@@ -1356,7 +1356,7 @@ static struct parsed_dn *parsed_dn_find(struct parsed_dn *pdn,
*/
static int get_parsed_dns(struct ldb_module *module, TALLOC_CTX *mem_ctx,
struct ldb_message_element *el, struct parsed_dn **pdn,
- const char *ldap_oid)
+ const char *ldap_oid, struct ldb_request *parent)
{
unsigned int i;
struct ldb_context *ldb = ldb_module_get_ctx(module);
@@ -1396,7 +1396,7 @@ static int get_parsed_dns(struct ldb_module *module, TALLOC_CTX *mem_ctx,
status = dsdb_get_extended_dn_guid(dn, p->guid, "GUID");
if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
/* we got a DN without a GUID - go find the GUID */
- int ret = dsdb_module_guid_by_dn(module, dn, p->guid);
+ int ret = dsdb_module_guid_by_dn(module, dn, p->guid, parent);
if (ret != LDB_SUCCESS) {
ldb_asprintf_errstring(ldb, "Unable to find GUID for DN %s\n",
ldb_dn_get_linearized(dn));
@@ -1649,7 +1649,8 @@ static int replmd_modify_la_add(struct ldb_module *module,
const struct dsdb_attribute *schema_attr,
uint64_t seq_num,
time_t t,
- struct GUID *msg_guid)
+ struct GUID *msg_guid,
+ struct ldb_request *parent)
{
unsigned int i;
struct parsed_dn *dns, *old_dns;
@@ -1664,13 +1665,13 @@ static int replmd_modify_la_add(struct ldb_module *module,
unix_to_nt_time(&now, t);
- ret = get_parsed_dns(module, tmp_ctx, el, &dns, schema_attr->syntax->ldap_oid);
+ ret = get_parsed_dns(module, tmp_ctx, el, &dns, schema_attr->syntax->ldap_oid, parent);
if (ret != LDB_SUCCESS) {
talloc_free(tmp_ctx);
return ret;
}
- ret = get_parsed_dns(module, tmp_ctx, old_el, &old_dns, schema_attr->syntax->ldap_oid);
+ ret = get_parsed_dns(module, tmp_ctx, old_el, &old_dns, schema_attr->syntax->ldap_oid, parent);
if (ret != LDB_SUCCESS) {
talloc_free(tmp_ctx);
return ret;
@@ -1768,7 +1769,8 @@ static int replmd_modify_la_delete(struct ldb_module *module,
const struct dsdb_attribute *schema_attr,
uint64_t seq_num,
time_t t,
- struct GUID *msg_guid)
+ struct GUID *msg_guid,
+ struct ldb_request *parent)
{
unsigned int i;
struct parsed_dn *dns, *old_dns;
@@ -1790,13 +1792,13 @@ static int replmd_modify_la_delete(struct ldb_module *module,
return LDB_ERR_NO_SUCH_ATTRIBUTE;
}
- ret = get_parsed_dns(module, tmp_ctx, el, &dns, schema_attr->syntax->ldap_oid);
+ ret = get_parsed_dns(module, tmp_ctx, el, &dns, schema_attr->syntax->ldap_oid, parent);
if (ret != LDB_SUCCESS) {
talloc_free(tmp_ctx);
return ret;
}
- ret = get_parsed_dns(module, tmp_ctx, old_el, &old_dns, schema_attr->syntax->ldap_oid);
+ ret = get_parsed_dns(module, tmp_ctx, old_el, &old_dns, schema_attr->syntax->ldap_oid, parent);
if (ret != LDB_SUCCESS) {
talloc_free(tmp_ctx);
return ret;
@@ -1887,7 +1889,8 @@ static int replmd_modify_la_replace(struct ldb_module *module,
const struct dsdb_attribute *schema_attr,
uint64_t seq_num,
time_t t,
- struct GUID *msg_guid)
+ struct GUID *msg_guid,
+ struct ldb_request *parent)
{
unsigned int i;
struct parsed_dn *dns, *old_dns;
@@ -1908,13 +1911,13 @@ static int replmd_modify_la_replace(struct ldb_module *module,
return LDB_SUCCESS;
}
- ret = get_parsed_dns(module, tmp_ctx, el, &dns, schema_attr->syntax->ldap_oid);
+ ret = get_parsed_dns(module, tmp_ctx, el, &dns, schema_attr->syntax->ldap_oid, parent);
if (ret != LDB_SUCCESS) {
talloc_free(tmp_ctx);
return ret;
}
- ret = get_parsed_dns(module, tmp_ctx, old_el, &old_dns, schema_attr->syntax->ldap_oid);
+ ret = get_parsed_dns(module, tmp_ctx, old_el, &old_dns, schema_attr->syntax->ldap_oid, parent);
if (ret != LDB_SUCCESS) {
talloc_free(tmp_ctx);
return ret;
@@ -2034,7 +2037,8 @@ static int replmd_modify_la_replace(struct ldb_module *module,
*/
static int replmd_modify_handle_linked_attribs(struct ldb_module *module,
struct ldb_message *msg,
- uint64_t seq_num, time_t t)
+ uint64_t seq_num, time_t t,
+ struct ldb_request *parent)
{
struct ldb_result *res;
unsigned int i;
@@ -2061,7 +2065,8 @@ static int replmd_modify_handle_linked_attribs(struct ldb_module *module,
DSDB_FLAG_NEXT_MODULE |
DSDB_SEARCH_SHOW_RECYCLED |
DSDB_SEARCH_REVEAL_INTERNALS |
- DSDB_SEARCH_SHOW_DN_IN_STORAGE_FORMAT);
+ DSDB_SEARCH_SHOW_DN_IN_STORAGE_FORMAT,
+ parent);
if (ret != LDB_SUCCESS) {
return ret;
}
@@ -2097,13 +2102,13 @@ static int replmd_modify_handle_linked_attribs(struct ldb_module *module,
old_el = ldb_msg_find_element(old_msg, el->name);
switch (el->flags & LDB_FLAG_MOD_MASK) {
case LDB_FLAG_MOD_REPLACE:
- ret = replmd_modify_la_replace(module, schema, msg, el, old_el, schema_attr, seq_num, t, &old_guid);
+ ret = replmd_modify_la_replace(module, schema, msg, el, old_el, schema_attr, seq_num, t, &old_guid, parent);
break;
case LDB_FLAG_MOD_DELETE:
- ret = replmd_modify_la_delete(module, schema, msg, el, old_el, schema_attr, seq_num, t, &old_guid);
+ ret = replmd_modify_la_delete(module, schema, msg, el, old_el, schema_attr, seq_num, t, &old_guid, parent);
break;
case LDB_FLAG_MOD_ADD:
- ret = replmd_modify_la_add(module, schema, msg, el, old_el, schema_attr, seq_num, t, &old_guid);
+ ret = replmd_modify_la_add(module, schema, msg, el, old_el, schema_attr, seq_num, t, &old_guid, parent);
break;
default:
ldb_asprintf_errstring(ldb,
@@ -2204,7 +2209,7 @@ static int replmd_modify(struct ldb_module *module, struct ldb_request *req)
return ret;
}
- ret = replmd_modify_handle_linked_attribs(module, msg, ac->seq_num, t);
+ ret = replmd_modify_handle_linked_attribs(module, msg, ac->seq_num, t, req);
if (ret != LDB_SUCCESS) {
talloc_free(ac);
return ret;
@@ -2385,7 +2390,8 @@ static int replmd_delete_remove_link(struct ldb_module *module,
const struct dsdb_schema *schema,
struct ldb_dn *dn,
struct ldb_message_element *el,
- const struct dsdb_attribute *sa)
+ const struct dsdb_attribute *sa,
+ struct ldb_request *parent)
{
unsigned int i;
TALLOC_CTX *tmp_ctx = talloc_new(module);
@@ -2443,7 +2449,7 @@ static int replmd_delete_remove_link(struct ldb_module *module,
el2->values = &dn_val;
el2->num_values = 1;
- ret = dsdb_module_modify(module, msg, DSDB_FLAG_OWN_MODULE);
+ ret = dsdb_module_modify(module, msg, DSDB_FLAG_OWN_MODULE, parent);
if (ret != LDB_SUCCESS) {
talloc_free(tmp_ctx);
return ret;
@@ -2514,7 +2520,7 @@ static int replmd_delete(struct ldb_module *module, struct ldb_request *req)
DSDB_FLAG_NEXT_MODULE |
DSDB_SEARCH_SHOW_RECYCLED |
DSDB_SEARCH_REVEAL_INTERNALS |
- DSDB_SEARCH_SHOW_DN_IN_STORAGE_FORMAT);
+ DSDB_SEARCH_SHOW_DN_IN_STORAGE_FORMAT, req);
if (ret != LDB_SUCCESS) {
talloc_free(tmp_ctx);
return ret;
@@ -2654,7 +2660,7 @@ static int replmd_delete(struct ldb_module *module, struct ldb_request *req)
DSDB_FLAG_NEXT_MODULE |
DSDB_SEARCH_SHOW_DN_IN_STORAGE_FORMAT |
DSDB_SEARCH_REVEAL_INTERNALS|
- DSDB_SEARCH_SHOW_RECYCLED);
+ DSDB_SEARCH_SHOW_RECYCLED, req);
if (ret != LDB_SUCCESS) {
talloc_free(tmp_ctx);
return ret;
@@ -2731,7 +2737,7 @@ static int replmd_delete(struct ldb_module *module, struct ldb_request *req)
continue;
}
if (sa->linkID && sa->linkID & 1) {
- ret = replmd_delete_remove_link(module, schema, old_dn, el, sa);
+ ret = replmd_delete_remove_link(module, schema, old_dn, el, sa, req);
if (ret != LDB_SUCCESS) {
talloc_free(tmp_ctx);
return LDB_ERR_OPERATIONS_ERROR;
@@ -2790,7 +2796,7 @@ static int replmd_delete(struct ldb_module *module, struct ldb_request *req)
}
}
- ret = dsdb_module_modify(module, msg, DSDB_FLAG_OWN_MODULE);
+ ret = dsdb_module_modify(module, msg, DSDB_FLAG_OWN_MODULE, req);
if (ret != LDB_SUCCESS) {
ldb_asprintf_errstring(ldb, "replmd_delete: Failed to modify object %s in delete - %s",
ldb_dn_get_linearized(old_dn), ldb_errstring(ldb));
@@ -2800,7 +2806,7 @@ static int replmd_delete(struct ldb_module *module, struct ldb_request *req)
if (deletion_state == OBJECT_NOT_DELETED) {
/* now rename onto the new DN */
- ret = dsdb_module_rename(module, old_dn, new_dn, DSDB_FLAG_NEXT_MODULE);
+ ret = dsdb_module_rename(module, old_dn, new_dn, DSDB_FLAG_NEXT_MODULE, req);
if (ret != LDB_SUCCESS){
DEBUG(0,(__location__ ": Failed to rename object from '%s' to '%s' - %s\n",
ldb_dn_get_linearized(old_dn),
@@ -2994,7 +3000,8 @@ replmd_replPropertyMetaData1_find_attid(struct replPropertyMetaDataBlob *md_blob
static int replmd_replicated_handle_rename(struct replmd_replicated_request *ar,
struct ldb_message *msg,
struct replPropertyMetaDataBlob *rmd,
- struct replPropertyMetaDataBlob *omd)
+ struct replPropertyMetaDataBlob *omd,
+ struct ldb_request *parent)
{
struct replPropertyMetaData1 *md_remote;
struct replPropertyMetaData1 *md_local;
@@ -3022,7 +3029,7 @@ static int replmd_replicated_handle_rename(struct replmd_replicated_request *ar,
* so it doesn't appear as an originating update */
return dsdb_module_rename(ar->module,
ar->search_msg->dn, msg->dn,
- DSDB_FLAG_NEXT_MODULE | DSDB_MODIFY_RELAX);
+ DSDB_FLAG_NEXT_MODULE | DSDB_MODIFY_RELAX, parent);
}
/* we're going to keep our old object */
@@ -3071,7 +3078,7 @@ static int replmd_replicated_apply_merge(struct replmd_replicated_request *ar)
}
/* handle renames that come in over DRS */
- ret = replmd_replicated_handle_rename(ar, msg, rmd, &omd);
+ ret = replmd_replicated_handle_rename(ar, msg, rmd, &omd, ar->req);
if (ret != LDB_SUCCESS) {
ldb_debug(ldb, LDB_DEBUG_FATAL,
"replmd_replicated_request rename %s => %s failed - %s\n",
@@ -3828,7 +3835,8 @@ static int replmd_extended_replicated_objects(struct ldb_module *module, struct
process one linked attribute structure
*/
static int replmd_process_linked_attribute(struct ldb_module *module,
- struct la_entry *la_entry)
+ struct la_entry *la_entry,
+ struct ldb_request *parent)
{
struct drsuapi_DsReplicaLinkedAttribute *la = la_entry->la;
struct ldb_context *ldb = ldb_module_get_ctx(module);
@@ -3905,6 +3913,7 @@ linked_attributes[0]:
DSDB_SEARCH_SHOW_RECYCLED |
DSDB_SEARCH_SHOW_DN_IN_STORAGE_FORMAT |
DSDB_SEARCH_REVEAL_INTERNALS,
+ parent,
"objectGUID=%s", GUID_string(tmp_ctx, &la->identifier->guid));
if (ret != LDB_SUCCESS) {
talloc_free(tmp_ctx);
@@ -3931,7 +3940,7 @@ linked_attributes[0]:
}
/* parse the existing links */
- ret = get_parsed_dns(module, tmp_ctx, old_el, &pdn_list, attr->syntax->ldap_oid);
+ ret = get_parsed_dns(module, tmp_ctx, old_el, &pdn_list, attr->syntax->ldap_oid, parent);
if (ret != LDB_SUCCESS) {
talloc_free(tmp_ctx);
return ret;
@@ -3969,7 +3978,7 @@ linked_attributes[0]:
/* re-resolve the DN by GUID, as the DRS server may give us an
old DN value */
- ret = dsdb_module_dn_by_guid(module, dsdb_dn, &guid, &dsdb_dn->dn);
+ ret = dsdb_module_dn_by_guid(module, dsdb_dn, &guid, &dsdb_dn->dn, parent);
if (ret != LDB_SUCCESS) {
DEBUG(2,(__location__ ": WARNING: Failed to re-resolve GUID %s - using %s",
GUID_string(tmp_ctx, &guid),
@@ -4105,7 +4114,7 @@ linked_attributes[0]:
old_el->flags |= LDB_FLAG_INTERNAL_DISABLE_SINGLE_VALUE_CHECK;
- ret = dsdb_module_modify(module, msg, DSDB_FLAG_NEXT_MODULE);
+ ret = dsdb_module_modify(module, msg, DSDB_FLAG_NEXT_MODULE, parent);
if (ret != LDB_SUCCESS) {
ldb_debug(ldb, LDB_DEBUG_WARNING, "Failed to apply linked attribute change '%s'\n%s\n",
ldb_errstring(ldb),
@@ -4172,7 +4181,7 @@ static int replmd_prepare_commit(struct ldb_module *module)
for (la = DLIST_TAIL(replmd_private->la_list); la; la=prev) {
prev = DLIST_PREV(la);
DLIST_REMOVE(replmd_private->la_list, la);
- ret = replmd_process_linked_attribute(module, la);
+ ret = replmd_process_linked_attribute(module, la, NULL);
if (ret != LDB_SUCCESS) {
replmd_txn_cleanup(replmd_private);
return ret;
@@ -4182,7 +4191,7 @@ static int replmd_prepare_commit(struct ldb_module *module)
/* process our backlink list, creating and deleting backlinks
as necessary */
for (bl=replmd_private->la_backlinks; bl; bl=bl->next) {
- ret = replmd_process_backlink(module, bl);
+ ret = replmd_process_backlink(module, bl, NULL);
if (ret != LDB_SUCCESS) {
replmd_txn_cleanup(replmd_private);
return ret;
@@ -4192,7 +4201,7 @@ static int replmd_prepare_commit(struct ldb_module *module)
replmd_txn_cleanup(replmd_private);
/* possibly change @REPLCHANGED */
- ret = replmd_notify_store(module);
+ ret = replmd_notify_store(module, NULL);
if (ret != LDB_SUCCESS) {
return ret;
}