Author: eevans
Date: Tue Sep 28 23:00:39 2010
New Revision: 1002399

URL: http://svn.apache.org/viewvc?rev=1002399&view=rev
Log:
Convert to List<Object> resources

Patch by Stu Hood; reviewed by eevans for CASSANDRA-1271

Added:
    cassandra/trunk/src/java/org/apache/cassandra/auth/Resources.java
      - copied, changed from r1002398, 
cassandra/trunk/src/java/org/apache/cassandra/auth/AllowAllAuthority.java
Modified:
    cassandra/trunk/src/java/org/apache/cassandra/auth/AllowAllAuthority.java
    cassandra/trunk/src/java/org/apache/cassandra/auth/IAuthority.java
    cassandra/trunk/src/java/org/apache/cassandra/auth/SimpleAuthority.java
    cassandra/trunk/src/java/org/apache/cassandra/service/ClientState.java

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/auth/AllowAllAuthority.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/auth/AllowAllAuthority.java?rev=1002399&r1=1002398&r2=1002399&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/auth/AllowAllAuthority.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/auth/AllowAllAuthority.java 
Tue Sep 28 23:00:39 2010
@@ -21,6 +21,7 @@ package org.apache.cassandra.auth;
  */
 
 import java.util.EnumSet;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.cassandra.config.ConfigurationException;
@@ -29,7 +30,7 @@ import org.apache.cassandra.thrift.Autho
 public class AllowAllAuthority implements IAuthority
 {
     @Override
-    public EnumSet<Permission> authorize(AuthenticatedUser user, String 
keyspace)
+    public EnumSet<Permission> authorize(AuthenticatedUser user, List<Object> 
resource)
     {
         return Permission.ALL;
     }

Modified: cassandra/trunk/src/java/org/apache/cassandra/auth/IAuthority.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/auth/IAuthority.java?rev=1002399&r1=1002398&r2=1002399&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/auth/IAuthority.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/auth/IAuthority.java Tue Sep 
28 23:00:39 2010
@@ -22,17 +22,46 @@
 package org.apache.cassandra.auth;
 
 import java.util.EnumSet;
+import java.util.List;
 
 import org.apache.cassandra.config.ConfigurationException;
 
+/**
+ * Cassandra's resource hierarchy looks something like:
+ * {{/cassandra/keyspaces/$ks_name/...}}
+ * 
+ * In table form:
+ *  /cassandra/
+ *    - no checked permissions
+ *    - String
+ *    * Separates Cassandra-internal resources from resources that might be 
provided by plugins.
+ *  keyspaces/
+ *    - READ, WRITE
+ *    - String
+ *    * The list of keyspaces: READ/WRITE for this resource mean the ability 
to view/modify the list of keyspaces.
+ *  $ks_name/
+ *    - READ, WRITE, READ_VALUE, WRITE_VALUE
+ *    - String
+ *    * An individual keyspace: READ/WRITE mean the ability to view/modify the 
list of column families. Since this
+ *      is the last entry in the current hierarchy, READ/WRITE_VALUE apply 
recursively to ancestor _data_ of this keyspace.
+ * 
+ * Over time Cassandra _may_ add additional authorize calls for resources 
higher or lower in the hierarchy and
+ * IAuthority implementations should be able to handle these calls (although 
many will choose to ignore them
+ * completely). As authorize calls are added for child resources like 
{{<cf_name>/}}, the READ/WRITE_VALUE permissions
+ * will move to the lowest checked level, and will be deprecated at higher 
levels.
+ * 
+ * NB: {{/cassandra/}} will not be checked for permissions via a call to 
IAuthority.authorize, so IAuthority
+ * implementations can only deny access when a user attempts to access an 
ancestor resource.
+ */
 public interface IAuthority
 {
     /**
      * @param user An authenticated user from a previous call to 
IAuthenticator.authenticate.
-     * @param keyspace The resource to calculate permissions for.
+     * @param resource A List of Objects containing Strings and byte[]s: 
represents a resource in the hierarchy
+     * described in the Javadocs.  
      * @return An AccessLevel representing the permissions for the user and 
resource: should never return null.
      */
-    public EnumSet<Permission> authorize(AuthenticatedUser user, String 
keyspace);
+    public EnumSet<Permission> authorize(AuthenticatedUser user, List<Object> 
resource);
 
     public void validateConfiguration() throws ConfigurationException;
 }

Copied: cassandra/trunk/src/java/org/apache/cassandra/auth/Resources.java (from 
r1002398, 
cassandra/trunk/src/java/org/apache/cassandra/auth/AllowAllAuthority.java)
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/auth/Resources.java?p2=cassandra/trunk/src/java/org/apache/cassandra/auth/Resources.java&p1=cassandra/trunk/src/java/org/apache/cassandra/auth/AllowAllAuthority.java&r1=1002398&r2=1002399&rev=1002399&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/auth/AllowAllAuthority.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/auth/Resources.java Tue Sep 
28 23:00:39 2010
@@ -1,4 +1,3 @@
-package org.apache.cassandra.auth;
 /*
  * 
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -20,23 +19,33 @@ package org.apache.cassandra.auth;
  * 
  */
 
-import java.util.EnumSet;
-import java.util.Map;
+package org.apache.cassandra.auth;
+
+import java.util.List;
 
-import org.apache.cassandra.config.ConfigurationException;
-import org.apache.cassandra.thrift.AuthorizationException;
+import org.apache.cassandra.utils.FBUtilities;
 
-public class AllowAllAuthority implements IAuthority
+/**
+ * Constants related to Cassandra's resource hierarchy.
+ *
+ * A resource in Cassandra is a List containing both Strings and byte[]s.
+ */
+public final class Resources
 {
-    @Override
-    public EnumSet<Permission> authorize(AuthenticatedUser user, String 
keyspace)
-    {
-        return Permission.ALL;
-    }
+    public final static String ROOT = "cassandra";
+    public final static String KEYSPACES = "keyspaces";
 
-    @Override    
-    public void validateConfiguration() throws ConfigurationException
+    public static String toString(List<Object> resource)
     {
-        // pass
+        StringBuilder buff = new StringBuilder();
+        for (Object component : resource)
+        {
+            buff.append("/");
+            if (component instanceof byte[])
+                buff.append(FBUtilities.bytesToHex((byte[])component));
+            else
+                buff.append(component.toString());
+        }
+        return buff.toString();
     }
 }

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/auth/SimpleAuthority.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/auth/SimpleAuthority.java?rev=1002399&r1=1002398&r2=1002399&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/auth/SimpleAuthority.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/auth/SimpleAuthority.java Tue 
Sep 28 23:00:39 2010
@@ -23,6 +23,7 @@ package org.apache.cassandra.auth;
 
 import java.io.*;
 import java.util.EnumSet;
+import java.util.List;
 import java.util.Properties;
 
 import org.apache.cassandra.config.ConfigurationException;
@@ -32,8 +33,14 @@ public class SimpleAuthority implements 
     public final static String ACCESS_FILENAME_PROPERTY = "access.properties";
 
     @Override
-    public EnumSet<Permission> authorize(AuthenticatedUser user, String 
keyspace)
+    public EnumSet<Permission> authorize(AuthenticatedUser user, List<Object> 
resource)
     {
+        if (resource.size() < 3 || !Resources.ROOT.equals(resource.get(0)) || 
!Resources.KEYSPACES.equals(resource.get(1)))
+            // unable to handle resources in other portions of the hierarchy
+            return Permission.NONE;
+    
+        String keyspace = (String)resource.get(2);
+
         String afilename = System.getProperty(ACCESS_FILENAME_PROPERTY);
         EnumSet<Permission> authorized = Permission.NONE;
         try

Modified: cassandra/trunk/src/java/org/apache/cassandra/service/ClientState.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/ClientState.java?rev=1002399&r1=1002398&r2=1002399&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/ClientState.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/ClientState.java Tue 
Sep 28 23:00:39 2010
@@ -18,14 +18,14 @@
 
 package org.apache.cassandra.service;
 
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.auth.AuthenticatedUser;
 import org.apache.cassandra.auth.Permission;
+import org.apache.cassandra.auth.Resources;
 import org.apache.cassandra.config.Config.RequestSchedulerId;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.thrift.AuthenticationException;
@@ -43,6 +43,7 @@ public class ClientState
     private AuthenticatedUser user;
     private String keyspace;
     private Set<Permission> keyspaceAccess;
+    private List<Object> resource = new ArrayList<Object>();
 
     /**
      * Construct a new, empty ClientState: can be reused after logout() or 
reset().
@@ -61,8 +62,14 @@ public class ClientState
             // user is not logged in or keyspace is not set
             keyspaceAccess = null;
         else
+        {
             // authorize the user for the current keyspace
-            keyspaceAccess = DatabaseDescriptor.getAuthority().authorize(user, 
keyspace);
+            resource.clear();
+            resource.add(Resources.ROOT);
+            resource.add(Resources.KEYSPACES);
+            resource.add(keyspace);
+            keyspaceAccess = DatabaseDescriptor.getAuthority().authorize(user, 
resource);
+        }
     }
 
     public String getKeyspace()
@@ -109,6 +116,7 @@ public class ClientState
         user = DatabaseDescriptor.getAuthenticator().defaultUser();
         keyspace = null;
         keyspaceAccess = null;
+        resource.clear();
     }
 
     /**


Reply via email to