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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]