diff --git a/src/gmp.c b/src/gmp.c
index 8f548a4d5..b1a6d32b8 100644
--- a/src/gmp.c
+++ b/src/gmp.c
@@ -11773,6 +11773,12 @@ handle_get_configs (gmp_parser_t *gmp_parser, GError **error)
}
SEND_GET_COMMON (config, &get_configs_data->get, &configs);
+ if (resource_id_deprecated ("config",
+ get_iterator_uuid (&configs)))
+ {
+ SENDF_TO_CLIENT_OR_FAIL ("1");
+ }
+
/** @todo This should really be an nvt_selector_t. */
selector = config_iterator_nvt_selector (&configs);
config = get_iterator_resource (&configs);
@@ -14046,6 +14052,12 @@ handle_get_port_lists (gmp_parser_t *gmp_parser, GError **error)
SEND_GET_COMMON (port_list, &get_port_lists_data->get,
&port_lists);
+ if (resource_id_deprecated ("port_list",
+ get_iterator_uuid (&port_lists)))
+ {
+ SENDF_TO_CLIENT_OR_FAIL ("1");
+ }
+
SENDF_TO_CLIENT_OR_FAIL (""
"%i"
"%i"
@@ -14926,6 +14938,12 @@ handle_get_report_formats (gmp_parser_t *gmp_parser, GError **error)
: report_format_predefined
(get_iterator_resource (&report_formats)));
+ if (resource_id_deprecated ("report_format",
+ get_iterator_uuid (&report_formats)))
+ {
+ SENDF_TO_CLIENT_OR_FAIL ("1");
+ }
+
if (get_report_formats_data->alerts)
{
iterator_t alerts;
diff --git a/src/gmp_configs.c b/src/gmp_configs.c
index 3daa9eada..f7d550dd4 100644
--- a/src/gmp_configs.c
+++ b/src/gmp_configs.c
@@ -182,6 +182,7 @@ attr_or_null (entity_t entity, const gchar *name)
* @param[out] all_selector True if ALL_SELECTOR was present.
* @param[out] import_nvt_selectors Address for selectors.
* @param[out] import_preferences Address for preferences.
+ * @param[out] deprecated Address for deprecation status.
*
* @return 0 success, 1 preference did no exist, -1 preference without ID.
*/
@@ -190,7 +191,8 @@ parse_config_entity (entity_t config, const char **config_id, char **name,
char **comment, char **usage_type,
int *all_selector,
array_t **import_nvt_selectors,
- array_t **import_preferences)
+ array_t **import_preferences,
+ char **deprecated)
{
entity_t entity, preferences, nvt_selectors;
@@ -217,6 +219,14 @@ parse_config_entity (entity_t config, const char **config_id, char **name,
*usage_type = NULL;
}
+ if (deprecated)
+ {
+ *deprecated = NULL;
+ entity = entity_child (config, "deprecated");
+ if (entity)
+ *deprecated = entity_text (entity);
+ }
+
/* Collect NVT selectors. */
*import_nvt_selectors = NULL;
@@ -416,7 +426,7 @@ create_config_run (gmp_parser_t *gmp_parser, GError **error)
if (parse_config_entity (config, NULL, &import_name, &comment,
NULL, &all_selector, &import_nvt_selectors,
- &import_preferences))
+ &import_preferences, NULL))
{
SEND_TO_CLIENT_OR_FAIL
(XML_ERROR_SYNTAX ("create_config",
diff --git a/src/gmp_configs.h b/src/gmp_configs.h
index e126ec3ba..210621e15 100644
--- a/src/gmp_configs.h
+++ b/src/gmp_configs.h
@@ -41,7 +41,7 @@ create_config_element_text (const gchar *, gsize);
int
parse_config_entity (entity_t, const char **, char **, char **,
- char **, int *, array_t **, array_t **);
+ char **, int *, array_t **, array_t **, char **);
/* modify_config */
diff --git a/src/gmp_port_lists.c b/src/gmp_port_lists.c
index d5fd98f03..a89b2cd30 100644
--- a/src/gmp_port_lists.c
+++ b/src/gmp_port_lists.c
@@ -109,10 +109,12 @@ create_port_list_element_start (gmp_parser_t *gmp_parser, const gchar *name,
* @param[out] name Address for name.
* @param[out] comment Address for comment.
* @param[out] ranges Address for port ranges.
+ * @param[out] deprecated Address for deprecation status.
*/
void
parse_port_list_entity (entity_t port_list, const char **port_list_id,
- char **name, char **comment, array_t **ranges)
+ char **name, char **comment, array_t **ranges,
+ char **deprecated)
{
entity_t entity, port_ranges;
@@ -129,6 +131,14 @@ parse_port_list_entity (entity_t port_list, const char **port_list_id,
if (entity)
*comment = entity_text (entity);
+ if (deprecated)
+ {
+ *deprecated = NULL;
+ entity = entity_child (port_list, "deprecated");
+ if (entity)
+ *deprecated = entity_text (entity);
+ }
+
/* Collect port ranges. */
*ranges = NULL;
@@ -207,7 +217,7 @@ create_port_list_run (gmp_parser_t *gmp_parser, GError **error)
/* Get the port_list data from the XML. */
parse_port_list_entity (port_list, &port_list_id, &import_name,
- &comment, &ranges);
+ &comment, &ranges, NULL);
/* Check data, then create port list. */
diff --git a/src/gmp_port_lists.h b/src/gmp_port_lists.h
index 1de86925c..67cd2ab6f 100644
--- a/src/gmp_port_lists.h
+++ b/src/gmp_port_lists.h
@@ -38,6 +38,7 @@ void
create_port_list_element_text (const gchar *, gsize);
void
-parse_port_list_entity (entity_t, const char **, char **, char **, array_t **);
+parse_port_list_entity (entity_t, const char **, char **, char **, array_t **,
+ char **);
#endif /* not _GVMD_GMP_PORT_LISTS_H */
diff --git a/src/gmp_report_formats.c b/src/gmp_report_formats.c
index 0302f5db7..37ccdce1d 100644
--- a/src/gmp_report_formats.c
+++ b/src/gmp_report_formats.c
@@ -156,6 +156,7 @@ params_options_free (array_t *params_options)
* @param[out] files Address for files.
* @param[out] params Address for params.
* @param[out] params_options Address for param options.
+ * @param[out] deprecated Address for deprecation status.
*/
void
parse_report_format_entity (entity_t report_format,
@@ -163,7 +164,8 @@ parse_report_format_entity (entity_t report_format,
char **content_type, char **extension,
char **summary, char **description,
char **signature, array_t **files,
- array_t **params, array_t **params_options)
+ array_t **params, array_t **params_options,
+ char **deprecated)
{
entity_t file, param_entity;
entities_t children;
@@ -177,6 +179,8 @@ parse_report_format_entity (entity_t report_format,
*summary = child_or_null (report_format, "summary");
*description = child_or_null (report_format, "description");
*signature = child_or_null (report_format, "signature");
+ if (deprecated)
+ *deprecated = child_or_null (report_format, "deprecated");
*files = make_array ();
*params = make_array ();
@@ -367,7 +371,7 @@ create_report_format_run (gmp_parser_t *gmp_parser, GError **error)
parse_report_format_entity (report_format, &report_format_id,
&import_name, &content_type, &extension,
&summary, &description, &signature, &files,
- ¶ms, ¶ms_options);
+ ¶ms, ¶ms_options, NULL);
/* Check data, then create report format. */
diff --git a/src/gmp_report_formats.h b/src/gmp_report_formats.h
index ee462d3ed..8f732904a 100644
--- a/src/gmp_report_formats.h
+++ b/src/gmp_report_formats.h
@@ -43,6 +43,6 @@ params_options_free (array_t *);
void
parse_report_format_entity (entity_t, const char **, char **, char **,
char **, char **, char **, char **,
- array_t **, array_t **, array_t **);
+ array_t **, array_t **, array_t **, char **);
#endif /* not _GVMD_GMP_REPORT_FORMATS_H */
diff --git a/src/manage.h b/src/manage.h
index 0e5399067..a4936ea7c 100644
--- a/src/manage.h
+++ b/src/manage.h
@@ -407,6 +407,12 @@ type_is_scap (const char*);
int
delete_resource (const char *, const char *, int);
+int
+resource_id_deprecated (const char *, const char *);
+
+void
+set_resource_id_deprecated (const char *, const char *, gboolean);
+
/* Events and Alerts. */
diff --git a/src/manage_configs.c b/src/manage_configs.c
index 9dd0fa214..e88f7b023 100644
--- a/src/manage_configs.c
+++ b/src/manage_configs.c
@@ -141,7 +141,7 @@ update_config_from_file (config_t config, const gchar *path)
{
entity_t entity;
array_t *nvt_selectors, *preferences;
- char *comment, *name, *usage_type;
+ char *comment, *name, *usage_type, *deprecated;
const char *config_id;
int all_selector;
@@ -156,7 +156,7 @@ update_config_from_file (config_t config, const gchar *path)
switch (parse_config_entity (entity, &config_id, &name, &comment,
&usage_type, &all_selector, &nvt_selectors,
- &preferences))
+ &preferences, &deprecated))
{
case 0:
break;
@@ -174,7 +174,7 @@ update_config_from_file (config_t config, const gchar *path)
/* Update the config. */
update_config (config, name, comment, usage_type, all_selector,
- nvt_selectors, preferences);
+ nvt_selectors, preferences, deprecated);
/* Cleanup. */
@@ -197,7 +197,7 @@ create_config_from_file (const gchar *path)
{
entity_t config;
array_t *nvt_selectors, *preferences;
- char *created_name, *comment, *name, *usage_type;
+ char *created_name, *comment, *name, *usage_type, *deprecated;
const char *config_id;
config_t new_config;
int all_selector;
@@ -213,7 +213,7 @@ create_config_from_file (const gchar *path)
switch (parse_config_entity (config, &config_id, &name, &comment,
&usage_type, &all_selector, &nvt_selectors,
- &preferences))
+ &preferences, &deprecated))
{
case 0:
break;
@@ -228,6 +228,16 @@ create_config_from_file (const gchar *path)
return -1;
}
+ /* Handle deprecation status */
+
+ if (deprecated && atoi (deprecated))
+ {
+ g_debug ("Skipping import of deprecated config %s.",
+ config_id);
+ set_resource_id_deprecated ("config", config_id, TRUE);
+ return 0;
+ }
+
/* Create the config. */
switch (create_config_no_acl (config_id,
@@ -329,11 +339,37 @@ should_sync_config_from_path (const char *path, gboolean rebuild,
uuid = g_strdup_printf ("%s-%s-%s-%s-%s",
split[1], split[2], split[3], split[4], split[5]);
g_strfreev (split);
+
+ if (resource_id_deprecated ("config", uuid))
+ {
+ find_config_no_acl (uuid, config);
+
+ if (rebuild)
+ {
+ g_free (uuid);
+ return 1;
+ }
+
+ full_path = g_build_filename (feed_dir_configs (), path, NULL);
+ if (deprecated_config_id_updated_in_feed (uuid, full_path))
+ {
+ g_free (uuid);
+ g_free (full_path);
+ return 1;
+ }
+ g_free (uuid);
+ g_free (full_path);
+ return 0;
+ }
+
if (find_config_no_acl (uuid, config) == 0
&& *config)
{
if (rebuild)
- return 1;
+ {
+ g_free (uuid);
+ return 1;
+ }
full_path = g_build_filename (feed_dir_configs (), path, NULL);
@@ -343,6 +379,7 @@ should_sync_config_from_path (const char *path, gboolean rebuild,
if (config_updated_in_feed (*config, full_path))
{
+ g_free (full_path);
return 1;
}
diff --git a/src/manage_pg.c b/src/manage_pg.c
index b39368f7f..df9741fed 100644
--- a/src/manage_pg.c
+++ b/src/manage_pg.c
@@ -1993,6 +1993,13 @@ create_tables ()
" type TEXT,"
" value TEXT);");
+ sql ("CREATE TABLE IF NOT EXISTS deprecated_feed_data"
+ " (id SERIAL PRIMARY KEY,"
+ " type TEXT,"
+ " uuid TEXT,"
+ " modification_time INTEGER,"
+ " UNIQUE (type, uuid));");
+
sql ("CREATE TABLE IF NOT EXISTS filters"
" (id SERIAL PRIMARY KEY,"
" uuid text UNIQUE NOT NULL,"
diff --git a/src/manage_port_lists.c b/src/manage_port_lists.c
index 82590b949..39f2d1775 100644
--- a/src/manage_port_lists.c
+++ b/src/manage_port_lists.c
@@ -115,7 +115,7 @@ create_port_list_from_file (const gchar *path)
{
entity_t port_list;
array_t *ranges;
- char *comment, *name;
+ char *comment, *name, *deprecated;
const char *port_list_id;
port_list_t new_port_list;
@@ -129,7 +129,17 @@ create_port_list_from_file (const gchar *path)
/* Parse the data out of the entity. */
parse_port_list_entity (port_list, &port_list_id, &name, &comment,
- &ranges);
+ &ranges, &deprecated);
+
+ /* Handle deprecation status */
+
+ if (deprecated && atoi (deprecated))
+ {
+ g_debug ("Skipping import of deprecated port list %s.",
+ port_list_id);
+ set_resource_id_deprecated ("port_list", port_list_id, TRUE);
+ return 0;
+ }
/* Create the port_list. */
@@ -207,7 +217,7 @@ update_port_list_from_file (port_list_t port_list, const gchar *path)
{
entity_t entity;
array_t *ranges;
- char *comment, *name;
+ char *comment, *name, *deprecated;
const char *port_list_id;
g_debug ("%s: updating %s", __func__, path);
@@ -219,11 +229,12 @@ update_port_list_from_file (port_list_t port_list, const gchar *path)
/* Parse the data out of the entity. */
- parse_port_list_entity (entity, &port_list_id, &name, &comment, &ranges);
+ parse_port_list_entity (entity, &port_list_id, &name, &comment, &ranges,
+ &deprecated);
/* Update the port list. */
- update_port_list (port_list, name, comment, ranges);
+ update_port_list (port_list, name, comment, ranges, deprecated);
/* Cleanup. */
@@ -265,11 +276,36 @@ should_sync_port_list_from_path (const char *path, gboolean rebuild,
uuid = g_strdup_printf ("%s-%s-%s-%s-%s",
split[1], split[2], split[3], split[4], split[5]);
g_strfreev (split);
+
+ if (resource_id_deprecated ("port_list", uuid))
+ {
+ find_port_list_no_acl (uuid, port_list);
+
+ if (rebuild)
+ {
+ return 1;
+ }
+
+ full_path = g_build_filename (feed_dir_port_lists (), path, NULL);
+ if (deprecated_port_list_id_updated_in_feed (uuid, full_path))
+ {
+ g_free (uuid);
+ g_free (full_path);
+ return 1;
+ }
+ g_free (uuid);
+ g_free (full_path);
+ return 0;
+ }
+
if (find_port_list_no_acl (uuid, port_list) == 0
&& *port_list)
{
if (rebuild)
- return 1;
+ {
+ g_free (uuid);
+ return 1;
+ }
full_path = g_build_filename (feed_dir_port_lists (), path, NULL);
@@ -279,6 +315,7 @@ should_sync_port_list_from_path (const char *path, gboolean rebuild,
if (port_list_updated_in_feed (*port_list, full_path))
{
+ g_free (full_path);
return 1;
}
diff --git a/src/manage_report_formats.c b/src/manage_report_formats.c
index fad78ce4b..340321189 100644
--- a/src/manage_report_formats.c
+++ b/src/manage_report_formats.c
@@ -391,6 +391,7 @@ update_report_format_from_file (report_format_t report_format,
entity_t entity;
array_t *files, *params, *params_options;
char *name, *content_type, *extension, *summary, *description, *signature;
+ char *deprecated;
const char *report_format_id;
g_debug ("%s: updating %s", __func__, path);
@@ -405,13 +406,13 @@ update_report_format_from_file (report_format_t report_format,
parse_report_format_entity (entity, &report_format_id, &name,
&content_type, &extension, &summary,
&description, &signature, &files, ¶ms,
- ¶ms_options);
+ ¶ms_options, &deprecated);
/* Update the report format. */
update_report_format (report_format, report_format_id, name, content_type,
extension, summary, description, signature, files,
- params, params_options);
+ params, params_options, deprecated);
/* Cleanup. */
@@ -482,6 +483,7 @@ create_report_format_from_file (const gchar *path)
entity_t report_format;
array_t *files, *params, *params_options;
char *name, *content_type, *extension, *summary, *description, *signature;
+ char *deprecated;
const char *report_format_id;
report_format_t new_report_format;
@@ -497,7 +499,17 @@ create_report_format_from_file (const gchar *path)
parse_report_format_entity (report_format, &report_format_id, &name,
&content_type, &extension, &summary,
&description, &signature, &files, ¶ms,
- ¶ms_options);
+ ¶ms_options, &deprecated);
+
+ /* Handle deprecation status */
+
+ if (deprecated && atoi (deprecated))
+ {
+ g_debug ("Skipping import of deprecated report format %s.",
+ report_format_id);
+ set_resource_id_deprecated ("report_format", report_format_id, TRUE);
+ return 0;
+ }
/* Create the report format. */
@@ -625,11 +637,36 @@ should_sync_report_format_from_path (const char *path,
uuid = g_strdup_printf ("%s-%s-%s-%s-%s",
split[1], split[2], split[3], split[4], split[5]);
g_strfreev (split);
+
+ if (resource_id_deprecated ("report_format", uuid))
+ {
+ find_report_format_no_acl (uuid, report_format);
+
+ if (rebuild)
+ {
+ g_free (uuid);
+ return 1;
+ }
+
+ full_path = g_build_filename (feed_dir_report_formats (), path, NULL);
+ if (deprecated_report_format_id_updated_in_feed (uuid, full_path))
+ {
+ g_free (full_path);
+ return 1;
+ }
+ g_free (uuid);
+ g_free (full_path);
+ return 0;
+ }
+
if (find_report_format_no_acl (uuid, report_format) == 0
&& *report_format)
{
if (rebuild)
- return 1;
+ {
+ g_free (uuid);
+ return 1;
+ }
full_path = g_build_filename (feed_dir_report_formats (), path, NULL);
@@ -639,6 +676,7 @@ should_sync_report_format_from_path (const char *path,
if (report_format_updated_in_feed (*report_format, full_path))
{
+ g_free (full_path);
return 1;
}
diff --git a/src/manage_sql.c b/src/manage_sql.c
index a3cda0615..c57d597b6 100644
--- a/src/manage_sql.c
+++ b/src/manage_sql.c
@@ -4748,6 +4748,63 @@ manage_trash_resource_name (const char *type, const char *uuid, char **name)
return resource_name (type, uuid, LOCATION_TRASH, name);
}
+/**
+ * @brief Check if a resource has been marked as deprecated.
+ *
+ * @param[in] type Resource type.
+ * @param[in] resource_id UUID of the resource.
+ *
+ * @return 1 if deprecated, else 0.
+ */
+int
+resource_id_deprecated (const char *type, const char *resource_id)
+{
+ int ret;
+ gchar *quoted_type = sql_quote (type);
+ gchar *quoted_uuid = sql_quote (resource_id);
+
+ ret = sql_int ("SELECT count(*) FROM deprecated_feed_data"
+ " WHERE type = '%s' AND uuid = '%s';",
+ quoted_type, quoted_uuid);
+
+ g_free (quoted_type);
+ g_free (quoted_uuid);
+
+ return ret != 0;
+}
+
+/**
+ * @brief Mark whether resource is deprecated.
+ *
+ * @param[in] type Resource type.
+ * @param[in] resource_id UUID of the resource.
+ * @param[in] deprecated Whether the resource is deprecated.
+ */
+void
+set_resource_id_deprecated (const char *type, const char *resource_id,
+ gboolean deprecated)
+{
+ gchar *quoted_type = sql_quote (type);
+ gchar *quoted_uuid = sql_quote (resource_id);
+
+ if (deprecated)
+ {
+ sql ("INSERT INTO deprecated_feed_data (type, uuid, modification_time)"
+ " VALUES ('%s', '%s', m_now ())"
+ " ON CONFLICT (uuid, type)"
+ " DO UPDATE SET modification_time = m_now ()",
+ quoted_type, quoted_uuid);
+ }
+ else
+ {
+ sql ("DELETE FROM deprecated_feed_data"
+ " WHERE type = '%s' AND uuid = '%s'",
+ quoted_type, quoted_uuid);
+ }
+ g_free (quoted_type);
+ g_free (quoted_uuid);
+}
+
/**
* @brief Get the UUID of a resource.
*
diff --git a/src/manage_sql_configs.c b/src/manage_sql_configs.c
index 4c87780f9..4fe5b0814 100644
--- a/src/manage_sql_configs.c
+++ b/src/manage_sql_configs.c
@@ -4322,8 +4322,8 @@ migrate_predefined_configs ()
/**
* @brief Check if a config has been updated in the feed.
*
- * @param[in] path Full path to config XML in feed.
* @param[in] config Config.
+ * @param[in] path Full path to config XML in feed.
*
* @return 1 if updated in feed, else 0.
*/
@@ -4351,6 +4351,42 @@ config_updated_in_feed (config_t config, const gchar *path)
return 1;
}
+/**
+ * @brief Check if a deprecated config has been updated in the feed.
+ *
+ * @param[in] config_id Config UUID.
+ * @param[in] path Full path to Config XML in feed.
+ *
+ * @return 1 if updated in feed, else 0.
+ */
+int
+deprecated_config_id_updated_in_feed (const char *config_id,
+ const gchar *path)
+{
+ gchar *quoted_uuid;
+ GStatBuf state;
+ int last_update;
+
+ quoted_uuid = sql_quote (config_id);
+ last_update = sql_int ("SELECT modification_time FROM deprecated_feed_data"
+ " WHERE type = 'config' AND uuid = '%s';",
+ quoted_uuid);
+ g_free (quoted_uuid);
+
+ if (g_stat (path, &state))
+ {
+ g_warning ("%s: Failed to stat feed config file: %s",
+ __func__,
+ strerror (errno));
+ return 0;
+ }
+
+ if (state.st_mtime <= last_update)
+ return 0;
+
+ return 1;
+}
+
/**
* @brief Update a config from an XML file.
*
@@ -4361,15 +4397,17 @@ config_updated_in_feed (config_t config, const gchar *path)
* @param[in] all_selector Whether to use "all" selector instead of selectors.
* @param[in] selectors New NVT selectors.
* @param[in] preferences New preferences.
+ * @param[in] deprecated Deprecation status.
*/
void
update_config (config_t config, const gchar *name,
const gchar *comment, const gchar *usage_type,
int all_selector,
const array_t* selectors /* nvt_selector_t. */,
- const array_t* preferences /* preference_t. */)
+ const array_t* preferences /* preference_t. */,
+ const gchar *deprecated)
{
- gchar *quoted_name, *quoted_comment, *actual_usage_type;
+ gchar *quoted_name, *quoted_comment, *actual_usage_type, *config_id;
sql_begin_immediate ();
@@ -4451,6 +4489,29 @@ update_config (config_t config, const gchar *name,
" AND type = 'SERVER_PREFS');",
config);
+ /* Handle deprecation status */
+
+ config_id = resource_uuid ("config", config);
+ if (deprecated && atoi (deprecated))
+ {
+ if (resource_id_deprecated ("config", config_id) == 0)
+ {
+ g_info ("Config %s is now deprecated.",
+ config_id);
+ }
+ set_resource_id_deprecated ("config", config_id, TRUE);
+ }
+ else
+ {
+ if (resource_id_deprecated ("config", config_id))
+ {
+ set_resource_id_deprecated ("config", config_id, FALSE);
+ g_info ("Deprecation of config %s has been revoked.",
+ config_id);
+ }
+ }
+ g_free (config_id);
+
sql_commit ();
}
diff --git a/src/manage_sql_configs.h b/src/manage_sql_configs.h
index ba4b79804..888d4e4fb 100644
--- a/src/manage_sql_configs.h
+++ b/src/manage_sql_configs.h
@@ -89,9 +89,12 @@ migrate_predefined_configs ();
int
config_updated_in_feed (config_t, const gchar *);
+int
+deprecated_config_id_updated_in_feed (const char *, const gchar *);
+
void
update_config (config_t, const gchar *, const gchar *, const gchar *,
- int, const array_t*, const array_t*);
+ int, const array_t*, const array_t*, const gchar *);
void
check_db_configs ();
diff --git a/src/manage_sql_port_lists.c b/src/manage_sql_port_lists.c
index a3db4a041..ce0771219 100644
--- a/src/manage_sql_port_lists.c
+++ b/src/manage_sql_port_lists.c
@@ -2516,8 +2516,8 @@ migrate_predefined_port_lists ()
/**
* @brief Check if a port list has been updated in the feed.
*
- * @param[in] path Full path to port list XML in feed.
* @param[in] port_list Port List.
+ * @param[in] path Full path to port list XML in feed.
*
* @return 1 if updated in feed, else 0.
*/
@@ -2545,6 +2545,42 @@ port_list_updated_in_feed (port_list_t port_list, const gchar *path)
return 1;
}
+/**
+ * @brief Check if a deprecated port list has been updated in the feed.
+ *
+ * @param[in] port_list_id Port list UUID.
+ * @param[in] path Full path to port list XML in feed.
+ *
+ * @return 1 if updated in feed, else 0.
+ */
+int
+deprecated_port_list_id_updated_in_feed (const char *port_list_id,
+ const gchar *path)
+{
+ gchar *quoted_uuid;
+ GStatBuf state;
+ int last_update;
+
+ quoted_uuid = sql_quote (port_list_id);
+ last_update = sql_int ("SELECT modification_time FROM deprecated_feed_data"
+ " WHERE type = 'port_list' AND uuid = '%s';",
+ quoted_uuid);
+ g_free (quoted_uuid);
+
+ if (g_stat (path, &state))
+ {
+ g_warning ("%s: Failed to stat feed port_list file: %s",
+ __func__,
+ strerror (errno));
+ return 0;
+ }
+
+ if (state.st_mtime <= last_update)
+ return 0;
+
+ return 1;
+}
+
/**
* @brief Update a port list from an XML file.
*
@@ -2552,15 +2588,18 @@ port_list_updated_in_feed (port_list_t port_list, const gchar *path)
* @param[in] name New name.
* @param[in] comment New comment.
* @param[in] ranges New port ranges.
+ * @param[in] deprecated Deprecation status.
*/
void
update_port_list (port_list_t port_list, const gchar *name,
const gchar *comment,
- array_t *ranges /* range_t */)
+ array_t *ranges /* range_t */,
+ const char *deprecated)
{
gchar *quoted_name, *quoted_comment;
int index;
range_t *range;
+ char *port_list_id;
sql_begin_immediate ();
@@ -2585,7 +2624,30 @@ update_port_list (port_list_t port_list, const gchar *name,
while ((range = (range_t*) g_ptr_array_index (ranges, index++)))
insert_port_range (port_list, range->type, range->start, range->end);
+ /* Handle deprecation status */
+
+ port_list_id = resource_uuid ("port_list", port_list);
+ if (deprecated && atoi (deprecated))
+ {
+ if (resource_id_deprecated ("port_list", port_list_id) == 0)
+ {
+ g_info ("Port list %s is now deprecated.",
+ port_list_id);
+ }
+ set_resource_id_deprecated ("port_list", port_list_id, TRUE);
+ }
+ else
+ {
+ if (resource_id_deprecated ("port_list", port_list_id))
+ {
+ set_resource_id_deprecated ("port_list", port_list_id, FALSE);
+ g_info ("Deprecation of port list %s has been revoked.",
+ port_list_id);
+ }
+ }
+
sql_commit ();
+ free (port_list_id);
}
/**
diff --git a/src/manage_sql_port_lists.h b/src/manage_sql_port_lists.h
index dce863cb3..9d20c199c 100644
--- a/src/manage_sql_port_lists.h
+++ b/src/manage_sql_port_lists.h
@@ -66,8 +66,12 @@ migrate_predefined_port_lists ();
int
port_list_updated_in_feed (port_list_t, const gchar *);
+int
+deprecated_port_list_id_updated_in_feed (const char *, const gchar *);
+
void
-update_port_list (port_list_t, const gchar *, const gchar *, array_t *);
+update_port_list (port_list_t, const gchar *, const gchar *, array_t *,
+ const gchar *);
void
check_db_port_lists ();
diff --git a/src/manage_sql_report_formats.c b/src/manage_sql_report_formats.c
index 155cc5079..89b23c4ca 100644
--- a/src/manage_sql_report_formats.c
+++ b/src/manage_sql_report_formats.c
@@ -4129,13 +4129,15 @@ delete_report_format_dirs_user (const gchar *user_id, iterator_t *rows)
* @param[in] files New files.
* @param[in] params New params.
* @param[in] params_options Options for new params.
+ * @param[in] deprecated New deprecation status.
*/
void
-update_report_format (report_format_t report_format, const gchar *report_id, const gchar *name,
+update_report_format (report_format_t report_format, const gchar *report_id,
+ const gchar *name,
const gchar *content_type, const gchar *extension,
const gchar *summary, const gchar *description,
const gchar *signature, array_t *files, array_t *params,
- array_t *params_options)
+ array_t *params_options, const char *deprecated)
{
int ret;
gchar *quoted_name, *quoted_content_type, *quoted_extension, *quoted_summary;
@@ -4205,14 +4207,35 @@ update_report_format (report_format_t report_format, const gchar *report_id, con
save_report_format_files (report_id, files, NULL);
+ /* Handle deprecation status */
+
+ if (deprecated && atoi (deprecated))
+ {
+ if (resource_id_deprecated ("report_format", report_id) == 0)
+ {
+ g_info ("Report format %s is now deprecated.",
+ report_id);
+ }
+ set_resource_id_deprecated ("report_format", report_id, TRUE);
+ }
+ else
+ {
+ if (resource_id_deprecated ("report_format", report_id))
+ {
+ set_resource_id_deprecated ("report_format", report_id, FALSE);
+ g_info ("Deprecation of report format %s has been revoked.",
+ report_id);
+ }
+ }
+
sql_commit ();
}
/**
* @brief Check if a report format has been updated in the feed.
*
- * @param[in] path Full path to report format XML in feed.
* @param[in] report_format Report Format.
+ * @param[in] path Full path to report format XML in feed.
*
* @return 1 if updated in feed, else 0.
*/
@@ -4240,6 +4263,42 @@ report_format_updated_in_feed (report_format_t report_format, const gchar *path)
return 1;
}
+/**
+ * @brief Check if a deprecated report format has been updated in the feed.
+ *
+ * @param[in] report_format_id Report Format UUID.
+ * @param[in] path Full path to report format XML in feed.
+ *
+ * @return 1 if updated in feed, else 0.
+ */
+int
+deprecated_report_format_id_updated_in_feed (const char *report_format_id,
+ const gchar *path)
+{
+ gchar *quoted_uuid;
+ GStatBuf state;
+ int last_update;
+
+ quoted_uuid = sql_quote (report_format_id);
+ last_update = sql_int ("SELECT modification_time FROM deprecated_feed_data"
+ " WHERE type = 'report_format' AND uuid = '%s';",
+ quoted_uuid);
+ g_free (quoted_uuid);
+
+ if (g_stat (path, &state))
+ {
+ g_warning ("%s: Failed to stat feed report_format file: %s",
+ __func__,
+ strerror (errno));
+ return 0;
+ }
+
+ if (state.st_mtime <= last_update)
+ return 0;
+
+ return 1;
+}
+
/**
* @brief Migrate old ownerless report formats to the Feed Owner.
*
diff --git a/src/manage_sql_report_formats.h b/src/manage_sql_report_formats.h
index bd55a09c1..632c22089 100644
--- a/src/manage_sql_report_formats.h
+++ b/src/manage_sql_report_formats.h
@@ -71,11 +71,14 @@ void
update_report_format (report_format_t, const gchar *, const gchar *,
const gchar *, const gchar *, const gchar *,
const gchar *, const gchar *, array_t *, array_t *,
- array_t *);
+ array_t *, const gchar *);
int
report_format_updated_in_feed (report_format_t, const gchar *);
+int
+deprecated_report_format_id_updated_in_feed (const char*, const gchar *);
+
int
migrate_predefined_report_formats ();
diff --git a/src/schema_formats/XML/GMP.xml.in b/src/schema_formats/XML/GMP.xml.in
index d36ebdd6a..fa40654bd 100644
--- a/src/schema_formats/XML/GMP.xml.in
+++ b/src/schema_formats/XML/GMP.xml.in
@@ -7459,6 +7459,7 @@ END:VCALENDAR
preferences
nvt_selectors
predefined
+ deprecated
owner
@@ -7838,6 +7839,11 @@ END:VCALENDAR
Whether the config was predefined by the feed
boolean
+
+ deprecated
+ Whether the config is deprecated
+ boolean
+
filters
@@ -14910,6 +14916,7 @@ END:VCALENDAR
port_ranges
targets
predefined
+ deprecated
owner
@@ -15114,6 +15121,11 @@ END:VCALENDAR
Whether the port list was predefined by the feed
boolean
+
+ deprecated
+ Whether the port list is deprecated
+ boolean
+
filters
@@ -16522,6 +16534,7 @@ END:VCALENDAR
trust
active
predefined
+ deprecated
param
@@ -16778,11 +16791,11 @@ END:VCALENDAR
1
time
-
- yes
- no
- unknown
-
+
+ yes
+ no
+ unknown
+
time
@@ -16800,6 +16813,11 @@ END:VCALENDAR
Whether the report format was predefined by the feed
boolean
+
+ deprecated
+ Whether the report format is deprecated
+ boolean
+
filters