11#include " grpc_request_proxy.h"
22#include " service_auth.h"
3+ #include " audit_logins.h"
34
45#include " rpc_request_base.h"
56
@@ -28,8 +29,6 @@ class TLoginRPC : public TRpcRequestActor<TLoginRPC, TEvLoginRequest, true> {
2829public:
2930 using TRpcRequestActor::TRpcRequestActor;
3031
31- THolder<TEvSchemeShard::TEvLoginResult> Result;
32- Ydb::StatusIds_StatusCode Status = Ydb::StatusIds::SUCCESS;
3332 TDuration Timeout = TDuration::MilliSeconds(60000 );
3433 TActorId PipeClient;
3534
@@ -50,8 +49,7 @@ class TLoginRPC : public TRpcRequestActor<TLoginRPC, TEvLoginRequest, true> {
5049 }
5150
5251 void HandleTimeout () {
53- Status = Ydb::StatusIds::TIMEOUT;
54- ReplyAndPassAway ();
52+ ReplyErrorAndPassAway (Ydb::StatusIds::TIMEOUT, " Login timeout" );
5553 }
5654
5755 void HandleNavigate (TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev) {
@@ -68,42 +66,39 @@ class TLoginRPC : public TRpcRequestActor<TLoginRPC, TEvLoginRequest, true> {
6866 return ;
6967 }
7068 }
71- Status = Ydb::StatusIds::SCHEME_ERROR;
72- ReplyAndPassAway ();
69+ ReplyErrorAndPassAway (Ydb::StatusIds::SCHEME_ERROR, " No database found" );
7370 }
7471
7572 void Handle (TEvLdapAuthProvider::TEvAuthenticateResponse::TPtr& ev) {
76- TEvLdapAuthProvider::TEvAuthenticateResponse* response = ev->Get ();
77- if (response-> Status == TEvLdapAuthProvider::EStatus::SUCCESS) {
73+ const TEvLdapAuthProvider::TEvAuthenticateResponse& response = * ev->Get ();
74+ if (response. Status == TEvLdapAuthProvider::EStatus::SUCCESS) {
7875 Send (MakeSchemeCacheID (), new TEvTxProxySchemeCache::TEvNavigateKeySet (CreateNavigateKeySetRequest (PathToDatabase).Release ()));
7976 } else {
80- TResponse loginResponse;
81- Ydb::Operations::Operation& operation = *loginResponse.mutable_operation ();
82- Ydb::Issue::IssueMessage* issue = operation.add_issues ();
83- issue->set_message (response->Error .Message );
84- Status = ConvertLdapStatus (response->Status );
85- issue->set_issue_code (Status);
86- operation.set_ready (true );
87- operation.set_status (Status);
88- Reply (loginResponse);
77+ ReplyErrorAndPassAway (ConvertLdapStatus (response.Status ), response.Error .Message , response.Error .LogMessage );
8978 }
9079 }
9180
9281 void HandleResult (TEvSchemeShard::TEvLoginResult::TPtr& ev) {
93- Status = Ydb::StatusIds::SUCCESS;
94- Result = ev->Release ();
95- ReplyAndPassAway ();
82+ const NKikimrScheme::TEvLoginResult& loginResult = ev->Get ()->Record ;
83+ if (loginResult.error ()) {
84+ // explicit error takes precedence
85+ ReplyErrorAndPassAway (Ydb::StatusIds::UNAUTHORIZED, loginResult.error (), /* loginResult.details()*/ TString ());
86+ } else if (loginResult.token ().empty ()) {
87+ // empty token is still an error
88+ ReplyErrorAndPassAway (Ydb::StatusIds::INTERNAL_ERROR, " Failed to produce a token" );
89+ } else {
90+ // success = token + no errors
91+ ReplyAndPassAway (loginResult.token ());
92+ }
9693 }
9794
9895 void HandleUndelivered (TEvents::TEvUndelivered::TPtr&) {
99- Status = Ydb::StatusIds::UNAVAILABLE;
100- ReplyAndPassAway ();
96+ ReplyErrorAndPassAway (Ydb::StatusIds::UNAVAILABLE, " SchemeShard is unreachable" );
10197 }
10298
10399 void HandleConnect (TEvTabletPipe::TEvClientConnected::TPtr& ev) {
104100 if (ev->Get ()->Status != NKikimrProto::OK) {
105- Status = Ydb::StatusIds::UNAVAILABLE;
106- ReplyAndPassAway ();
101+ ReplyErrorAndPassAway (Ydb::StatusIds::UNAVAILABLE, " SchemeShard is unavailable" );
107102 }
108103 }
109104
@@ -118,28 +113,46 @@ class TLoginRPC : public TRpcRequestActor<TLoginRPC, TEvLoginRequest, true> {
118113 }
119114 }
120115
121- void ReplyAndPassAway () {
122- if (PipeClient) {
123- NTabletPipe::CloseClient (SelfId (), PipeClient);
124- }
116+ void ReplyAndPassAway (const TString& resultToken) {
125117 TResponse response;
118+
126119 Ydb::Operations::Operation& operation = *response.mutable_operation ();
127- if (Result) {
128- const NKikimrScheme::TEvLoginResult& record = Result->Record ;
129- if (record.error ()) {
130- Ydb::Issue::IssueMessage* issue = operation.add_issues ();
131- issue->set_message (record.error ());
132- issue->set_issue_code (Ydb::StatusIds::UNAUTHORIZED);
133- Status = Ydb::StatusIds::UNAUTHORIZED;
134- }
135- if (record.token ()) {
136- Ydb::Auth::LoginResult result;
137- result.set_token (record.token ());
138- operation.mutable_result ()->PackFrom (result);
139- }
120+ operation.set_ready (true );
121+ operation.set_status (Ydb::StatusIds::SUCCESS);
122+ // Pack result to google::protobuf::Any
123+ {
124+ Ydb::Auth::LoginResult result;
125+ result.set_token (resultToken);
126+ operation.mutable_result ()->PackFrom (result);
140127 }
128+
129+ AuditLogLogin (Request.Get (), PathToDatabase, *GetProtoRequest (), response, /* errorDetails */ TString ());
130+
131+ return CleanupAndReply (response);
132+ }
133+
134+ void ReplyErrorAndPassAway (const Ydb::StatusIds_StatusCode status, const TString& error, const TString& reason = " " ) {
135+ TResponse response;
136+
137+ Ydb::Operations::Operation& operation = *response.mutable_operation ();
141138 operation.set_ready (true );
142- operation.set_status (Status);
139+ operation.set_status (status);
140+ if (error) {
141+ Ydb::Issue::IssueMessage* issue = operation.add_issues ();
142+ issue->set_issue_code (status);
143+ issue->set_message (error);
144+ }
145+
146+ AuditLogLogin (Request.Get (), PathToDatabase, *GetProtoRequest (), response, reason);
147+
148+ return CleanupAndReply (response);
149+ }
150+
151+ void CleanupAndReply (const TResponse& response) {
152+ if (PipeClient) {
153+ NTabletPipe::CloseClient (SelfId (), PipeClient);
154+ }
155+
143156 return Reply (response);
144157 }
145158
0 commit comments