int rule_msg; // 1=>use rule msg; 0=>use DEFAULT_MSG
ssize_t buf_len; // length of response
char* resp_buf; // response to send
+ char* resp_page;
};
-static char* s_page = nullptr;
-
class ReactAction : public IpsAction
{
public:
ReactAction::~ReactAction()
{
- if ( s_page )
- {
- snort_free(s_page);
- s_page = nullptr;
- }
if (config->resp_buf)
snort_free(config->resp_buf);
// implementation foo
//-------------------------------------------------------------------------
-static bool react_getpage(const char* file)
-{
- char* msg;
- char* percent_s;
- struct stat fs;
- FILE* fd;
- size_t n;
-
- if ( stat(file, &fs) )
- {
- ParseError("can't stat react page file '%s'.", file);
- return false;
- }
-
- s_page = (char*)snort_calloc(fs.st_size+1);
- fd = fopen(file, "r");
-
- if ( !fd )
- {
- ParseError("can't open react page file '%s'.", file);
- return false;
- }
-
- n = fread(s_page, 1, fs.st_size, fd);
- fclose(fd);
-
- if ( n != (size_t)fs.st_size )
- {
- ParseError("can't load react page file '%s'.", file);
- return false;
- }
-
- s_page[n] = '\0';
- msg = strstr(s_page, MSG_KEY);
- if ( msg )
- strncpy(msg, "%s", 2);
-
- // search for %
- percent_s = strstr(s_page, MSG_PERCENT);
- if (percent_s)
- {
- percent_s += strlen(MSG_PERCENT); // move past current
- // search for % again
- percent_s = strstr(percent_s, MSG_PERCENT);
- if (percent_s)
- {
- ParseError("can't specify more than one %%s or other "
- "printf style formatting characters in react page '%s'.",
- file);
- return false;
- }
- }
- return true;
-}
//--------------------------------------------------------------------
char dummy;
const char* head = DEFAULT_HTTP;
- const char* body = s_page ? s_page : DEFAULT_HTML;
+ const char* body = rd->resp_page ? rd->resp_page : DEFAULT_HTML;
const char* msg = DEFAULT_MSG;
body_len = snprintf(&dummy, 1, body, msg);
class ReactModule : public Module
{
public:
- ReactModule() : Module(s_name, s_help, s_params) { }
+ ReactModule() : Module(s_name, s_help, s_params) { page = nullptr; }
+ ~ReactModule() override { if (page) snort_free(page); }
bool begin(const char*, int, SnortConfig*) override;
bool set(const char*, Value&, SnortConfig*) override;
public:
bool msg;
+ char* page;
+private:
+ bool getpage(const char* file);
};
+bool ReactModule::getpage(const char* file)
+{
+ char* msg;
+ char* percent_s;
+ struct stat fs;
+ FILE* fd;
+ size_t n;
+
+ if ( stat(file, &fs) )
+ {
+ ParseError("can't stat react page file '%s'.", file);
+ return false;
+ }
+
+ page = (char*)snort_calloc(fs.st_size+1);
+ fd = fopen(file, "r");
+
+ if ( !fd )
+ {
+ ParseError("can't open react page file '%s'.", file);
+ return false;
+ }
+
+ n = fread(page, 1, fs.st_size, fd);
+ fclose(fd);
+
+ if ( n != (size_t)fs.st_size )
+ {
+ ParseError("can't load react page file '%s'.", file);
+ return false;
+ }
+
+ page[n] = '\0';
+ msg = strstr(page, MSG_KEY);
+ if ( msg )
+ strncpy(msg, "%s", 2);
+
+ // search for %
+ percent_s = strstr(page, MSG_PERCENT);
+ if (percent_s)
+ {
+ percent_s += strlen(MSG_PERCENT); // move past current
+ // search for % again
+ percent_s = strstr(percent_s, MSG_PERCENT);
+ if (percent_s)
+ {
+ ParseError("can't specify more than one %%s or other "
+ "printf style formatting characters in react page '%s'.",
+ file);
+ return false;
+ }
+ }
+ return true;
+}
+
bool ReactModule::begin(const char*, int, SnortConfig*)
{
msg = false;
msg = v.get_bool();
else if ( v.is("page") )
- return react_getpage(v.get_string());
+ return getpage(v.get_string());
else
return false;
ReactModule* m = (ReactModule*)p;
rd->rule_msg = m->msg;
-
+ rd->resp_page = m->page;
react_config(rd); // FIXIT-L this must be done per response
Active::set_enabled();