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 01cbeff  fix #9724 (#9743)
01cbeff is described below

commit 01cbeff22a69437234bc0fbe55b2c4c0d7118b3a
Author: JingShang Lu <[email protected]>
AuthorDate: Tue Mar 23 13:52:53 2021 +0800

    fix #9724 (#9743)
    
    * fix #9724
    
    * fix
    
    * fix
    
    * fix
    
    * fix
    
    * fix
    
    * fix
    
    * fix
---
 .../auth/model/privilege/ShardingSpherePrivilege.java         | 11 +++++++++++
 .../text/admin/mysql/executor/ShowDatabasesExecutor.java      | 11 +++++++----
 .../text/admin/mysql/executor/UseDatabaseExecutor.java        |  4 +---
 .../proxy/frontend/mysql/auth/MySQLAuthenticationHandler.java |  9 +++------
 .../mysql/command/admin/initdb/MySQLComInitDbExecutor.java    |  3 +--
 5 files changed, 23 insertions(+), 15 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/ShardingSpherePrivilege.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/ShardingSpherePrivilege.java
index 27ad1a2..3ef4bfe 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/ShardingSpherePrivilege.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/ShardingSpherePrivilege.java
@@ -74,6 +74,17 @@ public final class ShardingSpherePrivilege {
     }
     
     /**
+     * Has privilege for login and use db.
+     *
+     * @param schema schema
+     * @return has or not
+     */
+    public boolean hasPrivileges(final String schema) {
+        return 
administrativePrivilege.getPrivileges().contains(PrivilegeType.SUPER) || 
!databasePrivilege.getGlobalPrivileges().isEmpty()
+                || 
databasePrivilege.getSpecificPrivileges().containsKey(schema);
+    }
+    
+    /**
      * Has privileges.
      *
      * @param schema schema
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java
index 7a19a53..3693600 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java
@@ -54,10 +54,13 @@ public final class ShowDatabasesExecutor implements 
DatabaseAdminQueryExecutor {
             return Collections.emptyList();
         }
         Collection<Object> result = new LinkedList<>();
-        for (String each : ProxyContext.getInstance().getAllSchemaNames()) {
-            // TODO : Need to check whether PrivilegeType.SHOW_DB is correct 
or enough?
-            if (privilege.get().hasPrivileges(each, 
Collections.singletonList(PrivilegeType.SHOW_DB))) {
-                result.add(each);
+        if 
(privilege.get().hasPrivileges(Collections.singletonList(PrivilegeType.SHOW_DB)))
 {
+            result.addAll(ProxyContext.getInstance().getAllSchemaNames());
+        } else {
+            for (String each : ProxyContext.getInstance().getAllSchemaNames()) 
{
+                if (privilege.get().hasPrivileges(each)) {
+                    result.add(each);
+                }
             }
         }
         return result;
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
index 15d0f83..16813b8 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
@@ -26,7 +26,6 @@ import 
org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdmin
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dal.UseStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtil;
 
-import java.util.Collections;
 import java.util.Optional;
 
 /**
@@ -48,7 +47,6 @@ public final class UseDatabaseExecutor implements 
DatabaseAdminExecutor {
     
     private boolean isAuthorizedSchema(final BackendConnection 
backendConnection, final String schema) {
         Optional<ShardingSpherePrivilege> privilege = 
ProxyContext.getInstance().getMetaDataContexts().getAuthentication().findPrivilege(backendConnection.getGrantee());
-        // TODO : Need to check whether PrivilegeType.USAGE is correct or 
enough?
-        return privilege.isPresent() && privilege.get().hasPrivileges(schema, 
Collections.emptyList());
+        return privilege.isPresent() && privilege.get().hasPrivileges(schema);
     }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/auth/MySQLAuthenticationHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/auth/MySQLAuthenticationHandler.java
index 0e17d5c..511d430 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/auth/MySQLAuthenticationHandler.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/auth/MySQLAuthenticationHandler.java
@@ -22,14 +22,12 @@ import lombok.Getter;
 import org.apache.commons.codec.digest.DigestUtils;
 import 
org.apache.shardingsphere.db.protocol.mysql.constant.MySQLServerErrorCode;
 import 
org.apache.shardingsphere.db.protocol.mysql.packet.handshake.MySQLAuthPluginData;
-import 
org.apache.shardingsphere.infra.metadata.auth.model.privilege.PrivilegeType;
 import 
org.apache.shardingsphere.infra.metadata.auth.model.privilege.ShardingSpherePrivilege;
 import org.apache.shardingsphere.infra.metadata.auth.model.user.Grantee;
 import 
org.apache.shardingsphere.infra.metadata.auth.model.user.ShardingSphereUser;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Optional;
 
 /**
@@ -57,11 +55,10 @@ public final class MySQLAuthenticationHandler {
             return Optional.of(MySQLServerErrorCode.ER_ACCESS_DENIED_ERROR);
         }
         ShardingSpherePrivilege privilege = 
ProxyContext.getInstance().getMetaDataContexts().getAuthentication().getAuthentication().get(user.get());
-        // TODO : 
privilege.getDataPrivilege().getSpecificPrivileges().containsKey(database) is 
bound to be replaced with privilege.hasPrivileges(schema, xxx) (xxx means the 
privileges needed here)
-        if 
(!privilege.hasPrivileges(Collections.singletonList(PrivilegeType.SUPER)) && 
!privilege.getDatabasePrivilege().getSpecificPrivileges().containsKey(database))
 {
-            return Optional.of(MySQLServerErrorCode.ER_DBACCESS_DENIED_ERROR);
+        if (null != privilege && privilege.hasPrivileges(database)) {
+            return Optional.empty();
         }
-        return Optional.empty();
+        return Optional.of(MySQLServerErrorCode.ER_DBACCESS_DENIED_ERROR);
     }
     
     private boolean isPasswordRight(final String password, final byte[] 
authResponse) {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/admin/initdb/MySQLComInitDbExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/admin/initdb/MySQLComInitDbExecutor.java
index 3d8dba3..7ab414a 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/admin/initdb/MySQLComInitDbExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/admin/initdb/MySQLComInitDbExecutor.java
@@ -54,7 +54,6 @@ public final class MySQLComInitDbExecutor implements 
CommandExecutor {
     
     private boolean isAuthorizedSchema(final String schema) {
         Optional<ShardingSpherePrivilege> privilege = 
ProxyContext.getInstance().getMetaDataContexts().getAuthentication().findPrivilege(backendConnection.getGrantee());
-        // TODO : privilege.hasPrivileges(schema, xxx) (xxx means the 
privileges needed here), rather than Collections.emptyList()
-        return privilege.isPresent() && privilege.get().hasPrivileges(schema, 
Collections.emptyList());
+        return privilege.map(shardingSpherePrivilege -> 
shardingSpherePrivilege.hasPrivileges(schema)).orElse(false);
     }
 }

Reply via email to