You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by an...@apache.org on 2012/08/03 16:26:41 UTC
svn commit: r1368980 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/core/
main/java/org/apache/jackrabbit/oak/security/authorization/
main/java/org/apache/jackrabbit/oak/spi/security/authorization/
test/java/org/apache/jac...
Author: angela
Date: Fri Aug 3 14:26:40 2012
New Revision: 1368980
URL: http://svn.apache.org/viewvc?rev=1368980&view=rev
Log:
OAK-51 : Implement JCR Access Control Management (Work In Progress)
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/PermissionValidator.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/PermissionValidatorProvider.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ReadOnlyTree.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlContextImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/CompiledPermissionImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/AccessControlContext.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/CompiledPermissions.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/Permissions.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/TestAcContext.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ReadOnlyTree.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ReadOnlyTree.java?rev=1368980&r1=1368979&r2=1368980&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ReadOnlyTree.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ReadOnlyTree.java Fri Aug 3 14:26:40 2012
@@ -38,17 +38,21 @@ public class ReadOnlyTree implements Tre
/** Underlying node state */
private final NodeState state;
+ private final String path;
+
public ReadOnlyTree(NodeState root) {
this(null, "", root);
}
- private ReadOnlyTree(Tree parent, String name, NodeState state) {
+ public ReadOnlyTree(ReadOnlyTree parent, String name, NodeState state) {
assert name != null;
assert !name.isEmpty() || parent == null;
assert state != null;
+
this.parent = parent;
this.name = name;
this.state = state;
+ this.path = (parent == null) ? "" : parent.getPath() + '/' + name;
}
@Override
@@ -63,11 +67,7 @@ public class ReadOnlyTree implements Tre
@Override
public String getPath() {
- if (parent == null) {
- return "";
- } else {
- return parent.getPath() + '/' + name;
- }
+ return path;
}
@Override
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlContextImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlContextImpl.java?rev=1368980&r1=1368979&r2=1368980&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlContextImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AccessControlContextImpl.java Fri Aug 3 14:26:40 2012
@@ -68,7 +68,7 @@ public class AccessControlContextImpl im
}
@Override
- public boolean isGranted(String path, boolean isProperty, int permissions) {
+ public boolean isGranted(String path, int permissions) {
return allowed;
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/CompiledPermissionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/CompiledPermissionImpl.java?rev=1368980&r1=1368979&r2=1368980&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/CompiledPermissionImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/CompiledPermissionImpl.java Fri Aug 3 14:26:40 2012
@@ -38,7 +38,7 @@ class CompiledPermissionImpl implements
}
@Override
- public boolean isGranted(String path, boolean isProperty, int permissions) {
+ public boolean isGranted(String path, int permissions) {
// TODO
return (permissions == Permissions.READ);
}
Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/PermissionValidator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/PermissionValidator.java?rev=1368980&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/PermissionValidator.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/PermissionValidator.java Fri Aug 3 14:26:40 2012
@@ -0,0 +1,155 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.security.authorization;
+
+import javax.jcr.AccessDeniedException;
+
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.core.ReadOnlyTree;
+import org.apache.jackrabbit.oak.spi.commit.Validator;
+import org.apache.jackrabbit.oak.spi.security.authorization.CompiledPermissions;
+import org.apache.jackrabbit.oak.spi.security.authorization.Permissions;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+
+/**
+ * PermissionValidator... TODO
+ */
+public class PermissionValidator implements Validator {
+
+ /* TODO
+ * - special permissions for protected items (versioning, access control, etc.)
+ * - Renaming nodes or Move with same parent are reflected as remove+add -> needs special handling
+ * - review usage of OAK_CHILD_ORDER property (in particular if the property was removed
+ *
+ */
+
+ private final CompiledPermissions compiledPermissions;
+
+ private final ReadOnlyTree parentBefore;
+ private final ReadOnlyTree parentAfter;
+
+ PermissionValidator(CompiledPermissions compiledPermissions,
+ ReadOnlyTree parentBefore, ReadOnlyTree parentAfter) {
+ this.compiledPermissions = compiledPermissions;
+ this.parentBefore = parentBefore;
+ this.parentAfter = parentAfter;
+
+ }
+
+ //----------------------------------------------------------< Validator >---
+ @Override
+ public void propertyAdded(PropertyState after) throws CommitFailedException {
+ int permissions = getPermissions(after, Permissions.ADD_PROPERTY);
+ checkPermissions(getPath(after), permissions);
+ }
+
+ @Override
+ public void propertyChanged(PropertyState before, PropertyState after) throws CommitFailedException {
+ int permissions = getPermissions(after, Permissions.MODIFY_PROPERTY);
+ checkPermissions(getPath(after), permissions);
+ }
+
+ @Override
+ public void propertyDeleted(PropertyState before) throws CommitFailedException {
+ int permissions = getPermissions(before, Permissions.REMOVE_PROPERTY);
+ checkPermissions(getPath(before), permissions);
+ }
+
+ @Override
+ public Validator childNodeAdded(String name, NodeState after) throws CommitFailedException {
+ ReadOnlyTree child = new ReadOnlyTree(parentAfter, name, after);
+
+ int permissions = getPermissions(child, Permissions.ADD_NODE);
+ checkPermissions(child.getPath(), permissions);
+
+ return new PermissionValidator(compiledPermissions, null, child);
+ }
+
+ @Override
+ public Validator childNodeChanged(String name, NodeState before, NodeState after) throws CommitFailedException {
+ ReadOnlyTree childBefore = new ReadOnlyTree(parentBefore, name, before);
+ ReadOnlyTree childAfter = new ReadOnlyTree(parentAfter, name, after);
+
+ // TODO
+
+ return new PermissionValidator(compiledPermissions, childBefore, childAfter);
+
+ }
+
+ @Override
+ public Validator childNodeDeleted(String name, NodeState before) throws CommitFailedException {
+ ReadOnlyTree child = new ReadOnlyTree(parentBefore, name, before);
+
+ int permissions = getPermissions(child, Permissions.REMOVE_NODE);
+ checkPermissions(child.getPath(), permissions);
+
+ return new PermissionValidator(compiledPermissions, child, null);
+ }
+
+ //------------------------------------------------------------< private >---
+ private void checkPermissions(String path, int permissions) throws CommitFailedException {
+ if (!compiledPermissions.isGranted(path, permissions)) {
+ throw new CommitFailedException(new AccessDeniedException());
+ }
+ }
+
+
+ private int getPermissions(PropertyState property, int defaultPermission) {
+ if (isProtected(property)) {
+ // TODO: identify specific permission depending on type of protection
+ // - access controlled property
+ // - lock property
+ // - version property
+ // - mixinType/primaryType -> nt-management permission
+ // - node type definition -> nt-definition-management
+ // - namespace definition -> namespace management
+ // - privilege -> privilege management
+ // - user/group property -> user management
+ return Permissions.NO_PERMISSION;
+ } else if (PropertyState.OAK_CHILD_ORDER.equals(property.getName())) {
+ return Permissions.MODIFY_CHILD_NODE_COLLECTION;
+ } else {
+ return defaultPermission;
+ }
+ }
+
+ private int getPermissions(ReadOnlyTree tree, int defaultPermissions) {
+ if (isProtected(tree)) {
+ // TODO: identify specific permission depending on type of protection
+ return Permissions.NO_PERMISSION;
+ } else {
+ return defaultPermissions;
+ }
+ }
+
+ private boolean isProtected(PropertyState property) {
+ // TODO
+ return false;
+ }
+
+ private boolean isProtected(ReadOnlyTree tree) {
+ // TODO
+ return false;
+ }
+
+ private String getPath(PropertyState property) {
+ String parentPath = (parentAfter != null) ? parentAfter.getPath() : parentBefore.getPath();
+ return PathUtils.concat(parentPath, property.getName());
+ }
+}
\ No newline at end of file
Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/PermissionValidatorProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/PermissionValidatorProvider.java?rev=1368980&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/PermissionValidatorProvider.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/PermissionValidatorProvider.java Fri Aug 3 14:26:40 2012
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.security.authorization;
+
+import javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.oak.core.ReadOnlyTree;
+import org.apache.jackrabbit.oak.spi.commit.Validator;
+import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider;
+import org.apache.jackrabbit.oak.spi.security.authorization.AccessControlContext;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * PermissionValidatorProvider... TODO
+ */
+public class PermissionValidatorProvider implements ValidatorProvider {
+
+ /**
+ * logger instance
+ */
+ private static final Logger log = LoggerFactory.getLogger(PermissionValidatorProvider.class);
+
+ private final AccessControlContext acContext = null; // TODO
+
+ //--------------------------------------------------< ValidatorProvider >---
+ @Nonnull
+ @Override
+ public Validator getRootValidator(NodeState before, NodeState after) {
+ return new PermissionValidator(acContext.getPermissions(), new ReadOnlyTree(before), new ReadOnlyTree(after));
+ }
+}
\ No newline at end of file
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/AccessControlContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/AccessControlContext.java?rev=1368980&r1=1368979&r2=1368980&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/AccessControlContext.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/AccessControlContext.java Fri Aug 3 14:26:40 2012
@@ -26,5 +26,6 @@ public interface AccessControlContext {
void initialize(Set<Principal> principals);
+ // TODO define how permissions eval is bound to a particular revision/branch. (passing Tree?)
CompiledPermissions getPermissions();
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/CompiledPermissions.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/CompiledPermissions.java?rev=1368980&r1=1368979&r2=1368980&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/CompiledPermissions.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/CompiledPermissions.java Fri Aug 3 14:26:40 2012
@@ -23,6 +23,6 @@ public interface CompiledPermissions {
boolean canRead(String path, boolean isProperty);
- boolean isGranted(String path, boolean isProperty, int permissions);
+ boolean isGranted(String path, int permissions);
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/Permissions.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/Permissions.java?rev=1368980&r1=1368979&r2=1368980&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/Permissions.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/Permissions.java Fri Aug 3 14:26:40 2012
@@ -16,6 +16,9 @@
*/
package org.apache.jackrabbit.oak.spi.security.authorization;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
/**
* Permissions... TODO
*/
@@ -23,9 +26,11 @@ public final class Permissions {
public static final int NO_PERMISSION = 0;
- public static final int READ = 1;
+ public static final int READ_NODE = 1;
+
+ public static final int READ_PROPERTY = READ_NODE << 1;
- public static final int ADD_PROPERTY = READ << 1;
+ public static final int ADD_PROPERTY = READ_PROPERTY << 1;
public static final int MODIFY_PROPERTY = ADD_PROPERTY << 1;
@@ -45,9 +50,13 @@ public final class Permissions {
public static final int LOCK_MANAGEMENT = VERSION_MANAGEMENT << 1;
- public static final int MODIFY_CHILD_NODE_COLLECTION = LOCK_MANAGEMENT << 1;
+ public static final int LIFECYCLE_MANAGEMENT = LOCK_MANAGEMENT << 1;
+
+ public static final int RETENTION_MANAGEMENT = LIFECYCLE_MANAGEMENT << 1;
+
+ public static final int MODIFY_CHILD_NODE_COLLECTION = RETENTION_MANAGEMENT << 1;
- public static final int NODE_TYPE_DEFINITION_MANAGEMENT = MODIFY_CHILD_NODE_COLLECTION << 1;
+ public static final int NODE_TYPE_DEFINITION_MANAGEMENT = RETENTION_MANAGEMENT << 1;
public static final int NAMESPACE_MANAGEMENT = NODE_TYPE_DEFINITION_MANAGEMENT << 1;
@@ -55,9 +64,65 @@ public final class Permissions {
public static final int PRIVILEGE_MANAGEMENT = WORKSPACE_MANAGEMENT << 1;
- public static final int ALL = (READ | ADD_PROPERTY | MODIFY_PROPERTY
+ public static final int USER_MANAGEMENT = PRIVILEGE_MANAGEMENT << 1;
+
+ public static final int READ = READ_NODE | READ_PROPERTY;
+
+ public static final int ALL = (READ
+ | ADD_PROPERTY | MODIFY_PROPERTY | REMOVE_PROPERTY
| ADD_NODE | REMOVE_NODE
- | REMOVE_PROPERTY | READ_ACCESS_CONTROL | MODIFY_ACCESS_CONTROL | NODE_TYPE_MANAGEMENT
- | VERSION_MANAGEMENT | LOCK_MANAGEMENT | MODIFY_CHILD_NODE_COLLECTION
- | NODE_TYPE_DEFINITION_MANAGEMENT | NAMESPACE_MANAGEMENT | WORKSPACE_MANAGEMENT | PRIVILEGE_MANAGEMENT);
+ | READ_ACCESS_CONTROL | MODIFY_ACCESS_CONTROL
+ | NODE_TYPE_MANAGEMENT
+ | VERSION_MANAGEMENT
+ | LOCK_MANAGEMENT
+ | LIFECYCLE_MANAGEMENT
+ | RETENTION_MANAGEMENT
+ | MODIFY_CHILD_NODE_COLLECTION
+ | NODE_TYPE_DEFINITION_MANAGEMENT
+ | NAMESPACE_MANAGEMENT
+ | WORKSPACE_MANAGEMENT
+ | PRIVILEGE_MANAGEMENT
+ | USER_MANAGEMENT
+ );
+
+ private static final Map<Integer,String> PERMISSION_NAMES = new LinkedHashMap<Integer, String>();
+ static {
+ PERMISSION_NAMES.put(READ_NODE, "READ_NODE");
+ PERMISSION_NAMES.put(READ_PROPERTY, "READ_PROPERTY");
+ PERMISSION_NAMES.put(ADD_PROPERTY, "ADD_PROPERTY");
+ PERMISSION_NAMES.put(MODIFY_PROPERTY, "MODIFY_PROPERTY");
+ PERMISSION_NAMES.put(REMOVE_PROPERTY, "REMOVE_PROPERTY");
+ PERMISSION_NAMES.put(ADD_NODE, "ADD_NODE");
+ PERMISSION_NAMES.put(REMOVE_NODE, "REMOVE_NODE");
+ PERMISSION_NAMES.put(MODIFY_CHILD_NODE_COLLECTION, "MODIFY_CHILD_NODE_COLLECTION");
+ PERMISSION_NAMES.put(READ_ACCESS_CONTROL, "READ_ACCESS_CONTROL");
+ PERMISSION_NAMES.put(MODIFY_ACCESS_CONTROL, "MODIFY_ACCESS_CONTROL");
+ PERMISSION_NAMES.put(NODE_TYPE_MANAGEMENT, "NODE_TYPE_MANAGEMENT");
+ PERMISSION_NAMES.put(VERSION_MANAGEMENT, "VERSION_MANAGEMENT");
+ PERMISSION_NAMES.put(LOCK_MANAGEMENT, "LOCK_MANAGEMENT");
+ PERMISSION_NAMES.put(LIFECYCLE_MANAGEMENT, "LIFECYCLE_MANAGEMENT");
+ PERMISSION_NAMES.put(RETENTION_MANAGEMENT, "RETENTION_MANAGEMENT");
+ PERMISSION_NAMES.put(NODE_TYPE_DEFINITION_MANAGEMENT, "NODE_TYPE_DEFINITION_MANAGEMENT");
+ PERMISSION_NAMES.put(NAMESPACE_MANAGEMENT, "NAMESPACE_MANAGEMENT");
+ PERMISSION_NAMES.put(WORKSPACE_MANAGEMENT, "WORKSPACE_MANAGEMENT");
+ PERMISSION_NAMES.put(PRIVILEGE_MANAGEMENT, "PRIVILEGE_MANAGEMENT");
+ PERMISSION_NAMES.put(USER_MANAGEMENT, "USER_MANAGEMENT");
+
+ }
+
+ public String getString(int permissions) {
+ if (PERMISSION_NAMES.containsKey(permissions)) {
+ return PERMISSION_NAMES.get(permissions);
+ } else {
+ StringBuilder sb = new StringBuilder();
+ sb.append('|');
+ for (int key : PERMISSION_NAMES.keySet()) {
+ if ((permissions & key) == key) {
+ sb.append(PERMISSION_NAMES.get(key)).append('|');
+ }
+ }
+ return sb.toString();
+ }
+
+ }
}
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/TestAcContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/TestAcContext.java?rev=1368980&r1=1368979&r2=1368980&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/TestAcContext.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/TestAcContext.java Fri Aug 3 14:26:40 2012
@@ -49,7 +49,7 @@ public class TestAcContext implements Ac
}
@Override
- public boolean isGranted(String path, boolean isProperty, int permissions) {
+ public boolean isGranted(String path, int permissions) {
return true;
}
};