]> git.stg.codes - stg.git/commitdiff
Fixed config parser for mod_radius.
authorMaxim Mamontov <faust.madf@gmail.com>
Mon, 31 Aug 2015 18:58:02 +0000 (21:58 +0300)
committerMaxim Mamontov <faust.madf@gmail.com>
Mon, 31 Aug 2015 18:58:02 +0000 (21:58 +0300)
projects/stargazer/plugins/other/radius/config.cpp
projects/stargazer/plugins/other/radius/config.h

index 64ff3707d93e89f90e92c480b0fb5e4b5188c834..23339c0267e260951d265211916f8b442d36d01a 100644 (file)
@@ -64,7 +64,8 @@ size_t checkChar(const std::string& value, size_t start, char ch)
 std::pair<size_t, std::string> readString(const std::string& value, size_t start)
 {
     std::string dest;
 std::pair<size_t, std::string> readString(const std::string& value, size_t start)
 {
     std::string dest;
-    while (start < value.length() && !std::isspace(value[start]))
+    while (start < value.length() && !std::isspace(value[start]) &&
+           value[start] != ',' && value[start] != '(' && value[start] != ')')
         dest.push_back(value[start++]);
     if (dest.empty()) {
         if (start == value.length())
         dest.push_back(value[start++]);
     if (dest.empty()) {
         if (start == value.length())
@@ -85,16 +86,21 @@ Config::Pairs toPairs(const std::vector<std::string>& values)
     while (start < value.size()) {
         Config::Pair pair;
         start = skipSpaces(value, start);
     while (start < value.size()) {
         Config::Pair pair;
         start = skipSpaces(value, start);
+        if (!res.empty())
+        {
+            start = checkChar(value, start, ',');
+            start = skipSpaces(value, start);
+        }
         size_t pairStart = start;
         start = checkChar(value, start, '(');
         size_t pairStart = start;
         start = checkChar(value, start, '(');
-        std::pair<size_t, std::string> key = readString(value, start);
+        const std::pair<size_t, std::string> key = readString(value, start);
         start = key.first;
         pair.first = key.second;
         start = skipSpaces(value, start);
         start = checkChar(value, start, ',');
         start = skipSpaces(value, start);
         start = key.first;
         pair.first = key.second;
         start = skipSpaces(value, start);
         start = checkChar(value, start, ',');
         start = skipSpaces(value, start);
-        std::pair<size_t, std::string> val = readString(value, start);
-        start = key.first;
+        const std::pair<size_t, std::string> val = readString(value, start);
+        start = val.first;
         pair.second = val.second;
         start = skipSpaces(value, start);
         start = checkChar(value, start, ')');
         pair.second = val.second;
         start = skipSpaces(value, start);
         start = checkChar(value, start, ')');
@@ -164,6 +170,27 @@ T parseInt(const std::string& paramName, const MODULE_SETTINGS& params)
     return 0;
 }
 
     return 0;
 }
 
+std::string parseAddress(const std::string& address)
+{
+    size_t pos = address.find_first_of(':');
+    if (pos == std::string::npos)
+        throw ParserError(0, "Connection type is not specified. Should be either 'unix' or 'tcp'.");
+    return address.substr(pos + 1);
+}
+
+Config::Type parseConnectionType(const std::string& address)
+{
+    size_t pos = address.find_first_of(':');
+    if (pos == std::string::npos)
+        throw ParserError(0, "Connection type is not specified. Should be either 'unix' or 'tcp'.");
+    std::string type = ToLower(address.substr(0, pos));
+    if (type == "unix")
+        return Config::UNIX;
+    else if (type == "tcp")
+        return Config::TCP;
+    throw ParserError(0, "Invalid connection type. Should be either 'unix' or 'tcp', got '" + type + "'");
+}
+
 } // namespace anonymous
 
 Config::Config(const MODULE_SETTINGS& settings)
 } // namespace anonymous
 
 Config::Config(const MODULE_SETTINGS& settings)
@@ -171,7 +198,9 @@ Config::Config(const MODULE_SETTINGS& settings)
       modify(parseVector("modify", settings)),
       reply(parseVector("reply", settings)),
       verbose(parseBool("verbose", settings)),
       modify(parseVector("modify", settings)),
       reply(parseVector("reply", settings)),
       verbose(parseBool("verbose", settings)),
-      bindAddress(parseString("bind_address", settings)),
+      address(parseString("bind_address", settings)),
+      bindAddress(parseAddress(address)),
+      connectionType(parseConnectionType(address)),
       portStr(parseString("port", settings)),
       port(parseInt<uint16_t>("port", settings)),
       key(parseString("key", settings))
       portStr(parseString("port", settings)),
       port(parseInt<uint16_t>("port", settings)),
       key(parseString("key", settings))
index d6553e1474a045a5501b6f75bb199dda305da1ec..28da964e930320269be5e507e7bbee01bfbe3391 100644 (file)
@@ -37,6 +37,7 @@ struct Config
     typedef std::pair<std::string, std::string> Pair;
     enum Type { UNIX, TCP };
 
     typedef std::pair<std::string, std::string> Pair;
     enum Type { UNIX, TCP };
 
+    Config() {}
     Config(const MODULE_SETTINGS& settings);
 
     Pairs match;
     Config(const MODULE_SETTINGS& settings);
 
     Pairs match;
@@ -45,8 +46,9 @@ struct Config
 
     bool verbose;
 
 
     bool verbose;
 
-    Type connectionType;
+    std::string address;
     std::string bindAddress;
     std::string bindAddress;
+    Type connectionType;
     std::string portStr;
     uint16_t port;
     std::string key;
     std::string portStr;
     uint16_t port;
     std::string key;