Author: hashutosh
Date: Fri Feb 21 00:46:53 2014
New Revision: 1570405

URL: http://svn.apache.org/r1570405
Log:
HIVE-6433 : SQL std auth - allow grant/revoke roles if user has ADMIN OPTION 
(Ashutosh Chauhan via Thejas Nair)

Added:
    hive/trunk/ql/src/test/queries/clientnegative/authorization_role_grant.q
    hive/trunk/ql/src/test/queries/clientpositive/authorization_role_grant2.q
    hive/trunk/ql/src/test/results/clientnegative/authorization_role_grant.q.out
    
hive/trunk/ql/src/test/results/clientpositive/authorization_role_grant2.q.out
Modified:
    
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/SQLStdHiveAccessController.java
    
hive/trunk/ql/src/test/results/clientnegative/authorization_set_role_neg2.q.out

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/SQLStdHiveAccessController.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/SQLStdHiveAccessController.java?rev=1570405&r1=1570404&r2=1570405&view=diff
==============================================================================
--- 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/SQLStdHiveAccessController.java
 (original)
+++ 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/plugin/sqlstd/SQLStdHiveAccessController.java
 Fri Feb 21 00:46:53 2014
@@ -62,6 +62,8 @@ public class SQLStdHiveAccessController 
   private HiveRole adminRole;
   private final String ADMIN_ONLY_MSG = "User has to belong to ADMIN role and "
       + "have it as current role, for this action.";
+  private final String HAS_ADMIN_PRIV_MSG = "grantor need to have ADMIN 
privileges on role being"
+      + " granted and have it as a current role for this action.";
 
   SQLStdHiveAccessController(HiveMetastoreClientFactory 
metastoreClientFactory, HiveConf conf,
       HiveAuthenticationProvider authenticator) throws 
HiveAuthzPluginException {
@@ -275,9 +277,9 @@ public class SQLStdHiveAccessController 
   public void grantRole(List<HivePrincipal> hivePrincipals, List<String> 
roleNames,
     boolean grantOption, HivePrincipal grantorPrinc) throws 
HiveAuthzPluginException,
     HiveAccessControlException {
-    if (!isUserAdmin()) {
+    if (!(isUserAdmin() || doesUserHasAdminOption(roleNames))) {
       throw new HiveAccessControlException("Current user : " + 
currentUserName+ " is not"
-        + " allowed to grant role. Currently " + ADMIN_ONLY_MSG);
+        + " allowed to grant role. " + ADMIN_ONLY_MSG + " Otherwise, " + 
HAS_ADMIN_PRIV_MSG);
     }
     for (HivePrincipal hivePrincipal : hivePrincipals) {
       for (String roleName : roleNames) {
@@ -307,9 +309,9 @@ public class SQLStdHiveAccessController 
       throw new HiveAuthzPluginException("Revoking only the admin privileges 
on "
         + "role is not currently supported");
     }
-    if (!isUserAdmin()) {
+    if (!(isUserAdmin() || doesUserHasAdminOption(roleNames))) {
       throw new HiveAccessControlException("Current user : " + 
currentUserName+ " is not"
-          + " allowed to revoke role. " + ADMIN_ONLY_MSG);
+          + " allowed to revoke role. " + ADMIN_ONLY_MSG + " Otherwise, " + 
HAS_ADMIN_PRIV_MSG);
     }
     for (HivePrincipal hivePrincipal : hivePrincipals) {
       for (String roleName : roleNames) {
@@ -404,6 +406,7 @@ public class SQLStdHiveAccessController 
   public void setCurrentRole(String roleName) throws 
HiveAccessControlException,
     HiveAuthzPluginException {
 
+    initUserRoles();
     if ("NONE".equalsIgnoreCase(roleName)) {
       // for set role NONE, reset roles to default roles.
       currentRoles.clear();
@@ -453,4 +456,30 @@ public class SQLStdHiveAccessController 
     }
     return false;
   }
+
+  private boolean doesUserHasAdminOption(List<String> roleNames) throws 
HiveAuthzPluginException {
+    List<HiveRole> currentRoles;
+    try {
+      currentRoles = getCurrentRoles();
+    } catch (Exception e) {
+        throw new HiveAuthzPluginException(e);
+    }
+    for (String roleName : roleNames) {
+      boolean roleFound = false;
+      for (HiveRole currentRole : currentRoles) {
+        if (roleName.equalsIgnoreCase(currentRole.getRoleName())) {
+          roleFound = true;
+          if (!currentRole.isGrantOption()) {
+            return false;
+          } else {
+              break;
+          }
+        }
+      }
+      if (!roleFound) {
+        return false;
+      }
+    }
+    return true;
+  }
 }

Added: hive/trunk/ql/src/test/queries/clientnegative/authorization_role_grant.q
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/authorization_role_grant.q?rev=1570405&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/authorization_role_grant.q 
(added)
+++ hive/trunk/ql/src/test/queries/clientnegative/authorization_role_grant.q 
Fri Feb 21 00:46:53 2014
@@ -0,0 +1,22 @@
+set hive.users.in.admin.role=hive_admin_user;
+set 
hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory;
+set 
hive.security.authenticator.manager=org.apache.hadoop.hive.ql.security.SessionStateConfigUserAuthenticator;
+set user.name=hive_admin_user;
+
+set role ADMIN;
+
+----------------------------------------
+-- role granting with admin option
+-- since user2 doesn't have admin option for role_noadmin, last grant should 
fail
+----------------------------------------
+
+create role role_noadmin;
+create role src_role_wadmin;
+grant  src_role_wadmin to user user2 with admin option;
+grant  role_noadmin to user user2;
+show role grant user user2;
+
+
+set user.name=user2;
+set role role_noadmin;
+grant  src_role_wadmin to user user3;

Added: hive/trunk/ql/src/test/queries/clientpositive/authorization_role_grant2.q
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/authorization_role_grant2.q?rev=1570405&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/authorization_role_grant2.q 
(added)
+++ hive/trunk/ql/src/test/queries/clientpositive/authorization_role_grant2.q 
Fri Feb 21 00:46:53 2014
@@ -0,0 +1,21 @@
+set hive.users.in.admin.role=hive_admin_user;
+set 
hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory;
+set 
hive.security.authenticator.manager=org.apache.hadoop.hive.ql.security.SessionStateConfigUserAuthenticator;
+set user.name=hive_admin_user;
+
+set role ADMIN;
+
+----------------------------------------
+-- role granting with admin option
+----------------------------------------
+
+create role src_role_wadmin;
+grant  src_role_wadmin to user user2 with admin option;
+show role grant user user2;
+
+set user.name=user2;
+set role src_role_wadmin;
+grant  src_role_wadmin to user user3;
+show role grant user user3;
+revoke src_role_wadmin from user user3;
+show role grant user user3;

Added: 
hive/trunk/ql/src/test/results/clientnegative/authorization_role_grant.q.out
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/authorization_role_grant.q.out?rev=1570405&view=auto
==============================================================================
--- 
hive/trunk/ql/src/test/results/clientnegative/authorization_role_grant.q.out 
(added)
+++ 
hive/trunk/ql/src/test/results/clientnegative/authorization_role_grant.q.out 
Fri Feb 21 00:46:53 2014
@@ -0,0 +1,44 @@
+PREHOOK: query: set role ADMIN
+PREHOOK: type: SHOW_ROLES
+POSTHOOK: query: set role ADMIN
+POSTHOOK: type: SHOW_ROLES
+PREHOOK: query: ----------------------------------------
+-- role granting with admin option
+-- since user2 doesn't have admin option for role_noadmin, last grant should 
fail
+----------------------------------------
+
+create role role_noadmin
+PREHOOK: type: CREATEROLE
+POSTHOOK: query: ----------------------------------------
+-- role granting with admin option
+-- since user2 doesn't have admin option for role_noadmin, last grant should 
fail
+----------------------------------------
+
+create role role_noadmin
+POSTHOOK: type: CREATEROLE
+PREHOOK: query: create role src_role_wadmin
+PREHOOK: type: CREATEROLE
+POSTHOOK: query: create role src_role_wadmin
+POSTHOOK: type: CREATEROLE
+PREHOOK: query: grant  src_role_wadmin to user user2 with admin option
+PREHOOK: type: GRANT_ROLE
+POSTHOOK: query: grant  src_role_wadmin to user user2 with admin option
+POSTHOOK: type: GRANT_ROLE
+PREHOOK: query: grant  role_noadmin to user user2
+PREHOOK: type: GRANT_ROLE
+POSTHOOK: query: grant  role_noadmin to user user2
+POSTHOOK: type: GRANT_ROLE
+PREHOOK: query: show role grant user user2
+PREHOOK: type: SHOW_ROLE_GRANT
+POSTHOOK: query: show role grant user user2
+POSTHOOK: type: SHOW_ROLE_GRANT
+PUBLIC -1                      false   -1      
+role_noadmin   -1      user2   USER    false   -1      hive_admin_user
+src_role_wadmin        -1      user2   USER    true    -1      hive_admin_user
+PREHOOK: query: set role role_noadmin
+PREHOOK: type: SHOW_ROLES
+POSTHOOK: query: set role role_noadmin
+POSTHOOK: type: SHOW_ROLES
+PREHOOK: query: grant  src_role_wadmin to user user3
+PREHOOK: type: GRANT_ROLE
+FAILED: Execution Error, return code 1 from 
org.apache.hadoop.hive.ql.exec.DDLTask. 
org.apache.hadoop.hive.ql.security.authorization.plugin.HiveAccessControlException:
 Current user : user2 is not allowed to grant role. User has to belong to ADMIN 
role and have it as current role, for this action. Otherwise, grantor need to 
have ADMIN privileges on role being granted and have it as a current role for 
this action.

Modified: 
hive/trunk/ql/src/test/results/clientnegative/authorization_set_role_neg2.q.out
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/authorization_set_role_neg2.q.out?rev=1570405&r1=1570404&r2=1570405&view=diff
==============================================================================
--- 
hive/trunk/ql/src/test/results/clientnegative/authorization_set_role_neg2.q.out 
(original)
+++ 
hive/trunk/ql/src/test/results/clientnegative/authorization_set_role_neg2.q.out 
Fri Feb 21 00:46:53 2014
@@ -16,4 +16,12 @@ POSTHOOK: query: grant role rset_role_ne
 POSTHOOK: type: GRANT_ROLE
 PREHOOK: query: set role rset_role_neg
 PREHOOK: type: SHOW_ROLES
-FAILED: Execution Error, return code 1 from 
org.apache.hadoop.hive.ql.exec.DDLTask. hive_admin_user doesn't belong to role 
rset_role_neg
+POSTHOOK: query: set role rset_role_neg
+POSTHOOK: type: SHOW_ROLES
+PREHOOK: query: set role public
+PREHOOK: type: SHOW_ROLES
+POSTHOOK: query: set role public
+POSTHOOK: type: SHOW_ROLES
+PREHOOK: query: set role nosuchroleexists
+PREHOOK: type: SHOW_ROLES
+FAILED: Execution Error, return code 1 from 
org.apache.hadoop.hive.ql.exec.DDLTask. user2 doesn't belong to role 
nosuchroleexists

Added: 
hive/trunk/ql/src/test/results/clientpositive/authorization_role_grant2.q.out
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/authorization_role_grant2.q.out?rev=1570405&view=auto
==============================================================================
--- 
hive/trunk/ql/src/test/results/clientpositive/authorization_role_grant2.q.out 
(added)
+++ 
hive/trunk/ql/src/test/results/clientpositive/authorization_role_grant2.q.out 
Fri Feb 21 00:46:53 2014
@@ -0,0 +1,49 @@
+PREHOOK: query: set role ADMIN
+PREHOOK: type: SHOW_ROLES
+POSTHOOK: query: set role ADMIN
+POSTHOOK: type: SHOW_ROLES
+PREHOOK: query: ----------------------------------------
+-- role granting with admin option
+----------------------------------------
+
+create role src_role_wadmin
+PREHOOK: type: CREATEROLE
+POSTHOOK: query: ----------------------------------------
+-- role granting with admin option
+----------------------------------------
+
+create role src_role_wadmin
+POSTHOOK: type: CREATEROLE
+PREHOOK: query: grant  src_role_wadmin to user user2 with admin option
+PREHOOK: type: GRANT_ROLE
+POSTHOOK: query: grant  src_role_wadmin to user user2 with admin option
+POSTHOOK: type: GRANT_ROLE
+PREHOOK: query: show role grant user user2
+PREHOOK: type: SHOW_ROLE_GRANT
+POSTHOOK: query: show role grant user user2
+POSTHOOK: type: SHOW_ROLE_GRANT
+PUBLIC -1                      false   -1      
+src_role_wadmin        -1      user2   USER    true    -1      hive_admin_user
+PREHOOK: query: set role src_role_wadmin
+PREHOOK: type: SHOW_ROLES
+POSTHOOK: query: set role src_role_wadmin
+POSTHOOK: type: SHOW_ROLES
+PREHOOK: query: grant  src_role_wadmin to user user3
+PREHOOK: type: GRANT_ROLE
+POSTHOOK: query: grant  src_role_wadmin to user user3
+POSTHOOK: type: GRANT_ROLE
+PREHOOK: query: show role grant user user3
+PREHOOK: type: SHOW_ROLE_GRANT
+POSTHOOK: query: show role grant user user3
+POSTHOOK: type: SHOW_ROLE_GRANT
+PUBLIC -1                      false   -1      
+src_role_wadmin        -1      user3   USER    false   -1      user2
+PREHOOK: query: revoke src_role_wadmin from user user3
+PREHOOK: type: REVOKE_ROLE
+POSTHOOK: query: revoke src_role_wadmin from user user3
+POSTHOOK: type: REVOKE_ROLE
+PREHOOK: query: show role grant user user3
+PREHOOK: type: SHOW_ROLE_GRANT
+POSTHOOK: query: show role grant user user3
+POSTHOOK: type: SHOW_ROLE_GRANT
+PUBLIC -1                      false   -1      


Reply via email to