Skip to content

Commit 6b51e9d

Browse files
authoredDec 26, 2024··
[fix](auth)Fix the compatibility issue with show_view_priv when replaying editLog (#45949)
### What problem does this PR solve? The previous version showed an index of 9 for show_view_priv, while the new version has an index of 14 The previous logic was only compatible with the playback logic of images, not with the playback logic of editLog
1 parent b80b402 commit 6b51e9d

File tree

2 files changed

+62
-41
lines changed

2 files changed

+62
-41
lines changed
 

‎fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Auth.java

+10-6
Original file line numberDiff line numberDiff line change
@@ -658,17 +658,19 @@ public void grant(GrantStmt stmt) throws DdlException {
658658

659659
public void replayGrant(PrivInfo privInfo) {
660660
try {
661+
PrivBitSet privs = privInfo.getPrivs();
662+
Role.compatibilityAuthIndexChange(privs);
661663
if (privInfo.getTblPattern() != null) {
662664
grantInternal(privInfo.getUserIdent(), privInfo.getRole(),
663-
privInfo.getTblPattern(), privInfo.getPrivs(), privInfo.getColPrivileges(),
665+
privInfo.getTblPattern(), privs, privInfo.getColPrivileges(),
664666
true /* err on non exist */, true /* is replay */);
665667
} else if (privInfo.getResourcePattern() != null) {
666668
grantInternal(privInfo.getUserIdent(), privInfo.getRole(),
667-
privInfo.getResourcePattern(), privInfo.getPrivs(),
669+
privInfo.getResourcePattern(), privs,
668670
true /* err on non exist */, true /* is replay */);
669671
} else if (privInfo.getWorkloadGroupPattern() != null) {
670672
grantInternal(privInfo.getUserIdent(), privInfo.getRole(),
671-
privInfo.getWorkloadGroupPattern(), privInfo.getPrivs(),
673+
privInfo.getWorkloadGroupPattern(), privs,
672674
true /* err on non exist */, true /* is replay */);
673675
} else {
674676
grantInternal(privInfo.getUserIdent(), privInfo.getRoles(), true);
@@ -843,14 +845,16 @@ public void revoke(RevokeStmt stmt) throws DdlException {
843845

844846
public void replayRevoke(PrivInfo info) {
845847
try {
848+
PrivBitSet privs = info.getPrivs();
849+
Role.compatibilityAuthIndexChange(privs);
846850
if (info.getTblPattern() != null) {
847-
revokeInternal(info.getUserIdent(), info.getRole(), info.getTblPattern(), info.getPrivs(),
851+
revokeInternal(info.getUserIdent(), info.getRole(), info.getTblPattern(), privs,
848852
info.getColPrivileges(), true /* err on non exist */, true /* is replay */);
849853
} else if (info.getResourcePattern() != null) {
850-
revokeInternal(info.getUserIdent(), info.getRole(), info.getResourcePattern(), info.getPrivs(),
854+
revokeInternal(info.getUserIdent(), info.getRole(), info.getResourcePattern(), privs,
851855
true /* err on non exist */, true /* is replay */);
852856
} else if (info.getWorkloadGroupPattern() != null) {
853-
revokeInternal(info.getUserIdent(), info.getRole(), info.getWorkloadGroupPattern(), info.getPrivs(),
857+
revokeInternal(info.getUserIdent(), info.getRole(), info.getWorkloadGroupPattern(), privs,
854858
true /* err on non exist */, true /* is replay */);
855859
} else {
856860
revokeInternal(info.getUserIdent(), info.getRoles(), true /* is replay */);

‎fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Role.java

+52-35
Original file line numberDiff line numberDiff line change
@@ -1111,53 +1111,70 @@ private void compatibilityErrEnum() {
11111111

11121112
LOG.info("auth into compatibility logic, currentVersion={}", currentVersion);
11131113
if (Config.isNotCloudMode() && currentVersion >= FeMetaVersion.VERSION_129) {
1114-
// not cloud mode,
1115-
// For versions greater than VERSION_123,
1116-
// the community requires versions above VERSION_129 to follow compatibility logic.
1117-
1118-
// SHOW_VIEW_PRIV_DEPRECATED -> SHOW_VIEW_PRIV (9 -> 14)
11191114
tblPatternToPrivs.values().forEach(privBitSet -> {
1120-
if (privBitSet.containsPrivs(Privilege.SHOW_VIEW_PRIV_DEPRECATED)) {
1121-
// remove SHOW_VIEW_PRIV_DEPRECATED
1122-
privBitSet.unset(Privilege.SHOW_VIEW_PRIV_DEPRECATED.getIdx());
1123-
// add SHOW_VIEW_PRIV
1124-
privBitSet.set(Privilege.SHOW_VIEW_PRIV.getIdx());
1125-
}
1115+
compatibilityAuthIndexChange(privBitSet);
11261116
});
11271117
} else if (Config.isCloudMode()) {
1128-
// cloud mode
1129-
// For versions greater than VERSION_123, the cloud requires compatibility logic.
1130-
1131-
// CLUSTER_USAGE_PRIV_DEPRECATED -> CLUSTER_USAGE_PRIV (9 -> 12)
11321118
clusterPatternToPrivs.values().forEach(privBitSet -> {
1133-
if (privBitSet.containsPrivs(Privilege.CLUSTER_USAGE_PRIV_DEPRECATED)) {
1134-
// remove CLUSTER_USAGE_PRIV_DEPRECATED
1135-
privBitSet.unset(Privilege.CLUSTER_USAGE_PRIV_DEPRECATED.getIdx());
1136-
// add CLUSTER_USAGE_PRIV
1137-
privBitSet.set(Privilege.CLUSTER_USAGE_PRIV.getIdx());
1138-
}
1119+
compatibilityAuthIndexChange(privBitSet);
11391120
});
1140-
// STAGE_USAGE_PRIV_DEPRECATED -> STAGE_USAGE_PRIV (10 -> 13)
11411121
stagePatternToPrivs.values().forEach(privBitSet -> {
1142-
if (privBitSet.containsPrivs(Privilege.STAGE_USAGE_PRIV_DEPRECATED)) {
1143-
// remove CLUSTER_USAGE_PRIV_DEPRECATED
1144-
privBitSet.unset(Privilege.STAGE_USAGE_PRIV_DEPRECATED.getIdx());
1145-
// add CLUSTER_USAGE_PRIV
1146-
privBitSet.set(Privilege.STAGE_USAGE_PRIV.getIdx());
1147-
}
1122+
compatibilityAuthIndexChange(privBitSet);
11481123
});
1149-
// SHOW_VIEW_PRIV_CLOUD_DEPRECATED -> SHOW_VIEW_PRIV (11 -> 14)
11501124
tblPatternToPrivs.values().forEach(privBitSet -> {
1151-
if (privBitSet.containsPrivs(Privilege.SHOW_VIEW_PRIV_CLOUD_DEPRECATED)) {
1152-
// remove SHOW_VIEW_PRIV_CLOUD_DEPRECATED
1153-
privBitSet.unset(Privilege.SHOW_VIEW_PRIV_CLOUD_DEPRECATED.getIdx());
1154-
// add SHOW_VIEW_PRIV
1155-
privBitSet.set(Privilege.SHOW_VIEW_PRIV.getIdx());
1156-
}
1125+
compatibilityAuthIndexChange(privBitSet);
11571126
});
11581127
}
11591128
}
11601129

1130+
public static void compatibilityAuthIndexChange(PrivBitSet privBitSet) {
1131+
if (privBitSet == null) {
1132+
return;
1133+
}
1134+
int currentVersion = Env.getCurrentEnvJournalVersion();
1135+
// not cloud mode,
1136+
// For versions greater than VERSION_123,
1137+
// the community requires versions above VERSION_129 to follow compatibility logic.
1138+
1139+
// SHOW_VIEW_PRIV_DEPRECATED -> SHOW_VIEW_PRIV (9 -> 14)
1140+
if (Config.isNotCloudMode() && currentVersion >= FeMetaVersion.VERSION_129) {
1141+
if (privBitSet.containsPrivs(Privilege.SHOW_VIEW_PRIV_DEPRECATED)) {
1142+
// remove SHOW_VIEW_PRIV_DEPRECATED
1143+
privBitSet.unset(Privilege.SHOW_VIEW_PRIV_DEPRECATED.getIdx());
1144+
// add SHOW_VIEW_PRIV
1145+
privBitSet.set(Privilege.SHOW_VIEW_PRIV.getIdx());
1146+
}
1147+
} else if (Config.isCloudMode()) {
1148+
// cloud mode
1149+
// For versions greater than VERSION_123, the cloud requires compatibility logic.
1150+
1151+
// CLUSTER_USAGE_PRIV_DEPRECATED -> CLUSTER_USAGE_PRIV (9 -> 12)
1152+
1153+
if (privBitSet.containsPrivs(Privilege.CLUSTER_USAGE_PRIV_DEPRECATED)) {
1154+
// remove CLUSTER_USAGE_PRIV_DEPRECATED
1155+
privBitSet.unset(Privilege.CLUSTER_USAGE_PRIV_DEPRECATED.getIdx());
1156+
// add CLUSTER_USAGE_PRIV
1157+
privBitSet.set(Privilege.CLUSTER_USAGE_PRIV.getIdx());
1158+
}
1159+
1160+
// STAGE_USAGE_PRIV_DEPRECATED -> STAGE_USAGE_PRIV (10 -> 13)
1161+
if (privBitSet.containsPrivs(Privilege.STAGE_USAGE_PRIV_DEPRECATED)) {
1162+
// remove CLUSTER_USAGE_PRIV_DEPRECATED
1163+
privBitSet.unset(Privilege.STAGE_USAGE_PRIV_DEPRECATED.getIdx());
1164+
// add CLUSTER_USAGE_PRIV
1165+
privBitSet.set(Privilege.STAGE_USAGE_PRIV.getIdx());
1166+
}
1167+
1168+
// SHOW_VIEW_PRIV_CLOUD_DEPRECATED -> SHOW_VIEW_PRIV (11 -> 14)
1169+
if (privBitSet.containsPrivs(Privilege.SHOW_VIEW_PRIV_CLOUD_DEPRECATED)) {
1170+
// remove SHOW_VIEW_PRIV_CLOUD_DEPRECATED
1171+
privBitSet.unset(Privilege.SHOW_VIEW_PRIV_CLOUD_DEPRECATED.getIdx());
1172+
// add SHOW_VIEW_PRIV
1173+
privBitSet.set(Privilege.SHOW_VIEW_PRIV.getIdx());
1174+
}
1175+
}
1176+
}
1177+
11611178
private void rebuildPrivTables() {
11621179
globalPrivTable = new GlobalPrivTable();
11631180
catalogPrivTable = new CatalogPrivTable();

0 commit comments

Comments
 (0)
Please sign in to comment.