From 7fcd35b7ad0fa2b0a49c5cdd9a62e23412bf8731 Mon Sep 17 00:00:00 2001 From: claiff Date: Fri, 30 Sep 2022 12:21:34 +0300 Subject: Add checking mails Add check server fix add simillar mails --- CMakeLists.txt | 4 +++ src/checker/errors/mail/at_sign.cpp | 18 +++++++++++++ src/checker/errors/mail/at_sign.hpp | 16 ++++++++++++ src/checker/errors/mail/empty.cpp | 8 +++++- src/checker/errors/mail/empty.hpp | 2 +- src/checker/errors/settings/port_number.cpp | 9 +++---- src/checker/errors/settings/port_number.hpp | 2 +- src/checker/errors/settings/server.cpp | 39 ++++++++++++++++++++++++++++ src/checker/errors/settings/server.hpp | 18 +++++++++++++ src/checker/errors/types/imails_error.hpp | 14 +++++++--- src/checker/errors/types/isettings_error.hpp | 7 ++++- src/checker/registrator_mails.cpp | 2 +- src/checker/registrator_mails.hpp | 4 +-- src/file/mail.cpp | 8 +++++- src/management/builder/mail.cpp | 5 +++- src/management/builder/settings.cpp | 3 +++ src/management/mail.cpp | 28 +++++++++++++++----- 17 files changed, 162 insertions(+), 25 deletions(-) create mode 100644 src/checker/errors/mail/at_sign.cpp create mode 100644 src/checker/errors/mail/at_sign.hpp create mode 100644 src/checker/errors/settings/server.cpp create mode 100644 src/checker/errors/settings/server.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ca5d5b2..3b8e15b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -163,8 +163,12 @@ set(SRC_FILES ${CHECKER_DIR}/errors/settings/port_number.cpp ${CHECKER_DIR}/errors/settings/port_number.hpp + ${CHECKER_DIR}/errors/settings/server.cpp + ${CHECKER_DIR}/errors/settings/server.hpp ${CHECKER_DIR}/errors/mail/empty.hpp ${CHECKER_DIR}/errors/mail/empty.cpp + ${CHECKER_DIR}/errors/mail/at_sign.hpp + ${CHECKER_DIR}/errors/mail/at_sign.cpp ${CHECKER_DIR}/errors/types/imails_error.hpp ${CHECKER_DIR}/errors/types/isettings_error.hpp diff --git a/src/checker/errors/mail/at_sign.cpp b/src/checker/errors/mail/at_sign.cpp new file mode 100644 index 0000000..f9dde08 --- /dev/null +++ b/src/checker/errors/mail/at_sign.cpp @@ -0,0 +1,18 @@ +#include + +#include "at_sign.hpp" +#include "logger/logger_set.hpp" + +namespace smtp::checker::errors::settings +{ + bool AtSign::Check( std::string const& line ) const + { + std::string mask = R"([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4}))"; + auto result = std::regex_search( line, std::regex{mask} ); + if(!result) + { + logger::LoggerSet::GetInstance()->LogError( GetMethodName(), "Error in mail note" ); + } + return result; + } +} diff --git a/src/checker/errors/mail/at_sign.hpp b/src/checker/errors/mail/at_sign.hpp new file mode 100644 index 0000000..2f72871 --- /dev/null +++ b/src/checker/errors/mail/at_sign.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "checker/errors/types/imails_error.hpp" + +namespace smtp::checker::errors::settings +{ + class AtSign : public types::IErrorMails + { + public: + AtSign() = default; + ~AtSign() override = default; + + bool Check( std::string const& line ) const override; + }; +} + diff --git a/src/checker/errors/mail/empty.cpp b/src/checker/errors/mail/empty.cpp index a893fbb..1c39e78 100644 --- a/src/checker/errors/mail/empty.cpp +++ b/src/checker/errors/mail/empty.cpp @@ -1,9 +1,15 @@ #include "empty.hpp" +#include "logger/logger_set.hpp" namespace smtp::checker::errors::settings { bool Empty::Check( std::string const& line ) const { - return !line.empty() && line != " "; + auto result = !line.empty() && line != " "; + if(!result) + { + logger::LoggerSet::GetInstance()->LogError( GetMethodName(), "Mails are empty" ); + } + return result; } } diff --git a/src/checker/errors/mail/empty.hpp b/src/checker/errors/mail/empty.hpp index 9e8c0da..945650e 100644 --- a/src/checker/errors/mail/empty.hpp +++ b/src/checker/errors/mail/empty.hpp @@ -4,7 +4,7 @@ namespace smtp::checker::errors::settings { - class Empty : public types::IError + class Empty : public types::IErrorMails { public: Empty() = default; diff --git a/src/checker/errors/settings/port_number.cpp b/src/checker/errors/settings/port_number.cpp index 73469cb..485b4c7 100644 --- a/src/checker/errors/settings/port_number.cpp +++ b/src/checker/errors/settings/port_number.cpp @@ -10,13 +10,12 @@ namespace smtp::checker::errors::settings static const std::string PORT_FIELD = "port"; static constexpr int MIN_PORT_NUMBER = 0; static constexpr int MAX_PORT_NUMBER = 65535; - static const std::string METHOD_NAME = "Check settings"; //TODO общее использование полей auto find = line.find( PORT_FIELD ); if( find == line.end() ) { - logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, "Port doesn't found" ); + logger::LoggerSet::GetInstance()->LogError( GetMethodName(), "Port doesn't found" ); return false; } auto host_as_string = find->second; @@ -31,17 +30,17 @@ namespace smtp::checker::errors::settings } catch( std::invalid_argument const& ex ) { - logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, "Port doesn't entered by numbers" ); + logger::LoggerSet::GetInstance()->LogError( GetMethodName(), "Port doesn't entered by numbers" ); return false; } catch( std::out_of_range const& ex ) { - logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, "Port out of range" ); + logger::LoggerSet::GetInstance()->LogError( GetMethodName(), "Port out of range" ); return false; } catch( ... ) { - logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, "Port doesn't entered by numbers" ); + logger::LoggerSet::GetInstance()->LogError( GetMethodName(), "Port doesn't entered by numbers" ); return false; } return host_as_int >= MIN_PORT_NUMBER && host_as_int <= MAX_PORT_NUMBER; diff --git a/src/checker/errors/settings/port_number.hpp b/src/checker/errors/settings/port_number.hpp index 42ab808..789a486 100644 --- a/src/checker/errors/settings/port_number.hpp +++ b/src/checker/errors/settings/port_number.hpp @@ -10,7 +10,7 @@ namespace smtp::checker::errors::settings PortNumber() = default; ~PortNumber() override = default; - bool Check( const manage::SettingsFileDataType& line ) const override; + bool Check( manage::SettingsFileDataType const& line ) const override; }; } diff --git a/src/checker/errors/settings/server.cpp b/src/checker/errors/settings/server.cpp new file mode 100644 index 0000000..c3f29af --- /dev/null +++ b/src/checker/errors/settings/server.cpp @@ -0,0 +1,39 @@ +#include + +#include "server.hpp" +#include "logger/logger_set.hpp" + +namespace smtp::checker::errors::settings +{ + // + //Public methods + // + bool Server::Check( manage::SettingsFileDataType const& line ) const + { + static const std::string SERVER_FIELD = "host"; + + auto find = line.find( SERVER_FIELD ); + if( find == line.end() ) + { + logger::LoggerSet::GetInstance()->LogError( GetMethodName(), "Host doesn't found" ); + return false; + } + return IsNormalName( find->second ) || IsIpName( find->second ); + } + + // + //Private methods + // + bool Server::IsNormalName( std::string const& line ) const + { + std::string mask = "^[a-zA-Z](?:\.?[a-zA-Z0-9 ]+)+$"; + return std::regex_search( line, std::regex{mask} ); + } + + bool Server::IsIpName( std::string const& line) const + { + std::string mask = "(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"; + return std::regex_search( line, std::regex{mask} ); + } + +} diff --git a/src/checker/errors/settings/server.hpp b/src/checker/errors/settings/server.hpp new file mode 100644 index 0000000..53e6170 --- /dev/null +++ b/src/checker/errors/settings/server.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "checker/errors/types/isettings_error.hpp" + +namespace smtp::checker::errors::settings +{ + class Server : public types::IErrorSettings + { + public: + Server() = default; + ~Server() override = default; + + bool Check( manage::SettingsFileDataType const& line ) const override; + private: + bool IsNormalName( std::string const& line ) const; + bool IsIpName( std::string const& line ) const; + }; +} diff --git a/src/checker/errors/types/imails_error.hpp b/src/checker/errors/types/imails_error.hpp index d696bbd..277f82e 100644 --- a/src/checker/errors/types/imails_error.hpp +++ b/src/checker/errors/types/imails_error.hpp @@ -5,15 +5,21 @@ namespace smtp::checker::errors::types { - class IError + class IErrorMails { public: - IError() = default; - virtual ~IError() = default; + IErrorMails() = default; + virtual ~IErrorMails() = default; + + std::string GetMethodName() const + { + static const std::string METHOD_NAME = "Check mails"; + return METHOD_NAME; + } virtual bool Check( std::string const& line ) const = 0; }; - using IErrorPtr = std::shared_ptr; + using IErrorMailsPtr = std::shared_ptr; } diff --git a/src/checker/errors/types/isettings_error.hpp b/src/checker/errors/types/isettings_error.hpp index 05f68e3..6355d79 100644 --- a/src/checker/errors/types/isettings_error.hpp +++ b/src/checker/errors/types/isettings_error.hpp @@ -16,7 +16,12 @@ namespace smtp::checker::errors::types IErrorSettings() = default; virtual ~IErrorSettings() = default; + std::string GetMethodName() const + { + static const std::string METHOD_NAME = "Check settings"; + return METHOD_NAME; + } virtual bool Check( manage::SettingsFileDataType const& line ) const = 0; }; using IErrorSettingsPtr = std::shared_ptr; -} \ No newline at end of file +} diff --git a/src/checker/registrator_mails.cpp b/src/checker/registrator_mails.cpp index 7e844c0..b2352c7 100644 --- a/src/checker/registrator_mails.cpp +++ b/src/checker/registrator_mails.cpp @@ -2,7 +2,7 @@ namespace smtp::checker { - void RegistratorMails::Add(errors::types::IErrorPtr const& error ) + void RegistratorMails::Add(errors::types::IErrorMailsPtr const& error ) { mErrors.push_back( error ); } diff --git a/src/checker/registrator_mails.hpp b/src/checker/registrator_mails.hpp index 86eb41a..2514a10 100644 --- a/src/checker/registrator_mails.hpp +++ b/src/checker/registrator_mails.hpp @@ -11,9 +11,9 @@ namespace smtp::checker RegistratorMails() = default; ~RegistratorMails() = default; - void Add( errors::types::IErrorPtr const &error ); + void Add( errors::types::IErrorMailsPtr const &error ); bool Check( std::string const& line ) const; private: - std::list mErrors; + std::list mErrors; }; } // namespace smtp::checker diff --git a/src/file/mail.cpp b/src/file/mail.cpp index 2a2231b..403ed84 100644 --- a/src/file/mail.cpp +++ b/src/file/mail.cpp @@ -40,6 +40,8 @@ namespace smtp::file static const std::string METHOD_NAME = "Write mails"; std::ofstream mail_file{ mPathFile, std::fstream::out | std::fstream::trunc }; + bool result = true; + if ( !mail_file.is_open() ) { logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, "Unable to open file to write " + mPathFile ); @@ -51,8 +53,12 @@ namespace smtp::file { mail_file << mail << "\n"; } + else + { + result = false; + } } mail_file.close(); - return true; + return result; } } diff --git a/src/management/builder/mail.cpp b/src/management/builder/mail.cpp index f7e882d..3a87f8b 100644 --- a/src/management/builder/mail.cpp +++ b/src/management/builder/mail.cpp @@ -1,12 +1,14 @@ #include "mail.hpp" #include "file/mail.hpp" + #include "checker/errors/mail/empty.hpp" +#include "checker/errors/mail/at_sign.hpp" namespace smtp::manage::builder { smtp::manage::Mail Mail::Build() const { - static const std::string PATH = {"/var/lib/smtp/mails.txt"}; + static const std::string PATH = {"/var/lib/smtp/mails.txt"}; auto registrator = BuildErrorRegistrator(); file::Mail file_manipulator{PATH, registrator}; @@ -17,6 +19,7 @@ namespace smtp::manage::builder { checker::RegistratorMails result; result.Add( std::make_shared < checker::errors::settings::Empty >()); + result.Add( std::make_shared < checker::errors::settings::AtSign >()); return result; } diff --git a/src/management/builder/settings.cpp b/src/management/builder/settings.cpp index baa45da..0b27bef 100644 --- a/src/management/builder/settings.cpp +++ b/src/management/builder/settings.cpp @@ -1,5 +1,6 @@ #include "settings.hpp" #include "checker/errors/settings/port_number.hpp" +#include "checker/errors/settings/server.hpp" namespace smtp::manage::builder { @@ -23,6 +24,8 @@ namespace smtp::manage::builder checker::RegistratorSettings result; result.Add( std::make_shared < checker::errors::settings::PortNumber >()); + result.Add( std::make_shared < checker::errors::settings::Server >()); + return result; } diff --git a/src/management/mail.cpp b/src/management/mail.cpp index 5c3c276..738c150 100644 --- a/src/management/mail.cpp +++ b/src/management/mail.cpp @@ -4,12 +4,19 @@ namespace smtp::manage { + // + //Constructors + // Mail::Mail( file::Mail const& file_reader ) : mFileReader( file_reader ) { mMails = mFileReader.Read(); } + + // + //Public methods + // MailsSet Mail::GetMailToSend() const { return mMails; @@ -17,13 +24,10 @@ namespace smtp::manage bool Mail::AddMailsToSend( MailsSet const& mails_to_add ) { - auto merged_mails = GetMergedMails( mails_to_add ); + auto merged_mails = GetMergedMails( mails_to_add ); auto result = mFileReader.Write( merged_mails ); - if( result ) - { - mMails = merged_mails; - } + mMails = mFileReader.Read(); return result; } @@ -32,6 +36,7 @@ namespace smtp::manage auto mails_to_delete = GetItersectionMails( mail_to_send ); auto result_set_after_delete = GetMailsAfterDelete( mails_to_delete ); auto result_of_delete = mFileReader.Write( result_set_after_delete ); + if( result_of_delete ) { mMails = result_set_after_delete; @@ -39,10 +44,19 @@ namespace smtp::manage return result_of_delete; } + // + //Private methods + // MailsSet Mail::GetMergedMails( MailsSet const& mails_to_add ) { - auto result = mails_to_add; - result.merge( mMails ); + MailsSet result; + auto sorted_mail_to_add = mails_to_add; + sorted_mail_to_add.sort(); + mMails.sort(); + + std::set_union( mMails.cbegin(), mMails.cend(), + sorted_mail_to_add.cbegin(), sorted_mail_to_add.cend(), + std::back_inserter( result )); return result; } -- cgit v1.2.3