From 159a34d45beedcbd67f92ba99c2ba53c00997370 Mon Sep 17 00:00:00 2001 From: Matt Mundell Date: Fri, 15 Aug 2025 14:00:02 +0200 Subject: [PATCH] Change: move asset OS iterator to asset files --- src/manage.h | 21 ---- src/manage_assets.h | 21 ++++ src/manage_sql.c | 257 +--------------------------------------- src/manage_sql.h | 7 ++ src/manage_sql_assets.c | 137 +++++++++++++++++++++ src/manage_sql_assets.h | 121 +++++++++++++++++++ 6 files changed, 287 insertions(+), 277 deletions(-) diff --git a/src/manage.h b/src/manage.h index e5bd3d86f9..ebc6fba5cb 100644 --- a/src/manage.h +++ b/src/manage.h @@ -2287,30 +2287,9 @@ asset_iterator_in_use (iterator_t *); int asset_host_count (const get_data_t *); -int -init_asset_os_iterator (iterator_t *, const get_data_t *); - int init_resource_names_os_iterator (iterator_t *, get_data_t *); -const char* -asset_os_iterator_title (iterator_t *); - -int -asset_os_iterator_installs (iterator_t *); - -const char* -asset_os_iterator_latest_severity (iterator_t *); - -const char* -asset_os_iterator_highest_severity (iterator_t *); - -const char* -asset_os_iterator_average_severity (iterator_t *); - -int -asset_os_iterator_all_installs (iterator_t *); - int asset_os_count (const get_data_t *); diff --git a/src/manage_assets.h b/src/manage_assets.h index 41782d4d11..2d10fc3e21 100644 --- a/src/manage_assets.h +++ b/src/manage_assets.h @@ -75,4 +75,25 @@ init_asset_host_iterator (iterator_t *, const get_data_t *); const char * asset_host_iterator_severity (iterator_t *); +int +init_asset_os_iterator (iterator_t *, const get_data_t *); + +const char* +asset_os_iterator_title (iterator_t *); + +int +asset_os_iterator_installs (iterator_t *); + +const char* +asset_os_iterator_latest_severity (iterator_t *); + +const char* +asset_os_iterator_highest_severity (iterator_t *); + +const char* +asset_os_iterator_average_severity (iterator_t *); + +int +asset_os_iterator_all_installs (iterator_t *); + #endif /* not _GVMD_MANAGE_ASSETS_H */ diff --git a/src/manage_sql.c b/src/manage_sql.c index c51b419098..1ea33e99e5 100644 --- a/src/manage_sql.c +++ b/src/manage_sql.c @@ -3642,7 +3642,7 @@ resource_uuid (const gchar *type, resource_t resource) * @return 0 success, 1 failed to find resource, 2 failed to find filter, -1 * error. */ -static int +int init_get_iterator2_with (iterator_t* iterator, const char *type, const get_data_t *get, column_t *select_columns, column_t *trash_select_columns, @@ -41001,191 +41001,6 @@ asset_host_count (const get_data_t *get) filter_columns, 0, NULL, NULL, NULL, TRUE); } -/** - * @brief Filter columns for os iterator. - */ -#define OS_ITERATOR_FILTER_COLUMNS \ - { GET_ITERATOR_FILTER_COLUMNS, "title", "hosts", "latest_severity", \ - "highest_severity", "average_severity", "average_severity_score", \ - "severity", "all_hosts", NULL } - -/** - * @brief OS iterator columns. - */ -#define OS_ITERATOR_COLUMNS \ - { \ - GET_ITERATOR_COLUMNS (oss), \ - { \ - "0", \ - "writable", \ - KEYWORD_TYPE_INTEGER \ - }, \ - { \ - "(SELECT count (*) > 0 FROM host_oss WHERE os = oss.id)", \ - "in_use", \ - KEYWORD_TYPE_INTEGER \ - }, \ - { \ - "(SELECT coalesce (cpe_title (oss.name), ''))", \ - "title", \ - KEYWORD_TYPE_STRING \ - }, \ - { \ - "(SELECT count(*)" \ - " FROM (SELECT inner_cpes[1] AS cpe, host" \ - " FROM (SELECT array_agg (host_details.value" \ - " ORDER BY host_details.id DESC)" \ - " AS inner_cpes," \ - " host" \ - " FROM host_details, hosts" \ - " WHERE host_details.name = 'best_os_cpe'" \ - " AND hosts.id = host_details.host" \ - " AND (" ACL_USER_MAY_OPTS ("hosts") ")" \ - " GROUP BY host)" \ - " AS host_details_subselect)" \ - " AS array_removal_subselect" \ - " WHERE cpe = oss.name)", \ - "hosts", \ - KEYWORD_TYPE_INTEGER \ - }, \ - { \ - "(SELECT round (CAST (severity AS numeric), 1) FROM host_max_severities" \ - " WHERE host = (SELECT host FROM host_oss" \ - " WHERE os = oss.id" \ - " ORDER BY creation_time DESC LIMIT 1)" \ - " ORDER BY creation_time DESC LIMIT 1)", \ - "latest_severity", \ - KEYWORD_TYPE_DOUBLE \ - }, \ - { \ - "(SELECT round (max (CAST (severity AS numeric)), 1)" \ - " FROM host_max_severities" \ - " WHERE host IN (SELECT DISTINCT host FROM host_oss" \ - " WHERE os = oss.id))", \ - "highest_severity", \ - KEYWORD_TYPE_DOUBLE \ - }, \ - { \ - "(SELECT round (CAST (avg (severity) AS numeric), 2)" \ - " FROM (SELECT (SELECT severity FROM host_max_severities" \ - " WHERE host = hosts.host" \ - " ORDER BY creation_time DESC LIMIT 1)" \ - " AS severity" \ - " FROM (SELECT distinct host FROM host_oss WHERE os = oss.id)" \ - " AS hosts)" \ - " AS severities)", \ - "average_severity", \ - KEYWORD_TYPE_DOUBLE \ - }, \ - { \ - "(SELECT count(DISTINCT host) FROM host_oss WHERE os = oss.id)", \ - "all_hosts", \ - KEYWORD_TYPE_INTEGER \ - }, \ - { NULL, NULL, KEYWORD_TYPE_UNKNOWN } \ - } - -/** - * @brief OS iterator optional filtering columns. - */ -#define OS_ITERATOR_WHERE_COLUMNS \ - { \ - { \ - "(SELECT round (CAST (avg (severity) AS numeric)" \ - " * (SELECT count (distinct host)" \ - " FROM host_oss WHERE os = oss.id), 2)" \ - " FROM (SELECT (SELECT severity FROM host_max_severities" \ - " WHERE host = hosts.host" \ - " ORDER BY creation_time DESC LIMIT 1)" \ - " AS severity" \ - " FROM (SELECT distinct host FROM host_oss WHERE os = oss.id)" \ - " AS hosts)" \ - " AS severities)", \ - "average_severity_score", \ - KEYWORD_TYPE_DOUBLE \ - }, \ - { \ - "(SELECT round (CAST (avg (severity) AS numeric), 2)" \ - " FROM (SELECT (SELECT severity FROM host_max_severities" \ - " WHERE host = hosts.host" \ - " ORDER BY creation_time DESC LIMIT 1)" \ - " AS severity" \ - " FROM (SELECT distinct host FROM host_oss WHERE os = oss.id)" \ - " AS hosts)" \ - " AS severities)", \ - "severity", \ - KEYWORD_TYPE_DOUBLE \ - }, \ - { NULL, NULL, KEYWORD_TYPE_UNKNOWN } \ - } - -/** - * @brief Generate the extra_tables string for an OS iterator. - * - * @return Newly allocated string. - */ -static gchar * -asset_os_iterator_opts_table () -{ - assert (current_credentials.uuid); - - return g_strdup_printf (", (SELECT" - " (SELECT id FROM users" - " WHERE users.uuid = '%s')" - " AS user_id," - " 'host' AS type)" - " AS opts", - current_credentials.uuid); -} - -/** - * @brief Initialise an OS iterator. - * - * @param[in] iterator Iterator. - * @param[in] get GET data. - * - * @return 0 success, 1 failed to find os, 2 failed to find filter, - * -1 error. - */ -int -init_asset_os_iterator (iterator_t *iterator, const get_data_t *get) -{ - int ret; - static const char *filter_columns[] = OS_ITERATOR_FILTER_COLUMNS; - static column_t columns[] = OS_ITERATOR_COLUMNS; - static column_t where_columns[] = OS_ITERATOR_WHERE_COLUMNS; - gchar *extra_tables; - - extra_tables = asset_os_iterator_opts_table (); - - ret = init_get_iterator2_with (iterator, - "os", - get, - /* Columns. */ - columns, - /* Columns for trashcan. */ - NULL, - /* WHERE Columns. */ - where_columns, - /* WHERE Columns for trashcan. */ - NULL, - filter_columns, - 0, - extra_tables, - NULL, - NULL, - TRUE, - FALSE, - NULL, - NULL, - 0, - 0); - - g_free (extra_tables); - - return ret; -} - /** * @brief Initialise an OS iterator for GET_RESOURCE_NAMES. * @@ -41228,76 +41043,6 @@ init_resource_names_os_iterator (iterator_t *iterator, get_data_t *get) return ret; } -/** - * @brief Get the title from an OS iterator. - * - * @param[in] iterator Iterator. - * - * @return The title of the OS, or NULL if iteration is - * complete. Freed by cleanup_iterator. - */ -DEF_ACCESS (asset_os_iterator_title, GET_ITERATOR_COLUMN_COUNT + 2); - -/** - * @brief Get the number of installs from an asset OS iterator. - * - * @param[in] iterator Iterator. - * - * @return Number of hosts that have the OS. - */ -int -asset_os_iterator_installs (iterator_t* iterator) -{ - if (iterator->done) return 0; - return iterator_int (iterator, GET_ITERATOR_COLUMN_COUNT + 3); -} - -/** - * @brief Get the latest severity from an OS iterator. - * - * @param[in] iterator Iterator. - * - * @return The severity of the OS, or NULL if iteration is - * complete. Freed by cleanup_iterator. - */ -DEF_ACCESS (asset_os_iterator_latest_severity, GET_ITERATOR_COLUMN_COUNT + 4); - -/** - * @brief Get the highest severity from an OS iterator. - * - * @param[in] iterator Iterator. - * - * @return The severity of the OS, or NULL if iteration is - * complete. Freed by cleanup_iterator. - */ -DEF_ACCESS (asset_os_iterator_highest_severity, GET_ITERATOR_COLUMN_COUNT + 5); - -/** - * @brief Get the average severity from an OS iterator. - * - * @param[in] iterator Iterator. - * - * @return The severity of the OS, or NULL if iteration is - * complete. Freed by cleanup_iterator. - */ -DEF_ACCESS (asset_os_iterator_average_severity, GET_ITERATOR_COLUMN_COUNT + 6); - -/** - * @brief Get the number of all installs from an asset OS iterator. - * - * This includes hosts where the OS is not the best match. - * - * @param[in] iterator Iterator. - * - * @return Number of any hosts that have the OS not only as the best match. - */ -int -asset_os_iterator_all_installs (iterator_t* iterator) -{ - if (iterator->done) return 0; - return iterator_int (iterator, GET_ITERATOR_COLUMN_COUNT + 7); -} - /** * @brief Count number of oss. * diff --git a/src/manage_sql.h b/src/manage_sql.h index d1a0e25b63..f4f99c0f85 100644 --- a/src/manage_sql.h +++ b/src/manage_sql.h @@ -418,6 +418,13 @@ init_get_iterator2 (iterator_t *, const char *, const get_data_t *, column_t *, const char *, const char *, const char *, int, int, const char *); +int +init_get_iterator2_with (iterator_t *, const char *, const get_data_t *, + column_t *, column_t *, column_t *, column_t *, + const char **, int, const char *, const char *, + const char *, int, int, const char *, const char *, + int, int); + int openvasd_get_details_from_iterator (iterator_t *, char **, GSList **); diff --git a/src/manage_sql_assets.c b/src/manage_sql_assets.c index 6b57cd8b6b..d2401d972b 100644 --- a/src/manage_sql_assets.c +++ b/src/manage_sql_assets.c @@ -1197,3 +1197,140 @@ init_asset_host_iterator (iterator_t *iterator, const get_data_t *get) * complete. Freed by cleanup_iterator. */ DEF_ACCESS (asset_host_iterator_severity, GET_ITERATOR_COLUMN_COUNT + 2); + +/** + * @brief Generate the extra_tables string for an OS iterator. + * + * @return Newly allocated string. + */ +gchar * +asset_os_iterator_opts_table () +{ + assert (current_credentials.uuid); + + return g_strdup_printf (", (SELECT" + " (SELECT id FROM users" + " WHERE users.uuid = '%s')" + " AS user_id," + " 'host' AS type)" + " AS opts", + current_credentials.uuid); +} + +/** + * @brief Initialise an OS iterator. + * + * @param[in] iterator Iterator. + * @param[in] get GET data. + * + * @return 0 success, 1 failed to find os, 2 failed to find filter, + * -1 error. + */ +int +init_asset_os_iterator (iterator_t *iterator, const get_data_t *get) +{ + int ret; + static const char *filter_columns[] = OS_ITERATOR_FILTER_COLUMNS; + static column_t columns[] = OS_ITERATOR_COLUMNS; + static column_t where_columns[] = OS_ITERATOR_WHERE_COLUMNS; + gchar *extra_tables; + + extra_tables = asset_os_iterator_opts_table (); + + ret = init_get_iterator2_with (iterator, + "os", + get, + /* Columns. */ + columns, + /* Columns for trashcan. */ + NULL, + /* WHERE Columns. */ + where_columns, + /* WHERE Columns for trashcan. */ + NULL, + filter_columns, + 0, + extra_tables, + NULL, + NULL, + TRUE, + FALSE, + NULL, + NULL, + 0, + 0); + + g_free (extra_tables); + + return ret; +} + +/** + * @brief Get the title from an OS iterator. + * + * @param[in] iterator Iterator. + * + * @return The title of the OS, or NULL if iteration is + * complete. Freed by cleanup_iterator. + */ +DEF_ACCESS (asset_os_iterator_title, GET_ITERATOR_COLUMN_COUNT + 2); + +/** + * @brief Get the number of installs from an asset OS iterator. + * + * @param[in] iterator Iterator. + * + * @return Number of hosts that have the OS. + */ +int +asset_os_iterator_installs (iterator_t* iterator) +{ + if (iterator->done) return 0; + return iterator_int (iterator, GET_ITERATOR_COLUMN_COUNT + 3); +} + +/** + * @brief Get the latest severity from an OS iterator. + * + * @param[in] iterator Iterator. + * + * @return The severity of the OS, or NULL if iteration is + * complete. Freed by cleanup_iterator. + */ +DEF_ACCESS (asset_os_iterator_latest_severity, GET_ITERATOR_COLUMN_COUNT + 4); + +/** + * @brief Get the highest severity from an OS iterator. + * + * @param[in] iterator Iterator. + * + * @return The severity of the OS, or NULL if iteration is + * complete. Freed by cleanup_iterator. + */ +DEF_ACCESS (asset_os_iterator_highest_severity, GET_ITERATOR_COLUMN_COUNT + 5); + +/** + * @brief Get the average severity from an OS iterator. + * + * @param[in] iterator Iterator. + * + * @return The severity of the OS, or NULL if iteration is + * complete. Freed by cleanup_iterator. + */ +DEF_ACCESS (asset_os_iterator_average_severity, GET_ITERATOR_COLUMN_COUNT + 6); + +/** + * @brief Get the number of all installs from an asset OS iterator. + * + * This includes hosts where the OS is not the best match. + * + * @param[in] iterator Iterator. + * + * @return Number of any hosts that have the OS not only as the best match. + */ +int +asset_os_iterator_all_installs (iterator_t* iterator) +{ + if (iterator->done) return 0; + return iterator_int (iterator, GET_ITERATOR_COLUMN_COUNT + 7); +} diff --git a/src/manage_sql_assets.h b/src/manage_sql_assets.h index 9663021045..d72cf35b41 100644 --- a/src/manage_sql_assets.h +++ b/src/manage_sql_assets.h @@ -151,6 +151,124 @@ { NULL, NULL, KEYWORD_TYPE_UNKNOWN } \ } +/** + * @brief Filter columns for os iterator. + */ +#define OS_ITERATOR_FILTER_COLUMNS \ + { GET_ITERATOR_FILTER_COLUMNS, "title", "hosts", "latest_severity", \ + "highest_severity", "average_severity", "average_severity_score", \ + "severity", "all_hosts", NULL } + +/** + * @brief OS iterator columns. + */ +#define OS_ITERATOR_COLUMNS \ + { \ + GET_ITERATOR_COLUMNS (oss), \ + { \ + "0", \ + "writable", \ + KEYWORD_TYPE_INTEGER \ + }, \ + { \ + "(SELECT count (*) > 0 FROM host_oss WHERE os = oss.id)", \ + "in_use", \ + KEYWORD_TYPE_INTEGER \ + }, \ + { \ + "(SELECT coalesce (cpe_title (oss.name), ''))", \ + "title", \ + KEYWORD_TYPE_STRING \ + }, \ + { \ + "(SELECT count(*)" \ + " FROM (SELECT inner_cpes[1] AS cpe, host" \ + " FROM (SELECT array_agg (host_details.value" \ + " ORDER BY host_details.id DESC)" \ + " AS inner_cpes," \ + " host" \ + " FROM host_details, hosts" \ + " WHERE host_details.name = 'best_os_cpe'" \ + " AND hosts.id = host_details.host" \ + " AND (" ACL_USER_MAY_OPTS ("hosts") ")" \ + " GROUP BY host)" \ + " AS host_details_subselect)" \ + " AS array_removal_subselect" \ + " WHERE cpe = oss.name)", \ + "hosts", \ + KEYWORD_TYPE_INTEGER \ + }, \ + { \ + "(SELECT round (CAST (severity AS numeric), 1) FROM host_max_severities" \ + " WHERE host = (SELECT host FROM host_oss" \ + " WHERE os = oss.id" \ + " ORDER BY creation_time DESC LIMIT 1)" \ + " ORDER BY creation_time DESC LIMIT 1)", \ + "latest_severity", \ + KEYWORD_TYPE_DOUBLE \ + }, \ + { \ + "(SELECT round (max (CAST (severity AS numeric)), 1)" \ + " FROM host_max_severities" \ + " WHERE host IN (SELECT DISTINCT host FROM host_oss" \ + " WHERE os = oss.id))", \ + "highest_severity", \ + KEYWORD_TYPE_DOUBLE \ + }, \ + { \ + "(SELECT round (CAST (avg (severity) AS numeric), 2)" \ + " FROM (SELECT (SELECT severity FROM host_max_severities" \ + " WHERE host = hosts.host" \ + " ORDER BY creation_time DESC LIMIT 1)" \ + " AS severity" \ + " FROM (SELECT distinct host FROM host_oss WHERE os = oss.id)" \ + " AS hosts)" \ + " AS severities)", \ + "average_severity", \ + KEYWORD_TYPE_DOUBLE \ + }, \ + { \ + "(SELECT count(DISTINCT host) FROM host_oss WHERE os = oss.id)", \ + "all_hosts", \ + KEYWORD_TYPE_INTEGER \ + }, \ + { NULL, NULL, KEYWORD_TYPE_UNKNOWN } \ + } + +/** + * @brief OS iterator optional filtering columns. + */ +#define OS_ITERATOR_WHERE_COLUMNS \ + { \ + { \ + "(SELECT round (CAST (avg (severity) AS numeric)" \ + " * (SELECT count (distinct host)" \ + " FROM host_oss WHERE os = oss.id), 2)" \ + " FROM (SELECT (SELECT severity FROM host_max_severities" \ + " WHERE host = hosts.host" \ + " ORDER BY creation_time DESC LIMIT 1)" \ + " AS severity" \ + " FROM (SELECT distinct host FROM host_oss WHERE os = oss.id)" \ + " AS hosts)" \ + " AS severities)", \ + "average_severity_score", \ + KEYWORD_TYPE_DOUBLE \ + }, \ + { \ + "(SELECT round (CAST (avg (severity) AS numeric), 2)" \ + " FROM (SELECT (SELECT severity FROM host_max_severities" \ + " WHERE host = hosts.host" \ + " ORDER BY creation_time DESC LIMIT 1)" \ + " AS severity" \ + " FROM (SELECT distinct host FROM host_oss WHERE os = oss.id)" \ + " AS hosts)" \ + " AS severities)", \ + "severity", \ + KEYWORD_TYPE_DOUBLE \ + }, \ + { NULL, NULL, KEYWORD_TYPE_UNKNOWN } \ + } + char * result_host_asset_id (const char *, result_t); @@ -160,4 +278,7 @@ manage_report_host_detail (report_t, const char *, const char *, GHashTable *); gchar* asset_host_extra_where (const char *); +gchar * +asset_os_iterator_opts_table (); + #endif /* not _GVMD_MANAGE_SQL_ASSETS_H */