diff options
Diffstat (limited to 'SoftHSMv2/src/lib/common/Configuration.cpp')
-rw-r--r-- | SoftHSMv2/src/lib/common/Configuration.cpp | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/SoftHSMv2/src/lib/common/Configuration.cpp b/SoftHSMv2/src/lib/common/Configuration.cpp new file mode 100644 index 0000000..a7f6cc6 --- /dev/null +++ b/SoftHSMv2/src/lib/common/Configuration.cpp @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2010 SURFnet bv + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/***************************************************************************** + Configuration.cpp + + Loads the configuration and supports retrieval of configuration information + *****************************************************************************/ + +#include <string> +#include <map> +#include "Configuration.h" +#include "log.h" + +// Initialise the one-and-only instance +#ifdef HAVE_CXX11 +std::unique_ptr<Configuration> Configuration::instance(nullptr); +#else +std::auto_ptr<Configuration> Configuration::instance(NULL); +#endif + +// Add all valid configurations +const struct config Configuration::valid_config[] = { + { "directories.tokendir", CONFIG_TYPE_STRING }, + { "objectstore.backend", CONFIG_TYPE_STRING }, + { "log.level", CONFIG_TYPE_STRING }, + { "slots.removable", CONFIG_TYPE_BOOL }, + { "", CONFIG_TYPE_UNSUPPORTED } +}; + +// Return the one-and-only instance +Configuration* Configuration::i() +{ + if (instance.get() == NULL) + { + instance.reset(new Configuration()); + } + + return instance.get(); +} + +// Constructor +Configuration::Configuration() +{ + configLoader = NULL; +} + +// Get the type of the configuration value +int Configuration::getType(std::string key) +{ + for (int i = 0; valid_config[i].key.compare("") != 0; i++) + { + if (valid_config[i].key.compare(key) == 0) + { + return valid_config[i].type; + } + } + + return CONFIG_TYPE_UNSUPPORTED; +} + +// Retrieve a string based configuration value +std::string Configuration::getString(std::string key, std::string ifEmpty /* = "" */) +{ + if (stringConfiguration.find(key) != stringConfiguration.end()) + { + return stringConfiguration[key]; + } + else + { + WARNING_MSG("Missing %s in configuration. Using default value: %s", key.c_str(), ifEmpty.c_str()); + return ifEmpty; + } +} + +// Retrieve an integer configuration value +int Configuration::getInt(std::string key, int ifEmpty /* = 0 */) +{ + if (integerConfiguration.find(key) != integerConfiguration.end()) + { + return integerConfiguration[key]; + } + else + { + WARNING_MSG("Missing %s in configuration. Using default value: %i", key.c_str(), ifEmpty); + return ifEmpty; + } +} + +// Retrieve a boolean configuration value +bool Configuration::getBool(std::string key, bool ifEmpty /* = false */) +{ + if (booleanConfiguration.find(key) != booleanConfiguration.end()) + { + return booleanConfiguration[key]; + } + else + { + WARNING_MSG("Missing %s in configuration. Using default value: %s", key.c_str(), ifEmpty ? "true" : "false"); + return ifEmpty; + } +} + +// Set a string based configuration value +void Configuration::setString(std::string key, std::string value) +{ + stringConfiguration[key] = value; +} + +// Set an integer based configuration value +void Configuration::setInt(std::string key, int value) +{ + integerConfiguration[key] = value; +} + +// Set a boolean configuration value +void Configuration::setBool(std::string key, bool value) +{ + booleanConfiguration[key] = value; +} + +// Reload the configuration +bool Configuration::reload() +{ + if (configLoader == NULL) + { + return false; + } + + // Discard the current configuration + stringConfiguration.clear(); + integerConfiguration.clear(); + booleanConfiguration.clear(); + + // Reload the configuration + if (!configLoader->loadConfiguration()) + { + ERROR_MSG("Failed to load the SoftHSM configuration"); + + return false; + } + + return true; +} + +// Reload the configuration using the specified configuration loader +bool Configuration::reload(ConfigLoader* inConfigLoader) +{ + configLoader = inConfigLoader; + + return reload(); +} + |