[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