summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorclaiff <claiff@mail.ru>2022-09-30 12:21:34 +0300
committerclaiff <claiff@mail.ru>2022-09-30 12:21:34 +0300
commit7fcd35b7ad0fa2b0a49c5cdd9a62e23412bf8731 (patch)
tree2af4dacab9a5992d19abd385dbaaa9de40ffc891
parent8d38861429c3544d10752fb0f6f9da436dee218f (diff)
downloadobmc-sila-smtp-feature/checker/server.tar.xz
Add checking mailsfeature/checker/server
Add check server fix add simillar mails
-rw-r--r--CMakeLists.txt4
-rw-r--r--src/checker/errors/mail/at_sign.cpp18
-rw-r--r--src/checker/errors/mail/at_sign.hpp16
-rw-r--r--src/checker/errors/mail/empty.cpp8
-rw-r--r--src/checker/errors/mail/empty.hpp2
-rw-r--r--src/checker/errors/settings/port_number.cpp9
-rw-r--r--src/checker/errors/settings/port_number.hpp2
-rw-r--r--src/checker/errors/settings/server.cpp39
-rw-r--r--src/checker/errors/settings/server.hpp18
-rw-r--r--src/checker/errors/types/imails_error.hpp14
-rw-r--r--src/checker/errors/types/isettings_error.hpp7
-rw-r--r--src/checker/registrator_mails.cpp2
-rw-r--r--src/checker/registrator_mails.hpp4
-rw-r--r--src/file/mail.cpp8
-rw-r--r--src/management/builder/mail.cpp5
-rw-r--r--src/management/builder/settings.cpp3
-rw-r--r--src/management/mail.cpp28
17 files changed, 162 insertions, 25 deletions
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 <regex>
+
+#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 <regex>
+
+#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<IError>;
+ using IErrorMailsPtr = std::shared_ptr<IErrorMails>;
}
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<IErrorSettings>;
-} \ 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<errors::types::IErrorPtr> mErrors;
+ std::list<errors::types::IErrorMailsPtr> 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;
}