]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/configparser.cpp
Add support for blocking tag messages with the deaf mode.
[user/henk/code/inspircd.git] / src / configparser.cpp
index 94a12e6e9044e204e581e75c141c71c528a66801..9f5a49f1daffc65d401304f36803fb982d268a3d 100644 (file)
@@ -36,7 +36,13 @@ enum ParseFlags
        FLAG_NO_EXEC = 2,
 
        // All includes are disabled.
-       FLAG_NO_INC = 4
+       FLAG_NO_INC = 4,
+
+       // &env.FOO; is disabled.
+       FLAG_NO_ENV = 8,
+
+       // It's okay if an include doesn't exist.
+       FLAG_MISSING_OKAY = 16
 };
 
 // Represents the position within a config file.
@@ -243,9 +249,13 @@ struct Parser
                                }
                                else if (varname.compare(0, 4, "env.") == 0)
                                {
+                                       if (flags & FLAG_NO_ENV)
+                                               throw CoreException("XML environment entity reference in file included with noenv=\"yes\"");
+
                                        const char* envstr = getenv(varname.c_str() + 4);
                                        if (!envstr)
                                                throw CoreException("Undefined XML environment entity reference '&" + varname + ";'");
+
                                        value.append(envstr);
                                }
                                else
@@ -413,9 +423,18 @@ void ParseStack::DoInclude(ConfigTag* tag, int flags)
        {
                if (tag->getBool("noinclude", false))
                        flags |= FLAG_NO_INC;
+
                if (tag->getBool("noexec", false))
                        flags |= FLAG_NO_EXEC;
 
+               if (tag->getBool("noenv", false))
+                       flags |= FLAG_NO_ENV;
+
+               if (tag->getBool("missingokay", false))
+                       flags |= FLAG_MISSING_OKAY;
+               else
+                       flags &= ~FLAG_MISSING_OKAY;
+
                if (!ParseFile(ServerInstance->Config->Paths.PrependConfig(name), flags, mandatorytag))
                        throw CoreException("Included");
        }
@@ -425,6 +444,8 @@ void ParseStack::DoInclude(ConfigTag* tag, int flags)
                        flags |= FLAG_NO_INC;
                if (tag->getBool("noexec", false))
                        flags |= FLAG_NO_EXEC;
+               if (tag->getBool("noenv", false))
+                       flags |= FLAG_NO_ENV;
 
                const std::string includedir = ServerInstance->Config->Paths.PrependConfig(name);
                std::vector<std::string> files;
@@ -447,6 +468,8 @@ void ParseStack::DoInclude(ConfigTag* tag, int flags)
                        flags |= FLAG_NO_INC;
                if (tag->getBool("noexec", true))
                        flags |= FLAG_NO_EXEC;
+               if (tag->getBool("noenv", true))
+                       flags |= FLAG_NO_ENV;
 
                if (!ParseFile(name, flags, mandatorytag, true))
                        throw CoreException("Included");
@@ -491,7 +514,12 @@ bool ParseStack::ParseFile(const std::string& path, int flags, const std::string
 
        FileWrapper file((isexec ? popen(path.c_str(), "r") : fopen(path.c_str(), "r")), isexec);
        if (!file)
+       {
+               if (flags & FLAG_MISSING_OKAY)
+                       return true;
+
                throw CoreException("Could not read \"" + path + "\" for include");
+       }
 
        reading.push_back(path);
        Parser p(*this, flags, file, path, mandatory_tag);
@@ -615,7 +643,7 @@ namespace
 long ConfigTag::getInt(const std::string &key, long def, long min, long max)
 {
        std::string result;
-       if(!readString(key, result))
+       if(!readString(key, result) || result.empty())
                return def;
 
        const char* res_cstr = result.c_str();
@@ -632,7 +660,7 @@ long ConfigTag::getInt(const std::string &key, long def, long min, long max)
 unsigned long ConfigTag::getUInt(const std::string& key, unsigned long def, unsigned long min, unsigned long max)
 {
        std::string result;
-       if (!readString(key, result))
+       if (!readString(key, result) || result.empty())
                return def;
 
        const char* res_cstr = result.c_str();
@@ -649,7 +677,7 @@ unsigned long ConfigTag::getUInt(const std::string& key, unsigned long def, unsi
 unsigned long ConfigTag::getDuration(const std::string& key, unsigned long def, unsigned long min, unsigned long max)
 {
        std::string duration;
-       if (!readString(key, duration))
+       if (!readString(key, duration) || duration.empty())
                return def;
 
        unsigned long ret;
@@ -678,7 +706,7 @@ double ConfigTag::getFloat(const std::string& key, double def, double min, doubl
 bool ConfigTag::getBool(const std::string &key, bool def)
 {
        std::string result;
-       if(!readString(key, result))
+       if(!readString(key, result) || result.empty())
                return def;
 
        if (stdalgo::string::equalsci(result, "yes") || stdalgo::string::equalsci(result, "true") || stdalgo::string::equalsci(result, "on") || result == "1")