From e8cee8d5e26e7048914dd35d6694b23cb66e7dd2 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Fri, 20 Mar 2015 15:49:55 +0100 Subject: [PATCH] Allow using more than one %validator rule for the same type fixes #8829 --- lib/config/config_parser.yy | 8 +- lib/config/configtype.cpp | 8 +- lib/config/typerulelist.cpp | 280 ++++++++++++++++++------------------ lib/config/typerulelist.hpp | 152 ++++++++++---------- lib/icinga/command.cpp | 4 +- 5 files changed, 224 insertions(+), 228 deletions(-) diff --git a/lib/config/config_parser.yy b/lib/config/config_parser.yy index c09d13ec1..f84d4d5e5 100644 --- a/lib/config/config_parser.yy +++ b/lib/config/config_parser.yy @@ -372,9 +372,9 @@ type: T_TYPE identifier context->m_Type->GetRuleList()->AddRules(ruleList); context->m_Type->GetRuleList()->AddRequires(ruleList); - String validator = ruleList->GetValidator(); - if (!validator.IsEmpty()) - context->m_Type->GetRuleList()->SetValidator(validator); + BOOST_FOREACH(const String& validator, ruleList->GetValidators()) { + context->m_Type->GetRuleList()->AddValidator(validator); + } } ; @@ -407,7 +407,7 @@ typerule: T_REQUIRE T_STRING } | T_VALIDATOR T_STRING { - context->m_RuleLists.top()->SetValidator($2); + context->m_RuleLists.top()->AddValidator($2); free($2); } | T_ATTRIBUTE type T_STRING diff --git a/lib/config/configtype.cpp b/lib/config/configtype.cpp index af19b866d..03f0c690b 100644 --- a/lib/config/configtype.cpp +++ b/lib/config/configtype.cpp @@ -169,9 +169,7 @@ void ConfigType::ValidateObject(const Object::Ptr& object, locations.pop_back(); } - String validator = ruleList->GetValidator(); - - if (!validator.IsEmpty()) { + BOOST_FOREACH(const String& validator, ruleList->GetValidators()) { Function::Ptr func = ScriptGlobal::Get(validator, &Empty); if (!func) @@ -226,9 +224,7 @@ void ConfigType::ValidateArray(const Array::Ptr& array, locations.pop_back(); } - String validator = ruleList->GetValidator(); - - if (!validator.IsEmpty()) { + BOOST_FOREACH(const String& validator, ruleList->GetValidators()) { Function::Ptr func = ScriptGlobal::Get(validator, &Empty); if (!func) diff --git a/lib/config/typerulelist.cpp b/lib/config/typerulelist.cpp index d99905493..eb67bf5ed 100644 --- a/lib/config/typerulelist.cpp +++ b/lib/config/typerulelist.cpp @@ -1,140 +1,140 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org) * - * * - * This program 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. * - * * - * This program 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 this program; if not, write to the Free Software Foundation * - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ******************************************************************************/ - -#include "config/typerulelist.hpp" -#include "config/typerule.hpp" -#include - -using namespace icinga; - -/** - * Sets the validator method for a rule list. - * - * @param validator The validator. - */ -void TypeRuleList::SetValidator(const String& validator) -{ - m_Validator = validator; -} - -/** - * Retrieves the validator method. - * - * @returns The validator method. - */ -String TypeRuleList::GetValidator(void) const -{ - return m_Validator; -} - -/** - * Adds an attribute to the list of required attributes. - * - * @param attr The new required attribute. - */ -void TypeRuleList::AddRequire(const String& attr) -{ - m_Requires.push_back(attr); -} - -/** - * Retrieves the list of required attributes. - * - * @returns The list of required attributes. - */ -std::vector TypeRuleList::GetRequires(void) const -{ - return m_Requires; -} - -/** - * Adds all requires from the specified rule list. - * - * @param ruleList The rule list to copy requires from. - */ -void TypeRuleList::AddRequires(const TypeRuleList::Ptr& ruleList) -{ - BOOST_FOREACH(const String& require, ruleList->m_Requires) { - AddRequire(require); - } -} - -/** - * Adds a rule to a rule list. - * - * @param rule The rule that should be added. - */ -void TypeRuleList::AddRule(const TypeRule& rule) -{ - m_Rules.push_back(rule); -} - -/** - * Adds all rules from the specified rule list. - * - * @param ruleList The rule list to copy rules from. - */ -void TypeRuleList::AddRules(const TypeRuleList::Ptr& ruleList) -{ - BOOST_FOREACH(const TypeRule& rule, ruleList->m_Rules) { - AddRule(rule); - } -} - -/** - * Returns the number of rules currently contained in the list. - * - * @returns The length of the list. - */ -size_t TypeRuleList::GetLength(void) const -{ - return m_Rules.size(); -} - -/** - * Validates a field. - * - * @param name The name of the attribute. - * @param value The value of the attribute. - * @param[out] subRules The list of sub-rules for the matching rule. - * @param[out] hint A hint describing the validation failure. - * @returns The validation result. - */ -TypeValidationResult TypeRuleList::ValidateAttribute(const String& name, - const Value& value, TypeRuleList::Ptr *subRules, String *hint, - const TypeRuleUtilities *utils) const -{ - bool foundField = false; - BOOST_FOREACH(const TypeRule& rule, m_Rules) { - if (!rule.MatchName(name)) - continue; - - foundField = true; - - if (rule.MatchValue(value, hint, utils)) { - *subRules = rule.GetSubRules(); - return ValidationOK; - } - } - - if (foundField) - return ValidationInvalidType; - else - return ValidationUnknownField; -} +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org) * + * * + * This program 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. * + * * + * This program 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 this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + +#include "config/typerulelist.hpp" +#include "config/typerule.hpp" +#include + +using namespace icinga; + +/** + * Adds a validator method for a rule list. + * + * @param validator The validator. + */ +void TypeRuleList::AddValidator(const String& validator) +{ + m_Validators.push_back(validator); +} + +/** + * Retrieves the validator methods. + * + * @returns The validator methods. + */ +std::vector TypeRuleList::GetValidators(void) const +{ + return m_Validators; +} + +/** + * Adds an attribute to the list of required attributes. + * + * @param attr The new required attribute. + */ +void TypeRuleList::AddRequire(const String& attr) +{ + m_Requires.push_back(attr); +} + +/** + * Retrieves the list of required attributes. + * + * @returns The list of required attributes. + */ +std::vector TypeRuleList::GetRequires(void) const +{ + return m_Requires; +} + +/** + * Adds all requires from the specified rule list. + * + * @param ruleList The rule list to copy requires from. + */ +void TypeRuleList::AddRequires(const TypeRuleList::Ptr& ruleList) +{ + BOOST_FOREACH(const String& require, ruleList->m_Requires) { + AddRequire(require); + } +} + +/** + * Adds a rule to a rule list. + * + * @param rule The rule that should be added. + */ +void TypeRuleList::AddRule(const TypeRule& rule) +{ + m_Rules.push_back(rule); +} + +/** + * Adds all rules from the specified rule list. + * + * @param ruleList The rule list to copy rules from. + */ +void TypeRuleList::AddRules(const TypeRuleList::Ptr& ruleList) +{ + BOOST_FOREACH(const TypeRule& rule, ruleList->m_Rules) { + AddRule(rule); + } +} + +/** + * Returns the number of rules currently contained in the list. + * + * @returns The length of the list. + */ +size_t TypeRuleList::GetLength(void) const +{ + return m_Rules.size(); +} + +/** + * Validates a field. + * + * @param name The name of the attribute. + * @param value The value of the attribute. + * @param[out] subRules The list of sub-rules for the matching rule. + * @param[out] hint A hint describing the validation failure. + * @returns The validation result. + */ +TypeValidationResult TypeRuleList::ValidateAttribute(const String& name, + const Value& value, TypeRuleList::Ptr *subRules, String *hint, + const TypeRuleUtilities *utils) const +{ + bool foundField = false; + BOOST_FOREACH(const TypeRule& rule, m_Rules) { + if (!rule.MatchName(name)) + continue; + + foundField = true; + + if (rule.MatchValue(value, hint, utils)) { + *subRules = rule.GetSubRules(); + return ValidationOK; + } + } + + if (foundField) + return ValidationInvalidType; + else + return ValidationUnknownField; +} diff --git a/lib/config/typerulelist.hpp b/lib/config/typerulelist.hpp index 654ab9256..c96f11f34 100644 --- a/lib/config/typerulelist.hpp +++ b/lib/config/typerulelist.hpp @@ -1,76 +1,76 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org) * - * * - * This program 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. * - * * - * This program 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 this program; if not, write to the Free Software Foundation * - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ******************************************************************************/ - -#ifndef TYPERULELIST_H -#define TYPERULELIST_H - -#include "config/i2-config.hpp" -#include "base/value.hpp" -#include - -namespace icinga -{ - -struct TypeRule; -class TypeRuleUtilities; - -/** - * @ingroup config - */ -enum TypeValidationResult -{ - ValidationOK, - ValidationInvalidType, - ValidationUnknownField -}; - -/** - * A list of configuration type rules. - * - * @ingroup config - */ -class I2_CONFIG_API TypeRuleList : public Object -{ -public: - DECLARE_PTR_TYPEDEFS(TypeRuleList); - - void SetValidator(const String& validator); - String GetValidator(void) const; - - void AddRequire(const String& attr); - void AddRequires(const TypeRuleList::Ptr& ruleList); - std::vector GetRequires(void) const; - - void AddRule(const TypeRule& rule); - void AddRules(const TypeRuleList::Ptr& ruleList); - - TypeValidationResult ValidateAttribute(const String& name, const Value& value, - TypeRuleList::Ptr *subRules, String *hint, const TypeRuleUtilities *utils) const; - - size_t GetLength(void) const; - -private: - String m_Validator; - std::vector m_Requires; - std::vector m_Rules; -}; - -} - -#endif /* TYPERULELIST_H */ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org) * + * * + * This program 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. * + * * + * This program 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 this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + +#ifndef TYPERULELIST_H +#define TYPERULELIST_H + +#include "config/i2-config.hpp" +#include "base/value.hpp" +#include + +namespace icinga +{ + +struct TypeRule; +class TypeRuleUtilities; + +/** + * @ingroup config + */ +enum TypeValidationResult +{ + ValidationOK, + ValidationInvalidType, + ValidationUnknownField +}; + +/** + * A list of configuration type rules. + * + * @ingroup config + */ +class I2_CONFIG_API TypeRuleList : public Object +{ +public: + DECLARE_PTR_TYPEDEFS(TypeRuleList); + + void AddValidator(const String& validator); + std::vector GetValidators(void) const; + + void AddRequire(const String& attr); + void AddRequires(const TypeRuleList::Ptr& ruleList); + std::vector GetRequires(void) const; + + void AddRule(const TypeRule& rule); + void AddRules(const TypeRuleList::Ptr& ruleList); + + TypeValidationResult ValidateAttribute(const String& name, const Value& value, + TypeRuleList::Ptr *subRules, String *hint, const TypeRuleUtilities *utils) const; + + size_t GetLength(void) const; + +private: + std::vector m_Validators; + std::vector m_Requires; + std::vector m_Rules; +}; + +} + +#endif /* TYPERULELIST_H */ diff --git a/lib/icinga/command.cpp b/lib/icinga/command.cpp index f5adfbec4..293ffd1e9 100644 --- a/lib/icinga/command.cpp +++ b/lib/icinga/command.cpp @@ -82,7 +82,7 @@ void Command::ValidateArguments(const String& location, const Command::Ptr& obje String argstr = argval; - if(!MacroProcessor::ValidateMacroString(argstr)) { + if (!MacroProcessor::ValidateMacroString(argstr)) { BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " + location + ": Closing $ not found in macro format string '" + argstr + "'.", object->GetDebugInfo())); } @@ -103,7 +103,7 @@ void Command::ValidateEnvironmentVariables(const String& location, const Command if (!envval.IsString() || envval.IsEmpty()) continue; - if(!MacroProcessor::ValidateMacroString(envval)) { + if (!MacroProcessor::ValidateMacroString(envval)) { BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " + location + ": Closing $ not found in macro format string '" + envval + "'.", object->GetDebugInfo())); }