From 6a362723af0d9f12c78af1ddfd7b0f8085307d43 Mon Sep 17 00:00:00 2001 From: chenkins Date: Wed, 20 Dec 2023 08:02:22 +0100 Subject: [PATCH] Move CteraCustomACL constants to CteraAclPermissionFeature. --- .../core/ctera/CteraAclPermissionFeature.java | 83 +++++++++++++++- .../ctera/CteraAttributesFinderFeature.java | 2 +- .../cyberduck/core/ctera/CteraCustomACL.java | 94 ------------------- .../ch/cyberduck/core/ctera/CteraSession.java | 24 ++--- ...aPermissionFeatureAclToPermissionTest.java | 16 ++-- ...PermissionFeatureCustomPropsToAclTest.java | 45 ++++----- 6 files changed, 123 insertions(+), 141 deletions(-) delete mode 100644 ctera/src/main/java/ch/cyberduck/core/ctera/CteraCustomACL.java diff --git a/ctera/src/main/java/ch/cyberduck/core/ctera/CteraAclPermissionFeature.java b/ctera/src/main/java/ch/cyberduck/core/ctera/CteraAclPermissionFeature.java index e4a0492fbf5..58afcca474b 100644 --- a/ctera/src/main/java/ch/cyberduck/core/ctera/CteraAclPermissionFeature.java +++ b/ctera/src/main/java/ch/cyberduck/core/ctera/CteraAclPermissionFeature.java @@ -6,29 +6,104 @@ import ch.cyberduck.core.Local; import ch.cyberduck.core.Path; import ch.cyberduck.core.PathAttributes; +import ch.cyberduck.core.Permission; import ch.cyberduck.core.dav.DAVExceptionMappingService; import ch.cyberduck.core.dav.DAVPathEncoder; import ch.cyberduck.core.dav.DAVSession; import ch.cyberduck.core.exception.BackgroundException; -import ch.cyberduck.core.shared.DefaultAclFeature; +import ch.cyberduck.core.features.AclPermission; import org.w3c.dom.Element; import javax.xml.namespace.QName; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import com.github.sardine.impl.SardineException; import com.github.sardine.util.SardineUtil; -import static ch.cyberduck.core.ctera.CteraCustomACL.allCteraCustomACLRoles; -import static ch.cyberduck.core.ctera.CteraCustomACL.toQn; +public class CteraAclPermissionFeature implements AclPermission { -public class CteraAclPermissionFeature extends DefaultAclFeature { + public static Acl.Role READPERMISSION = new Acl.Role("readpermission"); + + public static Acl.Role WRITEPERMISSION = new Acl.Role("writepermission"); + + public static Acl.Role EXECUTEPERMISSION = new Acl.Role("executepermission"); // Files only + + public static Acl.Role DELETEPERMISSION = new Acl.Role("deletepermission"); + + public static Acl.Role TRAVERSEPERMISSION = new Acl.Role("traversepermission"); // Directories only + + public static Acl.Role CREATEFILEPERMISSION = new Acl.Role("Createfilepermission"); // Directories only + + public static Acl.Role CREATEDIRECTORIESPERMISSION = new Acl.Role("CreateDirectoriespermission");// Directories only + + + final static List allCteraCustomACLRoles = Collections.unmodifiableList(Arrays.asList( + READPERMISSION, WRITEPERMISSION, EXECUTEPERMISSION, DELETEPERMISSION, TRAVERSEPERMISSION, CREATEFILEPERMISSION, CREATEDIRECTORIESPERMISSION + )); + + // TODO CTERA-136 support for ctera namespace? + final static List allCteraCustomACLQn = Collections.unmodifiableList(allCteraCustomACLRoles.stream().map(CteraAclPermissionFeature::toQn).collect(Collectors.toList())); + + + public static QName toQn(final Acl.Role role) { + return SardineUtil.createQNameWithCustomNamespace(role.getName()); + } + + public static String toProp(final QName qn) { + return qn.getLocalPart(); + } + + public static Acl.Role toRole(final QName qn) { + return new Acl.Role(toProp(qn)); + } + + + public static Acl customPropsToAcl(final Map customProps) { + if(customProps.isEmpty()) { + return Acl.EMPTY; + } + final Acl acl = new Acl(); + acl.addAll(new Acl.CanonicalUser()); + for(QName qn : allCteraCustomACLQn) { + if(customProps.containsKey(toProp(qn))) { + final String val = customProps.get(toProp(qn)); + if(Boolean.parseBoolean(val)) { + acl.addAll(new Acl.CanonicalUser(), toRole(qn)); + } + } + } + return acl; + } + + public static Permission aclToPermission(final Acl acl) { + if(Acl.EMPTY.equals(acl)) { + return new Permission(700); + } + int perm = 0; + if(acl.get(new Acl.CanonicalUser()).contains(READPERMISSION)) { + // r + perm += 4; + } + if(acl.get(new Acl.CanonicalUser()).contains(WRITEPERMISSION)) { + // w + perm += 2; + } + if(acl.get(new Acl.CanonicalUser()).contains(EXECUTEPERMISSION) || acl.get(new Acl.CanonicalUser()).contains(TRAVERSEPERMISSION)) { + // x + perm += 1; + } + // TODO CTERA-136 only user - what about group/others? + return new Permission(perm * 100); + } private final DAVSession session; diff --git a/ctera/src/main/java/ch/cyberduck/core/ctera/CteraAttributesFinderFeature.java b/ctera/src/main/java/ch/cyberduck/core/ctera/CteraAttributesFinderFeature.java index c4cff24e875..886a3ff1f90 100644 --- a/ctera/src/main/java/ch/cyberduck/core/ctera/CteraAttributesFinderFeature.java +++ b/ctera/src/main/java/ch/cyberduck/core/ctera/CteraAttributesFinderFeature.java @@ -15,7 +15,7 @@ import com.github.sardine.DavResource; -import static ch.cyberduck.core.ctera.CteraCustomACL.*; +import static ch.cyberduck.core.ctera.CteraAclPermissionFeature.*; public class CteraAttributesFinderFeature extends DAVAttributesFinderFeature { private final DAVSession session; diff --git a/ctera/src/main/java/ch/cyberduck/core/ctera/CteraCustomACL.java b/ctera/src/main/java/ch/cyberduck/core/ctera/CteraCustomACL.java deleted file mode 100644 index 96dc48223e1..00000000000 --- a/ctera/src/main/java/ch/cyberduck/core/ctera/CteraCustomACL.java +++ /dev/null @@ -1,94 +0,0 @@ -package ch.cyberduck.core.ctera; - -import ch.cyberduck.core.Acl; -import ch.cyberduck.core.Permission; - -import javax.xml.namespace.QName; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import com.github.sardine.util.SardineUtil; - -public class CteraCustomACL { - - public static Acl.Role readpermission = new Acl.Role("readpermission"); - public static Acl.Role writepermission = new Acl.Role("writepermission"); - - - public static Acl.Role executepermission = new Acl.Role("executepermission"); // Files only - public static Acl.Role deletepermission = new Acl.Role("deletepermission"); - - - public static Acl.Role traversepermission = new Acl.Role("traversepermission"); // Directories only - - - public static Acl.Role Createfilepermission = new Acl.Role("Createfilepermission"); // Directories only - - - public static Acl.Role CreateDirectoriespermission = new Acl.Role("CreateDirectoriespermission");// Directories only - - - final static List allCteraCustomACLRoles = Collections.unmodifiableList(Arrays.asList( - readpermission, writepermission, executepermission, deletepermission, traversepermission, Createfilepermission, CreateDirectoriespermission - )); - - // TODO CTERA-136 support for ctera namespace? - final static List allCteraCustomACLQn = Collections.unmodifiableList(allCteraCustomACLRoles.stream().map(CteraCustomACL::toQn).collect(Collectors.toList())); - - - public static QName toQn(final Acl.Role role) { - return SardineUtil.createQNameWithCustomNamespace(role.getName()); - } - - public static String toProp(final QName qn) { - return qn.getLocalPart(); - } - - public static Acl.Role toRole(final QName qn) { - return new Acl.Role(toProp(qn)); - } - - - public static Acl customPropsToAcl(final Map customProps) { - if(customProps.isEmpty()) { - return Acl.EMPTY; - } - final Acl acl = new Acl(); - acl.addAll(new Acl.CanonicalUser()); - for(QName qn : allCteraCustomACLQn) { - if(customProps.containsKey(toProp(qn))) { - final String val = customProps.get(toProp(qn)); - if(Boolean.parseBoolean(val)) { - acl.addAll(new Acl.CanonicalUser(), toRole(qn)); - } - } - } - return acl; - } - - public static Permission aclToPermission(final Acl acl) { - if(Acl.EMPTY.equals(acl)) { - return new Permission(700); - } - int perm = 0; - if(acl.get(new Acl.CanonicalUser()).contains(readpermission)) { - // r - perm += 4; - } - if(acl.get(new Acl.CanonicalUser()).contains(writepermission)) { - // w - perm += 2; - } - if(acl.get(new Acl.CanonicalUser()).contains(executepermission) || acl.get(new Acl.CanonicalUser()).contains(traversepermission)) { - // x - perm += 1; - } - // TODO CTERA-136 only user - what about group/others? - return new Permission(perm * 100); - } - - -} diff --git a/ctera/src/main/java/ch/cyberduck/core/ctera/CteraSession.java b/ctera/src/main/java/ch/cyberduck/core/ctera/CteraSession.java index e87c8fb07b2..13a7a71d0be 100644 --- a/ctera/src/main/java/ch/cyberduck/core/ctera/CteraSession.java +++ b/ctera/src/main/java/ch/cyberduck/core/ctera/CteraSession.java @@ -104,7 +104,7 @@ import com.github.sardine.DavResource; import com.google.common.util.concurrent.Uninterruptibles; -import static ch.cyberduck.core.ctera.CteraCustomACL.*; +import static ch.cyberduck.core.ctera.CteraAclPermissionFeature.*; public class CteraSession extends DAVSession { @@ -227,7 +227,7 @@ public T _getFeature(final Class type) { public void preflight(final Path workdir, final String filename) throws BackgroundException { // TODO CTERA-136 do we need to require writepermission as well? super.preflight(workdir, filename); - session.checkCteraRole(workdir, Createfilepermission); + session.checkCteraRole(workdir, CREATEFILEPERMISSION); } }; } @@ -237,7 +237,7 @@ public void preflight(final Path workdir, final String filename) throws Backgrou public void preflight(final Path workdir, final String filename) throws BackgroundException { // TODO CTERA-136 do we need to require writepermission as well? super.preflight(workdir, filename); - session.checkCteraRole(workdir, CreateDirectoriespermission); + session.checkCteraRole(workdir, CREATEDIRECTORIESPERMISSION); } }; } @@ -246,13 +246,13 @@ public void preflight(final Path workdir, final String filename) throws Backgrou @Override public void preflight(final Path source, final Path target) throws BackgroundException { super.preflight(source, target); - session.checkCteraRole(source, deletepermission); - session.checkCteraRole(target, writepermission); + session.checkCteraRole(source, DELETEPERMISSION); + session.checkCteraRole(target, WRITEPERMISSION); if(source.isDirectory()) { - session.checkCteraRole(target.getParent(), CreateDirectoriespermission); + session.checkCteraRole(target.getParent(), CREATEDIRECTORIESPERMISSION); } else { - session.checkCteraRole(target.getParent(), Createfilepermission); + session.checkCteraRole(target.getParent(), CREATEFILEPERMISSION); } } }; @@ -287,7 +287,7 @@ public void preflight(final Path source, final Path target) throws BackgroundExc public void preflight(Path file) throws BackgroundException { // TODO CTERA-136 do we need both? Which one to prefer? super.preflight(file); - session.checkCteraRole(file, readpermission); + session.checkCteraRole(file, READPERMISSION); } }; } @@ -297,7 +297,7 @@ public void preflight(Path file) throws BackgroundException { public void preflight(Path file) throws BackgroundException { // TODO CTERA-136 do we need both? Which one to prefer? super.preflight(file); - session.checkCteraRole(file, writepermission); + session.checkCteraRole(file, WRITEPERMISSION); } }; } @@ -307,7 +307,7 @@ public void preflight(Path file) throws BackgroundException { public void preflight(Path file) throws BackgroundException { // TODO CTERA-136 do we require writepermission on file as well? super.preflight(file); - session.checkCteraRole(file, deletepermission); + session.checkCteraRole(file, DELETEPERMISSION); } }; } @@ -318,10 +318,10 @@ public void preflight(final Path source, final Path target) throws BackgroundExc // TODO CTERA-136 do we require writepermission on target's parent? super.preflight(source, target); if(source.isDirectory()) { - session.checkCteraRole(target.getParent(), CreateDirectoriespermission); + session.checkCteraRole(target.getParent(), CREATEDIRECTORIESPERMISSION); } else { - session.checkCteraRole(target.getParent(), Createfilepermission); + session.checkCteraRole(target.getParent(), CREATEFILEPERMISSION); } } }; diff --git a/ctera/src/test/java/ch/cyberduck/core/ctera/CteraPermissionFeatureAclToPermissionTest.java b/ctera/src/test/java/ch/cyberduck/core/ctera/CteraPermissionFeatureAclToPermissionTest.java index b553fb1e9bb..daa1ff5e853 100644 --- a/ctera/src/test/java/ch/cyberduck/core/ctera/CteraPermissionFeatureAclToPermissionTest.java +++ b/ctera/src/test/java/ch/cyberduck/core/ctera/CteraPermissionFeatureAclToPermissionTest.java @@ -23,7 +23,7 @@ import java.util.Arrays; import java.util.Collection; -import static ch.cyberduck.core.ctera.CteraCustomACL.*; +import static ch.cyberduck.core.ctera.CteraAclPermissionFeature.*; import static org.junit.Assert.assertEquals; @RunWith(Parameterized.class) @@ -34,13 +34,13 @@ public static Collection data() { return Arrays.asList( new Object[][]{ {Acl.EMPTY, true, true, true}, - {new Acl(new Acl.CanonicalUser(), writepermission), false, true, false}, - {new Acl(new Acl.CanonicalUser(), readpermission), true, false, false}, - {new Acl(new Acl.CanonicalUser(), executepermission), false, false, true}, - {new Acl(new Acl.CanonicalUser(), deletepermission), false, false, false}, - {new Acl(new Acl.CanonicalUser(), traversepermission), false, false, true}, - {new Acl(new Acl.CanonicalUser(), Createfilepermission), false, false, false}, - {new Acl(new Acl.CanonicalUser(), CreateDirectoriespermission), false, false, false} + {new Acl(new Acl.CanonicalUser(), WRITEPERMISSION), false, true, false}, + {new Acl(new Acl.CanonicalUser(), READPERMISSION), true, false, false}, + {new Acl(new Acl.CanonicalUser(), EXECUTEPERMISSION), false, false, true}, + {new Acl(new Acl.CanonicalUser(), DELETEPERMISSION), false, false, false}, + {new Acl(new Acl.CanonicalUser(), TRAVERSEPERMISSION), false, false, true}, + {new Acl(new Acl.CanonicalUser(), CREATEFILEPERMISSION), false, false, false}, + {new Acl(new Acl.CanonicalUser(), CREATEDIRECTORIESPERMISSION), false, false, false} } ); } diff --git a/ctera/src/test/java/ch/cyberduck/core/ctera/CteraPermissionFeatureCustomPropsToAclTest.java b/ctera/src/test/java/ch/cyberduck/core/ctera/CteraPermissionFeatureCustomPropsToAclTest.java index 236e77cba88..b8184318dfe 100644 --- a/ctera/src/test/java/ch/cyberduck/core/ctera/CteraPermissionFeatureCustomPropsToAclTest.java +++ b/ctera/src/test/java/ch/cyberduck/core/ctera/CteraPermissionFeatureCustomPropsToAclTest.java @@ -6,9 +6,11 @@ import ch.cyberduck.core.Acl; +import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; import java.util.AbstractMap; import java.util.Arrays; @@ -18,41 +20,40 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static ch.cyberduck.core.ctera.CteraCustomACL.*; +import static ch.cyberduck.core.ctera.CteraAclPermissionFeature.*; import static org.junit.Assert.assertEquals; @RunWith(Parameterized.class) -class CteraPermissionFeatureCustomPropsToAclTest { +public class CteraPermissionFeatureCustomPropsToAclTest { - @Parameterized.Parameters(name = "{0} {1}") + @Parameters(name = "{0} {1}") public static Collection data() { - return Arrays.asList( new Object[][]{ {Collections.emptyMap(), Acl.EMPTY}, { (Map) Stream.of( - new AbstractMap.SimpleEntry<>(readpermission.getName(), "false"), - new AbstractMap.SimpleEntry<>(writepermission.getName(), "false"), - new AbstractMap.SimpleEntry<>(executepermission.getName(), "false"), - new AbstractMap.SimpleEntry<>(deletepermission.getName(), "false"), - new AbstractMap.SimpleEntry<>(traversepermission.getName(), "true"), - new AbstractMap.SimpleEntry<>(Createfilepermission.getName(), "false"), - new AbstractMap.SimpleEntry<>(CreateDirectoriespermission.getName(), "false") + new AbstractMap.SimpleEntry<>(READPERMISSION.getName(), "false"), + new AbstractMap.SimpleEntry<>(WRITEPERMISSION.getName(), "false"), + new AbstractMap.SimpleEntry<>(EXECUTEPERMISSION.getName(), "false"), + new AbstractMap.SimpleEntry<>(DELETEPERMISSION.getName(), "false"), + new AbstractMap.SimpleEntry<>(TRAVERSEPERMISSION.getName(), "true"), + new AbstractMap.SimpleEntry<>(CREATEFILEPERMISSION.getName(), "false"), + new AbstractMap.SimpleEntry<>(CREATEDIRECTORIESPERMISSION.getName(), "false") ).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)), - new Acl(new Acl.CanonicalUser(), traversepermission) + new Acl(new Acl.CanonicalUser(), TRAVERSEPERMISSION) }, { (Map) Stream.of( - new AbstractMap.SimpleEntry<>(readpermission.getName(), "false"), - new AbstractMap.SimpleEntry<>(writepermission.getName(), "true"), - new AbstractMap.SimpleEntry<>(executepermission.getName(), "false"), - new AbstractMap.SimpleEntry<>(deletepermission.getName(), "false"), - new AbstractMap.SimpleEntry<>(traversepermission.getName(), "false"), - new AbstractMap.SimpleEntry<>(Createfilepermission.getName(), "false"), - new AbstractMap.SimpleEntry<>(CreateDirectoriespermission.getName(), "true") + new AbstractMap.SimpleEntry<>(READPERMISSION.getName(), "false"), + new AbstractMap.SimpleEntry<>(WRITEPERMISSION.getName(), "true"), + new AbstractMap.SimpleEntry<>(EXECUTEPERMISSION.getName(), "false"), + new AbstractMap.SimpleEntry<>(DELETEPERMISSION.getName(), "false"), + new AbstractMap.SimpleEntry<>(TRAVERSEPERMISSION.getName(), "false"), + new AbstractMap.SimpleEntry<>(CREATEFILEPERMISSION.getName(), "false"), + new AbstractMap.SimpleEntry<>(CREATEDIRECTORIESPERMISSION.getName(), "true") ).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)), - new Acl(new Acl.CanonicalUser(), writepermission, CreateDirectoriespermission) + new Acl(new Acl.CanonicalUser(), WRITEPERMISSION, CREATEDIRECTORIESPERMISSION) } } ); @@ -65,8 +66,8 @@ public static Collection data() { public Acl expected; - public void testCustomPropsToAcl(final Map map, final Acl expected) { + @Test + public void testCustomPropsToAcl() { assertEquals(expected, customPropsToAcl(map)); - } } \ No newline at end of file