r23772: Add ads_find_samaccount() helper function.
authorGünther Deschner <gd@samba.org>
Mon, 9 Jul 2007 16:03:00 +0000 (16:03 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:23:55 +0000 (12:23 -0500)
Guenther

source/libads/ldap.c
source/utils/net_ads_gpo.c

index d60afcd0d553fa2431be9e639dc090e0f4061700..6f0ca3452ca2d8903ae63aafe5a43572dc443604 100644 (file)
@@ -3272,4 +3272,64 @@ ADS_STATUS ads_leave_realm(ADS_STRUCT *ads, const char *hostname)
        return ADS_ERROR_LDAP(LDAP_SUCCESS);
 }
 
+ADS_STATUS ads_find_samaccount(ADS_STRUCT *ads,
+                              TALLOC_CTX *mem_ctx,
+                              const char *samaccountname,
+                              uint32 *uac_ret,
+                              const char **dn_ret)
+{
+       ADS_STATUS status;
+       const char *attrs[] = { "userAccountControl", NULL };
+       const char *filter;
+       LDAPMessage *res = NULL;
+       char *dn = NULL;
+       uint32 uac = 0;
+
+       filter = talloc_asprintf(mem_ctx, "(&(objectclass=user)(sAMAccountName=%s))",
+               samaccountname);
+       if (filter == NULL) {
+               goto out;
+       }
+
+       status = ads_do_search_all(ads, ads->config.bind_path,
+                                  LDAP_SCOPE_SUBTREE,
+                                  filter, attrs, &res);
+       
+       if (!ADS_ERR_OK(status)) {
+               goto out;
+       }
+
+       if (ads_count_replies(ads, res) != 1) {
+               printf("no result\n");
+               goto out;
+       }
+
+       dn = ads_get_dn(ads, res);
+       if (dn == NULL) {
+               status = ADS_ERROR(LDAP_NO_MEMORY);
+               goto out;
+       }
+
+       if (!ads_pull_uint32(ads, res, "userAccountControl", &uac)) {
+               status = ADS_ERROR(LDAP_NO_SUCH_ATTRIBUTE);
+               goto out;
+       }
+
+       if (uac_ret) {
+               *uac_ret = uac;
+       }
+
+       if (dn_ret) {
+               *dn_ret = talloc_strdup(mem_ctx, dn);
+               if (!*dn_ret) {
+                       status = ADS_ERROR(LDAP_NO_MEMORY);
+                       goto out;
+               }
+       }
+ out:
+       ads_memfree(ads, dn);
+       ads_msgfree(ads, res);
+
+       return status;
+}
 #endif
index 0dfba5f4e8c6133d1a8af0214cd8659d65aeee5e..be5406af17d1e6a111f14d8e7f3d71da4d89228b 100644 (file)
@@ -46,10 +46,7 @@ static int net_ads_gpo_refresh(int argc, const char **argv)
        TALLOC_CTX *mem_ctx;
        ADS_STRUCT *ads;
        ADS_STATUS status;
-       const char *attrs[] = { "userAccountControl", NULL };
-       LDAPMessage *res = NULL;
-       const char *filter;
-       char *dn = NULL;
+       const char *dn = NULL;
        struct GROUP_POLICY_OBJECT *gpo_list = NULL;
        uint32 uac = 0;
        uint32 flags = 0;
@@ -66,35 +63,14 @@ static int net_ads_gpo_refresh(int argc, const char **argv)
                return -1;
        }
 
-       filter = talloc_asprintf(mem_ctx, "(&(objectclass=user)(sAMAccountName=%s))", argv[0]);
-       if (filter == NULL) {
-               goto out;
-       }
-
        status = ads_startup(False, &ads);
        if (!ADS_ERR_OK(status)) {
                goto out;
        }
 
-       status = ads_do_search_all(ads, ads->config.bind_path,
-                                  LDAP_SCOPE_SUBTREE,
-                                  filter, attrs, &res);
-       
+       status = ads_find_samaccount(ads, mem_ctx, argv[0], &uac, &dn);
        if (!ADS_ERR_OK(status)) {
-               goto out;
-       }
-
-       if (ads_count_replies(ads, res) != 1) {
-               printf("no result\n");
-               goto out;
-       }
-
-       dn = ads_get_dn(ads, res);
-       if (dn == NULL) {
-               goto out;
-       }
-
-       if (!ads_pull_uint32(ads, res, "userAccountControl", &uac)) {
+               printf("failed to find samaccount for %s\n", argv[0]);
                goto out;
        }
 
@@ -139,9 +115,6 @@ static int net_ads_gpo_refresh(int argc, const char **argv)
        }
 
  out:
-       ads_memfree(ads, dn);
-       ads_msgfree(ads, res);
-
        ads_destroy(&ads);
        talloc_destroy(mem_ctx);
        return 0;
@@ -225,10 +198,7 @@ static int net_ads_gpo_apply(int argc, const char **argv)
        TALLOC_CTX *mem_ctx;
        ADS_STRUCT *ads;
        ADS_STATUS status;
-       const char *attrs[] = {"distinguishedName", "userAccountControl", NULL};
-       LDAPMessage *res = NULL;
-       const char *filter;
-       char *dn = NULL;
+       const char *dn = NULL;
        struct GROUP_POLICY_OBJECT *gpo_list;
        uint32 uac = 0;
        uint32 flags = 0;
@@ -243,38 +213,16 @@ static int net_ads_gpo_apply(int argc, const char **argv)
                goto out;
        }
 
-       filter = talloc_asprintf(mem_ctx, "(&(objectclass=user)(sAMAccountName=%s))", argv[0]);
-       if (filter == NULL) {
-               goto out;
-       }
-
        status = ads_startup(False, &ads);
        if (!ADS_ERR_OK(status)) {
                goto out;
        }
 
-       status = ads_do_search_all(ads, ads->config.bind_path,
-                                  LDAP_SCOPE_SUBTREE,
-                                  filter, attrs, &res);
-       
+       status = ads_find_samaccount(ads, mem_ctx, argv[0], &uac, &dn);
        if (!ADS_ERR_OK(status)) {
                goto out;
        }
 
-       if (ads_count_replies(ads, res) != 1) {
-               printf("no result\n");
-               goto out;
-       }
-
-       dn = ads_get_dn(ads, res);
-       if (dn == NULL) {
-               goto out;
-       }
-
-       if (!ads_pull_uint32(ads, res, "userAccountControl", &uac)) {
-               goto out;
-       }
-
        if (uac & UF_WORKSTATION_TRUST_ACCOUNT) {
                flags |= GPO_LIST_FLAG_MACHINE;
        }
@@ -289,15 +237,12 @@ static int net_ads_gpo_apply(int argc, const char **argv)
        }
 
        /* FIXME: allow to process just a single extension */
-       status = gpo_process_gpo_list(ads, mem_ctx, &gpo_list, NULL, flags); 
+       status = gpo_process_gpo_list(ads, mem_ctx, gpo_list, NULL, flags); 
        if (!ADS_ERR_OK(status)) {
                goto out;
        }
 
 out:
-       ads_memfree(ads, dn);
-       ads_msgfree(ads, res);
-
        ads_destroy(&ads);
        talloc_destroy(mem_ctx);
        return 0;