@@ -1172,7 +1172,7 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
1172
1172
Value String,
1173
1173
PRIMARY KEY (Key)
1174
1174
)
1175
- )")
1175
+ )")
1176
1176
+ (СolumnTable ? TString("WITH (STORE = COLUMN)") : "");
1177
1177
auto result = session.ExecuteSchemeQuery(query).GetValueSync();
1178
1178
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
@@ -4850,6 +4850,150 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
4850
4850
}
4851
4851
}
4852
4852
4853
+ Y_UNIT_TEST(ModifySysViewDirPermissions) {
4854
+ NKikimrConfig::TFeatureFlags featureFlags;
4855
+ featureFlags.SetEnableRealSystemViewPaths(true);
4856
+ TKikimrRunner kikimr(featureFlags);
4857
+ kikimr.GetTestServer().GetRuntime()->GetAppData().AdministrationAllowedSIDs.push_back("root@builtin");
4858
+
4859
+ auto adminSession = kikimr.GetTableClient(NYdb::NTable::TClientSettings()
4860
+ .AuthToken("root@builtin")).CreateSession().GetValueSync().GetSession();
4861
+
4862
+ {
4863
+ auto query = TStringBuilder() << R"(
4864
+ --!syntax_v1
4865
+ GRANT 'ydb.granular.describe_schema' ON `/Root` TO `root@builtin`;
4866
+ GRANT 'ydb.database.connect' ON `/Root` TO `user@builtin`;
4867
+ )";
4868
+ auto result = adminSession.ExecuteSchemeQuery(query).GetValueSync();
4869
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
4870
+ }
4871
+
4872
+ auto driverConfig = kikimr.GetDriverConfig();
4873
+ driverConfig.SetAuthToken("user@builtin");
4874
+ const auto driver = TDriver(driverConfig);
4875
+ auto userSchemeClient = NYdb::NScheme::TSchemeClient(driver);
4876
+
4877
+ auto userSession = kikimr.GetTableClient(NYdb::NTable::TClientSettings()
4878
+ .AuthToken("user@builtin")).CreateSession().GetValueSync().GetSession();
4879
+
4880
+ {
4881
+ auto result = userSchemeClient.ListDirectory("/Root/.sys").GetValueSync();
4882
+ UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::UNAUTHORIZED);
4883
+ UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Access denied",
4884
+ result.GetIssues().ToString()
4885
+ );
4886
+ }
4887
+ {
4888
+ auto query = TStringBuilder() << R"(
4889
+ --!syntax_v1
4890
+ GRANT 'ydb.granular.describe_schema' ON `/Root/.sys` TO `user@builtin`;
4891
+ )";
4892
+ auto result = adminSession.ExecuteSchemeQuery(query).GetValueSync();
4893
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
4894
+ CheckPermissions(adminSession, {
4895
+ {.Path = "/Root/.sys",
4896
+ .Permissions = {
4897
+ {"user@builtin", {"ydb.granular.describe_schema"}}
4898
+ }
4899
+ },
4900
+ });
4901
+ }
4902
+ {
4903
+ auto result = userSchemeClient.ListDirectory("/Root/.sys").GetValueSync();
4904
+ UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
4905
+
4906
+ auto children = result.GetChildren();
4907
+ THashSet<TString> names;
4908
+ for (const auto& child : children) {
4909
+ names.insert(TString{child.Name});
4910
+ UNIT_ASSERT_VALUES_EQUAL(child.Type, NYdb::NScheme::ESchemeEntryType::SysView);
4911
+ }
4912
+ UNIT_ASSERT(names.contains("partition_stats"));
4913
+ }
4914
+ {
4915
+ auto query = TStringBuilder() << R"(
4916
+ --!syntax_v1
4917
+ GRANT 'ydb.granular.alter_schema' ON `/Root/.sys` TO `root@builtin`;
4918
+ )";
4919
+ auto result = userSession.ExecuteSchemeQuery(query).GetValueSync();
4920
+ UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::UNAUTHORIZED);
4921
+ UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(), "Access denied",
4922
+ result.GetIssues().ToString()
4923
+ );
4924
+ }
4925
+ {
4926
+ auto query = TStringBuilder() << R"(
4927
+ --!syntax_v1
4928
+ GRANT 'ydb.access.grant', 'ydb.granular.alter_schema' ON `/Root/.sys` TO `user@builtin`;
4929
+ )";
4930
+ auto result = adminSession.ExecuteSchemeQuery(query).GetValueSync();
4931
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
4932
+ CheckPermissions(adminSession, {{.Path = "/Root/.sys",
4933
+ .Permissions = {
4934
+ {"user@builtin", {"ydb.granular.describe_schema",
4935
+ "ydb.granular.alter_schema",
4936
+ "ydb.access.grant"}}
4937
+ }
4938
+ }});
4939
+ }
4940
+ {
4941
+ auto query = TStringBuilder() << R"(
4942
+ --!syntax_v1
4943
+ GRANT 'ydb.granular.alter_schema' ON `/Root/.sys` TO `root@builtin`;
4944
+ )";
4945
+ auto result = userSession.ExecuteSchemeQuery(query).GetValueSync();
4946
+ UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
4947
+ }
4948
+ }
4949
+
4950
+ Y_UNIT_TEST(ModifySysViewPermissions) {
4951
+ NKikimrConfig::TFeatureFlags featureFlags;
4952
+ featureFlags.SetEnableRealSystemViewPaths(true);
4953
+ TKikimrRunner kikimr(featureFlags, "root@builtin");
4954
+
4955
+ auto userSchemeClient = kikimr.GetSchemeClient();
4956
+ auto db = kikimr.GetTableClient();
4957
+ auto userSession = db.CreateSession().GetValueSync().GetSession();
4958
+ auto querySelect = TStringBuilder() << R"(
4959
+ --!syntax_v1
4960
+ SELECT * FROM `/Root/.sys/partition_stats`;
4961
+ )";
4962
+
4963
+ {
4964
+ auto result = userSession.ExecuteDataQuery(querySelect, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
4965
+ UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::SCHEME_ERROR);
4966
+ UNIT_ASSERT_STRING_CONTAINS_C(result.GetIssues().ToString(),
4967
+ "it does not exist or you do not have access permissions",
4968
+ result.GetIssues().ToString()
4969
+ );
4970
+ }
4971
+ {
4972
+ auto query = TStringBuilder() << R"(
4973
+ --!syntax_v1
4974
+ GRANT 'ydb.generic.read' ON `/Root/.sys/partition_stats` TO `root@builtin`;
4975
+ )";
4976
+ auto result = userSession.ExecuteSchemeQuery(query).GetValueSync();
4977
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
4978
+ CheckPermissions(userSession, {
4979
+ {.Path = "/Root/.sys/partition_stats",
4980
+ .Permissions = {
4981
+ {"root@builtin", {"ydb.generic.read"}}
4982
+ }
4983
+ },
4984
+ });
4985
+ }
4986
+ {
4987
+ auto result = userSession.ExecuteDataQuery(querySelect, TTxControl::BeginTx().CommitTx()).ExtractValueSync();
4988
+ UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
4989
+ UNIT_ASSERT_VALUES_EQUAL(result.GetResultSets().size(), 1);
4990
+
4991
+ auto rs = result.GetResultSet(0);
4992
+ UNIT_ASSERT_VALUES_EQUAL(rs.RowsCount(), 34);
4993
+ UNIT_ASSERT_VALUES_EQUAL(rs.ColumnsCount(), 30);
4994
+ }
4995
+ }
4996
+
4853
4997
Y_UNIT_TEST(ModifyUnknownPermissions) {
4854
4998
TKikimrRunner kikimr;
4855
4999
auto db = kikimr.GetTableClient();
0 commit comments