revert ...
authorStefan Metzmacher <metze@samba.org>
Tue, 8 Jan 2013 15:10:06 +0000 (16:10 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 29 Jan 2013 21:03:23 +0000 (22:03 +0100)
Conflicts:

source4/scripting/python/samba/provision/__init__.py

libcli/security/access_check.c
libcli/security/secdesc.c
source3/utils/smbcacls.c
source4/ntvfs/posix/pvfs_acl.c
source4/scripting/python/samba/netcmd/gpo.py
source4/scripting/python/samba/netcmd/ldapcmp.py
source4/scripting/python/samba/ntacls.py
source4/scripting/python/samba/provision/__init__.py
source4/scripting/python/samba/tests/posixacl.py
source4/scripting/python/samba/tests/samba_tool/gpo.py
source4/torture/drs/rpc/dssync.c

index 7f50d464da95df37d5e8d5b3f74ca8a5f84b5745..936ffca242e6b6e7682f97dc3815e54715ee8fe9 100644 (file)
@@ -73,9 +73,6 @@ void security_acl_map_generic(struct security_acl *sa,
        }
 
        for (i = 0; i < sa->num_aces; i++) {
-               if (sa->aces[i].flags & SEC_ACE_FLAG_INHERIT_ONLY) {
-                       continue;
-               }
                se_map_generic(&sa->aces[i].access_mask, mapping);
        }
 }
index 67b9893fd6c2e6303b9d6a7ce76294c2d39db6d1..d2c58334927592becd7524c6f73724f84452b817 100644 (file)
@@ -624,11 +624,6 @@ NTSTATUS se_create_child_secdesc(TALLOC_CTX *ctx,
                        }
                }
 
-               if (ace->flags & SEC_ACE_FLAG_INHERIT_ONLY) {
-                       creator = &ace->trustee;
-                       ptrustee = &ace->trustee;
-               }
-
                /* The CREATOR sids are special when inherited */
                if (dom_sid_equal(ptrustee, &global_sid_Creator_Owner)) {
                        creator = &global_sid_Creator_Owner;
@@ -730,8 +725,6 @@ NTSTATUS se_create_child_secdesc(TALLOC_CTX *ctx,
                }
        }
 
-       security_acl_map_generic(new_dacl, &file_generic_mapping);
-
        *ppsd = make_sec_desc(ctx,
                        SECURITY_DESCRIPTOR_REVISION_1,
                        SEC_DESC_SELF_RELATIVE|SEC_DESC_DACL_PRESENT|
index 1c1a6c1f77f1593d450078f306787a8ae4e82c19..39400c8bdd78392c86a3d8f65b2840958f86fff9 100644 (file)
@@ -790,18 +790,11 @@ static void sec_desc_print(struct cli_state *cli, FILE *f, struct security_descr
        /* Print aces */
        for (i = 0; sd->dacl && i < sd->dacl->num_aces; i++) {
                struct security_ace *ace = &sd->dacl->aces[i];
-               fprintf(f, "DACL:");
+               fprintf(f, "ACL:");
                print_ace(cli, f, ace);
                fprintf(f, "\n");
        }
 
-       /* Print aces */
-       for (i = 0; sd->sacl && i < sd->sacl->num_aces; i++) {
-               struct security_ace *ace = &sd->sacl->aces[i];
-               fprintf(f, "SACL:");
-               print_ace(cli, f, ace);
-               fprintf(f, "\n");
-       }
 }
 
 /*****************************************************
index 715d6161a88b56b12b60c9461bc07e052916602a..4e9c1ac6b5a0cbd3c13226f923177915d082df7f 100644 (file)
@@ -133,9 +133,6 @@ static void pvfs_translate_generic_bits(struct security_acl *acl)
 
        for (i=0;i<acl->num_aces;i++) {
                struct security_ace *ace = &acl->aces[i];
-               if (ace->flags & SEC_ACE_FLAG_INHERIT_ONLY) {
-                       continue;
-               }
                ace->access_mask = pvfs_translate_mask(ace->access_mask);
        }
 }
@@ -872,11 +869,6 @@ static NTSTATUS pvfs_acl_inherit_aces(struct pvfs_state *pvfs,
                        }
                }
 
-               if (orig_flags & SEC_ACE_FLAG_INHERIT_ONLY) {
-                       creator = &ace.trustee;
-                       new_id = &ace.trustee;
-               }
-
                /* the CREATOR sids are special when inherited */
                if (dom_sid_equal(&ace.trustee, pvfs->sid_cache.creator_owner)) {
                        creator = pvfs->sid_cache.creator_owner;
@@ -915,9 +907,6 @@ static NTSTATUS pvfs_acl_inherit_aces(struct pvfs_state *pvfs,
                }
        }
 
-       pvfs_translate_generic_bits(sd->dacl);
-       sd->type |= SEC_DESC_DACL_PRESENT;
-
        return NT_STATUS_OK;
 }
 
index 28462bf0edac2fc193a58870035f35e2c0629173..23b562eb6358fba17dd5151203ff4ca67c2ea1d7 100644 (file)
@@ -45,7 +45,6 @@ from samba.ntacls import dsacl2fsacl
 from samba.dcerpc import nbt
 from samba.net import Net
 
-from samba.provision import DEFAULT_POLICY_GUID, DEFAULT_DC_POLICY_GUID, SYSVOL_SUBFOLDER_SD
 
 def samdb_connect(ctx):
     '''make a ldap connection to the server'''
@@ -987,17 +986,12 @@ class cmd_create(Command):
 
             # Create a file system security descriptor
             domain_sid = security.dom_sid(self.samdb.get_domain_sid())
-            fs_sd = dsacl2fsacl(ds_sd, domain_sid, as_sddl=False)
-            fs_sd.type = security.SEC_DESC_SELF_RELATIVE
-            fs_sd.type |= security.SEC_DESC_DACL_PROTECTED
-            fs_sd.type |= security.SEC_DESC_DACL_AUTO_INHERITED
-            fs_sd.type |= security.SEC_DESC_DACL_AUTO_INHERIT_REQ
-            fs_sd.type |= security.SEC_DESC_SACL_AUTO_INHERITED
+            sddl = dsacl2fsacl(ds_sd, domain_sid)
+            fs_sd = security.descriptor.from_sddl(sddl, domain_sid)
 
             # Copy GPO directory
             create_directory_hier(conn, sharepath)
 
-            fs_sd = conn.get_acl(sharepath, security.SECINFO_OWNER | security.SECINFO_GROUP | security.SECINFO_DACL, security.SEC_FLAG_MAXIMUM_ALLOWED)
             # Set ACL
             sio = ( security.SECINFO_OWNER |
                     security.SECINFO_GROUP |
@@ -1139,11 +1133,7 @@ class cmd_aclcheck(Command):
 
         for m in msg:
             # verify UNC path
-            try:
-                unc = m['gPCFileSysPath'][0]
-            except Exception:
-                continue
-
+            unc = m['gPCFileSysPath'][0]
             try:
                 [dom_name, service, sharepath] = parse_unc(unc)
             except ValueError:
@@ -1155,23 +1145,14 @@ class cmd_aclcheck(Command):
             except Exception:
                 raise CommandError("Error connecting to '%s' using SMB" % dc_hostname)
 
-            try:
-               fs_sd = conn.get_acl(sharepath, security.SECINFO_OWNER | security.SECINFO_GROUP | security.SECINFO_DACL, security.SEC_FLAG_MAXIMUM_ALLOWED)
-            except Exception:
-                raise CommandError("Failed to get security_descriptor of '%s' using SMB" % sharepath)
+            fs_sd = conn.get_acl(sharepath, security.SECINFO_OWNER | security.SECINFO_GROUP | security.SECINFO_DACL, security.SEC_FLAG_MAXIMUM_ALLOWED)
 
-            domain_sid = security.dom_sid(self.samdb.get_domain_sid())
-            name = m['name'][0]
-            if DEFAULT_POLICY_GUID in name or DEFAULT_DC_POLICY_GUID in name:
-                expected_fs_sd = security.descriptor.from_sddl(SYSVOL_SUBFOLDER_SD, domain_sid)
-                expected_fs_sd.sacl = None
-                expected_fs_sddl = expected_fs_sd.as_sddl(domain_sid)
-            else:
-                ds_sd_ndr = m['nTSecurityDescriptor'][0]
-                ds_sd = ndr_unpack(security.descriptor, ds_sd_ndr).as_sddl()
+            ds_sd_ndr = m['nTSecurityDescriptor'][0]
+            ds_sd = ndr_unpack(security.descriptor, ds_sd_ndr).as_sddl()
 
-                # Create a file system security descriptor
-                expected_fs_sddl = dsacl2fsacl(ds_sd, domain_sid)
+            # Create a file system security descriptor
+            domain_sid = security.dom_sid(self.samdb.get_domain_sid())
+            expected_fs_sddl = dsacl2fsacl(ds_sd, domain_sid)
 
             if (fs_sd.as_sddl(domain_sid) != expected_fs_sddl):
                 raise CommandError("Invalid GPO ACL %s on path (%s), should be %s" % (fs_sd.as_sddl(domain_sid), sharepath, expected_fs_sddl))
index 338d744f121c996f718f7b50b8411630c0ffb92e..8398205e4badefd096076f7169fd91f977f3d62d 100644 (file)
@@ -220,7 +220,7 @@ class LDAPBase(object):
     def get_descriptor_sddl(self, object_dn):
         res = self.ldb.search(base=object_dn, scope=SCOPE_BASE, attrs=["nTSecurityDescriptor"])
         desc = res[0]["nTSecurityDescriptor"][0]
-        desc = ndr_unpack(security.descriptor, desc,allow_remaining=True)
+        desc = ndr_unpack(security.descriptor, desc)
         return desc.as_sddl(self.domain_sid)
 
     def guid_as_string(self, guid_blob):
index f0573de13a23d548a2c3ee9ba493519b5d4e0598..53438d84bffbc088e3aa0d177b728a2797407c05 100644 (file)
@@ -221,112 +221,20 @@ def dsacl2fsacl(dssddl, sid, as_sddl=True):
     fdescr.owner_sid = ref.owner_sid
     fdescr.group_sid = ref.group_sid
     fdescr.type = ref.type
-    fdescr.type |= security.SEC_DESC_DACL_AUTO_INHERITED
     fdescr.revision = ref.revision
     aces = ref.dacl.aces
     for i in range(0, len(aces)):
         ace = aces[i]
-        if ace.type == security.SEC_ACE_TYPE_ACCESS_ALLOWED:
-            pass
-        elif ace.type == security.SEC_ACE_TYPE_ACCESS_DENIED:
-            pass
-        else:
-            continue
-
-        if str(ace.trustee) == security.SID_BUILTIN_PREW2K:
-            continue
-
-        ace.flags |= security.SEC_ACE_FLAG_CONTAINER_INHERIT
-        ace.flags |= security.SEC_ACE_FLAG_OBJECT_INHERIT
-
-        ace.access_mask = ldapmask2filemask(ace.access_mask)
-
-        fdescr.dacl_add(ace)
+        if not ace.type & security.SEC_ACE_TYPE_ACCESS_ALLOWED_OBJECT and str(ace.trustee) != security.SID_BUILTIN_PREW2K:
+       #    if fdescr.type & security.SEC_DESC_DACL_AUTO_INHERITED:
+            ace.flags = ace.flags | security.SEC_ACE_FLAG_OBJECT_INHERIT | security.SEC_ACE_FLAG_CONTAINER_INHERIT
+            if str(ace.trustee) == security.SID_CREATOR_OWNER:
+                # For Creator/Owner the IO flag is set as this ACE has only a sense for child objects
+                ace.flags = ace.flags | security.SEC_ACE_FLAG_INHERIT_ONLY
+            ace.access_mask =  ldapmask2filemask(ace.access_mask)
+            fdescr.dacl_add(ace)
 
     if not as_sddl:
         return fdescr
 
     return fdescr.as_sddl(sid)
-
-def fsacl_child_sd(parent_sddl, domain_sid, owner_sid, group_sid, container=True, as_sddl=True):
-    """
-
-    This function takes an the SDDL representation of a filesystem
-    ACL and return the SDDL representation of this ACL adapted
-    for child files/directories. It's used for Policy object provision
-    """
-    parent_sd = security.descriptor.from_sddl(parent_sddl, domain_sid)
-    fdescr = security.descriptor()
-    fdescr.owner_sid = owner_sid
-    fdescr.group_sid = group_sid
-    fdescr.type = parent_sd.type
-    fdescr.type |= security.SEC_DESC_DACL_AUTO_INHERITED
-    fdescr.revision = parent_sd.revision
-    aces = parent_sd.dacl.aces
-    for i in range(0, len(aces)):
-        ace = aces[i]
-        ace2 = None
-
-        if ace.type == security.SEC_ACE_TYPE_ACCESS_ALLOWED:
-            pass
-        elif ace.type == security.SEC_ACE_TYPE_ACCESS_DENIED:
-            pass
-        else:
-            continue
-
-        inherit_ace = False
-        if not container:
-            if ace.flags & security.SEC_ACE_FLAG_OBJECT_INHERIT:
-                inherit_ace = True
-        else:
-            if ace.flags & security.SEC_ACE_FLAG_CONTAINER_INHERIT:
-                inherit_ace = True
-            if ((ace.flags & security.SEC_ACE_FLAG_OBJECT_INHERIT) and \
-               not (ace.flags & security.SEC_ACE_FLAG_NO_PROPAGATE_INHERIT)):
-                inherit_ace = True
-
-        if not inherit_ace:
-            continue
-
-        if not container:
-            ace.flags = 0;
-        else:
-            ace.flags &= ~security.SEC_ACE_FLAG_INHERIT_ONLY
-            if not (ace.flags & security.SEC_ACE_FLAG_CONTAINER_INHERIT):
-                ace.flags |= security.SEC_ACE_FLAG_INHERIT_ONLY
-            ace.flags &= ~security.SEC_ACE_FLAG_INHERIT_ONLY
-            if ace.flags & security.SEC_ACE_FLAG_NO_PROPAGATE_INHERIT:
-                ace.flags = 0;
-
-        ace.flags |= security.SEC_ACE_FLAG_INHERITED_ACE
-
-        if str(ace.trustee) == security.SID_CREATOR_OWNER:
-            ace2 = ace
-
-            ace = security.ace()
-            ace.type = ace.type
-            ace.flags = ace.flags
-            ace.access_mask = ace.access_mask
-            ace.trustee = owner_sid
-
-            ace2.flags |= security.SEC_ACE_FLAG_INHERIT_ONLY
-
-        if str(ace.trustee) == security.SID_CREATOR_GROUP:
-            ace2 = ace
-
-            ace = security.ace()
-            ace.type = ace.type
-            ace.flags = ace.flags
-            ace.access_mask = ace.access_mask
-            ace.trustee = group_sid
-
-            ace2.flags |= security.SEC_ACE_FLAG_INHERIT_ONLY
-
-        fdescr.dacl_add(ace)
-        if container and ace2 is not None:
-            fdescr.dacl_add(ace2)
-
-    if not as_sddl:
-        return fdescr
-
-    return fdescr.as_sddl(domain_sid)
index 48c3890d708ab7287fff26cb3aa9e39647192341..507582bad590f492cc332a0a6166015d33a2cc63 100644 (file)
@@ -68,7 +68,7 @@ from samba.dsdb import (
     )
 from samba.idmap import IDmapDB
 from samba.ms_display_specifiers import read_ms_ldif
-from samba.ntacls import setntacl, getntacl, dsacl2fsacl, fsacl_child_sd
+from samba.ntacls import setntacl, getntacl, dsacl2fsacl
 from samba.ndr import ndr_pack, ndr_unpack
 from samba.provision.backend import (
     ExistingBackend,
@@ -120,10 +120,6 @@ DEFAULT_DC_POLICY_GUID = "6AC1786C-016F-11D2-945F-00C04fB984F9"
 DEFAULTSITE = "Default-First-Site-Name"
 LAST_PROVISION_USN_ATTRIBUTE = "lastProvisionUSN"
 
-SYSVOL_FOLDER_SD = "O:BAG:SYD:PAI(A;;0x001200a9;;;AU)(A;OICIIO;GRGX;;;AU)(A;;0x001200a9;;;SO)(A;OICIIO;GRGX;;;SO)(A;;0x001e01bf;;;BA)(A;OICIIO;WOWDGRGWGX;;;BA)(A;;0x001f01ff;;;SY)(A;OICIIO;GA;;;SY)(A;;0x001e01bf;;;BA)(A;OICIIO;WOWDGRGWGX;;;CO)S:AI(AU;OICISA;SD;;;WD)"
-SYSVOL_SUBFOLDER_SD = "O:BAG:SYD:PAI(A;;0x001200a9;;;AU)(A;OICIIO;GRGX;;;AU)(A;;0x001200a9;;;SO)(A;OICIIO;GRGX;;;SO)(A;;0x001e01bf;;;BA)(A;OICIIO;GA;;;BA)(A;;0x001f01ff;;;SY)(A;OICIIO;GA;;;SY)(A;;0x001e01bf;;;BA)(A;OICIIO;GA;;;CO)S:AI(AU;SA;SD;;;WD)"
-SYSVOL_SUBFILE_SD = "O:BAG:SYD:AI(A;ID;0x001200a9;;;AU)(A;ID;0x001200a9;;;SO)(A;ID;0x001f01ff;;;BA)(A;ID;0x001f01ff;;;SY)"
-POLICIES_FOLDER_SD = "O:BAG:SYD:PAI(A;;0x001200a9;;;AU)(A;OICIIO;GRGX;;;AU)(A;;0x001200a9;;;SO)(A;OICIIO;GRGX;;;SO)(A;;0x001e01bf;;;BA)(A;OICIIO;GA;;;BA)(A;;0x001f01ff;;;SY)(A;OICIIO;GA;;;SY)(A;;0x001e01bf;;;BA)(A;OICIIO;GA;;;CO)(A;;0x001201bf;;;PA)(A;OICIIO;GRGWGX;;;PA)S:AI(AU;SA;SD;;;WD)"
 
 class ProvisionPaths(object):
 
@@ -1470,21 +1466,19 @@ FILL_FULL = "FULL"
 FILL_SUBDOMAIN = "SUBDOMAIN"
 FILL_NT4SYNC = "NT4SYNC"
 FILL_DRS = "DRS"
+SYSVOL_ACL = "O:LAG:BAD:P(A;OICI;0x001f01ff;;;BA)(A;OICI;0x001200a9;;;SO)(A;OICI;0x001f01ff;;;SY)(A;OICI;0x001200a9;;;AU)"
+POLICIES_ACL = "O:LAG:BAD:P(A;OICI;0x001f01ff;;;BA)(A;OICI;0x001200a9;;;SO)(A;OICI;0x001f01ff;;;SY)(A;OICI;0x001200a9;;;AU)(A;OICI;0x001301bf;;;PA)"
 SYSVOL_SERVICE="sysvol"
 
-def set_dir_acl(path, self_sd, subfolder_sd, subfile_sd, domsid, lp, use_ntvfs,
-        passdb, service=SYSVOL_SERVICE):
-    setntacl(lp, path, self_sd, domsid, use_ntvfs=use_ntvfs, skip_invalid_chown=True,
-             passdb=passdb, service=service)
+def set_dir_acl(path, acl, lp, domsid, use_ntvfs, passdb, service=SYSVOL_SERVICE):
+    setntacl(lp, path, acl, domsid, use_ntvfs=use_ntvfs, skip_invalid_chown=True, passdb=passdb, service=service)
     for root, dirs, files in os.walk(path, topdown=False):
         for name in files:
-            setntacl(lp, os.path.join(root, name), subfile_sd, domsid,
-                     use_ntvfs=use_ntvfs, skip_invalid_chown=True, passdb=passdb,
-                     service=service)
+            setntacl(lp, os.path.join(root, name), acl, domsid,
+                    use_ntvfs=use_ntvfs, skip_invalid_chown=True, passdb=passdb, service=service)
         for name in dirs:
-            setntacl(lp, os.path.join(root, name), subfolder_sd, domsid,
-                     use_ntvfs=use_ntvfs, skip_invalid_chown=True, passdb=passdb,
-                     service=service)
+            setntacl(lp, os.path.join(root, name), acl, domsid,
+                    use_ntvfs=use_ntvfs, skip_invalid_chown=True, passdb=passdb, service=service)
 
 
 def set_gpos_acl(sysvol, dnsdomain, domainsid, domaindn, samdb, lp, use_ntvfs, passdb):
@@ -1501,36 +1495,22 @@ def set_gpos_acl(sysvol, dnsdomain, domainsid, domaindn, samdb, lp, use_ntvfs, p
 
     # Set ACL for GPO root folder
     root_policy_path = os.path.join(sysvol, dnsdomain, "Policies")
-    setntacl(lp, root_policy_path, POLICIES_FOLDER_SD, str(domainsid),
-             use_ntvfs=use_ntvfs, skip_invalid_chown=True, passdb=passdb,
-             service=SYSVOL_SERVICE)
+    setntacl(lp, root_policy_path, POLICIES_ACL, str(domainsid),
+            use_ntvfs=use_ntvfs, skip_invalid_chown=True, passdb=passdb, service=SYSVOL_SERVICE)
 
     res = samdb.search(base="CN=Policies,CN=System,%s"%(domaindn),
                         attrs=["cn", "nTSecurityDescriptor"],
                         expression="", scope=ldb.SCOPE_ONELEVEL)
 
     for policy in res:
-        guid = str(policy["cn"])
-        policy_path = getpolicypath(sysvol, dnsdomain, guid)
-
-        if DEFAULT_POLICY_GUID in guid or DEFAULT_DC_POLICY_GUID in guid:
-            self_sd = SYSVOL_SUBFOLDER_SD
-            sub_folder_sd = SYSVOL_SUBFOLDER_SD
-            sub_file_sd = SYSVOL_SUBFILE_SD
-        else:
-            acl = ndr_unpack(security.descriptor,
-                             str(policy["nTSecurityDescriptor"])).as_sddl()
-            owner_sid = security.dom_sid(security.SID_BUILTIN_ADMINISTRATORS)
-            group_sid = security.dom_sid("%s-%d" % (str(domainsid), security.DOMAIN_RID_USERS))
-            self_sd = dsacl2fsacl(acl, domainsid)
-            sub_folder_sd = fsacl_child_sd(self_sd, domainsid, owner_sid, group_sid, container=True)
-            sub_file_sd = fsacl_child_sd(self_sd, domainsid, owner_sid, group_sid, container=False)
-
-        set_dir_acl(policy_path, self_sd,
-                    sub_folder_sd, sub_file_sd,
-                    str(domainsid), lp, use_ntvfs,
+        acl = ndr_unpack(security.descriptor,
+                         str(policy["nTSecurityDescriptor"])).as_sddl()
+        policy_path = getpolicypath(sysvol, dnsdomain, str(policy["cn"]))
+        set_dir_acl(policy_path, dsacl2fsacl(acl, domainsid), lp,
+                    str(domainsid), use_ntvfs,
                     passdb=passdb)
 
+
 def setsysvolacl(samdb, netlogon, sysvol, uid, gid, domainsid, dnsdomain,
         domaindn, lp, use_ntvfs):
     """Set the ACL for the sysvol share and the subfolders
@@ -1579,23 +1559,23 @@ def setsysvolacl(samdb, netlogon, sysvol, uid, gid, domainsid, dnsdomain,
     else:
         canchown = True
 
-    setntacl(lp,sysvol, SYSVOL_FOLDER_SD, str(domainsid), use_ntvfs=use_ntvfs,
+    # Set the SYSVOL_ACL on the sysvol folder and subfolder (first level)
+    setntacl(lp,sysvol, SYSVOL_ACL, str(domainsid), use_ntvfs=use_ntvfs,
              skip_invalid_chown=True, passdb=s4_passdb,
              service=SYSVOL_SERVICE)
     for root, dirs, files in os.walk(sysvol, topdown=False):
         for name in files:
             if use_ntvfs and canchown:
                 os.chown(os.path.join(root, name), -1, gid)
-            setntacl(lp, os.path.join(root, name), SYSVOL_SUBFILE_SD, str(domainsid),
-                     use_ntvfs=use_ntvfs, skip_invalid_chown=True, passdb=s4_passdb,
-                     service=SYSVOL_SERVICE)
-
+            setntacl(lp, os.path.join(root, name), SYSVOL_ACL, str(domainsid),
+                     use_ntvfs=use_ntvfs, skip_invalid_chown=True,
+                     passdb=s4_passdb, service=SYSVOL_SERVICE)
         for name in dirs:
             if use_ntvfs and canchown:
                 os.chown(os.path.join(root, name), -1, gid)
-            setntacl(lp, os.path.join(root, name), SYSVOL_SUBFOLDER_SD, str(domainsid),
-                     use_ntvfs=use_ntvfs, skip_invalid_chown=True, passdb=s4_passdb,
-                     service=SYSVOL_SERVICE)
+            setntacl(lp, os.path.join(root, name), SYSVOL_ACL, str(domainsid),
+                     use_ntvfs=use_ntvfs, skip_invalid_chown=True,
+                     passdb=s4_passdb, service=SYSVOL_SERVICE)
 
     # Set acls on Policy folder and policies folders
     set_gpos_acl(sysvol, dnsdomain, domainsid, domaindn, samdb, lp, use_ntvfs, passdb=s4_passdb)
@@ -1606,11 +1586,11 @@ def acl_type(direct_db_access):
     else:
         return "VFS"
 
-def check_dir_acl(path, self_sddl, subfolder_sddl, subfile_sddl, domsid, lp, direct_db_access):
+def check_dir_acl(path, acl, lp, domainsid, direct_db_access):
     fsacl = getntacl(lp, path, direct_db_access=direct_db_access, service=SYSVOL_SERVICE)
     fsacl_sddl = fsacl.as_sddl(domainsid)
-    if fsacl_sddl != self_sddl:
-        raise ProvisioningError('%s ACL on GPO directory %s %s does not match expected value %s from GPO object' % (acl_type(direct_db_access), path, fsacl_sddl, self_sddl))
+    if fsacl_sddl != acl:
+        raise ProvisioningError('%s ACL on GPO directory %s %s does not match expected value %s from GPO object' % (acl_type(direct_db_access), path, fsacl_sddl, acl))
 
     for root, dirs, files in os.walk(path, topdown=False):
         for name in files:
@@ -1619,8 +1599,8 @@ def check_dir_acl(path, self_sddl, subfolder_sddl, subfile_sddl, domsid, lp, dir
             if fsacl is None:
                 raise ProvisioningError('%s ACL on GPO file %s %s not found!' % (acl_type(direct_db_access), os.path.join(root, name)))
             fsacl_sddl = fsacl.as_sddl(domainsid)
-            if fsacl_sddl != subfile_sddl:
-                raise ProvisioningError('%s ACL on GPO file %s %s does not match expected value %s from GPO object' % (acl_type(direct_db_access), os.path.join(root, name), fsacl_sddl, subfile_sddl))
+            if fsacl_sddl != acl:
+                raise ProvisioningError('%s ACL on GPO file %s %s does not match expected value %s from GPO object' % (acl_type(direct_db_access), os.path.join(root, name), fsacl_sddl, acl))
 
         for name in dirs:
             fsacl = getntacl(lp, os.path.join(root, name),
@@ -1628,8 +1608,9 @@ def check_dir_acl(path, self_sddl, subfolder_sddl, subfile_sddl, domsid, lp, dir
             if fsacl is None:
                 raise ProvisioningError('%s ACL on GPO directory %s %s not found!' % (acl_type(direct_db_access), os.path.join(root, name)))
             fsacl_sddl = fsacl.as_sddl(domainsid)
-            if fsacl_sddl != subfolder_sddl:
-                raise ProvisioningError('%s ACL on GPO directory %s %s does not match expected value %s from GPO object' % (acl_type(direct_db_access), os.path.join(root, name), fsacl_sddl, subfolder_sddl))
+            if fsacl_sddl != acl:
+                raise ProvisioningError('%s ACL on GPO directory %s %s does not match expected value %s from GPO object' % (acl_type(direct_db_access), os.path.join(root, name), fsacl_sddl, acl))
+
 
 def check_gpos_acl(sysvol, dnsdomain, domainsid, domaindn, samdb, lp,
         direct_db_access):
@@ -1651,32 +1632,18 @@ def check_gpos_acl(sysvol, dnsdomain, domainsid, domaindn, samdb, lp,
     if fsacl is None:
         raise ProvisioningError('DB ACL on policy root %s %s not found!' % (acl_type(direct_db_access), root_policy_path))
     fsacl_sddl = fsacl.as_sddl(domainsid)
-    if fsacl_sddl != POLICIES_FOLDER_SD:
-        raise ProvisioningError('%s ACL on policy root %s %s does not match expected value %s from provision' % (acl_type(direct_db_access), root_policy_path, fsacl_sddl, POLICIES_FOLDER_SD))
+    if fsacl_sddl != POLICIES_ACL:
+        raise ProvisioningError('%s ACL on policy root %s %s does not match expected value %s from provision' % (acl_type(direct_db_access), root_policy_path, fsacl_sddl, fsacl))
     res = samdb.search(base="CN=Policies,CN=System,%s"%(domaindn),
                         attrs=["cn", "nTSecurityDescriptor"],
                         expression="", scope=ldb.SCOPE_ONELEVEL)
 
     for policy in res:
-        guid = str(policy["cn"])
-        policy_path = getpolicypath(sysvol, dnsdomain, guid)
-
-        if DEFAULT_POLICY_GUID in guid or DEFAULT_DC_POLICY_GUID in guid:
-            self_sd = SYSVOL_SUBFOLDER_SD
-            sub_folder_sd = SYSVOL_SUBFOLDER_SD
-            sub_file_sd = SYSVOL_SUBFILE_SD
-        else:
-            acl = ndr_unpack(security.descriptor,
-                             str(policy["nTSecurityDescriptor"])).as_sddl()
-            owner_sid = security.dom_sid(security.SID_BUILTIN_ADMINISTRATORS)
-            group_sid = security.dom_sid("%s-%d" % (str(domainsid), security.DOMAIN_RID_USERS))
-            self_sd = dsacl2fsacl(acl, domainsid)
-            sub_folder_sd = fsacl_child_sd(self_sd, domainsid, owner_sid, group_sid, container=True)
-            sub_file_sd = fsacl_child_sd(self_sd, domainsid, owner_sid, group_sid, container=False)
-
-        check_dir_acl(policy_path, self_sd,
-                      sub_folder_sd, subfile_sd,
-                      domainsid, lp, direct_db_access)
+        acl = ndr_unpack(security.descriptor,
+                         str(policy["nTSecurityDescriptor"])).as_sddl()
+        policy_path = getpolicypath(sysvol, dnsdomain, str(policy["cn"]))
+        check_dir_acl(policy_path, dsacl2fsacl(acl, domainsid), lp,
+                      domainsid, direct_db_access)
 
 
 def checksysvolacl(samdb, netlogon, sysvol, domainsid, dnsdomain, domaindn,
@@ -1686,6 +1653,8 @@ def checksysvolacl(samdb, netlogon, sysvol, domainsid, dnsdomain, domaindn,
     :param samdb: An LDB object on the SAM db
     :param netlogon: Physical path for the netlogon folder
     :param sysvol: Physical path for the sysvol folder
+    :param uid: The UID of the "Administrator" user
+    :param gid: The GID of the "Domain adminstrators" group
     :param domainsid: The SID of the domain
     :param dnsdomain: The DNS name of the domain
     :param domaindn: The DN of the domain (ie. DC=...)
@@ -1712,13 +1681,14 @@ def checksysvolacl(samdb, netlogon, sysvol, domainsid, dnsdomain, domaindn,
 
     # Ensure we can read this directly, and via the smbd VFS
     for direct_db_access in [True, False]:
+        # Check the SYSVOL_ACL on the sysvol folder and subfolder (first level)
         for dir_path in [os.path.join(sysvol, dnsdomain), netlogon]:
             fsacl = getntacl(lp, dir_path, direct_db_access=direct_db_access, service=SYSVOL_SERVICE)
             if fsacl is None:
                 raise ProvisioningError('%s ACL on sysvol directory %s not found!' % (acl_type(direct_db_access), dir_path))
             fsacl_sddl = fsacl.as_sddl(domainsid)
-            if fsacl_sddl != SYSVOL_SUBFOLDER_ACL:
-                raise ProvisioningError('%s ACL on sysvol directory %s %s does not match expected value %s from provision' % (acl_type(direct_db_access), dir_path, fsacl_sddl, SYSVOL_SUBFOLDER_ACL))
+            if fsacl_sddl != SYSVOL_ACL:
+                raise ProvisioningError('%s ACL on sysvol directory %s %s does not match expected value %s from provision' % (acl_type(direct_db_access), dir_path, fsacl_sddl, SYSVOL_ACL))
 
         # Check acls on Policy folder and policies folders
         check_gpos_acl(sysvol, dnsdomain, domainsid, domaindn, samdb, lp,
index 3846f3154f036cc18e4bf4ebf201a793da0ffd6f..652721f4f107979e36f18dc8489c79376c6015e7 100644 (file)
@@ -290,7 +290,7 @@ class PosixAclMappingTests(TestCaseInTempDir):
         self.assertEquals(posix_acl.acl[4].a_perm, 7)
 
     def test_setntacl_sysvol_check_getposixacl(self):
-        acl = provision.SYSVOL_SUBFOLDER_SD
+        acl = provision.SYSVOL_ACL
         domsid = passdb.get_global_sam_sid()
         setntacl(self.lp, self.tempf,acl,str(domsid), use_ntvfs=False)
         facl = getntacl(self.lp, self.tempf)
@@ -408,7 +408,7 @@ class PosixAclMappingTests(TestCaseInTempDir):
 
 
     def test_setntacl_sysvol_dir_check_getposixacl(self):
-        acl = provision.SYSVOL_SUBFOLDER_SD
+        acl = provision.SYSVOL_ACL
         domsid = passdb.get_global_sam_sid()
         setntacl(self.lp, self.tempdir,acl,str(domsid), use_ntvfs=False)
         facl = getntacl(self.lp, self.tempdir)
@@ -485,7 +485,7 @@ class PosixAclMappingTests(TestCaseInTempDir):
 
 
     def test_setntacl_policies_dir_check_getposixacl(self):
-        acl = provision.POLICIES_FOLDER_SD
+        acl = provision.POLICIES_ACL
         domsid = passdb.get_global_sam_sid()
         setntacl(self.lp, self.tempdir,acl,str(domsid), use_ntvfs=False)
         facl = getntacl(self.lp, self.tempdir)
@@ -571,7 +571,7 @@ class PosixAclMappingTests(TestCaseInTempDir):
 
 
     def test_setntacl_policies_check_getposixacl(self):
-        acl = provision.POLICIES_FOLDER_SD
+        acl = provision.POLICIES_ACL
 
         domsid = passdb.get_global_sam_sid()
         setntacl(self.lp, self.tempf, acl, str(domsid), use_ntvfs=False)
index f169e8deecbe06bb977740afe293c690082373f4..e20a97794ae43808b5064456fc38d36262cccdda 100644 (file)
@@ -56,7 +56,7 @@ class GpoCmdTestCase(SambaToolCmdTest):
     def test_aclcheck(self):
         """Check all the GPOs on the remote server have correct ACLs"""
         (result, out, err) = self.runsubcmd("gpo", "aclcheck", "-H", "ldap://%s" % os.environ["SERVER"], "-U%s%%%s" % (os.environ["USERNAME"], os.environ["PASSWORD"]))
-        self.assertCmdSuccess(result, "Ensuring gpo checked successfully: %s" % err)
+        self.assertCmdSuccess(result, "Ensuring gpo checked successfully")
 
     def setUp(self):
         """set up a temporary GPO to work with"""
@@ -66,7 +66,7 @@ class GpoCmdTestCase(SambaToolCmdTest):
                                             "-U%s%%%s" % (os.environ["USERNAME"], os.environ["PASSWORD"]),
                                             "--tmpdir", self.tempdir)
         shutil.rmtree(os.path.join(self.tempdir, "policy"))
-        self.assertCmdSuccess(result, "Ensuring gpo created successfully: %s" % err)
+        self.assertCmdSuccess(result, "Ensuring gpo created successfully")
         try:
             self.gpo_guid = "{%s}" % out.split("{")[1].split("}")[0]
         except IndexError:
index d5c6882268e86c1342566c9786010bc662cf6b86..f6cc0f1026bc955d7b709c85a28bc9a6a566a58b 100644 (file)
@@ -319,8 +319,6 @@ static bool test_analyse_objects(struct torture_context *tctx,
                                 const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr,
                                 uint32_t object_count,
                                 const struct drsuapi_DsReplicaObjectListItemEx *first_object,
-                                uint32_t linked_attributes_count,
-                                const struct drsuapi_DsReplicaLinkedAttribute *linked_attributes,
                                 const DATA_BLOB *gensec_skey)
 {
        static uint32_t object_id;
@@ -346,8 +344,7 @@ static bool test_analyse_objects(struct torture_context *tctx,
                                                 mapping_ctr,
                                                 object_count,
                                                 first_object,
-                                                linked_attributes_count,
-                                                linked_attributes,
+                                                0, NULL,
                                                 NULL, NULL,
                                                 gensec_skey,
                                                 0,
@@ -364,12 +361,10 @@ static bool test_analyse_objects(struct torture_context *tctx,
                struct ldb_request *search_req;
                struct ldb_result *res;
                struct ldb_message *new_msg, *drs_msg, *ldap_msg;
-               const char **attrs = talloc_array(objs, const char *, objs->objects[i].msg->num_elements+1+1);
+               const char **attrs = talloc_array(objs, const char *, objs->objects[i].msg->num_elements+1);
                for (j=0; j < objs->objects[i].msg->num_elements; j++) {
                        attrs[j] = objs->objects[i].msg->elements[j].name;
                }
-               attrs[j] = "uSNChanged";
-               j++;
                attrs[j] = NULL;
                res = talloc_zero(objs, struct ldb_result);
                if (!res) {
@@ -393,11 +388,6 @@ static bool test_analyse_objects(struct torture_context *tctx,
                        return false;
                }
 
-               ret = ldb_request_add_control(search_req, LDB_CONTROL_SHOW_RECYCLED_OID, false, NULL);
-               if (ret != LDB_SUCCESS) {
-                       return false;
-               }
-
                ret = ldb_request_add_control(search_req, LDB_CONTROL_EXTENDED_DN_OID, true, extended_dn_ctrl);
                if (ret != LDB_SUCCESS) {
                        return false;
@@ -414,16 +404,6 @@ static bool test_analyse_objects(struct torture_context *tctx,
                                                         ldb_errstring(ldb)));
                torture_assert_int_equal(tctx, res->count, 1, "Could not re-fetch object just delivered over DRS");
                ldap_msg = res->msgs[0];
-
-{
-uint64_t usn = ldb_msg_find_attr_as_int64(ldap_msg, "uSNChanged", 0);
-struct GUID g;
-GUID_from_ndr_blob(&objs->objects[i].guid_value, &g);
-torture_comment(tctx, "o[%d] usn_changed[%llu]: %s - %s\n", i, (unsigned long long)usn,
-       GUID_string(objs, &g),
-               ldb_dn_get_linearized(objs->objects[i].msg->dn));
-continue;
-}
                for (j=0; j < ldap_msg->num_elements; j++) {
                        ldap_msg->elements[j].flags = LDB_FLAG_MOD_ADD;
                        /* For unknown reasons, there is no nTSecurityDescriptor on cn=deleted objects over LDAP, but there is over DRS!  Skip it on both transports for now here so */
@@ -530,12 +510,6 @@ continue;
                talloc_free(search_req);
        }
 
-       for (i=0; i < objs->linked_attributes_count; i++) {
-torture_comment(tctx, "l[%d] usn_changed[%llu]: attid[%u] %s\n", i,
-       (unsigned long long)objs->linked_attributes[i].meta_data.originating_usn,
-       objs->linked_attributes[i].attid,
-       GUID_string(objs, &objs->linked_attributes[i].identifier->guid));
-       }
        if (!lpcfg_parm_bool(tctx->lp_ctx, NULL, "dssync", "print_pwd_blobs", false)) {
                talloc_free(objs);
                return true;
@@ -690,29 +664,6 @@ static bool test_GetNCChanges(struct torture_context *tctx,
                }
        };
 
-       struct drsuapi_DsReplicaCursorCtrEx utdv;
-       struct drsuapi_DsReplicaCursor cursors[1];
-
-       ZERO_STRUCT(utdv);
-       utdv.version = 1;
-       utdv.count = ARRAY_SIZE(cursors);
-       utdv.cursors = cursors;
-       ZERO_STRUCT(cursors);
-       GUID_from_string("0d36ca05-5507-4e62-aca3-354bab0d39e1",
-                       &cursors[0].source_dsa_invocation_id);
-       cursors[0].highest_usn = 12755;
-/*
-                    uptodateness_vector      : *
-                        uptodateness_vector: struct drsuapi_DsReplicaCursorCtrEx
-                            version                  : 0x00000001 (1)
-                            reserved1                : 0x00000000 (0)
-                            count                    : 0x00000001 (1)
-                            reserved2                : 0x00000000 (0)
-                            cursors: ARRAY(1)
-                                cursors: struct drsuapi_DsReplicaCursor
-                                    source_dsa_invocation_id : 0d36ca05-5507-4e62-aca3-354bab0d39e1
-                                    highest_usn              : 0x00000000000031d3 (12755)
-*/
        ZERO_STRUCT(null_guid);
        ZERO_STRUCT(null_sid);
 
@@ -786,7 +737,7 @@ static bool test_GetNCChanges(struct torture_context *tctx,
                        r.in.req->req8.highwatermark.tmp_highest_usn    = highest_usn;
                        r.in.req->req8.highwatermark.reserved_usn       = 0;
                        r.in.req->req8.highwatermark.highest_usn        = highest_usn;
-                       r.in.req->req8.uptodateness_vector              = NULL;//&utdv;
+                       r.in.req->req8.uptodateness_vector              = NULL;
                        r.in.req->req8.replica_flags                    = 0;
                        if (lpcfg_parm_bool(tctx->lp_ctx, NULL, "dssync", "compression", false)) {
                                r.in.req->req8.replica_flags            |= DRSUAPI_DRS_USE_COMPRESSION;
@@ -799,8 +750,6 @@ static bool test_GetNCChanges(struct torture_context *tctx,
                                                                        | DRSUAPI_DRS_GET_ANC
                                                                        | DRSUAPI_DRS_NEVER_SYNCED
                                                                        ;
-                       r.in.req->req8.replica_flags = 0x00201074;
-                       //r.in.req->req8.replica_flags |= DRSUAPI_DRS_GET_ANC;
                        r.in.req->req8.max_object_count                 = 402;
                        r.in.req->req8.max_ndr_size                     = 402116;
 
@@ -860,7 +809,7 @@ static bool test_GetNCChanges(struct torture_context *tctx,
                                                (unsigned long long) ctr1->new_highwatermark.highest_usn);
 
                                if (!test_analyse_objects(tctx, ctx, nc_dn_str, &ctr1->mapping_ctr,  ctr1->object_count,
-                                                         ctr1->first_object, 0, NULL, &gensec_skey)) {
+                                                         ctr1->first_object, &gensec_skey)) {
                                        return false;
                                }
 
@@ -895,10 +844,7 @@ static bool test_GetNCChanges(struct torture_context *tctx,
                                                (unsigned long long) ctr6->new_highwatermark.highest_usn);
 
                                if (!test_analyse_objects(tctx, ctx, nc_dn_str, &ctr6->mapping_ctr,  ctr6->object_count,
-                                                         ctr6->first_object,
-                                                         ctr6->linked_attributes_count,
-                                                         ctr6->linked_attributes,
-                                                         &gensec_skey)) {
+                                                         ctr6->first_object, &gensec_skey)) {
                                        return false;
                                }