From: Maxim Mamontov Date: Sat, 20 Aug 2016 10:24:56 +0000 (+0300) Subject: Merge branch 'stg-2.409' into stg-2.409-radius X-Git-Url: https://git.stg.codes/stg.git/commitdiff_plain/f3300c448f21eb61c08284f1e210bd7766da784e?ds=inline;hp=-c Merge branch 'stg-2.409' into stg-2.409-radius --- f3300c448f21eb61c08284f1e210bd7766da784e diff --combined projects/stargazer/plugins/other/radius/radius.h index 742923f0,0f1c95fc..52da138e --- a/projects/stargazer/plugins/other/radius/radius.h +++ b/projects/stargazer/plugins/other/radius/radius.h @@@ -18,93 -18,154 +18,93 @@@ * Author : Maxim Mamontov */ -/* - * Radius data access plugin for Stargazer - * - * $Revision: 1.10 $ - * $Date: 2009/12/13 14:17:13 $ - * - */ - -#ifndef RADIUS_H -#define RADIUS_H - -#include - -#include -#include -#include -#include -#include -#include +#ifndef __STG_RADIUS_H__ +#define __STG_RADIUS_H__ #include "stg/os_int.h" #include "stg/auth.h" #include "stg/module_settings.h" -#include "stg/notifer.h" -#include "stg/user_ips.h" -#include "stg/user.h" -#include "stg/users.h" -#include "stg/blowfish.h" -#include "stg/rad_packets.h" #include "stg/logger.h" -extern "C" PLUGIN * GetPlugin(); +#include "config.h" +#include "conn.h" -#define RAD_DEBUG (1) +#include +#include +#include -class RADIUS; -//----------------------------------------------------------------------------- -class RAD_SETTINGS { -public: - RAD_SETTINGS() - : port(0), errorStr(), password(), - authServices(), acctServices() - {} - virtual ~RAD_SETTINGS() {} - const std::string & GetStrError() const { return errorStr; } - int ParseSettings(const MODULE_SETTINGS & s); - uint16_t GetPort() const { return port; } - const std::string & GetPassword() const { return password; } - const std::list & GetAuthServices() const { return authServices; } - const std::list & GetAcctServices() const { return acctServices; } +#include +#include +#include +#include -private: - int ParseServices(const std::vector & str, std::list * lst); +extern "C" PLUGIN * GetPlugin(); - uint16_t port; - std::string errorStr; - std::string password; - std::list authServices; - std::list acctServices; -}; -//----------------------------------------------------------------------------- -struct RAD_SESSION { - RAD_SESSION() : userName(), serviceType() {} - std::string userName; - std::string serviceType; -}; -//----------------------------------------------------------------------------- -class RADIUS :public AUTH { +class STORE; +class USERS; + +class RADIUS : public AUTH { public: - RADIUS(); - virtual ~RADIUS() {} + RADIUS(); + virtual ~RADIUS() {} - void SetUsers(USERS * u) { users = u; } - void SetStore(STORE * s) { store = s; } - void SetStgSettings(const SETTINGS *) {} - void SetSettings(const MODULE_SETTINGS & s) { settings = s; } - int ParseSettings(); + void SetUsers(USERS* u) { m_users = u; } + void SetStore(STORE* s) { m_store = s; } + void SetStgSettings(const SETTINGS*) {} + void SetSettings(const MODULE_SETTINGS& s) { m_settings = s; } + int ParseSettings(); - int Start(); - int Stop(); - int Reload(const MODULE_SETTINGS & /*ms*/) { return 0; } - bool IsRunning() { return isRunning; } + int Start(); + int Stop(); - int Reload() { return 0; } ++ int Reload(const MODULE_SETTINGS & /*ms*/) { return 0; } + bool IsRunning() { return m_running; } - const std::string & GetStrError() const { return errorStr; } - std::string GetVersion() const { return "RADIUS data access plugin v 0.6"; } - uint16_t GetStartPosition() const { return 30; } - uint16_t GetStopPosition() const { return 30; } + const std::string& GetStrError() const { return m_error; } + std::string GetVersion() const { return "RADIUS data access plugin v. 2.0"; } + uint16_t GetStartPosition() const { return 30; } + uint16_t GetStopPosition() const { return 30; } - int SendMessage(const STG_MSG &, uint32_t) const { return 0; } + int SendMessage(const STG_MSG&, uint32_t) const { return 0; } + + void authorize(const USER& user); + void unauthorize(const std::string& login, const std::string& reason); private: RADIUS(const RADIUS & rvalue); RADIUS & operator=(const RADIUS & rvalue); - static void * Run(void *); - int PrepareNet(); - int FinalizeNet(); - - ssize_t Send(const RAD_PACKET & packet, struct sockaddr_in * outerAddr); - int RecvData(RAD_PACKET * packet, struct sockaddr_in * outerAddr); - int ProcessData(RAD_PACKET * packet); - - int ProcessAutzPacket(RAD_PACKET * packet); - int ProcessAuthPacket(RAD_PACKET * packet); - int ProcessPostAuthPacket(RAD_PACKET * packet); - int ProcessAcctStartPacket(RAD_PACKET * packet); - int ProcessAcctStopPacket(RAD_PACKET * packet); - int ProcessAcctUpdatePacket(RAD_PACKET * packet); - int ProcessAcctOtherPacket(RAD_PACKET * packet); - - bool FindUser(USER_PTR * ui, const std::string & login) const; - bool CanAuthService(const std::string & svc) const; - bool CanAcctService(const std::string & svc) const; - bool IsAllowedService(const std::string & svc) const; - - struct SPrinter : public std::unary_function, void> - { - void operator()(const std::pair & it) - { - printfd("radius.cpp", "%s - ('%s', '%s')\n", it.first.c_str(), it.second.userName.c_str(), it.second.serviceType.c_str()); - } - }; + static void* run(void*); - BLOWFISH_CTX ctx; + bool reconnect(); + int createUNIX() const; + int createTCP() const; + void runImpl(); + int maxFD() const; + void buildFDSet(fd_set & fds) const; + void cleanupConns(); + void handleEvents(const fd_set & fds); + void acceptConnection(); + void acceptUNIX(); + void acceptTCP(); - mutable std::string errorStr; - RAD_SETTINGS radSettings; - MODULE_SETTINGS settings; - std::list authServices; - std::list acctServices; - std::map sessions; + mutable std::string m_error; + STG::Config m_config; - bool nonstop; - bool isRunning; + MODULE_SETTINGS m_settings; - USERS * users; - const SETTINGS * stgSettings; - const STORE * store; + bool m_running; + bool m_stopped; - pthread_t thread; - pthread_mutex_t mutex; + USERS* m_users; + const STORE* m_store; - int sock; + int m_listenSocket; + std::deque m_conns; + std::set m_logins; - RAD_PACKET packet; + pthread_t m_thread; - PLUGIN_LOGGER logger; + PLUGIN_LOGGER m_logger; }; -//----------------------------------------------------------------------------- #endif diff --combined projects/stargazer/settings_impl.cpp index 67b4272f,c1a3951c..8c728fdc --- a/projects/stargazer/settings_impl.cpp +++ b/projects/stargazer/settings_impl.cpp @@@ -14,80 -14,27 +14,80 @@@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* - * Date: 27.10.2002 - */ - /* * Author : Boris Mikhailenko */ -/* -$Revision: 1.45 $ -$Date: 2010/08/19 13:42:30 $ -$Author: faust $ -*/ +#include "settings_impl.h" + +#include "stg/logger.h" +#include "stg/dotconfpp.h" +#include "stg/common.h" +#include #include #include -#include -#include "stg/logger.h" -#include "stg/dotconfpp.h" -#include "settings_impl.h" +namespace +{ + +struct Error : public std::runtime_error +{ + Error(const std::string& message) : runtime_error(message) {} +}; + +std::vector toValues(const DOTCONFDocumentNode& node) +{ + std::vector values; + + size_t i = 0; + const char* value = NULL; + while ((value = node.getValue(i++)) != NULL) + values.push_back(value); + + return values; +} + +std::vector toPVS(const DOTCONFDocumentNode& node) +{ + std::vector pvs; + + const DOTCONFDocumentNode* child = node.getChildNode(); + while (child != NULL) + { + if (child->getName() == NULL) + continue; + + if (child->getChildNode() == NULL) + pvs.push_back(PARAM_VALUE(child->getName(), toValues(*child))); + else + pvs.push_back(PARAM_VALUE(child->getName(), toValues(*child), toPVS(*child))); + + child = child->getNextNode(); + } + + return pvs; +} + +unsigned toPeriod(const char* value) +{ + if (value == NULL) + throw Error("No detail stat period value."); + + std::string period(value); + if (period == "1") + return dsPeriod_1; + else if (period == "1/2") + return dsPeriod_1_2; + else if (period == "1/4") + return dsPeriod_1_4; + else if (period == "1/6") + return dsPeriod_1_6; + + throw Error("Invalid detail stat period value: '" + period + "'. Should be one of '1', '1/2', '1/4' or '1/6'."); +} + +} //----------------------------------------------------------------------------- SETTINGS_IMPL::SETTINGS_IMPL(const std::string & cd) @@@ -119,6 -66,111 +119,111 @@@ { } //----------------------------------------------------------------------------- + SETTINGS_IMPL::SETTINGS_IMPL(const SETTINGS_IMPL & rval) + : SETTINGS(), + strError(), + modulesPath(rval.modulesPath), + dirName(rval.dirName), + confDir(rval.confDir), + scriptsDir(rval.scriptsDir), + rules(rval.rules), + logFile(rval.logFile), + pidFile(rval.pidFile), + monitorDir(rval.monitorDir), + monitoring(rval.monitoring), + detailStatWritePeriod(rval.detailStatWritePeriod), + statWritePeriod(rval.statWritePeriod), + stgExecMsgKey(rval.stgExecMsgKey), + executersNum(rval.executersNum), + fullFee(rval.fullFee), + dayFee(rval.dayFee), + dayResetTraff(rval.dayResetTraff), + spreadFee(rval.spreadFee), + freeMbAllowInet(rval.freeMbAllowInet), + dayFeeIsLastDay(rval.dayFeeIsLastDay), + writeFreeMbTraffCost(rval.writeFreeMbTraffCost), + showFeeInCash(rval.showFeeInCash), + messageTimeout(rval.messageTimeout), + feeChargeType(rval.feeChargeType), + reconnectOnTariffChange(rval.reconnectOnTariffChange), + modulesSettings(rval.modulesSettings), + storeModuleSettings(rval.storeModuleSettings), + logger(GetStgLogger()) + { + } + //----------------------------------------------------------------------------- + SETTINGS_IMPL & SETTINGS_IMPL::operator=(const SETTINGS_IMPL & rhs) + { + modulesPath = rhs.modulesPath; + dirName = rhs.dirName; + confDir = rhs.confDir; + scriptsDir = rhs.scriptsDir; + rules = rhs.rules; + logFile = rhs.logFile; + pidFile = rhs.pidFile; + monitorDir = rhs.monitorDir; + scriptParams = rhs.scriptParams; + monitoring = rhs.monitoring; + detailStatWritePeriod = rhs.detailStatWritePeriod; + statWritePeriod = rhs.statWritePeriod; + stgExecMsgKey = rhs.stgExecMsgKey; + executersNum = rhs.executersNum; + fullFee = rhs.fullFee; + dayFee = rhs.dayFee; + dayResetTraff = rhs.dayResetTraff; + spreadFee = rhs.spreadFee; + freeMbAllowInet = rhs.freeMbAllowInet; + dayFeeIsLastDay = rhs.dayFeeIsLastDay; + writeFreeMbTraffCost = rhs.writeFreeMbTraffCost; + showFeeInCash = rhs.showFeeInCash; + messageTimeout = rhs.messageTimeout; + feeChargeType = rhs.feeChargeType; + reconnectOnTariffChange = rhs.reconnectOnTariffChange; + + modulesSettings = rhs.modulesSettings; + storeModuleSettings = rhs.storeModuleSettings; + return *this; + } + //----------------------------------------------------------------------------- + int SETTINGS_IMPL::ParseModuleSettings(const DOTCONFDocumentNode * node, std::vector * params) + { + const DOTCONFDocumentNode * childNode; + PARAM_VALUE pv; + const char * value; + + pv.param = node->getName(); + + if (node->getValue(1)) + { + strError = "Unexpected value \'" + std::string(node->getValue(1)) + "\'."; + return -1; + } + + value = node->getValue(0); + + if (!value) + { + strError = "Module name expected."; + return -1; + } + + childNode = node->getChildNode(); + while (childNode) + { + pv.param = childNode->getName(); + int i = 0; + while ((value = childNode->getValue(i++)) != NULL) + { + pv.value.push_back(value); + } + params->push_back(pv); + pv.value.clear(); + childNode = childNode->getNextNode(); + } + + return 0; + } + //----------------------------------------------------------------------------- void SETTINGS_IMPL::ErrorCallback(void * data, const char * buf) { printfd(__FILE__, "SETTINGS_IMPL::ErrorCallback() - %s\n", buf); @@@ -188,15 -240,11 +293,15 @@@ while (node if (strcasecmp(node->getName(), "DetailStatWritePeriod") == 0) { - if (ParseDetailStatWritePeriod(node->getValue(0)) != 0) - { - strError = "Incorrect DetailStatWritePeriod value: \'" + std::string(node->getValue(0)) + "\'"; + try + { + detailStatWritePeriod = toPeriod(node->getValue(0)); + } + catch (const Error& error) + { + strError = error.what(); return -1; - } + } } if (strcasecmp(node->getName(), "StatWritePeriod") == 0) @@@ -372,13 -420,8 +477,13 @@@ } storeModulesCount++; + if (node->getValue(0) == NULL) + { + strError = "No module name in the StoreModule section."; + return -1; + } storeModuleSettings.moduleName = node->getValue(0); - ParseModuleSettings(node, &storeModuleSettings.moduleParams); + storeModuleSettings.moduleParams = toPVS(*node); } if (strcasecmp(node->getName(), "Modules") == 0) @@@ -396,14 -439,13 +501,14 @@@ child = child->getNextNode(); continue; } - MODULE_SETTINGS modSettings; - modSettings.moduleParams.clear(); - modSettings.moduleName = child->getValue(); - ParseModuleSettings(child, &modSettings.moduleParams); + if (child->getValue(0) == NULL) + { + strError = "No module name in the Module section."; + return -1; + } - modulesSettings.push_back(modSettings); + modulesSettings.push_back(MODULE_SETTINGS(child->getValue(0), toPVS(*child))); child = child->getNextNode(); } @@@ -422,3 -464,29 +527,3 @@@ return 0; } //----------------------------------------------------------------------------- -int SETTINGS_IMPL::ParseDetailStatWritePeriod(const std::string & detailStatPeriodStr) -{ -if (detailStatPeriodStr == "1") - { - detailStatWritePeriod = dsPeriod_1; - return 0; - } -else if (detailStatPeriodStr == "1/2") - { - detailStatWritePeriod = dsPeriod_1_2; - return 0; - } -else if (detailStatPeriodStr == "1/4") - { - detailStatWritePeriod = dsPeriod_1_4; - return 0; - } -else if (detailStatPeriodStr == "1/6") - { - detailStatWritePeriod = dsPeriod_1_6; - return 0; - } - -return -1; -} -//----------------------------------------------------------------------------- diff --combined projects/stargazer/settings_impl.h index bab818c6,253b8bbc..68fb9b0d --- a/projects/stargazer/settings_impl.h +++ b/projects/stargazer/settings_impl.h @@@ -1,3 -1,9 +1,3 @@@ - /* - $Revision: 1.27 $ - $Date: 2010/08/19 13:42:30 $ - $Author: faust $ - */ - /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@@ -14,10 -20,20 +14,10 @@@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* - * Date: 27.10.2002 - */ - /* * Author : Boris Mikhailenko */ - /* - $Revision: 1.27 $ - $Date: 2010/08/19 13:42:30 $ - */ - - #ifndef SETTINGS_IMPL_H #define SETTINGS_IMPL_H @@@ -25,15 -41,15 +25,16 @@@ #include #include "stg/settings.h" + #include "stg/common.h" #include "stg/module_settings.h" +#include "stg/ref.h" //----------------------------------------------------------------------------- enum DETAIL_STAT_PERIOD { -dsPeriod_1, -dsPeriod_1_2, -dsPeriod_1_4, -dsPeriod_1_6 + dsPeriod_1, + dsPeriod_1_2, + dsPeriod_1_4, + dsPeriod_1_6 }; //----------------------------------------------------------------------------- class STG_LOGGER; @@@ -42,7 -58,10 +43,10 @@@ class DOTCONFDocumentNode class SETTINGS_IMPL : public SETTINGS { public: SETTINGS_IMPL(const std::string &); - SETTINGS_IMPL(const SETTINGS_IMPL &); ++ SETTINGS_IMPL(const SETTINGS_IMPL & rhs); virtual ~SETTINGS_IMPL() {} + SETTINGS_IMPL & operator=(const SETTINGS_IMPL &); + int Reload() { return ReadSettings(); } int ReadSettings(); @@@ -56,7 -75,7 +60,7 @@@ const std::string & GetRulesFileName() const { return rules; } const std::string & GetLogFileName() const { return logFile; } const std::string & GetPIDFileName() const { return pidFile; } - unsigned GetDetailStatWritePeriod() const + unsigned GetDetailStatWritePeriod() const { return detailStatWritePeriod; } unsigned GetStatWritePeriod() const { return statWritePeriod * 60; } unsigned GetDayFee() const { return dayFee; } @@@ -81,7 -100,10 +85,9 @@@ { return modulesSettings; } const std::vector & GetScriptParams() const { return scriptParams; } -private: ++ int ParseModuleSettings(const DOTCONFDocumentNode * node, std::vector * params); + - int ParseDetailStatWritePeriod(const std::string & str); - int ParseModuleSettings(const DOTCONFDocumentNode * dirNameNode, std::vector * params); +private: static void ErrorCallback(void * data, const char * buf); @@@ -91,7 -113,7 +97,7 @@@ std::string modulesPath; std::vector dirName; std::string confDir; - std::string scriptsDir; + std::string scriptsDir; std::string rules; std::string logFile; std::string pidFile; @@@ -116,7 -138,7 +122,7 @@@ std::vector modulesSettings; MODULE_SETTINGS storeModuleSettings; - STG_LOGGER & logger; + STG::RefWrapper logger; }; //-----------------------------------------------------------------------------