diff options
-rw-r--r-- | source3/lib/util_uuid.c | 16 | ||||
-rw-r--r-- | source3/libads/ldap_schema.c | 53 |
2 files changed, 67 insertions, 2 deletions
diff --git a/source3/lib/util_uuid.c b/source3/lib/util_uuid.c index a20387e8e5..4a9c0848d2 100644 --- a/source3/lib/util_uuid.c +++ b/source3/lib/util_uuid.c @@ -133,3 +133,19 @@ BOOL smb_string_to_uuid(const char *in, struct GUID* uu) out: return ret; } + +/***************************************************************** + Return the binary string representation of a GUID. + Caller must free. +*****************************************************************/ + +char *guid_binstring(const struct GUID *guid) +{ + UUID_FLAT guid_flat; + + smb_uuid_pack(*guid, &guid_flat); + + return binary_string_rfc2254((char *)guid_flat.info, UUID_FLAT_SIZE); +} + + diff --git a/source3/libads/ldap_schema.c b/source3/libads/ldap_schema.c index f71f53adb6..2672d88306 100644 --- a/source3/libads/ldap_schema.c +++ b/source3/libads/ldap_schema.c @@ -1,7 +1,7 @@ /* Unix SMB/CIFS implementation. ads (active directory) utility library - Copyright (C) Guenther Deschner 2005-2006 + Copyright (C) Guenther Deschner 2005-2007 Copyright (C) Gerald (Jerry) Carter 2006 This program is free software; you can redistribute it and/or modify @@ -106,6 +106,56 @@ out: return status; } +const char *ads_get_attrname_by_guid(ADS_STRUCT *ads, + const char *schema_path, + TALLOC_CTX *mem_ctx, + const char *schema_guid) +{ + ADS_STATUS rc; + LDAPMessage *res = NULL; + char *expr = NULL; + const char *attrs[] = { "lDAPDisplayName", NULL }; + const char *result = NULL; + struct GUID guid; + char *guid_bin = NULL; + + if (!ads || !mem_ctx || !schema_guid) { + goto done; + } + + if (!NT_STATUS_IS_OK(GUID_from_string(schema_guid, &guid))) { + goto done; + } + + guid_bin = guid_binstring(&guid); + if (!guid_bin) { + goto done; + } + + expr = talloc_asprintf(mem_ctx, "(schemaIDGUID=%s)", guid_bin); + if (!expr) { + goto done; + } + + rc = ads_do_search_retry(ads, schema_path, LDAP_SCOPE_SUBTREE, + expr, attrs, &res); + if (!ADS_ERR_OK(rc)) { + goto done; + } + + if (ads_count_replies(ads, res) != 1) { + goto done; + } + + result = ads_pull_string(ads, mem_ctx, res, "lDAPDisplayName"); + + done: + SAFE_FREE(guid_bin); + ads_msgfree(ads, res); + return result; + +} + const char *ads_get_attrname_by_oid(ADS_STRUCT *ads, const char *schema_path, TALLOC_CTX *mem_ctx, const char * OID) { ADS_STATUS rc; @@ -147,7 +197,6 @@ failed: ads_msgfree(ads, res); return NULL; } - /********************************************************************* *********************************************************************/ |