Author: angela
Date: Fri Mar 21 17:53:01 2014
New Revision: 1579993

URL: http://svn.apache.org/r1579993
Log:
OAK-1595 : Permissions#getPermissions(String, TreeLocation, boolean) does not 
work for permissions names

Added:
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/permission/
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/permission/PermissionsTest.java
Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/permission/Permissions.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/permission/Permissions.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/permission/Permissions.java?rev=1579993&r1=1579992&r2=1579993&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/permission/Permissions.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/permission/Permissions.java
 Fri Mar 21 17:53:01 2014
@@ -33,6 +33,7 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.version.VersionConstants;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
 import org.apache.jackrabbit.oak.plugins.tree.TreeLocation;
+import org.apache.jackrabbit.util.Text;
 
 /**
  * Provides constants for permissions used in the OAK access evaluation as well
@@ -160,6 +161,35 @@ public final class Permissions {
         PERMISSION_NAMES.put(INDEX_DEFINITION_MANAGEMENT, 
"INDEX_DEFINITION_MANAGEMENT");
     }
 
+    private static final Map<String, Long> PERMISSION_LOOKUP = new 
LinkedHashMap<String, Long>();
+        static {
+            PERMISSION_LOOKUP.put("ALL", ALL);
+            PERMISSION_LOOKUP.put("READ", READ);
+            PERMISSION_LOOKUP.put("READ_NODE", READ_NODE);
+            PERMISSION_LOOKUP.put("READ_PROPERTY", READ_PROPERTY);
+            PERMISSION_LOOKUP.put("SET_PROPERTY", SET_PROPERTY);
+            PERMISSION_LOOKUP.put("ADD_PROPERTY", ADD_PROPERTY);
+            PERMISSION_LOOKUP.put("MODIFY_PROPERTY", MODIFY_PROPERTY);
+            PERMISSION_LOOKUP.put("REMOVE_PROPERTY", REMOVE_PROPERTY);
+            PERMISSION_LOOKUP.put("ADD_NODE", ADD_NODE);
+            PERMISSION_LOOKUP.put("REMOVE_NODE", REMOVE_NODE);
+            PERMISSION_LOOKUP.put("REMOVE", REMOVE);
+            PERMISSION_LOOKUP.put("MODIFY_CHILD_NODE_COLLECTION", 
MODIFY_CHILD_NODE_COLLECTION);
+            PERMISSION_LOOKUP.put("READ_ACCESS_CONTROL", READ_ACCESS_CONTROL);
+            PERMISSION_LOOKUP.put("MODIFY_ACCESS_CONTROL", 
MODIFY_ACCESS_CONTROL);
+            PERMISSION_LOOKUP.put("NODE_TYPE_MANAGEMENT", 
NODE_TYPE_MANAGEMENT);
+            PERMISSION_LOOKUP.put("VERSION_MANAGEMENT", VERSION_MANAGEMENT);
+            PERMISSION_LOOKUP.put("LOCK_MANAGEMENT", LOCK_MANAGEMENT);
+            PERMISSION_LOOKUP.put("LIFECYCLE_MANAGEMENT", 
LIFECYCLE_MANAGEMENT);
+            PERMISSION_LOOKUP.put("RETENTION_MANAGEMENT", 
RETENTION_MANAGEMENT);
+            PERMISSION_LOOKUP.put("NODE_TYPE_DEFINITION_MANAGEMENT", 
NODE_TYPE_DEFINITION_MANAGEMENT);
+            PERMISSION_LOOKUP.put("NAMESPACE_MANAGEMENT", 
NAMESPACE_MANAGEMENT);
+            PERMISSION_LOOKUP.put("WORKSPACE_MANAGEMENT", 
WORKSPACE_MANAGEMENT);
+            PERMISSION_LOOKUP.put("PRIVILEGE_MANAGEMENT", 
PRIVILEGE_MANAGEMENT);
+            PERMISSION_LOOKUP.put("USER_MANAGEMENT", USER_MANAGEMENT);
+            PERMISSION_LOOKUP.put("INDEX_DEFINITION_MANAGEMENT", 
INDEX_DEFINITION_MANAGEMENT);
+        }
+
     /**
      * Returns names of the specified permissions.
      *
@@ -262,7 +292,7 @@ public final class Permissions {
      */
     public static long getPermissions(String jcrActions, TreeLocation location,
                                       boolean isAccessControlContent) {
-        Set<String> actions = 
Sets.newHashSet(Arrays.asList(jcrActions.split(",")));
+        Set<String> actions = Sets.newHashSet(Text.explode(jcrActions, ',', 
false));
         long permissions = NO_PERMISSION;
         if (actions.remove(Session.ACTION_READ)) {
             if (isAccessControlContent) {
@@ -332,11 +362,12 @@ public final class Permissions {
 
     private static long getPermissions(@Nonnull Set<String> permissionNames) {
         long permissions = NO_PERMISSION;
-        Iterator<Map.Entry<Long, String>> entryItr = 
PERMISSION_NAMES.entrySet().iterator();
-        while (entryItr.hasNext() && !permissionNames.isEmpty()) {
-            Map.Entry<Long,String> entry = entryItr.next();
-            if (permissionNames.remove(entry.getValue())) {
-                permissions |= entry.getKey();
+        Iterator<String> it = permissionNames.iterator();
+        while (it.hasNext()) {
+            String name = it.next();
+            if (name != null && PERMISSION_LOOKUP.containsKey(name)) {
+                permissions |= PERMISSION_LOOKUP.get(name);
+                it.remove();
             }
         }
         return permissions;

Added: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/permission/PermissionsTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/permission/PermissionsTest.java?rev=1579993&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/permission/PermissionsTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/permission/PermissionsTest.java
 Fri Mar 21 17:53:01 2014
@@ -0,0 +1,76 @@
+/*
+ * 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.spi.security.authorization.permission;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.jcr.Session;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import org.apache.jackrabbit.oak.AbstractSecurityTest;
+import org.apache.jackrabbit.oak.plugins.tree.TreeLocation;
+import org.apache.jackrabbit.util.Text;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+
+public class PermissionsTest extends AbstractSecurityTest {
+
+    @Test
+    public void testGetPermissionsFromActions() {
+        TreeLocation tl = TreeLocation.create(root.getTree("/"));
+        Map<String, Long> map = ImmutableMap.of(
+                Session.ACTION_READ, Permissions.READ_NODE,
+                Session.ACTION_READ + "," + Session.ACTION_REMOVE, 
Permissions.READ_NODE|Permissions.REMOVE_NODE
+        );
+
+        for (Map.Entry<String, Long> entry : map.entrySet()) {
+            assertEquals(entry.getValue().longValue(), 
Permissions.getPermissions(entry.getKey(), tl, false));
+        }
+    }
+
+    @Test
+    public void testGetPermissionsFromPermissionNameActions() {
+        TreeLocation tl = TreeLocation.create(root.getTree("/"));
+        long permissions = 
Permissions.NODE_TYPE_MANAGEMENT|Permissions.LOCK_MANAGEMENT|Permissions.VERSION_MANAGEMENT;
+        Set<String> names = Permissions.getNames(permissions);
+        String jcrActions = Text.implode(names.toArray(new 
String[names.size()]), ",");
+        assertEquals(permissions, Permissions.getPermissions(jcrActions, tl, 
false));
+    }
+
+    @Test
+    public void testGetPermissionsFromInvalidActions() {
+        TreeLocation tl = TreeLocation.create(root.getTree("/"));
+        List<String> l = ImmutableList.of(
+                Session.ACTION_READ + ",invalid", "invalid", "invalid," + 
Session.ACTION_REMOVE
+        );
+
+        for (String invalid : l) {
+            try {
+                Permissions.getPermissions(invalid, tl, false);
+                fail();
+            } catch (IllegalArgumentException e) {
+                // success
+            }
+        }
+    }
+
+}
\ No newline at end of file


Reply via email to