Skip to content

Commit 94c61d5

Browse files
authored
Check account lockout config (#15147)
1 parent c5b531e commit 94c61d5

File tree

2 files changed

+92
-5
lines changed

2 files changed

+92
-5
lines changed

ydb/core/config/validation/auth_config_validator.cpp

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
#include <ydb/core/protos/auth.pb.h>
22
#include <vector>
33
#include <util/generic/string.h>
4+
#include <util/datetime/base.h>
45
#include "validators.h"
56

67

78
namespace NKikimr::NConfig {
89
namespace {
910

10-
EValidationResult ValidatePasswordComplexity(const NKikimrProto::TPasswordComplexity& passwordComplexity, std::vector<TString>&msg) {
11+
EValidationResult ValidatePasswordComplexity(const NKikimrProto::TPasswordComplexity& passwordComplexity, std::vector<TString>& msg) {
1112
size_t minCountOfRequiredChars = passwordComplexity.GetMinLowerCaseCount() +
1213
passwordComplexity.GetMinUpperCaseCount() +
1314
passwordComplexity.GetMinNumbersCount() +
@@ -20,13 +21,32 @@ EValidationResult ValidatePasswordComplexity(const NKikimrProto::TPasswordComple
2021
return EValidationResult::Ok;
2122
}
2223

24+
EValidationResult ValidateAccountLockout(const NKikimrProto::TAccountLockout& accountLockout, std::vector<TString>& msg) {
25+
TDuration attemptResetDuration;
26+
if (TDuration::TryParse(accountLockout.GetAttemptResetDuration(), attemptResetDuration)) {
27+
return EValidationResult::Ok;
28+
}
29+
msg = std::vector<TString>{"account_lockout: Cannot parse attempt reset duration"};
30+
return EValidationResult::Error;
31+
}
32+
2333
} // namespace
2434

2535
EValidationResult ValidateAuthConfig(const NKikimrProto::TAuthConfig& authConfig, std::vector<TString>& msg) {
26-
EValidationResult validatePasswordComplexityResult = ValidatePasswordComplexity(authConfig.GetPasswordComplexity(), msg);
27-
if (validatePasswordComplexityResult == EValidationResult::Error) {
28-
return EValidationResult::Error;
36+
if (authConfig.HasPasswordComplexity()) {
37+
EValidationResult validateResult = ValidatePasswordComplexity(authConfig.GetPasswordComplexity(), msg);
38+
if (validateResult == EValidationResult::Error) {
39+
return EValidationResult::Error;
40+
}
2941
}
42+
43+
if (authConfig.HasAccountLockout()) {
44+
EValidationResult validateResult = ValidateAccountLockout(authConfig.GetAccountLockout(), msg);
45+
if (validateResult == EValidationResult::Error) {
46+
return EValidationResult::Error;
47+
}
48+
}
49+
3050
if (msg.size() > 0) {
3151
return EValidationResult::Warn;
3252
}

ydb/core/config/validation/auth_config_validator_ut/auth_config_validator_ut.cpp

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Y_UNIT_TEST_SUITE(AuthConfigValidation) {
1919
std::vector<TString> error;
2020
EValidationResult result = ValidateAuthConfig(authConfig, error);
2121
UNIT_ASSERT_EQUAL(result, EValidationResult::Ok);
22-
UNIT_ASSERT_C(error.empty(), "Should not be errors");
22+
UNIT_ASSERT_C(error.empty(), error.front());
2323
}
2424

2525
Y_UNIT_TEST(CannotAcceptInvalidPasswordComplexity) {
@@ -40,4 +40,71 @@ Y_UNIT_TEST_SUITE(AuthConfigValidation) {
4040
UNIT_ASSERT_STRINGS_EQUAL(error.front(), "password_complexity: Min length of password cannot be less than "
4141
"total min counts of lower case chars, upper case chars, numbers and special chars");
4242
}
43+
44+
Y_UNIT_TEST(AcceptValidAccountLockoutConfig) {
45+
NKikimrProto::TAuthConfig authConfig;
46+
NKikimrProto::TAccountLockout* validAccountLockoutConfig = authConfig.MutableAccountLockout();
47+
48+
{
49+
validAccountLockoutConfig->SetAttemptResetDuration("12h");
50+
51+
std::vector<TString> error;
52+
EValidationResult result = ValidateAuthConfig(authConfig, error);
53+
UNIT_ASSERT_EQUAL(result, EValidationResult::Ok);
54+
UNIT_ASSERT_C(error.empty(), error.front());
55+
}
56+
57+
{
58+
validAccountLockoutConfig->SetAttemptResetDuration("5m");
59+
60+
std::vector<TString> error;
61+
EValidationResult result = ValidateAuthConfig(authConfig, error);
62+
UNIT_ASSERT_EQUAL(result, EValidationResult::Ok);
63+
UNIT_ASSERT_C(error.empty(), error.front());
64+
}
65+
66+
{
67+
validAccountLockoutConfig->SetAttemptResetDuration("5s");
68+
69+
std::vector<TString> error;
70+
EValidationResult result = ValidateAuthConfig(authConfig, error);
71+
UNIT_ASSERT_EQUAL(result, EValidationResult::Ok);
72+
UNIT_ASSERT_C(error.empty(), error.front());
73+
}
74+
}
75+
76+
Y_UNIT_TEST(CannotAcceptInvalidAccountLockoutConfig) {
77+
NKikimrProto::TAuthConfig authConfig;
78+
NKikimrProto::TAccountLockout* invalidAccountLockoutConfig = authConfig.MutableAccountLockout();
79+
80+
{
81+
invalidAccountLockoutConfig->SetAttemptResetDuration("h");
82+
83+
std::vector<TString> error;
84+
EValidationResult result = ValidateAuthConfig(authConfig, error);
85+
UNIT_ASSERT_EQUAL(result, EValidationResult::Error);
86+
UNIT_ASSERT_VALUES_EQUAL(error.size(), 1);
87+
UNIT_ASSERT_STRINGS_EQUAL(error.front(), "account_lockout: Cannot parse attempt reset duration");
88+
}
89+
90+
{
91+
invalidAccountLockoutConfig->SetAttemptResetDuration("");
92+
93+
std::vector<TString> error;
94+
EValidationResult result = ValidateAuthConfig(authConfig, error);
95+
UNIT_ASSERT_EQUAL(result, EValidationResult::Error);
96+
UNIT_ASSERT_VALUES_EQUAL(error.size(), 1);
97+
UNIT_ASSERT_STRINGS_EQUAL(error.front(), "account_lockout: Cannot parse attempt reset duration");
98+
}
99+
100+
{
101+
invalidAccountLockoutConfig->SetAttemptResetDuration("12hhh");
102+
103+
std::vector<TString> error;
104+
EValidationResult result = ValidateAuthConfig(authConfig, error);
105+
UNIT_ASSERT_EQUAL(result, EValidationResult::Error);
106+
UNIT_ASSERT_VALUES_EQUAL(error.size(), 1);
107+
UNIT_ASSERT_STRINGS_EQUAL(error.front(), "account_lockout: Cannot parse attempt reset duration");
108+
}
109+
}
43110
}

0 commit comments

Comments
 (0)