From 07776790ef35816ddf11e3532fb1ae203979b876 Mon Sep 17 00:00:00 2001 From: gscalamera <graziano.scalamera@elettra.eu> Date: Wed, 20 Jan 2021 15:04:02 +0100 Subject: [PATCH] Escape semicolon in msg and url --- src/AlarmHandler.cpp | 34 +++++++++++++++------------------- src/alarm_grammar.h | 7 ++++--- src/alarm_table.cpp | 3 +++ 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/AlarmHandler.cpp b/src/AlarmHandler.cpp index abf8c2b..6cce193 100644 --- a/src/AlarmHandler.cpp +++ b/src/AlarmHandler.cpp @@ -68,6 +68,7 @@ using namespace boost::spirit::classic; #include <cassert> #endif //_DUMP_TREE_XML #include <sstream> +#include <regex> std::map<parser_id, std::string> rule_names; //only for log messages @@ -3098,19 +3099,13 @@ void AlarmHandler::load_alarm(string alarm_string, alarm_t &alm, vector<string> { alm.attr_name = alm.name; #if 0 - size_t start_pos = 0; - string from("/"); - string to("__"); - while((start_pos = alm.attr_name.find(from, start_pos)) != std::string::npos) - { - alm.attr_name.replace(start_pos, from.length(), to); - start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx' - } + alm.attr_name = std::regex_replace(alm.attr_name, std::regex("/"), "_"); #endif } //std::transform(alm.formula.begin(), alm.formula.end(), alm.formula.begin(), (int(*)(int))tolower); //transform to lowercase: incorrect, state has to be written uppercase std::transform(alm.lev.begin(), alm.lev.end(), alm.lev.begin(), (int(*)(int))tolower); //transform to lowercase - + alm.msg = std::regex_replace(alm.msg, std::regex(R"((\\;)|(;;))"), ";"); //match raw string "\;" or ";;" and replace with ";" + alm.url = std::regex_replace(alm.url, std::regex(R"((\\;)|(;;))"), ";"); //match raw string "\;" or ";;" and replace with ";" if(alm.cmd_name_a.length() > 0) { const char *c = alm.cmd_name_a.c_str(); @@ -3151,16 +3146,16 @@ void AlarmHandler::load_alarm(string alarm_string, alarm_t &alm, vector<string> dbg_msg; DEBUG_STREAM << dbg_msg.str() << endl; } - else - { - ostringstream o; + else + { + ostringstream o; o << "AlarmHandler::load_alarm(): Parsing Failed, '" << string(alarm_string.begin(), alm.formula_tree.stop) << "' parsed ok, BUT '" << string(alm.formula_tree.stop, alarm_string.end()) << "' not parsed"; //TODO - DEBUG_STREAM << o.str() << endl; - Tango::Except::throw_exception( \ - (const char*)"Parsing Failed!", \ - (const char*)o.str().c_str(), \ - (const char*)"AlarmHandler::load_alarm()", Tango::ERR); - } + DEBUG_STREAM << o.str() << endl; + Tango::Except::throw_exception( \ + (const char*)"Parsing Failed!", \ + (const char*)o.str().c_str(), \ + (const char*)"AlarmHandler::load_alarm()", Tango::ERR); + } alm.ts = gettime(); DEBUG_STREAM << "AlarmHandler::load_alarm(): name = '" << alm.name << "'" << endl; DEBUG_STREAM << " attr_name = '" << alm.attr_name << "'" << endl; @@ -5548,7 +5543,8 @@ void AlarmHandler::parse_alarm(string &alarm_string, alarm_t &alm) std::transform(alm.name.begin(), alm.name.end(), alm.name.begin(), (int(*)(int))tolower); //transform to lowercase //std::transform(alm.formula.begin(), alm.formula.end(), alm.formula.begin(), (int(*)(int))tolower); //transform to lowercase: incorrect, state has to be written upercase std::transform(alm.lev.begin(), alm.lev.end(), alm.lev.begin(), (int(*)(int))tolower); //transform to lowercase - + alm.msg = std::regex_replace(alm.msg, std::regex(R"((\\;)|(;;))"), ";"); //match raw string "\;" or ";;" and replace with ";" + alm.url = std::regex_replace(alm.url, std::regex(R"((\\;)|(;;))"), ";"); //match raw string "\;" or ";;" and replace with ";" if(alm.cmd_name_a.length() > 0) { const char *c = alm.cmd_name_a.c_str(); diff --git a/src/alarm_grammar.h b/src/alarm_grammar.h index d9fce01..0c166bb 100644 --- a/src/alarm_grammar.h +++ b/src/alarm_grammar.h @@ -269,10 +269,11 @@ struct alarm_parse : public grammar<alarm_parse> ) ; //------------------------------MESSAGE-------------------------------------- + escChar = (ch_p('\\') | ch_p(';')) >> ch_p(';'); //escaped semicolon: "\;" or ";;" msg = discard_node_d[str_p(KEY(MESSAGE_KEY))] //>> ch_p('"') - >> (+(anychar_p - ';')) //one ore more char except ';' TODO: handle escaped "\;" + >> (+(escChar | (anychar_p - ';'))) //one ore more char except ';' [ assign_a(self.m_alarm.msg) ] @@ -282,7 +283,7 @@ struct alarm_parse : public grammar<alarm_parse> url = discard_node_d[str_p(KEY(URL_KEY))] //>> ch_p('"') - >> (*(anychar_p - ';')) //zero ore more char except ';' TODO: handle escaped "\;" + >> (*(escChar | (anychar_p - ';'))) //zero ore more char except ';' [ assign_a(self.m_alarm.url) ] @@ -358,7 +359,7 @@ struct alarm_parse : public grammar<alarm_parse> rule_t expression, event, option; rule<typename lexeme_scanner<ScannerT>::type> symbol; //needed to use lexeme_d in rule name rule<typename lexeme_scanner<ScannerT>::type> symbol_attr_name; //needed to use lexeme_d in rule name - rule_t name, name_alm, val, token, oper, msg, url, group, level, on_delay, off_delay, silent_time, on_command, off_command, enabled, separator; + rule_t name, name_alm, val, token, oper, msg, url, group, level, on_delay, off_delay, silent_time, on_command, off_command, enabled, separator,escChar; formula_grammar formula; rule_t const& diff --git a/src/alarm_table.cpp b/src/alarm_table.cpp index dd28d1b..f794ae9 100644 --- a/src/alarm_table.cpp +++ b/src/alarm_table.cpp @@ -18,6 +18,7 @@ #include "alarm_table.h" #include "alarm_grammar.h" #include "cmd_thread.h" +#include <regex> static const char __FILE__rev[] = __FILE__ " $Revision: 1.5 $"; @@ -1022,6 +1023,8 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string> } i++; } + alm_message = std::regex_replace(alm_message, std::regex(";"), "\\;"); + alm_url = std::regex_replace(alm_url, std::regex(";"), "\\;"); stringstream alm; alm << KEY(NAME_KEY)<<alm_name << SEP << KEY(FORMULA_KEY)<<alm_formula << SEP << -- GitLab