[SCM] Samba Shared Repository - branch master updated

Matthias Dieter Wallnöfer mdw at samba.org
Thu Jun 10 08:22:36 MDT 2010


The branch, master has been updated
       via  bdd83c0... s4:ldap.py - add testcase which demonstrates the reset of the "primaryGroupID"
       via  d604d49... s4:samldb LDB module - fix up the case when the old and new "primaryGroupID" are the same
       via  13ca999... s4:samldb LDB module - don't create multiple "ac" module contexts on modify operations
       via  9f95298... s4:dcesrv_samr_Add/DeleteAliasMember - provide better NTSTATUS return codes when something didn't work
       via  7374cd0... s4:dcesrv_samr_GetAliasMembership - fix type of counter variables
       via  34b43a8... s4:dcesrv_samr_DeleteAliasMember - add more braces to fit better the coding styles
       via  305f2c7... s4:dcesrv_samr_AddAliasMembership - Merge the two error blocks into one
       via  13b1f7a... s4:dcesrv_samr_Add/DelGroupMember - remove the account type check
       via  f95634d... s4:dcesrv_samr_AddGroupMember - also the error code "LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS" is allowed
       via  1305c91... s4:samba_dsdb LDB module - move the "objectclass_attrs" module back
       via  c1b4ccb... s4:ldap.py - add a test to demonstrate the 'instanceType' behaviour
       via  0a41b7e... s4:instancetype LDB module - prevent all types of "instanceType" manipulation
      from  f66cc82... s3: Fix EnumDomainAliases when no aliases are in LDAP

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


- Log -----------------------------------------------------------------
commit bdd83c0639ad0066a2b0e77611548f2d165bb747
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Thu Jun 10 16:18:41 2010 +0200

    s4:ldap.py - add testcase which demonstrates the reset of the "primaryGroupID"

commit d604d499390dea1a10bfdd462b512bfe1845a101
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Thu Jun 10 16:15:10 2010 +0200

    s4:samldb LDB module - fix up the case when the old and new "primaryGroupID" are the same

commit 13ca999b3b4660e530ac0b91342c40ff8a3c7a31
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Thu Jun 10 16:08:23 2010 +0200

    s4:samldb LDB module - don't create multiple "ac" module contexts on modify operations
    
    Since we do now run sequentially through all checks we don't need multiple "ac"
    contexts anymore.

commit 9f9529886499acc80ad7316d5eab590545643b87
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Thu Jun 10 15:47:48 2010 +0200

    s4:dcesrv_samr_Add/DeleteAliasMember - provide better NTSTATUS return codes when something didn't work

commit 7374cd035807029d800815f82474ab9c6ed2e861
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Thu Jun 10 12:42:04 2010 +0200

    s4:dcesrv_samr_GetAliasMembership - fix type of counter variables

commit 34b43a8642bd13dfad50a4e2436ccc5814135ce2
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Thu Jun 10 12:19:04 2010 +0200

    s4:dcesrv_samr_DeleteAliasMember - add more braces to fit better the coding styles

commit 305f2c70434ecc244c4c7bcad285e2cfae8f3215
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Thu Jun 10 12:17:48 2010 +0200

    s4:dcesrv_samr_AddAliasMembership - Merge the two error blocks into one

commit 13b1f7a2b33b299208abfbb50fbf1e2b982ca326
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Thu Jun 10 11:50:12 2010 +0200

    s4:dcesrv_samr_Add/DelGroupMember - remove the account type check
    
    MS-SAMR 3.1.5.8 speaks from accounts which are not necessarely only users.

commit f95634dbe0b8afbae8b90323ba98ddb69d9dcf6e
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Thu Jun 10 11:48:33 2010 +0200

    s4:dcesrv_samr_AddGroupMember - also the error code "LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS" is allowed
    
    This is returned when the group is the primary group of the specified entry.

commit 1305c9159876f1621710b9888624aaf037046155
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Thu Jun 10 11:05:43 2010 +0200

    s4:samba_dsdb LDB module - move the "objectclass_attrs" module back
    
    I think it should be lower in order to control also the "instanceType" module.

commit c1b4ccb23b18c4d729f3fe299a1f03efa497a958
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Thu Jun 10 10:52:31 2010 +0200

    s4:ldap.py - add a test to demonstrate the 'instanceType' behaviour

commit 0a41b7e95b394e410cc0d8d02e9ff5ea1f64cd9c
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Thu Jun 10 10:39:52 2010 +0200

    s4:instancetype LDB module - prevent all types of "instanceType" manipulation
    
    Also on Windows Server you aren't able to change it.

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

Summary of changes:
 source4/dsdb/samdb/ldb_modules/instancetype.c |   16 ++++++
 source4/dsdb/samdb/ldb_modules/samba_dsdb.c   |    2 +-
 source4/dsdb/samdb/ldb_modules/samldb.c       |   32 +++++-------
 source4/lib/ldb/tests/python/ldap.py          |   46 +++++++++++++++++
 source4/rpc_server/samr/dcesrv_samr.c         |   67 +++++++++++++++----------
 5 files changed, 116 insertions(+), 47 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/dsdb/samdb/ldb_modules/instancetype.c b/source4/dsdb/samdb/ldb_modules/instancetype.c
index 7828ce1..4ed906f 100644
--- a/source4/dsdb/samdb/ldb_modules/instancetype.c
+++ b/source4/dsdb/samdb/ldb_modules/instancetype.c
@@ -158,7 +158,23 @@ static int instancetype_add(struct ldb_module *module, struct ldb_request *req)
 	return ldb_next_request(module, down_req);
 }
 
+/* deny instancetype modification */
+static int instancetype_mod(struct ldb_module *module, struct ldb_request *req)
+{
+	struct ldb_context *ldb = ldb_module_get_ctx(module);
+	struct ldb_message_element *el;
+
+	el = ldb_msg_find_element(req->op.mod.message, "instanceType");
+	if (el != NULL) {
+		ldb_set_errstring(ldb, "instancetype: the 'instanceType' attribute can never be changed!");
+		return LDB_ERR_CONSTRAINT_VIOLATION;
+	}
+
+	return ldb_next_request(module, req);
+}
+
 _PUBLIC_ const struct ldb_module_ops ldb_instancetype_module_ops = {
 	.name          = "instancetype",
 	.add           = instancetype_add,
+	.modify        = instancetype_mod
 };
diff --git a/source4/dsdb/samdb/ldb_modules/samba_dsdb.c b/source4/dsdb/samdb/ldb_modules/samba_dsdb.c
index 08df460..137de73 100644
--- a/source4/dsdb/samdb/ldb_modules/samba_dsdb.c
+++ b/source4/dsdb/samdb/ldb_modules/samba_dsdb.c
@@ -183,10 +183,10 @@ static int samba_dsdb_init(struct ldb_module *module)
 					     "samldb",
 					     "password_hash",
 					     "operational",
-					     "objectclass_attrs",
 					     "kludge_acl",
 					     "schema_load",
 					     "instancetype",
+					     "objectclass_attrs",
 					     NULL };
 
 	const char **link_modules;
diff --git a/source4/dsdb/samdb/ldb_modules/samldb.c b/source4/dsdb/samdb/ldb_modules/samldb.c
index 64a91c8..5d64b6d 100644
--- a/source4/dsdb/samdb/ldb_modules/samldb.c
+++ b/source4/dsdb/samdb/ldb_modules/samldb.c
@@ -1176,16 +1176,16 @@ static int samldb_prim_group_change(struct samldb_ctx *ac)
 		return LDB_ERR_UNWILLING_TO_PERFORM;
 	}
 
-	el = samdb_find_attribute(ldb, res->msgs[0], "memberOf",
-				  ldb_dn_get_linearized(new_prim_group_dn));
-	if (el == NULL) {
+	/* Only update the "member" attributes when we really do have a change */
+	if (ldb_dn_compare(new_prim_group_dn, prev_prim_group_dn) != 0) {
 		/* We need to be already a normal member of the new primary
 		 * group in order to be successful. */
-		return LDB_ERR_UNWILLING_TO_PERFORM;
-	}
+		el = samdb_find_attribute(ldb, res->msgs[0], "memberOf",
+					  ldb_dn_get_linearized(new_prim_group_dn));
+		if (el == NULL) {
+			return LDB_ERR_UNWILLING_TO_PERFORM;
+		}
 
-	/* Only update the "member" attributes when we really do have a change */
-	if (ldb_dn_compare(new_prim_group_dn, prev_prim_group_dn) != 0) {
 		/* Remove the "member" attribute on the new primary group */
 		msg = talloc_zero(ac, struct ldb_message);
 		msg->dn = new_prim_group_dn;
@@ -1395,6 +1395,7 @@ static int samldb_add(struct ldb_module *module, struct ldb_request *req)
 static int samldb_modify(struct ldb_module *module, struct ldb_request *req)
 {
 	struct ldb_context *ldb;
+	struct samldb_ctx *ac;
 	struct ldb_message *msg;
 	struct ldb_message_element *el, *el2;
 	int ret;
@@ -1421,6 +1422,11 @@ static int samldb_modify(struct ldb_module *module, struct ldb_request *req)
 		}
 	}
 
+	ac = samldb_ctx_init(module, req);
+	if (ac == NULL) {
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
 	/* TODO: do not modify original request, create a new one */
 
 	el = ldb_msg_find_element(req->op.mod.message, "groupType");
@@ -1447,12 +1453,6 @@ static int samldb_modify(struct ldb_module *module, struct ldb_request *req)
 
 	el = ldb_msg_find_element(req->op.mod.message, "primaryGroupID");
 	if (el && (el->flags == LDB_FLAG_MOD_REPLACE) && el->num_values == 1) {
-		struct samldb_ctx *ac;
-
-		ac = samldb_ctx_init(module, req);
-		if (ac == NULL)
-			return LDB_ERR_OPERATIONS_ERROR;
-
 		req->op.mod.message = ac->msg = ldb_msg_copy_shallow(req,
 			req->op.mod.message);
 
@@ -1511,12 +1511,6 @@ static int samldb_modify(struct ldb_module *module, struct ldb_request *req)
 
 	el = ldb_msg_find_element(req->op.mod.message, "member");
 	if (el && el->flags & (LDB_FLAG_MOD_ADD|LDB_FLAG_MOD_REPLACE) && el->num_values == 1) {
-		struct samldb_ctx *ac;
-
-		ac = samldb_ctx_init(module, req);
-		if (ac == NULL)
-			return LDB_ERR_OPERATIONS_ERROR;
-
 		req->op.mod.message = ac->msg = ldb_msg_copy_shallow(req,
 			req->op.mod.message);
 
diff --git a/source4/lib/ldb/tests/python/ldap.py b/source4/lib/ldb/tests/python/ldap.py
index fa902a0..db69b47 100755
--- a/source4/lib/ldb/tests/python/ldap.py
+++ b/source4/lib/ldb/tests/python/ldap.py
@@ -648,6 +648,45 @@ class BasicTests(unittest.TestCase):
 
         self.delete_force(self.ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
 
+    def test_instanceType(self):
+        """Tests the 'instanceType' attribute"""
+        print "Tests the 'instanceType' attribute"""
+
+        self.ldb.add({
+             "dn": "cn=ldaptestgroup,cn=users," + self.base_dn,
+             "objectclass": "group"})
+
+        m = Message()
+        m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
+        m["instanceType"] = MessageElement("0", FLAG_MOD_REPLACE,
+          "instanceType")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_CONSTRAINT_VIOLATION)
+
+        m = Message()
+        m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
+        m["instanceType"] = MessageElement([], FLAG_MOD_REPLACE,
+          "instanceType")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_CONSTRAINT_VIOLATION)
+
+        m = Message()
+        m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
+        m["instanceType"] = MessageElement([], FLAG_MOD_DELETE, "instanceType")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_CONSTRAINT_VIOLATION)
+
+        self.delete_force(self.ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
+
     def test_distinguished_name(self):
         """Tests the 'distinguishedName' attribute"""
         print "Tests the 'distinguishedName' attribute"""
@@ -989,6 +1028,13 @@ objectClass: container
             "dn": "cn=ldaptestuser,cn=users," + self.base_dn,
             "objectclass": ["user", "person"]})
 
+        # We should be able to reset our actual primary group
+        m = Message()
+        m.dn = Dn(ldb, "cn=ldaptestuser,cn=users," + self.base_dn)
+        m["primaryGroupID"] = MessageElement("513", FLAG_MOD_REPLACE,
+          "primaryGroupID")
+        ldb.modify(m)
+
         # Try to add invalid primary group
         m = Message()
         m.dn = Dn(ldb, "cn=ldaptestuser,cn=users," + self.base_dn)
diff --git a/source4/rpc_server/samr/dcesrv_samr.c b/source4/rpc_server/samr/dcesrv_samr.c
index fafa9d6..2ab5155 100644
--- a/source4/rpc_server/samr/dcesrv_samr.c
+++ b/source4/rpc_server/samr/dcesrv_samr.c
@@ -1513,7 +1513,8 @@ static NTSTATUS dcesrv_samr_GetAliasMembership(struct dcesrv_call_state *dce_cal
 	struct dcesrv_handle *h;
 	struct samr_domain_state *d_state;
 	struct ldb_message **res;
-	int i, count = 0;
+	uint32_t i;
+	int count = 0;
 
 	DCESRV_PULL_HANDLE(h, r->in.domain_handle, SAMR_HANDLE_DOMAIN);
 
@@ -1948,12 +1949,11 @@ static NTSTATUS dcesrv_samr_AddGroupMember(struct dcesrv_call_state *dce_call, T
 		return NT_STATUS_NO_MEMORY;
 	}
 
-	/* In native mode, AD can also nest domain groups. Not sure yet
-	 * whether this is also available via RPC. */
+	/* according to MS-SAMR 3.1.5.8.2 all type of accounts are accepted */
 	ret = ldb_search(d_state->sam_ctx, mem_ctx, &res,
-				 d_state->domain_dn, LDB_SCOPE_SUBTREE, attrs,
-				 "(&(objectSid=%s)(objectclass=user))",
-				 ldap_encode_ndr_dom_sid(mem_ctx, membersid));
+			 d_state->domain_dn, LDB_SCOPE_SUBTREE, attrs,
+			 "(objectSid=%s)",
+			 ldap_encode_ndr_dom_sid(mem_ctx, membersid));
 
 	if (ret != LDB_SUCCESS) {
 		return NT_STATUS_INTERNAL_DB_CORRUPTION;
@@ -1990,6 +1990,7 @@ static NTSTATUS dcesrv_samr_AddGroupMember(struct dcesrv_call_state *dce_call, T
 	case LDB_SUCCESS:
 		return NT_STATUS_OK;
 	case LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS:
+	case LDB_ERR_ENTRY_ALREADY_EXISTS:
 		return NT_STATUS_MEMBER_IN_GROUP;
 	case LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS:
 		return NT_STATUS_ACCESS_DENIED;
@@ -2049,15 +2050,15 @@ static NTSTATUS dcesrv_samr_DeleteGroupMember(struct dcesrv_call_state *dce_call
 	d_state = a_state->domain_state;
 
 	membersid = dom_sid_add_rid(mem_ctx, d_state->domain_sid, r->in.rid);
-	if (membersid == NULL)
+	if (membersid == NULL) {
 		return NT_STATUS_NO_MEMORY;
+	}
 
-	/* In native mode, AD can also nest domain groups. Not sure yet
-	 * whether this is also available via RPC. */
+	/* according to MS-SAMR 3.1.5.8.2 all type of accounts are accepted */
 	ret = ldb_search(d_state->sam_ctx, mem_ctx, &res,
-				 d_state->domain_dn, LDB_SCOPE_SUBTREE, attrs,
-				 "(&(objectSid=%s)(objectclass=user))",
-				 ldap_encode_ndr_dom_sid(mem_ctx, membersid));
+			 d_state->domain_dn, LDB_SCOPE_SUBTREE, attrs,
+			 "(objectSid=%s)",
+			 ldap_encode_ndr_dom_sid(mem_ctx, membersid));
 
 	if (ret != LDB_SUCCESS) {
 		return NT_STATUS_INTERNAL_DB_CORRUPTION;
@@ -2420,10 +2421,6 @@ static NTSTATUS dcesrv_samr_AddAliasMember(struct dcesrv_call_state *dce_call, T
 
 	if (ret == 1) {
 		memberdn = msgs[0]->dn;
-	} else 	if (ret > 1) {
-		DEBUG(0,("Found %d records matching sid %s\n", 
-			 ret, dom_sid_string(mem_ctx, r->in.sid)));
-		return NT_STATUS_INTERNAL_DB_CORRUPTION;
 	} else if (ret == 0) {
 		status = samdb_create_foreign_security_principal(
 			d_state->sam_ctx, mem_ctx, r->in.sid, &memberdn);
@@ -2431,8 +2428,9 @@ static NTSTATUS dcesrv_samr_AddAliasMember(struct dcesrv_call_state *dce_call, T
 			return status;
 		}
 	} else {
-		DEBUG(0, ("samdb_search returned %d: %s\n", ret,
-		      ldb_errstring(d_state->sam_ctx)));
+		DEBUG(0,("Found %d records matching sid %s\n",
+			 ret, dom_sid_string(mem_ctx, r->in.sid)));
+		return NT_STATUS_INTERNAL_DB_CORRUPTION;
 	}
 
 	if (memberdn == NULL) {
@@ -2453,11 +2451,18 @@ static NTSTATUS dcesrv_samr_AddAliasMember(struct dcesrv_call_state *dce_call, T
 		return NT_STATUS_UNSUCCESSFUL;
 	}
 
-	if (ldb_modify(a_state->sam_ctx, mod) != LDB_SUCCESS) {
+	ret = ldb_modify(a_state->sam_ctx, mod);
+	switch (ret) {
+	case LDB_SUCCESS:
+		return NT_STATUS_OK;
+	case LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS:
+	case LDB_ERR_ENTRY_ALREADY_EXISTS:
+		return NT_STATUS_MEMBER_IN_GROUP;
+	case LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS:
+		return NT_STATUS_ACCESS_DENIED;
+	default:
 		return NT_STATUS_UNSUCCESSFUL;
 	}
-
-	return NT_STATUS_OK;
 }
 
 
@@ -2482,9 +2487,9 @@ static NTSTATUS dcesrv_samr_DeleteAliasMember(struct dcesrv_call_state *dce_call
 	memberdn = samdb_search_string(d_state->sam_ctx, mem_ctx, NULL,
 				       "distinguishedName", "(objectSid=%s)", 
 				       ldap_encode_ndr_dom_sid(mem_ctx, r->in.sid));
-
-	if (memberdn == NULL)
+	if (memberdn == NULL) {
 		return NT_STATUS_OBJECT_NAME_NOT_FOUND;
+	}
 
 	mod = ldb_msg_new(mem_ctx);
 	if (mod == NULL) {
@@ -2495,13 +2500,21 @@ static NTSTATUS dcesrv_samr_DeleteAliasMember(struct dcesrv_call_state *dce_call
 
 	ret = samdb_msg_add_delval(d_state->sam_ctx, mem_ctx, mod, "member",
 								 memberdn);
-	if (ret != LDB_SUCCESS)
+	if (ret != LDB_SUCCESS) {
 		return NT_STATUS_UNSUCCESSFUL;
+	}
 
-	if (ldb_modify(a_state->sam_ctx, mod) != LDB_SUCCESS)
+	ret = ldb_modify(a_state->sam_ctx, mod);
+	switch (ret) {
+	case LDB_SUCCESS:
+		return NT_STATUS_OK;
+	case LDB_ERR_NO_SUCH_ATTRIBUTE:
+		return NT_STATUS_MEMBER_NOT_IN_GROUP;
+	case LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS:
+		return NT_STATUS_ACCESS_DENIED;
+	default:
 		return NT_STATUS_UNSUCCESSFUL;
-
-	return NT_STATUS_OK;
+	}
 }
 
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list