http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/policy/solr/TestSolrPolicyEngineDFS.java ---------------------------------------------------------------------- diff --git a/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/policy/solr/TestSolrPolicyEngineDFS.java b/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/policy/solr/TestSolrPolicyEngineDFS.java new file mode 100644 index 0000000..8de54f6 --- /dev/null +++ b/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/policy/solr/TestSolrPolicyEngineDFS.java @@ -0,0 +1,74 @@ +/* + * 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.policy.solr; + +import java.io.File; +import java.io.IOException; + +import org.junit.Assert; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; +import org.apache.hadoop.hdfs.MiniDFSCluster; +import org.apache.sentry.core.common.utils.PolicyFiles; +import org.junit.AfterClass; +import org.junit.BeforeClass; + +public class TestSolrPolicyEngineDFS extends AbstractTestSolrPolicyEngine { + + private static MiniDFSCluster dfsCluster; + private static FileSystem fileSystem; + private static Path root; + private static Path etc; + + @BeforeClass + public static void setupLocalClazz() throws IOException { + File baseDir = getBaseDir(); + Assert.assertNotNull(baseDir); + File dfsDir = new File(baseDir, "dfs"); + Assert.assertTrue(dfsDir.isDirectory() || dfsDir.mkdirs()); + Configuration conf = new Configuration(); + conf.set(MiniDFSCluster.HDFS_MINIDFS_BASEDIR, dfsDir.getPath()); + dfsCluster = new MiniDFSCluster.Builder(conf).numDataNodes(2).build(); + fileSystem = dfsCluster.getFileSystem(); + root = new Path(fileSystem.getUri().toString()); + etc = new Path(root, "/etc"); + fileSystem.mkdirs(etc); + } + + @AfterClass + public static void teardownLocalClazz() { + if(dfsCluster != null) { + dfsCluster.shutdown(); + } + } + + @Override + protected void afterSetup() throws IOException { + fileSystem.delete(etc, true); + fileSystem.mkdirs(etc); + PolicyFiles.copyToDir(fileSystem, etc, "solr-policy-test-authz-provider.ini"); + setPolicy(SolrPolicyTestUtil.createPolicyEngineForTest(new Path(etc, + "solr-policy-test-authz-provider.ini").toString())); + } + + @Override + protected void beforeTeardown() throws IOException { + fileSystem.delete(etc, true); + } +}
http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/policy/solr/TestSolrPolicyEngineLocalFS.java ---------------------------------------------------------------------- diff --git a/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/policy/solr/TestSolrPolicyEngineLocalFS.java b/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/policy/solr/TestSolrPolicyEngineLocalFS.java new file mode 100644 index 0000000..d138053 --- /dev/null +++ b/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/policy/solr/TestSolrPolicyEngineLocalFS.java @@ -0,0 +1,43 @@ +/* + * 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.policy.solr; + +import java.io.File; +import java.io.IOException; + +import org.junit.Assert; + +import org.apache.commons.io.FileUtils; +import org.apache.sentry.core.common.utils.PolicyFiles; + +public class TestSolrPolicyEngineLocalFS extends AbstractTestSolrPolicyEngine { + + @Override + protected void afterSetup() throws IOException { + File baseDir = getBaseDir(); + Assert.assertNotNull(baseDir); + Assert.assertTrue(baseDir.isDirectory() || baseDir.mkdirs()); + PolicyFiles.copyToDir(baseDir, "solr-policy-test-authz-provider.ini"); + setPolicy(SolrPolicyTestUtil.createPolicyEngineForTest(new File(baseDir, "solr-policy-test-authz-provider.ini").getPath())); + } + @Override + protected void beforeTeardown() throws IOException { + File baseDir = getBaseDir(); + Assert.assertNotNull(baseDir); + FileUtils.deleteQuietly(baseDir); + } +} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/policy/solr/TestSolrPolicyNegative.java ---------------------------------------------------------------------- diff --git a/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/policy/solr/TestSolrPolicyNegative.java b/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/policy/solr/TestSolrPolicyNegative.java new file mode 100644 index 0000000..ec72136 --- /dev/null +++ b/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/policy/solr/TestSolrPolicyNegative.java @@ -0,0 +1,101 @@ +/* + * 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.policy.solr; + +import java.io.File; +import java.io.IOException; +import java.util.Collections; + +import org.junit.Assert; + +import org.apache.commons.io.FileUtils; +import org.apache.sentry.core.common.ActiveRoleSet; +import org.apache.sentry.policy.common.PolicyEngine; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.base.Charsets; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; +import com.google.common.io.Files; + +public class TestSolrPolicyNegative { + + @SuppressWarnings("unused") + private static final Logger LOGGER = LoggerFactory + .getLogger(TestSolrPolicyNegative.class); + + private File baseDir; + private File globalPolicyFile; + private File otherPolicyFile; + + @Before + public void setup() { + baseDir = Files.createTempDir(); + globalPolicyFile = new File(baseDir, "global.ini"); + otherPolicyFile = new File(baseDir, "other.ini"); + } + + @After + public void teardown() { + if(baseDir != null) { + FileUtils.deleteQuietly(baseDir); + } + } + + private void append(String from, File to) throws IOException { + Files.append(from + "\n", to, Charsets.UTF_8); + } + + @Test + public void testPerDbFileException() throws Exception { + append("[databases]", globalPolicyFile); + append("other_group_db = " + otherPolicyFile.getPath(), globalPolicyFile); + append("[groups]", otherPolicyFile); + append("other_group = some_role", otherPolicyFile); + append("[roles]", otherPolicyFile); + append("some_role = collection=c1", otherPolicyFile); + PolicyEngine policy = SolrPolicyTestUtil.createPolicyEngineForTest(globalPolicyFile.getPath()); + Assert.assertEquals(Collections.emptySet(), + policy.getPrivileges(Sets.newHashSet("other_group"), ActiveRoleSet.ALL)); + } + + @Test + public void testCollectionRequiredInRole() throws Exception { + append("[groups]", globalPolicyFile); + append("group = some_role", globalPolicyFile); + append("[roles]", globalPolicyFile); + append("some_role = action=query", globalPolicyFile); + PolicyEngine policy = SolrPolicyTestUtil.createPolicyEngineForTest(globalPolicyFile.getPath()); + ImmutableSet<String> permissions = policy.getPrivileges(Sets.newHashSet("group"), ActiveRoleSet.ALL); + Assert.assertTrue(permissions.toString(), permissions.isEmpty()); + } + + @Test + public void testGroupIncorrect() throws Exception { + append("[groups]", globalPolicyFile); + append("group = malicious_role", globalPolicyFile); + append("[roles]", globalPolicyFile); + append("malicious_role = collection=*", globalPolicyFile); + PolicyEngine policy = SolrPolicyTestUtil.createPolicyEngineForTest(globalPolicyFile.getPath()); + ImmutableSet<String> permissions = policy.getPrivileges(Sets.newHashSet("incorrectGroup"), ActiveRoleSet.ALL); + Assert.assertTrue(permissions.toString(), permissions.isEmpty()); + } +} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/privilege/solr/TestCommonPrivilegeForSearch.java ---------------------------------------------------------------------- diff --git a/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/privilege/solr/TestCommonPrivilegeForSearch.java b/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/privilege/solr/TestCommonPrivilegeForSearch.java deleted file mode 100644 index de6d6e0..0000000 --- a/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/privilege/solr/TestCommonPrivilegeForSearch.java +++ /dev/null @@ -1,221 +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.sentry.privilege.solr; - -import org.apache.sentry.core.common.Model; -import org.apache.sentry.core.common.utils.KeyValue; -import org.apache.sentry.core.common.utils.SentryConstants; -import org.apache.sentry.core.model.search.SearchConstants; -import org.apache.sentry.core.model.search.SearchPrivilegeModel; -import org.apache.sentry.policy.common.CommonPrivilege; -import org.apache.sentry.policy.common.Privilege; -import org.junit.Before; -import org.junit.Test; - -import java.util.List; - -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; - -public class TestCommonPrivilegeForSearch { - - private Model searchPrivilegeModel; - - private static final String ALL = SearchConstants.ALL; - - @Before - public void prepareData() { - searchPrivilegeModel = SearchPrivilegeModel.getInstance(); - } - - @Test - public void testSimpleNoAction() throws Exception { - CommonPrivilege collection1 = create(new KeyValue("collection", "coll1")); - CommonPrivilege collection2 = create(new KeyValue("collection", "coll2")); - CommonPrivilege collection1Case = create(new KeyValue("colleCtIon", "coLl1")); - - assertTrue(collection1.implies(collection1, searchPrivilegeModel)); - assertTrue(collection2.implies(collection2, searchPrivilegeModel)); - assertTrue(collection1.implies(collection1Case, searchPrivilegeModel)); - assertTrue(collection1Case.implies(collection1, searchPrivilegeModel)); - - assertFalse(collection1.implies(collection2, searchPrivilegeModel)); - assertFalse(collection1Case.implies(collection2, searchPrivilegeModel)); - assertFalse(collection2.implies(collection1, searchPrivilegeModel)); - assertFalse(collection2.implies(collection1Case, searchPrivilegeModel)); - } - - @Test - public void testSimpleAction() throws Exception { - CommonPrivilege query = - create(new KeyValue("collection", "coll1"), new KeyValue("action", "query")); - CommonPrivilege update = - create(new KeyValue("collection", "coll1"), new KeyValue("action", "update")); - CommonPrivilege queryCase = - create(new KeyValue("colleCtIon", "coLl1"), new KeyValue("AcTiOn", "QuERy")); - - assertTrue(query.implies(query, searchPrivilegeModel)); - assertTrue(update.implies(update, searchPrivilegeModel)); - assertTrue(query.implies(queryCase, searchPrivilegeModel)); - assertTrue(queryCase.implies(query, searchPrivilegeModel)); - - assertFalse(query.implies(update, searchPrivilegeModel)); - assertFalse(queryCase.implies(update, searchPrivilegeModel)); - assertFalse(update.implies(query, searchPrivilegeModel)); - assertFalse(update.implies(queryCase, searchPrivilegeModel)); - } - - @Test - public void testRoleShorterThanRequest() throws Exception { - CommonPrivilege collection1 = create(new KeyValue("collection", "coll1")); - CommonPrivilege query = - create(new KeyValue("collection", "coll1"), new KeyValue("action", "query")); - CommonPrivilege update = - create(new KeyValue("collection", "coll1"), new KeyValue("action", "update")); - CommonPrivilege all = - create(new KeyValue("collection", "coll1"), new KeyValue("action", ALL)); - - assertTrue(collection1.implies(query, searchPrivilegeModel)); - assertTrue(collection1.implies(update, searchPrivilegeModel)); - assertTrue(collection1.implies(all, searchPrivilegeModel)); - - assertFalse(query.implies(collection1, searchPrivilegeModel)); - assertFalse(update.implies(collection1, searchPrivilegeModel)); - assertTrue(all.implies(collection1, searchPrivilegeModel)); - } - - @Test - public void testCollectionAll() throws Exception { - CommonPrivilege collectionAll = create(new KeyValue("collection", ALL)); - CommonPrivilege collection1 = create(new KeyValue("collection", "coll1")); - assertTrue(collectionAll.implies(collection1, searchPrivilegeModel)); - assertTrue(collection1.implies(collectionAll, searchPrivilegeModel)); - - CommonPrivilege allUpdate = - create(new KeyValue("collection", ALL), new KeyValue("action", "update")); - CommonPrivilege allQuery = - create(new KeyValue("collection", ALL), new KeyValue("action", "query")); - CommonPrivilege coll1Update = - create(new KeyValue("collection", "coll1"), new KeyValue("action", "update")); - CommonPrivilege coll1Query = - create(new KeyValue("collection", "coll1"), new KeyValue("action", "query")); - assertTrue(allUpdate.implies(coll1Update, searchPrivilegeModel)); - assertTrue(allQuery.implies(coll1Query, searchPrivilegeModel)); - assertTrue(coll1Update.implies(allUpdate, searchPrivilegeModel)); - assertTrue(coll1Query.implies(allQuery, searchPrivilegeModel)); - assertFalse(allUpdate.implies(coll1Query, searchPrivilegeModel)); - assertFalse(coll1Update.implies(coll1Query, searchPrivilegeModel)); - assertFalse(allQuery.implies(coll1Update, searchPrivilegeModel)); - assertFalse(coll1Query.implies(allUpdate, searchPrivilegeModel)); - assertFalse(allUpdate.implies(allQuery, searchPrivilegeModel)); - assertFalse(allQuery.implies(allUpdate, searchPrivilegeModel)); - assertFalse(coll1Update.implies(coll1Query, searchPrivilegeModel)); - assertFalse(coll1Query.implies(coll1Update, searchPrivilegeModel)); - - // test different length paths - assertTrue(collectionAll.implies(allUpdate, searchPrivilegeModel)); - assertTrue(collectionAll.implies(allQuery, searchPrivilegeModel)); - assertTrue(collectionAll.implies(coll1Update, searchPrivilegeModel)); - assertTrue(collectionAll.implies(coll1Query, searchPrivilegeModel)); - assertFalse(allUpdate.implies(collectionAll, searchPrivilegeModel)); - assertFalse(allQuery.implies(collectionAll, searchPrivilegeModel)); - assertFalse(coll1Update.implies(collectionAll, searchPrivilegeModel)); - assertFalse(coll1Query.implies(collectionAll, searchPrivilegeModel)); - } - - @Test - public void testActionAll() throws Exception { - CommonPrivilege coll1All = - create(new KeyValue("collection", "coll1"), new KeyValue("action", ALL)); - CommonPrivilege coll1Update = - create(new KeyValue("collection", "coll1"), new KeyValue("action", "update")); - CommonPrivilege coll1Query = - create(new KeyValue("collection", "coll1"), new KeyValue("action", "query")); - assertTrue(coll1All.implies(coll1All, searchPrivilegeModel)); - assertTrue(coll1All.implies(coll1Update, searchPrivilegeModel)); - assertTrue(coll1All.implies(coll1Query, searchPrivilegeModel)); - assertFalse(coll1Update.implies(coll1All, searchPrivilegeModel)); - assertFalse(coll1Query.implies(coll1All, searchPrivilegeModel)); - - // test different lengths - CommonPrivilege coll1 = - create(new KeyValue("collection", "coll1")); - assertTrue(coll1All.implies(coll1, searchPrivilegeModel)); - assertTrue(coll1.implies(coll1All, searchPrivilegeModel)); - } - - @Test - public void testUnexpected() throws Exception { - Privilege p = new Privilege() { - @Override - public boolean implies(Privilege p, Model m) { - return false; - } - - @Override - public List<KeyValue> getAuthorizable() { - return null; - } - }; - Privilege collection1 = create(new KeyValue("collection", "coll1")); - assertFalse(collection1.implies(null, searchPrivilegeModel)); - assertFalse(collection1.implies(p, searchPrivilegeModel)); - assertFalse(collection1.equals(null)); - assertFalse(collection1.equals(p)); - } - - @Test(expected=IllegalArgumentException.class) - public void testNullString() throws Exception { - System.out.println(create((String)null)); - } - - @Test(expected=IllegalArgumentException.class) - public void testEmptyString() throws Exception { - System.out.println(create("")); - } - - @Test(expected=IllegalArgumentException.class) - public void testEmptyKey() throws Exception { - System.out.println(create(SentryConstants.KV_JOINER.join("collection", ""))); - } - - @Test(expected=IllegalArgumentException.class) - public void testEmptyValue() throws Exception { - System.out.println(create(SentryConstants.KV_JOINER.join("", "coll1"))); - } - - @Test(expected=IllegalArgumentException.class) - public void testEmptyPart() throws Exception { - System.out.println(create(SentryConstants.AUTHORIZABLE_JOINER. - join(SentryConstants.KV_JOINER.join("collection1", "coll1"), ""))); - } - - @Test(expected=IllegalArgumentException.class) - public void testOnlySeperators() throws Exception { - System.out.println(create(SentryConstants.AUTHORIZABLE_JOINER. - join(SentryConstants.KV_SEPARATOR, SentryConstants.KV_SEPARATOR, - SentryConstants.KV_SEPARATOR))); - } - - static CommonPrivilege create(KeyValue... keyValues) { - return create(SentryConstants.AUTHORIZABLE_JOINER.join(keyValues)); - } - - static CommonPrivilege create(String s) { - return new CommonPrivilege(s); - } -} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/privilege/solr/TestCommonPrivilegeForSolr.java ---------------------------------------------------------------------- diff --git a/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/privilege/solr/TestCommonPrivilegeForSolr.java b/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/privilege/solr/TestCommonPrivilegeForSolr.java new file mode 100644 index 0000000..6782089 --- /dev/null +++ b/sentry-binding/sentry-binding-solr/src/test/java/org/apache/sentry/privilege/solr/TestCommonPrivilegeForSolr.java @@ -0,0 +1,293 @@ +/* + * 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.privilege.solr; + +import org.apache.sentry.core.common.Model; +import org.apache.sentry.core.common.utils.KeyValue; +import org.apache.sentry.core.common.utils.SentryConstants; +import org.apache.sentry.core.model.solr.SolrConstants; +import org.apache.sentry.core.model.solr.SolrPrivilegeModel; +import org.apache.sentry.policy.common.CommonPrivilege; +import org.apache.sentry.policy.common.Privilege; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; + +/** + * This class implements a set of unit tests designed to verify {@linkplain SolrPrivilegeModel} + */ +public class TestCommonPrivilegeForSolr { + + private Model solrPrivilegeModel; + + private static final String ALL = SolrConstants.ALL; + + @Before + public void prepareData() { + solrPrivilegeModel = SolrPrivilegeModel.getInstance(); + } + + @Test + public void testSimpleNoAction() throws Exception { + CommonPrivilege collection1 = create(new KeyValue("collection", "coll1")); + CommonPrivilege collection2 = create(new KeyValue("collection", "coll2")); + CommonPrivilege collection1Case = create(new KeyValue("colleCtIon", "coLl1")); + + assertTrue(collection1.implies(collection1, solrPrivilegeModel)); + assertTrue(collection2.implies(collection2, solrPrivilegeModel)); + assertTrue(collection1.implies(collection1Case, solrPrivilegeModel)); + assertTrue(collection1Case.implies(collection1, solrPrivilegeModel)); + + assertFalse(collection1.implies(collection2, solrPrivilegeModel)); + assertFalse(collection1Case.implies(collection2, solrPrivilegeModel)); + assertFalse(collection2.implies(collection1, solrPrivilegeModel)); + assertFalse(collection2.implies(collection1Case, solrPrivilegeModel)); + } + + @Test + public void testAdminNoAction() throws Exception { + CommonPrivilege globalAdmin = create(new KeyValue("admin", SolrConstants.ALL)); + CommonPrivilege coreAdmin = create(new KeyValue("admin", "core")); + CommonPrivilege collectionAdmin = create(new KeyValue("admin", "collection")); + CommonPrivilege securityAdmin = create(new KeyValue("admin", "security")); + + assertTrue(coreAdmin.implies(coreAdmin, solrPrivilegeModel)); + assertFalse(coreAdmin.implies(collectionAdmin, solrPrivilegeModel)); + assertFalse(coreAdmin.implies(securityAdmin, solrPrivilegeModel)); + // TODO - Check if this is a bug ? + // assertFalse(coreAdmin.implies(globalAdmin, solrPrivilegeModel)); + + assertTrue(collectionAdmin.implies(collectionAdmin, solrPrivilegeModel)); + assertFalse(collectionAdmin.implies(coreAdmin, solrPrivilegeModel)); + assertFalse(collectionAdmin.implies(securityAdmin, solrPrivilegeModel)); + // TODO - Check if this is a bug ? + // assertFalse(collectionAdmin.implies(globalAdmin, solrPrivilegeModel)); + + assertTrue(securityAdmin.implies(securityAdmin, solrPrivilegeModel)); + assertFalse(securityAdmin.implies(collectionAdmin, solrPrivilegeModel)); + assertFalse(securityAdmin.implies(coreAdmin, solrPrivilegeModel)); + // TODO - Check if this is a bug ? + // assertFalse(securityAdmin.implies(globalAdmin, solrPrivilegeModel)); + + assertTrue(globalAdmin.implies(globalAdmin, solrPrivilegeModel)); + assertTrue(globalAdmin.implies(collectionAdmin, solrPrivilegeModel)); + assertTrue(globalAdmin.implies(coreAdmin, solrPrivilegeModel)); + assertTrue(globalAdmin.implies(securityAdmin, solrPrivilegeModel)); + } + + @Test + public void testSimpleAction() throws Exception { + CommonPrivilege query = + create(new KeyValue("collection", "coll1"), new KeyValue("action", "query")); + CommonPrivilege update = + create(new KeyValue("collection", "coll1"), new KeyValue("action", "update")); + CommonPrivilege queryCase = + create(new KeyValue("colleCtIon", "coLl1"), new KeyValue("AcTiOn", "QuERy")); + + assertTrue(query.implies(query, solrPrivilegeModel)); + assertTrue(update.implies(update, solrPrivilegeModel)); + assertTrue(query.implies(queryCase, solrPrivilegeModel)); + assertTrue(queryCase.implies(query, solrPrivilegeModel)); + + assertFalse(query.implies(update, solrPrivilegeModel)); + assertFalse(queryCase.implies(update, solrPrivilegeModel)); + assertFalse(update.implies(query, solrPrivilegeModel)); + assertFalse(update.implies(queryCase, solrPrivilegeModel)); + } + + @Test + public void testAdminAction() throws Exception { + CommonPrivilege query = + create(new KeyValue("admin", SolrConstants.ALL), new KeyValue("action", "query")); + CommonPrivilege update = + create(new KeyValue("admin", SolrConstants.ALL), new KeyValue("action", "update")); + CommonPrivilege queryCase = + create(new KeyValue("admin", SolrConstants.ALL), new KeyValue("AcTiOn", "QuERy")); + + assertTrue(query.implies(query, solrPrivilegeModel)); + assertTrue(update.implies(update, solrPrivilegeModel)); + assertTrue(query.implies(queryCase, solrPrivilegeModel)); + assertTrue(queryCase.implies(query, solrPrivilegeModel)); + + assertFalse(query.implies(update, solrPrivilegeModel)); + assertFalse(queryCase.implies(update, solrPrivilegeModel)); + assertFalse(update.implies(query, solrPrivilegeModel)); + assertFalse(update.implies(queryCase, solrPrivilegeModel)); + } + + @Test + public void testRoleShorterThanRequest() throws Exception { + CommonPrivilege collection1 = create(new KeyValue("collection", "coll1")); + CommonPrivilege query = + create(new KeyValue("collection", "coll1"), new KeyValue("action", "query")); + CommonPrivilege update = + create(new KeyValue("collection", "coll1"), new KeyValue("action", "update")); + CommonPrivilege all = + create(new KeyValue("collection", "coll1"), new KeyValue("action", ALL)); + + assertTrue(collection1.implies(query, solrPrivilegeModel)); + assertTrue(collection1.implies(update, solrPrivilegeModel)); + assertTrue(collection1.implies(all, solrPrivilegeModel)); + + assertFalse(query.implies(collection1, solrPrivilegeModel)); + assertFalse(update.implies(collection1, solrPrivilegeModel)); + assertTrue(all.implies(collection1, solrPrivilegeModel)); + } + + @Test + public void testAdminRoleShorterThanRequest() throws Exception { + CommonPrivilege globalAdmin = create(new KeyValue("admin", "*")); + CommonPrivilege query = + create(new KeyValue("admin", "core"), new KeyValue("action", "query")); + CommonPrivilege update = + create(new KeyValue("admin", "core"), new KeyValue("action", "update")); + CommonPrivilege all = create(new KeyValue("admin", "*"), new KeyValue("action", ALL)); + + assertTrue(globalAdmin.implies(query, solrPrivilegeModel)); + assertTrue(globalAdmin.implies(update, solrPrivilegeModel)); + assertTrue(globalAdmin.implies(all, solrPrivilegeModel)); + + assertFalse(query.implies(globalAdmin, solrPrivilegeModel)); + assertFalse(update.implies(globalAdmin, solrPrivilegeModel)); + assertTrue(all.implies(globalAdmin, solrPrivilegeModel)); + } + + @Test + public void testCollectionAll() throws Exception { + CommonPrivilege collectionAll = create(new KeyValue("collection", ALL)); + CommonPrivilege collection1 = create(new KeyValue("collection", "coll1")); + assertTrue(collectionAll.implies(collection1, solrPrivilegeModel)); + assertTrue(collection1.implies(collectionAll, solrPrivilegeModel)); + + CommonPrivilege allUpdate = + create(new KeyValue("collection", ALL), new KeyValue("action", "update")); + CommonPrivilege allQuery = + create(new KeyValue("collection", ALL), new KeyValue("action", "query")); + CommonPrivilege coll1Update = + create(new KeyValue("collection", "coll1"), new KeyValue("action", "update")); + CommonPrivilege coll1Query = + create(new KeyValue("collection", "coll1"), new KeyValue("action", "query")); + assertTrue(allUpdate.implies(coll1Update, solrPrivilegeModel)); + assertTrue(allQuery.implies(coll1Query, solrPrivilegeModel)); + assertTrue(coll1Update.implies(allUpdate, solrPrivilegeModel)); + assertTrue(coll1Query.implies(allQuery, solrPrivilegeModel)); + assertFalse(allUpdate.implies(coll1Query, solrPrivilegeModel)); + assertFalse(coll1Update.implies(coll1Query, solrPrivilegeModel)); + assertFalse(allQuery.implies(coll1Update, solrPrivilegeModel)); + assertFalse(coll1Query.implies(allUpdate, solrPrivilegeModel)); + assertFalse(allUpdate.implies(allQuery, solrPrivilegeModel)); + assertFalse(allQuery.implies(allUpdate, solrPrivilegeModel)); + assertFalse(coll1Update.implies(coll1Query, solrPrivilegeModel)); + assertFalse(coll1Query.implies(coll1Update, solrPrivilegeModel)); + + // test different length paths + assertTrue(collectionAll.implies(allUpdate, solrPrivilegeModel)); + assertTrue(collectionAll.implies(allQuery, solrPrivilegeModel)); + assertTrue(collectionAll.implies(coll1Update, solrPrivilegeModel)); + assertTrue(collectionAll.implies(coll1Query, solrPrivilegeModel)); + assertFalse(allUpdate.implies(collectionAll, solrPrivilegeModel)); + assertFalse(allQuery.implies(collectionAll, solrPrivilegeModel)); + assertFalse(coll1Update.implies(collectionAll, solrPrivilegeModel)); + assertFalse(coll1Query.implies(collectionAll, solrPrivilegeModel)); + } + + @Test + public void testActionAll() throws Exception { + CommonPrivilege coll1All = + create(new KeyValue("collection", "coll1"), new KeyValue("action", ALL)); + CommonPrivilege coll1Update = + create(new KeyValue("collection", "coll1"), new KeyValue("action", "update")); + CommonPrivilege coll1Query = + create(new KeyValue("collection", "coll1"), new KeyValue("action", "query")); + assertTrue(coll1All.implies(coll1All, solrPrivilegeModel)); + assertTrue(coll1All.implies(coll1Update, solrPrivilegeModel)); + assertTrue(coll1All.implies(coll1Query, solrPrivilegeModel)); + assertFalse(coll1Update.implies(coll1All, solrPrivilegeModel)); + assertFalse(coll1Query.implies(coll1All, solrPrivilegeModel)); + + // test different lengths + CommonPrivilege coll1 = + create(new KeyValue("collection", "coll1")); + assertTrue(coll1All.implies(coll1, solrPrivilegeModel)); + assertTrue(coll1.implies(coll1All, solrPrivilegeModel)); + } + + @Test + public void testUnexpected() throws Exception { + Privilege p = new Privilege() { + @Override + public boolean implies(Privilege p, Model m) { + return false; + } + + @Override + public List<KeyValue> getAuthorizable() { + return null; + } + }; + Privilege collection1 = create(new KeyValue("collection", "coll1")); + assertFalse(collection1.implies(null, solrPrivilegeModel)); + assertFalse(collection1.implies(p, solrPrivilegeModel)); + assertFalse(collection1.equals(null)); + assertFalse(collection1.equals(p)); + } + + @Test(expected=IllegalArgumentException.class) + public void testNullString() throws Exception { + System.out.println(create((String)null)); + } + + @Test(expected=IllegalArgumentException.class) + public void testEmptyString() throws Exception { + System.out.println(create("")); + } + + @Test(expected=IllegalArgumentException.class) + public void testEmptyKey() throws Exception { + System.out.println(create(SentryConstants.KV_JOINER.join("collection", ""))); + } + + @Test(expected=IllegalArgumentException.class) + public void testEmptyValue() throws Exception { + System.out.println(create(SentryConstants.KV_JOINER.join("", "coll1"))); + } + + @Test(expected=IllegalArgumentException.class) + public void testEmptyPart() throws Exception { + System.out.println(create(SentryConstants.AUTHORIZABLE_JOINER. + join(SentryConstants.KV_JOINER.join("collection1", "coll1"), ""))); + } + + @Test(expected=IllegalArgumentException.class) + public void testOnlySeperators() throws Exception { + System.out.println(create(SentryConstants.AUTHORIZABLE_JOINER. + join(SentryConstants.KV_SEPARATOR, SentryConstants.KV_SEPARATOR, + SentryConstants.KV_SEPARATOR))); + } + + static CommonPrivilege create(KeyValue... keyValues) { + return create(SentryConstants.AUTHORIZABLE_JOINER.join(keyValues)); + } + + static CommonPrivilege create(String s) { + return new CommonPrivilege(s); + } +} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-binding/sentry-binding-solr/src/test/resources/test-authz-provider.ini ---------------------------------------------------------------------- diff --git a/sentry-binding/sentry-binding-solr/src/test/resources/test-authz-provider.ini b/sentry-binding/sentry-binding-solr/src/test/resources/test-authz-provider.ini index 56317db..88b6f14 100644 --- a/sentry-binding/sentry-binding-solr/src/test/resources/test-authz-provider.ini +++ b/sentry-binding/sentry-binding-solr/src/test/resources/test-authz-provider.ini @@ -22,9 +22,7 @@ general = corporal_role, sergeant_role, general_role undefinedRoleGroup = undefinedRole [roles] -#test that specification of a bogus action doesn't affect further specifications -corporal_role = collection=info->action=FOOBAR, \ - collection=info->action=query +corporal_role = collection=info->action=query sergeant_role = collection=info->action=update general_role = collection=*->action=* http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/pom.xml ---------------------------------------------------------------------- diff --git a/sentry-core/pom.xml b/sentry-core/pom.xml index 6b91767..b6256b7 100644 --- a/sentry-core/pom.xml +++ b/sentry-core/pom.xml @@ -32,7 +32,7 @@ limitations under the License. <module>sentry-core-common</module> <module>sentry-core-model-db</module> <module>sentry-core-model-indexer</module> - <module>sentry-core-model-search</module> + <module>sentry-core-model-solr</module> <module>sentry-core-model-sqoop</module> <module>sentry-core-model-kafka</module> </modules> http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-search/pom.xml ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-search/pom.xml b/sentry-core/sentry-core-model-search/pom.xml deleted file mode 100644 index 5917a63..0000000 --- a/sentry-core/sentry-core-model-search/pom.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.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. ---> -<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>org.apache.sentry</groupId> - <artifactId>sentry-core</artifactId> - <version>2.0.0-SNAPSHOT</version> - </parent> - - <artifactId>sentry-core-model-search</artifactId> - <name>Sentry Core Model Search</name> - - <dependencies> - <dependency> - <groupId>org.apache.sentry</groupId> - <artifactId>sentry-core-common</artifactId> - </dependency> - - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <scope>test</scope> - </dependency> - </dependencies> - -</project> http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/Collection.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/Collection.java b/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/Collection.java deleted file mode 100644 index 26ea287..0000000 --- a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/Collection.java +++ /dev/null @@ -1,51 +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.sentry.core.model.search; - -public class Collection implements SearchModelAuthorizable { - - /** - * Represents all tables - */ - public static final Collection ALL = new Collection(SearchConstants.ALL); - - private final String name; - - public Collection(String name) { - this.name = name; - } - - @Override - public String getName() { - return name; - } - - @Override - public String toString() { - return "Collection [name=" + name + "]"; - } - - @Override - public AuthorizableType getAuthzType() { - return AuthorizableType.Collection; - } - - @Override - public String getTypeName() { - return getAuthzType().name(); - } -} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/Field.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/Field.java b/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/Field.java deleted file mode 100644 index 2dd9065..0000000 --- a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/Field.java +++ /dev/null @@ -1,54 +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.sentry.core.model.search; - -/** - * Represents the field authorizable in the solr model - */ -public class Field implements SearchModelAuthorizable{ - - private final String name; - /** - * Represents all fields - */ - public static final Field ALL = new Field(SearchConstants.ALL); - - public Field(String name) { - this.name = name; - } - - @Override - public AuthorizableType getAuthzType() { - return AuthorizableType.Field; - } - - @Override - public String toString() { - return "Field [name=" + name + "]"; - } - - @Override - public String getTypeName() { - return getAuthzType().name(); - } - - @Override - public String getName() { - return name; - } - -} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchActionFactory.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchActionFactory.java b/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchActionFactory.java deleted file mode 100644 index 3f10726..0000000 --- a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchActionFactory.java +++ /dev/null @@ -1,80 +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.sentry.core.model.search; - -import java.util.List; - -import org.apache.sentry.core.common.BitFieldAction; -import org.apache.sentry.core.common.BitFieldActionFactory; - -import com.google.common.collect.Lists; - -public class SearchActionFactory extends BitFieldActionFactory { - public enum SearchAction { - UPDATE(SearchConstants.UPDATE, 0x0001), - QUERY(SearchConstants.QUERY, 0x0002), - ALL(SearchConstants.ALL, 0x0001|0x0002); - - private String name; - private int code; - private SearchAction(String name, int code) { - this.name = name; - this.code = code; - } - public String getName() { - return name; - } - public int getCode() { - return code; - } - } - - public static class SearchBitFieldAction extends BitFieldAction { - public SearchBitFieldAction(SearchAction action) { - super(action.getName(), action.getCode()); - } - } - - private final static SearchAction[] AllActions = SearchAction.values(); - /** - * One bit set action array, includes UPDATE and QUERY - */ - private final static SearchAction[] OneBitActions = new SearchAction[]{SearchAction.UPDATE, SearchAction.QUERY}; - - @Override - public List<? extends BitFieldAction> getActionsByCode(int actionCode) { - List<SearchBitFieldAction> actions = Lists.newArrayList(); - for (SearchAction action : OneBitActions) { - if ((action.code & actionCode) == action.code) { - actions.add(new SearchBitFieldAction(action)); - } - } - return actions; - } - - @Override - public BitFieldAction getActionByName(String name) { - SearchBitFieldAction val = null; - for (SearchAction action : AllActions) { - if (action.name.equalsIgnoreCase(name)) { - return new SearchBitFieldAction(action); - } - } - return val; - } -} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchConstants.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchConstants.java b/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchConstants.java deleted file mode 100644 index a2b17fc..0000000 --- a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchConstants.java +++ /dev/null @@ -1,35 +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.sentry.core.model.search; - -public final class SearchConstants { - - public static final String ALL = "*"; - public static final String QUERY = "query"; - public static final String UPDATE = "update"; - /** - * The property of sentry.search.service is used to distinguish itself from multiple search services. For example, there are two - * search services: service1 and service2 implemented authorization via sentry, and it must set the value of - * sentry.search.service=service1 or service2 to communicate with sentry service for authorization - */ - public static final String SENTRY_SEARCH_SERVICE_KEY = "sentry.search.service"; - public static final String SENTRY_SEARCH_SERVICE_DEFAULT = "service1"; - - private SearchConstants() { - // Make constructor private to avoid instantiation - } -} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchModelAction.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchModelAction.java b/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchModelAction.java deleted file mode 100644 index 48ac267..0000000 --- a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchModelAction.java +++ /dev/null @@ -1,39 +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.sentry.core.model.search; - -import org.apache.sentry.core.common.Action; - -/** - * Represents actions in the Search model. - */ -public enum SearchModelAction implements Action { - - UPDATE(SearchConstants.UPDATE), - QUERY(SearchConstants.QUERY), - ALL(SearchConstants.ALL); - - private final String value; - private SearchModelAction(String value) { - this.value = value; - } - - @Override - public String getValue() { - return value; - } -} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchModelAuthorizable.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchModelAuthorizable.java b/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchModelAuthorizable.java deleted file mode 100644 index 5a55963..0000000 --- a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchModelAuthorizable.java +++ /dev/null @@ -1,29 +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.sentry.core.model.search; - -import org.apache.sentry.core.common.Authorizable; - -public interface SearchModelAuthorizable extends Authorizable { - - public enum AuthorizableType { - Collection, - Field - }; - - AuthorizableType getAuthzType(); -} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchModelAuthorizables.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchModelAuthorizables.java b/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchModelAuthorizables.java deleted file mode 100644 index 2b190e5..0000000 --- a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchModelAuthorizables.java +++ /dev/null @@ -1,50 +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.sentry.core.model.search; - -import org.apache.sentry.core.model.search.SearchModelAuthorizable.AuthorizableType; -import org.apache.sentry.core.common.utils.KeyValue; - -public class SearchModelAuthorizables { - - private SearchModelAuthorizables() { - // Make constructor private to avoid instantiation - } - - public static SearchModelAuthorizable from(KeyValue keyValue) { - String prefix = keyValue.getKey().toLowerCase(); - String name = keyValue.getValue().toLowerCase(); - for(AuthorizableType type : AuthorizableType.values()) { - if(prefix.equalsIgnoreCase(type.name())) { - return from(type, name); - } - } - return null; - } - public static SearchModelAuthorizable from(String s) { - return from(new KeyValue(s)); - } - - private static SearchModelAuthorizable from(AuthorizableType type, String name) { - switch (type) { - case Collection: - return new Collection(name); - default: - return null; - } - } -} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchPrivilegeModel.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchPrivilegeModel.java b/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchPrivilegeModel.java deleted file mode 100644 index 9429a25..0000000 --- a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/SearchPrivilegeModel.java +++ /dev/null @@ -1,60 +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.sentry.core.model.search; - -import com.google.common.collect.ImmutableList; -import org.apache.sentry.core.common.BitFieldActionFactory; -import org.apache.sentry.core.common.ImplyMethodType; -import org.apache.sentry.core.common.Model; -import org.apache.sentry.core.common.validator.PrivilegeValidator; -import org.apache.sentry.core.model.search.validator.CollectionRequiredInPrivilege; - -import java.util.HashMap; -import java.util.Map; - -public class SearchPrivilegeModel implements Model { - - private Map<String, ImplyMethodType> implyMethodMap; - private BitFieldActionFactory bitFieldActionFactory; - private static SearchPrivilegeModel searchPrivilegeModel = new SearchPrivilegeModel(); - - private SearchPrivilegeModel() { - implyMethodMap = new HashMap<String, ImplyMethodType>(); - bitFieldActionFactory = new SearchActionFactory(); - - implyMethodMap.put(SearchModelAuthorizable.AuthorizableType.Collection.name().toLowerCase(), ImplyMethodType.STRING); - implyMethodMap.put(SearchModelAuthorizable.AuthorizableType.Field.name().toLowerCase(), ImplyMethodType.STRING); - } - - @Override - public Map<String, ImplyMethodType> getImplyMethodMap() { - return implyMethodMap; - } - - @Override - public BitFieldActionFactory getBitFieldActionFactory() { - return bitFieldActionFactory; - } - - public static SearchPrivilegeModel getInstance() { - return searchPrivilegeModel; - } - - public ImmutableList<PrivilegeValidator> getPrivilegeValidators() { - return ImmutableList.<PrivilegeValidator>of(new CollectionRequiredInPrivilege()); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/validator/AbstractSearchPrivilegeValidator.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/validator/AbstractSearchPrivilegeValidator.java b/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/validator/AbstractSearchPrivilegeValidator.java deleted file mode 100644 index c06131c..0000000 --- a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/validator/AbstractSearchPrivilegeValidator.java +++ /dev/null @@ -1,52 +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.sentry.core.model.search.validator; - -import static org.apache.sentry.core.common.utils.SentryConstants.AUTHORIZABLE_SPLITTER; -import static org.apache.sentry.core.common.utils.SentryConstants.PRIVILEGE_PREFIX; - -import java.util.List; - -import org.apache.sentry.core.model.search.SearchModelAuthorizable; -import org.apache.sentry.core.common.validator.PrivilegeValidator; -import org.apache.sentry.core.model.search.SearchModelAuthorizables; -import org.apache.shiro.config.ConfigurationException; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.Lists; - -public abstract class AbstractSearchPrivilegeValidator implements PrivilegeValidator { - - @VisibleForTesting - public static Iterable<SearchModelAuthorizable> parsePrivilege(String string) { - List<SearchModelAuthorizable> result = Lists.newArrayList(); - System.err.println("privilege = " + string); - for(String section : AUTHORIZABLE_SPLITTER.split(string)) { - // XXX this ugly hack is because action is not an authorizable - if(!section.toLowerCase().startsWith(PRIVILEGE_PREFIX)) { - SearchModelAuthorizable authorizable = SearchModelAuthorizables.from(section); - if(authorizable == null) { - String msg = "No authorizable found for " + section; - throw new ConfigurationException(msg); - } - result.add(authorizable); - } - } - return result; - } - -} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/validator/CollectionRequiredInPrivilege.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/validator/CollectionRequiredInPrivilege.java b/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/validator/CollectionRequiredInPrivilege.java deleted file mode 100644 index 93b3861..0000000 --- a/sentry-core/sentry-core-model-search/src/main/java/org/apache/sentry/core/model/search/validator/CollectionRequiredInPrivilege.java +++ /dev/null @@ -1,43 +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.sentry.core.model.search.validator; - -import org.apache.sentry.core.common.exception.SentryConfigurationException; -import org.apache.sentry.core.model.search.Collection; -import org.apache.sentry.core.model.search.SearchModelAuthorizable; -import org.apache.sentry.core.common.validator.PrivilegeValidatorContext; - -public class CollectionRequiredInPrivilege extends AbstractSearchPrivilegeValidator { - - @Override - public void validate(PrivilegeValidatorContext context) throws SentryConfigurationException { - String privilege = context.getPrivilege(); - Iterable<SearchModelAuthorizable> authorizables = parsePrivilege(privilege); - boolean foundCollectionInAuthorizables = false; - - for(SearchModelAuthorizable authorizable : authorizables) { - if(authorizable instanceof Collection) { - foundCollectionInAuthorizables = true; - break; - } - } - if(!foundCollectionInAuthorizables) { - String msg = "Missing collection object in " + privilege; - throw new SentryConfigurationException(msg); - } - } -} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-search/src/test/java/org/apache/sentry/core/search/TestCollection.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-search/src/test/java/org/apache/sentry/core/search/TestCollection.java b/sentry-core/sentry-core-model-search/src/test/java/org/apache/sentry/core/search/TestCollection.java deleted file mode 100644 index 2311401..0000000 --- a/sentry-core/sentry-core-model-search/src/test/java/org/apache/sentry/core/search/TestCollection.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.apache.sentry.core.search; -/* - * 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. - */ - -import org.junit.Assert; - -import org.apache.sentry.core.model.search.Collection; -import org.junit.Test; - -public class TestCollection { - - @Test - public void testSimple() { - String name = "simple"; - Collection simple = new Collection(name); - Assert.assertEquals(simple.getName(), name); - } - - @Test - public void testCollectionAuthzType() { - Collection collection1 = new Collection("collection1"); - Collection collection2 = new Collection("collection2"); - Assert.assertEquals(collection1.getAuthzType(), collection2.getAuthzType()); - Assert.assertEquals(collection1.getTypeName(), collection2.getTypeName()); - } - - // just test it doesn't throw NPE - @Test - public void testNullCollection() { - Collection nullCollection = new Collection(null); - nullCollection.getName(); - nullCollection.toString(); - nullCollection.getAuthzType(); - nullCollection.getTypeName(); - } -} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-search/src/test/java/org/apache/sentry/core/search/TestSearchBitFieldAction.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-search/src/test/java/org/apache/sentry/core/search/TestSearchBitFieldAction.java b/sentry-core/sentry-core-model-search/src/test/java/org/apache/sentry/core/search/TestSearchBitFieldAction.java deleted file mode 100644 index 0056f40..0000000 --- a/sentry-core/sentry-core-model-search/src/test/java/org/apache/sentry/core/search/TestSearchBitFieldAction.java +++ /dev/null @@ -1,73 +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.sentry.core.search; - -import org.apache.sentry.core.model.search.SearchActionFactory; -import org.apache.sentry.core.model.search.SearchActionFactory.SearchAction; -import org.apache.sentry.core.model.search.SearchActionFactory.SearchBitFieldAction; -import org.apache.sentry.core.model.search.SearchConstants; -import org.junit.Test; - -import com.google.common.collect.Lists; - -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertEquals; - -public class TestSearchBitFieldAction { - SearchActionFactory actionFactory = new SearchActionFactory(); - - @Test - public void testImpliesAction() { - SearchBitFieldAction updateAction = new SearchBitFieldAction(SearchAction.UPDATE); - SearchBitFieldAction queryAction = new SearchBitFieldAction(SearchAction.QUERY); - SearchBitFieldAction allAction = new SearchBitFieldAction(SearchAction.ALL); - - assertTrue(allAction.implies(queryAction)); - assertTrue(allAction.implies(updateAction)); - assertTrue(allAction.implies(allAction)); - assertTrue(updateAction.implies(updateAction)); - assertTrue(queryAction.implies(queryAction)); - - assertFalse(queryAction.implies(updateAction)); - assertFalse(queryAction.implies(allAction)); - assertFalse(updateAction.implies(queryAction)); - assertFalse(updateAction.implies(allAction)); - } - - @Test - public void testGetActionByName() throws Exception { - SearchBitFieldAction updateAction = (SearchBitFieldAction)actionFactory.getActionByName(SearchConstants.UPDATE); - SearchBitFieldAction queryAction = (SearchBitFieldAction)actionFactory.getActionByName(SearchConstants.QUERY); - SearchBitFieldAction allAction = (SearchBitFieldAction)actionFactory.getActionByName(SearchConstants.ALL); - - assertTrue(updateAction.equals(new SearchBitFieldAction(SearchAction.UPDATE))); - assertTrue(queryAction.equals(new SearchBitFieldAction(SearchAction.QUERY))); - assertTrue(allAction.equals(new SearchBitFieldAction(SearchAction.ALL))); - } - - @Test - public void testGetActionsByCode() throws Exception { - SearchBitFieldAction updateAction = new SearchBitFieldAction(SearchAction.UPDATE); - SearchBitFieldAction queryAction = new SearchBitFieldAction(SearchAction.QUERY); - - assertEquals(Lists.newArrayList(updateAction, queryAction), actionFactory.getActionsByCode(SearchAction.ALL.getCode())); - assertEquals(Lists.newArrayList(updateAction), actionFactory.getActionsByCode(SearchAction.UPDATE.getCode())); - assertEquals(Lists.newArrayList(queryAction), actionFactory.getActionsByCode(SearchAction.QUERY.getCode())); - } -} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-solr/pom.xml ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-solr/pom.xml b/sentry-core/sentry-core-model-solr/pom.xml new file mode 100644 index 0000000..58ae2a7 --- /dev/null +++ b/sentry-core/sentry-core-model-solr/pom.xml @@ -0,0 +1,43 @@ +<?xml version="1.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. +--> +<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.apache.sentry</groupId> + <artifactId>sentry-core</artifactId> + <version>2.0.0-SNAPSHOT</version> + </parent> + + <artifactId>sentry-core-model-solr</artifactId> + <name>Sentry Core Model Solr</name> + + <dependencies> + <dependency> + <groupId>org.apache.sentry</groupId> + <artifactId>sentry-core-common</artifactId> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + +</project> http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/AdminOperation.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/AdminOperation.java b/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/AdminOperation.java new file mode 100644 index 0000000..c054b7d --- /dev/null +++ b/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/AdminOperation.java @@ -0,0 +1,42 @@ +/* + * 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.core.model.solr; + +import java.util.Arrays; +import java.util.Collection; + +/** + * This class represents Solr admin operations which includes, + * - Collection admin operations + * - Core admin operations + * - Security configuration management. + * - Reading Solr metrics + * - Solr auto-scaling operations + */ +public class AdminOperation extends SolrModelAuthorizable { + public static Collection<String> ENTITY_NAMES = + Arrays.asList(SolrConstants.ALL, "collections", "cores", "security", "metrics", "autoscaling"); + + public static AdminOperation ALL = new AdminOperation(SolrConstants.ALL); + public static AdminOperation COLLECTIONS = new AdminOperation("collections"); + public static AdminOperation CORES = new AdminOperation("cores"); + public static AdminOperation SECURITY = new AdminOperation("security"); + public static AdminOperation METRICS = new AdminOperation("metrics"); + public static AdminOperation AUTOSCALING = new AdminOperation("autoscaling"); + + public AdminOperation (String name) { + super (AuthorizableType.Admin, name); + } +} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/Collection.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/Collection.java b/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/Collection.java new file mode 100644 index 0000000..0232ec0 --- /dev/null +++ b/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/Collection.java @@ -0,0 +1,29 @@ +/* + * 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.core.model.solr; + +public class Collection extends SolrModelAuthorizable { + + /** + * Represents all tables + */ + public static final Collection ALL = new Collection(SolrConstants.ALL); + + public Collection(String name) { + super (AuthorizableType.Collection, name); + } +} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/Config.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/Config.java b/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/Config.java new file mode 100644 index 0000000..208211e --- /dev/null +++ b/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/Config.java @@ -0,0 +1,27 @@ +/* + * 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.core.model.solr; + +/** + * This class represents a Solr config-set. + */ +public class Config extends SolrModelAuthorizable { + + public static final Config ALL = new Config(SolrConstants.ALL); + + public Config(String name) { + super (AuthorizableType.Config, name); + } +} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/Field.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/Field.java b/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/Field.java new file mode 100644 index 0000000..554fa08 --- /dev/null +++ b/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/Field.java @@ -0,0 +1,30 @@ +/* + * 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.core.model.solr; + +/** + * Represents the field authorizable in the solr model + */ +public class Field extends SolrModelAuthorizable { + + /** + * Represents all fields + */ + public static final Field ALL = new Field(SolrConstants.ALL); + + public Field(String name) { + super (AuthorizableType.Field, name); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/Schema.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/Schema.java b/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/Schema.java new file mode 100644 index 0000000..b5ab6a1 --- /dev/null +++ b/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/Schema.java @@ -0,0 +1,27 @@ +/* + * 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.core.model.solr; + +/** + * This class represents Solr collection/core schema + */ +public class Schema extends SolrModelAuthorizable { + + public static final Schema ALL = new Schema(SolrConstants.ALL); + + public Schema(String name) { + super (AuthorizableType.Schema, name); + } +} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/SolrActionFactory.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/SolrActionFactory.java b/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/SolrActionFactory.java new file mode 100644 index 0000000..567708a --- /dev/null +++ b/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/SolrActionFactory.java @@ -0,0 +1,80 @@ +/** + * 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.core.model.solr; + +import java.util.List; + +import org.apache.sentry.core.common.BitFieldAction; +import org.apache.sentry.core.common.BitFieldActionFactory; + +import com.google.common.collect.Lists; + +public class SolrActionFactory extends BitFieldActionFactory { + public enum SolrAction { + UPDATE(SolrConstants.UPDATE, 0x0001), + QUERY(SolrConstants.QUERY, 0x0002), + ALL(SolrConstants.ALL, 0x0001|0x0002); + + private String name; + private int code; + private SolrAction(String name, int code) { + this.name = name; + this.code = code; + } + public String getName() { + return name; + } + public int getCode() { + return code; + } + } + + public static class SolrBitFieldAction extends BitFieldAction { + public SolrBitFieldAction(SolrAction action) { + super(action.getName(), action.getCode()); + } + } + + private final static SolrAction[] AllActions = SolrAction.values(); + /** + * One bit set action array, includes UPDATE and QUERY + */ + private final static SolrAction[] OneBitActions = new SolrAction[]{SolrAction.UPDATE, SolrAction.QUERY}; + + @Override + public List<? extends BitFieldAction> getActionsByCode(int actionCode) { + List<SolrBitFieldAction> actions = Lists.newArrayList(); + for (SolrAction action : OneBitActions) { + if ((action.code & actionCode) == action.code) { + actions.add(new SolrBitFieldAction(action)); + } + } + return actions; + } + + @Override + public BitFieldAction getActionByName(String name) { + SolrBitFieldAction val = null; + for (SolrAction action : AllActions) { + if (action.name.equalsIgnoreCase(name)) { + return new SolrBitFieldAction(action); + } + } + return val; + } +} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/SolrConstants.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/SolrConstants.java b/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/SolrConstants.java new file mode 100644 index 0000000..91dc41e --- /dev/null +++ b/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/SolrConstants.java @@ -0,0 +1,39 @@ +/* + * 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.core.model.solr; + +public final class SolrConstants { + + public static final String ALL = "*"; + public static final String QUERY = "query"; + public static final String UPDATE = "update"; + /** + * The property of sentry.solr.service is used to distinguish itself from multiple solr services. For example, there are two + * solr services: service1 and service2 implemented authorization via sentry, and it must set the value of + * sentry.solr.service=service1 or service2 to communicate with sentry service for authorization + */ + public static final String SENTRY_SOLR_SERVICE_KEY = "sentry.solr.service"; + public static final String SENTRY_SOLR_SERVICE_DEFAULT = "service1"; + + public static final String CORE_ADMIN = "core"; + public static final String COLLECTION_ADMIN = "collection"; + public static final String SECURITY_ADMIN = "security"; + + private SolrConstants() { + // Make constructor private to avoid instantiation + } +} http://git-wip-us.apache.org/repos/asf/sentry/blob/e62fa28d/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/SolrModelAction.java ---------------------------------------------------------------------- diff --git a/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/SolrModelAction.java b/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/SolrModelAction.java new file mode 100644 index 0000000..333ea10 --- /dev/null +++ b/sentry-core/sentry-core-model-solr/src/main/java/org/apache/sentry/core/model/solr/SolrModelAction.java @@ -0,0 +1,39 @@ +/* + * 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.core.model.solr; + +import org.apache.sentry.core.common.Action; + +/** + * Represents actions in the Solr model. + */ +public enum SolrModelAction implements Action { + + UPDATE(SolrConstants.UPDATE), + QUERY(SolrConstants.QUERY), + ALL(SolrConstants.ALL); + + private final String value; + private SolrModelAction(String value) { + this.value = value; + } + + @Override + public String getValue() { + return value; + } +}