Author: eevans
Date: Mon Aug 30 21:14:29 2010
New Revision: 990944
URL: http://svn.apache.org/viewvc?rev=990944&view=rev
Log:
Convert AccessLevel to Set<Permission>
Patch by Stu Hood; reviewed by eevans for CASSANDRA-1320
Added:
cassandra/trunk/src/java/org/apache/cassandra/auth/Permission.java
- copied, changed from r990943,
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=990944&r1=990943&r2=990944&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/auth/AllowAllAuthority.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/auth/AllowAllAuthority.java
Mon Aug 30 21:14:29 2010
@@ -20,18 +20,18 @@ package org.apache.cassandra.auth;
*
*/
+import java.util.EnumSet;
import java.util.Map;
import org.apache.cassandra.config.ConfigurationException;
-import org.apache.cassandra.thrift.AccessLevel;
import org.apache.cassandra.thrift.AuthorizationException;
public class AllowAllAuthority implements IAuthority
{
@Override
- public AccessLevel authorize(AuthenticatedUser user, String keyspace)
+ public EnumSet<Permission> authorize(AuthenticatedUser user, String
keyspace)
{
- return AccessLevel.FULL;
+ return Permission.ALL;
}
@Override
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=990944&r1=990943&r2=990944&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/auth/IAuthority.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/auth/IAuthority.java Mon Aug
30 21:14:29 2010
@@ -21,8 +21,9 @@
package org.apache.cassandra.auth;
+import java.util.EnumSet;
+
import org.apache.cassandra.config.ConfigurationException;
-import org.apache.cassandra.thrift.AccessLevel;
public interface IAuthority
{
@@ -31,7 +32,7 @@ public interface IAuthority
* @param keyspace The resource to calculate permissions for.
* @return An AccessLevel representing the permissions for the user and
resource: should never return null.
*/
- public AccessLevel authorize(AuthenticatedUser user, String keyspace);
+ public EnumSet<Permission> authorize(AuthenticatedUser user, String
keyspace);
public void validateConfiguration() throws ConfigurationException;
}
Copied: cassandra/trunk/src/java/org/apache/cassandra/auth/Permission.java
(from r990943,
cassandra/trunk/src/java/org/apache/cassandra/auth/AllowAllAuthority.java)
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/auth/Permission.java?p2=cassandra/trunk/src/java/org/apache/cassandra/auth/Permission.java&p1=cassandra/trunk/src/java/org/apache/cassandra/auth/AllowAllAuthority.java&r1=990943&r2=990944&rev=990944&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/auth/AllowAllAuthority.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/auth/Permission.java Mon Aug
30 21:14:29 2010
@@ -1,4 +1,3 @@
-package org.apache.cassandra.auth;
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -20,23 +19,26 @@ package org.apache.cassandra.auth;
*
*/
-import java.util.Map;
+package org.apache.cassandra.auth;
-import org.apache.cassandra.config.ConfigurationException;
-import org.apache.cassandra.thrift.AccessLevel;
-import org.apache.cassandra.thrift.AuthorizationException;
+import java.util.EnumSet;
-public class AllowAllAuthority implements IAuthority
+/**
+ * An enum encapsulating the set of possible permissions that an authenticated
user can have for a resource.
+ *
+ * IAuthority implementations may encode permissions using ordinals, so the
Enum order must never change.
+ */
+public enum Permission
{
- @Override
- public AccessLevel authorize(AuthenticatedUser user, String keyspace)
- {
- return AccessLevel.FULL;
- }
+ // view the direct children of this resource
+ READ,
+ // modify the direct children of this resource
+ WRITE,
+ // view data in all ancestors of this resource
+ READ_VALUE,
+ // modify data in all ancestors of this resource
+ WRITE_VALUE;
- @Override
- public void validateConfiguration() throws ConfigurationException
- {
- // pass
- }
+ public static final EnumSet<Permission> ALL =
EnumSet.allOf(Permission.class);
+ public static final EnumSet<Permission> NONE =
EnumSet.noneOf(Permission.class);
}
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=990944&r1=990943&r2=990944&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/auth/SimpleAuthority.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/auth/SimpleAuthority.java Mon
Aug 30 21:14:29 2010
@@ -22,21 +22,20 @@ package org.apache.cassandra.auth;
import java.io.*;
+import java.util.EnumSet;
import java.util.Properties;
-import java.util.Map;
import org.apache.cassandra.config.ConfigurationException;
-import org.apache.cassandra.thrift.AccessLevel;
public class SimpleAuthority implements IAuthority
{
public final static String ACCESS_FILENAME_PROPERTY = "access.properties";
@Override
- public AccessLevel authorize(AuthenticatedUser user, String keyspace)
+ public EnumSet<Permission> authorize(AuthenticatedUser user, String
keyspace)
{
String afilename = System.getProperty(ACCESS_FILENAME_PROPERTY);
- AccessLevel authorized = AccessLevel.NONE;
+ EnumSet<Permission> authorized = Permission.NONE;
try
{
FileInputStream in = new FileInputStream(afilename);
@@ -51,11 +50,11 @@ public class SimpleAuthority implements
// note we keep the message here and for other authorization
problems exactly the same to prevent attackers
// from guessing what keyspaces are valid
if (null == props.getProperty(keyspace))
- return AccessLevel.NONE;
+ return authorized;
for (String allow : props.getProperty(keyspace).split(","))
if (allow.equals(user.username))
- authorized = AccessLevel.FULL;
+ authorized = Permission.ALL;
}
catch (IOException e)
{
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=990944&r1=990943&r2=990944&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/ClientState.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/ClientState.java Mon
Aug 30 21:14:29 2010
@@ -19,14 +19,15 @@
package org.apache.cassandra.service;
import java.util.Map;
+import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.Permission;
import org.apache.cassandra.config.Config.RequestSchedulerId;
import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.thrift.AccessLevel;
import org.apache.cassandra.thrift.AuthenticationException;
import org.apache.cassandra.thrift.InvalidRequestException;
@@ -51,9 +52,9 @@ public class ClientState
}
};
- // Keyspace and keyspace AccessLevels associated with the session
+ // Keyspace and keyspace Permissions associated with the session
private final ThreadLocal<String> keyspace = new ThreadLocal<String>();
- private final ThreadLocal<AccessLevel> keyspaceAccess = new
ThreadLocal<AccessLevel>();
+ private final ThreadLocal<Set<Permission>> keyspaceAccess = new
ThreadLocal<Set<Permission>>();
/**
* Called when the keyspace or user have changed.
@@ -108,15 +109,15 @@ public class ClientState
}
/**
- * Confirms that the client thread has the given AccessLevel in the
context of the current Keyspace.
+ * Confirms that the client thread has the given Permission in the context
of the current Keyspace.
*/
- public void hasKeyspaceAccess(AccessLevel level) throws
InvalidRequestException
+ public void hasKeyspaceAccess(Permission perm) throws
InvalidRequestException
{
if (user.get() == null)
throw new InvalidRequestException("You have not logged in");
if (keyspaceAccess.get() == null)
throw new InvalidRequestException("You have not set a keyspace for
this session");
- if (keyspaceAccess.get().ordinal() < level.ordinal())
- throw new InvalidRequestException(String.format("Your user (%s)
does not have permission to perform %s operations", user, level));
+ if (!keyspaceAccess.get().contains(perm))
+ throw new InvalidRequestException(String.format("You (%s) do not
have permission %s for %s", user, perm, keyspace.get()));
}
}