Skip to content
Closed
56 changes: 55 additions & 1 deletion homework/password-check/validation.cpp
Original file line number Diff line number Diff line change
@@ -1,2 +1,56 @@
#include "validation.hpp"
// TODO: Put implementations here
#include <algorithm>
#include <cctype>

std::string_view getErrorMessage(const ErrorCode code) {
switch (code) {
case ErrorCode::Ok:
return "Ok";

case ErrorCode::PasswordNeedsAtLeastNineCharacters:
return "Password needs to have at least nine characters";

case ErrorCode::PasswordNeedsAtLeastOneNumber:
return "Password needs to have at least one number";

case ErrorCode::PasswordNeedsAtLeastOneSpecialCharacter:
return "Password needs to have at least one special character";

case ErrorCode::PasswordNeedsAtLeastOneUppercaseLetter:
return "Password needs to have at least one uppercase letter";

case ErrorCode::PasswordsDoNotMatch:
return "Passwords do not match";

default:
return "Unknown Message";
}
}

bool doPasswordsMatch(const std::string_view& input_pass, const std::string_view& reference_pass) {
return input_pass == reference_pass;
}

ErrorCode checkPasswordRules(const std::string_view& password) {
if (password.size() < 9) {
return ErrorCode::PasswordNeedsAtLeastNineCharacters;
}
if (std::none_of(password.begin(), password.end(), [](const unsigned char c) { return std::isdigit(c); })) {
return ErrorCode::PasswordNeedsAtLeastOneNumber;
}
if (std::none_of(password.begin(), password.end(), [](const unsigned char c) { return std::isupper(c); })) {
return ErrorCode::PasswordNeedsAtLeastOneUppercaseLetter;
}
if (std::none_of(password.begin(), password.end(), [](const unsigned char c) { return std::ispunct(c); })) {
return ErrorCode::PasswordNeedsAtLeastOneSpecialCharacter;
}

return ErrorCode::Ok;
}

ErrorCode checkPassword(const std::string_view& password, const std::string_view& repeatedPassword) {
if (!doPasswordsMatch(password, repeatedPassword)) {
return ErrorCode::PasswordsDoNotMatch;
}
return checkPasswordRules(password);
}
21 changes: 19 additions & 2 deletions homework/password-check/validation.hpp
Original file line number Diff line number Diff line change
@@ -1,2 +1,19 @@
// TODO: I'm empty :) Put enum and function headers here.
// Don't forget the header guard - #pragma once
#pragma once
#include <cstdint>
#include <string_view>

enum class ErrorCode : uint8_t {
Ok,
PasswordNeedsAtLeastNineCharacters,
PasswordNeedsAtLeastOneNumber,
PasswordNeedsAtLeastOneSpecialCharacter,
PasswordNeedsAtLeastOneUppercaseLetter,
PasswordsDoNotMatch
};

[[nodiscard]] std::string_view getErrorMessage(const ErrorCode code);
[[nodiscard]] bool doPasswordsMatch(const std::string_view& input_pass, const std::string_view& reference_pass);

[[nodiscard]] ErrorCode checkPasswordRules(const std::string_view& password);

[[nodiscard]] ErrorCode checkPassword(const std::string_view& password, const std::string_view& repeatedPassword);
Loading