This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 47dba440d0 Revert "[feature-wip](multi-catalog) add CatalogPrivTable to support unified authority management of datalake (#10246)" (#10297) 47dba440d0 is described below commit 47dba440d0c9139fcfe543a4c7c345b3a708f60c Author: Mingyu Chen <morningman....@gmail.com> AuthorDate: Tue Jun 21 15:55:15 2022 +0800 Revert "[feature-wip](multi-catalog) add CatalogPrivTable to support unified authority management of datalake (#10246)" (#10297) This reverts commit 41cb4c8f9cf1b58fb33a1e46d2b7db803a15a59f. --- .../org/apache/doris/common/FeMetaVersion.java | 4 +- .../java/org/apache/doris/analysis/Analyzer.java | 4 - .../java/org/apache/doris/analysis/GrantStmt.java | 4 +- .../java/org/apache/doris/analysis/RevokeStmt.java | 2 +- .../org/apache/doris/analysis/ShowRolesStmt.java | 1 - .../java/org/apache/doris/analysis/TableName.java | 79 +++------ .../org/apache/doris/analysis/TablePattern.java | 91 +++------- .../org/apache/doris/common/CaseSensibility.java | 1 - .../java/org/apache/doris/common/ErrorCode.java | 2 +- .../java/org/apache/doris/common/FeNameFormat.java | 8 - .../org/apache/doris/common/proc/AuthProcDir.java | 4 +- .../doris/mysql/privilege/CatalogPrivEntry.java | 136 --------------- .../doris/mysql/privilege/CatalogPrivTable.java | 73 -------- .../apache/doris/mysql/privilege/DbPrivEntry.java | 52 +++--- .../apache/doris/mysql/privilege/DbPrivTable.java | 31 +++- .../org/apache/doris/mysql/privilege/PaloAuth.java | 188 +++++---------------- .../apache/doris/mysql/privilege/PrivEntry.java | 16 -- .../apache/doris/mysql/privilege/PrivTable.java | 21 --- .../apache/doris/mysql/privilege/RoleManager.java | 78 ++++++--- .../doris/mysql/privilege/TablePrivEntry.java | 60 ++++--- .../doris/mysql/privilege/TablePrivTable.java | 37 ++-- .../doris/mysql/privilege/UserPrivTable.java | 52 +++--- .../java/org/apache/doris/qe/ConnectContext.java | 11 -- .../org/apache/doris/mysql/privilege/AuthTest.java | 7 +- .../doris/mysql/privilege/PrivEntryTest.java | 6 +- 25 files changed, 291 insertions(+), 677 deletions(-) diff --git a/fe/fe-common/src/main/java/org/apache/doris/common/FeMetaVersion.java b/fe/fe-common/src/main/java/org/apache/doris/common/FeMetaVersion.java index 1a5d6da4ce..70cacd7a1c 100644 --- a/fe/fe-common/src/main/java/org/apache/doris/common/FeMetaVersion.java +++ b/fe/fe-common/src/main/java/org/apache/doris/common/FeMetaVersion.java @@ -40,10 +40,8 @@ public final class FeMetaVersion { public static final int VERSION_109 = 109; // For routine load user info public static final int VERSION_110 = 110; - // add catalog PrivTable in PaloAuth to support unified privilege management - public static final int VERSION_111 = 111; // note: when increment meta version, should assign the latest version to VERSION_CURRENT - public static final int VERSION_CURRENT = VERSION_111; + public static final int VERSION_CURRENT = VERSION_110; // all logs meta version should >= the minimum version, so that we could remove many if clause, for example // if (FE_METAVERSION < VERSION_94) ... diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java index 8b35987710..997891253f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java @@ -1935,10 +1935,6 @@ public class Analyzer { return globalState.context.getConnectionId(); } - public String getDefaultCatalog() { - return globalState.context.getDefaultCatalog(); - } - public String getDefaultDb() { return globalState.context.getDatabase(); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/GrantStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/GrantStmt.java index 4ad8fe8073..4e849e7c61 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/GrantStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/GrantStmt.java @@ -107,7 +107,7 @@ public class GrantStmt extends DdlStmt { } if (tblPattern != null) { - tblPattern.analyze(analyzer); + tblPattern.analyze(analyzer.getClusterName()); } else { // TODO(wyb): spark-load if (!Config.enable_spark_load) { @@ -148,7 +148,7 @@ public class GrantStmt extends DdlStmt { // Rule 1 if (tblPattern.getPrivLevel() != PrivLevel.GLOBAL && (privileges.contains(PaloPrivilege.ADMIN_PRIV) || privileges.contains(PaloPrivilege.NODE_PRIV))) { - throw new AnalysisException("ADMIN_PRIV and NODE_PRIV can only be granted on *.*.*"); + throw new AnalysisException("ADMIN_PRIV and NODE_PRIV can only be granted on *.*"); } // Rule 2 diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/RevokeStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/RevokeStmt.java index 98b36b4968..c84f490ddf 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/RevokeStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/RevokeStmt.java @@ -97,7 +97,7 @@ public class RevokeStmt extends DdlStmt { } if (tblPattern != null) { - tblPattern.analyze(analyzer); + tblPattern.analyze(analyzer.getClusterName()); } else { // TODO(wyb): spark-load if (!Config.enable_spark_load) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowRolesStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowRolesStmt.java index 4e8c96e2b9..47b9bacda2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowRolesStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowRolesStmt.java @@ -36,7 +36,6 @@ public class ShowRolesStmt extends ShowStmt { builder.addColumn(new Column("Name", ScalarType.createVarchar(100))); builder.addColumn(new Column("Users", ScalarType.createVarchar(100))); builder.addColumn(new Column("GlobalPrivs", ScalarType.createVarchar(300))); - builder.addColumn(new Column("CatalogPrivs", ScalarType.createVarchar(300))); builder.addColumn(new Column("DatabasePrivs", ScalarType.createVarchar(300))); builder.addColumn(new Column("TablePrivs", ScalarType.createVarchar(300))); builder.addColumn(new Column("ResourcePrivs", ScalarType.createVarchar(300))); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/TableName.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/TableName.java index ff1bb7bc09..047d518e16 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/TableName.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/TableName.java @@ -25,54 +25,32 @@ import org.apache.doris.cluster.ClusterNamespace; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.ErrorCode; import org.apache.doris.common.ErrorReport; -import org.apache.doris.common.FeMetaVersion; import org.apache.doris.common.io.Text; import org.apache.doris.common.io.Writable; -import org.apache.doris.datasource.InternalDataSource; -import org.apache.doris.persist.gson.GsonUtils; import com.google.common.base.Strings; -import com.google.gson.annotations.SerializedName; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; -import java.util.Objects; -import java.util.stream.Collectors; -import java.util.stream.Stream; public class TableName implements Writable { - @SerializedName(value = "ctl") - private String ctl; - @SerializedName(value = "tbl") private String tbl; - @SerializedName(value = "db") private String db; public TableName() { } - public TableName(String ctl, String db, String tbl) { + public TableName(String db, String tbl) { if (Catalog.isStoredTableNamesLowerCase() && !Strings.isNullOrEmpty(tbl)) { tbl = tbl.toLowerCase(); } - this.ctl = ctl; this.db = db; this.tbl = tbl; } - /** - * Initialize catalog in analyze. - */ - public TableName(String db, String tbl) { - this(null, db, tbl); - } - public void analyze(Analyzer analyzer) throws AnalysisException { - if (Strings.isNullOrEmpty(ctl)) { - ctl = analyzer.getDefaultCatalog(); - } if (Strings.isNullOrEmpty(db)) { db = analyzer.getDefaultDb(); if (Strings.isNullOrEmpty(db)) { @@ -90,14 +68,6 @@ public class TableName implements Writable { } } - public String getCtl() { - return ctl; - } - - public void setCtl(String ctl) { - this.ctl = ctl; - } - public String getDb() { return db; } @@ -115,22 +85,33 @@ public class TableName implements Writable { } /** - * Returns true if this name has a non-empty catalog and a non-empty database field - * and a non-empty table name. + * Returns true if this name has a non-empty database field and a non-empty + * table name. */ public boolean isFullyQualified() { - return ctl != null && !ctl.isEmpty() && db != null && !db.isEmpty() && !tbl.isEmpty(); + return db != null && !db.isEmpty() && !tbl.isEmpty(); } public String getNoClusterString() { - return Stream.of(ctl, ClusterNamespace.getNameFromFullName(db), tbl) - .filter(Objects::nonNull) - .collect(Collectors.joining(".")); + if (db == null) { + return tbl; + } else { + String dbName = ClusterNamespace.getNameFromFullName(db); + if (dbName == null) { + return db + "." + tbl; + } else { + return dbName + "." + tbl; + } + } } @Override public String toString() { - return Stream.of(ctl, db, tbl).filter(Objects::nonNull).collect(Collectors.joining(".")); + if (db == null) { + return tbl; + } else { + return db + "." + tbl; + } } @Override @@ -146,9 +127,6 @@ public class TableName implements Writable { public String toSql() { StringBuilder stringBuilder = new StringBuilder(); - if (ctl != null) { - stringBuilder.append("`").append(ctl).append("`."); - } if (db != null) { stringBuilder.append("`").append(db).append("`."); } @@ -158,24 +136,17 @@ public class TableName implements Writable { @Override public void write(DataOutput out) throws IOException { - String json = GsonUtils.GSON.toJson(this); - Text.writeString(out, json); + Text.writeString(out, db); + Text.writeString(out, tbl); } public void readFields(DataInput in) throws IOException { - if (Catalog.getCurrentCatalogJournalVersion() >= FeMetaVersion.VERSION_111) { - TableName fromJson = GsonUtils.GSON.fromJson(Text.readString(in), TableName.class); - ctl = fromJson.ctl; - db = fromJson.db; - tbl = fromJson.tbl; - } else { - ctl = InternalDataSource.INTERNAL_DS_NAME; - db = Text.readString(in); - tbl = Text.readString(in); - } + db = Text.readString(in); + tbl = Text.readString(in); } public TableName cloneWithoutAnalyze() { - return new TableName(this.ctl, this.db, this.tbl); + TableName tableName = new TableName(this.db, this.tbl); + return tableName; } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/TablePattern.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/TablePattern.java index 7d1287dd48..6f6a3d393a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/TablePattern.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/TablePattern.java @@ -17,43 +17,33 @@ package org.apache.doris.analysis; -import org.apache.doris.catalog.Catalog; import org.apache.doris.cluster.ClusterNamespace; import org.apache.doris.common.AnalysisException; -import org.apache.doris.common.FeMetaVersion; import org.apache.doris.common.FeNameFormat; import org.apache.doris.common.io.Text; import org.apache.doris.common.io.Writable; -import org.apache.doris.datasource.InternalDataSource; import org.apache.doris.mysql.privilege.PaloAuth.PrivLevel; -import org.apache.doris.persist.gson.GsonUtils; import com.google.common.base.Preconditions; import com.google.common.base.Strings; -import com.google.gson.annotations.SerializedName; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; -/** - * Three-segment-format: catalog.database.table. If the lower segment is specific, - * the higher segment can't be a wildcard. The following examples are not allowed: - * "ctl1.*.table1", "*.*.table2", "*.db1.*", ... - */ +// only the following 3 formats are allowed +// db.tbl +// *.* +// db.* public class TablePattern implements Writable { - @SerializedName(value = "ctl") - private String ctl; - @SerializedName(value = "db") private String db; - @SerializedName(value = "tbl") private String tbl; boolean isAnalyzed = false; public static TablePattern ALL; static { - ALL = new TablePattern("*", "*", "*"); + ALL = new TablePattern("*", "*"); try { ALL.analyze(""); } catch (AnalysisException e) { @@ -64,23 +54,11 @@ public class TablePattern implements Writable { private TablePattern() { } - public TablePattern(String ctl, String db, String tbl) { - this.ctl = Strings.isNullOrEmpty(ctl) ? "*" : ctl; - this.db = Strings.isNullOrEmpty(db) ? "*" : db; - this.tbl = Strings.isNullOrEmpty(tbl) ? "*" : tbl; - } - public TablePattern(String db, String tbl) { - this.ctl = null; this.db = Strings.isNullOrEmpty(db) ? "*" : db; this.tbl = Strings.isNullOrEmpty(tbl) ? "*" : tbl; } - public String getQualifiedCtl() { - Preconditions.checkState(isAnalyzed); - return ctl; - } - public String getQualifiedDb() { Preconditions.checkState(isAnalyzed); return db; @@ -92,39 +70,23 @@ public class TablePattern implements Writable { public PrivLevel getPrivLevel() { Preconditions.checkState(isAnalyzed); - if (ctl.equals("*")) { + if (db.equals("*")) { return PrivLevel.GLOBAL; - } else if (db.equals("*")) { - return PrivLevel.CATALOG; - } else if (tbl.equals("*")) { - return PrivLevel.DATABASE; - } else { + } else if (!tbl.equals("*")) { return PrivLevel.TABLE; - } - } - - public void analyze(Analyzer analyzer) throws AnalysisException { - if (ctl == null) { - analyze(analyzer.getDefaultCatalog(), analyzer.getClusterName()); } else { - analyze(analyzer.getClusterName()); + return PrivLevel.DATABASE; } } - private void analyze(String catalogName, String clusterName) throws AnalysisException { + public void analyze(String clusterName) throws AnalysisException { if (isAnalyzed) { return; } - this.ctl = Strings.isNullOrEmpty(catalogName) ? InternalDataSource.INTERNAL_DS_NAME : catalogName; - if ((!tbl.equals("*") && (db.equals("*") || ctl.equals("*"))) - || (!db.equals("*") && ctl.equals("*"))) { + if (db.equals("*") && !tbl.equals("*")) { throw new AnalysisException("Do not support format: " + toString()); } - if (!ctl.equals("*")) { - FeNameFormat.checkCatalogName(ctl); - } - if (!db.equals("*")) { FeNameFormat.checkDbName(db); db = ClusterNamespace.getFullName(clusterName, db); @@ -136,21 +98,9 @@ public class TablePattern implements Writable { isAnalyzed = true; } - public void analyze(String clusterName) throws AnalysisException { - analyze(ctl, clusterName); - } - public static TablePattern read(DataInput in) throws IOException { - TablePattern tablePattern; - if (Catalog.getCurrentCatalogJournalVersion() >= FeMetaVersion.VERSION_111) { - tablePattern = GsonUtils.GSON.fromJson(Text.readString(in), TablePattern.class); - } else { - String ctl = InternalDataSource.INTERNAL_DS_NAME; - String db = Text.readString(in); - String tbl = Text.readString(in); - tablePattern = new TablePattern(ctl, db, tbl); - } - tablePattern.isAnalyzed = true; + TablePattern tablePattern = new TablePattern(); + tablePattern.readFields(in); return tablePattern; } @@ -160,13 +110,12 @@ public class TablePattern implements Writable { return false; } TablePattern other = (TablePattern) obj; - return ctl.equals(other.getQualifiedCtl()) && db.equals(other.getQualifiedDb()) && tbl.equals(other.getTbl()); + return db.equals(other.getQualifiedDb()) && tbl.equals(other.getTbl()); } @Override public int hashCode() { int result = 17; - result = 31 * result + ctl.hashCode(); result = 31 * result + db.hashCode(); result = 31 * result + tbl.hashCode(); return result; @@ -174,13 +123,21 @@ public class TablePattern implements Writable { @Override public String toString() { - return String.format("%s.%s.%s", ctl, db, tbl); + StringBuilder sb = new StringBuilder(); + sb.append(db).append(".").append(tbl); + return sb.toString(); } @Override public void write(DataOutput out) throws IOException { Preconditions.checkState(isAnalyzed); - String json = GsonUtils.GSON.toJson(this); - Text.writeString(out, json); + Text.writeString(out, db); + Text.writeString(out, tbl); + } + + public void readFields(DataInput in) throws IOException { + db = Text.readString(in); + tbl = Text.readString(in); + isAnalyzed = true; } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/CaseSensibility.java b/fe/fe-core/src/main/java/org/apache/doris/common/CaseSensibility.java index 6d5da6e65f..651581a3c6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/CaseSensibility.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/CaseSensibility.java @@ -22,7 +22,6 @@ package org.apache.doris.common; **/ public enum CaseSensibility { CLUSTER(true), - CATALOG(true), DATABASE(true), TABLE(true), ROLLUP(true), diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/ErrorCode.java b/fe/fe-core/src/main/java/org/apache/doris/common/ErrorCode.java index a8f73b9773..35dedadc30 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/ErrorCode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/ErrorCode.java @@ -1686,7 +1686,7 @@ public enum ErrorCode { + "Use `SHOW PARTITIONS FROM %s` to see the currently partitions of this table. "), ERROR_SQL_AND_LIMITATIONS_SET_IN_ONE_RULE(5084, new byte[]{'4', '2', '0', '0', '0'}, "sql/sqlHash and partition_num/tablet_num/cardinality cannot be set in one rule."), - ERR_WRONG_CATALOG_NAME(5085, new byte[]{'4', '2', '0', '0', '0'}, "Incorrect catalog name '%s'"); + ; // This is error code private final int code; diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/FeNameFormat.java b/fe/fe-core/src/main/java/org/apache/doris/common/FeNameFormat.java index ea12ba5758..1f3db6a4a6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/FeNameFormat.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/FeNameFormat.java @@ -18,7 +18,6 @@ package org.apache.doris.common; import org.apache.doris.alter.SchemaChangeHandler; -import org.apache.doris.datasource.InternalDataSource; import org.apache.doris.mysql.privilege.PaloRole; import org.apache.doris.system.SystemInfoService; @@ -43,13 +42,6 @@ public class FeNameFormat { } } - public static void checkCatalogName(String catalogName) throws AnalysisException { - if (!InternalDataSource.INTERNAL_DS_NAME.equals(catalogName) - && (Strings.isNullOrEmpty(catalogName) || !catalogName.matches(COMMON_NAME_REGEX))) { - ErrorReport.reportAnalysisException(ErrorCode.ERR_WRONG_CATALOG_NAME, catalogName); - } - } - public static void checkDbName(String dbName) throws AnalysisException { if (Strings.isNullOrEmpty(dbName) || !dbName.matches(COMMON_NAME_REGEX)) { ErrorReport.reportAnalysisException(ErrorCode.ERR_WRONG_DB_NAME, dbName); diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/proc/AuthProcDir.java b/fe/fe-core/src/main/java/org/apache/doris/common/proc/AuthProcDir.java index 6f11b4dd4e..33e3b2854c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/proc/AuthProcDir.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/proc/AuthProcDir.java @@ -31,8 +31,8 @@ import com.google.common.collect.ImmutableList; */ public class AuthProcDir implements ProcDirInterface { public static final ImmutableList<String> TITLE_NAMES = new ImmutableList.Builder<String>() - .add("UserIdentity").add("Password").add("GlobalPrivs").add("CatalogPrivs") - .add("DatabasePrivs").add("TablePrivs").add("ResourcePrivs").build(); + .add("UserIdentity").add("Password").add("GlobalPrivs").add("DatabasePrivs") + .add("TablePrivs").add("ResourcePrivs").build(); private PaloAuth auth; diff --git a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/CatalogPrivEntry.java b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/CatalogPrivEntry.java deleted file mode 100644 index 855c67e14c..0000000000 --- a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/CatalogPrivEntry.java +++ /dev/null @@ -1,136 +0,0 @@ -// 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.doris.mysql.privilege; - -import org.apache.doris.common.AnalysisException; -import org.apache.doris.common.CaseSensibility; -import org.apache.doris.common.PatternMatcher; -import org.apache.doris.common.io.Text; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; - -public class CatalogPrivEntry extends PrivEntry { - protected static final String ANY_CTL = "*"; - - protected PatternMatcher ctlPattern; - protected String origCtl; - protected boolean isAnyCtl; - - protected CatalogPrivEntry() { - } - - protected CatalogPrivEntry(PatternMatcher userPattern, String user, - PatternMatcher hostPattern, String origHost, - PatternMatcher ctlPattern, String origCtl, - boolean isDomain, PrivBitSet privSet) { - super(hostPattern, origHost, userPattern, user, isDomain, privSet); - this.ctlPattern = ctlPattern; - this.origCtl = origCtl; - if (origCtl.equals(ANY_CTL)) { - isAnyCtl = true; - } - } - - public static CatalogPrivEntry create(String user, String host, String ctl, boolean isDomain, PrivBitSet privs) - throws AnalysisException { - PatternMatcher hostPattern = PatternMatcher.createMysqlPattern(host, CaseSensibility.HOST.getCaseSensibility()); - - PatternMatcher ctlPattern = createCtlPatternMatcher(ctl); - - PatternMatcher userPattern = PatternMatcher.createFlatPattern(user, CaseSensibility.USER.getCaseSensibility()); - - if (privs.containsNodePriv() || privs.containsResourcePriv()) { - throw new AnalysisException("Datasource privilege can not contains node or resource privileges: " + privs); - } - - return new CatalogPrivEntry(userPattern, user, hostPattern, host, ctlPattern, ctl, isDomain, privs); - } - - private static PatternMatcher createCtlPatternMatcher(String ctl) throws AnalysisException { - boolean ctlCaseSensibility = CaseSensibility.CATALOG.getCaseSensibility(); - return PatternMatcher.createFlatPattern(ctl, ctlCaseSensibility, ctl.equals(ANY_CTL)); - } - - public PatternMatcher getCtlPattern() { - return ctlPattern; - } - - public String getOrigCtl() { - return origCtl; - } - - public boolean isAnyCtl() { - return isAnyCtl; - } - - @Override - public int compareTo(PrivEntry other) { - if (!(other instanceof CatalogPrivEntry)) { - throw new ClassCastException("cannot cast " + other.getClass().toString() + " to " + this.getClass()); - } - - CatalogPrivEntry otherEntry = (CatalogPrivEntry) other; - return compareAssist(origUser, otherEntry.origUser, - origHost, otherEntry.origHost, - origCtl, otherEntry.origCtl); - } - - @Override - public boolean keyMatch(PrivEntry other) { - if (!(other instanceof CatalogPrivEntry)) { - return false; - } - - CatalogPrivEntry otherEntry = (CatalogPrivEntry) other; - return origUser.equals(otherEntry.origUser) && origHost.equals(otherEntry.origHost) - && origCtl.equals(otherEntry.origCtl) && isDomain == otherEntry.isDomain; - } - - @Override - public String toString() { - return String.format("catalog privilege. user: %s, host: %s, ctl: %s, priv: %s, set by resolver: %b", - origUser, origHost, origCtl, privSet.toString(), isSetByDomainResolver); - } - - @Override - public void write(DataOutput out) throws IOException { - if (!isClassNameWrote) { - String className = CatalogPrivEntry.class.getCanonicalName(); - Text.writeString(out, className); - isClassNameWrote = true; - } - super.write(out); - Text.writeString(out, origCtl); - isClassNameWrote = false; - } - - public void readFields(DataInput in) throws IOException { - super.readFields(in); - - origCtl = Text.readString(in); - try { - ctlPattern = createCtlPatternMatcher(origCtl); - } catch (AnalysisException e) { - throw new IOException(e); - } - isAnyCtl = origCtl.equals(ANY_CTL); - } - -} diff --git a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/CatalogPrivTable.java b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/CatalogPrivTable.java deleted file mode 100644 index a1febfbf37..0000000000 --- a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/CatalogPrivTable.java +++ /dev/null @@ -1,73 +0,0 @@ -// 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.doris.mysql.privilege; - -import org.apache.doris.analysis.UserIdentity; -import org.apache.doris.common.io.Text; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.io.DataOutput; -import java.io.IOException; - -/* - * CatalogPrivTable saves all catalog level privs - */ -public class CatalogPrivTable extends PrivTable { - private static final Logger LOG = LogManager.getLogger(CatalogPrivTable.class); - - /* - * Return first priv which match the user@host on ctl.* The returned priv will be - * saved in 'savedPrivs'. - */ - public void getPrivs(UserIdentity currentUser, String ctl, PrivBitSet savedPrivs) { - CatalogPrivEntry matchedEntry = null; - for (PrivEntry entry : entries) { - CatalogPrivEntry dsPrivEntry = (CatalogPrivEntry) entry; - - if (!dsPrivEntry.match(currentUser, true)) { - continue; - } - - // check catalog - if (!dsPrivEntry.isAnyCtl() && !dsPrivEntry.getCtlPattern().match(ctl)) { - continue; - } - - matchedEntry = dsPrivEntry; - break; - } - if (matchedEntry == null) { - return; - } - - savedPrivs.or(matchedEntry.getPrivSet()); - } - - @Override - public void write(DataOutput out) throws IOException { - if (!isClassNameWrote) { - String className = CatalogPrivTable.class.getCanonicalName(); - Text.writeString(out, className); - isClassNameWrote = true; - } - - super.write(out); - } -} diff --git a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/DbPrivEntry.java b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/DbPrivEntry.java index 826bbe2a98..a8f1337df7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/DbPrivEntry.java +++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/DbPrivEntry.java @@ -28,7 +28,7 @@ import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; -public class DbPrivEntry extends CatalogPrivEntry { +public class DbPrivEntry extends PrivEntry { protected static final String ANY_DB = "*"; protected PatternMatcher dbPattern; @@ -38,12 +38,9 @@ public class DbPrivEntry extends CatalogPrivEntry { protected DbPrivEntry() { } - protected DbPrivEntry(PatternMatcher userPattern, String user, - PatternMatcher hostPattern, String origHost, - PatternMatcher ctlPattern, String origCtl, - PatternMatcher dbPattern, String origDb, - boolean isDomain, PrivBitSet privSet) { - super(userPattern, user, hostPattern, origHost, ctlPattern, origCtl, isDomain, privSet); + protected DbPrivEntry(PatternMatcher hostPattern, String origHost, PatternMatcher dbPattern, String origDb, + PatternMatcher userPattern, String user, boolean isDomain, PrivBitSet privSet) { + super(hostPattern, origHost, userPattern, user, isDomain, privSet); this.dbPattern = dbPattern; this.origDb = origDb; if (origDb.equals(ANY_DB)) { @@ -51,15 +48,10 @@ public class DbPrivEntry extends CatalogPrivEntry { } } - public static DbPrivEntry create( - String user, String host, - String ctl, String db, - boolean isDomain, PrivBitSet privs) throws AnalysisException { + public static DbPrivEntry create(String host, String db, String user, boolean isDomain, PrivBitSet privs) + throws AnalysisException { PatternMatcher hostPattern = PatternMatcher.createMysqlPattern(host, CaseSensibility.HOST.getCaseSensibility()); - PatternMatcher ctlPattern = PatternMatcher.createFlatPattern( - ctl, CaseSensibility.CATALOG.getCaseSensibility(), ctl.equals(ANY_CTL)); - PatternMatcher dbPattern = createDbPatternMatcher(db); PatternMatcher userPattern = PatternMatcher.createFlatPattern(user, CaseSensibility.USER.getCaseSensibility()); @@ -68,7 +60,7 @@ public class DbPrivEntry extends CatalogPrivEntry { throw new AnalysisException("Db privilege can not contains global or resource privileges: " + privs); } - return new DbPrivEntry(userPattern, user, hostPattern, host, ctlPattern, ctl, dbPattern, db, isDomain, privs); + return new DbPrivEntry(hostPattern, host, dbPattern, db, userPattern, user, isDomain, privs); } private static PatternMatcher createDbPatternMatcher(String db) throws AnalysisException { @@ -100,10 +92,17 @@ public class DbPrivEntry extends CatalogPrivEntry { } DbPrivEntry otherEntry = (DbPrivEntry) other; - return compareAssist(origUser, otherEntry.origUser, - origHost, otherEntry.origHost, - origCtl, otherEntry.origCtl, - origDb, otherEntry.origDb); + int res = origHost.compareTo(otherEntry.origHost); + if (res != 0) { + return -res; + } + + res = origDb.compareTo(otherEntry.origDb); + if (res != 0) { + return -res; + } + + return -origUser.compareTo(otherEntry.origUser); } @Override @@ -113,15 +112,20 @@ public class DbPrivEntry extends CatalogPrivEntry { } DbPrivEntry otherEntry = (DbPrivEntry) other; - return origUser.equals(otherEntry.origUser) && origHost.equals(otherEntry.origHost) - && origCtl.equals(otherEntry.origCtl) && origDb.equals(otherEntry.origDb) - && isDomain == otherEntry.isDomain; + if (origHost.equals(otherEntry.origHost) && origUser.equals(otherEntry.origUser) + && origDb.equals(otherEntry.origDb) && isDomain == otherEntry.isDomain) { + return true; + } + return false; } @Override public String toString() { - return String.format("database privilege. user: %s, host: %s, ctl: %s, db: %s, priv: %s, set by resolver: %b", - origUser, origHost, origCtl, origDb, privSet.toString(), isSetByDomainResolver); + StringBuilder sb = new StringBuilder(); + sb.append("db priv. host: ").append(origHost).append(", db: ").append(origDb); + sb.append(", user: ").append(origUser); + sb.append(", priv: ").append(privSet).append(", set by resolver: ").append(isSetByDomainResolver); + return sb.toString(); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/DbPrivTable.java b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/DbPrivTable.java index 87ef9ad50e..a16c8dab9f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/DbPrivTable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/DbPrivTable.java @@ -34,10 +34,10 @@ public class DbPrivTable extends PrivTable { private static final Logger LOG = LogManager.getLogger(DbPrivTable.class); /* - * Return first priv which match the user@host on ctl.db.* The returned priv will be + * Return first priv which match the user@host on db.* The returned priv will be * saved in 'savedPrivs'. */ - public void getPrivs(UserIdentity currentUser, String ctl, String db, PrivBitSet savedPrivs) { + public void getPrivs(UserIdentity currentUser, String db, PrivBitSet savedPrivs) { DbPrivEntry matchedEntry = null; for (PrivEntry entry : entries) { DbPrivEntry dbPrivEntry = (DbPrivEntry) entry; @@ -46,11 +46,6 @@ public class DbPrivTable extends PrivTable { continue; } - // check catalog - if (!dbPrivEntry.isAnyCtl() && !dbPrivEntry.getCtlPattern().match(ctl)) { - continue; - } - // check db if (!dbPrivEntry.isAnyDb() && !dbPrivEntry.getDbPattern().match(db)) { continue; @@ -66,6 +61,28 @@ public class DbPrivTable extends PrivTable { savedPrivs.or(matchedEntry.getPrivSet()); } + /* + * Check if user@host has specified privilege on any database + */ + public boolean hasPriv(String host, String user, PrivPredicate wanted) { + for (PrivEntry entry : entries) { + DbPrivEntry dbPrivEntry = (DbPrivEntry) entry; + // check host + if (!dbPrivEntry.isAnyHost() && !dbPrivEntry.getHostPattern().match(host)) { + continue; + } + // check user + if (!dbPrivEntry.isAnyUser() && !dbPrivEntry.getUserPattern().match(user)) { + continue; + } + // check priv + if (dbPrivEntry.privSet.satisfy(wanted)) { + return true; + } + } + return false; + } + public boolean hasClusterPriv(ConnectContext ctx, String clusterName) { for (PrivEntry entry : entries) { DbPrivEntry dbPrivEntry = (DbPrivEntry) entry; diff --git a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PaloAuth.java b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PaloAuth.java index 9459f14ed9..2dcb317ff8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PaloAuth.java +++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PaloAuth.java @@ -27,7 +27,6 @@ import org.apache.doris.analysis.RevokeStmt; import org.apache.doris.analysis.SetLdapPassVar; import org.apache.doris.analysis.SetPassVar; import org.apache.doris.analysis.SetUserPropertyStmt; -import org.apache.doris.analysis.TableName; import org.apache.doris.analysis.TablePattern; import org.apache.doris.analysis.UserIdentity; import org.apache.doris.catalog.AuthorizationInfo; @@ -43,7 +42,6 @@ import org.apache.doris.common.LdapConfig; import org.apache.doris.common.Pair; import org.apache.doris.common.UserException; import org.apache.doris.common.io.Writable; -import org.apache.doris.datasource.InternalDataSource; import org.apache.doris.ldap.LdapPrivsChecker; import org.apache.doris.load.DppConfig; import org.apache.doris.persist.LdapInfo; @@ -55,7 +53,6 @@ import org.apache.doris.thrift.TPrivilegeStatus; import com.google.common.base.Joiner; import com.google.common.base.Preconditions; -import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import org.apache.logging.log4j.LogManager; @@ -68,7 +65,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.stream.Collectors; public class PaloAuth implements Writable { private static final Logger LOG = LogManager.getLogger(PaloAuth.class); @@ -79,10 +75,8 @@ public class PaloAuth implements Writable { public static final String ADMIN_USER = "admin"; // unknown user does not have any privilege, this is just to be compatible with old version. public static final String UNKNOWN_USER = "unknown"; - private static final String DEFAULT_CATALOG = InternalDataSource.INTERNAL_DS_NAME; private UserPrivTable userPrivTable = new UserPrivTable(); - private CatalogPrivTable catalogPrivTable = new CatalogPrivTable(); private DbPrivTable dbPrivTable = new DbPrivTable(); private TablePrivTable tablePrivTable = new TablePrivTable(); private ResourcePrivTable resourcePrivTable = new ResourcePrivTable(); @@ -111,7 +105,7 @@ public class PaloAuth implements Writable { } public enum PrivLevel { - GLOBAL, CATALOG, DATABASE, TABLE, RESOURCE + GLOBAL, DATABASE, TABLE, RESOURCE } public PaloAuth() { @@ -171,39 +165,12 @@ public class PaloAuth implements Writable { false /* not delete entry if priv is empty, because global priv entry has password */); } - private void grantCatalogPrivs(UserIdentity userIdentity, String ctl, - boolean errOnExist, boolean errOnNonExist, PrivBitSet privs) throws DdlException { - CatalogPrivEntry entry; - try { - entry = CatalogPrivEntry.create(userIdentity.getQualifiedUser(), userIdentity.getHost(), - ctl, userIdentity.isDomain(), privs); - entry.setSetByDomainResolver(false); - } catch (AnalysisException e) { - throw new DdlException(e.getMessage()); - } - catalogPrivTable.addEntry(entry, errOnExist, errOnNonExist); - } - - private void revokeCatalogPrivs(UserIdentity userIdentity, String ctl, - PrivBitSet privs, boolean errOnNonExist) throws DdlException { - CatalogPrivEntry entry; - try { - entry = CatalogPrivEntry.create(userIdentity.getQualifiedUser(), userIdentity.getHost(), - ctl, userIdentity.isDomain(), privs); - entry.setSetByDomainResolver(false); - } catch (AnalysisException e) { - throw new DdlException(e.getMessage()); - } - - catalogPrivTable.revoke(entry, errOnNonExist, true /* delete entry when empty */); - } - - private void grantDbPrivs(UserIdentity userIdentity, String ctl, String db, - boolean errOnExist, boolean errOnNonExist, PrivBitSet privs) throws DdlException { + private void grantDbPrivs(UserIdentity userIdentity, String db, boolean errOnExist, boolean errOnNonExist, + PrivBitSet privs) throws DdlException { DbPrivEntry entry; try { - entry = DbPrivEntry.create(userIdentity.getQualifiedUser(), userIdentity.getHost(), - ctl, db, userIdentity.isDomain(), privs); + entry = DbPrivEntry.create(userIdentity.getHost(), db, userIdentity.getQualifiedUser(), + userIdentity.isDomain(), privs); entry.setSetByDomainResolver(false); } catch (AnalysisException e) { throw new DdlException(e.getMessage()); @@ -211,12 +178,12 @@ public class PaloAuth implements Writable { dbPrivTable.addEntry(entry, errOnExist, errOnNonExist); } - private void revokeDbPrivs(UserIdentity userIdentity, String ctl, String db, - PrivBitSet privs, boolean errOnNonExist) throws DdlException { + private void revokeDbPrivs(UserIdentity userIdentity, String db, PrivBitSet privs, boolean errOnNonExist) + throws DdlException { DbPrivEntry entry; try { - entry = DbPrivEntry.create(userIdentity.getQualifiedUser(), userIdentity.getHost(), - ctl, db, userIdentity.isDomain(), privs); + entry = DbPrivEntry.create(userIdentity.getHost(), db, userIdentity.getQualifiedUser(), + userIdentity.isDomain(), privs); entry.setSetByDomainResolver(false); } catch (AnalysisException e) { throw new DdlException(e.getMessage()); @@ -225,12 +192,12 @@ public class PaloAuth implements Writable { dbPrivTable.revoke(entry, errOnNonExist, true /* delete entry when empty */); } - private void grantTblPrivs(UserIdentity userIdentity, String ctl, String db, String tbl, - boolean errOnExist, boolean errOnNonExist, PrivBitSet privs) throws DdlException { + private void grantTblPrivs(UserIdentity userIdentity, String db, String tbl, boolean errOnExist, + boolean errOnNonExist, PrivBitSet privs) throws DdlException { TablePrivEntry entry; try { - entry = TablePrivEntry.create(userIdentity.getQualifiedUser(), userIdentity.getHost(), - ctl, db, tbl, userIdentity.isDomain(), privs); + entry = TablePrivEntry.create(userIdentity.getHost(), db, userIdentity.getQualifiedUser(), tbl, + userIdentity.isDomain(), privs); entry.setSetByDomainResolver(false); } catch (AnalysisException e) { throw new DdlException(e.getMessage()); @@ -238,12 +205,12 @@ public class PaloAuth implements Writable { tablePrivTable.addEntry(entry, errOnExist, errOnNonExist); } - private void revokeTblPrivs(UserIdentity userIdentity, String ctl, String db, String tbl, - PrivBitSet privs, boolean errOnNonExist) throws DdlException { + private void revokeTblPrivs(UserIdentity userIdentity, String db, String tbl, PrivBitSet privs, + boolean errOnNonExist) throws DdlException { TablePrivEntry entry; try { - entry = TablePrivEntry.create(userIdentity.getQualifiedUser(), userIdentity.getHost(), - ctl, db, tbl, userIdentity.isDomain(), privs); + entry = TablePrivEntry.create(userIdentity.getHost(), db, userIdentity.getQualifiedUser(), tbl, + userIdentity.isDomain(), privs); entry.setSetByDomainResolver(false); } catch (AnalysisException e) { throw new DdlException(e.getMessage()); @@ -357,15 +324,11 @@ public class PaloAuth implements Writable { return checkDbPriv(ctx.getCurrentUserIdentity(), qualifiedDb, wanted); } - public boolean checkDbPriv(UserIdentity currentUser, String db, PrivPredicate wanted) { - return checkDbPriv(currentUser, DEFAULT_CATALOG, db, wanted); - } - /* * Check if 'user'@'host' on 'db' has 'wanted' priv. * If the given db is null, which means it will no check if database name is matched. */ - public boolean checkDbPriv(UserIdentity currentUser, String ctl, String db, PrivPredicate wanted) { + public boolean checkDbPriv(UserIdentity currentUser, String db, PrivPredicate wanted) { if (!Config.enable_auth_check) { return true; } @@ -377,13 +340,12 @@ public class PaloAuth implements Writable { PrivBitSet savedPrivs = PrivBitSet.of(); if (checkGlobalInternal(currentUser, wanted, savedPrivs) - || checkCatalogInternal(currentUser, ctl, wanted, savedPrivs) - || checkDbInternal(currentUser, ctl, db, wanted, savedPrivs)) { + || checkDbInternal(currentUser, db, wanted, savedPrivs)) { return true; } // if user has any privs of table in this db, and the wanted priv is SHOW, return true - if (ctl != null && db != null && wanted == PrivPredicate.SHOW && checkTblWithDb(currentUser, ctl, db)) { + if (db != null && wanted == PrivPredicate.SHOW && checkTblWithDb(currentUser, db)) { return true; } @@ -396,31 +358,21 @@ public class PaloAuth implements Writable { * So we have to check if user has any privs of tables in this database. * if so, the database should be visible to this user. */ - private boolean checkTblWithDb(UserIdentity currentUser, String ctl, String db) { + private boolean checkTblWithDb(UserIdentity currentUser, String db) { readLock(); try { return (isLdapAuthEnabled() && LdapPrivsChecker.hasPrivsOfDb(currentUser, db)) - || tablePrivTable.hasPrivsOfDb(currentUser, ctl, db); + || tablePrivTable.hasPrivsOfDb(currentUser, db); } finally { readUnlock(); } } - public boolean checkTblPriv(ConnectContext ctx, String qualifiedCtl, - String qualifiedDb, String tbl, PrivPredicate wanted) { - return checkTblPriv(ctx.getCurrentUserIdentity(), qualifiedCtl, qualifiedDb, tbl, wanted); - } - public boolean checkTblPriv(ConnectContext ctx, String qualifiedDb, String tbl, PrivPredicate wanted) { - return checkTblPriv(ctx, DEFAULT_CATALOG, qualifiedDb, tbl, wanted); + return checkTblPriv(ctx.getCurrentUserIdentity(), qualifiedDb, tbl, wanted); } - public boolean checkTblPriv(ConnectContext ctx, TableName tableName, PrivPredicate wanted) { - Preconditions.checkState(tableName.isFullyQualified()); - return checkTblPriv(ctx, tableName.getCtl(), tableName.getDb(), wanted); - } - - public boolean checkTblPriv(UserIdentity currentUser, String ctl, String db, String tbl, PrivPredicate wanted) { + public boolean checkTblPriv(UserIdentity currentUser, String db, String tbl, PrivPredicate wanted) { if (!Config.enable_auth_check) { return true; } @@ -431,9 +383,8 @@ public class PaloAuth implements Writable { PrivBitSet savedPrivs = PrivBitSet.of(); if (checkGlobalInternal(currentUser, wanted, savedPrivs) - || checkCatalogInternal(currentUser, ctl, wanted, savedPrivs) - || checkDbInternal(currentUser, ctl, db, wanted, savedPrivs) - || checkTblInternal(currentUser, ctl, db, tbl, wanted, savedPrivs)) { + || checkDbInternal(currentUser, db, wanted, savedPrivs) + || checkTblInternal(currentUser, db, tbl, wanted, savedPrivs)) { return true; } @@ -441,10 +392,6 @@ public class PaloAuth implements Writable { return false; } - public boolean checkTblPriv(UserIdentity currentUser, String db, String tbl, PrivPredicate wanted) { - return checkTblPriv(currentUser, DEFAULT_CATALOG, db, tbl, wanted); - } - public boolean checkResourcePriv(ConnectContext ctx, String resourceName, PrivPredicate wanted) { return checkResourcePriv(ctx.getCurrentUserIdentity(), resourceName, wanted); } @@ -538,22 +485,7 @@ public class PaloAuth implements Writable { } } - private boolean checkCatalogInternal(UserIdentity currentUser, String ctl, - PrivPredicate wanted, PrivBitSet savedPrivs) { - // TODO(gaoxin): check privileges by ldap. - readLock(); - try { - catalogPrivTable.getPrivs(currentUser, ctl, savedPrivs); - if (PaloPrivilege.satisfy(savedPrivs, wanted)) { - return true; - } - } finally { - readUnlock(); - } - return false; - } - - private boolean checkDbInternal(UserIdentity currentUser, String ctl, String db, PrivPredicate wanted, + private boolean checkDbInternal(UserIdentity currentUser, String db, PrivPredicate wanted, PrivBitSet savedPrivs) { if (isLdapAuthEnabled() && LdapPrivsChecker.hasDbPrivFromLdap(currentUser, db, wanted)) { return true; @@ -561,7 +493,7 @@ public class PaloAuth implements Writable { readLock(); try { - dbPrivTable.getPrivs(currentUser, ctl, db, savedPrivs); + dbPrivTable.getPrivs(currentUser, db, savedPrivs); if (PaloPrivilege.satisfy(savedPrivs, wanted)) { return true; } @@ -571,7 +503,7 @@ public class PaloAuth implements Writable { return false; } - private boolean checkTblInternal(UserIdentity currentUser, String ctl, String db, String tbl, + private boolean checkTblInternal(UserIdentity currentUser, String db, String tbl, PrivPredicate wanted, PrivBitSet savedPrivs) { if (isLdapAuthEnabled() && LdapPrivsChecker.hasTblPrivFromLdap(currentUser, db, tbl, wanted)) { return true; @@ -579,7 +511,7 @@ public class PaloAuth implements Writable { readLock(); try { - tablePrivTable.getPrivs(currentUser, ctl, db, tbl, savedPrivs); + tablePrivTable.getPrivs(currentUser, db, tbl, savedPrivs); if (PaloPrivilege.satisfy(savedPrivs, wanted)) { return true; } @@ -675,7 +607,7 @@ public class PaloAuth implements Writable { if (!userIdent.getQualifiedUser().equals(ROOT_USER) && !userIdent.getQualifiedUser().equals(ADMIN_USER)) { // grant read privs to database information_schema - TablePattern tblPattern = new TablePattern(DEFAULT_CATALOG, InfoSchemaDb.DATABASE_NAME, "*"); + TablePattern tblPattern = new TablePattern(InfoSchemaDb.DATABASE_NAME, "*"); try { tblPattern.analyze(ClusterNamespace.getClusterNameFromFullName(userIdent.getQualifiedUser())); } catch (AnalysisException e) { @@ -749,7 +681,6 @@ public class PaloAuth implements Writable { // we don't check if user exists userPrivTable.dropUser(userIdent); - catalogPrivTable.dropUser(userIdent); dbPrivTable.dropUser(userIdent); tablePrivTable.dropUser(userIdent); resourcePrivTable.dropUser(userIdent); @@ -884,22 +815,14 @@ public class PaloAuth implements Writable { errOnNonExist, privs); break; - case CATALOG: - grantCatalogPrivs(userIdent, tblPattern.getQualifiedCtl(), - false /* err on exist */, - false /* err on non exist */, - privs); - break; case DATABASE: - grantDbPrivs(userIdent, tblPattern.getQualifiedCtl(), - tblPattern.getQualifiedDb(), + grantDbPrivs(userIdent, tblPattern.getQualifiedDb(), false /* err on exist */, false /* err on non exist */, privs); break; case TABLE: - grantTblPrivs(userIdent, tblPattern.getQualifiedCtl(), - tblPattern.getQualifiedDb(), + grantTblPrivs(userIdent, tblPattern.getQualifiedDb(), tblPattern.getTbl(), false /* err on exist */, false /* err on non exist */, @@ -1048,16 +971,12 @@ public class PaloAuth implements Writable { case GLOBAL: revokeGlobalPrivs(userIdent, privs, errOnNonExist); break; - case CATALOG: - revokeCatalogPrivs(userIdent, tblPattern.getQualifiedCtl(), privs, errOnNonExist); - break; case DATABASE: - revokeDbPrivs(userIdent, tblPattern.getQualifiedCtl(), - tblPattern.getQualifiedDb(), privs, errOnNonExist); + revokeDbPrivs(userIdent, tblPattern.getQualifiedDb(), privs, errOnNonExist); break; case TABLE: - revokeTblPrivs(userIdent, tblPattern.getQualifiedCtl(), tblPattern.getQualifiedDb(), - tblPattern.getTbl(), privs, errOnNonExist); + revokeTblPrivs(userIdent, tblPattern.getQualifiedDb(), tblPattern.getTbl(), privs, + errOnNonExist); break; default: Preconditions.checkNotNull(null, tblPattern.getPrivLevel()); @@ -1392,17 +1311,6 @@ public class PaloAuth implements Writable { } } - // catalog - String ctlPrivs = catalogPrivTable.entries.stream() - .filter(entry -> entry.match(userIdent, true)) - .map(entry -> String.format("%s: %s (%b)", - ((CatalogPrivEntry) entry).getOrigCtl(), entry.privSet, entry.isSetByDomainResolver())) - .collect(Collectors.joining("; ")); - if (Strings.isNullOrEmpty(ctlPrivs)) { - ctlPrivs = FeConstants.null_string; - } - userAuthInfo.add(ctlPrivs); - // db List<String> dbPrivs = Lists.newArrayList(); Set<String> addedDbs = Sets.newHashSet(); @@ -1418,16 +1326,16 @@ public class PaloAuth implements Writable { PrivBitSet savedPrivs = dEntry.getPrivSet().copy(); savedPrivs.or(LdapPrivsChecker.getDbPrivFromLdap(userIdent, dEntry.getOrigDb())); addedDbs.add(dEntry.getOrigDb()); - dbPrivs.add(String.format("%s.%s: %s (%b)", dEntry.getOrigCtl(), dEntry.getOrigDb(), - savedPrivs, dEntry.isSetByDomainResolver())); + dbPrivs.add(dEntry.getOrigDb() + ": " + savedPrivs.toString() + + " (" + entry.isSetByDomainResolver() + ")"); } // Add privs from ldap groups that have not been added in Doris. if (LdapPrivsChecker.hasLdapPrivs(userIdent)) { Map<TablePattern, PrivBitSet> ldapDbPrivs = LdapPrivsChecker.getLdapAllDbPrivs(userIdent); for (Map.Entry<TablePattern, PrivBitSet> entry : ldapDbPrivs.entrySet()) { if (!addedDbs.contains(entry.getKey().getQualifiedDb())) { - dbPrivs.add(String.format("%s.%s: %s (%b)", entry.getKey().getQualifiedCtl(), - entry.getKey().getQualifiedDb(), entry.getValue(), false)); + dbPrivs.add(entry.getKey().getQualifiedDb() + ": " + + entry.getValue().toString() + " (" + false + ")"); } } } @@ -1453,15 +1361,17 @@ public class PaloAuth implements Writable { PrivBitSet savedPrivs = tEntry.getPrivSet().copy(); savedPrivs.or(LdapPrivsChecker.getTblPrivFromLdap(userIdent, tEntry.getOrigDb(), tEntry.getOrigTbl())); addedtbls.add(tEntry.getOrigDb().concat(".").concat(tEntry.getOrigTbl())); - tblPrivs.add(String.format("%s.%s.%s: %s (%b)", tEntry.getOrigCtl(), tEntry.getOrigDb(), - tEntry.getOrigTbl(), savedPrivs, tEntry.isSetByDomainResolver())); + tblPrivs.add(tEntry.getOrigDb() + "." + tEntry.getOrigTbl() + ": " + + savedPrivs.toString() + + " (" + entry.isSetByDomainResolver() + ")"); } // Add privs from ldap groups that have not been added in Doris. if (LdapPrivsChecker.hasLdapPrivs(userIdent)) { Map<TablePattern, PrivBitSet> ldapTblPrivs = LdapPrivsChecker.getLdapAllTblPrivs(userIdent); for (Map.Entry<TablePattern, PrivBitSet> entry : ldapTblPrivs.entrySet()) { if (!addedtbls.contains(entry.getKey().getQualifiedDb().concat(".").concat(entry.getKey().getTbl()))) { - tblPrivs.add(String.format("%s: %s (%b)", entry.getKey(), entry.getValue(), false)); + tblPrivs.add(entry.getKey().getQualifiedDb().concat(".").concat(entry.getKey().getTbl()) + .concat(": ").concat(entry.getValue().toString()).concat(" (false)")); } } } @@ -1752,7 +1662,6 @@ public class PaloAuth implements Writable { // role manager must be first, because role should be exist before any user roleManager.write(out); userPrivTable.write(out); - catalogPrivTable.write(out); dbPrivTable.write(out); tablePrivTable.write(out); resourcePrivTable.write(out); @@ -1763,13 +1672,6 @@ public class PaloAuth implements Writable { public void readFields(DataInput in) throws IOException { roleManager = RoleManager.read(in); userPrivTable = (UserPrivTable) PrivTable.read(in); - if (Catalog.getCurrentCatalogJournalVersion() >= FeMetaVersion.VERSION_111) { - catalogPrivTable = (CatalogPrivTable) PrivTable.read(in); - } else { - catalogPrivTable = userPrivTable.degradeToInternalCatalogPriv(); - LOG.info("Load PaloAuth from meta version < {}, degrade UserPrivTable to CatalogPrivTable", - FeMetaVersion.VERSION_111); - } dbPrivTable = (DbPrivTable) PrivTable.read(in); tablePrivTable = (TablePrivTable) PrivTable.read(in); resourcePrivTable = (ResourcePrivTable) PrivTable.read(in); diff --git a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PrivEntry.java b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PrivEntry.java index 8f59a59777..906c29b6da 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PrivEntry.java +++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PrivEntry.java @@ -24,7 +24,6 @@ import org.apache.doris.common.PatternMatcher; import org.apache.doris.common.io.Text; import org.apache.doris.common.io.Writable; -import com.google.common.base.Preconditions; import org.apache.commons.lang.NotImplementedException; import java.io.DataInput; @@ -254,19 +253,4 @@ public abstract class PrivEntry implements Comparable<PrivEntry>, Writable { public int compareTo(PrivEntry o) { throw new NotImplementedException(); } - - /** - * Help derived classes compare in the order of 'user', 'host', 'catalog', 'db', 'ctl'. - * Compare strings[i] with strings[i+1] successively, return if the comparison value is not 0 in current loop. - */ - protected static int compareAssist(String... strings) { - Preconditions.checkState(strings.length % 2 == 0); - for (int i = 0; i < strings.length; i += 2) { - int res = strings[i].compareTo(strings[i + 1]); - if (res != 0) { - return res; - } - } - return 0; - } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PrivTable.java b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PrivTable.java index 054ca2e62e..ce2f7738c3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PrivTable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/PrivTable.java @@ -45,27 +45,6 @@ public abstract class PrivTable implements Writable { // see PrivEntry for more detail protected boolean isClassNameWrote = false; - /* - * Check if user@host has specified privilege - */ - public boolean hasPriv(String host, String user, PrivPredicate wanted) { - for (PrivEntry entry : entries) { - // check host - if (!entry.isAnyHost() && !entry.getHostPattern().match(host)) { - continue; - } - // check user - if (!entry.isAnyUser() && !entry.getUserPattern().match(user)) { - continue; - } - // check priv - if (entry.privSet.satisfy(wanted)) { - return true; - } - } - return false; - } - /* * Add an entry to priv table. * If entry already exists and errOnExist is false, we try to reset or merge the new priv entry with existing one. diff --git a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/RoleManager.java b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/RoleManager.java index 19e0c703f0..38a0683228 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/RoleManager.java +++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/RoleManager.java @@ -26,7 +26,6 @@ import org.apache.doris.common.io.Writable; import org.apache.doris.mysql.privilege.PaloAuth.PrivLevel; import com.google.common.base.Joiner; -import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -35,9 +34,6 @@ import java.io.DataOutput; import java.io.IOException; import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.stream.Collectors; -import java.util.stream.Stream; public class RoleManager implements Writable { private Map<String, PaloRole> roles = Maps.newHashMap(); @@ -136,26 +132,60 @@ public class RoleManager implements Writable { info.add(role.getRoleName()); info.add(Joiner.on(", ").join(role.getUsers())); - Map<PrivLevel, String> infoMap = role.getTblPatternToPrivs().entrySet().stream() - .collect(Collectors.groupingBy(entry -> entry.getKey().getPrivLevel())).entrySet().stream() - .collect(Collectors.toMap(Entry::getKey, entry -> { - if (entry.getKey() == PrivLevel.GLOBAL) { - return entry.getValue().stream().findFirst().map(priv -> priv.getValue().toString()) - .orElse(FeConstants.null_string); - } else { - return entry.getValue().stream() - .map(priv -> priv.getKey() + ": " + priv.getValue()) - .collect(Collectors.joining("; ")); - } - })); - Stream.of(PrivLevel.GLOBAL, PrivLevel.CATALOG, PrivLevel.DATABASE, PrivLevel.TABLE, PrivLevel.RESOURCE) - .forEach(level -> { - String infoItem = infoMap.get(level); - if (Strings.isNullOrEmpty(infoItem)) { - infoItem = FeConstants.null_string; - } - info.add(infoItem); - }); + // global + boolean hasGlobal = false; + for (Map.Entry<TablePattern, PrivBitSet> entry : role.getTblPatternToPrivs().entrySet()) { + if (entry.getKey().getPrivLevel() == PrivLevel.GLOBAL) { + hasGlobal = true; + info.add(entry.getValue().toString()); + // global priv should only has one + break; + } + } + if (!hasGlobal) { + info.add(FeConstants.null_string); + } + + // db + List<String> tmp = Lists.newArrayList(); + for (Map.Entry<TablePattern, PrivBitSet> entry : role.getTblPatternToPrivs().entrySet()) { + if (entry.getKey().getPrivLevel() == PrivLevel.DATABASE) { + tmp.add(entry.getKey().toString() + ": " + entry.getValue().toString()); + } + } + if (tmp.isEmpty()) { + info.add(FeConstants.null_string); + } else { + info.add(Joiner.on("; ").join(tmp)); + } + + + // tbl + tmp.clear(); + for (Map.Entry<TablePattern, PrivBitSet> entry : role.getTblPatternToPrivs().entrySet()) { + if (entry.getKey().getPrivLevel() == PrivLevel.TABLE) { + tmp.add(entry.getKey().toString() + ": " + entry.getValue().toString()); + } + } + if (tmp.isEmpty()) { + info.add(FeConstants.null_string); + } else { + info.add(Joiner.on("; ").join(tmp)); + } + + // resource + tmp.clear(); + for (Map.Entry<ResourcePattern, PrivBitSet> entry : role.getResourcePatternToPrivs().entrySet()) { + if (entry.getKey().getPrivLevel() == PrivLevel.RESOURCE) { + tmp.add(entry.getKey().toString() + ": " + entry.getValue().toString()); + } + } + if (tmp.isEmpty()) { + info.add(FeConstants.null_string); + } else { + info.add(Joiner.on("; ").join(tmp)); + } + results.add(info); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/TablePrivEntry.java b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/TablePrivEntry.java index 7304d31922..c85a1f2912 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/TablePrivEntry.java +++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/TablePrivEntry.java @@ -36,13 +36,10 @@ public class TablePrivEntry extends DbPrivEntry { protected TablePrivEntry() { } - private TablePrivEntry(PatternMatcher userPattern, String user, - PatternMatcher hostPattern, String origHost, - PatternMatcher ctlPattern, String origCtl, - PatternMatcher dbPattern, String origDb, - PatternMatcher tblPattern, String origTbl, - boolean isDomain, PrivBitSet privSet) { - super(userPattern, user, hostPattern, origHost, ctlPattern, origCtl, dbPattern, origDb, isDomain, privSet); + private TablePrivEntry(PatternMatcher hostPattern, String origHost, PatternMatcher dbPattern, String origDb, + PatternMatcher userPattern, String user, PatternMatcher tblPattern, String origTbl, + boolean isDomain, PrivBitSet privSet) { + super(hostPattern, origHost, dbPattern, origDb, userPattern, user, isDomain, privSet); this.tblPattern = tblPattern; this.origTbl = origTbl; if (origTbl.equals(ANY_TBL)) { @@ -50,15 +47,12 @@ public class TablePrivEntry extends DbPrivEntry { } } - public static TablePrivEntry create(String user, String host, - String ctl, String db, String tbl, - boolean isDomain, PrivBitSet privs) throws AnalysisException { + public static TablePrivEntry create(String host, String db, String user, String tbl, boolean isDomain, + PrivBitSet privs) throws AnalysisException { PatternMatcher hostPattern = PatternMatcher.createMysqlPattern(host, CaseSensibility.HOST.getCaseSensibility()); PatternMatcher dbPattern = PatternMatcher.createFlatPattern( db, CaseSensibility.DATABASE.getCaseSensibility(), db.equals(ANY_DB)); PatternMatcher userPattern = PatternMatcher.createFlatPattern(user, CaseSensibility.USER.getCaseSensibility()); - PatternMatcher ctlPattern = PatternMatcher.createFlatPattern( - ctl, CaseSensibility.CATALOG.getCaseSensibility(), ctl.equals(ANY_CTL)); PatternMatcher tblPattern = PatternMatcher.createFlatPattern( tbl, CaseSensibility.TABLE.getCaseSensibility(), tbl.equals(ANY_TBL)); @@ -67,8 +61,8 @@ public class TablePrivEntry extends DbPrivEntry { throw new AnalysisException("Table privilege can not contains global or resource privileges: " + privs); } - return new TablePrivEntry(userPattern, user, hostPattern, host, - ctlPattern, ctl, dbPattern, db, tblPattern, tbl, isDomain, privs); + return new TablePrivEntry(hostPattern, host, dbPattern, db, + userPattern, user, tblPattern, tbl, isDomain, privs); } public PatternMatcher getTblPattern() { @@ -90,11 +84,22 @@ public class TablePrivEntry extends DbPrivEntry { } TablePrivEntry otherEntry = (TablePrivEntry) other; - return compareAssist(origUser, otherEntry.origUser, - origHost, otherEntry.origHost, - origCtl, otherEntry.origCtl, - origDb, otherEntry.origDb, - origTbl, otherEntry.origTbl); + int res = origHost.compareTo(otherEntry.origHost); + if (res != 0) { + return -res; + } + + res = origDb.compareTo(otherEntry.origDb); + if (res != 0) { + return -res; + } + + res = origUser.compareTo(otherEntry.origUser); + if (res != 0) { + return -res; + } + + return -origTbl.compareTo(otherEntry.origTbl); } @Override @@ -104,16 +109,21 @@ public class TablePrivEntry extends DbPrivEntry { } TablePrivEntry otherEntry = (TablePrivEntry) other; - return origUser.equals(otherEntry.origUser) && origHost.equals(otherEntry.origHost) - && origCtl.equals(otherEntry.origCtl) && origDb.equals(otherEntry.origDb) - && origTbl.equals(otherEntry.origTbl) && isDomain == otherEntry.isDomain; + if (origHost.equals(otherEntry.origHost) && origUser.equals(otherEntry.origUser) + && origDb.equals(otherEntry.origDb) && origTbl.equals(otherEntry.origTbl) + && isDomain == otherEntry.isDomain) { + return true; + } + return false; } @Override public String toString() { - return String.format("table privilege. user: %s, host: %s, " - + "ctl: %s, db: %s, tbl: %s, priv: %s, set by resolver: %b", - origUser, origHost, origCtl, origDb, origTbl, privSet.toString(), isSetByDomainResolver); + StringBuilder sb = new StringBuilder(); + sb.append("db priv. host: ").append(origHost).append(", db: ").append(origDb); + sb.append(", user: ").append(origUser).append(", tbl: ").append(origTbl); + sb.append(", priv: ").append(privSet).append(", set by resolver: ").append(isSetByDomainResolver); + return sb.toString(); } @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/TablePrivTable.java b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/TablePrivTable.java index 475452ac29..0de7816981 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/TablePrivTable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/TablePrivTable.java @@ -32,10 +32,10 @@ import java.io.IOException; public class TablePrivTable extends PrivTable { /* - * Return first priv which match the user@host on ctl.db.tbl The returned priv will + * Return first priv which match the user@host on db.tbl The returned priv will * be saved in 'savedPrivs'. */ - public void getPrivs(UserIdentity currentUser, String ctl, String db, String tbl, PrivBitSet savedPrivs) { + public void getPrivs(UserIdentity currentUser, String db, String tbl, PrivBitSet savedPrivs) { TablePrivEntry matchedEntry = null; for (PrivEntry entry : entries) { TablePrivEntry tblPrivEntry = (TablePrivEntry) entry; @@ -43,11 +43,6 @@ public class TablePrivTable extends PrivTable { continue; } - // check catalog - if (!tblPrivEntry.isAnyCtl() && !tblPrivEntry.getCtlPattern().match(ctl)) { - continue; - } - // check db Preconditions.checkState(!tblPrivEntry.isAnyDb()); if (!tblPrivEntry.getDbPattern().match(db)) { @@ -69,17 +64,33 @@ public class TablePrivTable extends PrivTable { savedPrivs.or(matchedEntry.getPrivSet()); } - public boolean hasPrivsOfDb(UserIdentity currentUser, String ctl, String db) { + /* + * Check if user@host has specified privilege on any table + */ + public boolean hasPriv(String host, String user, PrivPredicate wanted) { for (PrivEntry entry : entries) { TablePrivEntry tblPrivEntry = (TablePrivEntry) entry; - - if (!tblPrivEntry.match(currentUser, true)) { + // check host + if (!tblPrivEntry.isAnyHost() && !tblPrivEntry.getHostPattern().match(host)) { + continue; + } + // check user + if (!tblPrivEntry.isAnyUser() && !tblPrivEntry.getUserPattern().match(user)) { continue; } + // check priv + if (tblPrivEntry.privSet.satisfy(wanted)) { + return true; + } + } + return false; + } - // check catalog - Preconditions.checkState(!tblPrivEntry.isAnyCtl()); - if (!tblPrivEntry.getCtlPattern().match(ctl)) { + public boolean hasPrivsOfDb(UserIdentity currentUser, String db) { + for (PrivEntry entry : entries) { + TablePrivEntry tblPrivEntry = (TablePrivEntry) entry; + + if (!tblPrivEntry.match(currentUser, true)) { continue; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/UserPrivTable.java b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/UserPrivTable.java index c50f5569bf..2ae20c3658 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/UserPrivTable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/UserPrivTable.java @@ -20,7 +20,6 @@ package org.apache.doris.mysql.privilege; import org.apache.doris.analysis.UserIdentity; import org.apache.doris.common.DdlException; import org.apache.doris.common.io.Text; -import org.apache.doris.datasource.InternalDataSource; import org.apache.doris.mysql.MysqlPassword; import org.apache.logging.log4j.LogManager; @@ -28,7 +27,6 @@ import org.apache.logging.log4j.Logger; import java.io.DataOutput; import java.io.IOException; -import java.util.LinkedList; import java.util.List; /* @@ -59,6 +57,27 @@ public class UserPrivTable extends PrivTable { savedPrivs.or(matchedEntry.getPrivSet()); } + /* + * Check if user@host has specified privilege + */ + public boolean hasPriv(String host, String user, PrivPredicate wanted) { + for (PrivEntry entry : entries) { + GlobalPrivEntry globalPrivEntry = (GlobalPrivEntry) entry; + // check host + if (!globalPrivEntry.isAnyHost() && !globalPrivEntry.getHostPattern().match(host)) { + continue; + } + // check user + if (!globalPrivEntry.isAnyUser() && !globalPrivEntry.getUserPattern().match(user)) { + continue; + } + if (globalPrivEntry.getPrivSet().satisfy(wanted)) { + return true; + } + } + return false; + } + // validate the connection by host, user and password. // return true if this connection is valid, and 'savedPrivs' save all global privs got from user table. // if currentUser is not null, save the current user identity @@ -177,33 +196,4 @@ public class UserPrivTable extends PrivTable { super.write(out); } - - /** - * When replay UserPrivTable from journal whose FeMetaVersion < VERSION_111, the global-level privileges should - * degrade to internal-catalog-level privileges. - */ - public CatalogPrivTable degradeToInternalCatalogPriv() throws IOException { - CatalogPrivTable catalogPrivTable = new CatalogPrivTable(); - List<PrivEntry> degradedEntries = new LinkedList<>(); - for (PrivEntry privEntry : entries) { - GlobalPrivEntry globalPrivEntry = (GlobalPrivEntry) privEntry; - if (!globalPrivEntry.match(UserIdentity.ROOT, true) - && !globalPrivEntry.match(UserIdentity.ADMIN, true) - && !globalPrivEntry.privSet.isEmpty()) { - try { - CatalogPrivEntry entry = CatalogPrivEntry.create(globalPrivEntry.origUser, globalPrivEntry.origHost, - InternalDataSource.INTERNAL_DS_NAME, globalPrivEntry.isDomain, globalPrivEntry.privSet); - entry.setSetByDomainResolver(false); - catalogPrivTable.addEntry(entry, false, false); - degradedEntries.add(globalPrivEntry); - } catch (Exception e) { - throw new IOException(e.getMessage()); - } - } - } - for (PrivEntry degraded : degradedEntries) { - dropEntry(degraded); - } - return catalogPrivTable; - } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java index 724278af10..31f71ecb40 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java @@ -23,7 +23,6 @@ import org.apache.doris.catalog.Database; import org.apache.doris.cluster.ClusterNamespace; import org.apache.doris.common.UserException; import org.apache.doris.common.util.DebugUtil; -import org.apache.doris.datasource.InternalDataSource; import org.apache.doris.datasource.SessionContext; import org.apache.doris.mysql.MysqlCapability; import org.apache.doris.mysql.MysqlChannel; @@ -109,7 +108,6 @@ public class ConnectContext { // Catalog: put catalog here is convenient for unit test, // because catalog is singleton, hard to mock protected Catalog catalog; - protected String defaultCatalog = InternalDataSource.INTERNAL_DS_NAME; protected boolean isSend; protected AuditEventBuilder auditEventBuilder = new AuditEventBuilder(); @@ -292,7 +290,6 @@ public class ConnectContext { public void setCatalog(Catalog catalog) { this.catalog = catalog; - defaultCatalog = catalog.getInternalDataSource().getName(); } public Catalog getCatalog() { @@ -413,14 +410,6 @@ public class ConnectContext { return serverCapability; } - public String getDefaultCatalog() { - return defaultCatalog; - } - - public void changeDefaultCatalog(String catalogName) { - defaultCatalog = catalogName; - } - public String getDatabase() { return currentDb; } diff --git a/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/AuthTest.java b/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/AuthTest.java index 4c2d7e7ce9..886783896a 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/AuthTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/AuthTest.java @@ -35,7 +35,6 @@ import org.apache.doris.common.AnalysisException; import org.apache.doris.common.Config; import org.apache.doris.common.DdlException; import org.apache.doris.common.UserException; -import org.apache.doris.datasource.InternalDataSource; import org.apache.doris.persist.EditLog; import org.apache.doris.persist.PrivInfo; import org.apache.doris.qe.ConnectContext; @@ -103,10 +102,6 @@ public class AuthTest { minTimes = 0; result = SystemInfoService.DEFAULT_CLUSTER; - analyzer.getDefaultCatalog(); - minTimes = 0; - result = InternalDataSource.INTERNAL_DS_NAME; - Catalog.getCurrentCatalog(); minTimes = 0; result = catalog; @@ -1247,7 +1242,7 @@ public class AuthTest { } }; Assert.assertFalse(auth.checkGlobalPriv(ctx, PrivPredicate.OPERATOR)); - grantStmt = new GrantStmt(opUser, null, new TablePattern("*", "*", "*"), privileges); + grantStmt = new GrantStmt(opUser, null, new TablePattern("*", "*"), privileges); // first, use op_user itself to grant node_priv, which is not allowed try { new Expectations() { diff --git a/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/PrivEntryTest.java b/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/PrivEntryTest.java index 8e9a3f173b..71f6990191 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/PrivEntryTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/PrivEntryTest.java @@ -26,7 +26,7 @@ public class PrivEntryTest { @Test public void testNameWithUnderscores() throws Exception { TablePrivEntry tablePrivEntry = TablePrivEntry.create( - "user1", "127.%", "__internal", "db_db1", "tbl_tbl1", false, + "127.%", "db_db1", "user1", "tbl_tbl1", false, PrivBitSet.of(PaloPrivilege.SELECT_PRIV, PaloPrivilege.DROP_PRIV)); // pattern match Assert.assertFalse(tablePrivEntry.getDbPattern().match("db-db1")); @@ -38,11 +38,11 @@ public class PrivEntryTest { userIdentity.setIsAnalyzed(); PrivBitSet privs1 = PrivBitSet.of(); - tablePrivTable.getPrivs(userIdentity, "##internal", "db#db1", "tbl#tbl1", privs1); + tablePrivTable.getPrivs(userIdentity, "db#db1", "tbl#tbl1", privs1); Assert.assertFalse(PaloPrivilege.satisfy(privs1, PrivPredicate.DROP)); PrivBitSet privs2 = PrivBitSet.of(); - tablePrivTable.getPrivs(userIdentity, "__internal", "db_db1", "tbl_tbl1", privs2); + tablePrivTable.getPrivs(userIdentity, "db_db1", "tbl_tbl1", privs2); Assert.assertTrue(PaloPrivilege.satisfy(privs2, PrivPredicate.DROP)); } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org