diff options
-rw-r--r-- | source4/dsdb/common/util.c | 58 | ||||
-rw-r--r-- | source4/dsdb/samdb/ldb_modules/operational.c | 47 |
2 files changed, 29 insertions, 76 deletions
diff --git a/source4/dsdb/common/util.c b/source4/dsdb/common/util.c index 8c9c98201b..d9e03cec3e 100644 --- a/source4/dsdb/common/util.c +++ b/source4/dsdb/common/util.c @@ -2286,64 +2286,6 @@ int dsdb_find_guid_by_dn(struct ldb_context *ldb, } -/* - Use a DN to find it's parentGUID - - Results - LDB_ERR_OPERATIONS_ERROR for out of memory - LDB_ERR_NO_SUCH_OBJECT if there is no parent object for the given DN - LDB_ERR_NO_SUCH_ATTRIBUTE if couldn't get the ObjectGUID from the parent - LDB_SUCCESS if it could find the parentGUID correctly - */ -int dsdb_find_parentguid_by_dn(struct ldb_context *ldb, - struct ldb_dn *dn, - struct GUID *parent_guid) -{ - - int ret; - struct ldb_result *res; - struct ldb_dn *parent_dn; - const char *attrs[] = { "objectGUID", NULL }; - TALLOC_CTX *tmp_ctx = talloc_new(ldb); - - - parent_dn = ldb_dn_get_parent(tmp_ctx, dn); - - if (parent_dn == NULL){ - DEBUG(4,(__location__ ": Failed to find parent for dn %s\n", - ldb_dn_get_linearized(dn))); - ret = LDB_ERR_NO_SUCH_OBJECT; - goto done; - } - - /* - The few lines of code bellow are very similar to the - dsdb_find_guid_by_dn() function implementation, but this way we can - differ situations when the parent_dn doesn't exist from when there is - an error on returning it's GUID. - */ - ret = dsdb_search_dn_with_deleted(ldb, tmp_ctx, &res, parent_dn, attrs); - if (ret != LDB_SUCCESS) { - DEBUG(4,(__location__ ": Parent dn for %s does not exist \n", - ldb_dn_get_linearized(dn))); - /* When there is no parent dn, it simply doesn't return a parentGUID */ - ret = LDB_ERR_NO_SUCH_OBJECT; - goto done; - } - if (res->count < 1) { - DEBUG(4,(__location__ ": Failed to find GUID for dn %s\n", - ldb_dn_get_linearized(parent_dn))); - ret = LDB_ERR_NO_SUCH_ATTRIBUTE; - goto done; - } - - *parent_guid = samdb_result_guid(res->msgs[0], "objectGUID"); - ret = LDB_SUCCESS; - -done: - talloc_free(tmp_ctx); - return ret; -} /* adds the given GUID to the given ldb_message. This value is added diff --git a/source4/dsdb/samdb/ldb_modules/operational.c b/source4/dsdb/samdb/ldb_modules/operational.c index d43950e6bb..671a178e33 100644 --- a/source4/dsdb/samdb/ldb_modules/operational.c +++ b/source4/dsdb/samdb/ldb_modules/operational.c @@ -70,6 +70,7 @@ #include "librpc/gen_ndr/ndr_misc.h" #include "param/param.h" #include "dsdb/samdb/samdb.h" +#include "dsdb/samdb/ldb_modules/util.h" #ifndef ARRAY_SIZE #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) @@ -118,32 +119,42 @@ static int construct_primary_group_token(struct ldb_module *module, } static int construct_parent_guid(struct ldb_module *module, - struct ldb_message *msg) + struct ldb_message *msg) { - struct ldb_context *ldb; - struct GUID parent_guid; + struct ldb_result *res; + const struct ldb_val *parent_guid; + const char *attrs[] = { "objectGUID", NULL }; int ret; - ldb = ldb_module_get_ctx(module); - - ret = dsdb_find_parentguid_by_dn(ldb, msg->dn, &parent_guid); - - - if (ret != LDB_SUCCESS){ - - /* if there is no parentGUID for this object, then return */ - if (ret == LDB_ERR_NO_SUCH_OBJECT){ - return LDB_SUCCESS; - }else{ - return ret; - } + /* TODO: In the future, this needs to honour the partition boundaries */ + struct ldb_dn *parent_dn = ldb_dn_get_parent(msg, msg->dn); + if (parent_dn == NULL){ + DEBUG(4,(__location__ ": Failed to find parent for dn %s\n", + ldb_dn_get_linearized(msg->dn))); + return LDB_SUCCESS; } - ret = dsdb_msg_add_guid(msg, &parent_guid, "parentGUID"); + ret = dsdb_module_search_dn(module, msg, &res, parent_dn, attrs, DSDB_SEARCH_SHOW_DELETED); + talloc_free(parent_dn); + /* if there is no parentGUID for this object, then return */ + if (ret == LDB_ERR_NO_SUCH_OBJECT){ + DEBUG(4,(__location__ ": Parent dn for %s does not exist \n", + ldb_dn_get_linearized(msg->dn))); + return LDB_SUCCESS; + } else if (ret != LDB_SUCCESS) { + return ret; + } - return ret; + parent_guid = ldb_msg_find_ldb_val(res->msgs[0], "objectGUID"); + if (!parent_guid) { + talloc_free(res); + return LDB_SUCCESS; + } + talloc_steal(msg->elements, parent_guid->data); + talloc_free(res); + return ldb_msg_add_value(msg, "parentGUID", parent_guid, 0); } /* |