mirror of
https://github.com/owasp-modsecurity/ModSecurity.git
synced 2025-08-15 23:55:03 +03:00
parser: Loads content straight from buffer.
This commit is contained in:
parent
d3eb0fd913
commit
9c2158958e
@ -66,12 +66,10 @@ int Driver::addSecRule(ModSecurity::Rule *rule) {
|
|||||||
|
|
||||||
|
|
||||||
int Driver::parse(const std::string &f) {
|
int Driver::parse(const std::string &f) {
|
||||||
file = f;
|
buffer = f;
|
||||||
scan_begin();
|
scan_begin();
|
||||||
yy::seclang_parser parser(*this);
|
yy::seclang_parser parser(*this);
|
||||||
parser.set_debug_level(trace_parsing);
|
parser.set_debug_level(0);
|
||||||
// yy_scan_buffer
|
|
||||||
|
|
||||||
int res = parser.parse();
|
int res = parser.parse();
|
||||||
|
|
||||||
if (audit_log->init() == false) {
|
if (audit_log->init() == false) {
|
||||||
@ -79,7 +77,7 @@ int Driver::parse(const std::string &f) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
scan_end();
|
scan_end();
|
||||||
return res;
|
return res == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -90,10 +88,12 @@ int Driver::parseFile(const std::string &f) {
|
|||||||
parser.set_debug_level(trace_parsing);
|
parser.set_debug_level(trace_parsing);
|
||||||
int res = parser.parse();
|
int res = parser.parse();
|
||||||
|
|
||||||
// std::cout << "Leaving the parser: " << res << std::endl;
|
if (audit_log->init() == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
scan_end();
|
scan_end();
|
||||||
return res;
|
return res == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -112,3 +112,4 @@ void Driver::error(const yy::location& l, const std::string& m,
|
|||||||
void Driver::parser_error(const yy::location& l, const std::string& m) {
|
void Driver::parser_error(const yy::location& l, const std::string& m) {
|
||||||
parserError << ". " << m << "." << std::endl;
|
parserError << ". " << m << "." << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
using ModSecurity::Rule;
|
using ModSecurity::Rule;
|
||||||
using ModSecurity::Rules;
|
using ModSecurity::Rules;
|
||||||
|
|
||||||
|
|
||||||
# define YY_DECL \
|
# define YY_DECL \
|
||||||
yy::seclang_parser::symbol_type yylex(Driver& driver)
|
yy::seclang_parser::symbol_type yylex(Driver& driver)
|
||||||
|
|
||||||
@ -83,6 +84,9 @@ class Driver : public Rules {
|
|||||||
void parser_error(const yy::location& l, const std::string& m);
|
void parser_error(const yy::location& l, const std::string& m);
|
||||||
void error(const yy::location& l, const std::string& m,
|
void error(const yy::location& l, const std::string& m,
|
||||||
const std::string& c);
|
const std::string& c);
|
||||||
|
|
||||||
|
std::string buffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif // SRC_PARSER_DRIVER_H_
|
#endif // SRC_PARSER_DRIVER_H_
|
||||||
|
@ -185,23 +185,24 @@ FREE_TEXT_NEW_LINE [^\"|\n]+
|
|||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
void
|
void Driver::scan_begin () {
|
||||||
Driver::scan_begin ()
|
yy_flex_debug = trace_scanning;
|
||||||
{
|
if (buffer.empty() == false) {
|
||||||
yy_flex_debug = trace_scanning;
|
yy_scan_string(buffer.c_str());
|
||||||
if (file.empty () || file == "-")
|
} else if (file.empty() == false) {
|
||||||
yyin = stdin;
|
if (!(yyin = fopen (file.c_str (), "r"))) {
|
||||||
else if (!(yyin = fopen (file.c_str (), "r")))
|
// FIXME: we should return a decent error.
|
||||||
{
|
exit (EXIT_FAILURE);
|
||||||
exit (EXIT_FAILURE);
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Driver::scan_end () {
|
||||||
|
if (buffer.empty() == false) {
|
||||||
|
yy_scan_string(buffer.c_str());
|
||||||
|
} else if (file.empty() == false) {
|
||||||
|
fclose(yyin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
Driver::scan_end ()
|
|
||||||
{
|
|
||||||
fclose (yyin);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
18
src/rules.cc
18
src/rules.cc
@ -111,25 +111,17 @@ int Rules::loadRemote(char *key, char *uri) {
|
|||||||
|
|
||||||
|
|
||||||
int Rules::load(const char *plain_rules) {
|
int Rules::load(const char *plain_rules) {
|
||||||
bool ret = true;
|
|
||||||
/**
|
|
||||||
* @todo rgg. we should make the parser work out of the buffer.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
std::ofstream myfile;
|
|
||||||
myfile.open("/tmp/modsec_ugly_hack.txt");
|
|
||||||
myfile << plain_rules;
|
|
||||||
myfile.close();
|
|
||||||
|
|
||||||
Driver *driver = new Driver();
|
Driver *driver = new Driver();
|
||||||
if (driver->parse("/tmp/modsec_ugly_hack.txt")) {
|
|
||||||
ret = false;
|
if (driver->parse(plain_rules) == false) {
|
||||||
parserError << driver->parserError.rdbuf();
|
parserError << driver->parserError.rdbuf();
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->merge(driver);
|
this->merge(driver);
|
||||||
delete driver;
|
delete driver;
|
||||||
|
|
||||||
return ret;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user