11#include < util/string/join.h>
22
33#include < ydb/library/login/login.h>
4+ #include < ydb/library/login/password_checker/password_checker.h>
45#include < ydb/library/actors/http/http_proxy.h>
56#include < ydb/library/testlib/service_mocks/ldap_mock/ldap_simple_server.h>
67#include < ydb/core/tx/schemeshard/ut_helpers/helpers.h>
@@ -27,6 +28,23 @@ void TestCreateAlterLoginCreateUser(TTestActorRuntime& runtime, ui64 txId, const
2728 TestModificationResults (runtime, txId, expectedResults);
2829}
2930
31+ void SetPasswordCheckerParameters (TTestActorRuntime &runtime, ui64 schemeShard, const NLogin::TPasswordCheckParameters::TInitializer& parameters) {
32+ auto request = MakeHolder<NConsole::TEvConsole::TEvConfigNotificationRequest>();
33+
34+ ::NKikimrProto::TPasswordCheckerParameters passwordCheckParameters;
35+ passwordCheckParameters.SetMinimumLength (parameters.MinPasswordLength );
36+ passwordCheckParameters.SetMaximumLength (parameters.MaxPasswordLength );
37+ passwordCheckParameters.SetRestrictLower (parameters.NeedLowerCase );
38+ passwordCheckParameters.SetRestrictUpper (parameters.NeedUpperCase );
39+ passwordCheckParameters.SetRestrictNumbers (parameters.NeedNumbers );
40+ passwordCheckParameters.SetRestrictSpecial (parameters.NeedSpecialSymbols );
41+ passwordCheckParameters.SetSpecialChars (parameters.SpecialSymbols );
42+ *request->Record .MutableConfig ()->MutableAuthConfig ()->MutablePasswordCheckerParameters () = passwordCheckParameters;
43+ SetConfig (runtime, schemeShard, std::move (request));
44+ }
45+
46+ const TString VALID_SPECIAL_SYMBOLS = " !@#$%^&*()_+{}|<>?=" ;
47+
3048} // namespace NSchemeShardUT_Private
3149
3250Y_UNIT_TEST_SUITE (TSchemeShardLoginTest) {
@@ -66,6 +84,128 @@ Y_UNIT_TEST_SUITE(TSchemeShardLoginTest) {
6684 UNIT_ASSERT (describe.GetPathDescription ().GetDomainDescription ().HasSecurityState ());
6785 UNIT_ASSERT (describe.GetPathDescription ().GetDomainDescription ().GetSecurityState ().PublicKeysSize () > 0 );
6886 }
87+
88+ Y_UNIT_TEST (ChangeAcceptablePasswordParameters) {
89+ TTestBasicRuntime runtime;
90+ TTestEnv env (runtime);
91+ ui64 txId = 100 ;
92+ // Password parameters:
93+ // length 0 - 4294967295
94+ // optional: lower case, upper case, numbers, special symbols from list !@#$%^&*()_+{}|<>?=
95+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user1" , " password1" , {{NKikimrScheme::StatusSuccess}});
96+ auto resultLogin = Login (runtime, " user1" , " password1" );
97+ UNIT_ASSERT_VALUES_EQUAL (resultLogin.error (), " " );
98+ auto describe = DescribePath (runtime, TTestTxConfig::SchemeShard, " /MyRoot" );
99+ UNIT_ASSERT (describe.HasPathDescription ());
100+ UNIT_ASSERT (describe.GetPathDescription ().HasDomainDescription ());
101+ UNIT_ASSERT (describe.GetPathDescription ().GetDomainDescription ().HasSecurityState ());
102+ UNIT_ASSERT (describe.GetPathDescription ().GetDomainDescription ().GetSecurityState ().PublicKeysSize () > 0 );
103+
104+ // Accept password without lower case symbols
105+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user2" , " PASSWORDU2" , {{NKikimrScheme::StatusSuccess}});
106+ resultLogin = Login (runtime, " user2" , " PASSWORDU2" );
107+ UNIT_ASSERT_VALUES_EQUAL (resultLogin.error (), " " );
108+ // Password parameters:
109+ // length 0 - 4294967295
110+ // optional: upper case, numbers, special symbols from list !@#$%^&*()_+{}|<>?=
111+ // required: lower case
112+ SetPasswordCheckerParameters (runtime, TTestTxConfig::SchemeShard, {.NeedLowerCase = true , .SpecialSymbols = VALID_SPECIAL_SYMBOLS});
113+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user3" , " PASSWORDU3" , {{NKikimrScheme::StatusPreconditionFailed}});
114+ // Add lower case symbols to password
115+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user3" , " PASswORDu3" , {{NKikimrScheme::StatusSuccess}});
116+ resultLogin = Login (runtime, " user3" , " PASswORDu3" );
117+ UNIT_ASSERT_VALUES_EQUAL (resultLogin.error (), " " );
118+
119+ // Accept password without upper case symbols
120+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user4" , " passwordu4" , {{NKikimrScheme::StatusSuccess}});
121+ resultLogin = Login (runtime, " user4" , " passwordu4" );
122+ UNIT_ASSERT_VALUES_EQUAL (resultLogin.error (), " " );
123+ // Password parameters:
124+ // length 0 - 4294967295
125+ // optional: numbers, special symbols from list !@#$%^&*()_+{}|<>?=
126+ // required: lower case, upper case
127+ SetPasswordCheckerParameters (runtime, TTestTxConfig::SchemeShard, {.NeedLowerCase = true , .NeedUpperCase = true , .SpecialSymbols = VALID_SPECIAL_SYMBOLS});
128+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user5" , " passwordu5" , {{NKikimrScheme::StatusPreconditionFailed}});
129+ // Add upper case symbols to password
130+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user5" , " PASswORDu5" , {{NKikimrScheme::StatusSuccess}});
131+ resultLogin = Login (runtime, " user5" , " PASswORDu5" );
132+ UNIT_ASSERT_VALUES_EQUAL (resultLogin.error (), " " );
133+
134+ // Accept short and long passwords
135+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user6" , " pasSWu6" , {{NKikimrScheme::StatusSuccess}});
136+ resultLogin = Login (runtime, " user6" , " pasSWu6" );
137+ UNIT_ASSERT_VALUES_EQUAL (resultLogin.error (), " " );
138+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user7" , " pasSW12345Word!*&u7" , {{NKikimrScheme::StatusSuccess}});
139+ resultLogin = Login (runtime, " user7" , " pasSW12345Word!*&u7" );
140+ UNIT_ASSERT_VALUES_EQUAL (resultLogin.error (), " " );
141+ // Password parameters:
142+ // length 8 - 15
143+ // optional: numbers, special symbols from list !@#$%^&*()_+{}|<>?=
144+ // required: lower case, upper case
145+ SetPasswordCheckerParameters (runtime, TTestTxConfig::SchemeShard, {.MinPasswordLength = 8 , .MaxPasswordLength = 15 , .NeedLowerCase = true , .NeedUpperCase = true , .SpecialSymbols = VALID_SPECIAL_SYMBOLS});
146+ // Too short password
147+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user8" , " pasSWu8" , {{NKikimrScheme::StatusPreconditionFailed}});
148+ // Too long password
149+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user8" , " pasSW12345Word!*&u8" , {{NKikimrScheme::StatusPreconditionFailed}});
150+ // Password has correct length
151+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user8" , " PASswORDu8" , {{NKikimrScheme::StatusSuccess}});
152+ resultLogin = Login (runtime, " user8" , " PASswORDu8" );
153+ UNIT_ASSERT_VALUES_EQUAL (resultLogin.error (), " " );
154+
155+ // Accept password without numbers
156+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user9" , " passWorDunine" , {{NKikimrScheme::StatusSuccess}});
157+ resultLogin = Login (runtime, " user9" , " passWorDunine" );
158+ UNIT_ASSERT_VALUES_EQUAL (resultLogin.error (), " " );
159+ // Password parameters:
160+ // length 8 - 15
161+ // optional: special symbols from list !@#$%^&*()_+{}|<>?=
162+ // required: lower case, upper case, numbers
163+ SetPasswordCheckerParameters (runtime, TTestTxConfig::SchemeShard, {.MinPasswordLength = 8 ,
164+ .MaxPasswordLength = 15 ,
165+ .NeedLowerCase = true ,
166+ .NeedUpperCase = true ,
167+ .NeedNumbers = true ,
168+ .SpecialSymbols = VALID_SPECIAL_SYMBOLS});
169+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user10" , " passWorDuten" , {{NKikimrScheme::StatusPreconditionFailed}});
170+ // Password with numbers
171+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user10" , " PASswORDu10" , {{NKikimrScheme::StatusSuccess}});
172+ resultLogin = Login (runtime, " user10" , " PASswORDu10" );
173+ UNIT_ASSERT_VALUES_EQUAL (resultLogin.error (), " " );
174+
175+ // Accept password without special symbols
176+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user11" , " passWorDu11" , {{NKikimrScheme::StatusSuccess}});
177+ resultLogin = Login (runtime, " user11" , " passWorDu11" );
178+ UNIT_ASSERT_VALUES_EQUAL (resultLogin.error (), " " );
179+ // Password parameters:
180+ // length 8 - 15
181+ // required: lower case, upper case, numbers, special symbols from list !@#$%^&*()_+{}|<>?=
182+ SetPasswordCheckerParameters (runtime, TTestTxConfig::SchemeShard, {.MinPasswordLength = 8 ,
183+ .MaxPasswordLength = 15 ,
184+ .NeedLowerCase = true ,
185+ .NeedUpperCase = true ,
186+ .NeedNumbers = true ,
187+ .NeedSpecialSymbols = true ,
188+ .SpecialSymbols = VALID_SPECIAL_SYMBOLS});
189+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user12" , " passWorDu12" , {{NKikimrScheme::StatusPreconditionFailed}});
190+ // Password with special symbols
191+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user12" , " PASswORDu12*&%#" , {{NKikimrScheme::StatusSuccess}});
192+ resultLogin = Login (runtime, " user12" , " PASswORDu12*&%#" );
193+ UNIT_ASSERT_VALUES_EQUAL (resultLogin.error (), " " );
194+ // Password parameters:
195+ // length 8 - 15
196+ // required: lower case, upper case, numbers, special symbols from list *#
197+ SetPasswordCheckerParameters (runtime, TTestTxConfig::SchemeShard, {.MinPasswordLength = 8 ,
198+ .MaxPasswordLength = 15 ,
199+ .NeedLowerCase = true ,
200+ .NeedUpperCase = true ,
201+ .NeedNumbers = true ,
202+ .NeedSpecialSymbols = true ,
203+ .SpecialSymbols = " *#" }); // Only 2 special symbols are valid
204+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user13" , " PASswORDu13*&%#" , {{NKikimrScheme::StatusPreconditionFailed}});
205+ TestCreateAlterLoginCreateUser (runtime, ++txId, " /MyRoot" , " user13" , " PASswORDu12*#" , {{NKikimrScheme::StatusSuccess}});
206+ resultLogin = Login (runtime, " user13" , " PASswORDu12*#" );
207+ UNIT_ASSERT_VALUES_EQUAL (resultLogin.error (), " " );
208+ }
69209}
70210
71211namespace NSchemeShardUT_Private {
0 commit comments