diff --git a/homework/password-check/validation.cpp b/homework/password-check/validation.cpp index a2f12ff3..e5827130 100644 --- a/homework/password-check/validation.cpp +++ b/homework/password-check/validation.cpp @@ -1,2 +1,68 @@ #include "validation.hpp" -// TODO: Put implementations here \ No newline at end of file +#include +#include + +std::string getErrorMessage(ErrorCode code) { + switch (code) { + case ErrorCode::Ok: + return { + "Ok"}; + break; + case ErrorCode::PasswordNeedsAtLeastNineCharacters: + return { + "Password needs to have at least nine characters"}; + break; + case ErrorCode::PasswordNeedsAtLeastOneNumber: + return { + "Password needs to have at least one number"}; + break; + case ErrorCode::PasswordNeedsAtLeastOneSpecialCharacter: + return { + "Password needs to have at least one special character"}; + break; + case ErrorCode::PasswordNeedsAtLeastOneUppercaseLetter: + return { + "Password needs to have at least one uppercase letter"}; + break; + case ErrorCode::PasswordsDoNotMatch: + return { + "Passwords do not match"}; + break; + default: + return { + "Invalid error code"}; + break; + } +} + +bool doPasswordsMatch(const std::string& pass1, const std::string& pass2) { + return (pass1 == pass2); +} + +ErrorCode checkPasswordRules(const std::string& pass) { + if (pass.size() < 9u) { + return ErrorCode::PasswordNeedsAtLeastNineCharacters; + } + + if (std::none_of(pass.begin(), pass.end(), [](unsigned char c) { return std::isdigit(c); })) { + return ErrorCode::PasswordNeedsAtLeastOneNumber; + } + + if (std::none_of(pass.begin(), pass.end(), [](unsigned char c) { return !std::isalnum(c); })) { + return ErrorCode::PasswordNeedsAtLeastOneSpecialCharacter; + } + + if (std::none_of(pass.begin(), pass.end(), [](unsigned char c) { return std::isupper(c); })) { + return ErrorCode::PasswordNeedsAtLeastOneUppercaseLetter; + } + + return ErrorCode::Ok; +} + +ErrorCode checkPassword(const std::string& pass1, const std::string& pass2) { + if (doPasswordsMatch(pass1, pass2)) { + return checkPasswordRules(pass1); + } + + return ErrorCode::PasswordsDoNotMatch; +} diff --git a/homework/password-check/validation.hpp b/homework/password-check/validation.hpp index 85160868..171b965d 100644 --- a/homework/password-check/validation.hpp +++ b/homework/password-check/validation.hpp @@ -1,2 +1,21 @@ -// TODO: I'm empty :) Put enum and function headers here. -// Don't forget the header guard - #pragma once \ No newline at end of file +#ifndef VALIDATION_H +#define VALIDATION_H + +#include + +enum class ErrorCode { + Ok, + PasswordNeedsAtLeastNineCharacters, + PasswordNeedsAtLeastOneNumber, + PasswordNeedsAtLeastOneSpecialCharacter, + PasswordNeedsAtLeastOneUppercaseLetter, + PasswordsDoNotMatch +}; + +std::string getErrorMessage(ErrorCode code); +bool doPasswordsMatch(const std::string& pass1, const std::string& pass2); +ErrorCode checkPasswordRules(const std::string& pass); + +ErrorCode checkPassword(const std::string& pass1, const std::string& pass2); + +#endif