[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