From d44df2ea6b2650262737f53daaf3e0d0e88c0f2d Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Thu, 27 Jul 2023 13:21:57 +0200 Subject: [PATCH 01/41] #11326 added top n agents with worst score --- .../reporting_builder.item_editor.php | 11 +++++++++- .../godmode/reporting/reporting_builder.php | 12 ++++++++++ .../include/functions_reporting.php | 7 ++++++ .../include/functions_reporting_html.php | 22 +++++++++++++++++++ pandora_console/include/functions_reports.php | 7 ++++++ 5 files changed, 58 insertions(+), 1 deletion(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index 397e533366..3eb6bc6d1c 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -1019,6 +1019,11 @@ switch ($action) { $idAgent = $item['id_agent']; break; + case 'top_n_agents_sh': + $group = $item['id_group']; + $top_n_value = (empty($item['top_n_value']) === true) ? 10 : $item['top_n_value']; + break; + default: // It's not possible. break; @@ -7411,7 +7416,11 @@ function chooseType() { case 'ncm': $("#row_agent").show(); break; - + + case 'top_n_agents_sh': + $("#row_group").show(); + $("#row_max_items").show(); + break; } switch (type) { diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 00bc80f234..242ee1156c 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -1987,6 +1987,12 @@ switch ($action) { $good_format = true; break; + case 'top_n_agents_sh': + $values['id_group'] = get_parameter('combo_group'); + $values['top_n_value'] = get_parameter('max_items'); + $good_format = true; + break; + default: $values['period'] = get_parameter('period'); $values['top_n'] = get_parameter( @@ -2863,6 +2869,12 @@ switch ($action) { $good_format = true; break; + case 'top_n_agents_sh': + $values['id_group'] = get_parameter('combo_group'); + $values['top_n_value'] = get_parameter('max_items'); + $good_format = true; + break; + default: $values['period'] = get_parameter('period'); $values['top_n'] = get_parameter( diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index c01e44157a..d92b4ea38e 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -935,6 +935,13 @@ function reporting_make_reporting_data( ); break; + case 'top_n_agents_sh': + $report['contents'][] = reporting_top_n_agents_sh( + $report, + $content + ); + break; + default: // Default. break; diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index 91d8a9e5a5..ca36af48b8 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -463,6 +463,10 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) case 'ncm': reporting_html_ncm_config($table, $item); break; + + case 'top_n_agents_sh': + reporting_html_top_n_agents_sh($table, $item); + break; } if ($item['type'] == 'agent_module') { @@ -478,6 +482,24 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) } +function reporting_html_top_n_agents_sh($table, $item) +{ + global $config; + + $table->data[1][0] = ''.__('Agent').''; + $table->data[1][1] = ''.__('Last audit scan').''; + $table->data[1][2] = ''.__('Score').''; + + $row = 2; + foreach ($item['data'] as $key => $agent) { + $table->data[$row][0] = $agent['alias']; + $table->data[$row][1] = date($config['date_format'], $agent['utimestamp']); + $table->data[$row][2] = $agent['datos'].' %'; + $row++; + } +} + + /** * Function to print to HTML SLA report. * diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php index f13e935b6a..5b2c00229f 100755 --- a/pandora_console/include/functions_reports.php +++ b/pandora_console/include/functions_reports.php @@ -963,6 +963,13 @@ function reports_get_report_types($template=false, $not_editor=false) 'name' => __('Network configuration changes'), ]; + if (enterprise_installed() === true) { + $types['top_n_agents_sh'] = [ + 'optgroup' => __('Security hardening'), + 'name' => __('Top-N agents with the worst score'), + ]; + } + return $types; } From a0fdb2a791dbcef9f8023965211680b506d3c209 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Fri, 28 Jul 2023 12:11:36 +0200 Subject: [PATCH 02/41] #11326 new report vulnerabilities --- pandora_console/extras/mr/66.sql | 5 ++ .../reporting_builder.item_editor.php | 35 ++++++++ .../godmode/reporting/reporting_builder.php | 12 +++ .../include/functions_reporting.php | 7 ++ .../include/functions_reporting_html.php | 12 +++ pandora_console/include/functions_reports.php | 5 ++ pandora_console/include/graphs/fgraph.php | 11 +++ .../phpchartjs/src/Options/Elements.php | 26 ++++++ .../src/Options/Elements/Center.php | 85 +++++++++++++++++++ 9 files changed, 198 insertions(+) create mode 100644 pandora_console/extras/mr/66.sql create mode 100644 pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Center.php diff --git a/pandora_console/extras/mr/66.sql b/pandora_console/extras/mr/66.sql new file mode 100644 index 0000000000..c563508f1a --- /dev/null +++ b/pandora_console/extras/mr/66.sql @@ -0,0 +1,5 @@ +START TRANSACTION; + +ALTER TABLE `treport_content` ADD COLUMN `cat_security_hardening` INT NOT NULL DEFAULT 0; + +COMMIT; \ No newline at end of file diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index 3eb6bc6d1c..cc3fee9a2c 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -200,6 +200,14 @@ $text_agent_module = ''; $only_data = false; +$categories_security_hardening = []; +if (security_hardening_installed() === true) { + $categories_security_hardening = categories_of_cis(); + foreach ($categories_security_hardening as $key => $cat) { + $categories_security_hardening[$key] = implode(' ', $cat); + } +} + // Users. $id_users = []; $users_groups = []; @@ -1024,6 +1032,11 @@ switch ($action) { $top_n_value = (empty($item['top_n_value']) === true) ? 10 : $item['top_n_value']; break; + case 'vul_by_cat': + $group = $item['id_group']; + $cat_selected = $item['cat_security_hardening']; + break; + default: // It's not possible. break; @@ -3690,6 +3703,22 @@ $class = 'databox filters'; ?> + + + + + + + + @@ -6562,6 +6591,7 @@ function chooseType() { $("#row_group_by").hide(); $("#row_type_show").hide(); $("#row_use_prefix_notation").hide(); + $("#row_cat_security_hardening").hide(); // SLA list default state. $("#sla_list").hide(); @@ -7421,6 +7451,11 @@ function chooseType() { $("#row_group").show(); $("#row_max_items").show(); break; + + case 'vul_by_cat': + $("#row_group").show(); + $("#row_cat_security_hardening").show(); + break; } switch (type) { diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 242ee1156c..697561a59f 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -1993,6 +1993,12 @@ switch ($action) { $good_format = true; break; + case 'vul_by_cat': + $values['id_group'] = get_parameter('combo_group'); + $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); + $good_format = true; + break; + default: $values['period'] = get_parameter('period'); $values['top_n'] = get_parameter( @@ -2875,6 +2881,12 @@ switch ($action) { $good_format = true; break; + case 'vul_by_cat': + $values['id_group'] = get_parameter('combo_group'); + $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); + $good_format = true; + break; + default: $values['period'] = get_parameter('period'); $values['top_n'] = get_parameter( diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index d92b4ea38e..6561fe9389 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -942,6 +942,13 @@ function reporting_make_reporting_data( ); break; + case 'vul_by_cat': + $report['contents'][] = reporting_vul_by_categories( + $report, + $content + ); + break; + default: // Default. break; diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index ca36af48b8..bf144cd518 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -467,6 +467,10 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) case 'top_n_agents_sh': reporting_html_top_n_agents_sh($table, $item); break; + + case 'vul_by_cat': + reporting_vul_by_cat_graph($table, $item); + break; } if ($item['type'] == 'agent_module') { @@ -482,6 +486,14 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) } +function reporting_vul_by_cat_graph($table, $item) +{ + $table->colspan['chart']['cell'] = 3; + $table->cellstyle['chart']['cell'] = 'text-align: center;'; + $table->data['chart']['cell'] = $item['chart']; +} + + function reporting_html_top_n_agents_sh($table, $item) { global $config; diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php index 5b2c00229f..fca253153e 100755 --- a/pandora_console/include/functions_reports.php +++ b/pandora_console/include/functions_reports.php @@ -968,6 +968,11 @@ function reports_get_report_types($template=false, $not_editor=false) 'optgroup' => __('Security hardening'), 'name' => __('Top-N agents with the worst score'), ]; + + $types['vul_by_cat'] = [ + 'optgroup' => __('Security hardening'), + 'name' => __('Vulnerabilities by category'), + ]; } return $types; diff --git a/pandora_console/include/graphs/fgraph.php b/pandora_console/include/graphs/fgraph.php index 7da82a2ba8..40466decb5 100644 --- a/pandora_console/include/graphs/fgraph.php +++ b/pandora_console/include/graphs/fgraph.php @@ -691,6 +691,17 @@ function get_build_setup_charts($type, $options, $data) } $chart->options()->setMaintainAspectRatio($maintainAspectRatio); + if (isset($options['elements']) === true) { + if (isset($options['elements']['center']) === true) { + if (isset($options['elements']['center']['text']) === true) { + $chart->options()->getElements()->center()->setText($options['elements']['center']['text']); + } + + if (isset($options['elements']['center']['color']) === true) { + $chart->options()->getElements()->center()->setColor($options['elements']['center']['color']); + } + } + } // Set Responsive for responsive charts. $responsive = true; diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Elements.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements.php index 116fc46758..b63513bc23 100644 --- a/pandora_console/vendor/artica/phpchartjs/src/Options/Elements.php +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements.php @@ -8,6 +8,7 @@ use Artica\PHPChartJS\Options\Elements\Arc; use Artica\PHPChartJS\Options\Elements\Line; use Artica\PHPChartJS\Options\Elements\Point; use Artica\PHPChartJS\Options\Elements\Rectangle; +use Artica\PHPChartJS\Options\Elements\Center; use JsonSerializable; /** @@ -39,6 +40,11 @@ class Elements implements ArraySerializableInterface, JsonSerializable */ private $arc; + /** + * @var Center + */ + private $center; + /** * @return Rectangle */ @@ -119,6 +125,26 @@ class Elements implements ArraySerializableInterface, JsonSerializable return $this->arc; } + /** + * @return Center + */ + public function center() + { + if (is_null($this->center)) { + $this->center = new Center(); + } + + return $this->center; + } + + /** + * @return Center + */ + public function getCenter() + { + return $this->center; + } + /** * @return array */ diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Center.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Center.php new file mode 100644 index 0000000000..d8b35b4e89 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Center.php @@ -0,0 +1,85 @@ +text; + } + + /** + * Set text center graph. + * + * @param string $text Text center graph. + * + * @return self + */ + public function setText(string $text) + { + $this->text = $text; + + return $this; + } + + /** + * Get color text. + * + * @return string + */ + public function getColor() + { + return $this->color; + } + + /** + * Set color text. + * + * @param string $color Color text. + * + * @return self + */ + public function setColor(string $color) + { + $this->color = $color; + + return $this; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} From c92899573f9a0998ef0de4a70ae712c1699412a6 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Fri, 28 Jul 2023 12:12:29 +0200 Subject: [PATCH 03/41] #11326 new field in treport_content for reports --- pandora_console/pandoradb.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index 87f6283152..dcb3e41220 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -1641,6 +1641,7 @@ CREATE TABLE IF NOT EXISTS `treport_content` ( `macros_definition` TEXT, `render_definition` TEXT, `use_prefix_notation` TINYINT UNSIGNED NOT NULL DEFAULT 1, + `cat_security_hardening` INT NOT NULL DEFAULT 0, PRIMARY KEY(`id_rc`), FOREIGN KEY (`id_report`) REFERENCES treport(`id_report`) ON UPDATE CASCADE ON DELETE CASCADE From bc66f71e14e42f1204452d6faf28e0bc8807c13b Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 7 Aug 2023 12:42:05 +0200 Subject: [PATCH 04/41] #11807 added report vul_by_cat --- pandora_console/extras/mr/66.sql | 2 ++ .../reporting_builder.item_editor.php | 24 +++++++++++++++++++ pandora_console/pandoradb.sql | 1 + 3 files changed, 27 insertions(+) diff --git a/pandora_console/extras/mr/66.sql b/pandora_console/extras/mr/66.sql index c563508f1a..291f25e2a3 100644 --- a/pandora_console/extras/mr/66.sql +++ b/pandora_console/extras/mr/66.sql @@ -2,4 +2,6 @@ START TRANSACTION; ALTER TABLE `treport_content` ADD COLUMN `cat_security_hardening` INT NOT NULL DEFAULT 0; +ALTER TABLE `treport_content` ADD COLUMN `ignore_skipped` INT NOT NULL DEFAULT 0; + COMMIT; \ No newline at end of file diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index cc3fee9a2c..ea1db7aac8 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -1029,12 +1029,15 @@ switch ($action) { case 'top_n_agents_sh': $group = $item['id_group']; + $recursion = $item['recursion']; $top_n_value = (empty($item['top_n_value']) === true) ? 10 : $item['top_n_value']; break; case 'vul_by_cat': $group = $item['id_group']; + $recursion = $item['recursion']; $cat_selected = $item['cat_security_hardening']; + $ignore_skipped = ($item['ignore_skipped'] !== null) ? $item['ignore_skipped'] : true; break; default: @@ -3703,6 +3706,24 @@ $class = 'databox filters'; ?> + + + + + + + + + + + @@ -6592,6 +6614,7 @@ function chooseType() { $("#row_type_show").hide(); $("#row_use_prefix_notation").hide(); $("#row_cat_security_hardening").hide(); + $("#row_ignore_skipped").hide(); // SLA list default state. $("#sla_list").hide(); @@ -7455,6 +7478,7 @@ function chooseType() { case 'vul_by_cat': $("#row_group").show(); $("#row_cat_security_hardening").show(); + $("#row_ignore_skipped").show(); break; } diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index d9d5a9f1cd..8b5ed12e91 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -1657,6 +1657,7 @@ CREATE TABLE IF NOT EXISTS `treport_content` ( `render_definition` TEXT, `use_prefix_notation` TINYINT UNSIGNED NOT NULL DEFAULT 1, `cat_security_hardening` INT NOT NULL DEFAULT 0, + `ignore_skipped` INT NOT NULL DEFAULT 0, PRIMARY KEY(`id_rc`), FOREIGN KEY (`id_report`) REFERENCES treport(`id_report`) ON UPDATE CASCADE ON DELETE CASCADE From 3429e0d190bbdb38123b55bb2fe6d6ec65b65de7 Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Mon, 7 Aug 2023 14:43:50 +0200 Subject: [PATCH 05/41] #10065 Added the option to create-edit a private event filter. --- pandora_console/extras/mr/66.sql | 5 ++++ .../godmode/events/event_edit_filter.php | 30 +++++++++++++++++-- .../godmode/events/event_filter.php | 12 ++++++++ pandora_console/include/ajax/events.php | 25 ++++++++++++++-- pandora_console/include/functions_events.php | 17 +++++++++-- pandora_console/operation/events/events.php | 24 +++++++++++++++ 6 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 pandora_console/extras/mr/66.sql diff --git a/pandora_console/extras/mr/66.sql b/pandora_console/extras/mr/66.sql new file mode 100644 index 0000000000..cffa3707c1 --- /dev/null +++ b/pandora_console/extras/mr/66.sql @@ -0,0 +1,5 @@ +START TRANSACTION; + +ALTER TABLE tevent_filter ADD private_filter_user text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL; + +COMMIT; diff --git a/pandora_console/godmode/events/event_edit_filter.php b/pandora_console/godmode/events/event_edit_filter.php index e230055f1e..aaf5d00b9b 100644 --- a/pandora_console/godmode/events/event_edit_filter.php +++ b/pandora_console/godmode/events/event_edit_filter.php @@ -61,6 +61,9 @@ if ($id) { $filter = events_get_event_filter($id); $id_group_filter = $filter['id_group_filter']; $id_group = $filter['id_group']; + // Get owner user private filter. + $private_filter = ($filter['private_filter_user'] === null || $filter['private_filter_user'] === '') ? 0 : 1; + $private_filter_user = $filter['private_filter_user']; $id_name = $filter['id_name']; $event_type = $filter['event_type']; $severity = explode(',', $filter['severity']); @@ -113,6 +116,7 @@ if ($id) { $server_id = ($filter['server_id'] ?? ''); } else { $id_group = ''; + $private_filter = 0; $id_group_filter = ''; $id_name = ''; $event_type = ''; @@ -167,8 +171,8 @@ if ($update || $create) { $id_user_ack = get_parameter('id_user_ack', ''); $owner_user = get_parameter('owner_user', ''); $group_rep = get_parameter('group_rep', ''); - $date_from = get_parameter('date_from', ''); - $date_to = get_parameter('date_to', ''); + $date_from = get_parameter('date_from', '0000-00-00'); + $date_to = get_parameter('date_to', '0000-00-00'); $source = get_parameter('source'); $id_extra = get_parameter('id_extra'); $user_comment = get_parameter('user_comment'); @@ -192,6 +196,16 @@ if ($update || $create) { $server_id = implode(',', $servers_array); } + // Get private filter from user. + $private_filter = get_parameter_switch('private_filter_event', 0); + if ((int) $private_filter === 1 && $create) { + $private_filter_user = $_SESSION['id_usuario']; + } else if ((int) $private_filter === 1 && $update) { + $private_filter_user = ($private_filter_user === $_SESSION['id_usuario']) ? $private_filter_user : $_SESSION['id_usuario']; + } else if ((int) $private_filter === 0) { + $private_filter_user = null; + } + $values = [ 'id_name' => $id_name, 'id_group_filter' => $id_group_filter, @@ -222,6 +236,7 @@ if ($update || $create) { 'custom_data' => $custom_data, 'custom_data_filter_type' => $custom_data_filter_type, 'server_id' => $server_id, + 'private_filter_user' => $private_filter_user, ]; $severity = explode(',', $severity); @@ -293,6 +308,17 @@ $table->data[0][0] = html_print_label_input_block( false, '', 'w100p' + ).html_print_label_input_block( + __('Private event'), + html_print_checkbox_switch( + 'private_filter_event', + $private_filter, + $private_filter, + true, + false, + 'checked_slide_events(this);', + true + ) ) ); diff --git a/pandora_console/godmode/events/event_filter.php b/pandora_console/godmode/events/event_filter.php index 533bfe1190..0be93fa4a4 100644 --- a/pandora_console/godmode/events/event_filter.php +++ b/pandora_console/godmode/events/event_filter.php @@ -133,6 +133,18 @@ $filters = db_get_all_rows_sql($sql); if ($filters === false) { $filters = []; +} else { + foreach ($filters as $key => $filter) { + $permission = check_acl($config['id_user'], 0, 'PM'); + // Validate permission and private filter user. + if ($permission || $filter['private_filter_user'] === $config['id_user']) { + if ($filter['private_filter_user'] !== null) { + $filters[$key]['id_name'] = $filter['id_name'].' (P)'; + } + } else if ($filter['private_filter_user'] !== null) { + unset($filters[$key]); + } + } } $table = new stdClass(); diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index 571955fd25..b3a6be0670 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -337,6 +337,14 @@ if ($save_event_filter) { $values['custom_data'] = get_parameter('custom_data'); $values['custom_data_filter_type'] = get_parameter('custom_data_filter_type'); + // Get private filter from user. + $private_filter = get_parameter_switch('private_filter_user', 0); + if ((int) $private_filter === 1) { + $values['private_filter_user'] = $config['id_user']; + } else { + $values['private_filter_user'] = null; + } + if (is_metaconsole() === true) { $values['server_id'] = implode(',', get_parameter('server_id')); } @@ -397,6 +405,17 @@ if ($update_event_filter) { $values['custom_data'] = get_parameter('custom_data'); $values['custom_data_filter_type'] = get_parameter('custom_data_filter_type'); + // Get private filter from user. + $private_filter = get_parameter('private_filter_user', 0); + $user_private_filter = events_get_event_filter($id); + if ((int) $private_filter === 1 && $user_private_filter['private_filter_user'] === null) { + $values['private_filter_user'] = $config['id_user']; + } else if ($private_filter === $user_private_filter['private_filter_user'] && $user_private_filter['private_filter_user'] !== $config['id_user']) { + $values['private_filter_user'] = $user_private_filter['private_filter_user']; + } else { + $values['private_filter_user'] = null; + } + if (is_metaconsole() === true) { $values['server_id'] = implode(',', get_parameter('server_id')); } @@ -936,7 +955,8 @@ function save_new_filter() { "id_source_event": $("#text-id_source_event").val(), "server_id": $("#server_id").val(), "custom_data": $("#text-custom_data").val(), - "custom_data_filter_type": $("#custom_data_filter_type").val() + "custom_data_filter_type": $("#custom_data_filter_type").val(), + "private_filter_user": $("#checkbox-private_filter_event").val() }, function (data) { $("#info_box").hide(); @@ -1015,7 +1035,8 @@ function save_update_filter() { "id_source_event": $("#text-id_source_event").val(), "server_id": $("#server_id").val(), "custom_data": $("#text-custom_data").val(), - "custom_data_filter_type": $("#custom_data_filter_type").val() + "custom_data_filter_type": $("#custom_data_filter_type").val(), + "private_filter_user": $("#checkbox-private_filter_event").val() }, function (data) { diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index 49007aaca1..516f01d876 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -3343,7 +3343,7 @@ function events_get_event_filter_select($manage=true) } $sql = ' - SELECT id_filter, id_name + SELECT id_filter, id_name, private_filter_user FROM tevent_filter WHERE id_group_filter IN (0, '.implode(',', array_keys($user_groups)).')'; @@ -3354,7 +3354,20 @@ function events_get_event_filter_select($manage=true) } else { $result = []; foreach ($event_filters as $event_filter) { - $result[$event_filter['id_filter']] = $event_filter['id_name']; + $permission = check_acl($config['id_user'], 0, 'PM'); + if ($permission || $event_filter['private_filter_user'] === $config['id_user']) { + if ($event_filter['private_filter_user'] !== null) { + $filter_name = $event_filter['id_name'].' (P)'; + } else { + $filter_name = $event_filter['id_name']; + } + + $result[$event_filter['id_filter']] = $filter_name; + } + + if ($event_filter['private_filter_user'] === null) { + $result[$event_filter['id_filter']] = $event_filter['id_name']; + } } } diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 0152fea782..fd5ab1a46c 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -196,6 +196,10 @@ $search_recursive_groups = get_parameter( 'filter[search_recursive_groups]', ($filter['search_recursive_groups'] ?? '') ); +$search_recursive_groups = get_parameter( + 'filter[private_filter_event]', + ($filter['private_filter_event'] ?? '') +); $id_group_filter = get_parameter( 'filter[id_group_filter]', ($filter['id_group'] ?? '') @@ -1322,6 +1326,7 @@ if ($loaded_filter !== false && $from_event_graph != 1 && isset($fb64) === false $filter_only_alert = $filter['filter_only_alert']; $search_secondary_groups = ($filter['search_secondary_groups'] ?? 0); + $private_filter_event = ($filter['private_filter_user'] ?? 0); $search_recursive_groups = ($filter['search_recursive_groups'] ?? 0); $id_group_filter = $filter['id_group_filter']; $date_from = $filter['date_from']; @@ -1938,6 +1943,25 @@ $in_sec_group .= ''; $in_sec_group .= ''; $in .= $in_sec_group; +// User private filter. +$data = html_print_checkbox_switch( + 'private_filter_event', + $private_filter_event, + $private_filter_event, + true, + false, + 'checked_slide_events(this);', + true +); + +$in_third_group = '
'; +$in_third_group .= $data; +$in_third_group .= ''; +$in_third_group .= '
'; +$in .= $in_third_group; + $in .= ''; $inputs[] = $in; From 74f2fa7a74549521cdb9faed1d3ac0f149648f51 Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Wed, 9 Aug 2023 15:35:03 +0200 Subject: [PATCH 06/41] #10065 added private_filter_user field for new installations. --- pandora_console/pandoradb.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index cb5598f957..cf9265cfc8 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -1296,6 +1296,7 @@ CREATE TABLE IF NOT EXISTS `tevent_filter` ( `custom_data` VARCHAR(500) DEFAULT '', `custom_data_filter_type` TINYINT UNSIGNED DEFAULT 0, `owner_user` TEXT, + `private_filter_user` TEXT, PRIMARY KEY (`id_filter`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; From 85de06fbecbcb8de34fbb510da6c94bcd59cd415 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Thu, 10 Aug 2023 11:36:50 +0200 Subject: [PATCH 07/41] #11807 new report vulnerability by category --- .../reporting_builder.item_editor.php | 14 +++--- .../godmode/reporting/reporting_builder.php | 2 + .../phpchartjs/src/Renderer/JavaScript.php | 43 +++++++++++++++++++ 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index ea1db7aac8..6ecaf98f0d 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -200,12 +200,10 @@ $text_agent_module = ''; $only_data = false; -$categories_security_hardening = []; -if (security_hardening_installed() === true) { - $categories_security_hardening = categories_of_cis(); - foreach ($categories_security_hardening as $key => $cat) { - $categories_security_hardening[$key] = implode(' ', $cat); - } + +$categories_security_hardening = categories_of_cis(); +foreach ($categories_security_hardening as $key => $cat) { + $categories_security_hardening[$key] = implode(' ', $cat); } // Users. @@ -1037,7 +1035,7 @@ switch ($action) { $group = $item['id_group']; $recursion = $item['recursion']; $cat_selected = $item['cat_security_hardening']; - $ignore_skipped = ($item['ignore_skipped'] !== null) ? $item['ignore_skipped'] : true; + $ignore_skipped = $item['ignore_skipped']; break; default: @@ -3718,7 +3716,7 @@ $class = 'databox filters'; html_print_checkbox_switch( 'ignore_skipped', 1, - $ignore_skipped, + ($ignore_skipped !== null) ? $ignore_skipped : true, ); ?> diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 5cc94049f7..1517de9fc1 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -1996,6 +1996,7 @@ switch ($action) { case 'vul_by_cat': $values['id_group'] = get_parameter('combo_group'); $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); + $values['ignore_skipped'] = get_parameter('ignore_skipped'); $good_format = true; break; @@ -2884,6 +2885,7 @@ switch ($action) { case 'vul_by_cat': $values['id_group'] = get_parameter('combo_group'); $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); + $values['ignore_skipped'] = get_parameter('ignore_skipped'); $good_format = true; break; diff --git a/pandora_console/vendor/artica/phpchartjs/src/Renderer/JavaScript.php b/pandora_console/vendor/artica/phpchartjs/src/Renderer/JavaScript.php index 100276743f..b1fcb1bb9f 100644 --- a/pandora_console/vendor/artica/phpchartjs/src/Renderer/JavaScript.php +++ b/pandora_console/vendor/artica/phpchartjs/src/Renderer/JavaScript.php @@ -32,6 +32,49 @@ class JavaScript extends Renderer if (empty($this->chart->defaults()->getWatermark()) === false) { $script[] = 'const chart_watermark_'.$this->chart->getId().' = { id: "chart_watermark_'.$this->chart->getId().'", + beforeDraw: (chart) => { + if (Object.prototype.hasOwnProperty.call(chart, "config") && + Object.prototype.hasOwnProperty.call(chart.config.options, "elements") && + Object.prototype.hasOwnProperty.call(chart.config.options.elements, "center")) + { + var ctx = chart.ctx; + + ctx.save(); + + var centerConfig = chart.config.options.elements.center; + var txt = centerConfig.text; + var color = centerConfig.color || "#000"; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + var centerX = (chart.chartArea.left + chart.chartArea.right) / 2; + var centerY = (chart.chartArea.top + chart.chartArea.bottom) / 2; + + var outerRadius = Math.min(ctx.canvas.width, ctx.canvas.height) / 2; + + var padding = 20; + + var innerRadius = outerRadius - padding; + + ctx.font = "30px "; + var sidePaddingCalculated = (92/100) * (innerRadius * 2) + + var stringWidth = ctx.measureText(txt).width; + var elementWidth = (innerRadius * 2) - sidePaddingCalculated; + + var widthRatio = elementWidth / stringWidth; + var newFontSize = Math.floor(30 * widthRatio); + var elementHeight = (innerRadius * 2); + + var fontSizeToUse = Math.min(newFontSize, elementHeight); + + ctx.font = fontSizeToUse + "px Lato, sans-serif"; + ctx.fillStyle = color; + + ctx.fillText(txt, centerX, centerY); + + ctx.restore(); + } + }, afterDraw: (chart) => { const image = new Image(); image.src = "'.$this->chart->defaults()->getWatermark()->getSrc().'"; From abb173c1a7af425fe6830e3dcb8ed55d5a471405 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Fri, 18 Aug 2023 10:27:55 +0200 Subject: [PATCH 08/41] #11807 new report top checks more frequent --- .../reporting_builder.item_editor.php | 11 +++++ .../godmode/reporting/reporting_builder.php | 12 +++++ .../include/functions_reporting.php | 7 +++ .../include/functions_reporting_html.php | 49 ++++++++++++++++++- pandora_console/include/functions_reports.php | 5 ++ 5 files changed, 83 insertions(+), 1 deletion(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index 6ecaf98f0d..efd9da896c 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -1031,6 +1031,12 @@ switch ($action) { $top_n_value = (empty($item['top_n_value']) === true) ? 10 : $item['top_n_value']; break; + case 'top_n_checks_failed': + $group = $item['id_group']; + $recursion = $item['recursion']; + $top_n_value = (empty($item['top_n_value']) === true) ? 10 : $item['top_n_value']; + break; + case 'vul_by_cat': $group = $item['id_group']; $recursion = $item['recursion']; @@ -7473,6 +7479,11 @@ function chooseType() { $("#row_max_items").show(); break; + case 'top_n_checks_failed': + $("#row_group").show(); + $("#row_max_items").show(); + break; + case 'vul_by_cat': $("#row_group").show(); $("#row_cat_security_hardening").show(); diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 1517de9fc1..7ac62c9c45 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -1993,6 +1993,12 @@ switch ($action) { $good_format = true; break; + case 'top_n_checks_failed': + $values['id_group'] = get_parameter('combo_group'); + $values['top_n_value'] = get_parameter('max_items'); + $good_format = true; + break; + case 'vul_by_cat': $values['id_group'] = get_parameter('combo_group'); $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); @@ -2882,6 +2888,12 @@ switch ($action) { $good_format = true; break; + case 'top_n_checks_failed': + $values['id_group'] = get_parameter('combo_group'); + $values['top_n_value'] = get_parameter('max_items'); + $good_format = true; + break; + case 'vul_by_cat': $values['id_group'] = get_parameter('combo_group'); $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index 6561fe9389..b61b005e2d 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -942,6 +942,13 @@ function reporting_make_reporting_data( ); break; + case 'top_n_checks_failed': + $report['contents'][] = reporting_top_n_checks_failed( + $report, + $content + ); + break; + case 'vul_by_cat': $report['contents'][] = reporting_vul_by_categories( $report, diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index bf144cd518..d532061d80 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -468,6 +468,10 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) reporting_html_top_n_agents_sh($table, $item); break; + case 'top_n_checks_failed': + reporting_html_top_n_checks_failed($table, $item); + break; + case 'vul_by_cat': reporting_vul_by_cat_graph($table, $item); break; @@ -486,18 +490,61 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) } +/** + * Function to print HTML top checks failed. + * + * @param object $table Head table or false if it comes from pdf. + * @param array $item Items data. + * + * @return void + */ +function reporting_html_top_n_checks_failed($table, $item) +{ + global $config; + $table->rowclass[0] = ''; + $table->data[1][0] = ''.__('Id').''; + $table->data[1][1] = ''.__('Title').''; + $table->data[1][2] = ''.__('Total Failed').''; + + $row = 2; + foreach ($item['data'] as $key => $check) { + $table->data[$row][0] = $check['id']; + $table->data[$row][1] = $check['title']; + $table->data[$row][2] = $check['total']; + $row++; + } +} + + +/** + * Function to print HTML top categories in graph. + * + * @param object $table Head table or false if it comes from pdf. + * @param array $item Items data. + * + * @return void + */ function reporting_vul_by_cat_graph($table, $item) { + $table->rowclass[0] = ''; $table->colspan['chart']['cell'] = 3; $table->cellstyle['chart']['cell'] = 'text-align: center;'; $table->data['chart']['cell'] = $item['chart']; } +/** + * Function to print HTML top n agents from security hardening. + * + * @param object $table Head table or false if it comes from pdf. + * @param array $item Items data. + * + * @return void + */ function reporting_html_top_n_agents_sh($table, $item) { global $config; - + $table->rowclass[0] = ''; $table->data[1][0] = ''.__('Agent').''; $table->data[1][1] = ''.__('Last audit scan').''; $table->data[1][2] = ''.__('Score').''; diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php index fca253153e..f4f1f6499e 100755 --- a/pandora_console/include/functions_reports.php +++ b/pandora_console/include/functions_reports.php @@ -969,6 +969,11 @@ function reports_get_report_types($template=false, $not_editor=false) 'name' => __('Top-N agents with the worst score'), ]; + $types['top_n_checks_failed'] = [ + 'optgroup' => __('Security hardening'), + 'name' => __('Top-N most frequent failed checks'), + ]; + $types['vul_by_cat'] = [ 'optgroup' => __('Security hardening'), 'name' => __('Vulnerabilities by category'), From 76b3e1da4a02e93b77932e0ebda1e102ff65ab7f Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Mon, 21 Aug 2023 13:29:58 +0200 Subject: [PATCH 09/41] #10065 Fixed query that adds private_filter_user field in the database --- pandora_console/extras/mr/66.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/extras/mr/66.sql b/pandora_console/extras/mr/66.sql index 0251ea70cc..d3fe3a7c70 100644 --- a/pandora_console/extras/mr/66.sql +++ b/pandora_console/extras/mr/66.sql @@ -1,6 +1,6 @@ START TRANSACTION; -ALTER TABLE tevent_filter ADD private_filter_user text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL; +ALTER TABLE tevent_filter ADD private_filter_user text NULL; UPDATE `twelcome_tip` SET title = 'Scheduled downtimes', From dd453507d23b7a8056b506338525269ace2fd1dd Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 22 Aug 2023 09:53:35 +0200 Subject: [PATCH 10/41] #11807 new report top n failed by checks --- .../reporting_builder.item_editor.php | 11 +++++++ .../godmode/reporting/reporting_builder.php | 12 ++++++++ .../include/functions_reporting.php | 7 +++++ .../include/functions_reporting_html.php | 30 +++++++++++++++++++ pandora_console/include/functions_reports.php | 5 ++++ 5 files changed, 65 insertions(+) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index efd9da896c..1aeaa8a1a6 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -1037,6 +1037,12 @@ switch ($action) { $top_n_value = (empty($item['top_n_value']) === true) ? 10 : $item['top_n_value']; break; + case 'top_n_categories_checks': + $group = $item['id_group']; + $recursion = $item['recursion']; + $top_n_value = (empty($item['top_n_value']) === true) ? 10 : $item['top_n_value']; + break; + case 'vul_by_cat': $group = $item['id_group']; $recursion = $item['recursion']; @@ -7484,6 +7490,11 @@ function chooseType() { $("#row_max_items").show(); break; + case 'top_n_categories_checks': + $("#row_group").show(); + $("#row_max_items").show(); + break; + case 'vul_by_cat': $("#row_group").show(); $("#row_cat_security_hardening").show(); diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 8b5cea5236..48805131d7 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -2002,6 +2002,12 @@ switch ($action) { $good_format = true; break; + case 'top_n_categories_checks': + $values['id_group'] = get_parameter('combo_group'); + $values['top_n_value'] = get_parameter('max_items'); + $good_format = true; + break; + case 'vul_by_cat': $values['id_group'] = get_parameter('combo_group'); $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); @@ -2897,6 +2903,12 @@ switch ($action) { $good_format = true; break; + case 'top_n_categories_checks': + $values['id_group'] = get_parameter('combo_group'); + $values['top_n_value'] = get_parameter('max_items'); + $good_format = true; + break; + case 'vul_by_cat': $values['id_group'] = get_parameter('combo_group'); $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index b61b005e2d..67c12f73a7 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -949,6 +949,13 @@ function reporting_make_reporting_data( ); break; + case 'top_n_categories_checks': + $report['contents'][] = reporting_top_n_categories_checks( + $report, + $content + ); + break; + case 'vul_by_cat': $report['contents'][] = reporting_vul_by_categories( $report, diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index d532061d80..887c3d5fcb 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -472,6 +472,10 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) reporting_html_top_n_checks_failed($table, $item); break; + case 'top_n_categories_checks': + reporting_html_top_n_categories_checks($table, $item); + break; + case 'vul_by_cat': reporting_vul_by_cat_graph($table, $item); break; @@ -490,6 +494,32 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) } +/** + * Function to print HTML top checks failed by category + * + * @param object $table Head table or false if it comes from pdf. + * @param array $item Items data. + * + * @return void + */ +function reporting_html_top_n_categories_checks($table, $item) +{ + global $config; + $table->rowclass[0] = ''; + $table->data[1][0] = ''.__('Id').''; + $table->data[1][1] = ''.__('Category').''; + $table->data[1][2] = ''.__('Total Failed').''; + + $row = 2; + foreach ($item['data'] as $key => $check) { + $table->data[$row][0] = $check['id']; + $table->data[$row][1] = $check['category']; + $table->data[$row][2] = $check['total']; + $row++; + } +} + + /** * Function to print HTML top checks failed. * diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php index f4f1f6499e..9e26be5998 100755 --- a/pandora_console/include/functions_reports.php +++ b/pandora_console/include/functions_reports.php @@ -974,6 +974,11 @@ function reports_get_report_types($template=false, $not_editor=false) 'name' => __('Top-N most frequent failed checks'), ]; + $types['top_n_categories_checks'] = [ + 'optgroup' => __('Security hardening'), + 'name' => __('Top-N checks failed by category'), + ]; + $types['vul_by_cat'] = [ 'optgroup' => __('Security hardening'), 'name' => __('Vulnerabilities by category'), From 61839db7ffe79243e1e22c9f1ca6aef9893e8a47 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 22 Aug 2023 16:28:01 +0200 Subject: [PATCH 11/41] #11807 new report list of checks agent --- pandora_console/extras/mr/66.sql | 2 + .../reporting_builder.item_editor.php | 38 +++++++++++++++++++ .../godmode/reporting/reporting_builder.php | 14 +++++++ .../include/functions_reporting.php | 7 ++++ .../include/functions_reporting_html.php | 33 +++++++++++++++- pandora_console/include/functions_reports.php | 5 +++ pandora_console/pandoradb.sql | 1 + 7 files changed, 99 insertions(+), 1 deletion(-) diff --git a/pandora_console/extras/mr/66.sql b/pandora_console/extras/mr/66.sql index 466909a617..4f92b5e659 100644 --- a/pandora_console/extras/mr/66.sql +++ b/pandora_console/extras/mr/66.sql @@ -4,6 +4,8 @@ ALTER TABLE `treport_content` ADD COLUMN `cat_security_hardening` INT NOT NULL ALTER TABLE `treport_content` ADD COLUMN `ignore_skipped` INT NOT NULL DEFAULT 0; +ALTER TABLE `treport_content` ADD COLUMN `status_of_check` TINYTEXT; + UPDATE `twelcome_tip` SET title = 'Scheduled downtimes', url = 'https://pandorafms.com/manual/en/documentation/04_using/11_managing_and_administration#scheduled_downtimes' diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index 1aeaa8a1a6..841874e3eb 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -1050,6 +1050,14 @@ switch ($action) { $ignore_skipped = $item['ignore_skipped']; break; + case 'list_checks': + $group = $item['id_group']; + $recursion = $item['recursion']; + $cat_selected = $item['cat_security_hardening']; + $status_of_check = $item['status_of_check']; + $idAgent = $item['id_agent']; + break; + default: // It's not possible. break; @@ -3751,6 +3759,28 @@ $class = 'databox filters'; + + + + + + __('All'), + 'PASS' => __('Passed'), + 'FAIL' => __('Failed'), + 'INVALID' => __('Skipped'), + ], + 'status_of_check', + $status_of_check, + ); + ?> + + + @@ -6625,6 +6655,7 @@ function chooseType() { $("#row_use_prefix_notation").hide(); $("#row_cat_security_hardening").hide(); $("#row_ignore_skipped").hide(); + $("#row_status_check").hide(); // SLA list default state. $("#sla_list").hide(); @@ -7500,6 +7531,13 @@ function chooseType() { $("#row_cat_security_hardening").show(); $("#row_ignore_skipped").show(); break; + + case 'list_checks': + $("#row_group").show(); + $("#row_agent").show(); + $("#row_cat_security_hardening").show(); + $("#row_status_check").show(); + break; } switch (type) { diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 48805131d7..1102aabdfc 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -2015,6 +2015,13 @@ switch ($action) { $good_format = true; break; + case 'list_checks': + $values['id_group'] = get_parameter('combo_group'); + $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); + $values['status_of_check'] = get_parameter('status_of_check'); + $good_format = true; + break; + default: $values['period'] = get_parameter('period'); $values['top_n'] = get_parameter( @@ -2916,6 +2923,13 @@ switch ($action) { $good_format = true; break; + case 'list_checks': + $values['id_group'] = get_parameter('combo_group'); + $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); + $values['status_of_check'] = get_parameter('status_of_check'); + $good_format = true; + break; + default: $values['period'] = get_parameter('period'); $values['top_n'] = get_parameter( diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index 67c12f73a7..1603183b65 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -963,6 +963,13 @@ function reporting_make_reporting_data( ); break; + case 'list_checks': + $report['contents'][] = reporting_list_checks( + $report, + $content + ); + break; + default: // Default. break; diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index 887c3d5fcb..c9c4da53fb 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -479,6 +479,10 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) case 'vul_by_cat': reporting_vul_by_cat_graph($table, $item); break; + + case 'list_checks': + reporting_html_list_checks($table, $item); + break; } if ($item['type'] == 'agent_module') { @@ -494,6 +498,34 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) } +/** + * Function to print HTML checks filtered by agent and category. + * + * @param object $table Head table or false if it comes from pdf. + * @param array $item Items data. + * + * @return void + */ +function reporting_html_list_checks($table, $item) +{ + $table->rowclass[0] = ''; + $table->colspan[0][1] = 3; + $table->data[1][0] = ''.__('Id').''; + $table->data[1][1] = ''.__('Title').''; + $table->data[1][2] = ''.__('Category').''; + $table->data[1][3] = ''.__('Status').''; + + $row = 2; + foreach ($item['data'] as $key => $check) { + $table->data[$row][0] = $check['id']; + $table->data[$row][1] = $check['title']; + $table->data[$row][2] = $check['category']; + $table->data[$row][3] = $check['status']; + $row++; + } +} + + /** * Function to print HTML top checks failed by category * @@ -504,7 +536,6 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) */ function reporting_html_top_n_categories_checks($table, $item) { - global $config; $table->rowclass[0] = ''; $table->data[1][0] = ''.__('Id').''; $table->data[1][1] = ''.__('Category').''; diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php index 9e26be5998..f574beb3bf 100755 --- a/pandora_console/include/functions_reports.php +++ b/pandora_console/include/functions_reports.php @@ -983,6 +983,11 @@ function reports_get_report_types($template=false, $not_editor=false) 'optgroup' => __('Security hardening'), 'name' => __('Vulnerabilities by category'), ]; + + $types['list_checks'] = [ + 'optgroup' => __('Security hardening'), + 'name' => __('List of checks'), + ]; } return $types; diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index 5164d2ed21..d1fb4e4f1f 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -1674,6 +1674,7 @@ CREATE TABLE IF NOT EXISTS `treport_content` ( `use_prefix_notation` TINYINT UNSIGNED NOT NULL DEFAULT 1, `cat_security_hardening` INT NOT NULL DEFAULT 0, `ignore_skipped` INT NOT NULL DEFAULT 0, + `status_of_check` TINYTEXT, PRIMARY KEY(`id_rc`), FOREIGN KEY (`id_report`) REFERENCES treport(`id_report`) ON UPDATE CASCADE ON DELETE CASCADE From ae288e3dd4e1a6420c6b11c9dd391981419dc797 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Thu, 24 Aug 2023 09:24:31 +0200 Subject: [PATCH 12/41] #11807 added new report scoring --- .../reporting_builder.item_editor.php | 9 +++++ .../godmode/reporting/reporting_builder.php | 10 +++++ .../include/functions_reporting.php | 7 ++++ .../include/functions_reporting_html.php | 39 ++++++++++++++++++- pandora_console/include/functions_reports.php | 5 +++ 5 files changed, 69 insertions(+), 1 deletion(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index 841874e3eb..99fedcb308 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -1058,6 +1058,11 @@ switch ($action) { $idAgent = $item['id_agent']; break; + case 'scoring': + $group = $item['id_group']; + $recursion = $item['recursion']; + break; + default: // It's not possible. break; @@ -7538,6 +7543,10 @@ function chooseType() { $("#row_cat_security_hardening").show(); $("#row_status_check").show(); break; + + case 'scoring': + $("#row_group").show(); + break; } switch (type) { diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 1102aabdfc..8901b68ecd 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -2022,6 +2022,11 @@ switch ($action) { $good_format = true; break; + case 'scoring': + $values['id_group'] = get_parameter('combo_group'); + $good_format = true; + break; + default: $values['period'] = get_parameter('period'); $values['top_n'] = get_parameter( @@ -2930,6 +2935,11 @@ switch ($action) { $good_format = true; break; + case 'scoring': + $values['id_group'] = get_parameter('combo_group'); + $good_format = true; + break; + default: $values['period'] = get_parameter('period'); $values['top_n'] = get_parameter( diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index 1603183b65..782d756e4c 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -970,6 +970,13 @@ function reporting_make_reporting_data( ); break; + case 'scoring': + $report['contents'][] = reporting_scoring( + $report, + $content + ); + break; + default: // Default. break; diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index c9c4da53fb..d976b96951 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -483,6 +483,10 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) case 'list_checks': reporting_html_list_checks($table, $item); break; + + case 'scoring': + reporting_html_scoring($table, $item); + break; } if ($item['type'] == 'agent_module') { @@ -498,6 +502,38 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) } +/** + * Function to print the agents scoring. + * + * @param object $table Head table or false if it comes from pdf. + * @param array $item Items data. + * + * @return void + */ +function reporting_html_scoring($table, $item) +{ + global $config; + + $table1 = new stdClass(); + $table1->width = '100%'; + $table1->class = 'databox filters'; + $table1->styleTable = 'border: 0px;'; + $table1->data[0][0] = ''.__('Date').''; + $table1->data[0][1] = ''.__('Agent').''; + $table1->data[0][2] = ''.__('Score').''; + $row = 1; + foreach ($item['data'] as $key => $check) { + $table1->data[$row][1] = date($config['date_format'], $check['date']); + $table1->data[$row][2] = $check['agent']; + $table1->data[$row][3] = $check['scoring'].' %'; + $row++; + } + + $table->colspan[2][0] = 3; + $table->data[2][0] = html_print_table($table1, true); +} + + /** * Function to print HTML checks filtered by agent and category. * @@ -509,7 +545,8 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) function reporting_html_list_checks($table, $item) { $table->rowclass[0] = ''; - $table->colspan[0][1] = 3; + $table->colspan[0][1] = 2; + $table->align[3] = 'center'; $table->data[1][0] = ''.__('Id').''; $table->data[1][1] = ''.__('Title').''; $table->data[1][2] = ''.__('Category').''; diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php index f574beb3bf..6fa873b72a 100755 --- a/pandora_console/include/functions_reports.php +++ b/pandora_console/include/functions_reports.php @@ -988,6 +988,11 @@ function reports_get_report_types($template=false, $not_editor=false) 'optgroup' => __('Security hardening'), 'name' => __('List of checks'), ]; + + $types['scoring'] = [ + 'optgroup' => __('Security hardening'), + 'name' => __('Scoring'), + ]; } return $types; From 797b24af86a515a7f79c9dccf31ab4d83b24c96a Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Mon, 28 Aug 2023 13:54:35 +0200 Subject: [PATCH 13/41] #10065 Added switch to filter create/edit modal. --- .../godmode/events/event_edit_filter.php | 2 +- .../godmode/events/event_filter.php | 2 +- pandora_console/include/ajax/events.php | 58 +++++++++++++++---- pandora_console/operation/events/events.php | 27 +++------ 4 files changed, 57 insertions(+), 32 deletions(-) diff --git a/pandora_console/godmode/events/event_edit_filter.php b/pandora_console/godmode/events/event_edit_filter.php index aaf5d00b9b..113c156df3 100644 --- a/pandora_console/godmode/events/event_edit_filter.php +++ b/pandora_console/godmode/events/event_edit_filter.php @@ -309,7 +309,7 @@ $table->data[0][0] = html_print_label_input_block( '', 'w100p' ).html_print_label_input_block( - __('Private event'), + __('Private'), html_print_checkbox_switch( 'private_filter_event', $private_filter, diff --git a/pandora_console/godmode/events/event_filter.php b/pandora_console/godmode/events/event_filter.php index 0be93fa4a4..c4f1860e6f 100644 --- a/pandora_console/godmode/events/event_filter.php +++ b/pandora_console/godmode/events/event_filter.php @@ -135,7 +135,7 @@ if ($filters === false) { $filters = []; } else { foreach ($filters as $key => $filter) { - $permission = check_acl($config['id_user'], 0, 'PM'); + $permission = users_is_admin($config['id_user']); // Validate permission and private filter user. if ($permission || $filter['private_filter_user'] === $config['id_user']) { if ($filter['private_filter_user'] !== null) { diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index b3a6be0670..dbab927606 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -92,6 +92,9 @@ $get_id_source_event = get_parameter('get_id_source_event'); $node_id = (int) get_parameter('node_id', 0); $settings_modal = get_parameter('settings', 0); $parameters_modal = get_parameter('parameters', 0); +// User private filter. +$current_filter = get_parameter('current_filter', 0); +$private_filter_event = get_parameter('private_filter_event', 0); if ($get_comments === true) { global $config; @@ -731,8 +734,8 @@ if ($save_filter_modal) { $table = new StdClass; $table->id = 'save_filter_form'; $table->width = '100%'; - $table->cellspacing = 4; - $table->cellpadding = 4; + $table->cellspacing = 5; + $table->cellpadding = 5; $table->class = 'databox'; if (is_metaconsole() === true) { $table->class = 'databox filters'; @@ -751,7 +754,7 @@ if ($save_filter_modal) { 'filter_mode', 'new', __('New filter'), - true, + ((int) $current_filter === 0) ? true : false, true ); @@ -759,7 +762,7 @@ if ($save_filter_modal) { 'filter_mode', 'update', __('Update filter'), - false, + ((int) $current_filter > 0) ? true : false, true ); @@ -774,6 +777,7 @@ if ($save_filter_modal) { $table->rowclass[2] = 'flex'; $table->rowclass[3] = 'flex'; $table->rowclass[4] = 'flex'; + $table->rowclass[5] = 'flex'; $data[0] = ''.__('Filter name').''.$jump; $data[0] .= html_print_input_text('id_name', '', '', 15, 255, true); if (is_metaconsole()) { @@ -820,9 +824,9 @@ if ($save_filter_modal) { $data[0] .= html_print_select( $_filters_update, 'overwrite_filter', + $current_filter, '', - '', - '', + __('None'), 0, true, false, @@ -833,6 +837,31 @@ if ($save_filter_modal) { $table->data[] = $data; $table->rowclass[] = ''; + $data = []; + $table->rowid[4] = 'update_filter_row2'; + + $table->data[] = $data; + $table->rowclass[] = ''; + + // Update user private filter. + $data = []; + $table->rowid[6] = 'private_filter_event_row1'; + $data[0] = html_print_label_input_block( + __('Private'), + html_print_checkbox_switch( + 'private_filter_event', + $private_filter_event, + $private_filter_event, + true, + false, + 'checked_slide_events(this);', + true + ) + ); + + $table->data[] = $data; + $table->rowclass[] = ''; + html_print_table($table); html_print_div( @@ -877,10 +906,19 @@ if ($save_filter_modal) { ?>