[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha7-2176-gfa074c9

Volker Lendecke vlendec at samba.org
Tue Jun 9 13:25:40 GMT 2009


The branch, master has been updated
       via  fa074c99166a8999b280ccb4cebec40c42422b0b (commit)
       via  6545e9e2ac50fc9afeaccc1bf9965d12bb3121e6 (commit)
      from  54fb170689a8ee97d95faa1a32dc53aed3e5ec58 (commit)

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


- Log -----------------------------------------------------------------
commit fa074c99166a8999b280ccb4cebec40c42422b0b
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Jun 9 15:24:06 2009 +0200

    Implement pdb_ads_[add|del]_groupmem

commit 6545e9e2ac50fc9afeaccc1bf9965d12bb3121e6
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Jun 9 15:23:33 2009 +0200

    Make "net sam [add|del]mem" work for domain groups

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

Summary of changes:
 source3/passdb/pdb_ads.c |   80 +++++++++++++++++++++++++++++++++++++++------
 source3/utils/net_sam.c  |   24 ++++++++++++++
 2 files changed, 93 insertions(+), 11 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/passdb/pdb_ads.c b/source3/passdb/pdb_ads.c
index 45aab1c..c07003f 100644
--- a/source3/passdb/pdb_ads.c
+++ b/source3/passdb/pdb_ads.c
@@ -19,15 +19,6 @@
 
 #include "includes.h"
 
-static NTSTATUS pdb_ads_getsampwsid(struct pdb_methods *m,
-				    struct samu *sam_acct,
-				    const DOM_SID *sid);
-static bool pdb_ads_gid_to_sid(struct pdb_methods *m, gid_t gid,
-			       DOM_SID *sid);
-static bool pdb_ads_dnblob2sid(struct tldap_context *ld, DATA_BLOB *dnblob,
-			       struct dom_sid *psid);
-
-
 struct pdb_ads_state {
 	struct tldap_context *ld;
 	struct dom_sid domainsid;
@@ -36,6 +27,17 @@ struct pdb_ads_state {
 	char *netbiosname;
 };
 
+static NTSTATUS pdb_ads_getsampwsid(struct pdb_methods *m,
+				    struct samu *sam_acct,
+				    const DOM_SID *sid);
+static bool pdb_ads_gid_to_sid(struct pdb_methods *m, gid_t gid,
+			       DOM_SID *sid);
+static bool pdb_ads_dnblob2sid(struct tldap_context *ld, DATA_BLOB *dnblob,
+			       struct dom_sid *psid);
+static NTSTATUS pdb_ads_sid2dn(struct pdb_ads_state *state,
+			       const struct dom_sid *sid,
+			       TALLOC_CTX *mem_ctx, char **pdn);
+
 static bool pdb_ads_pull_time(struct tldap_message *msg, const char *attr,
 			      time_t *ptime)
 {
@@ -887,18 +889,74 @@ static NTSTATUS pdb_ads_set_unix_primary_group(struct pdb_methods *m,
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
+static NTSTATUS pdb_ads_mod_groupmem(struct pdb_methods *m,
+				     TALLOC_CTX *mem_ctx,
+				     uint32 grouprid, uint32 memberrid,
+				     int mod_op)
+{
+	struct pdb_ads_state *state = talloc_get_type_abort(
+		m->private_data, struct pdb_ads_state);
+	TALLOC_CTX *frame = talloc_stackframe();
+	struct dom_sid groupsid, membersid;
+	char *groupdn, *memberdn;
+	struct tldap_mod *mods;
+	int rc;
+	NTSTATUS status;
+
+	sid_compose(&groupsid, &state->domainsid, grouprid);
+	sid_compose(&membersid, &state->domainsid, memberrid);
+
+	status = pdb_ads_sid2dn(state, &groupsid, talloc_tos(), &groupdn);
+	if (!NT_STATUS_IS_OK(status)) {
+		TALLOC_FREE(frame);
+		TALLOC_FREE(frame);
+		return NT_STATUS_NO_SUCH_GROUP;
+	}
+	status = pdb_ads_sid2dn(state, &membersid, talloc_tos(), &memberdn);
+	if (!NT_STATUS_IS_OK(status)) {
+		TALLOC_FREE(frame);
+		return NT_STATUS_NO_SUCH_USER;
+	}
+
+	mods = NULL;
+
+	if (!tldap_add_mod_str(talloc_tos(), &mods, mod_op,
+			       "member", memberdn)) {
+		TALLOC_FREE(frame);
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	rc = tldap_modify(state->ld, groupdn, 1, mods, NULL, NULL);
+	TALLOC_FREE(frame);
+	if (rc != TLDAP_SUCCESS) {
+		DEBUG(10, ("ldap_modify failed: %s\n",
+			   tldap_errstr(debug_ctx(), state->ld, rc)));
+		if (rc == TLDAP_TYPE_OR_VALUE_EXISTS) {
+			return NT_STATUS_MEMBER_IN_GROUP;
+		}
+		if (rc == TLDAP_NO_SUCH_ATTRIBUTE) {
+			return NT_STATUS_MEMBER_NOT_IN_GROUP;
+		}
+		return NT_STATUS_LDAP(rc);
+	}
+
+	return NT_STATUS_OK;
+}
+
 static NTSTATUS pdb_ads_add_groupmem(struct pdb_methods *m,
 				     TALLOC_CTX *mem_ctx,
 				     uint32 group_rid, uint32 member_rid)
 {
-	return NT_STATUS_NOT_IMPLEMENTED;
+	return pdb_ads_mod_groupmem(m, mem_ctx, group_rid, member_rid,
+				    TLDAP_MOD_ADD);
 }
 
 static NTSTATUS pdb_ads_del_groupmem(struct pdb_methods *m,
 				     TALLOC_CTX *mem_ctx,
 				     uint32 group_rid, uint32 member_rid)
 {
-	return NT_STATUS_NOT_IMPLEMENTED;
+	return pdb_ads_mod_groupmem(m, mem_ctx, group_rid, member_rid,
+				    TLDAP_MOD_DELETE);
 }
 
 static NTSTATUS pdb_ads_create_alias(struct pdb_methods *m,
diff --git a/source3/utils/net_sam.c b/source3/utils/net_sam.c
index 1919b40..0d8b6ff 100644
--- a/source3/utils/net_sam.c
+++ b/source3/utils/net_sam.c
@@ -1178,6 +1178,18 @@ static int net_sam_addmem(struct net_context *c, int argc, const char **argv)
 				  "with %s\n", nt_errstr(status));
 			return -1;
 		}
+	} else if (grouptype == SID_NAME_DOM_GRP) {
+		uint32_t grouprid, memberrid;
+
+		sid_peek_rid(&group, &grouprid);
+		sid_peek_rid(&member, &memberrid);
+
+		status = pdb_add_groupmem(talloc_tos(), grouprid, memberrid);
+		if (!NT_STATUS_IS_OK(status)) {
+			d_fprintf(stderr, "Adding domain group member failed "
+				  "with %s\n", nt_errstr(status));
+			return -1;
+		}
 	} else {
 		d_fprintf(stderr, "Can only add members to local groups so "
 			  "far, %s is a %s\n", argv[0],
@@ -1233,6 +1245,18 @@ static int net_sam_delmem(struct net_context *c, int argc, const char **argv)
 				  "with %s\n", nt_errstr(status));
 			return -1;
 		}
+	} else if (grouptype == SID_NAME_DOM_GRP) {
+		uint32_t grouprid, memberrid;
+
+		sid_peek_rid(&group, &grouprid);
+		sid_peek_rid(&member, &memberrid);
+
+		status = pdb_del_groupmem(talloc_tos(), grouprid, memberrid);
+		if (!NT_STATUS_IS_OK(status)) {
+			d_fprintf(stderr, "Deleting domain group member "
+				  "failed with %s\n", nt_errstr(status));
+			return -1;
+		}
 	} else {
 		d_fprintf(stderr, "Can only delete members from local groups "
 			  "so far, %s is a %s\n", argv[0],


-- 
Samba Shared Repository


More information about the samba-cvs mailing list