http://git-wip-us.apache.org/repos/asf/impala/blob/011acd07/fe/src/test/java/org/apache/impala/analysis/AuthorizationTestV2.java
----------------------------------------------------------------------
diff --git
a/fe/src/test/java/org/apache/impala/analysis/AuthorizationTestV2.java
b/fe/src/test/java/org/apache/impala/analysis/AuthorizationTestV2.java
deleted file mode 100644
index ba097ca..0000000
--- a/fe/src/test/java/org/apache/impala/analysis/AuthorizationTestV2.java
+++ /dev/null
@@ -1,1401 +0,0 @@
-// 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.impala.analysis;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.ArrayUtils;
-import org.apache.impala.analysis.AnalysisContext.AnalysisResult;
-import org.apache.impala.authorization.AuthorizationConfig;
-import org.apache.impala.authorization.PrivilegeRequest;
-import org.apache.impala.authorization.User;
-import org.apache.impala.catalog.AuthorizationException;
-import org.apache.impala.catalog.Role;
-import org.apache.impala.catalog.RolePrivilege;
-import org.apache.impala.catalog.ScalarFunction;
-import org.apache.impala.catalog.Type;
-import org.apache.impala.common.FrontendTestBase;
-import org.apache.impala.common.ImpalaException;
-import org.apache.impala.common.RuntimeEnv;
-import org.apache.impala.service.Frontend;
-import org.apache.impala.testutil.ImpaladTestCatalog;
-import org.apache.impala.thrift.TColumnValue;
-import org.apache.impala.thrift.TDescribeOutputStyle;
-import org.apache.impala.thrift.TDescribeResult;
-import org.apache.impala.thrift.TFunctionBinaryType;
-import org.apache.impala.thrift.TPrivilege;
-import org.apache.impala.thrift.TPrivilegeLevel;
-import org.apache.impala.thrift.TPrivilegeScope;
-import org.apache.impala.thrift.TResultRow;
-import org.apache.impala.thrift.TTableName;
-import org.apache.impala.util.SentryPolicyService;
-import org.apache.sentry.provider.db.service.thrift.TSentryRole;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-public class AuthorizationTestV2 extends FrontendTestBase {
- private static final String SENTRY_SERVER = "server1";
- private final static User USER = new User(System.getProperty("user.name"));
- private final AnalysisContext analysisContext_;
- private final SentryPolicyService sentryService_;
- private final ImpaladTestCatalog authzCatalog_;
- private final Frontend authzFrontend_;
-
- public AuthorizationTestV2() {
- AuthorizationConfig authzConfig =
AuthorizationConfig.createHadoopGroupAuthConfig(
- SENTRY_SERVER, null, System.getenv("IMPALA_HOME") +
- "/fe/src/test/resources/sentry-site.xml");
- authzConfig.validateConfig();
- analysisContext_ = createAnalysisCtx(authzConfig, USER.getName());
- authzCatalog_ = new ImpaladTestCatalog(authzConfig);
- authzFrontend_ = new Frontend(authzConfig, authzCatalog_);
- sentryService_ = new SentryPolicyService(authzConfig.getSentryConfig());
- }
-
- @BeforeClass
- public static void setUp() {
- RuntimeEnv.INSTANCE.setTestEnv(true);
- }
-
- @AfterClass
- public static void cleanUp() {
- RuntimeEnv.INSTANCE.reset();
- }
-
- @Before
- public void before() throws ImpalaException {
- // Remove existing roles in order to not interfere with these tests.
- for (TSentryRole role: sentryService_.listAllRoles(USER)) {
- authzCatalog_.removeRole(role.getRoleName());
- }
- }
-
- private static final String[] ALLTYPES_COLUMNS_WITHOUT_ID = new
String[]{"bool_col",
- "tinyint_col", "smallint_col", "int_col", "bigint_col", "float_col",
"double_col",
- "date_string_col", "string_col", "timestamp_col", "year", "month"};
-
- private static final String[] ALLTYPES_COLUMNS = (String[])
ArrayUtils.addAll(
- new String[]{"id"}, ALLTYPES_COLUMNS_WITHOUT_ID);
-
- @Test
- public void testPrivilegeRequests() throws ImpalaException {
- // Used for select *, with, and union
- Set<String> expectedAuthorizables = Sets.newHashSet(
- "functional.alltypes",
- "functional.alltypes.id",
- "functional.alltypes.bool_col",
- "functional.alltypes.tinyint_col",
- "functional.alltypes.smallint_col",
- "functional.alltypes.int_col",
- "functional.alltypes.bigint_col",
- "functional.alltypes.float_col",
- "functional.alltypes.double_col",
- "functional.alltypes.date_string_col",
- "functional.alltypes.string_col",
- "functional.alltypes.timestamp_col",
- "functional.alltypes.year",
- "functional.alltypes.month"
- );
- // Select *
- verifyPrivilegeReqs("select * from functional.alltypes",
expectedAuthorizables);
- verifyPrivilegeReqs("select alltypes.* from functional.alltypes",
- expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"), "select * from
alltypes",
- expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"),
- "select alltypes.* from alltypes", expectedAuthorizables);
- verifyPrivilegeReqs("select a.* from functional.alltypes a",
expectedAuthorizables);
-
- // With clause.
- verifyPrivilegeReqs("with t as (select * from functional.alltypes) select
* from t",
- expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"),
- "with t as (select * from alltypes) select * from t",
expectedAuthorizables);
-
- // Union.
- verifyPrivilegeReqs("select * from functional.alltypes union all " +
- "select * from functional.alltypes", expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"),
- "select * from alltypes union all select * from alltypes",
- expectedAuthorizables);
-
- // Describe
- expectedAuthorizables = Sets.newHashSet("functional.alltypes.*");
- verifyPrivilegeReqs("describe functional.alltypes", expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"), "describe alltypes",
- expectedAuthorizables);
-
- // Select a specific column.
- expectedAuthorizables = Sets.newHashSet(
- "functional.alltypes",
- "functional.alltypes.id"
- );
- verifyPrivilegeReqs("select id from functional.alltypes",
expectedAuthorizables);
- verifyPrivilegeReqs("select alltypes.id from functional.alltypes",
- expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"),
- "select alltypes.id from alltypes", expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"), "select id from
alltypes",
- expectedAuthorizables);
- verifyPrivilegeReqs("select alltypes.id from functional.alltypes",
- expectedAuthorizables);
- verifyPrivilegeReqs("select a.id from functional.alltypes a",
expectedAuthorizables);
-
- // Insert.
- expectedAuthorizables = Sets.newHashSet("functional.alltypes");
- verifyPrivilegeReqs("insert into functional.alltypes(id) partition(month,
year) " +
- "values(1, 1, 2018)", expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"), "insert into
alltypes(id) " +
- "partition(month, year) values(1, 1, 2018)", expectedAuthorizables);
-
- // Insert with constant select.
- expectedAuthorizables = Sets.newHashSet("functional.zipcode_incomes");
- verifyPrivilegeReqs("insert into functional.zipcode_incomes(id) select
'123'",
- expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"),
- "insert into zipcode_incomes(id) select '123'", expectedAuthorizables);
-
- // Truncate.
- expectedAuthorizables = Sets.newHashSet("functional.alltypes");
- verifyPrivilegeReqs("truncate table functional.alltypes",
expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"),
- "truncate table alltypes", expectedAuthorizables);
-
-
- // Load
- expectedAuthorizables = Sets.newHashSet(
- "functional.alltypes",
- "hdfs://localhost:20500/test-warehouse/tpch.lineitem"
- );
- verifyPrivilegeReqs("load data inpath " +
- "'hdfs://localhost:20500/test-warehouse/tpch.lineitem' " +
- "into table functional.alltypes partition(month=10, year=2009)",
- expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"), "load data inpath " +
- "'hdfs://localhost:20500/test-warehouse/tpch.lineitem' " +
- "into table alltypes partition(month=10, year=2009)",
- expectedAuthorizables);
-
- // Reset metadata.
- expectedAuthorizables = Sets.newHashSet("functional.alltypes");
- verifyPrivilegeReqs("invalidate metadata functional.alltypes",
expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"), "invalidate metadata
alltypes",
- expectedAuthorizables);
- verifyPrivilegeReqs("refresh functional.alltypes", expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"), "refresh alltypes",
- expectedAuthorizables);
-
- // Show tables.
- expectedAuthorizables = Sets.newHashSet("functional.*.*");
- verifyPrivilegeReqs("show tables in functional", expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"), "show tables",
- expectedAuthorizables);
-
- // Show partitions.
- expectedAuthorizables = Sets.newHashSet("functional.alltypes");
- verifyPrivilegeReqs("show partitions functional.alltypes",
expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"), "show partitions
alltypes",
- expectedAuthorizables);
-
- // Show range partitions.
- expectedAuthorizables = Sets.newHashSet("functional_kudu.dimtbl");
- verifyPrivilegeReqs("show range partitions functional_kudu.dimtbl",
- expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional_kudu"),
- "show range partitions dimtbl", expectedAuthorizables);
-
- // Show table stats.
- expectedAuthorizables = Sets.newHashSet("functional.alltypes");
- verifyPrivilegeReqs("show table stats functional.alltypes",
- expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"), "show table stats
alltypes",
- expectedAuthorizables);
-
- // Show column stats.
- expectedAuthorizables = Sets.newHashSet("functional.alltypes");
- verifyPrivilegeReqs("show column stats functional.alltypes",
expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"), "show column stats
alltypes",
- expectedAuthorizables);
-
- // Show create table.
- expectedAuthorizables = Sets.newHashSet("functional.alltypes");
- verifyPrivilegeReqs("show create table functional.alltypes",
expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"),
- "show create table functional.alltypes", expectedAuthorizables);
-
- // Show create view.
- expectedAuthorizables = Sets.newHashSet("functional.alltypes_view");
- verifyPrivilegeReqs("show create view functional.alltypes_view",
- expectedAuthorizables);
- verifyPrivilegeReqs(createAnalysisCtx("functional"),
- "show create view functional.alltypes_view", expectedAuthorizables);
- }
-
- @Test
- public void testSelect() throws ImpalaException {
- for (AuthzTest authzTest: new AuthzTest[]{
- // Select a specific column on a table.
- authorize("select id from functional.alltypes"),
- // With clause with select.
- authorize("with t as (select id from functional.alltypes) select *
from t")}) {
- authzTest.ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.SELECT))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.SELECT))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.ALL))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.SELECT))
- .ok(onColumn("functional", "alltypes", "id", TPrivilegeLevel.SELECT))
- .error(selectError("functional.alltypes"))
- .error(selectError("functional.alltypes"), onServer(allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypes"), onDatabase("functional",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypes"), onTable("functional",
- "alltypes", allExcept(TPrivilegeLevel.ALL,
TPrivilegeLevel.SELECT)));
- }
-
-
- // Select without referencing a column.
- authorize("select 1 from functional.alltypes")
- .ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.SELECT))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.SELECT))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.ALL))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.SELECT))
- .error(selectError("functional.alltypes"))
- .error(selectError("functional.alltypes"), onServer(allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypes"), onDatabase("functional",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypes"), onTable("functional",
"alltypes",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)));
-
-
- // Select a specific column on a view.
- // Column-level privileges on views are not currently supported.
- authorize("select id from functional.alltypes_view")
- .ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.SELECT))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.SELECT))
- .ok(onTable("functional", "alltypes_view", TPrivilegeLevel.ALL))
- .ok(onTable("functional", "alltypes_view", TPrivilegeLevel.SELECT))
- .error(selectError("functional.alltypes_view"))
- .error(selectError("functional.alltypes_view"), onServer(allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypes_view"),
onDatabase("functional",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypes_view"), onTable("functional",
- "alltypes_view", allExcept(TPrivilegeLevel.ALL,
TPrivilegeLevel.SELECT)));
-
- // Constant select.
- authorize("select 1").ok();
-
- // Select on view and join table.
- authorize("select a.id from functional.view_view a " +
- "join functional.alltypesagg b ON (a.id = b.id)")
- .ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.SELECT))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.SELECT))
- .ok(onTable("functional", "view_view", TPrivilegeLevel.ALL),
- onTable("functional", "alltypesagg", TPrivilegeLevel.ALL))
- .ok(onTable("functional", "view_view", TPrivilegeLevel.ALL),
- onTable("functional", "alltypesagg", TPrivilegeLevel.SELECT))
- .ok(onTable("functional", "view_view", TPrivilegeLevel.SELECT),
- onTable("functional", "alltypesagg", TPrivilegeLevel.ALL))
- .ok(onTable("functional", "view_view", TPrivilegeLevel.SELECT),
- onTable("functional", "alltypesagg", TPrivilegeLevel.SELECT))
- .error(selectError("functional.view_view"))
- .error(selectError("functional.view_view"), onServer(allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.view_view"), onDatabase("functional",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.view_view"), onTable("functional",
"view_view",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)),
onTable("functional",
- "alltypesagg", allExcept(TPrivilegeLevel.ALL,
TPrivilegeLevel.SELECT)));
-
- // Tests authorization after a statement has been rewritten (IMPALA-3915).
- authorize("select * from functional_seq_snap.subquery_view")
- .ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.SELECT))
- .ok(onDatabase("functional_seq_snap", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional_seq_snap", TPrivilegeLevel.SELECT))
- .ok(onTable("functional_seq_snap", "subquery_view",
TPrivilegeLevel.ALL))
- .ok(onTable("functional_seq_snap", "subquery_view",
TPrivilegeLevel.SELECT))
- .error(selectError("functional_seq_snap.subquery_view"))
- .error(selectError("functional_seq_snap.subquery_view"), onServer(
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional_seq_snap.subquery_view"),
- onDatabase("functional_seq_snap", allExcept(TPrivilegeLevel.ALL,
- TPrivilegeLevel.SELECT)))
- .error(selectError("functional_seq_snap.subquery_view"),
- onTable("functional_seq_snap", "subquery_view", allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)));
-
- // Select from non-existent database.
- authorize("select 1 from nodb.alltypes")
- .error(selectError("nodb.alltypes"));
-
- // Select from non-existent table.
- authorize("select 1 from functional.notbl")
- .error(selectError("functional.notbl"));
-
- // Select with inline view.
- authorize("select a.* from (select * from functional.alltypes) a")
- .ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.SELECT))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.SELECT))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.ALL))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.SELECT))
- .ok(onColumn("functional", "alltypes", ALLTYPES_COLUMNS,
TPrivilegeLevel.SELECT))
- .error(selectError("functional.alltypes"))
- .error(selectError("functional.alltypes"), onServer(allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypes"), onDatabase("functional",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypes"), onTable("functional",
"alltypes",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)));
-
- // Select with columns referenced in function, where clause and group by.
- authorize("select count(id), int_col from functional.alltypes where id =
10 " +
- "group by id, int_col")
- .ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.SELECT))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.SELECT))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.ALL))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.SELECT))
- .ok(onColumn("functional", "alltypes", new String[]{"id", "int_col"},
- TPrivilegeLevel.SELECT))
- .error(selectError("functional.alltypes"))
- .error(selectError("functional.alltypes"), onServer(allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypes"), onDatabase("functional",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypes"), onTable("functional",
"alltypes",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)));
-
- // Select on tables with complex types.
- authorize("select a.int_struct_col.f1 from functional.allcomplextypes a " +
- "where a.id = 1")
- .ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.SELECT))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.SELECT))
- .ok(onTable("functional", "allcomplextypes", TPrivilegeLevel.ALL))
- .ok(onTable("functional", "allcomplextypes", TPrivilegeLevel.SELECT))
- .ok(onColumn("functional", "allcomplextypes",
- new String[]{"id", "int_struct_col"}, TPrivilegeLevel.SELECT))
- .error(selectError("functional.allcomplextypes"))
- .error(selectError("functional.allcomplextypes"), onServer(
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.allcomplextypes"),
onDatabase("functional",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.allcomplextypes"), onTable("functional",
- "allcomplextypes", allExcept(TPrivilegeLevel.ALL,
TPrivilegeLevel.SELECT)));
-
- authorize("select key, pos, item.f1, f2 from functional.allcomplextypes t,
" +
- "t.struct_array_col, functional.allcomplextypes.int_map_col")
- .ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.SELECT))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.SELECT))
- .ok(onTable("functional", "allcomplextypes", TPrivilegeLevel.ALL))
- .ok(onTable("functional", "allcomplextypes", TPrivilegeLevel.SELECT))
- .ok(onColumn("functional", "allcomplextypes",
- new String[]{"struct_array_col", "int_map_col"},
TPrivilegeLevel.SELECT))
- .error(selectError("functional.allcomplextypes"))
- .error(selectError("functional.allcomplextypes"), onServer(allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.allcomplextypes"),
onDatabase("functional",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.allcomplextypes"), onTable("functional",
- "allcomplextypes", allExcept(TPrivilegeLevel.ALL,
TPrivilegeLevel.SELECT)));
-
- for (AuthzTest authzTest: new AuthzTest[]{
- // Select with cross join.
- authorize("select * from functional.alltypes union all " +
- "select * from functional.alltypessmall"),
- // Union on tables.
- authorize("select * from functional.alltypes a cross join " +
- "functional.alltypessmall b")}) {
- authzTest.ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.SELECT))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.SELECT))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.ALL),
- onTable("functional", "alltypessmall", TPrivilegeLevel.ALL))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.SELECT),
- onTable("functional", "alltypessmall", TPrivilegeLevel.ALL))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.ALL),
- onTable("functional", "alltypessmall", TPrivilegeLevel.SELECT))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.SELECT),
- onTable("functional", "alltypessmall", TPrivilegeLevel.SELECT))
- .ok(onColumn("functional", "alltypes", ALLTYPES_COLUMNS,
- TPrivilegeLevel.SELECT), onColumn("functional", "alltypessmall",
- ALLTYPES_COLUMNS, TPrivilegeLevel.SELECT))
- .error(selectError("functional.alltypes"))
- .error(selectError("functional.alltypes"), onServer(
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypes"), onDatabase("functional",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypes"), onTable("functional",
"alltypes",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)),
- onTable("functional", "alltypessmall",
allExcept(TPrivilegeLevel.ALL,
- TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypessmall"),
onColumn("functional",
- "alltypes", ALLTYPES_COLUMNS, TPrivilegeLevel.SELECT))
- .error(selectError("functional.alltypes"), onColumn("functional",
- "alltypessmall", ALLTYPES_COLUMNS, TPrivilegeLevel.SELECT));
- }
-
- // Union on views.
- // Column-level privileges on views are not currently supported.
- authorize("select id from functional.alltypes_view union all " +
- "select x from functional.alltypes_view_sub")
- .ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.SELECT))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.SELECT))
- .ok(onTable("functional", "alltypes_view", TPrivilegeLevel.ALL),
- onTable("functional", "alltypes_view_sub", TPrivilegeLevel.ALL))
- .ok(onTable("functional", "alltypes_view", TPrivilegeLevel.SELECT),
- onTable("functional", "alltypes_view_sub", TPrivilegeLevel.SELECT))
- .error(selectError("functional.alltypes_view"))
- .error(selectError("functional.alltypes_view"), onServer(allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypes_view"),
onDatabase("functional",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypes_view"), onTable("functional",
- "alltypes_view", allExcept(TPrivilegeLevel.ALL,
TPrivilegeLevel.SELECT)),
- onTable("functional", "alltypes_view_sub", TPrivilegeLevel.SELECT))
- .error(selectError("functional.alltypes_view_sub"),
onTable("functional",
- "alltypes_view_sub", allExcept(TPrivilegeLevel.ALL,
TPrivilegeLevel.SELECT)),
- onTable("functional", "alltypes_view", TPrivilegeLevel.SELECT));
-
- // Union from non-existent databases.
- authorize("select id from nodb.alltypes union all " +
- "select id from
functional.alltypesagg").error(selectError("nodb.alltypes"));
-
- // Union from non-existent tables.
- authorize("select id from functional.notbl union all " +
- "select id from
functional.alltypesagg").error(selectError("functional.notbl"));
- }
-
- @Test
- public void testInsert() throws ImpalaException {
- // Basic insert into a table.
- authorize("insert into functional.zipcode_incomes(id) values('123')")
- .ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.INSERT))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.INSERT))
- .ok(onTable("functional", "zipcode_incomes", TPrivilegeLevel.ALL))
- .ok(onTable("functional", "zipcode_incomes", TPrivilegeLevel.INSERT))
- .error(insertError("functional.zipcode_incomes"))
- .error(insertError("functional.zipcode_incomes"), onServer(allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.INSERT)))
- .error(insertError("functional.zipcode_incomes"),
onDatabase("functional",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.INSERT)))
- .error(insertError("functional.zipcode_incomes"), onTable("functional",
- "zipcode_incomes", allExcept(TPrivilegeLevel.ALL,
TPrivilegeLevel.INSERT)));
-
- for (AuthzTest test: new AuthzTest[]{
- // With clause with insert.
- authorize("with t as (select * from functional.alltypestiny) " +
- "insert into functional.alltypes partition(month, year) " +
- "select * from t"),
- // Insert with select on a target table.
- authorize("insert into functional.alltypes partition(month, year) " +
- "select * from functional.alltypestiny where id < 100")}) {
- test.ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.INSERT, TPrivilegeLevel.SELECT))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.INSERT,
TPrivilegeLevel.SELECT))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.ALL),
- onTable("functional", "alltypestiny", TPrivilegeLevel.ALL))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.INSERT),
- onTable("functional", "alltypestiny", TPrivilegeLevel.SELECT))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.INSERT),
- onColumn("functional", "alltypestiny", ALLTYPES_COLUMNS,
- TPrivilegeLevel.SELECT))
- .error(selectError("functional.alltypestiny"))
- .error(selectError("functional.alltypestiny"), onServer(allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.INSERT,
TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypestiny"),
onDatabase("functional",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.INSERT,
- TPrivilegeLevel.SELECT)))
- .error(insertError("functional.alltypes"), onTable("functional",
- "alltypestiny", TPrivilegeLevel.SELECT), onTable("functional",
- "alltypes", allExcept(TPrivilegeLevel.ALL,
TPrivilegeLevel.INSERT)))
- .error(selectError("functional.alltypestiny"), onTable("functional",
- "alltypestiny", allExcept(TPrivilegeLevel.ALL,
TPrivilegeLevel.SELECT)),
- onTable("functional", "alltypes", TPrivilegeLevel.INSERT));
- }
-
- // Insert with select on a target view.
- // Column-level privileges on views are not currently supported.
- authorize("insert into functional.alltypes partition(month, year) " +
- "select * from functional.alltypes_view where id < 100")
- .ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.INSERT, TPrivilegeLevel.SELECT))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.INSERT,
TPrivilegeLevel.SELECT))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.ALL),
- onTable("functional", "alltypes_view", TPrivilegeLevel.ALL))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.INSERT),
- onTable("functional", "alltypes_view", TPrivilegeLevel.SELECT))
- .error(selectError("functional.alltypes_view"))
- .error(selectError("functional.alltypes_view"), onServer(allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.INSERT,
TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypes_view"),
onDatabase("functional",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.INSERT,
- TPrivilegeLevel.SELECT)))
- .error(insertError("functional.alltypes"), onTable("functional",
- "alltypes_view", TPrivilegeLevel.SELECT), onTable("functional",
- "alltypes", allExcept(TPrivilegeLevel.ALL,
TPrivilegeLevel.INSERT)))
- .error(selectError("functional.alltypes_view"), onTable("functional",
- "alltypes_view", allExcept(TPrivilegeLevel.ALL,
TPrivilegeLevel.SELECT)),
- onTable("functional", "alltypes", TPrivilegeLevel.INSERT));
-
- // Insert with inline view.
- authorize("insert into functional.alltypes partition(month, year) " +
- "select b.* from functional.alltypesagg a join (select * from " +
- "functional.alltypestiny) b on (a.int_col = b.int_col)")
- .ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.INSERT, TPrivilegeLevel.SELECT))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.INSERT,
TPrivilegeLevel.SELECT))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.ALL),
- onTable("functional", "alltypesagg", TPrivilegeLevel.ALL),
- onTable("functional", "alltypestiny", TPrivilegeLevel.ALL))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.INSERT),
- onTable("functional", "alltypesagg", TPrivilegeLevel.SELECT),
- onTable("functional", "alltypestiny", TPrivilegeLevel.SELECT))
- .error(selectError("functional.alltypesagg"))
- .error(selectError("functional.alltypesagg"), onServer(allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.INSERT,
TPrivilegeLevel.SELECT)))
- .error(selectError("functional.alltypesagg"), onDatabase("functional",
allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.INSERT,
TPrivilegeLevel.SELECT)))
- .error(insertError("functional.alltypes"), onTable("functional",
- "alltypesagg", TPrivilegeLevel.SELECT), onTable("functional",
- "alltypestiny", TPrivilegeLevel.SELECT), onTable("functional",
- "alltypes", allExcept(TPrivilegeLevel.ALL,
TPrivilegeLevel.INSERT)))
- .error(selectError("functional.alltypesagg"), onTable("functional",
- "alltypesagg", allExcept(TPrivilegeLevel.ALL,
TPrivilegeLevel.SELECT)),
- onTable("functional", "alltypestiny", TPrivilegeLevel.SELECT),
- onTable("functional", "alltypes", TPrivilegeLevel.INSERT))
- .error(selectError("functional.alltypestiny"), onTable("functional",
- "alltypesagg", TPrivilegeLevel.SELECT), onTable("functional",
- "alltypestiny", allExcept(TPrivilegeLevel.ALL,
TPrivilegeLevel.SELECT)),
- onTable("functional", "alltypes", TPrivilegeLevel.INSERT));
-
- // Inserting into a view is not allowed.
- authorize("insert into functional.alltypes_view(id) values(123)")
- .error(insertError("functional.alltypes_view"));
-
- // Inserting into a non-existent database.
- authorize("insert into nodb.alltypes(id) values(1)")
- .error(insertError("nodb.alltypes"));
-
- // Inserting into a non-existent table.
- authorize("insert into functional.notbl(id) values(1)")
- .error(insertError("functional.notbl"));
- }
-
- @Test
- public void testUseDb() throws ImpalaException {
- AuthzTest test = authorize("use functional");
- for (TPrivilegeLevel privilege: TPrivilegeLevel.values()) {
- test.ok(onServer(privilege))
- .ok(onDatabase("functional", privilege))
- .ok(onTable("functional", "alltypes", privilege))
- .ok(onColumn("functional", "alltypes", "id", privilege));
- }
- test.error(accessError("functional.*.*"));
-
- // Accessing default database should always be allowed.
- authorize("use default").ok();
-
- // Accessing system database should always be allowed.
- authorize("use _impala_builtins").ok();
-
- // Use a non-existent database.
- authorize("use nodb").error(accessError("nodb.*.*"));
- }
-
- @Test
- public void testTruncate() throws ImpalaException {
- // Truncate a table.
- authorize("truncate table functional.alltypes")
- .ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.INSERT))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.INSERT))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.ALL))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.INSERT))
- .error(insertError("functional.alltypes"))
- .error(insertError("functional.alltypes"), onServer(allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.INSERT)))
- .error(insertError("functional.alltypes"), onDatabase("functional",
allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.INSERT)))
- .error(insertError("functional.alltypes"), onTable("functional",
"alltypes",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.INSERT)));
-
- // Truncate a non-existent database.
- authorize("truncate table nodb.alltypes")
- .error(insertError("nodb.alltypes"));
-
- // Truncate a non-existent table.
- authorize("truncate table functional.notbl")
- .error(insertError("functional.notbl"));
-
- // Truncating a view is not supported.
- authorize("truncate table functional.alltypes_view")
- .error(insertError("functional.alltypes_view"));
- }
-
- @Test
- public void testLoad() throws ImpalaException {
- // Load into a table.
- authorize("load data inpath
'hdfs://localhost:20500/test-warehouse/tpch.lineitem' " +
- "into table functional.alltypes partition(month=10, year=2009)")
- .ok(onServer(TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL),
- onUri("hdfs://localhost:20500/test-warehouse/tpch.lineitem",
- TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.INSERT),
- onUri("hdfs://localhost:20500/test-warehouse/tpch.lineitem",
- TPrivilegeLevel.ALL))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.ALL),
- onUri("hdfs://localhost:20500/test-warehouse/tpch.lineitem",
- TPrivilegeLevel.ALL))
- .ok(onTable("functional", "alltypes", TPrivilegeLevel.INSERT),
- onUri("hdfs://localhost:20500/test-warehouse/tpch.lineitem",
- TPrivilegeLevel.ALL))
- .error(insertError("functional.alltypes"))
-
.error(accessError("hdfs://localhost:20500/test-warehouse/tpch.lineitem"),
- onDatabase("functional", TPrivilegeLevel.INSERT))
-
.error(accessError("hdfs://localhost:20500/test-warehouse/tpch.lineitem"),
- onTable("functional", "alltypes", TPrivilegeLevel.INSERT))
- .error(insertError("functional.alltypes"),
- onUri("hdfs://localhost:20500/test-warehouse/tpch.lineitem",
- TPrivilegeLevel.ALL));
-
- // Load from non-existent URI.
- authorize("load data inpath 'hdfs://localhost:20500/test-warehouse/nouri'
" +
- "into table functional.alltypes partition(month=10, year=2009)")
- .error(insertError("functional.alltypes"))
- .error(accessError("hdfs://localhost:20500/test-warehouse/nouri"),
- onDatabase("functional", TPrivilegeLevel.INSERT))
- .error(accessError("hdfs://localhost:20500/test-warehouse/nouri"),
- onTable("functional", "alltypes", TPrivilegeLevel.INSERT));
-
- // Load into non-existent database.
- authorize("load data inpath
'hdfs://localhost:20500/test-warehouse/tpch.lineitem' " +
- "into table nodb.alltypes partition(month=10, year=2009)")
- .error(insertError("nodb.alltypes"))
- .error(insertError("nodb.alltypes"), onUri(
- "hdfs://localhost:20500/test-warehouse/tpch.nouri",
TPrivilegeLevel.ALL));
-
- // Load into non-existent table.
- authorize("load data inpath
'hdfs://localhost:20500/test-warehouse/tpch.lineitem' " +
- "into table functional.notbl partition(month=10, year=2009)")
- .error(insertError("functional.notbl"))
- .error(insertError("functional.notbl"), onUri(
- "hdfs://localhost:20500/test-warehouse/tpch.nouri",
TPrivilegeLevel.ALL));
-
- // Load into a view is not supported.
- authorize("load data inpath
'hdfs://localhost:20500/test-warehouse/tpch.lineitem' " +
- "into table functional.alltypes_view")
- .error(insertError("functional.alltypes_view"));
- }
-
- @Test
- public void testResetMetadata() throws ImpalaException {
- // Invalidate metadata on server.
- authorize("invalidate metadata")
- .ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.REFRESH))
- .error(refreshError("server"));
-
- // Invalidate metadata/refresh on a table / view
- for(String name: new String[] {"alltypes", "alltypes_view"}) {
- for (AuthzTest test: new AuthzTest[]{
- authorize("invalidate metadata functional." + name),
- authorize("refresh functional." + name)}) {
- test.ok(onServer(TPrivilegeLevel.ALL))
- .ok(onServer(TPrivilegeLevel.REFRESH))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.REFRESH))
- .ok(onTable("functional", name, TPrivilegeLevel.ALL))
- .ok(onTable("functional", name, TPrivilegeLevel.REFRESH))
- .error(refreshError("functional." + name))
- .error(refreshError("functional." + name),
onDatabase("functional", allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.REFRESH)))
- .error(refreshError("functional." + name), onTable("functional",
name,
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.REFRESH)));
- }
- }
-
- authorize("refresh functions functional")
- .ok(onServer(TPrivilegeLevel.REFRESH))
- .ok(onDatabase("functional", TPrivilegeLevel.ALL))
- .ok(onDatabase("functional", TPrivilegeLevel.REFRESH))
- .error(refreshError("functional"))
- .error(refreshError("functional"),
onServer(allExcept(TPrivilegeLevel.ALL,
- TPrivilegeLevel.REFRESH)))
- .error(refreshError("functional"), onDatabase("functional", allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.REFRESH)));
-
- // Reset metadata in non-existent database.
- authorize("invalidate metadata nodb").error(refreshError("default.nodb"));
- authorize("refresh nodb").error(refreshError("default.nodb"));
- authorize("refresh functions nodb").error(refreshError("nodb"));
- }
-
- @Test
- public void testShow() throws ImpalaException {
- // Show databases should always be allowed.
- authorize("show databases").ok();
-
- // Show tables.
- AuthzTest test = authorize("show tables in functional");
- for (TPrivilegeLevel privilege: TPrivilegeLevel.values()) {
- test.ok(onServer(privilege))
- .ok(onDatabase("functional", privilege))
- .ok(onTable("functional", "alltypes", privilege));
- }
- test.error(accessError("functional.*.*"));
-
- // Show functions.
- test = authorize("show functions in functional");
- for (TPrivilegeLevel privilege: viewMetadataPrivileges()) {
- test.ok(onServer(privilege))
- .ok(onDatabase("functional", privilege));
- }
- test.error(accessError("functional"));
-
- // Show tables in system database should always be allowed.
- authorize("show tables in _impala_builtins").ok();
-
- // Show tables for non-existent database.
- authorize("show tables in nodb").error(accessError("nodb"));
-
- // Show partitions, table stats, and column stats
- for (AuthzTest authzTest: new AuthzTest[]{
- authorize("show partitions functional.alltypes"),
- authorize("show table stats functional.alltypes"),
- authorize("show column stats functional.alltypes")}) {
- for (TPrivilegeLevel privilege: viewMetadataPrivileges()) {
- authzTest.ok(onServer(privilege))
- .ok(onDatabase("functional", privilege))
- .ok(onTable("functional", "alltypes", privilege))
- .error(accessError("functional.alltypes"), onColumn("functional",
"alltypes",
- "id", TPrivilegeLevel.SELECT));
- }
- authzTest.error(accessError("functional"));
- }
-
- // Show range partitions.dimtbl
- for (TPrivilegeLevel privilege: viewMetadataPrivileges()) {
- authorize("show range partitions functional_kudu.dimtbl")
- .ok(onServer(privilege))
- .ok(onDatabase("functional_kudu", privilege))
- .ok(onTable("functional_kudu", "dimtbl", privilege))
- .error(accessError("functional_kudu.dimtbl"),
onColumn("functional_kudu",
- "dimtbl", "id", TPrivilegeLevel.SELECT))
- .error(accessError("functional_kudu"));
- }
-
- // Show files.
- for (AuthzTest authzTest: new AuthzTest[]{
- authorize("show files in functional.alltypes"),
- authorize("show files in functional.alltypes partition(month=10,
year=2010)")}) {
- for (TPrivilegeLevel privilege: viewMetadataPrivileges()) {
- authzTest.ok(onServer(privilege))
- .ok(onDatabase("functional", privilege))
- .ok(onTable("functional", "alltypes", privilege));
- }
- authzTest.error(accessError("functional"));
- }
-
- // Show current roles should always be allowed.
- authorize("show current roles").ok();
-
- // Show roles should always be allowed.
- authorize("show roles").ok();
-
- // Show role grant group should always be allowed.
- authorize(String.format("show role grant group %s", USER.getName())).ok();
-
- // Show grant role should always be allowed.
- authorize(String.format("show grant role authz_test_role")).ok();
-
- // Show create table.
- test = authorize("show create table functional.alltypes");
- for (TPrivilegeLevel privilege: viewMetadataPrivileges()) {
- test.ok(onServer(privilege))
- .ok(onDatabase("functional", privilege))
- .ok(onTable("functional", "alltypes", privilege));
- }
- test.error(accessError("functional"));
- // Show create table on non-existent database.
- authorize("show create table
nodb.alltypes").error(accessError("nodb.alltypes"));
- // Show create table on non-existent table.
- authorize("show create table functional.notbl")
- .error(accessError("functional.notbl"));
-
- // Show create view.
- test = authorize("show create view functional.alltypes_view");
- for (TPrivilegeLevel privilege: viewMetadataPrivileges()) {
- test.ok(onServer(privilege, TPrivilegeLevel.SELECT))
- .ok(onDatabase("functional", privilege, TPrivilegeLevel.SELECT))
- .ok(onTable("functional", "alltypes_view", privilege),
- onTable("functional", "alltypes", TPrivilegeLevel.SELECT));
- }
- test.error(accessError("functional"));
- // Show create view on non-existent database.
- authorize("show create view
nodb.alltypes").error(accessError("nodb.alltypes"));
- // Show create view on non-existent table.
- authorize("show create view
functional.notbl").error(accessError("functional.notbl"));
-
- // Show create function.
- ScalarFunction fn = addFunction("functional", "f");
- try {
- test = authorize("show create function functional.f");
- for (TPrivilegeLevel privilege: viewMetadataPrivileges()) {
- test.ok(onServer(privilege))
- .ok(onDatabase("functional", privilege));
- }
- test.error(accessError("functional"));
- // Show create function on non-existent database.
- authorize("show create function nodb.f").error(accessError("nodb"));
- // Show create function on non-existent function.
- authorize("show create function
functional.nofn").error(accessError("functional"));
- } finally {
- removeFunction(fn);
- }
- // Show create function in system database should always be allowed.
- authorize("show create function _impala_builtins.pi").ok();
-
- // Show data sources should always be allowed.
- authorize("show data sources").ok();
- }
-
- @Test
- /**
- * Test describe output of Databases and tables.
- * From https://issues.apache.org/jira/browse/IMPALA-6479
- * Column level select privileges should limit output.
- */
- public void testDescribe() throws ImpalaException {
- // Describe database.
- AuthzTest authzTest = authorize("describe database functional");
- for (TPrivilegeLevel privilege: viewMetadataPrivileges()) {
- authzTest.ok(onServer(privilege))
- .ok(onDatabase("functional", privilege));
- }
- authzTest.error(accessError("functional"))
- .error(accessError("functional"),
onServer(allExcept(viewMetadataPrivileges())))
- .error(accessError("functional"), onDatabase("functional",
- allExcept(viewMetadataPrivileges())));
-
- // Describe on non-existent database.
- authorize("describe database nodb").error(accessError("nodb"));
-
- // Describe table.
- TTableName tableName = new TTableName("functional", "alltypes");
- TDescribeOutputStyle style = TDescribeOutputStyle.MINIMAL;
- authzTest = authorize("describe functional.alltypes");
- for (TPrivilegeLevel privilege: new TPrivilegeLevel[]{
- TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT}) {
- authzTest.okDescribe(tableName, style, ALLTYPES_COLUMNS, null,
onServer(privilege))
- .okDescribe(tableName, style, ALLTYPES_COLUMNS, null,
onDatabase("functional",
- privilege))
- .okDescribe(tableName, style, ALLTYPES_COLUMNS, null,
onTable("functional",
- "alltypes", privilege));
- }
- authzTest.okDescribe(tableName, style, null, ALLTYPES_COLUMNS,
onServer(allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .okDescribe(tableName, style, null, ALLTYPES_COLUMNS,
onDatabase("functional",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .okDescribe(tableName, style, null, ALLTYPES_COLUMNS,
onTable("functional",
- "alltypes", allExcept(TPrivilegeLevel.ALL,
TPrivilegeLevel.SELECT)))
- // In this test, since we only have column level privileges on "id",
then
- // only the "id" column should show and the others should not.
- .okDescribe(tableName, style, new String[]{"id"},
ALLTYPES_COLUMNS_WITHOUT_ID,
- onColumn("functional", "alltypes", "id", TPrivilegeLevel.SELECT))
- .error(accessError("functional.alltypes"));
-
- // Describe table extended.
- tableName = new TTableName("functional", "alltypes");
- style = TDescribeOutputStyle.EXTENDED;
- String[] locationString = new String[]{"Location:"};
- String[] checkStrings = (String[]) ArrayUtils.addAll(ALLTYPES_COLUMNS,
- locationString);
- authzTest = authorize("describe functional.alltypes");
- for (TPrivilegeLevel privilege: new TPrivilegeLevel[]{
- TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT}) {
- authzTest.okDescribe(tableName, style, checkStrings, null,
onServer(privilege))
- .okDescribe(tableName, style, checkStrings, null,
onDatabase("functional",
- privilege))
- .okDescribe(tableName, style, checkStrings, null,
onTable("functional",
- "alltypes", privilege));
- }
- authzTest.okDescribe(tableName, style, locationString, ALLTYPES_COLUMNS,
- onServer(allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .okDescribe(tableName, style, locationString, ALLTYPES_COLUMNS,
- onDatabase("functional", allExcept(TPrivilegeLevel.ALL,
- TPrivilegeLevel.SELECT)))
- .okDescribe(tableName, style, locationString, ALLTYPES_COLUMNS,
- onTable("functional", "alltypes", allExcept(TPrivilegeLevel.ALL,
- TPrivilegeLevel.SELECT)))
- // Location should not appear with only column level auth.
- .okDescribe(tableName, style, new String[]{"id"},
- (String[]) ArrayUtils.addAll(ALLTYPES_COLUMNS_WITHOUT_ID,
- new String[]{"Location:"}), onColumn("functional", "alltypes",
"id",
- TPrivilegeLevel.SELECT))
- .error(accessError("functional.alltypes"));
-
- // Describe view.
- tableName = new TTableName("functional", "alltypes_view");
- style = TDescribeOutputStyle.MINIMAL;
- authzTest = authorize("describe functional.alltypes_view");
- for (TPrivilegeLevel privilege: new TPrivilegeLevel[]{
- TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT}) {
- authzTest.okDescribe(tableName, style, ALLTYPES_COLUMNS, null,
onServer(privilege))
- .okDescribe(tableName, style, ALLTYPES_COLUMNS, null,
onDatabase("functional",
- privilege))
- .okDescribe(tableName, style, ALLTYPES_COLUMNS, null,
onTable("functional",
- "alltypes_view", privilege));
- }
- authzTest.okDescribe(tableName, style, null, ALLTYPES_COLUMNS,
onServer(allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .okDescribe(tableName, style, null, ALLTYPES_COLUMNS,
onDatabase("functional",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .okDescribe(tableName, style, null, ALLTYPES_COLUMNS,
onTable("functional",
- "alltypes_view", TPrivilegeLevel.INSERT))
- .error(accessError("functional.alltypes_view"));
-
- // Describe view extended.
- tableName = new TTableName("functional", "alltypes_view");
- style = TDescribeOutputStyle.EXTENDED;
- // Views have extra output to explicitly check
- String[] viewStrings = new String[]{"View Original Text:", "View Expanded
Text:"};
- checkStrings = (String[]) ArrayUtils.addAll(ALLTYPES_COLUMNS, viewStrings);
- authzTest = authorize("describe functional.alltypes_view");
- for (TPrivilegeLevel privilege: new TPrivilegeLevel[]{
- TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT}) {
- authzTest.okDescribe(tableName, style, checkStrings, null,
onServer(privilege))
- .okDescribe(tableName, style, checkStrings, null,
onDatabase("functional",
- privilege))
- .okDescribe(tableName, style, checkStrings, null,
onTable("functional",
- "alltypes_view", privilege));
- }
- authzTest.okDescribe(tableName, style, null, ALLTYPES_COLUMNS,
onServer(allExcept(
- TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .okDescribe(tableName, style, null, ALLTYPES_COLUMNS,
onDatabase("functional",
- allExcept(TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT)))
- .okDescribe(tableName, style, viewStrings, ALLTYPES_COLUMNS,
onTable("functional",
- "alltypes_view", TPrivilegeLevel.INSERT))
- .error(accessError("functional.alltypes_view"));
-
- // Describe specific column on a table.
- authzTest = authorize("describe
functional.allcomplextypes.int_struct_col");
- for (TPrivilegeLevel privilege: TPrivilegeLevel.values()) {
- authzTest.ok(onServer(privilege))
- .ok(onDatabase("functional", privilege))
- .ok(onTable("functional", "allcomplextypes", privilege));
- }
- authzTest.ok(onColumn("functional", "allcomplextypes", "int_struct_col",
- TPrivilegeLevel.SELECT))
- .error(accessError("functional.allcomplextypes"));
-
- for (AuthzTest test: new AuthzTest[]{
- // User has access to a different column.
- authorize("describe functional.allcomplextypes.int_struct_col"),
- // Insufficient privileges on complex type column, accessing member
- authorize("describe functional.allcomplextypes.complex_struct_col.f2"),
- // Insufficient privileges on non-complex type column, accessing member
- authorize("describe
functional.allcomplextypes.nested_struct_col.f1")}) {
- test.error(accessError("functional.allcomplextypes"),
onColumn("functional",
- "allcomplextypes", "id", TPrivilegeLevel.SELECT));
- }
- }
-
- // Convert TDescribeResult to list of strings.
- private static List<String> resultToStringList(TDescribeResult result) {
- List<String> list = new ArrayList<>();
- for (TResultRow row: result.getResults()) {
- for (TColumnValue col: row.getColVals()) {
- list.add(col.getString_val() == null ? "NULL":
col.getString_val().trim());
- }
- }
- return list;
- }
-
- private static String selectError(String object) {
- return "User '%s' does not have privileges to execute 'SELECT' on: " +
object;
- }
-
- private static String insertError(String object) {
- return "User '%s' does not have privileges to execute 'INSERT' on: " +
object;
- }
-
- private static String accessError(String object) {
- return "User '%s' does not have privileges to access: " + object;
- }
-
- private static String refreshError(String object) {
- return "User '%s' does not have privileges to execute " +
- "'INVALIDATE METADATA/REFRESH' on: " + object;
- }
-
- private ScalarFunction addFunction(String db, String fnName) {
- ScalarFunction fn = ScalarFunction.createForTesting(db, fnName,
- new ArrayList<Type>(), Type.INT, "/dummy", "dummy.class", null,
- null, TFunctionBinaryType.NATIVE);
- authzCatalog_.addFunction(fn);
- return fn;
- }
-
- private void removeFunction(ScalarFunction fn) {
- authzCatalog_.removeFunction(fn);
- }
-
- private TPrivilegeLevel[] viewMetadataPrivileges() {
- return new TPrivilegeLevel[]{TPrivilegeLevel.ALL, TPrivilegeLevel.SELECT,
- TPrivilegeLevel.INSERT, TPrivilegeLevel.REFRESH};
- }
-
- private static TPrivilegeLevel[] allExcept(TPrivilegeLevel...
excludedPrivLevels) {
- HashSet<TPrivilegeLevel> excludedSet = Sets.newHashSet(excludedPrivLevels);
- List<TPrivilegeLevel> privLevels = new ArrayList<>();
- for (TPrivilegeLevel level: TPrivilegeLevel.values()) {
- if (!excludedSet.contains(level)) {
- privLevels.add(level);
- }
- }
- return privLevels.toArray(new TPrivilegeLevel[0]);
- }
-
- private class AuthzTest {
- private final AnalysisContext context_;
- private final String stmt_;
- private final String role_ = "authz_test_role";
-
- public AuthzTest(String stmt) {
- this(null, stmt);
- }
-
- public AuthzTest(AnalysisContext context, String stmt) {
- Preconditions.checkNotNull(stmt);
- context_ = context;
- stmt_ = stmt;
- }
-
- private void createRole(TPrivilege[]... privileges) throws ImpalaException
{
- Role role = authzCatalog_.addRole(role_);
- authzCatalog_.addRoleGrantGroup(role_, USER.getName());
- for (TPrivilege[] privs: privileges) {
- for (TPrivilege privilege: privs) {
- privilege.setRole_id(role.getId());
- authzCatalog_.addRolePrivilege(role_, privilege);
- }
- }
- }
-
- private void dropRole() throws ImpalaException {
- authzCatalog_.removeRole(role_);
- }
-
- /**
- * This method runs with the specified privileges.
- *
- * A new temporary role will be created and assigned to the specified
privileges
- * into the new role. The new role will be dropped once this method
finishes.
- */
- public AuthzTest ok(TPrivilege[]... privileges) throws ImpalaException {
- try {
- createRole(privileges);
- if (context_ != null) {
- authzOk(context_, stmt_);
- } else {
- authzOk(stmt_);
- }
- } catch (AuthorizationException ae) {
- // Because the same test can be called from multiple statements
- // it is useful to know which statement caused the exception.
- throw new AuthorizationException(stmt_ + ": " + ae.getMessage(), ae);
- } finally {
- dropRole();
- }
- return this;
- }
-
- /**
- * This method runs with the specified privileges and checks describe
output.
- *
- * A new temporary role will be created and assigned to the specified
privileges
- * into the new role. The new role will be dropped once this method
finishes.
- */
- public AuthzTest okDescribe(TTableName table, TDescribeOutputStyle style,
- String[] requiredStrings, String[] excludedStrings, TPrivilege[]...
privileges)
- throws ImpalaException {
- try {
- createRole(privileges);
- if (context_ != null) {
- authzOk(context_, stmt_);
- } else {
- authzOk(stmt_);
- }
- List<String> result =
resultToStringList(authzFrontend_.describeTable(table,
- style, USER));
- if (requiredStrings != null) {
- for (String str: requiredStrings) {
- assertTrue(String.format("\"%s\" is not in the describe output.\n"
+
- "Expected : %s\n" +
- "Actual : %s", str, Arrays.toString(requiredStrings),
result),
- result.contains(str));
- }
- }
- if (excludedStrings != null) {
- for (String str: excludedStrings) {
- assertTrue(String.format("\"%s\" should not be in the describe
output.", str),
- !result.contains(str));
- }
- }
- } finally {
- dropRole();
- }
- return this;
- }
-
- /**
- * This method runs with the specified privileges.
- *
- * A new temporary role will be created and assigned to the specified
privileges
- * into the new role. The new role will be dropped once this method
finishes.
- */
- public AuthzTest error(String expectedError, TPrivilege[]... privileges)
- throws ImpalaException {
- try {
- createRole(privileges);
- if (context_ != null) {
- authzError(context_, stmt_, expectedError);
- } else {
- authzError(stmt_, expectedError);
- }
- } finally {
- dropRole();
- }
- return this;
- }
- }
-
- private AuthzTest authorize(String stmt) {
- return new AuthzTest(stmt);
- }
-
- private AuthzTest authorize(AnalysisContext ctx, String stmt) {
- return new AuthzTest(ctx, stmt);
- }
-
- private TPrivilege[] onServer(TPrivilegeLevel... levels) {
- TPrivilege[] privileges = new TPrivilege[levels.length];
- for (int i = 0; i < levels.length; i++) {
- privileges[i] = new TPrivilege("", levels[i], TPrivilegeScope.SERVER,
false);
- privileges[i].setServer_name(SENTRY_SERVER);
- privileges[i].setPrivilege_name(RolePrivilege.buildRolePrivilegeName(
- privileges[i]));
- }
- return privileges;
- }
-
- private TPrivilege[] onDatabase(String db, TPrivilegeLevel... levels) {
- TPrivilege[] privileges = new TPrivilege[levels.length];
- for (int i = 0; i < levels.length; i++) {
- privileges[i] = new TPrivilege("", levels[i], TPrivilegeScope.DATABASE,
false);
- privileges[i].setServer_name(SENTRY_SERVER);
- privileges[i].setDb_name(db);
- privileges[i].setPrivilege_name(RolePrivilege.buildRolePrivilegeName(
- privileges[i]));
- }
- return privileges;
- }
-
- private TPrivilege[] onTable(String db, String table, TPrivilegeLevel...
levels) {
- TPrivilege[] privileges = new TPrivilege[levels.length];
- for (int i = 0; i < levels.length; i++) {
- privileges[i] = new TPrivilege("", levels[i], TPrivilegeScope.TABLE,
false);
- privileges[i].setServer_name(SENTRY_SERVER);
- privileges[i].setDb_name(db);
- privileges[i].setTable_name(table);
- privileges[i].setPrivilege_name(RolePrivilege.buildRolePrivilegeName(
- privileges[i]));
- }
- return privileges;
- }
-
- private TPrivilege[] onColumn(String db, String table, String column,
- TPrivilegeLevel... levels) {
- return onColumn(db, table, new String[]{column}, levels);
- }
-
- private TPrivilege[] onColumn(String db, String table, String[] columns,
- TPrivilegeLevel... levels) {
- int size = columns.length * levels.length;
- TPrivilege[] privileges = new TPrivilege[size];
- int idx = 0;
- for (int i = 0; i < levels.length; i++) {
- for (String column: columns) {
- privileges[idx] = new TPrivilege("", levels[i],
TPrivilegeScope.COLUMN, false);
- privileges[idx].setServer_name(SENTRY_SERVER);
- privileges[idx].setDb_name(db);
- privileges[idx].setTable_name(table);
- privileges[idx].setColumn_name(column);
- privileges[idx].setPrivilege_name(RolePrivilege.buildRolePrivilegeName(
- privileges[idx]));
- idx++;
- }
- }
- return privileges;
- }
-
- private TPrivilege[] onUri(String uri, TPrivilegeLevel... levels) {
- TPrivilege[] privileges = new TPrivilege[levels.length];
- for (int i = 0; i < levels.length; i++) {
- privileges[i] = new TPrivilege("", levels[i], TPrivilegeScope.URI,
false);
- privileges[i].setServer_name(SENTRY_SERVER);
- privileges[i].setUri(uri);
- privileges[i].setPrivilege_name(RolePrivilege.buildRolePrivilegeName(
- privileges[i]));
- }
- return privileges;
- }
-
- private void authzOk(String stmt) throws ImpalaException {
- authzOk(analysisContext_, stmt);
- }
-
- private void authzOk(AnalysisContext context, String stmt) throws
ImpalaException {
- authzOk(authzFrontend_, context, stmt);
- }
-
- private void authzOk(Frontend fe, AnalysisContext context, String stmt)
- throws ImpalaException {
- parseAndAnalyze(stmt, context, fe);
- }
-
- /**
- * Verifies that a given statement fails authorization and the expected error
- * string matches.
- */
- private void authzError(String stmt, String expectedError, Matcher matcher)
- throws ImpalaException {
- authzError(analysisContext_, stmt, expectedError, matcher);
- }
-
- private void authzError(String stmt, String expectedError)
- throws ImpalaException {
- authzError(analysisContext_, stmt, expectedError, startsWith());
- }
-
- private void authzError(AnalysisContext ctx, String stmt, String
expectedError,
- Matcher matcher) throws ImpalaException {
- authzError(authzFrontend_, ctx, stmt, expectedError, matcher);
- }
-
- private void authzError(AnalysisContext ctx, String stmt, String
expectedError)
- throws ImpalaException {
- authzError(authzFrontend_, ctx, stmt, expectedError, startsWith());
- }
-
- private interface Matcher {
- boolean match(String actual, String expected);
- }
-
- private static Matcher exact() {
- return new Matcher() {
- @Override
- public boolean match(String actual, String expected) {
- return actual.equals(expected);
- }
- };
- }
-
- private static Matcher startsWith() {
- return new Matcher() {
- @Override
- public boolean match(String actual, String expected) {
- return actual.startsWith(expected);
- }
- };
- }
-
- private void authzError(Frontend fe, AnalysisContext ctx,
- String stmt, String expectedErrorString, Matcher matcher)
- throws ImpalaException {
- Preconditions.checkNotNull(expectedErrorString);
- try {
- parseAndAnalyze(stmt, ctx, fe);
- } catch (AuthorizationException e) {
- // Insert the username into the error.
- expectedErrorString = String.format(expectedErrorString, ctx.getUser());
- String errorString = e.getMessage();
- assertTrue(
- "got error:\n" + errorString + "\nexpected:\n" + expectedErrorString,
- matcher.match(errorString, expectedErrorString));
- return;
- }
- fail("Stmt didn't result in authorization error: " + stmt);
- }
-
- private void verifyPrivilegeReqs(String stmt, Set<String>
expectedPrivilegeNames)
- throws ImpalaException {
- verifyPrivilegeReqs(createAnalysisCtx(), stmt, expectedPrivilegeNames);
- }
-
- private void verifyPrivilegeReqs(AnalysisContext ctx, String stmt,
- Set<String> expectedPrivilegeNames) throws ImpalaException {
- AnalysisResult analysisResult = parseAndAnalyze(stmt, ctx, frontend_);
- Set<String> actualPrivilegeNames = Sets.newHashSet();
- for (PrivilegeRequest privReq:
analysisResult.getAnalyzer().getPrivilegeReqs()) {
- actualPrivilegeNames.add(privReq.getName());
- }
- assertEquals(expectedPrivilegeNames, actualPrivilegeNames);
- }
-}