@@ -18,33 +18,8 @@ class TPgYdbProxy : public TActor<TPgYdbProxy> {
18
18
using TBase = TActor<TPgYdbProxy>;
19
19
20
20
struct TSecurityState {
21
- TString Ticket;
22
- Ydb::Auth::LoginResult LoginResult;
23
- TEvTicketParser::TError Error;
24
- TIntrusiveConstPtr<NACLib::TUserToken> Token;
25
21
TString SerializedToken;
26
- };
27
-
28
- struct TTokenState {
29
- std::unordered_set<TActorId> Senders;
30
- };
31
-
32
- struct TEvPrivate {
33
- enum EEv {
34
- EvTokenReady = EventSpaceBegin (NActors::TEvents::ES_PRIVATE),
35
- EvEnd
36
- };
37
-
38
- static_assert (EvEnd < EventSpaceEnd(NActors::TEvents::ES_PRIVATE), " expect EvEnd < EventSpaceEnd(NActors::TEvents::ES_PRIVATE)" );
39
-
40
- struct TEvTokenReady : TEventLocal<TEvTokenReady, EvTokenReady> {
41
- Ydb::Auth::LoginResult LoginResult;
42
- TActorId Sender;
43
- TString Database;
44
- TString PeerName;
45
-
46
- TEvTokenReady () = default ;
47
- };
22
+ TString Ticket;
48
23
};
49
24
50
25
struct TConnectionState {
@@ -54,7 +29,6 @@ class TPgYdbProxy : public TActor<TPgYdbProxy> {
54
29
55
30
std::unordered_map<TActorId, TConnectionState> ConnectionState;
56
31
std::unordered_map<TActorId, TSecurityState> SecurityState;
57
- std::unordered_map<TString, TTokenState> TokenState;
58
32
uint32_t ConnectionNum = 0 ;
59
33
60
34
public:
@@ -63,85 +37,24 @@ class TPgYdbProxy : public TActor<TPgYdbProxy> {
63
37
{
64
38
}
65
39
66
- void Handle (TEvTicketParser::TEvAuthorizeTicketResult::TPtr& ev) {
67
- auto token = ev->Get ()->Ticket ;
68
- auto itTokenState = TokenState.find (token);
69
- if (itTokenState == TokenState.end ()) {
70
- BLOG_W (" Couldn't find token in reply from TicketParser" );
71
- return ;
72
- }
73
- for (auto sender : itTokenState->second .Senders ) {
74
- auto & securityState (SecurityState[sender]);
75
- securityState.Ticket = token;
76
- securityState.Error = ev->Get ()->Error ;
77
- securityState.Token = ev->Get ()->Token ;
78
- securityState.SerializedToken = ev->Get ()->SerializedToken ;
79
- auto authResponse = std::make_unique<NPG::TEvPGEvents::TEvAuthResponse>();
80
- if (ev->Get ()->Error ) {
81
- authResponse->Error = ev->Get ()->Error .Message ;
82
- }
83
- Send (sender, authResponse.release ());
84
- }
85
- TokenState.erase (itTokenState);
86
- }
87
-
88
- void Handle (TEvPrivate::TEvTokenReady::TPtr& ev) {
89
- auto token = ev->Get ()->LoginResult .token ();
90
- auto itTokenState = TokenState.find (token);
91
- if (itTokenState == TokenState.end ()) {
92
- itTokenState = TokenState.insert ({token, {}}).first ;
93
- }
94
- bool needSend = itTokenState->second .Senders .empty ();
95
- itTokenState->second .Senders .insert (ev->Get ()->Sender );
96
- if (needSend) {
97
- Send (MakeTicketParserID (), new TEvTicketParser::TEvAuthorizeTicket ({
98
- .Database = ev->Get ()->Database ,
99
- .Ticket = token,
100
- .PeerName = ev->Get ()->PeerName ,
101
- }));
102
- }
103
- SecurityState[ev->Get ()->Sender ].LoginResult = std::move (ev->Get ()->LoginResult );
104
- }
105
-
106
40
void Handle (NPG::TEvPGEvents::TEvAuth::TPtr& ev) {
107
- std::unordered_map<TString, TString> clientParams = ev->Get ()->InitialMessage ->GetClientParams ();
108
41
BLOG_D (" TEvAuth " << ev->Get ()->InitialMessage ->Dump () << " cookie " << ev->Cookie );
109
- Ydb::Auth::LoginRequest request;
110
- request.set_user (clientParams[" user" ]);
42
+ std::unordered_map<TString, TString> clientParams = ev->Get ()->InitialMessage ->GetClientParams ();
43
+ TPgWireAuthData pgWireAuthData;
44
+ pgWireAuthData.UserName = clientParams[" user" ];
111
45
if (ev->Get ()->PasswordMessage ) {
112
- request. set_password ( TString (ev->Get ()->PasswordMessage ->GetPassword () ));
46
+ pgWireAuthData. Password = TString (ev->Get ()->PasswordMessage ->GetPassword ());
113
47
}
114
- TActorSystem* actorSystem = TActivationContext::ActorSystem ();
115
- TActorId sender = ev->Sender ;
116
- TString database = clientParams[" database" ];
117
- if (database == " /postgres" ) {
48
+ pgWireAuthData.Sender = ev->Sender ;
49
+ pgWireAuthData.DatabasePath = clientParams[" database" ];
50
+ if (pgWireAuthData.DatabasePath == " /postgres" ) {
118
51
auto authResponse = std::make_unique<NPG::TEvPGEvents::TEvAuthResponse>();
119
52
authResponse->Error = Ydb::StatusIds_StatusCode_Name (Ydb::StatusIds_StatusCode::StatusIds_StatusCode_BAD_REQUEST);
120
- actorSystem-> Send (sender , authResponse.release ());
53
+ Send (pgWireAuthData. Sender , authResponse.release ());
121
54
}
122
- TString peerName = TStringBuilder () << ev->Get ()->Address ;
55
+ pgWireAuthData. PeerName = TStringBuilder () << ev->Get ()->Address ;
123
56
124
- using TRpcEv = NGRpcService::TGRpcRequestWrapperNoAuth<NGRpcService::TRpcServices::EvLogin, Ydb::Auth::LoginRequest, Ydb::Auth::LoginResponse>;
125
- auto rpcFuture = NRpcService::DoLocalRpc<TRpcEv>(std::move (request), database, {}, actorSystem);
126
- rpcFuture.Subscribe ([actorSystem, sender, database, peerName, selfId = SelfId ()](const NThreading::TFuture<Ydb::Auth::LoginResponse>& future) {
127
- auto & response = future.GetValueSync ();
128
- if (response.operation ().status () == Ydb::StatusIds::SUCCESS) {
129
- auto tokenReady = std::make_unique<TEvPrivate::TEvTokenReady>();
130
- response.operation ().result ().UnpackTo (&(tokenReady->LoginResult ));
131
- tokenReady->Sender = sender;
132
- tokenReady->Database = database;
133
- tokenReady->PeerName = peerName;
134
- actorSystem->Send (selfId, tokenReady.release ());
135
- } else {
136
- auto authResponse = std::make_unique<NPG::TEvPGEvents::TEvAuthResponse>();
137
- if (response.operation ().issues_size () > 0 ) {
138
- authResponse->Error = response.operation ().issues (0 ).message ();
139
- } else {
140
- authResponse->Error = Ydb::StatusIds_StatusCode_Name (response.operation ().status ());
141
- }
142
- actorSystem->Send (sender, authResponse.release ());
143
- }
144
- });
57
+ Register (CreateLocalPgWireAuthActor (pgWireAuthData, SelfId ()));
145
58
}
146
59
147
60
void Handle (NPG::TEvPGEvents::TEvConnectionOpened::TPtr& ev) {
@@ -173,7 +86,6 @@ class TPgYdbProxy : public TActor<TPgYdbProxy> {
173
86
}
174
87
SecurityState.erase (ev->Sender );
175
88
ConnectionState.erase (itConnection);
176
- // TODO: cleanup TokenState too
177
89
}
178
90
179
91
void Handle (NPG::TEvPGEvents::TEvQuery::TPtr& ev) {
@@ -236,6 +148,18 @@ class TPgYdbProxy : public TActor<TPgYdbProxy> {
236
148
}
237
149
}
238
150
151
+ void Handle (TEvEvents::TEvAuthResponse::TPtr& ev) {
152
+ auto & securityState = SecurityState[ev->Get ()->Sender ];
153
+ auto authResponse = std::make_unique<NPG::TEvPGEvents::TEvAuthResponse>();
154
+ if (!ev->Get ()->ErrorMessage .empty ()) {
155
+ authResponse->Error = ev->Get ()->ErrorMessage ;
156
+ } else {
157
+ securityState.SerializedToken = ev->Get ()->SerializedToken ;
158
+ securityState.Ticket = ev->Get ()->Ticket ;
159
+ }
160
+ Send (ev->Get ()->Sender , authResponse.release ());
161
+ }
162
+
239
163
STATEFN (StateWork) {
240
164
switch (ev->GetTypeRewrite ()) {
241
165
hFunc (NPG::TEvPGEvents::TEvAuth, Handle);
@@ -248,8 +172,7 @@ class TPgYdbProxy : public TActor<TPgYdbProxy> {
248
172
hFunc (NPG::TEvPGEvents::TEvExecute, Handle);
249
173
hFunc (NPG::TEvPGEvents::TEvClose, Handle);
250
174
hFunc (NPG::TEvPGEvents::TEvCancelRequest, Handle);
251
- hFunc (TEvPrivate::TEvTokenReady, Handle);
252
- hFunc (TEvTicketParser::TEvAuthorizeTicketResult, Handle);
175
+ hFunc (TEvEvents::TEvAuthResponse, Handle);
253
176
}
254
177
}
255
178
};
0 commit comments