1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-13 13:18:06 +03:00

s4-drs: Utility functions to deal with GUID

dsdb_find_parentguid_by_dn() returns the parentGUID for a given DN
dsdb_msg_add_guid() adds a GUID value to a given message (either
objectGUID or parentGUID).

Signed-off-by: Andrew Tridgell <tridge@samba.org>
This commit is contained in:
Fernando J V da Silva 2009-11-19 15:28:37 -03:00 committed by Andrew Tridgell
parent a2707a3248
commit 8481581dc4

View File

@ -2266,6 +2266,105 @@ int dsdb_find_guid_by_dn(struct ldb_context *ldb,
return LDB_SUCCESS;
}
/*
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
for the given attr_name (may be either "objectGUID" or "parentGUID").
*/
int dsdb_msg_add_guid(struct ldb_message *msg,
struct GUID *guid,
const char *attr_name)
{
int ret;
enum ndr_err_code ndr_err;
struct ldb_val v;
TALLOC_CTX *tmp_ctx = talloc_init("dsdb_msg_add_guid");
ndr_err = ndr_push_struct_blob(&v, tmp_ctx, NULL,
guid,
(ndr_push_flags_fn_t)ndr_push_GUID);
if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
ret = LDB_ERR_OPERATIONS_ERROR;
goto done;
}
ret = ldb_msg_add_steal_value(msg, attr_name, &v);
if (ret != LDB_SUCCESS) {
DEBUG(4,(__location__ ": Failed to add %s to the message\n",
attr_name));
goto done;
}
ret = LDB_SUCCESS;
done:
talloc_free(tmp_ctx);
return ret;
}
/*
use a DN to find a SID
*/