[SCM] Samba Shared Repository - branch master updated

Nadezhda Ivanova nivanova at samba.org
Mon Apr 19 15:25:05 MDT 2010


The branch, master has been updated
       via  4fc5908... Removed more excess looping and fixed problem with incorrect IO flag handling.
      from  cea24c4... Remove an unused auto variable.

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


- Log -----------------------------------------------------------------
commit 4fc59089c81b251b4fab17f170e96bd6dac02490
Author: Nadezhda Ivanova <nivanova at samba.org>
Date:   Tue Apr 20 00:23:42 2010 +0300

    Removed more excess looping and fixed problem with incorrect IO flag handling.

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

Summary of changes:
 source4/lib/ldb/tests/python/sec_descriptor.py |   33 ++++
 source4/libcli/security/create_descriptor.c    |  207 +++++++++--------------
 2 files changed, 114 insertions(+), 126 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/lib/ldb/tests/python/sec_descriptor.py b/source4/lib/ldb/tests/python/sec_descriptor.py
index 609fca8..f26df07 100755
--- a/source4/lib/ldb/tests/python/sec_descriptor.py
+++ b/source4/lib/ldb/tests/python/sec_descriptor.py
@@ -1725,6 +1725,39 @@ class DaclDescriptorTests(DescriptorTests):
         desc_sddl = self.get_desc_sddl(group_dn)
         self.assertTrue("(D;;WP;;;DA)(D;CIIO;WP;;;CO)" in desc_sddl)
 
+    def test_212(self):
+        """ Provide ACE with IO flag, should be ignored
+        """
+        ou_dn = "OU=test_inherit_ou," + self.base_dn
+        group_dn = "CN=test_inherit_group," + ou_dn
+        # Create inheritable-free OU
+        self.create_clean_ou(ou_dn)
+        # Add some custom 'CI' ACE
+        mod = "D:(D;CIIO;WP;;;CO)"
+        self.create_domain_group(self.ldb_admin, group_dn, mod)
+        # Make sure created group object contains only the above inherited ACE(s)
+        # that we've added manually
+        desc_sddl = self.get_desc_sddl(group_dn)
+        print desc_sddl
+        self.assertTrue("(D;CIIO;WP;;;CO)" in desc_sddl)
+        self.assertFalse("(D;;WP;;;DA)" in desc_sddl)
+        self.assertFalse("(D;CIIO;WP;;;CO)(D;CIIO;WP;;;CO)" in desc_sddl)
+
+    def test_213(self):
+        """ Provide ACE with IO flag, should be ignored
+        """
+        ou_dn = "OU=test_inherit_ou," + self.base_dn
+        group_dn = "CN=test_inherit_group," + ou_dn
+        # Create inheritable-free OU
+        self.create_clean_ou(ou_dn)
+        mod = "D:(D;IO;WP;;;DA)"
+        self.create_domain_group(self.ldb_admin, group_dn, mod)
+        # Make sure created group object contains only the above inherited ACE(s)
+        # that we've added manually
+        desc_sddl = self.get_desc_sddl(group_dn)
+        print desc_sddl
+        self.assertFalse("(D;IO;WP;;;DA)" in desc_sddl)
+
     ########################################################################################
 
 
diff --git a/source4/libcli/security/create_descriptor.c b/source4/libcli/security/create_descriptor.c
index f4849cf..d64de2f 100644
--- a/source4/libcli/security/create_descriptor.c
+++ b/source4/libcli/security/create_descriptor.c
@@ -53,22 +53,22 @@
 
 uint32_t map_generic_rights_ds(uint32_t access_mask)
 {
-	if (access_mask & SEC_GENERIC_ALL){
+	if (access_mask & SEC_GENERIC_ALL) {
 		access_mask |= SEC_ADS_GENERIC_ALL;
 		access_mask = ~SEC_GENERIC_ALL;
 	}
 
-	if (access_mask & SEC_GENERIC_EXECUTE){
+	if (access_mask & SEC_GENERIC_EXECUTE) {
 		access_mask |= SEC_ADS_GENERIC_EXECUTE;
 		access_mask = ~SEC_GENERIC_EXECUTE;
 	}
 
-	if (access_mask & SEC_GENERIC_WRITE){
+	if (access_mask & SEC_GENERIC_WRITE) {
 		access_mask |= SEC_ADS_GENERIC_WRITE;
 		access_mask &= ~SEC_GENERIC_WRITE;
 	}
 
-	if (access_mask & SEC_GENERIC_READ){
+	if (access_mask & SEC_GENERIC_READ) {
 		access_mask |= SEC_ADS_GENERIC_READ;
 		access_mask &= ~SEC_GENERIC_READ;
 	}
@@ -83,85 +83,20 @@ static bool object_in_list(struct GUID *object_list, struct GUID *object)
 	return true;
 }
 
- /* remove any ACEs with inherited flag up  - TODO test this! */
-static struct security_acl *clean_user_acl(TALLOC_CTX *mem, struct security_acl *acl)
-{
-	int i;
-	struct security_acl *new_acl; 
-	if (!acl) {
-		return NULL;
-	}
-	
-	new_acl = talloc_zero(mem, struct security_acl);
-
-	for (i=0; i < acl->num_aces; i++) {
-		struct security_ace *ace = &acl->aces[i];
-		if (!(ace->flags & SEC_ACE_FLAG_INHERITED_ACE)){
-			new_acl->aces = talloc_realloc(new_acl, new_acl->aces, struct security_ace,
-					   new_acl->num_aces+1);
-			if (new_acl->aces == NULL) {
-				talloc_free(new_acl);
-				return NULL;
-			}
-			new_acl->aces[new_acl->num_aces] = *ace;
-			new_acl->num_aces++;
-		}
-	}
-	if (new_acl)
-		new_acl->revision = acl->revision;
-
-	return new_acl;
-}
-
-/* sort according to rules,
- * replace generic flags with the mapping
- * replace CO and CG with the appropriate owner/group */
-
-static bool postprocess_acl(struct security_acl *acl,
-			    struct dom_sid *owner,
-			    struct dom_sid *group,
-			    uint32_t (*generic_map)(uint32_t access_mask))
-{
-	int i;
-	struct dom_sid *co, *cg;
-	TALLOC_CTX *tmp_ctx = talloc_new(acl);
-	if (!generic_map){
-		return false;
-	}
-	co = dom_sid_parse_talloc(tmp_ctx,  SID_CREATOR_OWNER);
-	cg = dom_sid_parse_talloc(tmp_ctx,  SID_CREATOR_GROUP);
-	for (i=0; i < acl->num_aces; i++) {
-		struct security_ace *ace = &acl->aces[i];
-		if (ace->flags & SEC_ACE_FLAG_INHERIT_ONLY)
-			continue;
-		if (dom_sid_equal(&ace->trustee, co)){
-			ace->trustee = *owner;
-			ace->flags &= ~SEC_ACE_FLAG_CONTAINER_INHERIT;
-		}
-		if (dom_sid_equal(&ace->trustee, cg)){
-			ace->trustee = *group;
-			ace->flags &= ~SEC_ACE_FLAG_CONTAINER_INHERIT;
-			}
-		ace->access_mask = generic_map(ace->access_mask);
-	}
-
-	talloc_free(tmp_ctx);
-	return true;
-}
-
 static struct security_acl *calculate_inherited_from_parent(TALLOC_CTX *mem_ctx,
-						struct security_acl *acl,
-						bool is_container,
-						struct GUID *object_list)
+							    struct security_acl *acl,
+							    bool is_container,
+							    struct dom_sid *owner,
+							    struct dom_sid *group,
+							    struct GUID *object_list)
 {
 	int i;
 	TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
-	struct security_acl *tmp_acl = talloc_zero(tmp_ctx, struct security_acl);
-	struct security_acl *inh_acl = talloc_zero(tmp_ctx, struct security_acl);
-	struct security_acl *new_acl;
+	struct security_acl *tmp_acl = talloc_zero(mem_ctx, struct security_acl);
 	struct dom_sid *co, *cg;
-	if (!tmp_acl || !inh_acl)
+	if (!tmp_acl) {
 		return NULL;
+	}
 
 	if (!acl) {
 		return NULL;
@@ -169,7 +104,7 @@ static struct security_acl *calculate_inherited_from_parent(TALLOC_CTX *mem_ctx,
 	co = dom_sid_parse_talloc(tmp_ctx,  SID_CREATOR_OWNER);
 	cg = dom_sid_parse_talloc(tmp_ctx,  SID_CREATOR_GROUP);
 
-	for (i=0; i < acl->num_aces; i++){
+	for (i=0; i < acl->num_aces; i++) {
 		struct security_ace *ace = &acl->aces[i];
 		if ((ace->flags & SEC_ACE_FLAG_CONTAINER_INHERIT) ||
 		    (ace->flags & SEC_ACE_FLAG_OBJECT_INHERIT)) {
@@ -188,53 +123,55 @@ static struct security_acl *calculate_inherited_from_parent(TALLOC_CTX *mem_ctx,
 
 			if (ace->type == SEC_ACE_TYPE_ACCESS_ALLOWED_OBJECT ||
 			    ace->type == SEC_ACE_TYPE_ACCESS_DENIED_OBJECT) {
-				if (!object_in_list(object_list, &ace->object.object.type.type)){
+				if (!object_in_list(object_list, &ace->object.object.type.type)) {
 					tmp_acl->aces[tmp_acl->num_aces].flags |= SEC_ACE_FLAG_INHERIT_ONLY;
 				}
 
 			}
+			tmp_acl->aces[tmp_acl->num_aces].access_mask =
+						    map_generic_rights_ds(ace->access_mask);
 			tmp_acl->num_aces++;
-		}
-	}
-
-	if (is_container) {
-		for (i=0; i < acl->num_aces; i++){
-			struct security_ace *ace = &acl->aces[i];
-
-			if (ace->flags & SEC_ACE_FLAG_NO_PROPAGATE_INHERIT)
-				continue;
-			if (!dom_sid_equal(&ace->trustee, co) && !dom_sid_equal(&ace->trustee, cg))
-				continue;
-
-			if ((ace->flags & SEC_ACE_FLAG_CONTAINER_INHERIT) ||
-			    (ace->flags & SEC_ACE_FLAG_OBJECT_INHERIT)){
-				inh_acl->aces = talloc_realloc(inh_acl, inh_acl->aces, struct security_ace,
-							       inh_acl->num_aces+1);
-				if (inh_acl->aces == NULL){
-					talloc_free(tmp_ctx);
-					return NULL;
+			if (is_container) {
+				if (!(ace->flags & SEC_ACE_FLAG_NO_PROPAGATE_INHERIT) &&
+				    ((dom_sid_equal(&ace->trustee, co) || dom_sid_equal(&ace->trustee, cg)))) {
+					    tmp_acl->aces = talloc_realloc(tmp_acl, tmp_acl->aces, struct security_ace,
+									   tmp_acl->num_aces+1);
+					    if (tmp_acl->aces == NULL) {
+						    talloc_free(tmp_ctx);
+						    return NULL;
+					    }
+					    tmp_acl->aces[tmp_acl->num_aces] = *ace;
+					    tmp_acl->aces[tmp_acl->num_aces].flags &= ~SEC_ACE_FLAG_INHERIT_ONLY;
+					    tmp_acl->aces[tmp_acl->num_aces].flags |= SEC_ACE_FLAG_INHERITED_ACE;
+					    if (dom_sid_equal(&tmp_acl->aces[tmp_acl->num_aces].trustee, co)) {
+						    tmp_acl->aces[tmp_acl->num_aces].trustee = *owner;
+					    }
+					    if (dom_sid_equal(&tmp_acl->aces[tmp_acl->num_aces].trustee, cg)) {
+						    tmp_acl->aces[tmp_acl->num_aces].trustee = *group;
+					    }
+					    tmp_acl->aces[tmp_acl->num_aces].flags &= ~SEC_ACE_FLAG_CONTAINER_INHERIT;
+					    tmp_acl->aces[tmp_acl->num_aces].access_mask =
+						    map_generic_rights_ds(ace->access_mask);
+					    tmp_acl->num_aces++;
 				}
-				inh_acl->aces[inh_acl->num_aces] = *ace;
-				inh_acl->aces[inh_acl->num_aces].flags &= ~SEC_ACE_FLAG_INHERIT_ONLY;
-				inh_acl->aces[inh_acl->num_aces].flags |= SEC_ACE_FLAG_INHERITED_ACE;
-				inh_acl->num_aces++;
 			}
 		}
-		}
-	new_acl = security_acl_concatenate(mem_ctx, inh_acl, tmp_acl);
-	if (new_acl->num_aces == 0) {
+	}
+	if (tmp_acl->num_aces == 0) {
 		return NULL;
 	}
-	if (new_acl)
-		new_acl->revision = acl->revision;
-	talloc_free(tmp_ctx);
-	return new_acl;
+	if (acl) {
+		tmp_acl->revision = acl->revision;
+	}
+	return tmp_acl;
 }
 
-static struct security_acl *calculate_inherited_from_creator(TALLOC_CTX *mem_ctx,
-							     struct security_acl *acl,
-							     bool is_container,
-							     struct GUID *object_list)
+static struct security_acl *process_user_acl(TALLOC_CTX *mem_ctx,
+					     struct security_acl *acl,
+					     bool is_container,
+					     struct dom_sid *owner,
+					     struct dom_sid *group,
+					     struct GUID *object_list)
 {
 	int i;
 	TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
@@ -258,10 +195,24 @@ static struct security_acl *calculate_inherited_from_creator(TALLOC_CTX *mem_ctx
 		struct security_ace *ace = &acl->aces[i];
 		if (ace->flags & SEC_ACE_FLAG_INHERITED_ACE)
 			continue;
+		if (ace->flags & SEC_ACE_FLAG_INHERIT_ONLY &&
+		    !(ace->flags & SEC_ACE_FLAG_CONTAINER_INHERIT ||
+		      ace->flags & SEC_ACE_FLAG_OBJECT_INHERIT))
+			continue;
 
 		tmp_acl->aces = talloc_realloc(tmp_acl, tmp_acl->aces, struct security_ace,
 					      tmp_acl->num_aces+1);
 		tmp_acl->aces[tmp_acl->num_aces] = *ace;
+		if (dom_sid_equal(&(tmp_acl->aces[tmp_acl->num_aces].trustee), co)) {
+			tmp_acl->aces[tmp_acl->num_aces].trustee = *owner;
+			tmp_acl->aces[tmp_acl->num_aces].flags &= ~SEC_ACE_FLAG_CONTAINER_INHERIT;
+		}
+		if (dom_sid_equal(&(tmp_acl->aces[tmp_acl->num_aces].trustee), cg)) {
+			tmp_acl->aces[tmp_acl->num_aces].trustee = *group;
+			tmp_acl->aces[tmp_acl->num_aces].flags &= ~SEC_ACE_FLAG_CONTAINER_INHERIT;
+			}
+		tmp_acl->aces[tmp_acl->num_aces].access_mask =
+			map_generic_rights_ds(tmp_acl->aces[tmp_acl->num_aces].access_mask);
 		tmp_acl->num_aces++;
 
 		if (!dom_sid_equal(&ace->trustee, co) && !dom_sid_equal(&ace->trustee, cg))
@@ -319,7 +270,7 @@ static bool compute_acl(struct security_descriptor *parent_sd,
 			struct security_token *token,
 			struct security_descriptor *new_sd) /* INOUT argument */
 {
-	struct security_acl *user_dacl, *tmp_dacl, *tmp_sacl, *user_sacl, *inherited_dacl, *inherited_sacl;
+	struct security_acl *user_dacl, *user_sacl, *inherited_dacl, *inherited_sacl;
 	int level = 10;
 
 	if (!parent_sd || !(inherit_flags & SEC_DACL_AUTO_INHERIT)) {
@@ -330,6 +281,8 @@ static bool compute_acl(struct security_descriptor *parent_sd,
 		inherited_dacl = calculate_inherited_from_parent(new_sd,
 								 parent_sd->dacl,
 								 is_container,
+								 new_sd->owner_sid,
+								 new_sd->group_sid,
 								 object_list);
 	}
 
@@ -342,6 +295,8 @@ static bool compute_acl(struct security_descriptor *parent_sd,
 		inherited_sacl = calculate_inherited_from_parent(new_sd,
 								 parent_sd->sacl,
 								 is_container,
+								 new_sd->owner_sid,
+								 new_sd->group_sid,
 								 object_list);
 	}
 
@@ -349,16 +304,18 @@ static bool compute_acl(struct security_descriptor *parent_sd,
 		user_dacl = NULL;
 		user_sacl = NULL;
 	} else {
-		tmp_dacl = clean_user_acl(new_sd, creator_sd->dacl);
-		user_dacl = calculate_inherited_from_creator(new_sd,
-							     tmp_dacl,
-							     is_container,
-							     object_list);
-		tmp_sacl = clean_user_acl(new_sd, creator_sd->sacl);
-		user_sacl = calculate_inherited_from_creator(new_sd,
-							     tmp_sacl,
-							     is_container,
-							     object_list);
+		user_dacl = process_user_acl(new_sd,
+					     creator_sd->dacl,
+					     is_container,
+					     new_sd->owner_sid,
+					     new_sd->group_sid,
+					     object_list);
+		user_sacl = process_user_acl(new_sd,
+					     creator_sd->sacl,
+					     is_container,
+					     new_sd->owner_sid,
+					     new_sd->group_sid,
+					     object_list);
 	}
 	cr_descr_log_descriptor(parent_sd, __location__"parent_sd", level);
 	cr_descr_log_descriptor(creator_sd,__location__ "creator_sd", level);
@@ -366,7 +323,6 @@ static bool compute_acl(struct security_descriptor *parent_sd,
 	new_sd->dacl = security_acl_concatenate(new_sd, user_dacl, inherited_dacl);
 	if (new_sd->dacl) {
 		new_sd->type |= SEC_DESC_DACL_PRESENT;
-		postprocess_acl(new_sd->dacl,new_sd->owner_sid,new_sd->group_sid,generic_map);
 	}
 	if (inherited_dacl) {
 		new_sd->type |= SEC_DESC_DACL_AUTO_INHERITED;
@@ -375,7 +331,6 @@ static bool compute_acl(struct security_descriptor *parent_sd,
 	new_sd->sacl = security_acl_concatenate(new_sd, user_sacl, inherited_sacl);
 	if (new_sd->sacl) {
 		new_sd->type |= SEC_DESC_SACL_PRESENT;
-		postprocess_acl(new_sd->sacl,new_sd->owner_sid,new_sd->group_sid,generic_map);
 	}
 	if (inherited_sacl) {
 		new_sd->type |= SEC_DESC_SACL_AUTO_INHERITED;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list