15#include "../http/httputils.h"
18#include <cjson/cJSON.h>
19#include <netinet/in.h>
29#define G_LOG_DOMAIN "libgvm ovd"
31#define RESP_CODE_ERR -1
112 gvm_http_response_stream_t stream;
115 stream = gvm_http_response_stream_new ();
147 conn->
ca_cert = g_strdup ((
char *) val);
150 conn->
cert = g_strdup ((
char *) val);
153 conn->
key = g_strdup ((
char *) val);
156 conn->
apikey = g_strdup ((
char *) val);
159 if (g_strcmp0 ((
char *) val,
"http") != 0
160 && g_strcmp0 ((
char *) val,
"https") != 0)
162 conn->
protocol = g_strdup ((
char *) val);
165 conn->
host = g_strdup ((
char *) val);
168 conn->
scan_id = g_strdup ((
const gchar *) val);
172 conn->
port = *((
int *) val);
224static gvm_http_headers_t *
227 gvm_http_headers_t *headers = gvm_http_headers_new ();
232 GString *xapikey = g_string_new (
"X-API-KEY: ");
233 g_string_append (xapikey, apikey);
235 if (!gvm_http_add_header (headers, xapikey->str))
236 g_warning (
"%s: Not possible to set API-KEY", __func__);
238 g_string_free (xapikey, TRUE);
244 if (!gvm_http_add_header (headers,
"Content-Type: application/json"))
245 g_warning (
"%s: Not possible to set Content-Type", __func__);
267 const gchar *path,
const gchar *data,
268 const gchar *header_name)
272 response->
body = NULL;
277 g_warning (
"openvasd_send_request_test: Invalid connector");
278 response->
body = g_strdup (
"{\"error\": \"Missing openvasd connector\"}");
282 gchar *url = g_strdup_printf (
"%s://%s:%d%s", conn->
protocol, conn->
host,
287 conn->
stream_resp = g_malloc0 (
sizeof (
struct gvm_http_response_stream));
290 gvm_http_headers_t *custom_headers =
294 gvm_http_response_t *http_response =
295 gvm_http_request (url, method, data, custom_headers, conn->
ca_cert,
299 if (http_response->http_status == -1)
301 g_warning (
"%s: Error performing CURL request", __func__);
302 response->
body = g_strdup (
"{\"error\": \"Error sending request\"}");
303 gvm_http_response_cleanup (http_response);
305 gvm_http_headers_free (custom_headers);
310 response->
code = (int) http_response->http_status;
311 response->
body = g_strdup (
312 http_response->data ? http_response->data :
"{\"error\": \"No response\"}");
317 struct curl_header *hname;
318 if (curl_easy_header (http_response->http->handler, header_name, 0,
319 CURLH_HEADER, -1, &hname)
322 response->
header = g_strdup (hname->value);
327 gvm_http_response_cleanup (http_response);
329 gvm_http_headers_free (custom_headers);
369 gvm_http_headers_t *customheader = NULL;
373 path = g_string_new (
"/vts?information=1");
374 gchar *url = g_strdup_printf (
"%s://%s:%d%s", conn->
protocol, conn->
host,
375 conn->
port, path->str);
380 conn->
stream_resp = g_malloc0 (
sizeof (
struct gvm_http_response_stream));
383 gvm_http_multi_t *multi_handle = gvm_http_multi_new ();
386 g_warning (
"%s: Failed to initialize curl multi-handle", __func__);
387 g_string_free (path, TRUE);
391 g_strdup (
"{\"error\": \"Failed to initialize multi-handle\"}");
396 gvm_http_t *http = gvm_http_new (url, GET, NULL, customheader, conn->
ca_cert,
399 g_string_free (path, TRUE);
403 if (!http || !http->handler)
405 g_warning (
"%s: Failed to initialize curl request", __func__);
406 gvm_http_headers_free (customheader);
407 gvm_http_multi_free (multi_handle);
410 g_strdup (
"{\"error\": \"Failed to initialize CURL request\"}");
414 gvm_http_multi_result_t multi_add_result =
415 gvm_http_multi_add_handler (multi_handle, http);
416 if (multi_add_result != GVM_HTTP_OK)
418 g_warning (
"%s: Failed to add CURL handle to multi", __func__);
419 gvm_http_multi_handler_free (multi_handle, http);
420 gvm_http_headers_free (customheader);
421 gvm_http_multi_free (multi_handle);
424 g_strdup (
"{\"error\": \"Failed to add CURL handle to multi\"}");
429 conn->
stream_resp->multi_handler->headers = customheader;
431 g_debug (
"%s: Multi handle initialized successfully", __func__);
440 gvm_http_response_stream_reset (conn->
stream_resp);
469 static int running = 0;
471 gvm_http_multi_t *multi = conn->
stream_resp->multi_handler;
472 if (!multi || !multi->handler)
474 g_warning (
"%s: Invalid multi-handler", __func__);
478 gvm_http_multi_result_t mc = gvm_http_multi_perform (multi, &running);
480 if (mc == GVM_HTTP_OK && running)
483 CURLMcode poll_result =
484 curl_multi_poll (multi->handler, NULL, 0, 5000, NULL);
485 if (poll_result != CURLM_OK)
487 g_warning (
"%s: error on curl_multi_poll(): %d\n", __func__,
510 path = g_string_new (
"/vts?information=1");
513 g_string_free (path, TRUE);
534 cJSON *parser = NULL;
541 if (response->
body == NULL)
543 g_strdup (
"{\"error\": \"Storing scan configuration\"}");
544 g_warning (
"%s: Error storing scan configuration ", __func__);
553 const gchar *error_ptr = cJSON_GetErrorPtr ();
554 g_warning (
"%s: Error parsing json string to get the scan ID", __func__);
555 if (error_ptr != NULL)
557 response->
body = g_strdup_printf (
"{\"error\": \"%s\"}", error_ptr);
558 g_warning (
"%s: %s", __func__, error_ptr);
562 response->
body = g_strdup (
563 "{\"error\": \"Parsing json string to get the scan ID\"}");
566 cJSON_Delete (parser);
571 conn->
scan_id = g_strdup (cJSON_GetStringValue (parser));
574 path = g_string_new (
"/scans");
577 g_string_append (path,
"/");
578 g_string_append (path, conn->
scan_id);
583 response->
body = g_strdup (
"{\"error\": \"Missing scan ID\"}");
584 g_string_free (path, TRUE);
585 g_warning (
"%s: Missing scan ID", __func__);
586 cJSON_Delete (parser);
593 "{\"action\": \"start\"}", NULL);
595 g_string_free (path, TRUE);
599 if (response->
body == NULL)
600 response->
body = g_strdup (
"{\"error\": \"Starting the scan.\"}");
601 g_warning (
"%s: Error starting the scan.", __func__);
602 cJSON_Delete (parser);
606 cJSON_Delete (parser);
619 path = g_string_new (
"/scans");
622 g_string_append (path,
"/");
623 g_string_append (path, conn->
scan_id);
629 response->
body = g_strdup (
"{\"error\": \"Missing scan ID\"}");
630 g_string_free (path, TRUE);
631 g_warning (
"%s: Missing scan ID", __func__);
636 "{\"action\": \"stop\"}", NULL);
638 g_string_free (path, TRUE);
651 GString *path = NULL;
653 path = g_string_new (
"/scans");
656 g_string_append (path,
"/");
657 g_string_append (path, conn->
scan_id);
659 g_string_append_printf (path,
"/results?range%ld-%ld", first, last);
660 else if (last < first)
661 g_string_append_printf (path,
"/results?range=%ld", first);
663 g_string_append (path,
"/results");
669 response->
body = g_strdup (
"{\"error\": \"Missing scan ID\"}");
670 g_string_free (path, TRUE);
671 g_warning (
"%s: Missing scan ID", __func__);
676 g_string_free (path, TRUE);
682 g_warning (
"%s: Not possible to get scan results", __func__);
684 g_strdup (
"{\"error\": \"Not possible to get scan results\"}");
693 gchar *hostname, gchar *oid, gchar *port, gchar *protocol,
694 gchar *message, gchar *detail_name, gchar *detail_value,
695 gchar *detail_source_type, gchar *detail_source_name,
696 gchar *detail_source_description)
701 result->
type = g_strdup (type);
703 result->
hostname = g_strdup (hostname);
704 result->
oid = g_strdup (oid);
705 result->
message = g_strdup (message);
712 if (!g_strcmp0 (type,
"host_detail"))
713 result->
port = g_strdup (
"general/Host_Details");
714 else if (port == NULL || (!g_strcmp0 (port,
"0") && protocol))
715 result->
port = g_strdup_printf (
"general/%s", protocol);
717 result->
port = g_strdup_printf (
"%s/%s", port, protocol);
719 result->
port = g_strdup_printf (
"general/tcp");
782 g_free (result->
type);
785 g_free (result->
oid);
786 g_free (result->
port);
801 cJSON *result_obj = NULL;
802 const gchar *err = NULL;
806 parser = cJSON_Parse (body);
809 err = cJSON_GetErrorPtr ();
812 if (!cJSON_IsArray (parser))
818 cJSON_ArrayForEach (result_obj, parser)
822 gchar *detail_name = NULL;
823 gchar *detail_value = NULL;
824 gchar *detail_source_type = NULL;
825 gchar *detail_source_name = NULL;
826 gchar *detail_source_description = NULL;
828 if (!cJSON_IsObject (result_obj))
832 item = cJSON_GetObjectItem (result_obj,
"detail");
833 if (item != NULL && cJSON_IsObject (item))
835 cJSON *detail_obj = NULL;
840 detail_obj = cJSON_GetObjectItem (item,
"source");
841 if (detail_obj && cJSON_IsObject (detail_obj))
845 detail_source_description =
859 detail_source_type, detail_source_name, detail_source_description);
862 *results = g_slist_append (*results, result);
869 g_warning (
"%s: Unable to parse scan results. Reason: %s", __func__, err);
871 cJSON_Delete (parser);
878 unsigned long last, GSList **results)
884 if (resp->
code == 200)
898 GString *path = NULL;
900 path = g_string_new (
"/scans");
903 g_string_append (path,
"/");
904 g_string_append (path, conn->
scan_id);
905 g_string_append (path,
"/status");
911 response->
body = g_strdup (
"{\"error\": \"Missing scan ID\"}");
912 g_string_free (path, TRUE);
913 g_warning (
"%s: Missing scan ID", __func__);
918 g_string_free (path, TRUE);
925 g_strdup (
"{\"error\": \"Not possible to get scan status\"}");
926 g_warning (
"%s: Not possible to get scan status", __func__);
953 cJSON *reader = NULL;
954 const gchar *err = NULL;
955 int all = 0, excluded = 0, dead = 0, alive = 0, queued = 0, finished = 0;
956 int running_hosts_progress_sum = 0;
961 if (!response && !conn)
964 if (response == NULL)
969 if (resp->
code == 404)
971 else if (resp->
code != 200)
974 parser = cJSON_Parse (resp->
body);
977 err = cJSON_GetErrorPtr ();
981 reader = cJSON_GetObjectItem (parser,
"host_info");
986 if (!cJSON_IsObject (reader))
1003 scanning = cJSON_GetObjectItem (reader,
"scanning");
1004 if (scanning != NULL && cJSON_IsObject (scanning))
1006 cJSON *host = scanning->child;
1009 running_hosts_progress_sum += cJSON_GetNumberValue (host);
1014 if (all < 0 || excluded < 0 || dead < 0 || alive < 0 || queued < 0
1020 if ((all + finished - dead) > 0)
1021 progress = (running_hosts_progress_sum + 100 * (alive + finished))
1022 / (all + finished - dead);
1028 g_warning (
"%s: Unable to parse scan status. Reason: %s", __func__, err);
1029 cJSON_Delete (parser);
1045 if (g_strcmp0 (status_val,
"stored") == 0)
1047 else if (g_strcmp0 (status_val,
"requested") == 0)
1049 else if (g_strcmp0 (status_val,
"running") == 0)
1051 else if (g_strcmp0 (status_val,
"stopped") == 0)
1053 else if (g_strcmp0 (status_val,
"succeeded") == 0)
1055 else if (g_strcmp0 (status_val,
"interrupted") == 0)
1065 gchar *status_val = NULL;
1071 parser = cJSON_Parse (body);
1077 cJSON_Delete (parser);
1083 status_info->
status = status_code;
1086 cJSON_Delete (parser);
1111 status_info->
status = status_code;
1131 path = g_string_new (
"/scans");
1134 g_string_append (path,
"/");
1135 g_string_append (path, conn->
scan_id);
1141 response->
body = g_strdup (
"{\"error\": \"Missing scan ID\"}");
1142 g_string_free (path, TRUE);
1143 g_warning (
"%s: Missing scan ID", __func__);
1149 g_string_free (path, TRUE);
1156 g_strdup (
"{\"error\": \"Not possible to delete scan.\"}");
1157 g_warning (
"%s: Not possible to delete scan", __func__);
1176 g_strdup (
"{\"error\": \"Not possible to get health information.\"}");
1177 g_warning (
"%s: Not possible to get health information", __func__);
1197 g_strdup (
"{\"error\": \"Not possible to get health information.\"}");
1198 g_warning (
"%s: Not possible to get health information", __func__);
1217 g_strdup (
"{\"error\": \"Not possible to get health information.\"}");
1218 g_warning (
"%s: Not possible to get health information", __func__);
1236 || opts.
start > now || opts.
end < 0 || opts.
end > now)
1241 g_strdup (
"{\"error\": \"Couldn't send get_performance command "
1242 "to scanner. Bad or missing parameters.\"}");
1246 query = g_strdup_printf (
"/health/performance?start=%d&end=%d&titles=%s",
1255 response->
body = g_strdup (
1256 "{\"error\": \"Not possible to get performance information.\"}");
1257 g_warning (
"%s: Not possible to get performance information", __func__);
1267 gchar **graph, gchar **err)
1276 parser = cJSON_Parse (resp->
body);
1279 *err = g_strdup (
"Unable to parse sensor performance data");
1282 else if (resp->
code != 200)
1284 parser = cJSON_Parse (resp->
body);
1285 item = cJSON_GetObjectItem (parser,
"error");
1287 *err = g_strdup (cJSON_GetStringValue (item));
1292 item = cJSON_GetArrayItem (parser, 0);
1294 *graph = g_strdup (cJSON_GetStringValue (item));
1298 cJSON_Delete (parser);
1316 g_strdup (
"{\"error\": \"Not possible to get scans preferences.\"}");
1317 g_warning (
"%s: Not possible to get scans_preferences", __func__);
1331 gchar *type,
int mandatory)
1355 g_free (param->
name);
1358 g_free (param->
type);
1450 cJSON *param_obj = NULL;
1455 if (resp->
code != 200)
1459 parser = cJSON_Parse (resp->
body);
1460 if (parser == NULL || !cJSON_IsArray (parser))
1466 cJSON_ArrayForEach (param_obj, parser)
1468 gchar *defval = NULL, *param_type = NULL;
1470 int val, mandatory = 0;
1474 item = cJSON_GetObjectItem (param_obj,
"default");
1477 if (cJSON_IsNumber (item))
1479 val = item->valueint;
1480 g_snprintf (buf,
sizeof (buf),
"%d", val);
1481 defval = g_strdup (buf);
1482 param_type = g_strdup (
"integer");
1484 else if (cJSON_IsString (item))
1486 defval = g_strdup (item->valuestring);
1487 param_type = g_strdup (
"string");
1489 else if (cJSON_IsBool (item))
1491 if (cJSON_IsTrue (item))
1492 defval = g_strdup (
"yes");
1494 defval = g_strdup (
"no");
1495 param_type = g_strdup (
"boolean");
1499 g_warning (
"%s: Unable to parse scan preferences.", __func__);
1501 g_free (param_type);
1510 g_strdup (param_type), mandatory);
1512 g_free (param_type);
1513 *params = g_slist_append (*params, param);
1518 cJSON_Delete (parser);
1521 g_warning (
"%s: Unable to parse scan preferences.", __func__);
1534 cJSON *port = cJSON_CreateObject ();
1535 if (ports->
type == 1)
1536 cJSON_AddStringToObject (port,
"protocol",
"udp");
1538 cJSON_AddStringToObject (port,
"protocol",
"tcp");
1540 cJSON *ranges_array = cJSON_CreateArray ();
1541 cJSON *range_obj = cJSON_CreateObject ();
1542 cJSON_AddNumberToObject (range_obj,
"start", ports->
start);
1544 if (ports->
end > ports->
start && ports->
end < 65535)
1545 cJSON_AddNumberToObject (range_obj,
"end", ports->
end);
1547 cJSON_AddNumberToObject (range_obj,
"end", ports->
start);
1548 cJSON_AddItemToArray (ranges_array, range_obj);
1549 cJSON_AddItemToObject (port,
"range", ranges_array);
1550 cJSON_AddItemToArray ((cJSON *) p_array, port);
1556 GHashTableIter auth_data_iter;
1557 gchar *auth_data_name, *auth_data_value;
1558 cJSON *cred_obj = NULL;
1562 cred_obj = cJSON_CreateObject ();
1563 cJSON_AddStringToObject (cred_obj,
"service", cred->
service);
1567 cJSON_AddNumberToObject (cred_obj,
"port", atoi (cred->
port));
1570 cJSON *cred_type_obj = cJSON_CreateObject ();
1571 g_hash_table_iter_init (&auth_data_iter, cred->
auth_data);
1572 while (g_hash_table_iter_next (&auth_data_iter, (gpointer *) &auth_data_name,
1573 (gpointer *) &auth_data_value))
1574 cJSON_AddStringToObject (cred_type_obj, auth_data_name, auth_data_value);
1575 cJSON_AddItemToObject (cred_obj, cred->
type, cred_type_obj);
1577 cJSON_AddItemToArray ((cJSON *) cred_array, cred_obj);
1582 gpointer scan_prefs_array)
1584 cJSON *pref_obj = cJSON_CreateObject ();
1585 cJSON_AddStringToObject (pref_obj,
"id", key);
1586 cJSON_AddStringToObject (pref_obj,
"value", val);
1587 cJSON_AddItemToArray (scan_prefs_array, pref_obj);
1593 GHashTableIter vt_data_iter;
1594 gchar *vt_param_id, *vt_param_value;
1598 cJSON *vt_obj = cJSON_CreateObject ();
1600 cJSON_AddStringToObject (vt_obj,
"oid", vt->
vt_id);
1604 cJSON *params_array = cJSON_CreateArray ();
1606 g_hash_table_iter_init (&vt_data_iter, vt->
vt_values);
1607 while (g_hash_table_iter_next (&vt_data_iter, (gpointer *) &vt_param_id,
1608 (gpointer *) &vt_param_value))
1610 cJSON *param_obj = cJSON_CreateObject ();
1611 cJSON_AddNumberToObject (param_obj,
"id", atoi (vt_param_id));
1612 cJSON_AddStringToObject (param_obj,
"value", vt_param_value);
1613 cJSON_AddItemToArray (params_array, param_obj);
1615 cJSON_AddItemToObject (vt_obj,
"parameters", params_array);
1617 cJSON_AddItemToArray (vts_array, vt_obj);
1634 GHashTable *scan_preferences, GSList *vts)
1636 cJSON *scan_obj = NULL;
1637 cJSON *target_obj = NULL;
1638 cJSON *hosts_array = NULL;
1639 cJSON *exclude_hosts_array = NULL;
1640 cJSON *finished_hosts_array = NULL;
1641 gchar *json_str = NULL;
1644 scan_obj = cJSON_CreateObject ();
1647 cJSON_AddStringToObject (scan_obj,
"scan_id", target->
scan_id);
1650 target_obj = cJSON_CreateObject ();
1653 hosts_array = cJSON_CreateArray ();
1654 gchar **hosts_list = g_strsplit (target->
hosts,
",", 0);
1655 for (
int i = 0; hosts_list[i] != NULL; i++)
1657 cJSON *host_item = NULL;
1658 host_item = cJSON_CreateString (hosts_list[i]);
1659 cJSON_AddItemToArray (hosts_array, host_item);
1661 g_strfreev (hosts_list);
1662 cJSON_AddItemToObject (target_obj,
"hosts", hosts_array);
1667 exclude_hosts_array = cJSON_CreateArray ();
1668 gchar **exclude_hosts_list = g_strsplit (target->
exclude_hosts,
",", 0);
1669 for (
int i = 0; exclude_hosts_list[i] != NULL; i++)
1671 cJSON *exclude_host_item = NULL;
1672 exclude_host_item = cJSON_CreateString (exclude_hosts_list[i]);
1673 cJSON_AddItemToArray (exclude_hosts_array, exclude_host_item);
1675 g_strfreev (exclude_hosts_list);
1676 cJSON_AddItemToObject (target_obj,
"excluded_hosts", exclude_hosts_array);
1682 finished_hosts_array = cJSON_CreateArray ();
1683 gchar **finished_hosts_list = g_strsplit (target->
finished_hosts,
",", 0);
1684 for (
int i = 0; finished_hosts_list[i] != NULL; i++)
1686 cJSON *finished_host_item = NULL;
1687 finished_host_item = cJSON_CreateString (finished_hosts_list[i]);
1688 cJSON_AddItemToArray (finished_hosts_array, finished_host_item);
1690 g_strfreev (hosts_list);
1691 cJSON_AddItemToObject (target_obj,
"finished_hosts",
1692 finished_hosts_array);
1696 if (target->
ports && target->
ports[0] !=
'\0')
1698 cJSON *ports_array = cJSON_CreateArray ();
1702 cJSON_AddItemToObject (target_obj,
"ports", ports_array);
1706 cJSON *credentials = cJSON_CreateArray ();
1709 cJSON_AddItemToObject (target_obj,
"credentials", credentials);
1713 cJSON_AddBoolToObject (target_obj,
"reverse_lookup_unify", cJSON_True);
1715 cJSON_AddBoolToObject (target_obj,
"reverse_lookup_unify", cJSON_False);
1718 cJSON_AddBoolToObject (target_obj,
"reverse_lookup_only", cJSON_True);
1720 cJSON_AddBoolToObject (target_obj,
"reverse_lookup_only", cJSON_False);
1723 cJSON *alive_test_methods = cJSON_CreateArray ();
1725 cJSON_AddItemToArray (alive_test_methods, cJSON_CreateString (
"arp"));
1727 cJSON_AddItemToArray (alive_test_methods, cJSON_CreateString (
"tcp_ack"));
1729 cJSON_AddItemToArray (alive_test_methods, cJSON_CreateString (
"tcp_syn"));
1731 cJSON_AddItemToArray (alive_test_methods,
1732 cJSON_CreateString (
"consider_alive"));
1734 cJSON_AddItemToArray (alive_test_methods, cJSON_CreateString (
"icmp"));
1735 cJSON_AddItemToObject (target_obj,
"alive_test_methods", alive_test_methods);
1737 cJSON_AddItemToObject (scan_obj,
"target", target_obj);
1740 cJSON *scan_prefs_array = cJSON_CreateArray ();
1743 cJSON_AddItemToObject (scan_obj,
"scan_preferences", scan_prefs_array);
1746 cJSON *vts_array = cJSON_CreateArray ();
1748 cJSON_AddItemToObject (scan_obj,
"vts", vts_array);
1750 json_str = cJSON_Print (scan_obj);
1751 cJSON_Delete (scan_obj);
1752 if (json_str == NULL)
1753 g_warning (
"%s: Error while creating JSON.", __func__);
1775 new_credential->
type = type ? g_strdup (type) : NULL;
1776 new_credential->
service = service ? g_strdup (service) : NULL;
1777 new_credential->
port = port ? g_strdup (port) : NULL;
1779 g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
1781 return new_credential;
1795 g_free (credential->
type);
1797 g_free (credential->
port);
1798 g_hash_table_destroy (credential->
auth_data);
1799 g_free (credential);
1811 const gchar *name,
const gchar *value)
1813 if (credential == NULL || name == NULL)
1816 if (g_regex_match_simple (
"^[[:alpha:]][[:alnum:]_]*$", name, 0, 0))
1819 g_hash_table_replace (credential->
auth_data, g_strdup (name),
1822 g_hash_table_remove (credential->
auth_data, name);
1826 g_warning (
"%s: Invalid auth data name: %s", __func__, name);
1844 const gchar *ports,
const gchar *exclude_hosts,
1845 int reverse_lookup_unify,
int reverse_lookup_only)
1850 if (scanid && *scanid)
1851 new_target->
scan_id = g_strdup (scanid);
1853 new_target->
exclude_hosts = exclude_hosts ? g_strdup (exclude_hosts) : NULL;
1855 new_target->
hosts = hosts ? g_strdup (hosts) : NULL;
1856 new_target->
ports = ports ? g_strdup (ports) : NULL;
1858 reverse_lookup_unify ? reverse_lookup_unify : 0;
1860 reverse_lookup_only ? reverse_lookup_only : 0;
1873 const gchar *finished_hosts)
1876 target->
finished_hosts = finished_hosts ? g_strdup (finished_hosts) : NULL;
1895 g_free (target->
hosts);
1896 g_free (target->
ports);
1913 gboolean icmp, gboolean tcp_syn,
1914 gboolean tcp_ack, gboolean arp,
1915 gboolean consider_alive)
1920 target->
icmp = icmp;
1937 if (!target || !credential)
1956 new_vt_single->
vt_id = vt_id ? g_strdup (vt_id) : NULL;
1958 g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
1960 return new_vt_single;
1974 g_hash_table_destroy (vt_single->
vt_values);
1976 g_free (vt_single->
vt_id);
1991 const gchar *name,
const gchar *value)
1993 g_hash_table_replace (vt_single->
vt_values, g_strdup (name),
void array_free(GPtrArray *array)
Free global array value.
Definition array.c:50
GPtrArray array_t
Definition array.h:16
double gvm_json_obj_double(cJSON *obj, const gchar *key)
Get a double field from a JSON object.
Definition json.c:75
int gvm_json_obj_check_int(cJSON *obj, const gchar *key, int *val)
Get an int field from a JSON object.
Definition json.c:97
int gvm_json_obj_int(cJSON *obj, const gchar *key)
Get an int field from a JSON object.
Definition json.c:120
gchar * gvm_json_obj_str(cJSON *obj, const gchar *key)
Get a string field from a JSON object.
Definition json.c:165
int gvm_json_obj_check_str(cJSON *obj, const gchar *key, gchar **val)
Get a string field from a JSON object.
Definition json.c:142
array_t * port_range_ranges(const char *port_range)
Create a range array from a port_range string.
Definition networking.c:601
GVM Networking related API.
struct range range_t
Definition networking.h:43
void openvasd_target_add_credential(openvasd_target_t *target, openvasd_credential_t *credential)
Add a credential to an openvasd target.
Definition openvasd.c:1934
static openvasd_resp_t openvasd_send_request(openvasd_connector_t conn, gvm_http_method_t method, const gchar *path, const gchar *data, const gchar *header_name)
Sends an HTTP(S) request to the OpenVAS daemon using the specified parameters.
Definition openvasd.c:266
void openvasd_param_free(openvasd_param_t *param)
Free an openvasd parameter.
Definition openvasd.c:1350
#define RESP_CODE_ERR
Definition openvasd.c:31
void openvasd_credential_set_auth_data(openvasd_credential_t *credential, const gchar *name, const gchar *value)
Get authentication data from an openvasd credential.
Definition openvasd.c:1810
int openvasd_get_result_member_int(openvasd_result_t result, openvasd_result_member_int_t member)
Definition openvasd.c:761
void openvasd_target_free(openvasd_target_t *target)
Free an openvasd target, including all added credentials.
Definition openvasd.c:1885
openvasd_scan_status_t openvasd_parsed_scan_status(openvasd_connector_t conn)
Return a struct with the general scan status.
Definition openvasd.c:1099
char * openvasd_param_desc(openvasd_param_t *param)
Get the parameter description.
Definition openvasd.c:1395
void openvasd_reset_vt_stream(openvasd_connector_t conn)
Definition openvasd.c:438
void openvasd_credential_free(openvasd_credential_t *credential)
Free an openvasd credential.
Definition openvasd.c:1790
size_t openvasd_vt_stream_len(openvasd_connector_t conn)
Definition openvasd.c:450
openvasd_credential_t * openvasd_credential_new(const gchar *type, const gchar *service, const gchar *port)
Allocate and initialize a new openvasd credential.
Definition openvasd.c:1768
openvasd_resp_t openvasd_get_scan_results(openvasd_connector_t conn, long first, long last)
Definition openvasd.c:648
char * openvasd_build_scan_config_json(openvasd_target_t *target, GHashTable *scan_preferences, GSList *vts)
Build a json object with data necessary to start a scan.
Definition openvasd.c:1633
char * openvasd_param_name(openvasd_param_t *param)
Get the parameter default.
Definition openvasd.c:1381
static void add_credential_to_scan_json(gpointer credentials, gpointer cred_array)
Definition openvasd.c:1554
openvasd_resp_t openvasd_get_scan_preferences(openvasd_connector_t conn)
Definition openvasd.c:1304
int openvasd_parsed_results(openvasd_connector_t conn, unsigned long first, unsigned long last, GSList **results)
Definition openvasd.c:877
int openvasd_param_mandatory(openvasd_param_t *param)
If the parameter is mandatory.
Definition openvasd.c:1437
openvasd_resp_t openvasd_get_vt_stream_init(openvasd_connector_t conn)
Initialized an curl multiperform handler which allows fetch feed metadata chunk by chunk.
Definition openvasd.c:365
int openvasd_parsed_performance(openvasd_connector_t conn, openvasd_get_performance_opts_t opts, gchar **graph, gchar **err)
Definition openvasd.c:1265
openvasd_resp_t openvasd_get_performance(openvasd_connector_t conn, openvasd_get_performance_opts_t opts)
Definition openvasd.c:1226
openvasd_target_t * openvasd_target_new(const gchar *scanid, const gchar *hosts, const gchar *ports, const gchar *exclude_hosts, int reverse_lookup_unify, int reverse_lookup_only)
Create a new openvasd target.
Definition openvasd.c:1843
void openvasd_result_free(openvasd_result_t result)
Definition openvasd.c:777
char * openvasd_get_result_member_str(openvasd_result_t result, openvasd_result_member_string_t member)
Definition openvasd.c:725
#define RESP_CODE_OK
Definition openvasd.c:32
int openvasd_get_scan_progress(openvasd_connector_t conn)
Definition openvasd.c:1035
static void add_port_to_scan_json(gpointer range, gpointer p_array)
Definition openvasd.c:1530
static openvasd_status_t get_status_code_from_openvas(const gchar *status_val)
Definition openvasd.c:1041
char * openvasd_param_type(openvasd_param_t *param)
Get the parameter type.
Definition openvasd.c:1409
openvasd_connector_t openvasd_connector_new(void)
Initialize an openvasd connector.
Definition openvasd.c:109
openvasd_resp_t openvasd_get_health_alive(openvasd_connector_t conn)
Definition openvasd.c:1165
void openvasd_target_set_finished_hosts(openvasd_target_t *target, const gchar *finished_hosts)
Set the finished hosts of an openvasd target.
Definition openvasd.c:1872
openvasd_result_t openvasd_result_new(unsigned long id, gchar *type, gchar *ip_address, gchar *hostname, gchar *oid, gchar *port, gchar *protocol, gchar *message, gchar *detail_name, gchar *detail_value, gchar *detail_source_type, gchar *detail_source_name, gchar *detail_source_description)
Definition openvasd.c:692
static int get_member_value_or_fail(cJSON *reader, const gchar *member)
Get the value from an object or error.
Definition openvasd.c:938
void openvasd_vt_single_free(openvasd_vt_single_t *vt_single)
Free a single openvasd VT, including all preference values.
Definition openvasd.c:1969
openvasd_resp_t openvasd_get_version(openvasd_connector_t conn)
Request HEAD.
Definition openvasd.c:342
char * openvasd_param_default(openvasd_param_t *param)
Get the parameter default.
Definition openvasd.c:1423
static void add_scan_preferences_to_scan_json(gpointer key, gpointer val, gpointer scan_prefs_array)
Definition openvasd.c:1581
openvasd_resp_t openvasd_get_vts(openvasd_connector_t conn)
Get VT's metadata.
Definition openvasd.c:505
int openvasd_get_vt_stream(openvasd_connector_t conn)
Get a new feed metadata chunk.
Definition openvasd.c:467
openvasd_resp_t openvasd_start_scan(openvasd_connector_t conn, gchar *data)
Definition openvasd.c:531
static void add_vts_to_scan_json(gpointer single_vt, gpointer vts_array)
Definition openvasd.c:1591
void openvasd_vt_single_add_value(openvasd_vt_single_t *vt_single, const gchar *name, const gchar *value)
Add a preference value to an openvasd VT.
Definition openvasd.c:1990
static int parse_status(const gchar *body, openvasd_scan_status_t status_info)
Definition openvasd.c:1062
openvasd_resp_t openvasd_get_health_started(openvasd_connector_t conn)
Definition openvasd.c:1206
openvasd_error_t openvasd_connector_free(openvasd_connector_t conn)
Build a openvasd connector.
Definition openvasd.c:188
openvasd_resp_t openvasd_delete_scan(openvasd_connector_t conn)
Definition openvasd.c:1125
void openvasd_response_cleanup(openvasd_resp_t resp)
Free an openvasd response struct.
Definition openvasd.c:213
static int openvasd_get_scan_progress_ext(openvasd_connector_t conn, openvasd_resp_t response)
Definition openvasd.c:949
void openvasd_target_add_alive_test_methods(openvasd_target_t *target, gboolean icmp, gboolean tcp_syn, gboolean tcp_ack, gboolean arp, gboolean consider_alive)
Add alive test methods to openvasd target.
Definition openvasd.c:1912
gchar * openvasd_vt_stream_str(openvasd_connector_t conn)
Definition openvasd.c:444
openvasd_resp_t openvasd_stop_scan(openvasd_connector_t conn)
Definition openvasd.c:613
openvasd_resp_t openvasd_get_health_ready(openvasd_connector_t conn)
Definition openvasd.c:1185
static gvm_http_headers_t * init_customheader(const gchar *apikey, gboolean contenttype)
Definition openvasd.c:225
char * openvasd_param_id(openvasd_param_t *param)
Get the parameter id.
Definition openvasd.c:1367
static int parse_results(const gchar *body, GSList **results)
Definition openvasd.c:798
static openvasd_param_t * openvasd_param_new(char *id, gchar *name, gchar *defval, gchar *description, gchar *type, int mandatory)
Create a new openvasd parameter.
Definition openvasd.c:1330
int openvasd_parsed_scans_preferences(openvasd_connector_t conn, GSList **params)
Definition openvasd.c:1446
openvasd_vt_single_t * openvasd_vt_single_new(const gchar *vt_id)
Create a new single openvasd VT.
Definition openvasd.c:1951
openvasd_error_t openvasd_connector_builder(openvasd_connector_t conn, openvasd_conn_opt_t opt, const void *val)
Build a openvasd connector.
Definition openvasd.c:132
openvasd_resp_t openvasd_get_scan_status(openvasd_connector_t conn)
Definition openvasd.c:895
API for Openvas Daemon communication.
@ ID
Definition openvasd.h:78
enum OPENVASD_RESULT_MEMBER_STRING openvasd_result_member_string_t
Definition openvasd.h:122
struct openvasd_credential openvasd_credential_t
Definition openvasd.h:232
@ OPENVASD_INVALID_OPT
Definition openvasd.h:41
@ OPENVASD_INVALID_VALUE
Definition openvasd.h:43
@ OPENVASD_OK
Definition openvasd.h:45
struct openvasd_vt_single openvasd_vt_single_t
Definition openvasd.h:230
struct openvasd_connector * openvasd_connector_t
Definition openvasd.h:130
struct openvasd_target openvasd_target_t
Definition openvasd.h:228
@ OPENVASD_API_KEY
Definition openvasd.h:54
@ OPENVASD_CA_CERT
Definition openvasd.h:51
@ OPENVASD_KEY
Definition openvasd.h:53
@ OPENVASD_SCAN_ID
Definition openvasd.h:57
@ OPENVASD_PROTOCOL
Definition openvasd.h:55
@ OPENVASD_CERT
Definition openvasd.h:52
@ OPENVASD_PORT
Definition openvasd.h:58
@ OPENVASD_HOST
Definition openvasd.h:56
struct openvasd_param openvasd_param_t
Definition openvasd.h:199
openvasd_status_t
Openvasd scan status.
Definition openvasd.h:85
@ OPENVASD_SCAN_STATUS_SUCCEEDED
Definition openvasd.h:92
@ OPENVASD_SCAN_STATUS_RUNNING
Definition openvasd.h:90
@ OPENVASD_SCAN_STATUS_STOPPED
Definition openvasd.h:91
@ OPENVASD_SCAN_STATUS_STORED
Definition openvasd.h:88
@ OPENVASD_SCAN_STATUS_REQUESTED
Definition openvasd.h:89
@ OPENVASD_SCAN_STATUS_ERROR
Definition openvasd.h:86
@ OPENVASD_SCAN_STATUS_FAILED
Definition openvasd.h:87
struct openvasd_result * openvasd_result_t
Definition openvasd.h:128
enum OPENVASD_CONNECTOR_OPTS openvasd_conn_opt_t
Definition openvasd.h:124
enum OPENVASD_RESULT_MEMBER_INT openvasd_result_member_int_t
Definition openvasd.h:120
struct openvasd_scan_status * openvasd_scan_status_t
Definition openvasd.h:132
struct openvasd_response * openvasd_resp_t
Definition openvasd.h:118
enum OPENVASD_ERROR openvasd_error_t
Definition openvasd.h:126
@ DETAIL_NAME
Definition openvasd.h:69
@ DETAIL_VALUE
Definition openvasd.h:70
@ DETAIL_SOURCE_DESCRIPTION
Definition openvasd.h:73
@ DETAIL_SOURCE_NAME
Definition openvasd.h:71
@ PORT
Definition openvasd.h:67
@ DETAIL_SOURCE_TYPE
Definition openvasd.h:72
@ HOSTNAME
Definition openvasd.h:65
@ MESSAGE
Definition openvasd.h:68
@ TYPE
Definition openvasd.h:63
@ IP_ADDRESS
Definition openvasd.h:64
@ OID
Definition openvasd.h:66
Struct holding the data for connecting with openvasd.
Definition openvasd.c:38
gchar * apikey
Definition openvasd.c:42
gvm_http_response_stream_t stream_resp
Definition openvasd.c:47
gchar * key
Definition openvasd.c:41
gchar * cert
Definition openvasd.c:40
int port
Definition openvasd.c:45
gchar * protocol
Definition openvasd.c:46
gchar * ca_cert
Definition openvasd.c:39
gchar * scan_id
Definition openvasd.c:44
gchar * host
Definition openvasd.c:43
Struct credential information for openvasd.
Definition openvasd.c:67
gchar * type
Definition openvasd.c:68
gchar * port
Definition openvasd.c:70
gchar * service
Definition openvasd.c:69
GHashTable * auth_data
Definition openvasd.c:71
Struct holding options for openvasd parameters.
Definition openvasd.c:54
gchar * id
Definition openvasd.c:55
gchar * description
Definition openvasd.c:58
gchar * defval
Definition openvasd.c:57
gchar * name
Definition openvasd.c:56
int mandatory
Definition openvasd.c:60
gchar * type
Definition openvasd.c:59
gchar * header
Definition openvasd.h:99
gchar * body
Definition openvasd.h:98
long code
Definition openvasd.h:97
Struct to hold an scan result.
Definition openvasd.h:23
gchar * ip_address
Definition openvasd.h:26
gchar * oid
Definition openvasd.h:28
gchar * detail_source_name
Definition openvasd.h:34
gchar * message
Definition openvasd.h:30
gchar * type
Definition openvasd.h:25
gchar * detail_source_description
Definition openvasd.h:35
gchar * port
Definition openvasd.h:29
gchar * hostname
Definition openvasd.h:27
gchar * detail_name
Definition openvasd.h:31
unsigned long id
Definition openvasd.h:24
gchar * detail_value
Definition openvasd.h:32
gchar * detail_source_type
Definition openvasd.h:33
Definition openvasd.h:103
int progress
Definition openvasd.h:106
time_t start_time
Definition openvasd.h:104
long response_code
Definition openvasd.h:108
time_t end_time
Definition openvasd.h:105
openvasd_status_t status
Definition openvasd.h:107
Struct holding target information.
Definition openvasd.c:78
int reverse_lookup_only
Definition openvasd.c:91
gboolean icmp
Definition openvasd.c:85
gchar * ports
Definition openvasd.c:83
gboolean tcp_ack
Definition openvasd.c:87
gchar * exclude_hosts
Definition openvasd.c:81
int reverse_lookup_unify
Definition openvasd.c:90
gboolean arp
Definition openvasd.c:88
GSList * credentials
Definition openvasd.c:80
gboolean tcp_syn
Definition openvasd.c:86
gboolean consider_alive
Definition openvasd.c:89
gchar * finished_hosts
Definition openvasd.c:84
gchar * hosts
Definition openvasd.c:82
gchar * scan_id
Definition openvasd.c:79
Struct holding vt information.
Definition openvasd.c:98
gchar * vt_id
Definition openvasd.c:99
GHashTable * vt_values
Definition openvasd.c:100
A port range.
Definition networking.h:35
int start
Definition networking.h:40
port_protocol_t type
Definition networking.h:41
int end
Definition networking.h:38