diff --git a/Telegram/SourceFiles/payments/stripe/stripe_card_validator.cpp b/Telegram/SourceFiles/payments/stripe/stripe_card_validator.cpp index 5b91b7062..e6542adf0 100644 --- a/Telegram/SourceFiles/payments/stripe/stripe_card_validator.cpp +++ b/Telegram/SourceFiles/payments/stripe/stripe_card_validator.cpp @@ -193,13 +193,28 @@ CardValidationResult ValidateCard(const QString &number) { } const auto range = MostSpecificBinRangeForNumber(sanitized); const auto brand = range.brand; - //if (sanitized.size() > range.length) { - // return { .state = ValidationState::Invalid, .brand = brand }; - //} else if (sanitized.size() < range.length) { - // return { .state = ValidationState::Incomplete, .brand = brand }; - //} else - if (!IsValidLuhn(sanitized)) { + + static const auto &all = AllRanges(); + static const auto compare = [](const BinRange &a, const BinRange &b) { + return a.length < b.length; + }; + static const auto kMinLength = std::min_element( + begin(all), + end(all), + compare)->length; + static const auto kMaxLength = std::max_element( + begin(all), + end(all), + compare)->length; + + if (sanitized.size() > kMaxLength) { return { .state = ValidationState::Invalid, .brand = brand }; + } else if (sanitized.size() < kMinLength) { + return { .state = ValidationState::Incomplete, .brand = brand }; + } else if (!IsValidLuhn(sanitized)) { + return { .state = ValidationState::Invalid, .brand = brand }; + } else if (sanitized.size() < kMaxLength) { + return { .state = ValidationState::Valid, .brand = brand }; } return { .state = ValidationState::Valid,