This is an automated email from the ASF dual-hosted git repository.

enorman pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-jackrabbit-accessmanager.git


The following commit(s) were added to refs/heads/master by this push:
     new 022cb26  SLING-11273 Deprecate getDeclaredRestrictionsForPrincipal (#9)
022cb26 is described below

commit 022cb268238405f4aecb0966d79f745846cb5e2f
Author: Eric Norman <[email protected]>
AuthorDate: Sun May 1 13:39:54 2022 -0700

    SLING-11273 Deprecate getDeclaredRestrictionsForPrincipal (#9)
---
 .../jackrabbit/accessmanager/PrivilegesInfo.java   | 340 ++++++++------
 .../accessmanager/it/PrivilegesInfoIT.java         | 519 +++++++++++++++++++++
 2 files changed, 728 insertions(+), 131 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/PrivilegesInfo.java
 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/PrivilegesInfo.java
index ff0775b..ddd2638 100644
--- 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/PrivilegesInfo.java
+++ 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/PrivilegesInfo.java
@@ -17,36 +17,49 @@
 package org.apache.sling.jcr.jackrabbit.accessmanager;
 
 import java.security.Principal;
-import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.ResourceBundle;
 import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.Value;
+import javax.jcr.ValueFactory;
 import javax.jcr.ValueFormatException;
-import javax.jcr.security.AccessControlEntry;
-import javax.jcr.security.AccessControlList;
 import javax.jcr.security.AccessControlManager;
-import javax.jcr.security.AccessControlPolicy;
 import javax.jcr.security.Privilege;
-
-import org.apache.jackrabbit.api.security.JackrabbitAccessControlEntry;
+import javax.json.JsonArray;
+import javax.json.JsonObject;
+import javax.json.JsonString;
+import javax.json.JsonValue;
+import javax.json.JsonValue.ValueType;
+
+import org.apache.jackrabbit.api.security.principal.PrincipalManager;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.restriction.RestrictionDefinition;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.restriction.RestrictionProvider;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
 import org.apache.sling.jcr.base.util.AccessControlUtil;
+import org.apache.sling.jcr.jackrabbit.accessmanager.impl.JsonConvert;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Helper class to assist in the usage of access control from scripts.
  */
 public class PrivilegesInfo {
+    private Logger logger = LoggerFactory.getLogger(getClass());
 
     /**
      * Return the supported Privileges for the specified node.
@@ -156,22 +169,66 @@ public class PrivilegesInfo {
      * @throws RepositoryException if any errors reading the information
      */
     public Map<Principal, AccessRights> getDeclaredAccessRights(Session 
session, String absPath) throws RepositoryException {
-        AccessControlEntry[] entries = 
getDeclaredAccessControlEntries(session, absPath);
-        return mergePrivilegesFromEntries(entries);
+        return toMap(session, useGetAcl(json -> {
+                try {
+                    return json.getAcl(session, absPath);
+                } catch (RepositoryException e) {
+                    logger.warn("Failed to load Acl", e);
+                }
+                return null;
+            }));
     }
 
-    private AccessControlEntry[] getDeclaredAccessControlEntries(Session 
session, String absPath) throws RepositoryException {
-        AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
-        AccessControlPolicy[] policies = 
accessControlManager.getPolicies(absPath);
+    /**
+     * Convert the JSON acl to a map of Principal to AccessRights
+     * @param session the jcr session
+     * @param aclJson the acl JSON object
+     * @return map of Principal to AccessRights
+     */
+    protected Map<Principal, AccessRights> toMap(Session session, JsonObject 
aclJson)
+            throws RepositoryException {
+        if (aclJson == null) {
+            return Collections.emptyMap();
+        }
 
-        List<AccessControlEntry> allEntries = new ArrayList<>();
-        for (AccessControlPolicy accessControlPolicy : policies) {
-            if (accessControlPolicy instanceof AccessControlList) {
-                AccessControlEntry[] accessControlEntries = 
((AccessControlList)accessControlPolicy).getAccessControlEntries();
-                allEntries.addAll(Arrays.asList(accessControlEntries));
+        Map<Principal, AccessRights> map;
+        AccessControlManager acm = session.getAccessControlManager();
+        PrincipalManager principalManager = 
AccessControlUtil.getPrincipalManager(session);
+        Function<? super JsonValue, ? extends Principal> keyMapper = val -> {
+            String principalId = 
((JsonObject)val).getString(JsonConvert.KEY_PRINCIPAL);
+            return principalManager.getPrincipal(principalId);
+        };
+        Function<? super JsonValue, ? extends AccessRights> valueMapper = val 
-> {
+            AccessRights rights = new AccessRights();
+            JsonObject privilegesObj = 
((JsonObject)val).getJsonObject(JsonConvert.KEY_PRIVILEGES);
+            if (privilegesObj != null) {
+                privilegesObj.entrySet().stream()
+                    .forEach(entry -> {
+                        Privilege privilege = null;
+                        try {
+                            privilege = acm.privilegeFromName(entry.getKey());
+                        } catch (RepositoryException e) {
+                            logger.warn("Failed to resolve privilege", e);
+                        }
+                        if (privilege != null) {
+                            JsonValue value = entry.getValue();
+                            if (value instanceof JsonObject) {
+                                JsonObject privilegeObj = (JsonObject)value;
+                                if 
(privilegeObj.containsKey(JsonConvert.KEY_ALLOW)) {
+                                    rights.granted.add(privilege);
+                                }
+                                if 
(privilegeObj.containsKey(JsonConvert.KEY_DENY)) {
+                                    rights.denied.add(privilege);
+                                }
+                            }
+                        }
+                    });
             }
-        }
-        return allEntries.toArray(new AccessControlEntry[allEntries.size()]);
+            return rights;
+        };
+        map = aclJson.values().stream()
+                .collect(Collectors.toMap(keyMapper, valueMapper));
+        return map;
     }
 
     /**
@@ -198,42 +255,10 @@ public class PrivilegesInfo {
      * @throws RepositoryException if any errors reading the information
      */
     public AccessRights getDeclaredAccessRightsForPrincipal(Session session, 
String absPath, String principalId) throws RepositoryException {
-        AccessRights rights = null;
-        if (principalId != null && principalId.length() > 0) {
-            AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
-            AccessControlPolicy[] policies = 
accessControlManager.getPolicies(absPath);
-            rights = toAccessRights(principalId, policies);
-        }
-
-        return rights;
-    }
-
-    /**
-     * Populate and return an AccessRights object by iterating through each of 
the policies
-     * 
-     * @param principalId the user or group the get the rights for
-     * @param policies the access control policies to consider
-     * @throws RepositoryException
-     */
-    private AccessRights toAccessRights(String principalId, 
AccessControlPolicy[] policies)
-            throws RepositoryException {
-        AccessRights rights = new AccessRights();
-        for (AccessControlPolicy accessControlPolicy : policies) {
-            if (accessControlPolicy instanceof AccessControlList) {
-                AccessControlEntry[] accessControlEntries = 
((AccessControlList)accessControlPolicy).getAccessControlEntries();
-                for (AccessControlEntry ace : accessControlEntries) {
-                    if (principalId.equals(ace.getPrincipal().getName())) {
-                        boolean isAllow = AccessControlUtil.isAllow(ace);
-                        if (isAllow) {
-                            
rights.getGranted().addAll(Arrays.asList(ace.getPrivileges()));
-                        } else {
-                            
rights.getDenied().addAll(Arrays.asList(ace.getPrivileges()));
-                        }
-                    }
-                }
-            }
-        }
-        return rights;
+        Map<Principal, AccessRights> declaredAccessRights = 
getDeclaredAccessRights(session, absPath);
+        PrincipalManager principalManager = 
AccessControlUtil.getPrincipalManager(session);
+        Principal principal = principalManager.getPrincipal(principalId);
+        return declaredAccessRights.get(principal);
     }
 
     /**
@@ -243,7 +268,9 @@ public class PrivilegesInfo {
      * @param principalId the principalId to get the access rights for
      * @return map of restrictions (key is restriction name, value is Value or 
Value[])
      * @throws RepositoryException if any errors reading the information
+     * @deprecated don't use this as it assumes that all the privileges have 
the same restrictions which may not be true
      */
+    @Deprecated
     public Map<String, Object> getDeclaredRestrictionsForPrincipal(Node node, 
String principalId) throws RepositoryException {
         return getDeclaredRestrictionsForPrincipal(node.getSession(), 
node.getPath(), principalId);
     }
@@ -256,36 +283,78 @@ public class PrivilegesInfo {
      * @param principalId the principalId to get the access rights for
      * @return map of restrictions (key is restriction name, value is Value or 
Value[])
      * @throws RepositoryException if any errors reading the information
+     * @deprecated don't use this as it assumes that all the privileges have 
the same restrictions which may not be true
      */
+    @Deprecated
     public Map<String, Object> getDeclaredRestrictionsForPrincipal(Session 
session, String absPath, String principalId) throws RepositoryException {
-        Map<String, Object> restrictions = new LinkedHashMap<>();
-        AccessControlEntry[] entries = 
getDeclaredAccessControlEntries(session, absPath);
-        if (entries != null) {
-            for (AccessControlEntry ace : entries) {
-                if (principalId.equals(ace.getPrincipal().getName()) &&
-                        ace instanceof JackrabbitAccessControlEntry) {
-                    JackrabbitAccessControlEntry jace = 
(JackrabbitAccessControlEntry)ace;
-                    String[] restrictionNames = jace.getRestrictionNames();
-                    if (restrictionNames != null) {
-                        for (String name : restrictionNames) {
-                            try {
-                                Value value = jace.getRestriction(name);
-                                if (value != null) {
-                                    restrictions.put(name, value);
-                                }
-                            } catch (ValueFormatException vfe) {
-                                //try multi-value restriction
-                                Value[] values = jace.getRestrictions(name);
-                                if (values != null && values.length > 0) {
-                                    restrictions.put(name,  values);
-                                }
-                            }
-                        }
-                    }
-                }
+        JsonObject aclJson = useGetAcl(json -> {
+            try {
+                return json.getAcl(session, absPath);
+            } catch (RepositoryException e) {
+                logger.warn("Failed to load Acl", e);
             }
+            return null;
+        });
+
+        Map<String, Object> map;
+        if (aclJson == null) {
+            map = Collections.emptyMap();
+        } else {
+            Map<String, RestrictionDefinition> srMap = new HashMap<>();
+            useRestrictionProvider(restrictionProvider -> {
+                Set<RestrictionDefinition> supportedRestrictions = 
restrictionProvider.getSupportedRestrictions(absPath);
+                for (RestrictionDefinition restrictionDefinition : 
supportedRestrictions) {
+                    srMap.put(restrictionDefinition.getName(), 
restrictionDefinition);
+                }
+                return null;
+            });
+
+            ValueFactory valueFactory = session.getValueFactory();
+            map = new HashMap<>();
+            aclJson.values().stream()
+                    .filter(val -> val instanceof JsonObject && 
((JsonObject)val).getString(JsonConvert.KEY_PRINCIPAL).equals(principalId))
+                    .forEach(item -> {
+                        JsonObject privilegesObj = 
((JsonObject)item).getJsonObject(JsonConvert.KEY_PRIVILEGES);
+                        if (privilegesObj != null) {
+                            privilegesObj.values()
+                                .forEach(privItem -> {
+                                    if (privItem instanceof JsonObject) {
+                                        JsonObject privilegeObj = 
(JsonObject)privItem;
+                                        JsonValue jsonValue = 
privilegeObj.get(JsonConvert.KEY_ALLOW);
+                                        if (jsonValue instanceof JsonObject) {
+                                            JsonObject restriction = 
(JsonObject)jsonValue;
+                                            restriction.entrySet().stream()
+                                                .forEach(restrictionItem -> {
+                                                    String restrictionName = 
restrictionItem.getKey();
+                                                    int type = 
srMap.get(restrictionName).getRequiredType().tag();
+                                                    JsonValue value = 
restrictionItem.getValue();
+                                                    if 
(ValueType.ARRAY.equals(value.getValueType())) {
+                                                        JsonArray jsonArray = 
((JsonArray)value);
+                                                        Value [] 
restrictionValues = new Value[jsonArray.size()];
+                                                        for (int i=0; i < 
jsonArray.size(); i++) {
+                                                            try {
+                                                                
restrictionValues[i] = valueFactory.createValue(jsonArray.getString(i), type);
+                                                            } catch 
(ValueFormatException e) {
+                                                                
logger.warn("Failed to create restriction value", e);
+                                                            }
+                                                        }
+                                                        
map.put(restrictionName, restrictionValues);
+                                                    } else if (value 
instanceof JsonString){
+                                                        try {
+                                                            Value 
restrictionValue = valueFactory.createValue(((JsonString)value).getString(), 
type);
+                                                            
map.put(restrictionName, restrictionValue);
+                                                        } catch 
(ValueFormatException e) {
+                                                            
logger.warn("Failed to create restriction value", e);
+                                                        }
+                                                    }
+                                                });
+                                        }
+                                    }
+                                });
+                        }
+                    });
         }
-        return restrictions;
+        return map;
     }
 
     /**
@@ -310,47 +379,14 @@ public class PrivilegesInfo {
      * @throws RepositoryException if any errors reading the information
      */
     public Map<Principal, AccessRights> getEffectiveAccessRights(Session 
session, String absPath) throws RepositoryException {
-        AccessControlEntry[] entries = 
getEffectiveAccessControlEntries(session, absPath);
-        return mergePrivilegesFromEntries(entries);
-    }
-
-    /**
-     * Loop through each of the entries to merge the granted and denied 
privileges into
-     * the map
-     *
-     * @param entries the entries to process
-     * @throws RepositoryException if any errors reading the information
-     */
-    private Map<Principal, AccessRights> 
mergePrivilegesFromEntries(AccessControlEntry[] entries)
-            throws RepositoryException {
-        Map<Principal, AccessRights> accessMap = new LinkedHashMap<>();
-        if (entries != null) {
-            for (AccessControlEntry ace : entries) {
-                Principal principal = ace.getPrincipal();
-                AccessRights accessPrivileges = 
accessMap.computeIfAbsent(principal, k -> new AccessRights());
-                boolean allow = AccessControlUtil.isAllow(ace);
-                if (allow) {
-                    
accessPrivileges.getGranted().addAll(Arrays.asList(ace.getPrivileges()));
-                } else {
-                    
accessPrivileges.getDenied().addAll(Arrays.asList(ace.getPrivileges()));
+        return toMap(session, useGetEffectiveAcl(json -> {
+                try {
+                    return json.getEffectiveAcl(session, absPath);
+                } catch (RepositoryException e) {
+                    logger.warn("Failed to load EffectiveAcl", e);
                 }
-            }
-        }
-        return accessMap;
-    }
-
-    private AccessControlEntry[] getEffectiveAccessControlEntries(Session 
session, String absPath) throws RepositoryException {
-        AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
-        AccessControlPolicy[] policies = 
accessControlManager.getEffectivePolicies(absPath);
-
-        List<AccessControlEntry> allEntries = new ArrayList<>();
-        for (AccessControlPolicy accessControlPolicy : policies) {
-            if (accessControlPolicy instanceof AccessControlList) {
-                AccessControlEntry[] accessControlEntries = 
((AccessControlList)accessControlPolicy).getAccessControlEntries();
-                allEntries.addAll(Arrays.asList(accessControlEntries));
-            }
-        }
-        return allEntries.toArray(new AccessControlEntry[allEntries.size()]);
+                return null;
+            }));
     }
 
     /**
@@ -377,14 +413,10 @@ public class PrivilegesInfo {
      * @throws RepositoryException if any errors reading the information
      */
     public AccessRights getEffectiveAccessRightsForPrincipal(Session session, 
String absPath, String principalId) throws RepositoryException {
-        AccessRights rights = null;
-        if (principalId != null && principalId.length() > 0) {
-            AccessControlManager accessControlManager = 
AccessControlUtil.getAccessControlManager(session);
-            AccessControlPolicy[] policies = 
accessControlManager.getEffectivePolicies(absPath);
-            rights = toAccessRights(principalId, policies);
-        }
-
-        return rights;
+        Map<Principal, AccessRights> effectiveAccessRights = 
getEffectiveAccessRights(session, absPath);
+        PrincipalManager principalManager = 
AccessControlUtil.getPrincipalManager(session);
+        Principal principal = principalManager.getPrincipal(principalId);
+        return effectiveAccessRights.get(principal);
     }
 
     /**
@@ -602,4 +634,50 @@ public class PrivilegesInfo {
         }
     }
 
+    /**
+     * Utility to lookup a service and then run a function
+     * 
+     * @param <S> the service interface type
+     * @param <T> the return type of the fun
+     * @param svc the service class
+     * @param fn the function to invoke
+     * @return the value of invoking the fn
+     */
+    private static <S, T> T useSvc(Class<S> svc, Function<S, T> fn) {
+        T value = null;
+        Bundle bundle = FrameworkUtil.getBundle(PrivilegesInfo.class);
+        if (bundle != null) {
+            BundleContext bundleContext = bundle.getBundleContext();
+            if (bundleContext != null) {
+                ServiceReference<S> serviceReference = 
bundleContext.getServiceReference(svc);
+                if (serviceReference != null) {
+                    S service = null;
+                    try {
+                        service = bundleContext.getService(serviceReference);
+                        if (service != null) {
+                            value = fn.apply(service);
+                        }
+                    } finally {
+                        if (service != null) {
+                            bundleContext.ungetService(serviceReference);
+                        }
+                    }
+                }
+            }
+        }
+        return value;
+    }
+
+    private static <T> T useGetAcl(Function<GetAcl, T> fn) {
+        return useSvc(GetAcl.class, fn);
+    }
+
+    private static <T> T useGetEffectiveAcl(Function<GetEffectiveAcl, T> fn) {
+        return useSvc(GetEffectiveAcl.class, fn);
+    }
+
+    private static <T> T useRestrictionProvider(Function<RestrictionProvider, 
T> fn) {
+        return useSvc(RestrictionProvider.class, fn);
+    }
+
 }
diff --git 
a/src/test/java/org/apache/sling/jcr/jackrabbit/accessmanager/it/PrivilegesInfoIT.java
 
b/src/test/java/org/apache/sling/jcr/jackrabbit/accessmanager/it/PrivilegesInfoIT.java
new file mode 100644
index 0000000..87aeeef
--- /dev/null
+++ 
b/src/test/java/org/apache/sling/jcr/jackrabbit/accessmanager/it/PrivilegesInfoIT.java
@@ -0,0 +1,519 @@
+/*
+ * 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.sling.jcr.jackrabbit.accessmanager.it;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.security.Principal;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Optional;
+
+import javax.inject.Inject;
+import javax.jcr.Node;
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+import javax.jcr.Value;
+import javax.jcr.ValueFactory;
+import javax.jcr.security.Privilege;
+
+import 
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
+import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
+import org.apache.sling.jcr.api.SlingRepository;
+import org.apache.sling.jcr.jackrabbit.accessmanager.ModifyAce;
+import org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo;
+import 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo.AccessRights;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
+import org.ops4j.pax.exam.spi.reactors.PerClass;
+
+@RunWith(PaxExam.class)
+@ExamReactorStrategy(PerClass.class)
+public class PrivilegesInfoIT extends AccessManagerClientTestSupport {
+
+    private static final String NOT_A_REAL_PATH = "/not_a_real_path";
+
+    @Inject
+    private ModifyAce modifyAce;
+
+    @Inject
+    protected SlingRepository repository;
+
+    protected Session adminSession;
+    protected Session testUserSession;
+
+    private Node testNodeForAdmin;
+    private Node testNodeForTestUser;
+
+    @Before
+    public void setup() throws RepositoryException, IOException {
+        testUserId = createTestUser();
+        adminSession = repository.login(new SimpleCredentials("admin", 
"admin".toCharArray()));
+        assertNotNull("Expected adminSession to not be null", adminSession);
+        testNodeForAdmin = adminSession.getRootNode().addNode("testNode");
+        setupTestUserAce();
+        adminSession.save();
+
+        testUserSession = repository.login(new SimpleCredentials(testUserId, 
"testPwd".toCharArray()));
+        testNodeForTestUser = 
testUserSession.getNode(testNodeForAdmin.getPath());
+    }
+
+    protected void setupTestUserAce() throws RepositoryException {
+        assertNotNull(modifyAce);
+        Map<String, String> privilegesMap = new HashMap<>();
+        privilegesMap.put(PrivilegeConstants.JCR_READ, "allow");
+        modifyAce.modifyAce(adminSession,
+                testNodeForAdmin.getPath(),
+                testUserId,
+                privilegesMap,
+                "first",
+                Collections.emptyMap(),
+                Collections.emptyMap(),
+                Collections.emptySet(),
+                true);
+    }
+
+    @After
+    public void teardown() throws RepositoryException {
+        adminSession.refresh(false);
+        testNodeForAdmin.remove();
+        if (adminSession.hasPendingChanges()) {
+            adminSession.save();
+        }
+        adminSession.logout();
+        testUserSession.logout();
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#getSupportedPrivileges(javax.jcr.Node)}.
+     */
+    @Test
+    public void testGetSupportedPrivilegesNode() throws RepositoryException {
+        PrivilegesInfo pi = new PrivilegesInfo();
+        Privilege[] supportedPrivileges = 
pi.getSupportedPrivileges(testNodeForAdmin);
+        assertNotNull(supportedPrivileges);
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#getSupportedPrivileges(javax.jcr.Session,
 java.lang.String)}.
+     */
+    @Test
+    public void testGetSupportedPrivilegesSessionString() throws 
RepositoryException {
+        PrivilegesInfo pi = new PrivilegesInfo();
+        Privilege[] supportedPrivileges = 
pi.getSupportedPrivileges(adminSession, testNodeForAdmin.getPath());
+        assertNotNull(supportedPrivileges);
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#getDeclaredAccessRights(javax.jcr.Node)}.
+     */
+    @Test
+    public void testGetDeclaredAccessRightsNode() throws RepositoryException {
+        setupEveryoneAce();
+
+        PrivilegesInfo pi = new PrivilegesInfo();
+        Map<Principal, AccessRights> declaredAccessRights = 
pi.getDeclaredAccessRights(testNodeForAdmin);
+        Optional<Principal> findFirst = declaredAccessRights.keySet().stream()
+                .filter(p -> "everyone".equals(p.getName()))
+                .findFirst();
+        assertTrue(findFirst.isPresent());
+        AccessRights rights = declaredAccessRights.get(findFirst.get());
+        assertNotNull(rights);
+        Privilege jcrReadPrivilege = 
adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_READ);
+        assertTrue(rights.getGranted().contains(jcrReadPrivilege));
+    }
+
+    private Value val(int type, String value) throws RepositoryException {
+        return adminSession.getValueFactory().createValue(value, type);
+    }
+    private Value[] vals(int type, String ... value) throws 
RepositoryException {
+        Value[] values = new Value[value.length];
+        ValueFactory vf = adminSession.getValueFactory();
+        for (int i = 0; i < value.length; i++) {
+            values[i] = vf.createValue(value[i], type);
+        }
+        return values;
+    }
+
+    protected void setupEveryoneAce() throws RepositoryException {
+        assertNotNull(modifyAce);
+        Map<String, String> privilegesMap = new HashMap<>();
+        privilegesMap.put(PrivilegeConstants.JCR_READ, "allow");
+        privilegesMap.put(PrivilegeConstants.JCR_WRITE, "deny");
+        modifyAce.modifyAce(adminSession,
+                testNodeForAdmin.getPath(),
+                "everyone",
+                privilegesMap,
+                "first",
+                Collections.singletonMap(AccessControlConstants.REP_GLOB, 
val(PropertyType.STRING, "/hello")),
+                
Collections.singletonMap(AccessControlConstants.REP_ITEM_NAMES, 
vals(PropertyType.NAME, "child1", "child2")),
+                Collections.emptySet(),
+                true);
+
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#getDeclaredAccessRights(javax.jcr.Session,
 java.lang.String)}.
+     */
+    @Test
+    public void testGetDeclaredAccessRightsSessionString() throws 
RepositoryException {
+        setupEveryoneAce();
+
+        PrivilegesInfo pi = new PrivilegesInfo();
+        Map<Principal, AccessRights> declaredAccessRights = 
pi.getDeclaredAccessRights(adminSession, testNodeForAdmin.getPath());
+        Optional<Principal> findFirst = declaredAccessRights.keySet().stream()
+                .filter(p -> "everyone".equals(p.getName()))
+                .findFirst();
+        assertTrue(findFirst.isPresent());
+        AccessRights rights = declaredAccessRights.get(findFirst.get());
+        assertNotNull(rights);
+        Privilege jcrReadPrivilege = 
adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_READ);
+        assertTrue(rights.getGranted().contains(jcrReadPrivilege));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#getDeclaredAccessRightsForPrincipal(javax.jcr.Node,
 java.lang.String)}.
+     */
+    @Test
+    public void testGetDeclaredAccessRightsForPrincipalNodeString() throws 
RepositoryException {
+        setupEveryoneAce();
+
+        PrivilegesInfo pi = new PrivilegesInfo();
+        AccessRights rights = 
pi.getDeclaredAccessRightsForPrincipal(testNodeForAdmin, "everyone");
+        assertNotNull(rights);
+        Privilege jcrReadPrivilege = 
adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_READ);
+        assertTrue(rights.getGranted().contains(jcrReadPrivilege));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#getDeclaredAccessRightsForPrincipal(javax.jcr.Session,
 java.lang.String, java.lang.String)}.
+     */
+    @Test
+    public void testGetDeclaredAccessRightsForPrincipalSessionStringString() 
throws RepositoryException {
+        setupEveryoneAce();
+
+        PrivilegesInfo pi = new PrivilegesInfo();
+        AccessRights rights = 
pi.getDeclaredAccessRightsForPrincipal(adminSession, 
testNodeForAdmin.getPath(), "everyone");
+        assertNotNull(rights);
+        Privilege jcrReadPrivilege = 
adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_READ);
+        assertTrue(rights.getGranted().contains(jcrReadPrivilege));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#getDeclaredRestrictionsForPrincipal(javax.jcr.Node,
 java.lang.String)}.
+     * @deprecated api deprecated, test left for regression testing
+     */
+    @Deprecated
+    @Test
+    public void testGetDeclaredRestrictionsForPrincipalNodeString() throws 
RepositoryException {
+        setupEveryoneAce();
+
+        PrivilegesInfo pi = new PrivilegesInfo();
+        Map<String, Object> restrictions = 
pi.getDeclaredRestrictionsForPrincipal(testNodeForAdmin, "everyone");
+        assertNotNull(restrictions);
+        assertEquals(val(PropertyType.STRING, "/hello"), 
restrictions.get(AccessControlConstants.REP_GLOB));
+        assertArrayEquals(vals(PropertyType.NAME, "child1", "child2"), 
(Value[])restrictions.get(AccessControlConstants.REP_ITEM_NAMES));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#getDeclaredRestrictionsForPrincipal(javax.jcr.Session,
 java.lang.String, java.lang.String)}.
+     * @deprecated api deprecated, test left for regression testing
+     */
+    @Deprecated
+    @Test
+    public void testGetDeclaredRestrictionsForPrincipalSessionStringString() 
throws RepositoryException {
+        setupEveryoneAce();
+
+        PrivilegesInfo pi = new PrivilegesInfo();
+        Map<String, Object> restrictions = 
pi.getDeclaredRestrictionsForPrincipal(adminSession, 
testNodeForAdmin.getPath(), "everyone");
+        assertNotNull(restrictions);
+        assertEquals(val(PropertyType.STRING, "/hello"), 
restrictions.get(AccessControlConstants.REP_GLOB));
+        assertArrayEquals(vals(PropertyType.NAME, "child1", "child2"), 
(Value[])restrictions.get(AccessControlConstants.REP_ITEM_NAMES));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#getEffectiveAccessRights(javax.jcr.Node)}.
+     */
+    @Test
+    public void testGetEffectiveAccessRightsNode() throws RepositoryException {
+        setupEveryoneAce();
+
+        PrivilegesInfo pi = new PrivilegesInfo();
+        Map<Principal, AccessRights> effectiveAccessRights = 
pi.getEffectiveAccessRights(adminSession, testNodeForAdmin.getPath());
+        Optional<Principal> findFirst = effectiveAccessRights.keySet().stream()
+                .filter(p -> "everyone".equals(p.getName()))
+                .findFirst();
+        assertTrue(findFirst.isPresent());
+        AccessRights rights = effectiveAccessRights.get(findFirst.get());
+        assertNotNull(rights);
+        Privilege jcrReadPrivilege = 
adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_READ);
+        assertTrue(rights.getGranted().contains(jcrReadPrivilege));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#getEffectiveAccessRights(javax.jcr.Session,
 java.lang.String)}.
+     */
+    @Test
+    public void testGetEffectiveAccessRightsSessionString() throws 
RepositoryException {
+        setupEveryoneAce();
+
+        PrivilegesInfo pi = new PrivilegesInfo();
+        Map<Principal, AccessRights> effectiveAccessRights = 
pi.getEffectiveAccessRights(testNodeForAdmin);
+        Optional<Principal> findFirst = effectiveAccessRights.keySet().stream()
+                .filter(p -> "everyone".equals(p.getName()))
+                .findFirst();
+        assertTrue(findFirst.isPresent());
+        AccessRights rights = effectiveAccessRights.get(findFirst.get());
+        assertNotNull(rights);
+        Privilege jcrReadPrivilege = 
adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_READ);
+        assertTrue(rights.getGranted().contains(jcrReadPrivilege));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#getEffectiveAccessRightsForPrincipal(javax.jcr.Node,
 java.lang.String)}.
+     */
+    @Test
+    public void testGetEffectiveAccessRightsForPrincipalNodeString() throws 
RepositoryException {
+        setupEveryoneAce();
+
+        PrivilegesInfo pi = new PrivilegesInfo();
+        AccessRights rights = 
pi.getEffectiveAccessRightsForPrincipal(testNodeForAdmin, "everyone");
+        assertNotNull(rights);
+        Privilege jcrReadPrivilege = 
adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_READ);
+        assertTrue(rights.getGranted().contains(jcrReadPrivilege));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#getEffectiveAccessRightsForPrincipal(javax.jcr.Session,
 java.lang.String, java.lang.String)}.
+     */
+    @Test
+    public void testGetEffectiveAccessRightsForPrincipalSessionStringString() 
throws RepositoryException {
+        setupEveryoneAce();
+
+        PrivilegesInfo pi = new PrivilegesInfo();
+        AccessRights rights = 
pi.getEffectiveAccessRightsForPrincipal(adminSession, 
testNodeForAdmin.getPath(), "everyone");
+        assertNotNull(rights);
+        Privilege jcrReadPrivilege = 
adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_READ);
+        assertTrue(rights.getGranted().contains(jcrReadPrivilege));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#canAddChildren(javax.jcr.Node)}.
+     */
+    @Test
+    public void testCanAddChildrenNode() {
+        PrivilegesInfo pi = new PrivilegesInfo();
+        assertTrue(pi.canAddChildren(testNodeForAdmin));
+        assertFalse(pi.canAddChildren(testNodeForTestUser));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#canAddChildren(javax.jcr.Session,
 java.lang.String)}.
+     */
+    @Test
+    public void testCanAddChildrenSessionString() throws RepositoryException {
+        PrivilegesInfo pi = new PrivilegesInfo();
+        assertTrue(pi.canAddChildren(adminSession, 
testNodeForAdmin.getPath()));
+        assertFalse(pi.canAddChildren(testUserSession, 
testNodeForTestUser.getPath()));
+        assertFalse(pi.canAddChildren(testUserSession, NOT_A_REAL_PATH));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#canDeleteChildren(javax.jcr.Node)}.
+     */
+    @Test
+    public void testCanDeleteChildrenNode() {
+        PrivilegesInfo pi = new PrivilegesInfo();
+        assertTrue(pi.canDeleteChildren(testNodeForAdmin));
+        assertFalse(pi.canDeleteChildren(testNodeForTestUser));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#canDeleteChildren(javax.jcr.Session,
 java.lang.String)}.
+     */
+    @Test
+    public void testCanDeleteChildrenSessionString() throws 
RepositoryException {
+        PrivilegesInfo pi = new PrivilegesInfo();
+        assertTrue(pi.canDeleteChildren(adminSession, 
testNodeForAdmin.getPath()));
+        assertFalse(pi.canDeleteChildren(testUserSession, 
testNodeForTestUser.getPath()));
+        assertFalse(pi.canDeleteChildren(testUserSession, NOT_A_REAL_PATH));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#canDelete(javax.jcr.Node)}.
+     */
+    @Test
+    public void testCanDeleteNode() {
+        PrivilegesInfo pi = new PrivilegesInfo();
+        assertTrue(pi.canDelete(testNodeForAdmin));
+        assertFalse(pi.canDelete(testNodeForTestUser));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#canDelete(javax.jcr.Session,
 java.lang.String)}.
+     */
+    @Test
+    public void testCanDeleteSessionString() throws RepositoryException {
+        PrivilegesInfo pi = new PrivilegesInfo();
+        assertTrue(pi.canDelete(adminSession, testNodeForAdmin.getPath()));
+        assertFalse(pi.canDelete(testUserSession, 
testNodeForTestUser.getPath()));
+        assertFalse(pi.canDelete(testUserSession, NOT_A_REAL_PATH));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#canModifyProperties(javax.jcr.Node)}.
+     */
+    @Test
+    public void testCanModifyPropertiesNode() {
+        PrivilegesInfo pi = new PrivilegesInfo();
+        assertTrue(pi.canModifyProperties(testNodeForAdmin));
+        assertFalse(pi.canModifyProperties(testNodeForTestUser));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#canModifyProperties(javax.jcr.Session,
 java.lang.String)}.
+     */
+    @Test
+    public void testCanModifyPropertiesSessionString() throws 
RepositoryException {
+        PrivilegesInfo pi = new PrivilegesInfo();
+        assertTrue(pi.canModifyProperties(adminSession, 
testNodeForAdmin.getPath()));
+        assertFalse(pi.canModifyProperties(testUserSession, 
testNodeForTestUser.getPath()));
+        assertFalse(pi.canModifyProperties(testUserSession, NOT_A_REAL_PATH));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#canReadAccessControl(javax.jcr.Node)}.
+     */
+    @Test
+    public void testCanReadAccessControlNode() {
+        PrivilegesInfo pi = new PrivilegesInfo();
+        assertTrue(pi.canReadAccessControl(testNodeForAdmin));
+        assertFalse(pi.canReadAccessControl(testNodeForTestUser));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#canReadAccessControl(javax.jcr.Session,
 java.lang.String)}.
+     */
+    @Test
+    public void testCanReadAccessControlSessionString() throws 
RepositoryException {
+        PrivilegesInfo pi = new PrivilegesInfo();
+        assertTrue(pi.canReadAccessControl(adminSession, 
testNodeForAdmin.getPath()));
+        assertFalse(pi.canReadAccessControl(testUserSession, 
testNodeForTestUser.getPath()));
+        assertFalse(pi.canReadAccessControl(testUserSession, NOT_A_REAL_PATH));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#canModifyAccessControl(javax.jcr.Node)}.
+     */
+    @Test
+    public void testCanModifyAccessControlNode() {
+        PrivilegesInfo pi = new PrivilegesInfo();
+        assertTrue(pi.canModifyAccessControl(testNodeForAdmin));
+        assertFalse(pi.canModifyAccessControl(testNodeForTestUser));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo#canModifyAccessControl(javax.jcr.Session,
 java.lang.String)}.
+     */
+    @Test
+    public void testCanModifyAccessControlSessionString() throws 
RepositoryException {
+        PrivilegesInfo pi = new PrivilegesInfo();
+        assertTrue(pi.canModifyAccessControl(adminSession, 
testNodeForAdmin.getPath()));
+        assertFalse(pi.canModifyAccessControl(testUserSession, 
testNodeForTestUser.getPath()));
+        assertFalse(pi.canModifyAccessControl(testUserSession, 
NOT_A_REAL_PATH));
+    }
+
+    protected AccessRights setupAccessRights() throws RepositoryException {
+        AccessRights rights = new AccessRights();
+        Privilege jcrReadPrivilege = 
adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_READ);
+        rights.getGranted().add(jcrReadPrivilege);
+        Privilege jcrWritePrivilege = 
adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_WRITE);
+        rights.getDenied().add(jcrWritePrivilege);
+        return rights;
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo.AccessRights#getGranted()}.
+     */
+    @Test
+    public void testGetGranted() throws RepositoryException {
+        AccessRights rights = setupAccessRights();
+        
assertTrue(rights.getGranted().contains(adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_READ)));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo.AccessRights#getDenied()}.
+     */
+    @Test
+    public void testGetDenied() throws RepositoryException {
+        AccessRights rights = setupAccessRights();
+        
assertTrue(rights.getDenied().contains(adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_WRITE)));
+    }
+
+    /**
+     * Test method for {@link 
org.apache.sling.jcr.jackrabbit.accessmanager.PrivilegesInfo.AccessRights#getPrivilegeSetDisplayName(java.util.Locale)}.
+     */
+    @Test
+    public void testGetPrivilegeSetDisplayName() throws RepositoryException {
+        AccessRights rights = new AccessRights();
+        //none
+        assertEquals("None", 
rights.getPrivilegeSetDisplayName(Locale.getDefault()));
+
+        //all
+        
rights.getGranted().add(adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_ALL));
+        assertEquals("Full Control", 
rights.getPrivilegeSetDisplayName(Locale.getDefault()));
+
+        //read-only
+        rights.getGranted().clear();
+        
rights.getGranted().add(adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_READ));
+        assertEquals("Read Only", 
rights.getPrivilegeSetDisplayName(Locale.getDefault()));
+
+        //read-write
+        
rights.getGranted().add(adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_WRITE));
+        assertEquals("Read/Write", 
rights.getPrivilegeSetDisplayName(Locale.getDefault()));
+
+        //custom
+        rights.getGranted().clear();
+        
rights.getGranted().add(adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_READ_ACCESS_CONTROL));
+        assertEquals("Custom", 
rights.getPrivilegeSetDisplayName(Locale.getDefault()));
+
+        //custom
+        rights.getGranted().clear();
+        
rights.getGranted().add(adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_READ));
+        
rights.getGranted().add(adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_READ_ACCESS_CONTROL));
+        assertEquals("Custom", 
rights.getPrivilegeSetDisplayName(Locale.getDefault()));
+
+        //custom
+        rights.getGranted().clear();
+        
rights.getDenied().add(adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_WRITE));
+        assertEquals("Custom", 
rights.getPrivilegeSetDisplayName(Locale.getDefault()));
+    }
+
+}

Reply via email to