Skip to content

Commit 609a49c

Browse files
Merge pull request ClickHouse#80026 from ClickHouse/pufit/another-25.4-release-fix
`enable_user_name_access_type` must not affect `DEFINER` access type
2 parents 0cc630e + 03448ef commit 609a49c

File tree

7 files changed

+28
-10
lines changed

7 files changed

+28
-10
lines changed

src/Access/Common/AccessFlags.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ namespace
103103
const Flags & getDictionaryFlags() const { return all_flags_for_target[DICTIONARY]; }
104104
const Flags & getTableEngineFlags() const { return all_flags_for_target[TABLE_ENGINE]; }
105105
const Flags & getUserNameFlags() const { return all_flags_for_target[USER_NAME]; }
106+
const Flags & getDefinerFlags() const { return all_flags_for_target[DEFINER]; }
106107
const Flags & getNamedCollectionFlags() const { return all_flags_for_target[NAMED_COLLECTION]; }
107108
const Flags & getAllFlagsGrantableOnGlobalLevel() const { return getAllFlags(); }
108109
const Flags & getAllFlagsGrantableOnGlobalWithParameterLevel() const { return getGlobalWithParameterFlags(); }
@@ -124,6 +125,7 @@ namespace
124125
NAMED_COLLECTION = 5,
125126
USER_NAME = 6,
126127
TABLE_ENGINE = 7,
128+
DEFINER = 8,
127129
};
128130

129131
struct Node;
@@ -302,7 +304,7 @@ namespace
302304
collectAllFlags(child.get());
303305

304306
all_flags_grantable_on_table_level = all_flags_for_target[TABLE] | all_flags_for_target[DICTIONARY] | all_flags_for_target[COLUMN];
305-
all_flags_grantable_on_global_with_parameter_level = all_flags_for_target[NAMED_COLLECTION] | all_flags_for_target[USER_NAME] | all_flags_for_target[TABLE_ENGINE];
307+
all_flags_grantable_on_global_with_parameter_level = all_flags_for_target[NAMED_COLLECTION] | all_flags_for_target[USER_NAME] | all_flags_for_target[TABLE_ENGINE] | all_flags_for_target[DEFINER];
306308
all_flags_grantable_on_database_level = all_flags_for_target[DATABASE] | all_flags_grantable_on_table_level;
307309
}
308310

@@ -353,7 +355,7 @@ namespace
353355
std::unordered_map<std::string_view, Flags> keyword_to_flags_map;
354356
std::vector<Flags> access_type_to_flags_mapping;
355357
Flags all_flags;
356-
Flags all_flags_for_target[static_cast<size_t>(TABLE_ENGINE) + 1];
358+
Flags all_flags_for_target[static_cast<size_t>(DEFINER) + 1];
357359
Flags all_flags_grantable_on_database_level;
358360
Flags all_flags_grantable_on_table_level;
359361
Flags all_flags_grantable_on_global_with_parameter_level;
@@ -377,11 +379,15 @@ std::unordered_map<AccessFlags::ParameterType, AccessFlags> AccessFlags::splitIn
377379
if (user_flags)
378380
result.emplace(ParameterType::USER_NAME, user_flags);
379381

382+
auto definer_flags = AccessFlags::allDefinerFlags() & *this;
383+
if (definer_flags)
384+
result.emplace(ParameterType::DEFINER, definer_flags);
385+
380386
auto table_engine_flags = AccessFlags::allTableEngineFlags() & *this;
381387
if (table_engine_flags)
382388
result.emplace(ParameterType::TABLE_ENGINE, table_engine_flags);
383389

384-
auto other_flags = (~named_collection_flags & ~user_flags & ~table_engine_flags) & *this;
390+
auto other_flags = (~named_collection_flags & ~user_flags & ~definer_flags & ~table_engine_flags) & *this;
385391
if (other_flags)
386392
result.emplace(ParameterType::NONE, other_flags);
387393

@@ -400,6 +406,9 @@ AccessFlags::ParameterType AccessFlags::getParameterType() const
400406
if (AccessFlags::allUserNameFlags().contains(*this))
401407
return AccessFlags::USER_NAME;
402408

409+
if (AccessFlags::allDefinerFlags().contains(*this))
410+
return AccessFlags::DEFINER;
411+
403412
/// All flags refer to TABLE ENGINE access type.
404413
if (AccessFlags::allTableEngineFlags().contains(*this))
405414
return AccessFlags::TABLE_ENGINE;
@@ -423,6 +432,7 @@ AccessFlags AccessFlags::allColumnFlags() { return Helper::instance().getColumnF
423432
AccessFlags AccessFlags::allDictionaryFlags() { return Helper::instance().getDictionaryFlags(); }
424433
AccessFlags AccessFlags::allNamedCollectionFlags() { return Helper::instance().getNamedCollectionFlags(); }
425434
AccessFlags AccessFlags::allUserNameFlags() { return Helper::instance().getUserNameFlags(); }
435+
AccessFlags AccessFlags::allDefinerFlags() { return Helper::instance().getDefinerFlags(); }
426436
AccessFlags AccessFlags::allTableEngineFlags() { return Helper::instance().getTableEngineFlags(); }
427437
AccessFlags AccessFlags::allFlagsGrantableOnGlobalLevel() { return Helper::instance().getAllFlagsGrantableOnGlobalLevel(); }
428438
AccessFlags AccessFlags::allFlagsGrantableOnGlobalWithParameterLevel() { return Helper::instance().getAllFlagsGrantableOnGlobalWithParameterLevel(); }

src/Access/Common/AccessFlags.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class AccessFlags
5959
TABLE_ENGINE,
6060
NAMED_COLLECTION,
6161
USER_NAME,
62+
DEFINER,
6263
};
6364
ParameterType getParameterType() const;
6465
std::unordered_map<ParameterType, AccessFlags> splitIntoParameterTypes() const;
@@ -108,6 +109,9 @@ class AccessFlags
108109
/// Returns all the flags related to a user.
109110
static AccessFlags allUserNameFlags();
110111

112+
/// Returns all the flags related to a definer.
113+
static AccessFlags allDefinerFlags();
114+
111115
/// Returns all the flags related to a table engine.
112116
static AccessFlags allTableEngineFlags();
113117

src/Access/Common/AccessType.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ enum class AccessType : uint8_t
159159
M(SHOW_NAMED_COLLECTIONS_SECRETS, "SHOW NAMED COLLECTIONS SECRETS", NAMED_COLLECTION, NAMED_COLLECTION_ADMIN) \
160160
M(NAMED_COLLECTION, "NAMED COLLECTION USAGE, USE NAMED COLLECTION", NAMED_COLLECTION, NAMED_COLLECTION_ADMIN) \
161161
M(NAMED_COLLECTION_ADMIN, "NAMED COLLECTION CONTROL", NAMED_COLLECTION, ALL) \
162-
M(SET_DEFINER, "", USER_NAME, ALL) \
162+
M(SET_DEFINER, "", DEFINER, ALL) \
163163
\
164164
M(TABLE_ENGINE, "TABLE ENGINE", TABLE_ENGINE, ALL) \
165165
\

src/Access/tests/gtest_access_rights_ops.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,8 @@ TEST(AccessRights, Union)
288288
"SYSTEM DROP REPLICA, SYSTEM SYNC REPLICA, SYSTEM RESTART REPLICA, "
289289
"SYSTEM RESTORE REPLICA, SYSTEM WAIT LOADING PARTS, SYSTEM SYNC DATABASE REPLICA, SYSTEM FLUSH DISTRIBUTED, "
290290
"SYSTEM LOAD PRIMARY KEY, SYSTEM UNLOAD PRIMARY KEY, dictGet ON db1.*, GRANT TABLE ENGINE ON db1, "
291-
"GRANT CREATE USER, ALTER USER, DROP USER, CREATE ROLE, ALTER ROLE, DROP ROLE, SET DEFINER ON db1, "
291+
"GRANT SET DEFINER ON db1, "
292+
"GRANT CREATE USER, ALTER USER, DROP USER, CREATE ROLE, ALTER ROLE, DROP ROLE ON db1, "
292293
"GRANT NAMED COLLECTION ADMIN ON db1");
293294

294295
lhs = {};

src/Storages/System/StorageSystemPrivileges.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ namespace
3131
NAMED_COLLECTION,
3232
USER_NAME,
3333
TABLE_ENGINE,
34+
DEFINER,
3435
};
3536

3637
DataTypeEnum8::Values getLevelEnumValues()
@@ -45,6 +46,7 @@ namespace
4546
enum_values.emplace_back("NAMED_COLLECTION", static_cast<Int8>(NAMED_COLLECTION));
4647
enum_values.emplace_back("USER_NAME", static_cast<Int8>(USER_NAME));
4748
enum_values.emplace_back("TABLE_ENGINE", static_cast<Int8>(TABLE_ENGINE));
49+
enum_values.emplace_back("DEFINER", static_cast<Int8>(DEFINER));
4850
return enum_values;
4951
}
5052
}

tests/integration/test_enable_user_name_access_type/test.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from helpers.cluster import ClickHouseCluster
22

33

4-
def test_startup_scripts():
4+
def test_enable_username_access_type():
55
cluster = ClickHouseCluster(__file__)
66

77
node = cluster.add_instance(
@@ -17,11 +17,12 @@ def test_startup_scripts():
1717
cluster.start()
1818
node.query("CREATE USER foobar")
1919
node.query("GRANT CREATE USER ON * TO foobar")
20+
node.query("GRANT SET DEFINER ON * TO foobar")
2021
assert (
21-
node.query(
22+
sorted(node.query(
2223
"SHOW GRANTS FOR foobar"
23-
)
24-
== "GRANT CREATE USER ON *.* TO foobar\n"
24+
).strip().split('\n'))
25+
== ["GRANT CREATE USER ON *.* TO foobar", "GRANT SET DEFINER ON * TO foobar"]
2526
)
2627
node.query("DROP USER foobar")
2728
finally:

tests/queries/0_stateless/01271_show_privileges.reference

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ SHOW NAMED COLLECTIONS ['SHOW NAMED COLLECTIONS'] NAMED_COLLECTION NAMED COLLECT
110110
SHOW NAMED COLLECTIONS SECRETS ['SHOW NAMED COLLECTIONS SECRETS'] NAMED_COLLECTION NAMED COLLECTION ADMIN
111111
NAMED COLLECTION ['NAMED COLLECTION USAGE','USE NAMED COLLECTION'] NAMED_COLLECTION NAMED COLLECTION ADMIN
112112
NAMED COLLECTION ADMIN ['NAMED COLLECTION CONTROL'] NAMED_COLLECTION ALL
113-
SET DEFINER [] USER_NAME ALL
113+
SET DEFINER [] DEFINER ALL
114114
TABLE ENGINE ['TABLE ENGINE'] TABLE_ENGINE ALL
115115
SYSTEM SHUTDOWN ['SYSTEM KILL','SHUTDOWN'] GLOBAL SYSTEM
116116
SYSTEM DROP DNS CACHE ['SYSTEM DROP DNS','DROP DNS CACHE','DROP DNS'] GLOBAL SYSTEM DROP CACHE

0 commit comments

Comments
 (0)