diff --git a/driver/main.cpp b/driver/main.cpp index 3d64722..c2371be 100644 --- a/driver/main.cpp +++ b/driver/main.cpp @@ -4,6 +4,7 @@ #include "connection.hpp" #include "openssl_utils.hpp" #include "registration.hpp" +#include "sasl_mechanism.hpp" #include "settings.hpp" #include "ref.hpp" #include "irc_coroutine.hpp" @@ -15,11 +16,37 @@ #include #include -#include #include using namespace std::literals; +auto configure_sasl(const Settings &settings) -> std::unique_ptr +{ + if (settings.sasl_mechanism == "PLAIN" && + not settings.sasl_authcid.empty() + ) { + return std::make_unique( + settings.sasl_authcid, + settings.sasl_authzid, + settings.sasl_password); + + } else if (settings.sasl_mechanism == "EXTERNAL") { + return std::make_unique(settings.sasl_authzid); + + } else if ( + settings.sasl_mechanism == "ECDSA" && + not settings.sasl_authcid.empty() && + not settings.sasl_key_file.empty() + + ) { + if (auto sasl_key = key_from_file(settings.sasl_key_file, settings.sasl_key_password)) + return std::make_unique( + settings.sasl_authcid, + settings.sasl_authzid, + std::move(sasl_key)); + } + return nullptr; +} static auto start(boost::asio::io_context &io, const Settings &settings) -> void { @@ -35,11 +62,7 @@ static auto start(boost::asio::io_context &io, const Settings &settings) -> void tls_key = key_from_file(settings.tls_key_file, settings.tls_key_password); } - Ref sasl_key; - if (not settings.sasl_key_file.empty()) - { - sasl_key = key_from_file(settings.sasl_key_file, settings.sasl_key_password); - } + auto sasl_mech = configure_sasl(settings); const auto connection = std::make_shared(io); const auto client = Client::start(connection); @@ -48,11 +71,7 @@ static auto start(boost::asio::io_context &io, const Settings &settings) -> void .realname = settings.realname, .username = settings.username, .password = settings.password, - .sasl_mechanism = settings.sasl_mechanism, - .sasl_authcid = settings.sasl_authcid, - .sasl_authzid = settings.sasl_authzid, - .sasl_password = settings.sasl_password, - .sasl_key = std::move(sasl_key), + .sasl_mechanism = std::move(sasl_mech), }, client); const auto bot = Bot::start(client); diff --git a/myirc/include/registration.hpp b/myirc/include/registration.hpp index 78935f7..6af0f40 100644 --- a/myirc/include/registration.hpp +++ b/myirc/include/registration.hpp @@ -2,12 +2,10 @@ #include "connection.hpp" #include "client.hpp" -#include "ref.hpp" #include #include #include -#include class Registration : public std::enable_shared_from_this { @@ -17,11 +15,7 @@ public: std::string username; std::string realname; std::string password; - std::string sasl_mechanism; - std::string sasl_authcid; - std::string sasl_authzid; - std::string sasl_password; - Ref sasl_key; + std::unique_ptr sasl_mechanism; }; private: diff --git a/myirc/registration.cpp b/myirc/registration.cpp index e2130d3..196cb6d 100644 --- a/myirc/registration.cpp +++ b/myirc/registration.cpp @@ -2,8 +2,6 @@ #include "connection.hpp" #include "ircmsg.hpp" -#include "sasl_mechanism.hpp" -#include "openssl_utils.hpp" #include #include @@ -71,7 +69,7 @@ auto Registration::on_cap_list(const std::unordered_mapget_connection().send_cap_req(request); } - if (do_sasl && settings_.sasl_mechanism == "PLAIN") { - client_->start_sasl( - std::make_unique( - settings_.sasl_authcid, - settings_.sasl_authzid, - settings_.sasl_password)); - } else if (do_sasl && settings_.sasl_mechanism == "EXTERNAL") { - client_->start_sasl(std::make_unique(settings_.sasl_authzid)); - } else if (do_sasl && settings_.sasl_mechanism == "ECDSA") { - client_->start_sasl(std::make_unique( - settings_.sasl_authcid, - settings_.sasl_authzid, - settings_.sasl_key)); + if (do_sasl) { + client_->start_sasl(std::move(settings_.sasl_mechanism)); } else { client_->get_connection().send_cap_end(); }