diff --git a/Makefile.am b/Makefile.am index eb10ae07..cf95acc0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,10 +12,12 @@ SUBDIRS = \ others \ src \ doc \ + tools \ $(MAYBE_EXAMPLES) \ $(MAYBE_TEST) + # make clean CLEANFILES = diff --git a/configure.ac b/configure.ac index 7bc01cb1..5ce04d31 100644 --- a/configure.ac +++ b/configure.ac @@ -321,6 +321,8 @@ AM_COND_IF([EXAMPLES], examples/simple_example_using_c/Makefile \ examples/multiprocess_c/Makefile \ examples/reading_logs_with_offset/Makefile \ + tools/Makefile \ + tools/rules-check/Makefile \ ])]) AM_COND_IF([AFL_FUZZER], diff --git a/tools/rules-check/Makefile.am b/tools/rules-check/Makefile.am new file mode 100644 index 00000000..1a99ce69 --- /dev/null +++ b/tools/rules-check/Makefile.am @@ -0,0 +1,28 @@ + + +bin_PROGRAMS = modsec-rules-check + +modsec_rules_check_SOURCES = \ + rules-check.cc + +modsec_rules_check_LDADD = \ + $(top_builddir)/src/.libs/libmodsecurity.a \ + $(CURL_LDADD) \ + $(GEOIP_LDFLAGS) $(GEOIP_LDADD) \ + $(PCRE_LDADD) \ + $(YAJL_LDFLAGS) $(YAJL_LDADD) \ + $(LMDB_LDFLAGS) $(LMDB_LDADD) \ + $(LIBXML2_LDADD) \ + $(GLOBAL_LDADD) + +modsec_rules_check_CPPFLAGS = \ + -std=c++11 \ + -I$(top_builddir)/headers \ + $(GLOBAL_CPPFLAGS) \ + $(PCRE_CFLAGS) \ + $(LMDB_CFLAGS) \ + $(LIBXML2_CFLAGS) + +MAINTAINERCLEANFILES = \ + Makefile.in + diff --git a/tools/rules-check/rules-check.cc b/tools/rules-check/rules-check.cc new file mode 100644 index 00000000..fff38c9d --- /dev/null +++ b/tools/rules-check/rules-check.cc @@ -0,0 +1,107 @@ +/* + * 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 +#include +#include + +#include +#include +#include + +#include "modsecurity/modsecurity.h" +#include "modsecurity/rules.h" + + +void print_help(const char *name) { + std::cout << "Use: " << name << " [|SecLangCommand]" << std::endl; + std::cout << std::endl; +} + + +int main(int argc, char **argv) { + modsecurity::Rules *rules; + char **args = argv; + rules = new modsecurity::Rules(); + int ret = 0; + + args++; + + if (*args == NULL) { + print_help(argv[0]); + return 0; + } + + while (*args != NULL) { + struct stat buffer; + std::string argFull; + const char *arg = *args; + std::string err; + int r; + + if (argFull.empty() == false) { + if (arg[strlen(arg)-1] == '\"') { + argFull.append(arg, strlen(arg)-1); + goto next; + } else { + argFull.append(arg); + goto next; + } + } + + if (arg[0] == '\"' && argFull.empty() == true) { + if (arg[strlen(arg)-1] == '\"') { + argFull.append(arg+1, strlen(arg) - 2); + } else { + argFull.append(arg+1); + goto next; + } + } + + if (argFull.empty() == false) { + arg = argFull.c_str(); + argFull.clear(); + } + + std::cout << " : " << arg << " -- "; + if (stat(arg, &buffer) == 0) { + r = rules->loadFromUri(arg); + } else { + r = rules->load(arg); + } + if (r < 0) { + err.assign(rules->m_parserError.str()); + rules->m_parserError.str(""); + rules->m_parserError.clear(); + ret = -1; + } + std::cout << "Loaded " << std::to_string(r) << " rules." << std::endl; + if (err.empty() == false) { + std::cerr << " " << err << std::endl; + } +next: + args++; + } + + delete rules; + + if (ret < 0) { + std::cout << "Test failed." << std::endl; + } else { + std::cout << "Test ok." << std::endl; + } + + return ret; +}