From 4eb0e69e29814620ca4ab7e2646ddee60e0f8cad Mon Sep 17 00:00:00 2001
From: Jonathan <jonathan.leon@pandorafms.com>
Date: Thu, 28 Sep 2023 10:11:55 +0200
Subject: [PATCH 1/4] #11763 new regex filter events

---
 pandora_console/operation/events/events.php | 33 ++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php
index 059c8f90ec..5567eecd60 100644
--- a/pandora_console/operation/events/events.php
+++ b/pandora_console/operation/events/events.php
@@ -130,6 +130,11 @@ $severity = get_parameter(
     'filter[severity]',
     ($filter['severity'] ?? '')
 );
+$regex = get_parameter(
+    'filter[regex]',
+    ($filter['regex'] ?? '')
+);
+unset($filter['regex']);
 $status = get_parameter(
     'filter[status]',
     ($filter['status'] ?? '')
@@ -466,6 +471,23 @@ if (is_ajax() === true) {
                 $events = $events['data'];
             }
 
+            if (!empty($events) && $regex !== '') {
+                foreach ($events as $key => $event) {
+                    $regex_validation = false;
+                    foreach ($event as $field) {
+                        if (preg_match('/'.$regex.'/', $field)) {
+                            $regex_validation = true;
+                        }
+                    }
+
+                    if ($regex_validation === false) {
+                        unset($events[$key]);
+                    }
+                }
+
+                $count = count($events);
+            }
+
             if (empty($events) === false) {
                 $redirection_form_id = 0;
 
@@ -2078,6 +2100,12 @@ $in = '<div class="filter_input"><label>'.__('Severity').'</label>';
 $in .= $data.'</div>';
 $inputs[] = $in;
 
+// REGEX search datatable.
+$in = '<div class="filter_input"><label>'.__('Regexp search').ui_print_help_tip(__('Regular expresion to filter.'), true).'</label>';
+$in .= html_print_input_text('regex', $regex, '', '', 255, true);
+$in .= '</div>';
+$inputs[] = $in;
+
 // User private filter.
 $inputs[] = html_print_input_hidden('private_filter_event', $private_filter_event, true);
 // Trick view in table.
@@ -3434,7 +3462,10 @@ $(document).ready( function() {
     $("#button-remove_without").click(function() {
         click_button_remove_tag("without");
     });
-    
+
+    $('#myInputTextField').keyup(function(){
+        $("#table_events").search($(this).val()).draw() ;
+    })
 
     //Autorefresh in fullscreen
     var pure = '<?php echo $pure; ?>';

From 545316e9a8f1ef55e9edddf2b48e71ada47a1cd5 Mon Sep 17 00:00:00 2001
From: Jonathan <jonathan.leon@pandorafms.com>
Date: Tue, 7 Nov 2023 08:35:49 +0100
Subject: [PATCH 2/4] #11763 regex fix html entities

---
 pandora_console/operation/events/events.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php
index 57c7111885..e4aa2aa5fe 100644
--- a/pandora_console/operation/events/events.php
+++ b/pandora_console/operation/events/events.php
@@ -132,7 +132,7 @@ $severity = get_parameter(
 );
 $regex = get_parameter(
     'filter[regex]',
-    ($filter['regex'] ?? '')
+    (io_safe_output($filter['regex']) ?? '')
 );
 unset($filter['regex']);
 $status = get_parameter(

From 82759ae12f247d48a77a89831fdf04db344d21d2 Mon Sep 17 00:00:00 2001
From: Jonathan <jonathan.leon@pandorafms.com>
Date: Wed, 8 Nov 2023 15:24:47 +0100
Subject: [PATCH 3/4] #11763 regex events

---
 pandora_console/operation/events/events.php | 41 ++++++++++++---------
 1 file changed, 23 insertions(+), 18 deletions(-)

diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php
index e4aa2aa5fe..f4eb499a79 100644
--- a/pandora_console/operation/events/events.php
+++ b/pandora_console/operation/events/events.php
@@ -471,29 +471,12 @@ if (is_ajax() === true) {
                 $events = $events['data'];
             }
 
-            if (!empty($events) && $regex !== '') {
-                foreach ($events as $key => $event) {
-                    $regex_validation = false;
-                    foreach ($event as $field) {
-                        if (preg_match('/'.$regex.'/', $field)) {
-                            $regex_validation = true;
-                        }
-                    }
-
-                    if ($regex_validation === false) {
-                        unset($events[$key]);
-                    }
-                }
-
-                $count = count($events);
-            }
-
             if (empty($events) === false) {
                 $redirection_form_id = 0;
 
                 $data = array_reduce(
                     $events,
-                    function ($carry, $item) use ($table_id, &$redirection_form_id, $filter, $compact_date, $external_url) {
+                    function ($carry, $item) use ($table_id, &$redirection_form_id, $filter, $compact_date, $external_url, $regex) {
                         global $config;
 
                         $tmp = (object) $item;
@@ -1241,12 +1224,34 @@ if (is_ajax() === true) {
                             }
                         }
 
+                        if (empty($tmp) === false && $regex !== '') {
+                            $regex_validation = false;
+                            foreach (json_decode(json_encode($tmp), true) as $key => $field) {
+                                if (preg_match('/'.$regex.'/', $field)) {
+                                    $regex_validation = true;
+                                }
+                            }
+
+                            if ($regex_validation === false) {
+                                unset($tmp);
+                            }
+                        }
+
                         $carry[] = $tmp;
                         return $carry;
                     }
                 );
             }
 
+            $data = array_values(
+                array_filter(
+                    $data,
+                    function ($item) {
+                        return (bool) (array) $item;
+                    }
+                )
+            );
+            $count = count($data);
             // RecordsTotal && recordsfiltered resultados totales.
             echo json_encode(
                 [

From f86a3e60e8513c5e63a0fef21d1d1067bdb9c049 Mon Sep 17 00:00:00 2001
From: Jonathan <jonathan.leon@pandorafms.com>
Date: Wed, 29 Nov 2023 11:14:40 +0100
Subject: [PATCH 4/4] #11763 save filter regex on bbdd

---
 pandora_console/extras/mr/67.sql            | 3 +++
 pandora_console/include/ajax/events.php     | 6 ++++++
 pandora_console/operation/events/events.php | 3 ++-
 pandora_console/pandoradb.sql               | 1 +
 4 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/pandora_console/extras/mr/67.sql b/pandora_console/extras/mr/67.sql
index a31ea6e670..11d57b140f 100644
--- a/pandora_console/extras/mr/67.sql
+++ b/pandora_console/extras/mr/67.sql
@@ -5,4 +5,7 @@ DROP TABLE tagent_access;
 
 ALTER TABLE treport_content ADD check_unknowns_graph tinyint DEFAULT 0 NULL;
 
+ALTER TABLE `tevent_filter`
+ADD COLUMN `regex` TEXT NULL AFTER `private_filter_user`;
+
 COMMIT;
diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php
index 881ef22f39..8a9c3c5710 100644
--- a/pandora_console/include/ajax/events.php
+++ b/pandora_console/include/ajax/events.php
@@ -313,6 +313,7 @@ if ($save_event_filter) {
     $values['severity'] = implode(',', get_parameter('severity', -1));
     $values['status'] = get_parameter('status');
     $values['search'] = get_parameter('search');
+    $values['regex'] = get_parameter('regex');
     $values['not_search'] = get_parameter('not_search');
     $values['text_agent'] = get_parameter('text_agent');
     $values['id_agent'] = get_parameter('id_agent');
@@ -381,6 +382,7 @@ if ($update_event_filter) {
     $values['severity'] = implode(',', get_parameter('severity', -1));
     $values['status'] = get_parameter('status');
     $values['search'] = get_parameter('search');
+    $values['regex'] = get_parameter('regex');
     $values['not_search'] = get_parameter('not_search');
     $values['text_agent'] = get_parameter('text_agent');
     $values['id_agent'] = get_parameter('id_agent');
@@ -640,6 +642,8 @@ function load_form_filter() {
                     $("#status").val(val);
                 if (i == 'search')
                     $('#text-search').val(val);
+                if (i == 'regex')
+                    $('#text-regex').val(val);
                 if (i == 'not_search')
                     $('#checkbox-not_search').val(val);
                 if (i == 'text_agent')
@@ -970,6 +974,7 @@ function save_new_filter() {
             "severity" : $("#severity").val(),
             "status" : $("#status").val(),
             "search" : $("#text-search").val(),
+            "regex" : $('#text-regex').val(),
             "not_search" : $("#checkbox-not_search").val(),
             "text_agent" : $("#text_id_agent").val(),
             "id_agent" : $('input:hidden[name=id_agent]').val(),
@@ -1050,6 +1055,7 @@ function save_update_filter() {
         "severity" : $("#severity").val(),
         "status" : $("#status").val(),
         "search" : $("#text-search").val(),
+        "regex" : $('#text-regex').val(),
         "not_search" : $("#checkbox-not_search").val(),
         "text_agent" : $("#text_id_agent").val(),
         "id_agent" : $('input:hidden[name=id_agent]').val(),
diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php
index bcdb370887..a1642fb25d 100644
--- a/pandora_console/operation/events/events.php
+++ b/pandora_console/operation/events/events.php
@@ -1320,6 +1320,7 @@ if ($loaded_filter !== false && $from_event_graph != 1 && isset($fb64) === false
         $severity = $filter['severity'];
         $status = $filter['status'];
         $search = $filter['search'];
+        $regex = $filter['regex'];
         $not_search = $filter['not_search'];
         $text_agent = $filter['text_agent'];
         $id_agent = $filter['id_agent'];
@@ -2085,7 +2086,7 @@ $in .= $data.'</div>';
 $inputs[] = $in;
 
 // REGEX search datatable.
-$in = '<div class="filter_input"><label>'.__('Regexp search').ui_print_help_tip(__('Regular expresion to filter.'), true).'</label>';
+$in = '<div class="filter_input"><label>'.__('Regex search').ui_print_help_tip(__('Regular expresion to filter.'), true).'</label>';
 $in .= html_print_input_text('regex', $regex, '', '', 255, true);
 $in .= '</div>';
 $inputs[] = $in;
diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql
index 4c527345c0..b9819936fc 100644
--- a/pandora_console/pandoradb.sql
+++ b/pandora_console/pandoradb.sql
@@ -1271,6 +1271,7 @@ CREATE TABLE IF NOT EXISTS `tevent_filter` (
   `custom_data_filter_type` TINYINT UNSIGNED DEFAULT 0,
   `owner_user` TEXT,
   `private_filter_user` TEXT,
+  `regex` TEXT,
   PRIMARY KEY  (`id_filter`)
 ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4;