X-Git-Url: http://git.home-dn.net/?p=manu%2Fsuphp.git;a=blobdiff_plain;f=src%2FConfiguration.cpp;fp=src%2FConfiguration.cpp;h=a0ab793f7d5d692a024260926620a1d1934e73ca;hp=0000000000000000000000000000000000000000;hb=873afb00229b8e205345b6895eaad6602d5e10f4;hpb=728a5b3f000f892e52ecea98fcc8f0c5d7275b7b diff --git a/src/Configuration.cpp b/src/Configuration.cpp new file mode 100644 index 0000000..a0ab793 --- /dev/null +++ b/src/Configuration.cpp @@ -0,0 +1,245 @@ +/* + suPHP - (c)2002-2005 Sebastian Marsching + + 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 +#include + +#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= 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 keys = sect.getKeys(); + std::vector::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 keys = sect.getKeys(); + std::vector::iterator i; + for (i = keys.begin(); i < keys.end(); i++) { + std::string key = *i; + std::string value = sect.getValue(key); + std::pair 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; +}