From 7f7bd9984315d38c6ffefe96dc964badac5101e6 Mon Sep 17 00:00:00 2001 From: Felipe Zimmerle Date: Fri, 22 Jul 2016 13:34:04 -0300 Subject: [PATCH] Adds missing file: rules_exceptions --- src/rules_exceptions.cc | 97 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/rules_exceptions.cc diff --git a/src/rules_exceptions.cc b/src/rules_exceptions.cc new file mode 100644 index 000000000..c6a083ef0 --- /dev/null +++ b/src/rules_exceptions.cc @@ -0,0 +1,97 @@ +/* + * ModSecurity, http://www.modsecurity.org/ + * Copyright (c) 2015 Trustwave Holdings, Inc. (http://www.trustwave.com/) + * + * You may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * If any of the files related to licensing are missing or if you have any + * other questions related to licensing please contact Trustwave Holdings, Inc. + * directly using the email address security@modsecurity.org. + * + */ + +#include "modsecurity/rules_exceptions.h" + +#include + +#include "src/utils.h" + +namespace modsecurity { + + +bool RulesExceptions::load(const std::string &a, std::string *error) { + std::vector toRemove = modsecurity::split(a, ' '); + for (std::string &a : toRemove) { + std::string b = removeBracketsIfNeeded(a); + + size_t dash = b.find('-'); + if (dash != std::string::npos) { + std::string n1s = std::string(b, 0, dash); + std::string n2s = std::string(b, dash + 1, b.size() - (dash + 1)); + int n1n = 0; + int n2n = 0; + try { + n1n = std::stoi(n1s); + } catch (...) { + error->assign("Not a number: " + n1s); + return false; + } + try { + n2n = std::stoi(n2s); + } catch (...) { + error->assign("Not a number: " + n2s); + return false; + } + + if (n1s > n2s) { + error->assign("Invalid range: " + b); + return false; + } + addRange(n1n, n2n); + } else { + try { + int num = std::stoi(b); + addNumber(num); + } catch (...) { + error->assign("Not a number or range: " + b); + return false; + } + } + } + + return true; +} + + +bool RulesExceptions::addNumber(int a) { + m_numbers.push_back(a); +} + + +bool RulesExceptions::addRange(int a, int b) { + m_ranges.push_back(std::make_pair(a, b)); +} + + +bool RulesExceptions::contains(int a) { + for (int z : m_numbers) { + if (a == z) { + return true; + } + } + + for (auto z : m_ranges) { + if (z.first <= a && z.second >= a) { + return true; + } + } + + return false; +} + + +} // namespace modsecurity +