Skip to content

Commit

Permalink
Move CteraCustomACL constants to CteraAclPermissionFeature.
Browse files Browse the repository at this point in the history
  • Loading branch information
chenkins committed Dec 20, 2023
1 parent d92ac23 commit 6a36272
Show file tree
Hide file tree
Showing 6 changed files with 123 additions and 141 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<Acl.Role> allCteraCustomACLRoles = Collections.unmodifiableList(Arrays.asList(
READPERMISSION, WRITEPERMISSION, EXECUTEPERMISSION, DELETEPERMISSION, TRAVERSEPERMISSION, CREATEFILEPERMISSION, CREATEDIRECTORIESPERMISSION
));

// TODO CTERA-136 support for ctera namespace?
final static List<QName> 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<String, String> 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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
94 changes: 0 additions & 94 deletions ctera/src/main/java/ch/cyberduck/core/ctera/CteraCustomACL.java

This file was deleted.

24 changes: 12 additions & 12 deletions ctera/src/main/java/ch/cyberduck/core/ctera/CteraSession.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -227,7 +227,7 @@ public <T> T _getFeature(final Class<T> 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);
}
};
}
Expand All @@ -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);
}
};
}
Expand All @@ -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);
}
}
};
Expand Down Expand Up @@ -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);
}
};
}
Expand All @@ -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);
}
};
}
Expand All @@ -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);
}
};
}
Expand All @@ -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);
}
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -34,13 +34,13 @@ public static Collection<Object[]> 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}
}
);
}
Expand Down
Loading

0 comments on commit 6a36272

Please sign in to comment.