The branch, master has been updated
       via  367b35b s3: Fix pdb_ads_enum_aliasmem for empty aliases
       via  ff6c175 s3: Support SetGroupInfo in pdb_ads
       via  9512603 s3: Fix a debug message
       via  4c45078 s3: Fix pdb_ads_enum_group_members for empty groups
       via  288b396 s3: Fix error returns in pdb_ads_mod_groupmem
      from  fd880fd s4-version: Fix version finding for bzr branches.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 367b35b1ffd353070b9dca4f00e3089f6788b266
Author: Volker Lendecke <[email protected]>
Date:   Sun Feb 20 19:55:01 2011 +0100

    s3: Fix pdb_ads_enum_aliasmem for empty aliases
    
    Autobuild-User: Volker Lendecke <[email protected]>
    Autobuild-Date: Sun Feb 20 21:40:40 CET 2011 on sn-devel-104

commit ff6c175ae6cfb10d466db2920a9a7f9e67709ede
Author: Volker Lendecke <[email protected]>
Date:   Sun Feb 20 18:39:30 2011 +0100

    s3: Support SetGroupInfo in pdb_ads

commit 95126034b02f0536b521a250a7935fd1472c77d2
Author: Volker Lendecke <[email protected]>
Date:   Sun Feb 20 18:39:09 2011 +0100

    s3: Fix a debug message

commit 4c45078d8f8d7cde4ecb5e7b08d96b9abd538ea5
Author: Volker Lendecke <[email protected]>
Date:   Sun Feb 20 17:53:26 2011 +0100

    s3: Fix pdb_ads_enum_group_members for empty groups

commit 288b396411bfe8f8eb7353193991a1910c97751e
Author: Volker Lendecke <[email protected]>
Date:   Sun Feb 20 17:41:22 2011 +0100

    s3: Fix error returns in pdb_ads_mod_groupmem

-----------------------------------------------------------------------

Summary of changes:
 source3/passdb/pdb_ads.c |   86 +++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 77 insertions(+), 9 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/passdb/pdb_ads.c b/source3/passdb/pdb_ads.c
index ad38256..f74fb12 100644
--- a/source3/passdb/pdb_ads.c
+++ b/source3/passdb/pdb_ads.c
@@ -744,7 +744,9 @@ static NTSTATUS pdb_ads_update_login_attempts(struct 
pdb_methods *m,
 }
 
 static NTSTATUS pdb_ads_getgrfilter(struct pdb_methods *m, GROUP_MAP *map,
-                                   const char *filter)
+                                   const char *filter,
+                                   TALLOC_CTX *mem_ctx,
+                                   struct tldap_message **pmsg)
 {
        struct pdb_ads_state *state = talloc_get_type_abort(
                m->private_data, struct pdb_ads_state);
@@ -764,7 +766,7 @@ static NTSTATUS pdb_ads_getgrfilter(struct pdb_methods *m, 
GROUP_MAP *map,
                return NT_STATUS_LDAP(rc);
        }
        if (talloc_array_length(group) != 1) {
-               DEBUG(10, ("Expected 1 user, got %d\n",
+               DEBUG(10, ("Expected 1 group, got %d\n",
                           (int)talloc_array_length(group)));
                return NT_STATUS_INTERNAL_DB_CORRUPTION;
        }
@@ -806,6 +808,9 @@ static NTSTATUS pdb_ads_getgrfilter(struct pdb_methods *m, 
GROUP_MAP *map,
                map->comment[0] = '\0';
        }
 
+       if (pmsg != NULL) {
+               *pmsg = talloc_move(mem_ctx, &group[0]);
+       }
        TALLOC_FREE(group);
        return NT_STATUS_OK;
 }
@@ -823,7 +828,7 @@ static NTSTATUS pdb_ads_getgrsid(struct pdb_methods *m, 
GROUP_MAP *map,
                return NT_STATUS_NO_MEMORY;
        }
 
-       status = pdb_ads_getgrfilter(m, map, filter);
+       status = pdb_ads_getgrfilter(m, map, filter, NULL, NULL);
        TALLOC_FREE(filter);
        return status;
 }
@@ -849,7 +854,7 @@ static NTSTATUS pdb_ads_getgrnam(struct pdb_methods *m, 
GROUP_MAP *map,
                return NT_STATUS_NO_MEMORY;
        }
 
-       status = pdb_ads_getgrfilter(m, map, filter);
+       status = pdb_ads_getgrfilter(m, map, filter, NULL, NULL);
        TALLOC_FREE(filter);
        return status;
 }
@@ -1003,7 +1008,64 @@ static NTSTATUS pdb_ads_add_group_mapping_entry(struct 
pdb_methods *m,
 static NTSTATUS pdb_ads_update_group_mapping_entry(struct pdb_methods *m,
                                                   GROUP_MAP *map)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       struct pdb_ads_state *state = talloc_get_type_abort(
+               m->private_data, struct pdb_ads_state);
+       struct tldap_context *ld;
+       struct tldap_mod *mods = NULL;
+       char *filter;
+       struct tldap_message *existing;
+       char *dn;
+       GROUP_MAP existing_map;
+       int rc, num_mods = 0;
+       bool ret;
+       NTSTATUS status;
+
+       ld = pdb_ads_ld(state);
+       if (ld == NULL) {
+               return NT_STATUS_LDAP(TLDAP_SERVER_DOWN);
+       }
+
+       filter = talloc_asprintf(talloc_tos(),
+                                "(&(objectsid=%s)(objectclass=group))",
+                                sid_string_talloc(talloc_tos(), &map->sid));
+       if (filter == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+       status = pdb_ads_getgrfilter(m, &existing_map, filter,
+                                    talloc_tos(), &existing);
+       TALLOC_FREE(filter);
+
+       if (!tldap_entry_dn(existing, &dn)) {
+               return NT_STATUS_LDAP(TLDAP_DECODING_ERROR);
+       }
+
+       ret = true;
+
+       ret &= tldap_make_mod_fmt(
+               existing, talloc_tos(), &mods, &num_mods, "description",
+               "%s", map->comment);
+       ret &= tldap_make_mod_fmt(
+               existing, talloc_tos(), &mods, &num_mods, "samaccountname",
+               "%s", map->nt_name);
+
+       if (!ret) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       if (num_mods == 0) {
+               TALLOC_FREE(existing);
+               return NT_STATUS_OK;
+       }
+
+       rc = tldap_modify(ld, dn, mods, num_mods, NULL, 0, NULL, 0);
+       if (rc != TLDAP_SUCCESS) {
+               DEBUG(10, ("ldap_modify for %s failed: %s\n", dn,
+                          tldap_errstr(talloc_tos(), ld, rc)));
+               TALLOC_FREE(existing);
+               return NT_STATUS_LDAP(rc);
+       }
+       TALLOC_FREE(existing);
+       return NT_STATUS_OK;
 }
 
 static NTSTATUS pdb_ads_delete_group_mapping_entry(struct pdb_methods *m,
@@ -1061,7 +1123,9 @@ static NTSTATUS pdb_ads_enum_group_members(struct 
pdb_methods *m,
        }
 
        if (!tldap_entry_values(msg[0], "member", &blobs, &num_members)) {
-               return NT_STATUS_INTERNAL_DB_CORRUPTION;
+               *pmembers = NULL;
+               *pnum_members = 0;
+               return NT_STATUS_OK;
        }
 
        members = talloc_array(mem_ctx, uint32_t, num_members);
@@ -1214,10 +1278,12 @@ static NTSTATUS pdb_ads_mod_groupmem(struct pdb_methods 
*m,
        if (rc != TLDAP_SUCCESS) {
                DEBUG(10, ("ldap_modify failed: %s\n",
                           tldap_errstr(talloc_tos(), state->ld, rc)));
-               if (rc == TLDAP_TYPE_OR_VALUE_EXISTS) {
+               if ((mod_op == TLDAP_MOD_ADD) &&
+                   (rc == TLDAP_ALREADY_EXISTS)) {
                        return NT_STATUS_MEMBER_IN_GROUP;
                }
-               if (rc == TLDAP_NO_SUCH_ATTRIBUTE) {
+               if ((mod_op == TLDAP_MOD_DELETE) &&
+                   (rc == TLDAP_UNWILLING_TO_PERFORM)) {
                        return NT_STATUS_MEMBER_NOT_IN_GROUP;
                }
                return NT_STATUS_LDAP(rc);
@@ -1644,7 +1710,9 @@ static NTSTATUS pdb_ads_enum_aliasmem(struct pdb_methods 
*m,
        }
 
        if (!tldap_entry_values(msg[0], "member", &blobs, &num_members)) {
-               return NT_STATUS_INTERNAL_DB_CORRUPTION;
+               *pmembers = NULL;
+               *pnum_members = 0;
+               return NT_STATUS_OK;
        }
 
        members = talloc_array(mem_ctx, struct dom_sid, num_members);


-- 
Samba Shared Repository

Reply via email to