1
1
#include " grpc_request_proxy.h"
2
2
#include " service_auth.h"
3
+ #include " audit_logins.h"
3
4
4
5
#include " rpc_request_base.h"
5
6
@@ -28,8 +29,6 @@ class TLoginRPC : public TRpcRequestActor<TLoginRPC, TEvLoginRequest, true> {
28
29
public:
29
30
using TRpcRequestActor::TRpcRequestActor;
30
31
31
- THolder<TEvSchemeShard::TEvLoginResult> Result;
32
- Ydb::StatusIds_StatusCode Status = Ydb::StatusIds::SUCCESS;
33
32
TDuration Timeout = TDuration::MilliSeconds(60000 );
34
33
TActorId PipeClient;
35
34
@@ -50,8 +49,7 @@ class TLoginRPC : public TRpcRequestActor<TLoginRPC, TEvLoginRequest, true> {
50
49
}
51
50
52
51
void HandleTimeout () {
53
- Status = Ydb::StatusIds::TIMEOUT;
54
- ReplyAndPassAway ();
52
+ ReplyErrorAndPassAway (Ydb::StatusIds::TIMEOUT, " Login timeout" );
55
53
}
56
54
57
55
void HandleNavigate (TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev) {
@@ -68,42 +66,39 @@ class TLoginRPC : public TRpcRequestActor<TLoginRPC, TEvLoginRequest, true> {
68
66
return ;
69
67
}
70
68
}
71
- Status = Ydb::StatusIds::SCHEME_ERROR;
72
- ReplyAndPassAway ();
69
+ ReplyErrorAndPassAway (Ydb::StatusIds::SCHEME_ERROR, " No database found" );
73
70
}
74
71
75
72
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) {
78
75
Send (MakeSchemeCacheID (), new TEvTxProxySchemeCache::TEvNavigateKeySet (CreateNavigateKeySetRequest (PathToDatabase).Release ()));
79
76
} 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 );
89
78
}
90
79
}
91
80
92
81
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
+ }
96
93
}
97
94
98
95
void HandleUndelivered (TEvents::TEvUndelivered::TPtr&) {
99
- Status = Ydb::StatusIds::UNAVAILABLE;
100
- ReplyAndPassAway ();
96
+ ReplyErrorAndPassAway (Ydb::StatusIds::UNAVAILABLE, " SchemeShard is unreachable" );
101
97
}
102
98
103
99
void HandleConnect (TEvTabletPipe::TEvClientConnected::TPtr& ev) {
104
100
if (ev->Get ()->Status != NKikimrProto::OK) {
105
- Status = Ydb::StatusIds::UNAVAILABLE;
106
- ReplyAndPassAway ();
101
+ ReplyErrorAndPassAway (Ydb::StatusIds::UNAVAILABLE, " SchemeShard is unavailable" );
107
102
}
108
103
}
109
104
@@ -118,28 +113,46 @@ class TLoginRPC : public TRpcRequestActor<TLoginRPC, TEvLoginRequest, true> {
118
113
}
119
114
}
120
115
121
- void ReplyAndPassAway () {
122
- if (PipeClient) {
123
- NTabletPipe::CloseClient (SelfId (), PipeClient);
124
- }
116
+ void ReplyAndPassAway (const TString& resultToken) {
125
117
TResponse response;
118
+
126
119
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);
140
127
}
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 ();
141
138
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
+
143
156
return Reply (response);
144
157
}
145
158
0 commit comments