This is an automated email from the ASF dual-hosted git repository.
panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new c3cc743 Rename shardingsphere-authority-common to
shardingsphere-authority-core (#12219)
c3cc743 is described below
commit c3cc7434178c4d56877c12f74ac53dec5bff1385
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Sep 4 19:58:13 2021 +0800
Rename shardingsphere-authority-common to shardingsphere-authority-core
(#12219)
---
.../authority/constant/AuthorityOrder.java | 33 ++++
....shardingsphere.infra.executor.check.SQLChecker | 18 ++
.../NativeAuthorityProviderAlgorithmTest.java | 199 +++++++++++++++++++++
3 files changed, 250 insertions(+)
diff --git
a/shardingsphere-kernel/shardingsphere-authority/shardingsphere-authority-core/src/main/java/org/apache/shardingsphere/authority/constant/AuthorityOrder.java
b/shardingsphere-kernel/shardingsphere-authority/shardingsphere-authority-core/src/main/java/org/apache/shardingsphere/authority/constant/AuthorityOrder.java
new file mode 100644
index 0000000..384792e
--- /dev/null
+++
b/shardingsphere-kernel/shardingsphere-authority/shardingsphere-authority-core/src/main/java/org/apache/shardingsphere/authority/constant/AuthorityOrder.java
@@ -0,0 +1,33 @@
+/*
+ * 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.shardingsphere.authority.constant;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+/**
+ * Authority order.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class AuthorityOrder {
+
+ /**
+ * Authority order.
+ */
+ public static final int ORDER = 500;
+}
diff --git
a/shardingsphere-kernel/shardingsphere-authority/shardingsphere-authority-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.executor.check.SQLChecker
b/shardingsphere-kernel/shardingsphere-authority/shardingsphere-authority-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.executor.check.SQLChecker
new file mode 100644
index 0000000..bb82025
--- /dev/null
+++
b/shardingsphere-kernel/shardingsphere-authority/shardingsphere-authority-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.executor.check.SQLChecker
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.authority.checker.AuthorityChecker
diff --git
a/shardingsphere-kernel/shardingsphere-authority/shardingsphere-authority-core/src/test/java/org/apache/shardingsphere/authority/provider/natived/NativeAuthorityProviderAlgorithmTest.java
b/shardingsphere-kernel/shardingsphere-authority/shardingsphere-authority-core/src/test/java/org/apache/shardingsphere/authority/provider/natived/NativeAuthorityProviderAlgorithmTest.java
new file mode 100644
index 0000000..88e899b
--- /dev/null
+++
b/shardingsphere-kernel/shardingsphere-authority/shardingsphere-authority-core/src/test/java/org/apache/shardingsphere/authority/provider/natived/NativeAuthorityProviderAlgorithmTest.java
@@ -0,0 +1,199 @@
+/*
+ * 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.shardingsphere.authority.provider.natived;
+
+import org.apache.shardingsphere.authority.model.PrivilegeType;
+import org.apache.shardingsphere.authority.model.ShardingSpherePrivileges;
+import org.apache.shardingsphere.authority.spi.AuthorityProvideAlgorithm;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.metadata.user.Grantee;
+import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
+import org.apache.shardingsphere.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.spi.typed.TypedSPIRegistry;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import javax.sql.DataSource;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.stream.Collectors;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public final class NativeAuthorityProviderAlgorithmTest {
+
+ @BeforeClass
+ public static void setUp() {
+ ShardingSphereServiceLoader.register(AuthorityProvideAlgorithm.class);
+ }
+
+ @Test
+ public void assertAlgorithmType() {
+ Optional<AuthorityProvideAlgorithm> algorithm =
TypedSPIRegistry.findRegisteredService(AuthorityProvideAlgorithm.class,
"NATIVE", new Properties());
+ assertTrue(algorithm.isPresent());
+ assertThat(algorithm.get().getType(), is("NATIVE"));
+ }
+
+ @Test
+ public void assertFindPrivileges() throws SQLException {
+ NativeAuthorityProviderAlgorithm algorithm = new
NativeAuthorityProviderAlgorithm();
+ Collection<ShardingSphereUser> users = new LinkedList<>();
+ ShardingSphereUser root = new ShardingSphereUser("root", "",
"localhost");
+ users.add(root);
+ ShardingSphereMetaData metaData = mockShardingSphereMetaData(users);
+ algorithm.init(Collections.singletonMap("db0", metaData), users);
+ Optional<ShardingSpherePrivileges> privileges =
algorithm.findPrivileges(new Grantee("root", "localhost"));
+ assertTrue(privileges.isPresent());
+ assertPrivilege(privileges.get());
+ }
+
+ @Test
+ public void assertRefreshPrivileges() throws SQLException {
+ NativeAuthorityProviderAlgorithm algorithm = new
NativeAuthorityProviderAlgorithm();
+ Collection<ShardingSphereUser> users = Collections.singletonList(new
ShardingSphereUser("root", "", "localhost"));
+ algorithm.init(Collections.emptyMap(), users);
+ Optional<ShardingSpherePrivileges> privileges1 =
algorithm.findPrivileges(new Grantee("root", "localhost"));
+ assertTrue(privileges1.isPresent());
+
assertTrue(privileges1.get().hasPrivileges(Collections.singletonList(PrivilegeType.SUPER)));
+ algorithm.refresh(Collections.singletonMap("db0",
mockShardingSphereMetaData(users)), users);
+ Optional<ShardingSpherePrivileges> privileges2 =
algorithm.findPrivileges(new Grantee("root", "localhost"));
+ assertTrue(privileges2.isPresent());
+ assertPrivilege(privileges2.get());
+ }
+
+ private void assertPrivilege(final ShardingSpherePrivileges privileges) {
+ Collection<PrivilegeType> expected = new LinkedList<>();
+ expected.add(PrivilegeType.SUPER);
+ expected.add(PrivilegeType.SELECT);
+ expected.add(PrivilegeType.INSERT);
+ expected.add(PrivilegeType.UPDATE);
+ expected.add(PrivilegeType.RELOAD);
+ expected.add(PrivilegeType.SHUTDOWN);
+ assertTrue(privileges.hasPrivileges(expected));
+ }
+
+ private ShardingSphereMetaData mockShardingSphereMetaData(final
Collection<ShardingSphereUser> users) throws SQLException {
+ ShardingSphereMetaData result = mock(ShardingSphereMetaData.class,
RETURNS_DEEP_STUBS);
+ DataSource dataSource = mockDataSourceForPrivileges(users);
+
when(result.getResource().getAllInstanceDataSources()).thenReturn(Collections.singletonList(dataSource));
+
when(result.getRuleMetaData().getRules()).thenReturn(Collections.emptyList());
+ return result;
+ }
+
+ private DataSource mockDataSourceForPrivileges(final
Collection<ShardingSphereUser> users) throws SQLException {
+ ResultSet globalPrivilegeResultSet = mockGlobalPrivilegeResultSet();
+ ResultSet schemaPrivilegeResultSet = mockSchemaPrivilegeResultSet();
+ ResultSet tablePrivilegeResultSet = mockTablePrivilegeResultSet();
+ DataSource result = mock(DataSource.class, RETURNS_DEEP_STUBS);
+ String globalPrivilegeSQL = "SELECT * FROM mysql.user WHERE (user,
host) in (%s)";
+ String schemaPrivilegeSQL = "SELECT * FROM mysql.db WHERE (user, host)
in (%s)";
+ String tablePrivilegeSQL = "SELECT Db, Table_name, Table_priv FROM
mysql.tables_priv WHERE (user, host) in (%s)";
+ String useHostTuples = users.stream().map(item ->
String.format("('%s', '%s')", item.getGrantee().getUsername(),
item.getGrantee().getHostname())).collect(Collectors.joining(", "));
+
when(result.getConnection().createStatement().executeQuery(String.format(globalPrivilegeSQL,
useHostTuples))).thenReturn(globalPrivilegeResultSet);
+
when(result.getConnection().createStatement().executeQuery(String.format(schemaPrivilegeSQL,
useHostTuples))).thenReturn(schemaPrivilegeResultSet);
+
when(result.getConnection().createStatement().executeQuery(String.format(tablePrivilegeSQL,
useHostTuples))).thenReturn(tablePrivilegeResultSet);
+
when(result.getConnection().getMetaData().getURL()).thenReturn("jdbc:mysql://localhost:3306/test");
+ return result;
+ }
+
+ private ResultSet mockGlobalPrivilegeResultSet() throws SQLException {
+ ResultSet result = mock(ResultSet.class);
+ when(result.next()).thenReturn(true, true, false, true, true, false);
+ when(result.getObject("Super_priv")).thenReturn(true, false, true,
false);
+ when(result.getObject("Reload_priv")).thenReturn(true, false, true,
false);
+ when(result.getObject("Shutdown_priv")).thenReturn(true, false, true,
false);
+ when(result.getObject("Process_priv")).thenReturn(false, false, false,
false);
+ when(result.getObject("File_priv")).thenReturn(false, false, false,
false);
+ when(result.getObject("Show_db_priv")).thenReturn(false, false, false,
false);
+ when(result.getObject("Repl_slave_priv")).thenReturn(false, false,
false, false);
+ when(result.getObject("Repl_client_priv")).thenReturn(false, false,
false, false);
+ when(result.getObject("Create_user_priv")).thenReturn(false, false,
false, false);
+ when(result.getObject("Create_tablespace_priv")).thenReturn(false,
false, false, false);
+ when(result.getObject("Select_priv")).thenReturn(true, false, true,
false);
+ when(result.getObject("Insert_priv")).thenReturn(true, false, true,
false);
+ when(result.getObject("Update_priv")).thenReturn(true, false, true,
false);
+ when(result.getObject("Delete_priv")).thenReturn(true, false, true,
false);
+ when(result.getObject("Create_priv")).thenReturn(true, false, true,
false);
+ when(result.getObject("Alter_priv")).thenReturn(true, false, true,
false);
+ when(result.getObject("Drop_priv")).thenReturn(false, false, false,
false);
+ when(result.getObject("Grant_priv")).thenReturn(false, false, false,
false);
+ when(result.getObject("Index_priv")).thenReturn(false, false, false,
false);
+ when(result.getObject("References_priv")).thenReturn(false, false,
false, false);
+ when(result.getObject("Create_tmp_table_priv")).thenReturn(false,
false, false, false);
+ when(result.getObject("Lock_tables_priv")).thenReturn(false, false,
false, false);
+ when(result.getObject("Execute_priv")).thenReturn(false, false, false,
false);
+ when(result.getObject("Create_view_priv")).thenReturn(false, false,
false, false);
+ when(result.getObject("Show_view_priv")).thenReturn(false, false,
false, false);
+ when(result.getObject("Create_routine_priv")).thenReturn(false, false,
false, false);
+ when(result.getObject("Alter_routine_priv")).thenReturn(false, false,
false, false);
+ when(result.getObject("Event_priv")).thenReturn(false, false, false,
false);
+ when(result.getObject("Trigger_priv")).thenReturn(false, false, false,
false);
+ when(result.getString("user")).thenReturn("root", "mysql.sys", "root",
"mysql.sys");
+ when(result.getString("host")).thenReturn("localhost");
+ return result;
+ }
+
+ private ResultSet mockSchemaPrivilegeResultSet() throws SQLException {
+ ResultSet result = mock(ResultSet.class);
+ when(result.next()).thenReturn(true, false);
+ when(result.getString("Db")).thenReturn("sys");
+ when(result.getObject("Select_priv")).thenReturn(false);
+ when(result.getObject("Insert_priv")).thenReturn(false);
+ when(result.getObject("Update_priv")).thenReturn(false);
+ when(result.getObject("Delete_priv")).thenReturn(false);
+ when(result.getObject("Create_priv")).thenReturn(false);
+ when(result.getObject("Alter_priv")).thenReturn(false);
+ when(result.getObject("Drop_priv")).thenReturn(false);
+ when(result.getObject("Grant_priv")).thenReturn(false);
+ when(result.getObject("Index_priv")).thenReturn(false);
+ when(result.getObject("References_priv")).thenReturn(false);
+ when(result.getObject("Create_tmp_table_priv")).thenReturn(false);
+ when(result.getObject("Lock_tables_priv")).thenReturn(false);
+ when(result.getObject("Execute_priv")).thenReturn(false);
+ when(result.getObject("Create_view_priv")).thenReturn(false);
+ when(result.getObject("Show_view_priv")).thenReturn(false);
+ when(result.getObject("Create_routine_priv")).thenReturn(false);
+ when(result.getObject("Alter_routine_priv")).thenReturn(false);
+ when(result.getObject("Event_priv")).thenReturn(false);
+ when(result.getObject("Trigger_priv")).thenReturn(true);
+ when(result.getString("user")).thenReturn("mysql.sys");
+ when(result.getString("host")).thenReturn("localhost");
+ return result;
+ }
+
+ private ResultSet mockTablePrivilegeResultSet() throws SQLException {
+ ResultSet result = mock(ResultSet.class, RETURNS_DEEP_STUBS);
+ when(result.next()).thenReturn(true, false);
+ when(result.getString("Db")).thenReturn("sys");
+ when(result.getString("Table_name")).thenReturn("sys_config");
+ when(result.getArray("Table_priv").getArray()).thenReturn(new
String[]{"Select"});
+ when(result.getString("user")).thenReturn("mysql.sys");
+ when(result.getString("host")).thenReturn("localhost");
+ return result;
+ }
+}