X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/32d9767958eece65c3d6feb02419a3f003dc2f0a..4fe07d7c76c7c9006780389a5babb524560b3ff0:/projects/stargazer/plugins/other/radius/server.cpp diff --git a/projects/stargazer/plugins/other/radius/server.cpp b/projects/stargazer/plugins/other/radius/server.cpp index 850847fa..11aa9a79 100644 --- a/projects/stargazer/plugins/other/radius/server.cpp +++ b/projects/stargazer/plugins/other/radius/server.cpp @@ -1,15 +1,26 @@ #include "server.h" +#include "radproto/attribute.h" #include "radproto/packet_codes.h" +#include "radproto/attribute_codes.h" +#include "stg/user.h" +#include "stg/users.h" #include "stg/common.h" +#include +#include +#include #include #include +#include //uint8_t, uint32_t using STG::Server; +using STG::User; using boost::system::error_code; -Server::Server(boost::asio::io_service& io_service, const std::string& secret, uint16_t port, const std::string& filePath, std::stop_token token, PluginLogger& logger) - : m_radius(io_service, secret, port), +Server::Server(boost::asio::io_context& io_context, const std::string& secret, uint16_t port, const std::string& filePath, std::stop_token token, PluginLogger& logger, Users* users, const Config& config) + : m_radius(io_context, secret, port), m_dictionaries(filePath), + m_users(users), + m_config(config), m_token(std::move(token)), m_logger(logger) { @@ -32,26 +43,45 @@ void Server::startReceive() m_radius.asyncReceive([this](const auto& error, const auto& packet, const boost::asio::ip::udp::endpoint& source){ handleReceive(error, packet, source); }); } -RadProto::Packet Server::makeResponse(const RadProto::Packet& request) +std::vector Server::makeAttributes(const User* user) { std::vector attributes; - attributes.push_back(new RadProto::String(m_dictionaries.attributeCode("User-Name"), "test")); - attributes.push_back(new RadProto::Integer(m_dictionaries.attributeCode("NAS-Port"), 20)); - std::array address {127, 104, 22, 17}; - attributes.push_back(new RadProto::IpAddress(m_dictionaries.attributeCode("NAS-IP-Address"), address)); - std::vector bytes {'1', '2', '3', 'a', 'b', 'c'}; - attributes.push_back(new RadProto::Bytes(m_dictionaries.attributeCode("Callback-Number"), bytes)); - std::vector chapPassword {'1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g' }; - attributes.push_back(new RadProto::ChapPassword(m_dictionaries.attributeCode("CHAP-Password"), 1, chapPassword)); - - std::vector vendorSpecific; - std::vector vendorValue {0, 0, 0, 3}; - vendorSpecific.push_back(RadProto::VendorSpecific(m_dictionaries.vendorCode("Dlink"), m_dictionaries.vendorAttributeCode("Dlink", "Dlink-User-Level"), vendorValue)); - - if (request.type() == RadProto::ACCESS_REQUEST) - return RadProto::Packet(RadProto::ACCESS_ACCEPT, request.id(), request.auth(), attributes, vendorSpecific); - - return RadProto::Packet(RadProto::ACCESS_REJECT, request.id(), request.auth(), attributes, vendorSpecific); + + for (const auto& at : m_config.getAuth().send) + { + std::string attrValue; + + if (at.second.type == Config::AttrValue::Type::PARAM_NAME) + attrValue = user->GetParamValue(at.second.value); + else + attrValue = at.second.value; + + const auto attrName = at.first; + const auto attrCode = m_dictionaries.attributeCode(attrName); + const auto attrType = m_dictionaries.attributeType(attrCode); + + if ((attrType == "integer") && (m_dictionaries.attributeValueFindByName(attrName, attrValue))) + attributes.push_back(RadProto::Attribute::make(attrCode, attrType, std::to_string(m_dictionaries.attributeValueCode(attrName, attrValue)))); + else + attributes.push_back(RadProto::Attribute::make(attrCode, attrType, attrValue)); + } + return attributes; +} + +RadProto::Packet Server::makeResponse(const RadProto::Packet& request) +{ + if (request.code() != RadProto::ACCESS_REQUEST) + return RadProto::Packet(RadProto::ACCESS_REJECT, request.id(), request.auth(), {}, {}); + + const User* user; + + user = findUser(request); + + if (user != nullptr) + return RadProto::Packet(RadProto::ACCESS_ACCEPT, request.id(), request.auth(), makeAttributes(user), {}); + + printfd(__FILE__, "Error findUser\n"); + return RadProto::Packet(RadProto::ACCESS_REJECT, request.id(), request.auth(), {}, {}); } void Server::handleSend(const error_code& ec) @@ -76,6 +106,7 @@ void Server::handleReceive(const error_code& error, const std::optionalcode() == RadProto::USER_NAME) + login = attribute->toString(); + + if (attribute->code() == RadProto::USER_PASSWORD) + password = attribute->toString(); + } + + User* user = nullptr; + if (m_users->FindByName(login, &user)) + { + m_logger("User '%s' not found.", login.c_str()); + printfd(__FILE__, "User '%s' NOT found!\n", login.c_str()); + return nullptr; + } + + printfd(__FILE__, "User '%s' FOUND!\n", user->GetLogin().c_str()); + + if (password != user->GetProperties().password.Get()) + { + m_logger("User's password is incorrect."); + printfd(__FILE__, "User's password is incorrect.\n"); + return nullptr; + } + return user; +}