11#include < format>
22
3+ #include < library/cpp/string_utils/base64/base64.h>
34#include < library/cpp/testing/unittest/tests_data.h>
45#include < library/cpp/testing/unittest/registar.h>
56
@@ -151,6 +152,41 @@ Y_UNIT_TEST_SUITE(TGRpcAuthentication) {
151152 loginConnection.Stop ();
152153 }
153154
155+ Y_UNIT_TEST (ValidHashCredentials) {
156+ TLoginClientConnection loginConnection;
157+
158+ std::string hash = R"(
159+ {
160+ "version": 1,
161+ "argon2id": "HTkpQjtVJgBoA0CZu+i3zg==$ZO37rNB37kP9hzmKRGfwc4aYrboDt4OBDsF1TBn5oLw=",
162+ "scram-sha-256": "4096:s0QSrrFVkMTh3k2TTk860A==$LmCubRpIYV1zHMLucTtu7XjhB+PgWwH8ABCYGyVF1mo=:eUrie0C98tEFgygSOtom/fwPmgnMxeq53l7YTFfYncc="
163+ }
164+ )" ;
165+ auto createUserQuery = std::format (" CREATE USER {0:} HASH '{1:}'" , std::string (User), std::string (Base64Encode (hash)));
166+ auto result = loginConnection.ExecuteSql (" root@builtin" , TString (createUserQuery));
167+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SUCCESS, result.GetIssues ().ToString ());
168+
169+ auto factory = CreateLoginCredentialsProviderFactory ({.User = User, .Password = " password1" });
170+ auto loginProvider = factory->CreateProvider (loginConnection.GetCoreFacility ());
171+ UNIT_ASSERT_NO_EXCEPTION (loginProvider->GetAuthInfo ());
172+
173+ hash = R"(
174+ {
175+ "version": 1,
176+ "argon2id": "HTkpQjtVJgBoA0CZu+i3zg==$ZO37rNB37kP9hzmKRGfwc4aYrboDt4OBDsF1TBn5oLw="
177+ }
178+ )" ;
179+ auto alterUserQuery = std::format (" ALTER USER {0:} HASH '{1:}'" , std::string (User), std::string (Base64Encode (hash)));
180+ result = loginConnection.ExecuteSql (" root@builtin" , TString (alterUserQuery));
181+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SUCCESS, result.GetIssues ().ToString ());
182+
183+ factory = CreateLoginCredentialsProviderFactory ({.User = User, .Password = " password1" });
184+ loginProvider = factory->CreateProvider (loginConnection.GetCoreFacility ());
185+ UNIT_ASSERT_NO_EXCEPTION (loginProvider->GetAuthInfo ());
186+
187+ loginConnection.Stop ();
188+ }
189+
154190 Y_UNIT_TEST (InvalidPassword) {
155191 TLoginClientConnection loginConnection;
156192 loginConnection.CreateUser (User, Password);
@@ -159,6 +195,45 @@ Y_UNIT_TEST_SUITE(TGRpcAuthentication) {
159195 auto loginProvider = factory->CreateProvider (loginConnection.GetCoreFacility ());
160196 UNIT_ASSERT_EXCEPTION_CONTAINS (loginProvider->GetAuthInfo (), yexception, " Invalid password" );
161197
198+ std::string hash = R"(
199+ {
200+ "version": 1,
201+ "argon2id": "HTkpQjtVJgBoA0CZu+i3zg==$ZO37rNB37kP9hzmKRGfwc4aYrboDt4OBDsF1TBn5oLw=",
202+ "scram-sha-256": "4096:s0QSrrFVkMTh3k2TTk860A==$LmCubRpIYV1zHMLucTtu7XjhB+PgWwH8ABCYGyVF1mo=:eUrie0C98tEFgygSOtom/fwPmgnMxeq53l7YTFfYncc="
203+ }
204+ )" ;
205+ auto alterUserQuery = std::format (" ALTER USER {0:} HASH '{1:}'" , std::string (User), std::string (Base64Encode (hash)));
206+ auto result = loginConnection.ExecuteSql (" root@builtin" , TString (alterUserQuery));
207+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SUCCESS, result.GetIssues ().ToString ());
208+
209+ factory = CreateLoginCredentialsProviderFactory ({.User = User, .Password = Password});
210+ loginProvider = factory->CreateProvider (loginConnection.GetCoreFacility ());
211+ UNIT_ASSERT_EXCEPTION_CONTAINS (loginProvider->GetAuthInfo (), yexception, " Invalid password" );
212+
213+ loginConnection.Stop ();
214+ }
215+
216+ Y_UNIT_TEST (UnknownUser) {
217+ TLoginClientConnection loginConnection;
218+
219+ auto factory = CreateLoginCredentialsProviderFactory ({.User = User, .Password = Password});
220+ auto loginProvider = factory->CreateProvider (loginConnection.GetCoreFacility ());
221+ UNIT_ASSERT_EXCEPTION_CONTAINS (loginProvider->GetAuthInfo (), yexception, " Cannot find user 'user'" );
222+
223+ loginConnection.CreateUser (User, Password);
224+
225+ factory = CreateLoginCredentialsProviderFactory ({.User = User, .Password = Password});
226+ loginProvider = factory->CreateProvider (loginConnection.GetCoreFacility ());
227+ UNIT_ASSERT_NO_EXCEPTION (loginProvider->GetAuthInfo ());
228+
229+ auto dropUserQuery = std::format (" DROP USER {0:}" , std::string (User));
230+ auto result = loginConnection.ExecuteSql (" root@builtin" , TString (dropUserQuery));
231+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SUCCESS, result.GetIssues ().ToString ());
232+
233+ factory = CreateLoginCredentialsProviderFactory ({.User = User, .Password = Password});
234+ loginProvider = factory->CreateProvider (loginConnection.GetCoreFacility ());
235+ UNIT_ASSERT_EXCEPTION_CONTAINS (loginProvider->GetAuthInfo (), yexception, " Cannot find user 'user'" );
236+
162237 loginConnection.Stop ();
163238 }
164239
0 commit comments