This is an automated email from the ASF dual-hosted git repository.

kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 93bac916630 [enhancement](priv) Clarify ccr releated 
FrontendServiceImpl call privs (#25530) (#25779)
93bac916630 is described below

commit 93bac916630d4f34fae899c7dd2ade5a5a039368
Author: Jack Drogon <jack.xsuper...@gmail.com>
AuthorDate: Mon Oct 23 23:32:30 2023 +0800

    [enhancement](priv) Clarify ccr releated FrontendServiceImpl call privs 
(#25530) (#25779)
---
 .../apache/doris/service/FrontendServiceImpl.java  | 94 +++++++++++++---------
 1 file changed, 58 insertions(+), 36 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java 
b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
index 8db840b5bf3..791835bb7fa 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
@@ -493,7 +493,7 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
 
                     // index id -> index schema
                     Map<Long, LinkedList<Column>> indexSchemaMap = new 
HashMap<>();
-                    //index id -> index col_unique_id supplier
+                    // index id -> index col_unique_id supplier
                     Map<Long, IntSupplier> colUniqueIdSupplierMap = new 
HashMap<>();
                     for (Map.Entry<Long, List<Column>> entry : 
olapTable.getIndexIdToSchema(true).entrySet()) {
                         indexSchemaMap.put(entry.getKey(), new 
LinkedList<>(entry.getValue()));
@@ -512,13 +512,13 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
                         }
                         colUniqueIdSupplierMap.put(entry.getKey(), 
colUniqueIdSupplier);
                     }
-                    //4. call schame change function, only for dynamic table 
feature.
+                    // 4. call schame change function, only for dynamic table 
feature.
                     SchemaChangeHandler schemaChangeHandler = new 
SchemaChangeHandler();
 
                     boolean lightSchemaChange = 
schemaChangeHandler.processAddColumns(
                             addColumnsClause, olapTable, indexSchemaMap, true, 
colUniqueIdSupplierMap);
                     if (lightSchemaChange) {
-                        //for schema change add column optimize, direct modify 
table meta.
+                        // for schema change add column optimize, direct 
modify table meta.
                         List<Index> newIndexes = olapTable.getCopiedIndexes();
                         long jobId = Env.getCurrentEnv().getNextId();
                         
Env.getCurrentEnv().getSchemaChangeHandler().modifyTableLightSchemaChange(
@@ -530,7 +530,7 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
                     }
                 }
 
-                //5. build all columns
+                // 5. build all columns
                 for (Column column : olapTable.getBaseSchema()) {
                     allColumns.add(column.toThrift());
                 }
@@ -724,7 +724,7 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
         if (params.isSetPattern()) {
             try {
                 matcher = 
PatternMatcher.createMysqlPattern(params.getPattern(),
-                    CaseSensibility.TABLE.getCaseSensibility());
+                        CaseSensibility.TABLE.getCaseSensibility());
             } catch (PatternMatcherException e) {
                 throw new TException("Pattern is in bad format " + 
params.getPattern());
             }
@@ -1063,13 +1063,18 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
         return tableNames;
     }
 
-    private void checkPasswordAndPrivs(String cluster, String user, String 
passwd, String db, String tbl,
-                                       String clientIp, PrivPredicate 
predicate) throws AuthenticationException {
+    private void checkSingleTablePasswordAndPrivs(String cluster, String user, 
String passwd, String db, String tbl,
+            String clientIp, PrivPredicate predicate) throws 
AuthenticationException {
         checkPasswordAndPrivs(cluster, user, passwd, db, 
Lists.newArrayList(tbl), clientIp, predicate);
     }
 
+    private void checkDbPasswordAndPrivs(String cluster, String user, String 
passwd, String db, String clientIp,
+            PrivPredicate predicate) throws AuthenticationException {
+        checkPasswordAndPrivs(cluster, user, passwd, db, null, clientIp, 
predicate);
+    }
+
     private void checkPasswordAndPrivs(String cluster, String user, String 
passwd, String db, List<String> tables,
-                                       String clientIp, PrivPredicate 
predicate) throws AuthenticationException {
+            String clientIp, PrivPredicate predicate) throws 
AuthenticationException {
 
         final String fullUserName = ClusterNamespace.getFullName(cluster, 
user);
         final String fullDbName = ClusterNamespace.getFullName(cluster, db);
@@ -1077,10 +1082,20 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
         Env.getCurrentEnv().getAuth().checkPlainPassword(fullUserName, 
clientIp, passwd, currentUser);
 
         Preconditions.checkState(currentUser.size() == 1);
+        if (tables == null || tables.isEmpty()) {
+            if 
(!Env.getCurrentEnv().getAccessManager().checkDbPriv(currentUser.get(0), 
fullDbName, predicate)) {
+                throw new AuthenticationException(
+                        "Access denied; you need (at least one of) the (" + 
predicate.toString()
+                                + ") privilege(s) for this operation");
+            }
+            return;
+        }
+
         for (String tbl : tables) {
             if 
(!Env.getCurrentEnv().getAccessManager().checkTblPriv(currentUser.get(0), 
fullDbName, tbl, predicate)) {
                 throw new AuthenticationException(
-                        "Access denied; you need (at least one of) the LOAD 
privilege(s) for this operation");
+                        "Access denied; you need (at least one of) the (" + 
predicate.toString()
+                                + ") privilege(s) for this operation");
             }
         }
     }
@@ -1149,9 +1164,11 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
         if (Strings.isNullOrEmpty(cluster)) {
             cluster = SystemInfoService.DEFAULT_CLUSTER;
         }
-
-        if (Strings.isNullOrEmpty(request.getToken())) {
-            checkPasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(), request.getTbl(),
+        if (request.isSetAuthCode()) {
+            // TODO(cmy): find a way to check
+        } else if (Strings.isNullOrEmpty(request.getToken())) {
+            checkSingleTablePasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(),
+                    request.getTbl(),
                     request.getUserIp(), PrivPredicate.LOAD);
         }
 
@@ -1325,7 +1342,7 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
 
     private List<Table> queryLoadCommitTables(TLoadTxnCommitRequest request, 
Database db) throws UserException {
         List<String> tbNames;
-        //check has multi table
+        // check has multi table
         if (CollectionUtils.isNotEmpty(request.getTbls())) {
             tbNames = request.getTbls();
 
@@ -1337,7 +1354,7 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
             OlapTable table = (OlapTable) db.getTableOrMetaException(tbl, 
TableType.OLAP);
             tables.add(table);
         }
-        //if it has multi table, use multi table and update multi table 
running transaction table ids
+        // if it has multi table, use multi table and update multi table 
running transaction table ids
         if (CollectionUtils.isNotEmpty(request.getTbls())) {
             List<Long> multiTableIds = 
tables.stream().map(Table::getId).collect(Collectors.toList());
             
Env.getCurrentGlobalTransactionMgr().getDatabaseTransactionMgr(db.getId())
@@ -1361,11 +1378,12 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
             // refactoring it
             if (CollectionUtils.isNotEmpty(request.getTbls())) {
                 for (String tbl : request.getTbls()) {
-                    checkPasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(), tbl,
+                    checkSingleTablePasswordAndPrivs(cluster, 
request.getUser(), request.getPasswd(), request.getDb(),
+                            tbl,
                             request.getUserIp(), PrivPredicate.LOAD);
                 }
             } else {
-                checkPasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(),
+                checkSingleTablePasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(),
                         request.getTbl(),
                         request.getUserIp(), PrivPredicate.LOAD);
             }
@@ -1465,7 +1483,8 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
         }
         for (Table table : tableList) {
             // check auth
-            checkPasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(), table.getName(),
+            checkSingleTablePasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(),
+                    table.getName(),
                     request.getUserIp(), PrivPredicate.LOAD);
         }
 
@@ -1533,7 +1552,7 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
                 checkPasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(),
                         request.getTbls(), request.getUserIp(), 
PrivPredicate.LOAD);
             } else {
-                checkPasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(),
+                checkSingleTablePasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(),
                         request.getTbl(), request.getUserIp(), 
PrivPredicate.LOAD);
             }
         }
@@ -1718,14 +1737,15 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
         } else if (request.isSetToken()) {
             checkToken(request.getToken());
         } else {
-            //multi table load
+            // multi table load
             if (CollectionUtils.isNotEmpty(request.getTbls())) {
                 for (String tbl : request.getTbls()) {
-                    checkPasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(), tbl,
+                    checkSingleTablePasswordAndPrivs(cluster, 
request.getUser(), request.getPasswd(), request.getDb(),
+                            tbl,
                             request.getUserIp(), PrivPredicate.LOAD);
                 }
             } else {
-                checkPasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(),
+                checkSingleTablePasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(),
                         request.getTbl(),
                         request.getUserIp(), PrivPredicate.LOAD);
             }
@@ -2013,15 +2033,15 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
     }
 
     private TExecPlanFragmentParams 
generatePlanFragmentParams(TStreamLoadPutRequest request, Database db,
-                                                               String 
fullDbName, OlapTable table,
-                                                               long timeoutMs) 
throws UserException {
+            String fullDbName, OlapTable table,
+            long timeoutMs) throws UserException {
         return generatePlanFragmentParams(request, db, fullDbName, table, 
timeoutMs, 1, false);
     }
 
     private TExecPlanFragmentParams 
generatePlanFragmentParams(TStreamLoadPutRequest request, Database db,
-                                                               String 
fullDbName, OlapTable table,
-                                                               long timeoutMs, 
int multiTableFragmentInstanceIdIndex,
-                                                               boolean 
isMultiTableRequest)
+            String fullDbName, OlapTable table,
+            long timeoutMs, int multiTableFragmentInstanceIdIndex,
+            boolean isMultiTableRequest)
             throws UserException {
         if (!table.tryReadLock(timeoutMs, TimeUnit.MILLISECONDS)) {
             throw new UserException(
@@ -2070,10 +2090,10 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
     }
 
     private TPipelineFragmentParams 
generatePipelineStreamLoadPut(TStreamLoadPutRequest request, Database db,
-                                                                  String 
fullDbName, OlapTable table,
-                                                                  long 
timeoutMs,
-                                                                  int 
multiTableFragmentInstanceIdIndex,
-                                                                  boolean 
isMultiTableRequest)
+            String fullDbName, OlapTable table,
+            long timeoutMs,
+            int multiTableFragmentInstanceIdIndex,
+            boolean isMultiTableRequest)
             throws UserException {
         if (db == null) {
             String dbName = fullDbName;
@@ -2584,7 +2604,8 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
             cluster = SystemInfoService.DEFAULT_CLUSTER;
         }
         if (Strings.isNullOrEmpty(request.getToken())) {
-            checkPasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(), request.getTable(),
+            checkSingleTablePasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(),
+                    request.getTable(),
                     request.getUserIp(), PrivPredicate.SELECT);
         }
 
@@ -2705,8 +2726,8 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
                 request.getUser(), request.getDb(), request.getLabelName(), 
request.getSnapshotName(),
                 request.getSnapshotType());
         if (Strings.isNullOrEmpty(request.getToken())) {
-            checkPasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(),
-                    request.getTable(), clientIp, PrivPredicate.LOAD);
+            checkSingleTablePasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(),
+                    request.getTable(), clientIp, PrivPredicate.SELECT);
         }
 
         // Step 3: get snapshot
@@ -2793,8 +2814,8 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
         }
 
         if (Strings.isNullOrEmpty(request.getToken())) {
-            checkPasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(),
-                    request.getTable(), clientIp, PrivPredicate.LOAD);
+            checkDbPasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(), clientIp,
+                    PrivPredicate.LOAD);
         }
 
         // Step 3: get snapshot
@@ -2927,7 +2948,8 @@ public class FrontendServiceImpl implements 
FrontendService.Iface {
             cluster = SystemInfoService.DEFAULT_CLUSTER;
         }
         if (Strings.isNullOrEmpty(request.getToken())) {
-            checkPasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(), request.getTable(),
+            checkSingleTablePasswordAndPrivs(cluster, request.getUser(), 
request.getPasswd(), request.getDb(),
+                    request.getTable(),
                     request.getUserIp(), PrivPredicate.SELECT);
         }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to