[Openvas-commits] r10647 - in trunk/openvas-manager: . src
scm-commit@wald.intevation.org
scm-commit at wald.intevation.org
Tue Mar 29 08:28:37 CEST 2011
Author: mattm
Date: 2011-03-29 08:28:33 +0200 (Tue, 29 Mar 2011)
New Revision: 10647
Modified:
trunk/openvas-manager/ChangeLog
trunk/openvas-manager/src/manage.c
trunk/openvas-manager/src/manage.h
trunk/openvas-manager/src/manage_sql.c
trunk/openvas-manager/src/manage_sql.h
trunk/openvas-manager/src/omp.c
Log:
Add OMP command CREATE_REPORT.
* src/manage_sql.c (create_current_report): New name for create_report.
(create_report): New function. Creates report from result list.
* src/manage.h: Add header accordingly.
(create_report_result_t): New type.
* src/manage_sql.h: Update header accordingly.
* src/manage.c (run_task): Rename create_report call.
* src/omp.c (help_text): Add new command.
(omp_parser_t): Add read_over flag.
(omp_parser_new): Init read_over.
(create_report_data_t): New type.
(create_report_data_reset): New function.
(command_data_t, client_state_t): Add new command elements.
(create_report_data): New variable.
(omp_xml_handle_start_element, omp_xml_handle_end_element)
(omp_xml_handle_text): Read over element if parser flag set. Add
CREATE_REPORT handling.
(buffer_results_xml): Only print notes and overrides if there's a task.
Modified: trunk/openvas-manager/ChangeLog
===================================================================
--- trunk/openvas-manager/ChangeLog 2011-03-28 17:09:51 UTC (rev 10646)
+++ trunk/openvas-manager/ChangeLog 2011-03-29 06:28:33 UTC (rev 10647)
@@ -1,3 +1,29 @@
+2011-03-29 Matthew Mundell <matthew.mundell at greenbone.net>
+
+ Add OMP command CREATE_REPORT.
+
+ * src/manage_sql.c (create_current_report): New name for create_report.
+ (create_report): New function. Creates report from result list.
+
+ * src/manage.h: Add header accordingly.
+ (create_report_result_t): New type.
+
+ * src/manage_sql.h: Update header accordingly.
+
+ * src/manage.c (run_task): Rename create_report call.
+
+ * src/omp.c (help_text): Add new command.
+ (omp_parser_t): Add read_over flag.
+ (omp_parser_new): Init read_over.
+ (create_report_data_t): New type.
+ (create_report_data_reset): New function.
+ (command_data_t, client_state_t): Add new command elements.
+ (create_report_data): New variable.
+ (omp_xml_handle_start_element, omp_xml_handle_end_element)
+ (omp_xml_handle_text): Read over element if parser flag set. Add
+ CREATE_REPORT handling.
+ (buffer_results_xml): Only print notes and overrides if there's a task.
+
2011-03-28 Michael Wiegand <michael.wiegand at greenbone.net>
* report_formats/sourcefire/create_report_import: Create a signature
Modified: trunk/openvas-manager/src/manage.c
===================================================================
--- trunk/openvas-manager/src/manage.c 2011-03-28 17:09:51 UTC (rev 10646)
+++ trunk/openvas-manager/src/manage.c 2011-03-29 06:28:33 UTC (rev 10647)
@@ -1838,7 +1838,7 @@
/* Create the report. */
- if (create_report (task, report_id, TASK_STATUS_REQUESTED))
+ if (create_current_report (task, report_id, TASK_STATUS_REQUESTED))
{
free (hosts);
set_task_run_status (task, run_status);
Modified: trunk/openvas-manager/src/manage.h
===================================================================
--- trunk/openvas-manager/src/manage.h 2011-03-28 17:09:51 UTC (rev 10646)
+++ trunk/openvas-manager/src/manage.h 2011-03-29 06:28:33 UTC (rev 10647)
@@ -621,6 +621,23 @@
make_result (task_t, const char*, const char*, const char*, const char*,
const char*, const char*);
+/**
+ * @brief A CREATE_REPORT result.
+ */
+typedef struct
+{
+ char *description; ///< Description of NVT.
+ char *host; ///< Host.
+ char *nvt_oid; ///< OID of NVT.
+ char *port; ///< Port.
+ char *subnet; ///< Subnet.
+ char *threat; ///< Threat.
+} create_report_result_t;
+
+int
+create_report (array_t*, const char *, const char *, array_t*, array_t*,
+ char **);
+
void
report_add_result (report_t, result_t);
Modified: trunk/openvas-manager/src/manage_sql.c
===================================================================
--- trunk/openvas-manager/src/manage_sql.c 2011-03-28 17:09:51 UTC (rev 10646)
+++ trunk/openvas-manager/src/manage_sql.c 2011-03-29 06:28:33 UTC (rev 10647)
@@ -8923,7 +8923,7 @@
* @return 0 success, -1 current_report is already set, -2 failed to generate ID.
*/
int
-create_report (task_t task, char **report_id, task_status_t status)
+create_current_report (task_t task, char **report_id, task_status_t status)
{
char *id;
@@ -8946,6 +8946,132 @@
}
/**
+ * @brief Create a report from an array of results.
+ *
+ * @param[in] results Array of create_report_result_t pointers.
+ * @param[in] task_name Name for container task.
+ * @param[in] task_comment Comment for container task.
+ * @param[in] host_starts Array of create_report_result_t pointers. Host
+ * name in host, time in description.
+ * @param[in] host_ends Array of create_report_result_t pointers. Host
+ * name in host, time in description.
+ * @param[out] report_id Report ID.
+ *
+ * @return 0 success, -1 error, -2 failed to generate ID, -3 task_name is NULL.
+ */
+int
+create_report (array_t *results, const char *task_name,
+ const char *task_comment, array_t *host_ends,
+ array_t *host_starts, char **report_id)
+{
+ int index;
+ create_report_result_t *result, *end, *start;
+ report_t report;
+ task_t task;
+
+ if (task_name == NULL)
+ return -3;
+
+ /* Generate report UUID. */
+
+ *report_id = openvas_uuid_make ();
+ if (*report_id == NULL) return -2;
+
+ /* Create the task. */
+
+ task = make_task (g_strdup (task_name),
+ 0,
+ task_comment ? g_strdup (task_comment) : NULL);
+
+ /* Create the report. */
+
+ report = make_report (task, *report_id, TASK_STATUS_DONE);
+
+ /* Add the results. */
+
+ index = 0;
+ while ((result = (create_report_result_t*) g_ptr_array_index (results,
+ index++)))
+ {
+ gchar *quoted_subnet, *quoted_host, *quoted_port, *quoted_nvt_oid;
+ gchar *quoted_description;
+
+ quoted_subnet = sql_quote (result->subnet ? result->subnet : "");
+ quoted_host = sql_quote (result->host ? result->host : "");
+ quoted_port = sql_quote (result->port ? result->port : "");
+ quoted_nvt_oid = sql_quote (result->nvt_oid ? result->nvt_oid : "");
+ quoted_description = sql_quote (result->description
+ ? result->description
+ : "");
+
+ sql ("INSERT INTO results"
+ " (uuid, task, subnet, host, port, nvt, type, description)"
+ " VALUES"
+ " (make_uuid (), 0, '%s', '%s', '%s', '%s', '%s', '%s');",
+ quoted_subnet,
+ quoted_host,
+ quoted_port,
+ quoted_nvt_oid,
+ result->threat
+ ? threat_message_type (result->threat)
+ : "Log Message",
+ quoted_description);
+
+ g_free (quoted_host);
+ g_free (quoted_subnet);
+ g_free (quoted_port);
+ g_free (quoted_nvt_oid);
+ g_free (quoted_description);
+
+ sql ("INSERT INTO report_results (report, result) VALUES (%llu, %llu);",
+ report,
+ sqlite3_last_insert_rowid (task_db));
+ }
+
+ index = 0;
+ while ((start = (create_report_result_t*) g_ptr_array_index (host_starts,
+ index++)))
+ if (start->host && start->description)
+ {
+ gchar *quoted_host, *quoted_time;
+
+ quoted_host = sql_quote (start->host);
+ quoted_time = sql_quote (start->description);
+
+ sql ("INSERT INTO report_hosts (report, host, start_time)"
+ " VALUES (%llu, '%s', '%s');",
+ report,
+ quoted_host,
+ quoted_time);
+
+ g_free (quoted_host);
+ g_free (quoted_time);
+ }
+
+ index = 0;
+ while ((end = (create_report_result_t*) g_ptr_array_index (host_ends,
+ index++)))
+ if (end->host && end->description)
+ {
+ gchar *quoted_host, *quoted_time;
+
+ quoted_host = sql_quote (end->host);
+ quoted_time = sql_quote (end->description);
+
+ sql ("UPDATE report_hosts SET end_time = '%s'"
+ " WHERE report = %llu AND host = '%s';",
+ quoted_time,
+ report,
+ quoted_host);
+
+ g_free (quoted_host);
+ g_free (quoted_time);
+ }
+
+ return 0;
+}
+
+/**
* @brief Return the UUID of a report.
*
* @param[in] report Report.
Modified: trunk/openvas-manager/src/manage_sql.h
===================================================================
--- trunk/openvas-manager/src/manage_sql.h 2011-03-28 17:09:51 UTC (rev 10646)
+++ trunk/openvas-manager/src/manage_sql.h 2011-03-29 06:28:33 UTC (rev 10647)
@@ -57,7 +57,7 @@
lsc_credential_t target_smb_lsc_credential (target_t);
const char *lsc_credential_iterator_password (iterator_t *);
-int create_report (task_t, char **, task_status_t);
+int create_current_report (task_t, char **, task_status_t);
char *escalator_data (escalator_t, const char *, const char *);
Modified: trunk/openvas-manager/src/omp.c
===================================================================
--- trunk/openvas-manager/src/omp.c 2011-03-28 17:09:51 UTC (rev 10646)
+++ trunk/openvas-manager/src/omp.c 2011-03-29 06:28:33 UTC (rev 10647)
@@ -377,6 +377,7 @@
" CREATE_NOTE Create a note.\n"
" CREATE_OVERRIDE Create an override.\n"
" CREATE_REPORT_FORMAT Create a report format.\n"
+" CREATE_REPORT Create a report.\n"
" CREATE_SCHEDULE Create a schedule.\n"
" CREATE_SLAVE Create a slave.\n"
" CREATE_TARGET Create a target.\n"
@@ -565,6 +566,7 @@
{
int (*client_writer) (void*); ///< Function to write to the client.
void* client_writer_data; ///< Argument to client_writer.
+ int read_over; ///< Read over any child elements.
} omp_parser_t;
/**
@@ -581,6 +583,7 @@
omp_parser_t *omp_parser = (omp_parser_t*) g_malloc (sizeof (omp_parser_t));
omp_parser->client_writer = write_to_client;
omp_parser->client_writer_data = write_to_client_data;
+ omp_parser->read_over = 0;
return omp_parser;
}
@@ -906,6 +909,69 @@
}
/**
+ * @brief Command data for the create_report command.
+ */
+typedef struct
+{
+ char *host_end; ///< End time for a host.
+ char *host_end_host; ///< Host name for end time.
+ array_t *host_ends; ///< All host ends.
+ char *host_start; ///< Start time for a host.
+ char *host_start_host; ///< Host name for start time.
+ array_t *host_starts; ///< All host starts.
+ char *result_description; ///< Description of NVT for current result.
+ char *result_host; ///< Host for current result.
+ char *result_nvt_oid; ///< OID of NVT for current result.
+ char *result_port; ///< Port for current result.
+ char *result_subnet; ///< Subnet for current result.
+ char *result_threat; ///< Message type for current result.
+ array_t *results; ///< All results.
+ char *task_comment; ///< Comment for container task.
+ char *task_name; ///< Name for container task.
+} create_report_data_t;
+
+/**
+ * @brief Reset command data.
+ *
+ * @param[in] data Command data.
+ */
+static void
+create_report_data_reset (create_report_data_t *data)
+{
+ free (data->host_end);
+ free (data->host_start);
+ free (data->result_description);
+ free (data->result_host);
+ free (data->result_nvt_oid);
+ free (data->result_port);
+ free (data->result_subnet);
+ free (data->result_threat);
+ if (data->results)
+ {
+ guint index = data->results->len;
+ while (index--)
+ {
+ create_report_result_t *result;
+ result = (create_report_result_t*) g_ptr_array_index (data->results,
+ index);
+ if (result)
+ {
+ free (result->host);
+ free (result->description);
+ free (result->nvt_oid);
+ free (result->port);
+ free (result->subnet);
+ }
+ }
+ array_free (data->results);
+ }
+ free (data->task_comment);
+ free (data->task_name);
+
+ memset (data, 0, sizeof (create_report_data_t));
+}
+
+/**
* @brief Command data for the create_report_format command.
*/
typedef struct
@@ -2375,6 +2441,7 @@
create_lsc_credential_data_t create_lsc_credential; ///< create_lsc_credential
create_note_data_t create_note; ///< create_note
create_override_data_t create_override; ///< create_override
+ create_report_data_t create_report; ///< create_report
create_report_format_data_t create_report_format; ///< create_report_format
create_schedule_data_t create_schedule; ///< create_schedule
create_slave_data_t create_slave; ///< create_slave
@@ -2483,6 +2550,12 @@
= (create_override_data_t*) &(command_data.create_override);
/**
+ * @brief Parser callback data for CREATE_REPORT.
+ */
+create_report_data_t *create_report_data
+ = (create_report_data_t*) &(command_data.create_report);
+
+/**
* @brief Parser callback data for CREATE_REPORT_FORMAT.
*/
create_report_format_data_t *create_report_format_data
@@ -2931,6 +3004,44 @@
CLIENT_CREATE_OVERRIDE_TASK,
CLIENT_CREATE_OVERRIDE_TEXT,
CLIENT_CREATE_OVERRIDE_THREAT,
+ /* CREATE_REPORT. */
+ CLIENT_CREATE_REPORT,
+ CLIENT_CREATE_REPORT_REPORT,
+ CLIENT_CREATE_REPORT_RR,
+ CLIENT_CREATE_REPORT_RR_FILTERS,
+ CLIENT_CREATE_REPORT_RR_HOST,
+ CLIENT_CREATE_REPORT_RR_HOST_END,
+ CLIENT_CREATE_REPORT_RR_HOST_END_HOST,
+ CLIENT_CREATE_REPORT_RR_HOST_START,
+ CLIENT_CREATE_REPORT_RR_HOST_START_HOST,
+ CLIENT_CREATE_REPORT_RR_PORTS,
+ CLIENT_CREATE_REPORT_RR_REPORT_FORMAT,
+ CLIENT_CREATE_REPORT_RR_RESULTS,
+ CLIENT_CREATE_REPORT_RR_RESULTS_RESULT,
+ CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_DESCRIPTION,
+ CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_HOST,
+ CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NOTES,
+ CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT,
+ CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT_BID,
+ CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT_CVE,
+ CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT_CVSS_BASE,
+ CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT_NAME,
+ CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT_RISK_FACTOR,
+ CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_ORIGINAL_THREAT,
+ CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_OVERRIDES,
+ CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_PORT,
+ CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_SUBNET,
+ CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_THREAT,
+ CLIENT_CREATE_REPORT_RR_RESULT_COUNT,
+ CLIENT_CREATE_REPORT_RR_SCAN_RUN_STATUS,
+ CLIENT_CREATE_REPORT_RR_SCAN_END,
+ CLIENT_CREATE_REPORT_RR_SCAN_START,
+ CLIENT_CREATE_REPORT_RR_SORT,
+ CLIENT_CREATE_REPORT_RR_TASK,
+ CLIENT_CREATE_REPORT_TASK,
+ CLIENT_CREATE_REPORT_TASK_NAME,
+ CLIENT_CREATE_REPORT_TASK_COMMENT,
+ /* CREATE_REPORT_FORMAT. */
CLIENT_CREATE_REPORT_FORMAT,
/* get_report_formats (GRF) is used for report format export. CLIENT_CRF is
* for CLIENT_CREATE_REPORT_FORMAT. */
@@ -3497,7 +3608,9 @@
tracef (" XML start: %s (%i)\n", element_name, client_state);
- switch (client_state)
+ if (omp_parser->read_over)
+ omp_parser->read_over++;
+ else switch (client_state)
{
case CLIENT_TOP:
if (strcasecmp ("GET_VERSION", element_name) == 0)
@@ -3600,6 +3713,8 @@
set_client_state (CLIENT_CREATE_NOTE);
else if (strcasecmp ("CREATE_OVERRIDE", element_name) == 0)
set_client_state (CLIENT_CREATE_OVERRIDE);
+ else if (strcasecmp ("CREATE_REPORT", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT);
else if (strcasecmp ("CREATE_REPORT_FORMAT", element_name) == 0)
set_client_state (CLIENT_CREATE_REPORT_FORMAT);
else if (strcasecmp ("CREATE_SLAVE", element_name) == 0)
@@ -6025,6 +6140,292 @@
}
break;
+ case CLIENT_CREATE_REPORT:
+ if (strcasecmp ("REPORT", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_REPORT);
+ else if (strcasecmp ("TASK", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_TASK);
+ else
+ {
+ if (send_element_error_to_client ("create_report",
+ element_name,
+ write_to_client,
+ write_to_client_data))
+ {
+ error_send_to_client (error);
+ return;
+ }
+ set_client_state (CLIENT_AUTHENTIC);
+ g_set_error (error,
+ G_MARKUP_ERROR,
+ G_MARKUP_ERROR_UNKNOWN_ELEMENT,
+ "Error");
+ }
+ break;
+
+ case CLIENT_CREATE_REPORT_REPORT:
+ if (strcasecmp ("REPORT", element_name) == 0)
+ {
+ create_report_data->host_ends = make_array ();
+ create_report_data->host_starts = make_array ();
+ create_report_data->results = make_array ();
+ set_client_state (CLIENT_CREATE_REPORT_RR);
+ }
+ else
+ {
+ if (send_element_error_to_client ("create_report",
+ element_name,
+ write_to_client,
+ write_to_client_data))
+ {
+ error_send_to_client (error);
+ return;
+ }
+ set_client_state (CLIENT_AUTHENTIC);
+ g_set_error (error,
+ G_MARKUP_ERROR,
+ G_MARKUP_ERROR_UNKNOWN_ELEMENT,
+ "Error");
+ }
+ break;
+
+ case CLIENT_CREATE_REPORT_RR:
+ if (strcasecmp ("FILTERS", element_name) == 0)
+ {
+ omp_parser->read_over = 1;
+ set_client_state (CLIENT_CREATE_REPORT_RR_FILTERS);
+ }
+ else if (strcasecmp ("HOST", element_name) == 0)
+ {
+ omp_parser->read_over = 1;
+ set_client_state (CLIENT_CREATE_REPORT_RR_HOST);
+ }
+ else if (strcasecmp ("HOST_END", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_RR_HOST_END);
+ else if (strcasecmp ("HOST_START", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_RR_HOST_START);
+ else if (strcasecmp ("PORTS", element_name) == 0)
+ {
+ omp_parser->read_over = 1;
+ set_client_state (CLIENT_CREATE_REPORT_RR_PORTS);
+ }
+ else if (strcasecmp ("REPORT_FORMAT", element_name) == 0)
+ {
+ omp_parser->read_over = 1;
+ set_client_state (CLIENT_CREATE_REPORT_RR_REPORT_FORMAT);
+ }
+ else if (strcasecmp ("RESULTS", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS);
+ else if (strcasecmp ("RESULT_COUNT", element_name) == 0)
+ {
+ omp_parser->read_over = 1;
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULT_COUNT);
+ }
+ else if (strcasecmp ("SCAN_RUN_STATUS", element_name) == 0)
+ {
+ omp_parser->read_over = 1;
+ set_client_state
+ (CLIENT_CREATE_REPORT_RR_SCAN_RUN_STATUS);
+ }
+ else if (strcasecmp ("SCAN_END", element_name) == 0)
+ {
+ omp_parser->read_over = 1;
+ set_client_state (CLIENT_CREATE_REPORT_RR_SCAN_END);
+ }
+ else if (strcasecmp ("SCAN_START", element_name) == 0)
+ {
+ omp_parser->read_over = 1;
+ set_client_state (CLIENT_CREATE_REPORT_RR_SCAN_START);
+ }
+ else if (strcasecmp ("SORT", element_name) == 0)
+ {
+ omp_parser->read_over = 1;
+ set_client_state (CLIENT_CREATE_REPORT_RR_SORT);
+ }
+ else if (strcasecmp ("TASK", element_name) == 0)
+ {
+ omp_parser->read_over = 1;
+ set_client_state (CLIENT_CREATE_REPORT_RR_TASK);
+ }
+ else
+ {
+ if (send_element_error_to_client ("create_report",
+ element_name,
+ write_to_client,
+ write_to_client_data))
+ {
+ error_send_to_client (error);
+ return;
+ }
+ set_client_state (CLIENT_AUTHENTIC);
+ g_set_error (error,
+ G_MARKUP_ERROR,
+ G_MARKUP_ERROR_UNKNOWN_ELEMENT,
+ "Error");
+ }
+ break;
+
+ case CLIENT_CREATE_REPORT_RR_HOST_END:
+ if (strcasecmp ("HOST", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_RR_HOST_END_HOST);
+ else
+ {
+ if (send_element_error_to_client ("create_report",
+ element_name,
+ write_to_client,
+ write_to_client_data))
+ {
+ error_send_to_client (error);
+ return;
+ }
+ set_client_state (CLIENT_AUTHENTIC);
+ g_set_error (error,
+ G_MARKUP_ERROR,
+ G_MARKUP_ERROR_UNKNOWN_ELEMENT,
+ "Error");
+ }
+ break;
+
+ case CLIENT_CREATE_REPORT_RR_HOST_START:
+ if (strcasecmp ("HOST", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_RR_HOST_START_HOST);
+ else
+ {
+ if (send_element_error_to_client ("create_report",
+ element_name,
+ write_to_client,
+ write_to_client_data))
+ {
+ error_send_to_client (error);
+ return;
+ }
+ set_client_state (CLIENT_AUTHENTIC);
+ g_set_error (error,
+ G_MARKUP_ERROR,
+ G_MARKUP_ERROR_UNKNOWN_ELEMENT,
+ "Error");
+ }
+ break;
+
+ case CLIENT_CREATE_REPORT_RR_RESULTS:
+ if (strcasecmp ("RESULT", element_name) == 0)
+ set_client_state
+ (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT);
+ else
+ {
+ if (send_element_error_to_client ("create_report",
+ element_name,
+ write_to_client,
+ write_to_client_data))
+ {
+ error_send_to_client (error);
+ return;
+ }
+ set_client_state (CLIENT_AUTHENTIC);
+ g_set_error (error,
+ G_MARKUP_ERROR,
+ G_MARKUP_ERROR_UNKNOWN_ELEMENT,
+ "Error");
+ }
+ break;
+
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT:
+ if (strcasecmp ("DESCRIPTION", element_name) == 0)
+ set_client_state
+ (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_DESCRIPTION);
+ else if (strcasecmp ("HOST", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_HOST);
+ else if (strcasecmp ("NOTES", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NOTES);
+ else if (strcasecmp ("NVT", element_name) == 0)
+ {
+ append_attribute (attribute_names, attribute_values, "oid",
+ &create_report_data->result_nvt_oid);
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT);
+ }
+ else if (strcasecmp ("ORIGINAL_THREAT", element_name) == 0)
+ set_client_state
+ (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_ORIGINAL_THREAT);
+ else if (strcasecmp ("OVERRIDES", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_OVERRIDES);
+ else if (strcasecmp ("PORT", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_PORT);
+ else if (strcasecmp ("SUBNET", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_SUBNET);
+ else if (strcasecmp ("THREAT", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_THREAT);
+ else
+ {
+ if (send_element_error_to_client ("create_report",
+ element_name,
+ write_to_client,
+ write_to_client_data))
+ {
+ error_send_to_client (error);
+ return;
+ }
+ set_client_state (CLIENT_AUTHENTIC);
+ g_set_error (error,
+ G_MARKUP_ERROR,
+ G_MARKUP_ERROR_UNKNOWN_ELEMENT,
+ "Error");
+ }
+ break;
+
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT:
+ if (strcasecmp ("BID", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT_BID);
+ else if (strcasecmp ("CVE", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT_CVE);
+ else if (strcasecmp ("CVSS_BASE", element_name) == 0)
+ set_client_state
+ (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT_CVSS_BASE);
+ else if (strcasecmp ("NAME", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT_NAME);
+ else if (strcasecmp ("RISK_FACTOR", element_name) == 0)
+ set_client_state
+ (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT_RISK_FACTOR);
+ else
+ {
+ if (send_element_error_to_client ("create_report",
+ element_name,
+ write_to_client,
+ write_to_client_data))
+ {
+ error_send_to_client (error);
+ return;
+ }
+ set_client_state (CLIENT_AUTHENTIC);
+ g_set_error (error,
+ G_MARKUP_ERROR,
+ G_MARKUP_ERROR_UNKNOWN_ELEMENT,
+ "Error");
+ }
+ break;
+
+ case CLIENT_CREATE_REPORT_TASK:
+ if (strcasecmp ("COMMENT", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_TASK_COMMENT);
+ else if (strcasecmp ("NAME", element_name) == 0)
+ set_client_state (CLIENT_CREATE_REPORT_TASK_NAME);
+ else
+ {
+ if (send_element_error_to_client ("create_report",
+ element_name,
+ write_to_client,
+ write_to_client_data))
+ {
+ error_send_to_client (error);
+ return;
+ }
+ set_client_state (CLIENT_AUTHENTIC);
+ g_set_error (error,
+ G_MARKUP_ERROR,
+ G_MARKUP_ERROR_UNKNOWN_ELEMENT,
+ "Error");
+ }
+ break;
+
case CLIENT_CREATE_REPORT_FORMAT:
if (strcasecmp ("GET_REPORT_FORMATS_RESPONSE", element_name) == 0)
{
@@ -7694,45 +8095,45 @@
if (include_notes)
{
- iterator_t notes;
-
- assert (task);
-
g_string_append (buffer, "<notes>");
- init_note_iterator (¬es,
- 0,
- 0,
- result_iterator_result (results),
- task,
- 0, /* Most recent first. */
- "creation_time");
- buffer_notes_xml (buffer, ¬es, include_notes_details, 0);
- cleanup_iterator (¬es);
+ if (task)
+ {
+ iterator_t notes;
+ init_note_iterator (¬es,
+ 0,
+ 0,
+ result_iterator_result (results),
+ task,
+ 0, /* Most recent first. */
+ "creation_time");
+ buffer_notes_xml (buffer, ¬es, include_notes_details, 0);
+ cleanup_iterator (¬es);
+ }
g_string_append (buffer, "</notes>");
}
if (include_overrides)
{
- iterator_t overrides;
-
- assert (task);
-
g_string_append (buffer, "<overrides>");
- init_override_iterator (&overrides,
- 0,
- 0,
- result_iterator_result (results),
- task,
- 0, /* Most recent first. */
- "creation_time");
- buffer_overrides_xml (buffer,
- &overrides,
- include_overrides_details,
- 0);
- cleanup_iterator (&overrides);
+ if (task)
+ {
+ iterator_t overrides;
+ init_override_iterator (&overrides,
+ 0,
+ 0,
+ result_iterator_result (results),
+ task,
+ 0, /* Most recent first. */
+ "creation_time");
+ buffer_overrides_xml (buffer,
+ &overrides,
+ include_overrides_details,
+ 0);
+ cleanup_iterator (&overrides);
+ }
g_string_append (buffer, "</overrides>");
}
@@ -7839,7 +8240,9 @@
tracef (" XML end: %s\n", element_name);
- switch (client_state)
+ if (omp_parser->read_over > 1)
+ omp_parser->read_over--;
+ else switch (client_state)
{
case CLIENT_TOP:
assert (0);
@@ -11434,6 +11837,284 @@
set_client_state (CLIENT_CREATE_OVERRIDE);
break;
+ case CLIENT_CREATE_REPORT:
+ {
+ char *uuid;
+
+ assert (strcasecmp ("CREATE_REPORT", element_name) == 0);
+
+ array_terminate (create_report_data->results);
+ array_terminate (create_report_data->host_ends);
+ array_terminate (create_report_data->host_starts);
+
+ if (create_report_data->results == NULL)
+ SEND_TO_CLIENT_OR_FAIL
+ (XML_ERROR_SYNTAX ("create_report",
+ "CREATE_REPORT requires a REPORT element"));
+ else switch (create_report
+ (create_report_data->results,
+ create_report_data->task_name,
+ create_report_data->task_comment,
+ create_report_data->host_starts,
+ create_report_data->host_ends,
+ &uuid))
+ {
+ case -1:
+ case -2:
+ SEND_TO_CLIENT_OR_FAIL
+ (XML_INTERNAL_ERROR ("create_report"));
+ g_log ("event report", G_LOG_LEVEL_MESSAGE,
+ "Report could not be created");
+ break;
+ case -3:
+ SEND_TO_CLIENT_OR_FAIL
+ (XML_ERROR_SYNTAX ("create_report",
+ "CREATE_REPORT TASK_NAME is required"));
+ g_log ("event report", G_LOG_LEVEL_MESSAGE,
+ "Report could not be created");
+ break;
+ default:
+ {
+ SENDF_TO_CLIENT_OR_FAIL
+ (XML_OK_CREATED_ID ("create_report"),
+ uuid);
+ g_log ("event report", G_LOG_LEVEL_MESSAGE,
+ "Report %s has been created", uuid);
+ free (uuid);
+ break;
+ }
+ }
+
+ create_report_data_reset (create_report_data);
+ set_client_state (CLIENT_AUTHENTIC);
+ break;
+ }
+ case CLIENT_CREATE_REPORT_REPORT:
+ assert (strcasecmp ("REPORT", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT);
+ break;
+ case CLIENT_CREATE_REPORT_RR:
+ assert (strcasecmp ("REPORT", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_REPORT);
+ break;
+ case CLIENT_CREATE_REPORT_RR_FILTERS:
+ assert (strcasecmp ("FILTERS", element_name) == 0);
+ omp_parser->read_over = 0;
+ set_client_state (CLIENT_CREATE_REPORT_RR);
+ break;
+ case CLIENT_CREATE_REPORT_RR_HOST:
+ assert (strcasecmp ("HOST", element_name) == 0);
+ omp_parser->read_over = 0;
+ set_client_state (CLIENT_CREATE_REPORT_RR);
+ break;
+ case CLIENT_CREATE_REPORT_RR_HOST_END:
+ assert (strcasecmp ("HOST_END", element_name) == 0);
+
+ if (create_report_data->host_end_host)
+ {
+ create_report_result_t *result;
+
+ assert (create_report_data->host_ends);
+ assert (create_report_data->host_end);
+ assert (create_report_data->host_end_host);
+
+ result = g_malloc (sizeof (create_report_result_t));
+ result->description = create_report_data->host_end;
+ result->host = create_report_data->host_end_host;
+
+ array_add (create_report_data->host_ends, result);
+
+ create_report_data->host_end = NULL;
+ create_report_data->host_end_host = NULL;
+ }
+ else
+ openvas_free_string_var (&create_report_data->host_end);
+
+ set_client_state (CLIENT_CREATE_REPORT_RR);
+ break;
+ case CLIENT_CREATE_REPORT_RR_HOST_START:
+ assert (strcasecmp ("HOST_START", element_name) == 0);
+
+ if (create_report_data->host_start_host)
+ {
+ create_report_result_t *result;
+
+ assert (create_report_data->host_starts);
+ assert (create_report_data->host_start);
+ assert (create_report_data->host_start_host);
+
+ result = g_malloc (sizeof (create_report_result_t));
+ result->description = create_report_data->host_start;
+ result->host = create_report_data->host_start_host;
+
+ array_add (create_report_data->host_starts, result);
+
+ create_report_data->host_start = NULL;
+ create_report_data->host_start_host = NULL;
+ }
+ else
+ openvas_free_string_var (&create_report_data->host_start);
+
+ set_client_state (CLIENT_CREATE_REPORT_RR);
+ break;
+ case CLIENT_CREATE_REPORT_RR_PORTS:
+ assert (strcasecmp ("PORTS", element_name) == 0);
+ omp_parser->read_over = 0;
+ set_client_state (CLIENT_CREATE_REPORT_RR);
+ break;
+ case CLIENT_CREATE_REPORT_RR_REPORT_FORMAT:
+ assert (strcasecmp ("REPORT_FORMAT", element_name) == 0);
+ omp_parser->read_over = 0;
+ set_client_state (CLIENT_CREATE_REPORT_RR);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULTS:
+ assert (strcasecmp ("RESULTS", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR);
+ break;
+ case CLIENT_CREATE_REPORT_RR_SCAN_RUN_STATUS:
+ assert (strcasecmp ("SCAN_RUN_STATUS", element_name) == 0);
+ omp_parser->read_over = 0;
+ set_client_state (CLIENT_CREATE_REPORT_RR);
+ break;
+ case CLIENT_CREATE_REPORT_RR_SCAN_END:
+ assert (strcasecmp ("SCAN_END", element_name) == 0);
+ omp_parser->read_over = 0;
+ set_client_state (CLIENT_CREATE_REPORT_RR);
+ break;
+ case CLIENT_CREATE_REPORT_RR_SCAN_START:
+ assert (strcasecmp ("SCAN_START", element_name) == 0);
+ omp_parser->read_over = 0;
+ set_client_state (CLIENT_CREATE_REPORT_RR);
+ break;
+ case CLIENT_CREATE_REPORT_RR_SORT:
+ assert (strcasecmp ("SORT", element_name) == 0);
+ omp_parser->read_over = 0;
+ set_client_state (CLIENT_CREATE_REPORT_RR);
+ break;
+ case CLIENT_CREATE_REPORT_RR_TASK:
+ assert (strcasecmp ("TASK", element_name) == 0);
+ omp_parser->read_over = 0;
+ set_client_state (CLIENT_CREATE_REPORT_RR);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULT_COUNT:
+ assert (strcasecmp ("RESULT_COUNT", element_name) == 0);
+ omp_parser->read_over = 0;
+ set_client_state (CLIENT_CREATE_REPORT_RR);
+ break;
+
+ case CLIENT_CREATE_REPORT_RR_HOST_END_HOST:
+ assert (strcasecmp ("HOST", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR_HOST_END);
+ break;
+ case CLIENT_CREATE_REPORT_RR_HOST_START_HOST:
+ assert (strcasecmp ("HOST", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR_HOST_START);
+ break;
+
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT:
+ {
+ create_report_result_t *result;
+
+ assert (strcasecmp ("RESULT", element_name) == 0);
+ assert (create_report_data->results);
+ assert (create_report_data->result_description);
+ assert (create_report_data->result_host);
+ assert (create_report_data->result_nvt_oid);
+ assert (create_report_data->result_port);
+ assert (create_report_data->result_subnet);
+ assert (create_report_data->result_threat);
+
+ result = g_malloc (sizeof (create_report_result_t));
+ result->description = create_report_data->result_description;
+ result->host = create_report_data->result_host;
+ result->nvt_oid = create_report_data->result_nvt_oid;
+ result->port = create_report_data->result_port;
+ result->subnet = create_report_data->result_subnet;
+ result->threat = create_report_data->result_threat;
+
+ array_add (create_report_data->results, result);
+
+ create_report_data->result_description = NULL;
+ create_report_data->result_host = NULL;
+ create_report_data->result_nvt_oid = NULL;
+ create_report_data->result_port = NULL;
+ create_report_data->result_subnet = NULL;
+ create_report_data->result_threat = NULL;
+
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS);
+ break;
+ }
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_DESCRIPTION:
+ assert (strcasecmp ("DESCRIPTION", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_HOST:
+ assert (strcasecmp ("HOST", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NOTES:
+ assert (strcasecmp ("NOTES", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT:
+ assert (strcasecmp ("NVT", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_ORIGINAL_THREAT:
+ assert (strcasecmp ("ORIGINAL_THREAT", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_OVERRIDES:
+ assert (strcasecmp ("OVERRIDES", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_PORT:
+ assert (strcasecmp ("PORT", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_SUBNET:
+ assert (strcasecmp ("SUBNET", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_THREAT:
+ assert (strcasecmp ("THREAT", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT);
+ break;
+
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT_BID:
+ assert (strcasecmp ("BID", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT_CVE:
+ assert (strcasecmp ("CVE", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT_CVSS_BASE:
+ assert (strcasecmp ("CVSS_BASE", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT_NAME:
+ assert (strcasecmp ("NAME", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT_RISK_FACTOR:
+ assert (strcasecmp ("RISK_FACTOR", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_NVT);
+ break;
+
+ case CLIENT_CREATE_REPORT_TASK:
+ assert (strcasecmp ("TASK", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT);
+ break;
+ case CLIENT_CREATE_REPORT_TASK_COMMENT:
+ assert (strcasecmp ("COMMENT", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_TASK);
+ break;
+ case CLIENT_CREATE_REPORT_TASK_NAME:
+ assert (strcasecmp ("NAME", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_TASK);
+ break;
+
case CLIENT_CREATE_REPORT_FORMAT:
{
report_format_t new_report_format;
@@ -15769,6 +16450,64 @@
openvas_append_text (&create_override_data->threat, text, text_len);
break;
+ case CLIENT_CREATE_REPORT_RR_HOST_END:
+ openvas_append_text (&create_report_data->host_end,
+ text,
+ text_len);
+ break;
+ case CLIENT_CREATE_REPORT_RR_HOST_END_HOST:
+ openvas_append_text (&create_report_data->host_end_host,
+ text,
+ text_len);
+ break;
+ case CLIENT_CREATE_REPORT_RR_HOST_START:
+ openvas_append_text (&create_report_data->host_start,
+ text,
+ text_len);
+ break;
+ case CLIENT_CREATE_REPORT_RR_HOST_START_HOST:
+ openvas_append_text (&create_report_data->host_start_host,
+ text,
+ text_len);
+ break;
+
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_DESCRIPTION:
+ openvas_append_text (&create_report_data->result_description,
+ text,
+ text_len);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_HOST:
+ openvas_append_text (&create_report_data->result_host,
+ text,
+ text_len);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_PORT:
+ openvas_append_text (&create_report_data->result_port,
+ text,
+ text_len);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_SUBNET:
+ openvas_append_text (&create_report_data->result_subnet,
+ text,
+ text_len);
+ break;
+ case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT_THREAT:
+ openvas_append_text (&create_report_data->result_threat,
+ text,
+ text_len);
+ break;
+
+ case CLIENT_CREATE_REPORT_TASK_NAME:
+ openvas_append_text (&create_report_data->task_name,
+ text,
+ text_len);
+ break;
+ case CLIENT_CREATE_REPORT_TASK_COMMENT:
+ openvas_append_text (&create_report_data->task_comment,
+ text,
+ text_len);
+ break;
+
case CLIENT_CRF_GRFR_REPORT_FORMAT_CONTENT_TYPE:
openvas_append_text (&create_report_format_data->content_type,
text,
More information about the Openvas-commits
mailing list