[Openvas-commits] r7911 - in trunk/openvas-manager: . src

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Thu Jun 3 11:55:49 CEST 2010


Author: felix
Date: 2010-06-03 11:55:47 +0200 (Thu, 03 Jun 2010)
New Revision: 7911

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:
Added optional SOURCE, PASSWORD and USERNAME elements to CREATE_TARGET
command. This allows to fetch targets from an external source via the
CREATE_TARGET command.

* src/omp.c (client_state_t): Added new states.
(create_target_data_t): Added new fields.
(create_target_data_reset): Free new fields.
(omp_xml_handle_start_element): Added state transitions.
(omp_xml_handle_end_element): Added state transitions, check for
malconditions in create_target command handling, updated calls to
create_target.
(omp_xml_handle_text): Fill new elements.
	
* src/manage_sql.c (create_target): Added parameters needed to query
external source to import targets from.

* src/manage.h (create_target): Updated proto.


Modified: trunk/openvas-manager/ChangeLog
===================================================================
--- trunk/openvas-manager/ChangeLog	2010-06-03 09:54:49 UTC (rev 7910)
+++ trunk/openvas-manager/ChangeLog	2010-06-03 09:55:47 UTC (rev 7911)
@@ -1,4 +1,23 @@
+2010-06-03  Felix Wolfsteller <felix.wolfsteller at greenbone.net>
 
+	Added optional SOURCE, PASSWORD and USERNAME elements to CREATE_TARGET
+	command. This allows to fetch targets from an external source via the
+	CREATE_TARGET command.
+
+	* src/omp.c (client_state_t): Added new states.
+	(create_target_data_t): Added new fields.
+	(create_target_data_reset): Free new fields.
+	(omp_xml_handle_start_element): Added state transitions.
+	(omp_xml_handle_end_element): Added state transitions, check for
+	malconditions in create_target command handling, updated calls to
+	create_target.
+	(omp_xml_handle_text): Fill new elements.
+	
+	* src/manage_sql.c (create_target): Added parameters needed to query
+	external source to import targets from.
+
+	* src/manage.h (create_target): Updated proto.
+
 2010-06-03  Felix Wolfsteller <felix.wolfsteller at greenbone.net>
 
 	Added new GET_SOURCES command that returns a list of external sources

Modified: trunk/openvas-manager/src/manage.h
===================================================================
--- trunk/openvas-manager/src/manage.h	2010-06-03 09:54:49 UTC (rev 7910)
+++ trunk/openvas-manager/src/manage.h	2010-06-03 09:55:47 UTC (rev 7911)
@@ -718,8 +718,9 @@
 find_target (const char*, target_t*);
 
 int
-create_target (const char*, const char*, const char*, lsc_credential_t,
-               target_t*);
+create_target (const char* name, const char* hosts, const char* comment,
+               lsc_credential_t lsc_credential, const char* source,
+               const char* username, const char* password, target_t* target);
 
 int
 delete_target (target_t);

Modified: trunk/openvas-manager/src/manage_sql.c
===================================================================
--- trunk/openvas-manager/src/manage_sql.c	2010-06-03 09:54:49 UTC (rev 7910)
+++ trunk/openvas-manager/src/manage_sql.c	2010-06-03 09:55:47 UTC (rev 7911)
@@ -36,9 +36,11 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 
+#include <openvas/base/openvas_string.h>
 #include <openvas/openvas_auth.h>
 #include <openvas/openvas_logging.h>
 #include <openvas/openvas_uuid.h>
+#include <openvas/resource_request.h>
 
 #ifdef S_SPLINT_S
 #include "splint.h"
@@ -7733,17 +7735,25 @@
 /**
  * @brief Create a target.
  *
+ * The \ref hosts and \ref source paramater are mutually exclusive, if source
+ * is not NULL, always try to import from source.
+ *
  * @param[in]   name            Name of target.
  * @param[in]   hosts           Host list of target.
  * @param[in]   comment         Comment on target.
  * @param[in]   lsc_credential  LSC credential.
+ * @param[in]   source          Name of source to import target from.
+ * @param[in]   username        Username to authenticate with against source.
+ * @param[in]   password        Password for user \ref username.
  * @param[out]  target          Created target.
  *
- * @return 0 success, 1 target exists already.
+ * @return 0 success, 1 target exists already, -1 if import from source failed
+ *         or response was empty.
  */
 int
 create_target (const char* name, const char* hosts, const char* comment,
-               lsc_credential_t lsc_credential, target_t* target)
+               lsc_credential_t lsc_credential, const char* source,
+               const char* username, const char* password, target_t* target)
 {
   gchar *quoted_name = sql_nquote (name, strlen (name));
   gchar *quoted_hosts, *quoted_comment;
@@ -7752,6 +7762,7 @@
 
   assert (current_credentials.uuid);
 
+  /* Check whether a target with the same name does already exist. */
   if (sql_int (0, 0,
                "SELECT COUNT(*) FROM targets"
                " WHERE name = '%s'"
@@ -7765,8 +7776,34 @@
       return 1;
     }
 
-  quoted_hosts = sql_nquote (hosts, strlen (hosts));
+  /* Import targets from source. */
+  if (source != NULL)
+    {
+      GSList* hosts_list = resource_request_resource (source,
+                                                      RESOURCE_TYPE_TARGET,
+                                                      username ? username : "",
+                                                      password ? password : "");
 
+      if (hosts_list == NULL)
+        {
+          g_free (quoted_name);
+          sql ("ROLLBACK;");
+          return -1;
+        }
+
+      gchar* import_hosts = openvas_string_flatten_string_list (hosts_list,
+                                                                ",");
+
+      openvas_string_list_free (hosts_list);
+      quoted_hosts = sql_nquote (import_hosts, strlen (import_hosts));
+      g_free (import_hosts);
+    }
+  else
+    {
+      /* User provided hosts. */
+      quoted_hosts = sql_nquote (hosts, strlen (hosts));
+    }
+
   if (comment)
     {
       quoted_comment = sql_nquote (comment, strlen (comment));

Modified: trunk/openvas-manager/src/omp.c
===================================================================
--- trunk/openvas-manager/src/omp.c	2010-06-03 09:54:49 UTC (rev 7910)
+++ trunk/openvas-manager/src/omp.c	2010-06-03 09:55:47 UTC (rev 7911)
@@ -816,6 +816,10 @@
   char *hosts;
   char *lsc_credential;
   char *name;
+  /* For targets to import: source name and credentials to source. */
+  char *source;
+  char *username;
+  char *password;
 } create_target_data_t;
 
 static void
@@ -826,6 +830,10 @@
   free (data->lsc_credential);
   free (data->name);
 
+  free (data->source);
+  free (data->username);
+  free (data->password);
+
   memset (data, 0, sizeof (create_target_data_t));
 }
 
@@ -1837,6 +1845,9 @@
   CLIENT_CREATE_TARGET_HOSTS,
   CLIENT_CREATE_TARGET_LSC_CREDENTIAL,
   CLIENT_CREATE_TARGET_NAME,
+  CLIENT_CREATE_TARGET_PASSWORD,
+  CLIENT_CREATE_TARGET_SOURCE,
+  CLIENT_CREATE_TARGET_USERNAME,
   CLIENT_CREATE_TASK,
   CLIENT_CREATE_TASK_COMMENT,
   CLIENT_CREATE_TASK_CONFIG,
@@ -4274,6 +4285,12 @@
           set_client_state (CLIENT_CREATE_TARGET_LSC_CREDENTIAL);
         else if (strcasecmp ("NAME", element_name) == 0)
           set_client_state (CLIENT_CREATE_TARGET_NAME);
+        else if (strcasecmp ("PASSWORD", element_name) == 0)
+          set_client_state (CLIENT_CREATE_TARGET_PASSWORD);
+        else if (strcasecmp ("SOURCE", element_name) == 0)
+          set_client_state (CLIENT_CREATE_TARGET_SOURCE);
+        else if (strcasecmp ("USERNAME", element_name) == 0)
+          set_client_state (CLIENT_CREATE_TARGET_USERNAME);
         else
           {
             if (send_element_error_to_client ("create_target", element_name))
@@ -8008,7 +8025,7 @@
           while (source)
             {
               SENDF_TO_CLIENT_OR_FAIL ("<source resource=\"target\" "
-                                       "type=\"ldap-ucs\" name=\"%s\"/>",
+                                       "name=\"%s\"/>",
                                        (char*) source->data);
               source = g_slist_next (source);
             }
@@ -9863,15 +9880,28 @@
 
           assert (strcasecmp ("CREATE_TARGET", element_name) == 0);
           assert (&create_target_data->name != NULL);
-          assert (&create_target_data->hosts != NULL);
+          assert ( (&create_target_data->source
+                    || &create_target_data->hosts != NULL));
 
-          if (strlen (create_target_data->name) == 0
-              || strlen (create_target_data->hosts) == 0)
+          if (strlen (create_target_data->name) == 0)
             SEND_TO_CLIENT_OR_FAIL
              (XML_ERROR_SYNTAX ("create_target",
                                 // FIX could pass an empty hosts element?
-                                "CREATE_TARGET name and hosts must both be at"
+                                "CREATE_TARGET name must be at"
                                 " least one character long"));
+          else if (strlen (create_target_data->hosts) == 0
+                   && create_target_data->source == NULL)
+            SEND_TO_CLIENT_OR_FAIL
+             (XML_ERROR_SYNTAX ("create_target",
+                                // FIX could pass an empty hosts element?
+                                "CREATE_TARGET hosts must both be at least one"
+                                " character long, or SOURCE must be set"));
+          else if (strlen (create_target_data->hosts) != 0
+                   && create_target_data->source != NULL)
+            SEND_TO_CLIENT_OR_FAIL
+             (XML_ERROR_SYNTAX ("create_target",
+                                "CREATE_TARGET source and host have to be"
+                                " used mutually exclusive"));
           else if (create_target_data->lsc_credential
                    && find_lsc_credential (create_target_data->lsc_credential,
                                            &lsc_credential))
@@ -9887,15 +9917,31 @@
                   return;
                 }
             }
-          else if (create_target (create_target_data->name,
-                                  create_target_data->hosts,
-                                  create_target_data->comment,
-                                  lsc_credential,
-                                  NULL))
-            SEND_TO_CLIENT_OR_FAIL (XML_ERROR_SYNTAX ("create_target",
+          /* Create target from host string. */
+          else
+            {
+              int result = create_target (create_target_data->name,
+                                          create_target_data->hosts,
+                                          create_target_data->comment,
+                                          lsc_credential,
+                                          create_target_data->source,
+                                          create_target_data->username,
+                                          create_target_data->password,
+                                          NULL);
+              switch (result)
+                {
+                  case 1:
+                    SEND_TO_CLIENT_OR_FAIL (XML_ERROR_SYNTAX ("create_target",
                                                       "Target exists already"));
-          else
-            SEND_TO_CLIENT_OR_FAIL (XML_OK_CREATED ("create_target"));
+                  case -1:
+                    SEND_TO_CLIENT_OR_FAIL (XML_ERROR_SYNTAX ("create_target",
+                                                 "Import from source failed"));
+                  default:
+                    SEND_TO_CLIENT_OR_FAIL (XML_OK_CREATED ("create_target"));
+                    break;
+                }
+            }
+
           create_target_data_reset (create_target_data);
           set_client_state (CLIENT_AUTHENTIC);
           break;
@@ -9916,6 +9962,18 @@
         assert (strcasecmp ("LSC_CREDENTIAL", element_name) == 0);
         set_client_state (CLIENT_CREATE_TARGET);
         break;
+      case CLIENT_CREATE_TARGET_PASSWORD:
+        assert (strcasecmp ("PASSWORD", element_name) == 0);
+        set_client_state (CLIENT_CREATE_TARGET);
+        break;
+      case CLIENT_CREATE_TARGET_SOURCE:
+        assert (strcasecmp ("SOURCE", element_name) == 0);
+        set_client_state (CLIENT_CREATE_TARGET);
+        break;
+      case CLIENT_CREATE_TARGET_USERNAME:
+        assert (strcasecmp ("USERNAME", element_name) == 0);
+        set_client_state (CLIENT_CREATE_TARGET);
+        break;
 
       case CLIENT_CREATE_TASK:
         {
@@ -10084,7 +10142,8 @@
 
               target_name = g_strdup_printf ("Imported target for task %s",
                                              tsk_uuid);
-              if (create_target (target_name, hosts, NULL, 0, &target))
+              if (create_target (target_name, hosts, NULL, 0, NULL, NULL,
+                                 NULL, &target))
                 {
                   request_delete_task (&create_task_data->task);
                   g_free (target_name);
@@ -12656,6 +12715,15 @@
       case CLIENT_CREATE_TARGET_NAME:
         openvas_append_text (&create_target_data->name, text, text_len);
         break;
+     case CLIENT_CREATE_TARGET_PASSWORD:
+        openvas_append_text (&create_target_data->password, text, text_len);
+        break;
+     case CLIENT_CREATE_TARGET_SOURCE:
+        openvas_append_text (&create_target_data->source, text, text_len);
+        break;
+      case CLIENT_CREATE_TARGET_USERNAME:
+        openvas_append_text (&create_target_data->username, text, text_len);
+        break;
 
       case CLIENT_CREATE_TASK_COMMENT:
         append_to_task_comment (create_task_data->task, text, text_len);



More information about the Openvas-commits mailing list