[Openvas-commits] r13772 - in trunk/openvas-manager: . src
scm-commit at wald.intevation.org
scm-commit at wald.intevation.org
Mon Jul 23 16:38:29 CEST 2012
Author: mattm
Date: 2012-07-23 16:38:28 +0200 (Mon, 23 Jul 2012)
New Revision: 13772
Modified:
trunk/openvas-manager/ChangeLog
trunk/openvas-manager/src/manage.h
trunk/openvas-manager/src/manage_sql.c
trunk/openvas-manager/src/omp.c
Log:
Import host details when importing reports.
* src/manage_sql.c (host_detail_free): New function.
(create_report): Add details arg.
* src/manage.h: Update headers accordingly.
(host_detail_t): New type.
* src/omp.c (create_report_data_t, create_report_data_reset)
(client_state_t): Add host details.
(omp_xml_handle_start_element, omp_xml_handle_end_element)
(omp_xml_handle_text): Parse and store host details for CREATE_REPORT,
and hand over to create_report function.
Modified: trunk/openvas-manager/ChangeLog
===================================================================
--- trunk/openvas-manager/ChangeLog 2012-07-23 13:53:17 UTC (rev 13771)
+++ trunk/openvas-manager/ChangeLog 2012-07-23 14:38:28 UTC (rev 13772)
@@ -1,3 +1,19 @@
+2012-07-23 Matthew Mundell <matthew.mundell at greenbone.net>
+
+ Import host details when importing reports.
+
+ * src/manage_sql.c (host_detail_free): New function.
+ (create_report): Add details arg.
+
+ * src/manage.h: Update headers accordingly.
+ (host_detail_t): New type.
+
+ * src/omp.c (create_report_data_t, create_report_data_reset)
+ (client_state_t): Add host details.
+ (omp_xml_handle_start_element, omp_xml_handle_end_element)
+ (omp_xml_handle_text): Parse and store host details for CREATE_REPORT,
+ and hand over to create_report function.
+
2012-07-19 Matthew Mundell <matthew.mundell at greenbone.net>
* src/manage_sql.c (split_filter, manage_filter_controls): When "rows" is
Modified: trunk/openvas-manager/src/manage.h
===================================================================
--- trunk/openvas-manager/src/manage.h 2012-07-23 13:53:17 UTC (rev 13771)
+++ trunk/openvas-manager/src/manage.h 2012-07-23 14:38:28 UTC (rev 13772)
@@ -713,9 +713,25 @@
char *threat; ///< Threat.
} create_report_result_t;
+/**
+ * @brief A host detail for create_report.
+ */
+typedef struct
+{
+ char *ip; ///< IP.
+ char *name; ///< Detail name.
+ char *source_desc; ///< Source description.
+ char *source_name; ///< Source name.
+ char *source_type; ///< Source type.
+ char *value; ///< Detail value.
+} host_detail_t;
+
+void
+host_detail_free (host_detail_t *);
+
int
create_report (array_t*, const char *, const char *, const char *, const char *,
- const char *, array_t*, array_t*, char **);
+ const char *, array_t*, 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 2012-07-23 13:53:17 UTC (rev 13771)
+++ trunk/openvas-manager/src/manage_sql.c 2012-07-23 14:38:28 UTC (rev 13772)
@@ -12704,6 +12704,22 @@
}
/**
+ * @brief Free a host detail.
+ *
+ * @param[in] detail Host detail.
+ */
+void
+host_detail_free (host_detail_t *detail)
+{
+ g_free (detail->ip);
+ g_free (detail->name);
+ g_free (detail->source_desc);
+ g_free (detail->source_name);
+ g_free (detail->source_type);
+ g_free (detail->value);
+}
+
+/**
* @brief Create a report from an array of results.
*
* @param[in] results Array of create_report_result_t pointers.
@@ -12716,6 +12732,7 @@
* 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[in] details Array of host_detail_t pointers.
* @param[out] report_id Report ID.
*
* @return 0 success, -1 error, -2 failed to generate ID, -3 task_name is NULL,
@@ -12725,13 +12742,14 @@
create_report (array_t *results, const char *task_id, const char *task_name,
const char *task_comment, const char *scan_start,
const char *scan_end, array_t *host_starts,
- array_t *host_ends, char **report_id)
+ array_t *host_ends, array_t *details, char **report_id)
{
int index;
create_report_result_t *result, *end, *start;
report_t report;
task_t task;
pid_t pid;
+ host_detail_t *detail;
if (task_id == NULL && task_name == NULL)
return -3;
@@ -12900,6 +12918,43 @@
g_free (quoted_host);
}
+ index = 0;
+ while ((detail = (host_detail_t*) g_ptr_array_index (details, index++)))
+ if (detail->ip && detail->name)
+ {
+ gchar *quoted_ip, *quoted_source_type, *quoted_source_name;
+ gchar *quoted_source_desc, *quoted_name, *quoted_value;
+
+ quoted_ip = sql_quote (detail->ip);
+ quoted_source_type = sql_quote (detail->source_type ?: "");
+ quoted_source_name = sql_quote (detail->source_name ?: "");
+ quoted_source_desc = sql_quote (detail->source_desc ?: "");
+ quoted_name = sql_quote (detail->name);
+ quoted_value = sql_quote (detail->value ?: "");
+
+ sql ("INSERT INTO report_host_details"
+ " (report_host, source_type, source_name, source_description,"
+ " name, value)"
+ " VALUES"
+ " ((SELECT ROWID FROM report_hosts"
+ " WHERE report = %llu AND host = '%s'),"
+ " '%s', '%s', '%s', '%s', '%s');",
+ report,
+ quoted_ip,
+ quoted_source_type,
+ quoted_source_name,
+ quoted_source_desc,
+ quoted_name,
+ quoted_value);
+
+ g_free (quoted_ip);
+ g_free (quoted_source_type);
+ g_free (quoted_source_name);
+ g_free (quoted_source_desc);
+ g_free (quoted_name);
+ g_free (quoted_value);
+ }
+
#if 0
sql ("COMMIT;");
#endif
Modified: trunk/openvas-manager/src/omp.c
===================================================================
--- trunk/openvas-manager/src/omp.c 2012-07-23 13:53:17 UTC (rev 13771)
+++ trunk/openvas-manager/src/omp.c 2012-07-23 14:38:28 UTC (rev 13772)
@@ -1099,12 +1099,19 @@
*/
typedef struct
{
+ char *detail_name; ///< Name of current host detail.
+ char *detail_value; ///< Value of current host detail.
+ char *detail_source_name; ///< Name of source of current host detail.
+ char *detail_source_type; ///< Type of source of current host detail.
+ char *detail_source_desc; ///< Description of source of current detail.
+ array_t *details; ///< Host details.
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 *ip; ///< Current host for host details.
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.
@@ -1129,8 +1136,21 @@
static void
create_report_data_reset (create_report_data_t *data)
{
+ if (data->details)
+ {
+ guint index = data->details->len;
+ while (index--)
+ {
+ host_detail_t *detail;
+ detail = (host_detail_t*) g_ptr_array_index (data->details, index);
+ if (detail)
+ host_detail_free (detail);
+ }
+ array_free (data->details);
+ }
free (data->host_end);
free (data->host_start);
+ free (data->ip);
free (data->result_description);
free (data->result_host);
free (data->result_nvt_oid);
@@ -3617,7 +3637,18 @@
CLIENT_CREATE_REPORT_REPORT,
CLIENT_CREATE_REPORT_RR,
CLIENT_CREATE_REPORT_RR_FILTERS,
- CLIENT_CREATE_REPORT_RR_HOST,
+ /* RR_H is for RR_HOST because it clashes with entities like HOST_START. */
+ CLIENT_CREATE_REPORT_RR_H,
+ CLIENT_CREATE_REPORT_RR_H_DETAIL,
+ CLIENT_CREATE_REPORT_RR_H_DETAIL_NAME,
+ CLIENT_CREATE_REPORT_RR_H_DETAIL_SOURCE,
+ CLIENT_CREATE_REPORT_RR_H_DETAIL_SOURCE_DESC,
+ CLIENT_CREATE_REPORT_RR_H_DETAIL_SOURCE_NAME,
+ CLIENT_CREATE_REPORT_RR_H_DETAIL_SOURCE_TYPE,
+ CLIENT_CREATE_REPORT_RR_H_DETAIL_VALUE,
+ CLIENT_CREATE_REPORT_RR_H_END,
+ CLIENT_CREATE_REPORT_RR_H_IP,
+ CLIENT_CREATE_REPORT_RR_H_START,
CLIENT_CREATE_REPORT_RR_HOST_COUNT,
CLIENT_CREATE_REPORT_RR_HOST_END,
CLIENT_CREATE_REPORT_RR_HOST_END_HOST,
@@ -6161,6 +6192,7 @@
{
/* Assume the report is immediately inside the CREATE_REPORT. */
create_report_data->wrapper = 0;
+ create_report_data->details = make_array ();
create_report_data->host_ends = make_array ();
create_report_data->host_starts = make_array ();
create_report_data->results = make_array ();
@@ -6178,6 +6210,7 @@
case CLIENT_CREATE_REPORT_REPORT:
if (strcasecmp ("REPORT", element_name) == 0)
{
+ create_report_data->details = make_array ();
create_report_data->host_ends = make_array ();
create_report_data->host_starts = make_array ();
create_report_data->results = make_array ();
@@ -6193,8 +6226,7 @@
}
else if (strcasecmp ("HOST", element_name) == 0)
{
- omp_parser->read_over = 1;
- set_client_state (CLIENT_CREATE_REPORT_RR_HOST);
+ set_client_state (CLIENT_CREATE_REPORT_RR_H);
}
else if (strcasecmp ("HOST_COUNT", element_name) == 0)
{
@@ -6263,6 +6295,55 @@
set_client_state (CLIENT_CREATE_REPORT_RR_HOST_START_HOST);
ELSE_ERROR ("create_report");
+ case CLIENT_CREATE_REPORT_RR_H:
+ if (strcasecmp ("IP", element_name) == 0)
+ {
+ set_client_state (CLIENT_CREATE_REPORT_RR_H_IP);
+ }
+ else if (strcasecmp ("DETAIL", element_name) == 0)
+ {
+ set_client_state (CLIENT_CREATE_REPORT_RR_H_DETAIL);
+ }
+ else if (strcasecmp ("END", element_name) == 0)
+ {
+ set_client_state (CLIENT_CREATE_REPORT_RR_H_END);
+ }
+ else if (strcasecmp ("START", element_name) == 0)
+ {
+ set_client_state (CLIENT_CREATE_REPORT_RR_H_START);
+ }
+ ELSE_ERROR ("create_report");
+
+ case CLIENT_CREATE_REPORT_RR_H_DETAIL:
+ if (strcasecmp ("NAME", element_name) == 0)
+ {
+ set_client_state (CLIENT_CREATE_REPORT_RR_H_DETAIL_NAME);
+ }
+ else if (strcasecmp ("VALUE", element_name) == 0)
+ {
+ set_client_state (CLIENT_CREATE_REPORT_RR_H_DETAIL_VALUE);
+ }
+ else if (strcasecmp ("SOURCE", element_name) == 0)
+ {
+ set_client_state (CLIENT_CREATE_REPORT_RR_H_DETAIL_SOURCE);
+ }
+ ELSE_ERROR ("create_report");
+
+ case CLIENT_CREATE_REPORT_RR_H_DETAIL_SOURCE:
+ if (strcasecmp ("DESCRIPTION", element_name) == 0)
+ {
+ set_client_state (CLIENT_CREATE_REPORT_RR_H_DETAIL_SOURCE_DESC);
+ }
+ else if (strcasecmp ("NAME", element_name) == 0)
+ {
+ set_client_state (CLIENT_CREATE_REPORT_RR_H_DETAIL_SOURCE_NAME);
+ }
+ else if (strcasecmp ("TYPE", element_name) == 0)
+ {
+ set_client_state (CLIENT_CREATE_REPORT_RR_H_DETAIL_SOURCE_TYPE);
+ }
+ ELSE_ERROR ("create_report");
+
case CLIENT_CREATE_REPORT_RR_RESULTS:
if (strcasecmp ("RESULT", element_name) == 0)
set_client_state
@@ -12390,6 +12471,7 @@
array_terminate (create_report_data->results);
array_terminate (create_report_data->host_ends);
array_terminate (create_report_data->host_starts);
+ array_terminate (create_report_data->details);
if (openvas_is_user_observer (current_credentials.username))
{
@@ -12415,6 +12497,7 @@
create_report_data->scan_end,
create_report_data->host_starts,
create_report_data->host_ends,
+ create_report_data->details,
&uuid))
{
case -1:
@@ -12478,7 +12561,6 @@
set_client_state (CLIENT_CREATE_REPORT);
break;
CLOSE_READ_OVER (CLIENT_CREATE_REPORT_RR, FILTERS);
- CLOSE_READ_OVER (CLIENT_CREATE_REPORT_RR, HOST);
CLOSE_READ_OVER (CLIENT_CREATE_REPORT_RR, HOST_COUNT);
case CLIENT_CREATE_REPORT_RR_HOST_END:
assert (strcasecmp ("HOST_END", element_name) == 0);
@@ -12543,6 +12625,58 @@
CLOSE (CLIENT_CREATE_REPORT_RR_HOST_END, HOST);
CLOSE (CLIENT_CREATE_REPORT_RR_HOST_START, HOST);
+ case CLIENT_CREATE_REPORT_RR_H:
+ {
+ openvas_free_string_var (&create_report_data->ip);
+ set_client_state (CLIENT_CREATE_REPORT_RR);
+ break;
+ }
+
+ CLOSE (CLIENT_CREATE_REPORT_RR_H, IP);
+ CLOSE (CLIENT_CREATE_REPORT_RR_H, START);
+ CLOSE (CLIENT_CREATE_REPORT_RR_H, END);
+
+ case CLIENT_CREATE_REPORT_RR_H_DETAIL:
+ {
+ assert (strcasecmp ("DETAIL", element_name) == 0);
+ assert (create_report_data->details);
+
+ if (create_report_data->ip)
+ {
+ host_detail_t *detail;
+
+ detail = g_malloc (sizeof (host_detail_t));
+ detail->ip = g_strdup (create_report_data->ip);
+ detail->name = create_report_data->detail_name;
+ detail->source_desc = create_report_data->detail_source_desc;
+ detail->source_name = create_report_data->detail_source_name;
+ detail->source_type = create_report_data->detail_source_type;
+ detail->value = create_report_data->detail_value;
+
+ array_add (create_report_data->details, detail);
+
+ create_report_data->detail_name = NULL;
+ create_report_data->detail_source_desc = NULL;
+ create_report_data->detail_source_name = NULL;
+ create_report_data->detail_source_type = NULL;
+ create_report_data->detail_value = NULL;
+ }
+
+ set_client_state (CLIENT_CREATE_REPORT_RR_H);
+ break;
+ }
+
+ CLOSE (CLIENT_CREATE_REPORT_RR_H_DETAIL, NAME);
+ CLOSE (CLIENT_CREATE_REPORT_RR_H_DETAIL, VALUE);
+ CLOSE (CLIENT_CREATE_REPORT_RR_H_DETAIL, SOURCE);
+
+ CLOSE (CLIENT_CREATE_REPORT_RR_H_DETAIL_SOURCE, TYPE);
+ CLOSE (CLIENT_CREATE_REPORT_RR_H_DETAIL_SOURCE, NAME);
+ case CLIENT_CREATE_REPORT_RR_H_DETAIL_SOURCE_DESC:
+ assert (strcasecmp ("DESCRIPTION", element_name) == 0);
+ set_client_state (CLIENT_CREATE_REPORT_RR_H_DETAIL_SOURCE);
+ break;
+
case CLIENT_CREATE_REPORT_RR_RESULTS_RESULT:
{
create_report_result_t *result;
@@ -17392,6 +17526,25 @@
&create_report_data->result_threat);
+ APPEND (CLIENT_CREATE_REPORT_RR_H_DETAIL_NAME,
+ &create_report_data->detail_name);
+
+ APPEND (CLIENT_CREATE_REPORT_RR_H_DETAIL_VALUE,
+ &create_report_data->detail_value);
+
+ APPEND (CLIENT_CREATE_REPORT_RR_H_DETAIL_SOURCE_DESC,
+ &create_report_data->detail_source_desc);
+
+ APPEND (CLIENT_CREATE_REPORT_RR_H_DETAIL_SOURCE_NAME,
+ &create_report_data->detail_source_name);
+
+ APPEND (CLIENT_CREATE_REPORT_RR_H_DETAIL_SOURCE_TYPE,
+ &create_report_data->detail_source_type);
+
+ APPEND (CLIENT_CREATE_REPORT_RR_H_IP,
+ &create_report_data->ip);
+
+
APPEND (CLIENT_CREATE_REPORT_TASK_NAME,
&create_report_data->task_name);
More information about the Openvas-commits
mailing list