@@ -26,23 +26,30 @@ namespace {
26
26
}
27
27
28
28
NThreading::TPromise<NKikimr::NKqp::TEvDescribeSecretsResponse::TDescription>
29
- ResolveSecret (const TVector<TString>& secretNames, NKikimr::NKqp::TKikimrRunner& kikimr, const TString& userId = " " ) {
29
+ ResolveSecret (const TVector<TString>& secretNames, NKikimr::NKqp::TKikimrRunner& kikimr, const TIntrusiveConstPtr<NACLib::TUserToken> userToken = nullptr ) {
30
30
auto promise = NThreading::NewPromise<NKikimr::NKqp::TEvDescribeSecretsResponse::TDescription>();
31
- const auto evResolveSecret = new NKikimr::NKqp::TDescribeSchemaSecretsService::TEvResolveSecret (userId , secretNames, promise);
31
+ const auto evResolveSecret = new NKikimr::NKqp::TDescribeSchemaSecretsService::TEvResolveSecret (userToken , secretNames, promise);
32
32
auto actorSystem = kikimr.GetTestServer ().GetRuntime ()->GetActorSystem (0 );
33
33
actorSystem->Send (NKikimr::NKqp::MakeKqpDescribeSchemaSecretServiceId (actorSystem->NodeId ), evResolveSecret);
34
34
return promise;
35
35
}
36
36
37
37
NThreading::TPromise<NKikimr::NKqp::TEvDescribeSecretsResponse::TDescription>
38
- ResolveSecret (const TString& secretName, NKikimr::NKqp::TKikimrRunner& kikimr, const TString& userId = " " ) {
39
- return ResolveSecret (TVector<TString>{secretName}, kikimr, userId );
38
+ ResolveSecret (const TString& secretName, NKikimr::NKqp::TKikimrRunner& kikimr, const TIntrusiveConstPtr<NACLib::TUserToken> userToken = nullptr ) {
39
+ return ResolveSecret (TVector<TString>{secretName}, kikimr, userToken );
40
40
}
41
41
42
42
void AssertBadRequest (NThreading::TPromise<NKikimr::NKqp::TEvDescribeSecretsResponse::TDescription> promise, const TString& err) {
43
43
UNIT_ASSERT_VALUES_EQUAL (Ydb::StatusIds::BAD_REQUEST, promise.GetFuture ().GetValueSync ().Status );
44
44
UNIT_ASSERT_VALUES_EQUAL (err, promise.GetFuture ().GetValueSync ().Issues .ToString ());
45
45
}
46
+
47
+ TIntrusiveConstPtr<NACLib::TUserToken> GetUserToken (const TString& userSid = " " , const TVector<TString>& groupSids = {}) {
48
+ if (userSid.empty () && groupSids.empty ()) {
49
+ return nullptr ;
50
+ }
51
+ return new NACLib::TUserToken (userSid, groupSids);
52
+ }
46
53
}
47
54
48
55
Y_UNIT_TEST_SUITE (DescribeSchemaSecretsService) {
@@ -201,11 +208,12 @@ Y_UNIT_TEST_SUITE(DescribeSchemaSecretsService) {
201
208
202
209
CreateSchemaSecret (secretName, secretValue, adminSession);
203
210
204
- auto promise = ResolveSecret (secretName, kikimr, " root@builtin" );
211
+ auto promise = ResolveSecret (secretName, kikimr, GetUserToken ( " root@builtin" ) );
205
212
UNIT_ASSERT_VALUES_EQUAL (secretValue, promise.GetFuture ().GetValueSync ().SecretValues [0 ]);
206
213
214
+ const auto userToken = GetUserToken (" user@builtin" );
207
215
{ // assert no grants by default
208
- auto promise = ResolveSecret (" /Root/secret-name" , kikimr, " user@builtin " );
216
+ auto promise = ResolveSecret (" /Root/secret-name" , kikimr, userToken );
209
217
AssertBadRequest (promise, " <main>: Error: secret `/Root/secret-name` not found\n " );
210
218
}
211
219
@@ -216,7 +224,7 @@ Y_UNIT_TEST_SUITE(DescribeSchemaSecretsService) {
216
224
UNIT_ASSERT_C (grantResult.GetStatus () == NYdb::EStatus::SUCCESS, grantResult.GetIssues ().ToString ());
217
225
218
226
{ // assert grants are ok
219
- auto promise = ResolveSecret (" /Root/secret-name" , kikimr, " user@builtin " );
227
+ auto promise = ResolveSecret (" /Root/secret-name" , kikimr, userToken );
220
228
UNIT_ASSERT_VALUES_EQUAL (secretValue, promise.GetFuture ().GetValueSync ().SecretValues [0 ]);
221
229
}
222
230
@@ -227,7 +235,54 @@ Y_UNIT_TEST_SUITE(DescribeSchemaSecretsService) {
227
235
UNIT_ASSERT_C (revokeResult.GetStatus () == NYdb::EStatus::SUCCESS, grantResult.GetIssues ().ToString ());
228
236
229
237
{ // assert no grants after revoking
230
- auto promise = ResolveSecret (" /Root/secret-name" , kikimr, " user@builtin" );
238
+ auto promise = ResolveSecret (" /Root/secret-name" , kikimr, userToken);
239
+ AssertBadRequest (promise, " <main>: Error: secret `/Root/secret-name` not found\n " );
240
+ }
241
+ }
242
+
243
+ Y_UNIT_TEST (GroupGrants) {
244
+ NKikimr::NKqp::TKikimrRunner kikimr;
245
+ kikimr.GetTestServer ().GetRuntime ()->GetAppData (0 ).FeatureFlags .SetEnableSchemaSecrets (true );
246
+
247
+ const TString secretName = " /Root/secret-name" ;
248
+ const TString secretValue = " secret-value" ;
249
+ auto adminSession = kikimr.GetTableClient (NYdb::NTable::TClientSettings ().AuthToken (" root@builtin" ))
250
+ .CreateSession ().GetValueSync ().GetSession ();
251
+
252
+ CreateSchemaSecret (secretName, secretValue, adminSession);
253
+
254
+ auto promise = ResolveSecret (secretName, kikimr, GetUserToken (" root@builtin" ));
255
+ UNIT_ASSERT_VALUES_EQUAL (secretValue, promise.GetFuture ().GetValueSync ().SecretValues [0 ]);
256
+
257
+ const auto userToken = GetUserToken (" user@builtin" , {" group" });
258
+ { // assert no grants by default
259
+ auto promise = ResolveSecret (" /Root/secret-name" , kikimr, userToken);
260
+ AssertBadRequest (promise, " <main>: Error: secret `/Root/secret-name` not found\n " );
261
+ }
262
+
263
+ const auto createGroupResult = adminSession.ExecuteSchemeQuery (
264
+ Sprintf (" CREATE GROUP `group` WITH USER `user@builtin`;" )
265
+ ).GetValueSync ();
266
+ UNIT_ASSERT_C (createGroupResult.GetStatus () == NYdb::EStatus::SUCCESS, createGroupResult.GetIssues ().ToString ());
267
+
268
+ const auto grantResult = adminSession.ExecuteSchemeQuery (
269
+ Sprintf (" GRANT 'ydb.granular.select_row' ON `%s` TO `%s`;" , secretName.data (), " group" )
270
+ ).GetValueSync ();
271
+ UNIT_ASSERT_C (grantResult.GetStatus () == NYdb::EStatus::SUCCESS, grantResult.GetIssues ().ToString ());
272
+
273
+ { // assert group grants are ok
274
+ auto promise = ResolveSecret (" /Root/secret-name" , kikimr, userToken);
275
+ UNIT_ASSERT_VALUES_EQUAL (secretValue, promise.GetFuture ().GetValueSync ().SecretValues [0 ]);
276
+ }
277
+
278
+ // revoke grants
279
+ const auto revokeResult = adminSession.ExecuteSchemeQuery (
280
+ Sprintf (" REVOKE 'ydb.granular.select_row' ON `%s` FROM `%s`;" , secretName.data (), " group" )
281
+ ).GetValueSync ();
282
+ UNIT_ASSERT_C (revokeResult.GetStatus () == NYdb::EStatus::SUCCESS, grantResult.GetIssues ().ToString ());
283
+
284
+ { // assert no grants after revoking
285
+ auto promise = ResolveSecret (" /Root/secret-name" , kikimr, userToken);
231
286
AssertBadRequest (promise, " <main>: Error: secret `/Root/secret-name` not found\n " );
232
287
}
233
288
}
@@ -331,8 +386,9 @@ Y_UNIT_TEST_SUITE(DescribeSchemaSecretsService) {
331
386
).GetValueSync ();
332
387
UNIT_ASSERT_C (grantResult.GetStatus () == NYdb::EStatus::SUCCESS, grantResult.GetIssues ().ToString ());
333
388
389
+ auto userToken = GetUserToken (" user@builtin" );
334
390
{ // user has grants for names[0], has no grants for names[1]
335
- auto promise = ResolveSecret ({names[0 ], names[1 ]}, kikimr, " user@builtin " );
391
+ auto promise = ResolveSecret ({names[0 ], names[1 ]}, kikimr, userToken );
336
392
AssertBadRequest (promise, " <main>: Error: secret `/Root/secret-name-1` not found\n " );
337
393
}
338
394
@@ -342,7 +398,7 @@ Y_UNIT_TEST_SUITE(DescribeSchemaSecretsService) {
342
398
UNIT_ASSERT_C (grantResult.GetStatus () == NYdb::EStatus::SUCCESS, grantResult.GetIssues ().ToString ());
343
399
344
400
{ // user has grants for all names[0]
345
- auto promise = ResolveSecret ({names[0 ], names[1 ]}, kikimr, " user@builtin " );
401
+ auto promise = ResolveSecret ({names[0 ], names[1 ]}, kikimr, userToken );
346
402
for (size_t i = 0 ; i < values.size (); ++i) {
347
403
UNIT_ASSERT_VALUES_EQUAL (values[i], promise.GetFuture ().GetValueSync ().SecretValues [i]);
348
404
}
0 commit comments