]> git.stg.codes - stg.git/commitdiff
Merge branch 'stg-2.409' into stg-2.409-radius
authorMaxim Mamontov <faust.madf@gmail.com>
Sat, 20 Aug 2016 10:24:56 +0000 (13:24 +0300)
committerMaxim Mamontov <faust.madf@gmail.com>
Sat, 20 Aug 2016 10:24:56 +0000 (13:24 +0300)
1  2 
projects/stargazer/plugins/other/radius/radius.h
projects/stargazer/settings_impl.cpp
projects/stargazer/settings_impl.h

index 742923f0f4fa86840be797a04a16b55a5e3cbac2,0f1c95fcda66563c592f3238e611b337ed645b54..52da138ec6eeab1a21c25e71e3e2eed31d14740a
   *    Author : Maxim Mamontov <faust@stargazer.dp.ua>
   */
  
 -/*
 - *  Radius data access plugin for Stargazer
 - *
 - *  $Revision: 1.10 $
 - *  $Date: 2009/12/13 14:17:13 $
 - *
 - */
 -
 -#ifndef RADIUS_H
 -#define RADIUS_H
 -
 -#include <pthread.h>
 -
 -#include <cstring>
 -#include <cstdlib>
 -#include <string>
 -#include <list>
 -#include <map>
 -#include <vector>
 +#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 <string>
 +#include <deque>
 +#include <set>
  
 -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<std::string> & GetAuthServices() const { return authServices; }
 -    const std::list<std::string> & GetAcctServices() const { return acctServices; }
 +#include <pthread.h>
 +#include <unistd.h>
 +#include <sys/select.h>
 +#include <sys/types.h>
  
 -private:
 -    int ParseServices(const std::vector<std::string> & str, std::list<std::string> * lst);
 +extern "C" PLUGIN * GetPlugin();
  
 -    uint16_t port;
 -    std::string errorStr;
 -    std::string password;
 -    std::list<std::string> authServices;
 -    std::list<std::string> 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<std::pair<std::string, RAD_SESSION>, void>
 -    {
 -        void operator()(const std::pair<std::string, RAD_SESSION> & 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<std::string> authServices;
 -    std::list<std::string> acctServices;
 -    std::map<std::string, RAD_SESSION> 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<STG::Conn*> m_conns;
 +    std::set<std::string> m_logins;
  
 -    RAD_PACKET          packet;
 +    pthread_t m_thread;
  
 -    PLUGIN_LOGGER       logger;
 +    PLUGIN_LOGGER m_logger;
  };
 -//-----------------------------------------------------------------------------
  
  #endif
index 67b4272f127baffb30e45df902c8e95e9ea956a5,c1a3951c2841017305a8ae30e820a355e0940cb8..8c728fdc9f4d9938dcd68cb77c4861d8a9afb225
   *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  
 -/*
 - *    Date: 27.10.2002
 - */
 -
  /*
   *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
   */
  
 -/*
 -$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 <stdexcept>
  #include <cstring>
  #include <cerrno>
 -#include <string>
  
 -#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<std::string> toValues(const DOTCONFDocumentNode& node)
 +{
 +    std::vector<std::string> values;
 +
 +    size_t i = 0;
 +    const char* value = NULL;
 +    while ((value = node.getValue(i++)) != NULL)
 +        values.push_back(value);
 +
 +    return values;
 +}
 +
 +std::vector<PARAM_VALUE> toPVS(const DOTCONFDocumentNode& node)
 +{
 +    std::vector<PARAM_VALUE> 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)
  {
  }
  //-----------------------------------------------------------------------------
+ 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<PARAM_VALUE> * 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)
              }
          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)
                  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();
              }
  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;
 -}
 -//-----------------------------------------------------------------------------
index bab818c6ed473d3ce544eb879184481d1a8a696d,253b8bbccbcc70c0a41d4b09e464780b60c32b90..68fb9b0de7defa2491da639a429f8384e8d0d0aa
@@@ -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
   *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  
 -/*
 - *    Date: 27.10.2002
 - */
 -
  /*
   *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
   */
  
 - /*
 - $Revision: 1.27 $
 - $Date: 2010/08/19 13:42:30 $
 - */
 -
 -
  #ifndef SETTINGS_IMPL_H
  #define SETTINGS_IMPL_H
  
  #include <vector>
  
  #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; }
          { return modulesSettings; }
      const std::vector<std::string> & GetScriptParams() const { return scriptParams; }
  
 -private:
++    int ParseModuleSettings(const DOTCONFDocumentNode * node, std::vector<PARAM_VALUE> * params);
 -    int ParseDetailStatWritePeriod(const std::string & str);
 -    int ParseModuleSettings(const DOTCONFDocumentNode * dirNameNode, std::vector<PARAM_VALUE> * params);
 +private:
  
      static void ErrorCallback(void * data, const char * buf);
  
      std::string modulesPath;
      std::vector<std::string> dirName;
      std::string confDir;
 -    std::string       scriptsDir;
 +    std::string scriptsDir;
      std::string rules;
      std::string logFile;
      std::string pidFile;
  
      std::vector<MODULE_SETTINGS> modulesSettings;
      MODULE_SETTINGS storeModuleSettings;
 -    STG_LOGGER & logger;
 +    STG::RefWrapper<STG_LOGGER> logger;
  };
  //-----------------------------------------------------------------------------