Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3762,6 +3762,14 @@ public static int metaServiceRpcRetryTimes() {
@ConfField(mutable = true)
public static long cloud_auto_snapshot_min_interval_seconds = 3600;

@ConfField(mutable = true, description = {
"cluster snapshot 相关操作的最低权限要求。可选值:'root'(仅 root 用户可执行)或 'admin'(ADMIN 权限用户可执行)。默认值为 'root'。",
"The minimum privilege required for cluster snapshot operations. "
+ "Valid values: 'root' (only root user can execute)"
+ " or 'admin' (users with ADMIN privilege can execute). "
+ "Default is 'root'."})
public static String cluster_snapshot_min_privilege = "root";

@ConfField(mutable = true)
public static long multi_part_upload_part_size_in_bytes = 256 * 1024 * 1024L; // 256MB
@ConfField(mutable = true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,13 @@

package org.apache.doris.nereids.rules.analysis;

import org.apache.doris.analysis.UserIdentity;
import org.apache.doris.catalog.DatabaseIf;
import org.apache.doris.catalog.Env;
import org.apache.doris.catalog.InfoSchemaDb;
import org.apache.doris.catalog.TableIf;
import org.apache.doris.cluster.ClusterNamespace;
import org.apache.doris.common.Config;
import org.apache.doris.common.ErrorCode;
import org.apache.doris.common.ErrorReport;
import org.apache.doris.common.UserException;
Expand Down Expand Up @@ -47,11 +52,34 @@ public static void checkPermission(TableIf table, ConnectContext connectContext,
}
String tableName = table.getName();
DatabaseIf db = table.getDatabase();
// when table instanceof FunctionGenTable,db will be null
// when table instanceof FunctionGenTable, db will be null
if (db == null) {
return;
}
String dbName = db.getFullName();
String dbName = ClusterNamespace.getNameFromFullName(db.getFullName());

// Special handling: cluster snapshot related tables in information_schema
// require privilege based on configuration
if (dbName.equalsIgnoreCase(InfoSchemaDb.DATABASE_NAME)
&& (tableName.equalsIgnoreCase("cluster_snapshots")
|| tableName.equalsIgnoreCase("cluster_snapshot_properties"))) {
if ("admin".equalsIgnoreCase(Config.cluster_snapshot_min_privilege)) {
// When configured as admin, check ADMIN privilege
if (!Env.getCurrentEnv().getAccessManager().checkGlobalPriv(connectContext, PrivPredicate.ADMIN)) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR,
PrivPredicate.ADMIN.getPrivs().toString());
}
} else {
// Default or configured as root, check if user is root
UserIdentity currentUser = connectContext.getCurrentUserIdentity();
if (currentUser == null || !currentUser.isRootUser()) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR,
"root privilege");
}
}
return; // privilege check passed, allow access
}

CatalogIf catalog = db.getCatalog();
if (catalog == null) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package org.apache.doris.nereids.trees.plans.commands;

import org.apache.doris.analysis.StmtType;
import org.apache.doris.analysis.UserIdentity;
import org.apache.doris.catalog.Env;
import org.apache.doris.cloud.catalog.CloudEnv;
import org.apache.doris.cloud.snapshot.CloudSnapshotHandler;
Expand Down Expand Up @@ -73,9 +74,20 @@ public void validate(ConnectContext ctx) throws AnalysisException {
if (!Config.isCloudMode()) {
throw new AnalysisException("The sql is illegal in disk mode ");
}
if (!Env.getCurrentEnv().getAccessManager().checkGlobalPriv(ctx, PrivPredicate.ADMIN)) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR,
PrivPredicate.ADMIN.getPrivs().toString());
// Check privilege based on configuration
if ("admin".equalsIgnoreCase(Config.cluster_snapshot_min_privilege)) {
// When configured as admin, check ADMIN privilege
if (!Env.getCurrentEnv().getAccessManager().checkGlobalPriv(ctx, PrivPredicate.ADMIN)) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR,
PrivPredicate.ADMIN.getPrivs().toString());
}
} else {
// Default or configured as root, check if user is root
UserIdentity currentUser = ctx.getCurrentUserIdentity();
if (currentUser == null || !currentUser.isRootUser()) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR,
"root privilege");
}
}

for (Map.Entry<String, String> entry : properties.entrySet()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package org.apache.doris.nereids.trees.plans.commands;

import org.apache.doris.analysis.StmtType;
import org.apache.doris.analysis.UserIdentity;
import org.apache.doris.catalog.Env;
import org.apache.doris.cloud.proto.Cloud;
import org.apache.doris.cloud.rpc.MetaServiceProxy;
Expand Down Expand Up @@ -70,9 +71,20 @@ public void validate(ConnectContext ctx) throws AnalysisException {
if (!Config.isCloudMode()) {
throw new AnalysisException("The sql is illegal in disk mode ");
}
if (!Env.getCurrentEnv().getAccessManager().checkGlobalPriv(ctx, PrivPredicate.ADMIN)) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR,
PrivPredicate.ADMIN.getPrivs().toString());
// Check privilege based on configuration
if ("admin".equalsIgnoreCase(Config.cluster_snapshot_min_privilege)) {
// When configured as admin, check ADMIN privilege
if (!Env.getCurrentEnv().getAccessManager().checkGlobalPriv(ctx, PrivPredicate.ADMIN)) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR,
PrivPredicate.ADMIN.getPrivs().toString());
}
} else {
// Default or configured as root, check if user is root
UserIdentity currentUser = ctx.getCurrentUserIdentity();
if (currentUser == null || !currentUser.isRootUser()) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR,
"root privilege");
}
}

if (key == null || !key.equalsIgnoreCase(SNAPSHOT_ID)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package org.apache.doris.nereids.trees.plans.commands;

import org.apache.doris.analysis.StmtType;
import org.apache.doris.analysis.UserIdentity;
import org.apache.doris.catalog.Env;
import org.apache.doris.cloud.catalog.CloudEnv;
import org.apache.doris.cloud.proto.Cloud;
Expand Down Expand Up @@ -92,9 +93,20 @@ public void validate(ConnectContext ctx) throws AnalysisException {
if (!Config.isCloudMode()) {
throw new AnalysisException("The sql is illegal in disk mode ");
}
if (!Env.getCurrentEnv().getAccessManager().checkGlobalPriv(ctx, PrivPredicate.ADMIN)) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR,
PrivPredicate.ADMIN.getPrivs().toString());
// Check privilege based on configuration
if ("admin".equalsIgnoreCase(Config.cluster_snapshot_min_privilege)) {
// When configured as admin, check ADMIN privilege
if (!Env.getCurrentEnv().getAccessManager().checkGlobalPriv(ctx, PrivPredicate.ADMIN)) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR,
PrivPredicate.ADMIN.getPrivs().toString());
}
} else {
// Default or configured as root, check if user is root
UserIdentity currentUser = ctx.getCurrentUserIdentity();
if (currentUser == null || !currentUser.isRootUser()) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR,
"root privilege");
}
}

if (properties.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package org.apache.doris.nereids.trees.plans.commands;

import org.apache.doris.analysis.StmtType;
import org.apache.doris.analysis.UserIdentity;
import org.apache.doris.catalog.Env;
import org.apache.doris.cloud.catalog.CloudEnv;
import org.apache.doris.cloud.proto.Cloud;
Expand Down Expand Up @@ -73,9 +74,20 @@ public void validate(ConnectContext ctx) throws AnalysisException {
if (!Config.isCloudMode()) {
throw new AnalysisException("The sql is illegal in disk mode ");
}
if (!Env.getCurrentEnv().getAccessManager().checkGlobalPriv(ctx, PrivPredicate.ADMIN)) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR,
PrivPredicate.ADMIN.getPrivs().toString());
// Check privilege based on configuration
if ("admin".equalsIgnoreCase(Config.cluster_snapshot_min_privilege)) {
// When configured as admin, check ADMIN privilege
if (!Env.getCurrentEnv().getAccessManager().checkGlobalPriv(ctx, PrivPredicate.ADMIN)) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR,
PrivPredicate.ADMIN.getPrivs().toString());
}
} else {
// Default or configured as root, check if user is root
UserIdentity currentUser = ctx.getCurrentUserIdentity();
if (currentUser == null || !currentUser.isRootUser()) {
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR,
"root privilege");
}
}
}

Expand Down
Loading
Loading