17#include <cjson/cJSON.h>
20#include <curl/multi.h>
21#include <netinet/in.h>
31#define G_LOG_DOMAIN "libgvm ovd"
33#define RESP_CODE_ERR -1
161 CURLMsg *msg = curl_multi_info_read (h->
h, &queued);
164 if (msg->msg == CURLMSG_DONE)
166 curl_multi_remove_handle (h->
h, msg->easy_handle);
167 curl_easy_cleanup (msg->easy_handle);
169 curl_multi_cleanup (h->
h);
172 g_warning (
"%s: Not possible to clean up the curl handler", __func__);
187 s->
ptr = g_malloc0 (s->
len + 1);
221 s->
ptr = g_malloc0 (s->
len + 1);
269 conn->
ca_cert = g_strdup ((
char *) val);
272 conn->
cert = g_strdup ((
char *) val);
275 conn->
key = g_strdup ((
char *) val);
278 conn->
apikey = g_strdup ((
char *) val);
281 conn->
server = g_strdup ((
char *) val);
284 conn->
host = g_strdup ((
char *) val);
287 conn->
scan_id = g_strdup ((
const gchar *) val);
291 conn->
port = *((
int *) val);
352 size_t new_len = s->
len + size * nmemb;
353 gchar *ptr_aux = g_realloc (s->
ptr, new_len + 1);
355 memcpy (s->
ptr + s->
len, ptr, size * nmemb);
356 s->
ptr[new_len] =
'\0';
362static struct curl_slist *
365 struct curl_slist *customheader = NULL;
366 struct curl_slist *temp = NULL;
372 xapikey = g_string_new (
"X-API-KEY: ");
373 g_string_append (xapikey, apikey);
374 temp = curl_slist_append (customheader, xapikey->str);
376 g_warning (
"%s: Not possible to set API-KEY", __func__);
379 g_string_free (xapikey, TRUE);
384 temp = curl_slist_append (customheader,
"Content-Type: application/json");
386 g_warning (
"%s: Not possible to set Content-Type", __func__);
412 gchar *data,
struct curl_slist *customheader, gchar **err)
419 *err = g_strdup (
"{\"error\": \"Missing openvasd connector\"}");
420 g_warning (
"%s: Missing openvasd connector", __func__);
424 curl = curl_easy_init ();
428 g_strdup (
"{\"error\": \"Not possible to initialize curl library\"}");
429 g_warning (
"%s: Not possible to initialize curl library", __func__);
433 url = g_string_new (g_strdup (conn->
server));
435 if (conn->
port > 0 && conn->
port < 65535)
438 g_snprintf (buf,
sizeof (buf),
":%d", conn->
port);
439 g_string_append (url, buf);
442 if (path != NULL && path[0] !=
'\0')
443 g_string_append (url, path);
446 g_debug (
"%s: URL: %s", __func__, url->str);
447 if (curl_easy_setopt (curl, CURLOPT_URL, url->str) != CURLE_OK)
449 g_string_free (url, TRUE);
450 g_warning (
"%s: Not possible to set the URL", __func__);
451 curl_easy_cleanup (curl);
452 *err = g_strdup (
"{\"error\": \"Not possible to set URL\"}");
455 g_string_free (url, TRUE);
460 struct curl_blob blob;
462 blob.len = strlen (conn->
ca_cert);
463 blob.flags = CURL_BLOB_COPY;
465 curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 1L);
466 curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 1L);
467 if (curl_easy_setopt (curl, CURLOPT_CAINFO_BLOB, &blob) != CURLE_OK)
469 g_warning (
"%s: Not possible to set the CA certificate", __func__);
470 curl_easy_cleanup (curl);
472 g_strdup (
"{\"error\": \"Not possible to set CA certificate\"}");
479 curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0L);
480 curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 0L);
481 curl_easy_setopt (curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2);
482 g_debug (
"%s: Server certificate verification disabled.", __func__);
486 if (conn->
cert != NULL && conn->
key != NULL)
488 struct curl_blob blob;
489 blob.data = conn->
cert;
490 blob.len = strlen (conn->
cert);
491 blob.flags = CURL_BLOB_COPY;
493 if (curl_easy_setopt (curl, CURLOPT_SSLCERT_BLOB, &blob) != CURLE_OK)
495 g_warning (
"%s: Not possible to set the Client certificate",
497 curl_easy_cleanup (curl);
499 "{\"error\": \"Not possible to set Client certificate\"}");
502 blob.data = conn->
key;
503 blob.len = strlen (conn->
key);
504 blob.flags = CURL_BLOB_COPY;
506 if (curl_easy_setopt (curl, CURLOPT_SSLKEY_BLOB, &blob) != CURLE_OK)
508 g_warning (
"%s: Not possible to set the Client private key",
510 curl_easy_cleanup (curl);
512 "{\"error\": \"Not possible to set Client private key\"}");
520 if (data != NULL && data[0] !=
'\0')
523 curl_easy_setopt (curl, CURLOPT_POSTFIELDS, data);
524 curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, strlen (data));
528 curl_easy_setopt (curl, CURLOPT_HTTPGET, 1L);
531 curl_easy_setopt (curl, CURLOPT_CUSTOMREQUEST,
"DELETE");
534 curl_easy_setopt (curl, CURLOPT_CUSTOMREQUEST,
"HEAD");
538 if (customheader != NULL)
539 curl_easy_setopt (curl, CURLOPT_HTTPHEADER, customheader);
543 curl_easy_setopt (curl, CURLOPT_WRITEDATA, conn->
stream_resp);
568 ret = curl_easy_perform (curl);
571 g_warning (
"%s: Error sending request: %d", __func__, ret);
572 curl_easy_cleanup (curl);
573 response->
code = http_code;
574 response->
body = g_strdup (
"{\"error\": \"Error sending request\"}");
578 curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code);
581 struct curl_header *hname;
582 curl_easy_header (curl, header_name, 0, CURLH_HEADER, -1, &hname);
583 response->
header = g_strdup (hname->value);
585 curl_easy_cleanup (curl);
586 response->
code = http_code;
604 struct curl_slist *customheader = NULL;
609 hnd =
handler (conn,
HEAD,
"/", NULL, customheader, &err);
612 curl_slist_free_all (customheader);
614 response->
body = err;
620 curl_slist_free_all (customheader);
648 struct curl_slist *customheader = NULL;
652 path = g_string_new (
"/vts?information=1");
654 hnd =
handler (conn,
GET, path->str, NULL, customheader, &err);
657 curl_slist_free_all (customheader);
658 g_string_free (path, TRUE);
660 response->
body = err;
663 g_string_free (path, TRUE);
665 h = curl_multi_init ();
666 curl_multi_add_handle (h, hnd);
707 static int running = 0;
714 CURLMcode mc = curl_multi_perform (h, &running);
717 mc = curl_multi_poll (h, NULL, 0, 5000, NULL);
720 g_warning (
"%s: error on curl_multi_poll(): %d\n", __func__, mc);
742 struct curl_slist *customheader = NULL;
746 path = g_string_new (
"/vts?information=1");
748 hnd =
handler (conn,
GET, path->str, NULL, customheader, &err);
751 curl_slist_free_all (customheader);
752 g_string_free (path, TRUE);
754 response->
body = err;
757 g_string_free (path, TRUE);
760 curl_slist_free_all (customheader);
780 cJSON *parser = NULL;
784 struct curl_slist *customheader = NULL;
789 hnd =
handler (conn,
POST,
"/scans", data, customheader, &err);
792 curl_slist_free_all (customheader);
794 response->
body = err;
799 curl_slist_free_all (customheader);
803 if (response->
body == NULL)
805 g_strdup (
"{\"error\": \"Storing scan configuration\"}");
806 g_warning (
"%s: Error storing scan configuration ", __func__);
815 const gchar *error_ptr = cJSON_GetErrorPtr ();
816 g_warning (
"%s: Error parsing json string to get the scan ID", __func__);
817 if (error_ptr != NULL)
819 response->
body = g_strdup_printf (
"{\"error\": \"%s\"}", error_ptr);
820 g_warning (
"%s: %s", __func__, error_ptr);
824 response->
body = g_strdup (
825 "{\"error\": \"Parsing json string to get the scan ID\"}");
828 cJSON_Delete (parser);
833 conn->
scan_id = g_strdup (cJSON_GetStringValue (parser));
836 path = g_string_new (
"/scans");
839 g_string_append (path,
"/");
840 g_string_append (path, conn->
scan_id);
845 response->
body = g_strdup (
"{\"error\": \"Missing scan ID\"}");
846 g_string_free (path, TRUE);
847 g_warning (
"%s: Missing scan ID", __func__);
848 cJSON_Delete (parser);
854 hnd =
handler (conn,
POST, path->str,
"{\"action\": \"start\"}", customheader,
858 curl_slist_free_all (customheader);
859 g_string_free (path, TRUE);
861 response->
body = err;
864 g_string_free (path, TRUE);
867 curl_slist_free_all (customheader);
871 if (response->
body == NULL)
872 response->
body = g_strdup (
"{\"error\": \"Starting the scan.\"}");
873 g_warning (
"%s: Error starting the scan.", __func__);
877 cJSON_Delete (parser);
890 struct curl_slist *customheader = NULL;
895 path = g_string_new (
"/scans");
898 g_string_append (path,
"/");
899 g_string_append (path, conn->
scan_id);
904 response->
body = g_strdup (
"{\"error\": \"Missing scan ID\"}");
905 g_string_free (path, TRUE);
906 g_warning (
"%s: Missing scan ID", __func__);
911 hnd =
handler (conn,
POST, path->str,
"{\"action\": \"stop\"}", customheader,
915 curl_slist_free_all (customheader);
916 g_string_free (path, TRUE);
918 response->
body = err;
921 g_string_free (path, TRUE);
924 curl_slist_free_all (customheader);
936 GString *path = NULL;
939 struct curl_slist *customheader = NULL;
943 path = g_string_new (
"/scans");
946 g_string_append (path,
"/");
947 g_string_append (path, conn->
scan_id);
949 g_string_append_printf (path,
"/results?range%ld-%ld", first, last);
950 else if (last < first)
951 g_string_append_printf (path,
"/results?range=%ld", first);
953 g_string_append (path,
"/results");
958 response->
body = g_strdup (
"{\"error\": \"Missing scan ID\"}");
959 g_string_free (path, TRUE);
960 g_warning (
"%s: Missing scan ID", __func__);
965 hnd =
handler (conn,
GET, path->str, NULL, customheader, &err);
968 curl_slist_free_all (customheader);
969 g_string_free (path, TRUE);
971 response->
body = err;
974 g_string_free (path, TRUE);
977 curl_slist_free_all (customheader);
982 g_warning (
"%s: Not possible to get scan results", __func__);
984 g_strdup (
"{\"error\": \"Not possible to get scan results\"}");
993 gchar *hostname, gchar *oid,
int port, gchar *protocol,
994 gchar *message, gchar *detail_name, gchar *detail_value,
995 gchar *detail_source_type, gchar *detail_source_name,
996 gchar *detail_source_description)
1001 result->
type = g_strdup (type);
1003 result->
hostname = g_strdup (hostname);
1004 result->
oid = g_strdup (oid);
1005 result->
port = port;
1006 result->
protocol = g_strdup (protocol);
1007 result->
message = g_strdup (message);
1026 return result->
type;
1065 return result->
port;
1077 g_free (result->
type);
1080 g_free (result->
oid);
1096 cJSON *result_obj = NULL;
1097 const gchar *err = NULL;
1101 parser = cJSON_Parse (body);
1104 err = cJSON_GetErrorPtr ();
1107 if (!cJSON_IsArray (parser))
1113 cJSON_ArrayForEach (result_obj, parser)
1116 gchar *detail_name = NULL;
1117 gchar *detail_value = NULL;
1118 gchar *detail_source_type = NULL;
1119 gchar *detail_source_name = NULL;
1120 gchar *detail_source_description = NULL;
1122 if (!cJSON_IsObject (result_obj))
1126 item = cJSON_GetObjectItem (result_obj,
"detail");
1128 && cJSON_IsObject (item))
1130 cJSON *detail_obj = NULL;
1135 detail_obj = cJSON_GetObjectItem (item,
"source");
1136 if (detail_obj && cJSON_IsObject (detail_obj))
1152 detail_name, detail_value,
1153 detail_source_type, detail_source_name,
1154 detail_source_description);
1156 *results = g_slist_append (*results, result);
1163 g_warning (
"%s: Unable to parse scan results. Reason: %s", __func__, err);
1165 cJSON_Delete (parser);
1172 unsigned long last, GSList **results)
1178 if (resp->
code == 200)
1192 GString *path = NULL;
1195 struct curl_slist *customheader = NULL;
1199 path = g_string_new (
"/scans");
1202 g_string_append (path,
"/");
1203 g_string_append (path, conn->
scan_id);
1204 g_string_append (path,
"/status");
1209 response->
body = g_strdup (
"{\"error\": \"Missing scan ID\"}");
1210 g_string_free (path, TRUE);
1211 g_warning (
"%s: Missing scan ID", __func__);
1216 hnd =
handler (conn,
GET, path->str, NULL, customheader, &err);
1219 curl_slist_free_all (customheader);
1220 g_string_free (path, TRUE);
1222 response->
body = err;
1225 g_string_free (path, TRUE);
1228 curl_slist_free_all (customheader);
1234 g_strdup (
"{\"error\": \"Not possible to get scan status\"}");
1235 g_warning (
"%s: Not possible to get scan status", __func__);
1262 cJSON *reader = NULL;
1263 const gchar *err = NULL;
1264 int all = 0, excluded = 0, dead = 0, alive = 0, queued = 0, finished = 0;
1265 int running_hosts_progress_sum = 0;
1270 if (!response && !conn)
1273 if (response == NULL)
1278 if (resp->
code == 404)
1280 else if (resp->
code != 200)
1283 parser = cJSON_Parse (resp->
body);
1286 err = cJSON_GetErrorPtr ();
1290 reader = cJSON_GetObjectItem (parser,
"host_info");
1295 if (!cJSON_IsObject (reader))
1312 scanning = cJSON_GetObjectItem (reader,
"scanning");
1313 if (scanning != NULL
1314 && cJSON_IsObject (scanning))
1316 cJSON *host = scanning->child;
1319 running_hosts_progress_sum += cJSON_GetNumberValue (host);
1326 if (all < 0 || excluded < 0 || dead < 0 || alive < 0 || queued < 0
1332 if ((all + finished - dead) > 0)
1333 progress = (running_hosts_progress_sum + 100 * (alive + finished))
1334 / (all + finished - dead);
1340 g_warning (
"%s: Unable to parse scan status. Reason: %s", __func__, err);
1341 cJSON_Delete (parser);
1357 if (g_strcmp0 (status_val,
"stored") == 0)
1359 else if (g_strcmp0 (status_val,
"requested") == 0)
1361 else if (g_strcmp0 (status_val,
"running") == 0)
1363 else if (g_strcmp0 (status_val,
"stopped") == 0)
1365 else if (g_strcmp0 (status_val,
"succeeded") == 0)
1367 else if (g_strcmp0 (status_val,
"interrupted") == 0)
1377 gchar *status_val = NULL;
1383 parser = cJSON_Parse (body);
1389 cJSON_Delete (parser);
1395 status_info->
status = status_code;
1398 cJSON_Delete (parser);
1423 status_info->
status = status_code;
1443 struct curl_slist *customheader = NULL;
1448 path = g_string_new (
"/scans");
1451 g_string_append (path,
"/");
1452 g_string_append (path, conn->
scan_id);
1457 response->
body = g_strdup (
"{\"error\": \"Missing scan ID\"}");
1458 g_string_free (path, TRUE);
1459 g_warning (
"%s: Missing scan ID", __func__);
1464 hnd =
handler (conn,
DELETE, path->str, NULL, customheader, &err);
1467 curl_slist_free_all (customheader);
1468 g_string_free (path, TRUE);
1470 response->
body = err;
1473 g_string_free (path, TRUE);
1476 curl_slist_free_all (customheader);
1482 g_strdup (
"{\"error\": \"Not possible to delete scan.\"}");
1483 g_warning (
"%s: Not possible to delete scan", __func__);
1496 struct curl_slist *customheader = NULL;
1501 hnd =
handler (conn,
GET,
"/health/alive", NULL, customheader, &err);
1504 curl_slist_free_all (customheader);
1506 response->
body = err;
1511 curl_slist_free_all (customheader);
1517 g_strdup (
"{\"error\": \"Not possible to get health information.\"}");
1518 g_warning (
"%s: Not possible to get health information", __func__);
1531 struct curl_slist *customheader = NULL;
1536 hnd =
handler (conn,
GET,
"/health/ready", NULL, customheader, &err);
1540 response->
body = err;
1545 curl_slist_free_all (customheader);
1551 g_strdup (
"{\"error\": \"Not possible to get health information.\"}");
1552 g_warning (
"%s: Not possible to get health information", __func__);
1565 struct curl_slist *customheader = NULL;
1570 hnd =
handler (conn,
GET,
"/health/started", NULL, customheader, &err);
1573 curl_slist_free_all (customheader);
1575 response->
body = err;
1580 curl_slist_free_all (customheader);
1586 g_strdup (
"{\"error\": \"Not possible to get health information.\"}");
1587 g_warning (
"%s: Not possible to get health information", __func__);
1600 struct curl_slist *customheader = NULL;
1606 handler (conn,
GET,
"/scans/preferences", NULL, customheader, &err))
1609 curl_slist_free_all (customheader);
1611 response->
body = err;
1616 curl_slist_free_all (customheader);
1622 g_strdup (
"{\"error\": \"Not possible to get scans preferences.\"}");
1623 g_warning (
"%s: Not possible to get scans_preferences", __func__);
1637 gchar *type,
int mandatory)
1661 g_free (param->
name);
1664 g_free (param->
type);
1756 cJSON *param_obj = NULL;
1761 if (resp->
code != 200)
1765 parser = cJSON_Parse (resp->
body);
1766 if (parser == NULL || !cJSON_IsArray (parser))
1772 cJSON_ArrayForEach (param_obj, parser)
1774 gchar *defval = NULL, *param_type = NULL;
1776 int val, mandatory = 0;
1780 item = cJSON_GetObjectItem (param_obj,
"default");
1783 if (cJSON_IsNumber (item))
1785 val = item->valueint;
1786 g_snprintf (buf,
sizeof (buf),
"%d", val);
1787 defval = g_strdup (buf);
1788 param_type = g_strdup (
"integer");
1790 else if (cJSON_IsString (item))
1792 defval = g_strdup (item->valuestring);
1793 param_type = g_strdup (
"string");
1795 else if (cJSON_IsBool (item))
1797 if (cJSON_IsTrue (item))
1798 defval = g_strdup (
"yes");
1800 defval = g_strdup (
"no");
1801 param_type = g_strdup (
"boolean");
1805 g_warning (
"%s: Unable to parse scan preferences.", __func__);
1807 g_free (param_type);
1817 g_strdup (param_type), mandatory);
1819 g_free (param_type);
1820 *params = g_slist_append (*params, param);
1825 cJSON_Delete (parser);
1828 g_warning (
"%s: Unable to parse scan preferences.", __func__);
1841 cJSON *port = cJSON_CreateObject ();
1842 if (ports->
type == 1)
1843 cJSON_AddStringToObject (port,
"protocol",
"udp");
1845 cJSON_AddStringToObject (port,
"protocol",
"tcp");
1847 cJSON *ranges_array = cJSON_CreateArray ();
1848 cJSON *range_obj = cJSON_CreateObject ();
1849 cJSON_AddNumberToObject (range_obj,
"start", ports->
start);
1851 if (ports->
end > ports->
start && ports->
end < 65535)
1852 cJSON_AddNumberToObject (range_obj,
"end", ports->
end);
1854 cJSON_AddNumberToObject (range_obj,
"end", ports->
start);
1855 cJSON_AddItemToArray (ranges_array, range_obj);
1856 cJSON_AddItemToObject (port,
"range", ranges_array);
1857 cJSON_AddItemToArray ((cJSON *) p_array, port);
1863 GHashTableIter auth_data_iter;
1864 gchar *auth_data_name, *auth_data_value;
1865 cJSON *cred_obj = NULL;
1869 cred_obj = cJSON_CreateObject ();
1870 cJSON_AddStringToObject (cred_obj,
"service", cred->
service);
1874 cJSON_AddNumberToObject (cred_obj,
"port", atoi (cred->
port));
1877 cJSON *cred_type_obj = cJSON_CreateObject ();
1878 g_hash_table_iter_init (&auth_data_iter, cred->
auth_data);
1879 while (g_hash_table_iter_next (&auth_data_iter, (gpointer *) &auth_data_name,
1880 (gpointer *) &auth_data_value))
1881 cJSON_AddStringToObject (cred_type_obj, auth_data_name, auth_data_value);
1882 cJSON_AddItemToObject (cred_obj, cred->
type, cred_type_obj);
1884 cJSON_AddItemToArray ((cJSON *) cred_array, cred_obj);
1889 gpointer scan_prefs_array)
1891 cJSON *pref_obj = cJSON_CreateObject ();
1892 cJSON_AddStringToObject (pref_obj,
"id", key);
1893 cJSON_AddStringToObject (pref_obj,
"value", val);
1894 cJSON_AddItemToArray (scan_prefs_array, pref_obj);
1900 GHashTableIter vt_data_iter;
1901 gchar *vt_param_id, *vt_param_value;
1905 cJSON *vt_obj = cJSON_CreateObject ();
1907 cJSON_AddStringToObject (vt_obj,
"oid", vt->
vt_id);
1911 cJSON *params_array = cJSON_CreateArray ();
1913 g_hash_table_iter_init (&vt_data_iter, vt->
vt_values);
1914 while (g_hash_table_iter_next (&vt_data_iter, (gpointer *) &vt_param_id,
1915 (gpointer *) &vt_param_value))
1917 cJSON *param_obj = cJSON_CreateObject ();
1918 cJSON_AddNumberToObject (param_obj,
"id", atoi (vt_param_id));
1919 cJSON_AddStringToObject (param_obj,
"value", vt_param_value);
1920 cJSON_AddItemToArray (params_array, param_obj);
1922 cJSON_AddItemToObject (vt_obj,
"parameters", params_array);
1924 cJSON_AddItemToArray (vts_array, vt_obj);
1941 GHashTable *scan_preferences, GSList *vts)
1943 cJSON *scan_obj = NULL;
1944 cJSON *target_obj = NULL;
1945 cJSON *hosts_array = NULL;
1946 cJSON *exclude_hosts_array = NULL;
1947 cJSON *finished_hosts_array = NULL;
1948 gchar *json_str = NULL;
1951 scan_obj = cJSON_CreateObject ();
1954 cJSON_AddStringToObject (scan_obj,
"scan_id", target->
scan_id);
1957 target_obj = cJSON_CreateObject ();
1960 hosts_array = cJSON_CreateArray ();
1961 gchar **hosts_list = g_strsplit (target->
hosts,
",", 0);
1962 for (
int i = 0; hosts_list[i] != NULL; i++)
1964 cJSON *host_item = NULL;
1965 host_item = cJSON_CreateString (hosts_list[i]);
1966 cJSON_AddItemToArray (hosts_array, host_item);
1968 g_strfreev (hosts_list);
1969 cJSON_AddItemToObject (target_obj,
"hosts", hosts_array);
1974 exclude_hosts_array = cJSON_CreateArray ();
1975 gchar **exclude_hosts_list = g_strsplit (target->
exclude_hosts,
",", 0);
1976 for (
int i = 0; exclude_hosts_list[i] != NULL; i++)
1978 cJSON *exclude_host_item = NULL;
1979 exclude_host_item = cJSON_CreateString (exclude_hosts_list[i]);
1980 cJSON_AddItemToArray (exclude_hosts_array, exclude_host_item);
1982 g_strfreev (exclude_hosts_list);
1983 cJSON_AddItemToObject (target_obj,
"excluded_hosts", exclude_hosts_array);
1989 finished_hosts_array = cJSON_CreateArray ();
1990 gchar **finished_hosts_list = g_strsplit (target->
finished_hosts,
",", 0);
1991 for (
int i = 0; finished_hosts_list[i] != NULL; i++)
1993 cJSON *finished_host_item = NULL;
1994 finished_host_item = cJSON_CreateString (finished_hosts_list[i]);
1995 cJSON_AddItemToArray (finished_hosts_array, finished_host_item);
1997 g_strfreev (hosts_list);
1998 cJSON_AddItemToObject (target_obj,
"finished_hosts",
1999 finished_hosts_array);
2003 if (target->
ports && target->
ports[0] !=
'\0')
2005 cJSON *ports_array = cJSON_CreateArray ();
2009 cJSON_AddItemToObject (target_obj,
"ports", ports_array);
2013 cJSON *credentials = cJSON_CreateArray ();
2016 cJSON_AddItemToObject (target_obj,
"credentials", credentials);
2020 cJSON_AddBoolToObject (target_obj,
"reverse_lookup_unify", cJSON_True);
2022 cJSON_AddBoolToObject (target_obj,
"reverse_lookup_unify", cJSON_False);
2025 cJSON_AddBoolToObject (target_obj,
"reverse_lookup_only", cJSON_True);
2027 cJSON_AddBoolToObject (target_obj,
"reverse_lookup_only", cJSON_False);
2030 cJSON *alive_test_methods = cJSON_CreateArray ();
2032 cJSON_AddItemToArray (alive_test_methods, cJSON_CreateString (
"arp"));
2034 cJSON_AddItemToArray (alive_test_methods, cJSON_CreateString (
"tcp_ack"));
2036 cJSON_AddItemToArray (alive_test_methods, cJSON_CreateString (
"tcp_syn"));
2038 cJSON_AddItemToArray (alive_test_methods,
2039 cJSON_CreateString (
"consider_alive"));
2041 cJSON_AddItemToArray (alive_test_methods, cJSON_CreateString (
"icmp"));
2042 cJSON_AddItemToObject (target_obj,
"alive_test_methods", alive_test_methods);
2044 cJSON_AddItemToObject (scan_obj,
"target", target_obj);
2047 cJSON *scan_prefs_array = cJSON_CreateArray ();
2050 cJSON_AddItemToObject (scan_obj,
"scan_preferences", scan_prefs_array);
2053 cJSON *vts_array = cJSON_CreateArray ();
2055 cJSON_AddItemToObject (scan_obj,
"vts", vts_array);
2057 json_str = cJSON_Print (scan_obj);
2058 cJSON_Delete (scan_obj);
2059 if (json_str == NULL)
2060 g_warning (
"%s: Error while creating JSON.", __func__);
2082 new_credential->
type = type ? g_strdup (type) : NULL;
2083 new_credential->
service = service ? g_strdup (service) : NULL;
2084 new_credential->
port = port ? g_strdup (port) : NULL;
2086 g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
2088 return new_credential;
2102 g_free (credential->
type);
2104 g_free (credential->
port);
2105 g_hash_table_destroy (credential->
auth_data);
2106 g_free (credential);
2118 const gchar *name,
const gchar *value)
2120 if (credential == NULL || name == NULL)
2123 if (g_regex_match_simple (
"^[[:alpha:]][[:alnum:]_]*$", name, 0, 0))
2126 g_hash_table_replace (credential->
auth_data, g_strdup (name),
2129 g_hash_table_remove (credential->
auth_data, name);
2133 g_warning (
"%s: Invalid auth data name: %s", __func__, name);
2151 const gchar *ports,
const gchar *exclude_hosts,
2152 int reverse_lookup_unify,
int reverse_lookup_only)
2157 if (scanid && *scanid)
2158 new_target->
scan_id = g_strdup (scanid);
2160 new_target->
exclude_hosts = exclude_hosts ? g_strdup (exclude_hosts) : NULL;
2162 new_target->
hosts = hosts ? g_strdup (hosts) : NULL;
2163 new_target->
ports = ports ? g_strdup (ports) : NULL;
2165 reverse_lookup_unify ? reverse_lookup_unify : 0;
2167 reverse_lookup_only ? reverse_lookup_only : 0;
2180 const gchar *finished_hosts)
2183 target->
finished_hosts = finished_hosts ? g_strdup (finished_hosts) : NULL;
2202 g_free (target->
hosts);
2203 g_free (target->
ports);
2220 gboolean icmp, gboolean tcp_syn,
2221 gboolean tcp_ack, gboolean arp,
2222 gboolean consider_alive)
2227 target->
icmp = icmp;
2244 if (!target || !credential)
2263 new_vt_single->
vt_id = vt_id ? g_strdup (vt_id) : NULL;
2265 g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
2267 return new_vt_single;
2281 g_hash_table_destroy (vt_single->
vt_values);
2283 g_free (vt_single->
vt_id);
2298 const gchar *name,
const gchar *value)
2300 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:2241
void openvasd_param_free(openvasd_param_t *param)
Free an Openvasd parameter.
Definition openvasd.c:1656
static CURL * handler(openvasd_connector_t conn, openvasd_req_method_t method, gchar *path, gchar *data, struct curl_slist *customheader, gchar **err)
Create a CURL handler.
Definition openvasd.c:411
#define RESP_CODE_ERR
Definition openvasd.c:33
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:2117
int openvasd_get_result_member_int(openvasd_result_t result, openvasd_result_member_int_t member)
Definition openvasd.c:1054
void openvasd_target_free(openvasd_target_t *target)
Free an Openvasd target, including all added credentials.
Definition openvasd.c:2192
openvasd_scan_status_t openvasd_parsed_scan_status(openvasd_connector_t conn)
Return a struct with the general scan status.
Definition openvasd.c:1411
char * openvasd_param_desc(openvasd_param_t *param)
Get the parameter description.
Definition openvasd.c:1701
openvasd_result_t openvasd_result_new(unsigned long id, gchar *type, gchar *ip_address, gchar *hostname, gchar *oid, int 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:992
void openvasd_reset_vt_stream(openvasd_connector_t conn)
Definition openvasd.c:676
void openvasd_credential_free(openvasd_credential_t *credential)
Free an Openvasd credential.
Definition openvasd.c:2097
size_t openvasd_vt_stream_len(openvasd_connector_t conn)
Definition openvasd.c:688
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:2075
openvasd_resp_t openvasd_get_scan_results(openvasd_connector_t conn, long first, long last)
Definition openvasd.c:933
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:1940
char * openvasd_param_name(openvasd_param_t *param)
Get the parameter default.
Definition openvasd.c:1687
static void add_credential_to_scan_json(gpointer credentials, gpointer cred_array)
Definition openvasd.c:1861
openvasd_resp_t openvasd_get_scan_preferences(openvasd_connector_t conn)
Definition openvasd.c:1595
static void openvasd_curlm_handler_close(openvasd_curlm_t *h)
Cleanup an openvasd curl handler.
Definition openvasd.c:156
int openvasd_parsed_results(openvasd_connector_t conn, unsigned long first, unsigned long last, GSList **results)
Definition openvasd.c:1171
int openvasd_param_mandatory(openvasd_param_t *param)
If the parameter is mandatory.
Definition openvasd.c:1743
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:641
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:2150
void openvasd_result_free(openvasd_result_t result)
Definition openvasd.c:1072
char * openvasd_get_result_member_str(openvasd_result_t result, openvasd_result_member_string_t member)
Definition openvasd.c:1018
#define RESP_CODE_OK
Definition openvasd.c:34
int openvasd_get_scan_progress(openvasd_connector_t conn)
Definition openvasd.c:1347
enum openvas_request_method openvasd_req_method_t
Definition openvasd.c:137
static struct curl_slist * init_customheader(const gchar *apikey, gboolean contenttype)
Definition openvasd.c:363
static void add_port_to_scan_json(gpointer range, gpointer p_array)
Definition openvasd.c:1837
static openvasd_status_t get_status_code_from_openvas(const gchar *status_val)
Definition openvasd.c:1353
char * openvasd_param_type(openvasd_param_t *param)
Get the parameter type.
Definition openvasd.c:1715
openvasd_connector_t openvasd_connector_new(void)
Initialize an openvasd connector.
Definition openvasd.c:231
struct openvasd_curlm openvasd_curlm_t
Wrapps a CURLM * handler and the custom header.
openvasd_resp_t openvasd_get_health_alive(openvasd_connector_t conn)
Definition openvasd.c:1491
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:2179
struct openvasd_string * openvasd_vt_stream_t
Definition openvasd.c:55
static int get_member_value_or_fail(cJSON *reader, const gchar *member)
Get the value from an object or error.
Definition openvasd.c:1247
void openvasd_vt_single_free(openvasd_vt_single_t *vt_single)
Free a single Openvasd VT, including all preference values.
Definition openvasd.c:2276
openvasd_resp_t openvasd_get_version(openvasd_connector_t conn)
Request HEAD.
Definition openvasd.c:599
static size_t response_callback_fn(void *ptr, size_t size, size_t nmemb, void *struct_string)
Call back function to stored the response.
Definition openvasd.c:349
char * openvasd_param_default(openvasd_param_t *param)
Get the parameter default.
Definition openvasd.c:1729
static void add_scan_preferences_to_scan_json(gpointer key, gpointer val, gpointer scan_prefs_array)
Definition openvasd.c:1888
openvasd_resp_t openvasd_get_vts(openvasd_connector_t conn)
Get VT's metadata.
Definition openvasd.c:736
int openvasd_get_vt_stream(openvasd_connector_t conn)
Get a new feed metadata chunk.
Definition openvasd.c:705
openvasd_resp_t openvasd_start_scan(openvasd_connector_t conn, gchar *data)
Definition openvasd.c:777
static void add_vts_to_scan_json(gpointer single_vt, gpointer vts_array)
Definition openvasd.c:1898
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:2297
static int parse_status(const gchar *body, openvasd_scan_status_t status_info)
Definition openvasd.c:1374
openvasd_resp_t openvasd_get_health_started(openvasd_connector_t conn)
Definition openvasd.c:1560
openvasd_error_t openvasd_connector_free(openvasd_connector_t conn)
Build a openvasd connector.
Definition openvasd.c:307
static openvasd_vt_stream_t openvasd_vt_stream_new(void)
Allocate the vt stream struct to hold the response and the curlm handler.
Definition openvasd.c:182
static void openvasd_vt_stream_reset(openvasd_vt_stream_t s)
Reinitialize the string struct to hold the response.
Definition openvasd.c:215
openvasd_resp_t openvasd_delete_scan(openvasd_connector_t conn)
Definition openvasd.c:1437
void openvasd_response_cleanup(openvasd_resp_t resp)
Free an openvasd response struct.
Definition openvasd.c:332
static int openvasd_get_scan_progress_ext(openvasd_connector_t conn, openvasd_resp_t response)
Definition openvasd.c:1258
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:2219
gchar * openvasd_vt_stream_str(openvasd_connector_t conn)
Definition openvasd.c:682
openvasd_resp_t openvasd_stop_scan(openvasd_connector_t conn)
Definition openvasd.c:884
openvasd_resp_t openvasd_get_health_ready(openvasd_connector_t conn)
Definition openvasd.c:1526
openvas_request_method
Request methods.
Definition openvasd.c:130
@ HEAD
Definition openvasd.c:133
@ GET
Definition openvasd.c:132
@ POST
Definition openvasd.c:131
@ DELETE
Definition openvasd.c:134
char * openvasd_param_id(openvasd_param_t *param)
Get the parameter id.
Definition openvasd.c:1673
static int parse_results(const gchar *body, GSList **results)
Definition openvasd.c:1093
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:1636
static openvasd_resp_t openvasd_send_request(CURL *curl, const gchar *header_name, openvasd_resp_t response)
Send request.
Definition openvasd.c:562
static openvasd_curlm_t * openvasd_curlm_handler_new(void)
Allocate openvasd curl handler.
Definition openvasd.c:145
int openvasd_parsed_scans_preferences(openvasd_connector_t conn, GSList **params)
Definition openvasd.c:1752
openvasd_vt_single_t * openvasd_vt_single_new(const gchar *vt_id)
Create a new single Openvasd VT.
Definition openvasd.c:2258
static void openvasd_vt_stream_free(openvasd_vt_stream_t s)
Cleanup the string struct to hold the response and the curl multiperform handler.
Definition openvasd.c:198
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:254
openvasd_resp_t openvasd_get_scan_status(openvasd_connector_t conn)
Definition openvasd.c:1189
API for Openvas Daemon communication.
@ ID
Definition openvasd.h:79
@ PORT
Definition openvasd.h:80
enum OPENVASD_RESULT_MEMBER_STRING openvasd_result_member_string_t
Definition openvasd.h:117
struct openvasd_credential openvasd_credential_t
Definition openvasd.h:220
@ OPENVASD_INVALID_OPT
Definition openvasd.h:42
@ OPENVASD_INVALID_VALUE
Definition openvasd.h:44
@ OPENVASD_OK
Definition openvasd.h:46
struct openvasd_vt_single openvasd_vt_single_t
Definition openvasd.h:218
struct openvasd_connector * openvasd_connector_t
Definition openvasd.h:125
struct openvasd_target openvasd_target_t
Definition openvasd.h:216
@ OPENVASD_API_KEY
Definition openvasd.h:55
@ OPENVASD_SERVER
Definition openvasd.h:56
@ OPENVASD_CA_CERT
Definition openvasd.h:52
@ OPENVASD_KEY
Definition openvasd.h:54
@ OPENVASD_SCAN_ID
Definition openvasd.h:58
@ OPENVASD_CERT
Definition openvasd.h:53
@ OPENVASD_PORT
Definition openvasd.h:59
@ OPENVASD_HOST
Definition openvasd.h:57
struct openvasd_param openvasd_param_t
Definition openvasd.h:187
openvasd_status_t
Openvasd scan status.
Definition openvasd.h:87
@ OPENVASD_SCAN_STATUS_SUCCEEDED
Definition openvasd.h:94
@ OPENVASD_SCAN_STATUS_RUNNING
Definition openvasd.h:92
@ OPENVASD_SCAN_STATUS_STOPPED
Definition openvasd.h:93
@ OPENVASD_SCAN_STATUS_STORED
Definition openvasd.h:90
@ OPENVASD_SCAN_STATUS_REQUESTED
Definition openvasd.h:91
@ OPENVASD_SCAN_STATUS_ERROR
Definition openvasd.h:88
@ OPENVASD_SCAN_STATUS_FAILED
Definition openvasd.h:89
struct openvasd_result * openvasd_result_t
Definition openvasd.h:123
enum OPENVASD_CONNECTOR_OPTS openvasd_conn_opt_t
Definition openvasd.h:119
enum OPENVASD_RESULT_MEMBER_INT openvasd_result_member_int_t
Definition openvasd.h:115
struct openvasd_scan_status * openvasd_scan_status_t
Definition openvasd.h:127
struct openvasd_response * openvasd_resp_t
Definition openvasd.h:113
enum OPENVASD_ERROR openvasd_error_t
Definition openvasd.h:121
@ DETAIL_NAME
Definition openvasd.h:70
@ DETAIL_VALUE
Definition openvasd.h:71
@ DETAIL_SOURCE_DESCRIPTION
Definition openvasd.h:74
@ PROTOCOL
Definition openvasd.h:68
@ DETAIL_SOURCE_NAME
Definition openvasd.h:72
@ DETAIL_SOURCE_TYPE
Definition openvasd.h:73
@ HOSTNAME
Definition openvasd.h:66
@ MESSAGE
Definition openvasd.h:69
@ TYPE
Definition openvasd.h:64
@ IP_ADDRESS
Definition openvasd.h:65
@ OID
Definition openvasd.h:67
Struct holding the data for connecting with Openvasd.
Definition openvasd.c:61
openvasd_vt_stream_t stream_resp
Definition openvasd.c:70
gchar * apikey
Definition openvasd.c:65
gchar * server
Definition openvasd.c:66
gchar * key
Definition openvasd.c:64
gchar * cert
Definition openvasd.c:63
int port
Definition openvasd.c:69
gchar * ca_cert
Definition openvasd.c:62
gchar * scan_id
Definition openvasd.c:68
gchar * host
Definition openvasd.c:67
Struct credential information for Openvasd.
Definition openvasd.c:90
gchar * type
Definition openvasd.c:91
gchar * port
Definition openvasd.c:93
gchar * service
Definition openvasd.c:92
GHashTable * auth_data
Definition openvasd.c:94
Wrapps a CURLM * handler and the custom header.
Definition openvasd.c:40
CURLM * h
Definition openvasd.c:41
struct curl_slist * customheader
Definition openvasd.c:42
Struct holding options for Openvasd parameters.
Definition openvasd.c:77
gchar * id
Definition openvasd.c:78
gchar * description
Definition openvasd.c:81
gchar * defval
Definition openvasd.c:80
gchar * name
Definition openvasd.c:79
int mandatory
Definition openvasd.c:83
gchar * type
Definition openvasd.c:82
gchar * header
Definition openvasd.h:101
gchar * body
Definition openvasd.h:100
long code
Definition openvasd.h:99
Struct to hold an scan result.
Definition openvasd.h:23
int port
Definition openvasd.h:29
gchar * ip_address
Definition openvasd.h:26
gchar * oid
Definition openvasd.h:28
gchar * protocol
Definition openvasd.h:30
gchar * detail_source_name
Definition openvasd.h:35
gchar * message
Definition openvasd.h:31
gchar * type
Definition openvasd.h:25
gchar * detail_source_description
Definition openvasd.h:36
gchar * hostname
Definition openvasd.h:27
gchar * detail_name
Definition openvasd.h:32
unsigned long id
Definition openvasd.h:24
gchar * detail_value
Definition openvasd.h:33
gchar * detail_source_type
Definition openvasd.h:34
Definition openvasd.h:105
int progress
Definition openvasd.h:108
time_t start_time
Definition openvasd.h:106
long response_code
Definition openvasd.h:110
time_t end_time
Definition openvasd.h:107
openvasd_status_t status
Definition openvasd.h:109
Define a string struct for storing the response and the curl handler.
Definition openvasd.c:49
openvasd_curlm_t * curl_hnd
Definition openvasd.c:52
gchar * ptr
Definition openvasd.c:50
size_t len
Definition openvasd.c:51
Struct holding target information.
Definition openvasd.c:101
int reverse_lookup_only
Definition openvasd.c:114
gboolean icmp
Definition openvasd.c:108
gchar * ports
Definition openvasd.c:106
gboolean tcp_ack
Definition openvasd.c:110
gchar * exclude_hosts
Definition openvasd.c:104
int reverse_lookup_unify
Definition openvasd.c:113
gboolean arp
Definition openvasd.c:111
GSList * credentials
Definition openvasd.c:103
gboolean tcp_syn
Definition openvasd.c:109
gboolean consider_alive
Definition openvasd.c:112
gchar * finished_hosts
Definition openvasd.c:107
gchar * hosts
Definition openvasd.c:105
gchar * scan_id
Definition openvasd.c:102
Struct holding vt information.
Definition openvasd.c:121
gchar * vt_id
Definition openvasd.c:122
GHashTable * vt_values
Definition openvasd.c:123
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