diff --git a/openvasd/openvasd.c b/openvasd/openvasd.c index 5e3bf6d6..3541e946 100644 --- a/openvasd/openvasd.c +++ b/openvasd/openvasd.c @@ -1184,7 +1184,8 @@ parse_results (const gchar *body, GSList **results) && cJSON_IsString (source_obj)) detail_source_name = g_strdup (source_obj->valuestring); - if ((source_obj = cJSON_GetObjectItem (detail_obj, "description")) != NULL + if ((source_obj = cJSON_GetObjectItem (detail_obj, "description")) + != NULL && cJSON_IsString (source_obj)) detail_source_description = g_strdup (source_obj->valuestring); } @@ -1199,7 +1200,7 @@ parse_results (const gchar *body, GSList **results) ret = 200; } - res_cleanup: +res_cleanup: if (err != NULL) { g_warning ("%s: Unable to parse scan results. Reason: %s", __func__, err); @@ -1410,6 +1411,48 @@ get_status_code_from_openvas (const gchar *status_val) return status_code; } +static int +parse_status (const gchar *body, openvasd_scan_status_t status_info) +{ + cJSON *parser = NULL; + cJSON *status = NULL; + gchar *status_val = NULL; + time_t start_time = 0, end_time = 0; + openvasd_status_t status_code = OPENVASD_SCAN_STATUS_ERROR; + + if (!status_info) + return -1; + + if ((parser = cJSON_Parse (body)) == NULL) + return -1; + + if ((status = cJSON_GetObjectItem (parser, "status")) == NULL + || !cJSON_IsString (status)) + { + cJSON_Delete (parser); + return -1; + } + + status_val = g_strdup (status->valuestring); + status_code = get_status_code_from_openvas (status_val); + g_free (status_val); + + if ((status = cJSON_GetObjectItem (parser, "start_time")) != NULL + && cJSON_IsNumber (status)) + start_time = status->valuedouble; + + if ((status = cJSON_GetObjectItem (parser, "end_time")) != NULL + && cJSON_IsNumber (status)) + end_time = status->valuedouble; + cJSON_Delete (parser); + + status_info->status = status_code; + status_info->end_time = end_time; + status_info->start_time = start_time; + + return 0; +} + /** @brief Return a struct with the general scan status * * @param conn Openvasd connector data @@ -1420,53 +1463,24 @@ get_status_code_from_openvas (const gchar *status_val) openvasd_scan_status_t openvasd_parsed_scan_status (openvasd_connector_t conn) { - cJSON *parser = NULL; - cJSON *status = NULL; openvasd_resp_t resp = NULL; - gchar *status_val = NULL; - time_t start_time = 0, end_time = 0; int progress = -1; openvasd_status_t status_code = OPENVASD_SCAN_STATUS_ERROR; - openvasd_scan_status_t status_info; + openvasd_scan_status_t status_info = NULL; resp = openvasd_get_scan_status (conn); status_info = g_malloc0 (sizeof (struct openvasd_scan_status)); - if (resp->code != 200) + if (resp->code != 200 || !parse_status (resp->body, status_info)) { status_info->status = status_code; status_info->response_code = resp->code; openvasd_response_cleanup (resp); return status_info; } - if ((parser = cJSON_Parse (resp->body)) == NULL) - goto status_cleanup; - - if ((status = cJSON_GetObjectItem (parser, "status")) == NULL - || !cJSON_IsString (status)) - goto status_cleanup; - status_val = g_strdup (status->valuestring); - - if ((status = cJSON_GetObjectItem (parser, "start_time")) != NULL - && cJSON_IsNumber (status)) - start_time = status->valuedouble; - - if ((status = cJSON_GetObjectItem (parser, "end_time")) != NULL - && cJSON_IsNumber (status)) - end_time = status->valuedouble; progress = openvasd_get_scan_progress_ext (NULL, resp); - -status_cleanup: openvasd_response_cleanup (resp); - cJSON_Delete (parser); - - status_code = get_status_code_from_openvas (status_val); - g_free (status_val); - - status_info->status = status_code; - status_info->end_time = end_time; - status_info->start_time = start_time; status_info->progress = progress; return status_info; diff --git a/openvasd/openvasd_tests.c b/openvasd/openvasd_tests.c index 5a5c1190..bc6a6eef 100644 --- a/openvasd/openvasd_tests.c +++ b/openvasd/openvasd_tests.c @@ -5,7 +5,10 @@ #include "openvasd.c" +#include #include +#include +#include #include Describe (openvasd); @@ -25,16 +28,19 @@ Ensure (openvasd, parse_results_handles_details) GSList *results; openvasd_result_t result; - results = NULL; - str = "[ {" + str = + "[ {" " \"id\": 16," " \"type\": \"host_detail\"," " \"ip_address\": \"192.168.0.101\"," " \"hostname\": \"g\"," " \"oid\": \"1.3.6.1.4.1.25623.1.0.103997\"," - " \"message\": \"MAC94:E6:F7:67:4B:C0nvt1.3.6.1.4.1.25623.1.0.103585Nmap MAC Scan\"," + " \"message\": " + "\"MAC94:E6:F7:67:4B:C0nvt1.3.6.1.4.1.25623.1.0.103585Nmap MAC Scan\"," " \"detail\": {" " \"name\": \"MAC\"," " \"value\": \"00:1A:2B:3C:4D:5E\"," @@ -54,13 +60,50 @@ Ensure (openvasd, parse_results_handles_details) assert_that (result->detail_name, is_equal_to_string ("MAC")); assert_that (result->detail_value, is_equal_to_string ("00:1A:2B:3C:4D:5E")); assert_that (result->detail_source_type, is_equal_to_string ("nvt")); - assert_that (result->detail_source_name, is_equal_to_string ("1.3.6.1.4.1.25623.1.0.103585")); - assert_that (result->detail_source_description, is_equal_to_string ("Nmap MAC Scan")); + assert_that (result->detail_source_name, + is_equal_to_string ("1.3.6.1.4.1.25623.1.0.103585")); + assert_that (result->detail_source_description, + is_equal_to_string ("Nmap MAC Scan")); if (g_slist_length (results)) g_slist_free_full (results, (GDestroyNotify) openvasd_result_free); } +/* parse_status */ + +Ensure (openvasd, parse_status_start_end_time) +{ + const gchar *str; + openvasd_scan_status_t openvasd_scan_status = NULL; + + openvasd_scan_status = g_malloc0 (sizeof (struct openvasd_scan_status)); + str = "{" + " \"start_time\":1737642308," + " \"end_time\":1737642389," + " \"status\":\"succeeded\"," + " \"host_info\":{" + " \"all\":1," + " \"excluded\":0," + " \"dead\":0," + " \"alive\":1," + " \"queued\":0," + " \"finished\":1," + " \"scanning\":{}," + " \"remaining_vts_per_host\":{}" + " }" + "}"; + + parse_status (str, openvasd_scan_status); + + assert_that (openvasd_scan_status->status, is_equal_to (4)); + assert_that_double (openvasd_scan_status->start_time, + is_equal_to_double (1737642308)); + assert_that_double (openvasd_scan_status->end_time, + is_equal_to_double (1737642389)); + + g_free (openvasd_scan_status); +} + /* Test suite. */ int main (int argc, char **argv) @@ -70,6 +113,7 @@ main (int argc, char **argv) suite = create_test_suite (); add_test_with_context (suite, openvasd, parse_results_handles_details); + add_test_with_context (suite, openvasd, parse_status_start_end_time); if (argc > 1) return run_single_test (suite, argv[1], create_text_reporter ());