@@ -189,6 +189,38 @@ Y_UNIT_TEST_SUITE(TGRpcClientLowTest) {
189189 UNIT_ASSERT (allDoneOk);
190190 }
191191
192+ std::pair<Ydb::StatusIds::StatusCode, grpc::StatusCode> MakeTestRequest (NGRpcProxy::TGRpcClientConfig& clientConfig, const TString& database, const TString& token) {
193+ NYdbGrpc::TCallMeta meta;
194+ if (token) { // empty token => no token
195+ meta.Aux .push_back ({YDB_AUTH_TICKET_HEADER, token});
196+ }
197+ meta.Aux .push_back ({YDB_DATABASE_HEADER, database});
198+
199+ NYdbGrpc::TGRpcClientLow clientLow;
200+ auto connection = clientLow.CreateGRpcServiceConnection <Ydb::Table::V1::TableService>(clientConfig);
201+
202+ Ydb::StatusIds::StatusCode status;
203+ grpc::StatusCode gStatus ;
204+
205+ do {
206+ auto promise = NThreading::NewPromise<void >();
207+ Ydb::Table::CreateSessionRequest request;
208+ NYdbGrpc::TResponseCallback<Ydb::Table::CreateSessionResponse> responseCb =
209+ [&status, &gStatus , promise](NYdbGrpc::TGrpcStatus&& grpcStatus, Ydb::Table::CreateSessionResponse&& response) mutable {
210+ UNIT_ASSERT (!grpcStatus.InternalError );
211+ gStatus = grpc::StatusCode (grpcStatus.GRpcStatusCode );
212+ auto deferred = response.operation ();
213+ status = deferred.status ();
214+ promise.SetValue ();
215+ };
216+
217+ connection->DoRequest (request, std::move (responseCb), &Ydb::Table::V1::TableService::Stub::AsyncCreateSession, meta);
218+ promise.GetFuture ().Wait ();
219+ } while (status == Ydb::StatusIds::UNAVAILABLE);
220+ Cerr << " TestRequest(database=\" " << database << " \" , token=\" " << token << " \" ) => {" << Ydb::StatusIds::StatusCode_Name (status) << " , " << int (gStatus ) << " }" << Endl;
221+ return std::make_pair (status, gStatus );
222+ }
223+
192224 Y_UNIT_TEST (GrpcRequestProxy) {
193225 NKikimrConfig::TAppConfig appConfig;
194226 appConfig.MutableDomainsConfig ()->MutableSecurityConfig ()->SetEnforceUserTokenRequirement (true );
@@ -197,79 +229,61 @@ Y_UNIT_TEST_SUITE(TGRpcClientLowTest) {
197229 ui16 grpc = server.GetPort ();
198230 TString location = TStringBuilder () << " localhost:" << grpc;
199231 auto clientConfig = NGRpcProxy::TGRpcClientConfig (location);
200- auto doTest = [&](const TString& database) {
201- NYdbGrpc::TCallMeta meta;
202- meta.Aux .push_back ({YDB_AUTH_TICKET_HEADER, " root@builtin" });
203- meta.Aux .push_back ({YDB_DATABASE_HEADER, database});
204-
205- NYdbGrpc::TGRpcClientLow clientLow;
206- auto connection = clientLow.CreateGRpcServiceConnection <Ydb::Table::V1::TableService>(clientConfig);
207232
208- Ydb::StatusIds::StatusCode status;
209- int gStatus ;
233+ UNIT_ASSERT_EQUAL (MakeTestRequest (clientConfig, " /Root" , " root@builtin" ), std::make_pair (Ydb::StatusIds::SUCCESS, grpc::StatusCode::OK));
234+ UNIT_ASSERT_EQUAL (MakeTestRequest (clientConfig, " /blabla" , " root@builtin" ), std::make_pair (Ydb::StatusIds::STATUS_CODE_UNSPECIFIED, grpc::StatusCode::UNAUTHENTICATED));
235+ UNIT_ASSERT_EQUAL (MakeTestRequest (clientConfig, " blabla" , " root@builtin" ), std::make_pair (Ydb::StatusIds::STATUS_CODE_UNSPECIFIED, grpc::StatusCode::UNAUTHENTICATED));
236+ }
210237
211- do {
212- auto promise = NThreading::NewPromise<void >();
213- Ydb::Table::CreateSessionRequest request;
214- NYdbGrpc::TResponseCallback<Ydb::Table::CreateSessionResponse> responseCb =
215- [&status, &gStatus , promise](NYdbGrpc::TGrpcStatus&& grpcStatus, Ydb::Table::CreateSessionResponse&& response) mutable {
216- UNIT_ASSERT (!grpcStatus.InternalError );
217- gStatus = grpcStatus.GRpcStatusCode ;
218- auto deferred = response.operation ();
219- status = deferred.status ();
220- promise.SetValue ();
221- };
238+ Y_UNIT_TEST (GrpcRequestProxyWithoutToken) {
239+ NKikimrConfig::TAppConfig appConfig;
240+ appConfig.MutableDomainsConfig ()->MutableSecurityConfig ()->SetEnforceUserTokenRequirement (true );
241+ TKikimrWithGrpcAndRootSchemaWithAuth server (appConfig);
222242
223- connection->DoRequest (request, std::move (responseCb), &Ydb::Table::V1::TableService::Stub::AsyncCreateSession, meta);
224- promise.GetFuture ().Wait ();
225- } while (status == Ydb::StatusIds::UNAVAILABLE);
226- return std::make_pair (status, gStatus );
227- };
243+ ui16 grpc = server.GetPort ();
244+ TString location = TStringBuilder () << " localhost:" << grpc;
245+ auto clientConfig = NGRpcProxy::TGRpcClientConfig (location);
228246
229- UNIT_ASSERT_VALUES_EQUAL ( doTest ( " /Root" ), std::make_pair (Ydb::StatusIds::SUCCESS, 0 ));
230- UNIT_ASSERT_VALUES_EQUAL ( doTest ( " /blabla" ), std::make_pair (Ydb::StatusIds::STATUS_CODE_UNSPECIFIED, 16 ));
231- UNIT_ASSERT_VALUES_EQUAL ( doTest ( " blabla" ), std::make_pair (Ydb::StatusIds::STATUS_CODE_UNSPECIFIED, 16 ));
247+ UNIT_ASSERT_EQUAL ( MakeTestRequest (clientConfig, " /Root" , " " ), std::make_pair (Ydb::StatusIds::STATUS_CODE_UNSPECIFIED, grpc::StatusCode::UNAUTHENTICATED ));
248+ UNIT_ASSERT_EQUAL ( MakeTestRequest (clientConfig, " /blabla" , " " ), std::make_pair (Ydb::StatusIds::STATUS_CODE_UNSPECIFIED, grpc::StatusCode::UNAUTHENTICATED ));
249+ UNIT_ASSERT_EQUAL ( MakeTestRequest (clientConfig, " blabla" , " " ), std::make_pair (Ydb::StatusIds::STATUS_CODE_UNSPECIFIED, grpc::StatusCode::UNAUTHENTICATED ));
232250 }
233251
234- Y_UNIT_TEST (GrpcRequestProxyWithoutToken ) {
252+ void GrpcRequestProxyCheckTokenWhenItIsSpecified ( bool enforceUserTokenCheckRequirement ) {
235253 NKikimrConfig::TAppConfig appConfig;
236- appConfig.MutableDomainsConfig ()->MutableSecurityConfig ()->SetEnforceUserTokenRequirement (true );
254+ appConfig.MutableDomainsConfig ()->MutableSecurityConfig ()->SetEnforceUserTokenRequirement (false );
255+ appConfig.MutableDomainsConfig ()->MutableSecurityConfig ()->SetEnforceUserTokenCheckRequirement (enforceUserTokenCheckRequirement);
237256 TKikimrWithGrpcAndRootSchemaWithAuth server (appConfig);
238257
239258 ui16 grpc = server.GetPort ();
240259 TString location = TStringBuilder () << " localhost:" << grpc;
241260 auto clientConfig = NGRpcProxy::TGRpcClientConfig (location);
242- auto doTest = [&](const TString& database) {
243- NYdbGrpc::TCallMeta meta;
244- meta.Aux .push_back ({YDB_DATABASE_HEADER, database});
245261
246- NYdbGrpc::TGRpcClientLow clientLow;
247- auto connection = clientLow.CreateGRpcServiceConnection <Ydb::Table::V1::TableService>(clientConfig);
262+ UNIT_ASSERT_EQUAL (MakeTestRequest (clientConfig, " /Root" , " " ), std::make_pair (Ydb::StatusIds::SUCCESS, grpc::StatusCode::OK));
263+ UNIT_ASSERT_EQUAL (MakeTestRequest (clientConfig, " /blabla" , " " ), std::make_pair (Ydb::StatusIds::SUCCESS, grpc::StatusCode::OK));
264+ UNIT_ASSERT_EQUAL (MakeTestRequest (clientConfig, " blabla" , " " ), std::make_pair (Ydb::StatusIds::SUCCESS, grpc::StatusCode::OK));
248265
249- Ydb::StatusIds::StatusCode status;
250- grpc::StatusCode gStatus ;
266+ UNIT_ASSERT_EQUAL (MakeTestRequest (clientConfig, " /Root" , " root@builtin" ), std::make_pair (Ydb::StatusIds::SUCCESS, grpc::StatusCode::OK));
267+ UNIT_ASSERT_EQUAL (MakeTestRequest (clientConfig, " /blabla" , " root@builtin" ), std::make_pair (Ydb::StatusIds::STATUS_CODE_UNSPECIFIED, grpc::StatusCode::UNAUTHENTICATED));
268+ UNIT_ASSERT_EQUAL (MakeTestRequest (clientConfig, " blabla" , " root@builtin" ), std::make_pair (Ydb::StatusIds::STATUS_CODE_UNSPECIFIED, grpc::StatusCode::UNAUTHENTICATED));
251269
252- do {
253- auto promise = NThreading::NewPromise<void >();
254- Ydb::Table::CreateSessionRequest request;
255- NYdbGrpc::TResponseCallback<Ydb::Table::CreateSessionResponse> responseCb =
256- [&status, &gStatus , promise](NYdbGrpc::TGrpcStatus&& grpcStatus, Ydb::Table::CreateSessionResponse&& response) mutable {
257- UNIT_ASSERT (!grpcStatus.InternalError );
258- gStatus = grpc::StatusCode (grpcStatus.GRpcStatusCode );
259- auto deferred = response.operation ();
260- status = deferred.status ();
261- promise.SetValue ();
262- };
270+ const auto reqResultWithInvalidToken = MakeTestRequest (clientConfig, " /Root" , " invalid token" );
271+ if (enforceUserTokenCheckRequirement) {
272+ UNIT_ASSERT_EQUAL (reqResultWithInvalidToken, std::make_pair (Ydb::StatusIds::STATUS_CODE_UNSPECIFIED, grpc::StatusCode::UNAUTHENTICATED));
273+ } else {
274+ UNIT_ASSERT_EQUAL (reqResultWithInvalidToken, std::make_pair (Ydb::StatusIds::SUCCESS, grpc::StatusCode::OK));
275+ }
263276
264- connection->DoRequest (request, std::move (responseCb), &Ydb::Table::V1::TableService::Stub::AsyncCreateSession, meta);
265- promise.GetFuture ().Wait ();
266- } while (status == Ydb::StatusIds::UNAVAILABLE);
267- return std::make_pair (status, gStatus );
268- };
277+ UNIT_ASSERT_EQUAL (MakeTestRequest (clientConfig, " /blabla" , " invalid token" ), std::make_pair (Ydb::StatusIds::STATUS_CODE_UNSPECIFIED, grpc::StatusCode::UNAUTHENTICATED));
278+ UNIT_ASSERT_EQUAL (MakeTestRequest (clientConfig, " blabla" , " invalid token" ), std::make_pair (Ydb::StatusIds::STATUS_CODE_UNSPECIFIED, grpc::StatusCode::UNAUTHENTICATED));
279+ }
269280
270- UNIT_ASSERT_EQUAL (doTest (" /Root" ).second , grpc::StatusCode::UNAUTHENTICATED);
271- UNIT_ASSERT_EQUAL (doTest (" /blabla" ).second , grpc::StatusCode::UNAUTHENTICATED);
272- UNIT_ASSERT_EQUAL (doTest (" blabla" ).second , grpc::StatusCode::UNAUTHENTICATED);
281+ Y_UNIT_TEST (GrpcRequestProxyCheckTokenWhenItIsSpecified_Ignore) {
282+ GrpcRequestProxyCheckTokenWhenItIsSpecified (false );
283+ }
284+
285+ Y_UNIT_TEST (GrpcRequestProxyCheckTokenWhenItIsSpecified_Check) {
286+ GrpcRequestProxyCheckTokenWhenItIsSpecified (true );
273287 }
274288
275289 Y_UNIT_TEST (BiStreamPing) {
@@ -5614,7 +5628,7 @@ Y_UNIT_TEST(DisableWritesToDatabase) {
56145628
56155629 TTenants tenants (server);
56165630 tenants.Run (tenantPath, 1 );
5617-
5631+
56185632 TString table = Sprintf (" %s/table" , tenantPath.c_str ());
56195633 ExecSQL (server, sender, Sprintf (R"(
56205634 CREATE TABLE `%s` (
0 commit comments