blob: d9415c5b8aa7d48a78f8c693b7cca52b2c5e494a [file] [log] [blame]
/**
* 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.sentry.tests.e2e.hive;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import org.apache.sentry.core.common.utils.PolicyFile;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class TestLockPrivileges extends AbstractTestWithStaticConfiguration {
private PolicyFile policyFile;
final String tableName = "tb1";
static Map<String, String> privileges = new HashMap<String, String>();
static {
privileges.put("all_db1_tb1", "server=server1->db=" + DB1 + "->table=tb1->action=all");
privileges.put("select_db1_tb1", "server=server1->db=" + DB1 + "->table=tb1->action=select");
privileges.put("insert_db1_tb1", "server=server1->db=" + DB1 + "->table=tb1->action=insert");
privileges.put("alter_db1_tb1", "server=server1->db=" + DB1 + "->table=tb1->action=alter");
privileges.put("lock_db1_tb1", "server=server1->db=" + DB1 + "->table=tb1->action=lock");
privileges.put("all_db1", "server=server1->db=" + DB1 + "->action=all");
privileges.put("select_db1", "server=server1->db=" + DB1 + "->action=select");
privileges.put("insert_db1", "server=server1->db=" + DB1 + "->action=insert");
privileges.put("alter_db1", "server=server1->db=" + DB1 + "->action=alter");
privileges.put("lock_db1", "server=server1->db=" + DB1 + "->action=lock");
}
@BeforeClass
public static void setHiveConcurrency() throws Exception {
enableHiveConcurrency = true;
setupTestStaticConfiguration();
}
private void adminCreate(String db, String table) throws Exception {
Connection connection = context.createConnection(ADMIN1);
Statement statement = context.createStatement(connection);
statement.execute("DROP DATABASE IF EXISTS " + db + " CASCADE");
statement.execute("CREATE DATABASE " + db);
if (table != null) {
statement.execute("CREATE table " + db + "." + table + " (a string)");
}
statement.close();
connection.close();
}
@Before
public void setup() throws Exception {
policyFile = PolicyFile.setAdminOnServer1(ADMINGROUP).setUserGroupMapping(
StaticUserGroup.getStaticMapping());
writePolicyFile(policyFile);
}
@Test
public void testLockDatabase() throws Exception {
String partialErrorMsgForNoPrivilege = "No valid privileges";
String assertErrorException = "The exception is not the same as the expectation.";
String assertExceptionThrown = "SQLException will be thrown.";
adminCreate(DB1, null);
policyFile.addPermissionsToRole("lock_db1", privileges.get("lock_db1"))
.addRolesToGroup(USERGROUP1, "lock_db1")
.addPermissionsToRole("insert_db1", privileges.get("insert_db1"))
.addRolesToGroup(USERGROUP2, "insert_db1")
.addPermissionsToRole("select_db1", privileges.get("select_db1"))
.addRolesToGroup(USERGROUP2, "select_db1")
.addPermissionsToRole("alter_db1", privileges.get("alter_db1"))
.addRolesToGroup(USERGROUP2, "alter_db1")
.addPermissionsToRole("all_db1", privileges.get("all_db1"))
.addRolesToGroup(USERGROUP3, "all_db1");
writePolicyFile(policyFile);
// user1 has lock privilege only
Connection connection = context.createConnection(USER1_1);
Statement statement = context.createStatement(connection);
statement.execute("Use " + DB1);
statement.execute("LOCK DATABASE db_1 SHARED");
try {
statement.execute("UNLOCK DATABASE db_1");
fail(assertExceptionThrown);
} catch (SQLException se) {
// Authorization is successful.
assertTrue(assertErrorException, se.getMessage().indexOf(partialErrorMsgForNoPrivilege) == -1);
}
// user2 has privileges with insert, select, alter, but has no lock privilege
connection = context.createConnection(USER2_1);
statement = context.createStatement(connection);
statement.execute("Use " + DB1);
try {
statement.execute("LOCK DATABASE db_1 SHARED");
fail(assertExceptionThrown);
} catch (SQLException se) {
// Authorization is failed, the error message include "No valid privileges"
assertTrue(assertErrorException, se.getMessage().indexOf(partialErrorMsgForNoPrivilege) > 0);
}
try {
statement.execute("UNLOCK DATABASE db_1");
fail(assertExceptionThrown);
} catch (SQLException se) {
// Authorization is failed, the error message include "No valid privileges"
assertTrue(assertErrorException, se.getMessage().indexOf(partialErrorMsgForNoPrivilege) > 0);
}
// user3 has All privilege
connection = context.createConnection(USER3_1);
statement = context.createStatement(connection);
statement.execute("Use " + DB1);
statement.execute("LOCK DATABASE db_1 SHARED");
try {
statement.execute("UNLOCK DATABASE db_1");
fail(assertExceptionThrown);
} catch (SQLException se) {
// Authorization is successful.
assertTrue(assertErrorException, se.getMessage().indexOf(partialErrorMsgForNoPrivilege) == -1);
}
statement.close();
connection.close();
}
@Test
public void testLockTable() throws Exception {
String partialErrorMsgForNoPrivilege = "No valid privileges";
String assertErrorException = "The exception is not the same as the expectation.";
String assertExceptionThrown = "SQLException will be thrown.";
adminCreate(DB1, tableName);
policyFile.addPermissionsToRole("lock_db1_tb1", privileges.get("lock_db1_tb1"))
.addRolesToGroup(USERGROUP1, "lock_db1_tb1")
.addPermissionsToRole("insert_db1_tb1", privileges.get("insert_db1_tb1"))
.addRolesToGroup(USERGROUP2, "insert_db1_tb1")
.addPermissionsToRole("select_db1_tb1", privileges.get("select_db1_tb1"))
.addRolesToGroup(USERGROUP2, "select_db1_tb1")
.addPermissionsToRole("alter_db1_tb1", privileges.get("alter_db1_tb1"))
.addRolesToGroup(USERGROUP2, "alter_db1_tb1")
.addPermissionsToRole("all_db1_tb1", privileges.get("all_db1_tb1"))
.addRolesToGroup(USERGROUP3, "all_db1_tb1");
writePolicyFile(policyFile);
// user1 has lock privilege only
Connection connection = context.createConnection(USER1_1);
Statement statement = context.createStatement(connection);
statement.execute("Use " + DB1);
statement.execute("LOCK TABLE tb1 SHARED");
try {
statement.execute("UNLOCK TABLE tb1");
fail(assertExceptionThrown);
} catch (SQLException se) {
// Authorization is successful.
assertTrue(assertErrorException, se.getMessage().indexOf(partialErrorMsgForNoPrivilege) == -1);
}
// user2 has privileges with insert, select, alter, but has no lock privilege
connection = context.createConnection(USER2_1);
statement = context.createStatement(connection);
statement.execute("Use " + DB1);
try {
statement.execute("LOCK TABLE tb1 SHARED");
fail(assertExceptionThrown);
} catch (SQLException se) {
// Authorization is failed, the error message include "No valid privileges"
assertTrue(assertErrorException,
se.getMessage().indexOf(partialErrorMsgForNoPrivilege) > 0);
}
try {
statement.execute("UNLOCK TABLE tb1");
fail(assertExceptionThrown);
} catch (SQLException se) {
// Authorization is failed, the error message include "No valid privileges"
assertTrue(assertErrorException,
se.getMessage().indexOf(partialErrorMsgForNoPrivilege) > 0);
}
// user3 has All privilege
connection = context.createConnection(USER3_1);
statement = context.createStatement(connection);
statement.execute("Use " + DB1);
statement.execute("LOCK TABLE tb1 SHARED");
try {
statement.execute("UNLOCK TABLE tb1");
fail(assertExceptionThrown);
} catch (SQLException se) {
// Authorization is successful.
assertTrue(assertErrorException, se.getMessage().indexOf(partialErrorMsgForNoPrivilege) == -1);
}
statement.close();
connection.close();
}
}