diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.cpp | 4 | ||||
-rw-r--r-- | src/message/builder/cc.cpp (renamed from src/message_builder/cc.cpp) | 2 | ||||
-rw-r--r-- | src/message/builder/cc.hpp (renamed from src/message_builder/cc.hpp) | 4 | ||||
-rw-r--r-- | src/message/builder/date.cpp (renamed from src/message_builder/date.cpp) | 2 | ||||
-rw-r--r-- | src/message/builder/date.hpp (renamed from src/message_builder/date.hpp) | 4 | ||||
-rw-r--r-- | src/message/builder/from.cpp (renamed from src/message_builder/from.cpp) | 2 | ||||
-rw-r--r-- | src/message/builder/from.hpp (renamed from src/message_builder/from.hpp) | 4 | ||||
-rw-r--r-- | src/message/builder/mail_to.cpp (renamed from src/message_builder/mail_to.cpp) | 2 | ||||
-rw-r--r-- | src/message/builder/mail_to.hpp (renamed from src/message_builder/mail_to.hpp) | 4 | ||||
-rw-r--r-- | src/message/builder/subject.cpp (renamed from src/message_builder/subject.cpp) | 3 | ||||
-rw-r--r-- | src/message/builder/subject.hpp (renamed from src/message_builder/subject.hpp) | 4 | ||||
-rw-r--r-- | src/message/builder/text.cpp (renamed from src/message_builder/text.cpp) | 2 | ||||
-rw-r--r-- | src/message/builder/text.hpp (renamed from src/message_builder/text.hpp) | 4 | ||||
-rw-r--r-- | src/message/builder/types/idecorator.hpp (renamed from src/message_builder/types/idecorator.hpp) | 2 | ||||
-rw-r--r-- | src/message/builder/types/imessage_builder.hpp (renamed from src/message_builder/types/imessage_build.hpp) | 2 | ||||
-rw-r--r-- | src/message/sender.cpp | 127 | ||||
-rw-r--r-- | src/message/sender.hpp | 38 | ||||
-rw-r--r-- | src/message_sender.cpp | 123 | ||||
-rw-r--r-- | src/message_sender.hpp | 48 | ||||
-rw-r--r-- | src/service/settings.cpp | 54 | ||||
-rw-r--r-- | src/service/settings.hpp | 36 | ||||
-rw-r--r-- | src/service/smtp.cpp | 99 | ||||
-rw-r--r-- | src/service/smtp.hpp (renamed from src/smtp_service.hpp) | 19 | ||||
-rw-r--r-- | src/settings_storage.hpp | 14 | ||||
-rw-r--r-- | src/smtp_service.cpp | 96 |
25 files changed, 386 insertions, 313 deletions
diff --git a/src/main.cpp b/src/main.cpp index ba2848d..96c06df 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,13 +1,13 @@ #include <sdbusplus/asio/connection.hpp> -#include "smtp_service.hpp" +#include "service/smtp.hpp" int main() { boost::asio::io_service io_context; auto connection = std::make_shared<sdbusplus::asio::connection>( io_context ); - smtp::SmtpService smtp{ connection }; + smtp::service::Smtp smtp{ connection }; io_context.run(); return 0; diff --git a/src/message_builder/cc.cpp b/src/message/builder/cc.cpp index c686ef2..55d70ff 100644 --- a/src/message_builder/cc.cpp +++ b/src/message/builder/cc.cpp @@ -1,6 +1,6 @@ #include "cc.hpp" -namespace smtp::message_builder +namespace smtp::message::builder { Cc::Cc( std::list<std::string> const& mail_to ) : mMailTo( mail_to ) diff --git a/src/message_builder/cc.hpp b/src/message/builder/cc.hpp index 5062c37..340c7cd 100644 --- a/src/message_builder/cc.hpp +++ b/src/message/builder/cc.hpp @@ -3,9 +3,9 @@ #include <list> #include "types/idecorator.hpp" -#include "types/imessage_build.hpp" +#include "types/imessage_builder.hpp" -namespace smtp::message_builder +namespace smtp::message::builder { class Cc : public types::IDecorator<types::IMessageBuilder> { diff --git a/src/message_builder/date.cpp b/src/message/builder/date.cpp index 96ee2e1..3268935 100644 --- a/src/message_builder/date.cpp +++ b/src/message/builder/date.cpp @@ -1,6 +1,6 @@ #include "date.hpp" -namespace smtp::message_builder +namespace smtp::message::builder { std::string Date::Get() const { diff --git a/src/message_builder/date.hpp b/src/message/builder/date.hpp index 00fb6cb..31908ac 100644 --- a/src/message_builder/date.hpp +++ b/src/message/builder/date.hpp @@ -1,9 +1,9 @@ #pragma once #include "types/idecorator.hpp" -#include "types/imessage_build.hpp" +#include "types/imessage_builder.hpp" -namespace smtp::message_builder +namespace smtp::message::builder { class Date : public types::IDecorator<types::IMessageBuilder> { diff --git a/src/message_builder/from.cpp b/src/message/builder/from.cpp index 094e1a2..b19515a 100644 --- a/src/message_builder/from.cpp +++ b/src/message/builder/from.cpp @@ -1,6 +1,6 @@ #include "from.hpp" -namespace smtp::message_builder +namespace smtp::message::builder { From::From( std::string const& mail_to ) diff --git a/src/message_builder/from.hpp b/src/message/builder/from.hpp index 4605469..d1f0b21 100644 --- a/src/message_builder/from.hpp +++ b/src/message/builder/from.hpp @@ -1,9 +1,9 @@ #pragma once #include "types/idecorator.hpp" -#include "types/imessage_build.hpp" +#include "types/imessage_builder.hpp" -namespace smtp::message_builder +namespace smtp::message::builder { class From : public types::IDecorator<types::IMessageBuilder> { diff --git a/src/message_builder/mail_to.cpp b/src/message/builder/mail_to.cpp index c73e2a7..dab1b7f 100644 --- a/src/message_builder/mail_to.cpp +++ b/src/message/builder/mail_to.cpp @@ -1,6 +1,6 @@ #include "mail_to.hpp" -namespace smtp::message_builder +namespace smtp::message::builder { MailTo::MailTo( std::string const& mail_to) : mMailTo( mail_to ) diff --git a/src/message_builder/mail_to.hpp b/src/message/builder/mail_to.hpp index 0245fd6..5d60d97 100644 --- a/src/message_builder/mail_to.hpp +++ b/src/message/builder/mail_to.hpp @@ -3,9 +3,9 @@ #include <list> #include "types/idecorator.hpp" -#include "types/imessage_build.hpp" +#include "types/imessage_builder.hpp" -namespace smtp::message_builder +namespace smtp::message::builder { class MailTo : public types::IDecorator<types::IMessageBuilder> { diff --git a/src/message_builder/subject.cpp b/src/message/builder/subject.cpp index 84e7e43..166bca4 100644 --- a/src/message_builder/subject.cpp +++ b/src/message/builder/subject.cpp @@ -1,6 +1,6 @@ #include "subject.hpp" -namespace smtp::message_builder +namespace smtp::message::builder { Subject::Subject( std::string const& subject ) : mSubject(subject) @@ -15,6 +15,7 @@ namespace smtp::message_builder { result = mBase->Get(); } + result += "Subject: " + mSubject + "\r\n"; return result; } diff --git a/src/message_builder/subject.hpp b/src/message/builder/subject.hpp index bf8bfab..8153bc8 100644 --- a/src/message_builder/subject.hpp +++ b/src/message/builder/subject.hpp @@ -1,9 +1,9 @@ #pragma once #include "types/idecorator.hpp" -#include "types/imessage_build.hpp" +#include "types/imessage_builder.hpp" -namespace smtp::message_builder +namespace smtp::message::builder { class Subject : public types::IDecorator<types::IMessageBuilder> { diff --git a/src/message_builder/text.cpp b/src/message/builder/text.cpp index e5e6bf0..c478b7d 100644 --- a/src/message_builder/text.cpp +++ b/src/message/builder/text.cpp @@ -1,6 +1,6 @@ #include "text.hpp" -namespace smtp::message_builder +namespace smtp::message::builder { Text::Text( std::string const& text) : mText( text ) diff --git a/src/message_builder/text.hpp b/src/message/builder/text.hpp index 4df90e1..9715656 100644 --- a/src/message_builder/text.hpp +++ b/src/message/builder/text.hpp @@ -1,9 +1,9 @@ #pragma once #include "types/idecorator.hpp" -#include "types/imessage_build.hpp" +#include "types/imessage_builder.hpp" -namespace smtp::message_builder +namespace smtp::message::builder { class Text : public types::IDecorator<types::IMessageBuilder> { diff --git a/src/message_builder/types/idecorator.hpp b/src/message/builder/types/idecorator.hpp index 3fabcd4..19284ac 100644 --- a/src/message_builder/types/idecorator.hpp +++ b/src/message/builder/types/idecorator.hpp @@ -2,7 +2,7 @@ #include <memory>
-namespace smtp::message_builder::types
+namespace smtp::message::builder::types
{
/**
diff --git a/src/message_builder/types/imessage_build.hpp b/src/message/builder/types/imessage_builder.hpp index 4c4f1b8..701f5f9 100644 --- a/src/message_builder/types/imessage_build.hpp +++ b/src/message/builder/types/imessage_builder.hpp @@ -2,7 +2,7 @@ #include <string> -namespace smtp::message_builder::types +namespace smtp::message::builder::types { class IMessageBuilder { diff --git a/src/message/sender.cpp b/src/message/sender.cpp new file mode 100644 index 0000000..cabcb8f --- /dev/null +++ b/src/message/sender.cpp @@ -0,0 +1,127 @@ +#include <string.h> + +#include "sender.hpp" +#include "builder/date.hpp" +#include "builder/mail_to.hpp" +#include "builder/cc.hpp" +#include "builder/subject.hpp" +#include "builder/text.hpp" +#include "builder/from.hpp" +#include <iostream> + +namespace smtp::message +{ + static std::string mText = ""; + + // + // Constructors/Destructors + // + Sender::Sender( service::Settings const& settings_storage ) + : mSettingsStorage( settings_storage ) + { + + } + + // + //Public methods + // + + bool Sender::Send( std::string const& mail_from, std::string const& mail_to, std::list<std::string> const& cc, + std::string const& subject, std::string const& text ) + { + CURLcode result = CURLE_OK; + curl_slist *recipients = NULL; + WriteThis upload_ctx{}; + auto curl = curl_easy_init(); + //TODO сделать инициализацию через регистратор инициализаторов + if( !InitCurl( curl, upload_ctx, mail_from ) ) + { + return false; + } + FillRecipients( curl, mail_to, cc, recipients ); + UpdateMailText( mail_from, mail_to, cc, subject, text); + + result = curl_easy_perform(curl); + + if ( result != CURLE_OK ) + { + //TODO LOG + fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror( result )); + return false; + } + //TODO сделать деинициализацию через регистратор деинициализаторов + curl_slist_free_all( recipients ); + curl_easy_cleanup( curl ); + return true; + } + + // + //Private methods + // + bool smtp::message::Sender::InitCurl( CURL* curl, WriteThis const& upload_ctx, std::string const& mail_from ) + { + if( !curl ) + { + //TODO LOG + return false; + } + curl_easy_setopt(curl, CURLOPT_USERNAME, mSettingsStorage.GetUserName().c_str()); + curl_easy_setopt(curl, CURLOPT_PASSWORD, mSettingsStorage.GetPassword().c_str()); + curl_easy_setopt(curl, CURLOPT_URL, GetHostPortData().c_str()); + + curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL); + curl_easy_setopt(curl, CURLOPT_MAIL_FROM, mail_from.c_str()); + + curl_easy_setopt(curl, CURLOPT_READFUNCTION, ReadCallBack); + curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + return true; + } + + void Sender::UpdateMailText( std::string const& mail_from, std::string const& mail_to, std::list<std::string> const& cc, + std::string const& subject, std::string const& text ) const + { + auto text_decorator = std::make_shared<builder::Text>( text ); + text_decorator->Apply( std::make_shared<builder::Subject>( subject ) ) + .Apply( std::make_shared<builder::Cc>( cc ) ) + .Apply( std::make_shared<builder::From>( mail_from ) ) + .Apply( std::make_shared<builder::MailTo>( mail_to ) ) + .Apply( std::make_shared<builder::Date>() ); + mText = text_decorator->Get(); + std::cout << mText << std::endl; + } + + void Sender::FillRecipients( CURL* curl, std::string const& mail_to, std::list<std::string> const& cc, curl_slist* recipients ) + { + recipients = curl_slist_append( recipients, mail_to.c_str() ); + + for( const auto& recipient : cc ) + { + recipients = curl_slist_append( recipients, recipient.c_str() ); + } + + curl_easy_setopt( curl, CURLOPT_MAIL_RCPT, recipients ); + } + + std::string Sender::GetHostPortData() const + { + auto result = "smtp://" + mSettingsStorage.GetHost(); + if( !mSettingsStorage.GetPort().empty() ) + { + result += ":" + mSettingsStorage.GetPort(); + } + return result; + } + //TODO Надо убрать этот ужас. Без статики!!! + size_t Sender::ReadCallBack( void *ptr, size_t size, size_t nmemb, void *userp ) + { + struct WriteThis *pooh = reinterpret_cast<WriteThis*>( userp ); + if( size * nmemb < 1 || pooh->counter++ > 0 ) + { + return 0; + } + memcpy( ptr, mText.c_str(), mText.size() ); + return mText.size(); + } +} diff --git a/src/message/sender.hpp b/src/message/sender.hpp new file mode 100644 index 0000000..e75faa8 --- /dev/null +++ b/src/message/sender.hpp @@ -0,0 +1,38 @@ +#pragma once + +#include <list> +#include <memory> + +#include <curl/curl.h> + +#include "service/settings.hpp" + +namespace smtp::message +{ + struct WriteThis + { + int counter; + }; + + class Sender + { + public: + Sender( service::Settings const& settings_storage ); + ~Sender() = default; + + bool Send( std::string const& mail_from, std::string const& mail_to, std::list<std::string> const& cc, + std::string const& subject, std::string const& text ); + private: + void UpdateMailText( std::string const& mail_from, std::string const& mail_to, std::list<std::string> const& cc, + std::string const& subject, std::string const& textt ) const; + void InitSenders( std::string const& mail_from, std::list<std::string> const& mail_to ); + void FillRecipients( CURL* curl, std::string const& mail_to, std::list<std::string> const& cc, curl_slist* recipients ); + std::string GetHostPortData() const; + static size_t ReadCallBack( void *ptr, size_t size, size_t nmemb, void *userp ); + + service::Settings const& mSettingsStorage; + bool InitCurl( CURL* curl, WriteThis const& upload_ctx, std::string const& mail_from ); + }; +} + + diff --git a/src/message_sender.cpp b/src/message_sender.cpp deleted file mode 100644 index 5b2950c..0000000 --- a/src/message_sender.cpp +++ /dev/null @@ -1,123 +0,0 @@ -#include <string.h> - -#include "message_sender.hpp" -#include "message_builder/date.hpp" -#include "message_builder/mail_to.hpp" -#include "message_builder/cc.hpp" -#include "message_builder/subject.hpp" -#include "message_builder/text.hpp" -#include "message_builder/from.hpp" - -namespace smtp -{ - static std::string mText = ""; - - // - // Constructors/Destructors - // - MessageSender::MessageSender( SettingsStorage const& settings_storage ) - : mSettingsStorage( settings_storage ) - { - - } - - // - //Public methods - // - bool MessageSender::Send( std::string const& mail_from, std::string const& mail_to, std::list<std::string> const& cc, - std::string const& subject, std::string const& text ) - { - CURLcode result = CURLE_OK; - - struct curl_slist *recipients = NULL; - struct WriteThis upload_ctx; - - upload_ctx.counter = 0; - - auto curl = curl_easy_init(); - - if( !curl ) - { - //Error - return false; - } - mText = GetText( mail_from, mail_to, cc, subject, text); - FillRecipients( curl, mail_to, cc, recipients ); - - curl_easy_setopt(curl, CURLOPT_USERNAME, mSettingsStorage.username.c_str()); - curl_easy_setopt(curl, CURLOPT_PASSWORD, mSettingsStorage.password.c_str()); - curl_easy_setopt(curl, CURLOPT_URL, GetHostPortData().c_str()); - - curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL); - curl_easy_setopt(curl, CURLOPT_MAIL_FROM, mail_from.c_str()); - - curl_easy_setopt(curl, CURLOPT_READFUNCTION, ReadCallBack); - curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); - curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); - curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); - - result = curl_easy_perform(curl); - - if (result != CURLE_OK) - { - fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(result)); - return false; - } - - curl_slist_free_all(recipients); - curl_easy_cleanup(curl); - return true; - } - - // - //Private methods - // - std::string MessageSender::GetText( std::string const& mail_from, std::string const& mail_to, std::list<std::string> const& cc, - std::string const& subject, std::string const& text ) const - { - auto text_decorator = std::make_shared<message_builder::Text>( text ); - text_decorator->Apply( std::make_shared<message_builder::Subject>( subject ) ) - .Apply( std::make_shared<message_builder::Cc>( cc ) ) - .Apply( std::make_shared<message_builder::From>( mail_from ) ) - .Apply( std::make_shared<message_builder::MailTo>( mail_to ) ) - .Apply( std::make_shared<message_builder::Date>() ); - return text_decorator->Get(); - } - - void MessageSender::FillRecipients( CURL* curl, std::string const& mail_to, std::list<std::string> const& cc, curl_slist* recipients ) - { - recipients = curl_slist_append( recipients, mail_to.c_str() ); - - for( const auto& recipient : cc ) - { - recipients = curl_slist_append( recipients, recipient.c_str() ); - } - - curl_easy_setopt( curl, CURLOPT_MAIL_RCPT, recipients ); - } - - std::string MessageSender::GetHostPortData() const - { - auto result = "smtp://" + mSettingsStorage.host; - if( !mSettingsStorage.port.empty() ) - { - result += ":" + mSettingsStorage.port; - } - return result; - } - - size_t MessageSender::ReadCallBack( void *ptr, size_t size, size_t nmemb, void *userp ) - { - struct WriteThis *pooh = reinterpret_cast<WriteThis*>( userp ); - if( size * nmemb < 1 ) - { - return 0; - } - if( pooh->counter++ > 0 ) - { - return 0; - } - memcpy( ptr, mText.c_str(), mText.size() ); - return mText.size(); - } -} diff --git a/src/message_sender.hpp b/src/message_sender.hpp deleted file mode 100644 index 0728f0e..0000000 --- a/src/message_sender.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include <list> -#include <memory> - -#include <curl/curl.h> - -#include "settings_storage.hpp" - -namespace smtp -{ - struct WriteThis - { - int counter; - }; - - class MessageSender - { - public: - MessageSender( SettingsStorage const& settings_storage ); - ~MessageSender() = default; - - bool Send( std::string const& mail_from, std::string const& mail_to, std::list<std::string> const& cc, - std::string const& subject, std::string const& text ); - private: - std::string GetText( std::string const& mail_from, std::string const& mail_to, std::list<std::string> const& cc, - std::string const& subject, std::string const& textt ) const; - void InitSenders( std::string const& mail_from, std::list<std::string> const& mail_to ); - void FillRecipients( CURL* curl, std::string const& mail_to, std::list<std::string> const& cc, curl_slist* recipients ); - std::string GetHostPortData() const; - void ProcessSending(const std::string &mail_from, const std::list<std::string> &mail_to, const std::string &subject, const std::string &text); - timeval GetNowTime() const noexcept; - bool IsTimeOut( timeval const& start_time ) const noexcept; - long GetTimeDiff( timeval const& left, timeval const& right ) const noexcept; - timeval GetTimeout() const; - int ProcessHandle( timeval& timeout ) const; - void ClearPtrs(); - static size_t ReadCallBack( void *ptr, size_t size, size_t nmemb, void *userp ); - -// CURL *curl; -// CURLM *mcurl; - struct WriteThis pooh; - struct curl_slist* recipients = NULL; - SettingsStorage const& mSettingsStorage; - }; -} - - diff --git a/src/service/settings.cpp b/src/service/settings.cpp new file mode 100644 index 0000000..075aafa --- /dev/null +++ b/src/service/settings.cpp @@ -0,0 +1,54 @@ +#include "settings.hpp" + +namespace smtp::service +{ + + Settings::Settings() + : mSettingsFields{} + { + + } + + Settings::Settings( SettingsFields data ) + : mSettingsFields(data) + { + + } + + bool Settings::CheckAndSetSettings(SettingsFields data) + { + mSettingsFields = data; + return true; + } + + bool Settings::IsNeedAuth() const noexcept + { + return mSettingsFields.is_need_auth; + } + + bool Settings::IsNeedSsl() const noexcept + { + return mSettingsFields.is_need_ssl; + } + + std::string Settings::GetUserName() const + { + return mSettingsFields.username; + } + + std::string Settings::GetPassword() const + { + return mSettingsFields.password; + } + + std::string Settings::GetHost() const + { + return mSettingsFields.host; + } + + std::string Settings::GetPort() const + { + return mSettingsFields.port; + } + +} diff --git a/src/service/settings.hpp b/src/service/settings.hpp new file mode 100644 index 0000000..b6319f6 --- /dev/null +++ b/src/service/settings.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include <string> + +namespace smtp::service +{ + struct SettingsFields + { + bool is_need_auth; + bool is_need_ssl; + std::string username; + std::string password; + std::string host; + std::string port; + }; + + class Settings + { + public: + Settings(); + explicit Settings( SettingsFields data ); + ~Settings() = default; + + bool CheckAndSetSettings( SettingsFields data ); + + bool IsNeedAuth() const noexcept; + bool IsNeedSsl() const noexcept; + + std::string GetUserName() const; + std::string GetPassword() const; + std::string GetHost() const; + std::string GetPort() const; + private: + SettingsFields mSettingsFields; + }; +} diff --git a/src/service/smtp.cpp b/src/service/smtp.cpp new file mode 100644 index 0000000..818a4de --- /dev/null +++ b/src/service/smtp.cpp @@ -0,0 +1,99 @@ +#include "smtp.hpp" +#include "message/sender.hpp" + +namespace smtp::service +{ + static constexpr char HOST_PROPERTY[] = "Host"; + static constexpr char USER_PROPERTY[] = "User"; + static constexpr char PORT_PROPERTY[] = "Port"; + + // + // Constructors + // + + Smtp::Smtp( ConnectionPtr connection ) + { + std::string from{"claiff@mail.ru"}; + std::string to{"claiff1990@gmail.com"}; + std::list<std::string> cc{"claiff@mail.ru"}; + std::string subject{"subject"}; + std::string text{"text"}; + + mSettingsStorage.CheckAndSetSettings({true, true, "claiff@mail.ru","nZZbXq7FbwWAqpPpy3YL", "smtp.mail.ru", "" }); + message::Sender{ mSettingsStorage }.Send( "claiff@mail.ru", "claiff1990@gmail.com", {"claiff@mail.ru"}, "subject", "text" ); + +// CreateService( connection ); +// CreateInterface( connection ); + } + + // + // Private methods + // + + void Smtp::CreateService( ConnectionPtr connection ) + { + static constexpr char SMTP_BUS_NAME[] = "xyz.openbmc_project.SMTP"; + + connection->request_name( SMTP_BUS_NAME ); + } + + void Smtp::CreateInterface( ConnectionPtr connection ) + { + static constexpr char SMTP_OBJECT_NAME[] = "/xyz/openbmc_project/SMTP"; + static constexpr char SMTP_INTERFACE_NAME[] = "xyz.openbmc_project.SMTP"; + + mObjectServer = std::make_shared<sdbusplus::asio::object_server>( connection ); + mInterface = mObjectServer->add_interface( SMTP_OBJECT_NAME, SMTP_INTERFACE_NAME ); + + AddProperties(); + AddMethods(); + + mInterface->initialize(); + } + + void Smtp::AddProperties() + { + mInterface->register_property( HOST_PROPERTY, mSettingsStorage.GetHost(), sdbusplus::asio::PropertyPermission::readOnly ); + mInterface->register_property( USER_PROPERTY, mSettingsStorage.GetUserName(), sdbusplus::asio::PropertyPermission::readOnly ); + mInterface->register_property( PORT_PROPERTY, mSettingsStorage.GetPort(), sdbusplus::asio::PropertyPermission::readOnly ); + } + + void Smtp::AddMethods() + { + static constexpr char SMTP_SEND_MESSAGE_METHOD_NAME[] = "SendMail"; + static constexpr char SMTP_CHANGE_PARAMETERS_METHOD_NAME[] = "ChangeParameters"; + + mInterface->register_method(SMTP_SEND_MESSAGE_METHOD_NAME, [this]( std::string const& mail_from, + std::string const& mail_to, + std::list<std::string> const& cc, + std::string const& theme, + std::string const& text ) + { return message::Sender{ mSettingsStorage }.Send( mail_from, mail_to, cc, theme, text );}); + + + mInterface->register_method(SMTP_CHANGE_PARAMETERS_METHOD_NAME, [this]( bool is_need_auth, + bool is_need_ssl, + std::string const& user, + std::string const& password, + std::string const& host, + std::string const& port ) + { return RefreshSettings( is_need_auth, is_need_ssl, user, password, host, port);}); + } + + bool Smtp::RefreshSettings( bool is_need_auth, bool is_need_ssl, + std::string const& user, std::string const& password, + std::string const& host, std::string const& port ) + { + auto is_settings_norm = mSettingsStorage.CheckAndSetSettings({is_need_auth, is_need_ssl, + user, password, host, port}); + if(!is_settings_norm) + { + return false; + } + + mInterface->set_property(HOST_PROPERTY, host); + mInterface->set_property(USER_PROPERTY, user); + mInterface->set_property(PORT_PROPERTY, port); + return true; + } +} diff --git a/src/smtp_service.hpp b/src/service/smtp.hpp index 7149e3a..c311645 100644 --- a/src/smtp_service.hpp +++ b/src/service/smtp.hpp @@ -5,32 +5,31 @@ #include <sdbusplus/asio/connection.hpp> #include <sdbusplus/asio/object_server.hpp> -#include "settings_storage.hpp" +#include "settings.hpp" -namespace smtp +namespace smtp::service { using ConnectionPtr = std::shared_ptr<sdbusplus::asio::connection>; using InterfacePtr = std::shared_ptr<sdbusplus::asio::dbus_interface>; using ObjectServerPtr = std::shared_ptr<sdbusplus::asio::object_server>; - class SmtpService + class Smtp { public: - SmtpService( ConnectionPtr connection ); - ~SmtpService() = default; + Smtp( ConnectionPtr connection ); + ~Smtp() = default; private: void FillStorageByDefault(); void CreateService( ConnectionPtr bus ); void CreateInterface( ConnectionPtr connection ); void AddProperties(); void AddMethods(); - bool RefreshSettings(std::string const& user, - std::string const& password, - std::string const& host, - std::string const& port); + bool RefreshSettings( bool is_need_auth, bool is_need_ssl, + std::string const& user, std::string const& password, + std::string const& host, std::string const& port ); InterfacePtr mInterface; ObjectServerPtr mObjectServer; - SettingsStorage mStorage; + Settings mSettingsStorage; }; } diff --git a/src/settings_storage.hpp b/src/settings_storage.hpp deleted file mode 100644 index d442d6f..0000000 --- a/src/settings_storage.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include <string> - -namespace smtp -{ - struct SettingsStorage - { - std::string username; - std::string password; - std::string host; - std::string port; - }; -} diff --git a/src/smtp_service.cpp b/src/smtp_service.cpp deleted file mode 100644 index 6235e4c..0000000 --- a/src/smtp_service.cpp +++ /dev/null @@ -1,96 +0,0 @@ -#include "smtp_service.hpp" -#include "message_sender.hpp" - -namespace smtp -{ - static constexpr char HOST_PROPERTY[] = "Host"; - static constexpr char USER_PROPERTY[] = "User"; - static constexpr char PORT_PROPERTY[] = "Port"; - - // - // Constructors - // - - SmtpService::SmtpService( ConnectionPtr connection ) - { - FillStorageByDefault(); - CreateService( connection ); - CreateInterface( connection ); - } - - // - // Private methods - // - - void SmtpService::FillStorageByDefault() - { - mStorage.host = ""; - mStorage.username = ""; - mStorage.password = ""; - mStorage.port = ""; - } - - void SmtpService::CreateService( ConnectionPtr connection ) - { - static constexpr char SMTP_BUS_NAME[] = "xyz.openbmc_project.SMTP"; - - connection->request_name( SMTP_BUS_NAME ); - } - - void SmtpService::CreateInterface( ConnectionPtr connection ) - { - static constexpr char SMTP_OBJECT_NAME[] = "/xyz/openbmc_project/SMTP"; - static constexpr char SMTP_INTERFACE_NAME[] = "xyz.openbmc_project.SMTP"; - - mObjectServer = std::make_shared<sdbusplus::asio::object_server>( connection ); - mInterface = mObjectServer->add_interface( SMTP_OBJECT_NAME, SMTP_INTERFACE_NAME ); - - AddProperties(); - AddMethods(); - - mInterface->initialize(); - } - - void SmtpService::AddProperties() - { - mInterface->register_property( HOST_PROPERTY, mStorage.host, sdbusplus::asio::PropertyPermission::readOnly ); - mInterface->register_property( USER_PROPERTY, mStorage.username, sdbusplus::asio::PropertyPermission::readOnly ); - mInterface->register_property( PORT_PROPERTY, mStorage.port, sdbusplus::asio::PropertyPermission::readOnly ); - } - - void SmtpService::AddMethods() - { - static constexpr char SMTP_SEND_MESSAGE_METHOD_NAME[] = "SendMail"; - static constexpr char SMTP_CHANGE_PARAMETERS_METHOD_NAME[] = "ChangeParameters"; - - mInterface->register_method(SMTP_SEND_MESSAGE_METHOD_NAME, [this]( std::string const& mail_from, - std::string const& mail_to, - std::list<std::string> const& cc, - std::string const& theme, - std::string const& text ) - { return MessageSender{ mStorage }.Send( mail_from, mail_to, cc, theme, text );}); - - - mInterface->register_method(SMTP_CHANGE_PARAMETERS_METHOD_NAME, [this]( std::string const& user, - std::string const& password, - std::string const& host, - std::string const& port ) - { return RefreshSettings(user, password, host, port);}); - } - - bool SmtpService::RefreshSettings(std::string const& user, - std::string const& password, - std::string const& host, - std::string const& port) - { - mStorage.username = user; - mStorage.password = password; - mStorage.host = host; - mStorage.port = port; - - mInterface->set_property(HOST_PROPERTY, host); - mInterface->set_property(USER_PROPERTY, user); - mInterface->set_property(PORT_PROPERTY, port); - return true; - } -} |