0.6.0-1 release
[manu/suphp.git] / src / Configuration.cpp
diff --git a/src/Configuration.cpp b/src/Configuration.cpp
new file mode 100644 (file)
index 0000000..a0ab793
--- /dev/null
@@ -0,0 +1,245 @@
+/*
+    suPHP - (c)2002-2005 Sebastian Marsching <sebastian@marsching.com>
+
+    This file is part of suPHP.
+
+    suPHP is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    suPHP is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with suPHP; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include <string>
+#include <vector>
+
+#include "IniFile.hpp"
+#include "Util.hpp"
+
+#include "Configuration.hpp"
+
+using namespace suPHP;
+
+bool suPHP::Configuration::strToBool(const std::string& bstr) const
+    throw (ParsingException) {
+    std::string str = bstr;
+    // Convert upper characters to lower characters
+    for (int i=0; i<str.size(); i++) {
+       if (str[i] >= 65 && str[i] <= 90)
+           str[i] += 32;
+    }
+
+    if (str == std::string("true")) {
+       return true;
+    } else if (str == std::string("yes")) {
+       return true;
+    } else if (str == std::string("on")) {
+       return true;
+    } else if (str == std::string("enabled")) {
+       return true;
+    } else if (str == std::string("1")) {
+       return true;
+    } else if (str == std::string("false")) {
+       return false;
+    } else if (str == std::string("no")) {
+       return false;
+    } else if (str == std::string("off")) {
+       return false;
+    } else if (str == std::string("disabled")) {
+       return false;
+    } else if (str == std::string("0")) {
+       return false;
+    } else {
+       throw ParsingException("\"" + str + "\" is not a valid boolean value",
+                              __FILE__, __LINE__);
+    }
+       
+}
+
+
+LogLevel suPHP::Configuration::strToLogLevel(const std::string& str) const
+    throw (ParsingException) {
+    if (str == "none")
+       return LOGLEVEL_NONE;
+    else if (str == "error")
+       return LOGLEVEL_ERROR;
+    else if (str == "warn")
+       return LOGLEVEL_WARN;
+    else if (str == "info")
+       return LOGLEVEL_INFO;
+    else
+       throw ParsingException("\"" + str + "\" is not a valid log level",
+                              __FILE__, __LINE__);
+}
+
+suPHP::Configuration::Configuration() {
+    this->logfile = "/var/log/suphp.log";
+#ifdef OPT_APACHE_USER
+    this->webserver_user = OPT_APACHE_USER;
+#else
+    this->webserver_user = "wwwrun";
+#endif
+    this->docroot = "/";
+    this->allow_file_group_writeable = false;
+    this->allow_directory_group_writeable = false;
+    this->allow_file_others_writeable = false;
+    this->allow_directory_others_writeable = false;
+#ifdef OPT_DISABLE_CHECKPATH
+    this->check_vhos_docroot = false;
+#else
+    this->check_vhost_docroot = true;
+#endif
+    this->errors_to_browser = false;
+    this->env_path = "/bin:/usr/bin";
+    this->loglevel = LOGLEVEL_INFO;
+#ifdef OPT_MIN_UID
+    this->min_uid = OPT_MIN_UID;
+#else
+    this->min_uid = 1;
+#endif
+#ifdef OPT_MIN_GID
+    this->min_gid = OPT_MIN_GID;
+#else
+    this->min_gid = 1;
+#endif
+    this->umask = 0077;
+}
+
+void suPHP::Configuration::readFromFile(File& file) 
+    throw (IOException, ParsingException) {
+    IniFile ini;
+    ini.parse(file);
+    if (ini.hasSection("global")) {
+       IniSection& sect = ini.getSection("global");
+       std::vector<std::string> keys = sect.getKeys();
+       std::vector<std::string>::iterator i;
+       for (i = keys.begin(); i < keys.end(); i++) {
+           std::string key = *i;
+           std::string value = sect.getValue(key);
+
+           if (key == "logfile")
+               this->logfile = value;
+           else if (key == "webserver_user")
+               this->webserver_user = value;
+           else if (key == "docroot")
+               this->docroot = value;
+           else if (key == "allow_file_group_writeable")
+               this->allow_file_group_writeable = this->strToBool(value);
+           else if (key == "allow_directory_group_writeable")
+               this->allow_directory_group_writeable = this->strToBool(value);
+           else if (key == "allow_file_others_writeable")
+               this->allow_file_others_writeable = this->strToBool(value);
+           else if (key == "allow_directory_others_writeable")
+               this->allow_directory_others_writeable = 
+                   this->strToBool(value);
+           else if (key == "check_vhost_docroot")
+               this->check_vhost_docroot = this->strToBool(value);
+           else if (key == "errors_to_browser")
+               this->errors_to_browser = this->strToBool(value);
+           else if (key == "env_path")
+               this->env_path = value;
+           else if (key == "loglevel")
+               this->loglevel = this->strToLogLevel(value);
+           else if (key == "min_uid")
+               this->min_uid = Util::strToInt(value);
+           else if (key == "min_gid")
+               this->min_gid = Util::strToInt(value);
+           else if (key == "umask")
+               this->umask = Util::octalStrToInt(value);
+           else 
+               throw ParsingException("Unknown option \"" + key + 
+                                      "\" in section [global]", 
+                                      __FILE__, __LINE__);
+       }
+    }
+    
+    // Get handlers / interpreters
+    if (ini.hasSection("handlers")) {
+       IniSection sect = ini.getSection("handlers");
+       std::vector<std::string> keys = sect.getKeys();
+       std::vector<std::string>::iterator i;
+       for (i = keys.begin(); i < keys.end(); i++) {
+           std::string key = *i;
+           std::string value = sect.getValue(key);
+           std::pair<std::string, std::string> p;
+           p.first = key;
+           p.second = value;
+           this->handlers.insert(p);
+       }
+    }
+    
+}
+
+std::string suPHP::Configuration::getLogfile() const {
+    return this->logfile;
+}
+
+LogLevel suPHP::Configuration::getLogLevel() const {
+    return this->loglevel;
+}
+
+std::string suPHP::Configuration::getWebserverUser() const {
+    return this->webserver_user;
+}
+
+std::string suPHP::Configuration::getDocroot() const {
+    return this->docroot;
+}
+
+bool suPHP::Configuration::getCheckVHostDocroot() const {
+    return this->check_vhost_docroot;
+}
+
+bool suPHP::Configuration::getAllowFileGroupWriteable() const {
+    return this->allow_file_group_writeable;
+}
+
+bool suPHP::Configuration::getAllowDirectoryGroupWriteable() const {
+    return this->allow_directory_group_writeable;
+}
+
+bool suPHP::Configuration::getAllowFileOthersWriteable() const {
+    return this->allow_file_others_writeable;
+}
+
+bool suPHP::Configuration::getAllowDirectoryOthersWriteable() const {
+    return this->allow_directory_others_writeable;
+}
+
+bool suPHP::Configuration::getErrorsToBrowser() const {
+    return this->errors_to_browser;
+}
+
+std::string suPHP::Configuration::getEnvPath() const {
+    return this->env_path;
+}
+
+std::string suPHP::Configuration::getInterpreter(std::string handler) const 
+    throw (KeyNotFoundException) {
+    if (this->handlers.find(handler) != this->handlers.end()) {
+       return this->handlers.find(handler) -> second;
+    } else {
+       throw KeyNotFoundException("Handler \"" + handler + "\" not found",
+                                  __FILE__, __LINE__);
+    }
+}
+
+int suPHP::Configuration::getMinUid() const {
+    return this->min_uid;
+}
+
+int suPHP::Configuration::getMinGid() const {
+    return this->min_gid;
+}
+
+int suPHP::Configuration::getUmask() const {
+    return this->umask;
+}